diff --git a/conf.lua b/conf.lua index 360aaf9..cea3ce0 100644 --- a/conf.lua +++ b/conf.lua @@ -3,7 +3,7 @@ title = "hexyz" author = "nick hayashi" shortname = "hexyz" version = "0.1.1" -support_email = "hayashi.nicholas@gmail.com" +support_email = "" copyright_message = "Copyright © 2021 Nick Hayashi" dev_region = "en" diff --git a/main.lua b/main.lua index 8e3ffa5..831d97b 100644 --- a/main.lua +++ b/main.lua @@ -44,6 +44,16 @@ require "src/projectile" require "src/tower" +function alert(message) + win.scene:append( + am.scale(3) ^ am.text(message) + :action(coroutine.create(function(self) + am.wait(am.tween(self, 1, { color = vec4(0) })) + win.scene:remove(self) + end)) + ) +end + function main_action(self) if win:key_pressed("escape") then if win.scene("game") then @@ -59,6 +69,7 @@ function main_action(self) end function make_main_scene_toolbelt() + local include_save_option = game local options = { false, false, @@ -71,6 +82,14 @@ function make_main_scene_toolbelt() end }, false, + include_save_option and { + texture = TEXTURES.SAVE_GAME_HEX, + action = function() + game_save() + alert("succesfully saved!") + end + } or false, + false, { texture = TEXTURES.LOAD_GAME_HEX, action = function() @@ -78,8 +97,7 @@ function make_main_scene_toolbelt() game_init(am.load_state("save", "json")) end }, - false, - false, + false, { texture = TEXTURES.MAP_EDITOR_HEX, @@ -109,6 +127,8 @@ function make_main_scene_toolbelt() local hvs = hex_vertical_spacing(spacing) local grid_pixel_width = grid_width * hhs local grid_pixel_height = grid_height * hvs + -- @TODO the vertical offset should be different depending on if this is the main menu or the pause menu + -- perhaps the map that makes the grid of hexes should be different as well local pixel_offset = vec2(-grid_pixel_width/2, win.bottom + hex_height(spacing)/2 + 20) local map = hex_rectangular_map(grid_width, grid_height, HEX_ORIENTATION.POINTY) @@ -161,7 +181,7 @@ function make_main_scene_toolbelt() return am.translate(pixel_offset) ^ group end -function main_scene(do_backdrop) +function main_scene(do_backdrop, do_logo) local group = am.group() if do_backdrop then @@ -173,7 +193,7 @@ function main_scene(do_backdrop) color = color{a=color.a - 0.1} local node = am.translate(hex_to_pixel(vec2(i, j), vec2(HEX_SIZE))) - ^ am.circle(vec2(0), HEX_SIZE, vec4(0), 6) + ^ am.circle(vec2(0), HEX_SIZE, vec4(0), 6) node"circle":action(am.tween(0.6, { color = color })) @@ -190,8 +210,12 @@ function main_scene(do_backdrop) ^ am.text(version, COLORS.WHITE, "right") ) - local logo_height = 480 - group:append(am.translate(0, win.top - 20 - logo_height/2) ^ am.sprite("res/logo.png")) + if do_logo then + group:append( + am.translate(0, win.top - 20 - TEXTURES.LOGO.height/2) + ^ pack_texture_into_sprite(TEXTURES.LOGO, TEXTURES.LOGO.width, TEXTURES.LOGO.height) + ) + end group:append(make_main_scene_toolbelt()) @@ -201,7 +225,7 @@ function main_scene(do_backdrop) end win.scene = am.group( - main_scene(true) + main_scene(true, true) ) noglobals() diff --git a/res/savegamehex.png b/res/savegamehex.png new file mode 100644 index 0000000..fa5ee75 Binary files /dev/null and b/res/savegamehex.png differ diff --git a/src/entity.lua b/src/entity.lua index 4f4d628..b04d396 100644 --- a/src/entity.lua +++ b/src/entity.lua @@ -55,12 +55,6 @@ function delete_entity(t, index) t[index] = false -- leave empty indexes so other entities can learn that this entity was deleted end -function delete_all_entities() - delete_all_mobs() - delete_all_towers() - delete_all_projectiles() -end - function do_entity_updates() do_mob_updates() do_tower_updates() diff --git a/src/game.lua b/src/game.lua index cce1442..c30a5c5 100644 --- a/src/game.lua +++ b/src/game.lua @@ -1,10 +1,14 @@ +game = false -- flag to tell if there is a game running state = {} -function game_end(saved_state) - delete_all_entities() - game_init(saved_state) +function game_end() + state = {} + game = false + + -- @TODO + end function update_score(diff) state.score = state.score + diff end @@ -45,7 +49,7 @@ local function get_initial_game_state(seed) time_until_next_wave = 0, time_until_next_break = 0, spawning = false, - spawn_chance = 0.01, + spawn_chance = 0.002, last_mob_spawn_time = 0, selected_tower_type = false, @@ -88,16 +92,6 @@ local function get_top_right_display_text(hex, evenq, centered_evenq, display_ty return str end -function alert(message) - win.scene:append( - am.scale(3) ^ am.text(message) - :action(coroutine.create(function(self) - am.wait(am.tween(self, 1, { color = vec4(0) })) - win.scene:remove(self) - end)) - ) -end - -- initialized later, as part of the init of the toolbelt local function select_tower_type(tower_type) end local function select_toolbelt_button(i) end @@ -118,7 +112,7 @@ end local function game_pause() win.scene("game").paused = true - win.scene:append(main_scene(false)) + win.scene:append(main_scene(false, false)) end local function game_deserialize(json_string) @@ -202,7 +196,7 @@ local function game_serialize() return am.to_json(serialized) end -local function game_save() +function game_save() am.save_state("save", game_serialize(), "json") log("succesfully saved!") end @@ -302,10 +296,6 @@ local function game_action(scene) elseif win:key_pressed"f3" then game_save() - elseif win:key_pressed"f4" then - game_end(am.load_state("save", "json")) - return true - elseif win:key_pressed"tab" then if win:key_down"lshift" then select_toolbelt_button((state.selected_toolbelt_button + table.count(TOWER_TYPE) - 2) % table.count(TOWER_TYPE) + 1) @@ -381,7 +371,7 @@ local function make_game_toolbelt() return button end - local toolbelt_height = hex_height(HEX_SIZE) * 2 + local toolbelt_height = win.height * 0.08 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) @@ -392,7 +382,7 @@ local function make_game_toolbelt() return am.group():tag"tower_tooltip_text" end - local color = COLORS.PALE_SILVER + local color = COLORS.WHITE return (am.translate(win.left + 10, win.bottom + toolbelt_height + 20) ^ am.group{ am.translate(0, 60) @@ -566,6 +556,7 @@ function game_init(saved_state) end end + game = true win.scene:remove("game") win.scene:append(game_scene()) end diff --git a/src/hexyz.lua b/src/hexyz.lua index 9e38bbe..122e658 100644 --- a/src/hexyz.lua +++ b/src/hexyz.lua @@ -44,7 +44,7 @@ local HEX_DEFAULT_ORIENTATION = HEX_ORIENTATION.FLAT -- whenever |size| for a hexagon appears as an argument, if it isn't provided, use this -- 'size' here is distance from the centerpoint to any vertex in pixel -local HEX_DEFAULT_SIZE = vec2(20) +local HEX_DEFAULT_SIZE = vec2(26) -- actual width (longest contained horizontal line) of the hexagon function hex_width(size, orientation) diff --git a/src/mob.lua b/src/mob.lua index 60b859e..c41c3d3 100644 --- a/src/mob.lua +++ b/src/mob.lua @@ -72,6 +72,11 @@ function mob_die(mob, mob_index) delete_entity(state.mobs, mob_index) end +function mob_reach_center(mob, mob_index) + update_score(-(mob.health + mob.bounty)) + delete_entity(state.mobs, mob_index) +end + local HEALTHBAR_WIDTH = HEX_PIXEL_WIDTH/2 local HEALTHBAR_HEIGHT = HEALTHBAR_WIDTH/4 function do_hit_mob(mob, damage, mob_index) @@ -148,8 +153,7 @@ local function resolve_frame_target_for_mob(mob, mob_index) mob.hex = pixel_to_hex(mob.position, vec2(HEX_SIZE)) if mob.hex == HEX_GRID_CENTER then - update_score(-mob.health) - mob_die(mob, mob_index) + mob_reach_center(mob, mob_index) return true end @@ -320,29 +324,19 @@ local function can_spawn_mob() end if math.random() <= state.spawn_chance then - --log('yes %f', state.spawn_chance) state.last_mob_spawn_time = state.time return true else - --log('no %f', state.spawn_chance) return false end end function do_mob_spawning() - --if win:key_pressed"space" then if can_spawn_mob() then - --if #state.mobs < 1 then make_and_register_mob(MOB_TYPE.BEEPER) end end -function delete_all_mobs() - for mob_index,mob in pairs(state.mobs) do - if mob then delete_entity(state.mobs, mob_index) end - end -end - function do_mob_updates() for mob_index,mob in pairs(state.mobs) do if mob and mob.update then diff --git a/src/projectile.lua b/src/projectile.lua index 0b01dc1..af0e135 100644 --- a/src/projectile.lua +++ b/src/projectile.lua @@ -236,12 +236,6 @@ function projectile_deserialize(json_string) return projectile end -function delete_all_projectiles() - for projectile_index,projectile in pairs(state.projectiles) do - if projectile then delete_entity(state.projectiles, projectile_index) end - end -end - function do_projectile_updates() for projectile_index,projectile in pairs(state.projectiles) do if projectile and projectile.update then diff --git a/src/tower.lua b/src/tower.lua index 504dc45..cea96dd 100644 --- a/src/tower.lua +++ b/src/tower.lua @@ -511,12 +511,6 @@ function build_tower(hex, tower_type) return tower end -function delete_all_towers() - for tower_index,tower in pairs(state.towers) do - if tower then delete_entity(state.towers, tower_index) end - end -end - function do_tower_updates() for tower_index,tower in pairs(state.towers) do if tower and tower.update then diff --git a/texture.lua b/texture.lua index d37e243..ada6fce 100644 --- a/texture.lua +++ b/texture.lua @@ -16,6 +16,7 @@ TEXTURES = { SHADED_HEX = load_texture("res/shaded_hex.png"), NEW_GAME_HEX = load_texture("res/newgamehex.png"), + SAVE_GAME_HEX = load_texture("res/savegamehex.png"), LOAD_GAME_HEX = load_texture("res/loadgamehex.png"), SETTINGS_HEX = load_texture("res/settingshex.png"), MAP_EDITOR_HEX = load_texture("res/mapeditorhex.png"),