aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorTravis Howell2004-03-02 06:19:26 +0000
committerTravis Howell2004-03-02 06:19:26 +0000
commitf80d6a7a2660ede913c7d7cf58d5afa26fc471cd (patch)
tree2881de62a2ceb4f4d2c9ebe9c47dc08ac241a64a /scumm
parent5fbc3497c1b5b63b934a83e900958fe96ed040dd (diff)
downloadscummvm-rg350-f80d6a7a2660ede913c7d7cf58d5afa26fc471cd.tar.gz
scummvm-rg350-f80d6a7a2660ede913c7d7cf58d5afa26fc471cd.tar.bz2
scummvm-rg350-f80d6a7a2660ede913c7d7cf58d5afa26fc471cd.zip
Divide up some code for HE6 and HE7
svn-id: r13136
Diffstat (limited to 'scumm')
-rw-r--r--scumm/intern.h5
-rw-r--r--scumm/script_v6.cpp2
-rw-r--r--scumm/script_v6he.cpp138
-rw-r--r--scumm/script_v7he.cpp92
-rw-r--r--scumm/scummvm.cpp2
5 files changed, 143 insertions, 96 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 29c090c145..cf152a706d 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -563,6 +563,8 @@ protected:
int kernelGetFunctions1(byte *addr, int arg1, int arg2, int arg3, int agr4);
void kernelSetFunctions1(byte *addr);
void seekFilePos(int slot, int offset, int mode);
+ byte stringLen(byte *);
+ virtual void decodeParseString(int a, int b);
/* Version 6 script opcodes */
void o6_drawBlastObject();
@@ -589,6 +591,7 @@ protected:
void o6_localizeArray();
void o6_unknownFA();
void o6_redimArray();
+ void o6_stringLen();
void o6_readINI();
void o6_unknownF9();
void o6_readFilePos();
@@ -614,8 +617,6 @@ protected:
virtual void executeOpcode(byte i);
virtual const char *getOpcodeDesc(byte i);
- virtual void decodeParseString(int a, int b);
-
byte stringLen(byte *);
/* Version 7 script opcodes */
diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp
index a14fac6603..336db49cea 100644
--- a/scumm/script_v6.cpp
+++ b/scumm/script_v6.cpp
@@ -931,7 +931,7 @@ void ScummEngine_v6::o6_cursorCommand() {
_userPut--;
break;
case 0x99:{ // SO_CURSOR_IMAGE Set cursor image
- if (_features & GF_AFTER_HEV7) {
+ if ((_features & GF_HUMONGOUS) && (_features & GF_WINDOWS)) {
warning("cursorCommand 0x99 PC_SetCursorToID(%d) stub", pop());
break;
}
diff --git a/scumm/script_v6he.cpp b/scumm/script_v6he.cpp
index f68131ebed..ec7d68055e 100644
--- a/scumm/script_v6he.cpp
+++ b/scumm/script_v6he.cpp
@@ -344,7 +344,7 @@ void ScummEngine_v6he::setupOpcodes() {
/* EC */
OPCODE(o6_invalid),
OPCODE(o6_invalid),
- OPCODE(o6_invalid),
+ OPCODE(o6_stringLen),
OPCODE(o6_invalid),
/* F0 */
OPCODE(o6_invalid),
@@ -1244,6 +1244,56 @@ void ScummEngine_v6he::redimArray(int arrayId, int newX, int newY, int type) {
ah->dim2 = TO_LE_16(newX + 1);
}
+void ScummEngine_v6he::o6_stringLen() {
+ int a, len;
+ byte *addr;
+
+ if (!(_features & GF_WINDOWS)) {
+ o6_invalid();
+ return;
+ }
+
+ a = pop();
+
+ addr = getStringAddress(a);
+ if (!addr) {
+ // FIXME: should be error here
+ warning("ScummEngine_v6he::o7_stringLen: Reference to zeroed array pointer (%d)", a);
+ push(0);
+ return;
+ }
+
+ len = stringLen(addr);
+ push(len);
+}
+
+byte ScummEngine_v6he::stringLen(byte *ptr) {
+ byte len;
+ byte c;
+ if (!ptr) {
+ //ptr = _someGlobalPtr;
+ error("ScummEngine_v6he::stringLen(): zero ptr. Undimplemented behaviour");
+ return 1;
+ }
+
+ len = 0;
+ c = *ptr++;
+
+ if (len == c)
+ return 1;
+
+ do {
+ len++;
+ if (c == 0xff) {
+ ptr += 3;
+ len += 3;
+ }
+ c = *ptr++;
+ } while (c);
+
+ return len+1;
+}
+
void ScummEngine_v6he::o6_readINI() {
int len;
@@ -1285,4 +1335,90 @@ void ScummEngine_v6he::o6_unknownF9() {
warning("stub o6_unknownF9(\"%s\")", filename + r);
}
+void ScummEngine_v6he::decodeParseString(int m, int n) {
+ byte b;
+ int c;
+
+ b = fetchScriptByte();
+
+ switch (b) {
+ case 65: // SO_AT
+ _string[m].ypos = pop();
+ _string[m].xpos = pop();
+ _string[m].overhead = false;
+ break;
+ case 66: // SO_COLOR
+ _string[m].color = pop();
+ break;
+ case 67: // SO_CLIPPED
+ _string[m].right = pop();
+ break;
+ case 69: // SO_CENTER
+ _string[m].center = true;
+ _string[m].overhead = false;
+ break;
+ case 71: // SO_LEFT
+ _string[m].center = false;
+ _string[m].overhead = false;
+ break;
+ case 72: // SO_OVERHEAD
+ _string[m].overhead = true;
+ _string[m].no_talk_anim = false;
+ break;
+ case 73: // SO_SAY_VOICE
+ error("decodeParseString: case 73");
+ break;
+ case 74: // SO_MUMBLE
+ _string[m].no_talk_anim = true;
+ break;
+ case 75: // SO_TEXTSTRING
+ _messagePtr = translateTextAndPlaySpeech(_scriptPointer);
+ _scriptPointer += resStrLen(_scriptPointer)+ 1;
+
+ switch (m) {
+ case 0:
+ actorTalk();
+ break;
+ case 1:
+ drawString(1);
+ break;
+ case 2:
+ unkMessage1();
+ break;
+ case 3:
+ unkMessage2();
+ break;
+ }
+ return;
+ case 0xF9:
+ c = pop();
+ if (c == 1) {
+ _string[m].color = pop();
+ } else {
+ push(c);
+ int args[16];
+ getStackList(args, ARRAYSIZE(args));
+ }
+ warning("decodeParseString case 0xF9 stub");
+ return;
+ case 0xFE:
+ setStringVars(m);
+ if (n)
+ _actorToPrintStrFor = pop();
+ return;
+ case 0xFF:
+ _string[m].t_xpos = _string[m].xpos;
+ _string[m].t_ypos = _string[m].ypos;
+ _string[m].t_center = _string[m].center;
+ _string[m].t_overhead = _string[m].overhead;
+ _string[m].t_no_talk_anim = _string[m].no_talk_anim;
+ _string[m].t_right = _string[m].right;
+ _string[m].t_color = _string[m].color;
+ _string[m].t_charset = _string[m].charset;
+ return;
+ default:
+ error("decodeParseString: default case 0x%x", b);
+ }
+}
+
} // End of namespace Scumm
diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp
index 45a25de2f6..cda0d14749 100644
--- a/scumm/script_v7he.cpp
+++ b/scumm/script_v7he.cpp
@@ -425,11 +425,7 @@ void ScummEngine_v7he::o7_stringLen() {
return;
}
- if (_gameId == GID_FREDDEMO) {
- len = strlen((char *)getStringAddress(a));
- } else { // FREDDI.w32, PUTTMOON.w32
- len = stringLen(addr);
- }
+ len = strlen((char *)getStringAddress(a));
push(len);
}
@@ -549,90 +545,4 @@ void ScummEngine_v7he::o7_unknownFB() {
warning("o7_unknownFB stub");
}
-void ScummEngine_v7he::decodeParseString(int m, int n) {
- byte b;
- int c;
-
- b = fetchScriptByte();
-
- switch (b) {
- case 65: // SO_AT
- _string[m].ypos = pop();
- _string[m].xpos = pop();
- _string[m].overhead = false;
- break;
- case 66: // SO_COLOR
- _string[m].color = pop();
- break;
- case 67: // SO_CLIPPED
- _string[m].right = pop();
- break;
- case 69: // SO_CENTER
- _string[m].center = true;
- _string[m].overhead = false;
- break;
- case 71: // SO_LEFT
- _string[m].center = false;
- _string[m].overhead = false;
- break;
- case 72: // SO_OVERHEAD
- _string[m].overhead = true;
- _string[m].no_talk_anim = false;
- break;
- case 73: // SO_SAY_VOICE
- error("decodeParseString: case 73");
- break;
- case 74: // SO_MUMBLE
- _string[m].no_talk_anim = true;
- break;
- case 75: // SO_TEXTSTRING
- _messagePtr = translateTextAndPlaySpeech(_scriptPointer);
- _scriptPointer += resStrLen(_scriptPointer)+ 1;
-
- switch (m) {
- case 0:
- actorTalk();
- break;
- case 1:
- drawString(1);
- break;
- case 2:
- unkMessage1();
- break;
- case 3:
- unkMessage2();
- break;
- }
- return;
- case 0xF9:
- c = pop();
- if (c == 1) {
- _string[m].color = pop();
- } else {
- push(c);
- int args[16];
- getStackList(args, ARRAYSIZE(args));
- }
- warning("decodeParseString case 0xF9 stub");
- return;
- case 0xFE:
- setStringVars(m);
- if (n)
- _actorToPrintStrFor = pop();
- return;
- case 0xFF:
- _string[m].t_xpos = _string[m].xpos;
- _string[m].t_ypos = _string[m].ypos;
- _string[m].t_center = _string[m].center;
- _string[m].t_overhead = _string[m].overhead;
- _string[m].t_no_talk_anim = _string[m].no_talk_anim;
- _string[m].t_right = _string[m].right;
- _string[m].t_color = _string[m].color;
- _string[m].t_charset = _string[m].charset;
- return;
- default:
- error("decodeParseString: default case 0x%x", b);
- }
-}
-
} // End of namespace Scumm
diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp
index 9011a0e76e..9f181673c9 100644
--- a/scumm/scummvm.cpp
+++ b/scumm/scummvm.cpp
@@ -667,7 +667,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS
if (_features & GF_FMTOWNS) { // FMTowns V3 games use 320x240
_screenWidth = 320;
_screenHeight = 240;
- } else if ((_gameId == GID_CMI) || (_features & GF_WINDOWS)) {
+ } else if ((_gameId == GID_CMI) || ((_features & GF_HUMONGOUS) && (_features & GF_WINDOWS))) {
_screenWidth = 640;
_screenHeight = 480;
} else if (_features & GF_NES) {