MOHAWK: Give meaningful names to the game global vars and selenitic vars

svn-id: r54758
This commit is contained in:
Bastien Bouclet 2010-12-04 09:26:44 +00:00
parent 16483fcf34
commit 4a8fc942b7
4 changed files with 242 additions and 177 deletions

View file

@ -66,19 +66,19 @@ bool MystSaveLoad::loadGame(const Common::String &filename) {
// Now, we'll read in the variable values.
// Lots of checking code here so that save files with differing formats are flagged...
if ((_v->game_globals[0] = loadFile->readUint16LE()) != 2)
warning("Unexpected value at 0x%03X - Found %u Expected %u", loadFile->pos(), _v->game_globals[0], 2);
if ((_v->globals.u0 = loadFile->readUint16LE()) != 2)
warning("Unexpected value at 0x%03X - Found %u Expected %u", loadFile->pos(), _v->globals.u0, 2);
_v->game_globals[1] = loadFile->readUint16LE();
_v->game_globals[2] = loadFile->readUint16LE();
_v->globals.currentAge = loadFile->readUint16LE();
_v->globals.heldPage = loadFile->readUint16LE();
if ((_v->game_globals[3] = loadFile->readUint16LE()) != 1)
warning("Unexpected value at 0x%03X - Found %u Expected %u", loadFile->pos(), _v->game_globals[3], 1);
if ((_v->globals.u1 = loadFile->readUint16LE()) != 1)
warning("Unexpected value at 0x%03X - Found %u Expected %u", loadFile->pos(), _v->globals.u1, 1);
_v->game_globals[4] = loadFile->readUint16LE();
_v->game_globals[5] = loadFile->readUint16LE();
_v->game_globals[6] = loadFile->readUint16LE();
_v->game_globals[7] = loadFile->readUint16LE();
_v->globals.transitions = loadFile->readUint16LE();
_v->globals.zipMode = loadFile->readUint16LE();
_v->globals.redPagesInBook = loadFile->readUint16LE();
_v->globals.bluePagesInBook = loadFile->readUint16LE();
for (byte i = 0; i < 8; i++) {
if (_vm->getFeatures() & GF_ME) {
@ -234,21 +234,31 @@ bool MystSaveLoad::loadGame(const Common::String &filename) {
if ((_v->mech_vars[i] = loadFile->readUint16LE()) > 9)
warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 9, loadFile->pos(), _v->mech_vars[i]);
for (byte i = 0; i < 7; i++) {
if (_vm->getFeatures() & GF_ME) {
_v->selenitic_vars[i] = loadFile->readUint16LE();
if (loadFile->readUint16LE() != 0)
warning("Non-zero value at 0x%03X", loadFile->pos());
} else
_v->selenitic_vars[i] = loadFile->readByte();
if (_v->selenitic_vars[i] > 1)
warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->selenitic_vars[i]);
if (_vm->getFeatures() & GF_ME) {
_v->selenitic.emitterEnabledWater = loadFile->readUint32LE();
_v->selenitic.emitterEnabledVolcano = loadFile->readUint32LE();
_v->selenitic.emitterEnabledClock = loadFile->readUint32LE();
_v->selenitic.emitterEnabledCrystal = loadFile->readUint32LE();
_v->selenitic.emitterEnabledWind = loadFile->readUint32LE();
_v->selenitic.soundReceiverOpened = loadFile->readUint32LE();
_v->selenitic.tunnelLightsSwitchedOn = loadFile->readUint32LE();
} else {
_v->selenitic.emitterEnabledWater = loadFile->readByte();
_v->selenitic.emitterEnabledVolcano = loadFile->readByte();
_v->selenitic.emitterEnabledClock = loadFile->readByte();
_v->selenitic.emitterEnabledCrystal = loadFile->readByte();
_v->selenitic.emitterEnabledWind = loadFile->readByte();
_v->selenitic.soundReceiverOpened = loadFile->readByte();
_v->selenitic.tunnelLightsSwitchedOn = loadFile->readByte();
}
for(byte i = 7; i < 18; i++)
_v->selenitic_vars[i] = loadFile->readUint16LE();
_v->selenitic.soundReceiverCurrentSource = loadFile->readUint16LE();
for(byte i = 0; i < 5; i++)
_v->selenitic.soundReceiverPositions[i] = loadFile->readUint16LE();
for(byte i = 0; i < 5; i++)
_v->selenitic.soundLockSliderPositions[i] = loadFile->readUint16LE();
for (byte i = 0; i < 3; i++) {
if (_vm->getFeatures() & GF_ME) {
@ -257,7 +267,7 @@ bool MystSaveLoad::loadGame(const Common::String &filename) {
_v->stoneship_vars[i] = loadFile->readByte();
if (_v->stoneship_vars[i] > 1)
warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->selenitic_vars[i]);
warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->stoneship_vars[i]);
}
for (byte i = 3; i < 14; i++)
_v->stoneship_vars[i] = loadFile->readUint16LE();
@ -338,8 +348,14 @@ bool MystSaveLoad::saveGame(const Common::String &fname) {
debug_printMystVariables(_v);
// Performs no validation of variable values - Assumes they are valid.
for (byte i = 0; i < 8; i++)
saveFile->writeUint16LE(_v->game_globals[i]);
saveFile->writeUint16LE(_v->globals.u0);
saveFile->writeUint16LE(_v->globals.currentAge);
saveFile->writeUint16LE(_v->globals.heldPage);
saveFile->writeUint16LE(_v->globals.u1);
saveFile->writeUint16LE(_v->globals.transitions);
saveFile->writeUint16LE(_v->globals.zipMode);
saveFile->writeUint16LE(_v->globals.redPagesInBook);
saveFile->writeUint16LE(_v->globals.bluePagesInBook);
for (byte i = 0; i < 8; i++) {
if (_vm->getFeatures() & GF_ME) {
@ -372,16 +388,31 @@ bool MystSaveLoad::saveGame(const Common::String &fname) {
for (byte i = 0; i < 8; i++)
saveFile->writeUint16LE(_v->mech_vars[i]);
for (byte i = 0; i < 7; i++) {
if (_vm->getFeatures() & GF_ME) {
saveFile->writeUint16LE(_v->selenitic_vars[i]);
saveFile->writeUint16LE(0);
} else
saveFile->writeByte(_v->selenitic_vars[i]);
if (_vm->getFeatures() & GF_ME) {
saveFile->writeUint32LE(_v->selenitic.emitterEnabledWater);
saveFile->writeUint32LE(_v->selenitic.emitterEnabledVolcano);
saveFile->writeUint32LE(_v->selenitic.emitterEnabledClock);
saveFile->writeUint32LE(_v->selenitic.emitterEnabledCrystal);
saveFile->writeUint32LE(_v->selenitic.emitterEnabledWind);
saveFile->writeUint32LE(_v->selenitic.soundReceiverOpened);
saveFile->writeUint32LE(_v->selenitic.tunnelLightsSwitchedOn);
} else {
saveFile->writeByte(_v->selenitic.emitterEnabledWater);
saveFile->writeByte(_v->selenitic.emitterEnabledVolcano);
saveFile->writeByte(_v->selenitic.emitterEnabledClock);
saveFile->writeByte(_v->selenitic.emitterEnabledCrystal);
saveFile->writeByte(_v->selenitic.emitterEnabledWind);
saveFile->writeByte(_v->selenitic.soundReceiverOpened);
saveFile->writeByte(_v->selenitic.tunnelLightsSwitchedOn);
}
for(byte i = 7; i < 18; i++)
saveFile->writeUint16LE(_v->selenitic_vars[i]);
saveFile->writeUint16LE(_v->selenitic.soundReceiverCurrentSource);
for(byte i = 0; i < 5; i++)
saveFile->writeUint16LE(_v->selenitic.soundReceiverPositions[i]);
for(byte i = 0; i < 5; i++)
saveFile->writeUint16LE(_v->selenitic.soundLockSliderPositions[i]);
for (byte i = 0; i < 3; i++) {
if (_vm->getFeatures() & GF_ME) {
@ -441,16 +472,38 @@ void MystSaveLoad::initMystVariables(MystVariables *_tv) {
uint8 i;
// Most of the variables are zero at game start.
for (i = 0; i < ARRAYSIZE(_tv->game_globals); i++)
_tv->game_globals[i] = 0;
_v->globals.u0 = 2;
// Current Age / Stack - Start in Myst
_v->globals.currentAge = 2;
_v->globals.heldPage = 0;
_v->globals.u1 = 1;
_v->globals.transitions = 0;
_v->globals.zipMode = 0;
_v->globals.redPagesInBook = 0;
_v->globals.bluePagesInBook = 0;
for (i = 0; i < ARRAYSIZE(_tv->myst_vars); i++)
_tv->myst_vars[i] = 0;
for (i = 0; i < ARRAYSIZE(_tv->channelwood_vars); i++)
_tv->channelwood_vars[i] = 0;
for (i = 0; i < ARRAYSIZE(_tv->mech_vars); i++)
_tv->mech_vars[i] = 0;
for (i = 0; i < ARRAYSIZE(_tv->selenitic_vars); i++)
_tv->selenitic_vars[i] = 0;
_tv->selenitic.emitterEnabledWater = 0;
_tv->selenitic.emitterEnabledVolcano = 0;
_tv->selenitic.emitterEnabledClock = 0;
_tv->selenitic.emitterEnabledCrystal = 0;
_tv->selenitic.emitterEnabledWind = 0;
_tv->selenitic.soundReceiverOpened = 0;
_tv->selenitic.tunnelLightsSwitchedOn = 0;
_tv->selenitic.soundReceiverCurrentSource = 0;
for(i = 0; i < 5; i++)
_tv->selenitic.soundReceiverPositions[i] = 0;
for(i = 0; i < 5; i++)
_tv->selenitic.soundLockSliderPositions[i] = 0;
for (i = 0; i < ARRAYSIZE(_tv->stoneship_vars); i++)
_tv->stoneship_vars[i] = 0;
for (i = 0; i < ARRAYSIZE(_tv->dunny_vars); i++)
@ -469,13 +522,6 @@ void MystSaveLoad::initMystVariables(MystVariables *_tv) {
// TODO: Not all these may be needed as some of the unknown opcodes
// called by init scripts may set these up as per the others..
// Unknown - Fixed at 2
_tv->game_globals[0] = 2;
// Current Age / Stack - Start in Myst
_tv->game_globals[1] = 2;
// Unknown - Fixed at 1
_tv->game_globals[3] = 1;
// Library Bookcase Door - Default to Up
_tv->myst_vars[18] = 1;
// Dock Imager Numeric Selection - Default to 67
@ -491,16 +537,16 @@ void MystSaveLoad::initMystVariables(MystVariables *_tv) {
_tv->stoneship_vars[5] = 1;
}
static const char *game_globals_names[] = {
"Unknown - Fixed at 2",
"Current Age / Stack",
"Page Being Held",
"Unknown - Fixed at 1",
"Slide Transitions",
"Zip Mode",
"Red Pages in Book",
"Blue Pages in Book"
};
//static const char *game_globals_names[] = {
// "Unknown - Fixed at 2",
// "Current Age / Stack",
// "Page Being Held",
// "Unknown - Fixed at 1",
// "Slide Transitions",
// "Zip Mode",
// "Red Pages in Book",
// "Blue Pages in Book"
//};
static const char *myst_vars_names[] = {
"Marker Switch Near Cabin",
@ -576,26 +622,26 @@ static const char *mech_vars_names[] = {
"Code Lock Shape #4 (Right)"
};
static const char *selenitic_vars_names[] = {
"Sound Pickup At Water Pool",
"Sound Pickup At Volcanic Crack",
"Sound Pickup At Clock",
"Sound Pickup At Crystal Rocks",
"Sound Pickup At Windy Tunnel",
"Sound Receiver Doors",
"Windy Tunnel Lights",
"Sound Receiver Current Input",
"Sound Receiver Input #0 (Water Pool) Angle Value",
"Sound Receiver Input #1 (Volcanic Crack) Angle Value",
"Sound Receiver Input #2 (Clock) Angle Value",
"Sound Receiver Input #3 (Crystal Rocks) Angle Value",
"Sound Receiver Input #4 (Windy Tunnel) Angle Value",
"Sound Lock Slider #1 (Left) Position",
"Sound Lock Slider #2 Position",
"Sound Lock Slider #3 Position",
"Sound Lock Slider #4 Position",
"Sound Lock Slider #5 (Right) Position"
};
//static const char *selenitic_vars_names[] = {
// "Sound Pickup At Water Pool",
// "Sound Pickup At Volcanic Crack",
// "Sound Pickup At Clock",
// "Sound Pickup At Crystal Rocks",
// "Sound Pickup At Windy Tunnel",
// "Sound Receiver Doors",
// "Windy Tunnel Lights",
// "Sound Receiver Current Input",
// "Sound Receiver Input #0 (Water Pool) Angle Value",
// "Sound Receiver Input #1 (Volcanic Crack) Angle Value",
// "Sound Receiver Input #2 (Clock) Angle Value",
// "Sound Receiver Input #3 (Crystal Rocks) Angle Value",
// "Sound Receiver Input #4 (Windy Tunnel) Angle Value",
// "Sound Lock Slider #1 (Left) Position",
// "Sound Lock Slider #2 Position",
// "Sound Lock Slider #3 Position",
// "Sound Lock Slider #4 Position",
// "Sound Lock Slider #5 (Right) Position"
//};
static const char *stoneship_vars_names[] = {
"Light State",
@ -623,9 +669,9 @@ void MystSaveLoad::debug_printMystVariables(MystVariables *_tv) {
debugC(kDebugSaveLoad, "Printing Myst Variable State:");
debugC(kDebugSaveLoad, " Game Globals:");
for (i = 0; i < ARRAYSIZE(_tv->game_globals); i++)
debugC(kDebugSaveLoad, " %s: %u", game_globals_names[i], _tv->game_globals[i]);
// debugC(kDebugSaveLoad, " Game Globals:");
// for (i = 0; i < ARRAYSIZE(_tv->game_globals); i++)
// debugC(kDebugSaveLoad, " %s: %u", game_globals_names[i], _tv->game_globals[i]);
debugC(kDebugSaveLoad, " Myst Variables:");
for (i = 0; i < ARRAYSIZE(_tv->myst_vars); i++)
@ -639,9 +685,9 @@ void MystSaveLoad::debug_printMystVariables(MystVariables *_tv) {
for (i = 0; i < ARRAYSIZE(_tv->mech_vars); i++)
debugC(kDebugSaveLoad, " %s: %u", mech_vars_names[i], _tv->mech_vars[i]);
debugC(kDebugSaveLoad, " Selenitic Variables:");
for (i = 0; i < ARRAYSIZE(_tv->selenitic_vars); i++)
debugC(kDebugSaveLoad, " %s: %u", selenitic_vars_names[i], _tv->selenitic_vars[i]);
// debugC(kDebugSaveLoad, " Selenitic Variables:");
// for (i = 0; i < ARRAYSIZE(_tv->selenitic_vars); i++)
// debugC(kDebugSaveLoad, " %s: %u", selenitic_vars_names[i], _tv->selenitic_vars[i]);
debugC(kDebugSaveLoad, " Stoneship Variables:");
for (i = 0; i < ARRAYSIZE(_tv->stoneship_vars); i++)

View file

@ -50,7 +50,16 @@ struct MystVariables {
6 = Red Pages in Book
7 = Blue Pages in Book
*/
uint16 game_globals[8];
struct Globals {
uint16 u0;
uint16 currentAge;
uint16 heldPage;
uint16 u1;
uint16 transitions;
uint16 zipMode;
uint16 redPagesInBook;
uint16 bluePagesInBook;
} globals;
/* 50 Myst Specific Variables :
0 = Marker Switch Near Cabin
@ -149,7 +158,18 @@ struct MystVariables {
16 = Sound Lock Slider #4 Position
17 = Sound Lock Slider #5 (Right) Position
*/
uint16 selenitic_vars[18];
struct Selenitic {
uint32 emitterEnabledWater;
uint32 emitterEnabledVolcano;
uint32 emitterEnabledClock;
uint32 emitterEnabledCrystal;
uint32 emitterEnabledWind;
uint32 soundReceiverOpened;
uint32 tunnelLightsSwitchedOn;
uint16 soundReceiverCurrentSource;
uint16 soundReceiverPositions[5];
uint16 soundLockSliderPositions[5];
} selenitic;
/* 14 Stoneship Specific Variables :
0 = Light State

View file

@ -327,22 +327,22 @@ void MystScriptParser::o_changeCardSwitch(uint16 op, uint16 var, uint16 argc, ui
}
void MystScriptParser::o_takePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
uint16 *game_globals = _vm->_saveLoad->_v->game_globals;
MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
uint16 cursorId = argv[0];
uint16 oldPage = game_globals[2];
uint16 oldPage = globals.heldPage;
debugC(kDebugScript, "Opcode %d: takePage Var %d CursorId %d", op, var, cursorId);
// Take / drop page
toggleVar(var);
if (oldPage != game_globals[2]) {
if (oldPage != globals.heldPage) {
_vm->_cursor->hideCursor();
_vm->redrawArea(var);
// Set new cursor
if (game_globals[2])
if (globals.heldPage)
_vm->setMainCursor(cursorId);
else
_vm->setMainCursor(kDefaultMystCursor);

View file

@ -91,24 +91,24 @@ void MystScriptParser_Selenitic::runPersistentScripts() {
}
uint16 MystScriptParser_Selenitic::getVar(uint16 var) {
uint16 *game_globals = _vm->_saveLoad->_v->game_globals;
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
switch(var) {
case 0: // Sound receiver emitters enabled
return selenitic_vars[4];
return selenitic.emitterEnabledWind;
case 1:
return selenitic_vars[1];
return selenitic.emitterEnabledVolcano;
case 2:
return selenitic_vars[2];
return selenitic.emitterEnabledClock;
case 3:
return selenitic_vars[0];
return selenitic.emitterEnabledWater;
case 4:
return selenitic_vars[3];
return selenitic.emitterEnabledCrystal;
case 5: // Sound receiver opened
return selenitic_vars[5];
return selenitic.soundReceiverOpened;
case 6: // Tunnel lights
return selenitic_vars[6];
return selenitic.tunnelLightsSwitchedOn;
case 7:// Maze runner display
if (_mazeRunnerPosition == 288) {
return 0;
@ -122,15 +122,15 @@ uint16 MystScriptParser_Selenitic::getVar(uint16 var) {
case 8: // Viewer
return 0;
case 9: // Sound receiver selected source
return selenitic_vars[7] == 0;
return selenitic.soundReceiverCurrentSource == 0;
case 10:
return selenitic_vars[7] == 1;
return selenitic.soundReceiverCurrentSource == 1;
case 11:
return selenitic_vars[7] == 2;
return selenitic.soundReceiverCurrentSource == 2;
case 12:
return selenitic_vars[7] == 3;
return selenitic.soundReceiverCurrentSource == 3;
case 13:
return selenitic_vars[7] == 4;
return selenitic.soundReceiverCurrentSource == 4;
case 14: // Sound receiver position
return (*_soundReceiverPosition) / 1000;
case 15:
@ -161,55 +161,55 @@ uint16 MystScriptParser_Selenitic::getVar(uint16 var) {
case 33: // Maze runner at entry
return _mazeRunnerPosition != 288;
case 102: // Red page
return !(game_globals[6] & 2) && (game_globals[2] != 8);
return !(globals.redPagesInBook & 2) && (globals.heldPage != 8);
case 103: // Blue page
return !(game_globals[7] & 2) && (game_globals[2] != 2);
return !(globals.bluePagesInBook & 2) && (globals.heldPage != 2);
default:
return MystScriptParser::getVar(var);
}
}
void MystScriptParser_Selenitic::toggleVar(uint16 var) {
uint16 *game_globals = _vm->_saveLoad->_v->game_globals;
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
switch(var) {
case 0: // Sound receiver emitters enabled
selenitic_vars[4] = (selenitic_vars[4] + 1) % 2;
selenitic.emitterEnabledWind = (selenitic.emitterEnabledWind + 1) % 2;
break;
case 1:
selenitic_vars[1] = (selenitic_vars[1] + 1) % 2;
selenitic.emitterEnabledVolcano = (selenitic.emitterEnabledVolcano + 1) % 2;
break;
case 2:
selenitic_vars[2] = (selenitic_vars[2] + 1) % 2;
selenitic.emitterEnabledClock = (selenitic.emitterEnabledClock + 1) % 2;
break;
case 3:
selenitic_vars[0] = (selenitic_vars[0] + 1) % 2;
selenitic.emitterEnabledWater = (selenitic.emitterEnabledWater + 1) % 2;
break;
case 4:
selenitic_vars[3] = (selenitic_vars[3] + 1) % 2;
selenitic.emitterEnabledCrystal = (selenitic.emitterEnabledCrystal + 1) % 2;
break;
case 5: // Sound receiver opened
selenitic_vars[5] = (selenitic_vars[5] + 1) % 2;
selenitic.soundReceiverOpened = (selenitic.soundReceiverOpened + 1) % 2;
break;
case 6: // Tunnel lights
selenitic_vars[6] = (selenitic_vars[6] + 1) % 2;
selenitic.tunnelLightsSwitchedOn = (selenitic.tunnelLightsSwitchedOn + 1) % 2;
break;
case 102: // Red page
if (!(game_globals[6] & 2)) {
if (game_globals[2] == 8)
game_globals[2] = 0;
if (!(globals.redPagesInBook & 2)) {
if (globals.heldPage == 8)
globals.heldPage = 0;
else {
game_globals[2] = 8;
globals.heldPage = 8;
}
}
break;
case 103: // Blue page
if (!(game_globals[7] & 2)) {
if (game_globals[2] == 2)
game_globals[2] = 0;
if (!(globals.bluePagesInBook & 2)) {
if (globals.heldPage == 2)
globals.heldPage = 0;
else {
game_globals[2] = 2;
globals.heldPage = 2;
}
}
break;
@ -220,66 +220,66 @@ void MystScriptParser_Selenitic::toggleVar(uint16 var) {
}
bool MystScriptParser_Selenitic::setVarValue(uint16 var, uint16 value) {
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
bool refresh = false;
switch (var) {
case 0: // Sound receiver emitters enabled
if (selenitic_vars[4] != value) {
selenitic_vars[4] = value;
if (selenitic.emitterEnabledWind != value) {
selenitic.emitterEnabledWind = value;
refresh = true;
}
break;
case 1:
if (selenitic_vars[1] != value) {
selenitic_vars[1] = value;
if (selenitic.emitterEnabledVolcano != value) {
selenitic.emitterEnabledVolcano = value;
refresh = true;
}
break;
case 2:
if (selenitic_vars[2] != value) {
selenitic_vars[2] = value;
if (selenitic.emitterEnabledClock != value) {
selenitic.emitterEnabledClock = value;
refresh = true;
}
break;
case 3:
if (selenitic_vars[0] != value) {
selenitic_vars[0] = value;
if (selenitic.emitterEnabledWater != value) {
selenitic.emitterEnabledWater = value;
refresh = true;
}
break;
case 4:
if (selenitic_vars[3] != value) {
selenitic_vars[3] = value;
if (selenitic.emitterEnabledCrystal != value) {
selenitic.emitterEnabledCrystal = value;
refresh = true;
}
break;
case 5: // Sound receiver opened
if (selenitic_vars[5] != value) {
selenitic_vars[5] = value;
if (selenitic.soundReceiverOpened != value) {
selenitic.soundReceiverOpened = value;
refresh = true;
}
break;
case 6: // Tunnel lights
if (selenitic_vars[6] != value) {
selenitic_vars[6] = value;
if (selenitic.tunnelLightsSwitchedOn != value) {
selenitic.tunnelLightsSwitchedOn = value;
refresh = true;
}
break;
case 20: // Sound lock sliders
selenitic_vars[13] = value;
selenitic.soundLockSliderPositions[0] = value;
break;
case 21:
selenitic_vars[14] = value;
selenitic.soundLockSliderPositions[1] = value;
break;
case 22:
selenitic_vars[15] = value;
selenitic.soundLockSliderPositions[2] = value;
break;
case 23:
selenitic_vars[16] = value;
selenitic.soundLockSliderPositions[3] = value;
break;
case 24:
selenitic_vars[17] = value;
selenitic.soundLockSliderPositions[4] = value;
break;
case 30:
_mazeRunnerDoorOpened = value;
@ -372,7 +372,6 @@ void MystScriptParser_Selenitic::mazeRunnerBacktrack(uint16 &oldPosition) {
_mazeRunnerCompass->drawConditionalDataToScreen(_mazeRunnerDirection);
_vm->_system->delayMillis(150);
}
}
void MystScriptParser_Selenitic::mazeRunnerPlayVideo(uint16 video, uint16 pos) {
@ -593,7 +592,7 @@ void MystScriptParser_Selenitic::o_mazeRunnerSoundRepeat(uint16 op, uint16 var,
* Sound receiver sigma button
*/
void MystScriptParser_Selenitic::o_soundReceiverSigma(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
debugC(kDebugScript, "Opcode %d: Sound receiver sigma button", op);
@ -623,7 +622,7 @@ void MystScriptParser_Selenitic::o_soundReceiverSigma(uint16 op, uint16 var, uin
break;
}
_soundReceiverPosition = &selenitic_vars[8 + source];
_soundReceiverPosition = &selenitic.soundReceiverPositions[source];
_vm->_sound->stopSound();
_vm->_sound->playSound(2287);
soundReceiverDrawView();
@ -636,7 +635,7 @@ void MystScriptParser_Selenitic::o_soundReceiverSigma(uint16 op, uint16 var, uin
_soundReceiverSigmaPressed = true;
_vm->_sound->stopSound();
_soundReceiverSources[selenitic_vars[7]]->drawConditionalDataToScreen(1);
_soundReceiverSources[selenitic.soundReceiverCurrentSource]->drawConditionalDataToScreen(1);
soundReceiverDrawView();
@ -715,7 +714,7 @@ void MystScriptParser_Selenitic::soundReceiverDrawAngle() {
* Sound receiver source selection buttons
*/
void MystScriptParser_Selenitic::o_soundReceiverSource(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
debugC(kDebugScript, "Opcode %d: Sound receiver source", op);
@ -728,12 +727,12 @@ void MystScriptParser_Selenitic::o_soundReceiverSource(uint16 op, uint16 var, ui
uint pressedButton = var - 9;
if (selenitic_vars[7] != pressedButton) {
selenitic_vars[7] = pressedButton;
if (selenitic.soundReceiverCurrentSource != pressedButton) {
selenitic.soundReceiverCurrentSource = pressedButton;
_soundReceiverCurrentSource->drawConditionalDataToScreen(0);
_soundReceiverPosition = &selenitic_vars[8 + pressedButton];
_soundReceiverPosition = &selenitic.soundReceiverPositions[pressedButton];
_soundReceiverCurrentSource = _soundReceiverSources[pressedButton];
_vm->_sound->stopSound();
@ -841,25 +840,25 @@ void MystScriptParser_Selenitic::o_soundLockStartMove(uint16 op, uint16 var, uin
void MystScriptParser_Selenitic::o_soundLockEndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Sound lock end move", op);
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
MystResourceType10 *slider = soundLockSliderFromVar(var);
uint16 *value = 0;
switch (var) {
case 20: // Sound lock sliders
value = &selenitic_vars[13];
value = &selenitic.soundLockSliderPositions[0];
break;
case 21:
value = &selenitic_vars[14];
value = &selenitic.soundLockSliderPositions[1];
break;
case 22:
value = &selenitic_vars[15];
value = &selenitic.soundLockSliderPositions[2];
break;
case 23:
value = &selenitic_vars[16];
value = &selenitic.soundLockSliderPositions[3];
break;
case 24:
value = &selenitic_vars[17];
value = &selenitic.soundLockSliderPositions[4];
break;
}
@ -900,7 +899,7 @@ void MystScriptParser_Selenitic::soundLockCheckSolution(MystResourceType10 *slid
void MystScriptParser_Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Sound lock button", op);
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
bool solved = true;
_vm->_sound->pauseBackground();
@ -908,11 +907,11 @@ void MystScriptParser_Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16
_soundLockButton->drawConditionalDataToScreen(1);
_vm->_cursor->hideCursor();
soundLockCheckSolution(_soundLockSlider1, selenitic_vars[13], 5, solved);
soundLockCheckSolution(_soundLockSlider2, selenitic_vars[14], 9, solved);
soundLockCheckSolution(_soundLockSlider3, selenitic_vars[15], 0, solved);
soundLockCheckSolution(_soundLockSlider4, selenitic_vars[16], 6, solved);
soundLockCheckSolution(_soundLockSlider5, selenitic_vars[17], 7, solved);
soundLockCheckSolution(_soundLockSlider1, selenitic.soundLockSliderPositions[0], 5, solved);
soundLockCheckSolution(_soundLockSlider2, selenitic.soundLockSliderPositions[1], 9, solved);
soundLockCheckSolution(_soundLockSlider3, selenitic.soundLockSliderPositions[2], 0, solved);
soundLockCheckSolution(_soundLockSlider4, selenitic.soundLockSliderPositions[3], 6, solved);
soundLockCheckSolution(_soundLockSlider5, selenitic.soundLockSliderPositions[4], 7, solved);
_vm->_sound->playSound(1148);
_vm->_sound->resumeBackground();
@ -1007,9 +1006,9 @@ void MystScriptParser_Selenitic::soundReceiverIncreaseSpeed() {
}
void MystScriptParser_Selenitic::soundReceiverUpdateSound() {
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
uint16 soundId = soundReceiverCurrentSound(selenitic_vars[7], *_soundReceiverPosition);
uint16 soundId = soundReceiverCurrentSound(selenitic.soundReceiverCurrentSource, *_soundReceiverPosition);
_vm->_sound->replaceSound(soundId);
}
@ -1065,34 +1064,34 @@ uint16 MystScriptParser_Selenitic::soundReceiverCurrentSound(uint16 source, uint
}
void MystScriptParser_Selenitic::soundReceiverSolution(uint16 source, uint16 &solution, bool &enabled) {
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
switch (source) {
case 0:
enabled = selenitic_vars[0];
enabled = selenitic.emitterEnabledWater;
solution = 1534;
break;
case 1:
enabled = selenitic_vars[1];
enabled = selenitic.emitterEnabledVolcano;
solution = 1303;
break;
case 2:
enabled = selenitic_vars[2];
enabled = selenitic.emitterEnabledClock;
solution = 556;
break;
case 3:
enabled = selenitic_vars[3];
enabled = selenitic.emitterEnabledCrystal;
solution = 150;
break;
case 4:
enabled = selenitic_vars[4];
enabled = selenitic.emitterEnabledWind;
solution = 2122;
break;
}
}
void MystScriptParser_Selenitic::o_soundReceiver_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
debugC(kDebugScript, "Opcode %d: Sound receiver init", op);
@ -1113,15 +1112,15 @@ void MystScriptParser_Selenitic::o_soundReceiver_init(uint16 op, uint16 var, uin
_soundReceiverAngle3 = static_cast<MystResourceType8 *>(_vm->_resources[12]);
_soundReceiverAngle4 = static_cast<MystResourceType8 *>(_vm->_resources[13]);
uint16 currentSource = selenitic_vars[7];
_soundReceiverPosition = &selenitic_vars[8 + currentSource];
uint16 currentSource = selenitic.soundReceiverCurrentSource;
_soundReceiverPosition = &selenitic.soundReceiverPositions[currentSource];
_soundReceiverCurrentSource = _soundReceiverSources[currentSource];
_soundReceiverSigmaPressed = false;
}
void MystScriptParser_Selenitic::o_soundLock_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
debugC(kDebugScript, "Opcode %d: Sound lock init", op);
@ -1130,23 +1129,23 @@ void MystScriptParser_Selenitic::o_soundLock_init(uint16 op, uint16 var, uint16
switch (_vm->_resources[i]->getType8Var()) {
case 20:
_soundLockSlider1 = static_cast<MystResourceType10 *>(_vm->_resources[i]);
_soundLockSlider1->setStep(selenitic_vars[13]);
_soundLockSlider1->setStep(selenitic.soundLockSliderPositions[0]);
break;
case 21:
_soundLockSlider2 = static_cast<MystResourceType10 *>(_vm->_resources[i]);
_soundLockSlider2->setStep(selenitic_vars[14]);
_soundLockSlider2->setStep(selenitic.soundLockSliderPositions[1]);
break;
case 22:
_soundLockSlider3 = static_cast<MystResourceType10 *>(_vm->_resources[i]);
_soundLockSlider3->setStep(selenitic_vars[15]);
_soundLockSlider3->setStep(selenitic.soundLockSliderPositions[2]);
break;
case 23:
_soundLockSlider4 = static_cast<MystResourceType10 *>(_vm->_resources[i]);
_soundLockSlider4->setStep(selenitic_vars[16]);
_soundLockSlider4->setStep(selenitic.soundLockSliderPositions[3]);
break;
case 24:
_soundLockSlider5 = static_cast<MystResourceType10 *>(_vm->_resources[i]);
_soundLockSlider5->setStep(selenitic_vars[17]);
_soundLockSlider5->setStep(selenitic.soundLockSliderPositions[4]);
break;
}
} else if (_vm->_resources[i]->type == kMystConditionalImage) {