From 96be0fc7a9d005da92a98c2959ce35070adb256e Mon Sep 17 00:00:00 2001 From: Misa Date: Sat, 8 Aug 2020 16:09:55 -0700 Subject: [PATCH] Fix unwinnable save from rescuing Violet out of order You're intended to rescue Violet first, and not second, third, or fourth, and especially not last. If you rescue her second, third, or fourth, your crewmate progress will be reset, but you won't be able to re-rescue them again. This is because Vitellary, Verdigris, Victoria, and Vermilion will be temporarily marked as rescued during the `bigopenworld` cutscene, so duplicate versions of them don't spawn during the cutscene, and then will be marked as missing later to undo it. This first issue can be trivially fixed by simply toggling flags to prevent duplicates of them from spawning during the cutscene instead of fiddling with their rescue statuses. However, there is still another issue. If you rescue Violet last, then you won't be warped to the Final Level, meaning you can't properly complete the game. This can be fixed by adding a `crewrescued() == 6` check to the Space Station 1 Level Complete cutscene. There is additionally a temporary unrescuing of Violet so she doesn't get duplicated during the `bigopenworld` cutscene, and I've had to move that to the start of the `bigopenworld` and `bigopenworldskip` scripts, otherwise the `crewrescued() == 6` check won't work properly. I haven't added hooks for Intermission 1 or 2 because you're not really meant to play the intermissions with Violet (but you probably could anyway, there'd just be no dialogue). Oh, and the pre-Final Level cutscene expects the player to already be hidden before it starts playing, but if you rescue Violet last the player is still visible, so I've fixed that. But there still ends up being two Violets, so I'll probably replace it with a special cutscene later that's not so nonsensical. --- desktop_version/src/Game.cpp | 14 ++++++++++---- desktop_version/src/Scripts.cpp | 20 ++++++++++++-------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/desktop_version/src/Game.cpp b/desktop_version/src/Game.cpp index af0a98a3..cabf239a 100644 --- a/desktop_version/src/Game.cpp +++ b/desktop_version/src/Game.cpp @@ -2649,7 +2649,6 @@ void Game::updatestate() state++; statedelay = 30; graphics.textboxremove(); - crewstats[1] = 0; //Set violet's rescue script to 0 to make the next bit easier teleportscript = ""; } break; @@ -2662,13 +2661,20 @@ void Game::updatestate() if(graphics.fademode==1) { startscript = true; - if (nocutscenes) + if (crewrescued() == 6) { - newscript="bigopenworldskip"; + newscript = "startlevel_final"; } else { - newscript = "bigopenworld"; + if (nocutscenes) + { + newscript="bigopenworldskip"; + } + else + { + newscript = "bigopenworld"; + } } state = 0; } diff --git a/desktop_version/src/Scripts.cpp b/desktop_version/src/Scripts.cpp index ddbe0e39..afc25260 100644 --- a/desktop_version/src/Scripts.cpp +++ b/desktop_version/src/Scripts.cpp @@ -687,15 +687,17 @@ void scriptclass::load(const std::string& name) "cutscene()", "untilbars()", + "missing(purple)", //Set violet's rescue script to 0 to make the next bit easier + "gotoroom(4,10)", "gotoposition(100,177,0)", "createcrewman(150,177,purple,0,faceleft)", //set all the crew as rescued to avoid companion issues! - "rescued(red)", - "rescued(green)", - "rescued(blue)", - "rescued(yellow)", + "flag(8,on)", + "flag(9,on)", + "flag(10,on)", + "flag(11,on)", "fadein()", "untilfade()", @@ -872,10 +874,10 @@ void scriptclass::load(const std::string& name) "untilfade()", "showplayer()", - "missing(red)", - "missing(green)", - "missing(blue)", - "missing(yellow)", + "flag(8,off)", + "flag(9,off)", + "flag(10,off)", + "flag(11,off)", "changeplayercolour(cyan)", "changemood(player,0)", @@ -992,6 +994,7 @@ void scriptclass::load(const std::string& name) else if (SDL_strcmp(t, "bigopenworldskip") == 0) { static const char* lines[] = { + "missing(purple)", "gotoroom(4,10)", "gotoposition(100,177,0)", "createcrewman(150,177,purple,0,faceleft)", @@ -3350,6 +3353,7 @@ void scriptclass::load(const std::string& name) { static const char* lines[] = { "ifskip(skipfinal)", + "hideplayer()", "cutscene()", "untilbars()", "activeteleporter()",