JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
track z-axis (layer) on server, use for view init
[peach-cgt.git] / common.coffee
1 # this file is used by the client and server.
2
3 # work around lack of module system in the browser:
4 if exports?
5         my_exports = exports
6 else
7         window.game_model = {}
8         my_exports = window.game_model
9
10 class GameState
11         constructor: (agent) ->
12                 @agent = agent
13                 @hooks = {}
14                 @cards = []
15                 @piles = {}
16         on: (event, callback) ->
17                 unless @hooks[event]?
18                         @hooks[event] = []
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
29
30                 @cards[card].x = x
31                 @cards[card].y = y
32                 @cards[card].z = z
33
34                 @trigger 'move', agent, card, x, y, z # FIXME add pile argument
35
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
41
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
47
48         # FIXME implement set_pile(pile, card_order_array)
49
50         set_cards: (agent, cards) ->
51                 @cards = []
52                 @piles = {}
53                 for card in cards
54                         card.number = @cards.length
55                         @cards.push card
56                         if card.pile?
57                                 unless @piles[card.pile]?
58                                         @piles[card.pile] = []
59                                 @piles[card.pile].push card
60                 @trigger 'set_cards', agent, @cards
61
62         send_state: (agent) ->
63                 @trigger 'send_state', agent
64
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
69
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?
73                                 return 2
74                         method = message.shift()
75                         @[method].apply this, message
76                 return
77
78
79 my_exports.new = (agent) -> new GameState agent