From a876db29e582d673f7811eb7afa182fc0ad6fe12 Mon Sep 17 00:00:00 2001 From: Nicholas Hayashi Date: Thu, 4 Feb 2021 19:00:45 -0500 Subject: [PATCH] wi --- main.lua | 53 ++---------------------- res/logo.png | Bin 0 -> 30981 bytes src/game.lua | 109 +++++++++++++++++++++++++++++++++++++++----------- src/tower.lua | 1 - texture.lua | 2 + 5 files changed, 91 insertions(+), 74 deletions(-) create mode 100644 res/logo.png diff --git a/main.lua b/main.lua index 190075c..e1039d7 100644 --- a/main.lua +++ b/main.lua @@ -4,6 +4,7 @@ math.randomseed(os.time()) math.random() math.random() math.random() +math.random() do local width, height, title = 1920, 1080, "hexyz" @@ -41,57 +42,9 @@ require "src/tower" MUSIC_VOLUME = 0.1 SFX_VOLUME = 0.1 -MODES = { MAIN, GAME } -CURRENT_MODE = MODES.MAIN - --- top right display types -local TRDTS = { - NOTHING, - CENTERED_EVENQ, - EVENQ, - HEX, - PLATFORM, - PERF, - SEED, - TILE, -} -local TRDT = 0 - -function update_top_right_message(display_type) - local str = "" - if display_type == TRDTS.CENTERED_EVENQ then - str = centered_evenq.x .. "," .. centered_evenq.y .. " (cevenq)" - - elseif display_type == TRDTS.EVENQ then - str = evenq.x .. "," .. evenq.y .. " (evenq)" - - elseif display_type == TRDTS.HEX then - str = hex.x .. "," .. hex.y .. " (hex)" - - elseif display_type == TRDTS.PLATFORM then - str = string.format("%s %s lang %s", am.platform, am.version, am.language()) - - elseif display_type == TRDTS.PERF then - str = table.tostring(PERF_STATS) - elseif display_type == TRDTS.SEED then - str = "SEED: " .. HEX_MAP.seed - - elseif display_type == TRDTS.TILE then - str = table.tostring(HEX_MAP.get(hex.x, hex.y)) - end - return str -end - -function main_action() - if WIN:key_pressed"f1" then - TRDT = (TRDT + 1) % #table.keys(TRDTS) - end -end - -function main_scene() - return am.group():action(main_action) -end +function main_action() end +function main_scene() end WIN.scene = am.group() game_init() diff --git a/res/logo.png b/res/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f50e55b6b67215ceb7d19a7e6d77433d6b8be9 GIT binary patch literal 30981 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

?~(vZeM+{Nz7vN;MjA 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 Gf&T}YGcdaV literal 0 HcmV?d00001 diff --git a/src/game.lua b/src/game.lua index e002eb8..cb34469 100644 --- a/src/game.lua +++ b/src/game.lua @@ -1,9 +1,23 @@ + + state = {} local function get_initial_game_state(seed) local STARTING_MONEY = 50 local map, world = random_map(seed) +-- top right display types +TRDTS = { + NOTHING = 0, + CENTERED_EVENQ = 1, + EVENQ = 2, + HEX = 3, + PLATFORM = 4, + PERF = 5, + SEED = 6, + TILE = 7, +} + return { map = map, -- map of hex coords map[x][y] to some stuff at that location world = world, -- the root scene graph node for the game 'world' @@ -22,9 +36,37 @@ local function get_initial_game_state(seed) hot = false, -- element being interacted with this frame selected_tower_type = false, + selected_toolbelt_button = 9, + top_right_display_type = TRDTS.SEED, } end +local function get_top_right_display_text(display_type) + local str = "" + if display_type == TRDTS.CENTERED_EVENQ then + str = state.centered_evenq.x .. "," .. state.centered_evenq.y .. " (cevenq)" + + elseif display_type == TRDTS.EVENQ then + str = state.evenq.x .. "," .. state.evenq.y .. " (evenq)" + + elseif display_type == TRDTS.HEX then + str = state.hex.x .. "," .. state.hex.y .. " (hex)" + + elseif display_type == TRDTS.PLATFORM then + str = string.format("%s %s lang %s", am.platform, am.version, am.language()) + + elseif display_type == TRDTS.PERF then + str = table.tostring(state.perf) + + elseif display_type == TRDTS.SEED then + str = "SEED: " .. state.map.seed + + elseif display_type == TRDTS.TILE then + str = table.tostring(state.map.get(state.hex.x, state.hex.y)) + end + return str +end + local function can_do_build(hex, tile, tower_type) if not can_afford_tower(state.money, tower_type) then return false @@ -44,6 +86,15 @@ end -- initialized later, as part of the init of the toolbelt function select_tower_type(tower_type) end +function select_toolbelt_button(i) + state.selected_toolbelt_button = i + if i < 9 then + select_tower_type(i) + else + select_tower_type(nil) + end +end + function do_day_night_cycle() local tstep = (math.sin(state.time / 100) + 1) / state.perf.avg_fps state.world"negative_mask".color = vec4(tstep){a=1} @@ -53,7 +104,7 @@ local function game_pause() WIN.scene"game".paused = true WIN.scene"game":append(am.group{ am.rect(WIN.left, WIN.bottom, WIN.right, WIN.top, COLORS.TRANSPARENT), - am.scale(3) ^ am.text("Paused.\nEscape to Resume", COLORS.BLACK) + am.scale(3) ^ am.text("Paused.\nEscape to Resume\nf4 to start a new game", COLORS.BLACK) } :tag"pause_menu") WIN.scene:action(function() @@ -61,6 +112,10 @@ local function game_pause() WIN.scene:remove"pause_menu" WIN.scene"game".paused = false return true + + elseif WIN:key_pressed"f4" then + game_end() + return true end end) end @@ -98,28 +153,30 @@ local function game_action(scene) if WIN:key_pressed"escape" then game_pause() + elseif WIN:key_pressed"f1" then + state.top_right_display_type = (state.top_right_display_type + 1) % #table.keys(TRDTS) + elseif WIN:key_pressed"f2" then WORLD"flow_field".hidden = not WORLD"flow_field".hidden elseif WIN:key_pressed"tab" then - local num_of_types = #table.keys(TOWER_TYPE) if WIN:key_down"lshift" then - select_tower_type((state.selected_tower_type + num_of_types - 2) % num_of_types + 1) + select_toolbelt_button((state.selected_toolbelt_button + 12 - 2) % 12 + 1) else - select_tower_type((state.selected_tower_type) % num_of_types + 1) + select_toolbelt_button((state.selected_toolbelt_button) % 12 + 1) end - elseif WIN:key_pressed"1" then select_tower_type(1) - elseif WIN:key_pressed"2" then select_tower_type(2) - elseif WIN:key_pressed"3" then select_tower_type(3) - elseif WIN:key_pressed"4" then select_tower_type(4) - elseif WIN:key_pressed"q" then select_tower_type(5) - elseif WIN:key_pressed"w" then select_tower_type(6) - elseif WIN:key_pressed"e" then select_tower_type(7) - elseif WIN:key_pressed"r" then select_tower_type(8) - elseif WIN:key_pressed"a" then select_tower_type(nil) - elseif WIN:key_pressed"s" then select_tower_type(nil) - elseif WIN:key_pressed"d" then select_tower_type(nil) - elseif WIN:key_pressed"f" then select_tower_type(nil) + 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) end do_entity_updates() @@ -127,13 +184,17 @@ local function game_action(scene) do_gui_updates() do_day_night_cycle() + WIN.scene"top_right_display".text = get_top_right_display_text(state.top_right_display_type) WIN.scene"score".text = string.format("SCORE: %.2f", state.score) WIN.scene"money".text = string.format("MONEY: %d", state.money) - WIN.scene"cursor".position2d = state.rounded_mouse + if state.hot then + WIN.scene"cursor".hidden = false + WIN.scene"cursor".position2d = state.rounded_mouse + else + WIN.scene"cursor".hidden = true + end end - - local function make_game_toolbelt() local function toolbelt_button(size, half_size, tower_texture, padding, i, offset, key_name) local x1 = (size + padding) * i + offset.x @@ -262,7 +323,7 @@ end function game_scene() local score = am.translate(WIN.left + 10, WIN.top - 20) ^ am.text("", "left"):tag"score" local money = am.translate(WIN.left + 10, WIN.top - 40) ^ am.text("", "left"):tag"money" - local coords = am.translate(WIN.right - 10, WIN.top - 20) ^ am.text("", "right", "top"):tag"coords" + local top_right_display = am.translate(WIN.right - 10, WIN.top - 20) ^ am.text("", "right", "top"):tag"top_right_display" local curtain = am.rect(WIN.left, WIN.bottom, WIN.right, WIN.top, COLORS.TRUE_BLACK) curtain:action(coroutine.create(function() @@ -272,11 +333,12 @@ function game_scene() local scene = am.group{ state.world, - curtain, make_hex_cursor(OFF_SCREEN, 0, COLORS.TRANSPARENT), - make_game_toolbelt(), score, - money + money, + top_right_display, + make_game_toolbelt(), + curtain, }:tag"game" scene:action(game_action) @@ -286,6 +348,7 @@ end function game_init() state = get_initial_game_state() + WIN.scene:remove"game" WIN.scene:append(game_scene()) end diff --git a/src/tower.lua b/src/tower.lua index e675a4d..8c5f2c7 100644 --- a/src/tower.lua +++ b/src/tower.lua @@ -92,7 +92,6 @@ local function make_tower_node(tower_type) elseif tower_type == TOWER_TYPE.MOAT then return am.circle(vec2(0), HEX_SIZE, (COLORS.WATER){a=1}, 6) - end end diff --git a/texture.lua b/texture.lua index a437939..999d8f0 100644 --- a/texture.lua +++ b/texture.lua @@ -1,6 +1,8 @@ TEXTURES = { + LOGO = am.texture2d("res/logo.png"), + BUTTON1 = am.texture2d("res/button1.png"), WIDER_BUTTON1 = am.texture2d("res/wider_button1.png"), TAB_ICON = am.texture2d("res/tab_icon.png"),