diff options
author | Eugene Sandulenko | 2004-03-02 04:11:57 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2004-03-02 04:11:57 +0000 |
commit | 2f65abff2f3a78fd0874567eb432470de4c6d39a (patch) | |
tree | 602be1ee6f1c8ef6d4e7550d2fe4db622b286079 | |
parent | 0e3a8f3190bf5e7936182393f1f0725fded5482c (diff) | |
download | scummvm-rg350-2f65abff2f3a78fd0874567eb432470de4c6d39a.tar.gz scummvm-rg350-2f65abff2f3a78fd0874567eb432470de4c6d39a.tar.bz2 scummvm-rg350-2f65abff2f3a78fd0874567eb432470de4c6d39a.zip |
Implemented more HE opcode stringLen and added stub for opcode F4
svn-id: r13134
-rw-r--r-- | scumm/intern.h | 2 | ||||
-rw-r--r-- | scumm/script_v7he.cpp | 118 |
2 files changed, 103 insertions, 17 deletions
diff --git a/scumm/intern.h b/scumm/intern.h index 685040dc0f..29c090c145 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -616,6 +616,8 @@ protected: virtual void decodeParseString(int a, int b); + byte stringLen(byte *); + /* Version 7 script opcodes */ void o7_objectX(); void o7_objectY(); diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp index 858ffcd08c..45a25de2f6 100644 --- a/scumm/script_v7he.cpp +++ b/scumm/script_v7he.cpp @@ -408,34 +408,118 @@ void ScummEngine_v7he::o7_objectY() { void ScummEngine_v7he::o7_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_v7he::o7_stringLen: Reference to zeroed array pointer (%d)", a); + push(0); + return; + } + if (_gameId == GID_FREDDEMO) { len = strlen((char *)getStringAddress(a)); - } else { - len = 0; // TODO: implement + } else { // FREDDI.w32, PUTTMOON.w32 + len = stringLen(addr); } push(len); } +byte ScummEngine_v7he::stringLen(byte *ptr) { + byte len; + byte c; + if (!ptr) { + //ptr = _someGlobalPtr; + error("ScummEngine_v7he::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_v7he::o7_unknownF4() { - byte b; - int len; - b = fetchScriptByte(); + if (!(_features & GF_WINDOWS)) { + o6_invalid(); + return; + } - switch (b) { - case 6: - pop(); - len = resStrLen(_scriptPointer); - _scriptPointer += len + 1; - break; - case 7: - len = resStrLen(_scriptPointer); - _scriptPointer += len + 1; - len = resStrLen(_scriptPointer); - _scriptPointer += len + 1; - break; + if (_gameId == GID_FREDDEMO) { + byte b; + int len; + b = fetchScriptByte(); + + switch (b) { + case 6: + pop(); + len = resStrLen(_scriptPointer); + _scriptPointer += len + 1; + break; + case 7: + len = resStrLen(_scriptPointer); + _scriptPointer += len + 1; + len = resStrLen(_scriptPointer); + _scriptPointer += len + 1; + break; + } + } else { // FREDDI.w32, PUTTMOON.w32 + int a, b; + byte filename1[256], filename2[256]; + int len; + + + b = pop(); + a = pop(); + + switch (b) { + case 1: + _msgPtrToAdd = filename1; + _messagePtr = _scriptPointer; + addMessageToStack(_messagePtr); + + len = resStrLen(_scriptPointer); + _scriptPointer += len + 1; + debug(0, "unknownF4(%d, %d, \"%s\")", a, b, _messagePtr); + break; + case 2: + _msgPtrToAdd = filename1; + _messagePtr = _scriptPointer; + addMessageToStack(_messagePtr); + + len = resStrLen(_scriptPointer); + _scriptPointer += len + 1; + + _msgPtrToAdd = filename2; + _messagePtr = _scriptPointer; + addMessageToStack(_messagePtr); + + len = resStrLen(_scriptPointer); + _scriptPointer += len + 1; + debug(0, "unknownF4(%d, %d, \"%s\", \"%s\")", a, b, filename1, filename2); + break; + } } warning("o7_unknownF4 stub"); } |