JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
better effects for blipping
[hexbog.git] / main.coffee
index 00b7ae2..20746dc 100644 (file)
@@ -293,11 +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
@@ -311,10 +306,16 @@ save_game = ->
        set_cookie 'hexbog', encoded, 365
        window.location.hash = encoded
 
+unsink = (tile) ->
+       tile.new_hp = 10
+       tile.text = new_letter()
+       tile.dom.html tile.text
+
 # 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
+       difficulty = 11 - Math.log(400 + score) # higher numbers are easier
+       force = difficulty * score_for selected_word() # how much tile restoration we have left to do
+       word_length = selected_word().length
        faders = selected.num_sort()
        selected = []
        update_selection_display()
@@ -335,22 +336,74 @@ blip_selection = ->
        # 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
+       boom = [
+               {
+                       tiles: neighbors,
+                       up: [],
+                       down: []
+               },
+               {
+                       tiles: nneighbors,
+                       up: [],
+                       down: []
+               }
+       ]
+       for n in boom
+               for t in n.tiles
+                       if t.hp is 0
+                               n.down.push t
+                       else
+                               n.up.push t
+       switch word_length
+               when 3
+                       boom[0].flips = 1
+                       boom[0].force = 2
+                       boom[1].flips = 0
+                       boom[1].force = 0
+               when 4
+                       boom[0].flips = 'all'
+                       boom[0].force = 4
+                       boom[1].flips = 0
+                       boom[1].force = 2
+               when 5
+                       boom[0].flips = 'all'
+                       boom[0].force = 6
+                       boom[1].flips = 2
+                       boom[1].force = 4
+               when 6
+                       boom[0].flips = 'all'
+                       boom[0].force = 10
+                       boom[1].flips = 5
+                       boom[1].force = 6
+               when 7
+                       boom[0].flips = 'all'
+                       boom[0].force = 10
+                       boom[1].flips = 'all'
+                       boom[1].force = 10
+               else
+                       boom[0].flips = 0
+                       boom[0].force = 0
+                       boom[1].flips = 0
+                       boom[1].force = 0
+                       # unsink/heal the whole board
+                       for t in tiles
+                               if t.hp is 0
+                                       unsink t
+                               else
+                                       t.new_hp = 10
+       for b in boom
+               if b.flips is 'all' or b.flips >= b.down.length
+                       for t in b.down
+                               unsink t
+               else
+                       while b.flips > 0 and b.down.length > 0
+                               b.flips -= 1
+                               flipper = Math.floor(Math.random() * b.down.length)
+                               unsink b.down[flipper]
+                               b.down = [b.down[0...flipper]..., b.down[flipper+1...b.down.length]...]
+               if b.force > 0
+                       for t in b.up
+                               t.new_hp = t.hp + b.force
        for i in tiles
                i.new_hp ?= i.hp - 1
                if i.new_hp < 0
@@ -460,26 +513,18 @@ new_tile = (num, x, y) ->
                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_word().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
+                                       select_tile num
+                               else
+                                       unselect_all()
+               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