JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
gets harder (way too slowly) as you play
[hexbog.git] / main.coffee
index 02b1bdb..900295d 100644 (file)
@@ -370,8 +370,106 @@ unsink = (tile) ->
        tile.text = new_letter().letter
        tile.dom.html tile.text
 
+
+# top-level key is word length
+# arrays are [difficulty] level, easiest to hardest
+booms = {
+       3: {
+               neighbors: {
+                       flips: [1,1,1,1,0]
+                       force: [2,2,1,1,1,1,0]
+               }
+               neighbor_neighbors: {
+                       flips: [0]
+                       force: [0]
+               }
+               board: {
+                       flips: [0]
+                       force: [0]
+               }
+       }
+       4: {
+               neighbors: {
+                       flips: ['all', 4,4,4,4,4,3,3,2,2,1]
+                       force: [4,3,3,3,3,3,2]
+               }
+               neighbor_neighbors: {
+                       flips: [0]
+                       force: [2,2,2,1,1,1,0]
+               }
+               board: {
+                       flips: [0]
+                       force: [0]
+               }
+       }
+       5: {
+               neighbors: {
+                       flips: ['all','all','all','all',5,5,5,4,4,4,3,3,3,2]
+                       force: [6,6,6,6,5,5,5,4,4,4,3]
+               }
+               neighbor_neighbors: {
+                       flips: [2,2,2,2,2,2,1,1,1,1,0]
+                       force: [4,3,3,3,3,2,2,2,1]
+               }
+               board: {
+                       flips: [0]
+                       force: [0]
+               }
+       }
+       6: {
+               neighbors: {
+                       flips: ['all','all','all','all','all',9,9,9,9,8,8,8,7,7,7,6,6,6,5,5,5,4]
+                       force: [9,9,9,9,9,8,8,8,7]
+               }
+               neighbor_neighbors: {
+                       flips: [5,5,5,5,5,5,5,4,4,4,3,3,3,2,2,2,1]
+                       force: [6,6,5,5,4,4,3,3,2]
+               }
+               board: {
+                       flips: [0]
+                       force: [0]
+               }
+       }
+       7: {
+               neighbors: {
+                       flips: ['all']
+                       force: [10]
+               }
+               neighbor_neighbors: {
+                       flips: ['all','all','all','all',9,8,7,6,5,4,3,2]
+                       force: [10]
+               }
+               board: {
+                       flips: [0]
+                       force: [5,4,3,2,1]
+               }
+       }
+       lots: {
+               neighbors: {
+                       flips: [0]
+                       force: [0]
+               }
+               neighbor_neighbors: {
+                       flips: [0]
+                       force: [0]
+               }
+               board: {
+                       flips: ['all']
+                       force: [10]
+               }
+       }
+}
+difficulty_level = 0
+next_level_at = 200
+adjust_difficulty_level = ->
+       while score > next_level_at
+               difficulty_level += 1
+               next_level_at *= 1.4
+
+
 # remove the selected tiles from the board, create new tiles, and slide everything into place
 blip_selection = ->
+       adjust_difficulty_level()
        word_length = selected_word().length
        faders = selected
        selected = []
@@ -394,77 +492,59 @@ blip_selection = ->
        # convert to arrays so we can sort, etc
        nneighbors = (v for k, v of nneighbors)
        neighbors = (v for k, v of neighbors)
-       boom = [
-               {
-                       tiles: neighbors,
-                       up: [],
+       areas = {
+               neighbors: {
+                       tiles: neighbors
+                       up: []
                        down: []
-               },
-               {
-                       tiles: nneighbors,
-                       up: [],
+               }
+               neighbor_neighbors: {
+                       tiles: nneighbors
+                       up: []
+                       down: []
+               }
+               board: {
+                       tiles: (space.tile for space in spaces)
+                       up: []
                        down: []
                }
-       ]
-       for n in boom
-               for t in n.tiles
+       }
+       for k, v of areas
+               for t in v.tiles
                        if t.hp is 0
-                               n.down.push t
+                               v.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
+                               v.up.push t
+       if word_length < 8
+               boom = booms[word_length]
+       else
+               boom = booms.lots
+       for area_name, effects of boom
+               area = areas[area_name]
+               if difficulty_level < effects.flips.length
+                       flips = effects.flips[difficulty_level]
                else
-                       boom[0].flips = 0
-                       boom[0].force = 0
-                       boom[1].flips = 0
-                       boom[1].force = 0
-                       # unsink/heal the whole board
-                       for s in spaces
-                               if s.tile.hp is 0
-                                       unsink s.tile
-                               else
-                                       s.tile.new_hp = 10
-       for b in boom
-               if b.flips is 'all' or b.flips >= b.down.length
-                       for t in b.down
+                       flips = effects.flips.last()
+               if flips is 'all' or flips >= area.down.length
+                       for t in area.down
                                unsink t
                else
-                       down_count = b.down.length
-                       while b.flips > 0 and down_count
-                               b.flips -= 1
+                       down_count = area.down.length
+                       flips_left = flips
+                       while flips_left > 0 and down_count > 0
+                               flips_left -= 1
                                flipper = Math.floor(Math.random() * down_count)
-                               unsink b.down[flipper]
+                               unsink area.down[flipper]
                                down_count -= 1
                                # move the last tile back into range
-                               b.down[flipper] = b.down[down_count]
-               if b.force > 0
-                       for t in b.up
-                               t.new_hp = t.hp + b.force
+                               area.down[flipper] = area.down[down_count]
+               if difficulty_level < effects.force.length
+                       force = effects.force[difficulty_level]
+               else
+                       force = effects.force.last()
+               if force > 0
+                       for tile in area.up
+                               tile.new_hp = tile.hp + force
        for s in spaces
                s.tile.new_hp ?= s.tile.hp - 1
                if s.tile.new_hp < 0
@@ -647,14 +727,14 @@ extract_wiktionary_definiton = (html) ->
        #   archive,codebase,data,usemap: <object>
        #                           href: <link>
        #                 id,class,style: background: url(foo.png), etc
-       html = html.replace /(src|onload|archive|codebase|data|usemap|href|style|id|class)=['"][^"']*['"]/ig, '', html
+       html = html.replace /[ ]?[a-z]+=['"][^"']*['"]/ig, '', html
+       html = html.replace /<\/?(audio|source|a|span|table|tr|td|table)>/ig, '', html
+       html = html.replace /\[edit\]/ig, '', html
 
        elements = $(html)
 
        valid_parts = ["Abbreviation", "Adjective", "Adverb", "Article", "Cardinal number", "Conjunction", "Determiner", "Interjection", "Noun", "Numeral", "Particle", "Preposition", "Pronoun", "Verb"]
 
-       edit_link_regex = new RegExp(' ?\\[edit\\] ?')
-
        elements.each (i, el) ->
                #which tag: el.tagName
                if el.tagName is 'H2'
@@ -663,10 +743,10 @@ extract_wiktionary_definiton = (html) ->
                        if found
                                return false # break
                        part = false # mark us not being in a definition section unless the next section finds a part of speach header
-                       language = $(el).text().replace(edit_link_regex, '')
+                       language = $(el).text()
                if language and el.tagName is 'H3' or el.tagName is 'H4' # eg yak def uses one for english and one for dutch
                        part = false
-                       text = $(el).text().replace(edit_link_regex, '')
+                       text = $(el).text()
                        for p in valid_parts
                                if text is "#{p}"
                                        part = p.toLowerCase()
@@ -717,6 +797,8 @@ look_up_definition = (word) ->
 start_over = ->
        selected = []
        score = 0
+       difficulty_level = 0
+       next_level_at = 200
        $score_display.html score
        for s in spaces
                selected.push s.tile