# 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
- state = {
- hooks: {}
- card_types: []
- auto_shuffle: false
- cards: []
- piles: {}
- }
+ @hooks = {}
+ @cards = []
+ @piles = {}
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) -> # FIXME add pile argument
# FIXME what to do on error?
- return unless cards[card]? #?.pile?
+ return unless @cards[card]? #?.pile?
#cur_pile = cards[card].pile
#if pile isnt cur_pile
- cards[card].x = x
- cards[card].y = y
+ @cards[card].x = x
+ @cards[card].y = y
+ @cards[card].z = z
- @trigger 'move', agent, card, x, y # FIXME add pile argument
+ @trigger 'move', agent, card, x, y, z # FIXME add pile argument
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
unless @piles[card.pile]?
@piles[card.pile] = []
@piles[card.pile].push card
- trigger 'all_new_cards'
+ @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