From 32562f03a961057b4f63cadc1536d59b1848b1db Mon Sep 17 00:00:00 2001 From: Misa Date: Fri, 30 Aug 2024 10:19:27 -0700 Subject: [PATCH] Give MotU trophy in normal mode This makes it so that it is possible to obtain the Master of the Universe trophy/achievement, usually unlocked by beating No Death Mode, outside of NDM. There are several conditions that need to be met: 1. The game needs to be started from a new game and cannot be from loading a save. 2. Accessibility modes (invincibility and slowdown) must never be enabled. If either condition is violated, then the boolean that keeps track of NDM eligibility will be set to false. --- desktop_version/src/Game.cpp | 22 ++++++++++++++++++++-- desktop_version/src/Game.h | 2 ++ desktop_version/src/Logic.cpp | 2 ++ desktop_version/src/Script.cpp | 11 +++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/desktop_version/src/Game.cpp b/desktop_version/src/Game.cpp index 1d7bad14..d7f3818d 100644 --- a/desktop_version/src/Game.cpp +++ b/desktop_version/src/Game.cpp @@ -225,6 +225,7 @@ void Game::init(void) ndmresulthardestroom_x = hardestroom_x; ndmresulthardestroom_y = hardestroom_y; ndmresulthardestroom_specialname = false; + nodeatheligible = false; customcol=0; @@ -3312,11 +3313,14 @@ void Game::updatestate(void) } } - - if (nodeathmode) + if (nodeathmode || nodeatheligible) { unlockAchievement("vvvvvvmaster"); //bloody hell unlocknum(UnlockTrophy_NODEATHMODE_COMPLETE); + } + + if (nodeathmode) + { setstate(3520); setstatedelay(0); } @@ -7768,6 +7772,11 @@ void Game::returntoingame(void) } } DEFER_CALLBACK(nextbgcolor); + + if (nocompetitive()) + { + invalidate_ndm_trophy(); + } } void Game::unlockAchievement(const char* name) @@ -7820,6 +7829,15 @@ void Game::copyndmresults(void) SDL_memcpy(ndmresultcrewstats, crewstats, sizeof(ndmresultcrewstats)); } +void Game::invalidate_ndm_trophy(void) +{ + if (nodeatheligible) + { + vlog_debug("NDM trophy is invalidated!"); + } + nodeatheligible = false; +} + static inline int get_framerate(const int slowdown) { switch (slowdown) diff --git a/desktop_version/src/Game.h b/desktop_version/src/Game.h index 362a956c..20c71a4d 100644 --- a/desktop_version/src/Game.h +++ b/desktop_version/src/Game.h @@ -432,6 +432,8 @@ public: int ndmresulthardestroom_y; bool ndmresulthardestroom_specialname; void copyndmresults(void); + bool nodeatheligible; + void invalidate_ndm_trophy(void); //Time Trials bool intimetrial, timetrialparlost; diff --git a/desktop_version/src/Logic.cpp b/desktop_version/src/Logic.cpp index 7046e871..67dd637a 100644 --- a/desktop_version/src/Logic.cpp +++ b/desktop_version/src/Logic.cpp @@ -461,6 +461,8 @@ void gamelogic(void) game.deathseq--; if (game.deathseq <= 0) { + game.invalidate_ndm_trophy(); + if (game.nodeathmode) { game.deathseq = 1; diff --git a/desktop_version/src/Script.cpp b/desktop_version/src/Script.cpp index a58b1735..d939a600 100644 --- a/desktop_version/src/Script.cpp +++ b/desktop_version/src/Script.cpp @@ -2651,6 +2651,16 @@ void scriptclass::startgamemode(const enum StartMode mode) graphics.showcutscenebars = true; graphics.setbars(320); load("intro"); + + if (!game.nocompetitive()) + { + game.nodeatheligible = true; + vlog_debug("NDM trophy is eligible."); + } + else + { + game.invalidate_ndm_trophy(); + } } break; @@ -3088,6 +3098,7 @@ void scriptclass::hardreset(void) game.nodeathmode = false; game.nocutscenes = false; + game.nodeatheligible = false; for (i = 0; i < (int) SDL_arraysize(game.crewstats); i++) {