X-Git-Url: https://jasonwoof.com/gitweb/?p=hexbog.git;a=blobdiff_plain;f=main.coffee;h=147b76a2ff4680e47cd7b2881ea122ae5aac5db2;hp=14c8cb578528e089b66bad0e4f8ec3dc79d106e3;hb=643696e68d5a23c907592334432796738fcc288c;hpb=68258d0ca763f0f36b1d80fb88c5b1247abec500 diff --git a/main.coffee b/main.coffee index 14c8cb5..147b76a 100644 --- a/main.coffee +++ b/main.coffee @@ -225,7 +225,7 @@ init_board_layout = () -> unless is_top_tile and fw_other is -1 push i + columns[col_num].height + fw_other # will be dereferenced later - space.neighbors = neighbors.clone() # FIXME ?remove ``.clone()`` + space.neighbors = neighbors col_offset += column.height # convert all space.neighbors arrays from containing space ids to referencing the space for s in spaces @@ -332,9 +332,13 @@ unselect_tile = -> update_selection_display() _unselect_tile = -> - html_tile = selected.pop().dom - html_tile.removeClass 'selected_word' - html_tile.removeClass 'selected' + tile = selected.pop() + dom = tile.dom + if tile.connector? + tile.connector.remove() + delete tile.connector + dom.removeClass 'selected_word' + dom.removeClass 'selected' unselect_all = -> while selected.length @@ -371,107 +375,105 @@ unsink = (tile) -> tile.dom.html tile.text -default_booms = { +# top-level key is word length +# arrays are [difficulty] level, easiest to hardest +booms = { 3: { neighbors: { - flips: 1 - force: 2 + flips: [1,1,1,1,0] + force: [2,2,1,1,1,1,0] } neighbor_neighbors: { - flips: 0 - force: 0 + flips: [0] + force: [0] } board: { - flips: 0 - force: 0 + flips: [0] + force: [0] } } 4: { neighbors: { - flips: 'all' - force: 4 + 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 + flips: [0] + force: [2,2,2,1,1,1,0] } board: { - flips: 0 - force: 0 + flips: [0] + force: [0] } } 5: { neighbors: { - flips: 'all' - force: 6 + 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 - force: 4 + 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 + flips: [0] + force: [0] } } 6: { neighbors: { - flips: 'all' - force: 10 + 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 - force: 6 + 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 + flips: [0] + force: [0] } } 7: { neighbors: { - flips: 'all' - force: 10 + flips: ['all'] + force: [10] } neighbor_neighbors: { - flips: 'all' - force: 10 + flips: ['all','all','all','all',9,8,7,6,5,4,3,2] + force: [10] } board: { - flips: 0 - force: 2 + flips: [0] + force: [5,4,3,2,1] } } lots: { neighbors: { - flips: 0 - force: 0 + flips: [0] + force: [0] } neighbor_neighbors: { - flips: 0 - force: 0 + flips: [0] + force: [0] } board: { - flips: 'all' - force: 10 + flips: ['all'] + force: [10] } } } -booms = null -init_booms = -> - booms = {} - for level, areas of default_booms - new_level = {} - for area, effects of areas - new_area = {} - for effect, amount of effects - new_area[effect] = amount - new_level[area] = new_area - booms[level] = new_level - return +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 = [] @@ -523,12 +525,16 @@ blip_selection = -> boom = booms.lots for area_name, effects of boom area = areas[area_name] - if effects.flips is 'all' or effects.flips >= area.down.length + if difficulty_level < effects.flips.length + flips = effects.flips[difficulty_level] + else + flips = effects.flips.last() + if flips is 'all' or flips >= area.down.length for t in area.down unsink t else down_count = area.down.length - flips_left = effects.flips + flips_left = flips while flips_left > 0 and down_count > 0 flips_left -= 1 flipper = Math.floor(Math.random() * down_count) @@ -536,9 +542,13 @@ blip_selection = -> down_count -= 1 # move the last tile back into range area.down[flipper] = area.down[down_count] - if effects.force > 0 + 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 + effects.force + tile.new_hp = tile.hp + force for s in spaces s.tile.new_hp ?= s.tile.hp - 1 if s.tile.new_hp < 0 @@ -593,10 +603,12 @@ score_for = (word) -> Math.round(Math.pow(1.7, word.length)) activate_selection = -> word = selected_word() if word.length < 3 + # should only happen when trying to blip a word with the keyboard # FIXME make this a hint log "Too short: \"#{word}\"" return unless is_word word + # should only happen when trying to blip a word with the keyboard # FIXME make this automatically part of the selection display log "Not on word list: \"#{word}\"" return @@ -619,9 +631,48 @@ show_definition = (word, type, definition, language) -> html += '
Definition ©wiktionary.org CC-BY-SA
' $definition_body.html html +connector_width = 11 +connector_radius = 5 +connector_slant = 12 +add_connector = (tile, horiz, vert) -> + style = {} + switch horiz + when 'left' + style.right = '100%' + when 'mid' + style.left = 21 - connector_radius + when 'right' + style.left = '100%' + switch vert + when 'top' + style.bottom = '100%' + when 'up' + style.top = 21 - connector_radius - connector_slant + when 'down' + style.top = 21 - connector_radius + connector_slant + when 'bot' + style.top = '100%' + tile.connector = $("
").css style + tile.dom.append tile.connector select_tile = (tile) -> selected.push tile + if selected.length > 1 + prev = selected[selected.length - 2] + if prev.space.top_px < tile.space.top_px + if prev.space.left_px < tile.space.left_px + add_connector tile, 'left', 'up' + else if prev.space.left_px is tile.space.left_px + add_connector tile, 'mid', 'top' + else + add_connector tile, 'right', 'up' + else + if prev.space.left_px < tile.space.left_px + add_connector tile, 'left', 'down' + else if prev.space.left_px is tile.space.left_px + add_connector tile, 'mid', 'bot' + else + add_connector tile, 'right', 'down' update_selection_display() new_tile = (space, y) -> @@ -643,7 +694,7 @@ new_tile = (space, y) -> space.tile = tile html_tile.click -> - return if tile.hp < 1 + return unselect_all() if tile.hp < 1 word = selected_word() if tile in selected if selected_word().length > 2 and is_word(word) and tile is selected.last() @@ -791,11 +842,12 @@ 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 blip_selection() - init_booms() init_start_over_link = -> $('#start-over').click (event) -> @@ -836,6 +888,5 @@ init_game = -> init_html_board() init_start_over_link() update_selection_display() - init_booms() $(init_game)