MOHAWK: MYST: Move the current stack id to ScriptParser

This commit is contained in:
Bastien Bouclet 2018-05-28 20:22:29 +02:00
parent ea60aef8a8
commit 47ddd9c214
24 changed files with 111 additions and 109 deletions

View file

@ -100,9 +100,9 @@ bool MystConsole::Cmd_Var(int argc, const char **argv) {
}
if (argc > 2)
_vm->_scriptParser->setVarValue((uint16)atoi(argv[1]), (uint16)atoi(argv[2]));
_vm->_stack->setVarValue((uint16)atoi(argv[1]), (uint16)atoi(argv[2]));
debugPrintf("%d = %d\n", (uint16)atoi(argv[1]), _vm->_scriptParser->getVar((uint16)atoi(argv[1])));
debugPrintf("%d = %d\n", (uint16)atoi(argv[1]), _vm->_stack->getVar((uint16)atoi(argv[1])));
return true;
}
@ -138,7 +138,7 @@ static const uint16 default_start_card[12] = {
};
bool MystConsole::Cmd_CurStack(int argc, const char **argv) {
debugPrintf("Current Stack: %s\n", mystStackNames[_vm->getCurStack()]);
debugPrintf("Current Stack: %s\n", mystStackNames[_vm->_stack->getStackId()]);
return true;
}
@ -178,7 +178,7 @@ bool MystConsole::Cmd_ChangeStack(int argc, const char **argv) {
else
card = default_start_card[stackNum - 1];
_vm->changeToStack(stackNum - 1, card, 0, 0);
_vm->changeToStack(static_cast<MystStack>(stackNum - 1), card, 0, 0);
return false;
}
@ -290,7 +290,7 @@ bool MystConsole::Cmd_DisableInitOpcodes(int argc, const char **argv) {
return true;
}
_vm->_scriptParser->disablePersistentScripts();
_vm->_stack->disablePersistentScripts();
return true;
}
@ -331,9 +331,12 @@ bool MystConsole::Cmd_QuickTest(int argc, const char **argv) {
// Go through all the ages, all the views and click random stuff
for (uint i = 0; i < ARRAYSIZE(mystStackNames); i++) {
if (i == 2 || i == 5 || i == 9 || i == 10) continue;
debug("Loading stack %s", mystStackNames[i]);
_vm->changeToStack(i, default_start_card[i], 0, 0);
MystStack stackId = static_cast<MystStack>(i);
if (stackId == kDemoStack || stackId == kMakingOfStack
|| stackId == kDemoSlidesStack || stackId == kDemoPreviewStack) continue;
debug("Loading stack %s", mystStackNames[stackId]);
_vm->changeToStack(stackId, default_start_card[stackId], 0, 0);
Common::Array<uint16> ids = _vm->getResourceIDList(ID_VIEW);
for (uint j = 0; j < ids.size(); j++) {
@ -355,9 +358,9 @@ bool MystConsole::Cmd_QuickTest(int argc, const char **argv) {
_vm->doFrame();
if (_vm->getCurStack() != i) {
if (_vm->_stack->getStackId() != stackId) {
// Clicking may have linked us to another age
_vm->changeToStack(i, default_start_card[i], 0, 0);
_vm->changeToStack(stackId, default_start_card[stackId], 0, 0);
}
}
}

View file

@ -209,13 +209,13 @@ void MystOptionsDialog::open() {
_dropPageButton->setEnabled(canDropPage);
if (_showMapButton) {
bool canShowMap = _vm->isInteractive() && _vm->_scriptParser->getMap();
bool canShowMap = _vm->isInteractive() && _vm->_stack->getMap();
_showMapButton->setEnabled(canShowMap);
}
if (_returnToMenuButton) {
// Return to menu button is not enabled on the menu
bool canReturnToMenu = _vm->isInteractive() && _vm->getCurStack() != kDemoStack;
bool canReturnToMenu = _vm->isInteractive() && _vm->_stack->getStackId() != kDemoStack;
_returnToMenuButton->setEnabled(canReturnToMenu);
}

View file

@ -71,7 +71,6 @@ MohawkEngine_Myst::MohawkEngine_Myst(OSystem *syst, const MohawkGameDescription
_currentCursor = 0;
_mainCursor = kDefaultMystCursor;
_showResourceRects = false;
_curStack = 0;
_lastSaveTime = 0;
_sound = nullptr;
@ -249,7 +248,7 @@ void MohawkEngine_Myst::playMovieBlocking(const Common::String &name, MystStack
waitUntilMovieEnds(video);
}
void MohawkEngine_Myst::playFlybyMovie(uint16 stack, uint16 card) {
void MohawkEngine_Myst::playFlybyMovie(MystStack stack, uint16 card) {
static const uint16 kMasterpieceOnly = 0xFFFF;
// Play Flyby Entry Movie on Masterpiece Edition.
@ -384,7 +383,7 @@ void MohawkEngine_Myst::doFrame() {
_video->updateMovies();
if (isInteractive()) {
_waitingOnBlockingOperation = true;
_scriptParser->runPersistentScripts();
_stack->runPersistentScripts();
_waitingOnBlockingOperation = false;
}
@ -433,7 +432,7 @@ void MohawkEngine_Myst::doFrame() {
}
if (_needsShowMap) {
_scriptParser->showMap();
_stack->showMap();
_needsShowMap = false;
}
@ -533,8 +532,8 @@ void MohawkEngine_Myst::pauseEngineIntern(bool pause) {
}
}
void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcSound, uint16 linkDstSound) {
debug(2, "changeToStack(%d)", stack);
void MohawkEngine_Myst::changeToStack(MystStack stackId, uint16 card, uint16 linkSrcSound, uint16 linkDstSound) {
debug(2, "changeToStack(%d)", stackId);
// Fill screen with black and empty cursor
_cursor->setCursor(0);
@ -546,8 +545,8 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
// In Myst ME, play a fullscreen flyby movie, except when loading saves.
// Also play a flyby when first linking to Myst.
if (getFeatures() & GF_ME
&& (_curStack != kIntroStack || (stack == kMystStack && card == 4134))) {
playFlybyMovie(stack, card);
&& ((_stack && _stack->getStackId() != kIntroStack) || (stackId == kMystStack && card == 4134))) {
playFlybyMovie(stackId, card);
}
_sound->stopBackground();
@ -565,55 +564,53 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
_card.reset();
}
_curStack = stack;
switch (_curStack) {
switch (stackId) {
case kChannelwoodStack:
_gameState->_globals.currentAge = kChannelwood;
_scriptParser = MystScriptParserPtr(new MystStacks::Channelwood(this));
_stack = MystScriptParserPtr(new MystStacks::Channelwood(this));
break;
case kCreditsStack:
_scriptParser = MystScriptParserPtr(new MystStacks::Credits(this));
_stack = MystScriptParserPtr(new MystStacks::Credits(this));
break;
case kDemoStack:
_gameState->_globals.currentAge = kSelenitic;
_scriptParser = MystScriptParserPtr(new MystStacks::Demo(this));
_stack = MystScriptParserPtr(new MystStacks::Demo(this));
break;
case kDniStack:
_gameState->_globals.currentAge = kDni;
_scriptParser = MystScriptParserPtr(new MystStacks::Dni(this));
_stack = MystScriptParserPtr(new MystStacks::Dni(this));
break;
case kIntroStack:
_scriptParser = MystScriptParserPtr(new MystStacks::Intro(this));
_stack = MystScriptParserPtr(new MystStacks::Intro(this));
break;
case kMakingOfStack:
_scriptParser = MystScriptParserPtr(new MystStacks::MakingOf(this));
_stack = MystScriptParserPtr(new MystStacks::MakingOf(this));
break;
case kMechanicalStack:
_gameState->_globals.currentAge = kMechanical;
_scriptParser = MystScriptParserPtr(new MystStacks::Mechanical(this));
_stack = MystScriptParserPtr(new MystStacks::Mechanical(this));
break;
case kMystStack:
_gameState->_globals.currentAge = kMystLibrary;
_scriptParser = MystScriptParserPtr(new MystStacks::Myst(this));
_stack = MystScriptParserPtr(new MystStacks::Myst(this));
break;
case kDemoPreviewStack:
_scriptParser = MystScriptParserPtr(new MystStacks::Preview(this));
_stack = MystScriptParserPtr(new MystStacks::Preview(this));
break;
case kSeleniticStack:
_gameState->_globals.currentAge = kSelenitic;
_scriptParser = MystScriptParserPtr(new MystStacks::Selenitic(this));
_stack = MystScriptParserPtr(new MystStacks::Selenitic(this));
break;
case kDemoSlidesStack:
_gameState->_globals.currentAge = kStoneship;
_scriptParser = MystScriptParserPtr(new MystStacks::Slides(this));
_stack = MystScriptParserPtr(new MystStacks::Slides(this));
break;
case kStoneshipStack:
_gameState->_globals.currentAge = kStoneship;
_scriptParser = MystScriptParserPtr(new MystStacks::Stoneship(this));
_stack = MystScriptParserPtr(new MystStacks::Stoneship(this));
break;
default:
error("Unknown Myst stack %d", _curStack);
error("Unknown Myst stack %d", stackId);
}
// If the array is empty, add a new one. Otherwise, delete the first
@ -625,8 +622,8 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
_mhk[0] = new MohawkArchive();
}
if (!_mhk[0]->openFile(mystFiles[_curStack]))
error("Could not open %s", mystFiles[_curStack]);
if (!_mhk[0]->openFile(mystFiles[stackId]))
error("Could not open %s", mystFiles[stackId]);
// Clear the resource cache and the image cache
_cache.clear();
@ -641,7 +638,7 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS
void MohawkEngine_Myst::changeToCard(uint16 card, TransitionType transition) {
debug(2, "changeToCard(%d)", card);
_scriptParser->disablePersistentScripts();
_stack->disablePersistentScripts();
_video->stopVideos();
@ -698,7 +695,7 @@ void MohawkEngine_Myst::refreshCursor() {
}
void MohawkEngine_Myst::redrawResource(MystAreaImageSwitch *resource, bool update) {
resource->drawConditionalDataToScreen(_scriptParser->getVar(resource->getImageSwitchVar()), update);
resource->drawConditionalDataToScreen(_stack->getVar(resource->getImageSwitchVar()), update);
}
MystArea *MohawkEngine_Myst::loadResource(Common::SeekableReadStream *rlstStream, MystArea *parent) {
@ -772,7 +769,7 @@ bool MohawkEngine_Myst::hasGameSaveSupport() const {
}
bool MohawkEngine_Myst::isInteractive() {
return !_scriptParser->isScriptRunning() && !_waitingOnBlockingOperation;
return !_stack->isScriptRunning() && !_waitingOnBlockingOperation;
}
bool MohawkEngine_Myst::canLoadGameStateCurrently() {
@ -798,7 +795,7 @@ bool MohawkEngine_Myst::canSaveGameStateCurrently() {
}
// There's a limited number of stacks the game can save in
switch (_curStack) {
switch (_stack->getStackId()) {
case kChannelwoodStack:
case kDniStack:
case kMechanicalStack:
@ -806,9 +803,9 @@ bool MohawkEngine_Myst::canSaveGameStateCurrently() {
case kSeleniticStack:
case kStoneshipStack:
return true;
default:
return false;
}
return false;
}
void MohawkEngine_Myst::dropPage() {
@ -825,7 +822,7 @@ void MohawkEngine_Myst::dropPage() {
// Redraw page area
if (whitePage && _gameState->_globals.currentAge == kMystLibrary) {
_scriptParser->toggleVar(41);
_stack->toggleVar(41);
_card->redrawArea(41);
} else if (bluePage) {
if (page == kBlueFirePlacePage) {
@ -899,7 +896,7 @@ void MohawkEngine_Myst::applySoundBlock(const MystSoundBlock &block) {
uint16 soundActionVolume = 0;
if (block.sound == kMystSoundActionConditional) {
uint16 soundVarValue = _scriptParser->getVar(block.soundVar);
uint16 soundVarValue = _stack->getVar(block.soundVar);
if (soundVarValue >= block.soundList.size())
warning("Conditional sound variable outside range");
else {

View file

@ -136,11 +136,10 @@ public:
Common::Array<uint16> getResourceIDList(uint32 type) const;
void cachePreload(uint32 tag, uint16 id);
void changeToStack(uint16 stack, uint16 card, uint16 linkSrcSound, uint16 linkDstSound);
void changeToStack(MystStack stackId, uint16 card, uint16 linkSrcSound, uint16 linkDstSound);
void changeToCard(uint16 card, TransitionType transition);
MystCard *getCard() { return _card.get(); };
MystCardPtr getCardPtr() { return _card; };
uint16 getCurStack() { return _curStack; }
void setMainCursor(uint16 cursor);
uint16 getMainCursor() { return _mainCursor; }
void refreshCursor();
@ -163,7 +162,7 @@ public:
MystSound *_sound;
MystGraphics *_gfx;
MystGameState *_gameState;
MystScriptParserPtr _scriptParser;
MystScriptParserPtr _stack;
Common::RandomSource *_rnd;
MystArea *loadResource(Common::SeekableReadStream *rlstStream, MystArea *parent);
@ -175,7 +174,7 @@ public:
VideoEntryPtr playMovie(const Common::String &name, MystStack stack);
VideoEntryPtr findVideo(const Common::String &name, MystStack stack);
void playMovieBlocking(const Common::String &name, MystStack stack, uint16 x, uint16 y);
void playFlybyMovie(uint16 stack, uint16 card);
void playFlybyMovie(MystStack stack, uint16 card);
void waitUntilMovieEnds(const VideoEntryPtr &video);
void playSoundBlocking(uint16 id);
@ -201,7 +200,6 @@ private:
MystOptionsDialog *_optionsDialog;
ResourceCache _cache;
uint16 _curStack;
MystCardPtr _card;
uint32 _lastSaveTime;

View file

@ -94,8 +94,8 @@ void MystArea::handleMouseUp() {
break;
}
_vm->_scriptParser->setInvokingResource(this);
_vm->_scriptParser->runOpcode(opcode, 0);
_vm->_stack->setInvokingResource(this);
_vm->_stack->runOpcode(opcode, 0);
}
bool MystArea::canBecomeActive() {
@ -104,7 +104,7 @@ bool MystArea::canBecomeActive() {
bool MystArea::unreachableZipDest() {
return (_flags & kMystZipModeEnableFlag)
&& !_vm->_gameState->isReachableZipDest(_vm->getCurStack() , _dest);
&& !_vm->_gameState->isReachableZipDest(_vm->_stack->getStackId() , _dest);
}
bool MystArea::isEnabled() {
@ -143,14 +143,14 @@ MystAreaAction::MystAreaAction(MohawkEngine_Myst *vm, ResourceType type, Common:
MystArea(vm, type, rlstStream, parent) {
debugC(kDebugResource, "\tResource Type 5 Script:");
_script = vm->_scriptParser->readScript(rlstStream, kMystScriptNormal);
_script = vm->_stack->readScript(rlstStream, kMystScriptNormal);
}
void MystAreaAction::handleMouseUp() {
// Keep a reference to the stack so it is not freed if a script switches to another stack
MystScriptParserPtr parser = _vm->_scriptParser;
MystScriptParserPtr stack = _vm->_stack;
parser->runScript(_script, this);
stack->runScript(_script, this);
}
const Common::String MystAreaAction::describe() {
@ -160,7 +160,7 @@ const Common::String MystAreaAction::describe() {
desc += " ops:";
for (uint i = 0; i < _script.size(); i++)
desc += " " + _vm->_scriptParser->getOpcodeDesc(_script[i].opcode);
desc += " " + _vm->_stack->getOpcodeDesc(_script[i].opcode);
}
return desc;
@ -320,7 +320,7 @@ void MystAreaActionSwitch::doSwitch(AreaHandler handler) {
else if (_subResources.size() != 0)
warning("Action switch resource with _numSubResources of %d, but no control variable", _subResources.size());
} else {
uint16 varValue = _vm->_scriptParser->getVar(_actionSwitchVar);
uint16 varValue = _vm->_stack->getVar(_actionSwitchVar);
if (_subResources.size() == 1 && varValue != 0)
(_subResources[0]->*handler)();
@ -404,7 +404,7 @@ void MystAreaImageSwitch::drawDataToScreen() {
} else if (_subImages.size() != 0)
warning("Image Switch resource with _numSubImages of %d, but no control variable", _subImages.size());
} else {
uint16 varValue = _vm->_scriptParser->getVar(_imageSwitchVar);
uint16 varValue = _vm->_stack->getVar(_imageSwitchVar);
if (_subImages.size() == 1 && varValue != 0) {
subImageId = 0;
@ -586,7 +586,7 @@ void MystAreaSlider::handleMouseUp() {
value = _pos.x;
}
_vm->_scriptParser->setVarValue(_imageSwitchVar, value);
_vm->_stack->setVarValue(_imageSwitchVar, value);
MystAreaDrag::handleMouseUp();
}
@ -714,32 +714,32 @@ void MystAreaDrag::handleMouseDown() {
const Common::Point &mouse = _vm->_system->getEventManager()->getMousePos();
setPositionClipping(mouse, _pos);
_vm->_scriptParser->setInvokingResource(this);
_vm->_scriptParser->runOpcode(_mouseDownOpcode, _imageSwitchVar);
_vm->_stack->setInvokingResource(this);
_vm->_stack->runOpcode(_mouseDownOpcode, _imageSwitchVar);
}
void MystAreaDrag::handleMouseUp() {
const Common::Point &mouse = _vm->_system->getEventManager()->getMousePos();
setPositionClipping(mouse, _pos);
_vm->_scriptParser->setInvokingResource(this);
_vm->_scriptParser->runOpcode(_mouseUpOpcode, _imageSwitchVar);
_vm->_stack->setInvokingResource(this);
_vm->_stack->runOpcode(_mouseUpOpcode, _imageSwitchVar);
}
void MystAreaDrag::handleMouseDrag() {
const Common::Point &mouse = _vm->_system->getEventManager()->getMousePos();
setPositionClipping(mouse, _pos);
_vm->_scriptParser->setInvokingResource(this);
_vm->_scriptParser->runOpcode(_mouseDragOpcode, _imageSwitchVar);
_vm->_stack->setInvokingResource(this);
_vm->_stack->runOpcode(_mouseDragOpcode, _imageSwitchVar);
}
const Common::String MystAreaDrag::describe() {
return Common::String::format("%s down: %s drag: %s up: %s",
MystAreaImageSwitch::describe().c_str(),
_vm->_scriptParser->getOpcodeDesc(_mouseDownOpcode).c_str(),
_vm->_scriptParser->getOpcodeDesc(_mouseDragOpcode).c_str(),
_vm->_scriptParser->getOpcodeDesc(_mouseUpOpcode).c_str());
_vm->_stack->getOpcodeDesc(_mouseDownOpcode).c_str(),
_vm->_stack->getOpcodeDesc(_mouseDragOpcode).c_str(),
_vm->_stack->getOpcodeDesc(_mouseUpOpcode).c_str());
}
void MystAreaDrag::setPositionClipping(const Common::Point &mouse, Common::Point &dest) {
@ -836,13 +836,13 @@ MystAreaHover::MystAreaHover(MohawkEngine_Myst *vm, ResourceType type, Common::S
void MystAreaHover::handleMouseEnter() {
// Pass along the enter opcode to the script parser
// The variable to use is stored in the dest field
_vm->_scriptParser->runOpcode(_enterOpcode, _dest);
_vm->_stack->runOpcode(_enterOpcode, _dest);
}
void MystAreaHover::handleMouseLeave() {
// Pass along the leave opcode (with no parameters) to the script parser
// The variable to use is stored in the dest field
_vm->_scriptParser->runOpcode(_leaveOpcode, _dest);
_vm->_stack->runOpcode(_leaveOpcode, _dest);
}
void MystAreaHover::handleMouseUp() {
@ -854,8 +854,8 @@ void MystAreaHover::handleMouseUp() {
const Common::String MystAreaHover::describe() {
return Common::String::format("%s enter: %s leave: %s",
MystArea::describe().c_str(),
_vm->_scriptParser->getOpcodeDesc(_enterOpcode).c_str(),
_vm->_scriptParser->getOpcodeDesc(_leaveOpcode).c_str());
_vm->_stack->getOpcodeDesc(_enterOpcode).c_str(),
_vm->_stack->getOpcodeDesc(_leaveOpcode).c_str());
}
} // End of namespace Mohawk

View file

@ -49,7 +49,7 @@ void MystCard::enter() {
_vm->applySoundBlock(_soundBlock);
if (_flags & kMystZipDestination)
_vm->_gameState->addZipDest(_vm->getCurStack(), _id);
_vm->_gameState->addZipDest(_vm->_stack->getStackId(), _id);
// Run the entrance script (if present)
runInitScript();
@ -184,7 +184,7 @@ void MystCard::loadView() {
// Precache Image Block data
if (!_conditionalImages.empty()) {
for (uint16 i = 0; i < _conditionalImages.size(); i++) {
uint16 value = _vm->_scriptParser->getVar(_conditionalImages[i].var);
uint16 value = _vm->_stack->getVar(_conditionalImages[i].var);
_vm->cachePreload(cacheImageType, _conditionalImages[i].values[value]);
}
} else {
@ -195,7 +195,7 @@ void MystCard::loadView() {
if (_soundBlock.sound > 0)
_vm->cachePreload(ID_MSND, _soundBlock.sound);
else if (_soundBlock.sound == kMystSoundActionConditional) {
uint16 value = _vm->_scriptParser->getVar(_soundBlock.soundVar);
uint16 value = _vm->_stack->getVar(_soundBlock.soundVar);
if (_soundBlock.soundList[value].action > 0) {
_vm->cachePreload(ID_MSND, _soundBlock.soundList[value].action);
}
@ -207,7 +207,7 @@ void MystCard::loadView() {
int16 id;
if (_scriptResources[i].type == kResourceSwitch) {
type = _scriptResources[i].switchResourceType;
uint16 value = _vm->_scriptParser->getVar(_scriptResources[i].switchVar);
uint16 value = _vm->_stack->getVar(_scriptResources[i].switchVar);
id = _scriptResources[i].switchResourceIds[value];
} else {
type = _scriptResources[i].type;
@ -296,7 +296,7 @@ uint16 MystCard::getBackgroundImageId() {
imageToDraw = _mainImage;
else {
for (uint16 i = 0; i < _conditionalImages.size(); i++) {
uint16 varValue = _vm->_scriptParser->getVar(_conditionalImages[i].var);
uint16 varValue = _vm->_stack->getVar(_conditionalImages[i].var);
if (varValue < _conditionalImages[i].values.size())
imageToDraw = _conditionalImages[i].values[varValue];
}
@ -318,10 +318,10 @@ void MystCard::runInitScript() {
debugC(kDebugINIT, "Running INIT script");
Common::SeekableReadStream *initStream = _vm->getResource(ID_INIT, _initScriptId);
MystScript script = _vm->_scriptParser->readScript(initStream, kMystScriptInit);
MystScript script = _vm->_stack->readScript(initStream, kMystScriptInit);
delete initStream;
_vm->_scriptParser->runScript(script);
_vm->_stack->runScript(script);
}
void MystCard::runExitScript() {
@ -333,10 +333,10 @@ void MystCard::runExitScript() {
debugC(kDebugEXIT, "Running EXIT script");
Common::SeekableReadStream *exitStream = _vm->getResource(ID_EXIT, _exitScriptId);
MystScript script = _vm->_scriptParser->readScript(exitStream, kMystScriptExit);
MystScript script = _vm->_stack->readScript(exitStream, kMystScriptExit);
delete exitStream;
_vm->_scriptParser->runScript(script);
_vm->_stack->runScript(script);
}
void MystCard::drawResourceRects() {
@ -406,7 +406,7 @@ int16 MystCard::getActiveResourceCursor() {
for (uint16 i = 0; i < _cursorHints.size(); i++) {
if (_activeResource && _resources[_cursorHints[i].id] == _activeResource && _activeResource->isEnabled()) {
if (_cursorHints[i].cursor == -1) {
uint16 var_value = _vm->_scriptParser->getVar(_cursorHints[i].variableHint.var);
uint16 var_value = _vm->_stack->getVar(_cursorHints[i].variableHint.var);
if (var_value >= _cursorHints[i].variableHint.values.size())
warning("Variable %d Out of Range in variable HINT Resource %d", _cursorHints[i].variableHint.var,

View file

@ -44,7 +44,7 @@ MystScriptEntry::MystScriptEntry() {
opcode = 0;
}
const uint8 MystScriptParser::_stackMap[11] = {
const MystStack MystScriptParser::_stackMap[11] = {
kSeleniticStack,
kStoneshipStack,
kMystStack,
@ -74,8 +74,9 @@ const uint16 MystScriptParser::_startCard[11] = {
// NOTE: Credits Start Card is 10000
MystScriptParser::MystScriptParser(MohawkEngine_Myst *vm) :
MystScriptParser::MystScriptParser(MohawkEngine_Myst *vm, MystStack stackId) :
_vm(vm),
_stackId(stackId),
_globals(vm->_gameState->_globals) {
setupCommonOpcodes();
_invokingResource = nullptr;

View file

@ -60,7 +60,7 @@ typedef Common::Array<MystScriptEntry> MystScript;
class MystScriptParser {
public:
explicit MystScriptParser(MohawkEngine_Myst *vm);
MystScriptParser(MohawkEngine_Myst *vm, MystStack stackId);
virtual ~MystScriptParser();
void runScript(const MystScript &script, MystArea *invokingResource = nullptr);
@ -83,6 +83,7 @@ public:
virtual void toggleVar(uint16 var);
virtual bool setVarValue(uint16 var, uint16 value);
MystStack getStackId() const { return _stackId; }
virtual uint16 getMap() { return 0; }
void showMap();
@ -166,7 +167,7 @@ protected:
int16 _tempVar; // Generic temp var used by the scripts
uint32 _startTime; // Generic start time used by the scripts
static const uint8 _stackMap[];
static const MystStack _stackMap[];
static const uint16 _startCard[];
void setupCommonOpcodes();
@ -188,6 +189,8 @@ private:
MystArea *_invokingResource;
int32 _scriptNestingLevel;
const MystStack _stackId;
Common::String describeCommand(const MystOpcode &command, uint16 var, const ArgumentsArray &args);
};

View file

@ -38,7 +38,7 @@ namespace Mohawk {
namespace MystStacks {
Channelwood::Channelwood(MohawkEngine_Myst *vm) :
MystScriptParser(vm),
MystScriptParser(vm, kChannelwoodStack),
_state(vm->_gameState->_channelwood),
_valveVar(0),
_siriusDrawerState(0),

View file

@ -37,7 +37,7 @@ namespace MystStacks {
// NOTE: Credits Start Card is 10000
Credits::Credits(MohawkEngine_Myst *vm) :
MystScriptParser(vm),
MystScriptParser(vm, kCreditsStack),
_creditsRunning(false),
_curImage(0) {
setupOpcodes();

View file

@ -31,7 +31,7 @@ namespace Mohawk {
namespace MystStacks {
Demo::Demo(MohawkEngine_Myst *vm) :
Intro(vm),
Intro(vm, kDemoStack),
_returnToMenuRunning(false),
_returnToMenuStep(0),
_returnToMenuNextTime(0) {
@ -86,7 +86,7 @@ void Demo::returnToMenu_run() {
if (time < _returnToMenuNextTime)
return;
switch (_returnToMenuStep){
switch (_returnToMenuStep) {
case 0:
_vm->_gfx->fadeToBlack();
_vm->changeToCard(2003, kNoTransition);

View file

@ -34,7 +34,7 @@ namespace Mohawk {
namespace MystStacks {
Dni::Dni(MohawkEngine_Myst *vm) :
MystScriptParser(vm),
MystScriptParser(vm, kDniStack),
_notSeenAtrus(true),
_atrusRunning(false),
_waitForLoop(false),

View file

@ -31,8 +31,8 @@
namespace Mohawk {
namespace MystStacks {
Intro::Intro(MohawkEngine_Myst *vm) :
MystScriptParser(vm),
Intro::Intro(MohawkEngine_Myst *vm, MystStack stackId) :
MystScriptParser(vm, stackId),
_introMoviesRunning(false),
_introStep(0),
_linkBookRunning(false),

View file

@ -38,7 +38,7 @@ namespace MystStacks {
class Intro : public MystScriptParser {
public:
explicit Intro(MohawkEngine_Myst *vm);
explicit Intro(MohawkEngine_Myst *vm, MystStack stackId = kIntroStack);
~Intro() override;
void disablePersistentScripts() override;

View file

@ -31,7 +31,7 @@ namespace Mohawk {
namespace MystStacks {
MakingOf::MakingOf(MohawkEngine_Myst *vm) :
MystScriptParser(vm) {
MystScriptParser(vm, kMakingOfStack) {
setupOpcodes();
}

View file

@ -37,7 +37,7 @@ namespace Mohawk {
namespace MystStacks {
Mechanical::Mechanical(MohawkEngine_Myst *vm) :
MystScriptParser(vm),
MystScriptParser(vm, kMechanicalStack),
_state(vm->_gameState->_mechanical) {
setupOpcodes();

View file

@ -37,8 +37,8 @@
namespace Mohawk {
namespace MystStacks {
Myst::Myst(MohawkEngine_Myst *vm) :
MystScriptParser(vm),
Myst::Myst(MohawkEngine_Myst *vm, MystStack stackId) :
MystScriptParser(vm, stackId),
_state(_vm->_gameState->_myst),
_towerRotationCenter(Common::Point(383, 124)) {
setupOpcodes();

View file

@ -37,7 +37,7 @@ namespace MystStacks {
class Myst : public MystScriptParser {
public:
explicit Myst(MohawkEngine_Myst *vm);
explicit Myst(MohawkEngine_Myst *vm, MystStack stackId = kMystStack);
~Myst() override;
void disablePersistentScripts() override;

View file

@ -35,7 +35,7 @@ namespace Mohawk {
namespace MystStacks {
Preview::Preview(MohawkEngine_Myst *vm) :
Myst(vm) {
Myst(vm, kDemoPreviewStack) {
setupOpcodes();
_vm->_cursor->hideCursor();

View file

@ -37,7 +37,7 @@ namespace Mohawk {
namespace MystStacks {
Selenitic::Selenitic(MohawkEngine_Myst *vm) :
MystScriptParser(vm),
MystScriptParser(vm, kSeleniticStack),
_state(vm->_gameState->_selenitic) {
setupOpcodes();

View file

@ -34,7 +34,7 @@ namespace Mohawk {
namespace MystStacks {
Slides::Slides(MohawkEngine_Myst *vm) :
MystScriptParser(vm) {
MystScriptParser(vm, kDemoSlidesStack) {
setupOpcodes();
_vm->_cursor->hideCursor();

View file

@ -38,7 +38,7 @@ namespace Mohawk {
namespace MystStacks {
Stoneship::Stoneship(MohawkEngine_Myst *vm) :
MystScriptParser(vm),
MystScriptParser(vm, kStoneshipStack),
_state(vm->_gameState->_stoneship) {
setupOpcodes();

View file

@ -532,7 +532,7 @@ void MystGameState::deleteSave(int slot) {
g_system->getSavefileManager()->removeSavefile(metadataFilename);
}
void MystGameState::addZipDest(uint16 stack, uint16 view) {
void MystGameState::addZipDest(MystStack stack, uint16 view) {
ZipDests *zipDests = nullptr;
// The demo has no zip dest storage
@ -576,7 +576,7 @@ void MystGameState::addZipDest(uint16 stack, uint16 view) {
(*zipDests)[firstEmpty] = view;
}
bool MystGameState::isReachableZipDest(uint16 stack, uint16 view) {
bool MystGameState::isReachableZipDest(MystStack stack, uint16 view) {
// Zip mode enabled
if (!_globals.zipMode)
return false;

View file

@ -113,8 +113,8 @@ public:
bool isAutoSaveAllowed();
static void deleteSave(int slot);
void addZipDest(uint16 stack, uint16 view);
bool isReachableZipDest(uint16 stack, uint16 view);
void addZipDest(MystStack stack, uint16 view);
bool isReachableZipDest(MystStack stack, uint16 view);
/* 8 Game Global Variables :
0 = Unknown - Fixed at 2