diff --git a/index.html b/index.html
index 1caef58..55832d8 100644
--- a/index.html
+++ b/index.html
@@ -139,7 +139,7 @@
diff --git a/js/bak/game.bak.js b/js/bak/game.bak.js
deleted file mode 100644
index 554089d..0000000
--- a/js/bak/game.bak.js
+++ /dev/null
@@ -1,1076 +0,0 @@
-$(document).ready(function() {
- // {{{ variable
- var watching = false, playing = false,
- sum_pot = 0, positions = null, seats_size = 0;
- var states = [], game_state = {actor: null};
- var private_card_index = 0, share_card_index = 0, show_card = false;
- var buy_in = 0;
-
- var PS_EMPTY = 0,
- PS_PLAY = 1,
- PS_FOLD = 2,
- PS_WAIT_BB = 4,
- PS_SIT_OUT = 8,
- PS_MAKEUP_BB = 16,
- PS_ALL_IN = 32,
- PS_BET = 64,
- PS_RESERVED = 128,
- PS_AUTOPLAY = 256,
- PS_MUCK = 512,
- PS_OUT = 1024;
-
- var CF_ACE = 13,
- CF_KING = 12,
- CF_QUEEN = 11,
- CF_JACK = 10,
- CF_TEN = 9,
- CF_NINE = 8,
- CF_EIGHT = 7,
- CF_SEVEN = 6,
- CF_SIX = 5,
- CF_FIVE = 4,
- CF_FOUR = 3,
- CF_THREE = 2,
- CF_TWO = 1,
- CF_NONE = 0;
-
- var CS_SPADES = 4,
- CS_HEARTS = 3,
- CS_DIAMONDS = 2,
- CS_CLUBS = 1,
- CS_NONE = 0;
-
- var HC_HIGH_CARD = 0,
- HC_PAIR = 1,
- HC_TWO_PAIR = 2,
- HC_THREE_KIND = 3,
- HC_STRAIGHT = 4,
- HC_FLUSH = 5,
- HC_FULL_HOUSE = 6,
- HC_FOUR_KIND = 7,
- HC_STRAIGHT_FLUSH = 8;
-
- var MAX_PLAYER = 9;
-
- var ranks = ["高牌", "一對", "兩對", "三條", "順子", "同花", "葫蘆", "四條", "同花順"];
-
- var is_me = null, check_game = null, is_join = false;
- display_debug = null, send = null,
- get_gid = null, get_seat = null, get_state = null,
- get_size = null, show_seats = null, get_seat_number = null;
- var update_inplay = null, auto_call = null, auto_check = null;
- // }}}
-
- // game event {{{
- $('#game').bind('watching', function(event, args) {
- initialization(args);
- send({cmd: "WATCH"});
- });
-
- $('#game').bind('join', function(event, args) {
- initialization(args);
- send({cmd: "JOIN", seat: 0, buyin: buy_in});
- });
-
- $('.empty_seat').bind('click', function() {
- if (is_join)
- return
-
- var seat = parseInt($(this).attr('seat'))
- send({cmd: "JOIN", seat: seat, buyin: buy_in});
- });
-
- $('#cmd_stand').click(function() {
- });
-
- $('#cmd_hall').click(function() {
- clear_game();
- $("#game").hide();
- $("#hall").show("normal").trigger("return");
- });
-
- $('#cmd_fold').click(function() {
- if (is_actor() && is_enabled(this)) {
- disabled_button();
- send({cmd: "FOLD"});
- }
- });
-
- $('#cmd_call, #cmd_check').click(function() {
- if (is_actor() && is_enabled(this)) {
- disabled_button();
- send({cmd: "RAISE", amount: 0});
- }
- });
-
- $('#cmd_raise').click(function() {
- if (is_actor() && is_enabled(this)) {
- disabled_button();
- $('#raise_range').trigger('change');
- amount = parseInt($('#raise_range').val());
- send({cmd: "RAISE", amount: amount});
- }
- });
-
- $('#raise_range, #raise_number').bind('change', function(event) {
- var v = parseInt($(this).val());
- var min = parseInt($(this).attr("min"));
- var max = parseInt($(this).attr("max"));
-
- if (v < min)
- v = min;
-
- if (v > max)
- v = max;
-
- $('#raise_range, #raise_number').val(v.toString());
- });
-
- // }}}
- //
- // {{{ initialization
- var initialization = function(args) {
- disabled_button();
- $(".game_seat, .empty_seat, .dealer, .card, .bet_label").hide();
-
- is_me = function(o, is_callback, not_callback) {
- var pid = pickup_int(o, 'pid');
-
- if (is_callback == null && not_callback == null)
- return pid == args.pid;
-
- if (pid == args.pid)
- is_callback();
- else if (not_callback != undefined)
- not_callback();
- };
-
- buy_in = args.buyin;
-
- check_game = function(o) {
- var gid = pickup_int(o, 'gid');
- if (gid != args.gid)
- throw 'not current game [' + o + ']';
- };
-
- get_gid = function() { return args.gid; };
-
- send = function(o) {
- o.gid = args.gid;
- $.ws.send($.pp.write(o));
- };
-
- // generate testing function {{{
- display_debug = args.debug ? function() {
- //for (var i = 1; i < seats_size + 1; i ++) {
- //update_seat({inplay: 123456, sn: i, nick: '玩家昵称', pid: 1, state: PS_PLAY, betting: 0});
- //get_seat(i).children('.betting_label').css(positions[i].betting_label).text("1000").show();
- //get_seat(i).children('.card').css(positions[i].card).show();
- //}
- } : $.noop;
-
- auto_call = args.auto ? function() {
- $(document).oneTime(1000, function() {
- $('#cmd_call').click();
- });
- } : $.noop;
-
- auto_check = args.auto ? function() {
- $(document).oneTime(1000, function() {
- $('#cmd_raise').click();
- });
- } : $.noop; // }}}
-
- regenrate_seat_function(args);
- };
-
- var regenrate_seat_function = function(o) {
- var seat = o.seat;
- var amount = o.buyin;
-
- is_join = (seat == undefined) ? false : true;
-
- display_states = (seat == undefined) ? refresh_states : $.noop;
-
- update_inplay = function(inplay) {
- get_state().inplay = inplay == undefined ? amount : inplay;
- };
-
- get_state = function(o) {
- if (seat == undefined && o == undefined)
- throw 'Can\'t call get_my_state before join game';
-
- var sn = o != undefined ? pickup_int(o, 'seat') : seat;
-
- if (states[sn] == undefined) {
- throw 'Not find seat state [' + o + ']';
- }
-
- return states[sn];
- }
-
- get_seat = function(o) {
- return $(get_state(o).dom);
- };
-
- get_seat_number = function(pid) {
- if (pid == undefined)
- return seat;
-
- for(var i = 1; i < states.length; i++) {
- if ((states[i].pid == pid) && (states[i].state != PS_EMPTY))
- return states[i].seat;
- }
-
- throw 'Not our player id';
- };
- }
-
- var init_states = function(game) {
- states = []; // clear empty states;
-
- get_size = function() {
- return game.seats;
- };
-
- var positions = get_positions(game.seats);
-
- for (var i = 1; i < positions.length; i ++) {
- states[i] = {
- bet: 0,
- seat: i,
- dom: $("#game_seat_" + i).css(positions[i].outer),
- empty_dom: $("#empty_seat_" + i).css(positions[i].empty_outer),
- position: positions[i],
- photo: $.rl.img.def_face_0,
- rank: HC_HIGH_CARD
- };
- }
- };
-
- var update_states = function(prop, val) {
- $.each(states, function(i, x) {
- if (i == 0)
- return;
-
- if (x.state != PS_EMPTY) {
- x[prop] = val;
- }
- });
- }
-
- var init_state = function(detail) {
- var st = update_state(detail);
- if (st.state != PS_EMPTY) {
- send({cmd: "PHOTO_QUERY", id: st.pid});
- }
- };
-
- var update_state = function(detail) {
- var st = get_state(detail);
- $.extend(st, detail);
- return st;
- }
-
- var refresh_rank_nick = function(state) {
- var x = get_state(state);
-
- if (x.rank != HC_HIGH_CARD) {
- $(x.dom).
- children('.nick').text(ranks[x.rank]).css({color: 'yellow'});
- }
- else {
- $(x.dom).
- children('.nick').text(x.nick).css({color: 'white'});
- }
- };
-
- var refresh_state = function(state) {
- var x = get_state(state);
- var show = function() { $(this).show(); };
-
- if (x.state != PS_EMPTY) {
- $(x.empty_dom).hide().css(x.position.empty_outer);
- $(x.dom).animate(x.position.outer, 'slow', show);
-
- $(x.dom).
- children('.inplay').text("$" + x.inplay).parent().
- children('.photo').attr('src', x.photo);
-
- refresh_rank_nick(state);
-
- if ((x.state == PS_FOLD) ||
- (x.state == PS_OUT)) {
- $(x.dom).addClass("ps_fold");
- //is_me(x, function() {
- //$(".private_card").addClass("ps_fold");
- //}, function() {
- //$(x.dom).children(".card").hide("slow");
- //});
- } else {
- $(x.dom).removeClass("ps_fold");
- is_me(x, function() {
- $(".private_card").removeClass("ps_fold");
- });
- }
- } else {
- $(x.dom).hide().css(x.position.empty_outer);
-
- if (is_join) {
- $(x.empty_dom).hide();
- } else {
- $(x.empty_dom).animate(x.position.empty_outer, 'slow', show);
- }
- }
- }
-
- var refresh_states = function() {
- $.each(states, function(i, x) {
- if (i == 0)
- return;
-
- refresh_state(x);
- });
- };
-
- var refresh_private_card = function() {
- var seat_number = get_seat_number();
- };
-
- var update_balance = function() {
- send({cmd: "BALANCE_QUERY"});
- };
- // }}}
-
- // utility {{{
- var new_stage = function(have_blinds) {
- if (have_blinds)
- return;
-
- var bets = [];
- for(var i = 1; i < states.length; i++) {
- var t = $('.seat-bet-' + states[i].seat).map(function(n, x) {
- $(x).addClass("pot").removeClass("bet").removeClass("seat-bet-" + states[i].seat);
- return {bet: $(x), endpoint: random({left: 671, top: 217}, 20, 20)};
- });
-
- if (t.length != 0) {
- bets.push(t);
- }
-
- $(states[i].dom).children('.bet_label').hide();
- }
-
- if (bets.length != 0) {
- play_sound('move');
-
- $.each(bets, function(i, x) {
- move_bet(bets.shift());
- });
- }
-
- if (sum_pot != 0) {
- $('.pot_label').text(sum_pot).show();
- }
-
- update_states('bet', 0);
- }
-
- var get_private_card = function(seat, sn) {
- return "#game_seat_" + seat +
- " > .private_card[sn=" + sn + "]";
- };
-
- var get_background_card = function(seat) {
- return "#game_seat_" + seat + " > .background_card";
- };
-
- var show_buyin = function() {
- $('#game').block({message: '
BUY-IN
', css: {
- 'width': '500px',
- 'height': '300px',
- 'padding-bottom': '20px',
- 'padding-top': '20px',
- 'top': '70px !important',
- 'background-color': 'rgba(0,0,0,.6) !important'
- }});
- };
-
- var show_winner = function(state, amount, cost) {
- if ($('.buyin').size() != 0) {
- return;
- }
-
- if ($(".blockElement").size() == 0) {
- // 初始化一个胜利者显示BLOCK
- $('#game').block({message: '
', css: {
- 'padding-bottom': '20px',
- 'padding-top': '20px',
- 'top': '270px !important',
- 'background-color': 'rgba(0,0,0,.6) !important'
- }});
- }
-
- // 显示多个胜利者, 将胜利者信息添加到blockElement中
- $('
').appendTo($('.blockElement'));
- };
-
- var hide_winner = function() {
- if ($('.buyin').size() == 0) {
- $('#game').unblock();
- }
- };
-
- var share_pot = function(winners) {
- var winpots = [], cur = undefined;
- var all_size = $(".pot").length;
- var size = Math.floor(all_size / winners.length);
-
- $(".pot").each(function(i, x) {
- if (i % size == 0) {
- cur = (cur == undefined) ? 0 : (cur + 1);
- if (cur > winners.length - 1) {
- cur -= 1;
- }
- }
-
- if (winpots[cur] == undefined) {
- winpots[cur] = [];
- }
-
- var state = get_state(winners[cur]);
-
- winpots[cur].push({bet: $(this), endpoint: state.position.betting_ori});
- });
-
- play_sound('move');
- $('.pot_label').hide();
-
- $.each(winpots, function(i, x) {
- move_bet(x, function(bet) { $(bet).remove(); });
- });
- };
-
- var get_poker = function(face, suit) {
- var a = new Number(face << 8 | suit);
- return $.rl.poker[a.toString()];
- };
-
- var is_disable = function() {
- return $('#game').css('display') == 'none';
- };
-
- var play_sound = function(x) {
- //$.rl.sounds[x].play();
- }
-
- var get_bets = function(bet) {
- // generate bet animation
- var bets = [];
- var maxs = [
- {key: 100, val: "betting_1"},
- {key: 50, val: "betting_2"},
- {key: 20, val: "betting_3"},
- {key: 10, val: "betting_4"},
- {key: 5, val: "betting_5"}
- ];
-
- while (true) {
- var max = maxs.shift();
- var l = Math.floor(bet / max.key);
- for (var i = 1; i <= l; i++) {
- bets.push(max.val);
- }
-
- bet = bet % max.key;
-
- if (maxs.length == 0) {
- if (bet != 0)
- bets.push(max.val);
-
- break;
- }
- }
-
- return bets;
- };
-
- var random = function(ori, x, y) {
- var left = new Number(Math.floor((Math.random() * 100)) % x + ori.left);
- var top = new Number(Math.floor((Math.random() * 100)) % y + ori.top);
-
- return {left: left + "px", top: top + "px"};
- }
-
- var move_bet = function(bets, callback) {
- // [{bet: $(bet), :endpoint: {left: xxx, right: xxx}}]
- var time = 100;
- $.each(bets, function(i, x) {
- $(document).oneTime(time, function() {
- $(x.bet).animate(x.endpoint, 650, function() {
- if (callback != undefined)
- callback($(this));
- });
- });
- time += 20;
- });
- }
-
- var start_timer = function(seat) {
- var s = get_state(seat);
- $('
').
- appendTo($(s.dom));
-
-
- var height = 120;
- var top = 0;
-
- $(".timer").everyTime(500, function(i) {
- height -= 4;
- top += 4;
- $(".timer").children("div").css('height', height + 'px').css('margin-top', top + 'px');
- if (height == 0) {
- cancel_timer();
- }
- }, 30);
- }
-
- var cancel_timer = function() {
- disabled_button();
- $(".timer").stopTime().remove();
- };
-
- var log = function(msg) {
- console.log(msg);
- };
-
- var debug = function(msg) {
- };
-
- var fan = function(i) {
- if (i == 0)
- return i;
- else if (i > 0)
- return 0 - i;
- else
- return Math.abs(i);
- };
-
- var pickup_int = function(o, prop) {
- switch(typeof(o)) {
- case "string":
- return new Number(o);
- break;
- case "number":
- return o;
- break;
- case "object":
- return pickup_int(o[prop]);
- break;
- case "undefined":
- throw "pickup_int not care 'undefined', check your code";
- default:
- throw "pickup_int not care type, error [" + o + "]";
- }
- };
-
- var set_card = function(id, face, suit) {
- var sn = new Number(face << 8 | suit);
- $(id).attr('src', $.rl.poker[sn.toString()]).
- attr("face", face).attr("suit", suit).
- show('slow');
- };
-
- var clear_high = function() {
- $('.card').css('-webkit-box-shadow', '1px 1px 5px black');
- };
-
- var set_high = function(face, suit) {
- if (face == undefined && suit == undefined)
- throw 'unknown high face or suit';
-
- if (face == undefined)
- set_high_css($("[suit=" + suit + "]"));
-
- if (suit == undefined)
- set_high_css($("[face=" + face + "]"));
-
- if (face != undefined && suit != undefined)
- set_high_css($("[suit=" + suit + "]").
- filter("[face=" + face + "]"));
- };
-
- var set_high_css = function(card) {
- $(card).css('-webkit-box-shadow', '1px 1px 3px 3px gold');
- };
-
- var compare_card = function(a, b) {
- var a1 = new Number($(a).attr('face'));
- var b1 = new Number($(b).attr('face'));
-
- if (a1 > b1)
- return -1;
- else if (a1 < b1)
- return 1;
- else
- return 0;
- };
-
- var openbtn = function(key) {
- if (key == undefined)
- key = '#raise_number, #raise_range, #cmd_call, #cmd_raise, #cmd_fold, #cmd_check';
-
- $(key).removeClass('disabled').attr("disabled", false);
- };
-
- var disabled_button = function(key) {
- if (key == undefined)
- key = '#raise_number, #raise_range, #cmd_call, #cmd_raise, #cmd_fold, #cmd_check';
-
- $(key).addClass('disabled').attr("disabled", "disabled");
- };
-
- var is_enabled = function(o) {
- return !$(o).hasClass("disabled");
- }
-
- var is_actor = function() {
- return get_state().seat == game_state.actor;
- };
-
- var reg = function(protocol, callback) {
- $.pp.reg(protocol, function(o) {
- if (is_disable()) {
- return;
- }
-
- // filter log output
- switch(protocol) {
- case 'CANCEL':
- break;
- default:
- log([protocol, o]);
- }
-
- if ('gid' in o) {
- check_game(o);
- }
-
- callback(o);
- });
- };
-
- var show_hint = function(o) {
- if ('players' in o) {
- $(game.players > 1 ? '#wait_next' : '#wait_player').
- show();
- }
- };
- // }}}
-
- // game protocol {{{
- reg("GAME_DETAIL", function(game) {
- show_hint(game);
- init_states(game);
- });
-
- reg("SEAT_DETAIL", function(seat) {
- init_state(seat);
-
- if (get_size() == seat.seat) {
- // 如果初始化时制定了座位位置
- // 则此时调用为noop
- display_states();
- }
- });
-
- // {{{ player state notify
- reg("JOIN", function(notify) {
- notify.state = PS_FOLD;
- init_state(notify);
-
- is_me(notify, function() {
- regenrate_seat_function(notify);
- var positions = trim_positions(notify.seat)
-
- for (var i = 1; i < positions.length; i++) {
- update_state({seat: i, position: positions[i]});
- };
-
- update_balance();
- });
-
- refresh_states();
- });
-
- reg("BALANCE_INFO", function(o) {
- $("#money").text("游戏幣: $" + o.amount);
- update_inplay(o.inplay);
- refresh_state();
-
- // 出局
- if (get_state().state == PS_OUT) {
- $(document).oneTime(2000, function() {
- hide_winner();
- show_buyin();
- });
- }
- });
-
- reg("SEAT_STATE", function(state) {
- cancel_timer();
- update_state(state);
- refresh_state(state);
-
- is_me(state, function() {
- if (state.state == PS_OUT) {
- update_balance();
- }
- }, $.noop);
- });
-
- reg("ACTOR", function(actor) {
- start_timer(actor.seat);
-
- var state = get_state(actor.seat);
-
- is_me(state, function() {
- openbtn();
- }, function() {
- disabled_button();
- });
-
- game_state.actor = state.seat;
-
- $('.actor_seat').removeClass('actor_seat');
- $(state.dom).addClass('actor_seat');
- });
-
- reg("BET_REQ", function(req) {
- $('#raise_range, #raise_number').val(req.min).
- attr('min', req.min).
- attr('max', req.max);
-
- openbtn();
-
- if (req.call == 0) {
- disabled_button("#cmd_call");
- auto_check();
- }
- else {
- disabled_button("#cmd_check");
- auto_call();
- }
- });
-
- reg("RAISE", function(notify) {
- var sum = notify.call + notify.raise;
- var state = get_state(get_seat_number(notify.pid));
- state.bet += sum;
-
- if (sum == 0) { // Player Check
- play_sound('check');
- } else {
- play_sound("bet");
-
- var bets = get_bets(sum);
- $.each(bets, function(i, x) {
- $('
![]()
').
- attr("src", $.rl.img[x]).
- css(state.position.betting_ori).
- appendTo('#game_table').
- animate(random(state.position.betting, 7, 7), 450);
- });
-
- $(state.dom).
- children(".bet_label").
- css(state.position.betting_label).
- text(state.bet).
- show();
- }http://localhost/~jack/texas/index.html?usr=1010&pwd=pass&host=127.0.0.1
-
- sum_pot += sum;
- });
-
- reg("PHOTO_INFO", function(player) {
- var photo = $.rl.img[player.photo]
-
- if (photo) {
- player.seat = get_seat_number(player.pid);
- player.photo = photo;
- update_state(player);
- refresh_state(player);
- }
- });
- // }}}
-
- // {{{ game state notify
- reg("CANCEL", function(notify) {
-
- clear_table();
- $("#tips").show();
-
- update_states('bet', 0);
- update_states('rank', HC_HIGH_CARD);
- refresh_states();
- });
-
- reg("START", function(notify) {
-
- clear_table();
- $("#tips").hide();
-
- update_states('rank', HC_HIGH_CARD);
- });
-
- var clear_table = function() {
- show_card = false;
- sum_pot = 0;
- share_card_index = 0;
- private_card_index = 0;
-
- $(".game_seat").children(".dealer").hide("slow");
- $(".game_seat").children(".card").hide("slow");
-
-
- $(".card").hide("slow");
- $(".private_card").hide("slow");
- $(".private_card").removeClass().addClass('private_card').addClass('card');
- $(".share_card").removeClass().addClass('share_card').addClass('card');
- $('.actor_seat').removeClass('actor_seat');
-
- hide_winner();
- };
-
- reg("DEALER", function(notify) {
-
- notify.dealer = true;
- update_state(notify)
- $(get_state(notify).dom).children('.dealer').show();
- });
-
- reg("SBLIND", function(notify) {
-
- notify.sb = true;
- update_state(notify)
- });
-
- reg("BBLIND", function(notify) {
-
- notify.bb = true;
- update_state(notify)
- });
-
- reg("STAGE", function(notify) {
- new_stage(notify.stage == 0);
- });
-
- reg("END", function(notify) {
- sum_pot = 0;
- share_card_index = 0;
- private_card_index = 0;
-
- update_states('bet', 0);
- refresh_states();
-
- });
- // }}}
-
- // {{{ card notify
- var private_card_positions = [{},
- {left: '100px', top: '30px'},
- {left: '120px', top: '25px'}];
-
- reg("PRIVATE", function(notify) {
- private_card_index += 1;
- var seat_number = get_seat_number(notify.pid);
-
- $(get_private_card(seat_number, private_card_index)).
- css(private_card_positions[private_card_index]);
-
- set_card(get_private_card(seat_number, private_card_index),
- notify.face, notify.suit);
-
- play_sound('card');
- });
-
- reg("DRAW", function(notify) {
- is_me(notify, $.noop, function() {
- var state = get_state(get_seat_number(notify.pid));
-
- $(state.dom).children('.background_card').
- css(state.position.card).show();
-
- $(state.dom).children('.private_card[sn=1]').
- css({left: '0px', top: '25px'});
- $(state.dom).children('.private_card[sn=2]').
- css({left: '20px', top: '25px'});
-
- play_sound('card');
- });
- });
-
- reg("SHARE", function(notify) {
- play_sound('card');
- share_card_index += 1;
- set_card('#share_card_' + share_card_index, notify.face, notify.suit);
- });
-
- reg("SHOW", function(notify) {
-
- var seat_number = get_seat_number(notify.pid);
-
- $(get_background_card(seat_number)).hide('slow');
- set_card(get_private_card(seat_number, 1), notify.face1, notify.suit1);
- set_card(get_private_card(seat_number, 2), notify.face2, notify.suit2);
-
- clear_high();
- show_card = true;
- play_sound('card');
- });
- // }}}
- //
-
- // {{{ showdown notify
- reg("HAND", function(notify) {
-
-
- if (show_card == false) {
- clear_high();
- }
-
- switch (notify.rank) {
- case HC_PAIR:
- set_high(notify.high1);
- break;
- case HC_TWO_PAIR:
- set_high(notify.high1);
- set_high(notify.high2);
- break;
- case HC_FULL_HOUSE:
- set_high(notify.high1);
- set_high(notify.high2);
- break;
- case HC_THREE_KIND:
- set_high(notify.high1);
- break;
- case HC_FOUR_KIND:
- set_high(notify.high1);
- break;
- case HC_FLUSH:
- $("[suit=" + notify.suit + "]").
- sort(compare_card).
- slice(0, 5).
- each(function() {
- set_high_css($(this));
- });
- break;
- case HC_STRAIGHT:
- set_high(notify.high1);
- set_high(notify.high1 - 1);
- set_high(notify.high1 - 2);
- set_high(notify.high1 - 3);
- if (notify.high1 == CF_FIVE) {
- set_high(CF_ACE);
- } else {
- set_high(notify.high1 - 4)
- }
- break;
- case HC_STRAIGHT_FLUSH:
- set_high(notify.high1, notify.suit);
- set_high(notify.high1 - 1, notify.suit);
- set_high(notify.high1 - 2, notify.suit);
- set_high(notify.high1 - 3, notify.suit);
- if (notify.high1 == CF_FIVE) {
- set_high(CF_ACE, notify.suit);
- } else {
- set_high(notify.high1 - 4, notify.suit)
- }
- break;
- default:
- break;
- }
-
- var state = get_state(get_seat_number(notify.pid));
- state.rank = notify.rank;
- refresh_rank_nick(state);
- });
-
- reg("WIN", function(notify) {
-
- var n = get_seat_number(notify.pid);
-
- var state = get_state(n)
- show_winner(state, notify.amount, notify.cost);
-
- state.inplay += (notify.amount - notify.cost);
- refresh_state(n);
-
- new_stage();
- share_pot([n]);
- });
- // }}}
- // }}}
-
- // player & betting point {{{
- var trim_positions = function(offset) {
- var size = get_size();
- var positions = [];
- var target = get_positions(size);
- for (var i = 1, j = offset; i <= size; i++, j = j % size + 1) {
- positions[j] = target[i];
- }
-
- return positions;
- };
-
- var get_positions = function(size) {
- return size == 5 ? five_positions : nine_positions;
- }
-
- var convert_points = function(points) {
- return $.map(points, function(pos) {
- var c = pos.card.split(',');
- var o = pos.outer.split(',');
- var bb = pos.betting.split(',');
- var bl = pos.betting_label.split(',');
-
- return {
- outer: {left: o[0] + 'px', top: o[1] + 'px'},
- empty_outer: {left: o[2] + 'px', top: o[3] + 'px'},
- card : {left: c[0] + 'px', top: c[1] + 'px'},
- betting: { left: new Number(bb[2]), top: new Number(bb[3]) },
- betting_ori: { left: bb[0] + 'px', top: bb[1] + 'px' },
- betting_label: { left: bl[0] + 'px', top: bl[1] + 'px' } // 下注文字显示坐标
- };
- });
- };
-
- var five_positions = convert_points([
- {outer: "0,0", betting_label: "0,0", betting: "0,0,0,0", card: "0,0"},
- {outer: "435,350", betting_label: "90,-10", betting: "471,413,529,308", card: "90,30"},
- {outer: "233,350", betting_label: "65,-20", betting: "268,410,337,308", card: "90,28"},
- {outer: "117,230", betting_label: "105,5", betting: "150,288,231,203", card: "90,30"},
- {outer: "145,60", betting_label: "145,95", betting: "181,122,294,178", card: "90,40"},
- {outer: "342,20", betting_label: "50,125", betting: "376,83,389,168", card: "90,60"}
- ]);
-
- var nine_positions = convert_points([
- {outer: "0,0", betting_label: "0,0", betting: "0,0,0,0", card: "0,0"},
- {outer: "435,350,448,363", betting_label: "90,-10", betting: "471,413,535,314", card: "90,30"},
- {outer: "233,350,263,363", betting_label: "65,-20", betting: "268,410,309,303", card: "90,28"},
- {outer: "117,230,116,275", betting_label: "105,5", betting: "150,288,233,208", card: "90,30"},
- {outer: "145,60,173,95", betting_label: "145,95", betting: "181,122,300,175", card: "90,40"},
- {outer: "342,20,342,55", betting_label: "50,125", betting: "376,83,402,162", card: "90,60"},
- {outer: "565,20,559,55,", betting_label: "-5,125", betting: "604,84,572,162", card: "-52,60"},
- {outer: "766,60,741,95", betting_label: "-105,95", betting: "803,129,672,175", card: "-52,40"},
- {outer: "801,230,798,275", betting_label: "-63,5", betting: "832,290,749,208", card: "-51,30"},
- {outer: "680,350,640,363", betting_label: "20,-20", betting: "711,408,710,306", card: "-51,28"}
- ])
- // }}}
-
- // generate game table DOM
- $("#game_table").setTemplateElement("game_table_template");
- $("#game_table").processTemplate({end: MAX_PLAYER});
-});
-// vim: fdm=marker
diff --git a/js/bak/hall.bak.js b/js/bak/hall.bak.js
deleted file mode 100644
index 1cb2c13..0000000
--- a/js/bak/hall.bak.js
+++ /dev/null
@@ -1,209 +0,0 @@
-$(function() {
- var PS_EMPTY = 0, // {{{
- PS_PLAY = 1,
- PS_FOLD = 2,
- PS_WAIT_BB = 4,
- PS_SIT_OUT = 8,
- PS_MAKEUP_BB = 16,
- PS_ALL_IN = 32,
- PS_BET = 64,
- PS_RESERVED = 128,
- PS_AUTOPLAY = 256,
- PS_MUCK = 512,
- PS_OUT = 1024; // }}}
-
- $('#hall').bind('setup', function() {
- $(this).show();
- });
-
-
- $('#hall').bind('return', function(event) {
-
- });
-
- $('#hall').bind('active', function(event) {
- // TODO: 保存每次搜索过的条件并在激活的时候重新读取
- $.ws.send($.pp.write(gen_game_query([1, 0, 0, 0, 0, 0, 0])));
- $.ws.send($.pp.write({cmd: "BALANCE_QUERY"}));
- });
-
- $('#cmd_watch').click(function() {
- active_game();
- });
-
- $('#cmd_join').click(function() {
- active_game(0); // auto select seat position.
- });
-
- $.pp.reg("BALANCE_INFO", function(o) {
- if (is_disable())
- return;
-
- $("#money").text("游戏幣: $" + o.amount);
- });
-
- $.pp.reg("GAME_INFO", function(game_info) { // {{{
- // 对于已经加载过的数据不需要重新构建列表
- // 找到对应的行然后更新其内容即可
- var inline = $('#games_wrapper tbody tr[gid=' + game_info.id + ']').children();
-
- if (inline.length > 0) {
- $(inline[2]).text(game_info.joined + ' / ' + game_info.seats);
- $(inline[3]).text(game_info.waiting);
-
- if ($(inline).parent().hasClass("selected")) {
- $(inline).parent().trigger('update');
- }
-
- return;
- }
-
- games.push(game_info);
-
- if (games.length == game_info.count) {
- $('#games_wrapper tbody').processTemplate({datas: games});
-
- $('#games_wrapper tbody tr').bind('update', function() {
- reset_seats($(this).attr('gid'), $(this).attr('seats'));
- $.ws.send($.pp.write({cmd: "SEAT_QUERY", gid: cur_game}));
- });
-
- $('#games_wrapper tbody tr').click(function() {
- if ($(this).hasClass('selected'))
- return;
-
- $(this).parent().children().removeClass("selected");
- $(this).addClass("selected");
-
- $(this).trigger('update');
- }).eq(0).click();
-
- $(document).oneTime(1000, function() {
- $('#cmd_join').click();
- });
- }
- }); // }}}
-
- $.pp.reg("SEAT_STATE", function(seat) { // {{{
-
- if (is_disable())
- return;
-
- if (seat.gid == cur_game) {
- if (seat.state != PS_EMPTY) {
- $.ws.send($.pp.write({cmd: "PHOTO_QUERY", id: seat.pid}));
-
- // 使用seat的序号与标签顺序对应
- $('.seat:eq(' + (seat.seat - 1) + ')').show('normal').
- children('.photo').attr('player', seat.pid).parent().
- children('.inplay').text(seat.inplay).parent().
- children('.nick').text(seat.nick);
- } else {
- // 没有人游戏的座位可以作为
- // 自动加入游戏的座位的位置
- there_can_join(seat.seat);
- }
- }
- }); // }}}
-
- $.pp.reg("PHOTO_INFO", function(player) { // {{{
- if (is_disable())
- return;
-
- var photo = $("#seats_wrapper div .photo:[player=" + player.pid + "]");
-
- if (player.photo.indexOf('def_face_') == 0)
- $(photo).attr('src', $.rl.img[player.photo]);
- else if (player.photo.indexOf('base64'))
- $(photo).attr('src', player.photo);
- else
- $(photo).attr('src', $.rl.img.def_face_0);
- }); // }}}
-
- // {{{ private
- var active_game = function(seat) {
- $('#hall').hide();
- var cmd = {pid: $(document).data("pid"), gid: cur_game, seat: seat};
-
- cmd.debug = $.url.get("debug") != undefined;
- cmd.auto = $.url.get("auto") != undefined;
-
- if ($.url.get("buyin") == undefined) {
- cmd.buyin = 900;
- } else {
- cmd.buyin = new Number($.url.get("buyin"));
- }
-
- if (seat == undefined) {
- $('#game').show("normal").trigger("watching", cmd);
- } else {
- $('#game').show("normal").trigger("join", cmd);
- }
- };
-
- var gen_game_query = function(arr) {
- var o = {cmd: 'GAME_QUERY', game_type: 0};
- o.waiting = arr.pop();
- o.waiting_op = arr.pop();
- o.joined = arr.pop();
- o.joined_op = arr.pop();
- o.seats = arr.pop();
- o.seats_op = arr.pop();
- o.limit_type = arr.pop();
- return o;
- }
-
- var initialization = function() {
- var generate_style = function(points) {
- return $.map(points, function(p) {
- return {left: p.x + 'px', top: p.y + 'px'};
- });
- }
-
- five_table_style = generate_style([
- {x: 299, y: 170}, {x: 78, y: 110},
- {x: 185, y: 1}, {x: 399, y: 1},
- {x: 518, y: 110}]);
- eight_table_style = generate_style([
- {x: 418, y: 170}, {x: 300, y: 170}, {x: 178, y: 170},
- {x: 78, y: 125}, {x: 108, y: 15},
- {x: 230, y: 1}, {x: 354, y: 1},
- {x: 476, y: 15}, {x: 518, y: 125}]);
- }
-
- var reset_seats = function(gid, seats_count) {
- seats = [];
- empty_seats = [];
- cur_game = gid;
- cur_seats_count = seats_count;
-
- var styles = cur_seats_count == 5 ? five_table_style :
- eight_table_style;
-
- $(".seat").each(function(index) {
- $(this).hide();
-
- // 使用seat的序号与标签顺序对应
- if (styles[index] != undefined)
- $(this).css(styles[index]).children('.photo').attr('src', $.rl.img.def_face_0);
- });
-
- $('#cmd_join').attr('disabled', 'true');
- }
-
- var there_can_join = function(seat_sn) {
- empty_seats.push(seat_sn);
- $('#cmd_join').removeAttr('disabled');
- }
-
- var get_auto_join_seat = function() {
- // TODO: 随机获取自动加入的座位编号
- var i = Math.floor(Math.random() * empty_seats.length);
- return empty_seats[i];
- }
- // }}}
-
- initialization();
-});
-// vim: fdm=marker
-
diff --git a/js/bak/index.bak.html b/js/bak/index.bak.html
deleted file mode 100644
index 8c3b19e..0000000
--- a/js/bak/index.bak.html
+++ /dev/null
@@ -1,145 +0,0 @@
-
-
-
-
-
創世紀-德州撲克
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- | 房間 |
- 大/小盲注 |
- 人數 |
- 旁觀 |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/js/bak/index.bak.js b/js/bak/index.bak.js
deleted file mode 100644
index 2cd5b08..0000000
--- a/js/bak/index.bak.js
+++ /dev/null
@@ -1,140 +0,0 @@
-function blockUI(id) {
- $.blockUI({ message: $(id).clone() });
-}
-
-function unblockUI() {
- $.unblockUI();
-}
-
-$(function() {
- $.ajaxSetup ({ cache: false });
-
- var player;
- var sounds = ["bet", "raise", "move", "card", "check", "fold", "turn"];
-
-
- // block ui and first show Connecting...
- blockUI("#msg_connect");
-
- $(this).oneTime('5s', function() {
- if ($.ws.isConnection() == false) {
- blockUI('#err_network');
- }
- });
-
- var on_load = function() {
- var identity, password;
-
- identity = $.url.get("usr") == null ? // url hack (default identity)
- localStorage.getItem("player#identity") : $.url.get("usr");
- password = $.url.get("pwd"); // url hack (default password)
-
- if (localStorage.getItem("autosave#identity") == "false") {
- $("#ckb_save").attr('checked', false);
- }
-
- $('#txt_identity').val(identity);
- $('#txt_password').val(password);
-
- if (!$.isEmpty(identity) && !$.isEmpty(password)) {
- $("#singin > form").trigger('submit');
- } else {
- // show singin form
- blockUI('#singin');
- }
- };
-
- var on_open = function() {
- $(this).stopTime(); // stop #err_network error timer
-
- $(document).oneTime('1s', function() {
- blockUI('#msg_loading');
-
- var resources = [
- { url: 'css/heads.png', callback: handle_heads },
- { url: 'css/poker.png', callback: handle_pokers },
- { url: 'css/betting.png', callback: handle_bets }
- ];
-
- $.each(sounds, function(i, x) {
- resources.push({url: 'css/sound/' + x + '.mp3', key: x});
- });
-
- $.rl.load(resources, on_load);
- });
- };
-
- $("#singin > form").bind("submit", function() {
- blockUI('#msg_singin');
-
- $.ws.send($.pp.write({cmd: "LOGIN",
- usr: $('#txt_identity').val(),
- pass: $('#txt_password').val()
- }));
-
- $('#singin').oneTime('3s', function() {
- blockUI('#singin'); // singin timeout
- });
-
- return false;
- });
-
- $('#toolbar > #player').bind('singin', function() {
- $('#singin').stopTime();
- $('#toolbar > *').show();
-
- $.unblockUI();
-
- if ($("#ckb_save").attr('checked')) {
- localStorage.setItem("player#identity", $('#txt_identity').val());
- localStorage.setItem("autosave#identity", true);
- }
- else {
- localStorage.setItem("player#identity", "");
- localStorage.setItem("autosave#identity", false);
- }
-
- $('#hall').trigger('setup');
- });
-
- $('#toolbar > #usr').bind('error', function() {
- $('#singin').stopTime();
-
- $("#txt_password").val(""); // clear password
- $("#lab_err_singin").show(); // show error
- });
-
- if ($.url.get("host") != null)
- $.ws.defaults.host = $.url.get('host');
-
- $.ws.defaults.onmessage = $.pp.onmessage;
- $.ws.defaults.onopen = on_open;
- $.ws.init();
-
- // {{{ utility
- var handle_heads = function(img) {
- for (var i = 0; i < img.width / 80; i++) {
- $.rl.img['def_face_' + i] = $.rl.getImgDataUrl(img, i * 80, 0, 80, 80);
- }
- }
-
- var handle_pokers = function(img) {
- var swp = [1,4,3,2]
- for (var j = 0; j < img.height / 65; j ++) {
- for (var i = 0; i < img.width / 45; i++) {
- var key = new Number(i + 1 << 8 | swp[j]);
- $.rl.poker[key.toString()] =
- $.rl.getImgDataUrl(img, i * 45, j * 65, 45, 65);
- }
- }
- }
-
- var handle_bets = function(img) {
- for (var i = 0; i < img.width / 13; i++) {
- $.rl.img["betting_" + (i + 1)] =
- $.rl.getImgDataUrl(img, i * 13, 0, 13, 14);
- }
- }
- // }}}
-});
-// vim: fdm=marker
diff --git a/js/bak/positions.js b/js/bak/positions.js
deleted file mode 100644
index 9bbe9cc..0000000
--- a/js/bak/positions.js
+++ /dev/null
@@ -1,59 +0,0 @@
-(function($) {
- var convert_points = function(points) {
- return $.map(points, function(pos) {
- var c = pos.card.split(',');
- var o = pos.outer.split(',');
- var bb = pos.betting.split(',');
- var bl = pos.betting_label.split(',');
-
- return {
- outer: {left: o[0] + 'px', top: o[1] + 'px'},
- empty_outer: {left: o[2] + 'px', top: o[3] + 'px'},
- card : {left: c[0] + 'px', top: c[1] + 'px'},
- betting: { left: new Number(bb[2]), top: new Number(bb[3]) },
- betting_ori: { left: bb[0] + 'px', top: bb[1] + 'px' },
- // 下注文字显示坐标
- betting_label: { left: bl[0] + 'px', top: bl[1] + 'px' }
- };
- });
- };
-
- var five_positions = convert_points([
- {outer: "0,0", betting_label: "0,0", betting: "0,0,0,0", card: "0,0"},
- {outer: "435,350", betting_label: "90,-10", betting: "471,413,529,308", card: "90,30"},
- {outer: "233,350", betting_label: "65,-20", betting: "268,410,337,308", card: "90,28"},
- {outer: "117,230", betting_label: "105,5", betting: "150,288,231,203", card: "90,30"},
- {outer: "145,60", betting_label: "145,95", betting: "181,122,294,178", card: "90,40"},
- {outer: "342,20", betting_label: "50,125", betting: "376,83,389,168", card: "90,60"}
- ]);
-
- var nine_positions = convert_points([
- {outer: "0,0", betting_label: "0,0", betting: "0,0,0,0", card: "0,0"},
- {outer: "435,350,448,363", betting_label: "90,-10", betting: "471,413,535,314", card: "90,30"},
- {outer: "233,350,263,363", betting_label: "65,-20", betting: "268,410,309,303", card: "90,28"},
- {outer: "117,230,116,275", betting_label: "105,5", betting: "150,288,233,208", card: "90,30"},
- {outer: "145,60,173,95", betting_label: "145,95", betting: "181,122,300,175", card: "90,40"},
- {outer: "342,20,342,55", betting_label: "50,125", betting: "376,83,402,162", card: "90,60"},
- {outer: "565,20,559,55,", betting_label: "-5,125", betting: "604,84,572,162", card: "-52,60"},
- {outer: "766,60,741,95", betting_label: "-105,95", betting: "803,129,672,175", card: "-52,40"},
- {outer: "801,230,798,275", betting_label: "-63,5", betting: "832,290,749,208", card: "-51,30"},
- {outer: "680,350,640,363", betting_label: "20,-20", betting: "711,408,710,306", card: "-51,28"}
- ]);
-
- $.positions = {
- trim_positions: function(offset) {
- var size = get_size();
- var positions = [];
- var target = get_positions(size);
- for (var i = 1, j = offset; i <= size; i++, j = j % size + 1) {
- positions[j] = target[i];
- }
-
- return positions;
- },
-
- get_positions: function(size) {
- return size == 5 ? five_positions : nine_positions;
- }
- };
-})(jQuery);
diff --git a/js/game.js b/js/game.js
index 8d0427a..a93cc4e 100644
--- a/js/game.js
+++ b/js/game.js
@@ -347,7 +347,7 @@ $(function() {
if (suit != null) return pokers.filter("[suit=" + suit + "]");
return $(".card");
};
- $.pp.reg("GAME_DETAIL", function(detail) {
+ $.pp.reg("SEAT_DETAIL", function(detail) {
game.init(detail);
if (detail.players < 2) {
return growlUI("#tips_empty");
@@ -355,7 +355,7 @@ $(function() {
return unblockUI();
}
});
- $.pp.reg("SEAT_DETAIL", function(detail) {
+ $.pp.reg("SEAT_STATE", function(detail) {
return game.init_seat(detail);
});
$.pp.reg("SEAT_STATE", function(detail) {
diff --git a/js/hall.js b/js/hall.js
index 652d7bf..1b674bd 100644
--- a/js/hall.js
+++ b/js/hall.js
@@ -1,75 +1,94 @@
-
-$(function() {
- var game, game_counter, game_list, game_preview, game_query, hall, template;
- hall = $('#hall');
- game = $('#game');
- game_preview = $('#game_preview');
- game_list = $('#game_list > tbody');
- template = $('#hall > .template').text();
- game_counter = 0;
- $('#cmd_watch').bind('click', function() {
- var gid;
- gid = game_list.children().first().data('gid');
- hall.trigger('start_game');
- return game.trigger('start_game', {
- action: 'watch',
- gid: gid
- });
- });
- hall.bind('setup', function() {
- $(this).show();
- return $(this).trigger('reload');
- });
- hall.bind('reload', function() {
- var autofill;
- blockUI('#msg_loading');
+$(function () {
+ var game, game_counter, game_list, game_preview, game_query, hall, template;
+ hall = $('#hall');
+ game = $('#game');
+ game_preview = $('#game_preview');
+ game_list = $('#game_list > tbody');
+ template = $('#hall > .template').text();
game_counter = 0;
- autofill = game_list.children().last().clone();
- game_list.empty().append(autofill);
- return game_query([1, 0, 0, 0, 0, 0, 0]);
- });
- hall.bind('loaded', function() {
- unblockUI();
- game_list.children().first().click();
- if ($.url.get('auto_watch') === 'true') {
- return $(this).oneTime('2s', function() {
- $("#cmd_watch").trigger('click');
- });
- }
- });
- hall.bind('start_game', function() {
- return $(this).hide();
- });
- hall.bind('cancel_game', function() {
- $(this).show();
- return $(this).trigger('reload');
- });
- $.pp.reg("GAME_INFO", function(game_info) {
- game_counter++;
- $(template).data('gid', game_info.id).children('.name').text(game_info.name).parent().children('.blind').text(game_info.low + " / " + game_info.high).parent().children('.player').text(game_info.joined + " / " + game_info.seats).parent().children('.limit').text(game_info.min + " / " + game_info.max).parent().insertBefore('.autofill').click(function() {
- var selected;
- selected = 'selected';
- if ($(this).hasClass(selected)) return;
- $(this).parent().children().removeClass(selected);
- $(this).addClass(selected);
- if ($.game_preview) $.game_preview.clear();
- $.game_preview = new GamePreview($(this).data('gid'), game_preview);
+ $('#cmd_watch').bind('click', function () {
+ var gid;
+ gid = game_list.children().first().data('gid');
+ hall.trigger('start_game');
+ return game.trigger('start_game', {
+ action: 'watch',
+ gid: gid
+ });
+ });
+ $('#cmd_join').click(function () {
+ var gid;
+ gid = game_list.children().first().data('gid');
+ hall.trigger('start_game');
+ game.trigger('start_game', {
+ action: 'watch',
+ gid: gid
+ });
+ return game.trigger('start_game', {
+ action: 'join',
+ gid: gid,
+ seat: 0,
+ buyin: 500,
+ nick: "a"
+ });
+ });
+ hall.bind('setup', function () {
+ $(this).show();
+ return $(this).trigger('reload');
+ });
+ hall.bind('reload', function () {
+ var autofill;
+ blockUI('#msg_loading');
+ game_counter = 0;
+ autofill = game_list.children().last().clone();
+ game_list.empty().append(autofill);
+ return game_query([1, 0, 0, 0, 0, 0, 0]);
+ });
+ hall.bind('loaded', function () {
+ unblockUI();
+ game_list.children().first().click();
+ if ($.url.get('auto_watch') === 'true') {
+ return $(this).oneTime('2s', function () {
+ $("#cmd_watch").trigger('click');
+ });
+ }
+ });
+ hall.bind('start_game', function () {
+ return $(this).hide();
+ });
+ hall.bind('cancel_game', function () {
+ $(this).show();
+ return $(this).trigger('reload');
+ });
+ $.pp.reg("GAME_INFO", function (game_info) {
+ console.log(game_info);
+ game_counter++;
+ $(template).data('gid', game_info.id).children('.name').text(game_info.name).parent().children('.blind').text(game_info.low + " / " + game_info.high).parent().children('.player').text(game_info.joined + " / " + game_info.seats).parent().children('.limit').text(game_info.min + " / " + game_info.max).parent().insertBefore('.autofill').click(function () {
+ var selected;
+ selected = 'selected';
+ if ($(this).hasClass(selected)) return;
+ $(this).parent().children().removeClass(selected);
+ $(this).addClass(selected);
+ if ($.game_preview) $.game_preview.clear();
+ $.game_preview = new GamePreview($(this).data('gid'), game_preview);
+ });
+ if (game_counter === game_info.count) hall.trigger('loaded');
+ });
+ $.pp.reg("GAME_NUM", function (game_num) {
+ if (game_num) hall.trigger('loaded');
});
- if (game_counter === game_info.count) hall.trigger('loaded');
- });
- game_query = function(arr) {
- var o;
- o = {
- cmd: 'GAME_QUERY',
- game_type: 0
+ game_query = function (arr) {
+ var o;
+ o = {
+ cmd: 'GAME_QUERY',
+ game_type: 0
+ };
+ o.waiting = arr.pop();
+ o.waiting_op = arr.pop();
+ o.joined = arr.pop();
+ o.joined_op = arr.pop();
+ o.seats = arr.pop();
+ o.seats_op = arr.pop();
+ o.limit_type = arr.pop();
+ $.ws.send($.pp.write(o));
};
- o.waiting = arr.pop();
- o.waiting_op = arr.pop();
- o.joined = arr.pop();
- o.joined_op = arr.pop();
- o.seats = arr.pop();
- o.seats_op = arr.pop();
- o.limit_type = arr.pop();
- $.ws.send($.pp.write(o));
- };
});
diff --git a/js/player.js b/js/player.js
index 9f701a7..faabe43 100644
--- a/js/player.js
+++ b/js/player.js
@@ -1,91 +1,91 @@
var Player;
-Player = (function() {
+Player = (function () {
- function Player(pid, dom, info) {
- this.pid = pid;
- this.dom = dom;
- this.info = info;
- this.set_inplay(0);
- this.set_photo($.rl.img.def_face_0);
- $.cache_player(this);
- if (!this.info) {
- $.ws.send($.pp.write({
- cmd: "PLAYER_QUERY",
- id: this.pid
- }));
+ function Player(pid, dom, info) {
+ this.pid = pid;
+ this.dom = dom;
+ this.info = info;
+ this.set_inplay(0);
+ this.set_photo($.rl.img.def_face_0);
+ $.cache_player(this);
+ if (!this.info) {
+ $.ws.send($.pp.write({
+ cmd: "PLAYER_QUERY",
+ id: this.pid
+ }));
+ }
+ //$.ws.send($.pp.write({
+ // cmd: "PHOTO_QUERY",
+ // id: this.pid
+ //}));
+ if (this.info) this.set_nick(this.info.nick);
+ if (this.info) this.set_inplay(this.info.inplay);
}
- $.ws.send($.pp.write({
- cmd: "PHOTO_QUERY",
- id: this.pid
- }));
- if (this.info) this.set_nick(this.info.nick);
- if (this.info) this.set_inplay(this.info.inplay);
- }
- Player.prototype.update_balance = function() {
- if (this.pid === $.player.pid) {
- return $.ws.send($.pp.write({
- cmd: "BALANCE_QUERY"
- }));
- } else {
- throw 'Error balance for not current login user';
- }
- };
+ Player.prototype.update_balance = function () {
+ if (this.pid === $.player.pid) {
+ return $.ws.send($.pp.write({
+ cmd: "BALANCE_QUERY"
+ }));
+ } else {
+ throw 'Error balance for not current login user';
+ }
+ };
- Player.prototype.set_nick = function(nick) {
- if (nick == null) nick = this.nick;
- this.nick = nick;
- return $(this.dom).children('.nick').text(this.nick);
- };
+ Player.prototype.set_nick = function (nick) {
+ if (nick == null) nick = this.nick;
+ this.nick = nick;
+ return $(this.dom).children('.nick').text(this.nick);
+ };
- Player.prototype.set_inplay = function(inplay) {
- this.inplay = inplay;
- return $(this.dom).children('.inplay').text("$" + this.inplay);
- };
+ Player.prototype.set_inplay = function (inplay) {
+ this.inplay = inplay;
+ return $(this.dom).children('.inplay').text("$" + this.inplay);
+ };
- Player.prototype.set_balance = function(balance) {
- this.balance = balance;
- return $(this.dom).children('.balance').text(this.balance);
- };
+ Player.prototype.set_balance = function (balance) {
+ this.balance = balance;
+ return $(this.dom).children('.balance').text(this.balance);
+ };
- Player.prototype.set_photo = function(photo) {
- this.photo = photo;
- return $(this.dom).children('.photo').attr('src', this.photo);
- };
+ Player.prototype.set_photo = function (photo) {
+ this.photo = photo;
+ return $(this.dom).children('.photo').attr('src', this.photo);
+ };
- Player.prototype.set_css = function(css) {
- console.log(css);
- return $(this.dom).css(css);
- };
+ Player.prototype.set_css = function (css) {
+ console.log(css);
+ return $(this.dom).css(css);
+ };
- return Player;
+ return Player;
})();
-(function($) {
- var players;
- $.player = {};
- players = {};
- $.pp.reg("LOGIN", function(player) {
- $.player = new Player(player.id, $('#toolbar > #player'));
- $.player.update_balance();
- return $.player.dom.trigger('singin');
- });
- $.pp.reg("BALANCE_INFO", function(balance) {
- return $.player.set_balance(balance.amount);
- });
- $.pp.reg('PLAYER_INFO', function(info) {
- return players[info.pid].set_nick(info.nick);
- });
- $.pp.reg('PHOTO_INFO', function(info) {
- return players[info.pid].set_photo($.rl.img[info.photo]);
- });
- $.cache_player = function(player) {
- return players[player.pid] = player;
- };
- $.clear_players = function() {
+(function ($) {
+ var players;
+ $.player = {};
players = {};
- return $.cache_player($.player);
- };
+ $.pp.reg("LOGIN", function (player) {
+ $.player = new Player(player.id, $('#toolbar > #player'));
+ $.player.update_balance();
+ return $.player.dom.trigger('singin');
+ });
+ $.pp.reg("BALANCE_INFO", function (balance) {
+ return $.player.set_balance(balance.amount);
+ });
+ $.pp.reg('PLAYER_INFO', function (info) {
+ return players[info.pid].set_nick(info.nick);
+ });
+ $.pp.reg('PHOTO_INFO', function (info) {
+ return players[info.pid].set_photo($.rl.img[info.photo]);
+ });
+ $.cache_player = function (player) {
+ return players[player.pid] = player;
+ };
+ $.clear_players = function () {
+ players = {};
+ return $.cache_player($.player);
+ };
})(jQuery);
diff --git a/js/plugins/prototype.js b/js/plugins/prototype.js
index 9385f10..69e1896 100644
--- a/js/plugins/prototype.js
+++ b/js/plugins/prototype.js
@@ -1,427 +1,449 @@
-(function($) {
- var commands = new Object();
- var commands_by_id = new Object();
- var notifys = new Object();
- var events = new Object();
-
-
- $.pp = {
- // {{{ protocol function
- read: function(bin) {
- var obj = notifys["NOTIFY_" + bin[0]];
-
- if ((obj == null) && (obj == undefined))
- return null;
-
- var data = obj.read(bin);
- return data;
- },
-
- write: function(data) {
- var obj = commands[data.cmd];
- var bin = obj.write(data);
- return bin;
- },
-
- reg: function(notify, fun) {
- if (events[notify])
- events[notify].push(fun);
- else
- events[notify] = [fun];
- },
-
- onmessage: function(evt) {
- var bin = $.base64.decode(evt.data);
- var obj = $.pp.read(bin);
-
- if (obj != null) {
- if (obj.notify in events)
- $.each(events[obj.notify], function(i, fun) { fun(obj); } );
- else
- console.log(['undefined event', obj.notify, obj]);
- } else {
- console.log(evt);
- }
- },
- // }}}
-
- err: function(command, code) {
- return commands_by_id[command].cmd;
- },
-
- cmd_login: generate_cmd("LOGIN",
- [1, {type: "string", prop: "usr"},
- {type: "string", prop: "pass"}]),
- cmd_logout: generate_cmd("LOGOUT", [2]),
- cmd_player_query: generate_cmd("PLAYER_QUERY",
- [15, {type: "integer", prop: "id"}]),
- cmd_player_query: generate_cmd("BALANCE_QUERY", [16]),
- cmd_player_query: generate_cmd("PHOTO_QUERY",
- [102, {type: "integer", prop: "id"}]),
- cmd_game_query: generate_cmd("GAME_QUERY",
- [13, {type: "byte", prop: "game_type"},
- {type: "byte", prop: "limit_type"},
- {type: "byte", prop: "seats_op"},
- {type: "byte", prop: "seats"},
- {type: "byte", prop: "joined_op"},
- {type: "byte", prop: "joined"},
- {type: "byte", prop: "waiting_op"},
- {type: "byte", prop: "waiting"}]),
- cmd_ping: generate_cmd("PING",
- [253, {type: "timestamp", prop: "send"}]),
- cmd_seat_query: generate_cmd("SEAT_QUERY",
- [14, {type: "integer", prop: "gid"}]),
- cmd_join: generate_cmd("JOIN",
- [8, {type: "integer", prop: "gid"},
- {type: "byte", prop: "seat"},
- {type: "decimal", prop: "buyin"},
- {type: "string", prop: "nick"}]),
- cmd_watch: generate_cmd("WATCH",
- [3, {type: "integer", prop: "gid"}]),
- cmd_watch: generate_cmd("UNWATCH",
- [4, {type: "integer", prop: "gid"}]),
- cmd_watch: generate_cmd("LEAVE",
- [9, {type: "integer", prop: "gid"}]),
- cmd_watch: generate_cmd("FOLD",
- [7, {type: "integer", prop: "gid"}]),
- cmd_watch: generate_cmd("RAISE",
- [6, {type: "integer", prop: "gid"},
- {type: "decimal", prop: "amount"}]),
- notify_pong: generate_notify("PONG",
- [254, {type: "timestamp", prop: "orign_send"},
- {type: "timestamp", prop: "send"}]),
- notify_login: generate_notify("LOGIN", [31,
- {type: "integer", prop: "id"}]),
- notify_player_info: generate_notify("PLAYER_INFO", [19,
- {type: "integer", prop: "pid"},
- {type: "integer", prop: "inplay"},
- {type: "string", prop: "nick", base64: true},
- {type: "image", prop: "photo"}]),
- notify_player_info: generate_notify("BALANCE_INFO", [33,
- {type: "decimal", prop: "amount"},
- {type: "decimal", prop: "inplay"}]),
- notify_player_info: generate_notify("PHOTO_INFO", [101,
- {type: "integer", prop: "pid"},
- {type: "image", prop: "photo"}]),
- notify_game_info: generate_notify("GAME_INFO", [18,
- {type: "integer", prop: "id"},
- {type: "string", prop: "name", base64: true},
- {type: "byte", prop: "type"},
- {type: "byte", prop: "limit_type"},
- {type: "decimal", prop: "low"},
- {type: "decimal", prop: "high"},
- {type: "decimal", prop: "min"},
- {type: "decimal", prop: "max"},
- {type: "integer", prop: "seats"},
- {type: "integer", prop: "required"},
- {type: "integer", prop: "joined"},
- {type: "integer", prop: "waiting"},
- {type: "integer", prop: "count"}]),
- notify_error: generate_notify("ERROR", [255,
- {type: "byte", prop: "command"},
- {type: "byte", prop: "code"}]),
- notify_seat_state: generate_notify("SEAT_STATE", [30,
- {type: "integer", prop: "gid"},
- {type: "byte", prop: "sn"},
- {type: "integer", prop: "state"},
- {type: "integer", prop: "pid"},
- {type: "decimal", prop: "inplay"},
- {type: "string", prop: "nick", base64: true}]),
- notify_seat_state: generate_notify("SEAT_DETAIL", [83,
- {type: "integer", prop: "gid"},
- {type: "byte", prop: "sn"},
- {type: "integer", prop: "state"},
- {type: "integer", prop: "pid"},
- {type: "decimal", prop: "inplay"},
- {type: "string", prop: "nick", base64: true}]),
- notify_seat_state: generate_notify("GAME_DETAIL", [81,
- {type: "integer", prop: "gid"},
- {type: "decimal", prop: "pot"},
- {type: "byte", prop: "players"},
- {type: "byte", prop: "seats"},
- {type: "byte", prop: "stage"},
- {type: "decimal", prop: "min"},
- {type: "decimal", prop: "max"},
- {type: "decimal", prop: "low"},
- {type: "decimal", prop: "high"}
- ]),
- notify_seat_state: generate_notify("END", [24,
- {type: "integer", prop: "gid"}
- ]),
- notify_seat_state: generate_notify("START", [23,
- {type: "integer", prop: "gid"}
- ]),
- notify_seat_state: generate_notify("CANCEL", [25,
- {type: "integer", prop: "gid"}
- ]),
- notify_seat_state: generate_notify("STAGE", [29,
- {type: "integer", prop: "gid"},
- {type: "byte", prop: "stage"}
- ]),
- notify_seat_state: generate_notify("PRIVATE", [82,
- {type: "integer", prop: "gid"},
- {type: "integer", prop: "pid"},
- {type: "byte", prop: "face"},
- {type: "byte", prop: "suit"}
- ]),
- notify_seat_state: generate_notify("SHARE", [22,
- {type: "integer", prop: "gid"},
- {type: "byte", prop: "face"},
- {type: "byte", prop: "suit"}
- ]),
- notify_seat_state: generate_notify("DRAW", [21,
- {type: "integer", prop: "gid"},
- {type: "integer", prop: "pid"},
- {type: "byte", prop: "face"},
- {type: "byte", prop: "suit"}
- ]),
- notify_seat_state: generate_notify("DEALER", [35,
- {type: "integer", prop: "gid"},
- {type: "byte", prop: "seat"}
- ]),
- notify_seat_state: generate_notify("SBLIND", [36,
- {type: "integer", prop: "gid"},
- {type: "byte", prop: "seat"}
- ]),
- notify_seat_state: generate_notify("BBLIND", [37,
- {type: "integer", prop: "gid"},
- {type: "byte", prop: "seat"}
- ]),
- notify_seat_state: generate_notify("BET_REQ", [20,
- {type: "integer", prop: "gid"},
- {type: "decimal", prop: "call"},
- {type: "decimal", prop: "min"},
- {type: "decimal", prop: "max"}
- ]),
- notify_seat_state: generate_notify("ACTOR", [84,
- {type: "integer", prop: "gid"},
- {type: "byte", prop: "seat"}
- ]),
- notify_seat_state: generate_notify("RAISE", [42,
- {type: "integer", prop: "gid"},
- {type: "integer", prop: "pid"},
- {type: "decimal", prop: "raise"},
- {type: "decimal", prop: "call"}
- ]),
- notify_seat_state: generate_notify("BLIND", [85,
- {type: "integer", prop: "gid"},
- {type: "integer", prop: "pid"},
- {type: "decimal", prop: "blind"}
- ]),
- notify_seat_state: generate_notify("UNWATCH", [86,
- {type: "integer", prop: "gid"}
- ]),
- notify_seat_state: generate_notify("SHOW", [40,
- {type: "integer", prop: "gid"},
- {type: "integer", prop: "pid"},
- {type: "byte", prop: "size"},
- {type: "byte", prop: "face1"},
- {type: "byte", prop: "suit1"},
- {type: "byte", prop: "face2"},
- {type: "byte", prop: "suit2"}
- ]),
- notify_seat_state: generate_notify("HAND", [27,
- {type: "integer", prop: "gid"},
- {type: "integer", prop: "pid"},
- {type: "byte", prop: "rank"},
- {type: "byte", prop: "high1"},
- {type: "byte", prop: "high2"},
- {type: "byte", prop: "suit"}
- ]),
- notify_seat_state: generate_notify("WIN", [26,
- {type: "integer", prop: "gid"},
- {type: "integer", prop: "pid"},
- {type: "decimal", prop: "amount"},
- {type: "decimal", prop: "cost"},
- ]),
- notify_seat_state: generate_notify("LEAVE", [45,
- {type: "integer", prop: "gid"},
- {type: "integer", prop: "pid"}
- ]),
- notify_seat_state: generate_notify("JOIN", [44,
- {type: "integer", prop: "gid"},
- {type: "integer", prop: "pid"},
- {type: "byte", prop: "sn"},
- {type: "decimal", prop: "inplay"},
- {type: "string", prop: "nick", base64: true}
- ])
- };
-
- function generate_cmd(cmd, status) {
- // {{{
- var obj = {
- cmd: cmd,
- write: function(data) {
- var buf = new ArrayBuffer(255);
- var dv = new DataView(buf);
- var offset = 0;
-
- $.each(status, function(index, field) {
- if (index == 0) {
- dv.setUint8(offset, field); //set command
- offset += 1;
- return;
- }
-
- var val = data[field.prop];
-
- switch(field.type) {
- case "string":
- val = val == undefined ? "" : val;
- dv.setUint8(offset, val.length);
- offset += 1;
- $.each(val, function(i, c) {
- dv.setUint8(offset, c.charCodeAt());
- offset += 1;
- });
- break;
- case "integer":
- val = val == undefined ? 0 : val;
- dv.setUint32(offset, val);
- offset += 4;
- break;
- case "decimal":
- val = val == undefined ? 0 : val;
- dv.setUint32(offset, val * 10000);
- offset += 4;
- break;
- case "byte":
- val = val == undefined ? 0 : val;
- dv.setUint8(offset, val);
- offset += 1;
- break;
- case "timestamp":
- // 灏嗘椂闂存埑杞崲鎴愬井绉�
- val = val == undefined ? new Date().getTime() * 1000 : val;
- var arr = mod(val, 1000000, []);
- $.each(arr, function(i, v) {
- dv.setUint32(offset, v);
- offset += 4;
- });
- break;
- }
- });
-
- return new Uint8Array(dv.buffer, 0, offset);
- }
- }
+(function ($) {
+ var commands = new Object();
+ var commands_by_id = new Object();
+ var notifys = new Object();
+ var events = new Object();
- commands[cmd] = obj;
- commands_by_id[status[0]] = obj;
- // }}}
- }
- function mod(val, u, arr) {
- if (val < u) {
- arr.push(val);
- return arr;
- }
- mod((val - (val % u)) / u, u, arr);
- arr.push(val % u);
- return arr;
- }
-
- function generate_notify(notify, status) {
- // {{{
- var obj = {
- notify: notify,
- read: function(bin) {
- var obj = new Object();
- obj["notify"] = notify;
-
- var offset = 0;
- var buf = (new Uint8Array(bin)).buffer;
- var dv = new DataView(buf);
-
- $.each(status, function(index, val) {
- if (index == 0) {
- //= notifys["NOTIFY_" + dv.getUint8(offset)];
- offset += 1;
- return;
- }
-
- switch(val.type) {
- case "image":
- var result = read_wstring(dv, offset);
- offset = result[0];
- obj[val.prop] = result[1];
-
- if (val.type == "image") {
- obj[val.prop] = obj[val.prop];
- }
-
- break;
- case "string":
- var result = read_string(dv, offset);
- offset = result[0];
- obj[val.prop] = result[1];
-
- if (val.base64 == true) {
- obj[val.prop] = $.base64Decode(obj[val.prop]);
- }
-
- if (val.type == "image") {
- obj[val.prop] = "base64," + obj[val.prop];
- }
-
- break;
- case "integer":
- obj[val.prop] = dv.getUint32(offset);
- offset += 4;
- break;
- case "decimal":
- obj[val.prop] = dv.getUint32(offset) / 10000;
- offset += 4;
- break;
- case "byte":
- obj[val.prop] = dv.getUint8(offset);
- offset += 1;
- break;
- case "timestamp":
- var u = 1000000;
- var mega_secs = dv.getUint32(offset) * u * u;
- offset += 4;
- var secs = dv.getUint32(offset) * u;
- offset += 4;
- var micro_secs = dv.getUint32(offset);
- offset += 4;
- obj[val.prop] = (mega_secs + secs + micro_secs - (micro_secs % 1000)) / 1000;
- break;
- }
- });
-
- return obj;
- }
+ $.pp = {
+ // {{{ protocol function
+ read: function (bin) {
+ var obj = notifys["NOTIFY_" + bin[0]];
+
+ if ((obj == null) && (obj == undefined))
+ return null;
+
+ var data = obj.read(bin);
+ return data;
+ },
+
+ write: function (data) {
+ var obj = commands[data.cmd];
+ var bin = obj.write(data);
+ return bin;
+ },
+
+ reg: function (notify, fun) {
+ if (events[notify])
+ events[notify].push(fun);
+ else
+ events[notify] = [fun];
+ },
+
+ onmessage: function (evt) {
+ var bin = $.base64.decode(evt.data);
+ var obj = $.pp.read(bin);
+
+ if (obj != null) {
+ if (obj.notify in events)
+ $.each(events[obj.notify], function (i, fun) {
+ fun(obj);
+ });
+ else
+ console.log('undefined event', obj.notify, obj);
+ } else {
+ console.log('read event err', bin, evt);
+ }
+ },
+ // }}}
+
+ err: function (command, code) {
+ return commands_by_id[command].cmd;
+ },
+
+ cmd_login: generate_cmd("LOGIN",
+ [10, {type: "string", prop: "usr"},
+ {type: "string", prop: "pass"}]),
+ cmd_logout: generate_cmd("LOGOUT", [11]),
+ cmd_player_query: generate_cmd("PLAYER_QUERY",
+ [12, {type: "integer", prop: "id"}]),
+ cmd_balance_query: generate_cmd("BALANCE_QUERY",
+ [13]),
+ cmd_game_query: generate_cmd("GAME_QUERY",
+ [14]),
+ cmd_watch: generate_cmd("WATCH",
+ [31, {type: "integer", prop: "gid"}]),
+ cmd_watch: generate_cmd("UNWATCH",
+ [32, {type: "integer", prop: "gid"}]),
+ cmd_join: generate_cmd("JOIN",
+ [33, {type: "integer", prop: "gid"},
+ {type: "byte", prop: "seat"},
+ {type: "decimal", prop: "buyin"},
+ {type: "string", prop: "nick"}]),
+ cmd_watch: generate_cmd("LEAVE",
+ [34, {type: "integer", prop: "gid"}]),
+ cmd_watch: generate_cmd("RAISE",
+ [35, {type: "integer", prop: "gid"},
+ {type: "decimal", prop: "amount"}]),
+ cmd_watch: generate_cmd("FOLD",
+ [36, {type: "integer", prop: "gid"}]),
+ cmd_seat_query: generate_cmd("SEAT_QUERY",
+ [37, {type: "integer", prop: "gid"}]),
+
+ cmd_photo_query: generate_cmd("PHOTO_QUERY",
+ [102, {type: "integer", prop: "id"}]),
+ cmd_ping: generate_cmd("PING",
+ [253, {type: "timestamp", prop: "send"}]),
+
+
+ // notify_game_info
+ notify_login: generate_notify("LOGIN", [131,
+ {type: "integer", prop: "id"}]),
+ notify_player_info: generate_notify("BALANCE_INFO", [100,
+ {type: "decimal", prop: "amount"},
+ {type: "decimal", prop: "inplay"}]),
+ notify_game_info: generate_notify("GAME_INFO", [101,
+ {type: "integer", prop: "id"},
+ {type: "string", prop: "name"},
+
+ {type: "integer", prop: "type"},
+ // {type: "integer", prop: "limit_type"},
+ {type: "integer", prop: "low"},
+ {type: "integer", prop: "high"},
+ {type: "integer", prop: "min"},
+ {type: "integer", prop: "max"},
+
+ {type: "byte", prop: "seats"},
+ {type: "byte", prop: "required"},
+ {type: "byte", prop: "joined"}
+ //{type: "integer", prop: "waiting"},
+ //{type: "integer", prop: "count"}
+ ]),
+ notify_game_num: generate_notify("GAME_NUM", [127,
+ {type: "integer", prop: "num"}]),
+ notify_seat_num: generate_notify("SEAT_NUM", [128,
+ {type: "integer", prop: "num"}]),
+ notify_player_info: generate_notify("PLAYER_INFO", [124,
+ {type: "integer", prop: "pid"},
+ {type: "integer", prop: "inplay"},
+ {type: "string", prop: "nick", base64: true},
+ {type: "string", prop: "photo"}]),
+ notify_seat_state: generate_notify("SEAT_DETAIL", [102,
+ {type: "integer", prop: "gid"},
+ {type: "decimal", prop: "pot"},
+ {type: "byte", prop: "players"},
+ {type: "byte", prop: "seats"},
+ {type: "byte", prop: "stage"},
+ {type: "decimal", prop: "min"},
+ {type: "decimal", prop: "max"},
+ {type: "decimal", prop: "low"},
+ {type: "decimal", prop: "high"}
+ ]),
+ notify_error: generate_notify("ERROR", [255,
+ {type: "byte", prop: "command"},
+ {type: "byte", prop: "code"}]),
+ notify_seat_state: generate_notify("SEAT_STATE", [115,
+ {type: "integer", prop: "gid"},
+ {type: "byte", prop: "sn"},
+ {type: "integer", prop: "state"},
+ {type: "integer", prop: "pid"},
+ {type: "decimal", prop: "inplay"},
+ {type: "string", prop: "nick", base64: true},
+ {type: "string", prop: "photo"}]),
+
+
+ notify_player_info: generate_notify("PHOTO_INFO", [369101,
+ {type: "integer", prop: "pid"},
+ {type: "image", prop: "photo"}]),
+ notify_seat_state: generate_notify("SEAT_DETAIL", [83,
+ {type: "integer", prop: "gid"},
+ {type: "byte", prop: "sn"},
+ {type: "integer", prop: "state"},
+ {type: "integer", prop: "pid"},
+ {type: "decimal", prop: "inplay"},
+ {type: "string", prop: "nick", base64: true}]),
+ notify_seat_state: generate_notify("END", [104,
+ {type: "integer", prop: "gid"}
+ ]),
+ notify_seat_state: generate_notify("START", [103,
+ {type: "integer", prop: "gid"}
+ ]),
+ notify_seat_state: generate_notify("CANCEL", [105,
+ {type: "integer", prop: "gid"}
+ ]),
+ notify_seat_state: generate_notify("STAGE", [106,
+ {type: "integer", prop: "gid"},
+ {type: "byte", prop: "stage"}
+ ]),
+ notify_seat_state: generate_notify("PRIVATE", [119,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"},
+ {type: "byte", prop: "face"},
+ {type: "byte", prop: "suit"}
+ ]),
+ notify_seat_state: generate_notify("SHARE", [120,
+ {type: "integer", prop: "gid"},
+ {type: "byte", prop: "face"},
+ {type: "byte", prop: "suit"}
+ ]),
+ notify_seat_state: generate_notify("DRAW", [118,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"},
+ {type: "byte", prop: "face"},
+ {type: "byte", prop: "suit"}
+ ]),
+ notify_seat_state: generate_notify("DEALER", [110, //todo
+ {type: "integer", prop: "gid"},
+ {type: "byte", prop: "seat"}
+ ]),
+ notify_seat_state: generate_notify("SBLIND", [111,
+ {type: "integer", prop: "gid"},
+ {type: "byte", prop: "seat"}
+ ]),
+ notify_seat_state: generate_notify("BBLIND", [112,
+ {type: "integer", prop: "gid"},
+ {type: "byte", prop: "seat"}
+ ]),
+ notify_seat_state: generate_notify("BET_REQ", [117,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"},
+ {type: "byte", prop: "sn"},
+ {type: "decimal", prop: "call"},
+ {type: "decimal", prop: "min"},
+ {type: "decimal", prop: "max"}
+ ]),
+ notify_seat_state: generate_notify("ACTOR", [116,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"},
+ {type: "byte", prop: "sn"}
+ ]),
+ notify_seat_state: generate_notify("RAISE", [114,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"},
+ {type: "decimal", prop: "raise"},
+ {type: "decimal", prop: "call"}
+ ]),
+ notify_seat_state: generate_notify("BLIND", [85,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"},
+ {type: "decimal", prop: "blind"}
+ ]),
+ notify_seat_state: generate_notify("UNWATCH", [130,
+ {type: "integer", prop: "gid"}
+ ]),
+ notify_seat_state: generate_notify("WATCH", [129,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"}
+ ]),
+ notify_seat_state: generate_notify("SHOW", [40,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"},
+ {type: "byte", prop: "size"},
+ {type: "byte", prop: "face1"},
+ {type: "byte", prop: "suit1"},
+ {type: "byte", prop: "face2"},
+ {type: "byte", prop: "suit2"}
+ ]),
+ notify_seat_state: generate_notify("HAND", [121,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"},
+ {type: "byte", prop: "rank"},
+ {type: "byte", prop: "high1"},
+ {type: "byte", prop: "high2"},
+ {type: "byte", prop: "suit"}
+ ]),
+ notify_seat_state: generate_notify("WIN", [123,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"},
+ {type: "byte", prop: "sn"},
+ {type: "decimal", prop: "amount"},
+ ]),
+ notify_seat_state: generate_notify("LEAVE", [109,
+ {type: "integer", prop: "gid"},
+ {type: "byte", prop: "sn"},
+ {type: "integer", prop: "pid"}
+ ]),
+ notify_seat_state: generate_notify("JOIN", [108,
+ {type: "integer", prop: "gid"},
+ {type: "integer", prop: "pid"},
+ {type: "byte", prop: "sn"},
+ {type: "decimal", prop: "inplay"},
+ {type: "string", prop: "nick", base64: true}
+ ]),
+
+
+ notify_pong: generate_notify("PONG",
+ [254, {type: "timestamp", prop: "orign_send"},
+ {type: "timestamp", prop: "send"}])
};
- function read_string(dv, offset) {
- var str = "";
- var len = dv.getUint8(offset);
- offset += 1;
- while(len > 0) {
- str += String.fromCharCode(dv.getUint8(offset));
- offset += 1;
- len--;
- }
-
- return [offset, str];
+ function generate_cmd(cmd, status) {
+ // {{{
+ var obj = {
+ cmd: cmd,
+ write: function (data) {
+ console.log("cmd:" + cmd + " bin:" + data, status);
+ var buf = new ArrayBuffer(255);
+ var dv = new DataView(buf);
+ var offset = 0;
+
+ $.each(status, function (index, field) {
+ if (index == 0) {
+ dv.setUint8(offset, field); //set command
+ offset += 1;
+ return;
+ }
+
+ var val = data[field.prop];
+
+ switch (field.type) {
+ case "string":
+ val = val == undefined ? "" : val;
+ dv.setUint8(offset, val.length);
+ offset += 1;
+ $.each(val, function (i, c) {
+ dv.setUint8(offset, c.charCodeAt());
+ offset += 1;
+ });
+ break;
+ case "integer":
+ val = val == undefined ? 0 : val;
+ dv.setUint32(offset, val);
+ offset += 4;
+ break;
+ case "decimal":
+ val = val == undefined ? 0 : val;
+ dv.setUint32(offset, val * 10000);
+ offset += 4;
+ break;
+ case "byte":
+ val = val == undefined ? 0 : val;
+ dv.setUint8(offset, val);
+ offset += 1;
+ break;
+ case "timestamp":
+ // 灏嗘椂闂存埑杞崲鎴愬井绉�
+ val = val == undefined ? new Date().getTime() * 1000 : val;
+ var arr = mod(val, 1000000, []);
+ $.each(arr, function (i, v) {
+ dv.setUint32(offset, v);
+ offset += 4;
+ });
+ break;
+ }
+ });
+
+ return new Uint8Array(dv.buffer, 0, offset);
+ }
+ }
+
+ commands[cmd] = obj;
+ commands_by_id[status[0]] = obj;
+ // }}}
}
- function read_wstring(dv, offset) {
- var str = "";
- var len = dv.getUint32(offset);
- offset += 4;
- while(len > 0) {
- str += String.fromCharCode(dv.getUint8(offset));
- offset += 1;
- len--;
- }
-
- return [offset, str];
+ function mod(val, u, arr) {
+ if (val < u) {
+ arr.push(val);
+ return arr;
+ }
+ mod((val - (val % u)) / u, u, arr);
+ arr.push(val % u);
+ return arr;
}
- notifys["NOTIFY_" + status[0]] = obj;
- // }}}
- }
+ function generate_notify(notify, status) {
+ // {{{
+ var obj = {
+ notify: notify,
+ read: function (bin) {
+ var obj = new Object();
+ obj["notify"] = notify;
+
+ var offset = 0;
+ var buf = (new Uint8Array(bin)).buffer;
+ var dv = new DataView(buf);
+
+ $.each(status, function (index, val) {
+ if (index == 0) {
+ console.log("notify:" + notify + " val:" + val + " bin:" + bin, status);
+ //= notifys["NOTIFY_" + dv.getUint8(offset)];
+ offset += 1;
+ return;
+ }
+
+ switch (val.type) {
+ case "image":
+ var result = read_wstring(dv, offset);
+ offset = result[0];
+ obj[val.prop] = result[1];
+
+ if (val.type == "image") {
+ obj[val.prop] = obj[val.prop];
+ }
+
+ break;
+ case "string":
+ var result = read_string(dv, offset);
+ offset = result[0];
+ obj[val.prop] = result[1];
+
+ if (val.base64 == true) {
+ obj[val.prop] = $.base64Decode(obj[val.prop]);
+ }
+
+ if (val.type == "image") {
+ obj[val.prop] = "base64," + obj[val.prop];
+ }
+
+ break;
+ case "integer":
+ obj[val.prop] = dv.getUint32(offset);
+ offset += 4;
+ break;
+ case "decimal":
+ obj[val.prop] = dv.getUint32(offset) / 10000;
+ offset += 4;
+ break;
+ case "byte":
+ obj[val.prop] = dv.getUint8(offset);
+ offset += 1;
+ break;
+ case "timestamp":
+ var u = 1000000;
+ var mega_secs = dv.getUint32(offset) * u * u;
+ offset += 4;
+ var secs = dv.getUint32(offset) * u;
+ offset += 4;
+ var micro_secs = dv.getUint32(offset);
+ offset += 4;
+ obj[val.prop] = (mega_secs + secs + micro_secs - (micro_secs % 1000)) / 1000;
+ break;
+ }
+ });
+
+ return obj;
+ }
+ };
+
+ function read_string(dv, offset) {
+ var str = "";
+ var len = dv.getUint8(offset);
+ offset += 1;
+ while (len > 0) {
+ str += String.fromCharCode(dv.getUint8(offset));
+ offset += 1;
+ len--;
+ }
+
+ return [offset, str];
+ }
+
+ function read_wstring(dv, offset) {
+ var str = "";
+ var len = dv.getUint32(offset);
+ offset += 4;
+ while (len > 0) {
+ str += String.fromCharCode(dv.getUint8(offset));
+ offset += 1;
+ len--;
+ }
+
+ return [offset, str];
+ }
+
+ notifys["NOTIFY_" + status[0]] = obj;
+ // }}}
+ }
})($)
// vim: fdm=marker
diff --git a/js/plugins/websocket.js b/js/plugins/websocket.js
index 8ed960d..2e98f76 100644
--- a/js/plugins/websocket.js
+++ b/js/plugins/websocket.js
@@ -1,50 +1,50 @@
-(function($) {
- $.ws = {
- send: function(bin) {
- var msg = $.base64.encode(bin);
- queue.unshift(msg);
- },
-
- defaults: {
- host: "173.255.240.250",
- port: "8002",
- onmessage: function(e) {
- console.log(['websocket message', e]);
- },
- onopen: function() {
- console.log('websocket open');
- }
- },
-
- init: function() {
- init();
-
- $(this).everyTime(300, function() {
- if (queue.length == 0)
- return;
-
- ws.send(queue.pop());
- });
- },
-
- isConnection: function() {
- return ws.readyState == WebSocket.OPEN;
- }
- };
-
- function init() {
- if ((ws == null) || (ws == undefined)) {
- var url = "ws://" + $.ws.defaults.host +
- ":" + $.ws.defaults.port + "/";
- ws = new WebSocket(url, "chat");
- ws.onmessage = $.ws.defaults.onmessage;
- ws.onopen = $.ws.defaults.onopen;
- return ws;
- }
+(function ($) {
+ $.ws = {
+ send: function (bin) {
+ var msg = $.base64.encode(bin);
+ queue.unshift(msg);
+ },
+
+ defaults: {
+ host: "127.0.0.1",
+ port: "8000",
+ onmessage: function (e) {
+ console.log(['websocket message', e]);
+ },
+ onopen: function () {
+ console.log('websocket open');
+ }
+ },
+
+ init: function () {
+ init();
+
+ $(this).everyTime(300, function () {
+ if (queue.length == 0)
+ return;
- return ws;
- }
+ ws.send(queue.pop());
+ });
+ },
+
+ isConnection: function () {
+ return ws.readyState == WebSocket.OPEN;
+ }
+ };
+
+ function init() {
+ if ((ws == null) || (ws == undefined)) {
+ var url = "ws://" + $.ws.defaults.host +
+ ":" + $.ws.defaults.port + "/op_game";
+ ws = new WebSocket(url, "chat");
+ ws.onmessage = $.ws.defaults.onmessage;
+ ws.onopen = $.ws.defaults.onopen;
+ return ws;
+ }
+
+ return ws;
+ }
- var ws;
- var queue = [];
+ var ws;
+ var queue = [];
})($);
diff --git a/src/coffee/entry.coffee b/src/coffee/entry.coffee
deleted file mode 100644
index bfec960..0000000
--- a/src/coffee/entry.coffee
+++ /dev/null
@@ -1,16 +0,0 @@
-$ ->
- $('[type=checkbox]').bind 'click', ->
- checked = $(@).attr('checked')
- $('[type=checkbox]').removeAttr 'checked'
- $(@).attr('checked', '') if checked == 'checked'
- return
-
- $('#go').bind 'click', ->
- url = 'http://localhost/texas/?host=' + $('#host').val()
- url += '&usr=' + $('#usr').val()
- url += '&pwd=' + $('#pwd').val()
-
- url += '&auto_join=true' if $('#auto_join').attr('checked') == 'checked'
- url += '&auto_watch=true' if $('#auto_watch').attr('checked') == 'checked'
-
- window.location = url
diff --git a/src/coffee/game.coffee b/src/coffee/game.coffee
deleted file mode 100644
index 04c8ead..0000000
--- a/src/coffee/game.coffee
+++ /dev/null
@@ -1,425 +0,0 @@
-class Game
- constructor: (@gid, @dom) ->
- return
-
- init: (@detail) ->
- @stage = GS_PREFLOP
- @seats = []
- @dom.trigger 'inited'
-
- init_seat: (seat_detail) ->
- switch seat_detail.state
- when PS_EMPTY then @seats[seat_detail.sn] = new EmptySeat seat_detail, @
- else @seats[seat_detail.sn] = new PlayingSeat seat_detail, @
-
- update_seat: (seat_detail) ->
- if seat_detail.state is PS_EMPTY
- return
-
- reset_position: (sn)->
- $.positions.offset = $.positions.size - sn + 1
- seat.set_position() for seat in @seats when seat?
-
- join: (seat_detail) ->
- @seats[seat_detail.sn].remove()
- @seats[seat_detail.sn] = new PlayingSeat seat_detail, @
-
- if seat_detail.pid is $.player.pid
- @player = $.player
- @hide_empty()
- @reset_position(seat_detail.sn)
-
- @seats[seat_detail.sn].disable()
-
- hide_empty: ->
- $("#cmd_leave").attr('disabled', false).removeClass('disabled')
- seat.hide() for seat in @seats when seat? and seat.__proto__.constructor is EmptySeat
-
- show_empty: ->
- $("#cmd_leave").attr('disabled', true).addClass('disabled')
- seat.show() for seat in @seats when seat? and seat.__proto__.constructor is EmptySeat
-
- leave: (args) ->
- seat = @seats[args.sn]
-
- if seat.__proto__.constructor is EmptySeat
- return
-
- if args.player.pid is $.player.pid
- @player = null
-
- @seats[seat.sn].clear()
- @seats[seat.sn].remove()
- @seats[seat.sn] = new EmptySeat {sn: args.sn}, @
-
- if @player
- @hide_empty()
- else
- @show_empty()
-
- clear: ->
- @stage = GS_PREFLOP
- $.positions.reset_share()
- $(".bet, .pot, .card").remove()
- seat.clear() for seat in @seats when seat?
-
- get_seat_by_pid: (o) ->
- return seat for seat in @seats when seat? and seat.__proto__.constructor is PlayingSeat and seat.player.pid is o.pid
-
- get_seat_by_sn: (o) ->
- return seat for seat in @seats when seat? and seat.__proto__.constructor is PlayingSeat and seat.sn is o.seat
-
- get_seat: (o) ->
- if 'pid' of o
- return @get_seat_by_pid(o)
- else if 'seat' of o
- return @get_seat_by_sn(o)
- else if 'sn' of o
- return @get_seat_by_sn(o)
- else
- throw "unknown object #{o} in get_seat()"
-
- new_stage: (stage)->
- @stage = stage
- seat.reset_bet() for seat in @seats when seat? and seat.__proto__.constructor is PlayingSeat
- ref = @dom
- @dom.oneTime '0.3s', ->
- $(bet).css($.positions.get_random([240, 680], 20)).removeClass('bet').addClass('pot') for bet in ref.children(".bet")
-
- share_card: (face, suit) ->
- $.get_poker(face, suit).
- css($.positions.get_next_share()).
- appendTo(@dom)
-
- win: (seat) ->
- ref = @dom
- ref.oneTime '1s', ->
- $(bet).css($.positions.get_bet(seat.sn).start) for bet in ref.children(".bet, .pot")
-
- high: (face, suit, filter, seat_pokers) ->
- pokers = $.merge(@dom.children('.card'), seat_pokers)
- pokers = $.find_poker(face, suit, pokers)
- pokers = filter(pokers) if filter?
- pokers.addClass('high_card')
-
- clear_high: ->
- $.find_poker().removeClass('high_card')
-
- clear_actor: ->
- $('.actor_timer').remove()
- $('.actor_seat').removeClass('actor_seat')
-
- disable_actions: (key)->
- unless key?
- $("#cmd_call").text '跟注'
- $("#cmd_raise").text '加注'
-
- $("#game > .actions > *").attr("disabled", true).addClass('disabled')
- else
- if key is '#cmd_call'
- $("#cmd_call").text '跟注'
- if key is '#cmd_raise'
- $("#cmd_raise").text '加注'
-
- $("#game > .actions").children(key).attr("disabled", true).addClass('disabled')
-
- enable_actions: (args)->
- $("#game > .actions > *").attr("disabled", false).removeClass('disabled')
-
- if args.call >= args.max
- $("#cmd_call").text "ALL-IN $#{args.max}"
- @disable_actions '#cmd_raise'
- @disable_actions '#cmd_check'
- @disable_actions '#raise_range'
- @disable_actions '#raise_number'
- else
- $("#cmd_call").text "跟注 $#{args.call}"
-
- @disable_actions if args.call is 0 then '#cmd_call' else '#cmd_check'
-
- set_actor: (args)->
- @actor = @get_seat args
- @actor.set_actor()
-
- check_actor: ->
- if @actor? and @actor.player.pid is $.player.pid
- return true
-
- return false
-
- check: ->
- $.ws.send $.pp.write {cmd: "RAISE", amount: 0, gid: @gid}
-
- fold: ->
- $.ws.send $.pp.write {cmd: "FOLD", gid: @gid}
-
- call: (amount = 0)->
- $.ws.send $.pp.write {cmd: "RAISE", amount: amount, gid: @gid}
-
-$ ->
- game = null
- game_dom = $('#game')
- hall_dom = $('#hall')
- private_card_sn = 0
-
- log = (msg) ->
- $('#logs').
- append("#{msg}
").
- scrollTop($('#logs')[0].scrollHeight)
-
- log_empty = () ->
- $('#logs').empty()
-
- nick = (o) ->
- return "
#{o.nick}" if o.nick
- "
#{o.player.nick}"
-
- money = (n) ->
- "
$#{n}"
-
- action = (a) ->
- "
#{a}"
-
- rank = (r) ->
- "
#{r}"
-
- game_dom.bind 'cancel_game', (event, args) ->
- log_empty()
- game.clear()
- game = null
- $("#game > .playing_seat").remove()
- $("#game > .empty_seat").remove()
- $(@).hide()
-
- game_dom.bind 'start_game', (event, args) ->
- $("#cmd_leave").attr('disabled', true).addClass('disabled')
-
- game = new Game args.gid, game_dom
- game.disable_actions()
-
- cmd = {gid: args.gid}
-
- $.game = game
-
- switch args.action
- when 'watch' then $.extend(cmd, {cmd: "WATCH"})
- when 'join' then $.extend(cmd, {cmd: "JOIN", buyin: args.buyin, seat: 0})
- else throw 'unknown game action'
-
- $.ws.send $.pp.write cmd
-
- $(@).show()
-
- $(@).oneTime '3s', ->
- # 3s timeout show network error
- blockUI '#err_network'
- return
-
- game_dom.bind 'inited', ->
- $(@).stopTime()
- return
-
- $.get_poker = (face, suit) ->
- $("
}"]})
").attr('face', face).attr('suit', suit)
-
- $.find_poker = (face, suit, pokers) ->
- return pokers.filter("[face=#{face}]").filter("[suit=#{suit}]") if face? and suit?
- return pokers.filter("[face=#{face}]") if face?
- return pokers.filter("[suit=#{suit}]") if suit?
- return $(".card")
-
- # {{{
- $.pp.reg "GAME_DETAIL", (detail) ->
- game.init detail
- if detail.players < 2
- growlUI "#tips_empty"
- else
- unblockUI()
-
- $.pp.reg "SEAT_DETAIL", (detail) ->
- game.init_seat detail
-
- $.pp.reg "SEAT_STATE", (detail) ->
- return unless game
- return if detail.state is PS_EMPTY
-
- seat = game.get_seat detail
-
- if seat.update detail
- if detail.state is PS_ALL_IN
- log "#{nick detail} #{action 'ALL-IN'}"
- else if detail.state is PS_FOLD
- log "#{nick detail} #{action '棄牌'}"
- else if detail.state is PS_OUT
- log "#{nick detail} #{action 'OUT'}"
-
- $.pp.reg "CANCEL", (args) ->
- game.clear()
- log ""
- log "===== #{action '請等待其他玩家的加入'} ====="
-
-
- $.pp.reg "START", (args) ->
- if $(".blockUI > .buyin").size() is 0
- unblockUI()
-
- game.clear()
-
- log ''
- log "===== #{action '新的牌局開始'} ====="
-
- $.pp.reg "END", (args) ->
- return
-
- $.pp.reg "DEALER", (args) ->
- seat = game.get_seat args
- seat.set_dealer()
-
- $.pp.reg "SBLIND", (args) ->
- return
-
- $.pp.reg "BBLIND", (args) ->
- return
-
- $.pp.reg "BLIND", (args) ->
- seat = game.get_seat args
- seat.raise(args.blind, 0)
- log "#{nick seat} #{action '下盲注'} #{money args.blind}"
-
- $.pp.reg "RAISE", (args) ->
- sum = args.call + args.raise
- seat = game.get_seat args
-
- if sum is 0
- seat.check()
- log "#{nick seat} #{action '看牌'}"
- else
- seat.raise(args.call, args.raise)
- if args.raise is 0
- log "#{nick seat} #{action '跟注'} #{money args.call}"
- else
- log "#{nick seat} #{action '加注'} #{money args.raise}"
-
- $.pp.reg "DRAW", (args) ->
- seat = game.get_seat args
- seat.draw_card()
-
- $.pp.reg "SHARE", (args) ->
- game.share_card(args.face, args.suit)
-
- $.pp.reg "PRIVATE", (args) ->
- private_card_sn += 1
-
- seat = game.get_seat args
- seat.private_card(args.face, args.suit, private_card_sn)
-
- if private_card_sn == 2
- private_card_sn = 0
- return
-
- $.pp.reg "ACTOR", (args) ->
- game.set_actor(args)
-
- unless game.check_actor()
- game.disable_actions()
-
- $.pp.reg "STAGE", (args) ->
- game.new_stage(args.stage) if args.stage != GS_PREFLOP
-
- $.pp.reg "JOIN", (args) ->
- game.join args
- log "#{nick args} #{action '加入'}"
-
- $.pp.reg "LEAVE", (args) ->
- seat = game.get_seat args
- game.leave seat
-
- $.pp.reg "UNWATCH", (args) ->
- game_dom.trigger 'cancel_game'
- hall_dom.trigger 'cancel_game'
-
- $.pp.reg "BET_REQ", (args) ->
- game.enable_actions(args)
-
- $('#raise_range, #raise_number').val(args.min).
- attr('min', args.min).
- attr('max', args.max)
-
- $.pp.reg "SHOW", (args) ->
- game.new_stage()
- seat = game.get_seat args
- seat.private_card args.face1, args.suit1, 1
- seat.private_card args.face2, args.suit2, 2
-
- $.pp.reg "HAND", (args) ->
- seat = game.get_seat args
- seat.set_hand args
- seat.set_rank()
-
- if game.check_actor()
- seat.high()
-
- $.pp.reg "WIN", (args) ->
- game.clear_actor()
- seat = game.get_seat args
- game.win seat
- seat.high()
-
- msg = "#{nick seat} #{rank seat.rank} #{action '贏得'} #{money (args.amount - args.cost)}"
-
- log msg
-
- if $(".blockUI > .buyin").size() is 0
- growlUI "
#{msg}
"
-
- # }}}
-
- $("#game > .actions > [id^=cmd_fold]").bind 'click', ->
- return if $(@).hasClass('disabled')
- return unless game.check_actor()
-
- game.fold()
-
- $("#game > .actions > [id^=cmd_check]").bind 'click', ->
- return if $(@).hasClass('disabled')
- return unless game.check_actor()
-
- game.check()
-
- $("#game > .actions > [id^=cmd_call]").bind 'click', ->
- return if $(@).hasClass('disabled')
- return unless game.check_actor()
-
- game.call()
-
- $("#game > .actions > [id^=cmd_raise]").bind 'click', ->
- return if $(@).hasClass('disabled')
- return unless game.check_actor()
-
- $('#raise_range').trigger 'change'
- amount = parseInt $('#raise_range').val()
- game.call(amount)
-
- $("#game > .actions > [id^=cmd]").bind 'click', ->
- game.disable_actions()
-
- $('#raise_range, #raise_number').bind 'change', (event) ->
- v = parseInt $(this).val()
- min = parseInt $(this).attr("min")
- max = parseInt $(this).attr("max")
-
- if (v < min)
- v = min
-
- if (v > max)
- v = max
-
- $('#raise_range, #raise_number').val(v.toString())
-
- $('#cmd_cancel').bind 'click', (event) ->
- $.ws.send $.pp.write {cmd: "UNWATCH", gid: $.game.gid}
-
- $('#cmd_leave').bind 'click', (event) ->
- $.ws.send $.pp.write {cmd: "LEAVE", gid: $.game.gid}
-
- return
diff --git a/src/coffee/hall.coffee b/src/coffee/hall.coffee
deleted file mode 100644
index 55cf32d..0000000
--- a/src/coffee/hall.coffee
+++ /dev/null
@@ -1,79 +0,0 @@
-$ ->
- hall = $('#hall')
- game = $('#game')
- game_preview = $('#game_preview')
- game_list = $('#game_list > tbody')
- template = $('#hall > .template').text()
- game_counter = 0
-
- $('#cmd_watch').bind 'click', ->
- gid = game_list.children().first().data('gid')
- hall.trigger 'start_game'
- game.trigger 'start_game', {action: 'watch', gid: gid}
-
- hall.bind 'setup', ->
- $(@).show()
- $(@).trigger('reload')
-
- hall.bind 'reload', ->
- blockUI '#msg_loading'
- game_counter = 0
- # clone autofill apendto empty game_list
- autofill = game_list.children().last().clone()
- game_list.empty().append(autofill)
- game_query [1, 0, 0, 0, 0, 0, 0]
-
- hall.bind 'loaded', ->
- unblockUI()
- game_list.children().first().click()
-
- if $.url.get('auto_watch') is 'true'
- $(@).oneTime '2s', ->
- $("#cmd_watch").trigger 'click'
- return
-
- hall.bind 'start_game', ->
- $(@).hide()
-
- hall.bind 'cancel_game', ->
- $(@).show()
- $(@).trigger('reload')
-
- $.pp.reg "GAME_INFO", (game_info) ->
- game_counter++
-
- $(template).data('gid', game_info.id).
- children('.name').text(game_info.name).parent().
- children('.blind').text(game_info.low + " / " + game_info.high).parent().
- children('.player').text(game_info.joined + " / " + game_info.seats).parent().
- children('.limit').text(game_info.min + " / " + game_info.max).parent().
- insertBefore('.autofill').
- click(->
- selected = 'selected'
- return if $(@).hasClass selected
-
- $(@).parent().children().removeClass selected
- $(@).addClass selected
-
- $.game_preview.clear() if $.game_preview
- $.game_preview = new GamePreview($(@).data('gid'), game_preview)
-
- return
- )
-
- hall.trigger 'loaded' if game_counter == game_info.count
- return
-
- game_query = (arr) ->
- o = {cmd: 'GAME_QUERY', game_type: 0}
- o.waiting = arr.pop()
- o.waiting_op = arr.pop()
- o.joined = arr.pop()
- o.joined_op = arr.pop()
- o.seats = arr.pop()
- o.seats_op = arr.pop()
- o.limit_type = arr.pop()
- $.ws.send($.pp.write(o))
- return
-
- return
diff --git a/src/coffee/header.coffee b/src/coffee/header.coffee
deleted file mode 100644
index 94e6ad3..0000000
--- a/src/coffee/header.coffee
+++ /dev/null
@@ -1,92 +0,0 @@
-PS_EMPTY = 0
-PS_PLAY = 1
-PS_FOLD = 2
-PS_WAIT_BB = 4
-PS_SIT_OUT = 8
-PS_MAKEUP_BB = 16
-PS_ALL_IN = 32
-PS_BET = 64
-PS_RESERVED = 128
-PS_AUTOPLAY = 256
-PS_MUCK = 512
-PS_OUT = 1024
-
-CF_ACE = 13
-CF_KING = 12
-CF_QUEEN = 11
-CF_JACK = 10
-CF_TEN = 9
-CF_NINE = 8
-CF_EIGHT = 7
-CF_SEVEN = 6
-CF_SIX = 5
-CF_FIVE = 4
-CF_FOUR = 3
-CF_THREE = 2
-CF_TWO = 1
-CF_NONE = 0
-
-CS_SPADES = 4
-CS_HEARTS = 3
-CS_DIAMONDS = 2
-CS_CLUBS = 1
-CS_NONE = 0
-
-HC_HIGH_CARD = 0
-HC_PAIR = 1
-HC_TWO_PAIR = 2
-HC_THREE_KIND = 3
-HC_STRAIGHT = 4
-HC_FLUSH = 5
-HC_FULL_HOUSE = 6
-HC_FOUR_KIND = 7
-HC_STRAIGHT_FLUSH = 8
-
-GS_PREFLOP = 0
-GS_FLOP = 1
-GS_TURN = 2
-GS_RIVER = 3
-GS_DELAYED_START = 4
-GS_BLINDS = 5
-GS_SHOWDOWN = 6
-GS_CANCEL = 254
-
-MAX_PLAYER = 9
-
-RANKS = [
- "高牌", "一對", "兩對"
- "三條", "順子", "同花"
- "葫蘆", "四條", "同花順"
-]
-
-BETS = [
- [5000, 1], [2000, 2], [1000, 3]
- [500, 4], [200, 5], [100, 6]
- [50, 7], [20, 8], [10, 9]
- [5, 10], [2, 11], [1, 12]
-]
-
-BLOCKUI = {
- 'width': "400px"
- 'color': "#ffffff"
- 'border-radius': "8px"
- 'border': "3px solid #174f75"
- 'background-color': "rgba(15, 38, 61, 0.8)"
- 'text-shadow': "1px 1px 1px #929da7"
- '-webkit-box-shadow': "2px 2px 2px black"
- 'top': '200px'
-}
-
-GROWLUI = {
- width: '350px'
- right: '10px'
- border: 'none'
- padding: '5px'
- backgroundColor: '#000'
- '-webkit-border-radius': '10px'
- '-moz-border-radius': '10px'
- opacity: .6
- color: '#fff'
- top: '630px'
- left: '500px'
-}
diff --git a/src/coffee/index.coffee b/src/coffee/index.coffee
deleted file mode 100644
index 31deb8f..0000000
--- a/src/coffee/index.coffee
+++ /dev/null
@@ -1,162 +0,0 @@
-format = (str, step = 3, splitor = ',') ->
- arr = []
- str = str.toString()
- len = str.length
-
- if len > step
- l1 = len % step
- l2 = parseInt len / step
- first = str.substr(0, l1)
-
- arr.push(first) if first != ''
- arr.push(str.substr(l1 + i*step, step)) for i in [0..11] when (i * step + l1) < len
-
- str = arr.join(splitor)
-
- return str
-
-growlUI = (id, opt) ->
- conf = {
- message: $(id).clone()
- fadeIn: 700
- fadeOut: 700
- timeout: 6000
- showOverlay: false
- css: GROWLUI
- }
-
- conf = $.extend(conf, opt) if opt?
- $('#page').block conf
-
-blockUI = (o, timeout) ->
- style = BLOCKUI
- timeout = if timeout? then timeout else 0
-
- if typeof o is 'string'
- $.blockUI {
- message: $(o).clone()
- centerX: true
- centerY: true
- timeout: timeout
- css: style
- }
- else
- $.blockUI {
- message: $(o)
- centerX: true
- centerY: true
- timeout: timeout
- css: style
- }
-
- return
-
-unblockUI = ->
- $.unblockUI()
- return
-
-$ ->
- singin_dom = $('#singin')
- singin_form = $('#singin > form')
-
- player_dom = $('#toolbar > #player')
-
- $.ajaxSetup ({ cache: false })
-
- # block ui and first show Connecting...
- blockUI "#msg_connect"
-
- $(@).oneTime '5s', ->
- blockUI('#err_network') unless $.ws.isConnection()
- return
-
- on_load = ->
- identity = $.url.get "usr" ? localStorage.getItem "player#identity"
- password = $.url.get "pwd"
-
- $("#ckb_save").attr 'checked', false if localStorage.getItem("autosave#identity") == "false"
-
- $('#txt_identity').val identity
- $('#txt_password').val password
-
- if (not $.isEmpty identity) and (not $.isEmpty password)
- singin_form.trigger 'submit'
- else
- blockUI singin_dom
-
- return
-
- on_open = ->
- $(@).stopTime()
-
- $(document).oneTime '1s', ->
- blockUI '#msg_loading'
-
- resources = [
- { url: 'css/heads.png', callback: $.rl.handle_heads }
- { url: 'css/poker.png', callback: $.rl.handle_pokers }
- { url: 'css/betting.png', callback: $.rl.handle_bets }
- ]
-
- sounds = ["bet", "raise", "move", "card", "check", "fold", "turn"]
- resources.push {url: 'css/sound/' + s + '.mp3', key: s} for s in sounds
-
- $.rl.load resources, on_load
-
- return
-
- return
-
- singin_form.bind "submit", ->
- blockUI '#msg_singin'
-
- identity = $(@).children("#txt_identity").val()
- password = $(@).children("#txt_password").val()
-
- $.ws.send $.pp.write {
- cmd: "LOGIN"
- usr: identity
- pass: password
- }
-
- $(@).oneTime '3s', ->
- blockUI singin_dom
-
- return false
-
- singin_form.bind "stop", ->
- $(@).stopTime()
- return
-
- player_dom.bind 'singin', ->
- singin_form.trigger "stop"
- $('#toolbar > *').show()
-
- $.unblockUI()
-
- if $("#ckb_save").attr 'checked'
- localStorage.setItem "player#identity", $('#txt_identity').val()
- localStorage.setItem "autosave#identity", true
- else
- localStorage.setItem "player#identity", ""
- localStorage.setItem "autosave#identity", false
-
- $('#hall').trigger 'setup'
-
- return
-
- $.pp.reg 'ERROR', () ->
- $("#txt_password").val ""
- $("#lab_err_singin").show()
- singin_form.trigger "stop"
- blockUI singin_dom
- return
-
-
- $.ws.defaults.host = $.url.get 'host' if $.url.get 'host'
- $.ws.defaults.onmessage = $.pp.onmessage
- $.ws.defaults.onopen = on_open
- $.ws.init()
-
- return
-# vim: fdm=marker
diff --git a/src/coffee/player.coffee b/src/coffee/player.coffee
deleted file mode 100644
index 5e942c2..0000000
--- a/src/coffee/player.coffee
+++ /dev/null
@@ -1,66 +0,0 @@
-class Player
- constructor: (@pid, @dom, @info) ->
- @set_inplay 0
- @set_photo $.rl.img.def_face_0
-
- $.cache_player(@)
-
- $.ws.send($.pp.write({cmd: "PLAYER_QUERY", id: @pid})) unless @info
- $.ws.send($.pp.write({cmd: "PHOTO_QUERY", id: @pid}))
-
- this.set_nick @info.nick if @info
- this.set_inplay @info.inplay if @info
-
- update_balance: ->
- if @pid == $.player.pid
- $.ws.send($.pp.write({cmd: "BALANCE_QUERY"}))
- else
- throw 'Error balance for not current login user'
-
- set_nick: (nick = @nick) ->
- @nick = nick
- $(@dom).children('.nick').text @nick
-
- set_inplay: (inplay) ->
- @inplay = inplay
- $(@dom).children('.inplay').text "$#{@inplay}"
-
- set_balance: (balance) ->
- @balance = balance
- $(@dom).children('.balance').text @balance
-
- set_photo: (photo) ->
- @photo = photo
- $(@dom).children('.photo').attr 'src', @photo
-
- set_css: (css) ->
- console.log css
- $(@dom).css css
-
-(($) ->
- $.player = {}
- players = {}
-
- $.pp.reg "LOGIN", (player) ->
- $.player = new Player player.id, $('#toolbar > #player')
- $.player.update_balance()
- $.player.dom.trigger('singin')
-
- $.pp.reg "BALANCE_INFO", (balance) ->
- $.player.set_balance balance.amount
-
- $.pp.reg 'PLAYER_INFO', (info) ->
- players[info.pid].set_nick info.nick
-
- $.pp.reg 'PHOTO_INFO', (info) ->
- players[info.pid].set_photo $.rl.img[info.photo]
-
- $.cache_player = (player) ->
- players[player.pid] = player
-
- $.clear_players = ->
- players = {}
- $.cache_player $.player
-
- return
-)(jQuery)
diff --git a/src/coffee/positions.coffee b/src/coffee/positions.coffee
deleted file mode 100644
index 052f3c8..0000000
--- a/src/coffee/positions.coffee
+++ /dev/null
@@ -1,86 +0,0 @@
-(($) ->
- css = (left, top) ->
- {left: "#{left}px", top: "#{top}px"}
-
- convert = (positions) ->
- result = for x, y of positions
- {
- preview: css(y.pv[0], y.pv[1])
- empty_seat: css(y.es[0], y.es[1]),
- playing_seat: css(y.ps[0], y.ps[1]),
- draw: css(y.draw[0], y.draw[1]),
- bet_end: [y.bet[3], y.bet[2]],
- bet_start: css(y.bet[0], y.bet[1]),
- bet_lab: css(y.bet[4], y.bet[5]),
- private_1: css(y.draw[0], y.draw[1]),
- private_2: css(y.draw[0] + 15, y.draw[1])
- }
-
- nine_position = [
- {pv: [518, 125], es: [640, 363], ps: [680, 350], bet: [711,408,710,306,20,-20], draw: [-51,28]}
- # preview # empty_seat # playing_seat
- {pv: [418, 170], es: [448, 363], ps: [435, 350], bet: [471,413,535,314,90,-10], draw: [90,30]}
- {pv: [300, 170], es: [263, 363], ps: [233, 350], bet: [268,410,309,303,65,-20], draw: [90,28]}
- {pv: [178, 170], es: [116, 275], ps: [117, 230], bet: [150,288,233,208,105,5], draw: [90,30]}
- {pv: [ 78, 125], es: [173, 95], ps: [145, 60], bet: [181,122,300,175,145,95], draw: [90,40]}
- {pv: [108, 15], es: [342, 55], ps: [342, 20], bet: [376,83, 402,162,50,125], draw: [90,60]}
- {pv: [230, 1], es: [559, 55], ps: [565, 20], bet: [604,84, 572,162,-5,125], draw: [-52,60]}
- {pv: [354, 1], es: [741, 95], ps: [766, 60], bet: [803,129,672,175,-105,95], draw: [-52,40]}
- {pv: [476, 15], es: [798, 275], ps: [801, 230], bet: [832,290,749,208,-63,5], draw: [-51,30]}
- ]
-
- current_share_card = null
- game_position = convert nine_position
-
- format = (ps) ->
- {top: "#{ps[0]}px", left: "#{ps[1]}px"}
-
- $.positions = {
- size: game_position.length
-
- offset: 0
-
- get: (sn) ->
- index = (sn + $.positions.offset) % game_position.length
- game_position[index]
- }
-
- get = (sn) ->
- $.positions.get(sn)
-
- $.extend $.positions, {
- get_preview: (sn) ->
- return get(sn + 1).preview
-
- get_playing: (sn) ->
- return get(sn).playing_seat
-
- get_draw: (sn) ->
- return get(sn).draw
-
- get_bet: (sn) ->
- {start: get(sn).bet_start, end: get(sn).bet_end}
-
- get_bet_lab: (sn) ->
- return get(sn).bet_lab
-
- get_empty: (sn) ->
- get(sn).empty_seat
-
- get_random: (ps, offset = 20) ->
- return {top: (ps[0] + (Math.floor(Math.random() * 1000)) % (offset * 2) - offset) + 'px', left: (ps[1] + (Math.floor(Math.random() * 1000)) % (offset * 2) - offset) + 'px'}
- }
-
- reset_share: ->
- current_share_card = [200,245]
-
- get_next_share: ->
- current_share_card = [200,245] if current_share_card is null
- current_share_card = [current_share_card[0], current_share_card[1] + 55]
- format(current_share_card)
-
- get_private: (sn, card_sn) ->
- return get(sn)["private_#{card_sn}"]
-
- return
-)(jQuery)
diff --git a/src/coffee/preview.coffee b/src/coffee/preview.coffee
deleted file mode 100644
index 47a813b..0000000
--- a/src/coffee/preview.coffee
+++ /dev/null
@@ -1,51 +0,0 @@
-GAME_PREVIEW_REF_MAX = 5
-
-class GamePreview
- constructor: (@gid, @dom) ->
- @seats = []
- @ref()
-
- $(@).everyTime '3s', ->
- @ref()
- , GAME_PREVIEW_REF_MAX
-
- return
-
- ref: ->
- $.ws.send($.pp.write({cmd: "SEAT_QUERY", gid: @gid}))
-
- add: (seat) ->
- player_dom = $('#game_preview > .seat').filter ->
- $(@).data('seat') == seat.sn
-
- if seat.state == 0
- player_dom.remove()
- @seats[seat.sn] = null
- return
-
- return if player_dom.size() != 0
-
- player_dom = $($('#game_preview > .template').text()).
- css($.positions.get_preview(seat.sn)).
- data('seat', seat.sn).
- appendTo(@dom)
-
- @seats[seat.sn] = new Player(seat.pid, player_dom, seat)
- return
-
- clear: ->
- $(@).stopTime()
- $('#game_preview > .seat').remove()
- return
-
-(($) ->
- $.game_preview = null
-
- $.pp.reg "SEAT_STATE", (seat) ->
- return unless $.game_preview
- $.game_preview.add seat
- return
-
- return
-)(jQuery)
-
diff --git a/src/coffee/seat.coffee b/src/coffee/seat.coffee
deleted file mode 100644
index a9b205b..0000000
--- a/src/coffee/seat.coffee
+++ /dev/null
@@ -1,248 +0,0 @@
-class Seat
- constructor: (@detail, @game) ->
- @sn = @detail.sn
- @init_dom()
-
- init_dom: () ->
- @dom = @get_dom()
- @dom.data('sn', @sn)
- @set_position()
- @dom.appendTo @game.dom
-
- set_position: () ->
- @dom.css @get_position()
- @dom.children(".draw_card").css($.positions.get_draw(@sn))
-
- remove: ->
- @dom.remove()
-
-class EmptySeat extends Seat
- constructor: (@detail, @game) ->
- super
-
- get_dom: ->
- $("#game > .template > .empty_seat").clone true
-
- get_position: ->
- $.positions.get_empty @detail.sn
-
- hide: ->
- @dom.hide()
-
- show: ->
- @dom.show()
-
- clear: ->
- return
-
-class PlayingSeat extends Seat
- constructor: (@detail, @game) ->
- super
- @bet = 0
- @state = PS_PLAY
- @player = new Player @detail.pid, @dom, @detail
- @poker = @dom.children('.card')
- @draw_card() if @game.detail.stage != GS_CANCEL and @game.detail.stage != GS_PREFLOP
-
- clear: ->
- @player.set_nick()
- @dom.children(".card").remove()
- @dom.children(".high_label").removeClass("high_label")
- @dom.removeClass('disabled')
-
- update: (detail)->
- @player.set_inplay detail.inplay
- return false if detail.state is @state
- @state = detail.state
- return true
-
- get_dom: ->
- $("#game > .template > .playing_seat").clone true
-
- get_position: ->
- $.positions.get_playing @detail.sn
-
- set_position: () ->
- super
- @dom.children(".draw_card").css($.positions.get_draw(@sn))
- @dom.children(".bet_lab").css($.positions.get_bet_lab(@sn))
-
- raise: (call, raise) ->
- @bet += (call + raise)
- @dom.children('.bet_lab').text(@bet).show()
-
- ps = $.positions.get_bet(@sn)
- bets = $.compute_bet_count(call + raise, [])
- @raise_bet $.rl.img[bet], ps for bet in bets
-
- raise_bet: (img, ps) ->
- bet = $("

").css(ps.start).appendTo(@game.dom)
-
- $(@dom).oneTime 100, ->
- bet.css($.positions.get_random(ps.end, 5))
-
- disable: ->
- @dom.addClass('disabled')
- @dom.children(".draw_card").hide()
-
- check: ->
- return
-
- set_dealer: ->
- dealer = $('.playing_seat > .dealer')
- if dealer.size() is 0
- $('#game > .template > .dealer').clone().insertBefore(@dom.children(".nick"))
- else
- dealer.remove().insertBefore(@dom.children(".nick"))
-
- set_actor: ->
- @game.clear_actor()
- @dom.addClass('actor_seat')
-
- $('
').appendTo(@dom).oneTime 100, ->
- $(@).children('div').css({'margin-top': '120px'})
-
- draw_card: ->
- @dom.children(".draw_card").css($.positions.get_draw(@sn)).show()
-
- private_card: (face, suit, card_sn)->
- @dom.children(".draw_card").hide()
-
- poker = $.get_poker(face, suit).
- addClass('private_card').
- css($.positions.get_private(@sn, card_sn)).
- appendTo(@dom)
-
- @pokers = @dom.children('.card')
-
- set_rank: () ->
- @rank = RANKS[@hand.rank]
- unless @hand.rank is HC_HIGH_CARD
- @dom.children(".nick").addClass("high_label").text(@rank)
-
- set_hand: (hand) ->
- @hand = {
- face: hand.high1, face2: hand.high2,
- suit: hand.suit, rank: hand.rank
- }
-
- reset_bet: ->
- @bet = 0
- @dom.children('.bet_lab').hide()
-
- high: () ->
- game = @game
- game.clear_high()
- pokers = @pokers
- null_suit = null
- null_face = null
-
- high = (face, suit, filter) ->
- game.high face, suit, filter, pokers
-
- switch @hand.rank
- when HC_PAIR, HC_THREE_KIND, HC_FOUR_KIND
- high @hand.face
- when HC_TWO_PAIR, HC_FULL_HOUSE
- high @hand.face
- high @hand.face2
- when HC_FLUSH
- high null_face, @hand.suit, (pokers) ->
- pokers.sort($.compare_card).slice(0, 5)
- console.log 'HC_FLUSH'
- when HC_STRAIGHT, HC_STRAIGHT_FLUSH
- faces = [
- @hand.face, @hand.face - 1,
- @hand.face - 2, @hand.face - 3,
- if @hand.face is CF_FIVE then CF_ACE else (@hand.face - 4)
- ]
-
- one = (pokers) ->
- result = pokers.first()
- return result
-
- s = if @hand.rank is HC_STRAIGHT_FLUSH then @hand.suit else null_suit
-
- high f, s, one for f in faces
- console.log 'HC_STRAIGHT or HC_STRAIGHT_FLUSH'
- when HC_HIGH_CARD
- else
- throw "Unknown poker rank #{args.rank}"
-
- return
-
-$ ->
- mod_sum = (sum, bet, bets) ->
- times = Math.floor(sum / bet[0])
- bets.push bet[1] for i in [1..times]
- return sum % bet[0]
-
- $.compute_bet_count = (sum, bets) ->
- sum = mod_sum sum, bet, bets for bet in BETS when sum >= bet[0]
- "betting_#{b}" for b in bets
-
-
- $.compare_card = (a, b) ->
- a1 = new Number($(a).attr('face'))
- b1 = new Number($(b).attr('face'))
-
- if (a1 > b1)
- return -1
- else if (a1 < b1)
- return 1
- else
- return 0
-
- $("#game .empty_seat").bind 'click', ->
- min = $.game.detail.min
- max = $.game.detail.max
- balance = $.player.balance
-
- if (balance < min)
- return $('#page').block {
- message: $("#err_buyin").clone()
- css: BLOCKUI
- timeout: 2000
- }
-
- $('#page').block {
- message: $(".buyin").clone(true, true).data('sn', $(@).data('sn'))
- css: $.extend(BLOCKUI, {width: '300px'})
- }
-
- max = if balance < max then balance else max
- buyin = if balance > max then max else min * 10
- buyin = if buyin > balance then balance else buyin
-
- $('.buyin #range_buy').
- attr('min', min).
- attr('max', max).
- val(buyin)
-
- $(".buyin #min").text format $.game.detail.min
- $(".buyin #max").text format $.game.detail.max
- $(".buyin #lab_min").text format min
- $(".buyin #lab_max").text format max
- $(".buyin #balance").text format balance
- $(".buyin #lab_buyin").text format buyin
-
- $(".buyin #cmd_buy").bind 'click', ->
- $(@).attr('disabled', true)
- sn = $(@).parent().data('sn')
- buyin = $(@).parent().children('#range_buy').val()
- cmd = {cmd: "JOIN", gid: $.game.gid, seat: sn, buyin: parseInt(buyin)}
- $.ws.send $.pp.write cmd
- $('#page').unblock()
-
- $(".buyin #cmd_cancel").bind 'click', ->
- $('#page').unblock()
-
- $(".buyin #range_buy").bind 'change', (event) ->
- $(".buyin #lab_buyin").text format $(@).val()
-
- $("#cmd_up").bind 'click', ->
- cmd = {cmd: "LEAVE", gid: $.game.gid}
- $.ws.send $.pp.write cmd
-
- $("#cmd_exit").bind 'click', ->
- return
diff --git a/src/entry.haml b/src/entry.haml
deleted file mode 100644
index 0dc3de5..0000000
--- a/src/entry.haml
+++ /dev/null
@@ -1,21 +0,0 @@
-!!! 5
-%html
- %head
- %meta{:charset => "utf-8"}
- %title 测试入口
- %script{:src => "js/jquery/jquery.js", :type => 'text/javascript'}
- %script{:src => "js/entry.js", :type => 'text/javascript'}
- %body
- %label Player
- %br/
- %input#usr{:value => "1010"}
- %input#pwd{:value => "pass"}
- %hr
- %input#auto_watch{:type => 'checkbox', :checked => true} Auto Watch
- %input#auto_join{:type => 'checkbox', :checked => false} Auto Join
- %hr
- %label Host
- %br/
- %input#host{:value => "127.0.0.1"}
- %hr
- %button#go Go
diff --git a/src/index.haml b/src/index.haml
deleted file mode 100644
index 4aebd24..0000000
--- a/src/index.haml
+++ /dev/null
@@ -1,128 +0,0 @@
-!!! 5
-%html
- %head
- %meta{:charset => "utf-8"}
- %title 創世紀-德州撲克
-
- - @scripts = %w[jquery/jquery header positions]
- - @scripts += %w[base64 blockUI timers tools].map do |x| "jquery/jquery.#{x}" end
- - @scripts += %w[resloader prototype websocket].map do |x| "plugins/#{x}" end
- - @scripts += %w[header positions player preview hall seat game index]
-
- - @scripts.each do |i|
- %script{:src => "js/#{i}.js", :type => 'text/javascript'}
-
- %link{:href => 'css/index.css', :rel => 'stylesheet', :type => 'text/css'}
- %body
- #page
- #tips_empty.growlUI 請等待其他玩家的加入
- %h3#msg_connect 連線中...
- %h3#msg_loading 加載中...
- %h3#msg_joining 進入中...
- %h3#msg_singin 登陸中...
- %h3#err_network 抱歉,網絡連線錯誤,請稍後刷新重試。
- #err_buyin
- %h3 抱歉,您的账户餘額不足。
- %h3 請確保有足够的游戏币方可加入此游戏。
-
- %nav#toolbar
- #title
- %img#logo{:src => 'css/logo.png'}
- #player
- %img.photo
- %label.nick
- %label.balance
- #tools
- #settings 設置
- .split
- #helps 幫助
- .split
- #logout 登出
- #content
- #singin
- %form{:method => 'post'}
- %label 帳號
- %input#txt_identity{:placeholder => '請輸入您的帳號', :required => 'required'}
- %br/
- %label 密碼
- %input#txt_password{:placeholder => '請輸入您的密碼', :type => 'password', :required => 'required'}
- %br/
- %div
- %input#ckb_save{:type => 'checkbox', :checked => 'checked'} 存儲帳號信息
- %br/
- %label#lab_err_singin 帳號密碼有誤
- %br/
- %button#cmd_singin{:type => 'submit'} 登陸
-
- #hall
- #game_preview
- %textarea.template
- .seat
- .nick
- %img.photo
- .inplay
- %table#game_list{:cellspacing => '0px'}
- %thead
- %tr
- %th.col_longest 房間
- %th.col_short 大/小盲注
- %th.col_short 攜帶額
- %th.col_short 人數
- %tbody
- %tr.autofill
- -# tbody中如果为空,则table只显示表头
-
- .actions
- %button#cmd_join.cmdred{:type => 'command'} 加入
- %br/
- %button#cmd_watch.cmdblue{:type => 'command'} 觀戰
-
- %textarea.template
- %tr
- %td.name
- %td.blind
- %td.limit
- %td.player
- #game
- .table{:src => 'css/gametable.png'}
- .tips
- %label#wait_next 請等待參與下局游戏。
- %label#wait_player 請等待其他玩家參與。
- #logs
- .actions
- %a#cmd_fold.action 蓋牌
- %a#cmd_check.action 過牌
- %a#cmd_call.action 跟注
- %a#cmd_raise.action 加注
- %input#raise_range{:type => 'range', :value => 0, :max => 50, :min => 0}
- %input#raise_number{:type => 'number', :value => 0, :max => 50, :min => 0, :step => 1}
- %a#cmd_leave.action 起立
- %a#cmd_cancel.action 退出
- .buyin
- %h3 參與游戏
- %table
- %tr
- %td.key 最小代入:
- %td.value#min
- %tr
- %td.key 最大代入:
- %td.value#max
- %tr
- %td.key 您的餘額:
- %td.value#balance
- %label#lab_buyin
- %label#lab_min
- %label#lab_max
- %input#range_buy{:type => 'range'}
- %a#cmd_cancel 返回
- %button#cmd_buy{:type => 'command'} 確定
- .template
- .seat
- .empty_seat 加入
- .playing_seat
- %label.nick
- %img.photo
- %label.inplay
- %img.draw_card{:src => 'css/poker_back.png'}
- %label.bet_lab
- .dealer
diff --git a/src/index.scss b/src/index.scss
deleted file mode 100644
index acc79f9..0000000
--- a/src/index.scss
+++ /dev/null
@@ -1,692 +0,0 @@
-body, td, div, a, img {
- font-family: 'Microsoft Yahei','simhei',sans-serif;
- -webkit-user-select: none;
- -webkit-user-drag: none;
-}
-
-body {
- border: 0px;
- margin: 0px;
- padding: 0px;
- width: 100%;
- height: 100%;
- background-color: gray;
-}
-
-#page {
- background: url(background.png) no-repeat;
- height: 758px;
- width: 1010px;
- min-width: 1010px;
- margin: auto;
- padding-top: 20px;
- margin-top: 15px;
-
- #content {
- width: 1000px;
- margin: 0 auto;
- }
-}
-
-.cmdred {
- background-position: 138px 0px;
-}
-
-.cmdblue {
- background-position: 276px 0px;
-}
-
-
-.pot_label {
- width: 65px;
- text-align: center;
- background-color: #a5a6a6;
-}
-
-.background_card {
- position: absolute;
- z-index: 50;
-}
-
-.rank_label {
- top: 447px;
- left: 530px;
- width: 100px;
- height: 25px;
- position: absolute;
- border-radius: 4px;
- -webkit-box-shadow: 1px 1px 3px 3px gold;
-}
-
-#tips {
- color: white;
- border: 2px solid silver;
- border-radius: 6px;
- width: 180px;
- height: 25px;
- padding-top: 8px;
- padding-left: 20px;
- background-color: gray;
- position: absolute;
- top: 490px;
- left: 370px;
-}
-
-#winner {
- background-image: url('winner.png');
- width: 64px;
- height: 64px;
- background-repeat: no-repeat;
- position: absolute;
- top: -35px;
- left: -20px;
-}
-
-@mixin auto-hide {
- display: none;
-}
-
-@mixin top-bottom-margin {
- margin-top: 30px;
- margin-bottom: 30px;
-}
-
-@mixin auto-margin {
- margin-top: 20px;
-}
-
-@mixin m-font {
- font-size: 1.2em;
-}
-
-@mixin s-font {
- font-size: 0.8em;
-}
-
-@mixin x-font {
- font-size: 2.0em;
-}
-
-button {
- width: 80px;
- height: 30px;
- @include m-font;
- font-family: 'Microsoft Yahei','simhei',sans-serif;
-}
-
-label {
- @include s-font;
-}
-
-h3[id^="msg"] {
- @include auto-hide;
- @include m-font;
-}
-
-h3[id^="err"] {
- @include auto-hide;
- @include m-font;
-}
-
-div[id^="err"] {
- @include auto-hide;
- @include m-font;
-}
-
-.template {
- @include auto-hide;
-}
-
-#singin {
- @include auto-hide;
- @include top-bottom-margin;
-
- form {
- height: 120px;
- font-size: 1.2em;
-
- > input {
- width: 200px;
- height: 20px;
- }
-
- > div {
- > #ckb_save {
- @include auto-margin;
- }
-
- > #lab_err_singin {
- @include auto-hide;
- }
- }
- }
-}
-
-/*div.growlUI { background: url(check48.png) no-repeat 10px 10px }*/
-div.growlUI { @include auto-hide; }
-div.growlUI h1, div.growlUI h2 {
- color: white; padding: 5px 5px 5px 75px; text-align: left;
-}
-
-.buyin {
- table {
- width: 100%;
- padding: 0px 0px 10px 0px;
-
- td.key {
- text-align: right;
- width: 145px;
- }
-
- td.value {
- text-align: left;
- text-indent: 20px;
- }
- }
-
- a {
- display: block;
- }
-
- #lab_buyin {
- display: block;
- @include x-font;
- text-shadow: 3px 3px 5px #0F0F0F;
- }
-
- #lab_min {
- top: 155px;
- left: 40px;
- position: absolute;
- }
-
- #lab_max {
- top: 155px;
- right: 43px;
- position: absolute;
- }
-
- #cmd_cancel {
- top: 220px;
- left: 100px;
- position: absolute;
- }
-
- #cmd_buy {
- top: 207px;
- left: 150px;
- position: absolute;
- }
-
- #range_buy {
- width: 225px;
- margin-bottom: 60px;
- }
-}
-
-strong.nick {
- color: gray;
-}
-
-strong.amount {
- color: gold;
- text-shadow: 1px 1px 2px #000000;
-}
-
-strong.action {
- color: red;
- text-shadow: 1px 1px 2px #000000;
-}
-
-strong.rank {
- color: gray;
- text-shadow: 1px 1px 2px #000000;
-}
-
-// TOOLBAR {{{
-#toolbar {
- width: 930px;
- height: 78px;
- margin: 0px auto;
- border-radius: 8px;
- background-color: #436d90;
- -webkit-box-shadow: 1px 3px 3px black;
- position: relative;
-
- #logo {
- margin: -26px auto auto 318px;
- -webkit-box-shadow: 0px 5px 5px black;
- }
-
- #title{
- width: 930px;
- height: 17px;
- background-color: #365778;
- border: 0px;
- -webkit-border-top-left-radius: 8px;
- -webkit-border-top-right-radius: 8px;
- }
-
- #tools {
- @include auto-hide;
- top: 5px;
- left: 710px;
- width: 215px;
- padding: 0px;
- position: absolute;
-
- > * {
- background: url(icon.png);
- background-repeat: no-repeat;
- float: left;
- }
-
- .split {
- width: 5px;
- height: 55px;
- margin-left: 10px;
- margin-right: 10px;
- }
-
- #settings, #helps, #logout {
- width: 55px;
- height: 55px;
- padding-top: 54px;
- text-align: center;
- color: #ffffff;
- cursor: pointer;
- }
-
- #helps { background-position: -60px 0px; }
- #logout { background-position: -115px 0px; }
- #settings { background-position: -5px 0px; }
- }
-
- #player {
- top: 10px;
- width: 250px;
- padding: 0px;
- position: absolute;
- @include auto-hide;
-
- > * {
- position: absolute;
- }
-
- > .photo {
- width: 60px;
- height: 60px;
- margin-left: 10px;
- border: 1px solid black;
- }
-
- > .nick {
- top: 22px;
- margin-left: 78px;
- }
-
- > .balance {
- top: 45px;
- margin-left: 78px;
- }
- }
-}
-// @TOOLBAR }}}
-
-// HALL {{{
-#hall {
- @include auto-hide;
- position: absolute;
-
- .actions {
- top: 324px;
- left: 800px;
- position: absolute;
-
- button {
- width: 138px;
- height: 48px;
- display: block;
- background-image: url(btn.png);
- @include s-font;
- }
- }
-}
-
-#game_list {
- top: 320px;
- left:80px;
- width: 680px;
- height: 278px;
- -webkit-box-shadow: 1px 3px 3px black;
- border: 2px solid black;
- background-color: #d0d2d3;
- position: absolute;
-
- @include m-font;
-
- th {
- background: -webkit-gradient(linear, left top, left bottom, from(#e8e8ee), to(#bdbfc2));
- text-shadow: 1px 1px 2px #000000;
- padding-top: 10px;
- padding-bottom: 10px;
- border-bottom: 1px solid black;
- }
-
- tr {
- height: 22px;
- }
-
- td{
- padding: 5px 0px 5px 0px;
- text-align: center;
- }
-
- .autofill {
- height: auto;
- }
-
- .col_longest {
- width: 150px;
- }
-
- .col_short {
- width: 90px;
- }
-
- .selected {
- background-color: #bab1c6 !important;
- }
-}
-
-/* GAME PREVIEW */
-#game_preview {
- top: 20px;
- left: 172px;
- width: 650px;
- height: 310px;
- background: url(table.png) no-repeat center;
- position: absolute;
-
- .seat {
- width: 60px;
- height: 88px;
- border: 0px;
- margin: 0px;
- padding: 0px;
- position: absolute;
- font-size: 16px;
-
- > .photo {
- width: 60px;
- height: 60px;
- -webkit-box-shadow: 1px 3px 3px black;
- }
-
- > .inplay, .nick {
- color: white;
- text-align: center;
- }
- }
-}
-// @HALL }}}
-
-// GAME {{{
-#game {
- @include auto-hide;
- width: 1000px;
- position: absolute;
-
- .table {
- top: 100px;
- left: 125px;
- width: 748px;
- height: 377px;
- position: absolute;
- background: url(gametable.png) no-repeat;
- }
-
- .disabled {
- opacity: 0.4 !important;
- cursor: not-allowed !important;
- color: rgba(255,255,255,0.4) !important;
- }
-
- .tips {
- @include auto-hide;
- }
-
- #logs {
- @include s-font;
- position: absolute;
- top: 543px;
- left: 155px;
- width: 385px;
- margin-left: 2px;
- margin-right: 2px;
- margin-top: 2px;
- margin-bottom: 2px;
- height: 70px;
- resize: none;
- border: 3px solid #cccccc;
- padding: 5px;
- -webkit-border-radius: 7px;
- background-color: rgba(25,25,25,0.7);
- overflow: auto;
- }
-
- .actions {
- top: 540px;
- left: 570px;
- position: absolute;
-
- #cmd_check {
- top: 50px;
- left: 0px;
- position: absolute;
- }
-
- #cmd_raise {
- top: 50px;
- left: 127px;
- position: absolute;
- }
-
- #raise_range {
- top: 65px;
- left: 260px;
- position: absolute;
- }
-
- #raise_number {
- top: 20px;
- left: 265px;
- width: 118px;
- height: 22px;
- font-size: 15px;
- position: absolute;
- }
- }
-
- a.action {
- @include s-font;
- width: 70px;
- height: 30px;
- border: 0px;
- float: left;
- color: white;
- display: block;
- cursor: pointer;
- margin: 0px 10px 0px 0px;
- padding: 16px 0px 0px 48px;
- background: url(button.png) no-repeat;
- }
-
- .buyin {
- @include auto-hide;
- }
-
- .card, .private_card {
- z-index: 1;
- width: 45px;
- height: 65px;
- border-radius: 4px;
- -webkit-box-shadow: 1px 1px 5px black;
- position: absolute;
- }
-
- #cmd_cancel {
- top: 590px;
- left: 20px;
- position: absolute;
- }
-
- #cmd_leave {
- top: 540px;
- left: 20px;
- position: absolute;
- }
-
- .dealer {
- top: 70px;
- left: 60px;
- width: 28px;
- height: 36px;
- position: absolute;
- background: url(dealer.png) no-repeat;
- }
-
- .bet, .pot {
- width: 13px;
- z-index: 1;
- position: absolute;
- -webkit-transition-property: all;
- -webkit-transition-duration: 1s;
- }
-
- > .empty_seat {
- width: 84px;
- height: 54px;
- border: 0px;
- margin: 0px;
- padding: 30px 0px 0px 0px;
- text-align: center;
- background: url(sit.png) no-repeat;
- color: gray;
- cursor: pointer;
- position: absolute;
- -webkit-transition-property: all;
- -webkit-transition-duration: 1s;
- }
-
- > .actor_seat {
- -webkit-box-shadow: 0px 0px 6px 6px silver;
- }
-
- .high_card {
- -webkit-box-shadow: 1px 1px 3px 3px gold;
- }
-
- .high_label {
- color: gold;
- text-shadow: -1px 2px 3px #ffb69a;
- }
-
- // {{{ Playing Seat
- > .playing_seat {
- width: 84px;
- height: 120px;
- border: 0px;
- margin: 0px;
- padding: 0px;
- z-index: 3;
- border-radius: 3px;
- text-align: center;
- position: absolute;
- -webkit-transition-property: all;
- -webkit-transition-duration: 1s;
-
- .photo {
- padding: 0px;
- margin: 0px;
- width: 82px;
- height: 80px;
- border: 1px solid gray;
- }
-
- .nick {
- padding: 0px;
- margin: 0px;
- width: 82px;
- height: 18px;
- background-color: #485465;
- opacity: 0.7;
- border-top-left-radius: 7px;
- border-top-right-radius: 7px;
- color: white;
- padding-top: 3px;
- border: 1px solid gray;
- border-bottom: 0px;
- display: block;
- }
-
- .inplay {
- padding: 0px;
- margin: 0px;
- width: 82px;
- height: 16px;
- background-color: #485465;
- margin-top: -4px;
- opacity: 0.7;
- border-bottom-left-radius: 7px;
- border-bottom-right-radius: 7px;
- color: white;
- border: 1px solid gray;
- border-top: 0px;
- display: block;
- }
-
- .draw_card {
- width: 41px;
- height: 41px;
- position: absolute;
- @include auto-hide;
- }
-
- .bet_lab {
- width: 45px;
- height: 12px;
- font-size: 12px;
- position: absolute;
- border-radius: 20px;
- background-color: #77B73E;
- @include auto-hide;
- }
-
- .actor_timer {
- top: 0px;
- left: -8px;
- width: 7px;
- height: 120px;
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
- border: 1px solid gray;
- position: absolute;
- overflow: hidden;
-
- div {
- width: 7px;
- height: 130px;
- background: -webkit-gradient(linear, 0 0, 0 40%, from(red), to(yellow));
- border-radius: 4px;
-
- -webkit-transition-property: all;
- -webkit-transition-duration: 14s;
- -webkit-transition-timing-function: ease-in;
- }
- }
- // }}}
- }
-}
-// @GAME }}}
-// vim: fdm=marker