Poker Prover

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

目前為 2014-06-15 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        Poker Prover
// @namespace   BvS-ZeConster
// @description BvS Poker: hotkeys and determines if you can Prove a win
// @include     http://*animecubed.com/billy/bvs/shop-pokerplay.html
// @version     1
// @grant       none
// ==/UserScript==

//possible states:
//1A: discard 1+: 1/2/3/4/5/d, determine hand, determine checkboxes for discarding
//1B: discard 0+: 1/2/3/4/5/d, determine hand, determine checkboxes for discarding
//2: check/showdown/prove: c/s/p, determine hand, calculate prover
//3: fold/call: f/c

var allownumbersandd = false;
var allowcsp = false;
var allowfc = false;
var discardcheckboxes = new Array();
var mycards = new Array();
var remaining = new Array();
for (var i = 0; i < 52; i++) {		remaining[i] = 1;	}
var remainingpersuit = new Array();
for (var i = 0; i < 4; i++) {		remainingpersuit[i] = 13;	}
var remainingpervalue = new Array();
for (var i = 0; i < 14; i++) {		remainingpervalue[i] = 4;	}

if (document.documentElement.innerHTML.contains("Discard (Minimum")) {
	allownumbersandd = true;
	determineHand();
	for (var i = 0; i < 5; i++) {
		discardcheckboxes[i] = document.getElementsByName("cardx"+mycards[i])[0];
	}
} else if (document.documentElement.innerHTML.contains("Call!")) {
//check this first, since the "Showdown!" will also be there now
	allowfc = true;
	determineHand();
	findNondiscarded();
	var maxenemyvalue = calculateValue(remaining,remainingpersuit,remainingpervalue,true);
	
	//step 1: prepare an empty hand
	var fourcardhands = new Array();
	var fourcardpersuit = new Array();
	var fourcardpervalue = new Array();
	for (var hand = 5; hand < 6; hand++) {
		fourcardhands[hand] = new Array();
		fourcardpersuit[hand] = new Array();
		fourcardpervalue[hand] = new Array();
		for (var i = 0; i < 52; i++) {	fourcardhands[hand][i] = 0;	}
		for (var i = 0; i < 4; i++) {	fourcardpersuit[hand][i] = 0;	}
		for (var i = 0; i < 14; i++) {	fourcardpervalue[hand][i] = 0;	}
	}
	
	//step 2: only use index 5, which is for your actual hand
	for (var i = 0; i < 5; i++) {
		var num0to51 = mycards[i];
		var value = 1+(num0to51 - num0to51%4)/4;
		var suit = num0to51%4;
		for (var hand = 5; hand < 6; hand++) {
			fourcardhands[hand][num0to51] = fourcardhands[hand][num0to51] + 1;
			fourcardpersuit[hand][suit] = fourcardpersuit[hand][suit] + 1;
			fourcardpervalue[hand][value] = fourcardpervalue[hand][value] + 1;
		}
	}
	var mycurrentscore = calculateValue(fourcardhands[5],fourcardpersuit[5],fourcardpervalue[5],true);
	//alert(maxenemyvalue+","+mybestscore);
	
	//step 4: translate the best enemy score and own 4-card score back into words
	var enemystr = translateScore(maxenemyvalue,true);
	var mycurrentstr = translateScore(mycurrentscore,true);
	var addthistext =			"<br>"+mycurrentscore + " = current score ("+mycurrentstr+")";
	addthistext = addthistext + "<br>"+maxenemyvalue + " = current best enemy score ("+enemystr+")";
	if (mycurrentscore == maxenemyvalue) {
		addthistext = addthistext + "<br>Worst case, you will <b>tie</b> this hand: calling is safe";
	} else if (mycurrentscore > maxenemyvalue) {
		addthistext = addthistext + "<br>You'll <b>win</b> this! Call!";
	} else {
		addthistext = addthistext + "<br>You may <b>lose</b> if you Call now.";
	}
	document.redraw.innerHTML = document.redraw.innerHTML + addthistext;
} else if (document.documentElement.innerHTML.contains("Showdown!")) {
	allowcsp = true;
	determineHand();
	findNondiscarded();
	var maxenemyvalue = calculateValue(remaining,remainingpersuit,remainingpervalue,true);
	
	//step 1: prepare the 5 potential 4-card hands
	var fourcardhands = new Array();
	var fourcardpersuit = new Array();
	var fourcardpervalue = new Array();
	for (var hand = 0; hand < 6; hand++) {
		fourcardhands[hand] = new Array();
		fourcardpersuit[hand] = new Array();
		fourcardpervalue[hand] = new Array();
		for (var i = 0; i < 52; i++) {	fourcardhands[hand][i] = 0;	}
		for (var i = 0; i < 4; i++) {	fourcardpersuit[hand][i] = 0;	}
		for (var i = 0; i < 14; i++) {	fourcardpervalue[hand][i] = 0;	}
	}
	
	//step 2: load 4 of the 5 cards into each potential 4-card hand; index 5 is for your actual hand
	for (var i = 0; i < 5; i++) {
		var num0to51 = mycards[i];
		var value = 1+(num0to51 - num0to51%4)/4;
		var suit = num0to51%4;
		for (var hand = 0; hand < 6; hand++) {
			if (i != hand) {
				fourcardhands[hand][num0to51] = fourcardhands[hand][num0to51] + 1;
				fourcardpersuit[hand][suit] = fourcardpersuit[hand][suit] + 1;
				fourcardpervalue[hand][value] = fourcardpervalue[hand][value] + 1;
			}
		}
	}
	
	//step 3: compare each of the hands and take the best
	var scores = new Array();
	for (var hand = 0; hand < 5; hand++) {
		remaining
		scores[hand] = calculateValue(fourcardhands[hand],fourcardpersuit[hand],fourcardpervalue[hand],false);
	}
	var mybestscore = Math.max(scores[0],scores[1],scores[2],scores[3],scores[4]);
	var mycurrentscore = calculateValue(fourcardhands[5],fourcardpersuit[5],fourcardpervalue[5],true);
	//alert(maxenemyvalue+","+mybestscore);
	
	//step 4: translate the best enemy score and own 4-card score back into words
	var enemystr = translateScore(maxenemyvalue,true);
	var mybeststr = translateScore(mybestscore,false);
	var mycurrentstr = translateScore(mycurrentscore,true);
	var addthistext =			"<br>"+mycurrentscore + " = current score ("+mycurrentstr+")";
	addthistext = addthistext + "<br>"+mybestscore + " = current best 4-card score ("+mybeststr+")";
	addthistext = addthistext + "<br>"+maxenemyvalue + " = current best enemy score ("+enemystr+")";
	if (mybestscore == maxenemyvalue) {
		addthistext = addthistext + "<br>You will <b>tie</b> if you Prove now!";
	} else if (mybestscore > maxenemyvalue) {
		addthistext = addthistext + "<br>You will <b>win</b> if you Prove now!";
	} else {
		if (document.getElementById("show3") != null) {
			document.getElementById("show3").disabled = true;
		}
		addthistext = addthistext + "<br>You will <b>lose</b> if you Prove now!";
		if (mycurrentscore == maxenemyvalue) {
			addthistext = addthistext + "<br>Worst case, you will <b>tie</b> this hand: Showdown is safe";
		} else if (mycurrentscore > maxenemyvalue) {
			addthistext = addthistext + "<br>You will always <b>win</b> if you Showdown and they call";
		} else {
			addthistext = addthistext + "<br>You may <b>lose</b> if you Showdown and they call";
		}
	}
	document.redraw.innerHTML = document.redraw.innerHTML + addthistext;
}

function determineHand() {
	var alltables = document.getElementsByTagName("table");
	var thistable = 0;
	for (var i = 0; i < alltables.length; i++) {
		if (alltables[i] != null && alltables[i].innerHTML.contains("of<br>")) {
			thistable = i;
		}
	}
	var tablemyhand = document.getElementsByTagName("table")[thistable];
	for (var i = 0; i < 5; i++) {
		var card = tablemyhand.getElementsByTagName("tr")[0].getElementsByTagName("td")[i];
		var templength = card.childNodes.item(0).childNodes.length;
		var cardname = card.childNodes.item(0).childNodes.item(templength-1).innerHTML;
		//in the form of "3 of<br>Diamonds"
		var value = cardname.substring(0,cardname.indexOf(" "));
		var suit = cardname.substring(cardname.indexOf(">")+1);
		var num0to51 = 0;
		if (value == "Ace") {
			num0to51 = 13;
		} else if (value == "King") {
			num0to51 = 12;
		} else if (value == "Queen") {
			num0to51 = 11;
		} else if (value == "Jack") {
			num0to51 = 10;
		} else {
			num0to51 = value - 1;
		}
		//right now we have a 1-13 number, which we need for remainingpervalue: for num0to51 we need 0-12
		remainingpervalue[num0to51] = remainingpervalue[num0to51]-1;
		num0to51 = num0to51 * 4 - 4;
		if (suit == "Clubs") {
			num0to51 = num0to51 + 0;
			remainingpersuit[0] = remainingpersuit[0]-1;
		} else if (suit == "Diamonds") {
			num0to51 = num0to51 + 1;
			remainingpersuit[1] = remainingpersuit[1]-1;
		} else if (suit == "Hearts") {
			num0to51 = num0to51 + 2;
			remainingpersuit[2] = remainingpersuit[2]-1;
		} else {
			num0to51 = num0to51 + 3;
			remainingpersuit[3] = remainingpersuit[3]-1;
		}
		mycards[i] = num0to51;
		remaining[num0to51] = 0;
	}
	remainingpervalue[0] = remainingpervalue[13];
	//alert(mycards[0]+","+mycards[1]+","+mycards[2]+","+mycards[3]+","+mycards[4]);
	//debug();
}

function findNondiscarded() {
	var alltables = document.getElementsByTagName("table");
	var thistable = 0;
	for (var i = 0; i < alltables.length; i++) {
		if (alltables[i] != null && alltables[i].innerHTML.contains("Clubs<br>Diamonds")) {
			thistable = i;
		}
	}
	var tablediscards = document.getElementsByTagName("table")[thistable];
	for (var value = 1; value < 14; value++) {
		var thiscolumn = tablediscards.getElementsByTagName("tr")[0].getElementsByTagName("td")[value];
		//lists all 2s, 3s, etc.: [font color="000000"] if discarded, [font color=999999"] otherwise
		//alert(thiscolumn.innerHTML);
		var tempstrings = new Array();
		tempstrings[0] = thiscolumn.innerHTML;
		var index1 = tempstrings[0].indexOf("font color=")+12;
		tempstrings[1] = tempstrings[0].substring(index1);
		var index2 = tempstrings[1].indexOf("font color=")+12;
		tempstrings[2] = tempstrings[1].substring(index2);
		var index3 = tempstrings[2].indexOf("font color=")+12;
		tempstrings[3] = tempstrings[2].substring(index3);
		var index4 = tempstrings[3].indexOf("font color=")+12;
		tempstrings[4] = tempstrings[3].substring(index4,index4+6);
		tempstrings[1] = tempstrings[1].substring(0,6);
		tempstrings[2] = tempstrings[2].substring(0,6);
		tempstrings[3] = tempstrings[3].substring(0,6);
		//now we're down to 4 values of either "000000" or "999999"
		for (var suit = 0; suit < 4; suit++) {
			var num0to51 = suit + (value-1)*4;
			if (tempstrings[suit+1].contains("000000")) {	//this card has been discarded
				remaining[num0to51] = 0;
				remainingpersuit[suit] = remainingpersuit[suit] - 1;
				remainingpervalue[value] = remainingpervalue[value] - 1;
			}
		}
	}
	remainingpervalue[0] = remainingpervalue[13];
	//debug();
}

function calculateValue(allcards, persuit, pervalue, handsof5allowed) {
	var bstrflush = false;	var bflush = false;		var bstraight = false;	var bfullhouse = false;
	var bquads = false;		var btrips = false;		var bonepair = false;	var btwopair = false;
	for (var value = 1; value < 14; value++) {
		if (pervalue[value] == 4) {	bquads = true;	btrips = true;	bonepair = true;	}
		if (pervalue[value] == 3) {					btrips = true;	bonepair = true;	}
		if (pervalue[value] == 2) {									bonepair = true;	}
	}
	//for two pairs and full house, go over things twice, I guess
	for (var value1 = 1; value1 < 14; value1++) {
		for (var value2 = value1+1; value2 < 14; value2++) {
			if (pervalue[value1] >= 2 && pervalue[value2] >= 2) {
				btwopair = true;
				if (handsof5allowed && pervalue[value1]+pervalue[value2] >= 5) {
					bfullhouse = true;
				}
			}
		}
	}
	var higheststraightlowest = -1;		var higheststraightflushlowest = -1;
	if (handsof5allowed) {
		for (var suit = 0; suit < 3; suit++) {	if (persuit[suit] >= 5) {	bflush = true;	}	}
		for (var value = 0; value < 10; value++) {
			if (pervalue[value] != 0 && pervalue[value+1] != 0 && pervalue[value+2] != 0 && pervalue[value+3] != 0 && pervalue[value+4] != 0) {
				bstraight = true;	higheststraightlowest = value;
				//check for straight flush
				var newvalue = value;		if (value == 0) { newvalue = 13;	}
				var suit0 = allcards[(newvalue-1)*4+0] + allcards[(value+0)*4+0] + allcards[(value+1)*4+0] + allcards[(value+2)*4+0] + allcards[(value+3)*4+0];
				var suit1 = allcards[(newvalue-1)*4+1] + allcards[(value+0)*4+1] + allcards[(value+1)*4+1] + allcards[(value+2)*4+1] + allcards[(value+3)*4+1];
				var suit2 = allcards[(newvalue-1)*4+2] + allcards[(value+0)*4+2] + allcards[(value+1)*4+2] + allcards[(value+2)*4+2] + allcards[(value+3)*4+2];
				var suit3 = allcards[(newvalue-1)*4+3] + allcards[(value+0)*4+3] + allcards[(value+1)*4+3] + allcards[(value+2)*4+3] + allcards[(value+3)*4+3];
				if (suit0 == 5 || suit1 == 5 || suit2 == 5 || suit3 == 5) {	//5 sequential cards remain, checking 13 for aces
					bstrflush = true;	higheststraightflushlowest = value;
				}
			}
		}
	}
	//different values of each kind:
	//straight flush: 10 (ace low - 10 low)					*4       =      40
	//four of a kind: 13									*48      =     624
	//full house: 156 (13 trips, 12 pair)					*24      =    3744
	//flush: 1277 (13!/8!/5!, -10 for straight flushes)		*4       =    5108
	//straight: 10 (ace low - 10 low)						*(4^5-4) =   10200 (no flushes)
	//three of a kind: 858 (13 trips, 12*11/2 kickers)		*4*4*4   =   54912
	//two pair: 858 (12+11+..+2+1 pairs, 11 kickers)		*6*6*4   =  123552
	//one pair: 2860 (13 pair, 12*11*10/6 kickers)			*6*4*4*4 = 1098240
	//scum: 1277 (13!/8!/5!, -10 for straights)				*(4^5-4) = 1302540 (no flushes)
	
	//values to be used (without taking disappeared values into account, except for the highest value):
	//0		scum:		399654 (13*13^4+12*13^3+11*13^2+10*13+8)	AKQJ9
	//400k	one pair:	 30742 (13*13^3+12*13^2+11*13  +10)			AAKQJ
	//450k	two pair:	  2364 (13*13^2+12*13  +11)					AAKKQ
	//475k	trips:		    13										AAA--
	//500k	straight:	     9										T+ (A+ = 0)
	//525k	flush:		399654 (13*13^4+12*13^3+11*13^2+10*13+8)	AKQJ9
	//925k	full house:	   181 (13*13+12)							AAAKK
	//950k	4 of a kind:    13										AAAA-
	//975k	straight flush: 9										T+ (A+ = 0)
	//NOTE: for 4-of-a-kind and 3-of-a-kind the kickers don't matter
	//alert(bstrflush+","+bflush+","+bstraight+","+bfullhouse+"\n"+bquads+","+btrips+","+btwopair+","+bonepair+"\n"+higheststraightlowest+","+higheststraightflushlowest);
	var besthandvalue = -1;
	if (bstrflush) {
		besthandvalue = 975000+higheststraightflushlowest;
	} else if (bquads) {
		for (var value = 13; value > 0; value--) {
			if (pervalue[value] == 4) {
				besthandvalue = 950000+value;
				value = 0;
			}
		}
	} else if (bfullhouse) {
		for (var value1 = 13; value1 > 0; value1--) {
			if (pervalue[value1] == 3) {
				for (var value2 = 13; value2 > 0; value2--) {
					if (value2 != value1 && pervalue[value2] >= 2) {
						besthandvalue = 925000+13*value1+value2;
						value1 = 0;	value2 = 0;
					}
				}
			}
		}
	} else if (bflush) {
		var suitvalues = new Array();
		for (var suit = 0; suit < 4; suit++) {
			if (persuit[suit] >= 5) {
				for (var v1 = 13;     v1 > 4; v1--) {
				if (allcards[(v1-1)*4+suit] == 1) {
					for (var v2 = v1 - 1; v2 > 3; v2--) {
					if (allcards[(v2-1)*4+suit] == 1) {
						for (var v3 = v2 - 1; v3 > 2; v3--) {
						if (allcards[(v3-1)*4+suit] == 1) {
							for (var v4 = v3 - 1; v4 > 1; v4--) {
							if (allcards[(v4-1)*4+suit] == 1) {
								for (var v5 = v4 - 1; v5 > 0; v5--) {
								if (allcards[(v5-1)*4+suit] == 1) {
									suitvalues[suit] = v1*169*169 + v2*169*13 + v3*169 + v4*13 + v5;
									v1 = 0; v2 = 0; v3 = 0; v4 = 0; v5 = 0;
								}	}
							}	}
						}	}
					}	}
				}	}
			}
		}
		besthandvalue = 525000+Math.max(suitvalues[0],suitvalues[1],suitvalues[2],suitvalues[3]);
	} else if (bstraight) {
		besthandvalue = 500000+higheststraightlowest;
	} else if (btrips) {
		for (var value = 13; value > 0; value--) {
			if (pervalue[value] == 3) {
				besthandvalue = 475000 + value;
				value = 0;
			}
		}
	} else if (btwopair) {
		for (var value1 = 13; value1 > 0; value1--) {
		if (pervalue[value1] == 2) {
			for (var value2 = value1-1; value2 > 0; value2--) {
			if (pervalue[value2] == 2) {
				if (handsof5allowed) {
					for (var value3 = 13; value3 > 0; value3--) {
					if (pervalue[value3] == 1) {
						besthandvalue = 450000 + value1*13*13 + value2*13 + value3;
						value1 = 0;	value2 = 0;	value3 = 0;
					}	}
				} else {
					besthandvalue = 450000 + value1*13*13 + value2*13;
					value1 = 0;	value2 = 0;
				}
			}	}
		}	}
	} else if (bonepair) {
		for (var value1 = 13; value1 > 0; value1--) {
		if (pervalue[value1] == 2) {
			for (var value2 = 13; value2 > 0; value2--) {
			if (pervalue[value2] == 1) {
				for (var value3 = value2-1; value3 > 0; value3--) {
				if (pervalue[value3] == 1) {
					for (var value4 = value3-1; value4 > 0; value4--) {
					if (pervalue[value4] == 1) {
						besthandvalue = 400000 + value1*13*13*13 + value2*13*13 + value3*13 + value4;
						value1 = 0;	value2 = 0;	value3 = 0;	value4 = 0;
					}	}
				}	}
			}	}
		}	}
	} else {	//scum
		for (var v1 = 13; v1 > 0; v1--) {
		if (pervalue[v1] == 1) {
			for (var v2 = v1-1; v2 > 0; v2--) {
			if (pervalue[v2] == 1) {
				for (var v3 = v2-1; v3 > 0; v3--) {
				if (pervalue[v3] == 1) {
					for (var v4 = v3-1; v4 > 0; v4--) {
					if (pervalue[v4] == 1) {
						if (handsof5allowed) {
							for (var v5 = v4-1; v5 > 0; v5--) {
							if (pervalue[v5] == 1) {
								besthandvalue = v1*169*169 + v2*169*13 + v3*169 + v4*13 + v5;
								v1 = 0; v2 = 0; v3 = 0; v4 = 0; v5 = 0;
							}	}
						} else {
							besthandvalue = v1*169*169 + v2*169*13 + v3*169 + v4*13;
							v1 = 0; v2 = 0; v3 = 0; v4 = 0;
						}
					}	}
				}	}
			}	}
		}	}
	}
	return besthandvalue;
	//0		scum:		371293 (13^5)
	//400k	one pair:	 28561 (13^4)
	//450k	two pair:	  2197 (13^3)
	//475k	trips:		  2197 (13^3)
	//500k	straight:	    10
	
	//allcards, persuit, pervalue
}

function translateScore(numerical,handsof5allowed) {
	var description = "";
	if (numerical >= 975000) {
		var highcard = numerical-975000+4;
		description = "Straight Flush, " + translateCardToEnglish(highcard) + " high";
	} else if (numerical >= 950000) {
		var quads = numerical-950000;
		description = "4 of a Kind: " + translateCardToEnglish(quads);
	} else if (numerical >= 925000) {
		var cards = numerical - 925000;
		var pair = cards%13;
		var trips = (cards - pairs)/13;
		description = "Full House: " + translateCardToEnglish(trips) + " over " + translateCardToEnglish(pair);
	} else if (numerical >= 525000) {
		var cards = numerical - 525000;
		var c5 = cards%13;	cards = (cards - c5)/13;
		var c4 = cards%13;	cards = (cards - c4)/13;
		var c3 = cards%13;	cards = (cards - c3)/13;
		var c2 = cards%13;	cards = (cards - c2)/13;
		var c1 = cards;
		description = "Flush: " + translateCardToEnglish(c1) + "/" + translateCardToEnglish(c2) + "/" + translateCardToEnglish(c3) + "/" + translateCardToEnglish(c4) + "/" + translateCardToEnglish(c5);
	} else if (numerical >= 500000) {
		var highcard = numerical-500000+4;
		description = "Straight: " + translateCardToEnglish(highcard) + " high";
	} else if (numerical >= 475000) {
		var trips = numerical-475000;
		description = "3 of a Kind: " + translateCardToEnglish(trips);
	} else if (numerical >= 450000) {
		var cards = numerical - 450000;
		var kicker = cards%13;	cards = (cards-kicker)/13;
		var hipair = cards%13;	cards = (cards-hipair)/13;
		var lopair = cards;
		if (handsof5allowed) {
			description = "Two pair: " + translateCardToEnglish(hipair) + " and " + translateCardToEnglish(lopair) + ", with " + translateCardToEnglish(kicker);
		} else {
			description = "Two pair: " + translateCardToEnglish(hipair) + " and " + translateCardToEnglish(lopair);
		}
	} else if (numerical >= 400000) {
		var cards = numerical - 400000;
		var c3 = cards%13;	cards = (cards - c3)/13;
		var c2 = cards%13;	cards = (cards - c2)/13;
		var c1 = cards%13;	cards = (cards - c2)/13;
		var pair = cards;
		if (handsof5allowed) {
			description = "Pair: " + translateCardToEnglish(pair) + ", with " + translateCardToEnglish(c3) + "/" + translateCardToEnglish(c2) + "/" + translateCardToEnglish(c1);
		} else {
			description = "Pair: " + translateCardToEnglish(pair) + ", with " + translateCardToEnglish(c3) + "/" + translateCardToEnglish(c2);
		}
	} else {
		var cards = numerical;
		var c5 = cards%13;	cards = (cards - c5)/13;
		var c4 = cards%13;	cards = (cards - c4)/13;
		var c3 = cards%13;	cards = (cards - c3)/13;
		var c2 = cards%13;	cards = (cards - c2)/13;
		var c1 = cards;
		if (handsof5allowed) {
			description = "High card " + translateCardToEnglish(c1) + ", with " + translateCardToEnglish(c2) + "/" + translateCardToEnglish(c3) + "/" + translateCardToEnglish(c4) + "/" + translateCardToEnglish(c5);
		} else {
			description = "High card " + translateCardToEnglish(c1) + ", with " + translateCardToEnglish(c2) + "/" + translateCardToEnglish(c3) + "/" + translateCardToEnglish(c4);
		}
	}
	return description;
}

function translateCardToEnglish(value) {
	var strvalue = "";
	if (value == 0 || value == 13) {
		strvalue = "Ace";
	} else if (value == 12) {
		strvalue = "King";
	} else if (value == 11) {
		strvalue = "Queen";
	} else if (value == 10) {
		strvalue = "Jack";
	} else {
		strvalue = (value+1);
	}
	return strvalue;
}

function process_event(event) {
	if (event.keyCode == 49) {	//1
		if (allownumbersandd == true) {
			discardcheckboxes[0].checked = !(discardcheckboxes[0].checked);
		}
	} else if (event.keyCode == 50) {	//2
		if (allownumbersandd == true) {
			discardcheckboxes[1].checked = !(discardcheckboxes[1].checked);
		}
	} else if (event.keyCode == 51) {	//3
		if (allownumbersandd == true) {
			discardcheckboxes[2].checked = !(discardcheckboxes[2].checked);
		}
	} else if (event.keyCode == 52) {	//4
		if (allownumbersandd == true) {
			discardcheckboxes[3].checked = !(discardcheckboxes[3].checked);
		}
	} else if (event.keyCode == 53) {	//5
		if (allownumbersandd == true) {
			discardcheckboxes[4].checked = !(discardcheckboxes[4].checked);
		}
	} else if (event.keyCode == 68) {	//d: "discard"
		if (allownumbersandd == true) {
			document.forms.namedItem("redraw").submit();
		}
	} else if (event.keyCode == 67) {	//c: "check" or "call"
		if (allowcsp == true) {
			document.getElementById("show1").checked = true;
			document.forms.namedItem("redraw").submit();
		} else if (allowfc == true) {
			document.getElementById("show2").checked = true;
			document.forms.namedItem("redraw").submit();
		}
	} else if (event.keyCode == 83) {	//s: "showdown!"
		if (allowcsp == true) {
			document.getElementById("show2").checked = true;
			document.forms.namedItem("redraw").submit();
		}
	} else if (event.keyCode == 80) {	//p: "prove"
		if (allowcsp == true) {
			if (document.getElementById("show3") != null) {
				document.getElementById("show3").checked = true;
			document.forms.namedItem("redraw").submit();
			}
		}
		//alert(event.keyCode);
	} else if (event.keyCode == 70) {	//f: "fold"
		if (allowfc == true) {
			document.getElementById("show1").checked = true;
			document.forms.namedItem("redraw").submit();
		}
	}
	
	
//2: check/showdown/prove: c/s/p, determine hand, calculate prover
//3: fold/call: f/c
//allowcsp
}

function debug() {
	var dbgstr = new Array();
	dbgstr[6] = "";
	for (var i = 0; i < 52; i++) {	dbgstr[6] = dbgstr[6]+remaining[i];	}
	dbgstr[0] = "";
	dbgstr[1] = "";
	dbgstr[2] = "";
	dbgstr[3] = "";
	dbgstr[4] = "";
	dbgstr[5] = "";
	for (var i = 0; i < 13; i++) {
		for (var j = 0; j < 4; j++) {
			if (remaining[i*4+j] == 1) {
				dbgstr[j] = dbgstr[j]+"x";
			} else {
				dbgstr[j] = dbgstr[j]+"-";
			}
		}
	}
	for (var i = 0; i < 4; i++) {		dbgstr[4] = dbgstr[4]+remainingpersuit[i]+"   ";	}
	for (var i = 1; i < 14; i++) {		dbgstr[5] = dbgstr[5]+remainingpervalue[i]+"   ";	}
	alert(dbgstr[6]+"\n"+dbgstr[0]+"\n"+dbgstr[1]+"\n"+dbgstr[2]+"\n"+dbgstr[3]+"\n"+dbgstr[4]+"\n"+dbgstr[5]);
}

document.documentElement.addEventListener("keyup", process_event, true);