diff --git a/desktop_version/lang/en/strings.xml b/desktop_version/lang/en/strings.xml
index 53f26422..4b6ab504 100644
--- a/desktop_version/lang/en/strings.xml
+++ b/desktop_version/lang/en/strings.xml
@@ -160,10 +160,14 @@
-
+
+
+
+
+
@@ -349,6 +353,10 @@
+
+
+
+
diff --git a/desktop_version/lang/eo/strings.xml b/desktop_version/lang/eo/strings.xml
index d3f15272..9f35d28c 100644
--- a/desktop_version/lang/eo/strings.xml
+++ b/desktop_version/lang/eo/strings.xml
@@ -160,10 +160,14 @@
-
+
+
+
+
+
@@ -349,6 +353,10 @@
+
+
+
+
diff --git a/desktop_version/lang/es/strings.xml b/desktop_version/lang/es/strings.xml
index 9e78d699..039831d9 100644
--- a/desktop_version/lang/es/strings.xml
+++ b/desktop_version/lang/es/strings.xml
@@ -160,10 +160,14 @@
-
+
+
+
+
+
@@ -349,6 +353,10 @@
+
+
+
+
diff --git a/desktop_version/lang/nl/strings.xml b/desktop_version/lang/nl/strings.xml
index f85a5ea3..cc9f0f78 100644
--- a/desktop_version/lang/nl/strings.xml
+++ b/desktop_version/lang/nl/strings.xml
@@ -158,12 +158,16 @@
-
-
-
+
+
+
+
+
+
+
@@ -349,6 +353,10 @@
+
+
+
+
diff --git a/desktop_version/src/Finalclass.cpp b/desktop_version/src/Finalclass.cpp
index 5593293d..41b98756 100644
--- a/desktop_version/src/Finalclass.cpp
+++ b/desktop_version/src/Finalclass.cpp
@@ -611,7 +611,7 @@ const short* finalclass::loadlevel(int rx, int ry)
if(!obj.flags[72])
{
- if (game.intimetrial || game.nocutscenes)
+ if ((game.intimetrial || game.nocutscenes) && !game.translator_exploring)
{
obj.createblock(1, 152 - 4, 112, 20, 16, 85);
}
@@ -1369,7 +1369,11 @@ const short* finalclass::loadlevel(int rx, int ry)
obj.createblock(0, 315, 0, 5, 240);
- if(game.intimetrial)
+ if (game.translator_exploring)
+ {
+ obj.createblock(1, 0, 0, 320, 120, 3091);
+ }
+ else if(game.intimetrial)
{
obj.createblock(1, 0, 0, 320, 120, 82);
}
@@ -1641,7 +1645,7 @@ const short* finalclass::loadlevel(int rx, int ry)
obj.createentity(16, 112, 10, 1, 50520); // (savepoint)
roomname = "Seeing Red";
- if(!game.intimetrial)
+ if(!game.intimetrial || game.translator_exploring)
{
if(game.companion==0 && !obj.flags[8] && !game.crewstats[3]) //also need to check if he's rescued in a previous game
{
diff --git a/desktop_version/src/Game.cpp b/desktop_version/src/Game.cpp
index 5fb0613b..b7b3d188 100644
--- a/desktop_version/src/Game.cpp
+++ b/desktop_version/src/Game.cpp
@@ -299,6 +299,9 @@ void Game::init(void)
timetrialresulttrinkets = 0;
timetrialresultpar = 0;
timetrialresultdeaths = 0;
+ start_translator_exploring = false;
+ translator_exploring = false;
+ translator_exploring_allowtele = false;
totalflips = 0;
hardestroom = "Welcome Aboard";
@@ -1492,6 +1495,12 @@ void Game::updatestate(void)
case 82:
//Time Trial Complete!
obj.removetrigger(82);
+ if (translator_exploring)
+ {
+ translator_exploring_allowtele = true;
+ state = 0;
+ break;
+ }
hascontrol = false;
if (timetrialcheater)
@@ -2311,6 +2320,11 @@ void Game::updatestate(void)
break; //Intermission 1
}
+ if (translator_exploring_allowtele)
+ {
+ state = 3090;
+ }
+
int i = obj.getplayer();
if (INBOUNDS_VEC(i, obj.entities))
{
@@ -2708,6 +2722,26 @@ void Game::updatestate(void)
setstate(0);
break;
+ case 3090:
+ /* Teleporting in translator_exploring should be just like
+ * the intermission replays: simply return to the menu */
+ companion = 0;
+ supercrewmate = false;
+ graphics.fademode = FADE_START_FADEOUT;
+ music.fadeout();
+ state=3100;
+ break;
+ case 3091:
+ /* Different Final Level ending for translator_exploring */
+ music.fadeout();
+ state++;
+ statedelay = 60;
+ break;
+ case 3092:
+ graphics.fademode = FADE_START_FADEOUT;
+ state=3100;
+ break;
+
case 3100:
if (graphics.fademode == FADE_FULLY_BLACK)
{
@@ -6412,6 +6446,7 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ )
case Menu::translator_options:
option(loc::gettext("language statistics"));
option(loc::gettext("translate room names"));
+ option(loc::gettext("explore game"));
option(loc::gettext("menu test"));
option(loc::gettext("limits check"));
option(loc::gettext("return"));
@@ -6426,6 +6461,18 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ )
option(loc::gettext("return"));
menuyoff = 64;
break;
+ case Menu::translator_options_exploregame:
+ option(loc::gettext("space station 1"));
+ option(loc::gettext("the laboratory"));
+ option(loc::gettext("the tower"));
+ option(loc::gettext("space station 2"));
+ option(loc::gettext("the warp zone"));
+ option(loc::gettext("intermission 1"));
+ option(loc::gettext("intermission 2"));
+ option(loc::gettext("the final level"));
+ option(loc::gettext("return"));
+ menuyoff = -20;
+ break;
case Menu::translator_maintenance:
option(loc::gettext("sync language files"));
option(loc::gettext("global statistics"), false);
@@ -6644,6 +6691,7 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ )
menuyoff = -35;
break;
case Menu::playint1:
+ start_translator_exploring = false;
option(loc::gettext("Vitellary"));
option(loc::gettext("Vermilion"));
option(loc::gettext("Verdigris"));
@@ -6652,6 +6700,7 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ )
menuyoff = 10;
break;
case Menu::playint2:
+ start_translator_exploring = false;
option(loc::gettext("Vitellary"));
option(loc::gettext("Vermilion"));
option(loc::gettext("Verdigris"));
@@ -6944,7 +6993,11 @@ void Game::quittomenu(void)
//or "who do you want to play the level with?"
//or "do you want cutscenes?"
//or the confirm-load-quicksave menu
- if (intimetrial)
+ if (translator_exploring)
+ {
+ returntomenu(Menu::translator_options_exploregame);
+ }
+ else if (intimetrial)
{
returntomenu(Menu::timetrials);
}
diff --git a/desktop_version/src/Game.h b/desktop_version/src/Game.h
index 55adf16b..33c3cbfa 100644
--- a/desktop_version/src/Game.h
+++ b/desktop_version/src/Game.h
@@ -65,6 +65,7 @@ namespace Menu
translator_options,
translator_options_limitscheck,
translator_options_stats,
+ translator_options_exploregame,
translator_maintenance,
translator_maintenance_sync,
translator_error_setlangwritedir,
@@ -357,6 +358,10 @@ public:
int timetrialresultshinytarget, timetrialresulttrinkets, timetrialresultpar;
int timetrialresultdeaths;
+ bool start_translator_exploring;
+ bool translator_exploring;
+ bool translator_exploring_allowtele;
+
int creditposition;
int oldcreditposition;
bool insecretlab;
diff --git a/desktop_version/src/Input.cpp b/desktop_version/src/Input.cpp
index 0c8eaffa..91b66a3c 100644
--- a/desktop_version/src/Input.cpp
+++ b/desktop_version/src/Input.cpp
@@ -1182,13 +1182,19 @@ static void menuactionpress(void)
game.savestatsandsettings_menu();
break;
case 2:
+ // enter game
+ music.playef(11);
+ game.createmenu(Menu::translator_options_exploregame);
+ map.nexttowercolour();
+ break;
+ case 3:
// menu test
music.playef(18);
game.menutestmode = true;
game.createmenu((Menu::MenuName) 0);
map.nexttowercolour();
break;
- case 3:
+ case 4:
// limits check
music.playef(11);
loc::local_limits_check();
@@ -1227,6 +1233,59 @@ static void menuactionpress(void)
game.returnmenu();
map.nexttowercolour();
break;
+ case Menu::translator_options_exploregame:
+ music.playef(11);
+ switch (game.currentmenuoption)
+ {
+ case 0:
+ // SS1
+ game.start_translator_exploring = true;
+ startmode(3);
+ break;
+ case 1:
+ // Lab
+ game.start_translator_exploring = true;
+ startmode(4);
+ break;
+ case 2:
+ // Tower
+ game.start_translator_exploring = true;
+ startmode(5);
+ break;
+ case 3:
+ // SS2
+ game.start_translator_exploring = true;
+ startmode(6);
+ break;
+ case 4:
+ // WZ
+ game.start_translator_exploring = true;
+ startmode(7);
+ break;
+ case 5:
+ // Int 1
+ game.createmenu(Menu::playint1);
+ game.start_translator_exploring = true;
+ map.nexttowercolour();
+ break;
+ case 6:
+ // Int 2
+ game.createmenu(Menu::playint2);
+ game.start_translator_exploring = true;
+ map.nexttowercolour();
+ break;
+ case 7:
+ // Final
+ game.start_translator_exploring = true;
+ startmode(8);
+ break;
+ default:
+ // return
+ game.returnmenu();
+ map.nexttowercolour();
+ break;
+ }
+ break;
case Menu::translator_maintenance:
music.playef(11);
switch (game.currentmenuoption)
@@ -2352,7 +2411,7 @@ void gameinput(void)
game.interactheld = false;
}
- if (game.intimetrial && graphics.fademode == FADE_FULLY_BLACK && game.quickrestartkludge)
+ if (game.intimetrial && graphics.fademode == FADE_FULLY_BLACK && game.quickrestartkludge && !game.translator_exploring)
{
//restart the time trial
game.quickrestartkludge = false;
@@ -2417,7 +2476,7 @@ void gameinput(void)
if (interact_pressed && !script.running)
{
- if (game.activetele && game.readytotele > 20 && !game.intimetrial)
+ if (game.activetele && game.readytotele > 20 && (!game.intimetrial || game.translator_exploring_allowtele))
{
enter_already_processed = true;
if(int(SDL_fabsf(obj.entities[ie].vx))<=1 && int(obj.entities[ie].vy)==0)
@@ -2448,7 +2507,7 @@ void gameinput(void)
game.setstate(4000);
game.setstatedelay(0);
}
- else if (game.companion == 0)
+ else if (game.companion == 0 && !game.translator_exploring_allowtele)
{
//Alright, normal teleporting
game.mapmenuchange(TELEPORTERMODE, true);
@@ -2645,7 +2704,7 @@ void gameinput(void)
game.gamesavefailed = false;
game.menupage = 20; // The Map Page
}
- else if (game.intimetrial && graphics.fademode == FADE_NONE)
+ else if (game.intimetrial && graphics.fademode == FADE_NONE && !game.translator_exploring)
{
//Quick restart of time trial
graphics.fademode = FADE_START_FADEOUT;
@@ -2653,7 +2712,7 @@ void gameinput(void)
music.fadeout();
game.quickrestartkludge = true;
}
- else if (game.intimetrial)
+ else if (game.intimetrial && !game.translator_exploring)
{
//Do nothing if we're in a Time Trial but a fade animation is playing
}
diff --git a/desktop_version/src/Labclass.cpp b/desktop_version/src/Labclass.cpp
index 221e3e40..280e85a1 100644
--- a/desktop_version/src/Labclass.cpp
+++ b/desktop_version/src/Labclass.cpp
@@ -1038,7 +1038,10 @@ const short* labclass::loadlevel(int rx, int ry)
//obj.createentity(224, 192, 10, 0, 249550); // (savepoint)
- if(!game.intimetrial) obj.createentity((12 * 8)-4, (6 * 8) + 4, 14); //Teleporter!
+ if(!game.intimetrial || game.translator_exploring)
+ {
+ obj.createentity((12 * 8)-4, (6 * 8) + 4, 14); //Teleporter!
+ }
rcol = 5;
roomname = "Entanglement Generator";
@@ -2022,7 +2025,7 @@ const short* labclass::loadlevel(int rx, int ry)
};
rcol=0;
- if(!game.intimetrial)
+ if(!game.intimetrial || game.translator_exploring)
{
if(game.companion==0 && !obj.flags[9] && !game.crewstats[5]) //also need to check if he's rescued in a previous game
{
diff --git a/desktop_version/src/Logic.cpp b/desktop_version/src/Logic.cpp
index 8fd9e60c..b001e992 100644
--- a/desktop_version/src/Logic.cpp
+++ b/desktop_version/src/Logic.cpp
@@ -1432,7 +1432,7 @@ void gamelogic(void)
}
game.oldreadytotele = game.readytotele;
- if (game.activetele && game.hascontrol && !script.running && !game.intimetrial)
+ if (game.activetele && game.hascontrol && !script.running && (!game.intimetrial || game.translator_exploring_allowtele))
{
int i = obj.getplayer();
SDL_Rect temprect = SDL_Rect();
diff --git a/desktop_version/src/Render.cpp b/desktop_version/src/Render.cpp
index 4a3bfc66..ff2ab8c7 100644
--- a/desktop_version/src/Render.cpp
+++ b/desktop_version/src/Render.cpp
@@ -648,7 +648,7 @@ static void menurender(void)
case 1:
{
graphics.bigprint( -1, 30, loc::gettext("Translate rooms"), tr, tg, tb, true);
- int next_y = graphics.PrintWrap( -1, 65, loc::gettext("Enable room name translation mode, so you can translate room names in context."), tr, tg, tb, true);
+ int next_y = graphics.PrintWrap( -1, 65, loc::gettext("Enable room name translation mode, so you can translate room names in context. Press I for invincibility."), tr, tg, tb, true);
if (roomname_translator::enabled)
{
@@ -661,10 +661,14 @@ static void menurender(void)
break;
}
case 2:
+ graphics.bigprint( -1, 30, loc::gettext("Explore game"), tr, tg, tb, true);
+ graphics.PrintWrap( -1, 65, loc::gettext("Explore the rooms of any level in the game, to find all room names to translate."), tr, tg, tb, true);
+ break;
+ case 3:
graphics.bigprint( -1, 30, loc::gettext("Menu test"), tr, tg, tb, true);
graphics.PrintWrap( -1, 65, loc::gettext("Cycle through most menus in the game. The menus will not actually work, all options take you to the next menu instead. Press Escape to stop."), tr, tg, tb, true);
break;
- case 3:
+ case 4:
graphics.bigprint( -1, 30, loc::gettext("Limits check"), tr, tg, tb, true);
graphics.PrintWrap( -1, 65, loc::gettext("Find translations that don't fit within their defined bounds."), tr, tg, tb, true);
break;
@@ -750,6 +754,39 @@ static void menurender(void)
break;
}
+ case Menu::translator_options_exploregame:
+ switch (game.currentmenuoption)
+ {
+ case 0:
+ graphics.bigprint( -1, 30, loc::gettext("Space Station 1"), tr, tg, tb, true);
+ break;
+ case 1:
+ graphics.bigprint( -1, 30, loc::gettext("The Laboratory"), tr, tg, tb, true);
+ break;
+ case 2:
+ graphics.bigprint( -1, 30, loc::gettext("The Tower"), tr, tg, tb, true);
+ break;
+ case 3:
+ graphics.bigprint( -1, 30, loc::gettext("Space Station 2"), tr, tg, tb, true);
+ break;
+ case 4:
+ graphics.bigprint( -1, 30, loc::gettext("The Warp Zone"), tr, tg, tb, true);
+ break;
+ case 5:
+ graphics.bigprint( -1, 30, loc::gettext("Intermission 1"), tr, tg, tb, true);
+ break;
+ case 6:
+ graphics.bigprint( -1, 30, loc::gettext("Intermission 2"), tr, tg, tb, true);
+ break;
+ case 7:
+ graphics.bigprint( -1, 30, loc::gettext("The Final Level"), tr, tg, tb, true);
+ break;
+ }
+ if (!roomname_translator::enabled)
+ {
+ graphics.PrintWrap( -1, 65, loc::gettext("You have not enabled room name translation mode!"), tr, tg, tb, true);
+ }
+ break;
case Menu::translator_maintenance:
switch (game.currentmenuoption)
{
@@ -2066,7 +2103,7 @@ void gamerender(void)
graphics.bigbprint( -1, 100, "3", 220 - (help.glow), 220 - (help.glow), 255 - (help.glow / 2), true, 4);
}
}
- else if (!roomname_translator::is_pausing())
+ else if (!roomname_translator::is_pausing() && !game.translator_exploring)
{
char buffer[SCREEN_WIDTH_CHARS + 1];
game.timestringcenti(buffer, sizeof(buffer));
@@ -2610,7 +2647,7 @@ void maprender(void)
}
case 3:
{
- if (game.inintermission)
+ if (game.inintermission || game.translator_exploring)
{
graphics.PrintWrap(0, 115, loc::gettext("Cannot Save in Level Replay"), 146, 146, 180, true);
break;
diff --git a/desktop_version/src/Script.cpp b/desktop_version/src/Script.cpp
index c2c06903..d0498b17 100644
--- a/desktop_version/src/Script.cpp
+++ b/desktop_version/src/Script.cpp
@@ -2643,6 +2643,14 @@ void scriptclass::startgamemode(const enum StartMode mode)
}
game.starttrial(game.timetriallevel);
+
+ if (game.translator_exploring)
+ {
+ game.timetrialcountdown = 0;
+ game.timetrialparlost = true;
+ SDL_memset(map.explored, true, sizeof(map.explored));
+ }
+
graphics.fademode = FADE_START_FADEIN;
break;
@@ -3045,6 +3053,10 @@ void scriptclass::hardreset(void)
game.timetrialpar = 0;
game.timetrialcheater = false;
+ game.translator_exploring = game.start_translator_exploring;
+ game.start_translator_exploring = false;
+ game.translator_exploring_allowtele = false;
+
game.totalflips = 0;
game.hardestroom = loc::gettext_roomname(false, 13, 5, "Welcome Aboard", false);
game.hardestroomdeaths = 0;
diff --git a/desktop_version/src/Spacestation2.cpp b/desktop_version/src/Spacestation2.cpp
index b3e30ea0..f69a34f1 100644
--- a/desktop_version/src/Spacestation2.cpp
+++ b/desktop_version/src/Spacestation2.cpp
@@ -1094,7 +1094,7 @@ const short* spacestation2class::loadlevel(int rx, int ry)
obj.createentity(7 * 8, (36 * 8)-216, 1, 12, 1); // Enemy
//FACTORY emitter starts here (manually placed)
- if(!game.intimetrial)
+ if(!game.intimetrial || game.translator_exploring)
{
obj.createentity(18 * 8, (5 * 8) + 4, 14); //Teleporter!
}
@@ -2540,7 +2540,7 @@ const short* spacestation2class::loadlevel(int rx, int ry)
};
//Remove spikes in modes where the player shouldn't kill themselves
- int spikevalue = (game.nodeathmode || game.intimetrial) ? 0 : 9;
+ int spikevalue = (game.nodeathmode || (game.intimetrial && !game.translator_exploring)) ? 0 : 9;
for (int i = 23; i < 23+14; i++)
{
contents[i + 8*40] = spikevalue;
@@ -2559,7 +2559,7 @@ const short* spacestation2class::loadlevel(int rx, int ry)
roomname = "I Can't Believe You Got This Far";
roomname_special = true;
}
- else if (game.intimetrial)
+ else if (game.intimetrial && !game.translator_exploring)
{
roomname = "Imagine Spikes There, if You Like";
roomname_special = true;
@@ -2751,7 +2751,7 @@ const short* spacestation2class::loadlevel(int rx, int ry)
obj.createentity(192, 88, 10, 0, 441490); // (savepoint)
- if(!game.intimetrial)
+ if(!game.intimetrial || game.translator_exploring)
{
if(game.companion==0 && !obj.flags[10] && !game.crewstats[2]) //also need to check if he's rescued in a previous game
{
diff --git a/desktop_version/src/WarpClass.cpp b/desktop_version/src/WarpClass.cpp
index c56801af..951ecd83 100644
--- a/desktop_version/src/WarpClass.cpp
+++ b/desktop_version/src/WarpClass.cpp
@@ -427,7 +427,7 @@ const short* warpclass::loadlevel(int rx, int ry)
86,86,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,86,86,
86,86,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,86,86,
};
- if(!game.intimetrial)
+ if(!game.intimetrial || game.translator_exploring)
{
obj.createentity((7 * 8) + 4, (6 * 8), 14); //Teleporter!
}
@@ -1112,7 +1112,7 @@ const short* warpclass::loadlevel(int rx, int ry)
rcol = 0;
warpy = true;
- if(!game.intimetrial)
+ if(!game.intimetrial || game.translator_exploring)
{
if(game.companion==0 && !obj.flags[11] && !game.crewstats[4]) //also need to check if he's rescued in a previous game
{