# 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 = [] 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, z, pile) -> # FIXME what to do on error? return unless @cards[card]? @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, z, pile 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 = [] for card in cards card.number = @cards.length unless card.number card.z = @cards.length unless card.z @cards.push card @trigger 'set_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'] # FIXME what to do on error? return 2 method = message.shift() @[method].apply this, message return my_exports.new = (agent) -> new GameState agent