JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
client sync working (and spitting out debug cruft)
[peach-cgt.git] / common.coffee
index 2a146af..ce09f13 100644 (file)
@@ -1,50 +1,52 @@
 # 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
                # 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
 
                @trigger 'move', agent, card, x, y # 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'
                @cards = []
                @piles = {}
                for card in cards
@@ -54,5 +56,20 @@ class GameState
                                unless @piles[card.pile]?
                                        @piles[card.pile] = []
                                @piles[card.pile].push card
-               trigger 'all_new_cards'
+               @trigger 'set_cards', @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