diff --git a/inc/desition/desition.manager.lua b/inc/desition/desition.manager.lua index 30471a1..3d0ea4f 100644 --- a/inc/desition/desition.manager.lua +++ b/inc/desition/desition.manager.lua @@ -1,9 +1,5 @@ -DesitionManager = {} +local _desitions = {} -local _desitions = {} -- Private table to store all desitions - --- Registers a decision object with the manager --- desition: A table containing id, label, handle(), and condition() function DesitionManager.register(desition) if not desition or not desition.id then PopupWindow.show({"Error: Invalid desition object registered (missing id)!"}) @@ -14,7 +10,6 @@ function DesitionManager.register(desition) return end - -- Ensure handle() and condition() methods exist with defaults if missing if not desition.condition then desition.condition = function() return true end end @@ -22,20 +17,15 @@ function DesitionManager.register(desition) desition.handle = function() end end if _desitions[desition.id] then - -- Optional: warning if overwriting an existing desition trace("Warning: Overwriting desition with id: " .. desition.id) end _desitions[desition.id] = desition end --- Retrieves a desition by its id --- id: unique string identifier of the desition --- Returns the desition object, or nil if not found function DesitionManager.get(id) return _desitions[id] end --- Optional: a way to get all registered desitions, if needed (e.g., for debug) function DesitionManager.get_all() return _desitions end diff --git a/inc/init/init.config.lua b/inc/init/init.config.lua index a0d6ab3..73296b0 100644 --- a/inc/init/init.config.lua +++ b/inc/init/init.config.lua @@ -8,7 +8,7 @@ local DEFAULT_CONFIG = { light_grey = 13, dark_grey = 14, green = 6, - item = 12 -- yellow + item = 12 }, player = { sprite_id = 1 @@ -19,7 +19,6 @@ local DEFAULT_CONFIG = { } local Config = { - -- Copy default values initially screen = DEFAULT_CONFIG.screen, colors = DEFAULT_CONFIG.colors, player = DEFAULT_CONFIG.player, @@ -28,28 +27,23 @@ local Config = { local CONFIG_SAVE_BANK = 7 local CONFIG_MAGIC_VALUE_ADDRESS = 2 -local CONFIG_SPLASH_DURATION_ADDRESS = 3 -- New address for splash duration -local CONFIG_MAGIC_VALUE = 0xDE -- A magic number to check if config is saved +local CONFIG_SPLASH_DURATION_ADDRESS = 3 +local CONFIG_MAGIC_VALUE = 0xDE function Config.save() - mset(CONFIG_MAGIC_VALUE, CONFIG_MAGIC_VALUE_ADDRESS, CONFIG_SAVE_BANK) -- Mark as saved - --mset(Config.timing.splash_duration, CONFIG_SPLASH_DURATION_ADDRESS, CONFIG_SAVE_BANK) + mset(CONFIG_MAGIC_VALUE, CONFIG_MAGIC_VALUE_ADDRESS, CONFIG_SAVE_BANK) end function Config.load() if mget(CONFIG_MAGIC_VALUE_ADDRESS, CONFIG_SAVE_BANK) == CONFIG_MAGIC_VALUE then - -- Config has been saved, load values Config.timing.splash_duration = mget(CONFIG_SPLASH_DURATION_ADDRESS, CONFIG_SAVE_BANK) else - -- No saved config, restore defaults Config.restore_defaults() end end function Config.restore_defaults() Config.timing.splash_duration = DEFAULT_CONFIG.timing.splash_duration - -- Any other configurable items should be reset here end --- Load configuration on startup Config.load() diff --git a/inc/init/init.context.lua b/inc/init/init.context.lua index 44b8f21..54f4cb6 100644 --- a/inc/init/init.context.lua +++ b/inc/init/init.context.lua @@ -4,20 +4,6 @@ local SAVE_GAME_MAGIC_VALUE = 0xCA local SAVE_GAME_CURRENT_SCREEN_ADDRESS = 6 --- Helper for deep copying tables --- local function clone_table(t) --- local copy = {} --- for k, v in pairs(t) do --- if type(v) == "table" then --- copy[k] = clone_table(v) --- else --- copy[k] = v --- end --- end --- return copy --- end - --- This function returns a table containing only the initial *data* for Context local function get_initial_data() return { active_window = WINDOW_SPLASH, @@ -38,9 +24,9 @@ on than meets the eye.]] }, current_screen = 1, splash_timer = Config.timing.splash_duration, - popup = { -- New popup table + popup = { show = false, - content = {} -- Array of strings + content = {} }, player = { sprite_id = Config.player.sprite_id @@ -53,9 +39,9 @@ on than meets the eye.]] }, menu_items = {}, selected_menu_item = 1, - selected_desition_index = 1, -- New desition index - game_in_progress = false, -- New flag - screens = {} -- Initialize as empty, populated on reset + selected_desition_index = 1, + game_in_progress = false, + screens = {} } end @@ -64,39 +50,30 @@ Context = {} local function reset_context_to_initial_state() local initial_data = get_initial_data() - -- Clear existing data properties from Context (but not methods) for k in pairs(Context) do - if type(Context[k]) ~= "function" then -- Only clear data, leave functions - Context[k] = nil + if type(Context[k]) ~= "function" then Context[k] = nil end end - -- Copy all initial data properties into Context for k, v in pairs(initial_data) do Context[k] = v end - -- Populate Context.screens from ScreenManager, ensuring indexed array Context.screens = {} - Context.screen_indices_by_id = {} -- Renamed for clarity, stores index - -- The screen order needs to be explicit to ensure consistent numerical indices + Context.screen_indices_by_id = {} local screen_order = {"home", "toilet", "walking_to_office", "office", "walking_to_home"} for i, screen_id in ipairs(screen_order) do local screen_data = ScreenManager.get_by_id(screen_id) if screen_data then table.insert(Context.screens, screen_data) - Context.screen_indices_by_id[screen_id] = i -- Store index - else - -- Handle error if a screen is not registered + Context.screen_indices_by_id[screen_id] = i else PopupWindow.show({"Error: Screen '" .. screen_id .. "' not registered!"}) end end end --- Initially populate Context with data reset_context_to_initial_state() --- Now define the methods for Context function Context.new_game() reset_context_to_initial_state() Context.game_in_progress = true @@ -112,13 +89,11 @@ end function Context.load_game() if mget(SAVE_GAME_MAGIC_VALUE_ADDRESS, SAVE_GAME_BANK) ~= SAVE_GAME_MAGIC_VALUE then - -- No saved game found, start a new one - Context.new_game() + Context.new_game() return end - reset_context_to_initial_state() -- Reset data, preserve methods - + reset_context_to_initial_state() Context.current_screen = mget(SAVE_GAME_CURRENT_SCREEN_ADDRESS, SAVE_GAME_BANK) Context.game_in_progress = true diff --git a/inc/init/init.windows.lua b/inc/init/init.windows.lua index 889089f..ed420a9 100644 --- a/inc/init/init.windows.lua +++ b/inc/init/init.windows.lua @@ -7,4 +7,4 @@ local WINDOW_CONFIGURATION = 7 local WINDOW_MINIGAME_BUTTON_MASH = 8 local WINDOW_MINIGAME_RHYTHM = 9 local WINDOW_MINIGAME_DDR = 10 -local WINDOW_AUDIOTEST = 9001 -- because it's a debug screen lol +local WINDOW_AUDIOTEST = 9001 diff --git a/inc/map/map.manager.lua b/inc/map/map.manager.lua index 11c942f..33fbec5 100644 --- a/inc/map/map.manager.lua +++ b/inc/map/map.manager.lua @@ -1,5 +1,3 @@ -MapManager = {} - local _maps = {} function MapManager.get_maps_array() diff --git a/inc/screen/screen.manager.lua b/inc/screen/screen.manager.lua index ee5fd85..254eec2 100644 --- a/inc/screen/screen.manager.lua +++ b/inc/screen/screen.manager.lua @@ -10,7 +10,6 @@ end function ScreenManager.register(screen_data) if _screens[screen_data.id] then - -- Optional: warning if overwriting an existing screen trace("Warning: Overwriting screen with id: " .. screen_data.id) end _screens[screen_data.id] = screen_data diff --git a/inc/system/system.audio.lua b/inc/system/system.audio.lua index d4082fc..fb32f31 100644 --- a/inc/system/system.audio.lua +++ b/inc/system/system.audio.lua @@ -1,5 +1,3 @@ --- Audio subsystem - function Audio.music_stop() music() end function Audio.music_play_mainmenu() end function Audio.music_play_wakingup() end diff --git a/inc/system/system.input.lua b/inc/system/system.input.lua index c812085..e6f3870 100644 --- a/inc/system/system.input.lua +++ b/inc/system/system.input.lua @@ -1,14 +1,8 @@ --- Gamepad buttons 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 -- Z key -local INPUT_KEY_B = 5 -- X key -local INPUT_KEY_Y = 7 -- S key - --- Keyboard keys --- TODO: Find correct key codes for SPACE and LCTRL +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 @@ -19,6 +13,5 @@ function Input.left() return btnp(INPUT_KEY_LEFT) end function Input.right() return btnp(INPUT_KEY_RIGHT) end function Input.select() return btnp(INPUT_KEY_A) or keyp(INPUT_KEY_SPACE) end function Input.menu_confirm() return btnp(INPUT_KEY_A) or keyp(INPUT_KEY_ENTER) end -function Input.player_interact() return btnp(INPUT_KEY_B) or keyp(INPUT_KEY_ENTER) end -- B button -function Input.menu_back() return btnp(INPUT_KEY_Y) or keyp(INPUT_KEY_BACKSPACE) end +function Input.player_interact() return btnp(INPUT_KEY_B) or keyp(INPUT_KEY_ENTER) end function Input.menu_back() return btnp(INPUT_KEY_Y) or keyp(INPUT_KEY_BACKSPACE) end function Input.toggle_popup() return keyp(INPUT_KEY_ENTER) end diff --git a/inc/system/system.ui.lua b/inc/system/system.ui.lua index f8a51d1..3008260 100644 --- a/inc/system/system.ui.lua +++ b/inc/system/system.ui.lua @@ -88,23 +88,13 @@ function UI.draw_desition_selector(desitions, selected_desition_index) local bar_height = 16 local bar_y = Config.screen.height - bar_height rect(0, bar_y, Config.screen.width, bar_height, Config.colors.dark_grey) - if #desitions > 0 then local selected_desition = desitions[selected_desition_index] local desition_label = selected_desition.label - local text_width = #desition_label * 4 -- Assuming 4 pixels per char - local text_y = bar_y + 4 - - -- Center the decision label - local text_x = (Config.screen.width - text_width) / 2 - - -- Draw left arrow at the far left - Print.text("<", 2, text_y, Config.colors.green) - -- Draw selected desition label - Print.text(desition_label, text_x, text_y, Config.colors.item) -- Highlight color - -- Draw right arrow at the far right - Print.text(">", Config.screen.width - 6, text_y, Config.colors.green) -- 6 = 2 (right margin) + 4 (char width) - end + local text_width = #desition_label * 4 local text_y = bar_y + 4 + local text_x = (Config.screen.width - text_width) / 2 + Print.text("<", 2, text_y, Config.colors.green) + Print.text(desition_label, text_x, text_y, Config.colors.item) Print.text(">", Config.screen.width - 6, text_y, Config.colors.green) end end function UI.update_desition_selector(desitions, selected_desition_index) diff --git a/inc/system/system.util.lua b/inc/system/system.util.lua index 139a377..cee625a 100644 --- a/inc/system/system.util.lua +++ b/inc/system/system.util.lua @@ -8,8 +8,7 @@ function Util.go_to_screen_by_id(screen_id) local screen_index = Context.screen_indices_by_id[screen_id] if screen_index then Context.current_screen = screen_index - Context.selected_desition_index = 1 -- Reset selected decision on new screen - else + Context.selected_desition_index = 1 else PopupWindow.show({"Error: Screen '" .. screen_id .. "' not found or not indexed!"}) end end \ No newline at end of file diff --git a/inc/window/window.configuration.lua b/inc/window/window.configuration.lua index e437b6e..b9bc4cf 100644 --- a/inc/window/window.configuration.lua +++ b/inc/window/window.configuration.lua @@ -19,11 +19,9 @@ end function ConfigurationWindow.draw() UI.draw_top_bar("Configuration") - local x_start = 10 -- Left margin for labels - local y_start = 40 - local x_value_right_align = Config.screen.width - 10 -- Right margin for values - local char_width = 4 -- Approximate character width for default font - + 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.green @@ -32,16 +30,13 @@ function ConfigurationWindow.draw() local label_text = control.label local value_text = string.format(control.format, value) - -- Calculate x position for right-aligned value - local value_x = x_value_right_align - (#value_text * char_width) + 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) -- Shift label due to '<' - Print.text(value_text, value_x, current_y, color) - Print.text(">", x_value_right_align + 4, current_y, color) -- Print '>' after value - else + 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 @@ -82,11 +77,9 @@ function ConfigurationWindow.update() if control then if control.type == "numeric_stepper" then local current_value = control.get() - if btnp(2) then -- Left - local new_value = math.max(control.min, current_value - control.step) + if btnp(2) then local new_value = math.max(control.min, current_value - control.step) control.set(new_value) - elseif btnp(3) then -- Right - local new_value = math.min(control.max, current_value + control.step) + elseif btnp(3) then local new_value = math.min(control.max, current_value + control.step) control.set(new_value) end elseif control.type == "desition_item" then diff --git a/inc/window/window.game.lua b/inc/window/window.game.lua index 52bb785..815f64a 100644 --- a/inc/window/window.game.lua +++ b/inc/window/window.game.lua @@ -10,8 +10,7 @@ function GameWindow.draw() table.insert(available_desitions, desition) end end - -- If no available desitions, display nothing or a message - if #available_desitions > 0 then + if #available_desitions > 0 then UI.draw_desition_selector(available_desitions, Context.selected_desition_index) end end @@ -24,51 +23,41 @@ function GameWindow.update() return end - -- Handle screen changing using up/down - if Input.up() then + if Input.up() then Context.current_screen = Context.current_screen - 1 if Context.current_screen < 1 then Context.current_screen = #Context.screens end - Context.selected_desition_index = 1 -- Reset selected decision on screen change - elseif Input.down() then + Context.selected_desition_index = 1 elseif Input.down() then Context.current_screen = Context.current_screen + 1 if Context.current_screen > #Context.screens then Context.current_screen = 1 end - Context.selected_desition_index = 1 -- Reset selected decision on screen change - end + Context.selected_desition_index = 1 end local screen = Context.screens[Context.current_screen] if screen and screen.decisions and #screen.decisions > 0 then local available_desitions = {} for _, desition_id in ipairs(screen.decisions) do local desition = DesitionManager.get(desition_id) - if desition and desition.condition() then -- Check condition directly - table.insert(available_desitions, desition) + if desition and desition.condition() then table.insert(available_desitions, desition) end end - -- If no available desitions, we can't update or execute - if #available_desitions == 0 then return end + if #available_desitions == 0 then return end - -- Update selected decision using left/right inputs - local new_selected_desition_index = UI.update_desition_selector( + local new_selected_desition_index = UI.update_desition_selector( available_desitions, Context.selected_desition_index ) - -- Only update Context if the selection actually changed to avoid unnecessary re-assignment - if new_selected_desition_index ~= Context.selected_desition_index then + if new_selected_desition_index ~= Context.selected_desition_index then Context.selected_desition_index = new_selected_desition_index end - -- Execute selected decision on Input.select() - if Input.select() then + if Input.select() then local selected_desition = available_desitions[Context.selected_desition_index] - if selected_desition and selected_desition.handle then -- Call handle directly - Audio.sfx_select() -- Play sound for selection - selected_desition.handle() + if selected_desition and selected_desition.handle then Audio.sfx_select() selected_desition.handle() end end end @@ -76,5 +65,4 @@ end function GameWindow.set_state(new_state) Context.active_window = new_state - -- Add any state-specific initialization/cleanup here later if needed -end \ No newline at end of file + end \ No newline at end of file diff --git a/inc/window/window.intro.lua b/inc/window/window.intro.lua index 1760f2d..6df26cb 100644 --- a/inc/window/window.intro.lua +++ b/inc/window/window.intro.lua @@ -1,24 +1,21 @@ function IntroWindow.draw() - local x = (Config.screen.width - 132) / 2 -- Centered text + local x = (Config.screen.width - 132) / 2 Print.text(Context.intro.text, x, Context.intro.y, Config.colors.green) end function IntroWindow.update() Context.intro.y = Context.intro.y - Context.intro.speed - -- Count lines in intro text to determine when scrolling is done - local lines = 1 + local lines = 1 for _ in string.gmatch(Context.intro.text, "\n") do lines = lines + 1 end - -- When text is off-screen, go to menu - if Context.intro.y < -lines * 8 then + if Context.intro.y < -lines * 8 then GameWindow.set_state(WINDOW_MENU) end - -- Skip intro by pressing A - if Input.menu_confirm() then + if Input.menu_confirm() then GameWindow.set_state(WINDOW_MENU) end end \ No newline at end of file diff --git a/inc/window/window.menu.lua b/inc/window/window.menu.lua index 3fe597a..1c7d02b 100644 --- a/inc/window/window.menu.lua +++ b/inc/window/window.menu.lua @@ -16,18 +16,15 @@ function MenuWindow.update() end function MenuWindow.new_game() - Context.new_game() -- This function will be created in Context - GameWindow.set_state(WINDOW_GAME) + Context.new_game() GameWindow.set_state(WINDOW_GAME) end function MenuWindow.load_game() - Context.load_game() -- This function will be created in Context - GameWindow.set_state(WINDOW_GAME) + Context.load_game() GameWindow.set_state(WINDOW_GAME) end function MenuWindow.save_game() - Context.save_game() -- This function will be created in Context -end + Context.save_game() end function MenuWindow.resume_game() GameWindow.set_state(WINDOW_GAME) @@ -48,8 +45,7 @@ function MenuWindow.audio_test() end function MenuWindow.refresh_menu_items() - Context.menu_items = {} -- Start with an empty table - + Context.menu_items = {} if Context.game_in_progress then table.insert(Context.menu_items, {label = "Resume Game", desition = MenuWindow.resume_game}) table.insert(Context.menu_items, {label = "Save Game", desition = MenuWindow.save_game}) @@ -61,5 +57,4 @@ function MenuWindow.refresh_menu_items() table.insert(Context.menu_items, {label = "Audio Test", desition = MenuWindow.audio_test}) table.insert(Context.menu_items, {label = "Exit", desition = MenuWindow.exit}) - Context.selected_menu_item = 1 -- Reset selection after refreshing -end + Context.selected_menu_item = 1 end diff --git a/inc/window/window.popup.lua b/inc/window/window.popup.lua index f8342f8..149d5fc 100644 --- a/inc/window/window.popup.lua +++ b/inc/window/window.popup.lua @@ -1,28 +1,21 @@ --- Simplified PopupWindow module local POPUP_X = 40 local POPUP_Y = 40 local POPUP_WIDTH = 160 local POPUP_HEIGHT = 80 local TEXT_MARGIN_X = POPUP_X + 10 local TEXT_MARGIN_Y = POPUP_Y + 10 -local LINE_HEIGHT = 8 -- Assuming 8 pixels per line for default font - +local LINE_HEIGHT = 8 function PopupWindow.show(content_strings) Context.popup.show = true - Context.popup.content = content_strings or {} -- Ensure it's a table - GameWindow.set_state(WINDOW_POPUP) -- Set active window to popup -end + Context.popup.content = content_strings or {} GameWindow.set_state(WINDOW_POPUP) end function PopupWindow.hide() Context.popup.show = false - Context.popup.content = {} -- Clear content - GameWindow.set_state(WINDOW_GAME) -- Return to game window -end + Context.popup.content = {} GameWindow.set_state(WINDOW_GAME) end function PopupWindow.update() if Context.popup.show then - if Input.menu_confirm() or Input.menu_back() then -- Allow either A or B to close - PopupWindow.hide() + if Input.menu_confirm() or Input.menu_back() then PopupWindow.hide() end end end @@ -38,7 +31,6 @@ function PopupWindow.draw() current_y = current_y + LINE_HEIGHT end - -- Instruction to close - Print.text("[A] Close", TEXT_MARGIN_X, POPUP_Y + POPUP_HEIGHT - LINE_HEIGHT - 2, Config.colors.green) + Print.text("[A] Close", TEXT_MARGIN_X, POPUP_Y + POPUP_HEIGHT - LINE_HEIGHT - 2, Config.colors.green) end end