diff --git a/main.lua b/main.lua index c426d36..485bf27 100644 --- a/main.lua +++ b/main.lua @@ -9,7 +9,6 @@ -- -- 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 -- -- paint terrain elevation levels @@ -262,7 +261,6 @@ function main_scene(do_backdrop, do_logo) ) end - -- @TODO add a hyperlink to an 'about' page or something group:append( am.translate(win.right - 10, win.bottom + 10) ^ am.text(string.format("v%s, by %s", version, author), COLORS.WHITE, "right", "bottom") @@ -281,7 +279,7 @@ function main_scene(do_backdrop, do_logo) selected = true self"sprite".color = vec4(1) if win:mouse_pressed("left") then - + vplay_sfx(math.random(1000000000)) end else selected = false diff --git a/res/tower_gattler_icon.png b/res/tower_gattler_icon.png new file mode 100644 index 0000000..1578dbe Binary files /dev/null and b/res/tower_gattler_icon.png differ diff --git a/src/game.lua b/src/game.lua index 40c6981..25444ff 100644 --- a/src/game.lua +++ b/src/game.lua @@ -225,7 +225,7 @@ local function game_action(scene) state.spawning = true -- calculate spawn chance for next wave - state.spawn_chance = math.log(state.current_wave)/100 + 0.002 + state.spawn_chance = math.log(state.current_wave)/90 + 0.002 state.time_until_next_break = get_wave_time(state.current_wave) end @@ -441,6 +441,7 @@ local function make_game_toolbelt() -- TOWER_TYPE, and none are missing. local toolbelt_options = { TOWER_TYPE.WALL, + TOWER_TYPE.GATTLER, TOWER_TYPE.HOWITZER, TOWER_TYPE.REDEYE, TOWER_TYPE.MOAT, diff --git a/src/grid.lua b/src/grid.lua index f884bb5..8e1c247 100644 --- a/src/grid.lua +++ b/src/grid.lua @@ -1,7 +1,7 @@ do -- add padding, because we terraform the very outer edge and it looks ugly, so hide it - local padding = 2 + local padding = 3 -- the size of the grid should basically always be constant (i think), -- but different aspect ratios complicate this in an annoying way @@ -12,7 +12,7 @@ do HEX_GRID_DIMENSIONS = vec2(HEX_GRID_WIDTH, HEX_GRID_HEIGHT) HEX_GRID_CENTER = evenq_to_hex(vec2(math.floor(HEX_GRID_WIDTH/2) - , -math.floor(HEX_GRID_HEIGHT/2))) + , -math.floor(HEX_GRID_HEIGHT/2))) -- pixel distance from hex centerpoint to any vertex -- given a grid width gx, and window width wx, what's the smallest size a hex can be to fill the whole screen? @@ -72,13 +72,12 @@ function grid_cost(map, from, to) -- equivalent paths are found and mobs backpedal trying to decide between them -- (seed 2014 at time of writing has this at the bottom) local elevation_epsilon = HEX_GRID_MAXIMUM_ELEVATION - HEX_GRID_MINIMUM_ELEVATION + 0.2 - local elevation_cost = math.abs(math.abs(t1.elevation)^0.5 - - math.abs(t2.elevation)^0.5) + local elevation_cost = 2 + math.abs(t1.elevation)^0.5 - math.abs(t2.elevation)^0.5 local epsilon = elevation_epsilon local cost = elevation_cost - return 1 + return cost end function grid_neighbours(map, hex) diff --git a/src/projectile.lua b/src/projectile.lua index e6c5671..df5b0bf 100644 --- a/src/projectile.lua +++ b/src/projectile.lua @@ -172,9 +172,9 @@ local function update_projectile_laser(projectile, projectile_index) end end - -- hit the mob, delete ourselves, affect the world + -- hit the mob, affect the world do_hit_mob(closest_mob, projectile.damage, closest_mob_index) - delete_entity(state.projectiles, projectile_index) + -- delete_entity(state.projectiles, projectile_index) -- laser doesn't delete itself on mob hit vplay_sfx(SOUNDS.HIT1, 0.5) end diff --git a/src/tower.lua b/src/tower.lua index 59753f6..f686341 100644 --- a/src/tower.lua +++ b/src/tower.lua @@ -1,22 +1,22 @@ TOWER_TYPE = { WALL = 1, - HOWITZER = 2, - -- = 3, - REDEYE = 3, + GATTLER = 2, + HOWITZER = 3, + REDEYE = 4, -- = 5, - MOAT = 4, + MOAT = 5, -- = 7, - RADAR = 5, + RADAR = 6, -- = 9, - LIGHTHOUSE = 6 + LIGHTHOUSE = 7 } local TOWER_SPECS = { [TOWER_TYPE.WALL] = { name = "Wall", placement_rules_text = "Place on Ground", - short_description = "Restricts movement", + short_description = "Restricts movement, similar to a mountain.", texture = TEXTURES.TOWER_WALL, icon_texture = TEXTURES.TOWER_WALL_ICON, cost = 10, @@ -25,13 +25,25 @@ local TOWER_SPECS = { size = 0, height = 1, }, + [TOWER_TYPE.GATTLER] = { + name = "Gattler", + placement_rules_text = "Place on Ground", + short_description = "Short-range, fast-fire rate single-target tower.", + texture = TEXTURES.TOWER_GATTLER, + icon_texture = TEXTURES.TOWER_GATTLER_ICON, + cost = 20, + range = 4, + fire_rate = 10, + size = 0, + height = 1, + }, [TOWER_TYPE.HOWITZER] = { name = "Howitzer", placement_rules_text = "Place on non-Water, non-Mountain", short_description = "Fires area of effect artillery.", texture = TEXTURES.TOWER_HOWITZER, icon_texture = TEXTURES.TOWER_HOWITZER_ICON, - cost = 30, + cost = 50, range = 6, fire_rate = 4, size = 0, @@ -40,10 +52,10 @@ local TOWER_SPECS = { [TOWER_TYPE.REDEYE] = { name = "Redeye", placement_rules_text = "Place on Mountains", - short_description = "Long-range, single-target laser tower", + short_description = "Long-range, penetrating laser tower", texture = TEXTURES.TOWER_REDEYE, icon_texture = TEXTURES.TOWER_REDEYE_ICON, - cost = 20, + cost = 140, range = 9, fire_rate = 1, size = 0, @@ -67,7 +79,7 @@ local TOWER_SPECS = { short_description = "Doesn't do anything right now :(", texture = TEXTURES.TOWER_RADAR, icon_texture = TEXTURES.TOWER_RADAR_ICON, - cost = 20, + cost = 100, range = 0, fire_rate = 1, size = 0, @@ -79,7 +91,7 @@ local TOWER_SPECS = { short_description = "Attracts nearby mobs; temporarily redirects their path", texture = TEXTURES.TOWER_LIGHTHOUSE, icon_texture = TEXTURES.TOWER_LIGHTHOUSE_ICON, - cost = 70, + cost = 150, range = 7, fire_rate = 1, size = 0, @@ -126,6 +138,9 @@ function make_tower_node(tower_type) if tower_type == TOWER_TYPE.REDEYE then return make_tower_sprite(tower_type) + elseif tower_type == TOWER_TYPE.GATTLER then + return make_tower_sprite(tower_type) + elseif tower_type == TOWER_TYPE.HOWITZER then return am.group{ am.circle(vec2(0), HEX_SIZE, COLORS.VERY_DARK_GRAY, 6), @@ -492,6 +507,9 @@ function make_and_register_tower(hex, tower_type) if tower.type == TOWER_TYPE.HOWITZER then tower.props.z = tower.height + elseif tower.type == TOWER_TYPE.GATTLER then + tower.props.z = tower.height + elseif tower.type == TOWER_TYPE.LIGHTHOUSE then tower.perimeter = hex_ring_map(tower.hex, tower.range) end diff --git a/texture.lua b/texture.lua index 44043fe..85cbe01 100644 --- a/texture.lua +++ b/texture.lua @@ -38,6 +38,8 @@ TEXTURES = { -- tower stuff TOWER_WALL = load_texture("res/tower_wall.png"), TOWER_WALL_ICON = load_texture("res/tower_wall_icon.png"), + TOWER_GATTLER = load_texture("res/tower_gattler.png"), + TOWER_GATTLER_ICON = load_texture("res/tower_gattler_icon.png"), TOWER_HOWITZER = load_texture("res/tower_howitzer.png"), CANNON1 = load_texture("res/cannon1.png"), TOWER_HOWITZER_ICON = load_texture("res/tower_howitzer_icon.png"),