/* * SPL - The SPL Programming Language * Copyright (C) 2006 Clifford Wolf * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * splpoker.webspl: Simple example for the w2t module. */ #define ENABLE_CONSOLE 0 #define ENABLE_DEBUGGER 0 load "w2t"; load "array"; if (ENABLE_DEBUGGER) { load "webdebug"; } object PokerGame { var stack; var hand; var hand_status; method card_to_value(c) { c =~ s/01/14/; c =~ s/h/3/; c =~ s/d/2/; c =~ s/s/1/; c =~ s/c/0/; return c; } method cardcompare(a, b) { return card_to_value(a) ~> card_to_value(b); } method sort_hand(h) { array_sort_by_values(h, cardcompare); array_reindex(h); } method getwinner() { var h, s; h := hand; function check_flush(h, u) { var retval = 1; h[0] =~ /(?P.)$/I; foreach[] c (h) if (c !~ /$type$/) retval = 0; if (retval) for (var i=0; i<5; i++) delete u[i]; return retval; } function issame(a, b) { a =~ /^(?P..)/I; b =~ /^(?P..)/I; return av ~== bv; } function check_same(h, u, c) { var retval = 0, j; for (var i=0; i<5; i += j) { for (j=1; i+j < 5; j++) if (issame(h[i], h[i+j])) { delete u[i]; delete u[i+j]; } else break; if (j == c) retval++; } return retval; } function check_straight(h, u) { var cards; for (var i=0; i<5; i++) { h[i] =~ /(?P[1-9][0-9]*)/I; cards[v] = undef; } for (var i=1; i+5 < 14; i++) { for (var j=0; j<5; j++) if (not declared cards[i+j]) goto check_next_straight; goto is_straight; check_next_straight:; } foreach[] i ([1, 13, 12, 11, 10]) if (not declared cards[i]) return 0; is_straight: for (var i=0; i<5; i++) delete u[i]; return 1; } for (var i=0; i<2; i++) { var u = [ 0: undef, 1: undef, 2: undef, 3: undef, 4: undef ]; sort_hand(h[i]); var s[i].flush = check_flush(h[i], u); var s[i].doubles = check_same(h[i], u, 2); var s[i].triple = check_same(h[i], u, 3); var s[i].poker = check_same(h[i], u, 4); var s[i].straight = check_straight(h[i], u); switch { case s[i].flush and s[i].straight and h[i][0] =~ /^01/: var s[i].type = 9; // royal flush case s[i].flush and s[i].straight: var s[i].type = 8; // straight flush case s[i].poker: var s[i].type = 7; // poker case s[i].triple and s[i].doubles: var s[i].type = 6; // full house case s[i].flush: var s[i].type = 5; // flush case s[i].straight: var s[i].type = 4; // straight case s[i].triple: var s[i].type = 3; // triple case s[i].doubles == 2: var s[i].type = 2; // two doubles case s[i].doubles: var s[i].type = 1; // double default: var s[i].type = 0; // nothing } var s[i].unused = ""; foreach c (u) { var v = h[i][c]; foreach j (hand[i]) if (hand[i][j] ~== v) s[i].unused ~= j; } var s[i].handstring = ""; for (var j=4; j>=0; j--) { if (declared u[j]) continue; if (s[i].handstring ~!= "") s[i].handstring ~= "."; s[i].handstring ~= card_to_value(h[i][j]); } } hand_status[0] = s[0]; hand_status[1] = s[1]; if (s[0].type > s[1].type) return 0; if (s[0].type < s[1].type) return 1; if (s[0].handstring ~> s[1].handstring) return 0; return 1; } method changecards(player, cardlist) { for (var i=0; i<5; i++) if (cardlist =~ /$i/) hand[player][i] = pop stack; } method give_cards(player) { hand[player] = undef; for (var c=0; c<5; c++) push hand[player], pop stack; sort_hand(hand[player]); } method init() { for (var c=1; c<=13; c++) { stack[rand(10000)] = fmt("%02dc", c); stack[rand(10000)] = fmt("%02dd", c); stack[rand(10000)] = fmt("%02dh", c); stack[rand(10000)] = fmt("%02ds", c); } array_sort_by_keys(stack, function(a,b) { return a > b; }); array_reindex(stack); give_cards(0); give_cards(1); return this; } } var page = new W2t(); var game; var first_round = 1; var selected_cards; var select_cards_enabled; var money_pl0 = 50; var money_pl1 = 50; var money_pot = 0; var level = 1; function update_text() { page.response_add(<:> : $level : $money_pot : $money_pl0 : $money_pl1 ); } function newgame() { money_pl0 -= 10; money_pl1 -= 10; money_pot += 20; update_text(); game = new PokerGame(); selected_cards = undef; // remove old stuff if (!first_round) { page.response_add(<:> : : ); } first_round = 0; // create cards page.response_add(<:> : =0; i--) { ?> : : : : : ); page.register_callback("click_next", changecards); select_cards_enabled = 1; } function changecards() { var cardlist; foreach c (selected_cards) cardlist ~= c; game.changecards(1, cardlist); page.response_add(<:> : ); page.register_callback("click_next", showcards); select_cards_enabled = 0; } function showcards() { for (var i=0; i 1) { money_pl0 -= 50; money_pl1 += 50; level--; } foreach[] u (game.hand_status[0].unused =~ /./Ag) unused_list ~= ", ${4 - u}"; foreach[] u (game.hand_status[1].unused =~ /./Ag) unused_list ~= ", ${5 + u}"; unused_list =~ s/^, //; page.response_add(<:> : : : Player #$p Status: : $i = ${game.hand_status[p][i]} : : ]]> ); page.register_callback("click_next", newgame); } function clickcard(c, cardid) { if (cardid < 5) return; if (!select_cards_enabled) return; var newopacity; if (declared selected_cards[cardid-5]) { delete selected_cards[cardid-5]; newopacity = 1; } else { selected_cards[cardid-5] = undef; newopacity = 0.5; } page.response_add(<:> : ); } function clickbid(c, bid) { money_pl0 -= bid; money_pl1 -= bid; money_pot += bid * 2; update_text(); showcards(); } push page.scripts, <> function card_setpic(id, pic) { var svgelement = document.getElementById("card" + id); var element = svgelement.firstChild; while (element && element.nodeName != "image") element = element.nextSibling; element.setAttribute("xlink:href", "cards/" + pic + ".gif"); element.setAttribute("opacity", 1); } function card_flip(id, newpic, seconds, fps) { var element = document.getElementById("card" + id + "_img"); var lastphase = 0; function worker(inputscale) { var scale, phase; if (inputscale > 0.5) { scale = (inputscale - 0.5) * 2; phase = 1; } else { scale = (0.5 - inputscale) * 2; phase = 0; } var transform = ""; var scale_y = Math.sin(scale * (Math.PI/2)); transform += "scale(1, " + scale_y + ") "; var skew_x = 10 * (1-scale_y) * (phase ? 1 : -1); transform += "skewX(" + skew_x + ")"; element.setAttribute("transform", transform); if (phase && !lastphase) { card_setpic(id, newpic) lastphase = 1; } } w2t_animate(null, [ worker ], seconds, fps); } function card_animate(id, x, y, flipit, newpic) { w2t_animate(null, [ w2t_animate_fade("card" + id, "x", x) ], 1, 20); w2t_animate(null, [ w2t_animate_fade("card" + id, "y", y) ], 2, 20); if (flipit) { function flip() { card_flip(id, newpic, 1, 20); } window.setTimeout(flip, 1000); } } function opponent_show() { w2t_animate(null, [ w2t_animate_fade("opponent", "opacity", 1) ], 3, 20); for (var i=0; i<5; i++) card_animate(i, 5 + i*30, 5, 0, null); } function opponent_hide(newpics, message, unused) { w2t_animate(null, [ w2t_animate_fade("opponent", "opacity", 0.5) ], 3, 20); for (var i=0; i<5; i++) card_animate(i, 105 + 90*i, 95, 1, newpics[i]); window.setTimeout(function() { for (var i=0; i; page.register_callback("click_next", newgame); page.register_callback("click_card", clickcard); page.register_callback("click_bid", clickbid); if (ENABLE_DEBUGGER) page.register_callback("click_debug", function() { page.execute(<:> : window.open("${webdebug()}", "", : "width=600,height=500,resizable=yes,scrollbars=yes"); ); }); // Set startup page page.mime_type = "image/svg+xml"; page.startup = <:> : : : SPL Poker - A little demo for the SPL Web 2.0 Toolkit : : : : : : : : : : : : : : : : : : : : : : : Level: $level : : : : Pot: $money_pot € : : : : My money: $money_pl0 € : : : : Your money: $money_pl1 € : : : ; page.run();