1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-18 10:38:31 +02:00

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.
This commit is contained in:
Misa 2020-08-08 16:09:55 -07:00 committed by Ethan Lee
parent 3ffe1b2e3b
commit 96be0fc7a9
2 changed files with 22 additions and 12 deletions

View File

@ -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;
}

View File

@ -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()",