aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
Diffstat (limited to 'scumm')
-rw-r--r--scumm/intern.h2
-rw-r--r--scumm/script.cpp9
-rw-r--r--scumm/script_v2.cpp75
-rw-r--r--scumm/scummvm.cpp4
4 files changed, 47 insertions, 43 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 0d7a5798ed..1b6c1e805d 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -197,6 +197,8 @@ protected:
virtual void decodeParseString();
+ virtual int readVar(uint var);
+
virtual void ifStateCommon(byte type);
virtual void ifNotStateCommon(byte type);
virtual void setStateCommon(byte type);
diff --git a/scumm/script.cpp b/scumm/script.cpp
index 70fa45bd8c..181aad737a 100644
--- a/scumm/script.cpp
+++ b/scumm/script.cpp
@@ -371,11 +371,7 @@ int Scumm::readVar(uint var) {
checkRange(_numVariables - 1, 0, var, "Variable %d out of range(r)");
- if ((_features & GF_AFTER_V2) && (var >= 14) && (var <= 16)) {
- return _vars[_vars[var]];
- } else {
- return _vars[var];
- }
+ return _vars[var];
}
if (var & 0x2000 && !(_features & GF_NEW_OPCODES)) {
@@ -387,9 +383,6 @@ int Scumm::readVar(uint var) {
var &= ~0x2000;
}
- if (!(var & 0xF000))
- return _vars[var];
-
if (var & 0x8000) {
if ((_gameId == GID_ZAK256) || (_features & GF_OLD_BUNDLE)) {
// Emulate a wierd hack in Zak256 to read individual
diff --git a/scumm/script_v2.cpp b/scumm/script_v2.cpp
index 3248150bb8..bff981c378 100644
--- a/scumm/script_v2.cpp
+++ b/scumm/script_v2.cpp
@@ -366,6 +366,42 @@ const char *Scumm_v2::getOpcodeDesc(int i) {
return _opcodesV2[i].desc;
}
+void Scumm_v2::decodeParseString() {
+ byte buffer[256]; // FIXME
+ byte *ptr = buffer;
+ byte c;
+ while ((c = fetchScriptByte())) {
+ if (c & 0x80) {
+ *ptr++ = c & 0x7f;
+ *ptr++ = ' ';
+ } else if (c < 8) {
+ // Special codes as seen in CHARSET_1 etc. My guess is that they
+ // have a similar function as the corresponding embedded stuff in modern
+ // games. Hence for now we convert them to the modern format.
+ // This might allow us to reuse the existing code.
+ *ptr++ = 0xFF;
+ *ptr++ = c;
+ if (c > 3) {
+ *ptr++ = 0;
+ *ptr++ = fetchScriptByte();
+ }
+ } else
+ *ptr++ = c;
+ }
+ *ptr = 0;
+
+ printf("TODO: Scumm_v2::decodeParseString(\"%s\")\n", buffer);
+}
+
+int Scumm_v2::readVar(uint var) {
+ debug(6, "readvar=%d", var);
+ if (var >= 14 && var <= 16)
+ var = _vars[var];
+
+ checkRange(_numVariables - 1, 0, var, "Variable %d out of range(r)");
+ return _vars[var];
+}
+
void Scumm_v2::setStateCommon(byte type) {
int obj = getVarOrDirectWord(0x80);
putState(obj, getState(obj) | type);
@@ -457,15 +493,15 @@ void Scumm_v2::o2_getObjY() {
}
void Scumm_v2::o2_setBitVar() {
- byte hi = fetchScriptByte();
byte lo = fetchScriptByte();
+ byte hi = fetchScriptByte();
byte a = getVarOrDirectByte(0x80);
int bit_var = (hi << 8) + lo + a;
int bit_offset = bit_var & 0x0f;
bit_var >>= 4;
- if (getVarOrDirectByte(0x80))
+ if (getVarOrDirectByte(0x40))
_vars[bit_var] |= (1 << bit_offset);
else
_vars[bit_var] &= ~(1 << bit_offset);
@@ -473,8 +509,8 @@ void Scumm_v2::o2_setBitVar() {
void Scumm_v2::o2_getBitVar() {
getResultPos();
- byte hi = fetchScriptByte();
byte lo = fetchScriptByte();
+ byte hi = fetchScriptByte();
byte a = getVarOrDirectByte(0x80);
int bit_var = (hi << 8) + lo + a;
@@ -561,12 +597,12 @@ void Scumm_v2::o2_actorSet() {
Actor *a = derefActorSafe(act, "actorSet");
int i;
+ _opcode = fetchScriptByte();
if (!a) {
- fetchScriptByte();
return;
}
- switch (fetchScriptByte()) {
+ switch (_opcode) {
case 1: // Actor Sound
a->sound[0] = arg;
break;
@@ -588,6 +624,8 @@ void Scumm_v2::o2_actorSet() {
case 5: // Talk Color
a->talkColor = arg;
break;
+ default:
+ warning("o2_actorSet: opcode %d not yet supported", _opcode);
}
}
@@ -832,33 +870,6 @@ void Scumm_v2::o2_doSentence() {
}
}
-void Scumm_v2::decodeParseString() {
- byte buffer[256]; // FIXME
- byte *ptr = buffer;
- byte c;
- while ((c = fetchScriptByte())) {
- if (c & 0x80) {
- *ptr++ = c & 0x7f;
- *ptr++ = ' ';
- } else if (c < 8) {
- // Special codes as seen in CHARSET_1 etc. My guess is that they
- // have a similar function as the corresponding embedded stuff in modern
- // games. Hence for now we convert them to the modern format.
- // This might allow us to reuse the existing code.
- *ptr++ = 0xFF;
- *ptr++ = c;
- if (c > 3) {
- *ptr++ = 0;
- *ptr++ = fetchScriptByte();
- }
- } else
- *ptr++ = c;
- }
- *ptr = 0;
-
- printf("TODO: Scumm_v2::decodeParseString(\"%s\")\n", buffer);
-}
-
void Scumm_v2::o2_ifClassOfIs() {
int act = getVarOrDirectWord(0x80);
int clsop = getVarOrDirectByte(0x40);
diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp
index 3ae999289d..d8c7c7f0cf 100644
--- a/scumm/scummvm.cpp
+++ b/scumm/scummvm.cpp
@@ -1746,9 +1746,7 @@ Actor *Scumm::derefActor(int id) {
Actor *Scumm::derefActorSafe(int id, const char *errmsg) {
if (id < 1 || id >= NUM_ACTORS) {
- if (_debugLevel > 1)
- warning
- ("Invalid actor %d in %s (script %d, opcode 0x%x) - This is potentially a BIG problem.",
+ debug(2, "Invalid actor %d in %s (script %d, opcode 0x%x) - This is potentially a BIG problem.",
id, errmsg, vm.slot[_curExecScript].number, _opcode);
return NULL;
}