JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
register coffeescript compiler
[peach-cgt.git] / common.coffee
index cc33785..d827e4e 100644 (file)
@@ -1,3 +1,9 @@
+###
+Peach CGT -- Card Game Table simulator
+Copyright (C) 2011  Jason Woofenden
+Lincensed under AGPLv3. Source here: https://gitorious.org/peach-cgt
+###
+
 # this file is used by the client and server.
 
 # work around lack of module system in the browser:
@@ -8,11 +14,11 @@ else
        my_exports = window.game_model
 
 class GameState
-       constructor: (agent) ->
+       constructor: (slug, agent) ->
+               @slug = slug
                @agent = agent
                @hooks = {}
                @cards = []
-               @piles = {}
        on: (event, callback) ->
                unless @hooks[event]?
                        @hooks[event] = []
@@ -21,16 +27,19 @@ class GameState
                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, pile) ->
                # FIXME what to do on error?
-               return unless @cards[card]? #?.pile?
-               #cur_pile = cards[card].pile
-               #if pile isnt cur_pile
+               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 # FIXME add pile argument
+               @trigger 'move', agent, card, x, y, z, pile
 
        mark: (agent, card, state) ->
                # FIXME what to do on error?
@@ -48,23 +57,31 @@ class GameState
 
        set_cards: (agent, cards) ->
                @cards = []
-               @piles = {}
                for card in cards
-                       card.number = @cards.length
+                       card.number = @cards.length unless card.number
+                       card.z = @cards.length unless card.z
                        @cards.push card
-                       if card.pile?
-                               unless @piles[card.pile]?
-                                       @piles[card.pile] = []
-                               @piles[card.pile].push card
                @trigger 'set_cards', agent, @cards
 
+       new_cards: (agent, cards) ->
+               for card in cards
+                       card.number = @cards.length unless card.number
+                       card.z = @cards.length unless card.z
+                       @cards.push card
+               @trigger 'new_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']
+                       unless message instanceof Array and message[0]? and message[0] in ['move', 'mark', 'flip', 'set_cards', 'send_state', 'new_cards']
+                               if console?.log?
+                                       console.log "Got unrecognized message: #{JSON.stringify message}"
                                # FIXME what to do on error?
                                return 2
                        method = message.shift()
@@ -72,4 +89,4 @@ class GameState
                return
 
 
-my_exports.new = (agent) -> new GameState agent
+my_exports.new = (slug, agent) -> new GameState slug, agent