aboutsummaryrefslogtreecommitdiff
path: root/engines/prince/script.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/prince/script.cpp')
-rw-r--r--engines/prince/script.cpp136
1 files changed, 54 insertions, 82 deletions
diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp
index f32c1724b9..1c09ddb50f 100644
--- a/engines/prince/script.cpp
+++ b/engines/prince/script.cpp
@@ -47,8 +47,12 @@ Script::~Script() {
delete[] _code;
}
-void Script::setFlag(Flags::Id flagId, uint16 value) {
- _flags[flagId - 0x8000] = value;
+void Script::setFlagValue(Flags::Id flagId, uint16 value) {
+ _flags[(uint16)flagId - FLAG_MASK] = value;
+}
+
+uint16 Script::getFlagValue(Flags::Id flagId) {
+ return _flags[(uint16)flagId - FLAG_MASK];
}
bool Script::loadFromStream(Common::SeekableReadStream &stream) {
@@ -83,12 +87,10 @@ void Script::debugScript(const char *s, ...) {
}
void Script::step() {
-#if 1
if (_bgOpcodePC) {
_mode = "bg";
_bgOpcodePC = step(_bgOpcodePC);
}
-#endif
if (_fgOpcodePC) {
_mode = "fg";
_fgOpcodePC = step(_fgOpcodePC);
@@ -147,6 +149,14 @@ uint16 Script::readScript16bits() {
return lower | (upper << 8);
}
+uint16 Script::readScriptValue() {
+ uint16 value = readScript16bits();
+ if (value & FLAG_MASK) {
+ value = _flags[value - FLAG_MASK];
+ }
+ return value;
+}
+
uint32 Script::readScript32bits() {
uint16 lower = readScript16bits();
uint16 upper = readScript16bits();
@@ -359,31 +369,20 @@ void Script::O_CHANGEANIMTYPE() {
}
void Script::O__SETFLAG() {
- uint16 flagId = readScript16bits();
- uint16 value = readScript16bits();
-
- if (value & 0x8000) {
- value = _flags[value - 0x8000];
- }
+ Flags::Id flagId = readScriptFlagId();
+ uint16 value = readScriptValue();
debugScript("O__SETFLAG 0x%04X (%s) = %d", flagId, Flags::getFlagName(flagId), value);
- _flags[flagId - 0x8000] = value;
+ setFlagValue((Flags::Id)(flagId), value);
}
void Script::O_COMPARE() {
- uint16 flagId = readScript16bits();
- uint16 value = readScript16bits();
-
- if (value & 0x8000) {
- uint16 val = _flags[value - 0x8000];
- debugScript("GetFlagValue 0x%04X (%s), value %d", value, Flags::getFlagName(value), val);
+ Flags::Id flagId = readScriptFlagId();
+ uint16 value = readScriptValue();
- value = val;
- }
-
- _result = !(_flags[flagId - 0x8000] == value);
- debugScript("O_COMPARE flagId 0x%04X (%s), value %d == %d (%d)", flagId, Flags::getFlagName(flagId), value, _flags[flagId - 0x8000], _result);
+ _result = getFlagValue(flagId) != value;
+ debugScript("O_COMPARE flagId 0x%04X (%s), value %d == %d (%d)", flagId, Flags::getFlagName(flagId), value, getFlagValue(flagId), _result);
}
void Script::O_JUMPZ() {
@@ -410,15 +409,11 @@ void Script::O_EXIT() {
}
void Script::O_ADDFLAG() {
- uint16 flagId = readScript16bits();
- uint16 value = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
+ uint16 value = readScriptValue();
- if (value & 0x8000) {
- value = _flags[value - 0x8000];
- }
-
- _flags[flagId - 0x8000] += value;
- if (_flags[flagId - 0x8000])
+ setFlagValue(flagId, getFlagValue(flagId) + value);
+ if (getFlagValue(flagId))
_result = 1;
else
_result = 0;
@@ -434,15 +429,11 @@ void Script::O_TALKANIM() {
}
void Script::O_SUBFLAG() {
- uint16 flagId = readScript16bits();
- uint16 value = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
+ uint16 value = readScriptValue();
- if (value & 0x8000) {
- value = _flags[value - 0x8000];
- }
-
- _flags[flagId - 0x8000] -= value;
- if (_flags[flagId - 0x8000])
+ setFlagValue(flagId, getFlagValue(flagId) - value);
+ if (getFlagValue(flagId))
_result = 1;
else
_result = 0;
@@ -468,18 +459,14 @@ void Script::O_SETSTRING() {
}
void Script::O_ANDFLAG() {
- uint16 flagId = readScript16bits();
- uint16 value = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
+ uint16 value = readScriptValue();
debugScript("O_ANDFLAG flagId %d, value %d", flagId, value);
- if (value & 0x8000) {
- value = _flags[value - 0x8000];
- }
+ setFlagValue(flagId, getFlagValue(flagId) & value);
- _flags[flagId - 0x8000] &= value;
-
- if (_flags[flagId - 0x8000]) {
+ if (getFlagValue(flagId)) {
_result = 1;
} else {
_result = 0;
@@ -487,7 +474,7 @@ void Script::O_ANDFLAG() {
}
void Script::O_GETMOBDATA() {
- uint16 flagId = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
uint16 mobId = readScript16bits();
uint16 mobOffset = readScript16bits();
@@ -495,18 +482,14 @@ void Script::O_GETMOBDATA() {
}
void Script::O_ORFLAG() {
- uint16 flagId = readScript16bits();
- uint16 value = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
+ uint16 value = readScriptValue();
debugScript("O_ORFLAG flagId %d, value %d", flagId, value);
+
+ setFlagValue(flagId, getFlagValue(flagId) | value);
- if (value & 0x8000) {
- value = _flags[value - 0x8000];
- }
-
- _flags[flagId - 0x8000] |= value;
-
- if (_flags[flagId - 0x8000]) {
+ if (getFlagValue(flagId)) {
_result = 1;
} else {
_result = 0;
@@ -522,18 +505,14 @@ void Script::O_SETMOBDATA() {
}
void Script::O_XORFLAG() {
- uint16 flagId = readScript16bits();
- uint16 value = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
+ uint16 value = readScriptValue();
debugScript("O_XORFLAG flagId %d, value %d", flagId, value);
- if (value & 0x8000) {
- value = _flags[value - 0x8000];
- }
-
- _flags[flagId - 0x8000] ^= value;
+ setFlagValue(flagId, getFlagValue(flagId) ^ value);
- if (_flags[flagId - 0x8000]) {
+ if (getFlagValue(flagId)) {
_result = 1;
} else {
_result = 0;
@@ -691,10 +670,7 @@ void Script::O_TALKHERO() {
}
void Script::O_WAITTEXT() {
- uint16 slot = readScript16bits();
- if (slot & 0x8000) {
- slot = _flags[slot - 0x8000];
- }
+ uint16 slot = readScriptValue();
Text &text = _vm->_textSlots[slot];
if (text._time) {
_opcodeNF = 1;
@@ -789,11 +765,11 @@ void Script::O_LOADPATH() {
}
void Script::O_GETCHAR() {
- uint16 flagId = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
- _flags[flagId - 0x8000] = *_string;
+ setFlagValue(flagId, *_string);
- debugScript("O_GETCHAR %04X (%s) %02x", flagId, Flags::getFlagName(flagId), _flags[flagId - 0x8000]);
+ debugScript("O_GETCHAR %04X (%s) %02x", flagId, Flags::getFlagName(flagId), getFlagValue(flagId));
++_string;
}
@@ -816,7 +792,7 @@ void Script::O_PRINTAT() {
debugScript("O_PRINTAT slot %d, fr1 %d, fr2 %d", slot, fr1, fr2);
- uint8 color = _flags[Flags::KOLOR - 0x8000];
+ uint8 color = getFlagValue(Flags::KOLOR);
_vm->printAt(slot, color, (const char *)_string, fr1, fr2);
@@ -923,21 +899,21 @@ void Script::O_SETPATH() {
void Script::O_GETHEROX() {
uint16 heroId = readScript16bits();
- uint16 flagId = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
debugScript("O_GETHEROX heroId %d, flagId %d", heroId, flagId);
}
void Script::O_GETHEROY() {
uint16 heroId = readScript16bits();
- uint16 flagId = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
debugScript("O_GETHEROY heroId %d, flagId %d", heroId, flagId);
}
void Script::O_GETHEROD() {
uint16 heroId = readScript16bits();
- uint16 flagId = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
debugScript("O_GETHEROD heroId %d, flagId %d", heroId, flagId);
}
@@ -1090,7 +1066,7 @@ void Script::O_SKIPTEXT() {
void Script::SetVoice(uint32 slot) {
- const uint16 VOICE_H_LINE = _flags[Flags::VOICE_H_LINE - 0x8000];
+ const uint16 VOICE_H_LINE = getFlagValue(Flags::VOICE_H_LINE);
const Common::String streamName = Common::String::format("%03d-%02d.WAV", _currentString, VOICE_H_LINE);
debugScript("Loading wav %s slot %d", streamName.c_str(), slot);
@@ -1149,13 +1125,9 @@ void Script::O_SETVOICEC() {
}
void Script::O_VIEWFLCLOOP() {
- uint16 value = readScript16bits();
+ uint16 value = readScriptValue();
debugScript("O_VIEWFLCLOOP animId %d", value);
- if (value & 0x8000) {
- value = _flags[value - 0x8000];
- }
-
_vm->loadAnim(value, true);
}
@@ -1178,7 +1150,7 @@ void Script::O_GETKRZYWA() {
}
void Script::O_GETMOB() {
- uint16 flagId = readScript16bits();
+ Flags::Id flagId = readScriptFlagId();
uint16 mx = readScript16bits();
uint16 my = readScript16bits();
debugScript("O_GETMOB flagId %d, mx %d, my %d", flagId, mx, my);