diff --git a/impostor.inc b/impostor.inc index 4f7d075..5866fe1 100644 --- a/impostor.inc +++ b/impostor.inc @@ -3,6 +3,7 @@ init/init.module.lua init/init.config.lua init/init.ascension.lua init/init.context.lua +init/init.context_debug.lua system/system.util.lua system/system.print.lua system/system.input.lua @@ -73,6 +74,7 @@ window/window.intro.brief.lua window/window.menu.lua window/window.controls.lua window/window.audiotest.lua +window/window.ascend_debug.lua window/window.popup.lua window/window.minigame.mash.lua window/window.minigame.rhythm.lua diff --git a/inc/init/init.context_debug.lua b/inc/init/init.context_debug.lua new file mode 100644 index 0000000..7480f38 --- /dev/null +++ b/inc/init/init.context_debug.lua @@ -0,0 +1,65 @@ +-- Debug helper: start the game at a specific ascension level. +-- Set enabled = true and asc_level = 0..Ascension.get_max_level() before launching. +ContextDebug = { + enabled = false, + asc_level = 0, +} + +local _level_overrides = { + [0] = { + day_count = 1, + home_norman_visible = true, + have_been_to_office = false, + have_done_work_today = false, + have_met_sumphore = false, + }, +} +for i = 1, Ascension.get_max_level() do + _level_overrides[i] = { + day_count = i + 3, + home_norman_visible = true, + have_been_to_office = false, + have_done_work_today = false, + have_met_sumphore = true, + } +end + +--- Returns Context.initial_data() overridden for the given ascension level. +--- @within Context +--- @param level number Target ascension level (0..Ascension.get_max_level()). +--- @return table Debug-patched initial context data. +function Context.initial_data_debug_asc(level) + local data = Context.initial_data() + data.test_mode = true + data.game_in_progress = true + data.ascension = { level = level } + local overrides = _level_overrides[level] or _level_overrides[0] + for k, v in pairs(overrides) do + data[k] = v + end + return data +end + +for i = 0, Ascension.get_max_level() do + Context["initial_data_debug_asc_" .. i] = function() + return Context.initial_data_debug_asc(i) + end +end + +--- Starts the game at the given ascension level (defaults to ContextDebug.asc_level). +--- Wire this to a key or call it directly; do not use Context.new_game() when debugging. +--- @within Context +--- @param level number|nil Target ascension level. +function Context.new_game_debug(level) + ContextDebug.enabled = true + ContextDebug.asc_level = level or ContextDebug.asc_level + + local data = Context["initial_data_debug_asc_" .. ContextDebug.asc_level]() + for k in pairs(Context) do + if type(Context[k]) ~= "function" then Context[k] = nil end + end + for k, v in pairs(data) do Context[k] = v end + + MenuWindow.refresh_menu_items() + Screen.get_by_id(Context.game.current_screen).init() +end diff --git a/inc/window/window.ascend_debug.lua b/inc/window/window.ascend_debug.lua new file mode 100644 index 0000000..f0b1c03 --- /dev/null +++ b/inc/window/window.ascend_debug.lua @@ -0,0 +1,41 @@ +--- @section AscendDebugWindow +local _level = 0 + +--- Initialises the ASCEND debug start window. +--- @within AscendDebugWindow +function AscendDebugWindow.init() + _level = 0 +end + +--- Draws the ASCEND debug start window. +--- @within AscendDebugWindow +function AscendDebugWindow.draw() + UI.draw_top_bar("ASCEND Debug Start") + + local cx = Config.screen.width / 2 + local cy = Config.screen.height / 2 + + local left_arrow = _level > 0 and "<- " or " " + local right_arrow = _level < Ascension.get_max_level() and " ->" or " " + local label = left_arrow .. "Start at: " .. _level .. right_arrow + Print.text_center(label, cx, cy - 4, Config.colors.white, false, 1) + + Print.text_center("Z/select: start X/back: menu", cx, Config.screen.height - 10, Config.colors.dark_grey, false, 1) +end + +--- Updates the ASCEND debug start window logic. +--- @within AscendDebugWindow +function AscendDebugWindow.update() + if Input.left() then + _level = math.max(0, _level - 1) + elseif Input.right() then + _level = math.min(Ascension.get_max_level(), _level + 1) + elseif Input.select() then + Audio.sfx_select() + Context.new_game_debug(_level) + GameWindow.set_state("game") + elseif Input.back() then + Audio.sfx_deselect() + GameWindow.set_state("menu") + end +end diff --git a/inc/window/window.menu.lua b/inc/window/window.menu.lua index ad33971..fe15809 100644 --- a/inc/window/window.menu.lua +++ b/inc/window/window.menu.lua @@ -161,6 +161,13 @@ function MenuWindow.ddr_test() MinigameDDRWindow.start("menu", "generated", { special_mode = "only_nothing" }) end +--- Opens the ASCEND debug start window. +--- @within MenuWindow +function MenuWindow.ascend_debug() + AscendDebugWindow.init() + GameWindow.set_state("ascend_debug") +end + --- Refreshes the list of menu items based on current game state. --- @within MenuWindow function MenuWindow.refresh_menu_items() @@ -178,6 +185,7 @@ function MenuWindow.refresh_menu_items() 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 = "Start at ASCEND N", decision = MenuWindow.ascend_debug}) end table.insert(_menu_items, {label = "Exit", decision = MenuWindow.exit}) diff --git a/inc/window/window.register.lua b/inc/window/window.register.lua index a3388ac..722a364 100644 --- a/inc/window/window.register.lua +++ b/inc/window/window.register.lua @@ -22,6 +22,9 @@ Window.register("controls", ControlsWindow) AudioTestWindow = {} Window.register("audiotest", AudioTestWindow) +AscendDebugWindow = {} +Window.register("ascend_debug", AscendDebugWindow) + MinigameButtonMashWindow = {} Window.register("minigame_button_mash", MinigameButtonMashWindow)