JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
register coffeescript compiler
[peach-cgt.git] / client.coffee
index 0c54a71..0ec59d6 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
+###
+
 # globals
 $table = null
 table_width = 0
@@ -111,7 +117,7 @@ instantiate_card = (card) ->
        if card.flipped
                view.addClass 'flipped'
        $table.append view
-       view.draggable containment: '#table', grid: [20, 20]
+       view.draggable grid: [20, 20]
        view.bind 'dragstart', (event, ui) ->
                view.css 'z-index': card.z = next_card_z()
                if card.pile?
@@ -144,11 +150,12 @@ send_updates = ->
        messages = outgoing_messages
        outgoing_messages = []
 
-       $.ajax "#{server_url}/set", {
+       show_message "#{server_url}set"
+       $.ajax "#{server_url}set", {
                cache: false
                data: {
                        agent: state.agent
-                       game: 'test' # FIXME, and in the /get call too
+                       game: state.slug
                        messages: JSON.stringify(messages)
                }
                type: 'POST'
@@ -166,7 +173,7 @@ send_updates = ->
 
 error_lag = 3
 poll_for_updates = ->
-       $.ajax "#{server_url}/get?agent=#{state.agent}&game=test", {
+       $.ajax "#{server_url}get?agent=#{state.agent}&game=#{state.slug}", {
                cache: false
                type: 'GET'
                dataType: 'json'
@@ -298,7 +305,7 @@ init_card_designer = ->
 
        container.append ul
 
-       submit = $ $ "<div style=\"border: 1px solid black\">Done</div>"
+       submit = $ $ "<div style=\"border: 1px solid black; margin: 0 auto 10px 10px; width: 40px; text-align: center\">Done</div>"
        submit.bind 'click', ->
                $('#deck_designer').remove()
                show_message cards_in_deck
@@ -310,15 +317,17 @@ init_card_designer = ->
                                pile: "#{state.agent}_draw"
                                x: 0
                                y: 0
-                               z: next_card_z()
                                flipped: true
                        }
                        cards.push card
-                       cards.push card
-                       cards.push card
-                       cards.push card
+                       cards.push $.extend {}, card # clone
+                       cards.push $.extend {}, card # clone
+                       cards.push $.extend {}, card # clone
 
+               # asign z-index in random order
                cards.shuffle()
+               for card in cards
+                       card.z = next_card_z()
                show_message cards
 
                # let server assign card numbers
@@ -327,16 +336,43 @@ init_card_designer = ->
 
        container.append submit
 
+new_game_slug = ->
+       charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
+       ret = ''
+       while ret.length < 10
+               ret += charset[Math.floor(Math.random() * charset.length)]
+       return ret
+
 init = ->
+       is_new_game = false
        if window.location.hash? and window.location.hash.length > 0
-               me = window.location.hash.substr 1
-               winloc = "#{window.location}"
+               winloc = window.location.toString()
                server_url = winloc.substr 0, winloc.length - window.location.hash.length
+               game_agent = window.location.hash.substr 1
+               s = game_agent.split /_/g
+               if s.length isnt 2
+                       window.location = server_url
+                       # in case that doesn't cause a redirect:
+                       timeout 20, init
+                       return
+               game = s[0]
+               me = s[1]
        else
                me = 'p1'
-               server_url = window.location
+               game = new_game_slug()
+               server_url = window.location.toString()
+               window.location.hash = "#{game}_#{me}" # TODO should I put a # at the beginning?
+               is_new_game = true
+
+       if me is 'p1'
+               other_player = 'p2'
+       else
+               me = 'p2'
+               other_player = 'p1'
+
+       $('#main_header').append $ " <span id=\"other_player_url\">Here's the address for the other player in this game with you: <code>#{server_url}##{game}_#{other_player}</code></span>"
 
-       state = window.game_model.new me
+       state = window.game_model.new game, me
        state.on 'move', (agent, card, x, y, z, pile) ->
                if z > top_card_z
                        top_card_z = z
@@ -368,10 +404,13 @@ init = ->
        state.on 'new_cards', (agent, cards) ->
                initialize_cards()
 
-       # timeout so browser will stop showing that we're loading
-       timeout 1, init_card_designer
-       timeout 1, poll_for_updates
-       timeout 2, ->
+       # timeouts are so browser will stop showing that we're loading
+       if is_new_game
+               timeout 1, ->
+                       tell_server ['new_game', state.slug, state.agent]
+       timeout 2, init_card_designer
+       timeout 3, poll_for_updates
+       timeout 4, ->
                # ask for initial state
                tell_server ['send_state', state.agent]