aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/agi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/agi/agi.cpp')
-rw-r--r--engines/agi/agi.cpp63
1 files changed, 35 insertions, 28 deletions
diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp
index 0eefbab04d..4ed606c3ba 100644
--- a/engines/agi/agi.cpp
+++ b/engines/agi/agi.cpp
@@ -362,9 +362,15 @@ int AgiEngine::agiInit() {
initPriTable();
- // clear string buffer
- for (i = 0; i < MAX_STRINGS; i++)
- _game.strings[i][0] = 0;
+ // Clear the string buffer on startup, but not when the game restarts, as
+ // some scripts expect that the game strings remain unaffected after a
+ // restart. An example is script 98 in SQ2, which is not invoked on restart
+ // to ask Ego's name again. The name is supposed to be maintained in string 1.
+ // Fixes bug #3292784.
+ if (!_restartGame) {
+ for (i = 0; i < MAX_STRINGS; i++)
+ _game.strings[i][0] = 0;
+ }
// setup emulation
@@ -504,6 +510,7 @@ AgiBase::AgiBase(OSystem *syst, const AGIGameDescription *gameDesc) : Engine(sys
_noSaveLoadAllowed = false;
_rnd = new Common::RandomSource("agi");
+ _sound = 0;
initFeatures();
initVersion();
@@ -511,6 +518,26 @@ AgiBase::AgiBase(OSystem *syst, const AGIGameDescription *gameDesc) : Engine(sys
AgiBase::~AgiBase() {
delete _rnd;
+
+ if (_sound) {
+ _sound->deinitSound();
+ delete _sound;
+ }
+}
+
+void AgiBase::initRenderMode() {
+ _renderMode = Common::kRenderEGA;
+
+ if (ConfMan.hasKey("platform")) {
+ Common::Platform platform = Common::parsePlatform(ConfMan.get("platform"));
+ _renderMode = (platform == Common::kPlatformAmiga) ? Common::kRenderAmiga : Common::kRenderEGA;
+ }
+
+ if (ConfMan.hasKey("render_mode")) {
+ Common::RenderMode tmpMode = Common::parseRenderMode(ConfMan.get("render_mode").c_str());
+ if (tmpMode != Common::kRenderDefault)
+ _renderMode = tmpMode;
+ }
}
AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBase(syst, gameDesc) {
@@ -536,6 +563,8 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas
memset(&_debug, 0, sizeof(struct AgiDebug));
memset(&_mouse, 0, sizeof(struct Mouse));
+ _game._vm = this;
+
_game.clockEnabled = false;
_game.state = STATE_INIT;
@@ -564,14 +593,10 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas
_predictiveDictLineCount = 0;
_firstSlot = 0;
- // NOTE: On game reload the keys do not get set again,
- // thus it is incorrect to reset it in agiInit(). Fixes bug #2823762
- _game.lastController = 0;
- for (int i = 0; i < MAX_DIRS; i++)
- _game.controllerOccured[i] = false;
+ resetControllers();
setupOpcodes();
- _curLogic = NULL;
+ _game._curLogic = NULL;
_timerHack = 0;
}
@@ -610,23 +635,7 @@ void AgiEngine::initialize() {
}
}
- if (ConfMan.hasKey("render_mode")) {
- _renderMode = Common::parseRenderMode(ConfMan.get("render_mode").c_str());
- } else if (ConfMan.hasKey("platform")) {
- switch (Common::parsePlatform(ConfMan.get("platform"))) {
- case Common::kPlatformAmiga:
- _renderMode = Common::kRenderAmiga;
- break;
- case Common::kPlatformPC:
- _renderMode = Common::kRenderEGA;
- break;
- default:
- _renderMode = Common::kRenderEGA;
- break;
- }
- } else {
- _renderMode = Common::kRenderDefault;
- }
+ initRenderMode();
_buttonStyle = AgiButtonStyle(_renderMode);
_defaultButtonStyle = AgiButtonStyle();
@@ -680,8 +689,6 @@ AgiEngine::~AgiEngine() {
agiDeinit();
delete _loader;
- _sound->deinitSound();
- delete _sound;
_gfx->deinitVideo();
delete _sprites;
delete _picture;