JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
add agent argument to set_cards
[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) -> # 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
33                 @trigger 'move', agent, card, x, y # FIXME add pile argument
34
35         mark: (agent, card, state) ->
36                 # FIXME what to do on error?
37                 return unless @cards[card]?
38                 @cards[card].marked = state
39                 @trigger 'mark', agent, card, state
40
41         flip: (agent, card, state) ->
42                 # FIXME what to do on error?
43                 return unless @cards[card]?
44                 @cards[card].flipped = state
45                 @trigger 'flip', agent, card, state
46
47         # FIXME implement set_pile(pile, card_order_array)
48
49         set_cards: (agent, cards) ->
50                 @cards = []
51                 @piles = {}
52                 for card in cards
53                         card.number = @cards.length
54                         @cards.push card
55                         if card.pile?
56                                 unless @piles[card.pile]?
57                                         @piles[card.pile] = []
58                                 @piles[card.pile].push card
59                 @trigger 'set_cards', agent, @cards
60
61         process_messages: (messages) ->
62                 unless typeof messages is 'array' or typeof messages is 'object'
63                         # FIXME what to do on error?
64                         return typeof messages
65
66                 for message in messages
67                         unless message instanceof Array and message[0]? and message[0] in ['move', 'mark', 'flip', 'set_cards']
68                                 # FIXME what to do on error?
69                                 return 2
70                         method = message.shift()
71                         @[method].apply this, message
72                 return
73
74
75 my_exports.new = (agent) -> new GameState agent