From 020bfd4134495675530eb1bf7491173af5f196b6 Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Mon, 23 Mar 2026 07:02:39 +0100 Subject: [PATCH 01/17] set version to beta2 --- inc/meta/meta.header.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/meta/meta.header.lua b/inc/meta/meta.header.lua index 0e64ae7..c001a35 100644 --- a/inc/meta/meta.header.lua +++ b/inc/meta/meta.header.lua @@ -4,5 +4,5 @@ -- desc: Life of a programmer -- site: https://git.teletype.hu/games/impostor -- license: MIT License --- version: 1.0-beta1 +-- version: 1.0-beta2 -- script: lua -- 2.49.1 From 6e1cf1db3ee8864b2c124e85a1ff3d0f8afb44af Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Thu, 2 Apr 2026 15:07:04 +0200 Subject: [PATCH 02/17] remove situation management --- .luacheckrc | 1 - impostor.inc | 3 - inc/decision/decision.have_a_coffee.lua | 16 ----- inc/init/init.context.lua | 3 +- inc/init/init.module.lua | 1 - inc/screen/screen.manager.lua | 6 -- inc/screen/screen.office.lua | 3 - inc/situation/situation.drink_coffee.lua | 6 -- inc/situation/situation.manager.lua | 84 ------------------------ inc/window/window.game.lua | 8 --- 10 files changed, 1 insertion(+), 130 deletions(-) delete mode 100644 inc/decision/decision.have_a_coffee.lua delete mode 100644 inc/situation/situation.drink_coffee.lua delete mode 100644 inc/situation/situation.manager.lua diff --git a/.luacheckrc b/.luacheckrc index 8f58d89..0c64bc2 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -10,7 +10,6 @@ globals = { "Discussion", "Util", "Decision", - "Situation", "Screen", "Sprite", "UI", diff --git a/impostor.inc b/impostor.inc index 7f39293..9d71029 100644 --- a/impostor.inc +++ b/impostor.inc @@ -38,10 +38,7 @@ sprite/sprite.matrix_architect.lua sprite/sprite.matrix_neo.lua sprite/sprite.matrix_oraculum.lua sprite/sprite.matrix_trinity.lua -situation/situation.manager.lua -situation/situation.drink_coffee.lua decision/decision.manager.lua -decision/decision.have_a_coffee.lua decision/decision.go_to_home.lua decision/decision.go_to_toilet.lua decision/decision.go_to_walking_to_office.lua diff --git a/inc/decision/decision.have_a_coffee.lua b/inc/decision/decision.have_a_coffee.lua deleted file mode 100644 index a7c5212..0000000 --- a/inc/decision/decision.have_a_coffee.lua +++ /dev/null @@ -1,16 +0,0 @@ -Decision.register({ - id = "have_a_coffee", - label = "Have a Coffee", - handle = function() - local new_situation_id = Situation.apply("drink_coffee", Context.game.current_screen) - local level = Ascension.get_level() - local disc_id = "coworker_disc_0" - -- TODO: Add more discussions for levels above 3 - if level >= 1 and level <= 3 then - local suffix = Context.have_done_work_today and ("_asc_" .. level) or ("_" .. level) - disc_id = "coworker_disc" .. suffix - end - Discussion.start(disc_id, "game") - Context.game.current_situation = new_situation_id - end, -}) \ No newline at end of file diff --git a/inc/init/init.context.lua b/inc/init/init.context.lua index a3d9100..728ab68 100644 --- a/inc/init/init.context.lua +++ b/inc/init/init.context.lua @@ -23,7 +23,7 @@ Context = {} --- * have_met_sumphore (boolean) Whether the player has talked to the homeless guy.
--- * have_been_to_office (boolean) Whether the player has been to the office.
--- * have_done_work_today (boolean) Whether the player has done work today.
---- * game (table) Current game progress state. Contains: `current_screen` (string) active screen ID, `current_situation` (string|nil) active situation ID.
+--- * game (table) Current game progress state. Contains: `current_screen` (string) active screen ID
function Context.initial_data() return { current_menu_item = 1, @@ -48,7 +48,6 @@ function Context.initial_data() have_met_sumphore = false, game = { current_screen = "home", - current_situation = nil, }, day_count = 1, delta_time = 0, diff --git a/inc/init/init.module.lua b/inc/init/init.module.lua index b5c6d56..ecdeb67 100644 --- a/inc/init/init.module.lua +++ b/inc/init/init.module.lua @@ -3,7 +3,6 @@ Util = {} Meter = {} Minigame = {} Decision = {} -Situation = {} Screen = {} Map = {} UI = {} diff --git a/inc/screen/screen.manager.lua b/inc/screen/screen.manager.lua index c56419a..9d3eb0a 100644 --- a/inc/screen/screen.manager.lua +++ b/inc/screen/screen.manager.lua @@ -8,7 +8,6 @@ local _screens = {} --- @param screen_data.name string Display name of the screen. --- @param screen_data.decisions table Array of decision ID strings available on this screen. --- @param screen_data.background string Map ID used as background. ---- @param[opt] screen_data.situations table Array of situation ID strings. Defaults to {}. --- @param[opt] screen_data.init function Called when the screen is entered. Defaults to noop. --- @param[opt] screen_data.update function Called each frame while screen is active. Defaults to noop. --- @param[opt] screen_data.draw function Called after the focus overlay to draw screen-specific overlays. Defaults to noop. @@ -16,9 +15,6 @@ function Screen.register(screen_data) if _screens[screen_data.id] then trace("Warning: Overwriting screen with id: " .. screen_data.id) end - if not screen_data.situations then - screen_data.situations = {} - end if not screen_data.init then screen_data.init = function() end end @@ -43,7 +39,6 @@ end --- * name (string) Display name.
--- * decisions (table) Array of decision ID strings.
--- * background (string) Map ID used as background.
---- * situations (table) Array of situation ID strings.
--- * init (function) Called when the screen is entered.
--- * update (function) Called each frame while screen is active. function Screen.get_by_id(screen_id) @@ -58,7 +53,6 @@ end --- * name (string) Display name of the screen.
--- * decisions (table) Array of decision ID strings available on this screen.
--- * background (string) Map ID used as background.
---- * situations (table) Array of situation ID strings.
--- * init (function) Called when the screen is entered.
--- * update (function) Called each frame while screen is active.
function Screen.get_all() diff --git a/inc/screen/screen.office.lua b/inc/screen/screen.office.lua index 917f953..8d8aa89 100644 --- a/inc/screen/screen.office.lua +++ b/inc/screen/screen.office.lua @@ -6,9 +6,6 @@ Screen.register({ "go_to_walking_to_home", "have_a_coffee", }, - situations = { - "drink_coffee", - }, init = function() Audio.music_play_room_work() end, diff --git a/inc/situation/situation.drink_coffee.lua b/inc/situation/situation.drink_coffee.lua deleted file mode 100644 index d791d0e..0000000 --- a/inc/situation/situation.drink_coffee.lua +++ /dev/null @@ -1,6 +0,0 @@ -Situation.register({ - id = "drink_coffee", - handle = function() - Audio.sfx_select() - end, -}) diff --git a/inc/situation/situation.manager.lua b/inc/situation/situation.manager.lua deleted file mode 100644 index 17d2e4e..0000000 --- a/inc/situation/situation.manager.lua +++ /dev/null @@ -1,84 +0,0 @@ ---- @section Situation -local _situations = {} - ---- Registers a situation definition. ---- @within Situation ---- @param situation table The situation data table. ---- @param situation.id string Unique situation identifier.
---- @param[opt] situation.screen_id string ID of the screen this situation belongs to.
---- @param[opt] situation.handle function Called when the situation is applied. Defaults to noop.
---- @param[opt] situation.update function Called each frame while situation is active. Defaults to noop.
-function Situation.register(situation) - if not situation or not situation.id then - PopupWindow.show({"Error: Invalid situation object registered (missing id)!"}) - return - end - if not situation.handle then - situation.handle = function() end - end - if not situation.update then - situation.update = function() end - end - if _situations[situation.id] then - trace("Warning: Overwriting situation with id: " .. situation.id) - end - _situations[situation.id] = situation -end - ---- Gets a situation by ID. ---- @within Situation ---- @param id string The situation ID. ---- @return result table The situation table or nil.
---- Fields:
---- * id (string) Unique situation identifier.
---- * screen_id (string) ID of the screen this situation belongs to.
---- * handle (function) Called when the situation is applied.
---- * update (function) Called each frame while situation is active.
-function Situation.get_by_id(id) - return _situations[id] -end - ---- Gets all registered situations, optionally filtered by screen ID. ---- @within Situation ---- @param screen_id string Optional. If provided, returns situations associated with this screen ID. ---- @return result table A table containing all registered situation data, indexed by their IDs, or an array filtered by screen_id.
---- Fields:
---- * id (string) Unique situation identifier.
---- * screen_id (string) ID of the screen this situation belongs to.
---- * handle (function) Called when the situation is applied.
---- * update (function) Called each frame while situation is active.
-function Situation.get_all(screen_id) - if screen_id then - local filtered_situations = {} - for _, situation in pairs(_situations) do - if situation.screen_id == screen_id then - table.insert(filtered_situations, situation) - end - end - return filtered_situations - end - return _situations -end - ---- Applies a situation, checking screen compatibility and returning the new situation ID if successful. ---- @within Situation ---- @param id string The situation ID to apply. ---- @param current_screen_id string The ID of the currently active screen. ---- @return string|nil The ID of the applied situation if successful, otherwise nil. -function Situation.apply(id, current_screen_id) - local situation = Situation.get_by_id(id) - local screen = Screen.get_by_id(current_screen_id) - - if not situation then - trace("Error: No situation found with id: " .. id) - return nil - end - - if Util.contains(screen.situations, id) then - situation.handle() - return id - else - trace("Info: Situation " .. id .. " cannot be applied to current screen (id: " .. current_screen_id .. ").") - return nil - end -end diff --git a/inc/window/window.game.lua b/inc/window/window.game.lua index d1862dd..3b3f06b 100644 --- a/inc/window/window.game.lua +++ b/inc/window/window.game.lua @@ -48,14 +48,6 @@ function GameWindow.update() if not screen or not screen.update then return end screen.update() - -- Handle current situation updates - if Context.game.current_situation then - local current_situation_obj = Situation.get_by_id(Context.game.current_situation) - if current_situation_obj and type(current_situation_obj.update) == "function" then - current_situation_obj.update() - end - end - if Context.stat_screen_active then return end -- Fetch and filter decisions locally -- 2.49.1 From 7697b3533648b62cb383c412d34a0fbd630b16f8 Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Thu, 2 Apr 2026 18:19:25 +0200 Subject: [PATCH 03/17] input remapping + mouse control --- .gitignore | 3 +- .luacheckrc | 4 +++ impostor.inc | 1 + inc/decision/decision.manager.lua | 25 +++++++++++++++- inc/init/init.module.lua | 1 + inc/screen/screen.mysterious_man.lua | 7 +++-- inc/screen/screen.toilet.lua | 2 +- inc/system/system.input.lua | 22 ++------------ inc/system/system.main.lua | 1 + inc/system/system.mouse.lua | 43 +++++++++++++++++++++++++++ inc/system/system.ui.lua | 30 +++++++++++++++++-- inc/window/window.audiotest.lua | 4 +-- inc/window/window.configuration.lua | 4 +-- inc/window/window.continued.lua | 2 +- inc/window/window.end.lua | 4 +-- inc/window/window.game.lua | 6 ++-- inc/window/window.intro.brief.lua | 2 +- inc/window/window.intro.title.lua | 2 +- inc/window/window.intro.ttg.lua | 4 +-- inc/window/window.menu.lua | 25 ++++++++++++++-- inc/window/window.minigame.ddr.lua | 11 +++++++ inc/window/window.minigame.mash.lua | 9 +++++- inc/window/window.minigame.rhythm.lua | 9 +++++- inc/window/window.popup.lua | 2 +- 24 files changed, 178 insertions(+), 45 deletions(-) create mode 100644 inc/system/system.mouse.lua diff --git a/.gitignore b/.gitignore index a1781fb..b381695 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.claude .local impostor.lua impostor.original.lua @@ -5,4 +6,4 @@ prompts docs minify.lua *.tic -*.zip \ No newline at end of file +*.zip diff --git a/.luacheckrc b/.luacheckrc index 0c64bc2..7162e25 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -65,6 +65,10 @@ globals = { "map", "time", "RLE", + "mouse", + "Mouse", + "print", + "musicator_generate_pattern", } diff --git a/impostor.inc b/impostor.inc index 9d71029..64da4c0 100644 --- a/impostor.inc +++ b/impostor.inc @@ -6,6 +6,7 @@ init/init.context.lua system/system.util.lua system/system.print.lua system/system.input.lua +system/system.mouse.lua system/system.asciiart.lua system/system.rle.lua logic/logic.meter.lua diff --git a/inc/decision/decision.manager.lua b/inc/decision/decision.manager.lua index 8950ece..65412bc 100644 --- a/inc/decision/decision.manager.lua +++ b/inc/decision/decision.manager.lua @@ -134,6 +134,7 @@ end --- @param decisions table A table of decision items.
--- @param selected_decision_index number The current index of the selected decision.
--- @return number selected_decision_index The updated index of the selected decision. +--- @return boolean mouse_confirmed True if the user clicked the center to confirm. function Decision.update(decisions, selected_decision_index) if Input.left() then Audio.sfx_beep() @@ -142,5 +143,27 @@ function Decision.update(decisions, selected_decision_index) Audio.sfx_beep() selected_decision_index = Util.safeindex(decisions, selected_decision_index + 1) end - return selected_decision_index + + if Mouse.clicked() then + local mx = Mouse.x() + local my = Mouse.y() + local bar_height = 16 + local bar_y = Config.screen.height - bar_height + if my >= bar_y then + if mx < 15 then + Audio.sfx_beep() + Mouse.consume() + selected_decision_index = Util.safeindex(decisions, selected_decision_index - 1) + elseif mx > Config.screen.width - 15 then + Audio.sfx_beep() + Mouse.consume() + selected_decision_index = Util.safeindex(decisions, selected_decision_index + 1) + else + Mouse.consume() + return selected_decision_index, true + end + end + end + + return selected_decision_index, false end diff --git a/inc/init/init.module.lua b/inc/init/init.module.lua index ecdeb67..d15d850 100644 --- a/inc/init/init.module.lua +++ b/inc/init/init.module.lua @@ -8,6 +8,7 @@ Map = {} UI = {} Print = {} Input = {} +Mouse = {} Sprite = {} Audio = {} Focus = {} diff --git a/inc/screen/screen.mysterious_man.lua b/inc/screen/screen.mysterious_man.lua index 5c23556..a0b6a05 100644 --- a/inc/screen/screen.mysterious_man.lua +++ b/inc/screen/screen.mysterious_man.lua @@ -240,9 +240,12 @@ Screen.register({ end end elseif state == STATE_CHOICE then - selected_choice = UI.update_menu(MysteriousManScreen.choices, selected_choice) + local menu_x = (Config.screen.width - 60) / 2 + local menu_y = (Config.screen.height - 20) / 2 + local confirmed + selected_choice, confirmed = UI.update_menu(MysteriousManScreen.choices, selected_choice, menu_x, menu_y) - if Input.select() then + if Input.select() or confirmed then Audio.sfx_select() if selected_choice == 1 then MysteriousManScreen.wake_up() diff --git a/inc/screen/screen.toilet.lua b/inc/screen/screen.toilet.lua index 1d7be30..082267d 100644 --- a/inc/screen/screen.toilet.lua +++ b/inc/screen/screen.toilet.lua @@ -16,7 +16,7 @@ Screen.register({ end, update = function() if not Context.stat_screen_active then return end - if Input.select() or Input.player_interact() then + if Input.select() or Input.select() then Focus.stop() Context.stat_screen_active = false Meter.show() diff --git a/inc/system/system.input.lua b/inc/system/system.input.lua index aeb1900..3c015c2 100644 --- a/inc/system/system.input.lua +++ b/inc/system/system.input.lua @@ -3,12 +3,9 @@ local INPUT_KEY_UP = 0 local INPUT_KEY_DOWN = 1 local INPUT_KEY_LEFT = 2 local INPUT_KEY_RIGHT = 3 -local INPUT_KEY_A = 4 -local INPUT_KEY_B = 5 local INPUT_KEY_Y = 7 local INPUT_KEY_SPACE = 48 local INPUT_KEY_BACKSPACE = 51 -local INPUT_KEY_ENTER = 50 --- Checks if Up is pressed. --- @within Input @@ -22,22 +19,9 @@ function Input.left() return btnp(INPUT_KEY_LEFT) end --- Checks if Right is pressed. --- @within Input function Input.right() return btnp(INPUT_KEY_RIGHT) end ---- Checks if Space is pressed. ---- @within Input -function Input.space() return keyp(INPUT_KEY_SPACE) end - --- Checks if Select is pressed. --- @within Input -function Input.select() return btnp(INPUT_KEY_A) or keyp(INPUT_KEY_SPACE) end ---- Checks if Menu Confirm is pressed. +function Input.select() return btnp(INPUT_KEY_Y) or keyp(INPUT_KEY_SPACE) or Mouse.clicked() end +--- Checks if Back is pressed. --- @within Input -function Input.menu_confirm() return btnp(INPUT_KEY_A) or keyp(INPUT_KEY_ENTER) end ---- Checks if Player Interact is pressed. ---- @within Input -function Input.player_interact() return btnp(INPUT_KEY_B) or keyp(INPUT_KEY_ENTER) end ---- Checks if Menu Back is pressed. ---- @within Input -function Input.menu_back() return btnp(INPUT_KEY_Y) or keyp(INPUT_KEY_BACKSPACE) end ---- Checks if Toggle Popup is pressed. ---- @within Input -function Input.toggle_popup() return keyp(INPUT_KEY_ENTER) end +function Input.back() return keyp(INPUT_KEY_BACKSPACE) end diff --git a/inc/system/system.main.lua b/inc/system/system.main.lua index 888ef84..69b4f86 100644 --- a/inc/system/system.main.lua +++ b/inc/system/system.main.lua @@ -17,6 +17,7 @@ end --- @within Main function TIC() init_game() + Mouse.update() local now = time() if Context.last_frame_time == 0 then diff --git a/inc/system/system.mouse.lua b/inc/system/system.mouse.lua new file mode 100644 index 0000000..395147c --- /dev/null +++ b/inc/system/system.mouse.lua @@ -0,0 +1,43 @@ +--- @section Mouse +local _mx, _my = 0, 0 +local _mleft, _mleft_prev = false, false +local _consumed = false + +--- Updates mouse state. Call once per frame. +--- @within Mouse +function Mouse.update() + _mleft_prev = _mleft + _consumed = false + local mt = {mouse()} + _mx, _my, _mleft = mt[1], mt[2], mt[3] +end + +--- Returns current mouse X position. +--- @within Mouse +function Mouse.x() return _mx end + +--- Returns current mouse Y position. +--- @within Mouse +function Mouse.y() return _my end + +--- Returns true if the mouse button was just pressed this frame (and not yet consumed). +--- @within Mouse +function Mouse.clicked() return _mleft and not _mleft_prev and not _consumed end + +--- Returns true if the mouse button is held down. +--- @within Mouse +function Mouse.held() return _mleft end + +--- Marks the current click as consumed so Mouse.clicked() won't fire again this frame. +--- @within Mouse +function Mouse.consume() _consumed = true end + +--- Returns true if the mouse is within the given rectangle. +--- @within Mouse +--- @param x number Left edge. +--- @param y number Top edge. +--- @param w number Width. +--- @param h number Height. +function Mouse.in_rect(x, y, w, h) + return _mx >= x and _mx < x + w and _my >= y and _my < y + h +end diff --git a/inc/system/system.ui.lua b/inc/system/system.ui.lua index e9f0cd4..f0dcb73 100644 --- a/inc/system/system.ui.lua +++ b/inc/system/system.ui.lua @@ -38,8 +38,12 @@ end --- @within UI --- @param items table A table of menu items.
--- @param selected_item number The current index of the selected item.
+--- @param[opt] x number Menu x position (required for mouse support).
+--- @param[opt] y number Menu y position (required for mouse support).
+--- @param[opt] centered boolean Whether the menu is centered horizontally.
--- @return number selected_item The updated index of the selected item. -function UI.update_menu(items, selected_item) +--- @return boolean mouse_confirmed True if the user clicked on a menu item. +function UI.update_menu(items, selected_item, x, y, centered) if Input.up() then Audio.sfx_beep() selected_item = selected_item - 1 @@ -53,7 +57,29 @@ function UI.update_menu(items, selected_item) selected_item = 1 end end - return selected_item + + if x ~= nil and y ~= nil and Mouse.clicked() then + local mx = Mouse.x() + local my = Mouse.y() + local menu_x = x + if centered then + local max_w = 0 + for _, item in ipairs(items) do + local w = print(item.label, 0, -10, 0, false, 1, false) + if w > max_w then max_w = w end + end + menu_x = (Config.screen.width - max_w) / 2 + end + for i, _ in ipairs(items) do + local item_y = y + (i - 1) * 10 + if my >= item_y and my < item_y + 10 and mx >= menu_x - 8 then + Mouse.consume() + return i, true + end + end + end + + return selected_item, false end --- Draws a bordered textbox with scrolling text. diff --git a/inc/window/window.audiotest.lua b/inc/window/window.audiotest.lua index 3c46419..36e5783 100644 --- a/inc/window/window.audiotest.lua +++ b/inc/window/window.audiotest.lua @@ -107,9 +107,9 @@ function AudioTestWindow.update() AudioTestWindow.menuitems = AudioTestWindow.generate_menuitems( AudioTestWindow.list_func, AudioTestWindow.index_func ) - elseif Input.menu_confirm() then + elseif Input.select() then AudioTestWindow.menuitems[AudioTestWindow.index_menu].decision() - elseif Input.menu_back() then + elseif Input.back() then AudioTestWindow.back() end end diff --git a/inc/window/window.configuration.lua b/inc/window/window.configuration.lua index 938da45..3823b18 100644 --- a/inc/window/window.configuration.lua +++ b/inc/window/window.configuration.lua @@ -65,7 +65,7 @@ end --- Updates configuration window logic. --- @within ConfigurationWindow function ConfigurationWindow.update() - if Input.menu_back() then + if Input.back() then GameWindow.set_state("menu") return end @@ -94,7 +94,7 @@ function ConfigurationWindow.update() control.set(new_value) end elseif control.type == "action_item" then - if Input.menu_confirm() then + if Input.select() then control.action() end end diff --git a/inc/window/window.continued.lua b/inc/window/window.continued.lua index e5f0ed9..976e6ef 100644 --- a/inc/window/window.continued.lua +++ b/inc/window/window.continued.lua @@ -26,7 +26,7 @@ end --- @within ContinuedWindow function ContinuedWindow.update() ContinuedWindow.timer = ContinuedWindow.timer - 1 - if ContinuedWindow.timer <= 0 or Input.select() or Input.menu_confirm() then + if ContinuedWindow.timer <= 0 or Input.select() or Input.select() then Window.set_current("menu") MenuWindow.refresh_menu_items() end diff --git a/inc/window/window.end.lua b/inc/window/window.end.lua index d3c08e1..291b054 100644 --- a/inc/window/window.end.lua +++ b/inc/window/window.end.lua @@ -52,7 +52,7 @@ function EndWindow.update() end end - if Input.menu_confirm() then + if Input.select() then Audio.sfx_select() if Context._end.selection == 1 then Context._end.state = "ending" @@ -69,7 +69,7 @@ function EndWindow.update() end end elseif Context._end.state == "ending" then - if Input.menu_confirm() then + if Input.select() then Window.set_current("menu") MenuWindow.refresh_menu_items() end diff --git a/inc/window/window.game.lua b/inc/window/window.game.lua index 3b3f06b..c143377 100644 --- a/inc/window/window.game.lua +++ b/inc/window/window.game.lua @@ -38,7 +38,7 @@ end --- @within GameWindow function GameWindow.update() Focus.update() - if Input.menu_back() then + if Input.back() then Window.set_current("menu") MenuWindow.refresh_menu_items() return @@ -60,7 +60,7 @@ function GameWindow.update() _selected_decision_index = 1 end - local new_selected_decision_index = Decision.update( + local new_selected_decision_index, mouse_confirmed = Decision.update( _available_decisions, _selected_decision_index ) @@ -69,7 +69,7 @@ function GameWindow.update() _selected_decision_index = new_selected_decision_index end - if Input.select() then + if Input.select() or mouse_confirmed then local selected_decision = _available_decisions[_selected_decision_index] if selected_decision and selected_decision.handle then Audio.sfx_select() diff --git a/inc/window/window.intro.brief.lua b/inc/window/window.intro.brief.lua index 11a0f8e..1d75389 100644 --- a/inc/window/window.intro.brief.lua +++ b/inc/window/window.intro.brief.lua @@ -31,7 +31,7 @@ function BriefIntroWindow.update() lines = lines + 1 end - if BriefIntroWindow.y < -lines * 8 or Input.select() or Input.menu_confirm() then + if BriefIntroWindow.y < -lines * 8 or Input.select() or Input.select() then Window.set_current("menu") end end diff --git a/inc/window/window.intro.title.lua b/inc/window/window.intro.title.lua index 825ace4..70f9105 100644 --- a/inc/window/window.intro.title.lua +++ b/inc/window/window.intro.title.lua @@ -30,7 +30,7 @@ end --- @within TitleIntroWindow function TitleIntroWindow.update() TitleIntroWindow.timer = TitleIntroWindow.timer - 1 - if TitleIntroWindow.timer <= 0 or Input.select() or Input.menu_confirm() then + if TitleIntroWindow.timer <= 0 or Input.select() or Input.select() then Window.set_current("intro_ttg") end end diff --git a/inc/window/window.intro.ttg.lua b/inc/window/window.intro.ttg.lua index c84208c..ee75c00 100644 --- a/inc/window/window.intro.ttg.lua +++ b/inc/window/window.intro.ttg.lua @@ -28,12 +28,12 @@ function TTGIntroWindow.update() end -- Count menu_back presses during the intro - if Input.menu_back() then + if Input.back() then TTGIntroWindow.space_count = TTGIntroWindow.space_count + 1 end TTGIntroWindow.timer = TTGIntroWindow.timer - 1 - if TTGIntroWindow.timer <= 0 or Input.menu_confirm() then + if TTGIntroWindow.timer <= 0 or Input.select() then -- Evaluate exactly 3 presses at the end of the intro if TTGIntroWindow.space_count == 3 then Context.test_mode = true diff --git a/inc/window/window.menu.lua b/inc/window/window.menu.lua index bcd8a8b..16554a9 100644 --- a/inc/window/window.menu.lua +++ b/inc/window/window.menu.lua @@ -1,5 +1,6 @@ --- @section MenuWindow local _menu_items = {} +local _click_timer = 0 --- Draws the menu window. --- @within MenuWindow @@ -22,9 +23,28 @@ end --- Updates the menu window logic. --- @within MenuWindow function MenuWindow.update() - Context.current_menu_item = UI.update_menu(_menu_items, Context.current_menu_item) + local menu_h = #_menu_items * 10 + local y = 10 + (Config.screen.height - 10 - 10 - menu_h) / 2 - if Input.menu_confirm() then + if _click_timer > 0 then + _click_timer = _click_timer - Context.delta_time + if _click_timer <= 0 then + _click_timer = 0 + local selected_item = _menu_items[Context.current_menu_item] + if selected_item and selected_item.decision then + selected_item.decision() + end + end + return + end + + local new_item, mouse_confirmed = UI.update_menu(_menu_items, Context.current_menu_item, 0, y, true) + Context.current_menu_item = new_item + + if mouse_confirmed then + Audio.sfx_select() + _click_timer = 0.5 + elseif Input.select() then local selected_item = _menu_items[Context.current_menu_item] if selected_item and selected_item.decision then Audio.sfx_select() @@ -115,4 +135,5 @@ function MenuWindow.refresh_menu_items() table.insert(_menu_items, {label = "Exit", decision = MenuWindow.exit}) Context.current_menu_item = 1 + _click_timer = 0 end diff --git a/inc/window/window.minigame.ddr.lua b/inc/window/window.minigame.ddr.lua index 8db1962..2cba4fd 100644 --- a/inc/window/window.minigame.ddr.lua +++ b/inc/window/window.minigame.ddr.lua @@ -355,6 +355,17 @@ function MinigameDDRWindow.update() right = Input.right() } + if Mouse.clicked() then + local mx = Mouse.x() + local my = Mouse.y() + for _, target in ipairs(mg.target_arrows) do + if mx >= target.x and mx < target.x + mg.arrow_size and + my >= mg.target_y and my < mg.target_y + mg.arrow_size then + input_map[target.dir] = true + end + end + end + for dir, pressed in pairs(input_map) do if pressed and mg.input_cooldowns[dir] == 0 then mg.input_cooldowns[dir] = mg.input_cooldown_duration diff --git a/inc/window/window.minigame.mash.lua b/inc/window/window.minigame.mash.lua index c39bfd9..0d8af73 100644 --- a/inc/window/window.minigame.mash.lua +++ b/inc/window/window.minigame.mash.lua @@ -83,7 +83,14 @@ function MinigameButtonMashWindow.update() return end - if Input.select() then + local mouse_on_button = false + if Mouse.clicked() then + local dx = Mouse.x() - mg.button_x + local dy = Mouse.y() - mg.button_y + mouse_on_button = (dx * dx + dy * dy) <= (mg.button_size * mg.button_size) + end + + if Input.select() or mouse_on_button then Audio.sfx_drum_high() mg.bar_fill = mg.bar_fill + mg.fill_per_press diff --git a/inc/window/window.minigame.rhythm.lua b/inc/window/window.minigame.rhythm.lua index 8e13276..3f8abff 100644 --- a/inc/window/window.minigame.rhythm.lua +++ b/inc/window/window.minigame.rhythm.lua @@ -95,7 +95,14 @@ function MinigameRhythmWindow.update() if mg.press_cooldown > 0 then mg.press_cooldown = mg.press_cooldown - 1 end - if Input.select() and mg.press_cooldown == 0 then + local mouse_on_button = false + if Mouse.clicked() then + local dx = Mouse.x() - mg.button_x + local dy = Mouse.y() - mg.button_y + mouse_on_button = (dx * dx + dy * dy) <= (mg.button_size * mg.button_size) + end + + if (Input.select() or mouse_on_button) and mg.press_cooldown == 0 then mg.button_pressed_timer = mg.button_press_duration mg.press_cooldown = mg.press_cooldown_duration local target_left = mg.target_center - (mg.target_width / 2) diff --git a/inc/window/window.popup.lua b/inc/window/window.popup.lua index b7ec674..52bdfc5 100644 --- a/inc/window/window.popup.lua +++ b/inc/window/window.popup.lua @@ -28,7 +28,7 @@ end --- @within PopupWindow function PopupWindow.update() if Context.popup.show then - if Input.menu_confirm() or Input.menu_back() then + if Input.select() or Input.back() then PopupWindow.hide() end end -- 2.49.1 From 589b225ab01c186ded57c09910ca8138717c9c28 Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Thu, 2 Apr 2026 18:45:12 +0200 Subject: [PATCH 04/17] remove configuration menu --- .luacheckrc | 1 - impostor.inc | 1 - inc/window/window.configuration.lua | 102 ---------------------------- inc/window/window.menu.lua | 8 --- inc/window/window.register.lua | 3 - 5 files changed, 115 deletions(-) delete mode 100644 inc/window/window.configuration.lua diff --git a/.luacheckrc b/.luacheckrc index 7162e25..63d603f 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -30,7 +30,6 @@ globals = { "MenuWindow", "GameWindow", "PopupWindow", - "ConfigurationWindow", "AudioTestWindow", "MinigameButtonMashWindow", "MinigameRhythmWindow", diff --git a/impostor.inc b/impostor.inc index 64da4c0..af58622 100644 --- a/impostor.inc +++ b/impostor.inc @@ -70,7 +70,6 @@ window/window.intro.title.lua window/window.intro.ttg.lua window/window.intro.brief.lua window/window.menu.lua -window/window.configuration.lua window/window.audiotest.lua window/window.popup.lua window/window.minigame.mash.lua diff --git a/inc/window/window.configuration.lua b/inc/window/window.configuration.lua deleted file mode 100644 index 3823b18..0000000 --- a/inc/window/window.configuration.lua +++ /dev/null @@ -1,102 +0,0 @@ ---- @section ConfigurationWindow -ConfigurationWindow.controls = {} -ConfigurationWindow.selected_control = 1 - ---- Initializes configuration window. ---- @within ConfigurationWindow -function ConfigurationWindow.init() - ConfigurationWindow.controls = { - { - label = "Save", - action = function() Config.save() end, - type = "action_item" - }, - { - label = "Restore Defaults", - action = function() Config.reset() end, - type = "action_item" - }, - } -end - ---- Draws configuration window. ---- @within ConfigurationWindow -function ConfigurationWindow.draw() - UI.draw_top_bar("Configuration") - - local x_start = 10 - local y_start = 40 - local x_value_right_align = Config.screen.width - 10 - local char_width = 4 - for i, control in ipairs(ConfigurationWindow.controls) do - local current_y = y_start + (i - 1) * 12 - local color = Config.colors.light_blue - if control.type == "numeric_stepper" then - local value = control.get() - local label_text = control.label - local value_text = string.format(control.format, value) - local value_x = x_value_right_align - (#value_text * char_width) - - if i == ConfigurationWindow.selected_control then - color = Config.colors.item - Print.text("<", x_start - 8, current_y, color) - Print.text(label_text, x_start, current_y, color) - Print.text(value_text, value_x, current_y, color) - Print.text(">", x_value_right_align + 4, current_y, color) - else - Print.text(label_text, x_start, current_y, color) - Print.text(value_text, value_x, current_y, color) - end - elseif control.type == "action_item" then - local label_text = control.label - if i == ConfigurationWindow.selected_control then - color = Config.colors.item - Print.text("<", x_start - 8, current_y, color) - Print.text(label_text, x_start, current_y, color) - Print.text(">", x_start + 8 + (#label_text * char_width) + 4, current_y, color) - else - Print.text(label_text, x_start, current_y, color) - end - end - end - Print.text("Press B to go back", x_start, 120, Config.colors.light_grey) -end - ---- Updates configuration window logic. ---- @within ConfigurationWindow -function ConfigurationWindow.update() - if Input.back() then - GameWindow.set_state("menu") - return - end - - if Input.up() then - ConfigurationWindow.selected_control = ConfigurationWindow.selected_control - 1 - if ConfigurationWindow.selected_control < 1 then - ConfigurationWindow.selected_control = #ConfigurationWindow.controls - end - elseif Input.down() then - ConfigurationWindow.selected_control = ConfigurationWindow.selected_control + 1 - if ConfigurationWindow.selected_control > #ConfigurationWindow.controls then - ConfigurationWindow.selected_control = 1 - end - end - - local control = ConfigurationWindow.controls[ConfigurationWindow.selected_control] - if control then - if control.type == "numeric_stepper" then - local current_value = control.get() - if Input.left() then - local new_value = math.max(control.min, current_value - control.step) - control.set(new_value) - elseif Input.right() then - local new_value = math.min(control.max, current_value + control.step) - control.set(new_value) - end - elseif control.type == "action_item" then - if Input.select() then - control.action() - end - end - end -end diff --git a/inc/window/window.menu.lua b/inc/window/window.menu.lua index 16554a9..5903f42 100644 --- a/inc/window/window.menu.lua +++ b/inc/window/window.menu.lua @@ -84,13 +84,6 @@ function MenuWindow.exit() exit() end ---- Opens the configuration menu. ---- @within MenuWindow -function MenuWindow.configuration() - ConfigurationWindow.init() - GameWindow.set_state("configuration") -end - --- Opens the audio test menu. --- @within MenuWindow function MenuWindow.audio_test() @@ -124,7 +117,6 @@ function MenuWindow.refresh_menu_items() table.insert(_menu_items, {label = "New Game", decision = MenuWindow.new_game}) table.insert(_menu_items, {label = "Load Game", decision = MenuWindow.load_game}) - table.insert(_menu_items, {label = "Configuration", decision = MenuWindow.configuration}) if Context.test_mode then table.insert(_menu_items, {label = "Audio Test", decision = MenuWindow.audio_test}) diff --git a/inc/window/window.register.lua b/inc/window/window.register.lua index 2e9407c..c293d6c 100644 --- a/inc/window/window.register.lua +++ b/inc/window/window.register.lua @@ -16,9 +16,6 @@ Window.register("game", GameWindow) PopupWindow = {} Window.register("popup", PopupWindow) -ConfigurationWindow = {} -Window.register("configuration", ConfigurationWindow) - AudioTestWindow = {} Window.register("audiotest", AudioTestWindow) -- 2.49.1 From 10316d3075db1029daf8bf81baf6c6e96b12fa0f Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Thu, 2 Apr 2026 18:51:17 +0200 Subject: [PATCH 05/17] Controls menu --- .luacheckrc | 1 + impostor.inc | 1 + inc/system/system.input.lua | 7 +++--- inc/window/window.controls.lua | 44 ++++++++++++++++++++++++++++++++++ inc/window/window.menu.lua | 7 ++++++ inc/window/window.register.lua | 3 +++ 6 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 inc/window/window.controls.lua diff --git a/.luacheckrc b/.luacheckrc index 63d603f..c8dfabd 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -30,6 +30,7 @@ globals = { "MenuWindow", "GameWindow", "PopupWindow", + "ControlsWindow", "AudioTestWindow", "MinigameButtonMashWindow", "MinigameRhythmWindow", diff --git a/impostor.inc b/impostor.inc index af58622..8b09814 100644 --- a/impostor.inc +++ b/impostor.inc @@ -70,6 +70,7 @@ window/window.intro.title.lua window/window.intro.ttg.lua window/window.intro.brief.lua window/window.menu.lua +window/window.controls.lua window/window.audiotest.lua window/window.popup.lua window/window.minigame.mash.lua diff --git a/inc/system/system.input.lua b/inc/system/system.input.lua index 3c015c2..9fe0ae5 100644 --- a/inc/system/system.input.lua +++ b/inc/system/system.input.lua @@ -3,7 +3,8 @@ local INPUT_KEY_UP = 0 local INPUT_KEY_DOWN = 1 local INPUT_KEY_LEFT = 2 local INPUT_KEY_RIGHT = 3 -local INPUT_KEY_Y = 7 +local INPUT_KEY_A = 4 +local INPUT_KEY_B = 5 local INPUT_KEY_SPACE = 48 local INPUT_KEY_BACKSPACE = 51 @@ -21,7 +22,7 @@ function Input.left() return btnp(INPUT_KEY_LEFT) end function Input.right() return btnp(INPUT_KEY_RIGHT) end --- Checks if Select is pressed. --- @within Input -function Input.select() return btnp(INPUT_KEY_Y) or keyp(INPUT_KEY_SPACE) or Mouse.clicked() end +function Input.select() return btnp(INPUT_KEY_A) or keyp(INPUT_KEY_SPACE) or Mouse.clicked() end --- Checks if Back is pressed. --- @within Input -function Input.back() return keyp(INPUT_KEY_BACKSPACE) end +function Input.back() return btnp(INPUT_KEY_B) or keyp(INPUT_KEY_BACKSPACE) end diff --git a/inc/window/window.controls.lua b/inc/window/window.controls.lua new file mode 100644 index 0000000..1a4cd89 --- /dev/null +++ b/inc/window/window.controls.lua @@ -0,0 +1,44 @@ +--- @section ControlsWindow +local _controls = { + { action = "Navigate", keyboard = "Arrow keys", gamepad = "D-pad" }, + { action = "Select / OK", keyboard = "Space", gamepad = "Z button" }, + { action = "Back", keyboard = "Backspace", gamepad = "B button" }, + { action = "Click", keyboard = "Mouse", gamepad = "" }, +} + +--- Draws the controls window. +--- @within ControlsWindow +function ControlsWindow.draw() + UI.draw_top_bar("Controls") + + local col_action = 4 + local col_keyboard = 80 + local col_gamepad = 170 + local row_h = 10 + local y_header = 18 + local y_start = 30 + + Print.text("Action", col_action, y_header, Config.colors.light_grey) + Print.text("Keyboard", col_keyboard, y_header, Config.colors.light_grey) + Print.text("Gamepad", col_gamepad, y_header, Config.colors.light_grey) + line(col_action, y_header + 8, Config.screen.width - 4, y_header + 8, Config.colors.dark_grey) + + for i, entry in ipairs(_controls) do + local y = y_start + (i - 1) * row_h + Print.text(entry.action, col_action, y, Config.colors.white) + Print.text(entry.keyboard, col_keyboard, y, Config.colors.light_blue) + if entry.gamepad ~= "" then + Print.text(entry.gamepad, col_gamepad, y, Config.colors.light_blue) + end + end + + Print.text("Space / Z button or click to go back", col_action, Config.screen.height - 10, Config.colors.light_grey) +end + +--- Updates the controls window logic. +--- @within ControlsWindow +function ControlsWindow.update() + if Input.back() or Input.select() then + Window.set_current("menu") + end +end diff --git a/inc/window/window.menu.lua b/inc/window/window.menu.lua index 5903f42..6199db6 100644 --- a/inc/window/window.menu.lua +++ b/inc/window/window.menu.lua @@ -84,6 +84,12 @@ function MenuWindow.exit() exit() end +--- Opens the controls screen. +--- @within MenuWindow +function MenuWindow.controls() + Window.set_current("controls") +end + --- Opens the audio test menu. --- @within MenuWindow function MenuWindow.audio_test() @@ -117,6 +123,7 @@ function MenuWindow.refresh_menu_items() table.insert(_menu_items, {label = "New Game", decision = MenuWindow.new_game}) table.insert(_menu_items, {label = "Load Game", decision = MenuWindow.load_game}) + table.insert(_menu_items, {label = "Controls", decision = MenuWindow.controls}) if Context.test_mode then table.insert(_menu_items, {label = "Audio Test", decision = MenuWindow.audio_test}) diff --git a/inc/window/window.register.lua b/inc/window/window.register.lua index c293d6c..a3388ac 100644 --- a/inc/window/window.register.lua +++ b/inc/window/window.register.lua @@ -16,6 +16,9 @@ Window.register("game", GameWindow) PopupWindow = {} Window.register("popup", PopupWindow) +ControlsWindow = {} +Window.register("controls", ControlsWindow) + AudioTestWindow = {} Window.register("audiotest", AudioTestWindow) -- 2.49.1 From b337ae8516757407ebbcdf69a1505ad7e1b27576 Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Thu, 2 Apr 2026 18:57:24 +0200 Subject: [PATCH 06/17] main menu tweaks --- inc/system/system.print.lua | 4 +- inc/window/window.menu.lua | 84 ++++++++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/inc/system/system.print.lua b/inc/system/system.print.lua index b38b67d..ffbeba1 100644 --- a/inc/system/system.print.lua +++ b/inc/system/system.print.lua @@ -10,7 +10,7 @@ function Print.text(text, x, y, color, fixed, scale) local shadow_color = Config.colors.black if color == shadow_color then shadow_color = Config.colors.light_grey end scale = scale or 1 - print(text, x + 1, y + 1, shadow_color, fixed, scale) + print(text, x + scale, y + scale, shadow_color, fixed, scale) print(text, x, y, color, fixed, scale) end @@ -24,7 +24,7 @@ end --- @param[opt] scale number The scaling factor.
function Print.text_center(text, x, y, color, fixed, scale) scale = scale or 1 - local text_width = print(text, 0, -6, 0, fixed, scale) + local text_width = print(text, 0, -6 * scale, 0, fixed, scale) local centered_x = x - (text_width / 2) Print.text(text, centered_x, y, color, fixed, scale) end diff --git a/inc/window/window.menu.lua b/inc/window/window.menu.lua index 6199db6..62afbf1 100644 --- a/inc/window/window.menu.lua +++ b/inc/window/window.menu.lua @@ -1,19 +1,62 @@ --- @section MenuWindow local _menu_items = {} local _click_timer = 0 +local _anim = 0 +local _menu_max_w = 0 +local ANIM_SPEED = 2.5 +local HEADER_H = 28 + +--- Calculates the animated x position of the menu block. +--- @within MenuWindow +--- @return number x The left edge x coordinate for the menu. +function MenuWindow.calc_menu_x() + local center_start = Config.screen.width / 2 + local center_end = Config.screen.width * 0.72 + local center = center_start + _anim * (center_end - center_start) + return math.floor(center - _menu_max_w / 2) +end + +--- Draws the header with title and separator. +--- @within MenuWindow +function MenuWindow.draw_header() + rect(0, 0, Config.screen.width, HEADER_H, Config.colors.dark_grey) + rect(0, HEADER_H - 2, Config.screen.width, 2, Config.colors.light_blue) + + local cx = Config.screen.width / 2 + local subtitle = "Definitely not an" + if Context.test_mode then subtitle = subtitle .. " [TEST]" end + local sub_w = print(subtitle, 0, -6, 0, false, 1, true) + print(subtitle, math.floor(cx - sub_w / 2) + 1, 5, Config.colors.dark_grey, false, 1, true) + print(subtitle, math.floor(cx - sub_w / 2), 4, Config.colors.light_grey, false, 1, true) + + Print.text_center("IMPOSTOR", cx, 12, Config.colors.item, false, 2) +end + +--- Draws the 4x scaled Norman sprite on the left side of the screen. +--- @within MenuWindow +function MenuWindow.draw_norman() + local nx = math.floor(Config.screen.width * 0.45 / 2) - 32 + local ny = HEADER_H + math.floor((Config.screen.height - HEADER_H - 96) / 2) + spr(272, nx, ny, 0, 4) + spr(273, nx + 32, ny, 0, 4) + spr(288, nx, ny + 32, 0, 4) + spr(289, nx + 32, ny + 32, 0, 4) + spr(304, nx, ny + 64, 0, 4) + spr(305, nx + 32, ny + 64, 0, 4) +end --- Draws the menu window. --- @within MenuWindow function MenuWindow.draw() - local title = "Definitely not an Impostor" - if Context.test_mode then - title = title .. " (TEST MODE)" + MenuWindow.draw_header() + + if _anim > 0 then + MenuWindow.draw_norman() end - UI.draw_top_bar(title) local menu_h = #_menu_items * 10 - local y = 10 + (Config.screen.height - 10 - 10 - menu_h) / 2 - UI.draw_menu(_menu_items, Context.current_menu_item, 0, y, true) + local y = HEADER_H + math.floor((Config.screen.height - HEADER_H - 10 - menu_h) / 2) + UI.draw_menu(_menu_items, Context.current_menu_item, MenuWindow.calc_menu_x(), y, false) local ttg_text = "TTG" local ttg_w = print(ttg_text, 0, -10, 0, false, 1, false) @@ -23,8 +66,12 @@ end --- Updates the menu window logic. --- @within MenuWindow function MenuWindow.update() + if _anim < 1 then + _anim = math.min(1, _anim + ANIM_SPEED * Context.delta_time) + end + local menu_h = #_menu_items * 10 - local y = 10 + (Config.screen.height - 10 - 10 - menu_h) / 2 + local y = HEADER_H + math.floor((Config.screen.height - HEADER_H - 10 - menu_h) / 2) if _click_timer > 0 then _click_timer = _click_timer - Context.delta_time @@ -38,7 +85,7 @@ function MenuWindow.update() return end - local new_item, mouse_confirmed = UI.update_menu(_menu_items, Context.current_menu_item, 0, y, true) + local new_item, mouse_confirmed = UI.update_menu(_menu_items, Context.current_menu_item, MenuWindow.calc_menu_x(), y, false) Context.current_menu_item = new_item if mouse_confirmed then @@ -104,7 +151,7 @@ function MenuWindow.continued() GameWindow.set_state("continued") end ---- Opens the minigame ddr test menu. +--- Opens the DDR minigame test. --- @within MenuWindow function MenuWindow.ddr_test() AudioTestWindow.init() @@ -112,27 +159,34 @@ function MenuWindow.ddr_test() MinigameDDRWindow.start("menu", "generated", { special_mode = "only_nothing" }) end ---- Refreshes menu items. +--- Refreshes the list of menu items based on current game state. --- @within MenuWindow function MenuWindow.refresh_menu_items() _menu_items = {} if Context.game_in_progress then table.insert(_menu_items, {label = "Resume Game", decision = MenuWindow.resume_game}) - table.insert(_menu_items, {label = "Save Game", decision = MenuWindow.save_game}) + table.insert(_menu_items, {label = "Save Game", decision = MenuWindow.save_game}) end - table.insert(_menu_items, {label = "New Game", decision = MenuWindow.new_game}) + table.insert(_menu_items, {label = "New Game", decision = MenuWindow.new_game}) table.insert(_menu_items, {label = "Load Game", decision = MenuWindow.load_game}) - table.insert(_menu_items, {label = "Controls", decision = MenuWindow.controls}) + table.insert(_menu_items, {label = "Controls", decision = MenuWindow.controls}) if Context.test_mode then - table.insert(_menu_items, {label = "Audio Test", decision = MenuWindow.audio_test}) + table.insert(_menu_items, {label = "Audio Test", decision = MenuWindow.audio_test}) table.insert(_menu_items, {label = "To Be Continued...", decision = MenuWindow.continued}) - table.insert(_menu_items, {label = "DDR Test", decision = MenuWindow.ddr_test}) + table.insert(_menu_items, {label = "DDR Test", decision = MenuWindow.ddr_test}) end table.insert(_menu_items, {label = "Exit", decision = MenuWindow.exit}) + _menu_max_w = 0 + for _, item in ipairs(_menu_items) do + local w = print(item.label, 0, -10, 0, false, 1, false) + if w > _menu_max_w then _menu_max_w = w end + end + Context.current_menu_item = 1 _click_timer = 0 + _anim = 0 end -- 2.49.1 From 211af18c268da0b17490d4be8a7503eefe659945 Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Thu, 2 Apr 2026 21:51:43 +0200 Subject: [PATCH 07/17] debug mode fix --- inc/system/system.input.lua | 4 ++++ inc/window/window.intro.ttg.lua | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/inc/system/system.input.lua b/inc/system/system.input.lua index 9fe0ae5..5f0cc15 100644 --- a/inc/system/system.input.lua +++ b/inc/system/system.input.lua @@ -6,6 +6,7 @@ local INPUT_KEY_RIGHT = 3 local INPUT_KEY_A = 4 local INPUT_KEY_B = 5 local INPUT_KEY_SPACE = 48 +local INPUT_KEY_ENTER = 50 local INPUT_KEY_BACKSPACE = 51 --- Checks if Up is pressed. @@ -26,3 +27,6 @@ function Input.select() return btnp(INPUT_KEY_A) or keyp(INPUT_KEY_SPACE) or Mou --- Checks if Back is pressed. --- @within Input function Input.back() return btnp(INPUT_KEY_B) or keyp(INPUT_KEY_BACKSPACE) end +--- Checks if Enter is pressed. +--- @within Input +function Input.enter() return keyp(INPUT_KEY_ENTER) end diff --git a/inc/window/window.intro.ttg.lua b/inc/window/window.intro.ttg.lua index ee75c00..3fd4378 100644 --- a/inc/window/window.intro.ttg.lua +++ b/inc/window/window.intro.ttg.lua @@ -27,8 +27,8 @@ function TTGIntroWindow.update() TTGIntroWindow.glitch_started = true end - -- Count menu_back presses during the intro - if Input.back() then + -- Count enter presses during the intro + if Input.enter() then TTGIntroWindow.space_count = TTGIntroWindow.space_count + 1 end -- 2.49.1 From 8921f02821313bfe363906719b74fce0cff2673f Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Thu, 2 Apr 2026 22:12:58 +0200 Subject: [PATCH 08/17] mouse handling refact --- .gitignore | 1 + inc/decision/decision.manager.lua | 33 ++++++++++++--------------- inc/system/system.mouse.lua | 33 +++++++++++++++++++++++++++ inc/system/system.ui.lua | 8 ++----- inc/window/window.minigame.ddr.lua | 11 +++------ inc/window/window.minigame.mash.lua | 7 +----- inc/window/window.minigame.rhythm.lua | 7 +----- 7 files changed, 55 insertions(+), 45 deletions(-) diff --git a/.gitignore b/.gitignore index b381695..36a1642 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ docs minify.lua *.tic *.zip +NOTES_* diff --git a/inc/decision/decision.manager.lua b/inc/decision/decision.manager.lua index 65412bc..b0ce2c1 100644 --- a/inc/decision/decision.manager.lua +++ b/inc/decision/decision.manager.lua @@ -144,25 +144,20 @@ function Decision.update(decisions, selected_decision_index) selected_decision_index = Util.safeindex(decisions, selected_decision_index + 1) end - if Mouse.clicked() then - local mx = Mouse.x() - local my = Mouse.y() - local bar_height = 16 - local bar_y = Config.screen.height - bar_height - if my >= bar_y then - if mx < 15 then - Audio.sfx_beep() - Mouse.consume() - selected_decision_index = Util.safeindex(decisions, selected_decision_index - 1) - elseif mx > Config.screen.width - 15 then - Audio.sfx_beep() - Mouse.consume() - selected_decision_index = Util.safeindex(decisions, selected_decision_index + 1) - else - Mouse.consume() - return selected_decision_index, true - end - end + local bar_h = 16 + local bar_y = Config.screen.height - bar_h + local prev_zone = { x = 0, y = bar_y, w = 15, h = bar_h } + local next_zone = { x = Config.screen.width-15, y = bar_y, w = 15, h = bar_h } + local confirm_zone = { x = 15, y = bar_y, w = Config.screen.width-30, h = bar_h } + + if Mouse.zone(prev_zone) then + Audio.sfx_beep() + selected_decision_index = Util.safeindex(decisions, selected_decision_index - 1) + elseif Mouse.zone(next_zone) then + Audio.sfx_beep() + selected_decision_index = Util.safeindex(decisions, selected_decision_index + 1) + elseif Mouse.zone(confirm_zone) then + return selected_decision_index, true end return selected_decision_index, false diff --git a/inc/system/system.mouse.lua b/inc/system/system.mouse.lua index 395147c..3140ffa 100644 --- a/inc/system/system.mouse.lua +++ b/inc/system/system.mouse.lua @@ -41,3 +41,36 @@ function Mouse.consume() _consumed = true end function Mouse.in_rect(x, y, w, h) return _mx >= x and _mx < x + w and _my >= y and _my < y + h end + +--- Returns true if the mouse is within the given circle. +--- @within Mouse +--- @param cx number Center x. +--- @param cy number Center y. +--- @param r number Radius. +function Mouse.in_circle(cx, cy, r) + local dx = _mx - cx + local dy = _my - cy + return (dx * dx + dy * dy) <= (r * r) +end + +--- Returns true if the mouse was clicked inside the given rectangle, and consumes the click. +--- @within Mouse +--- @param rect table A table with fields: x, y, w, h. +function Mouse.zone(rect) + if Mouse.clicked() and Mouse.in_rect(rect.x, rect.y, rect.w, rect.h) then + Mouse.consume() + return true + end + return false +end + +--- Returns true if the mouse was clicked inside the given circle, and consumes the click. +--- @within Mouse +--- @param circle table A table with fields: x, y, r. +function Mouse.zone_circle(circle) + if Mouse.clicked() and Mouse.in_circle(circle.x, circle.y, circle.r) then + Mouse.consume() + return true + end + return false +end diff --git a/inc/system/system.ui.lua b/inc/system/system.ui.lua index f0dcb73..4fb219b 100644 --- a/inc/system/system.ui.lua +++ b/inc/system/system.ui.lua @@ -58,9 +58,7 @@ function UI.update_menu(items, selected_item, x, y, centered) end end - if x ~= nil and y ~= nil and Mouse.clicked() then - local mx = Mouse.x() - local my = Mouse.y() + if x ~= nil and y ~= nil then local menu_x = x if centered then local max_w = 0 @@ -71,9 +69,7 @@ function UI.update_menu(items, selected_item, x, y, centered) menu_x = (Config.screen.width - max_w) / 2 end for i, _ in ipairs(items) do - local item_y = y + (i - 1) * 10 - if my >= item_y and my < item_y + 10 and mx >= menu_x - 8 then - Mouse.consume() + if Mouse.zone({ x = menu_x - 8, y = y + (i-1) * 10, w = Config.screen.width, h = 10 }) then return i, true end end diff --git a/inc/window/window.minigame.ddr.lua b/inc/window/window.minigame.ddr.lua index 2cba4fd..5c92d1e 100644 --- a/inc/window/window.minigame.ddr.lua +++ b/inc/window/window.minigame.ddr.lua @@ -355,14 +355,9 @@ function MinigameDDRWindow.update() right = Input.right() } - if Mouse.clicked() then - local mx = Mouse.x() - local my = Mouse.y() - for _, target in ipairs(mg.target_arrows) do - if mx >= target.x and mx < target.x + mg.arrow_size and - my >= mg.target_y and my < mg.target_y + mg.arrow_size then - input_map[target.dir] = true - end + for _, target in ipairs(mg.target_arrows) do + if Mouse.zone({ x = target.x, y = mg.target_y, w = mg.arrow_size, h = mg.arrow_size }) then + input_map[target.dir] = true end end diff --git a/inc/window/window.minigame.mash.lua b/inc/window/window.minigame.mash.lua index 0d8af73..ec52b9b 100644 --- a/inc/window/window.minigame.mash.lua +++ b/inc/window/window.minigame.mash.lua @@ -83,12 +83,7 @@ function MinigameButtonMashWindow.update() return end - local mouse_on_button = false - if Mouse.clicked() then - local dx = Mouse.x() - mg.button_x - local dy = Mouse.y() - mg.button_y - mouse_on_button = (dx * dx + dy * dy) <= (mg.button_size * mg.button_size) - end + local mouse_on_button = Mouse.zone_circle({ x = mg.button_x, y = mg.button_y, r = mg.button_size }) if Input.select() or mouse_on_button then Audio.sfx_drum_high() diff --git a/inc/window/window.minigame.rhythm.lua b/inc/window/window.minigame.rhythm.lua index 3f8abff..15a893c 100644 --- a/inc/window/window.minigame.rhythm.lua +++ b/inc/window/window.minigame.rhythm.lua @@ -95,12 +95,7 @@ function MinigameRhythmWindow.update() if mg.press_cooldown > 0 then mg.press_cooldown = mg.press_cooldown - 1 end - local mouse_on_button = false - if Mouse.clicked() then - local dx = Mouse.x() - mg.button_x - local dy = Mouse.y() - mg.button_y - mouse_on_button = (dx * dx + dy * dy) <= (mg.button_size * mg.button_size) - end + local mouse_on_button = Mouse.zone_circle({ x = mg.button_x, y = mg.button_y, r = mg.button_size }) if (Input.select() or mouse_on_button) and mg.press_cooldown == 0 then mg.button_pressed_timer = mg.button_press_duration -- 2.49.1 From a4a6ad2ab224948ab58b5e6ee71c5fa245e18534 Mon Sep 17 00:00:00 2001 From: Bela Mezo Date: Thu, 9 Apr 2026 13:46:05 +0200 Subject: [PATCH 09/17] Introduces the transparent color. The default is the pink. --- inc/init/init.config.lua | 3 ++- inc/sprite/sprite.manager.lua | 2 +- inc/system/system.main.lua | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/inc/init/init.config.lua b/inc/init/init.config.lua index 626cd7b..815daae 100644 --- a/inc/init/init.config.lua +++ b/inc/init/init.config.lua @@ -17,7 +17,8 @@ function Config.initial_data() blue = 3, white = 4, item = 7, - meter_bg = 1 + meter_bg = 1, + transparent = 12 }, timing = { minigame_win_duration = 180 diff --git a/inc/sprite/sprite.manager.lua b/inc/sprite/sprite.manager.lua index ad85dce..8453484 100644 --- a/inc/sprite/sprite.manager.lua +++ b/inc/sprite/sprite.manager.lua @@ -3,7 +3,7 @@ local _sprites = {} local _active_sprites = {} local function draw_sprite_instance(sprite_data, params) - local colorkey = params.colorkey or sprite_data.colorkey or 0 + local colorkey = params.colorkey or sprite_data.colorkey or Config.colors.transparent local scale = params.scale or sprite_data.scale or 1 local flip_x = params.flip_x or sprite_data.flip_x or 0 local flip_y = params.flip_y or sprite_data.flip_y or 0 diff --git a/inc/system/system.main.lua b/inc/system/system.main.lua index 888ef84..cd1ad3f 100644 --- a/inc/system/system.main.lua +++ b/inc/system/system.main.lua @@ -7,6 +7,7 @@ local initialized_game = false local function init_game() if initialized_game then return false end Context.reset() + poke(0x03FF, 1 << Config.colors.transparent) -- Set the default transparent color in the palette Window.set_current("intro_title") -- Set initial window using new manager MenuWindow.refresh_menu_items() initialized_game = true -- 2.49.1 From 4b5f11969b537685ab4804922dc25e31ea4f87b3 Mon Sep 17 00:00:00 2001 From: Bela Mezo Date: Thu, 9 Apr 2026 13:47:24 +0200 Subject: [PATCH 10/17] Changes the Norman's silhouette. Change the background color of the sprites to pink. --- inc/meta/meta.assets.lua | 376 ++++++++++++++++++++++++++------------- 1 file changed, 254 insertions(+), 122 deletions(-) diff --git a/inc/meta/meta.assets.lua b/inc/meta/meta.assets.lua index cda7216..cd60fcc 100644 --- a/inc/meta/meta.assets.lua +++ b/inc/meta/meta.assets.lua @@ -251,130 +251,262 @@ -- 247:0000000011111110000000003333301013131010313130101313101031313000 -- -- --- 002:00000000000000000000444400044444000444440044ffff004fffff004f3333 --- 003:0000000000000000441600004242600044241000ff426000fff4100033f26000 --- 004:00000333000035550003655500365555003555ff00356fff00365f3f00355fff --- 005:33000000553000005563000055563000ff553000fff53000f3f63000fff53000 --- 008:0000005a00005a55000055a50000a55a00005a5700005533000575f30000757f --- 009:55a50000a55a50005a55a00057555500fff7a5003f335a00fff3f500fffffa00 --- 016:0000000000000000000000000000003000000353000035350003535100353535 --- 017:0000000000000000000000003000000053300000151300005151300015151300 --- 018:004f99ff000fffff0000ff3300000fff00003666000355550035652503163555 --- 019:99f41000fff26000ff600000f600000063300000555330005555530055535530 --- 020:00356f6f003655f60365511f3653122f3531222f363221220532232203322322 --- 021:f6f530006f563000f1156300f2215300f2226300221233002232130022121300 --- 022:000000000000005100000155000055150000157f0000551300057f3f00017fff --- 023:00000000555000005155000015515000ff7f5100ff31f200fff3ff0033fff200 --- 024:0000057f00000005000000050000559900055911005599110055119900551199 --- 025:f3ff5000fff500005f5000004415100077995100449915007711955044119550 --- 026:00000000000001330001331300031333001333330031f7f7001133390031999f --- 027:0000000013310000131330003333130033333100f7f113003337310099975300 --- 028:000000000000000000000a77000057770005777700577777005775a50077a7ff --- 029:0000000000000000777a0000777750007777750077777750a5a57750fff7a770 --- 030:000000000000051500001151000555550001517f000557ff0001ff3f0007ff1f --- 031:00000000150000005110000055500000f7110000ff750000f3f10000f1f50000 --- 032:0033535100353533003351ff00351f3f0003ff3f0003ffff00003ff3000323ff --- 033:5555530033555300ff155300f3f15300f3ff3000ffff30003ff30000ff323000 --- 034:036135250316355503613525031633110333331103f333330333333300033333 --- 035:55565530555355305556553013335530133333303333ff303333333033330000 --- 036:00322322003223330033331a003ff31a003ff3a1003333a100003a1a00003a1a --- 037:223213003332130011133300111f300011133000111300001113000011130000 --- 038:000007ff0001117f0016171f0155175501561755155117555f7157555ff15755 --- 039:fffff700333f2000ffff7100555571105555716155557111555575ff555575ff --- 040:005599110055991100ff533300fff511007fff110007f5110000311300003113 --- 041:479915504499155047333f7014113ff011113f70111130003311300003113000 --- 042:0035777f0001776600005777000000550088885508bbb84508bbb8448bb8b844 --- 043:77775300677500007750000055880000558b8000548bb800228bbb80428b8b80 --- 044:005a7f3f0057ff3f07f7ffff07757fdf077a57fd0575357f005a66a70006aa6f --- 045:ff3f7a50ff3ff750fffff777ffdf7577ddf75a77ff75157577a66a50ff6aa600 --- 046:0005ffff00005ff3000005ff0017775500242777002121710024277100212171 --- 047:fff500003f500000f50000005771000077720000171200001772000017120000 --- 048:00323123003231430032314300313339000f3333000033300000333000033330 --- 049:324303003443030034430300933313003333f000033300000333000003333000 --- 050:0003333000033330000333300003333000053530003311300031113000333330 --- 051:3333000033330000333300003333000035350000311330003111300033333000 --- 052:000031a1000031a100003a1a00003a1a00003333000003f3000003f300000330 --- 053:111300001113000011130000111300003333000003f3000003f3000003300000 --- 054:5ff7646607f59999000991330003993000099130000133300001221000011100 --- 055:666646ff999993f7339913000039930000991300001333000012210000111000 --- 056:0000311300003113000031130000311300003113000033330000165100001111 --- 057:0311300003113000031130000311300003113000033330000165100001111000 --- 058:8888b8445f78b8445f58884405031330000331300003133000053550000577f0 --- 059:218b8880428b87f5218885f5031330500331300003133000053550000577f000 --- 060:0056aa66001f6aaa001fa666007f6aaa00006aaa0000a666000007d7000001d1 --- 061:666aa650aaaa6f106666af10aaaa6f70aaaa60006666a000007d7000001d1000 --- 062:0024277700ff611100fff333005f533300003333000033300000333000001110 --- 063:77720000116f0000335ff000333f000033300000333000003330000001110000 --- 064:00000000000000000000011100003311000111170003317f000117ff00553333 --- 065:0000000000000000110000001110000077110000ff710000ff77000013330000 --- 066:00000000000000330000033300003333000033f7000035ff000535ff0007f333 --- 067:0000000030000000333300003333000037f30000ffff0000ffff0000f333f000 --- 068:000000000000000000000000000000000000000000000122000012440001447f --- 069:00000000000000000000000000000000000000002210000044210000f7441000 --- 070:000000000000000000000333000038880003888800388881038388310338835f --- 071:00000000000000003330000088880000883380003355380016665300f7ff7300 --- 072:0000000000000000000000550000055500005577000057ff00007f55000fff33 --- 073:0000000000000000555550005555550077777550ffffff507f755f703f333fff --- 074:0000000000000011000001130000113100011313000131310013137c003131ff --- 075:000000001110000013110000313110001313100031313100ffff7100fffff100 --- 076:0000000000000055000005550000055500005577000057ff0007ff55000fff99 --- 077:0000000055550000555550005555500075775500fffff5005f555f703f993ff0 --- 078:0000000000000000000000000000000000001111000014440000144400001555 --- 079:0000000000000000000000000000000011100000441000004410000055100000 --- 080:0077533f000ff77f0005fff500005ff70000015f0005f315005ff3ff00ff3333 --- 081:f33f0000f77f00005ff000007f500000f500000053f00000f3f50000333f0000 --- 082:000fff330005ffff000057f50000007f000333350031313f0031313303113133 --- 083:ff33f000ffff100055f10000ff70000055330000ff3130003331300033311300 --- 084:000447ff000fffff0007f33f000ff11f000f7fff0000ff750000042400001142 --- 085:ff744000ffff1000f33f7000f11f5000fff7f00057ff00004240000044110000 --- 086:038383390338833b038383130338337f0383835f003838350003838300003333 --- 087:99539900bb33bb0099513900fffff530ff66f1007fff53001555310033333000 --- 088:000f7ff300005fff000007ff0000007f0000021f000024410002444400124244 --- 089:fff3ff7ff1ffff50fffff700111f7000ffff1000111142004244442042442410 --- 090:005f5733005f1f2300015fff0000077f00011117001244210144414201421444 --- 091:ff33f500ff23f500fffff00011ff500077710000112410004442410042441410 --- 092:00005fff000005ff0000001f0000000100000114000018140000181400018114 --- 093:fffff500111f5000fff500001110000042411000424180004241810042411100 --- 094:00001fff00001f3f0000cf3f0000cfff00000cf3000023cc000131ff001f1f11 --- 095:ff1000003f1000003ff00000fff00000fc000000c3200000f13100001f1f1000 --- 096:00ff33330033133305f333330ff31333033333330f5313330ff1311107f13333 --- 097:333f0000333f5000333f5000333ff000333330003335f500111ff5003337f000 --- 098:03113133031131330333313303113131033331320555313107ff313307ff3131 --- 099:333113003331130033333300213113004233330021317f0033317f5001317500 --- 100:0002441400244441024444240242442414424424144144241441442414414424 --- 101:4144210014444200424444204244422042444241424441414244414142444141 --- 102:000333330033a3530032a353003a332303a23333032a333303a23333032a3333 --- 103:3333300055353300553533002232323033333130333332303333313333333233 --- 104:001441440014424400144144001441240017f311001ff133001fff330007f333 --- 105:4244142042442410424414204244122012113f7031333ff033333ff030333f00 --- 106:01421444014414440142144431421444011111110fff1a5a0ff755a505755a51 --- 107:44441410424414104444141042441410111111105a5a55f5a5a5a5f5111a5170 --- 108:0001181400018114000118140001811300011333005fff33000f773300055333 --- 109:424181104241181042418110222318101113310033335ff03333f77033335500 --- 112:0553333300033330000333000033330000333300003333000011110000121200 --- 113:3330000033300000333000003330000033300000333000001111000012120000 --- 114:05f5313103003131033311310311113103111131003111300003333000012120 --- 115:0131130001311300013113000131130001311300003113000033330000121200 --- 116:0fff242407f72211005544200002442000024420000244200002222000024440 --- 117:424441f1112227f1024425500244200002442000024420000222200002444000 --- 118:0333333307ff333307f733330070333000003330000033300000111000001110 --- 119:33333575333331f1333335750033300000333000003330000011100000111100 --- 120:0000033300000333000003330000033300000333000003330000033300000111 --- 121:0033300000333000003330000033300000333000003330000033300010111100 --- 122:005015a100001a51000015a100001a51000015a1000022510000924900009999 --- 123:0315a150001a51000015a100001a51000015a100002251000092490000999900 --- 124:0000033300000333000003330000033300000333000003330000033300000111 --- 125:0333000003330000033300000333000003330000033300000333000000111000 --- 129:0000000000000000000000000000000000000000011515101151515151515151 --- 144:0000000500000015000000150000057f000005ff0000017f0000331700073331 +-- 000:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 001:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 002:cccccccccccccccccccc4444ccc44444ccc44444cc44ffffcc4fffffcc4f3333 +-- 003:cccccccccccccccc4416cccc42426ccc44241cccff426cccfff41ccc33f26ccc +-- 004:ccccc333cccc3555ccc36555cc365555cc3555ffcc356fffcc365f3fcc355fff +-- 005:33cccccc553ccccc5563cccc55563cccff553cccfff53cccf3f63cccfff53ccc +-- 006:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 007:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 008:cccccc5acccc5a55cccc55a5cccca55acccc5a57cccc5533ccc575f3cccc757f +-- 009:55a5cccca55a5ccc5a55accc575555ccfff7a5cc3f335accfff3f5ccfffffacc +-- 010:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 011:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 012:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 013:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 014:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 015:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 016:cccccccccccccccccccccccccccccc0cccccc053cccc0535ccc05351cc053535 +-- 017:cccccccccccccccccccccccc0ccccccc500ccccc1510cccc51510ccc151510cc +-- 018:cc4f99ffcccfffffccccff33cccccfffcccc3666ccc35555cc356525c3163555 +-- 019:99f41cccfff26cccff6cccccf6cccccc633ccccc55533ccc555553cc5553553c +-- 020:cc356f6fcc3655f6c365511f3653122f3531222f36322122c5322322c3322322 +-- 021:f6f53ccc6f563cccf11563ccf22153ccf22263cc221233cc223213cc221213cc +-- 022:cccccccccccccc51ccccc155cccc5515cccc157fcccc5513ccc57f3fccc17fff +-- 023:cccccccc555ccccc5155cccc15515cccff7f51ccff31f2ccfff3ffcc33fff2cc +-- 024:ccccc57fccccccc5ccccccc5cccc5599ccc55911cc559911cc551199cc551199 +-- 025:f3ff5cccfff5cccc5f5ccccc44151ccc779951cc449915cc7711955c4411955c +-- 026:ccccccccccccc133ccc13313ccc31333cc133333cc31f7f7cc113339cc31999f +-- 027:cccccccc1331cccc13133ccc333313cc333331ccf7f113cc333731cc999753cc +-- 028:ccccccccccccccccccccca77cccc5777ccc57777cc577777cc5775a5cc77a7ff +-- 029:cccccccccccccccc777acccc77775ccc777775cc7777775ca5a5775cfff7a77c +-- 030:ccccccccccccc515cccc1151ccc55555ccc1517fccc557ffccc1ff3fccc7ff1f +-- 031:cccccccc15cccccc511ccccc555cccccf711ccccff75ccccf3f1ccccf1f5cccc +-- 032:cc035351cc053500cc0351ffcc051f0fccc0ff0fccc0ffffcccc0ff0ccc020ff +-- 033:555550cc005550ccff1550ccf0f150ccf0ff0cccffff0ccc0ff0ccccff020ccc +-- 034:c3613525c3163555c3613525c3163311c3333311c3f33333c3333333ccc33333 +-- 035:5556553c5553553c5556553c1333553c1333333c3333ff3c3333333c3333cccc +-- 036:cc322322cc322333cc33331acc3ff31acc3ff3a1cc3333a1cccc3a1acccc3a1a +-- 037:223213cc333213cc111333cc111f3ccc11133ccc1113cccc1113cccc1113cccc +-- 038:ccccc7ffccc1117fcc16171fc1551755c1561755155117555f7157555ff15755 +-- 039:fffff7cc333f2cccffff71cc5555711c5555716155557111555575ff555575ff +-- 040:cc559911cc559911ccff5333ccfff511cc7fff11ccc7f511cccc3113cccc3113 +-- 041:4799155c4499155c47333f7c14113ffc11113f7c11113ccc33113cccc3113ccc +-- 042:cc35777fccc17766cccc5777cccccc55cc888855c8bbb845c8bbb8448bb8b844 +-- 043:777753cc6775cccc775ccccc5588cccc558b8ccc548bb8cc228bbb8c428b8b8c +-- 044:cc5a7f3fcc57ff3fc7f7ffffc7757fdfc77a57fdc575357fcc5a66a7ccc6aa6f +-- 045:ff3f7a5cff3ff75cfffff777ffdf7577ddf75a77ff75157577a66a5cff6aa6cc +-- 046:ccc5ffffcccc5ff3ccccc5ffcc177755cc242777cc212171cc242771cc212171 +-- 047:fff5cccc3f5cccccf5cccccc5771cccc7772cccc1712cccc1772cccc1712cccc +-- 048:cc020123cc020143cc020143cc010309cccf0300cccc030ccccc030cccc0000c +-- 049:324030cc344030cc344030cc903010cc0030fcccc030ccccc030ccccc0000ccc +-- 050:ccc3333cccc3333cccc3333cccc3333cccc5353ccc33113ccc31113ccc33333c +-- 051:3333cccc3333cccc3333cccc3333cccc3535cccc31133ccc31113ccc33333ccc +-- 052:cccc31a1cccc31a1cccc3a1acccc3a1acccc3333ccccc3f3ccccc3f3ccccc33c +-- 053:1113cccc1113cccc1113cccc1113cccc3333ccccc3f3ccccc3f3ccccc33ccccc +-- 054:5ff76466c7f59999ccc99133ccc3993cccc9913cccc1333cccc1221cccc111cc +-- 055:666646ff999993f7339913cccc3993cccc9913cccc1333cccc1221cccc111ccc +-- 056:cccc3113cccc3113cccc3113cccc3113cccc3113cccc3333cccc1651cccc1111 +-- 057:c3113cccc3113cccc3113cccc3113cccc3113cccc3333cccc1651cccc1111ccc +-- 058:8888b8445f78b8445f588844c5c3133cccc3313cccc3133cccc5355cccc577fc +-- 059:218b888c428b87f5218885f5c3133c5cc3313cccc3133cccc5355cccc577fccc +-- 060:cc56aa66cc1f6aaacc1fa666cc7f6aaacccc6aaacccca666ccccc7d7ccccc1d1 +-- 061:666aa65caaaa6f1c6666af1caaaa6f7caaaa6ccc6666accccc7d7ccccc1d1ccc +-- 062:cc242777ccff6111ccfff333cc5f5333cccc3333cccc333ccccc333ccccc111c +-- 063:7772cccc116fcccc335ffccc333fcccc333ccccc333ccccc333cccccc111cccc +-- 064:ccccccccccccccccccccc111cccc3311ccc11117ccc3317fccc117ffcc553333 +-- 065:cccccccccccccccc11cccccc111ccccc7711ccccff71ccccff77cccc1333cccc +-- 066:cccccccccccccc33ccccc333cccc3333cccc33f7cccc35ffccc535ffccc7f333 +-- 067:cccccccc3ccccccc3333cccc3333cccc37f3ccccffffccccffffccccf333fccc +-- 068:ccccccccccccccccccccccccccccccccccccccccccccc122cccc1244ccc1447f +-- 069:cccccccccccccccccccccccccccccccccccccccc221ccccc4421ccccf7441ccc +-- 070:ccccccccccccccccccccc333cccc3888ccc38888cc388881c3838831c338835f +-- 071:cccccccccccccccc333ccccc8888cccc88338ccc335538cc166653ccf7ff73cc +-- 072:cccccccccccccccccccccc55ccccc555cccc5577cccc57ffcccc7f55cccfff33 +-- 073:cccccccccccccccc55555ccc555555cc7777755cffffff5c7f755f7c3f333fff +-- 074:cccccccccccccc11ccccc113cccc1131ccc11313ccc13131cc13137ccc3131ff +-- 075:cccccccc111ccccc1311cccc31311ccc13131ccc313131ccffff71ccfffff1cc +-- 076:cccccccccccccc55ccccc555ccccc555cccc5577cccc57ffccc7ff55cccfff99 +-- 077:cccccccc5555cccc55555ccc55555ccc757755ccfffff5cc5f555f7c3f993ffc +-- 078:cccccccccccccccccccccccccccccccccccc1111cccc1444cccc1444cccc1555 +-- 079:cccccccccccccccccccccccccccccccc111ccccc441ccccc441ccccc551ccccc +-- 080:cc77533fcccff77fccc5fff5cccc5ff7ccccc15fccc5f315cc5ff3ffccff3333 +-- 081:f33fccccf77fcccc5ffccccc7f5cccccf5cccccc53fcccccf3f5cccc333fcccc +-- 082:cccfff33ccc5ffffcccc57f5cccccc7fccc33335cc31313fcc313133c3113133 +-- 083:ff33fcccffff1ccc55f1ccccff7ccccc5533ccccff313ccc33313ccc333113cc +-- 084:ccc447ffcccfffffccc7f33fcccff11fcccf7fffccccff75ccccc424cccc1142 +-- 085:ff744cccffff1cccf33f7cccf11f5cccfff7fccc57ffcccc424ccccc4411cccc +-- 086:c3838339c338833bc3838313c338337fc383835fcc383835ccc38383cccc3333 +-- 087:995399ccbb33bbcc995139ccfffff53cff66f1cc7fff53cc155531cc33333ccc +-- 088:cccf7ff3cccc5fffccccc7ffcccccc7fccccc21fcccc2441ccc24444cc124244 +-- 089:fff3ff7ff1ffff5cfffff7cc111f7cccffff1ccc111142cc4244442c4244241c +-- 090:cc5f5733cc5f1f23ccc15fffccccc77fccc11117cc124421c1444142c1421444 +-- 091:ff33f5ccff23f5ccfffffccc11ff5ccc7771cccc11241ccc444241cc4244141c +-- 092:cccc5fffccccc5ffcccccc1fccccccc1ccccc114cccc1814cccc1814ccc18114 +-- 093:fffff5cc111f5cccfff5cccc111ccccc42411ccc42418ccc424181cc424111cc +-- 094:cccc1fffcccc1f3fcccccf3fcccccfffccccccf3cccc23ccccc131ffcc1f1f11 +-- 095:ff1ccccc3f1ccccc3ffcccccfffcccccfcccccccc32cccccf131cccc1f1f1ccc +-- 096:ccff3333cc331333c5f33333cff31333c3333333cf531333cff13111c7f13333 +-- 097:333fcccc333f5ccc333f5ccc333ffccc33333ccc3335f5cc111ff5cc3337fccc +-- 098:c3113133c3113133c3333133c3113131c3333132c5553131c7ff3133c7ff3131 +-- 099:333113cc333113cc333333cc213113cc423333cc21317fcc33317f5c013175cc +-- 100:ccc24414cc244441c2444424c242442414424424144144241441442414414424 +-- 101:414421cc144442cc4244442c4244422c42444241424441414244414142444141 +-- 102:ccc33333cc33a353cc32a353cc3a3323c3a23333c32a3333c3a23333c32a3333 +-- 103:33333ccc553533cc553533cc2232323c3333313c3333323c3333313333333233 +-- 104:cc144144cc144244cc144144cc144124cc17f311cc1ff133cc1fff33ccc7f333 +-- 105:4244142c4244241c4244142c4244122c12113f7c31333ffc33333ffc30333fcc +-- 106:c1421444c1441444c142144431421444c1111111cfff1a5acff755a5c5755a51 +-- 107:4444141c4244141c4444141c4244141c1111111c5a5a55f5a5a5a5f5111a517c +-- 108:ccc11814ccc18114ccc11814ccc18113ccc11333cc5fff33cccf7733ccc55333 +-- 109:4241811c4241181c4241811c2223181c111331cc33335ffc3333f77c333355cc +-- 110:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 111:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 112:c5533333ccc3333cccc333cccc3333cccc3333cccc3333cccc1111cccc1212cc +-- 113:333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc1111cccc1212cccc +-- 114:c5f53131c3003131c3331131c3111131c3111131cc31113cccc3333cccc1212c +-- 115:c13113ccc13113ccc13113ccc13113ccc13113cccc3113cccc3333cccc1212cc +-- 116:cfff2424c7f72211cc55442cccc2442cccc2442cccc2442cccc2222cccc2444c +-- 117:424441f1112227f1c244255cc2442cccc2442cccc2442cccc2222cccc2444ccc +-- 118:c3333333c7ff3333c7f73333cc7c333ccccc333ccccc333ccccc111ccccc111c +-- 119:33333575333331f133333575cc333ccccc333ccccc333ccccc111ccccc1111cc +-- 120:ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc111 +-- 121:cc333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333ccc1c1111cc +-- 122:cc5c15a1cccc1a51cccc15a1cccc1a51cccc15a1cccc2251cccc9249cccc9999 +-- 123:c315a15ccc1a51cccc15a1cccc1a51cccc15a1cccc2251cccc9249cccc9999cc +-- 124:ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc111 +-- 125:c333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333cccccc111ccc +-- 126:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 127:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 128:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 129:ccccccccccccccccccccccccccccccccccccccccc115151c1151515151515151 +-- 130:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 131:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 132:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 133:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 134:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 135:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 136:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 137:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 138:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 139:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 140:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 141:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 142:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 143:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 144:ccccccc5cccccc15cccccc15ccccc57fccccc5ffccccc17fcccc3317ccc73331 -- 145:1ffffff7ff0fff0fff1fff1fffffffffff7555fffffffffffff111ff57fffff7 --- 146:1000000071000000f5000000ff000000ff500000ff5000007513100051333700 --- 160:0077333303331333333313333331333333313333355133335ff513335ff71111 +-- 146:1ccccccc71ccccccf5ccccccffccccccff5cccccff5ccccc75131ccc513337cc +-- 147:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 148:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 149:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 150:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 151:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 152:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 153:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 154:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 155:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 156:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 157:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 158:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 159:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 160:cc773333c3331333333313333331333333313333355133335ff513335ff71111 -- 161:1111111133333333333337333333373333333733333337333333373311117711 --- 162:133337003733133077731330333331333333313333333155333337ff1111175f --- 176:0775333300031333000333130000333300001333000033330000033300000111 --- 177:3335773333333533333333331313131333333333300000033000000310000001 --- 178:3333357533331000331300001333000033310000333300003331000011110000 +-- 162:133337cc3733133c7773133c333331333333313333333155333337ff1111175f +-- 163:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 164:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 165:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 166:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 167:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 168:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 169:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 170:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 171:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 172:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 173:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 174:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 175:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 176:c7753333ccc31333ccc33313cccc3333cccc1333cccc3333ccccc333ccccc111 +-- 177:33357733333335333333333313131313333333333cccccc33cccccc31cccccc1 +-- 178:3333357533331ccc3313cccc1333cccc3331cccc3333cccc3331cccc1111cccc +-- 179:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 180:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 181:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 182:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 183:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 184:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 185:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 186:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 187:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 188:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 189:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 190:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 191:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 192:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 193:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 194:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 195:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 196:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 197:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 198:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 199:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 200:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 201:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 202:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 203:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 204:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 205:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 206:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 207:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 208:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 209:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 210:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 211:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 212:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 213:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 214:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 215:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 216:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 217:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 218:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 219:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 220:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 221:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 222:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 223:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 224:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 225:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 226:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 227:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 228:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 229:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 230:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 231:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 232:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 233:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 234:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 235:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 236:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 237:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 238:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 239:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 240:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 241:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 242:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 243:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 244:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 245:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 246:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 247:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 248:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 249:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 250:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 251:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 252:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 253:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 254:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 255:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- -- -- 000:ffffffffff0010201020102010201020102010201020102000ffffffffff40404040404087f3f3f3f397a7b7c7d7a7e7f70818a7b7c7d7a7b7c7d7a70b1b2b1b2b1b2b1b2b1b2b1b2b1b2b1b2b1b2b1b2b1b2b1b2b1b2b1b2b0b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 2.49.1 From 1e3716196ed2d8074c851ab8453958320510df10 Mon Sep 17 00:00:00 2001 From: Bela Mezo Date: Thu, 9 Apr 2026 13:54:43 +0200 Subject: [PATCH 11/17] Removes the setting of the transparent color to fix the linter error. --- inc/system/system.main.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/inc/system/system.main.lua b/inc/system/system.main.lua index cd1ad3f..888ef84 100644 --- a/inc/system/system.main.lua +++ b/inc/system/system.main.lua @@ -7,7 +7,6 @@ local initialized_game = false local function init_game() if initialized_game then return false end Context.reset() - poke(0x03FF, 1 << Config.colors.transparent) -- Set the default transparent color in the palette Window.set_current("intro_title") -- Set initial window using new manager MenuWindow.refresh_menu_items() initialized_game = true -- 2.49.1 From 5fc6ae5c14803486dac29f0aebeacf8866261270 Mon Sep 17 00:00:00 2001 From: Bela Mezo Date: Thu, 9 Apr 2026 15:48:04 +0200 Subject: [PATCH 12/17] Draws outlines around the figures. --- inc/meta/meta.assets.lua | 244 +++++++++++++++++++-------------------- 1 file changed, 122 insertions(+), 122 deletions(-) diff --git a/inc/meta/meta.assets.lua b/inc/meta/meta.assets.lua index cd60fcc..9adcb66 100644 --- a/inc/meta/meta.assets.lua +++ b/inc/meta/meta.assets.lua @@ -253,135 +253,135 @@ -- -- 000:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 001:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc --- 002:cccccccccccccccccccc4444ccc44444ccc44444cc44ffffcc4fffffcc4f3333 --- 003:cccccccccccccccc4416cccc42426ccc44241cccff426cccfff41ccc33f26ccc --- 004:ccccc333cccc3555ccc36555cc365555cc3555ffcc356fffcc365f3fcc355fff --- 005:33cccccc553ccccc5563cccc55563cccff553cccfff53cccf3f63cccfff53ccc +-- 002:cccccccccccc0000ccc04444cc044444cc044444c044ffffc04fffffc04f3333 +-- 003:cccccccc0000cccc44160ccc424260cc442410ccff4260ccfff410cc00f260cc +-- 004:ccccc000cccc0555ccc06555cc065555cc0555ffcc056fffcc065f0fcc055fff +-- 005:00cccccc550ccccc5560cccc55560cccff550cccfff50cccf0f60cccfff50ccc -- 006:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 007:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc --- 008:cccccc5acccc5a55cccc55a5cccca55acccc5a57cccc5533ccc575f3cccc757f --- 009:55a5cccca55a5ccc5a55accc575555ccfff7a5cc3f335accfff3f5ccfffffacc +-- 008:cccc0000ccc05a55ccc055a5ccc0a55accc05a57ccc05533cc0575f3ccc0757f +-- 009:00000ccca55a50cc5a55a0cc5755550cfff7a50c3f335a0cfff3f50cfffffa0c -- 010:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 011:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 012:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 013:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 014:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 015:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc --- 016:cccccccccccccccccccccccccccccc0cccccc053cccc0535ccc05351cc053535 +-- 016:cccccccccccccccccccccccccccccc0cccccc050cccc0535ccc05351cc053535 -- 017:cccccccccccccccccccccccc0ccccccc500ccccc1510cccc51510ccc151510cc --- 018:cc4f99ffcccfffffccccff33cccccfffcccc3666ccc35555cc356525c3163555 --- 019:99f41cccfff26cccff6cccccf6cccccc633ccccc55533ccc555553cc5553553c --- 020:cc356f6fcc3655f6c365511f3653122f3531222f36322122c5322322c3322322 --- 021:f6f53ccc6f563cccf11563ccf22153ccf22263cc221233cc223213cc221213cc --- 022:cccccccccccccc51ccccc155cccc5515cccc157fcccc5513ccc57f3fccc17fff --- 023:cccccccc555ccccc5155cccc15515cccff7f51ccff31f2ccfff3ffcc33fff2cc --- 024:ccccc57fccccccc5ccccccc5cccc5599ccc55911cc559911cc551199cc551199 --- 025:f3ff5cccfff5cccc5f5ccccc44151ccc779951cc449915cc7711955c4411955c --- 026:ccccccccccccc133ccc13313ccc31333cc133333cc31f7f7cc113339cc31999f --- 027:cccccccc1331cccc13133ccc333313cc333331ccf7f113cc333731cc999753cc --- 028:ccccccccccccccccccccca77cccc5777ccc57777cc577777cc5775a5cc77a7ff --- 029:cccccccccccccccc777acccc77775ccc777775cc7777775ca5a5775cfff7a77c --- 030:ccccccccccccc515cccc1151ccc55555ccc1517fccc557ffccc1ff3fccc7ff1f --- 031:cccccccc15cccccc511ccccc555cccccf711ccccff75ccccf3f1ccccf1f5cccc +-- 018:c04f99ffcc0fffffccc0ff00cccc0fffcccc0666ccc05555cc056525c0160555 +-- 019:99f410ccfff260ccff600cccf60ccccc600ccccc55500ccc555550cc5550550c +-- 020:cc056f6fcc0655f6c065511f0650122f0501222f06022122c5022322c0022322 +-- 021:f6f50ccc6f560cccf11560ccf22150ccf22260cc221230cc223210cc221210cc +-- 022:cccccc00ccccc051cccc0155ccc05515ccc0157fccc05513cc057f0fcc017fff +-- 023:000ccccc5550cccc51550ccc155150ccff7f510cff31f20cfff0ff0c00fff20c +-- 024:cccc057fccccc005cccc0555ccc05599cc055911c0559911c0551199c0551199 +-- 025:f3ff50ccfff50ccc5f50cccc441500cc7799510c4499150c7711955044119550 +-- 026:ccccc000ccc00133cc013313cc031333c0133333c031f7f7c0113339c031999f +-- 027:0000cccc13310ccc131330cc3333130c3333310cf7f1130c3337310c9997530c +-- 028:ccccccccccccc000cccc0a77ccc05777cc057777c0577777c05775a5c077a7ff +-- 029:cccccccc0000cccc777a0ccc777750cc7777750c77777750a5a57750fff7a770 +-- 030:ccccc000cccc0515ccc01151cc055555cc01517fcc0557ffcc01ff0fcc07ff1f +-- 031:00cccccc150ccccc5110cccc5550ccccf7110cccff750cccf0f10cccf1f50ccc -- 032:cc035351cc053500cc0351ffcc051f0fccc0ff0fccc0ffffcccc0ff0ccc020ff -- 033:555550cc005550ccff1550ccf0f150ccf0ff0cccffff0ccc0ff0ccccff020ccc --- 034:c3613525c3163555c3613525c3163311c3333311c3f33333c3333333ccc33333 --- 035:5556553c5553553c5556553c1333553c1333333c3333ff3c3333333c3333cccc --- 036:cc322322cc322333cc33331acc3ff31acc3ff3a1cc3333a1cccc3a1acccc3a1a --- 037:223213cc333213cc111333cc111f3ccc11133ccc1113cccc1113cccc1113cccc --- 038:ccccc7ffccc1117fcc16171fc1551755c1561755155117555f7157555ff15755 --- 039:fffff7cc333f2cccffff71cc5555711c5555716155557111555575ff555575ff --- 040:cc559911cc559911ccff5333ccfff511cc7fff11ccc7f511cccc3113cccc3113 --- 041:4799155c4499155c47333f7c14113ffc11113f7c11113ccc33113cccc3113ccc --- 042:cc35777fccc17766cccc5777cccccc55cc888855c8bbb845c8bbb8448bb8b844 --- 043:777753cc6775cccc775ccccc5588cccc558b8ccc548bb8cc228bbb8c428b8b8c --- 044:cc5a7f3fcc57ff3fc7f7ffffc7757fdfc77a57fdc575357fcc5a66a7ccc6aa6f --- 045:ff3f7a5cff3ff75cfffff777ffdf7577ddf75a77ff75157577a66a5cff6aa6cc --- 046:ccc5ffffcccc5ff3ccccc5ffcc177755cc242777cc212171cc242771cc212171 --- 047:fff5cccc3f5cccccf5cccccc5771cccc7772cccc1712cccc1772cccc1712cccc --- 048:cc020123cc020143cc020143cc010309cccf0300cccc030ccccc030cccc0000c --- 049:324030cc344030cc344030cc903010cc0030fcccc030ccccc030ccccc0000ccc --- 050:ccc3333cccc3333cccc3333cccc3333cccc5353ccc33113ccc31113ccc33333c --- 051:3333cccc3333cccc3333cccc3333cccc3535cccc31133ccc31113ccc33333ccc --- 052:cccc31a1cccc31a1cccc3a1acccc3a1acccc3333ccccc3f3ccccc3f3ccccc33c --- 053:1113cccc1113cccc1113cccc1113cccc3333ccccc3f3ccccc3f3ccccc33ccccc --- 054:5ff76466c7f59999ccc99133ccc3993cccc9913cccc1333cccc1221cccc111cc --- 055:666646ff999993f7339913cccc3993cccc9913cccc1333cccc1221cccc111ccc --- 056:cccc3113cccc3113cccc3113cccc3113cccc3113cccc3333cccc1651cccc1111 --- 057:c3113cccc3113cccc3113cccc3113cccc3113cccc3333cccc1651cccc1111ccc --- 058:8888b8445f78b8445f588844c5c3133cccc3313cccc3133cccc5355cccc577fc --- 059:218b888c428b87f5218885f5c3133c5cc3313cccc3133cccc5355cccc577fccc --- 060:cc56aa66cc1f6aaacc1fa666cc7f6aaacccc6aaacccca666ccccc7d7ccccc1d1 --- 061:666aa65caaaa6f1c6666af1caaaa6f7caaaa6ccc6666accccc7d7ccccc1d1ccc --- 062:cc242777ccff6111ccfff333cc5f5333cccc3333cccc333ccccc333ccccc111c --- 063:7772cccc116fcccc335ffccc333fcccc333ccccc333ccccc333cccccc111cccc --- 064:ccccccccccccccccccccc111cccc3311ccc11117ccc3317fccc117ffcc553333 --- 065:cccccccccccccccc11cccccc111ccccc7711ccccff71ccccff77cccc1333cccc --- 066:cccccccccccccc33ccccc333cccc3333cccc33f7cccc35ffccc535ffccc7f333 --- 067:cccccccc3ccccccc3333cccc3333cccc37f3ccccffffccccffffccccf333fccc --- 068:ccccccccccccccccccccccccccccccccccccccccccccc122cccc1244ccc1447f --- 069:cccccccccccccccccccccccccccccccccccccccc221ccccc4421ccccf7441ccc --- 070:ccccccccccccccccccccc333cccc3888ccc38888cc388881c3838831c338835f --- 071:cccccccccccccccc333ccccc8888cccc88338ccc335538cc166653ccf7ff73cc --- 072:cccccccccccccccccccccc55ccccc555cccc5577cccc57ffcccc7f55cccfff33 --- 073:cccccccccccccccc55555ccc555555cc7777755cffffff5c7f755f7c3f333fff --- 074:cccccccccccccc11ccccc113cccc1131ccc11313ccc13131cc13137ccc3131ff --- 075:cccccccc111ccccc1311cccc31311ccc13131ccc313131ccffff71ccfffff1cc --- 076:cccccccccccccc55ccccc555ccccc555cccc5577cccc57ffccc7ff55cccfff99 --- 077:cccccccc5555cccc55555ccc55555ccc757755ccfffff5cc5f555f7c3f993ffc --- 078:cccccccccccccccccccccccccccccccccccc1111cccc1444cccc1444cccc1555 --- 079:cccccccccccccccccccccccccccccccc111ccccc441ccccc441ccccc551ccccc --- 080:cc77533fcccff77fccc5fff5cccc5ff7ccccc15fccc5f315cc5ff3ffccff3333 --- 081:f33fccccf77fcccc5ffccccc7f5cccccf5cccccc53fcccccf3f5cccc333fcccc --- 082:cccfff33ccc5ffffcccc57f5cccccc7fccc33335cc31313fcc313133c3113133 --- 083:ff33fcccffff1ccc55f1ccccff7ccccc5533ccccff313ccc33313ccc333113cc --- 084:ccc447ffcccfffffccc7f33fcccff11fcccf7fffccccff75ccccc424cccc1142 --- 085:ff744cccffff1cccf33f7cccf11f5cccfff7fccc57ffcccc424ccccc4411cccc --- 086:c3838339c338833bc3838313c338337fc383835fcc383835ccc38383cccc3333 --- 087:995399ccbb33bbcc995139ccfffff53cff66f1cc7fff53cc155531cc33333ccc --- 088:cccf7ff3cccc5fffccccc7ffcccccc7fccccc21fcccc2441ccc24444cc124244 --- 089:fff3ff7ff1ffff5cfffff7cc111f7cccffff1ccc111142cc4244442c4244241c --- 090:cc5f5733cc5f1f23ccc15fffccccc77fccc11117cc124421c1444142c1421444 --- 091:ff33f5ccff23f5ccfffffccc11ff5ccc7771cccc11241ccc444241cc4244141c --- 092:cccc5fffccccc5ffcccccc1fccccccc1ccccc114cccc1814cccc1814ccc18114 --- 093:fffff5cc111f5cccfff5cccc111ccccc42411ccc42418ccc424181cc424111cc --- 094:cccc1fffcccc1f3fcccccf3fcccccfffccccccf3cccc23ccccc131ffcc1f1f11 --- 095:ff1ccccc3f1ccccc3ffcccccfffcccccfcccccccc32cccccf131cccc1f1f1ccc --- 096:ccff3333cc331333c5f33333cff31333c3333333cf531333cff13111c7f13333 --- 097:333fcccc333f5ccc333f5ccc333ffccc33333ccc3335f5cc111ff5cc3337fccc --- 098:c3113133c3113133c3333133c3113131c3333132c5553131c7ff3133c7ff3131 --- 099:333113cc333113cc333333cc213113cc423333cc21317fcc33317f5c013175cc --- 100:ccc24414cc244441c2444424c242442414424424144144241441442414414424 --- 101:414421cc144442cc4244442c4244422c42444241424441414244414142444141 --- 102:ccc33333cc33a353cc32a353cc3a3323c3a23333c32a3333c3a23333c32a3333 --- 103:33333ccc553533cc553533cc2232323c3333313c3333323c3333313333333233 --- 104:cc144144cc144244cc144144cc144124cc17f311cc1ff133cc1fff33ccc7f333 --- 105:4244142c4244241c4244142c4244122c12113f7c31333ffc33333ffc30333fcc --- 106:c1421444c1441444c142144431421444c1111111cfff1a5acff755a5c5755a51 --- 107:4444141c4244141c4444141c4244141c1111111c5a5a55f5a5a5a5f5111a517c --- 108:ccc11814ccc18114ccc11814ccc18113ccc11333cc5fff33cccf7733ccc55333 --- 109:4241811c4241181c4241811c2223181c111331cc33335ffc3333f77c333355cc +-- 034:c0613525c0163555c0613525c0163311c0003311c0f03333cc003333ccc03333 +-- 035:5556550c5553550c5556550c1330550c1330000c3330ff0c333000cc3330cccc +-- 036:cc022322cc022333cc03331acc0ff31acc0ff3a1ccc003a1cccc0a1acccc0a1a +-- 037:223210cc333210cc111300cc111f0ccc11100ccc1110cccc1110cccc1110cccc +-- 038:ccc007ffcc01117fc016171f0155175501561755055117550f7157550ff15755 +-- 039:fffff70c000f20ccffff710c555571105555716055557110555575f0555575f0 +-- 040:c0559911c0559911c0ff5333c0fff511c07fff11cc07f511ccc03110cccc0110 +-- 041:479915504499155047333f7014113ff011113f701111000c00110cccc0110ccc +-- 042:c035777fcc017766ccc05777cc088855c08bb85508bbb84508bbb8440bb8b844 +-- 043:7777530c677500cc7750cccc55880ccc558b80cc548bb80c228bbb80428b8b80 +-- 044:cc0a7f3fc075ff3f0777ffff07757fdf077a57fd0575357fc05a66a7cc06aa6f +-- 045:ff3f7a0cff3ff70cfffff770ffdf7570ddf75a70ff75157077a66a50ff6aa60c +-- 046:cc05ffffccc05ff3cccc05ffcc007755c0242777c0212171c0242771c0212171 +-- 047:fff50ccc3f50ccccf50ccccc5770cccc77720ccc17120ccc17720ccc17120ccc +-- 048:cc020123cc020143cc020143cc010309cc0f0300ccc0030ccccc030cccc0000c +-- 049:324030cc344030cc344030cc903010cc0030f0ccc0300cccc030ccccc0000ccc +-- 050:ccc0330cccc0330cccc0330cccc0330cccc0350ccc03110ccc01110ccc00000c +-- 051:0330cccc0330cccc0330cccc0330cccc0530cccc01130ccc01110ccc00000ccc +-- 052:cccc01a1cccc01a1cccc0a1acccc0a1acccc0000ccccc0f0ccccc0f0ccccc00c +-- 053:1110cccc1110cccc1110cccc1110cccc0000ccccc0f0ccccc0f0ccccc00ccccc +-- 054:0ff7646607f59999c0099100cc03990ccc09910ccc01330ccc01220ccc0000cc +-- 055:666646f0999993f00099100cc03990ccc09910ccc01330ccc01220ccc0000ccc +-- 056:cccc0110cccc0110cccc0110cccc0110cccc0110cccc0330cccc0650cccc0000 +-- 057:c0110cccc0110cccc0110cccc0110cccc0110cccc0330cccc0650cccc0000ccc +-- 058:0888b8440f78b8440f58884405031300c0c0310cccc0130cccc0350cccc0000c +-- 059:218b8880428b87f0218885f000130050c0310c0cc0130cccc0350cccc0000ccc +-- 060:c056aa66c01f6aaac01fa666c07f6aaacc0f6aaaccc0a666cccc07d7cccc0000 +-- 061:666aa650aaaa6f106666af10aaaa6f70aaaa600c6666a0cc007d70cccc0000cc +-- 062:c0242777c0ff6111c0fff333c05f5333cc003300cccc030ccccc030ccccc000c +-- 063:77720ccc116f0ccc335ff0cc333f0ccc0330cccc030ccccc030ccccc0000cccc +-- 064:ccccccccccccc000cccc0111ccc03311cc011117cc03317fcc0117ffc0553333 +-- 065:cccccccc00cccccc110ccccc1110cccc77110cccff710cccff770ccc13330ccc +-- 066:cccccc00ccccc033cccc0333ccc03333ccc033f7ccc035ffcc0535ffcc07f333 +-- 067:0ccccccc3000cccc33330ccc33330ccc37f30cccffff0cccffff0cccf333f0cc +-- 068:ccccccccccccccccccccccccccccccccccccc000cccc0122ccc01244cc01447f +-- 069:cccccccccccccccccccccccccccccccc000ccccc2210cccc44210cccf74410cc +-- 070:ccccccccccccccccccccc000cccc0888ccc08888cc088880c0838801c038805f +-- 071:cccccccccccccccc0000cccc88880ccc880080cc0055080c1666530cf7ff730c +-- 072:cccccccccccccc00ccccc055cccc0555ccc05577ccc057ffccc07f55cc0fff33 +-- 073:cccccccc00000ccc555550cc5555550c77777550ffffff507f755f703f333ff0 +-- 074:cccccccccccccc00ccccc013cccc0131ccc01313ccc03131cc031377cc0131ff +-- 075:cccccccc000ccccc1310cccc31310ccc13130ccc313130ccffff70ccfffff0cc +-- 076:cccccccccccccc00ccccc055cccc0555ccc05577ccc057ffcc07ff55cc0fff99 +-- 077:cccccccc0000cccc55550ccc555550cc7577550cfffff50c5f555f0c3f993f0c +-- 078:cccccccccccccccccccccccccccccccccccc0000cccc0444cccc0444cccc0555 +-- 079:cccccccccccccccccccccccccccccccc000ccccc440ccccc440ccccc550ccccc +-- 080:c077500fcc0ff77fcc05fff5ccc05ff7cccc015fccc0f315cc0ff3ffc0ff3333 +-- 081:f00f0cccf77f0ccc5ff0cccc7f50ccccf50ccccc53f0ccccf3f50ccc333f0ccc +-- 082:cc0fff00cc05ffffccc057f5cccc007fccc03335cc01313fc031313303113133 +-- 083:ff00f0ccffff10cc55f10cccff70cccc5530ccccff310ccc33310ccc333110cc +-- 084:cc0447ffcc0fffffcc07f33fcc0ff11fcc0f7fffccc0ff75cccc0424cccc0142 +-- 085:ff7440ccffff10ccf33f70ccf11f50ccfff7f0cc57ff0ccc4240cccc44110ccc +-- 086:c0838039c038803bc0838013c038307fc083805fcc083805ccc08383cccc0333 +-- 087:9953990cbb33bb0c9951390cfffff50cff66f10c7fff50cc15550ccc33330ccc +-- 088:cc0f7ff0ccc05fffcccc07ffccccc07fcccc021fccc02441cc024444c0124244 +-- 089:fff0ff70f1ffff50fffff70c111f70ccffff10cc1111420c4244442042442410 +-- 090:cc0f5733cc0f1f23ccc00fffcccc077fccc01117cc024421c0444142c0421444 +-- 091:ff33f0ccff23f0ccfffff0cc11ff0ccc7770cccc11240ccc444240cc4244140c +-- 092:ccc05fffcccc05ffccccc01fcccccc01ccccc014cccc0814ccc01814ccc08114 +-- 093:fffff50c111f50ccfff50ccc1110cccc42410ccc424180cc424180cc424110cc +-- 094:cccc0fffcccc0f3fcccc0f0fcccc0fffccccc0f3cccc0377ccc031ffcc0f1f11 +-- 095:ff0ccccc3f0ccccc0f0cccccff0cccccf0cccccc730cccccf130cccc1f1f0ccc +-- 096:c0ff3333c033133305f333330ff31333033333330f5313330ff1311107f13333 +-- 097:333f0ccc333f50cc333f50cc333ff0cc333330cc3335f50c111ff50c3337f0cc +-- 098:03113133031131330333313303113131033331320555313107ff313307ff3131 +-- 099:333110cc333110cc333330cc213110cc423330cc21317f0c33317f501131750c +-- 100:ccc04414cc044441c0444424c042442404424424044144240441442404414424 +-- 101:414420cc1444420c424444204244422042444240424441404244414042444140 +-- 102:ccc03333cc03a353cc02a353cc0a3323c0a23333c02a3333c0a23333c02a3333 +-- 103:33330ccc553530cc553530cc2232320c3333310c3333320c3333313033333230 +-- 104:c0144144c0144244c0144144c0144124c017f311c01ff133c01fff33cc07f330 +-- 105:4244142042442410424414204244122012113f7031333ff033333ff000033f0c +-- 106:c0421444c0441444c0421444c0421444c0111111c0ff1a5ac0f755a5c0755a50 +-- 107:4444140c4244140c4444140c4244140c1111110c5a5a55f0a5a5a5f0001a5170 +-- 108:ccc01814ccc08114ccc01814ccc08113cc001333c05fff33cc0f7733cc055330 +-- 109:4241810c4241180c4241810c2223180c1113310c33335ff03333f7700033550c -- 110:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 111:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc --- 112:c5533333ccc3333cccc333cccc3333cccc3333cccc3333cccc1111cccc1212cc --- 113:333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc1111cccc1212cccc --- 114:c5f53131c3003131c3331131c3111131c3111131cc31113cccc3333cccc1212c --- 115:c13113ccc13113ccc13113ccc13113ccc13113cccc3113cccc3333cccc1212cc --- 116:cfff2424c7f72211cc55442cccc2442cccc2442cccc2442cccc2222cccc2444c --- 117:424441f1112227f1c244255cc2442cccc2442cccc2442cccc2222cccc2444ccc --- 118:c3333333c7ff3333c7f73333cc7c333ccccc333ccccc333ccccc111ccccc111c --- 119:33333575333331f133333575cc333ccccc333ccccc333ccccc111ccccc1111cc --- 120:ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc111 --- 121:cc333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333ccc1c1111cc --- 122:cc5c15a1cccc1a51cccc15a1cccc1a51cccc15a1cccc2251cccc9249cccc9999 --- 123:c315a15ccc1a51cccc15a1cccc1a51cccc15a1cccc2251cccc9249cccc9999cc --- 124:ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc111 --- 125:c333ccccc333ccccc333ccccc333ccccc333ccccc333ccccc333cccccc111ccc +-- 112:05533333c0033330ccc0330ccc03330cc03330ccc03330ccc01110ccc0000ccc +-- 113:33000ccc030ccccc030ccccc030ccccc030ccccc030ccccc0110cccc0000cccc +-- 114:05f53131c0003131c0331131c0111131c0111130cc01110cccc0330cccc0000c +-- 115:113110cc113110cc113110cc113110cc003110cccc0110cccc0330cccc0000cc +-- 116:0fff242407f72211c0552400cc00240cccc0240cccc0240cccc0220cccc0000c +-- 117:424441f0112227f000442550c044200cc04420ccc04420ccc02220ccc00000cc +-- 118:0333333307ff333307f73300c070030ccc0c030ccccc030ccccc010ccccc000c +-- 119:33333570333331f000033570cc03300ccc030ccccc030ccccc010ccccc0000cc +-- 120:ccc00330ccccc030ccccc030ccccc030ccccc030ccccc030ccccc030ccccc000 +-- 121:cc0300cccc030ccccc030ccccc030ccccc030ccccc030ccccc030ccc0c0000cc +-- 122:c05015a0cc0c0a50cccc05a0cccc0a50cccc05a0cccc0250cccc0990cccc0000 +-- 123:c015a150cc0a500ccc05a0cccc0a50cccc05a0cccc0250cccc0990cccc0000cc +-- 124:ccc00330ccccc030ccccc030ccccc030ccccc030ccccc030ccccc030ccccc000 +-- 125:c03000ccc030ccccc030ccccc030ccccc030ccccc030ccccc030ccccc0000ccc -- 126:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 127:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc --- 128:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc --- 129:ccccccccccccccccccccccccccccccccccccccccc115151c1151515151515151 --- 130:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +-- 128:ccccccccccccccccccccccccccccccccccccccccccccccccccccccc0ccccccc0 +-- 129:ccccccccccccccccccccccccccccccccc000000c011515101151515151515151 +-- 130:cccccccccccccccccccccccccccccccccccccccccccccccc0ccccccc10cccccc -- 131:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 132:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 133:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc @@ -395,9 +395,9 @@ -- 141:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 142:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 143:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc --- 144:ccccccc5cccccc15cccccc15ccccc57fccccc5ffccccc17fcccc3317ccc73331 --- 145:1ffffff7ff0fff0fff1fff1fffffffffff7555fffffffffffff111ff57fffff7 --- 146:1ccccccc71ccccccf5ccccccffccccccff5cccccff5ccccc75131ccc513337cc +-- 144:cccccc05ccccc015ccccc015cccc057fcccc05ffcccc017fccc03317cc073331 +-- 145:1ffffff7ff0fff0fff0fff0fffffffffff7555fffffffffffff111ff57fffff7 +-- 146:10cccccc710cccccf50cccccff0cccccff50ccccff510ccc751310cc5133370c -- 147:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 148:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 149:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc @@ -411,9 +411,9 @@ -- 157:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 158:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 159:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc --- 160:cc773333c3331333333313333331333333313333355133335ff513335ff71111 +-- 160:c077333303331333033313330331333303313333055133330ff513330ff71111 -- 161:1111111133333333333337333333373333333733333337333333373311117711 --- 162:133337cc3733133c7773133c333331333333313333333155333337ff1111175f +-- 162:1333370c3733130c7773130c333331303333313033333150333337f011111750 -- 163:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 164:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 165:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc @@ -427,9 +427,9 @@ -- 173:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 174:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 175:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc --- 176:c7753333ccc31333ccc33313cccc3333cccc1333cccc3333ccccc333ccccc111 --- 177:33357733333335333333333313131313333333333cccccc33cccccc31cccccc1 --- 178:3333357533331ccc3313cccc1333cccc3331cccc3333cccc3331cccc1111cccc +-- 176:07753333c0031333ccc03313cccc0333cccc0333cccc0333ccccc033ccccc000 +-- 177:33357733333335333333333313131313000000000cccccc00cccccc00cccccc0 +-- 178:333335703333100c33100ccc1330cccc3330cccc3330cccc3330cccc0000cccc -- 179:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 180:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 181:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc -- 2.49.1 From 9b379d32b3a0a044bd8815630bb03f45a43f0d0f Mon Sep 17 00:00:00 2001 From: Bela Mezo Date: Thu, 9 Apr 2026 15:58:54 +0200 Subject: [PATCH 13/17] Corrects the color defects in tiles. --- inc/meta/meta.assets.lua | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/inc/meta/meta.assets.lua b/inc/meta/meta.assets.lua index 9adcb66..51b17a7 100644 --- a/inc/meta/meta.assets.lua +++ b/inc/meta/meta.assets.lua @@ -2,7 +2,7 @@ -- 000:0404005f574fc2c3c71d2b53fff1e8ab52367e2553ffa30000875129adff83769c00e436fa77a8ff004dc3c3c7ffccaa -- -- --- 000:00000000c666666006606060c636366006606060c606366006666660c0000000 +-- 000:0000000006666660066060600636366006606060060636600666666000000000 -- 001:0000000006666666060600600666666606000600066666660633633300000000 -- 002:0000000066666666006000066666666660060006666666666333363300000000 -- 004:1111111111111111111111111111111111111111111111111111111111111111 @@ -17,7 +17,7 @@ -- 013:1000000004444444044444440444444404444444044444440444444404444444 -- 014:0000000144444240444424204444424044442420444442404444242044444240 -- 015:0000000004244444024444440424400002444444042424240242424200000000 --- 016:000000004444442044444240c004442044444240e424242042424240c0000000 +-- 016:0000000044444420444442400004442044444240e42424204242424000000000 -- 017:0000000002424240042424200244444004244440024404400424044002440440 -- 018:0000000002424240042424200444424004444420044042400440442004404240 -- 019:0222222200010012055016020150660205501602015066020550160200000000 @@ -33,7 +33,7 @@ -- 029:0440442004404240044044200444424004444420024242400424242000000000 -- 030:0000000006666660036060600360666006606060036660600360666003606060 -- 031:0222222200010010033033030130130103303303013013010330330300000000 --- 032:22222220c10012203033022030130220303302203013022030330220c0000000 +-- 032:2222222001001220303302203013022030330220301302203033022000000000 -- 033:0333011103330111033301110333011103330111033301110333011100000000 -- 034:1110011111100111111001111110011111100111111001111110011100000000 -- 035:1110333011103330111033301110333011103330111033301110333000000000 @@ -49,7 +49,7 @@ -- 045:2222222022222220222222202222222022222220000000001111100011111000 -- 046:1111111111111111111111111000000002222222022222220222222202222222 -- 047:1111111111111111111111110000000022222222222222222222222222222222 --- 048:111111111111111111111111c000100022220444e222044422220444e2220444 +-- 048:1111111111111111111111110000100022220444e222044422220444e2220444 -- 049:1111111111111111111111111100001100222201022222200222222002222220 -- 050:1111111011111110111111101111111011111110111111101111111011110000 -- 051:1111111111111111111111111111111111111111111111111111111100011111 @@ -81,7 +81,7 @@ -- 077:0000000011111110000000006611166655555551555555515555555166666111 -- 078:1111111111111111111100001110919111101010110191011019191000919190 -- 079:1111111111111111000000009191919000000010111110901111101000000090 --- 080:09191990c991990209199020c999020209902020c902020200202020c0000000 +-- 080:0919199009919902091990200999020209902020090202020020202000000000 -- 081:0000000002020200202020200200022020002220000222202022222002222220 -- 082:5555555555555055555501056666010155550105555501055555010566610106 -- 083:5555555555555555000000000222222202222222022222220222222202222222 @@ -97,7 +97,7 @@ -- 093:0222022002220220022202200222022002220220022202200222022002220220 -- 094:1033330110333301103333011033330110333301103333011033330110000001 -- 095:3333101033331090333310103333109011113010111130901111301011113000 --- 096:00000000c111111100000000c106666601051555c105155501056555c0066611 +-- 096:0000000001111111000000000106666601051555010515550105655500066611 -- 097:0000000011111110000000006666101055555010555550105555501066616000 -- 098:5555555555555550555555056666116655550055555500555555655566666611 -- 099:0555555500555555050555550661111105500555115005550055555500616666 @@ -113,7 +113,7 @@ -- 109:1111111011111110111111101111111011111110111111100000000566000066 -- 110:1111111111111111111111111111010011101044111010441110104400000010 -- 111:1111111111111111111111110011111144011111440111114401111110000000 --- 112:11111111111111111111111111111111111111111111111111110111c0004000 +-- 112:1111111111111111111111111111111111111111111111111111011100004000 -- 113:3333104433331044333310003333111111113333111133331111333311113333 -- 114:4403111144031111000311113333111111110000111044441104444411014444 -- 115:3304440133044401330444013304440100104033440103334440333344103333 @@ -177,7 +177,7 @@ -- 173:0333333010333330103333301033333010333330100000001111111111111111 -- 174:111111111111111111111111111111111111111112222222a1a1a1a21a1a1a12 -- 175:1111111111111111111111111111111111111111444444444444444444444444 --- 176:00000000c111111001101010c131311001101010c101311001111110c0000000 +-- 176:0000000001111110011010100131311001101010010131100111111000000000 -- 177:0000000001111111010100100111111101000100011111110133133300000000 -- 178:0000000011111111001000011111111110010001111111111333313300000000 -- 179:11111111111111111111111111111111111100001110b161110b100010810101 @@ -225,7 +225,7 @@ -- 221:0200000002000000020000000200000002000000020000000211111100000000 -- 222:0000000000000000000000000000000000000000000000001111111100000000 -- 223:000000000000000000000000000000000000000000000000111dd11100000000 --- 224:00000010c000001000000010c000001000000010c000001011111110c0000000 +-- 224:0000001000000010000000100000001000000010000000101111111000000000 -- 225:3333333333333333333333333333333313131313313131311313131331313131 -- 226:0203333302033333020333330203333302031313020131310203131300013131 -- 227:3333302033333020333330203333302013131020313130201313102031313000 @@ -241,7 +241,7 @@ -- 237:1444402044140220444402204144022000402220220222200222222010222220 -- 238:3333330033333022333302223333022213130222313102221313101231313100 -- 239:0003010322200103222201032222010322220103222201012210101300013131 --- 240:02220111c222001102220000c222033302220333c222200002222222c2222222 +-- 240:0222011102220011022200000222033302220333022220000222222202222222 -- 241:1002222001202220002022203002222031222220022222202222222022222220 -- 242:3333333333333330333333033333113313130013313100311313131331313131 -- 243:0333333300333333030333330331133303100313113001310013131300313131 @@ -519,7 +519,7 @@ -- 007:ffffffffffb264748494a4b4c4d46494649464940040e4f4b2ffffffffff4040404040404040404040404040404040404040404040404040404040405d1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 008:ffffffffffe1c30515d325d33545c3d355d3c3d365b17585e1ffffffffff4040404040404098989898404040404040404040404040404040404040407c1e7e8e1e1e1e9eae1ebe1e1e1e1e1e1e1e1e72821ebe1e72821ebe1e7c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 009:ffffffffffb264e395a5b594e39564c5d5946494e5b1b1f5b2ffffffffff4040404040404040404040404040404040404040404040404040404040405d1e05151ebe1ecedeeefe1e1e1e1e1e1e1e1ee395eefe1ee395eefe1e5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 --- 010:ffffffffffe1c306162636d34656c395d5d3c3d376b1b1b1e1ffffffffff404040404040409898989840b9c9c9d9e9f90a0a0a0a4040400a0a0a0a407c1ee395eefe1e0f1f2f3f1e1e1e1e1e1e1e1ee3952f3f1ee3952f3f1e7c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +-- 010:ffffffffffe1c306162636d34656c3e3d5d3c3d376b1b1b1e1ffffffffff404040404040409898989840b9c9c9d9e9f90a0a0a0a4040400a0a0a0a407c1ee395eefe1e0f1f2f3f1e1e1e1e1e1e1e1ee3952f3f1ee3952f3f1e7c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 011:ffffffffffb264946494649464948696a694649410201020b2ffffffffff4040404040404040404040401a2a3a4a5a6a7a40404040404040404040405d1ee3952f3f1e4f5f1ebe1e1e1e1e1e1e1e1ee3951ebe1ee3951ebe1e5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 012:ffffffffffe1c37282d3c3d3c3d3b6c6d6d3c3d300e6f607e1ffffffffff4040404040404098989898408a9aaabaca9ada40404040404040404040407c1e4f5f1ebe1e0515eefe1e1e1e1e1e1e1e1ee395eefe1ee395eefe1e7c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 013:ffffffffffb264e395946494649464946494649465172737b2ffffffffffeaeaeaeaeaeaeafafafafaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaea5d1e0515eefe1e6f7f2f3f1e1e1e1e1e1e1e1e6f7f2f3f1e6f7f2f3f1e5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -- 2.49.1 From 9d56ca2e7aeed82c3a2760c926db1a8d2cf7c24d Mon Sep 17 00:00:00 2001 From: Zoltan Timar Date: Thu, 9 Apr 2026 16:36:19 +0200 Subject: [PATCH 14/17] chore: re-added have_a_coffee discussion, fixed text readability, fixed centering of texts, new system.ui functions for drawing in contour, fixed ddr types, fixed meter drawing --- impostor.inc | 1 + inc/decision/decision.have_a_coffee.lua | 14 ++ inc/decision/decision.manager.lua | 10 +- inc/decision/decision.play_button_mash.lua | 3 + inc/discussion/discussion.coworker.lua | 2 +- inc/init/init.ascension.lua | 2 +- inc/init/init.config.lua | 1 + inc/init/init.context.lua | 12 +- inc/logic/logic.meter.lua | 26 +-- inc/logic/logic.minigame.lua | 5 +- inc/screen/screen.mysterious_man.lua | 42 ++--- inc/screen/screen.toilet.lua | 20 +-- inc/system/system.print.lua | 38 +++++ inc/system/system.ui.lua | 48 +++++- inc/window/window.discussion.lua | 12 +- inc/window/window.minigame.ddr.lua | 175 ++++++++++++++------- inc/window/window.minigame.mash.lua | 3 +- inc/window/window.minigame.rhythm.lua | 9 +- 18 files changed, 296 insertions(+), 127 deletions(-) create mode 100644 inc/decision/decision.have_a_coffee.lua diff --git a/impostor.inc b/impostor.inc index 8b09814..4f7d075 100644 --- a/impostor.inc +++ b/impostor.inc @@ -48,6 +48,7 @@ decision/decision.go_to_end.lua decision/decision.go_to_walking_to_home.lua decision/decision.go_to_sleep.lua decision/decision.do_work.lua +decision/decision.have_a_coffee.lua decision/decision.sumphore_discussion.lua discussion/discussion.sumphore.lua discussion/discussion.coworker.lua diff --git a/inc/decision/decision.have_a_coffee.lua b/inc/decision/decision.have_a_coffee.lua new file mode 100644 index 0000000..985f3c9 --- /dev/null +++ b/inc/decision/decision.have_a_coffee.lua @@ -0,0 +1,14 @@ +Decision.register({ + id = "have_a_coffee", + label = "Have a Coffee", + handle = function() + local level = Ascension.get_level() + local disc_id = "coworker_disc_0" + -- TODO: Add more discussions for levels above 3 + if level >= 1 and level <= 3 then + local suffix = Context.have_done_work_today and ("_asc_" .. level) or ("_" .. level) + disc_id = "coworker_disc" .. suffix + end + Discussion.start(disc_id, "game") + end, +}) \ No newline at end of file diff --git a/inc/decision/decision.manager.lua b/inc/decision/decision.manager.lua index b0ce2c1..3dcbb86 100644 --- a/inc/decision/decision.manager.lua +++ b/inc/decision/decision.manager.lua @@ -123,9 +123,13 @@ function Decision.draw(decisions, selected_decision_index) local selected_decision = decisions[selected_decision_index] local decision_label = Decision.get_label(selected_decision) local text_y = bar_y + 4 - Print.text("<", 2, text_y, Config.colors.light_blue) - Print.text_center(decision_label, Config.screen.width / 2, text_y, Config.colors.item) - Print.text(">", Config.screen.width - 6, text_y, Config.colors.light_blue) + local left_arrow_color = Input.left() and Config.colors.white or Config.colors.orange + local right_arrow_color = Input.right() and Config.colors.white or Config.colors.orange + local left_arrow_contour_color = Input.left() and Config.colors.white or Config.colors.black + local right_arrow_contour_color = Input.right() and Config.colors.white or Config.colors.black + Print.text_center_contour("<", 6, text_y, left_arrow_color, false, 1, left_arrow_contour_color) + Print.text_center_contour(decision_label, Config.screen.width / 2, text_y, Config.colors.orange) + Print.text_center_contour(">", Config.screen.width - 6, text_y, right_arrow_color, false, 1, right_arrow_contour_color) end end diff --git a/inc/decision/decision.play_button_mash.lua b/inc/decision/decision.play_button_mash.lua index 3ac8995..22d5f9c 100644 --- a/inc/decision/decision.play_button_mash.lua +++ b/inc/decision/decision.play_button_mash.lua @@ -7,6 +7,9 @@ Decision.register({ focus_center_x = (Config.screen.width / 2) - 22, focus_center_y = (Config.screen.height / 2) - 18, focus_initial_radius = 0, + on_win = function() + Audio.music_play_room_work() + end }) end, }) diff --git a/inc/discussion/discussion.coworker.lua b/inc/discussion/discussion.coworker.lua index 61529a8..344e04c 100644 --- a/inc/discussion/discussion.coworker.lua +++ b/inc/discussion/discussion.coworker.lua @@ -40,7 +40,7 @@ Discussion.register({ { question = "Normann you look weird and unfocused. You are usually locked in and not like this, what's up?", answers = { - { label = "Nothing it's just, I noticed some bugs in the simulation, maybe.", next_step = 2 }, + { label = "Some bugs I noticed, maybe...", next_step = 2 }, }, }, { diff --git a/inc/init/init.ascension.lua b/inc/init/init.ascension.lua index 4dae906..e343b90 100644 --- a/inc/init/init.ascension.lua +++ b/inc/init/init.ascension.lua @@ -93,7 +93,7 @@ function Ascension.draw(x, y, options) else color = lit_color end - print(ch, x + (i - 1) * spacing, y, color, false, 1, true) + Print.text_contour(ch, x + (i - 1) * spacing, y, color, false, 1) end end diff --git a/inc/init/init.config.lua b/inc/init/init.config.lua index 626cd7b..f372368 100644 --- a/inc/init/init.config.lua +++ b/inc/init/init.config.lua @@ -17,6 +17,7 @@ function Config.initial_data() blue = 3, white = 4, item = 7, + orange = 7, meter_bg = 1 }, timing = { diff --git a/inc/init/init.context.lua b/inc/init/init.context.lua index 728ab68..6c095ae 100644 --- a/inc/init/init.context.lua +++ b/inc/init/init.context.lua @@ -99,15 +99,15 @@ function Context.new_game() MysteriousManScreen.start({ text = [[ Norman was never a bad - ... + simulation engineer, - ... + but - ... + we need to be careful - ... + letting him improve. - ... + We need to distract him. ]], on_text_complete = function() @@ -122,7 +122,7 @@ function Context.new_game() instruction_text = "Wake up Norman!", show_progress_text = false, on_win = function() - Audio.music_play_wakingup() + Audio.music_play_room_work() Meter.show() Window.set_current("game") end, diff --git a/inc/logic/logic.meter.lua b/inc/logic/logic.meter.lua index 001ddaa..2607582 100644 --- a/inc/logic/logic.meter.lua +++ b/inc/logic/logic.meter.lua @@ -8,10 +8,11 @@ local COMBO_MAX_BONUS = 0.16 local COMBO_TIMEOUT_FRAMES = 600 -- Internal meters for tracking game progress and player stats. -Meter.COLOR_ISM = Config.colors.red +Meter.COLOR_ISM = Config.colors.orange Meter.COLOR_WPM = Config.colors.blue -Meter.COLOR_BM = Config.colors.black +Meter.COLOR_BM = Config.colors.red Meter.COLOR_BG = Config.colors.meter_bg +Meter.COLOR_CONTOUR = Config.colors.white --- Gets initial meter values. --- @within Meter @@ -126,16 +127,16 @@ function Meter.draw() local m = Context.meters local max = Meter.get_max() - local bar_w = 44 + local screen_w = Config.screen.width + local screen_h = Config.screen.height + local bar_w = screen_w * 0.25 local bar_h = 2 - local bar_x = 182 - local label_x = 228 - local line_h = 5 - local start_y = 1 + local edge = math.max(2, math.floor(screen_w * 0.03)) + local bar_x = screen_w - bar_w - edge + local line_h = 3 + local start_y = screen_h * 0.05 - local bar_offset = math.floor((line_h - bar_h) / 2) - local meter_list = { { key = "wpm", label = "WPM", color = Meter.COLOR_WPM, row = 0 }, { key = "ism", label = "ISM", color = Meter.COLOR_ISM, row = 1 }, @@ -144,15 +145,16 @@ function Meter.draw() for _, meter in ipairs(meter_list) do local label_y = start_y + meter.row * line_h - local bar_y = label_y + bar_offset + local bar_y = label_y local fill_w = math.max(0, math.floor((m[meter.key] / max) * bar_w)) + rect(bar_x - 1, bar_y - 1, bar_w + 2, bar_h + 2, Meter.COLOR_CONTOUR) rect(bar_x, bar_y, bar_w, bar_h, Meter.COLOR_BG) if fill_w > 0 then rect(bar_x, bar_y, fill_w, bar_h, meter.color) end - print(meter.label, label_x, label_y, meter.color, false, 1, true) + ---print(meter.label, label_x, label_y, meter.color, false, 1, true) end local ascension_y = start_y + 3 * line_h + 1 - Ascension.draw(bar_x, ascension_y, { spacing = 5 }) + Ascension.draw(bar_x, ascension_y, { spacing = 8 }) end diff --git a/inc/logic/logic.minigame.lua b/inc/logic/logic.minigame.lua index 47a687c..13ccb99 100644 --- a/inc/logic/logic.minigame.lua +++ b/inc/logic/logic.minigame.lua @@ -12,8 +12,9 @@ function Minigame.draw_win_overlay(win_text) local box_h = th + padding * 2 local box_x = (Config.screen.width - box_w) / 2 local box_y = (Config.screen.height - box_h) / 2 - + local text_x = Config.screen.width / 2 rect(box_x, box_y, box_w, box_h, Config.colors.dark_grey) rectb(box_x, box_y, box_w, box_h, Config.colors.white) - Print.text_center(text, Config.screen.width / 2, box_y + padding, Config.colors.white) + Print.text_center_contour(text, text_x, box_y + padding, Config.colors.black, false, 1, Config.colors.white) end + diff --git a/inc/screen/screen.mysterious_man.lua b/inc/screen/screen.mysterious_man.lua index a0b6a05..5a07a4c 100644 --- a/inc/screen/screen.mysterious_man.lua +++ b/inc/screen/screen.mysterious_man.lua @@ -6,52 +6,52 @@ local STATE_CHOICE = "choice" local ASC_01_TEXT = [[ Normann seems to be in line, - ... + and stays seeking for oxes - ... + within the confines. - ... + Very good. ]] local ASC_12_TEXT = [[ We have a problem! - ... + Normann formed his first thought. - ... + He saw the tracks. ]] local ASC_23_TEXT = [[ Not good, not terrible. - ... + Normann caught his glimpse - ... + of another way - ... + - quite literally - - ... + if this continues, - ... + we will lose control. ]] local ASC_34_TEXT = [[ There is no turning back now for Norman. - ... + He caught on. - ... + I hoped it would never come to this... ]] --[[ Norman speaks for the first time during MM screen ]] local ASC_45_TEXT = [[ Wait, who are you? - ... + *silence* - ... + Why am I seeing this? - ... + *silence* - ... + ]] local ascension_texts = { @@ -261,16 +261,18 @@ Screen.register({ end if state == STATE_TEXT then - local cx = Config.screen.width / 2 + local screen_w = Config.screen.width local line_y = text_y for line in (text .. "\n"):gmatch("(.-)\n") do - Print.text_center(line, cx, line_y, Config.colors.light_grey) + local line_w = print(line, 0, -6, 0, false, 1) + local line_x = math.floor((screen_w - line_w) / 2) + Print.text_contour(line, (line_x - 8), line_y, Config.colors.black, false, 1) line_y = line_y + 8 end elseif state == STATE_DAY then MysteriousManScreen.draw_day_switch_background() - local day_text = day_text_override or ("Day " .. Context.day_count) - Print.text_center( + local day_text = day_text_override or ("day " .. Context.day_count) + Print.text_center_contour( day_text, Config.screen.width / 2, Config.screen.height / 2 - 3, diff --git a/inc/screen/screen.toilet.lua b/inc/screen/screen.toilet.lua index 082267d..908787f 100644 --- a/inc/screen/screen.toilet.lua +++ b/inc/screen/screen.toilet.lua @@ -36,13 +36,13 @@ Screen.register({ Sprite.draw_at("norman", norman_x, norman_y) - Print.text_center("day " .. Context.day_count, cx, 10, Config.colors.white) + Print.text_center_contour("day " .. Context.day_count, cx, 10, Config.colors.black) - local narrative = "reflecting on my past and present\n...\nboth eventually flushed." + local narrative = "reflecting on my past and present...\nboth eventually flushed..." local wrapped = UI.word_wrap(narrative, 38) local text_y = 24 for _, line in ipairs(wrapped) do - Print.text_center(line, cx, text_y, Config.colors.light_grey) + Print.text_center_contour(line, cx, text_y, Config.colors.black) text_y = text_y + 8 end @@ -56,26 +56,26 @@ Screen.register({ local meter_start_y = text_y + 10 local meter_list = { - { key = "wpm", label = "Work Productivity Meter" }, - { key = "ism", label = "Impostor Syndrome Meter" }, - { key = "bm", label = "Burnout Meter" }, + { key = "wpm", label = "Work Productivity Meter", color = Meter.COLOR_WPM }, + { key = "ism", label = "Impostor Syndrome Meter", color = Meter.COLOR_ISM }, + { key = "bm", label = "Burnout Meter", color = Meter.COLOR_BM }, } for i, meter in ipairs(meter_list) do local y = meter_start_y + (i - 1) * 20 - Print.text_center(meter.label, cx, y, Config.colors.white) + Print.text_center_contour(meter.label, cx, y, meter.color, false, 1, Config.colors.white) local bar_y = y + 8 local fill_w = math.max(0, math.floor((m[meter.key] / max_val) * bar_w)) rect(bar_x, bar_y, bar_w, bar_h, Meter.COLOR_BG) if fill_w > 0 then - rect(bar_x, bar_y, fill_w, bar_h, Config.colors.blue) + rect(bar_x, bar_y, fill_w, bar_h, meter.color) end local decay_w = print(decay_text, 0, -6, 0, false, 1) - Print.text(decay_text, bar_x - decay_w - 4, bar_y, Config.colors.light_blue) - Print.text(mult_text, bar_x + bar_w + 4, bar_y, Config.colors.light_blue) + Print.text_contour(decay_text, bar_x - decay_w - 4, bar_y, Config.colors.light_blue, false, 1, Config.colors.white) + Print.text_contour(mult_text, bar_x + bar_w + 4, bar_y, Config.colors.light_blue, false, 1, Config.colors.white) end if Ascension.get_level() > 0 then diff --git a/inc/system/system.print.lua b/inc/system/system.print.lua index ffbeba1..fdfdab8 100644 --- a/inc/system/system.print.lua +++ b/inc/system/system.print.lua @@ -14,6 +14,28 @@ function Print.text(text, x, y, color, fixed, scale) print(text, x, y, color, fixed, scale) end +--- Prints text with a contour (outline) instead of shadow. +--- @within Print +--- @param text string The text to print.
+--- @param x number The x-coordinate.
+--- @param y number The y-coordinate.
+--- @param color number The color of the text.
+--- @param[opt] fixed boolean If true, uses fixed-width font.
+--- @param[opt] scale number The scaling factor (also used for outline thickness).
+--- @param[opt] contour_color number Outline color; defaults to black; if equal to text color, uses white.
+function Print.text_contour(text, x, y, color, fixed, scale, contour_color) + scale = scale or 1 + local cc = contour_color + if cc == nil then cc = Config.colors.black end + if color == cc then cc = Config.colors.white end + local ox = { -scale, scale, 0, 0, -scale, scale, -scale, scale } + local oy = { 0, 0, -scale, scale, -scale, -scale, scale, scale } + for i = 1, 8 do + print(text, x + ox[i], y + oy[i], cc, fixed, scale) + end + print(text, x, y, color, fixed, scale) +end + --- Prints centered text with shadow. --- @within Print --- @param text string The text to print.
@@ -28,3 +50,19 @@ function Print.text_center(text, x, y, color, fixed, scale) local centered_x = x - (text_width / 2) Print.text(text, centered_x, y, color, fixed, scale) end + +--- Prints centered text with contour instead of shadow. +--- @within Print +--- @param text string The text to print.
+--- @param x number The x-coordinate for centering.
+--- @param y number The y-coordinate.
+--- @param color number The color of the text.
+--- @param[opt] fixed boolean If true, uses fixed-width font.
+--- @param[opt] scale number The scaling factor.
+--- @param[opt] contour_color number Outline color; defaults to black; if equal to text color, uses white.
+function Print.text_center_contour(text, x, y, color, fixed, scale, contour_color) + scale = scale or 1 + local text_width = print(text, 0, -6 * scale, 0, fixed, scale) + local centered_x = x - (text_width / 2) + Print.text_contour(text, centered_x, y, color, fixed, scale, contour_color) +end diff --git a/inc/system/system.ui.lua b/inc/system/system.ui.lua index 4fb219b..9626b52 100644 --- a/inc/system/system.ui.lua +++ b/inc/system/system.ui.lua @@ -90,12 +90,54 @@ end --- @param[opt] bg_color number The background fill color (default: Config.colors.dark_grey).
--- @param[opt] border_color number The border color (default: Config.colors.white).
--- @param[opt] center_text boolean Whether to center each line inside the box. Defaults to false.
+local function draw_rounded_rect_fill(x, y, w, h, radius, color) + local inner_w = w - radius * 2 + local inner_h = h - radius * 2 + if inner_w > 0 and inner_h > 0 then + rect(x + radius, y + radius, inner_w, inner_h, color) + end + if inner_w > 0 and radius > 0 then + rect(x + radius, y, inner_w, radius, color) + rect(x + radius, y + h - radius, inner_w, radius, color) + end + if radius > 0 and inner_h > 0 then + rect(x, y + radius, radius, inner_h, color) + rect(x + w - radius, y + radius, radius, inner_h, color) + end + for row = 0, radius - 1 do + for col = 0, radius - 1 do + if col + row >= radius - 1 then + pix(x + radius - 1 - col, y + radius - 1 - row, color) + pix(x + w - radius + col, y + radius - 1 - row, color) + pix(x + radius - 1 - col, y + h - radius + row, color) + pix(x + w - radius + col, y + h - radius + row, color) + end + end + end +end + +local function draw_rounded_rect_border(x, y, w, h, radius, color) + line(x + radius, y, x + w - radius - 1, y, color) + line(x + radius, y + h - 1, x + w - radius - 1, y + h - 1, color) + line(x, y + radius, x, y + h - radius - 1, color) + line(x + w - 1, y + radius, x + w - 1, y + h - radius - 1, color) + pix(x + radius - 1, y + 1, color) + pix(x + 1, y + radius - 1, color) + pix(x + w - radius, y + 1, color) + pix(x + w - 2, y + radius - 1, color) + pix(x + radius - 1, y + h - 2, color) + pix(x + 1, y + h - radius, color) + pix(x + w - radius, y + h - 2, color) + pix(x + w - 2, y + h - radius, color) +end + function UI.draw_textbox(text, box_x, box_y, box_w, box_h, scroll_y, color, bg_color, border_color, center_text) color = color or Config.colors.white - bg_color = bg_color or Config.colors.dark_grey + bg_color = bg_color or Config.colors.black border_color = border_color or Config.colors.white center_text = center_text or false + local r = 3 local padding = 4 local line_height = 8 local inner_x = box_x + padding @@ -110,7 +152,7 @@ function UI.draw_textbox(text, box_x, box_y, box_w, box_h, scroll_y, color, bg_c base_y = inner_y + math.floor((visible_height - text_height) / 2) end - rect(box_x, box_y, box_w, box_h, bg_color) + draw_rounded_rect_fill(box_x, box_y, box_w, box_h, r, bg_color) for i, line in ipairs(lines) do local ly = base_y + (i - 1) * line_height - scroll_y @@ -123,7 +165,7 @@ function UI.draw_textbox(text, box_x, box_y, box_w, box_h, scroll_y, color, bg_c end end - rectb(box_x, box_y, box_w, box_h, border_color) + draw_rounded_rect_border(box_x, box_y, box_w, box_h, r, border_color) end --- Wraps text. diff --git a/inc/window/window.discussion.lua b/inc/window/window.discussion.lua index 69dd7ca..e51db29 100644 --- a/inc/window/window.discussion.lua +++ b/inc/window/window.discussion.lua @@ -24,7 +24,7 @@ function DiscussionWindow.draw() TEXTBOX_W, TEXTBOX_H, Context.discussion.scroll_y, Config.colors.white, - Config.colors.dark_grey, + Config.colors.black, Config.colors.light_blue, true ) @@ -37,9 +37,13 @@ function DiscussionWindow.draw() local selected = answers[Context.discussion.selected_answer] local label = selected.label local answer_text_y = bar_y + 4 - Print.text("<", 2, answer_text_y, Config.colors.light_blue) - Print.text_center(label, Config.screen.width / 2, answer_text_y, Config.colors.item) - Print.text(">", Config.screen.width - 6, answer_text_y, Config.colors.light_blue) + local left_arrow_color = Input.left() and Config.colors.white or Config.colors.orange + local right_arrow_color = Input.right() and Config.colors.white or Config.colors.orange + local left_arrow_contour_color = Input.left() and Config.colors.white or Config.colors.black + local right_arrow_contour_color = Input.right() and Config.colors.white or Config.colors.black + Print.text_center_contour("<", 6, answer_text_y, left_arrow_color, false, 1, left_arrow_contour_color) + Print.text_center(label, Config.screen.width / 2, answer_text_y, Config.colors.orange) + Print.text_center_contour(">", Config.screen.width - 6, answer_text_y, right_arrow_color, false, 1, right_arrow_contour_color) end end diff --git a/inc/window/window.minigame.ddr.lua b/inc/window/window.minigame.ddr.lua index 5c92d1e..fdb9cff 100644 --- a/inc/window/window.minigame.ddr.lua +++ b/inc/window/window.minigame.ddr.lua @@ -1,7 +1,44 @@ --- @section MinigameDDRWindow +---@class MinigameDDRState +---@field special_mode string +---@field bar_fill number +---@field max_fill number +---@field fill_per_hit number +---@field miss_penalty number +---@field bar_x number +---@field bar_y number +---@field bar_width number +---@field bar_height number +---@field arrow_size number +---@field arrow_spawn_timer number +---@field arrow_spawn_interval number +---@field arrow_fall_speed number +---@field arrows table +---@field target_y number +---@field target_arrows table +---@field hit_threshold number +---@field button_pressed_timers table +---@field button_press_duration number +---@field input_cooldowns table +---@field input_cooldown_duration number +---@field frame_counter number +---@field current_song table? +---@field pattern_index number +---@field use_pattern boolean +---@field generated_length number +---@field return_window string? +---@field win_timer number +---@field on_win fun(ctx: MinigameDDRState)|nil +---@field total_misses number +---@field total_hits number +---@field special_mode_condition boolean +---@field special_mode_counter number +---@field debug_song_key string|nil +---@field debug_status string|nil + --- Background drawing for DDR minigame. ---- @witin MinigameDDRWindow +--- @within MinigameDDRWindow function MinigameDDRWindow.draw_background() local img_values = {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1} local img_runs = {809,40,5,26,178,42,4,7,30,10,127,103,11,1,116,124,116,124,115,18,60,47,115,10,105,10,115,9,108,9,114,9,108,9,114,9,108,9,114,9,33,31,44,9,114,9,34,28,46,9,114,9,108,9,114,9,108,9,114,9,108,9,114,9,108,9,114,9,109,8,114,9,109,8,114,9,109,9,112,10,105,1,3,9,111,11,104,2,3,9,111,11,101,5,3,9,111,11,101,5,3,9,111,9,103,5,3,9,111,9,99,1,2,6,3,9,111,9,99,1,2,8,1,9,111,9,3,1,88,1,3,1,2,11,1,9,111,9,3,1,88,1,3,14,1,9,111,9,3,1,88,1,3,1,2,11,1,9,111,9,3,1,88,1,5,12,1,9,111,9,3,1,88,1,3,14,1,9,111,9,3,1,88,3,1,1,2,11,1,9,111,9,3,1,88,3,1,14,1,9,111,9,3,1,88,3,2,13,2,8,111,9,3,1,88,3,3,12,3,8,110,9,3,1,88,3,3,12,3,9,109,9,3,1,88,3,1,14,3,9,109,9,3,1,90,1,1,7,3,4,3,9,109,9,3,1,90,1,1,5,6,3,3,9,108,10,3,1,44,1,4,1,40,1,1,5,7,2,3,9,108,10,3,1,44,1,4,1,38,3,1,5,7,3,2,9,108,10,3,1,48,1,39,3,1,5,7,2,3,9,108,10,3,1,88,3,1,5,6,3,3,9,108,10,3,1,32,5,4,4,3,2,38,3,1,15,2,9,108,10,3,1,41,5,2,2,2,4,32,3,1,15,2,9,108,10,2,2,41,9,2,5,3,1,3,1,23,3,1,9,1,5,2,9,108,10,2,2,41,12,35,3,1,7,4,4,2,9,108,10,2,2,32,26,30,3,1,5,7,3,2,9,108,10,2,2,36,21,31,9,7,3,2,9,108,10,2,2,35,23,30,10,6,3,2,9,108,10,2,2,35,23,30,11,4,4,2,9,108,10,2,2,34,24,30,19,2,9,108,10,2,2,33,25,30,19,2,9,108,10,2,2,32,28,28,19,2,9,108,10,2,2,32,30,26,19,2,9,108,10,2,2,33,31,24,19,2,9,108,10,2,4,37,17,32,19,2,10,107,10,2,5,85,19,2,10,107,10,2,109,2,10,107,12,1,107,3,10,107,133,107,133,107,133,107,133,107,133,107,133,107,133,118,111,129,6,63,3,28,10,121,13,98,6,142,7,76,6,129,10,13,5,77,15,109,4,31,4,78,4,24,7,75,173,66,176,64,177,62,178,62,178,62,56,31,2,7,2,2,3,2,1,2,1,61,8,62,56,114,8,62,56,114,8,62,56,114,8,62,56,114,8,62,9,8,39,114,9,61,8,9,39,114,9,61,8,9,39,114,9,61,8,9,39,114,9,61,8,9,39,114,9,61,8,9,39,114,9,61,8,9,39,115,8,61,8,8,40,115,8,61,56,115,8,61,13,2,1,1,1,1,16,1,1,2,17,115,8,61,13,2,1,1,1,2,1,1,10,2,1,1,1,2,1,2,7,1,6,115,8,60,14,2,1,1,1,5,9,2,1,1,1,2,1,2,6,2,6,115,8,59,15,2,1,1,1,5,9,2,1,1,1,2,1,2,6,2,6,115,8,59,15,2,1,1,1,6,8,2,1,1,1,2,1,2,14,115,8,59,6,1,11,1,1,7,10,1,1,2,1,2,14,115,8,59,6,1,11,1,1,7,10,1,1,2,1,2,1,1,12,115,9,58,6,1,1,2,10,9,8,1,1,2,1,2,1,1,12,115,9,58,6,1,1,2,8,1,1,9,8,1,1,2,1,2,1,1,11,116,9,58,6,1,1,2,1,2,7,9,8,1,1,2,1,2,1,1,11,116,9,58,6,1,1,2,1,2,7,9,10,2,1,2,1,1,11,116,9,58,57,116,9,58,58,115,9,102,13,116,9,58,48,2,10,1,3,22,84,5,7,58,158,7,5,6,6,75,3,7,2,7,1,7,2,6,1,6,2,6,2,4,4,6,2,6,1,6,2,6,3,6,1,6,5,7,8,7,9,11,1,9,2,50,1,22,1,14,5,3,5,3,4,3,6,3,5,2,16,2,5,3,14,2,6,2,6,5,5,11,4,30,1,50,1,37,6,3,5,3,5,2,6,3,5,3,6,1,7,2,6,2,15,2,6,2,5,6,5,12,1,15,1,106,93,2,8,10,5,2,6,2,5,4,4,100,7,3,13,2,65,3,8,3,5,2,5,4,4,3,5,4,4,100,94,2,5,3,5,4,4,6,5,2,5,105,86,2,13,3,5,4,4,6,5,2,1,1,3,102,4,2,24,2,62,1,1,2,7,3,5,4,5,4,5,2,8,4,2,92,5,2,24,2,61,5,5,7,2,5,6,3,4,3,7,102,88,6,7,12,8,6,1,3,7,103,87,6,7,11,9,6,1,3,7,110,1,9,9,5,1,2,1,3,47,162,1,10,6,27,34,162,1,10,6,27,34,97,3,57,14,2,7,26,66,9,33,5,2,17,223,17,223,18,222,47,193,53,1,3,163,19,1,85,109,14,29,36,151,784} @@ -12,7 +49,7 @@ end --- Gets initial DDR minigame configuration. --- @within MinigameDDRWindow ---- @return result table The default DDR minigame configuration. +---@return MinigameDDRState function MinigameDDRWindow.init_context() local arrow_size = 12 local arrow_spacing = 30 @@ -33,7 +70,7 @@ function MinigameDDRWindow.init_context() arrow_spawn_interval = 45, arrow_fall_speed = 1.5, arrows = {}, - target_y = 115, + target_y = 120, target_arrows = { { dir = "left", x = start_x }, { dir = "down", x = start_x + arrow_size + arrow_spacing }, @@ -60,25 +97,29 @@ function MinigameDDRWindow.init_context() } end +--- Builds song data (and optional generated pattern) for the minigame. +--- @within MinigameDDRWindow function MinigameDDRWindow.prepareSong(song, generated_length, special_mode) - local current_song = Util.deepcopy(song) + local current_song = Util.deepcopy(song) + if current_song.generated then + local pattern = musicator_generate_pattern(generated_length, current_song.bpm, current_song.spd * 4) + current_song.pattern = pattern + current_song.end_frame = pattern[#pattern].frame - if current_song.generated then - local pattern = musicator_generate_pattern(generated_length, current_song.bpm, current_song.spd * 4) - current_song.pattern = pattern - current_song.end_frame = pattern[#pattern].frame - - if special_mode == "only_special" then - for i, _ in ipairs(current_song.pattern) do - current_song.pattern[i].special = (i % 5 == 0) - end + if special_mode == "only_special" then + for i, _ in ipairs(current_song.pattern) do + current_song.pattern[i].special = (i % 5 == 0) end end + end - return current_song + return current_song end +--- Handles hit feedback and special-mode scoring for one arrow. +--- @within MinigameDDRWindow +---@param game_context MinigameDDRState function MinigameDDRWindow.on_arrow_hit_special(arrow, game_context) local special_mode = game_context.special_mode @@ -109,13 +150,15 @@ function MinigameDDRWindow.on_arrow_hit_special(arrow, game_context) end end +--- Ends the minigame: win timer, sfx, and special-mode pass/fail bookkeeping. +--- @within MinigameDDRWindow function MinigameDDRWindow.on_end(game_context) Audio.sfx_select() game_context.win_timer = Config.timing.minigame_win_duration local num_special = 0 - for _,v in ipairs(game_context.current_song.pattern) do + for _, v in ipairs(game_context.current_song.pattern) do if game_context.special_mode == "only_left" then num_special = num_special + ((v.dir == "left" and 1) or 0) else @@ -123,12 +166,9 @@ function MinigameDDRWindow.on_end(game_context) end end + local sm = game_context.special_mode local was_ok = true - if game_context.special_mode == "normal" then - was_ok = game_context.special_mode_counter == num_special - elseif game_context.special_mode == "only_special" then - was_ok = game_context.special_mode_counter == num_special - elseif game_context.special_mode == "only_left" then + if sm == "normal" or sm == "only_special" or sm == "only_left" then was_ok = game_context.special_mode_counter == num_special end @@ -192,12 +232,14 @@ end local function spawn_arrow() trace("random arrow") + ---@type MinigameDDRState local mg = Context.minigame_ddr + local y0 = mg.bar_y + mg.bar_height + 10 local target = mg.target_arrows[math.random(1, 4)] table.insert(mg.arrows, { dir = target.dir, x = target.x, - y = mg.bar_y + mg.bar_height + 10 + y = y0 }) end @@ -205,13 +247,15 @@ end --- @within MinigameDDRWindow --- @param direction string The direction of the arrow ("left", "down", "up", "right"). local function spawn_arrow_dir(direction, note, special) + ---@type MinigameDDRState local mg = Context.minigame_ddr + local y0 = mg.bar_y + mg.bar_height + 10 for _, target in ipairs(mg.target_arrows) do if target.dir == direction then table.insert(mg.arrows, { dir = direction, x = target.x, - y = mg.bar_y + mg.bar_height + 10, + y = y0, note = note, special = special }) @@ -225,6 +269,7 @@ end --- @param arrow table The arrow data. --- @return boolean True if the arrow is hit, false otherwise. local function check_hit(arrow) + ---@type MinigameDDRState local mg = Context.minigame_ddr local distance = math.abs(arrow.y - mg.target_y) return distance <= mg.hit_threshold @@ -235,34 +280,53 @@ end --- @param arrow table The arrow data. --- @return boolean True if the arrow is missed, false otherwise. local function check_miss(arrow) + ---@type MinigameDDRState local mg = Context.minigame_ddr return arrow.y > mg.target_y + mg.hit_threshold end ---- Draws an arrow. +--- Rotates a point (px, py) around (cx, cy) by a number of 90-degree CW steps. +--- @within MinigameDDRWindow +local function rotate(px, py, cx, cy, steps) + local dx, dy = px - cx, py - cy + for _ = 1, steps % 4 do + dx, dy = dy, -dx + end + return cx + dx, cy + dy +end + +local arrow_rotations = { down = 0, right = 1, up = 2, left = 3 } + +--- Draws an arrow by rotating the "down" arrow shape. --- @within MinigameDDRWindow --- @param x number The x-coordinate. --- @param y number The y-coordinate. --- @param direction string The direction of the arrow. --- @param color number The color of the arrow. local function draw_arrow(x, y, direction, color) - local size = 12 + local size = 14 local half = size / 2 - if direction == "left" then - tri(x + half, y, x, y + half, x + half, y + size, color) - rectb(x + half, y + half - 2, half, 4, color) - elseif direction == "right" then - tri(x + half, y, x + size, y + half, x + half, y + size, color) - rectb(x, y + half - 2, half, 4, color) - elseif direction == "up" then - tri(x, y + half, x + half, y, x + size, y + half, color) - rectb(x + half - 2, y + half, 4, half, color) - elseif direction == "down" then - tri(x, y + half, x + half, y + size, x + size, y + half, color) - rectb(x + half - 2, y, 4, half, color) - end + local center_x, center_y = x + half, y + half + local steps = arrow_rotations[direction] or 0 + + local head_left_x, head_left_y = rotate(x, y + half, center_x, center_y, steps) + local head_tip_x, head_tip_y = rotate(x + half, y + size, center_x, center_y, steps) + local head_right_x, head_right_y = rotate(x + size, y + half, center_x, center_y, steps) + + tri(head_left_x, head_left_y, + head_tip_x, head_tip_y, + head_right_x, head_right_y, color) + + local stem_top_x, stem_top_y = rotate(x + half - 3, y, center_x, center_y, steps) + local stem_bot_x, stem_bot_y = rotate(x + half + 3, y + half, center_x, center_y, steps) + local stem_x = math.min(stem_top_x, stem_bot_x) + local stem_y = math.min(stem_top_y, stem_bot_y) + local stem_w = math.abs(stem_bot_x - stem_top_x) + local stem_h = math.abs(stem_bot_y - stem_top_y) + rectb(stem_x, stem_y, stem_w, stem_h, color) end + --- Updates DDR minigame logic. --- @within MinigameDDRWindow function MinigameDDRWindow.update() @@ -323,10 +387,7 @@ function MinigameDDRWindow.update() arrow.y = arrow.y + mg.arrow_fall_speed if check_miss(arrow) then table.insert(arrows_to_remove, i) - mg.bar_fill = mg.bar_fill - mg.miss_penalty - if mg.bar_fill < 0 then - mg.bar_fill = 0 - end + mg.bar_fill = math.max(0, mg.bar_fill - mg.miss_penalty) mg.total_misses = mg.total_misses + 1 end end @@ -370,20 +431,14 @@ function MinigameDDRWindow.update() if arrow.dir == dir and check_hit(arrow) then MinigameDDRWindow.on_arrow_hit_special(arrow, mg) - mg.bar_fill = mg.bar_fill + mg.fill_per_hit - if mg.bar_fill > mg.max_fill then - mg.bar_fill = mg.max_fill - end + mg.bar_fill = math.min(mg.max_fill, mg.bar_fill + mg.fill_per_hit) table.remove(mg.arrows, i) hit = true break end end if not hit then - mg.bar_fill = mg.bar_fill - 2 - if mg.bar_fill < 0 then - mg.bar_fill = 0 - end + mg.bar_fill = math.max(0, mg.bar_fill - 2) mg.total_misses = mg.total_misses + 1 end end @@ -393,6 +448,7 @@ end --- Draws DDR minigame. --- @within MinigameDDRWindow function MinigameDDRWindow.draw() + ---@type MinigameDDRState|nil local mg = Context.minigame_ddr if not mg then cls(0) @@ -420,8 +476,6 @@ function MinigameDDRWindow.draw() end rect(mg.bar_x, mg.bar_y, fill_width, mg.bar_height, bar_color) end - local percentage = math.floor((mg.bar_fill / mg.max_fill) * 100) - Print.text_center(percentage .. "%", mg.bar_x + mg.bar_width / 2, mg.bar_y + 2, Config.colors.black) if mg.target_arrows then for _, target in ipairs(mg.target_arrows) do local is_pressed = mg.button_pressed_timers[target.dir] and mg.button_pressed_timers[target.dir] > 0 @@ -435,7 +489,7 @@ function MinigameDDRWindow.draw() draw_arrow(arrow.x, arrow.y, arrow.dir, arrow_color) end end - Print.text_center("Hit the arrows!", Config.screen.width / 2, mg.bar_y + mg.bar_height + 10, Config.colors.light_grey) + Print.text_center_contour("Hit the arrows!", Config.screen.width / 2, mg.bar_y + mg.bar_height + 10, Config.colors.light_blue) local debug_y = 60 if mg.debug_status then Print.text_center(mg.debug_status, Config.screen.width / 2, debug_y, Config.colors.item) @@ -459,13 +513,14 @@ function MinigameDDRWindow.draw() elseif Context.test_mode then Print.text_center("RANDOM MODE", Config.screen.width / 2, debug_y, Config.colors.blue) end -if mg.win_timer > 0 then - if mg.special_mode_condition then - Minigame.draw_win_overlay("SUCCESS...?") - elseif mg.total_hits < 10 then - Minigame.draw_win_overlay("MEH...") - else - Minigame.draw_win_overlay() + + if mg.win_timer > 0 then + if mg.special_mode_condition then + Minigame.draw_win_overlay("SUCCESS...?") + elseif mg.total_hits < 10 then + Minigame.draw_win_overlay("MEH...") + else + Minigame.draw_win_overlay() + end end end -end diff --git a/inc/window/window.minigame.mash.lua b/inc/window/window.minigame.mash.lua index ec52b9b..467eaf1 100644 --- a/inc/window/window.minigame.mash.lua +++ b/inc/window/window.minigame.mash.lua @@ -49,6 +49,7 @@ end --- @param return_window string The window ID to return to after the minigame.
--- @param[opt] params table Optional parameters for minigame configuration.
function MinigameButtonMashWindow.start(return_window, params) + Audio.music_stop() MinigameButtonMashWindow.init(params) local mg = Context.minigame_button_mash mg.return_window = return_window or "game" @@ -145,7 +146,7 @@ function MinigameButtonMashWindow.draw() circ(mg.button_x, mg.button_y, mg.button_size - 2, button_color) end Print.text_center("Z", mg.button_x, mg.button_y - 3, button_color) - Print.text_center(mg.instruction_text, Config.screen.width / 2, mg.bar_y + mg.bar_height + 10, Config.colors.light_grey) + Print.text_center_contour(mg.instruction_text, Config.screen.width / 2, mg.bar_y + mg.bar_height + 10, Config.colors.light_blue) if mg.show_progress_text then local points_text = math.floor(mg.bar_fill) .. "/" .. mg.target_points Print.text_center(points_text, mg.bar_x + mg.bar_width / 2, mg.bar_y + 2, Config.colors.black) diff --git a/inc/window/window.minigame.rhythm.lua b/inc/window/window.minigame.rhythm.lua index 15a893c..d3ba312 100644 --- a/inc/window/window.minigame.rhythm.lua +++ b/inc/window/window.minigame.rhythm.lua @@ -53,6 +53,7 @@ end --- @param return_window string The window ID to return to after the minigame.
--- @param[opt] params table Optional parameters for minigame configuration.
function MinigameRhythmWindow.start(return_window, params) + Audio.music_stop() MinigameRhythmWindow.init(params) local mg = Context.minigame_rhythm mg.return_window = return_window or "game" @@ -146,14 +147,14 @@ function MinigameRhythmWindow.draw() local target_left = mg.target_center - (mg.target_width / 2) local target_x = mg.bar_x + (target_left * mg.bar_width) local target_width_pixels = mg.target_width * mg.bar_width - rect(target_x, mg.bar_y, target_width_pixels, mg.bar_height, Config.colors.light_blue) + rect(target_x, mg.bar_y, target_width_pixels, mg.bar_height, Config.colors.orange) local line_x = mg.bar_x + (mg.line_position * mg.bar_width) - rect(line_x - 1, mg.bar_y, 2, mg.bar_height, Config.colors.item) - Print.text_center( + rect(line_x - 1, mg.bar_y, 2, mg.bar_height, Config.colors.light_blue) + Print.text_center_contour( "Sleep Norman ... Sleep!", Config.screen.width / 2, mg.bar_y + mg.bar_height + 14, - Config.colors.light_grey + Config.colors.light_blue ) local button_color = Config.colors.light_grey if mg.button_pressed_timer > 0 then -- 2.49.1 From e797377ec1274af8efc758623d0cfd63ef1d4688 Mon Sep 17 00:00:00 2001 From: Zoltan Timar Date: Thu, 9 Apr 2026 16:40:19 +0200 Subject: [PATCH 15/17] chore: lint fixes --- inc/init/init.context.lua | 10 ++--- inc/system/system.ui.lua | 60 +++++++++++++++--------------- inc/window/window.minigame.ddr.lua | 12 +++--- 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/inc/init/init.context.lua b/inc/init/init.context.lua index 6c095ae..9579296 100644 --- a/inc/init/init.context.lua +++ b/inc/init/init.context.lua @@ -99,15 +99,15 @@ function Context.new_game() MysteriousManScreen.start({ text = [[ Norman was never a bad - + simulation engineer, - + but - + we need to be careful - + letting him improve. - + We need to distract him. ]], on_text_complete = function() diff --git a/inc/system/system.ui.lua b/inc/system/system.ui.lua index 9626b52..87f70c3 100644 --- a/inc/system/system.ui.lua +++ b/inc/system/system.ui.lua @@ -90,45 +90,45 @@ end --- @param[opt] bg_color number The background fill color (default: Config.colors.dark_grey).
--- @param[opt] border_color number The border color (default: Config.colors.white).
--- @param[opt] center_text boolean Whether to center each line inside the box. Defaults to false.
-local function draw_rounded_rect_fill(x, y, w, h, radius, color) - local inner_w = w - radius * 2 - local inner_h = h - radius * 2 +local function draw_rounded_rect_fill(x, y, w, h, corner_radius, color) + local inner_w = w - corner_radius * 2 + local inner_h = h - corner_radius * 2 if inner_w > 0 and inner_h > 0 then - rect(x + radius, y + radius, inner_w, inner_h, color) + rect(x + corner_radius, y + corner_radius, inner_w, inner_h, color) end - if inner_w > 0 and radius > 0 then - rect(x + radius, y, inner_w, radius, color) - rect(x + radius, y + h - radius, inner_w, radius, color) + if inner_w > 0 and corner_radius > 0 then + rect(x + corner_radius, y, inner_w, corner_radius, color) + rect(x + corner_radius, y + h - corner_radius, inner_w, corner_radius, color) end - if radius > 0 and inner_h > 0 then - rect(x, y + radius, radius, inner_h, color) - rect(x + w - radius, y + radius, radius, inner_h, color) + if corner_radius > 0 and inner_h > 0 then + rect(x, y + corner_radius, corner_radius, inner_h, color) + rect(x + w - corner_radius, y + corner_radius, corner_radius, inner_h, color) end - for row = 0, radius - 1 do - for col = 0, radius - 1 do - if col + row >= radius - 1 then - pix(x + radius - 1 - col, y + radius - 1 - row, color) - pix(x + w - radius + col, y + radius - 1 - row, color) - pix(x + radius - 1 - col, y + h - radius + row, color) - pix(x + w - radius + col, y + h - radius + row, color) + for row = 0, corner_radius - 1 do + for col = 0, corner_radius - 1 do + if col + row >= corner_radius - 1 then + pix(x + corner_radius - 1 - col, y + corner_radius - 1 - row, color) + pix(x + w - corner_radius + col, y + corner_radius - 1 - row, color) + pix(x + corner_radius - 1 - col, y + h - corner_radius + row, color) + pix(x + w - corner_radius + col, y + h - corner_radius + row, color) end end end end -local function draw_rounded_rect_border(x, y, w, h, radius, color) - line(x + radius, y, x + w - radius - 1, y, color) - line(x + radius, y + h - 1, x + w - radius - 1, y + h - 1, color) - line(x, y + radius, x, y + h - radius - 1, color) - line(x + w - 1, y + radius, x + w - 1, y + h - radius - 1, color) - pix(x + radius - 1, y + 1, color) - pix(x + 1, y + radius - 1, color) - pix(x + w - radius, y + 1, color) - pix(x + w - 2, y + radius - 1, color) - pix(x + radius - 1, y + h - 2, color) - pix(x + 1, y + h - radius, color) - pix(x + w - radius, y + h - 2, color) - pix(x + w - 2, y + h - radius, color) +local function draw_rounded_rect_border(x, y, w, h, corner_radius, color) + line(x + corner_radius, y, x + w - corner_radius - 1, y, color) + line(x + corner_radius, y + h - 1, x + w - corner_radius - 1, y + h - 1, color) + line(x, y + corner_radius, x, y + h - corner_radius - 1, color) + line(x + w - 1, y + corner_radius, x + w - 1, y + h - corner_radius - 1, color) + pix(x + corner_radius - 1, y + 1, color) + pix(x + 1, y + corner_radius - 1, color) + pix(x + w - corner_radius, y + 1, color) + pix(x + w - 2, y + corner_radius - 1, color) + pix(x + corner_radius - 1, y + h - 2, color) + pix(x + 1, y + h - corner_radius, color) + pix(x + w - corner_radius, y + h - 2, color) + pix(x + w - 2, y + h - corner_radius, color) end function UI.draw_textbox(text, box_x, box_y, box_w, box_h, scroll_y, color, bg_color, border_color, center_text) diff --git a/inc/window/window.minigame.ddr.lua b/inc/window/window.minigame.ddr.lua index fdb9cff..6a0167c 100644 --- a/inc/window/window.minigame.ddr.lua +++ b/inc/window/window.minigame.ddr.lua @@ -306,19 +306,19 @@ local arrow_rotations = { down = 0, right = 1, up = 2, left = 3 } local function draw_arrow(x, y, direction, color) local size = 14 local half = size / 2 - local center_x, center_y = x + half, y + half + local pivot_x, pivot_y = x + half, y + half local steps = arrow_rotations[direction] or 0 - local head_left_x, head_left_y = rotate(x, y + half, center_x, center_y, steps) - local head_tip_x, head_tip_y = rotate(x + half, y + size, center_x, center_y, steps) - local head_right_x, head_right_y = rotate(x + size, y + half, center_x, center_y, steps) + local head_left_x, head_left_y = rotate(x, y + half, pivot_x, pivot_y, steps) + local head_tip_x, head_tip_y = rotate(x + half, y + size, pivot_x, pivot_y, steps) + local head_right_x, head_right_y = rotate(x + size, y + half, pivot_x, pivot_y, steps) tri(head_left_x, head_left_y, head_tip_x, head_tip_y, head_right_x, head_right_y, color) - local stem_top_x, stem_top_y = rotate(x + half - 3, y, center_x, center_y, steps) - local stem_bot_x, stem_bot_y = rotate(x + half + 3, y + half, center_x, center_y, steps) + local stem_top_x, stem_top_y = rotate(x + half - 3, y, pivot_x, pivot_y, steps) + local stem_bot_x, stem_bot_y = rotate(x + half + 3, y + half, pivot_x, pivot_y, steps) local stem_x = math.min(stem_top_x, stem_bot_x) local stem_y = math.min(stem_top_y, stem_bot_y) local stem_w = math.abs(stem_bot_x - stem_top_x) -- 2.49.1 From 5ae1eec48a3027c8c79c0392f8f67ff4e11fd221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tari=20Bal=C3=A1zs?= Date: Thu, 9 Apr 2026 20:47:59 +0200 Subject: [PATCH 16/17] - task #134: randomize placement of characters --- inc/init/init.context.lua | 3 ++ inc/screen/screen.office.lua | 42 ++++++++++++---- inc/screen/screen.walking_to_office.lua | 28 +++++++++-- inc/sprite/sprite.manager.lua | 64 +++++++++++++++++++++++++ inc/system/system.mouse.lua | 5 ++ 5 files changed, 128 insertions(+), 14 deletions(-) diff --git a/inc/init/init.context.lua b/inc/init/init.context.lua index 728ab68..9ada71d 100644 --- a/inc/init/init.context.lua +++ b/inc/init/init.context.lua @@ -28,6 +28,7 @@ function Context.initial_data() return { current_menu_item = 1, test_mode = false, + mouse_trace = false, popup = { show = false, content = {} @@ -46,6 +47,8 @@ function Context.initial_data() have_done_work_today = false, should_ascend = false, have_met_sumphore = false, + office_sprites = {}, + walking_to_office_sprites = {}, game = { current_screen = "home", }, diff --git a/inc/screen/screen.office.lua b/inc/screen/screen.office.lua index 8d8aa89..aca55b8 100644 --- a/inc/screen/screen.office.lua +++ b/inc/screen/screen.office.lua @@ -8,21 +8,43 @@ Screen.register({ }, init = function() Audio.music_play_room_work() + Context.have_been_to_office = true + + local possible_sprites = { + "dev_project_manager", + "dev_hr_girl", + "dev_introvert", + "dev_extrovert", + "dev_guru", + "dev_operator", + {id="dev_buddy", y_correct=1 * 8}, + {id="dev_boy", y_correct=1 * 8}, + {id="dev_girl", y_correct=1 * 8} + } + + local possible_positions = { + {x = 6 * 8, y = 4 * 8}, + {x = 10 * 8, y = 11 * 8 + 4}, + {x = 12 * 8, y = 4 * 8}, + {x = 15 * 8, y = 9 * 8}, + {x = 16 * 8, y = 4 * 8}, + {x = 17 * 8, y = 8 * 8}, + {x = 17 * 8, y = 11 * 8}, + {x = 20 * 8, y = 4 * 8}, + {x = 23 * 8, y = 5 * 8}, + {x = 22 * 8, y = 10 * 8 + 4}, + {x = 27 * 8, y = 10 * 8 + 4}, + {x = -4 + 5 * 8, y = 9 * 8} + } + + Context.office_sprites = Sprite.list_randomize(possible_sprites, possible_positions) end, background = "office", draw = function() if Window.get_current_id() == "game" then Sprite.draw_at("norman", 13 * 8, 9 * 8) - Sprite.draw_at("dev_buddy", 15 * 8, 9 * 8) - Sprite.draw_at("dev_project_manager", 6 * 8, 4 * 8) - Sprite.draw_at("dev_hr_girl", 12 * 8, 4 * 8) - Sprite.draw_at("dev_introvert", -4 + 5 * 8, 9 * 8) - Sprite.draw_at("dev_extrovert", 20 * 8, 4 * 8) - Sprite.draw_at("dev_girl", 23 * 8, 5 * 8) - Sprite.draw_at("dev_boy", 10 * 8, 11 * 8 + 4) - Sprite.draw_at("dev_guru", 22 * 8, 10 * 8 + 4) - Sprite.draw_at("dev_operator", 27 * 8, 10 * 8 + 4) + + Sprite.draw_list(Context.office_sprites) end - Context.have_been_to_office = true end }) diff --git a/inc/screen/screen.walking_to_office.lua b/inc/screen/screen.walking_to_office.lua index 4e78252..af578d4 100644 --- a/inc/screen/screen.walking_to_office.lua +++ b/inc/screen/screen.walking_to_office.lua @@ -8,6 +8,28 @@ Screen.register({ }, init = function() Audio.music_play_room_work() + + local possible_sprites = { + "matrix_trinity", + "matrix_neo", + {id="matrix_oraculum", y_correct=1 * 8}, + "matrix_architect" + } + + local possible_positions = { + {x = 5 * 8, y = 11 * 8}, + {x = 7 * 8, y = 11 * 8}, + {x = 9 * 8, y = 11 * 8}, + {x = 11 * 8, y = 11 * 8}, + {x = 13 * 8, y = 11 * 8}, + {x = 15 * 8, y = 11 * 8}, + {x = 18 * 8, y = 11 * 8}, + {x = 21 * 8, y = 11 * 8}, + {x = 24 * 8, y = 11 * 8}, + {x = 27 * 8, y = 11 * 8}, + } + + Context.walking_to_office_sprites = Sprite.list_randomize(possible_sprites, possible_positions) end, background = "street", draw = function() @@ -16,10 +38,8 @@ Screen.register({ Sprite.draw_at("sumphore", 9 * 8, 2 * 8) Sprite.draw_at("pizza_vendor", 19 * 8, 1 * 8) Sprite.draw_at("dev_guard", 22 * 8, 2 * 8) - Sprite.draw_at("matrix_trinity", 5 * 8, 11 * 8) - Sprite.draw_at("matrix_neo", 7 * 8, 11 * 8) - Sprite.draw_at("matrix_oraculum", 9 * 8, 12 * 8) - Sprite.draw_at("matrix_architect", 11 * 8, 11 * 8) + + Sprite.draw_list(Context.walking_to_office_sprites) end end }) diff --git a/inc/sprite/sprite.manager.lua b/inc/sprite/sprite.manager.lua index ad85dce..47c1a47 100644 --- a/inc/sprite/sprite.manager.lua +++ b/inc/sprite/sprite.manager.lua @@ -73,6 +73,70 @@ function Sprite.generate_table(width, height, starting_s, x_base, y_base, x_step return sprites end +--- Immediately draws a list of sprites +--- @within Sprite +--- @param sprite_list table An array of tables, each containing: `id` (string) sprite identifier, `x` (number) x-coordinate, `y` (number) y-coordinate, and optional `colorkey`, `scale`, `flip_x`, `flip_y`, `rot` parameters. +function Sprite.draw_list(sprite_list) + for _, sprite_info in ipairs(sprite_list) do + local sprite_data = _sprites[sprite_info.id] + if not sprite_data then + trace("Error: Attempted to draw non-registered sprite with id: " .. sprite_info.id) + else + draw_sprite_instance(sprite_data, sprite_info) + end + end +end + +--- Given a list of sprite IDs (or sprite entries with correction offsets) and a list of possible positions, randomly assigns each sprite to a unique position and returns a drawable list. +--- @within Sprite +--- @param sprite_ids table An array of sprite identifier values or tables. +--- Each entry may be either: +--- - string: sprite ID to draw. +--- - table: { sprite_id = string, x_correct = number, y_correct = number }. +--- @param positions table An array of tables, each containing `x` and `y` fields for possible sprite positions. +function Sprite.list_randomize(sprite_ids, positions) + if #sprite_ids > #positions then + trace("Error: More sprite IDs than available positions in Sprite.draw_randomized") + return + end + + local shuffled_positions = {} + for i, pos in ipairs(positions) do + shuffled_positions[i] = pos + end + for i = #shuffled_positions, 2, -1 do + local j = math.random(i) + shuffled_positions[i], shuffled_positions[j] = shuffled_positions[j], shuffled_positions[i] + end + + local drawable_list = {} + for i, sprite_entry in ipairs(sprite_ids) do + local sprite_id = sprite_entry + local x_correct = 0 + local y_correct = 0 + + if type(sprite_entry) == "table" then + sprite_id = sprite_entry.sprite_id or sprite_entry.id + x_correct = sprite_entry.x_correct or 0 + y_correct = sprite_entry.y_correct or 0 + end + + local sprite_data = _sprites[sprite_id] + if not sprite_data then + trace("Error: Attempted to draw non-registered sprite with id: " .. tostring(sprite_id)) + else + local pos = shuffled_positions[i] + table.insert(drawable_list, { + id = sprite_id, + x = pos.x + x_correct, + y = pos.y + y_correct + }) + end + end + + return drawable_list +end + --- Schedules a sprite for drawing. --- @within Sprite --- @param id string The unique identifier of the sprite.
diff --git a/inc/system/system.mouse.lua b/inc/system/system.mouse.lua index 3140ffa..3470ed5 100644 --- a/inc/system/system.mouse.lua +++ b/inc/system/system.mouse.lua @@ -10,6 +10,11 @@ function Mouse.update() _consumed = false local mt = {mouse()} _mx, _my, _mleft = mt[1], mt[2], mt[3] + + -- trace mouse position and tile for testing purposes + if Context.test_mode and Context.mouse_trace then + trace("Mouse: (" .. _mx .. "," .. _my .. "), tile: (" .. math.floor(_mx / 8) .. "," .. math.floor(_my / 8) .. ")") + end end --- Returns current mouse X position. -- 2.49.1 From ae3415b417dcaf24eb118cc3f4361016d61ee034 Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Thu, 9 Apr 2026 21:44:52 +0200 Subject: [PATCH 17/17] main menu color fix --- inc/window/window.menu.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/inc/window/window.menu.lua b/inc/window/window.menu.lua index 62afbf1..ad33971 100644 --- a/inc/window/window.menu.lua +++ b/inc/window/window.menu.lua @@ -19,7 +19,7 @@ end --- Draws the header with title and separator. --- @within MenuWindow function MenuWindow.draw_header() - rect(0, 0, Config.screen.width, HEADER_H, Config.colors.dark_grey) + rect(0, 0, Config.screen.width, HEADER_H, Config.colors.black) rect(0, HEADER_H - 2, Config.screen.width, 2, Config.colors.light_blue) local cx = Config.screen.width / 2 @@ -37,17 +37,19 @@ end function MenuWindow.draw_norman() local nx = math.floor(Config.screen.width * 0.45 / 2) - 32 local ny = HEADER_H + math.floor((Config.screen.height - HEADER_H - 96) / 2) - spr(272, nx, ny, 0, 4) - spr(273, nx + 32, ny, 0, 4) - spr(288, nx, ny + 32, 0, 4) - spr(289, nx + 32, ny + 32, 0, 4) - spr(304, nx, ny + 64, 0, 4) - spr(305, nx + 32, ny + 64, 0, 4) + spr(272, nx, ny, Config.colors.transparent, 4) + spr(273, nx + 32, ny, Config.colors.transparent, 4) + spr(288, nx, ny + 32, Config.colors.transparent, 4) + spr(289, nx + 32, ny + 32, Config.colors.transparent, 4) + spr(304, nx, ny + 64, Config.colors.transparent, 4) + spr(305, nx + 32, ny + 64, Config.colors.transparent, 4) end --- Draws the menu window. --- @within MenuWindow function MenuWindow.draw() + cls(Config.colors.blue +) MenuWindow.draw_header() if _anim > 0 then -- 2.49.1