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 ################
board_tiles = board_col_heights.sum()
board_col_top_px = []
score = 0
-board = new Array(board_tiles) # letters ("Qu" or single letter)
+tiles = new Array(board_tiles)
board_neighbors = [] # array of tile numbers "next to" this one
tile_top_px = [] # array of pixel coordinates for top of column
board_left_px = [] # array of pixel coordinates for left of column
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)
else
c = 1
for num in selected
- html_tiles[num].addClass classes[c]
- html_tiles[num].removeClass classes[1 - c]
+ tiles[num].dom.addClass classes[c]
+ tiles[num].dom.removeClass classes[1 - c]
# unselects the last tile of the selecetion
unselect_tile = ->
_unselect_tile = ->
num = selected.pop()
- html_tile = html_tiles[num]
+ html_tile = tiles[num].dom
html_tile.removeClass 'selected_word'
html_tile.removeClass 'selected'
selected_word = ->
word = ''
- word += board[i] for i in selected
+ word += tiles[i].text for i in selected
return word.toLowerCase()
save_game = ->
encoded = ''
- for t in board
- encoded += t.substr 0, 1
+ for t in tiles
+ encoded += t.text.substr 0, 1
encoded += score
set_cookie 'hexbog', encoded, 365
window.location.hash = encoded
# 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
- html_tiles[i].unbind('click').fadeOut fade_ms
+ 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 randsort neighbors and nneighbors
+ for nei in [neighbors, nneighbors]
+ if unsink > 0
+ for i in nei
+ if i.hp is 0 and unsink >= 15
+ i.new_hp = 10
+ unsink -= 15
+ i.text = new_letter()
+ i.dom.html i.text
+ 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
+ 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 board)
+ sliders = (false for i in tiles)
prev_col_top = null
next_new_y = null
next_new_y = -10 - tile_width
prev_col_top = col_top
- html_tiles[deleted].remove()
+ tiles[deleted].dom.remove()
# For each each tile above the one we've deleted:
# 1. move it down one slot in the data scructures
dest = deleted
aboves = board_aboves[deleted].clone().reverse()
for above in aboves
- html_tiles[dest] = html_tiles[above]
- html_tiles[dest].data 'tile_number', dest
- board[dest] = board[above]
+ tiles[dest] = tiles[above]
+ tiles[dest].id = dest
+ tiles[dest].dom.data 'tile_number', dest
sliders[dest] = true
--dest
sliders[col_top] = true # the new tile needs to be slid down too
for slide, i in sliders
if slide
- html_tiles[i].animate {top: "#{tile_top_px[i]}px"}, slide_ms
+ tiles[i].dom.animate {top: "#{tile_top_px[i]}px"}, slide_ms
sliders[i] = false
save_game()
select_tile = (num) ->
- html_tile = html_tiles[num]
+ html_tile = tiles[num].dom
# html_tile.css backgroundColor: tile_selected_color
selected.push num
update_selection_display()
new_tile = (num, x, y) ->
letter = new_letter()
- html_tile = $("<div class=\"tile\" style=\"left: #{x}px; top: #{y}px\" unselectable=\"on\">#{letter}</div>")
+ hp = Math.floor(Math.random() * HP_MAX)
+
+ 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
- board[num] = letter
- html_tiles[num] = html_tile
+ tiles[num] = text: letter, dom: html_tile, hp: hp, id: num
html_tile.click ->
me = $(this)
$board = null
-html_tiles = []
init_html_board = ->
$('#loading').remove()
$big_tip = $('#big_tip')
index = 0
for i in [0 .. board_min_height * 2]
unless i % 2
- ret += ' ' + board[j] for j in [board_min_height + index .. board_tiles - 1] by 2 * board_min_height + 1
+ ret += ' ' + tiles[j].text for j in [board_min_height + index .. board_tiles - 1] by 2 * board_min_height + 1
else
- ret += ' ' + board[j] + ' ' for j in [index .. board_tiles - 1] by 2 * board_min_height + 1
+ ret += ' ' + tiles[j].text + ' ' for j in [index .. board_tiles - 1] by 2 * board_min_height + 1
index += 1
ret += '\n'
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()