# globals $table = null state = null server_url = null message = (txt) -> # FIXME implement chat box or something # timeout function with args in convenient order timeout = (ms, func) -> setTimeout func, ms unless Array::shuffle? Array::shuffle = -> return if @length is 0 top = @length while --top current = Math.floor(Math.random() * (top + 1)) tmp = @[current] @[current] = @[top] @[top] = tmp return new_button = (text) -> $ $ "
#{text}
" instantiate_card = (model) -> text = model.text x = model.x y = model.y card = $ $ "
#{text}
" button_box = $ $ '
' flip_button = new_button "flip over" mark_button = new_button "mark" flip_button.bind 'click', -> state.flip state.agent, model.number, ! card.hasClass 'flipped' mark_button.bind 'click', -> state.mark state.agent, model.number, ! card.hasClass 'marked' button_box.append flip_button button_box.append mark_button card.append button_box $table.append card card.draggable stack: '.card' card.bind 'dragstop', (event, ui) -> p = card.position() state.move state.agent, model.number, p.left, p.top model.view = card error_lag = 3 outgoing_messages = [] # message should be [agent, method, args...] # don't forget the agent (state.agent) tell_server = (message) -> outgoing_messages.push message send_updates() send_updates = -> return if outgoing_messages.length is 0 messages = outgoing_messages outgoing_messages = [] $.ajax "#{server_url}/set", { cache: false data: { agent: state.agent game: 'test' # FIXME, and it the /get call too messages: JSON.stringify(messages) } type: 'POST' dataType: 'json' error: (xhr, status, error) -> message "Network error while sending, you might want to refresh. Trying again in #{error_lag} seconds. (Status: #{status}, Error: #{error})" for message in messages outgoing_messages.unshift message timeout error_lag * 1000, send_updates error_lag *= 2 success: (data, status, xhr) -> message "update sent" error_lag = 3 } error_lag = 3 poll_for_updates = -> $.ajax "#{server_url}/get?agent=#{state.agent}&game=test", { cache: false type: 'GET' dataType: 'json' error: (xhr, status, error) -> message "Network error, you might want to refresh. Trying again in #{error_lag} seconds. (Status: #{status}, Error: #{error})" timeout error_lag * 1000, poll_for_updates error_lag *= 2 success: (data, status, xhr) -> state.process_messages data timeout 100, poll_for_updates error_lag = 3 } init = -> if window.location.hash? and window.location.hash.length > 0 me = window.location.hash.substr 1 winloc = "#{window.location}" server_url = winloc.substr 0, winloc.length - window.location.hash.length else me = 'p1' server_url = window.location state = window.game_model.new me state.on 'move', (agent, card, x, y) -> # FIXME add/handle pile argument if agent is me tell_server ['move', agent, card, x, y] else state.cards[card].view.animate { left: "#{x}px", top: "#{y}px"}, 800 state.on 'mark', (agent, card, state) -> @cards[card].view.toggleClass 'marked', state if agent is me tell_server ['mark', agent, card, state] state.on 'flip', (agent, card, state) -> @cards[card].view.toggleClass 'flipped', state if agent is me tell_server ['flip', agent, card, state] state.on 'set_cards', (cards) -> # FIXME add agent arg and tell server if it's not us $('.card').remove() for card in cards instantiate_card card # timeout so browser will stop showing that we're loading timeout 1, poll_for_updates $ -> $table = $ '#table' init()