JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
hide other players hand
[peach-cgt.git] / client.coffee
index 3022adb..139158d 100644 (file)
@@ -54,6 +54,16 @@ new_blank_card = (x, y, css_class) ->
        $table.append view
        return view
 
+find_pile = (x, y) ->
+       fudge = 40
+       for pile in piles
+               if -fudge < pile.x - x < fudge and -fudge < pile.y - y < fudge
+                       return pile
+       return null
+
+in_your_hand = (card) ->
+       return (not (card.pile?)) and ((transform_y card.y) < (card_height * 0.8))
+
 uninstantiate_card = (card) ->
        show_message "uninstantiate card #{card.number}"
        card.view.remove()
@@ -70,6 +80,9 @@ instantiate_card = (card) ->
        else
                card_class = 'your_card'
 
+       if in_your_hand card
+               card_class = "#{card_class} your_hand"
+
        if card.z > top_card_z
                top_card_z = card.z
 
@@ -98,8 +111,15 @@ instantiate_card = (card) ->
                update_pile_views()
        view.bind 'dragstop', (event, ui) ->
                p = view.position()
-               pile = null # FIXME figure out what pile we moved to
-               state.move state.agent, card.number, transform_x(p.left), transform_y(p.top), card.z, pile
+               x = transform_x(p.left)
+               y = transform_y(p.top)
+               pile = find_pile x, y
+               if pile?
+                       x = pile.x
+                       y = pile.y
+                       pile = pile.key
+                       view.css {left: transform_x(x), top: transform_y(y)}
+               state.move state.agent, card.number, x, y, card.z, pile
 
 error_lag = 3
 
@@ -163,7 +183,6 @@ initialize_cards = () ->
        # instantiate cards in play
        for card in state.cards
                delete card.view
-               instantiate_card card unless card.pile?
 
        unless piles?
                piles = [ # global
@@ -182,6 +201,7 @@ initialize_cards = () ->
 
        update_pile_views()
 
+# also makes sure all non-piled cards are instantiated FIXME rename
 update_pile_views = ->
        ps = {}
        for card in state.cards
@@ -193,8 +213,13 @@ update_pile_views = ->
                                                uninstantiate_card ps[card.pile].top_card
                                        ps[card.pile].top_card = card
                                        ps[card.pile].top_z = card.z
+                               else if card.view
+                                       uninstantiate_card card
                        else
                                ps[card.pile] = { total: 1, top_card: card, top_z: card.z }
+               else
+                       # not in a pile
+                       instantiate_card card unless card.view?
 
        for pile in piles
                # where should the caption be?
@@ -229,10 +254,14 @@ init = ->
        state = window.game_model.new me
        state.on 'move', (agent, card, x, y, z, pile) ->
                update_pile_views()
+               if state.cards[card].view? # the card is visible
+                       # show it face down if it's in the other player's hand
+                       state.cards[card].view.toggleClass 'your_hand', in_your_hand state.cards[card]
+
                if agent is me
                        tell_server ['move', agent, card, x, y, z, pile]
                else
-                       # FIXME should we use the z from the server? Should p1 use odd numbers and p2 even?
+                       # FIXME use the z from the server
                        bring_card_to_front state.cards[card]
                        state.cards[card].view.animate { left: "#{transform_x x}px", top: "#{transform_y y}px"}, 800
        state.on 'mark', (agent, card, state) ->