1 # this file is used by the client and server.
3 # work around lack of module system in the browser:
8 my_exports = window.game_model
11 constructor: (agent) ->
15 on: (event, callback) ->
18 @hooks[event].push callback
19 trigger: (event, args...) ->
20 return unless @hooks[event]?
21 for callback in @hooks[event]
22 callback.apply this, args
23 move: (agent, card, x, y, z, pile) ->
24 # FIXME what to do on error?
25 return unless @cards[card]?
31 @cards[card].pile = pile
32 else if @cards[card].pile?
33 delete @cards[card].pile
35 @trigger 'move', agent, card, x, y, z, pile
37 mark: (agent, card, state) ->
38 # FIXME what to do on error?
39 return unless @cards[card]?
40 @cards[card].marked = state
41 @trigger 'mark', agent, card, state
43 flip: (agent, card, state) ->
44 # FIXME what to do on error?
45 return unless @cards[card]?
46 @cards[card].flipped = state
47 @trigger 'flip', agent, card, state
49 # FIXME implement set_pile(pile, card_order_array)
51 set_cards: (agent, cards) ->
54 card.number = @cards.length unless card.number
55 card.z = @cards.length unless card.z
57 @trigger 'set_cards', agent, @cards
59 new_cards: (agent, cards) ->
61 card.number = @cards.length unless card.number
62 card.z = @cards.length unless card.z
64 @trigger 'new_cards', agent, cards
66 send_state: (agent) ->
67 @trigger 'send_state', agent
69 process_messages: (messages) ->
70 unless typeof messages is 'array' or typeof messages is 'object'
71 # FIXME what to do on error?
72 return typeof messages
74 for message in messages
75 unless message instanceof Array and message[0]? and message[0] in ['move', 'mark', 'flip', 'set_cards', 'send_state', 'new_cards']
77 console.log "Got unrecognized message: #{JSON.stringify message}"
78 # FIXME what to do on error?
80 method = message.shift()
81 @[method].apply this, message
85 my_exports.new = (agent) -> new GameState agent