Poker Prover

BvS Poker: hotkeys and determines if you can Prove a win

  1. // ==UserScript==
  2. // @name Poker Prover
  3. // @namespace BvS-ZeConster
  4. // @description BvS Poker: hotkeys and determines if you can Prove a win
  5. // @include http*://*animecubed.com/billy/bvs/shop-pokerplay.html
  6. // @include http*://*animecubedgaming.com/billy/bvs/shop-pokerplay.html
  7. // @version 1.15
  8. // @history 1.15 New domain - animecubedgaming.com - Channel28
  9. // @history 1.14 Now https compatible (Updated by Channel28)
  10. // @history 1.13 Replaced contains() with includes(). Thanks Takumi.
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14. //possible states:
  15. //1: discard: 1/2/3/4/5/d, determine hand, determine checkboxes for discarding
  16. //2: check/showdown/prove: c/s/p, determine hand, calculate prover
  17. //3: fold/cAll: f/a
  18. var allownumbersandd = false;
  19. var allowcsp = false;
  20. var allowfa = false;
  21. var discardcheckboxes = new Array();
  22. var mycards = new Array();
  23. for (var i = 0; i < 5; i++) { mycards[i] = 1; }
  24. var remaining = new Array();
  25. for (var i = 0; i < 52; i++) { remaining[i] = 1; }
  26. var remainingpersuit = new Array();
  27. for (var i = 0; i < 4; i++) { remainingpersuit[i] = 13; }
  28. var remainingpervalue = new Array();
  29. for (var i = 0; i < 13; i++) { remainingpervalue[i] = 4; }
  30. var thisbutton = null;
  31. var proveitbackup = null;
  32.  
  33. if (document.documentElement.innerHTML.includes("discard1.gif") || document.documentElement.innerHTML.includes("discard0.gif")) {
  34. allownumbersandd = true;
  35. determineHandDiscard();
  36. for (var i = 0; i < 5; i++) {
  37. discardcheckboxes[i] = document.getElementsByName("cardx"+mycards[i])[0];
  38. }
  39. } else if (document.documentElement.innerHTML.includes("cardfold.gif")) {
  40. //check this first, since the "Showdown!" will also be there now
  41. allowfa = true;
  42. determineHandOther();
  43. findNondiscarded();
  44. var maxenemyvalue = calculateValue(remaining,remainingpersuit,remainingpervalue,true);
  45. //step 1: prepare an empty hand
  46. var fourcardhands = new Array();
  47. var fourcardpersuit = new Array();
  48. var fourcardpervalue = new Array();
  49. for (var hand = 5; hand < 6; hand++) {
  50. fourcardhands[hand] = new Array();
  51. fourcardpersuit[hand] = new Array();
  52. fourcardpervalue[hand] = new Array();
  53. for (var i = 0; i < 52; i++) { fourcardhands[hand][i] = 0; }
  54. for (var i = 0; i < 4; i++) { fourcardpersuit[hand][i] = 0; }
  55. for (var i = 0; i < 13; i++) { fourcardpervalue[hand][i] = 0; }
  56. }
  57. //step 2: only use index 5, which is for your actual hand
  58. for (var i = 0; i < 5; i++) {
  59. var num0to51 = mycards[i];
  60. var value = (num0to51 - num0to51%4)/4;
  61. var suit = num0to51%4;
  62. for (var hand = 5; hand < 6; hand++) {
  63. fourcardhands[hand][num0to51] = fourcardhands[hand][num0to51] + 1;
  64. fourcardpersuit[hand][suit] = fourcardpersuit[hand][suit] + 1;
  65. fourcardpervalue[hand][value] = fourcardpervalue[hand][value] + 1;
  66. }
  67. }
  68. var mycurrentscore = calculateValue(fourcardhands[5],fourcardpersuit[5],fourcardpervalue[5],true);
  69. //alert(maxenemyvalue+","+mybestscore);
  70. //step 4: translate the best enemy score and own 4-card score back into words
  71. var enemystr = translateScore(maxenemyvalue,true);
  72. var mycurrentstr = translateScore(mycurrentscore,true);
  73. var addthistext = "<br>"+mycurrentscore + " = current score ("+mycurrentstr+")";
  74. addthistext = addthistext + "<br>"+maxenemyvalue + " = current best enemy score ("+enemystr+")";
  75. if (mycurrentscore == maxenemyvalue) {
  76. addthistext = addthistext + "<br>Worst case, you will <b>tie</b> this hand: calling is safe";
  77. } else if (mycurrentscore > maxenemyvalue) {
  78. addthistext = addthistext + "<br>You'll <b>win</b> this! Call!";
  79. } else {
  80. addthistext = addthistext + "<br>You may <b>lose</b> if you Call now.";
  81. }
  82. var breakhere = document.documentElement.innerHTML.indexOf("<hr>");
  83. var part1 = document.documentElement.innerHTML.substring(0,breakhere);
  84. var part2 = document.documentElement.innerHTML.substring(breakhere);
  85. document.documentElement.innerHTML = part1+addthistext+part2;
  86. } else if (document.documentElement.innerHTML.includes("cardshow.gif")) {
  87. allowcsp = true;
  88. determineHandOther();
  89. findNondiscarded();
  90. //debug();
  91. var maxenemyvalue = calculateValue(remaining,remainingpersuit,remainingpervalue,true);
  92. //step 1: prepare the 5 potential 4-card hands
  93. var fourcardhands = new Array();
  94. var fourcardpersuit = new Array();
  95. var fourcardpervalue = new Array();
  96. for (var hand = 0; hand < 6; hand++) {
  97. fourcardhands[hand] = new Array();
  98. fourcardpersuit[hand] = new Array();
  99. fourcardpervalue[hand] = new Array();
  100. for (var i = 0; i < 52; i++) { fourcardhands[hand][i] = 0; }
  101. for (var i = 0; i < 4; i++) { fourcardpersuit[hand][i] = 0; }
  102. for (var i = 0; i < 13; i++) { fourcardpervalue[hand][i] = 0; }
  103. }
  104. //step 2: load 4 of the 5 cards into each potential 4-card hand; index 5 is for your actual hand
  105. for (var i = 0; i < 5; i++) {
  106. var num0to51 = mycards[i];
  107. var value = (num0to51 - num0to51%4)/4;
  108. var suit = num0to51%4;
  109. for (var hand = 0; hand < 6; hand++) {
  110. if (i != hand) {
  111. fourcardhands[hand][num0to51] = fourcardhands[hand][num0to51] + 1;
  112. fourcardpersuit[hand][suit] = fourcardpersuit[hand][suit] + 1;
  113. fourcardpervalue[hand][value] = fourcardpervalue[hand][value] + 1;
  114. }
  115. }
  116. }
  117. //step 3: compare each of the hands and take the best
  118. var scores = new Array();
  119. for (var hand = 0; hand < 5; hand++) {
  120. scores[hand] = calculateValue(fourcardhands[hand],fourcardpersuit[hand],fourcardpervalue[hand],false);
  121. }
  122. var mybestscore = Math.max(scores[0],scores[1],scores[2],scores[3],scores[4]);
  123. var mycurrentscore = calculateValue(fourcardhands[5],fourcardpersuit[5],fourcardpervalue[5],true);
  124. //alert(maxenemyvalue+","+mybestscore);
  125. //step 4: translate the best enemy score and own 4-card score back into words
  126. var enemystr = translateScore(maxenemyvalue,true);
  127. var mybeststr = translateScore(mybestscore,false);
  128. var mycurrentstr = translateScore(mycurrentscore,true);
  129. var addthistext = "<br>"+mycurrentscore + " = current score ("+mycurrentstr+")";
  130. addthistext = addthistext + "<br>"+mybestscore + " = current best 4-card score ("+mybeststr+")";
  131. addthistext = addthistext + "<br>"+maxenemyvalue + " = current best enemy score ("+enemystr+")";
  132. if (mybestscore == maxenemyvalue) {
  133. addthistext = addthistext + "<br>You will <b>tie</b> if you Prove now!";
  134. } else if (mybestscore > maxenemyvalue) {
  135. addthistext = addthistext + "<br>You will <b>win</b> if you Prove now!";
  136. } else {
  137. // if (document.getElementById("show3") != null) {
  138. // document.getElementById("show3").disabled = true;
  139. // }
  140. if (document.forms.namedItem("redraw3") != null) {
  141. proveitbackup = document.forms.namedItem("redraw3").innerHTML;
  142. document.forms.namedItem("redraw3").innerHTML = "Prove Disabled (hit e to enable)";
  143. }
  144. addthistext = addthistext + "<br>You will <b>lose</b> if you Prove now!";
  145. if (mycurrentscore == maxenemyvalue) {
  146. addthistext = addthistext + "<br>Worst case, you will <b>tie</b> this hand: Showdown is safe";
  147. } else if (mycurrentscore > maxenemyvalue) {
  148. addthistext = addthistext + "<br>You will always <b>win</b> if you Showdown and they call";
  149. } else {
  150. addthistext = addthistext + "<br>You may <b>lose</b> if you Showdown and they call";
  151. }
  152. }
  153. var breakhere = document.documentElement.innerHTML.indexOf("<hr>");
  154. var part1 = document.documentElement.innerHTML.substring(0,breakhere);
  155. var part2 = document.documentElement.innerHTML.substring(breakhere);
  156. document.documentElement.innerHTML = part1+addthistext+part2;
  157. }
  158.  
  159.  
  160. function determineHandOther() {
  161. // this doesn't work properly for discard checkboxes since the cards aren't in proper order per value
  162. var handno = 0;
  163. for (var value = 12; value > -1 && handno < 6; value--) {
  164. for (var suit = 0; suit < 4 && handno < 6; suit++) {
  165. var i = value*4+suit;
  166. var str = "/card"+i+".gif";
  167. if (document.documentElement.innerHTML.includes(str)) {
  168. mycards[handno] = i;
  169. remaining[i] = 0;
  170. remainingpervalue[value] = remainingpervalue[value] - 1;
  171. remainingpersuit[suit] = remainingpersuit[suit] - 1;
  172. handno = handno + 1;
  173. }
  174. }
  175. }
  176. //alert(mycards[0]+","+mycards[1]+","+mycards[2]+","+mycards[3]+","+mycards[4]);
  177. //debug();
  178. }
  179.  
  180. function determineHandDiscard() {
  181. var str = document.documentElement.innerHTML;
  182. for (var handno = 0; handno < 5; handno++) {
  183. var index1 = str.indexOf("cardx")+5;
  184. str = str.substring(index1);
  185. var index2 = str.indexOf("\"");
  186. i = str.substring(0,index2);
  187. var suit = i%4;
  188. var value = (i-suit)/4;
  189. mycards[handno] = i;
  190. remaining[i] = 0;
  191. remainingpervalue[value] = remainingpervalue[value] - 1;
  192. remainingpersuit[suit] = remainingpersuit[suit] - 1;
  193. }
  194. }
  195. function findNondiscarded() {
  196. var alltables = document.getElementsByTagName("table");
  197. var thistable = 0;
  198. for (var i = 0; i < alltables.length; i++) {
  199. if (alltables[i] != null && alltables[i].innerHTML.includes("Clubs<br>Diamonds")) {
  200. thistable = i;
  201. }
  202. }
  203. var tablediscards = document.getElementsByTagName("table")[thistable];
  204. for (var value = 0; value < 13; value++) {
  205. var thiscolumn = tablediscards.getElementsByTagName("tr")[0].getElementsByTagName("td")[value+1];
  206. //lists all 2s, 3s, etc.: [font color="000000"] if discarded, [font color=999999"] otherwise
  207. //alert(thiscolumn.innerHTML);
  208. var tempstrings = new Array();
  209. tempstrings[0] = thiscolumn.innerHTML;
  210. var index1 = tempstrings[0].indexOf("font color=")+12;
  211. tempstrings[1] = tempstrings[0].substring(index1);
  212. var index2 = tempstrings[1].indexOf("font color=")+12;
  213. tempstrings[2] = tempstrings[1].substring(index2);
  214. var index3 = tempstrings[2].indexOf("font color=")+12;
  215. tempstrings[3] = tempstrings[2].substring(index3);
  216. var index4 = tempstrings[3].indexOf("font color=")+12;
  217. tempstrings[4] = tempstrings[3].substring(index4,index4+6);
  218. tempstrings[1] = tempstrings[1].substring(0,6);
  219. tempstrings[2] = tempstrings[2].substring(0,6);
  220. tempstrings[3] = tempstrings[3].substring(0,6);
  221. //now we're down to 4 values of either "000000" or "999999"
  222. for (var suit = 0; suit < 4; suit++) {
  223. var num0to51 = suit + value*4;
  224. if (tempstrings[suit+1].includes("000000")) { //this card has been discarded
  225. remaining[num0to51] = 0;
  226. remainingpersuit[suit] = remainingpersuit[suit] - 1;
  227. remainingpervalue[value] = remainingpervalue[value] - 1;
  228. }
  229. }
  230. }
  231. //debug();
  232. }
  233.  
  234. function calculateValue(allcards, persuit, pervalue, handsof5allowed) {
  235. //note: use 0-12, and high card for straights
  236. var bstrflush = false; var bflush = false; var bstraight = false; var bfullhouse = false;
  237. var bquads = false; var btrips = false; var bonepair = false; var btwopair = false;
  238. for (var value = 0; value < 13; value++) {
  239. if (pervalue[value] == 4) { bquads = true; btrips = true; bonepair = true; }
  240. if (pervalue[value] == 3) { btrips = true; bonepair = true; }
  241. if (pervalue[value] == 2) { bonepair = true; }
  242. }
  243. //for two pairs and full house, go over things twice, I guess
  244. for (var value1 = 0; value1 < 13; value1++) {
  245. for (var value2 = value1+1; value2 < 13; value2++) {
  246. if (pervalue[value1] >= 2 && pervalue[value2] >= 2) {
  247. btwopair = true;
  248. if (handsof5allowed && pervalue[value1]+pervalue[value2] >= 5) {
  249. bfullhouse = true;
  250. }
  251. }
  252. }
  253. }
  254. var higheststraighthighcard = -1; var higheststraightflushhighcard = -1;
  255. if (handsof5allowed) {
  256. for (var suit = 0; suit < 4; suit++) { if (persuit[suit] >= 5) { bflush = true; } }
  257. for (var value = -1; value < 9; value++) {
  258. var newvalue = value; if (value == -1) { newvalue = 12; }
  259. if (pervalue[newvalue] != 0 && pervalue[value+1] != 0 && pervalue[value+2] != 0 && pervalue[value+3] != 0 && pervalue[value+4] != 0) {
  260. bstraight = true; higheststraighthighcard = value+4;
  261. //check for straight flush, with [12],[0],[1],[2],[3] for aces-low
  262. var suit0 = allcards[newvalue*4+0] + allcards[(value+1)*4+0] + allcards[(value+2)*4+0] + allcards[(value+3)*4+0] + allcards[(value+4)*4+0];
  263. var suit1 = allcards[newvalue*4+1] + allcards[(value+1)*4+1] + allcards[(value+2)*4+1] + allcards[(value+3)*4+1] + allcards[(value+4)*4+1];
  264. var suit2 = allcards[newvalue*4+2] + allcards[(value+1)*4+2] + allcards[(value+2)*4+2] + allcards[(value+3)*4+2] + allcards[(value+4)*4+2];
  265. var suit3 = allcards[newvalue*4+3] + allcards[(value+1)*4+3] + allcards[(value+2)*4+3] + allcards[(value+3)*4+3] + allcards[(value+4)*4+3];
  266. if (suit0 == 5 || suit1 == 5 || suit2 == 5 || suit3 == 5) { //5 sequential cards remain,
  267. bstrflush = true; higheststraightflushhighcard = value+4;
  268. }
  269. }
  270. }
  271. }
  272. //different values of each kind:
  273. //straight flush: 10 (ace low - 10 low) *4 = 40
  274. //four of a kind: 13 *48 = 624
  275. //full house: 156 (13 trips, 12 pair) *24 = 3744
  276. //flush: 1277 (13!/8!/5!, -10 for straight flushes) *4 = 5108
  277. //straight: 10 (ace low - 10 low) *(4^5-4) = 10200 (no flushes)
  278. //three of a kind: 858 (13 trips, 12*11/2 kickers) *4*4*4 = 54912
  279. //two pair: 858 (12+11+..+2+1 pairs, 11 kickers) *6*6*4 = 123552
  280. //one pair: 2860 (13 pair, 12*11*10/6 kickers) *6*4*4*4 = 1098240
  281. //scum: 1277 (13!/8!/5!, -10 for straights) *(4^5-4) = 1302540 (no flushes)
  282. //values to be used (without taking disappeared values into account, except for the highest value):
  283. //0 scum: 368713 (12*13^4+11*13^3+10*13^2+9*13+7) AKQJ9
  284. //400k one pair: 28362 (12*13^3+11*13^2+10*13 +9) AAKQJ
  285. //450k two pair: 2181 (12*13^2+11*13 +10) AAKKQ
  286. //475k trips: 12 AAA--
  287. //500k straight: 12 AKQJT
  288. //525k flush: 368713 (12*13^4+11*13^3+10*13^2+9*13+7) AKQJ9
  289. //925k full house: 167 (12*13+11) AAAKK
  290. //950k 4 of a kind: 12 AAAA-
  291. //975k straight flush: 12 AKQJT
  292. //NOTE: for 4-of-a-kind and 3-of-a-kind the kickers don't matter
  293. //alert(bstrflush+","+bflush+","+bstraight+","+bfullhouse+"\n"+bquads+","+btrips+","+btwopair+","+bonepair+"\n"+higheststraighthighcard+","+higheststraightflushhighcard);
  294. var besthandvalue = -1;
  295. if (bstrflush) {
  296. besthandvalue = 975000+higheststraightflushhighcard;
  297. } else if (bquads) {
  298. for (var value = 12; value > -1; value--) {
  299. if (pervalue[value] == 4) {
  300. besthandvalue = 950000+value;
  301. value = -1;
  302. }
  303. }
  304. } else if (bfullhouse) {
  305. for (var value1 = 12; value1 > -1; value1--) {
  306. if (pervalue[value1] == 3) {
  307. for (var value2 = 12; value2 > -1; value2--) {
  308. if (value2 != value1 && pervalue[value2] >= 2) {
  309. besthandvalue = 925000+13*value1+value2;
  310. value1 = -1; value2 = -1;
  311. }
  312. }
  313. }
  314. }
  315. } else if (bflush) {
  316. var suitvalues = new Array();
  317. suitvalues[0] = 0; suitvalues[1] = 0; suitvalues[2] = 0; suitvalues[3] = 0;
  318. for (var suit = 0; suit < 4; suit++) {
  319. if (persuit[suit] >= 5) {
  320. for (var v1 = 12; v1 > 3; v1--) {
  321. if (allcards[v1*4+suit] == 1) {
  322. for (var v2 = v1 - 1; v2 > 2; v2--) {
  323. if (allcards[v2*4+suit] == 1) {
  324. for (var v3 = v2 - 1; v3 > 1; v3--) {
  325. if (allcards[v3*4+suit] == 1) {
  326. for (var v4 = v3 - 1; v4 > 0; v4--) {
  327. if (allcards[v4*4+suit] == 1) {
  328. for (var v5 = v4 - 1; v5 > -1; v5--) {
  329. if (allcards[v5*4+suit] == 1) {
  330. suitvalues[suit] = v1*169*169 + v2*169*13 + v3*169 + v4*13 + v5;
  331. v1 = -1; v2 = -1; v3 = -1; v4 = -1; v5 = -1;
  332. } }
  333. } }
  334. } }
  335. } }
  336. } }
  337. }
  338. }
  339. besthandvalue = 525000+Math.max(suitvalues[0],suitvalues[1],suitvalues[2],suitvalues[3]);
  340. } else if (bstraight) {
  341. besthandvalue = 500000+higheststraighthighcard;
  342. } else if (btrips) {
  343. for (var value = 12; value > -1; value--) {
  344. if (pervalue[value] == 3) {
  345. besthandvalue = 475000 + value;
  346. value = -1;
  347. }
  348. }
  349. } else if (btwopair) {
  350. for (var value1 = 12; value1 > -1; value1--) {
  351. if (pervalue[value1] == 2) {
  352. for (var value2 = value1-1; value2 > -1; value2--) {
  353. if (pervalue[value2] == 2) {
  354. if (handsof5allowed) {
  355. for (var value3 = 12; value3 > -1; value3--) {
  356. if (pervalue[value3] == 1) {
  357. besthandvalue = 450000 + value1*13*13 + value2*13 + value3;
  358. value1 = -1; value2 = -1; value3 = -1;
  359. } }
  360. } else {
  361. besthandvalue = 450000 + value1*13*13 + value2*13;
  362. value1 = -1; value2 = -1;
  363. }
  364. } }
  365. } }
  366. } else if (bonepair) {
  367. for (var value1 = 12; value1 > -1; value1--) {
  368. if (pervalue[value1] == 2) {
  369. for (var value2 = 12; value2 > -1; value2--) {
  370. if (pervalue[value2] == 1) {
  371. for (var value3 = value2-1; value3 > -1; value3--) {
  372. if (pervalue[value3] == 1) {
  373. if (handsof5allowed) {
  374. for (var value4 = value3-1; value4 > -1; value4--) {
  375. if (pervalue[value4] == 1) {
  376. besthandvalue = 400000 + value1*13*13*13 + value2*13*13 + value3*13 + value4;
  377. value1 = -1; value2 = -1; value3 = -1; value4 = -1;
  378. } }
  379. } else {
  380. besthandvalue = 400000 + value1*13*13*13 + value2*13*13 + value3*13;
  381. value1 = -1; value2 = -1; value3 = -1;
  382. }
  383. } }
  384. } }
  385. } }
  386. } else { //scum
  387. for (var v1 = 12; v1 > -1; v1--) {
  388. if (pervalue[v1] == 1) {
  389. for (var v2 = v1-1; v2 > -1; v2--) {
  390. if (pervalue[v2] == 1) {
  391. for (var v3 = v2-1; v3 > -1; v3--) {
  392. if (pervalue[v3] == 1) {
  393. for (var v4 = v3-1; v4 > -1; v4--) {
  394. if (pervalue[v4] == 1) {
  395. if (handsof5allowed) {
  396. for (var v5 = v4-1; v5 > -1; v5--) {
  397. if (pervalue[v5] == 1) {
  398. besthandvalue = v1*169*169 + v2*169*13 + v3*169 + v4*13 + v5;
  399. v1 = -1; v2 = -1; v3 = -1; v4 = -1; v5 = -1;
  400. } }
  401. } else {
  402. besthandvalue = v1*169*169 + v2*169*13 + v3*169 + v4*13;
  403. v1 = -1; v2 = -1; v3 = -1; v4 = -1;
  404. }
  405. } }
  406. } }
  407. } }
  408. } }
  409. }
  410. return besthandvalue;
  411. //0 scum: 371293 (13^5)
  412. //400k one pair: 28561 (13^4)
  413. //450k two pair: 2197 (13^3)
  414. //475k trips: 2197 (13^3)
  415. //500k straight: 10
  416. //allcards, persuit, pervalue
  417. }
  418.  
  419. function translateScore(numerical,handsof5allowed) {
  420. var description = "";
  421. if (numerical >= 975000) {
  422. var highcard = numerical-975000;
  423. description = "Straight Flush, " + translateCardToEnglish(highcard) + " high";
  424. } else if (numerical >= 950000) {
  425. var quads = numerical-950000;
  426. description = "4 of a Kind: " + translateCardToEnglish(quads);
  427. } else if (numerical >= 925000) {
  428. var cards = numerical - 925000;
  429. var pair = cards%13;
  430. var trips = (cards - pair)/13;
  431. description = "Full House: " + translateCardToEnglish(trips) + " over " + translateCardToEnglish(pair);
  432. } else if (numerical >= 525000) {
  433. var cards = numerical - 525000;
  434. var c5 = cards%13; cards = (cards - c5)/13;
  435. var c4 = cards%13; cards = (cards - c4)/13;
  436. var c3 = cards%13; cards = (cards - c3)/13;
  437. var c2 = cards%13; cards = (cards - c2)/13;
  438. var c1 = cards;
  439. description = "Flush: " + translateCardToEnglish(c1) + "/" + translateCardToEnglish(c2) + "/" + translateCardToEnglish(c3) + "/" + translateCardToEnglish(c4) + "/" + translateCardToEnglish(c5);
  440. } else if (numerical >= 500000) {
  441. var highcard = numerical-500000;
  442. description = "Straight: " + translateCardToEnglish(highcard) + " high";
  443. } else if (numerical >= 475000) {
  444. var trips = numerical-475000;
  445. description = "3 of a Kind: " + translateCardToEnglish(trips);
  446. } else if (numerical >= 450000) {
  447. var cards = numerical - 450000;
  448. var kicker = cards%13; cards = (cards-kicker)/13;
  449. var hipair = cards%13; cards = (cards-hipair)/13;
  450. var lopair = cards;
  451. if (handsof5allowed) {
  452. description = "Two pair: " + translateCardToEnglish(hipair) + " and " + translateCardToEnglish(lopair) + ", with " + translateCardToEnglish(kicker);
  453. } else {
  454. description = "Two pair: " + translateCardToEnglish(hipair) + " and " + translateCardToEnglish(lopair);
  455. }
  456. } else if (numerical >= 400000) {
  457. var cards = numerical - 400000;
  458. var c3 = cards%13; cards = (cards - c3)/13;
  459. var c2 = cards%13; cards = (cards - c2)/13;
  460. var c1 = cards%13; cards = (cards - c1)/13;
  461. var pair = cards;
  462. if (handsof5allowed) {
  463. description = "Pair: " + translateCardToEnglish(pair) + ", with " + translateCardToEnglish(c1) + "/" + translateCardToEnglish(c2) + "/" + translateCardToEnglish(c3);
  464. } else {
  465. description = "Pair: " + translateCardToEnglish(pair) + ", with " + translateCardToEnglish(c1) + "/" + translateCardToEnglish(c2);
  466. }
  467. } else {
  468. var cards = numerical;
  469. var c5 = cards%13; cards = (cards - c5)/13;
  470. var c4 = cards%13; cards = (cards - c4)/13;
  471. var c3 = cards%13; cards = (cards - c3)/13;
  472. var c2 = cards%13; cards = (cards - c2)/13;
  473. var c1 = cards;
  474. if (handsof5allowed) {
  475. description = "High card " + translateCardToEnglish(c1) + ", with " + translateCardToEnglish(c2) + "/" + translateCardToEnglish(c3) + "/" + translateCardToEnglish(c4) + "/" + translateCardToEnglish(c5);
  476. } else {
  477. description = "High card " + translateCardToEnglish(c1) + ", with " + translateCardToEnglish(c2) + "/" + translateCardToEnglish(c3) + "/" + translateCardToEnglish(c4);
  478. }
  479. }
  480. return description;
  481. }
  482.  
  483. function translateCardToEnglish(value) {
  484. var strvalue = "";
  485. if (value == 12) {
  486. strvalue = "Ace";
  487. } else if (value == 11) {
  488. strvalue = "King";
  489. } else if (value == 10) {
  490. strvalue = "Queen";
  491. } else if (value == 9) {
  492. strvalue = "Jack";
  493. } else {
  494. strvalue = (value+2);
  495. }
  496. return strvalue;
  497. }
  498.  
  499. function process_event(event) {
  500. if (event.keyCode == 49) { //1
  501. if (allownumbersandd == true) {
  502. discardcheckboxes[0].checked = !(discardcheckboxes[0].checked);
  503. }
  504. } else if (event.keyCode == 50) { //2
  505. if (allownumbersandd == true) {
  506. discardcheckboxes[1].checked = !(discardcheckboxes[1].checked);
  507. }
  508. } else if (event.keyCode == 51) { //3
  509. if (allownumbersandd == true) {
  510. discardcheckboxes[2].checked = !(discardcheckboxes[2].checked);
  511. }
  512. } else if (event.keyCode == 52) { //4
  513. if (allownumbersandd == true) {
  514. discardcheckboxes[3].checked = !(discardcheckboxes[3].checked);
  515. }
  516. } else if (event.keyCode == 53) { //5
  517. if (allownumbersandd == true) {
  518. discardcheckboxes[4].checked = !(discardcheckboxes[4].checked);
  519. }
  520. } else if (event.keyCode == 68) { //d: "discard"
  521. if (allownumbersandd == true) {
  522. thisbutton = document.forms.namedItem("redraw");
  523. clickButton();
  524. }
  525. } else if (event.keyCode == 67) { //c: "check"
  526. if (allowcsp == true) {
  527. thisbutton = document.forms.namedItem("redraw1");
  528. clickButton();
  529. }
  530. } else if (event.keyCode == 83) { //s: "showdown!"
  531. if (allowcsp == true) {
  532. thisbutton = document.forms.namedItem("redraw2");
  533. clickButton();
  534. }
  535. } else if (event.keyCode == 80) { //p: "prove"
  536. if (allowcsp == true) {
  537. if (document.forms.namedItem("redraw3") != null) {
  538. thisbutton = document.forms.namedItem("redraw3");
  539. clickButton();
  540. }
  541. }
  542. //alert(event.keyCode);
  543. } else if (event.keyCode == 70) { //f: "fold"
  544. if (allowfa == true) {
  545. thisbutton = document.forms.namedItem("redraw1");
  546. clickButton();
  547. }
  548. } else if (event.keyCode == 65) { //a: "cAll"
  549. if (allowfa == true) {
  550. thisbutton = document.forms.namedItem("redraw2");
  551. clickButton();
  552. }
  553. } else if (event.keyCode == 69) { //e: "escape"
  554. allownumbersandd = false;
  555. allowcsp = false;
  556. allowfa = false;
  557. if (document.forms.namedItem("redraw3") != null) {
  558. document.forms.namedItem("redraw3").innerHTML = proveitbackup;
  559. }
  560. alert("hotkeys disabled until next pageload, Prove It button re-enabled");
  561. }
  562. }
  563.  
  564. function clickButton() {
  565. thisbutton.submit(); //comment this out to disable auto-clicking completely
  566. }
  567.  
  568. function debug() {
  569. var dbgstr = new Array();
  570. dbgstr[0] = "";
  571. dbgstr[1] = "";
  572. dbgstr[2] = "";
  573. dbgstr[3] = "";
  574. dbgstr[4] = "";
  575. dbgstr[5] = "";
  576. for (var i = 0; i < 13; i++) {
  577. for (var j = 0; j < 4; j++) {
  578. if (remaining[i*4+j] == 1) {
  579. dbgstr[j] = dbgstr[j]+"x";
  580. } else {
  581. dbgstr[j] = dbgstr[j]+"-";
  582. }
  583. }
  584. }
  585. for (var i = 0; i < 4; i++) { dbgstr[4] = dbgstr[4]+remainingpersuit[i]+" "; }
  586. for (var i = 0; i < 13; i++) { dbgstr[5] = dbgstr[5]+remainingpervalue[i]+" "; }
  587. alert(dbgstr[0]+"\n"+dbgstr[1]+"\n"+dbgstr[2]+"\n"+dbgstr[3]+"\n"+dbgstr[4]+"\n"+dbgstr[5]);
  588. }
  589.  
  590. document.documentElement.addEventListener("keyup", process_event, true);