aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/cycle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/agi/cycle.cpp')
-rw-r--r--engines/agi/cycle.cpp544
1 files changed, 307 insertions, 237 deletions
diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp
index 6b34605364..19aca6f2c4 100644
--- a/engines/agi/cycle.cpp
+++ b/engines/agi/cycle.cpp
@@ -20,11 +20,17 @@
*
*/
+#include "common/config-manager.h"
+
#include "agi/agi.h"
#include "agi/sprite.h"
#include "agi/graphics.h"
+#include "agi/inv.h"
+#include "agi/text.h"
#include "agi/keyboard.h"
#include "agi/menu.h"
+#include "agi/systemui.h"
+#include "agi/appleIIgs_timedelay_overwrite.h"
namespace Agi {
@@ -33,295 +39,286 @@ namespace Agi {
* This function is called when ego enters a new room.
* @param n room number
*/
-void AgiEngine::newRoom(int n) {
- VtEntry *v;
+void AgiEngine::newRoom(int16 newRoomNr) {
+ ScreenObjEntry *screenObj;
+ ScreenObjEntry *screenObjEgo = &_game.screenObjTable[SCREENOBJECTS_EGO_ENTRY];
int i;
- // Simulate slowww computer.
- // Many effects rely on it.
- pause(kPauseRoom);
+ // Loading trigger
+ artificialDelayTrigger_NewRoom(newRoomNr);
- debugC(4, kDebugLevelMain, "*** room %d ***", n);
+ debugC(4, kDebugLevelMain, "*** room %d ***", newRoomNr);
_sound->stopSound();
i = 0;
- for (v = _game.viewTable; v < &_game.viewTable[MAX_VIEWTABLE]; v++) {
- v->entry = i++;
- v->flags &= ~(fAnimated | fDrawn);
- v->flags |= fUpdate;
- v->stepTime = 1;
- v->stepTimeCount = 1;
- v->cycleTime = 1;
- v->cycleTimeCount = 1;
- v->stepSize = 1;
+ for (screenObj = _game.screenObjTable; screenObj < &_game.screenObjTable[SCREENOBJECTS_MAX]; screenObj++) {
+ screenObj->objectNr = i++;
+ screenObj->flags &= ~(fAnimated | fDrawn);
+ screenObj->flags |= fUpdate;
+ screenObj->stepTime = 1;
+ screenObj->stepTimeCount = 1;
+ screenObj->cycleTime = 1;
+ screenObj->cycleTimeCount = 1;
+ screenObj->stepSize = 1;
}
agiUnloadResources();
_game.playerControl = true;
_game.block.active = false;
_game.horizon = 36;
- _game.vars[vPrevRoom] = _game.vars[vCurRoom];
- _game.vars[vCurRoom] = n;
- _game.vars[vBorderTouchObj] = 0;
- _game.vars[vBorderCode] = 0;
- _game.vars[vEgoViewResource] = _game.viewTable[0].currentView;
+ setVar(VM_VAR_PREVIOUS_ROOM, getVar(VM_VAR_CURRENT_ROOM));
+ setVar(VM_VAR_CURRENT_ROOM, newRoomNr);
+ setVar(VM_VAR_BORDER_TOUCH_OBJECT, 0);
+ setVar(VM_VAR_BORDER_CODE, 0);
+ setVar(VM_VAR_EGO_VIEW_RESOURCE, screenObjEgo->currentViewNr);
- agiLoadResource(rLOGIC, n);
+ agiLoadResource(RESOURCETYPE_LOGIC, newRoomNr);
// Reposition ego in the new room
- switch (_game.vars[vBorderTouchEgo]) {
+ switch (getVar(VM_VAR_BORDER_TOUCH_EGO)) {
case 1:
- _game.viewTable[0].yPos = _HEIGHT - 1;
+ screenObjEgo->yPos = SCRIPT_HEIGHT - 1;
break;
case 2:
- _game.viewTable[0].xPos = 0;
+ screenObjEgo->xPos = 0;
break;
case 3:
- _game.viewTable[0].yPos = HORIZON + 1;
+ screenObjEgo->yPos = _game.horizon + 1;
break;
case 4:
- _game.viewTable[0].xPos = _WIDTH - _game.viewTable[0].xSize;
+ screenObjEgo->xPos = SCRIPT_WIDTH - screenObjEgo->xSize;
break;
}
- _game.vars[vBorderTouchEgo] = 0;
- setflag(fNewRoomExec, true);
+ uint16 agiVersion = getVersion();
+
+ if (agiVersion < 0x2000) {
+ warning("STUB: NewRoom(%d)", newRoomNr);
+
+ screenObjEgo->flags &= ~fDidntMove;
+ // animateObject(0);
+ agiLoadResource(RESOURCETYPE_VIEW, screenObjEgo->currentViewNr);
+ setView(screenObjEgo, screenObjEgo->currentViewNr);
- _game.exitAllLogics = true;
+ } else {
+ if (agiVersion >= 0x3000) {
+ // this was only done in AGI3
+ if (screenObjEgo->motionType == kMotionEgo) {
+ screenObjEgo->motionType = kMotionNormal;
+ setVar(VM_VAR_EGO_DIRECTION, 0);
+ }
+ }
- writeStatus();
- writePrompt();
+ setVar(VM_VAR_BORDER_TOUCH_EGO, 0);
+ setFlag(VM_FLAG_NEW_ROOM_EXEC, true);
+
+ _game.exitAllLogics = true;
+
+ _game._vm->_text->statusDraw();
+ _game._vm->_text->promptRedraw();
+ }
}
void AgiEngine::resetControllers() {
int i;
- for (i = 0; i < MAX_DIRS; i++) {
+ for (i = 0; i < MAX_CONTROLLERS; i++) {
_game.controllerOccured[i] = false;
}
}
void AgiEngine::interpretCycle() {
- int oldSound, oldScore;
+ ScreenObjEntry *screenObjEgo = &_game.screenObjTable[SCREENOBJECTS_EGO_ENTRY];
+ bool oldSound;
+ byte oldScore;
- if (_game.playerControl)
- _game.vars[vEgoDir] = _game.viewTable[0].direction;
+ if (!_game.playerControl)
+ setVar(VM_VAR_EGO_DIRECTION, screenObjEgo->direction);
else
- _game.viewTable[0].direction = _game.vars[vEgoDir];
+ screenObjEgo->direction = getVar(VM_VAR_EGO_DIRECTION);
checkAllMotions();
- oldScore = _game.vars[vScore];
- oldSound = getflag(fSoundOn);
+ oldScore = getVar(VM_VAR_SCORE);
+ oldSound = getFlag(VM_FLAG_SOUND_ON);
+
+ // Reset script heuristic here
+ resetGetVarSecondsHeuristic();
_game.exitAllLogics = false;
while (runLogic(0) == 0 && !(shouldQuit() || _restartGame)) {
- _game.vars[vWordNotFound] = 0;
- _game.vars[vBorderTouchObj] = 0;
- _game.vars[vBorderCode] = 0;
- oldScore = _game.vars[vScore];
- setflag(fEnteredCli, false);
+ setVar(VM_VAR_WORD_NOT_FOUND, 0);
+ setVar(VM_VAR_BORDER_TOUCH_OBJECT, 0);
+ setVar(VM_VAR_BORDER_CODE, 0);
+ oldScore = getVar(VM_VAR_SCORE);
+ setFlag(VM_FLAG_ENTERED_CLI, false);
_game.exitAllLogics = false;
+ _veryFirstInitialCycle = false;
+ artificialDelay_CycleDone();
resetControllers();
}
+ _veryFirstInitialCycle = false;
+ artificialDelay_CycleDone();
resetControllers();
- _game.viewTable[0].direction = _game.vars[vEgoDir];
+ screenObjEgo->direction = getVar(VM_VAR_EGO_DIRECTION);
- if (_game.vars[vScore] != oldScore || getflag(fSoundOn) != oldSound)
- writeStatus();
+ if (getVar(VM_VAR_SCORE) != oldScore || getFlag(VM_FLAG_SOUND_ON) != oldSound)
+ _game._vm->_text->statusDraw();
- _game.vars[vBorderTouchObj] = 0;
- _game.vars[vBorderCode] = 0;
- setflag(fNewRoomExec, false);
- setflag(fRestartGame, false);
- setflag(fRestoreJustRan, false);
+ setVar(VM_VAR_BORDER_TOUCH_OBJECT, 0);
+ setVar(VM_VAR_BORDER_CODE, 0);
+ setFlag(VM_FLAG_NEW_ROOM_EXEC, false);
+ setFlag(VM_FLAG_RESTART_GAME, false);
+ setFlag(VM_FLAG_RESTORE_JUST_RAN, false);
if (_game.gfxMode) {
- updateViewtable();
- _gfx->doUpdate();
+ updateScreenObjTable();
}
+ _gfx->updateScreen();
+ //_gfx->doUpdate();
}
-/**
- * Update AGI interpreter timer.
- */
-void AgiEngine::updateTimer() {
- _clockCount++;
- if (_clockCount <= TICK_SECONDS)
- return;
-
- _clockCount -= TICK_SECONDS;
-
- if (!_game.clockEnabled)
- return;
-
- setvar(vSeconds, getvar(vSeconds) + 1);
- if (getvar(vSeconds) < 60)
- return;
-
- setvar(vSeconds, 0);
- setvar(vMinutes, getvar(vMinutes) + 1);
- if (getvar(vMinutes) < 60)
- return;
-
- setvar(vMinutes, 0);
- setvar(vHours, getvar(vHours) + 1);
- if (getvar(vHours) < 24)
- return;
-
- setvar(vHours, 0);
- setvar(vDays, getvar(vDays) + 1);
-}
-
-void AgiEngine::newInputMode(InputMode mode) {
- if (mode == INPUT_MENU && !getflag(fMenusWork) && !(getFeatures() & GF_MENUS))
- return;
-
- _oldMode = _game.inputMode;
- _game.inputMode = mode;
-}
-
-void AgiEngine::oldInputMode() {
- _game.inputMode = _oldMode;
-}
-
-// If main_cycle returns false, don't process more events!
-int AgiEngine::mainCycle(bool onlyCheckForEvents) {
- unsigned int key, kascii;
- VtEntry *v = &_game.viewTable[0];
-
- if (!onlyCheckForEvents) {
- pollTimer();
- updateTimer();
- }
+// We return the current key, or 0 if no key was pressed
+uint16 AgiEngine::processAGIEvents() {
+ uint16 key;
+ ScreenObjEntry *screenObjEgo = &_game.screenObjTable[SCREENOBJECTS_EGO_ENTRY];
+ wait(10);
key = doPollKeyboard();
// In AGI Mouse emulation mode we must update the mouse-related
// vars in every interpreter cycle.
//
// We run AGIMOUSE always as a side effect
- //if (getFeatures() & GF_AGIMOUSE) {
- _game.vars[28] = _mouse.x / 2;
- _game.vars[29] = _mouse.y;
- //}
-
- if (key == KEY_STATUSLN) { // F11
- _debug.statusline = !_debug.statusline;
- writeStatus();
- key = 0;
+ setVar(VM_VAR_MOUSE_X, _mouse.pos.x / 2);
+ setVar(VM_VAR_MOUSE_Y, _mouse.pos.y);
+
+ if (!cycleInnerLoopIsActive()) {
+ // Click-to-walk mouse interface
+ if (_game.playerControl && (screenObjEgo->flags & fAdjEgoXY)) {
+ int toX = screenObjEgo->move_x;
+ int toY = screenObjEgo->move_y;
+
+ // AGI Mouse games use ego's sprite's bottom left corner for mouse walking target.
+ // Amiga games use ego's sprite's bottom center for mouse walking target.
+ // Atari ST and Apple II GS seem to use the bottom left
+ if (getPlatform() == Common::kPlatformAmiga)
+ toX -= (screenObjEgo->xSize / 2); // Center ego's sprite horizontally
+
+ // Adjust ego's sprite's mouse walking target position (These parameters are
+ // controlled with the adj.ego.move.to.x.y-command). Note that these values rely
+ // on the horizontal centering of the ego's sprite at least on the Amiga platform.
+ toX += _game.adjMouseX;
+ toY += _game.adjMouseY;
+
+ screenObjEgo->direction = getDirection(screenObjEgo->xPos, screenObjEgo->yPos, toX, toY, screenObjEgo->stepSize);
+
+ if (screenObjEgo->direction == 0)
+ inDestination(screenObjEgo);
+ }
}
- if (key == KEY_PRIORITY) { // F12
- _sprites->eraseBoth();
- _debug.priority = !_debug.priority;
- _picture->showPic();
- _sprites->blitBoth();
- _sprites->commitBoth();
- key = 0;
- }
+ handleMouseClicks(key);
- // Click-to-walk mouse interface
- if (_game.playerControl && (v->flags & fAdjEgoXY)) {
- int toX = v->parm1;
- int toY = v->parm2;
+ if (!cycleInnerLoopIsActive()) {
+ // no inner loop active at the moment, regular processing
- // AGI Mouse games use ego's sprite's bottom left corner for mouse walking target.
- // Amiga games use ego's sprite's bottom center for mouse walking target.
- // TODO: Check what Atari ST AGI and Apple IIGS AGI use for mouse walking target.
- if (getPlatform() == Common::kPlatformAmiga)
- toX -= (v->xSize / 2); // Center ego's sprite horizontally
+ if (key) {
+ if (!handleController(key)) {
+ if (key) {
+ // Only set VAR_KEY, when no controller/direction was detected
+ setVar(VM_VAR_KEY, key & 0xFF);
+ if (_text->promptIsEnabled()) {
+ _text->promptKeyPress(key);
+ }
+ }
+ }
+ }
- // Adjust ego's sprite's mouse walking target position (These parameters are
- // controlled with the adj.ego.move.to.x.y-command). Note that these values rely
- // on the horizontal centering of the ego's sprite at least on the Amiga platform.
- toX += _game.adjMouseX;
- toY += _game.adjMouseY;
+ if (_menu->delayedExecuteActive()) {
+ _menu->execute();
+ }
- v->direction = getDirection(v->xPos, v->yPos, toX, toY, v->stepSize);
+ } else {
+ // inner loop active
+ // call specific workers
+ switch (_game.cycleInnerLoopType) {
+ case CYCLE_INNERLOOP_GETSTRING: // loop called from TextMgr::stringEdit()
+ case CYCLE_INNERLOOP_GETNUMBER:
+ if (key) {
+ _text->stringKeyPress(key);
+ }
+ break;
- if (v->direction == 0)
- inDestination(v);
- }
+ case CYCLE_INNERLOOP_INVENTORY: // loop called from InventoryMgr::show()
+ if (key) {
+ _inventory->keyPress(key);
+ }
+ break;
- kascii = KEY_ASCII(key);
+ case CYCLE_INNERLOOP_MENU_VIA_KEYBOARD:
+ if (key) {
+ _menu->keyPress(key);
+ }
+ break;
- if (kascii)
- setvar(vKey, kascii);
+ case CYCLE_INNERLOOP_MENU_VIA_MOUSE:
+ _menu->mouseEvent(key);
+ break;
- bool restartProcessKey;
- do {
- restartProcessKey = false;
+ case CYCLE_INNERLOOP_SYSTEMUI_SELECTSAVEDGAMESLOT:
+ if (key) {
+ _systemUI->savedGameSlot_KeyPress(key);
+ }
+ break;
- switch (_game.inputMode) {
- case INPUT_NORMAL:
- if (!handleController(key)) {
- if (key == 0 || !_game.inputEnabled)
- break;
- handleKeys(key);
-
- // if ESC pressed, activate menu before
- // accept.input from the interpreter cycle
- // sets the input mode to normal again
- // (closes: #540856)
- if (key == KEY_ESCAPE) {
- key = 0;
- restartProcessKey = true;
- }
+ case CYCLE_INNERLOOP_SYSTEMUI_VERIFICATION:
+ _systemUI->askForVerificationKeyPress(key);
+ break;
- // commented out to close Sarien bug #438872
- //if (key)
- // _game.keypress = key;
+ case CYCLE_INNERLOOP_MESSAGEBOX:
+ if (key) {
+ _text->messageBox_KeyPress(key);
}
break;
- case INPUT_GETSTRING:
- handleController(key);
- handleGetstring(key);
- setvar(vKey, 0); // clear ENTER key
- break;
- case INPUT_MENU:
- _menu->keyhandler(key);
- _gfx->doUpdate();
- return false;
- case INPUT_NONE:
- handleController(key);
- if (key)
- _game.keypress = key;
+
+ default:
break;
}
- } while (restartProcessKey);
-
- if (!onlyCheckForEvents) {
- _gfx->doUpdate();
-
- if (_game.msgBoxTicks > 0)
- _game.msgBoxTicks--;
}
- return true;
+ _gfx->updateScreen();
+
+ return key;
}
int AgiEngine::playGame() {
int ec = errOK;
+ const AgiAppleIIgsDelayOverwriteGameEntry *appleIIgsDelayOverwrite = nullptr;
+ const AgiAppleIIgsDelayOverwriteRoomEntry *appleIIgsDelayRoomOverwrite = nullptr;
debugC(2, kDebugLevelMain, "initializing...");
debugC(2, kDebugLevelMain, "game version = 0x%x", getVersion());
_sound->stopSound();
- _gfx->clearScreen(0);
- _game.horizon = HORIZON;
+ // We need to do this accurately and reset the AGI priorityscreen to 4
+ // otherwise at least the fan game Nick's Quest will go into an endless
+ // loop, because the game draws views before it draws the first background picture.
+ // For further study see bug #3451122
+ _gfx->clear(0, 4);
+
+ _game.horizon = 36;
_game.playerControl = false;
- setflag(fLogicZeroFirsttime, true); // not in 2.917
- setflag(fNewRoomExec, true); // needed for MUMG and SQ2!
- setflag(fSoundOn, true); // enable sound
- setvar(vTimeDelay, 2); // "normal" speed
+ setFlag(VM_FLAG_LOGIC_ZERO_FIRST_TIME, true); // not in 2.917
+ setFlag(VM_FLAG_NEW_ROOM_EXEC, true); // needed for MUMG and SQ2!
+ setFlag(VM_FLAG_SOUND_ON, true); // enable sound
+ // do not set VM_VAR_TIME_DELAY, original AGI did not do it (in the data segment it was simply set to 0)
_game.gfxMode = true;
- _game.clockEnabled = true;
- _game.lineUserInput = 22;
+ _text->promptRow_Set(22);
// We run AGIMOUSE always as a side effect
//if (getFeatures() & GF_AGIMOUSE)
@@ -332,41 +329,106 @@ int AgiEngine::playGame() {
debug(0, "Running AGI script.\n");
- setflag(fEnteredCli, false);
- setflag(fSaidAcceptedInput, false);
- _game.vars[vWordNotFound] = 0;
- _game.vars[vKey] = 0;
+ setFlag(VM_FLAG_ENTERED_CLI, false);
+ setFlag(VM_FLAG_SAID_ACCEPTED_INPUT, false);
+ setVar(VM_VAR_WORD_NOT_FOUND, 0);
+ setVar(VM_VAR_KEY, 0);
debugC(2, kDebugLevelMain, "Entering main loop");
- bool firstLoop = !getflag(fRestartGame); // Do not restore on game restart
+ bool firstLoop = !getFlag(VM_FLAG_RESTART_GAME); // Do not restore on game restart
+
+ if (firstLoop) {
+ if (ConfMan.hasKey("save_slot")) {
+ // quick restore enabled
+ _game.automaticRestoreGame = true;
+ }
+ }
+
+ artificialDelay_Reset();
+
+ if (getPlatform() == Common::kPlatformApple2GS) {
+ // Look up, if there is a time delay overwrite table for the current game
+ appleIIgsDelayOverwrite = appleIIgsDelayOverwriteGameTable;
+ while (appleIIgsDelayOverwrite->gameId != GID_AGIDEMO) {
+ if (appleIIgsDelayOverwrite->gameId == getGameID())
+ break; // game found
+ appleIIgsDelayOverwrite++;
+ }
+ }
do {
+ processAGIEvents();
+
+ inGameTimerUpdate();
+
+ uint16 timeDelay = getVar(VM_VAR_TIME_DELAY);
+
+ if (getPlatform() == Common::kPlatformApple2GS) {
+ timeDelay++;
+ // It seems that either Apple IIgs ran very slowly or that the delay in its interpreter was not working as everywhere else
+ // Most games on that platform set the delay to 0, which means no delay in DOS
+ // Gold Rush! even "optimizes" itself when larger sprites are on the screen it sets TIME_DELAY to 0.
+ // Normally that game runs at TIME_DELAY 1.
+ // Maybe a script patch for this game would make sense.
+ // TODO: needs further investigation
+
+ int16 timeDelayOverwrite = -99;
+
+ // Now check, if we got a time delay overwrite entry for current room
+ if (appleIIgsDelayOverwrite->roomTable) {
+ byte curRoom = getVar(VM_VAR_CURRENT_ROOM);
+
+ appleIIgsDelayRoomOverwrite = appleIIgsDelayOverwrite->roomTable;
+ while (appleIIgsDelayRoomOverwrite->fromRoom >= 0) {
+ if ((appleIIgsDelayRoomOverwrite->fromRoom <= curRoom) && (appleIIgsDelayRoomOverwrite->toRoom >= curRoom)) {
+ if (appleIIgsDelayRoomOverwrite->onlyWhenPlayerNotInControl) {
+ if (_game.playerControl) {
+ // Player is actually currently in control? -> then skip this entry
+ appleIIgsDelayRoomOverwrite++;
+ continue;
+ }
+ }
+ timeDelayOverwrite = appleIIgsDelayRoomOverwrite->timeDelayOverwrite;
+ break;
+ }
+ appleIIgsDelayRoomOverwrite++;
+ }
+
+ if (timeDelayOverwrite == -99) {
+ // use default time delay in case no room specific one was found
+ timeDelayOverwrite = appleIIgsDelayOverwrite->defaultTimeDelayOverwrite;
+ }
+ } else {
+ timeDelayOverwrite = appleIIgsDelayOverwrite->defaultTimeDelayOverwrite;
+ }
- if (!mainCycle())
- continue;
+ if (timeDelayOverwrite >= 0) {
+ if (timeDelayOverwrite != timeDelay) {
+ // delayOverwrite is not the same as the delay taken from the scripts? overwrite it
+ //warning("AppleIIgs: time delay overwrite from %d to %d", timeDelay, timeDelayOverwrite);
- if (getvar(vTimeDelay) == 0 || (1 + _clockCount) % getvar(vTimeDelay) == 0) {
- if (!_game.hasPrompt && _game.inputMode == INPUT_NORMAL) {
- writePrompt();
- _game.hasPrompt = 1;
- } else if (_game.hasPrompt && _game.inputMode == INPUT_NONE) {
- writePrompt();
- _game.hasPrompt = 0;
+ setVar(VM_VAR_TIME_DELAY, timeDelayOverwrite - 1); // adjust for Apple IIgs
+ timeDelay = timeDelayOverwrite;
+ }
}
+ }
+
+ if (_passedPlayTimeCycles >= timeDelay) {
+ inGameTimerResetPassedCycles();
interpretCycle();
// Check if the user has asked to load a game from the command line
// or the launcher
- if (firstLoop) {
+ if (_game.automaticRestoreGame) {
+ _game.automaticRestoreGame = false;
checkQuickLoad();
- firstLoop = false;
}
- setflag(fEnteredCli, false);
- setflag(fSaidAcceptedInput, false);
- _game.vars[vWordNotFound] = 0;
- _game.vars[vKey] = 0;
+ setFlag(VM_FLAG_ENTERED_CLI, false);
+ setFlag(VM_FLAG_SAID_ACCEPTED_INPUT, false);
+ setVar(VM_VAR_WORD_NOT_FOUND, 0);
+ setVar(VM_VAR_KEY, 0);
}
if (shouldPerformAutoSave(_lastSaveTime)) {
@@ -392,66 +454,74 @@ int AgiEngine::runGame() {
break;
if (_restartGame) {
- setflag(fRestartGame, true);
- setvar(vTimeDelay, 2); // "normal" speed
+ 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(vComputer, kAgiComputerAtariST);
- setvar(vSoundgen, kAgiSoundPC);
+ setVar(VM_VAR_COMPUTER, kAgiComputerAtariST);
+ setVar(VM_VAR_SOUNDGENERATOR, kAgiSoundPC);
break;
case Common::kPlatformAmiga:
if (getFeatures() & GF_OLDAMIGAV20)
- setvar(vComputer, kAgiComputerAmigaOld);
+ setVar(VM_VAR_COMPUTER, kAgiComputerAmigaOld);
else
- setvar(vComputer, kAgiComputerAmiga);
- setvar(vSoundgen, kAgiSoundTandy);
+ setVar(VM_VAR_COMPUTER, kAgiComputerAmiga);
+ setVar(VM_VAR_SOUNDGENERATOR, kAgiSoundTandy);
break;
case Common::kPlatformApple2GS:
- setvar(vComputer, kAgiComputerApple2GS);
+ setVar(VM_VAR_COMPUTER, kAgiComputerApple2GS);
if (getFeatures() & GF_2GSOLDSOUND)
- setvar(vSoundgen, kAgiSound2GSOld);
+ setVar(VM_VAR_SOUNDGENERATOR, kAgiSound2GSOld);
else
- setvar(vSoundgen, kAgiSoundTandy);
+ setVar(VM_VAR_SOUNDGENERATOR, kAgiSoundTandy);
break;
case Common::kPlatformDOS:
default:
- setvar(vComputer, kAgiComputerPC);
- setvar(vSoundgen, kAgiSoundPC);
+ setVar(VM_VAR_COMPUTER, kAgiComputerPC);
+ setVar(VM_VAR_SOUNDGENERATOR, kAgiSoundPC);
break;
}
// Set monitor type (v26 i.e. vMonitor)
switch (_renderMode) {
case Common::kRenderCGA:
- setvar(vMonitor, kAgiMonitorCga);
+ setVar(VM_VAR_MONITOR, kAgiMonitorCga);
break;
- case Common::kRenderHercG:
case Common::kRenderHercA:
- setvar(vMonitor, kAgiMonitorHercules);
+ case Common::kRenderHercG:
+ // Set EGA for now. Some games place text differently, when this is set to kAgiMonitorHercules.
+ // Text placement was different for Hercules rendering (16x12 instead of 16x16). There also was
+ // not enough space left for the prompt at the bottom. This was caused by the Hercules resolution.
+ // We don't have this restriction and we also support the regular prompt for Hercules mode.
+ // In theory Sierra could have had special Hercules code inside their games.
+ // TODO: check this.
+ setVar(VM_VAR_MONITOR, kAgiMonitorEga);
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::kRenderApple2GS:
+ case Common::kRenderAtariST:
case Common::kRenderEGA:
+ case Common::kRenderVGA:
default:
- setvar(vMonitor, kAgiMonitorEga);
+ setVar(VM_VAR_MONITOR, 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;
+ setVar(VM_VAR_FREE_PAGES, 180); // Set amount of free memory to realistic value
+ setVar(VM_VAR_MAX_INPUT_CHARACTERS, 38);
+ _text->promptDisable();
- _game.state = STATE_RUNNING;
ec = playGame();
- _game.state = STATE_LOADED;
agiDeinit();
} while (_restartGame);