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) ->
16 on: (event, callback) ->
19 @hooks[event].push callback
20 trigger: (event, args...) ->
21 return unless @hooks[event]?
22 for callback in @hooks[event]
23 callback.apply this, args
24 move: (agent, card, x, y, z) -> # FIXME add pile argument
25 # FIXME what to do on error?
26 return unless @cards[card]? #?.pile?
27 #cur_pile = cards[card].pile
28 #if pile isnt cur_pile
34 @trigger 'move', agent, card, x, y, z # FIXME add pile argument
36 mark: (agent, card, state) ->
37 # FIXME what to do on error?
38 return unless @cards[card]?
39 @cards[card].marked = state
40 @trigger 'mark', agent, card, state
42 flip: (agent, card, state) ->
43 # FIXME what to do on error?
44 return unless @cards[card]?
45 @cards[card].flipped = state
46 @trigger 'flip', agent, card, state
48 # FIXME implement set_pile(pile, card_order_array)
50 set_cards: (agent, cards) ->
54 card.number = @cards.length
57 unless @piles[card.pile]?
58 @piles[card.pile] = []
59 @piles[card.pile].push card
60 @trigger 'set_cards', agent, @cards
62 send_state: (agent) ->
63 @trigger 'send_state', agent
65 process_messages: (messages) ->
66 unless typeof messages is 'array' or typeof messages is 'object'
67 # FIXME what to do on error?
68 return typeof messages
70 for message in messages
71 unless message instanceof Array and message[0]? and message[0] in ['move', 'mark', 'flip', 'set_cards', 'send_state']
72 # FIXME what to do on error?
74 method = message.shift()
75 @[method].apply this, message
79 my_exports.new = (agent) -> new GameState agent