Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.32 KB | None | 0 0
  1. function onOpen() {
  2. var ui = SpreadsheetApp.getUi();
  3. // Or DocumentApp or FormApp.
  4. ui.createMenu('Elo Functions')
  5. .addItem('Create Multiplayer Template (Warning: Clobbers Data)', 'createMultiplayerTemplate')
  6. .addSeparator()
  7. .addToUi();
  8. }
  9.  
  10. var Coven = "Coven";
  11. var Classic = "Classic";
  12.  
  13. var Win = "Win";
  14. var Loss = "Loss";
  15.  
  16. var Town = "Town";
  17. var Mafia = "Mafia";
  18. var Arsonist = "Arsonist";
  19. var SerialKiller = "SerialKiller";
  20. var Werewolf = "Werewolf";
  21. var Witch = "Witch";
  22. var Executioner = "Executioner";
  23. var Jester = "Jester";
  24. var Survivor = "Survivor";
  25. var Amnesiac = "Amnesiac";
  26. var Vampire = "Vampire";
  27. var Coven = "Coven";
  28. var Pestilence = "Pestilence";
  29. var Juggernaut = "Juggernaut";
  30. var GuardianAngel = "GuardianAngel";
  31. var Pirate = "Pirate";
  32.  
  33. var WinRatesMap = {
  34. Classic:{
  35. Town: 0.57636,
  36. Mafia: 0.378361,
  37. Witch: 0.244151,
  38. SerialKiller: 0.114066,
  39. Arsonist: 0.101488,
  40. Executioner: 0.338722,
  41. Jester: 0.239533,
  42. Werewolf: 0.140815,
  43. Coven: 0.0
  44. },
  45. Coven:{
  46. Town: 0.547083,
  47. SerialKiller: 0.032316,
  48. Arsonist: 0.0491525,
  49. Executioner: 0.337763,
  50. Jester: 0.32736,
  51. Werewolf: 0.0591398,
  52. Coven: 0.393743,
  53. Juggernaut: 0.0263158,
  54. Mafia: 0.0
  55. }
  56. };
  57.  
  58. var WinLossMap = { Win:1, Loss:0 };
  59.  
  60. var OppostionMap = {
  61. Town: [ Mafia, Arsonist, SerialKiller, Werewolf, Witch, Executioner, Coven, Pestilence, Juggernaut, Pirate ],
  62. Mafia: [ Town, Arsonist, SerialKiller, Werewolf, Coven, Pestilence, Juggernaut, Pirate ],
  63. Arsonist: [ Town, Mafia, SerialKiller, Werewolf, Coven, Pestilence, Juggernaut, Pirate ],
  64. SerialKiller: [ Town, Mafia, Arsonist, Werewolf, Coven, Pestilence, Juggernaut, Pirate ],
  65. Werewolf: [ Town, Mafia, SerialKiller, Arsonist, Coven, Pestilence, Juggernaut, Pirate ],
  66. Witch: [ Town ],
  67. Executioner: [ Town ],
  68. Jester: [ Town, Mafia, SerialKiller, Arsonist, Werewolf, Witch, Executioner, Coven, Pestilence, Juggernaut, Pirate ],
  69. Survivor: [ Town, Mafia, SerialKiller, Arsonist, Werewolf, Witch, Executioner, Coven, Pestilence, Juggernaut, Pirate ],
  70. Amnesiac: [ Town, Mafia, SerialKiller, Arsonist, Werewolf, Witch, Executioner, Coven, Pestilence, Juggernaut, Pirate ],
  71. Vampire: [ Town, Mafia, Arsonist, SerialKiller, Werewolf, Coven, Pestilence, Juggernaut, Pirate ],
  72. Coven: [ Town, Mafia, Arsonist, SerialKiller, Werewolf, Pestilence, Juggernaut, Pirate ],
  73. Pestilence: [ Town, Mafia, Coven, Arsonist, SerialKiller, Werewolf, Coven, Juggernaut, Pirate ],
  74. Juggernaut: [ Town, Mafia, Coven, Arsonist, SerialKiller, Werewolf, Coven, Pestilence, Pirate ],
  75. GuardianAngel: [ Town, Mafia, Coven, Arsonist, SerialKiller, Werewolf, Coven, Pestilence, Juggernaut, Pirate ],
  76. Pirate: [ Town, Mafia, Coven, Arsonist, SerialKiller, Werewolf, Coven, Pestilence, Juggernaut ]
  77. };
  78.  
  79.  
  80. function createMultiplayerTemplate() {
  81. createGameTypeDropDown();
  82. createPlayerNumbers();
  83. createFactionDropDown();
  84. createWinLossDropDown();
  85. createHeadings();
  86. }
  87.  
  88. function createHeadings(){
  89. var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  90. sheet.getRange("D1").setValue("Elo Before")
  91. sheet.getRange("E1").setValue("Elo Gain")
  92. sheet.getRange("F1").setValue("Elo After")
  93. sheet.getRange("H1").setValue("Faction Avg")
  94. sheet.getRange("I1").setValue("Opponent Avg")
  95.  
  96. }
  97.  
  98. function createPlayerNumbers() {
  99. var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  100. var range = sheet.getRange("A2:A16");
  101. range.setValues([[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15]])
  102. }
  103.  
  104. function createGameTypeDropDown() {
  105. var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  106. var option = [Classic, Coven];
  107. var dv = SpreadsheetApp.newDataValidation();
  108. dv.setAllowInvalid(false);
  109. dv.setHelpText("");
  110. dv.requireValueInList(option, true);
  111. sheet.getRange("A1").setDataValidation(dv);
  112. }
  113.  
  114.  
  115. function createFactionDropDown() {
  116. var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  117. var option = [Town,Mafia,Arsonist,SerialKiller,Werewolf,Witch,Executioner,Jester,Survivor,Amnesiac,Vampire,Coven,Pestilence,Juggernaut,GuardianAngel,Pirate];
  118. var dv = SpreadsheetApp.newDataValidation();
  119. dv.setAllowInvalid(false);
  120. dv.setHelpText("");
  121. dv.requireValueInList(option, true);
  122. sheet.getRange("B2:B16").setDataValidation(dv);
  123. }
  124.  
  125. function createWinLossDropDown() {
  126. var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  127. var option = [Win, Loss];
  128. var dv = SpreadsheetApp.newDataValidation();
  129. dv.setAllowInvalid(false);
  130. dv.setHelpText("");
  131. dv.requireValueInList(option, true);
  132. sheet.getRange("C2:C16").setDataValidation(dv);
  133. }
  134.  
  135. function teamAvg( myFaction , _passInFullRangeForBetterDataValidation ) {
  136. var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  137. var range = sheet.getRange("B2:D16");
  138. var arr = range.getValues();
  139. var nMatches = 0;
  140. var nSum = 0;
  141.  
  142. for (var i = 0; i < arr.length; ++i){
  143. var row = arr[i];
  144. if (row[0] == myFaction){
  145. nSum += row[2];
  146. nMatches++;
  147. }
  148. }
  149. return nSum / nMatches;
  150.  
  151. }
  152.  
  153. function enemyAvg( myFaction , _passInFullRangeForBetterDataValidation ) {
  154. var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  155. var range = sheet.getRange("B2:D16");
  156. var arr = range.getValues();
  157. var nMatches = 0;
  158. var nSum = 0;
  159.  
  160. for (var i = 0; i < arr.length; ++i){
  161. var row = arr[i];
  162. var opposingFactions = OppostionMap[myFaction];
  163. if (opposingFactions.indexOf(row[0]) >= 0) {
  164. nSum += row[2];
  165. nMatches++;
  166. }
  167. }
  168.  
  169. return nSum / nMatches;
  170.  
  171. }
  172.  
  173. function eloChange(gameType, myFaction, myRating, myTeamRating, theirTeamRating, winString, _passInFullRangeForBetterDataValidation) {
  174. var eloChange = 0;
  175. var isWin = winString == Win;
  176. var winRate = WinRatesMap[gameType][myFaction];
  177.  
  178. var kFactor = 16;
  179. if (myRating >= 2000) { kFactor = 7; }
  180. else if (myRating >= 1800) { kFactor = 11; }
  181.  
  182. var Rb = theirTeamRating;
  183. var Ra = myTeamRating;
  184. var Ea = 0.5 + (1 / (1 + Math.pow(10, ((Rb - Ra) / 600))));
  185. var eloChange = kFactor * (isWin ? 1-winRate : -winRate) * (isWin ? 2-Ea : Ea) ;
  186.  
  187. return eloChange;
  188. }
  189.  
  190.  
  191. function alert(message) {
  192. SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
  193. .alert(message);
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement