diff options
-rw-r--r-- | scumm/intern.h | 5 | ||||
-rw-r--r-- | scumm/script_v6.cpp | 2 | ||||
-rw-r--r-- | scumm/script_v6he.cpp | 138 | ||||
-rw-r--r-- | scumm/script_v7he.cpp | 92 | ||||
-rw-r--r-- | scumm/scummvm.cpp | 2 |
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) { |