diff --git a/impostor.inc b/impostor.inc index faf0a22..27b27fb 100644 --- a/impostor.inc +++ b/impostor.inc @@ -48,8 +48,9 @@ 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.start_discussion.lua +decision/decision.sumphore_discussion.lua discussion/discussion.sumphore.lua +discussion/discussion.coworker.lua map/map.manager.lua map/map.bedroom.lua map/map.street.lua diff --git a/inc/decision/decision.do_work.lua b/inc/decision/decision.do_work.lua index c544d7b..a3eaea2 100644 --- a/inc/decision/decision.do_work.lua +++ b/inc/decision/decision.do_work.lua @@ -6,9 +6,14 @@ Decision.register({ Util.go_to_screen_by_id("work") MinigameDDRWindow.start("game", nil, { on_win = function() + if (Context.minigame_ddr.special_condition_met and Context.ascension.level == 1) then + Context.should_ascend = true + Context.minigame_ddr.special_condition_met = false + end Meter.show() Util.go_to_screen_by_id("office") Window.set_current("game") + Context.have_done_work_today = true end, }) end, diff --git a/inc/decision/decision.go_to_home.lua b/inc/decision/decision.go_to_home.lua index 4b5e670..bc02eff 100644 --- a/inc/decision/decision.go_to_home.lua +++ b/inc/decision/decision.go_to_home.lua @@ -1,6 +1,9 @@ Decision.register({ id = "go_to_home", label = "Go to Home", + condition = function() + return Context.have_been_to_office and Context.have_done_work_today + end, handle = function() Util.go_to_screen_by_id("home") end, diff --git a/inc/decision/decision.go_to_sleep.lua b/inc/decision/decision.go_to_sleep.lua index aed5ead..a7bbee2 100644 --- a/inc/decision/decision.go_to_sleep.lua +++ b/inc/decision/decision.go_to_sleep.lua @@ -1,6 +1,9 @@ Decision.register({ id = "go_to_sleep", label = "Go to Sleep", + condition = function() + return Context.have_been_to_office and Context.have_done_work_today + end, handle = function() Meter.hide() Day.increase() @@ -10,7 +13,11 @@ Decision.register({ focus_initial_radius = 0, on_win = function() local ascended = Ascension.consume_increase() - MysteriousManScreen.start({ skip_text = not ascended }) + local level = Ascension.get_level() + MysteriousManScreen.start({ + skip_text = not ascended, + text = ascended and MysteriousManScreen.get_text_for_level(level) or nil, + }) end, }) end, diff --git a/inc/decision/decision.have_a_coffee.lua b/inc/decision/decision.have_a_coffee.lua index c9709f0..a7c5212 100644 --- a/inc/decision/decision.have_a_coffee.lua +++ b/inc/decision/decision.have_a_coffee.lua @@ -3,6 +3,14 @@ Decision.register({ 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/decision/decision.start_discussion.lua b/inc/decision/decision.sumphore_discussion.lua similarity index 58% rename from inc/decision/decision.start_discussion.lua rename to inc/decision/decision.sumphore_discussion.lua index c28db57..a968ddb 100644 --- a/inc/decision/decision.start_discussion.lua +++ b/inc/decision/decision.sumphore_discussion.lua @@ -1,5 +1,5 @@ Decision.register({ - id = "start_discussion", + id = "sumphore_discussion", label = function() if Context.have_met_sumphore then return "Talk to Sumphore" @@ -9,10 +9,15 @@ Decision.register({ handle = function() if not Context.have_met_sumphore then Discussion.start("homeless_guy", "game") - elseif Ascension.get_level() == 0 then - Discussion.start("homeless_guy", "game", 4) + return + end + local level = Ascension.get_level() + + -- TODO: Add more discussions for levels above 3 + if level >= 1 and level <= 3 then + Discussion.start("sumphore_disc_asc_" .. level, "game") else - Discussion.start("sumphore_asc_1_a", "game") + Discussion.start("homeless_guy", "game", 4) end end, }) diff --git a/inc/discussion/discussion.coworker.lua b/inc/discussion/discussion.coworker.lua index 1f619b3..61529a8 100644 --- a/inc/discussion/discussion.coworker.lua +++ b/inc/discussion/discussion.coworker.lua @@ -1,20 +1,136 @@ Discussion.register({ - id = "coworker_asc_1", + id = "coworker_disc_0", + steps = { + { + question = "Good morning Normal, enjoying your coffee as usual, huh?", + answers = { + { label = "The name is Norman, not Normal", next_step = 2 }, + }, + }, + { + question = "Can't work without some good coffee, no? ", + answers = { + { label = "Mhmm", next_step = nil }, + }, + }, + }, +}); + +Discussion.register({ + id = "coworker_disc_1", + steps = { + { + question = "Norman, you look confused, what's up?", + answers = { + { label = "Just some bugs I noticed", next_step = 2 }, + }, + }, + { + question = "Your coffee also seems whiter than usual!", + answers = { + { label = "I feel like latte today", next_step = nil }, + }, + }, + }, +}); + +Discussion.register({ + id = "coworker_disc_asc_1", steps = { { 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 = "Same old - same old", next_step = nil }, }, }, { - question = "What kind of bugs?", + question = "Are you fixing bugs nobody noticed before?", answers = { - { label = "Some of the data is not being processed correctly, I think.", next_step = nil }, - { label = "I don't know, I'm not a programmer.", next_step = nil, on_select = function() - Meter.add("ism", 10) - end }, + { label = "Maybe", next_step = nil }, + }, + }, + }, +}) + +Discussion.register({ + id = "coworker_disc_2", + steps = { + { + question = "Hey Norman, do you have new socks on? That's a weird color!", + answers = { + { label = "Huh? True ...", next_step = 2 }, + }, + }, + { + question = "You look strange today, Normal, you put your tie on backwards, is everything ok? ", + answers = { + { label = "Get it right, Norman ... NORMAN!", next_step = 3 }, + }, + }, + { + question = "Yo Normann, text goes from left to right, not right to left, these parts!", + answers = { + { label = "Uhm...why?", next_step = nil }, + }, + }, + }, +}); + + +Discussion.register({ + id = "coworker_disc_asc_2", + steps = { + { + question = "Normann, are you ok? You were doing weird things while typing?", + answers = { + { label = "Naw", next_step = 2 }, + }, + }, + { + question = "Oh, it's ok, I'm not wathcing you. Noone really is. *giggle*", + answers = { + { label = "Huh ?", next_step = nil }, + }, + }, + }, +}) + +Discussion.register({ + id = "coworker_disc_3", + steps = { + { + question = "You look so happy, did you catch a bull or something?", + answers = { + { label = "What do you mean?", next_step = 2 }, + }, + }, + { + question = "Most people catch colds! You are so strange!", + answers = { + { label = "An apple a day keeps the cold away", next_step = 3 }, + }, + }, + { + question = "You look like you don't really want to work today, are you ok?", + answers = { + { label = "Oh brother", next_step = nil }, + }, + }, + }, +}) +Discussion.register({ + id = "coworker_disc_asc_3", + steps = { + { + question = "Normal, you should take a break, you don't live up to your name today", + answers = { + { label = "Norman is the name ...", next_step = 2 }, + }, + }, + { + question = "You aren't as enthusiastic as you were before!", + answers = { + { label = "Burnout comes for everyone", next_step = nil }, }, }, }, diff --git a/inc/discussion/discussion.sumphore.lua b/inc/discussion/discussion.sumphore.lua index 5cfff08..adc604b 100644 --- a/inc/discussion/discussion.sumphore.lua +++ b/inc/discussion/discussion.sumphore.lua @@ -1,5 +1,5 @@ Discussion.register({ - id = "sumphore_asc_1_a", + id = "sumphore_disc_asc_1", steps = { { question = "Are you still seeking the ox?", @@ -18,7 +18,7 @@ Discussion.register({ }) Discussion.register({ - id = "sumphore_asc_1_b", + id = "sumphore_disc_asc_2", steps = { { question = "How's work? Your face looks strange", @@ -46,12 +46,12 @@ Discussion.register({ }, }, { - question = "Always trying to do the right thing, huh?", - answers = { - { label = "I've never thought of that up till now.", next_step = nil, on_select = function() - Meter.add("ism", 5) - end }, - { label = "Exactly.", next_step = nil, on_select = function() + question = "Always trying to do the right thing, huh? What if you did the left thing instead?", + answers = { + { label = "I've never thought of that up till now.", next_step = nil, on_select = function() + Meter.add("ism", 5) + end }, + { label = "Silly wordgames, I like them.", next_step = nil, on_select = function() Meter.add("wpm", 10) end }, }, @@ -59,6 +59,32 @@ Discussion.register({ }, }) +Discussion.register({ + id = "sumphore_disc_asc_3", + steps = { + { + question = "Do you think it's work you're doing?", + answers = { + { label = "... that sounds like it's from a movie.", next_step = 2 }, + { label = "Are you drunk, old man?", next_step = nil }, + }, + }, + { + question = "You might just be trying too hard, why dont you just flow for a while?", + answers = { + { label = "Flow where ?", next_step = 3 }, + { label = "I'm not sure what you mean.", next_step = nil }, + }, + }, + { + question = "Flow carelessly, without any effort", + answers = { + { label = "Consuming sth other than alcohol ?", next_step = nil }, + { label = "Deja vu", next_step = nil }, + }, + }, + }, +}) Discussion.register({ id = "homeless_guy", diff --git a/inc/init/init.context.lua b/inc/init/init.context.lua index 7c2395c..ee29775 100644 --- a/inc/init/init.context.lua +++ b/inc/init/init.context.lua @@ -21,6 +21,8 @@ Context = {} --- * triggers (table) Active trigger runtime state, keyed by trigger ID.
--- * stat_screen_active (boolean) Whether the stat screen overlay is currently shown.
--- * 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.
function Context.initial_data() return { @@ -40,6 +42,9 @@ function Context.initial_data() timer = Timer.get_initial(), triggers = {}, home_norman_visible = false, + have_been_to_office = false, + have_done_work_today = false, + should_ascend = false, have_met_sumphore = false, game = { current_screen = "home", @@ -93,10 +98,16 @@ function Context.new_game() MysteriousManScreen.start({ text = [[ Norman was never a bad - simulation engineer, but - we need to be careful in - letting him improve. We - need to distract him. + ... + simulation engineer, + ... + but + ... + we need to be careful + ... + letting him improve. + ... + We need to distract him. ]], on_text_complete = function() Audio.sfx_alarm() @@ -111,7 +122,6 @@ function Context.new_game() show_progress_text = false, on_win = function() Audio.music_play_wakingup() - Context.home_norman_visible = true Meter.show() Window.set_current("game") end, diff --git a/inc/logic/logic.day.lua b/inc/logic/logic.day.lua index f5a5987..ae9d760 100644 --- a/inc/logic/logic.day.lua +++ b/inc/logic/logic.day.lua @@ -5,6 +5,9 @@ local _day_increase_handlers = {} --- @within Day function Day.increase() Context.day_count = Context.day_count + 1 + if Context.day_count == 3 then + Context.should_ascend = true + end for _, handler in ipairs(_day_increase_handlers) do handler() end @@ -25,7 +28,8 @@ Day.register_handler(function() end) Day.register_handler(function() - if Context.day_count == 3 then + if Context.should_ascend then Ascension.increase() end + Context.should_ascend = false end) \ No newline at end of file diff --git a/inc/screen/screen.mysterious_man.lua b/inc/screen/screen.mysterious_man.lua index c1a74a2..b138d3c 100644 --- a/inc/screen/screen.mysterious_man.lua +++ b/inc/screen/screen.mysterious_man.lua @@ -1,253 +1,264 @@ ---- @section MysteriousManScreen - -local STATE_TEXT = "text" -local STATE_DAY = "day" -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 state = STATE_TEXT -local text_y = Config.screen.height -local text_speed = 0.2 -local day_timer = 0 -local day_display_frames = 120 -local text_done = false -local text_done_timer = 0 -local TEXT_DONE_HOLD_FRAMES = 120 -local selected_choice = 1 -local text = ASC_01_TEXT -local day_text_override = nil -local on_text_complete = nil -local show_mysterious_screen = true -local trigger_flash_on_wake = false - -local function draw_mysterious_man_background() - local img_values = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 1, 4, 1, 0, 2, 4, 1, 0, 2, 4, 1, 0, 2, 4, 1, 0, 2, 4, 1, 0, 2, 4, 2, 1, 4, 2, 1, 4, 1, 0, 2, 4, 1, 0, 1, 4, 2, 1, 2, 1, 0, 1, 2, 4, 1, 0, 2, 4, 2, 1, 0, 1, 2, 1, 2, 1, 0, 1, 4, 1, 0, 2, 4, 2, 0, 1, 0, 1, 0, 1, 2, 4, 1, 0, 2, 4, 2, 1, 0, 1, 4, 1, 0, 2, 4, 2, 0, 1, 2, 4, 1, 0, 2, 4, 1, 0, 1, 0, 4, 1, 0, 2, 4, 0, 1, 0, 1, 0, 1, 0, 4, 1, 0, 2, 4, 0, 1, 4, 1, 0, 2, 4, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 1, 2, 1, 0, 1, 4, 1, 0, 2, 4, 2, 1, 0, 1, 2, 4, 1, 0, 2, 4, 2, 1, 0, 1, 2, 4, 1, 0, 2, 4, 1, 2, 0, 1, 0, 1, 0, 1, 2, 1, 2, 1, 0, 2, 4, 1, 0, 2, 4, 0, 1, 0, 1, 2, 1, 0, 1, 0, 2, 4, 1, 0, 2, 4, 2, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 2, 1, 0, 1, 0, 2, 4, 2, 4, 1, 0, 2, 4, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 2, 1, 0, 1, 0, 2, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 2, 0, 1, 4, 1, 0, 2, 4, 2, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 2, 1, 0, 2, 4, 1, 0, 2, 4, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 0, 1, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 2, 4, 1, 0, 2, 4, 2, 1, 0, 1, 0, 1, 0, 1, 2, 4, 1, 0, 2, 4, 2, 1, 0, 1, 0, 1, 0, 1, 2, 4, 1, 0, 2, 4, 2, 1, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 1, 4, 2, 4, 1, 0, 2, 4, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 1, 4, 2, 4, 1, 0, 2, 4, 2, 1, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 4, 1, 0, 2, 4, 1, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 1, 4, 1, 0, 2, 4, 2, 1, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 0, 4, 1, 0, 2, 4, 0, 1, 0, 1, 0, 2, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 2, 0, 1, 4, 1, 0, 2, 4, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 2, 0, 1, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 2, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 2, 0, 1, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 2, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 2, 4, 1, 0, 2, 4, 2, 1, 0, 1, 0, 1, 2, 4, 1, 0, 2, 4, 2, 1, 0, 1, 0, 1, 2, 4, 1, 0, 2, 4, 2, 0, 1, 0, 1, 4, 1, 0, 2, 4, 2, 0, 1, 0, 1, 0, 4, 1, 0, 2, 4, 1, 0, 1, 0, 1, 0, 1, 4, 1, 0, 2, 4, 0, 1, 0, 1, 4, 2, 1, 0, 1, 2, 1, 2, 1, 0, 1, 2, 1, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 0, 1, 2, 0, 1, 0, 2, 1, 0, 1, 2, 0, 1, 0, 2, 0, 1, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 0, 2, 1, 0, 1, 0, 1, 2, 0, 1, 0, 2, 0, 2, 1, 0, 1, 2, 0, 2, 1, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 0, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 1, 0, 1, 2, 0, 1, 0, 1, 2, 1, 0, 1, 0, 1, 0, 1, 0, 2, 1, 0, 2, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 1, 0, 2, 1, 0, 1, 2, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 } - - local img_runs = { 1480, 1, 151, 1, 87, 1, 1, 150, 1, 1, 86, 1, 2, 148, 1, 2, 87, 2, 148, 2, 88, 2, 148, 2, 88, 2, 148, 2, 88, 2, 148, 2, 88, 2, 70, 1, 2, 9, 1, 2, 63, 2, 88, 2, 69, 1, 2, 3, 5, 1, 1, 1, 1, 1, 1, 1, 61, 2, 88, 2, 68, 1, 1, 3, 1, 2, 1, 3, 2, 3, 2, 61, 2, 88, 2, 68, 1, 6, 1, 4, 1, 5, 1, 1, 60, 2, 88, 2, 67, 1, 1, 17, 2, 60, 2, 88, 2, 67, 1, 19, 1, 1, 59, 2, 88, 2, 67, 1, 19, 1, 1, 59, 2, 88, 2, 67, 4, 1, 11, 1, 1, 1, 3, 59, 2, 88, 2, 67, 21, 1, 59, 2, 88, 2, 67, 21, 1, 59, 2, 88, 2, 66, 1, 21, 2, 58, 2, 88, 2, 66, 1, 21, 1, 1, 58, 2, 88, 2, 66, 4, 17, 2, 1, 58, 2, 88, 2, 65, 2, 5, 1, 15, 2, 58, 2, 88, 2, 63, 1, 1, 2, 22, 4, 55, 2, 88, 2, 57, 2, 2, 34, 2, 2, 49, 2, 88, 2, 55, 1, 2, 39, 3, 1, 47, 2, 88, 2, 55, 5, 1, 3, 2, 2, 1, 25, 1, 1, 1, 1, 1, 1, 1, 47, 2, 88, 2, 57, 1, 2, 1, 29, 1, 4, 1, 1, 1, 1, 49, 2, 88, 2, 59, 1, 2, 8, 15, 9, 2, 52, 2, 88, 2, 62, 2, 1, 1, 1, 24, 1, 1, 1, 54, 2, 88, 2, 66, 1, 22, 1, 58, 2, 88, 2, 66, 1, 21, 1, 59, 2, 88, 2, 66, 2, 20, 1, 59, 2, 88, 2, 65, 3, 20, 2, 58, 2, 88, 2, 63, 2, 2, 1, 20, 1, 1, 2, 56, 2, 88, 2, 61, 2, 4, 1, 20, 1, 2, 2, 55, 2, 88, 2, 59, 1, 1, 6, 1, 19, 1, 4, 2, 54, 2, 88, 2, 58, 2, 7, 2, 17, 1, 1, 6, 2, 52, 3, 87, 2, 56, 1, 2, 9, 1, 26, 2, 51, 3, 87, 2, 55, 1, 1, 40, 1, 50, 2, 88, 2, 54, 2, 41, 1, 50, 2, 88, 2, 53, 2, 42, 2, 49, 2, 88, 2, 52, 2, 44, 2, 48, 2, 88, 2, 51, 2, 46, 2, 47, 2, 88, 2, 50, 2, 16, 1, 31, 1, 47, 2, 88, 2, 50, 3, 1, 14, 1, 29, 1, 1, 2, 46, 2, 88, 2, 50, 18, 1, 29, 1, 2, 1, 46, 2, 88, 2, 50, 4, 14, 1, 33, 1, 45, 2, 88, 2, 53, 1, 3, 11, 2, 15, 1, 13, 1, 2, 46, 2, 88, 2, 56, 1, 1, 11, 1, 15, 1, 10, 2, 1, 49, 2, 88, 2, 55, 2, 3, 10, 2, 12, 2, 8, 8, 46, 2, 88, 2, 50, 1, 1, 4, 4, 1, 9, 2, 11, 2, 8, 2, 4, 2, 1, 2, 1, 1, 42, 2, 88, 2, 48, 2, 3, 8, 1, 9, 2, 9, 3, 7, 2, 8, 1, 1, 2, 1, 1, 40, 2, 88, 2, 45, 3, 2, 1, 1, 1, 1, 8, 1, 7, 1, 1, 3, 6, 4, 6, 1, 8, 1, 1, 1, 1, 4, 2, 38, 2, 88, 2, 45, 1, 2, 2, 22, 4, 4, 4, 6, 1, 10, 1, 1, 2, 1, 2, 1, 2, 37, 2, 88, 2, 42, 1, 1, 1, 4, 1, 2, 19, 1, 1, 4, 1, 5, 21, 1, 2, 6, 35, 2, 88, 2, 42, 2, 1, 1, 1, 1, 15, 2, 8, 3, 4, 3, 6, 1, 17, 1, 1, 2, 1, 1, 1, 34, 2, 88, 2, 41, 3, 1, 1, 15, 2, 9, 3, 5, 2, 8, 1, 21, 1, 1, 34, 2, 88, 2, 41, 1, 1, 1, 16, 2, 11, 2, 5, 2, 9, 2, 18, 2, 1, 34, 2, 88, 2, 41, 1, 2, 1, 14, 2, 13, 1, 5, 1, 12, 1, 17, 1, 2, 34, 2, 88, 2, 41, 1, 16, 1, 17, 1, 2, 1, 14, 2, 17, 1, 1, 33, 2, 88, 2, 41, 1, 2, 1, 12, 1, 17, 1, 3, 2, 15, 1, 14, 1, 1, 1, 1, 33, 2, 88, 2, 41, 15, 1, 22, 1, 17, 1, 1, 11, 1, 3, 1, 33, 2, 88, 2, 41, 1, 14, 2, 40, 1, 15, 1, 33, 2, 88, 2, 41, 1, 15, 2, 35, 1, 3, 1, 10, 1, 4, 1, 33, 2, 88, 2, 41, 1, 3, 1, 12, 2, 36, 2, 11, 1, 4, 1, 33, 2, 88, 2, 40, 1, 1, 18, 1, 35, 1, 12, 1, 4, 1, 1, 32, 2, 88, 2, 40, 2, 4, 1, 14, 1, 33, 1, 12, 1, 6, 1, 32, 2, 88, 2, 40, 1, 6, 1, 14, 1, 31, 1, 13, 1, 6, 1, 32, 2, 88, 2, 39, 2, 22, 2, 28, 1, 21, 1, 1, 31, 2, 88, 2, 39, 2, 24, 1, 26, 1, 22, 1, 1, 31, 2, 88, 2, 39, 2, 25, 1, 24, 1, 23, 1, 1, 31, 2, 88, 2, 39, 1, 27, 1, 22, 2, 23, 1, 1, 31, 2, 88, 2, 39, 1, 49, 2, 24, 3, 30, 2, 88, 2, 39, 1, 48, 1, 27, 1, 1, 30, 2, 88, 2, 39, 1, 47, 2, 27, 1, 1, 30, 2, 88, 2, 37, 1, 1, 47, 2, 28, 1, 1, 30, 2, 88, 2, 37, 1, 1, 46, 1, 30, 2, 1, 29, 2, 88, 2, 37, 1, 47, 1, 30, 2, 30, 2, 88, 2, 37, 1, 1, 2, 43, 1, 33, 30, 3, 87, 2, 37, 1, 45, 1, 31, 1, 1, 2, 29, 3, 87, 2, 37, 45, 1, 35, 1, 29, 1, 1, 88, 2, 1, 35, 1, 1, 80, 2, 1, 26, 1, 3, 86, 1, 1, 2, 1, 21, 1, 4, 4, 2, 1, 3, 80, 30, 1, 2, 125, 2, 80, 2, 156, 2, 79, 2, 1, 156, 2, 1, 77, 4, 156, 1, 3, 76, 3, 1, 140, 1, 15, 1, 2, 2, 74, 2, 1, 1, 1, 5, 3, 129, 1, 18, 1, 82, 1, 7, 1, 129, 1, 18, 1, 82, 1, 9, 1, 123, 3, 20, 1, 1, 80, 2, 11, 1, 1, 119, 1, 22, 1, 1, 1, 2, 76, 4, 1, 154, 2, 2, 63, 1, 14, 3, 1, 126, 1, 27, 2, 65, 1, 17, 1, 17, 2, 132, 4, 66, 1, 17, 4, 113, 39, 66, 2, 16, 31, 191, 1, 1, 1, 15, 1, 153, 2, 15, 3, 48, 2, 16, 2, 152, 1, 16, 1, 1, 1, 48, 2, 16, 2, 152, 1, 1, 2, 2, 1, 10, 1, 1, 1, 48, 1, 13, 6, 153, 1, 3, 13, 1, 1, 48, 1, 15, 2, 1, 1, 153, 3, 64, 1, 16, 2, 154, 1, 1, 83, 1, 154, 1, 17, 1, 66, 1, 154, 1, 17, 1, 66, 1, 155, 1, 82, 1, 156, 1, 82, 1, 156, 1, 1, 80, 1, 1, 157, 2, 78, 2, 158, 2, 78, 2, 158, 1, 80, 1, 158, 1, 79, 2, 158, 1, 79, 1, 159, 1, 79, 1, 160, 1, 77, 2, 160, 1, 77, 1, 162, 1, 74, 1, 1, 1, 162, 1, 75, 1, 239, 1, 165, 1, 72, 1, 166, 1, 240, 1, 69, 1, 412, 1, 63, 1, 175, 1, 63, 2, 238, 1, 175, 1, 63, 1, 239, 1, 807 } - - local val_i = 0 - local run = 0 - for y = 0, 136 - 1 do - for x = 0, 240 - 1 do - if run == 0 then - val_i = val_i + 1 - run = img_runs[val_i] - end - run = run - 1 - pix(x, y, img_values[val_i]) - end - end -end - -local choices = { - { - label = "Wake Up", - }, - { - label = "Stay in Bed", - }, -} - -local function go_to_day_state() - if on_text_complete then - on_text_complete() - on_text_complete = nil - end - if Context.game.current_screen ~= "mysterious_man" then - return - end - state = STATE_DAY - day_timer = day_display_frames -end - -local function wake_up() - Context.home_norman_visible = false - Util.go_to_screen_by_id("home") - MinigameButtonMashWindow.start("game", { - focus_center_x = (Config.screen.width / 2) - 22, - focus_center_y = (Config.screen.height / 2) - 18, - focus_initial_radius = 0, - target_points = 100, - instruction_text = "Wake up Norman!", - show_progress_text = false, - on_win = function() - Audio.music_play_wakingup() - Context.home_norman_visible = true - Meter.show() - if trigger_flash_on_wake then - trigger_flash_on_wake = false - Ascension.start_flash() - end - Window.set_current("game") - end, - }) -end - -local function stay_in_bed() - Day.increase() - state = STATE_DAY - day_timer = day_display_frames -end - ---- Starts the mysterious man screen. ---- @param[opt] options table Optional configuration.
---- Fields:
---- * text (string) Override for the scrolling text.
---- * day_text (string) Override for the centered day label.
---- * on_text_complete (function) Callback fired once when the text phase ends.
---- * skip_text (boolean) If true, skip the text phase and go straight to day display.
-function MysteriousManScreen.start(options) - options = options or {} - day_timer = 0 - text_done = false - text_done_timer = 0 - selected_choice = 1 - text = options.text or ASC_01_TEXT - local line_count = 1 - for _ in string.gmatch(text, "\n") do line_count = line_count + 1 end - local text_block_h = line_count * 8 - text_y = math.floor((Config.screen.height - text_block_h) / 2) - day_text_override = options.day_text - on_text_complete = options.on_text_complete - Meter.hide() - trigger_flash_on_wake = not options.skip_text - if options.skip_text then - show_mysterious_screen = false - state = STATE_DAY - day_timer = day_display_frames - else - show_mysterious_screen = true - state = STATE_TEXT - end - Util.go_to_screen_by_id("mysterious_man") - Window.set_current("game") -end - ---- Sets the scrolling text content. ---- @param new_text string The text to display. -function MysteriousManScreen.set_text(new_text) - text = new_text -end - -Screen.register({ - id = "mysterious_man", - name = "Mysterious Man", - decisions = {}, - background_color = Config.colors.black, - update = function() - if state == STATE_TEXT then - if not text_done then - text_y = text_y - text_speed - - local lines = 1 - for _ in string.gmatch(text, "\n") do - lines = lines + 1 - end - - if text_y < -lines * 8 then - text_done = true - text_done_timer = TEXT_DONE_HOLD_FRAMES - end - else - text_done_timer = text_done_timer - 1 - if text_done_timer <= 0 then - go_to_day_state() - end - end - elseif state == STATE_DAY then - day_timer = day_timer - 1 - - if day_timer <= 0 or Input.select() then - if trigger_flash_on_wake or Ascension.get_level() < 1 then - wake_up() - else - state = STATE_CHOICE - selected_choice = 1 - end - end - elseif state == STATE_CHOICE then - selected_choice = UI.update_menu(choices, selected_choice) - - if Input.select() then - Audio.sfx_select() - if selected_choice == 1 then - wake_up() - else - stay_in_bed() - end - end - end - end, - draw = function() - if show_mysterious_screen then - draw_mysterious_man_background() - end - - if state == STATE_TEXT then - local cx = Config.screen.width / 2 - local line_y = text_y - for line in (text .. "\n"):gmatch("(.-)\n") do - Print.text_center(line, cx, line_y, Config.colors.light_grey) - line_y = line_y + 8 - end - elseif state == STATE_DAY then - local day_text = day_text_override or ("Day " .. Context.day_count) - Print.text_center( - day_text, - Config.screen.width / 2, - Config.screen.height / 2 - 3, - Config.colors.white - ) - elseif state == STATE_CHOICE then - local menu_x = (Config.screen.width - 60) / 2 - local menu_y = (Config.screen.height - 20) / 2 - UI.draw_menu(choices, selected_choice, menu_x, menu_y) - end - end, -}) +--- @section MysteriousManScreen + +local STATE_TEXT = "text" +local STATE_DAY = "day" +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 = { + [1] = ASC_01_TEXT, + [2] = ASC_12_TEXT, + [3] = ASC_23_TEXT, + [4] = ASC_34_TEXT, + [5] = ASC_45_TEXT, +} + +function MysteriousManScreen.get_text_for_level(level) + return ascension_texts[level] or ASC_01_TEXT +end + +local state = STATE_TEXT +local text_y = Config.screen.height +local text_speed = 0.2 +local day_timer = 0 +local day_display_frames = 120 +local text_done = false +local text_done_timer = 0 +local TEXT_DONE_HOLD_FRAMES = 120 +local selected_choice = 1 +local text = ASC_01_TEXT +local day_text_override = nil +local on_text_complete = nil +local show_mysterious_screen = true +local trigger_flash_on_wake = false + +local function draw_mysterious_man_background() + local img_values = {0,1,0,1,0,1,0,1,0,1,0,1,2,1,4,1,0,2,4,1,0,2,4,1,0,2,4,1,0,2,4,1,0,2,4,2,1,4,2,1,4,1,0,2,4,1,0,1,4,2,1,2,1,0,1,2,4,1,0,2,4,2,1,0,1,2,1,2,1,0,1,4,1,0,2,4,2,0,1,0,1,0,1,2,4,1,0,2,4,2,1,0,1,4,1,0,2,4,2,0,1,2,4,1,0,2,4,1,0,1,0,4,1,0,2,4,0,1,0,1,0,1,0,4,1,0,2,4,0,1,4,1,0,2,4,0,1,4,1,0,2,4,1,0,1,4,1,0,2,4,1,0,1,0,4,1,0,2,4,1,0,1,0,4,1,0,2,4,1,0,1,0,1,4,1,0,2,4,1,2,1,0,1,4,1,0,2,4,2,1,0,1,2,4,1,0,2,4,2,1,0,1,2,4,1,0,2,4,1,2,0,1,0,1,0,1,2,1,2,1,0,2,4,1,0,2,4,0,1,0,1,2,1,0,1,0,2,4,1,0,2,4,2,1,0,1,0,1,4,1,0,2,4,2,1,0,1,0,2,4,2,4,1,0,2,4,1,0,1,4,1,0,2,4,1,0,1,4,1,0,2,4,1,0,1,4,1,0,2,4,1,0,1,4,1,0,2,4,1,0,1,0,1,0,1,4,1,0,2,4,1,0,1,0,1,0,1,4,1,0,2,4,2,1,0,1,0,2,0,1,4,1,0,2,4,1,0,1,0,1,2,0,1,4,1,0,2,4,2,1,0,1,0,1,4,1,0,2,4,2,1,0,2,4,1,0,2,4,1,0,1,4,1,0,2,4,1,0,1,4,1,0,2,4,1,0,1,4,1,0,2,4,1,0,1,4,1,0,2,4,1,0,1,0,1,4,1,0,2,4,0,1,0,1,0,1,0,1,4,1,0,2,4,0,1,0,1,0,1,4,1,0,2,4,1,0,1,0,2,4,1,0,2,4,2,1,0,1,0,1,0,1,2,4,1,0,2,4,2,1,0,1,0,1,0,1,2,4,1,0,2,4,2,1,0,1,0,1,0,1,4,1,0,2,4,2,4,1,0,1,0,1,0,1,0,1,0,1,2,1,4,2,4,1,0,2,4,2,1,0,1,0,1,0,1,0,1,0,1,2,1,4,2,4,1,0,2,4,2,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,4,1,0,2,4,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,4,1,0,2,4,2,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,4,1,0,2,4,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,1,4,1,0,2,4,1,0,1,0,1,0,1,0,1,0,1,0,1,0,4,1,0,2,4,1,0,1,0,1,0,1,0,1,0,1,0,1,0,4,1,0,2,4,1,0,1,0,1,0,1,0,1,0,2,0,1,0,4,1,0,2,4,1,0,1,0,1,0,1,0,1,0,1,0,4,1,0,2,4,1,0,1,0,1,0,1,0,1,0,2,0,1,0,1,0,4,1,0,2,4,0,1,0,1,0,2,1,0,1,0,1,4,1,0,2,4,1,0,1,0,1,0,1,4,1,0,2,4,1,0,1,0,1,0,1,0,1,0,1,4,1,0,2,4,1,0,1,0,1,0,1,0,2,0,1,4,1,0,2,4,0,1,0,1,0,1,0,1,0,1,0,4,1,0,2,4,1,0,1,0,1,0,1,0,1,0,1,4,1,0,2,4,1,0,2,0,1,0,1,0,1,0,1,4,1,0,2,4,1,0,1,0,1,0,1,2,4,1,0,2,4,1,0,1,0,1,0,1,0,4,1,0,2,4,1,0,1,0,1,0,1,0,4,1,0,2,4,1,0,2,0,1,0,1,0,4,1,0,2,4,1,0,1,0,1,4,1,0,2,4,1,0,1,0,1,2,4,1,0,2,4,1,0,1,0,1,2,4,1,0,2,4,2,1,0,1,0,1,2,4,1,0,2,4,2,1,0,1,0,1,2,4,1,0,2,4,2,0,1,0,1,4,1,0,2,4,2,0,1,0,1,0,4,1,0,2,4,1,0,1,0,1,0,1,4,1,0,2,4,0,1,0,1,4,2,1,0,1,2,1,2,1,0,1,2,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,0,1,2,0,1,0,2,1,0,1,2,0,1,0,2,0,1,0,1,0,1,2,0,1,0,1,0,1,0,2,0,1,0,1,0,1,0,2,0,1,0,1,0,2,1,0,1,0,1,2,0,1,0,2,0,2,1,0,1,2,0,2,1,0,1,0,1,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,0,2,1,0,1,0,1,0,1,0,1,0,2,1,0,1,2,0,1,0,1,2,1,0,1,0,1,0,1,0,2,1,0,2,0,1,0,1,0,2,0,1,0,1,0,2,0,1,0,2,0,1,0,1,0,2,1,0,1,2,0,1,0,1,0,1,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0} + + local img_runs = {1480,1,151,1,87,1,1,150,1,1,86,1,2,148,1,2,87,2,148,2,88,2,148,2,88,2,148,2,88,2,148,2,88,2,70,1,2,9,1,2,63,2,88,2,69,1,2,3,5,1,1,1,1,1,1,1,61,2,88,2,68,1,1,3,1,2,1,3,2,3,2,61,2,88,2,68,1,6,1,4,1,5,1,1,60,2,88,2,67,1,1,17,2,60,2,88,2,67,1,19,1,1,59,2,88,2,67,1,19,1,1,59,2,88,2,67,4,1,11,1,1,1,3,59,2,88,2,67,21,1,59,2,88,2,67,21,1,59,2,88,2,66,1,21,2,58,2,88,2,66,1,21,1,1,58,2,88,2,66,4,17,2,1,58,2,88,2,65,2,5,1,15,2,58,2,88,2,63,1,1,2,22,4,55,2,88,2,57,2,2,34,2,2,49,2,88,2,55,1,2,39,3,1,47,2,88,2,55,5,1,3,2,2,1,25,1,1,1,1,1,1,1,47,2,88,2,57,1,2,1,29,1,4,1,1,1,1,49,2,88,2,59,1,2,8,15,9,2,52,2,88,2,62,2,1,1,1,24,1,1,1,54,2,88,2,66,1,22,1,58,2,88,2,66,1,21,1,59,2,88,2,66,2,20,1,59,2,88,2,65,3,20,2,58,2,88,2,63,2,2,1,20,1,1,2,56,2,88,2,61,2,4,1,20,1,2,2,55,2,88,2,59,1,1,6,1,19,1,4,2,54,2,88,2,58,2,7,2,17,1,1,6,2,52,3,87,2,56,1,2,9,1,26,2,51,3,87,2,55,1,1,40,1,50,2,88,2,54,2,41,1,50,2,88,2,53,2,42,2,49,2,88,2,52,2,44,2,48,2,88,2,51,2,46,2,47,2,88,2,50,2,16,1,31,1,47,2,88,2,50,3,1,14,1,29,1,1,2,46,2,88,2,50,18,1,29,1,2,1,46,2,88,2,50,4,14,1,33,1,45,2,88,2,53,1,3,11,2,15,1,13,1,2,46,2,88,2,56,1,1,11,1,15,1,10,2,1,49,2,88,2,55,2,3,10,2,12,2,8,8,46,2,88,2,50,1,1,4,4,1,9,2,11,2,8,2,4,2,1,2,1,1,42,2,88,2,48,2,3,8,1,9,2,9,3,7,2,8,1,1,2,1,1,40,2,88,2,45,3,2,1,1,1,1,8,1,7,1,1,3,6,4,6,1,8,1,1,1,1,4,2,38,2,88,2,45,1,2,2,22,4,4,4,6,1,10,1,1,2,1,2,1,2,37,2,88,2,42,1,1,1,4,1,2,19,1,1,4,1,5,21,1,2,6,35,2,88,2,42,2,1,1,1,1,15,2,8,3,4,3,6,1,17,1,1,2,1,1,1,34,2,88,2,41,3,1,1,15,2,9,3,5,2,8,1,21,1,1,34,2,88,2,41,1,1,1,16,2,11,2,5,2,9,2,18,2,1,34,2,88,2,41,1,2,1,14,2,13,1,5,1,12,1,17,1,2,34,2,88,2,41,1,16,1,17,1,2,1,14,2,17,1,1,33,2,88,2,41,1,2,1,12,1,17,1,3,2,15,1,14,1,1,1,1,33,2,88,2,41,15,1,22,1,17,1,1,11,1,3,1,33,2,88,2,41,1,14,2,40,1,15,1,33,2,88,2,41,1,15,2,35,1,3,1,10,1,4,1,33,2,88,2,41,1,3,1,12,2,36,2,11,1,4,1,33,2,88,2,40,1,1,18,1,35,1,12,1,4,1,1,32,2,88,2,40,2,4,1,14,1,33,1,12,1,6,1,32,2,88,2,40,1,6,1,14,1,31,1,13,1,6,1,32,2,88,2,39,2,22,2,28,1,21,1,1,31,2,88,2,39,2,24,1,26,1,22,1,1,31,2,88,2,39,2,25,1,24,1,23,1,1,31,2,88,2,39,1,27,1,22,2,23,1,1,31,2,88,2,39,1,49,2,24,3,30,2,88,2,39,1,48,1,27,1,1,30,2,88,2,39,1,47,2,27,1,1,30,2,88,2,37,1,1,47,2,28,1,1,30,2,88,2,37,1,1,46,1,30,2,1,29,2,88,2,37,1,47,1,30,2,30,2,88,2,37,1,1,2,43,1,33,30,3,87,2,37,1,45,1,31,1,1,2,29,3,87,2,37,45,1,35,1,29,1,1,88,2,1,35,1,1,80,2,1,26,1,3,86,1,1,2,1,21,1,4,4,2,1,3,80,30,1,2,125,2,80,2,156,2,79,2,1,156,2,1,77,4,156,1,3,76,3,1,140,1,15,1,2,2,74,2,1,1,1,5,3,129,1,18,1,82,1,7,1,129,1,18,1,82,1,9,1,123,3,20,1,1,80,2,11,1,1,119,1,22,1,1,1,2,76,4,1,154,2,2,63,1,14,3,1,126,1,27,2,65,1,17,1,17,2,132,4,66,1,17,4,113,39,66,2,16,31,191,1,1,1,15,1,153,2,15,3,48,2,16,2,152,1,16,1,1,1,48,2,16,2,152,1,1,2,2,1,10,1,1,1,48,1,13,6,153,1,3,13,1,1,48,1,15,2,1,1,153,3,64,1,16,2,154,1,1,83,1,154,1,17,1,66,1,154,1,17,1,66,1,155,1,82,1,156,1,82,1,156,1,1,80,1,1,157,2,78,2,158,2,78,2,158,1,80,1,158,1,79,2,158,1,79,1,159,1,79,1,160,1,77,2,160,1,77,1,162,1,74,1,1,1,162,1,75,1,239,1,165,1,72,1,166,1,240,1,69,1,412,1,63,1,175,1,63,2,238,1,175,1,63,1,239,1,807} + + local val_i=0 + local run=0 + for y=0,136-1 do + for x=0,240-1 do + if run==0 then + val_i=val_i+1 + run=img_runs[val_i] + end + run=run-1 + pix(x,y,img_values[val_i]) + end + end +end + +local choices = { + { + label = "Wake Up", + }, + { + label = "Stay in Bed", + }, +} + +local function go_to_day_state() + if on_text_complete then + on_text_complete() + on_text_complete = nil + end + if Context.game.current_screen ~= "mysterious_man" then + return + end + state = STATE_DAY + day_timer = day_display_frames +end + +local function wake_up() + Context.home_norman_visible = false + Util.go_to_screen_by_id("home") + MinigameButtonMashWindow.start("game", { + focus_center_x = (Config.screen.width / 2) - 22, + focus_center_y = (Config.screen.height / 2) - 18, + focus_initial_radius = 0, + target_points = 100, + instruction_text = "Wake up Norman!", + show_progress_text = false, + on_win = function() + Audio.music_play_wakingup() + Meter.show() + if trigger_flash_on_wake then + trigger_flash_on_wake = false + Ascension.start_flash() + end + Window.set_current("game") + end, + }) +end + +local function stay_in_bed() + Day.increase() + state = STATE_DAY + day_timer = day_display_frames +end + +--- Starts the mysterious man screen. +--- @param[opt] options table Optional configuration.
+--- Fields:
+--- * text (string) Override for the scrolling text.
+--- * day_text (string) Override for the centered day label.
+--- * on_text_complete (function) Callback fired once when the text phase ends.
+--- * skip_text (boolean) If true, skip the text phase and go straight to day display.
+function MysteriousManScreen.start(options) + options = options or {} + day_timer = 0 + text_done = false + text_done_timer = 0 + selected_choice = 1 + text = options.text or ASC_01_TEXT + text_y = Config.screen.height + day_text_override = options.day_text + on_text_complete = options.on_text_complete + Meter.hide() + trigger_flash_on_wake = not options.skip_text + if options.skip_text then + show_mysterious_screen = false + state = STATE_DAY + day_timer = day_display_frames + else + show_mysterious_screen = true + state = STATE_TEXT + end + Util.go_to_screen_by_id("mysterious_man") + Window.set_current("game") +end + +--- Sets the scrolling text content. +--- @param new_text string The text to display. +function MysteriousManScreen.set_text(new_text) + text = new_text +end + +Screen.register({ + id = "mysterious_man", + name = "Mysterious Man", + decisions = {}, + background_color = Config.colors.black, + update = function() + if state == STATE_TEXT then + if not text_done then + text_y = text_y - text_speed + + local lines = 1 + for _ in string.gmatch(text, "\n") do + lines = lines + 1 + end + + if text_y < -lines * 8 then + text_done = true + text_done_timer = TEXT_DONE_HOLD_FRAMES + end + else + text_done_timer = text_done_timer - 1 + if text_done_timer <= 0 then + go_to_day_state() + end + end + elseif state == STATE_DAY then + day_timer = day_timer - 1 + + if day_timer <= 0 or Input.select() then + if trigger_flash_on_wake or Ascension.get_level() < 1 then + wake_up() + else + state = STATE_CHOICE + selected_choice = 1 + end + end + elseif state == STATE_CHOICE then + selected_choice = UI.update_menu(choices, selected_choice) + + if Input.select() then + Audio.sfx_select() + if selected_choice == 1 then + wake_up() + else + stay_in_bed() + end + end + end + end, + draw = function() + if show_mysterious_screen then + draw_mysterious_man_background() + end + + if state == STATE_TEXT then + local cx = Config.screen.width / 2 + local line_y = text_y + for line in (text .. "\n"):gmatch("(.-)\n") do + Print.text_center(line, cx, line_y, Config.colors.light_grey) + line_y = line_y + 8 + end + elseif state == STATE_DAY then + local day_text = day_text_override or ("Day " .. Context.day_count) + Print.text_center( + day_text, + Config.screen.width / 2, + Config.screen.height / 2 - 3, + Config.colors.white + ) + elseif state == STATE_CHOICE then + local menu_x = (Config.screen.width - 60) / 2 + local menu_y = (Config.screen.height - 20) / 2 + UI.draw_menu(choices, selected_choice, menu_x, menu_y) + end + end, +}) diff --git a/inc/screen/screen.office.lua b/inc/screen/screen.office.lua index 51de28e..12b7c0e 100644 --- a/inc/screen/screen.office.lua +++ b/inc/screen/screen.office.lua @@ -23,5 +23,6 @@ Screen.register({ Sprite.draw_at("dev_guru", 22 * 8, 10 * 8 + 4) Sprite.draw_at("dev_operator", 27 * 8, 10 * 8 + 4) end + Context.have_been_to_office = true end }) diff --git a/inc/screen/screen.toilet.lua b/inc/screen/screen.toilet.lua index 4c31593..be038c6 100644 --- a/inc/screen/screen.toilet.lua +++ b/inc/screen/screen.toilet.lua @@ -19,6 +19,7 @@ Screen.register({ Focus.stop() Context.stat_screen_active = false Meter.show() + Util.go_to_screen_by_id("home") end end, draw = function() diff --git a/inc/screen/screen.walking_to_office.lua b/inc/screen/screen.walking_to_office.lua index db85336..33cf355 100644 --- a/inc/screen/screen.walking_to_office.lua +++ b/inc/screen/screen.walking_to_office.lua @@ -4,7 +4,7 @@ Screen.register({ decisions = { "go_to_home", "go_to_office", - "start_discussion", + "sumphore_discussion", }, background = "street", draw = function() diff --git a/inc/situation/situation.drink_coffee.lua b/inc/situation/situation.drink_coffee.lua index 16cf71e..d791d0e 100644 --- a/inc/situation/situation.drink_coffee.lua +++ b/inc/situation/situation.drink_coffee.lua @@ -2,6 +2,5 @@ Situation.register({ id = "drink_coffee", handle = function() Audio.sfx_select() - Sprite.show("norman", 100, 100) end, }) diff --git a/inc/window/window.minigame.ddr.lua b/inc/window/window.minigame.ddr.lua index df185fa..318d7db 100644 --- a/inc/window/window.minigame.ddr.lua +++ b/inc/window/window.minigame.ddr.lua @@ -40,7 +40,9 @@ function MinigameDDRWindow.init_context() use_pattern = false, return_window = nil, win_timer = 0, - on_win = nil + on_win = nil, + special_condition_met = false, + total_misses = 0, } end @@ -162,6 +164,7 @@ function MinigameDDRWindow.update() if mg.win_timer > 0 then mg.win_timer = mg.win_timer - 1 if mg.win_timer == 0 then + mg.special_condition_met = (mg.total_misses == 0) Meter.on_minigame_complete() if mg.on_win then mg.on_win() @@ -211,6 +214,7 @@ function MinigameDDRWindow.update() if mg.bar_fill < 0 then mg.bar_fill = 0 end + mg.total_misses = mg.total_misses + 1 end end -- iterate backwards to avoid index shift issues @@ -254,6 +258,7 @@ function MinigameDDRWindow.update() if mg.bar_fill < 0 then mg.bar_fill = 0 end + mg.total_misses = mg.total_misses + 1 end end end diff --git a/inc/window/window.minigame.mash.lua b/inc/window/window.minigame.mash.lua index d09b2bb..fbc4850 100644 --- a/inc/window/window.minigame.mash.lua +++ b/inc/window/window.minigame.mash.lua @@ -70,6 +70,9 @@ function MinigameButtonMashWindow.update() if mg.win_timer == 0 then Meter.on_minigame_complete() if mg.focus_center_x then Focus.stop() end + Context.home_norman_visible = true + Context.have_done_work_today = false + Context.have_been_to_office = false if mg.on_win then mg.on_win() else