From ac864beddaed81ab6e69a5bbd0bf3a229e38d342 Mon Sep 17 00:00:00 2001 From: Nicholas Hayashi Date: Wed, 24 Feb 2021 21:52:55 -0500 Subject: [PATCH] clean up nightmare toolbelt code a bit --- main.lua | 6 +- res/select_box.png | Bin 30268 -> 404 bytes src/entity.lua | 4 +- src/game.lua | 163 ++++++++++++++++++++++++++------------------- src/mob.lua | 2 +- texture.lua | 2 +- 6 files changed, 101 insertions(+), 76 deletions(-) diff --git a/main.lua b/main.lua index 9620b62..668dc88 100644 --- a/main.lua +++ b/main.lua @@ -1,15 +1,15 @@ --- @TODO --- +-- @TODO @TODO @TODO @TODO @TODO -- settings menu -- -- music volume -- -- sfx volume -- -- resolution settings & fix grid size being based on resolution -- --- save games +-- serialization -- -- allow saving by name -- -- allow loading by name +-- -- investigate saving as lua instead, and having as a consequence a less janky map serialization -- -- encode/decode save game data (low priority) -- -- map editor diff --git a/res/select_box.png b/res/select_box.png index 53cb083956c1c4024d7d3ac4ee5f66cf0482bbc8..8c16b14dfbf3824356751e872a462704d4db079a 100644 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D%z{XAV9Ln`LH zy>pTCkb#Ip;A5HClbTlH%L|siTc{l3;&a;e`R)r7VwiqbCfBc9f4fz;KljX^|5v}i zx2tA6quOA>c!X2IkD-vML)hWYk0-L$zt^7q-goXguYfv=+#H5SEL0K#`TzwSINAGm z=e|C>D7o7|jwk)tyZE!Iq6*YWRJ7IsYSxbaXDst>zL9JTzi)326NCjrew(GtLVr=# QB#;X|UHx3vIVCg!0Q8Q600000 literal 30268 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

<e58P076#ATKU~s4LJlM-_ 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 TSm+L%e~F(@fVXm6 0 then + play_sfx(SOUNDS.SELECT1) + win.scene:remove("tile_select_box") + win.scene:append(( + am.translate(rounded_mouse) + ^ pack_texture_into_sprite(TEXTURES.SELECT_BOX, HEX_SIZE*2, HEX_SIZE*2, COLORS.SUNRAY) + ) + :tag"tile_select_box" + ) + end end end end @@ -336,24 +354,23 @@ local function game_action(scene) win.scene("score").text = string.format("SCORE: %.2f", state.score) win.scene("money").text = string.format("MONEY: $%d", state.money) win.scene("wave_timer").text = get_wave_timer_text() - win.scene("send_now_button").hidden = state.spawning win.scene("top_right_display").text = get_top_right_display_text(hex, evenq, centered_evenq, state.selected_top_right_display_type) end local function make_game_toolbelt() local toolbelt_height = win.height * 0.07 + local tower_tooltip_text_position = vec2(win.left + 10, win.bottom + toolbelt_height + 20) + local keys = { '1', '2', '3', '4', 'q', 'w', 'e', 'r', 'a', 's', 'd', 'f' } + --local keys = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=' } + local function get_tower_tooltip_text_node(tower_type) local name = get_tower_name(tower_type) local placement_rules = get_tower_placement_rules_text(tower_type) local short_desc = get_tower_short_description(tower_type) local cost = get_tower_cost(tower_type) - if not (name or placement_rules or short_desc or cost) then - return am.group():tag"tower_tooltip_text" - end - local color = COLORS.WHITE - return (am.translate(win.left + 10, win.bottom + toolbelt_height + 20) + return (am.translate(tower_tooltip_text_position) ^ am.scale(1) ^ am.group( am.translate(0, 40) @@ -368,7 +385,14 @@ local function make_game_toolbelt() ) :tag"tower_tooltip_text" end - local function toolbelt_button(size, half_size, tower_texture, padding, i, offset, key_name) + + local padding = 12 + local offset = vec2(win.left, win.bottom + padding/3) + local size = toolbelt_height - padding + local half_size = size/2 + + local function toolbelt_button(i) + local texture = get_tower_icon_texture(i) local button = am.translate(vec2(size + padding, 0) * i + offset) ^ am.group( @@ -376,13 +400,13 @@ local function make_game_toolbelt() ^ pack_texture_into_sprite(TEXTURES.BUTTON1, size, size), am.translate(0, half_size) - ^ pack_texture_into_sprite(tower_texture, size, size), + ^ pack_texture_into_sprite(texture, size, size), am.translate(vec2(half_size)) ^ am.group( pack_texture_into_sprite(TEXTURES.BUTTON1, half_size, half_size), am.scale(2) - ^ am.text(key_name, COLORS.BLACK) + ^ am.text(keys[i], COLORS.BLACK) ) ) @@ -392,24 +416,7 @@ local function make_game_toolbelt() local y2 = offset.y + size local rect = { x1 = x1, y1 = y1, x2 = x2, y2 = y2 } - button:action(function(self) - if point_in_rect(win:mouse_position(), rect) then - -- @TODO make hover on tower show you the tooltip - win.scene:replace("tower_tooltip_text", get_tower_tooltip_text_node(i)) - - if win:mouse_pressed"left" then - select_toolbelt_button(i) - end - else - if state.selected_tower_type then - win.scene:replace("tower_tooltip_text", get_tower_tooltip_text_node(state.selected_tower_type)) - else - --win.scene:replace("tower_tooltip_text", am.group():tag"tower_tooltip_text") - end - end - end) - - return button + return button, rect end local toolbelt = am.group( @@ -418,21 +425,16 @@ local function make_game_toolbelt() ) :tag"toolbelt" - local padding = 12 - local size = toolbelt_height - padding - local half_size = size/2 - local offset = vec2(win.left, win.bottom + padding/3) - local tower_select_square = ( am.translate(vec2(size + padding, half_size) + offset) ^ am.rect(-size/2-3, -size/2-3, size/2+3, size/2+3, COLORS.SUNRAY) ) - :tag"tower_select_square" + :tag"toolbelt_select_square" tower_select_square.hidden = true toolbelt:append(tower_select_square) - local keys = { '1', '2', '3', '4', 'q', 'w', 'e', 'r', 'a', 's', 'd', 'f' } - --local keys = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=' } + -- it's important these are in the same order as integers assigned to the enum + -- TOWER_TYPE, and none are missing. local toolbelt_options = { TOWER_TYPE.WALL, TOWER_TYPE.HOWITZER, @@ -441,28 +443,38 @@ local function make_game_toolbelt() TOWER_TYPE.RADAR, TOWER_TYPE.LIGHTHOUSE, } - local tower_type_count = table.count(TOWER_TYPE) - local function get_toolbelt_icon_texture(i) - if i <= tower_type_count then - return get_tower_icon_texture(toolbelt_options[i]) - end - end + local toolbelt_buttons = {} for i,v in pairs(toolbelt_options) do - toolbelt:append( - toolbelt_button( - size, - half_size, - get_toolbelt_icon_texture(i), - padding, - i, - offset, - keys[i] - ) - ) + local button, rect = toolbelt_button(i) + table.insert(toolbelt_buttons, { node = button, rect = rect }) + toolbelt:append(button) end - --local a = win.left + #toolbelt_options * (size + padding) + toolbelt:action(function(self) + local mouse = win:mouse_position() + + if mouse.y <= (win.bottom + toolbelt_height) then + for i,b in pairs(toolbelt_buttons) do + if point_in_rect(mouse, b.rect) then + win.scene:replace("tower_tooltip_text", get_tower_tooltip_text_node(i)) + + if win:mouse_pressed("left") then + select_toolbelt_button(i) + end + + break + end + end + else + if state.selected_tower_type then + win.scene:replace("tower_tooltip_text", get_tower_tooltip_text_node(state.selected_tower_type)) + else + win.scene:replace("tower_tooltip_text", am.group():tag"tower_tooltip_text") + end + end + end) + -- make the 'escape/pause/settings' button in the lower right local settings_button_position = vec2(win.right - half_size - 20, win.bottom + half_size + padding/3) local settings_button_rect = { x1 = settings_button_position.x - size/2, @@ -470,8 +482,6 @@ local function make_game_toolbelt() x2 = settings_button_position.x + size/2, y2 = settings_button_position.y + size/2 } - - -- make the 'escape/pause/settings' button in the lower right toolbelt:append( am.translate(settings_button_position) ^ am.group( @@ -491,22 +501,28 @@ local function make_game_toolbelt() state.selected_tower_type = tower_type if get_tower_spec(tower_type) then - win.scene:replace("tower_tooltip_text", get_tower_tooltip_text_node(tower_type)) + win.scene:replace( + "toolbelt_tooltip_text", + get_tower_tooltip_text_node(tower_type) + ) local new_position = vec2((size + padding) * tower_type, size/2) + offset - if toolbelt("tower_select_square").hidden then - toolbelt("tower_select_square").position2d = new_position - toolbelt("tower_select_square").hidden = false + if toolbelt("toolbelt_select_square").hidden then + toolbelt("toolbelt_select_square").position2d = new_position + toolbelt("toolbelt_select_square").hidden = false + else - toolbelt("tower_select_square"):action(am.tween(0.1, { position2d = new_position })) + toolbelt("toolbelt_select_square"):action(am.tween(0.1, { position2d = new_position })) end win.scene:replace("cursor", get_tower_cursor(tower_type):tag"cursor") play_sfx(SOUNDS.SELECT1) else + deselect_tile() + -- de-selecting currently selected tower if any - toolbelt("tower_select_square").hidden = true + toolbelt("toolbelt_select_square").hidden = true win.scene:replace("cursor", make_hex_cursor(0, COLORS.TRANSPARENT):tag"cursor") end @@ -515,9 +531,8 @@ local function make_game_toolbelt() select_toolbelt_button = function(i) state.selected_toolbelt_button = i - if i <= tower_type_count then + if get_tower_spec(i) then select_tower_type(i) - else select_tower_type(nil) end @@ -559,14 +574,25 @@ local function game_scene() if win:mouse_pressed("left") then if state.spawning then + -- in this case, we don't exactly just send the next wave, we turn the current wave into the next + -- wave, and add the amount of time it would have lasted to the amount of remaining time in the + -- current wave + state.current_wave = state.current_wave + 1 + -- calculate spawn chance for next wave + state.spawn_chance = math.log(state.current_wave)/2 + 0.002 + + state.time_until_next_break = state.time_until_next_break + get_break_time(state.current_wave) + + play_sfx(SOUNDS.EXPLOSION4) else - play_sfx(SOUNDS.PUSH1) state.time_until_next_wave = 0 + + play_sfx(SOUNDS.EXPLOSION4) end end else - self.color = vec4(1) + self.color = COLORS.WHITE end end) @@ -621,7 +647,8 @@ function game_init(saved_state) if saved_state then state = game_deserialize(saved_state) - -- @HACK fixes a bug where loading game state with a tower type selected, but you don't have a built tower cursor node, so hovering a buildable tile throws an error + -- @HACK fixes a bug where loading game state with a tower type selected, + -- but you don't have a built tower cursor node, so hovering a buildable tile throws an error select_tower_type(nil) else state = get_initial_game_state() diff --git a/src/mob.lua b/src/mob.lua index 6221a72..d3da9af 100644 --- a/src/mob.lua +++ b/src/mob.lua @@ -221,7 +221,7 @@ local function update_mob_spooder(mob, mob_index) if mob_can_pass_through(mob, mob.frame_target) then local from = hex_map_get(state.map, mob.hex) local to = hex_map_get(state.map, mob.frame_target) - local rate = (math.abs(from.elevation - to.elevation) * mob.speed) + 0.0001 * am.delta_time + local rate = math.abs(from.elevation - to.elevation) + 0.01 * mob.speed * am.delta_time mob.position = mob.position + math.normalize(hex_to_pixel(mob.frame_target, vec2(HEX_SIZE)) - mob.position) * rate mob.node.position2d = mob.position diff --git a/texture.lua b/texture.lua index b608906..3bf2f1e 100644 --- a/texture.lua +++ b/texture.lua @@ -35,7 +35,7 @@ TEXTURES = { GUI_SLIDER = load_texture("res/slider.png"), GEAR = load_texture("res/gear.png"), - SELECT_BOX_ICON = load_texture("res/select_box.png"), + SELECT_BOX = load_texture("res/select_box.png"), -- tower stuff TOWER_WALL = load_texture("res/tower_wall.png"),