X-Git-Url: https://jasonwoof.com/gitweb/?p=peach-cgt.git;a=blobdiff_plain;f=common.coffee;h=d827e4ec4e618305728400eccadd9dc4f6370836;hp=2a146af56bde7d54350506024eae010f6140678f;hb=9a036497fdd48b07f12f9d8172eeaabc2373cb64;hpb=e260e6fec0e02fe972519feaea20b2e59df5bd49 diff --git a/common.coffee b/common.coffee index 2a146af..d827e4e 100644 --- a/common.coffee +++ b/common.coffee @@ -1,58 +1,92 @@ +### +Peach CGT -- Card Game Table simulator +Copyright (C) 2011 Jason Woofenden +Lincensed under AGPLv3. Source here: https://gitorious.org/peach-cgt +### + # this file is used by the client and server. +# work around lack of module system in the browser: +if exports? + my_exports = exports +else + window.game_model = {} + my_exports = window.game_model + class GameState - constructor: (agent) -> + constructor: (slug, agent) -> + @slug = slug @agent = agent - state = { - hooks: {} - card_types: [] - auto_shuffle: false - cards: [] - piles: {} - } + @hooks = {} + @cards = [] on: (event, callback) -> - unless hooks[event]? - hooks[event] = [] - hooks[event].push callback + unless @hooks[event]? + @hooks[event] = [] + @hooks[event].push callback trigger: (event, args...) -> - return unless hooks[event]? - for callback in hooks[event] + return unless @hooks[event]? + for callback in @hooks[event] callback.apply this, args - move: (agent, card, x, y) -> # FIXME add pile argument + move: (agent, card, x, y, z, pile) -> # FIXME what to do on error? - return unless cards[card]? #?.pile? - #cur_pile = cards[card].pile - #if pile isnt cur_pile + return unless @cards[card]? - cards[card].x = x - cards[card].y = y + @cards[card].x = x + @cards[card].y = y + @cards[card].z = z + if pile? + @cards[card].pile = pile + else if @cards[card].pile? + delete @cards[card].pile - @trigger 'move', agent, card, x, y # FIXME add pile argument + @trigger 'move', agent, card, x, y, z, pile mark: (agent, card, state) -> # FIXME what to do on error? - return unless cards[card]?.marked? #?.pile? - card.marked = state - @trigger 'mark', agent, state + return unless @cards[card]? + @cards[card].marked = state + @trigger 'mark', agent, card, state flip: (agent, card, state) -> # FIXME what to do on error? - return unless cards[card]?.flipped? #?.pile? - card.flipped = state - @trigger 'flip', agent, state + return unless @cards[card]? + @cards[card].flipped = state + @trigger 'flip', agent, card, state # FIXME implement set_pile(pile, card_order_array) - set_cards: (cards) -> - trigger 'delete_all_cards' + set_cards: (agent, cards) -> @cards = [] - @piles = {} for card in cards - card.number = @cards.length + card.number = @cards.length unless card.number + card.z = @cards.length unless card.z + @cards.push card + @trigger 'set_cards', agent, @cards + + new_cards: (agent, cards) -> + for card in cards + card.number = @cards.length unless card.number + card.z = @cards.length unless card.z @cards.push card - if card.pile? - unless @piles[card.pile]? - @piles[card.pile] = [] - @piles[card.pile].push card - trigger 'all_new_cards' + @trigger 'new_cards', agent, cards + + send_state: (agent) -> + @trigger 'send_state', agent + + process_messages: (messages) -> + unless typeof messages is 'array' or typeof messages is 'object' + # FIXME what to do on error? + return typeof messages + + for message in messages + unless message instanceof Array and message[0]? and message[0] in ['move', 'mark', 'flip', 'set_cards', 'send_state', 'new_cards'] + if console?.log? + console.log "Got unrecognized message: #{JSON.stringify message}" + # FIXME what to do on error? + return 2 + method = message.shift() + @[method].apply this, message + return + +my_exports.new = (slug, agent) -> new GameState slug, agent