# 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) -> @agent = agent @hooks = {} @cards = [] @piles = {} on: (event, callback) -> unless @hooks[event]? @hooks[event] = [] @hooks[event].push callback trigger: (event, args...) -> return unless @hooks[event]? for callback in @hooks[event] callback.apply this, args move: (agent, card, x, y) -> # FIXME add pile argument # FIXME what to do on error? return unless @cards[card]? #?.pile? #cur_pile = cards[card].pile #if pile isnt cur_pile @cards[card].x = x @cards[card].y = y @trigger 'move', agent, card, x, y # FIXME add pile argument mark: (agent, card, state) -> # FIXME what to do on error? 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]? @cards[card].flipped = state @trigger 'flip', agent, card, state # FIXME implement set_pile(pile, card_order_array) set_cards: (agent, cards) -> @cards = [] @piles = {} for card in cards card.number = @cards.length @cards.push card if card.pile? unless @piles[card.pile]? @piles[card.pile] = [] @piles[card.pile].push card @trigger 'set_cards', agent, @cards 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'] # FIXME what to do on error? return 2 method = message.shift() @[method].apply this, message return my_exports.new = (agent) -> new GameState agent