aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2018-02-26 19:15:00 -0500
committerPaul Gilbert2018-02-26 19:15:00 -0500
commit0fc11aef63d2abbc695d64ed41053b4163aac69c (patch)
tree5c3da450b0112529f48e909a81cb58609052f1ba
parent724c4e57add58362395ad6b6e79bcdaed1ff073b (diff)
downloadscummvm-rg350-0fc11aef63d2abbc695d64ed41053b4163aac69c.tar.gz
scummvm-rg350-0fc11aef63d2abbc695d64ed41053b4163aac69c.tar.bz2
scummvm-rg350-0fc11aef63d2abbc695d64ed41053b4163aac69c.zip
XEEN: Cleanup of the game title, intro, and menu launching code
-rw-r--r--engines/xeen/dialogs_control_panel.cpp2
-rw-r--r--engines/xeen/interface.cpp2
-rw-r--r--engines/xeen/scripts.cpp2
-rw-r--r--engines/xeen/swordsofxeen/swordsofxeen.cpp10
-rw-r--r--engines/xeen/swordsofxeen/swordsofxeen.h13
-rw-r--r--engines/xeen/worldofxeen/worldofxeen.cpp91
-rw-r--r--engines/xeen/worldofxeen/worldofxeen.h21
-rw-r--r--engines/xeen/worldofxeen/worldofxeen_menu.cpp3
-rw-r--r--engines/xeen/xeen.cpp37
-rw-r--r--engines/xeen/xeen.h43
10 files changed, 124 insertions, 100 deletions
diff --git a/engines/xeen/dialogs_control_panel.cpp b/engines/xeen/dialogs_control_panel.cpp
index 5a7f593e68..d2129e46c2 100644
--- a/engines/xeen/dialogs_control_panel.cpp
+++ b/engines/xeen/dialogs_control_panel.cpp
@@ -85,7 +85,7 @@ int ControlPanel::execute() {
switch (_buttonValue) {
case Common::KEYCODE_q:
if (Confirm::show(g_vm, Res.CONFIRM_QUIT)) {
- g_vm->_quitMode = QMODE_QUIT;
+ g_vm->_gameMode = GMODE_QUIT;
result = 1;
}
break;
diff --git a/engines/xeen/interface.cpp b/engines/xeen/interface.cpp
index fa06fa7afc..f646eb8ac5 100644
--- a/engines/xeen/interface.cpp
+++ b/engines/xeen/interface.cpp
@@ -320,7 +320,7 @@ void Interface::perform() {
// Show control panel
combat._moveMonsters = false;
ControlPanel::show(_vm);
- if (!g_vm->shouldExit() && !g_vm->_quitMode)
+ if (!g_vm->shouldExit() && !g_vm->_gameMode)
combat._moveMonsters = true;
break;
diff --git a/engines/xeen/scripts.cpp b/engines/xeen/scripts.cpp
index 13b0cb3bb8..e08fd1b5c0 100644
--- a/engines/xeen/scripts.cpp
+++ b/engines/xeen/scripts.cpp
@@ -1466,7 +1466,7 @@ void Scripts::doEnding(const Common::String &endStr) {
uint finalScore = party.getScore();
g_vm->showCutscene(endStr, state, finalScore);
- g_vm->_quitMode = QMODE_MENU;
+ g_vm->_gameMode = GMODE_MENU;
}
bool Scripts::ifProc(int action, uint32 val, int mode, int charIndex) {
diff --git a/engines/xeen/swordsofxeen/swordsofxeen.cpp b/engines/xeen/swordsofxeen/swordsofxeen.cpp
index ebe6f74858..386136770a 100644
--- a/engines/xeen/swordsofxeen/swordsofxeen.cpp
+++ b/engines/xeen/swordsofxeen/swordsofxeen.cpp
@@ -29,10 +29,10 @@ SwordsOfXeenEngine::SwordsOfXeenEngine(OSystem *syst, const XeenGameDescription
: XeenEngine(syst, gameDesc) {
}
-void SwordsOfXeenEngine::outerGameLoop() {
- // TODO: Implement Swords of Xeen main menu
-
- playGame();
+void SwordsOfXeenEngine::showMainMenu() {
+ // TODO: Implement Swords of Xeen main menu. For now, skip to playing game
+ _saves->newGame();
+ _gameMode = GMODE_PLAY_GAME;
}
void SwordsOfXeenEngine::death() {
@@ -88,7 +88,7 @@ void SwordsOfXeenEngine::dream() {
}
void SwordsOfXeenEngine::showCutscene(const Common::String &name, int status, uint score) {
- _quitMode = QMODE_MENU;
+ _gameMode = GMODE_MENU;
}
} // End of namespace SwordsOfXeen
diff --git a/engines/xeen/swordsofxeen/swordsofxeen.h b/engines/xeen/swordsofxeen/swordsofxeen.h
index 2eda3dec29..d301423287 100644
--- a/engines/xeen/swordsofxeen/swordsofxeen.h
+++ b/engines/xeen/swordsofxeen/swordsofxeen.h
@@ -36,10 +36,17 @@ namespace SwordsOfXeen {
class SwordsOfXeenEngine: public XeenEngine {
protected:
/**
- * Outer gameplay loop responsible for dispatching control to game-specific
- * intros, main menus, or to play the actual game
+ * Show the starting sequence/intro
*/
- virtual void outerGameLoop();
+ virtual void showStartup() {
+ // Swords of Xeen doesn't have a starting title or intro
+ _gameMode = GMODE_MENU;
+ }
+
+ /**
+ * Show the startup menu
+ */
+ virtual void showMainMenu();
/**
* Death cutscene
diff --git a/engines/xeen/worldofxeen/worldofxeen.cpp b/engines/xeen/worldofxeen/worldofxeen.cpp
index 54d3b482fc..9403b94bc2 100644
--- a/engines/xeen/worldofxeen/worldofxeen.cpp
+++ b/engines/xeen/worldofxeen/worldofxeen.cpp
@@ -32,63 +32,7 @@ namespace WorldOfXeen {
WorldOfXeenEngine::WorldOfXeenEngine(OSystem *syst, const XeenGameDescription *gameDesc)
: XeenEngine(syst, gameDesc), WorldOfXeenCutscenes(this) {
_seenDarkSideIntro = false;
- _pendingAction = WOX_PLAY_GAME;
-}
-
-void WorldOfXeenEngine::outerGameLoop() {
- //_pendingAction = getGameID() == GType_DarkSide ? WOX_DARKSIDE_INTRO : WOX_CLOUDS_INTRO;
- _pendingAction = WOX_MENU;
-
- if (_loadSaveSlot != -1)
- // Loading savegame from launcher, so Skip menu and go straight to game
- _pendingAction = WOX_PLAY_GAME;
-
- while (!shouldQuit() && _pendingAction != WOX_QUIT) {
- // TODO: Remove this once proper startup menus are added for Clouds & Dark Side
- if (g_vm->getGameID() != GType_WorldOfXeen) {
- _saves->newGame();
- _pendingAction = WOX_PLAY_GAME;
- }
-
- WOXGameAction action = _pendingAction;
- _pendingAction = WOX_MENU;
- _quitMode = QMODE_NONE;
-
- switch (action) {
- case WOX_CLOUDS_INTRO:
- if (showCloudsTitle())
- showCloudsIntro();
- break;
-
- case WOX_CLOUDS_ENDING:
- //showCloudsEnding();
- break;
-
- case WOX_DARKSIDE_INTRO:
- if (showDarkSideTitle())
- showDarkSideIntro();
- break;
-
- case WOX_DARKSIDE_ENDING:
- //showDarkSideEnding();
- break;
-
- case WOX_WORLD_ENDING:
- // TODO
- return;
-
- case WOX_MENU:
- WorldOfXeenMenu::show(this);
- break;
-
- case WOX_PLAY_GAME:
- playGame();
- break;
-
- default:
- break;
- }
- }
+ _gameMode = GMODE_STARTUP;
}
void WorldOfXeenEngine::death() {
@@ -218,11 +162,42 @@ void WorldOfXeenEngine::showCutscene(const Common::String &name, int status, uin
showDarkSideEnding(score);
else if (name == "WORLDEND")
showWorldOfXeenEnding((GooberState)status, score);
+ else if (name == "CLOUDS_TITLE")
+ showCloudsTitle();
+ else if (name == "CLOUDS_INTRO")
+ showCloudsIntro();
+ else if (name == "DARKSIDE_TITLE")
+ showDarkSideTitle();
+ else if (name == "DARKSIDE_INTRO")
+ showDarkSideIntro();
_screen->freePages();
_sound->stopAllAudio();
_events->clearEvents();
- _quitMode = QMODE_MENU;
+ _gameMode = GMODE_MENU;
+}
+
+void WorldOfXeenEngine::showStartup() {
+ if (getGameID() == GType_Clouds) {
+ if (showCloudsTitle())
+ showCloudsIntro();
+ } else {
+ if (showDarkSideTitle())
+ showDarkSideIntro();
+ }
+
+ _gameMode = GMODE_MENU;
+}
+
+void WorldOfXeenEngine::showMainMenu() {
+ if (getGameID() != GType_WorldOfXeen) {
+ // TODO: Implement menus for Clouds and Dark Side of Xeen
+ _saves->newGame();
+ _gameMode = GMODE_PLAY_GAME;
+ return;
+ }
+
+ WorldOfXeenMenu::show(this);
}
} // End of namespace WorldOfXeen
diff --git a/engines/xeen/worldofxeen/worldofxeen.h b/engines/xeen/worldofxeen/worldofxeen.h
index f985947af4..08c2e25ace 100644
--- a/engines/xeen/worldofxeen/worldofxeen.h
+++ b/engines/xeen/worldofxeen/worldofxeen.h
@@ -29,11 +29,6 @@
namespace Xeen {
namespace WorldOfXeen {
-enum WOXGameAction {
- WOX_QUIT, WOX_CLOUDS_INTRO, WOX_CLOUDS_ENDING, WOX_DARKSIDE_INTRO,
- WOX_DARKSIDE_ENDING, WOX_WORLD_ENDING, WOX_MENU, WOX_PLAY_GAME
-};
-
/**
* Implements a descendant of the base Xeen engine to handle
* Clouds of Xeen, Dark Side of Xeen, and Worlds of Xeen specific
@@ -42,10 +37,14 @@ enum WOXGameAction {
class WorldOfXeenEngine: public XeenEngine, public WorldOfXeenCutscenes {
protected:
/**
- * Outer gameplay loop responsible for dispatching control to game-specific
- * intros, main menus, or to play the actual game
+ * Show the starting sequence/intro
+ */
+ virtual void showStartup();
+
+ /**
+ * Show the startup menu
*/
- virtual void outerGameLoop();
+ virtual void showMainMenu();
/**
* Death cutscene
@@ -53,7 +52,6 @@ protected:
virtual void death();
public:
bool _seenDarkSideIntro;
- WOXGameAction _pendingAction;
public:
WorldOfXeenEngine(OSystem *syst, const XeenGameDescription *gameDesc);
virtual ~WorldOfXeenEngine() {}
@@ -67,11 +65,6 @@ public:
* Dream sequence
*/
virtual void dream();
-
- /**
- * Set the next overall game action to do
- */
- void setPendingAction(WOXGameAction action) { _pendingAction = action; }
};
#define WOX_VM (*(::Xeen::WorldOfXeen::WorldOfXeenEngine *)g_vm)
diff --git a/engines/xeen/worldofxeen/worldofxeen_menu.cpp b/engines/xeen/worldofxeen/worldofxeen_menu.cpp
index f43b00f027..42a55885a0 100644
--- a/engines/xeen/worldofxeen/worldofxeen_menu.cpp
+++ b/engines/xeen/worldofxeen/worldofxeen_menu.cpp
@@ -112,8 +112,7 @@ void WorldOfXeenMenu::execute() {
// Load a new game state and set the difficulty
_vm->_saves->newGame();
_vm->_party->_difficulty = (Difficulty)result;
-
- WOX_VM._pendingAction = WOX_PLAY_GAME;
+ _vm->_gameMode = GMODE_PLAY_GAME;
closeWindow();
return;
}
diff --git a/engines/xeen/xeen.cpp b/engines/xeen/xeen.cpp
index 9acf2c51b4..e9e27c455c 100644
--- a/engines/xeen/xeen.cpp
+++ b/engines/xeen/xeen.cpp
@@ -58,7 +58,7 @@ XeenEngine::XeenEngine(OSystem *syst, const XeenGameDescription *gameDesc)
_windows = nullptr;
_noDirectionSense = false;
_startupWindowActive = false;
- _quitMode = QMODE_NONE;
+ _gameMode = GMODE_STARTUP;
_mode = MODE_0;
_endingScore = 0;
_loadSaveSlot = -1;
@@ -128,6 +128,35 @@ Common::Error XeenEngine::run() {
return Common::kNoError;
}
+void XeenEngine::outerGameLoop() {
+ if (_loadSaveSlot != -1)
+ // Loading savegame from launcher, so Skip menu and go straight to game
+ _gameMode = GMODE_PLAY_GAME;
+
+ while (!shouldQuit() && _gameMode != GMODE_QUIT) {
+ GameMode mode = _gameMode;
+ _gameMode = GMODE_NONE;
+ assert(mode != GMODE_NONE);
+
+ switch (mode) {
+ case GMODE_STARTUP:
+ showStartup();
+ break;
+
+ case GMODE_MENU:
+ showMainMenu();
+ break;
+
+ case GMODE_PLAY_GAME:
+ playGame();
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
int XeenEngine::getRandomNumber(int maxNumber) {
return _randomSource.getRandomNumber(maxNumber);
}
@@ -161,7 +190,7 @@ void XeenEngine::playGame() {
}
void XeenEngine::play() {
- _quitMode = QMODE_NONE;
+ _gameMode = GMODE_NONE;
_interface->setup();
_screen->loadBackground("back.raw");
@@ -218,8 +247,8 @@ void XeenEngine::gameLoop() {
_map->cellFlagLookup(_party->_mazePosition);
if (_map->_currentIsEvent) {
- _quitMode = (QuitMode)_scripts->checkEvents();
- if (shouldExit() || _quitMode)
+ _gameMode = (GameMode)_scripts->checkEvents();
+ if (shouldExit() || _gameMode)
return;
}
_party->giveTreasure();
diff --git a/engines/xeen/xeen.h b/engines/xeen/xeen.h
index 561d928158..5031f1fea3 100644
--- a/engines/xeen/xeen.h
+++ b/engines/xeen/xeen.h
@@ -93,10 +93,12 @@ enum Mode {
MODE_86 = 86
};
-enum QuitMode {
- QMODE_NONE = 0,
- QMODE_QUIT = 1,
- QMODE_MENU = 2
+enum GameMode {
+ GMODE_NONE = 0,
+ GMODE_STARTUP = 1,
+ GMODE_MENU = 2,
+ GMODE_PLAY_GAME = 3,
+ GMODE_QUIT = 4
};
struct XeenGameDescription;
@@ -117,19 +119,38 @@ private:
virtual Common::Error run();
virtual bool hasFeature(EngineFeature f) const;
+ /**
+ * Outer gameplay loop responsible for dispatching control to game-specific
+ * intros, main menus, or to play the actual game
+ */
+ void outerGameLoop();
+
+ /**
+ * Inner game loop
+ */
+ void gameLoop();
+
+ /**
+ * Plays the actual game
+ */
void play();
+ /**
+ * Shows a please wait dialog
+ */
void pleaseWait();
-
- void gameLoop();
protected:
int _loadSaveSlot;
protected:
/**
- * Outer gameplay loop responsible for dispatching control to game-specific
- * intros, main menus, or to play the actual game
+ * Show the starting sequence/intro
+ */
+ virtual void showStartup() = 0;
+
+ /**
+ * Show the startup menu
*/
- virtual void outerGameLoop() = 0;
+ virtual void showMainMenu() = 0;
/**
* Play the game
@@ -158,7 +179,7 @@ public:
Windows *_windows;
Mode _mode;
GameEvent _gameEvent;
- QuitMode _quitMode;
+ GameMode _gameMode;
bool _noDirectionSense;
bool _startupWindowActive;
uint _endingScore;
@@ -185,7 +206,7 @@ public:
/**
* Returns true if the game should be exited (and likely return to game menu)
*/
- bool shouldExit() const { return _quitMode != QMODE_NONE || shouldQuit(); }
+ bool shouldExit() const { return _gameMode != GMODE_NONE || shouldQuit(); }
/**
* Load a savegame