From 1dbdb44b5b50169a9c5ee26fb2be7f76ef06d754 Mon Sep 17 00:00:00 2001 From: Nicholas Hayashi Date: Tue, 16 Feb 2021 20:46:45 -0500 Subject: [PATCH] sorta fix some stuff --- main.lua | 4 +--- res/thing.png | Bin 6823 -> 5938 bytes src/game.lua | 36 ++++++++++++++++++------------------ src/grid.lua | 28 +++++++++++++++++++++++----- src/gui.lua | 40 ---------------------------------------- src/projectile.lua | 15 +++++++++------ src/tower.lua | 41 ++++++++++++++++++++++++++++------------- 7 files changed, 79 insertions(+), 85 deletions(-) delete mode 100644 src/gui.lua diff --git a/main.lua b/main.lua index e1039d7..1705bbc 100644 --- a/main.lua +++ b/main.lua @@ -15,6 +15,7 @@ do title = title, highdpi = true, letterbox = true, + --mode = "fullscreen", --projection = projection } @@ -32,17 +33,14 @@ require "src/geometry" require "src/hexyz" require "src/game" require "src/grid" -require "src/gui" require "src/mob" require "src/projectile" require "src/tower" - -- global audio settings MUSIC_VOLUME = 0.1 SFX_VOLUME = 0.1 - function main_action() end function main_scene() end diff --git a/res/thing.png b/res/thing.png index 1f33b0386e8d8980cb9ce017ed6e7777d31a2882..b358fee747173e17e23810975bd511f25d3426be 100644 GIT binary patch literal 5938 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 S_;mk{g{{@43st}Sr2Y?G4O1Tg literal 6823 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 Ar~m)} diff --git a/src/game.lua b/src/game.lua index 8340c2b..21fa8da 100644 --- a/src/game.lua +++ b/src/game.lua @@ -38,7 +38,7 @@ local function get_initial_game_state(seed) money = STARTING_MONEY, -- current money current_wave = 1, - time_until_next_wave = 15, + time_until_next_wave = 0, time_until_next_break = 0, spawning = false, spawn_chance = 55, @@ -142,7 +142,7 @@ local function game_action(scene) state.time = state.time + am.delta_time state.score = state.score + am.delta_time - --state.spawn_chance = math.clamp(state.spawn_chance - math.floor(state.time / 100), 1, 25) + state.spawn_chance = math.clamp(state.spawn_chance - math.floor(state.time / 100), 1, 25) if state.spawning then state.time_until_next_break = state.time_until_next_break - am.delta_time @@ -187,15 +187,15 @@ local function game_action(scene) local node = WIN.scene("cursor"):child(2) node.color = COLORS.CLARET node:action(am.tween(0.1, { color = COLORS.TRANSPARENT })) - alert("breaks flow field") play_sfx(SOUNDS.BIRD2) + alert("breaks flow field") elseif cost > state.money then local node = WIN.scene("cursor"):child(2) node.color = COLORS.CLARET node:action(am.tween(0.1, { color = COLORS.TRANSPARENT })) - alert("not enough $$$$") play_sfx(SOUNDS.BIRD2) + alert("not enough $$$$") else update_money(-cost) @@ -232,15 +232,15 @@ local function game_action(scene) else select_toolbelt_button((state.selected_toolbelt_button) % table.count(TOWER_TYPE) + 1) end - elseif WIN:key_pressed"1" then select_toolbelt_button(1) - elseif WIN:key_pressed"2" then select_toolbelt_button(2) - elseif WIN:key_pressed"3" then select_toolbelt_button(3) - elseif WIN:key_pressed"4" then select_toolbelt_button(4) - elseif WIN:key_pressed"q" then select_toolbelt_button(5) - elseif WIN:key_pressed"w" then select_toolbelt_button(6) - elseif WIN:key_pressed"e" then select_toolbelt_button(7) - elseif WIN:key_pressed"r" then select_toolbelt_button(8) - elseif WIN:key_pressed"a" then select_toolbelt_button(9) + elseif WIN:key_pressed"1" then select_toolbelt_button( 1) + elseif WIN:key_pressed"2" then select_toolbelt_button( 2) + elseif WIN:key_pressed"3" then select_toolbelt_button( 3) + elseif WIN:key_pressed"4" then select_toolbelt_button( 4) + elseif WIN:key_pressed"q" then select_toolbelt_button( 5) + elseif WIN:key_pressed"w" then select_toolbelt_button( 6) + elseif WIN:key_pressed"e" then select_toolbelt_button( 7) + elseif WIN:key_pressed"r" then select_toolbelt_button( 8) + elseif WIN:key_pressed"a" then select_toolbelt_button( 9) elseif WIN:key_pressed"s" then select_toolbelt_button(10) elseif WIN:key_pressed"d" then select_toolbelt_button(11) elseif WIN:key_pressed"f" then select_toolbelt_button(12) @@ -248,7 +248,6 @@ local function game_action(scene) do_entity_updates() do_mob_spawning(state.spawn_chance) - do_gui_updates() do_day_night_cycle() if interactable then @@ -379,7 +378,6 @@ local function make_game_toolbelt() end select_tower_type = function(tower_type) - log(tower_type) state.selected_tower_type = tower_type if get_tower_spec(tower_type) then @@ -475,9 +473,11 @@ end function game_init() state = get_initial_game_state() - build_tower(HEX_GRID_CENTER, TOWER_TYPE.RADAR) - -- @HACK to make the center tile passable even though there's a tower on it - state.map.get(HEX_GRID_CENTER.x, HEX_GRID_CENTER.y).elevation = 0 + local home_tower = build_tower(HEX_GRID_CENTER, TOWER_TYPE.RADAR) + for _,h in pairs(home_tower.hexes) do + -- @HACK to make the center tile(s) passable even though there's a tower on it + state.map.get(h.x, h.y).elevation = 0 + end WIN.scene:remove("game") WIN.scene:append(game_scene()) diff --git a/src/grid.lua b/src/grid.lua index 8ce13a8..ffded8d 100644 --- a/src/grid.lua +++ b/src/grid.lua @@ -130,13 +130,14 @@ function apply_flow_field(map, flow_field, world) end function building_tower_breaks_flow_field(tower_type, hex) - local hexes = spiral_map(hex, get_tower_size(tower_type)) local original_elevations = {} + local all_impassable = true + local hexes = spiral_map(hex, get_tower_size(tower_type)) for _,h in pairs(hexes) do local tile = state.map.get(h.x, h.y) - if not mob_can_pass_through(nil, h, tile) then - return false + if all_impassable and mob_can_pass_through(nil, h) then + all_impassable = false end table.insert(original_elevations, tile.elevation) @@ -145,9 +146,18 @@ function building_tower_breaks_flow_field(tower_type, hex) tile.elevation = 999 end + -- if no mobs can pass over any of the tiles we're building on + -- there is no need to regenerate the flow field, or do anything more + -- (besides return all the tile's elevations back to their original state) + if all_impassable then + for i,h in pairs(hexes) do + state.map.get(h.x, h.y).elevation = original_elevations[i] + end + return false + end + local flow_field = generate_flow_field(state.map, HEX_GRID_CENTER) local result = not hex_map_get(flow_field, 0, 0) - log(result) for i,h in pairs(hexes) do state.map.get(h.x, h.y).elevation = original_elevations[i] @@ -164,7 +174,14 @@ function random_map(seed) -- tone to give the appearance of light or darkness -- @NOTE replace this with a shader program -- interestingly, if it's colored white, it almost gives the impression of a winter biome - local neg_mask = am.rect(0, 0, HEX_GRID_PIXEL_WIDTH, HEX_GRID_PIXEL_HEIGHT, COLORS.TRUE_BLACK):tag"negative_mask" + local neg_mask = am.rect( + 0, + 0, + HEX_GRID_PIXEL_WIDTH, + HEX_GRID_PIXEL_HEIGHT, + COLORS.TRUE_BLACK + ) + :tag"negative_mask" local world = am.group(neg_mask):tag"world" for i,_ in pairs(map) do @@ -209,6 +226,7 @@ function random_map(seed) getmetatable(map).__index.neighbours = function(hex) return table.filter(hex_neighbours(hex), function(_hex) + --local interactable = evenq_is_in_interactable_region(hex_to_evenq(_hex)) local tile = map.get(_hex.x, _hex.y) return tile and tile_is_medium_elevation(tile) end) diff --git a/src/gui.lua b/src/gui.lua deleted file mode 100644 index 14c7eca..0000000 --- a/src/gui.lua +++ /dev/null @@ -1,40 +0,0 @@ - -local hot, active = false, false -local widgets = {} - -function get_widgets() return widgets end - -function register_widget(id, poll) - widgets[id] = { id = id, poll = poll } -end - -function set_hot(id) - if not active then hot = { id = id } end -end - -function register_button_widget(id, rect, onclick) - register_widget(id, function(i) - local click = false - - if active and active.id == id then - if WIN:mouse_released"left" then - if hot and hot.id == id then click = true end - active = false - end - elseif hot and hot.id == id then - if WIN:mouse_pressed"left" then active = { id = id } end - end - - if point_in_rect(WIN:mouse_position(), rect) then set_hot(id) end - - if click then onclick() end - end) -end - -function do_gui_updates() - for i,w in pairs(widgets) do - w.poll(i) - end -end - - diff --git a/src/projectile.lua b/src/projectile.lua index 980127d..2c993a6 100644 --- a/src/projectile.lua +++ b/src/projectile.lua @@ -10,7 +10,7 @@ PROJECTILE_TYPE = { local PROJECTILE_SPECS = { [PROJECTILE_TYPE.SHELL] = { velocity = 13, - damage = 20, + damage = 15, hitbox_radius = 20 }, [PROJECTILE_TYPE.LASER] = { @@ -105,10 +105,10 @@ local function update_projectile_shell(projectile, projectile_index) local tile = state.map.get(projectile.hex.x, projectile.hex.y) if tile and tile.elevation >= projectile.props.z then - do_explode = true + --do_explode = true elseif projectile.props.z <= 0 then - do_explode = true + --do_explode = true end if do_explode then @@ -200,9 +200,12 @@ function get_projectile_update_function(projectile_type) end function make_and_register_projectile(hex, projectile_type, vector) - local projectile = make_basic_entity(hex - , make_projectile_node(projectile_type, vector) - , get_projectile_update_function(projectile_type)) + local projectile = make_basic_entity( + hex, + make_projectile_node(projectile_type, vector), + get_projectile_update_function(projectile_type) + ) + projectile.type = projectile_type projectile.vector = vector diff --git a/src/tower.lua b/src/tower.lua index af6e185..b90f319 100644 --- a/src/tower.lua +++ b/src/tower.lua @@ -30,7 +30,7 @@ TOWER_SPECS = { }, [TOWER_TYPE.HOWITZER] = { name = "Howitzer", - placement_rules_text = "Place on non-Water", + placement_rules_text = "Place on non-Water, non-Mountain or on Walls", short_description = "Fires artillery. Range increases with elevation of terrain underneath.", texture = TEXTURES.TOWER_HOWITZER, icon_texture = TEXTURES.TOWER_HOWITZER_ICON, @@ -73,7 +73,7 @@ TOWER_SPECS = { cost = 20, range = 0, fire_rate = 1, - size = 1, + size = 0, height = 1, }, [TOWER_TYPE.LIGHTHOUSE] = { @@ -133,7 +133,9 @@ local function make_tower_node(tower_type) elseif tower_type == TOWER_TYPE.HOWITZER then return am.group{ pack_texture_into_sprite(TEXTURES.HEX_FLOWER, HEX_FLOWER_DIMENSIONS.x, HEX_FLOWER_DIMENSIONS.y), - am.rotate(0) ^ pack_texture_into_sprite(TEXTURES.CANNON1, 100, 100) + am.rotate(state.time or 0) ^ am.group{ + pack_texture_into_sprite(TEXTURES.CANNON1, 100, 100) + } } elseif tower_type == TOWER_TYPE.LIGHTHOUSE then return am.group{ @@ -286,7 +288,7 @@ function tower_type_is_buildable_on(hex, tile, tower_type) end end end - return not (blocked or has_water) + return not (blocked or has_water or has_mountain) elseif tower_type == TOWER_TYPE.REDEYE then if not mobs_blocking and towers_blocking then @@ -359,6 +361,7 @@ end function update_tower_howitzer(tower, tower_index) if not tower.target_index then + -- we don't have a target for index,mob in pairs(MOBS) do if mob then local d = math.distance(mob.hex, tower.hex) @@ -368,19 +371,23 @@ function update_tower_howitzer(tower, tower_index) end end end + tower.node("rotate").angle = math.wrapf(tower.node("rotate").angle + 0.2 * am.delta_time, math.pi*2) else + -- we should have a target if MOBS[tower.target_index] == false then + -- the target we have was invalidated tower.target_index = false - elseif (state.time - tower.last_shot_time) > tower.fire_rate then + else + -- the target we have is valid local mob = MOBS[tower.target_index] - local theta = math.atan((tower.hex.y - mob.hex.y)/(tower.hex.x - mob.hex.x)) + local vector = math.normalize(mob.position - tower.position) - if (theta - tower.node("rotate").angle) < 0.1 then + if (state.time - tower.last_shot_time) > tower.fire_rate then local projectile = make_and_register_projectile( tower.hex, PROJECTILE_TYPE.SHELL, - math.normalize(mob.position - tower.position) + vector ) -- @HACK, the projectile will explode if it encounters something taller than it, @@ -391,11 +398,13 @@ function update_tower_howitzer(tower, tower_index) tower.last_shot_time = state.time play_sfx(SOUNDS.EXPLOSION2) end - else - tower.node("rotate").angle = tower.node("rotate").angle + state.time * 0.5 + + local theta = math.rad(90) - math.atan((tower.position.y - mob.position.y)/(tower.position.x - mob.position.x)) + local diff = tower.node("rotate").angle - theta + + tower.node("rotate").angle = -theta + math.pi/2 end end - tower.node("rotate").angle = math.wrapf(tower.node("rotate").angle, math.pi*2) end function update_tower_lighthouse(tower, tower_index) @@ -449,7 +458,11 @@ function make_and_register_tower(hex, tower_type) tower.fire_rate = spec.fire_rate tower.last_shot_time = -spec.fire_rate tower.size = spec.size - tower.hexes = spiral_map(tower.hex, tower.size) + if tower.size == 0 then + tower.hexes = { tower.hex } + else + tower.hexes = spiral_map(tower.hex, tower.size) + end tower.height = spec.height for _,h in pairs(tower.hexes) do @@ -466,8 +479,10 @@ function make_and_register_tower(hex, tower_type) end function build_tower(hex, tower_type) - make_and_register_tower(hex, tower_type) + local tower = make_and_register_tower(hex, tower_type) vplay_sfx(SOUNDS.EXPLOSION4) + + return tower end function delete_all_towers()