int AgiEngine::runGame() { int ec = errOK; // Execute the game do { debugC(2, kDebugLevelMain, "game loop"); debugC(2, kDebugLevelMain, "game version = 0x%x", getVersion()); if (agiInit() != errOK) break; if (_restartGame) { setflag(fRestartGame, true); _game.lastController = 0; setvar(vTimeDelay, 2); // "normal" speed _restartGame = false; } // Set computer type (v20 i.e. vComputer) and sound type switch (getPlatform()) { case Common::kPlatformAtariST: setvar(vComputer, kAgiComputerAtariST); setvar(vSoundgen, kAgiSoundPC); break; case Common::kPlatformAmiga: if (getFeatures() & GF_OLDAMIGAV20) setvar(vComputer, kAgiComputerAmigaOld); else setvar(vComputer, kAgiComputerAmiga); setvar(vSoundgen, kAgiSoundTandy); break; case Common::kPlatformApple2GS: setvar(vComputer, kAgiComputerApple2GS); if (getFeatures() & GF_2GSOLDSOUND) setvar(vSoundgen, kAgiSound2GSOld); else setvar(vSoundgen, kAgiSoundTandy); break; case Common::kPlatformPC: default: setvar(vComputer, kAgiComputerPC); setvar(vSoundgen, kAgiSoundPC); break; } // Set monitor type (v26 i.e. vMonitor) switch (_renderMode) { case Common::kRenderCGA: setvar(vMonitor, kAgiMonitorCga); break; case Common::kRenderHercG: case Common::kRenderHercA: setvar(vMonitor, kAgiMonitorHercules); break; // Don't know if Amiga AGI games use a different value than kAgiMonitorEga // for vMonitor so I just use kAgiMonitorEga for them (As was done before too). case Common::kRenderAmiga: case Common::kRenderDefault: case Common::kRenderEGA: default: setvar(vMonitor, kAgiMonitorEga); break; } setvar(vFreePages, 180); // Set amount of free memory to realistic value setvar(vMaxInputChars, 38); _game.inputMode = INPUT_NONE; _game.inputEnabled = false; _game.hasPrompt = 0; _game.state = STATE_RUNNING; ec = playGame(); _game.state = STATE_LOADED; agiDeinit(); } while (_restartGame); delete _menu; _menu = NULL; releaseImageStack(); return ec; }
int AgiEngine::runGame() { int ec = errOK; // Execute the game do { debugC(2, kDebugLevelMain, "game loop"); debugC(2, kDebugLevelMain, "game version = 0x%x", getVersion()); if (agiInit() != errOK) break; if (_restartGame) { setFlag(VM_FLAG_RESTART_GAME, true); // do not set VM_VAR_TIME_DELAY, original AGI did not do it // Reset in-game timer inGameTimerReset(); _restartGame = false; } // Set computer type (v20 i.e. vComputer) and sound type switch (getPlatform()) { case Common::kPlatformAtariST: setVar(VM_VAR_COMPUTER, kAgiComputerAtariST); setVar(VM_VAR_SOUNDGENERATOR, kAgiSoundPC); break; case Common::kPlatformAmiga: if (getFeatures() & GF_OLDAMIGAV20) setVar(VM_VAR_COMPUTER, kAgiComputerAmigaOld); else setVar(VM_VAR_COMPUTER, kAgiComputerAmiga); setVar(VM_VAR_SOUNDGENERATOR, kAgiSoundTandy); break; case Common::kPlatformApple2GS: setVar(VM_VAR_COMPUTER, kAgiComputerApple2GS); if (getFeatures() & GF_2GSOLDSOUND) setVar(VM_VAR_SOUNDGENERATOR, kAgiSound2GSOld); else setVar(VM_VAR_SOUNDGENERATOR, kAgiSoundTandy); break; case Common::kPlatformDOS: default: setVar(VM_VAR_COMPUTER, kAgiComputerPC); setVar(VM_VAR_SOUNDGENERATOR, kAgiSoundPC); break; } // Set monitor type (v26 i.e. vMonitor) switch (_renderMode) { case Common::kRenderCGA: setVar(VM_VAR_MONITOR, kAgiMonitorCga); break; case Common::kRenderHercA: case Common::kRenderHercG: setVar(VM_VAR_MONITOR, kAgiMonitorHercules); break; // Don't know if Amiga AGI games use a different value than kAgiMonitorEga // for vMonitor so I just use kAgiMonitorEga for them (As was done before too). case Common::kRenderAmiga: case Common::kRenderApple2GS: case Common::kRenderAtariST: case Common::kRenderEGA: case Common::kRenderVGA: default: setVar(VM_VAR_MONITOR, kAgiMonitorEga); break; } setVar(VM_VAR_FREE_PAGES, 180); // Set amount of free memory to realistic value setVar(VM_VAR_MAX_INPUT_CHARACTERS, 38); _text->promptDisable(); ec = playGame(); agiDeinit(); } while (_restartGame); delete _menu; _menu = NULL; releaseImageStack(); return ec; }