MADS: Implement bulk of remaining conversation setup and support methods

This commit is contained in:
Paul Gilbert 2016-01-09 09:56:09 +11:00
parent 28b91136cd
commit d866b24605
6 changed files with 394 additions and 119 deletions

View File

@ -31,11 +31,17 @@ namespace MADS {
GameConversations::GameConversations(MADSEngine *vm) : _vm(vm) {
_runningConv = nullptr;
_restoreRunning = 0;
_nextStartNode = nullptr;
_playerEnabled = false;
_inputMode = kInputBuildingSentences;
_startFrameNumber = 0;
_val1 = _val2 = _val3 = _val4 = _val5 = 0;
_speakerVal = 0;
_heldVal = _releaseVal = 0;
_val1 =_val5 = 0;
_vars = _nextStartNode = nullptr;
_heroTrigger = 0;
_heroTriggerMode = SEQUENCE_TRIGGER_PARSER;
_interlocutorTrigger = 0;
_interlocutorTriggerMode = SEQUENCE_TRIGGER_PARSER;
// Mark all conversation slots as empty
for (int idx = 0; idx < MAX_CONVERSATIONS; ++idx)
@ -90,8 +96,10 @@ void GameConversations::run(int id) {
_startFrameNumber = _vm->_events->getFrameCounter();
_playerEnabled = _vm->_game->_player._stepEnabled;
_inputMode = _vm->_game->_screenObjects._inputMode;
_val1 = _val2 = _val3 = 0;
_val4 = 0;
_heroTrigger = 0;
_interlocutorTrigger = 0;
_val1 = 0;
_heldVal = 0;
_val5 = -1;
// Initialize speaker arrays
@ -105,28 +113,14 @@ void GameConversations::run(int id) {
// Start the conversation
start();
// Set variables
setVariable(2, 0x4F78);
setVariable(3, 0x4F50);
setVariable(4, 0x4F52);
setVariable(5, 0x4F54);
setVariable(6, 0x4F56);
setVariable(7, 0x4F58);
setVariable(8, 0x4F5A);
setVariable(9, 0x4F5C);
setVariable(10, 0x4F5E);
setVariable(11, 0x4F60);
setVariable(12, 0x4F62);
setVariable(13, 0x4F64);
setVariable(14, 0x4F66);
setVariable(15, 0x4F68);
setVariable(16, 0x4F6A);
setVariable(17, 0x4F6C);
setVariable(18, 0x4F6E);
setVariable(19, 0x4F70);
setVariable(20, 0x4F72);
setVariable(21, 0x4F74);
setVariable(22, 0x4F76);
// Setup variables to point to data in the speaker arrays
setVariable(2, &_speakerVal);
for (int idx = 0; idx < MAX_SPEAKERS; ++idx) {
setVariable(3 + idx, &_speakerExists[idx]);
setVariable(8 + idx, &_arr4[idx]);
setVariable(13 + idx, &_arr5[idx]);
setVariable(18 + idx, &_arr6[idx]);
}
// Load sprite data for speaker portraits
for (uint idx = 0; idx < _runningConv->_data._speakerCount; ++idx) {
@ -145,58 +139,148 @@ void GameConversations::run(int id) {
}
void GameConversations::start() {
assert(_runningConv->_cnd._vars.size() >= 2);
_vars = &_runningConv->_cnd._vars[0];
_nextStartNode = &_runningConv->_cnd._vars[1];
warning("TODO: GameConversations::start");
}
void GameConversations::setVariable(uint idx, int v1, int v2) {
if (active()) {
_runningConv->_cnd._vars[idx].v1 = v1;
_runningConv->_cnd._vars[idx].v2 = v2;
}
void GameConversations::setVariable(uint idx, int val) {
if (active())
_runningConv->_cnd._vars[idx].setValue(val);
}
void GameConversations::setVariable(uint idx, int *val) {
if (active())
_runningConv->_cnd._vars[idx].setValue(val);
}
void GameConversations::setStartNode(uint nodeIndex) {
assert(_nextStartNode && _nextStartNode->_isPtr == false);
_nextStartNode->_val = nodeIndex;
}
void GameConversations::stop() {
warning("TODO GameConversations::stop");
// Only need to proceed if there is an active conversation
if (!active())
return;
// Reset player enabled state if needed
if (_vm->_game->_kernelMode == KERNEL_ACTIVE_CODE)
_vm->_game->_player._stepEnabled = _playerEnabled;
// Remove any visible dialog window
removeActiveWindow();
// Release any sprites used for character portraits
for (int idx = 0; idx < _runningConv->_data._speakerCount; ++idx) {
if (_speakerActive[idx])
_vm->_game->_scene._sprites.remove(_speakerPortraits[idx]);
}
// Flag conversation as no longer running
_runningConv = nullptr;
if (_inputMode == kInputConversation)
_vm->_game->_scene._userInterface.emptyConversationList();
_vm->_game->_scene._userInterface.setup(_inputMode);
}
void GameConversations::exportPointer(int *val) {
warning("TODO GameConversations::exportPointer");
void GameConversations::exportPointer(int *ptr) {
// Only need to proceed if there is an active conversation
if (!active())
return;
// Also don't proceed if the number of allowed imports has already been reached
if (_runningConv->_cnd._numImports >= _runningConv->_data._maxImports)
return;
// Get the variable to use for this next import and set it's value
int variableIndex = _runningConv->_cnd._importVariables[
_runningConv->_cnd._numImports++];
setVariable(variableIndex, ptr);
}
void GameConversations::exportValue(int val) {
warning("TODO GameConversations::exportValue");
// Only need to proceed if there is an active conversation
if (!active())
return;
// Also don't proceed if the number of allowed imports has already been reached
if (_runningConv->_cnd._numImports >= _runningConv->_data._maxImports)
return;
// Get the variable to use for this next import and set it's value
int variableIndex = _runningConv->_cnd._importVariables[
_runningConv->_cnd._numImports++];
setVariable(variableIndex, val);
}
void GameConversations::setHeroTrigger(int val) {
_vm->_game->_trigger = val; // HACK
//_running = -1; // HACK
warning("TODO: GameConversations::setHeroTrigger");
_heroTrigger = val;
_heroTriggerMode = _vm->_game->_triggerSetupMode;
}
void GameConversations::setInterlocutorTrigger(int val) {
warning("TODO: GameConversations::setInterlocutorTrigger");
_interlocutorTrigger = val;
_interlocutorTriggerMode = _vm->_game->_triggerSetupMode;
}
int* GameConversations::getVariable(int idx) {
warning("TODO: GameConversations::getVariable");
return nullptr;
int *GameConversations::getVariable(int idx) {
return _vars[idx].getValue();
}
void GameConversations::hold() {
warning("TODO: GameConversations::hold");
if (_heldVal != -1) {
_releaseVal = _heldVal;
_heldVal = -1;
}
}
void GameConversations::release() {
warning("TODO: GameConversations::release");
if (_heldVal == -1) {
_heldVal = _releaseVal;
if (_heldVal == 1 || _heldVal == 2)
update(true);
}
}
void GameConversations::flagEntry(ConvFlagMode mode, int entryIndex) {
assert(_runningConv);
uint &flags = _runningConv->_cnd._entryFlags[entryIndex];
switch (mode) {
case FLAGMODE_1:
flags |= ENTRYFLAG_4000;
flags &= ~ENTRYFLAG_8000;
break;
case FLAGMODE_2:
flags &= ~ENTRYFLAG_8000;
break;
case FLAGMODE_3:
if (!(flags & ENTRYFLAG_4000))
flags |= ENTRYFLAG_8000;
break;
default:
break;
}
}
void GameConversations::reset(int id) {
warning("TODO: GameConversations::reset");
}
void GameConversations::abortConv() {
warning("TODO: GameConversations::abort");
void GameConversations::update(bool isRelease) {
warning("TODO: GameConversations::update");
}
void GameConversations::removeActiveWindow() {
warning("TODO: GameConversations::removeActiveWindow");
}
/*------------------------------------------------------------------------*/
@ -207,15 +291,16 @@ void ConversationData::load(const Common::String &filename) {
inFile.open(filename);
MadsPack convFileUnpacked(&inFile);
Common::SeekableReadStream *convFile = convFileUnpacked.getItemStream(0);
// **** Section 0: Header *************************************************
Common::SeekableReadStream *convFile = convFileUnpacked.getItemStream(0);
_nodeCount = convFile->readUint16LE();
_dialogCount = convFile->readUint16LE();
_messageCount = convFile->readUint16LE();
_textLineCount = convFile->readUint16LE();
_unk2 = convFile->readUint16LE();
_importCount = convFile->readUint16LE();
_maxImports = convFile->readUint16LE();
_speakerCount = convFile->readUint16LE();
for (uint idx = 0; idx < MAX_SPEAKERS; ++idx) {
@ -275,7 +360,7 @@ void ConversationData::load(const Common::String &filename) {
// **** Section 3: Messages ***********************************************
convFile = convFileUnpacked.getItemStream(3);
assert(convFile->size() == _messageCount * 8);
assert(convFile->size() == _messageCount * 4);
_messages.resize(_messageCount);
for (uint idx = 0; idx < _messageCount; ++idx)
@ -389,8 +474,74 @@ void ConversationData::load(const Common::String &filename) {
/*------------------------------------------------------------------------*/
void ConversationCnd::load(const Common::String &filename) {
// TODO
void ConversationConditionals::load(const Common::String &filename) {
Common::File inFile;
Common::SeekableReadStream *convFile;
inFile.open(filename);
MadsPack convFileUnpacked(&inFile);
// **** Section 0: Header *************************************************
convFile = convFileUnpacked.getItemStream(0);
convFile->skip(2);
int entryFlagsCount = convFile->readUint16LE();
int varsCount = convFile->readUint16LE();
int importsCount = convFile->readUint16LE();
delete convFile;
// **** Section: Imports *************************************************
int streamNum = 1;
_importVariables.resize(importsCount);
if (importsCount > 0) {
convFile = convFileUnpacked.getItemStream(streamNum++);
// Read in the variable indexes that each import value will be stored in
for (int idx = 0; idx < importsCount; ++idx)
_importVariables[idx] = convFile->readUint16LE();
delete convFile;
}
// **** Section: Entry Flags *********************************************
convFile = convFileUnpacked.getItemStream(streamNum++);
assert(convFile->size() == (entryFlagsCount * 2));
_entryFlags.resize(entryFlagsCount);
for (int idx = 0; idx < entryFlagsCount; ++idx)
_entryFlags[idx] = convFile->readUint16LE();
delete convFile;
// **** Section: Variables ***********************************************
convFile = convFileUnpacked.getItemStream(streamNum);
assert(convFile->size() == (varsCount * 6));
_vars.resize(varsCount);
for (int idx = 0; idx < varsCount; ++idx) {
convFile->skip(2); // Loaded values are never pointers, so don't need this
_vars[idx]._isPtr = false;
_vars[idx]._val = convFile->readSint16LE();
convFile->skip(2); // Unused segment selector for pointer values
}
delete convFile;
}
/*------------------------------------------------------------------------*/
void ConversationVar::setValue(int val) {
_isPtr = false;
_valPtr = nullptr;
_val = val;
}
void ConversationVar::setValue(int *val) {
_isPtr = true;
_valPtr = val;
_val = 0;
}
} // End of namespace MADS

View File

@ -47,6 +47,20 @@ enum DialogCommands {
cmdDialogEnd = 255
};
enum ConvFlagMode {
FLAGMODE_1 = 1,
FLAGMODE_2 = 2,
FLAGMODE_3 = 3
};
enum ConvEntryFlag {
ENTRYFLAG_4000 = 0x4000,
ENTRYFLAG_8000 = 0x8000
};
/**
* Reperesents the data for a dialog to be displayed in a conversation
*/
struct ConvDialog {
int16 _textLineIndex; // 0-based
int16 _speechIndex; // 1-based
@ -54,6 +68,9 @@ struct ConvDialog {
uint16 _nodeSize; // size in section 6
};
/**
* Represents a node within the conversation control logic
*/
struct ConvNode {
uint16 _index;
uint16 _dialogCount;
@ -64,13 +81,16 @@ struct ConvNode {
Common::Array<ConvDialog> _dialogs;
};
/**
* Represents the static, non-changing data for a conversation
*/
struct ConversationData {
uint16 _nodeCount; // conversation nodes, each one containing several dialog options and messages
uint16 _dialogCount; // messages (non-selectable) + texts (selectable)
uint16 _messageCount; // messages (non-selectable)
uint16 _textLineCount;
uint16 _unk2;
uint16 _importCount;
uint16 _maxImports;
uint16 _speakerCount;
int _textSize;
int _commandsSize;
@ -88,29 +108,66 @@ struct ConversationData {
void load(const Common::String &filename);
};
struct ConversationCnd {
struct ConversationVar {
int v1;
int v2;
int v3;
};
Common::Array<ConversationVar> _vars;
struct ConversationVar {
bool _isPtr;
int _val;
int *_valPtr;
/**
* Load the specified conversation resource file
* Constructor
*/
ConversationVar() : _isPtr(false), _val(0), _valPtr(nullptr) {}
/**
* Sets a numeric value
*/
void setValue(int val);
/**
* Sets a pointer value
*/
void setValue(int *val);
/**
* Return either the variable's pointer, or a pointer to it's direct value
*/
int *getValue() { return _isPtr ? _valPtr : &_val; }
};
/**
* Conditional (i.e. changeable) data for the conversation
*/
struct ConversationConditionals {
Common::Array<uint> _importVariables;
Common::Array<uint> _entryFlags;
Common::Array<ConversationVar> _vars;
int _numImports;
/**
* Constructor
*/
ConversationConditionals() : _numImports(0) {}
/**
* Load the specified conversation conditionals resource file
*/
void load(const Common::String &filename);
};
/**
* Represents all the data needed for a particular loaded conversation
*/
struct ConversationEntry {
int _convId;
ConversationData _data;
ConversationCnd _cnd;
ConversationConditionals _cnd;
};
class MADSEngine;
/**
* Manager for loading and running conversations
*/
class GameConversations {
private:
MADSEngine *_vm;
@ -122,8 +179,20 @@ private:
int _arr5[MAX_SPEAKERS];
int _arr6[MAX_SPEAKERS];
InputMode _inputMode;
int _val1, _val2, _val3, _val4, _val5;
int _val1, _val5;
int _heldVal, _releaseVal;
int _speakerVal;
int _heroTrigger;
TriggerMode _heroTriggerMode;
int _interlocutorTrigger;
TriggerMode _interlocutorTriggerMode;
ConversationEntry *_runningConv;
int _restoreRunning;
bool _playerEnabled;
uint32 _startFrameNumber;
ConversationVar *_vars;
ConversationVar *_nextStartNode;
/**
* Returns the record for the specified conversation, if it's loaded
*/
@ -133,11 +202,16 @@ private:
* Start a specified conversation slot
*/
void start();
public:
ConversationEntry *_runningConv;
int _restoreRunning;
bool _playerEnabled;
uint32 _startFrameNumber;
/**
* Remove any currently active dialog window
*/
void removeActiveWindow();
/**
* Flags a conversation option/entry
*/
void flagEntry(ConvFlagMode mode, int entryIndex);
public:
/**
* Constructor
@ -162,23 +236,68 @@ public:
void run(int id);
/**
* Sets a variable
* Sets a variable to a numeric value
*/
void setVariable(uint idx, int v1, int v2 = -1);
void setVariable(uint idx, int val);
int* _nextStartNode;
int* getVariable(int idx);
/**
* Sets a variable to a pointer value
*/
void setVariable(uint idx, int *val);
void stop();
void exportPointer(int *val);
void exportValue(int val);
/**
* Sets the starting node index
*/
void setStartNode(uint nodeIndex);
/**
* Set the hero trigger
*/
void setHeroTrigger(int val);
void setInterlocutorTrigger(int val);
void hold();
void release();
void reset(int id);
void abortConv();
/**
* Set the interlocutor trigger
*/
void setInterlocutorTrigger(int val);
/**
* Returns either the pointer value of a variable, or if the variable
* contains a numeric value directly, returns a pointer to it
*/
int *getVariable(int idx);
/**
* Hold a ??? value
*/
void hold();
/**
* Release a prevoiusly held value
*/
void release();
/**
* Stop any currently running conversation
*/
void stop();
/**
* Adds the passed pointer into the list of import variables for the given conversation
*/
void exportPointer(int *ptr);
/**
* Adds the passed value into the list of import variables for the given conversation
*/
void exportValue(int val);
void reset(int id);
/**
* Handles updating the conversation display
*/
void update(bool isRelease);
/**
* Returns true if any conversation is currently atcive
*/
@ -188,6 +307,11 @@ public:
* Returns the currently active conversation Id
*/
int activeConvId() const { return !active() ? -1 : _runningConv->_convId; }
/**
* Returns _restoreRunning value
*/
int restoreRunning() const { return _restoreRunning; }
};
} // End of namespace MADS

View File

@ -1332,7 +1332,7 @@ void Scene104::enter() {
_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
_scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0);
if (_vm->_gameConv->_restoreRunning == 1) {
if (_vm->_gameConv->restoreRunning() == 1) {
_game._player._stepEnabled = false;
_vm->_gameConv->run(1);
_vm->_gameConv->exportValue(0);
@ -2304,8 +2304,8 @@ void Scene104::handleFinalConversation() {
break;
case 30:
*_vm->_gameConv->_nextStartNode = 31;
_vm->_gameConv->abortConv();
_vm->_gameConv->setStartNode(31);
_vm->_gameConv->stop();
if (_globals[kLlanieStatus] == 2) {
_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('l', 1), 0);

View File

@ -67,7 +67,7 @@ void Scene1xx::sceneEntrySound() {
break;
case 104:
if ((_vm->_gameConv->_restoreRunning == 7) || (_scene->_priorSceneId == 301)) {
if ((_vm->_gameConv->restoreRunning() == 7) || (_scene->_priorSceneId == 301)) {
_vm->_sound->command(33);
} else if (!_globals[kRoom103104Transition] && !_globals[kObservedPhan104]) {
_vm->_sound->command(37);
@ -218,7 +218,7 @@ void Scene101::enter() {
_talkCounter = 0;
_chandelierStatus = 3;
if (_vm->_gameConv->_restoreRunning == 1) {
if (_vm->_gameConv->restoreRunning() == 1) {
_vm->_gameConv->run(1);
_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
_chandelierStatus = 4;
@ -1118,7 +1118,7 @@ void Scene103::enter() {
_anim3ActvFl = true;
_game._player._stepEnabled = true;
_scene->setAnimFrame(_globals._animationIndexes[3], 36);
} else if (_vm->_gameConv->_restoreRunning == 12) {
} else if (_vm->_gameConv->restoreRunning() == 12) {
_vm->_gameConv->run(12);
_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
_vm->_gameConv->exportValue(_globals[kMusicSelected]);
@ -2504,7 +2504,7 @@ void Scene104::enter() {
}
if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
if (_vm->_gameConv->_restoreRunning == 7) {
if (_vm->_gameConv->restoreRunning() == 7) {
_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 1), 1);
_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('d', 1), 1);
_walkStatus = 0;
@ -7056,7 +7056,7 @@ void Scene112::enter() {
_scene->setAnimFrame(_globals._animationIndexes[1], 82);
_raoulAction = 2;
if (_vm->_gameConv->_restoreRunning == 3) {
if (_vm->_gameConv->restoreRunning() == 3) {
_vm->_gameConv->run(3);
_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
_scene->setAnimFrame(_globals._animationIndexes[1], 17);
@ -7983,7 +7983,7 @@ void Scene113::enter() {
_game._player._facing = FACING_NORTH;
}
switch (_vm->_gameConv->_restoreRunning) {
switch (_vm->_gameConv->restoreRunning()) {
case 4:
_vm->_gameConv->run(4);
_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);

View File

@ -128,7 +128,7 @@ void Scene201::enter() {
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
}
if (_vm->_gameConv->_restoreRunning == 16) {
if (_vm->_gameConv->restoreRunning() == 16) {
_game._player._playerPos = Common::Point(72, 101);
_game._player._facing = FACING_NORTHWEST;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0);
@ -674,7 +674,7 @@ void Scene202::enter() {
_degasStatus = 4;
}
if (_vm->_gameConv->_restoreRunning == 17) {
if (_vm->_gameConv->restoreRunning() == 17) {
_vm->_gameConv->run(17);
_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
_vm->_gameConv->exportValue(0);
@ -683,7 +683,7 @@ void Scene202::enter() {
_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
}
if (_vm->_gameConv->_restoreRunning == 9) {
if (_vm->_gameConv->restoreRunning() == 9) {
_vm->_gameConv->run(9);
_vm->_gameConv->exportPointer(&_globals[kPlayerScore]);
_game._player._playerPos = Common::Point(400, 141);
@ -1588,7 +1588,7 @@ void Scene203::enter() {
_scene->_hotspots.activate(NOUN_MANAGERS_CHAIR, true);
}
if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && (_vm->_gameConv->_restoreRunning == 5)) {
if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && (_vm->_gameConv->restoreRunning() == 5)) {
_brieStatus = 4;
_raoulStatus = 0;
_anim1ActvFl = true;
@ -1625,7 +1625,7 @@ void Scene203::enter() {
_scene->_hotspots.activate(NOUN_MANAGERS_CHAIR, true);
}
if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && (_vm->_gameConv->_restoreRunning == 8)) {
if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && (_vm->_gameConv->restoreRunning() == 8)) {
_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 0);
_scene->setAnimFrame(_globals._animationIndexes[1], 9);
_anim1ActvFl = true;
@ -1652,7 +1652,7 @@ void Scene203::enter() {
_scene->_hotspots.activate(NOUN_DESK_LAMP, false);
}
if (_vm->_gameConv->_restoreRunning == 15) {
if (_vm->_gameConv->restoreRunning() == 15) {
_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
_game._player._playerPos = Common::Point(98, 137);
@ -4321,7 +4321,7 @@ void Scene205::enter() {
}
if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
if (_vm->_gameConv->_restoreRunning == 10) {
if (_vm->_gameConv->restoreRunning() == 10) {
int count = 0;
if (_game._objects.isInInventory(OBJ_RED_FRAME))
@ -4349,7 +4349,7 @@ void Scene205::enter() {
_scene->setAnimFrame(_globals._animationIndexes[1], 66);
else
_giryStatus = 2;
} else if (_vm->_gameConv->_restoreRunning == 11) {
} else if (_vm->_gameConv->restoreRunning() == 11) {
_vm->_gameConv->run(11);
_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_TICKET));
_vm->_gameConv->exportValue(0);
@ -4372,7 +4372,7 @@ void Scene205::enter() {
_richardStatus = 3;
_scene->_hotspots.activate(NOUN_MONSIEUR_RICHARD, true);
if (_vm->_gameConv->_restoreRunning == 18) {
if (_vm->_gameConv->restoreRunning() == 18) {
_globals[kWalkerConverse] = _vm->getRandomNumber(1, 4);
_richardStatus = 3;
_vm->_gameConv->run(18);

View File

@ -43,7 +43,7 @@ void Scene5xx::sceneEntrySound() {
if ((_globals[kCoffinStatus] == 2) && !_game._visitedScenes.exists(506) && (_globals[kFightStatus] == 0) && (_scene->_currentSceneId == 504))
_vm->_sound->command(33);
else if (_scene->_currentSceneId == 505)
_vm->_sound->command((_vm->_gameConv->_restoreRunning == 20) ? 39 : 16);
_vm->_sound->command((_vm->_gameConv->restoreRunning() == 20) ? 39 : 16);
else
_vm->_sound->command(16);
}
@ -403,7 +403,7 @@ void Scene501::actions() {
break;
case 68:
_vm->_gameConv->abortConv();
_vm->_gameConv->stop();
_scene->_nextSceneId = 506;
break;
}
@ -1987,7 +1987,7 @@ void Scene504::enter() {
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
}
if (_vm->_gameConv->_restoreRunning == 19) {
if (_vm->_gameConv->restoreRunning() == 19) {
_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
@ -2002,7 +2002,7 @@ void Scene504::enter() {
_scene->setAnimFrame(_globals._animationIndexes[0], 8);
_vm->_gameConv->run(19);
_vm->_gameConv->exportValue(_game._difficulty);
} else if (_vm->_gameConv->_restoreRunning == 27) {
} else if (_vm->_gameConv->restoreRunning() == 27) {
_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
@ -2054,7 +2054,7 @@ void Scene504::enter() {
_game._player._visible = false;
_anim3ActvFl = true;
if (_vm->_gameConv->_restoreRunning == 21) {
if (_vm->_gameConv->restoreRunning() == 21) {
_game._player._stepEnabled = false;
_vm->_gameConv->run(21);
_vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE));
@ -2361,7 +2361,7 @@ void Scene504::actions() {
if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)) {
if (_globals[kRightDoorIsOpen504]) {
if (_vm->_gameConv->activeConvId() == 26)
_vm->_gameConv->abortConv();
_vm->_gameConv->stop();
_scene->_nextSceneId = 505;
} else
@ -3043,43 +3043,43 @@ void Scene504::handleListenConversation() {
void Scene504::handlePlayConversation() {
switch (_action._activeAction._verbId) {
case 2:
*_vm->_gameConv->_nextStartNode = 1;
_vm->_gameConv->abortConv();
_vm->_gameConv->setStartNode(1);
_vm->_gameConv->stop();
_playStatus = 1;
_songNum = 1;
break;
case 3:
*_vm->_gameConv->_nextStartNode = 1;
_vm->_gameConv->abortConv();
_vm->_gameConv->setStartNode(1);
_vm->_gameConv->stop();
_playStatus = 1;
_songNum = 2;
break;
case 4:
*_vm->_gameConv->_nextStartNode = 1;
_vm->_gameConv->abortConv();
_vm->_gameConv->setStartNode(1);
_vm->_gameConv->stop();
_playStatus = 1;
_songNum = 3;
break;
case 5:
*_vm->_gameConv->_nextStartNode = 1;
_vm->_gameConv->abortConv();
_vm->_gameConv->setStartNode(1);
_vm->_gameConv->stop();
_playStatus = 1;
_songNum = 4;
break;
case 6:
*_vm->_gameConv->_nextStartNode = 1;
_vm->_gameConv->abortConv();
_vm->_gameConv->setStartNode(1);
_vm->_gameConv->stop();
_playStatus = 1;
_songNum = 5;
break;
case 8:
*_vm->_gameConv->_nextStartNode = 1;
_vm->_gameConv->abortConv();
_vm->_gameConv->setStartNode(1);
_vm->_gameConv->stop();
_playStatus = 1;
break;
@ -3201,7 +3201,7 @@ void Scene505::enter() {
_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 4));
if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
if (_vm->_gameConv->_restoreRunning == 20) {
if (_vm->_gameConv->restoreRunning() == 20) {
_scene->_hotspots.activate(NOUN_LID, false);
_scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44));
_globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12);
@ -4193,7 +4193,7 @@ void Scene506::actions() {
break;
case 90:
_vm->_gameConv->abortConv();
_vm->_gameConv->stop();
_scene->_nextSceneId = 504;
break;