#!/usr/bin/nesla
# blackjack sample prog by Dan Cahill
include("_cards.nes");
include("_ajax.nes");
function cardval(p) {
if (typeof(p)!='number') return 0;
x=tonumber(p)+1;
if (x<1) return 0;
x=math.ceil(x/4);
if (x>10) x=10;
if (x==1) x=11;
return x;
}
function getcard() {
do {
x=math.rand(52);
} while (CARDS[x]['dealt']!=null);
CARDS[x]['dealt']=true;
return x;
}
function regcard(p) {
if (p==null) return null;
x=tonumber(p);
CARDS[x]['dealt']=true;
return x;
}
function prepcards() {
if (_SERVER['REQUEST_METHOD']=='POST') {
global d = { regcard(_POST['D0']), regcard(_POST['D1']) };
global c = { regcard(_POST['C0']), regcard(_POST['C1']) };
global dv = { cardval(d[0]), cardval(d[1]) };
global cv = { cardval(c[0]), cardval(c[1]) };
if (_POST['D2']) { d[2]=regcard(_POST['D2']); dv[2]=cardval(d[2]); }
if (_POST['D3']) { d[3]=regcard(_POST['D3']); dv[3]=cardval(d[3]); }
if (_POST['D4']) { d[4]=regcard(_POST['D4']); dv[4]=cardval(d[4]); }
if (_POST['C2']) { c[2]=regcard(_POST['C2']); cv[2]=cardval(c[2]); }
if (_POST['C3']) { c[3]=regcard(_POST['C3']); cv[3]=cardval(c[3]); }
if (_POST['C4']) { c[4]=regcard(_POST['C4']); cv[4]=cardval(c[4]); }
if (_POST['OPT']!=null) {
global opt = _POST['OPT'];
} else {
global opt = "";
}
if (opt=="Hit") {
if (c[0]==null) {
print("weird error 1");
} else if (c[1]==null) {
print("weird error 2");
} else if (c[2]==null) {
c[2]=getcard();
cv[2]=cardval(c[2]);
} else if (c[3]==null) {
c[3]=getcard();
cv[3]=cardval(c[3]);
} else if (c[4]==null) {
c[4]=getcard();
cv[4]=cardval(c[4]);
}
} else if (opt=="Stand") {
for (n=2;n<5;n++) {
global dt=tonumber(dv[0])+tonumber(dv[1])+tonumber(dv[2])+tonumber(dv[3])+tonumber(dv[4]);
if ((dt>21)&&(dv[4]==11)) dv[4]=1;
if ((dt>21)&&(dv[3]==11)) dv[3]=1;
if ((dt>21)&&(dv[2]==11)) dv[2]=1;
if ((dt>21)&&(dv[1]==11)) dv[1]=1;
if ((dt>21)&&(dv[0]==11)) dv[0]=1;
global dt=tonumber(dv[0])+tonumber(dv[1])+tonumber(dv[2])+tonumber(dv[3])+tonumber(dv[4]);
if (dt>15) break;
d[n]=getcard();
dv[n]=cardval(d[n]);
}
}
} else {
global d = { getcard(), getcard(), null, null, null };
global c = { getcard(), getcard(), null, null, null };
global dv = { cardval(d[0]), cardval(d[1]), null, null, null };
global cv = { cardval(c[0]), cardval(c[1]), null, null, null };
global opt = "";
}
global dt=tonumber(dv[0])+tonumber(dv[1])+tonumber(dv[2])+tonumber(dv[3])+tonumber(dv[4]);
global ct=tonumber(cv[0])+tonumber(cv[1])+tonumber(cv[2])+tonumber(cv[3])+tonumber(cv[4]);
if ((ct>21)&&(cv[4]==11)) cv[4]=1;
if ((ct>21)&&(cv[3]==11)) cv[3]=1;
if ((ct>21)&&(cv[2]==11)) cv[2]=1;
if ((ct>21)&&(cv[1]==11)) cv[1]=1;
if ((ct>21)&&(cv[0]==11)) cv[0]=1;
global ct=tonumber(cv[0])+tonumber(cv[1])+tonumber(cv[2])+tonumber(cv[3])+tonumber(cv[4]);
return;
}
function printredraw() {
print("<SCRIPT LANGUAGE=JavaScript>\n<!--\n");
print("function redraw(c) {\n");
print(" r=c.responseText;\n");
print(" document.getElementById('remstatus').innerHTML=r;\n");
print("}\n");
print("// -->\n</SCRIPT>\n");
return;
}
function main() {
if (_SERVER['REQUEST_METHOD']==null) {
global _SERVER = { REQUEST_METHOD="GET", PATH_INFO="/nesla/blah" }
} // this is a debug block
if (typeof(_SESSION)!='table') global _SESSION = { };
if (typeof(_SESSION['BJ'])!='table') _SESSION['BJ'] = { };
_SESSION['BJ'].won = tonumber(_SESSION['BJ'].won);
_SESSION['BJ'].lost = tonumber(_SESSION['BJ'].lost);
prepcards();
if (_SERVER['REQUEST_METHOD']!="POST") {
print("<HTML>\n<HEAD>\n<TITLE>Nesla-AJAX Blackjack</TITLE>\n");
print("<STYLE TYPE=text/css>\n");
print("A { color: #0000FF; text-decoration: none; }\n");
print("A:HOVER { background-color: #E0E0FF; }\n");
print("</STYLE>\n");
print("</HEAD>\n<BODY>\n<CENTER>\n");
printxml();
printredraw();
print("<SPAN ID='remstatus'>");
}
print("<FORM ACTION='", _SERVER['PATH_INFO'], "' METHOD='POST' NAME='game'>\n");
for (n=0;n<5;n++) if (d[n]!=null) print("<INPUT TYPE=hidden NAME=d", n, " VALUE='", d[n], "'>\n");
for (n=0;n<5;n++) if (c[n]!=null) print("<INPUT TYPE=hidden NAME=c", n, " VALUE='", c[n], "'>\n");
print("<TABLE BORDER=1 CELLPADDING=2 CELLSPACING=0>\n");
print("<TR><TD ALIGN=LEFT COLSPAN=2 WIDTH=355px>");
if (opt=="Stand") {
for (n=0;n<5;n++) if (d[n]!=null) print("<IMG WIDTH=71 HEIGHT=96 SRC='/cards/", CARDS[d[n]]['file'] ,"' ALT='", CARDS[d[n]]['name'], "' TITLE='", CARDS[d[n]]['name'], "'>");
} else if (ct>20) {
for (n=0;n<5;n++) if (d[n]!=null) print("<IMG WIDTH=71 HEIGHT=96 SRC='/cards/", CARDS[d[n]]['file'] ,"' ALT='", CARDS[d[n]]['name'], "' TITLE='", CARDS[d[n]]['name'], "'>");
} else {
print("<IMG WIDTH=71 HEIGHT=96 SRC='/cards/face.png' TITLE='unknown'>");
if (d[1]!=null) print("<IMG WIDTH=71 HEIGHT=96 SRC='/cards/", CARDS[d[1]]['file'], "' ALT='", CARDS[d[1]]['name'], "' TITLE='", CARDS[d[1]]['name'], "'>");
}
print("</TD></TR>\n");
print("<TR><TD ALIGN=LEFT COLSPAN=2 WIDTH=355px>");
for (n=0;n<5;n++) if (c[n]!=null) print("<IMG WIDTH=71 HEIGHT=96 SRC='/cards/", CARDS[c[n]]['file'], "' ALT='", CARDS[c[n]]['name'], "' TITLE='", CARDS[c[n]]['name'], "'>");
print("</TD></TR>\n");
print("</TABLE>\n");
if (ct>21) {
_SESSION['BJ'].lost++;
print("<B><FONT COLOR=RED>bust - DEALER WINS</FONT></B><BR>\n");
print("<A HREF='", _SERVER['PATH_INFO'], "'>Play again</A>\n");
} else if (ct==21) {
_SESSION['BJ'].won++;
print("<B><FONT COLOR=GREEN>21! - YOU WIN</FONT></B><BR>\n");
print("<A HREF='", _SERVER['PATH_INFO'], "'>Play again</A>\n");
} else if (opt=="Stand") {
if (dt>21) {
_SESSION['BJ'].won++;
print("<B><FONT COLOR=GREEN>dealer busts - YOU WIN</FONT></B><BR>\n");
} else if (dt>ct) {
_SESSION['BJ'].lost++;
print("dealer has ", dt, " - you have ", ct, "<BR>\n");
print("<B><FONT COLOR=RED>DEALER WINS</FONT></B><BR>\n");
} else {
_SESSION['BJ'].won++;
print("dealer has ", dt, " - you have ", ct, "<BR>\n");
print("<B><FONT COLOR=GREEN>YOU WIN</FONT></B><BR>\n");
}
print("<A HREF='", _SERVER['PATH_INFO'], "' 'onClick=location.replace('", _SERVER['PATH_INFO'], "');return false;'>Play again</A>\n");
} else if (ct<21) {
print("[<A HREF=javascript:nexthand('Hit');> HIT </A>]\n");
print("[<A HREF=javascript:nexthand('Stand');> STAND </A>]\n");
}
print("</FORM>\n");
print("wins:", _SESSION['BJ'].won, " - losses:", _SESSION['BJ'].lost, "<BR>\n");
print("runtime = ", runtime(), " seconds\n");
if (_SERVER['REQUEST_METHOD']!="POST") {
print("</SPAN>\n");
print("</CENTER>\n</BODY>\n</HTML>\n");
}
return;
}
if (typeof(_SERVER)=='table') main();