JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Merge remote-tracking branch 'sbd/master'
authorJason Woofenden <jason@jasonwoof.com>
Mon, 4 Nov 2013 01:37:55 +0000 (20:37 -0500)
committerJason Woofenden <jason@jasonwoof.com>
Mon, 4 Nov 2013 01:37:55 +0000 (20:37 -0500)
1  2 
main.coffee

diff --combined main.coffee
@@@ -26,8 -26,6 +26,8 @@@ slide_ms = 200
  
  board_col_heights = [5, 6, 7, 8, 7, 6, 5]
  
 +# code and css will need adjusting if you change HP_MAX
 +HP_MAX = 10
  
  ##############################################################
  ##############    fix javascript some more    ################
@@@ -233,7 -231,7 +233,7 @@@ init_board = -
                encoded = get_cookie 'hexbog'
        if encoded? and encoded.length > board_tiles
                new_letter_queue = (encoded.substr 0, board_tiles).split ''
 -              score = parseInt(encoded.substr(board_tiles), 10)
 +              score = parseInt(encoded.substr(board_tiles), HP_MAX)
  
        # work out which grid spaces are connected
        # (neighbors, above, down)
@@@ -293,11 -291,6 +293,6 @@@ unselect_all = -
                _unselect_tile()
        update_selection_display()
  
- shrink_selection = (leave_count) ->
-       while selected.length > leave_count
-               _unselect_tile()
-       update_selection_display()
  selected_word = ->
        word = ''
        word += tiles[i].text for i in selected
@@@ -313,55 -306,17 +308,55 @@@ save_game = -
  
  # remove the selected tiles from the board, create new tiles, and slide everything into place
  blip_selection = ->
 +      difficulty = 11 - Math.log(100 + score) # higher numbers are easier
 +      unsink = difficulty * score_for selected_word() # how much tile restoration we have left to do
        faders = selected.num_sort()
        selected = []
        update_selection_display()
 +      neighbors = {}
 +      nneighbors = {}
        for i in faders
                tiles[i].dom.unbind('click').fadeOut fade_ms
 +              tiles[i].new_hp = tiles[i].hp
 +              for n in board_neighbors[i]
 +                      neighbors[n] = tiles[n]
 +                      for nn in board_neighbors[n]
 +                              nneighbors[nn] = tiles[nn]
 +      for i in faders
 +              delete nneighbors[i]
 +              delete neighbors[i]
 +      for k, v of neighbors
 +              delete nneighbors[k]
 +      # convert to arrays so we can sort, etc
 +      nneighbors = (v for k, v of nneighbors)
 +      neighbors = (v for k, v of neighbors)
 +      # TODO make this apply eavenly to neighbors
 +      # TODO different range for different word lengths
 +      for nei in [neighbors, nneighbors]
 +              if unsink > 0
 +                      for i in nei
 +                              if i.hp is 0 and unsink >= 10
 +                                      i.new_hp = 10
 +                                      unsink -= 10
 +                                      i.text = new_letter()
 +                                      i.dom.html i.text
 +      for nei in [neighbors, nneighbors]
 +              if unsink > 0
 +                      for i in nei
 +                              if i.hp > 0 and unsink > 0
 +                                      unsink -= 10 - i.hp
 +                                      i.new_hp = 10
        for i in tiles
 -              unless i in faders
 -                      unless i.hp < 1
 -                              i.dom.removeClass "hp#{i.hp}"
 -                              i.hp -= 1
 -                              i.dom.addClass "hp#{i.hp}"
 +              i.new_hp ?= i.hp - 1
 +              if i.new_hp < 0
 +                      i.new_hp = 0
 +              else if i.new_hp > HP_MAX
 +                      i.new_hp = HP_MAX
 +              if i.new_hp isnt i.hp
 +                      i.dom.removeClass "hp#{i.hp}"
 +                      i.dom.addClass "hp#{i.new_hp}"
 +                      i.hp = i.new_hp
 +              delete i.new_hp
        timeout fade_ms + 1, ->
                # which tiles need to be slid down
                sliders = (false for i in tiles)
@@@ -447,39 -402,28 +442,31 @@@ select_tile = (num) -
  new_tile = (num, x, y) ->
        letter = new_letter()
  
 -      html_tile = $("<div class=\"tile hp10\" style=\"left: #{x}px; top: #{y}px\" unselectable=\"on\">#{letter}</div>")
 +      hp = 1 + Math.floor(Math.random() * (HP_MAX - 1))
 +
 +      html_tile = $("<div class=\"tile hp#{hp}\" style=\"left: #{x}px; top: #{y}px\" unselectable=\"on\">#{letter}</div>")
        $board.append(html_tile)
  
        html_tile.data 'tile_number', num
 -      tiles[num] = text: letter, dom: html_tile, hp: 10, id: num
 +      tiles[num] = text: letter, dom: html_tile, hp: hp, id: num
  
        html_tile.click ->
                me = $(this)
                num = me.data 'tile_number'
 +              return if tiles[num].hp < 1
                if num in selected
-                       nth_of_word = selected.indexOf(num)
-                       first = nth_of_word is 0
-                       last = nth_of_word is selected.length - 1
-                       if first and last
-                               unselect_all() # Clicking only selected letter unselects it
-                       else if first and !last
-                               shrink_selection 1 # Clicking start of word goes back to just that letter
-                               # should this unselect all?
-                       else if last
+                       if selected.length > 2 and num is selected.last()
                                activate_selection()
                        else
-                               shrink_selection nth_of_word + 1
-               else # (not clicking on selected tile)
-                       if selected.length is 0
-                               select_tile num
-                       else
-                               unless num in board_neighbors[selected.last()]
+                               if selected.length > 1
+                                       unselect_all()
+                                       select_tile num
+                               else
                                        unselect_all()
-                               select_tile num
+               else # (not clicking on selected tile)
+                       if selected.length > 0 and not (num in board_neighbors[selected.last()])
+                               unselect_all()
+                       select_tile num
  
  
  $board = null
@@@ -663,10 -607,14 +650,10 @@@ init_keybinding = -
                        when 27
                                unselect_all()
  
 -$log = undefined
 -init_log = ->
 -      $log = $('#log')
  log = (msg) ->
 -      console.log msg if console.log?
 +      console.log msg if console?.log?
  
  init_game = ->
 -      init_log()
        if $(window).height() >= 440
                $('#centerer').css('margin-top', '25px')
        init_keybinding()