diff --git a/impostor.inc b/impostor.inc index ae7dac2..d3e0332 100644 --- a/impostor.inc +++ b/impostor.inc @@ -24,6 +24,7 @@ decision/decision.go_to_home.lua decision/decision.go_to_toilet.lua decision/decision.go_to_walking_to_office.lua decision/decision.go_to_office.lua +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 @@ -40,6 +41,7 @@ screen/screen.walking_to_home.lua screen/screen.work.lua window/window.manager.lua window/window.register.lua +window/window.end.lua window/window.splash.lua window/window.intro.lua window/window.menu.lua diff --git a/inc/decision/decision.go_to_end.lua b/inc/decision/decision.go_to_end.lua new file mode 100644 index 0000000..9e59099 --- /dev/null +++ b/inc/decision/decision.go_to_end.lua @@ -0,0 +1,7 @@ +Decision.register({ + id = "go_to_end", + label = "Break the cycle", + handle = function() + Window.set_current("end") + end, +}) diff --git a/inc/decision/decision.manager.lua b/inc/decision/decision.manager.lua index 1aeaf1c..330a1d9 100644 --- a/inc/decision/decision.manager.lua +++ b/inc/decision/decision.manager.lua @@ -10,11 +10,11 @@ local _decisions = {} --- @param[opt] decision.handle function Called when the decision is selected. Defaults to noop. function Decision.register(decision) if not decision or not decision.id then - PopupWindow.show({"Error: Invalid decision object registered (missing id)!"}) + trace("Error: Invalid decision object registered (missing id)!") return end if not decision.label then - PopupWindow.show({"Error: Invalid decision object registered (missing label)!"}) + trace("Error: Invalid decision object registered (missing label)!") return end @@ -92,7 +92,7 @@ end function Decision.filter_available(decisions_list) local available = {} for _, decision in ipairs(decisions_list) do - if decision and decision.condition() then + if decision and (not decision.condition or decision.condition()) then table.insert(available, decision) end end diff --git a/inc/init/init.context.lua b/inc/init/init.context.lua index 7434246..e282b50 100644 --- a/inc/init/init.context.lua +++ b/inc/init/init.context.lua @@ -42,6 +42,10 @@ function Context.initial_data() current_situation = nil, }, day_count = 1, + _end = { + state = "choice", + selection = 1, + }, } end diff --git a/inc/init/init.module.lua b/inc/init/init.module.lua index a1b9759..3a9654b 100644 --- a/inc/init/init.module.lua +++ b/inc/init/init.module.lua @@ -14,4 +14,4 @@ Audio = {} Focus = {} Day = {} Timer = {} -Trigger = {} \ No newline at end of file +Trigger = {} diff --git a/inc/logic/logic.day.lua b/inc/logic/logic.day.lua index 36bf617..a3c450e 100644 --- a/inc/logic/logic.day.lua +++ b/inc/logic/logic.day.lua @@ -1,11 +1,18 @@ +--- @section Day local _day_increase_handlers = {} +--- Increases the day count and triggers registered handlers. +--- @within Day function Day.increase() Context.day_count = Context.day_count + 1 for _, handler in ipairs(_day_increase_handlers) do handler() end end + +--- Registers a handler to be called when the day increases. +--- @within Day +--- @param handler function The function to call when the day increases. function Day.register_handler(handler) table.insert(_day_increase_handlers, handler) end diff --git a/inc/logic/logic.meter.lua b/inc/logic/logic.meter.lua index 0fb3c23..ad64d67 100644 --- a/inc/logic/logic.meter.lua +++ b/inc/logic/logic.meter.lua @@ -131,7 +131,9 @@ function Meter.draw() local bar_x = 182 local label_x = 228 local line_h = 5 - local start_y = 11 + local start_y = 1 + + local bar_offset = math.floor((line_h - bar_h) / 2) local meter_list = { diff --git a/inc/logic/logic.timer.lua b/inc/logic/logic.timer.lua index 943a85c..3493aec 100644 --- a/inc/logic/logic.timer.lua +++ b/inc/logic/logic.timer.lua @@ -43,7 +43,7 @@ function Timer.draw() if Context.meters.hidden and not Context.stat_screen_active then return end local cx = 10 - local cy = 20 + local cy = 8 local r_outer = 5 local r_inner = 3 local progress = Context.timer.progress diff --git a/inc/screen/screen.home.lua b/inc/screen/screen.home.lua index 56048b5..e5104ea 100644 --- a/inc/screen/screen.home.lua +++ b/inc/screen/screen.home.lua @@ -5,6 +5,7 @@ Screen.register({ "go_to_toilet", "go_to_walking_to_office", "go_to_sleep", + "go_to_end", }, background = "bedroom" }) diff --git a/inc/window/window.end.lua b/inc/window/window.end.lua new file mode 100644 index 0000000..22697f8 --- /dev/null +++ b/inc/window/window.end.lua @@ -0,0 +1,75 @@ +--- Draws the end screen window. +--- @within EndWindow +function EndWindow.draw() + cls(Config.colors.black) + + if Context._end.state == "choice" then + local lines = { + "This is not a workplace.", + "This is a cycle.", + "And if it is a cycle...", + "it can be broken." + } + + local y = 40 + for _, line in ipairs(lines) do + Print.text_center(line, Config.screen.width / 2, y, Config.colors.white) + y = y + 10 + end + + y = y + 20 + local yes_color = Context._end.selection == 1 and Config.colors.light_blue or Config.colors.white + local no_color = Context._end.selection == 2 and Config.colors.light_blue or Config.colors.white + + local yes_text = (Context._end.selection == 1 and "> YES" or " YES") + local no_text = (Context._end.selection == 2 and "> NO" or " NO") + + local centerX = Config.screen.width / 2 + Print.text(yes_text, centerX - 40, y, yes_color) + Print.text(no_text, centerX + 10, y, no_color) + elseif Context._end.state == "ending" then + Print.text_center("Game over -- good ending.", Config.screen.width / 2, 50, Config.colors.light_blue) + Print.text_center("Congratulations!", Config.screen.width / 2, 70, Config.colors.white) + Print.text_center("Press Z to return to menu", Config.screen.width / 2, 110, Config.colors.light_grey) + end +end + +--- Updates the end screen logic. +--- @within EndWindow +function EndWindow.update() + if Context._end.state == "choice" then + if Input.left() or Input.up() then + if Context._end.selection == 2 then + Audio.sfx_beep() + Context._end.selection = 1 + end + elseif Input.right() or Input.down() then + if Context._end.selection == 1 then + Audio.sfx_beep() + Context._end.selection = 2 + end + end + + if Input.menu_confirm() then + Audio.sfx_select() + if Context._end.selection == 1 then + Context._end.state = "ending" + else + -- NO: increment day and go home + Day.increase() + Context.game.current_screen = "home" + Window.set_current("game") + -- Initialize home screen + local home_screen = Screen.get_by_id("home") + if home_screen and home_screen.init then + home_screen.init() + end + end + end + elseif Context._end.state == "ending" then + if Input.menu_confirm() then + Window.set_current("menu") + MenuWindow.refresh_menu_items() + end + end +end diff --git a/inc/window/window.game.lua b/inc/window/window.game.lua index d6241ed..5abc065 100644 --- a/inc/window/window.game.lua +++ b/inc/window/window.game.lua @@ -6,12 +6,12 @@ local _selected_decision_index = 1 --- @within GameWindow function GameWindow.draw() local screen = Screen.get_by_id(Context.game.current_screen) + if not screen then return end if screen.background then Map.draw(screen.background) elseif screen.background_color then rect(0, 0, Config.screen.width, Config.screen.height, screen.background_color) end - UI.draw_top_bar(screen.name) if not Context.stat_screen_active and #_available_decisions > 0 then Decision.draw(_available_decisions, _selected_decision_index) end diff --git a/inc/window/window.register.lua b/inc/window/window.register.lua index a49db0d..d9f82b2 100644 --- a/inc/window/window.register.lua +++ b/inc/window/window.register.lua @@ -30,3 +30,6 @@ Window.register("minigame_ddr", MinigameDDRWindow) MysteriousManWindow = {} Window.register("mysterious_man", MysteriousManWindow) + +EndWindow = {} +Window.register("end", EndWindow)