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