diff options
| author | Travis Howell | 2004-09-15 06:41:11 +0000 |
|---|---|---|
| committer | Travis Howell | 2004-09-15 06:41:11 +0000 |
| commit | 1ee9a242c3a89ee97edd77f65a882e5860de4943 (patch) | |
| tree | 21431eac0a3bc26f20f8c019f3d0a08798a5258b | |
| parent | 7f766fc2a55a792fbd1be2c5ed8752b8469ee9fc (diff) | |
| download | scummvm-rg350-1ee9a242c3a89ee97edd77f65a882e5860de4943.tar.gz scummvm-rg350-1ee9a242c3a89ee97edd77f65a882e5860de4943.tar.bz2 scummvm-rg350-1ee9a242c3a89ee97edd77f65a882e5860de4943.zip | |
Still not quite right.
svn-id: r15123
| -rw-r--r-- | scumm/intern.h | 2 | ||||
| -rw-r--r-- | scumm/script_v72he.cpp | 89 | ||||
| -rw-r--r-- | scumm/script_v7he.cpp | 99 |
3 files changed, 68 insertions, 122 deletions
diff --git a/scumm/intern.h b/scumm/intern.h index 42cc694e71..ac5a004517 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -616,8 +616,6 @@ protected: virtual void executeOpcode(byte i); virtual const char *getOpcodeDesc(byte i); - byte stringLen(byte *); - int getCharsetOffsets(int chr); void arrrays_unk2(int dst, int src, int len2, int len); void polygonErase(int fromId, int toId); diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp index 71f6787af9..0c715ae49b 100644 --- a/scumm/script_v72he.cpp +++ b/scumm/script_v72he.cpp @@ -512,6 +512,31 @@ void ScummEngine_v72he::readArrayFromIndexFile() { } } +void ScummEngine_v72he::arrrays_unk2(int dst, int src, int len2, int len) { + int edi, value; + int i = 0; + + if (len == -1) { + len = resStrLen(getStringAddress(src)); + len2 = 0; + } + + edi = resStrLen(getStringAddress(dst)); + + len -= len2; + len++; + + while (i < len) { + writeVar(0, src); + value = readArray(0, 0, len2 + i); + writeVar(0, dst); + writeArray(0, 0, edi + i, value); + i++; + } + + writeArray(0, 0, edi + i, 0); +} + void ScummEngine_v72he::copyScriptString(byte *dst) { int i = 0; byte b; @@ -539,7 +564,7 @@ void ScummEngine_v72he::decodeScriptString(byte *dst, bool scriptString) { memset(string, 0, sizeof(string)); getStackList(args, ARRAYSIZE(args)); - pop(); + int id = pop(); if (scriptString) { addMessageToStack(_scriptPointer, string, sizeof(string)); @@ -552,13 +577,15 @@ void ScummEngine_v72he::decodeScriptString(byte *dst, bool scriptString) { while (len--) { chr = string[num++]; - if (chr == 0x25) { + if (chr == '%') { chr = string[num++]; - if (chr == 0x64) + if (chr == 'd') { dst += snprintf((char *)dst, 10, "%d", args[val++]); - else if (chr == 0x73) - dst += addStringToStack(dst, 512, args[val++]); - continue; + continue; + } else if (chr == 's') { + dst += addStringToStack(dst, 512, id++); + continue; + } } *dst++ = chr; } @@ -1503,9 +1530,6 @@ void ScummEngine_v72he::o72_openFile() { if (!strcmp((char *)filename,".he3")) { memset(filename, 0, sizeof(filename)); sprintf((char *)filename, "%s.he3", _gameName.c_str()); - } else if (!strcmp((char *)filename,".he7")) { - memset(filename, 0, sizeof(filename)); - sprintf((char *)filename, "%s.he7", _gameName.c_str()); } debug(1,"File %s", filename); @@ -1761,31 +1785,6 @@ void ScummEngine_v72he::redimArray(int arrayId, int newDim2start, int newDim2end ah->dim2end = TO_LE_32(newDim2end); } -void ScummEngine_v72he::arrrays_unk2(int dst, int src, int len2, int len) { - int edi, value; - int i = 0; - - if (len == -1) { - len = resStrLen(getStringAddress(src)); - len2 = 0; - } - - edi = resStrLen(getStringAddress(dst)); - - len -= len2; - len++; - - while (i < len) { - writeVar(0, src); - value = readArray(0, 0, len2 + i); - writeVar(0, dst); - writeArray(0, 0, edi + i, value); - i++; - } - - writeArray(0, 0, edi + i, 0); -} - void ScummEngine_v72he::o72_unknownEC() { int dst, size; int src = pop(); @@ -1819,7 +1818,8 @@ void ScummEngine_v72he::o72_unknownED() { writeVar(0, array); while (pos <= len) { chr = readArray(0, 0, pos); - result += getCharsetOffsets(chr); + if (chr) + result += _charset->getCharWidth(chr); pos++; } @@ -1871,7 +1871,6 @@ void ScummEngine_v72he::o72_unknownF0() { void ScummEngine_v72he::o72_unknownF1() { byte *addr, *addr2; - byte chr, chr2; int id = pop(); int id2 = pop(); @@ -1884,13 +1883,17 @@ void ScummEngine_v72he::o72_unknownF1() { if (!addr) error("o72_stringLen: Reference to zeroed array pointer (%d)", id); - chr = *addr++; - chr2 = *addr2++; - + while (*addr == *addr2) { + if (addr == 0) { + push(0); + return; + } + addr++; + addr2++; + } + push (1); debug(1,"o7_unknownF1 stub (%d, %d)", id, id2); - - push(0); } void ScummEngine_v72he::o72_checkGlobQueue() { @@ -1963,9 +1966,9 @@ void ScummEngine_v72he::o72_unknownF5() { len = resStrLen(getStringAddress(array)); writeVar(0, array); - while (pos < len) { + while (pos <= len) { chr = readArray(0, 0, pos); - result += getCharsetOffsets(chr); + result += _charset->getCharWidth(chr); if (result >= max) { push(pos); return; diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp index 9aa2baf9c8..eff3a170e0 100644 --- a/scumm/script_v7he.cpp +++ b/scumm/script_v7he.cpp @@ -379,52 +379,29 @@ const char *ScummEngine_v7he::getOpcodeDesc(byte i) { return _opcodesV7he[i].desc; } +void ScummEngine_v7he::arrrays_unk2(int dst, int src, int len2, int len) { + int edi, value; + int i = 0; -byte ScummEngine_v7he::stringLen(byte *ptr) { - byte len; - byte c; - if (!ptr) - error("ScummEngine_v7he::stringLen(): zero ptr. Undimplemented behaviour"); - - len = 0; - c = *ptr++; - - if (len == c) - return 0; - - do { - len++; - if (c == 0xff) { - ptr += 3; - len += 3; - } - c = *ptr++; - } while (c); - - return len; -} - -int ScummEngine_v7he::getCharsetOffsets(int chr) { - int width, offsX; - int result = 0; + if (len == -1) { + len = resStrLen(getStringAddress(src)); + len2 = 0; + } - byte *fontPtr = getResourceAddress(rtCharset, _string[0]._default.charset); - if (!fontPtr) - error("getCharsetOffsets: charset %d not found!", _string[0]._default.charset); + edi = resStrLen(getStringAddress(dst)); - int offs = READ_LE_UINT32(fontPtr + 29 + chr * 4 + 4); - if (!offs) - return 0; + len -= len2; + len++; - width = fontPtr[offs] + (signed char)fontPtr[offs + 0]; - offsX = fontPtr[offs] + (signed char)fontPtr[offs + 2]; - - if (offsX >= 0x80) - result = (offsX & 0xff) + width - 256; - else - result = (offsX & 0xff) + width; + while (i < len) { + writeVar(0, src); + value = readArray(0, 0, len2 + i); + writeVar(0, dst); + writeArray(0, 0, edi + i, value); + i++; + } - return result; + writeArray(0, 0, edi + i, 0); } void ScummEngine_v7he::o7_cursorCommand() { @@ -695,7 +672,7 @@ void ScummEngine_v7he::o7_resourceRoutines() { debug(5,"stub o7_resourceRoutines unlock object %d", resid); break; default: - warning("o7_resourceRoutines: default case %d", op); + debug(1,"o7_resourceRoutines: default case %d", op); } } @@ -746,7 +723,7 @@ void ScummEngine_v7he::o7_unknownED() { writeVar(0, array); while (pos <= len) { chr = readArray(0, 0, pos); - result += getCharsetOffsets(chr); + result += _charset->getCharWidth(chr); pos++; } @@ -814,31 +791,6 @@ void ScummEngine_v7he::o7_stringLen() { push(len); } -void ScummEngine_v7he::arrrays_unk2(int dst, int src, int len2, int len) { - int edi, value; - int i = 0; - - if (len == -1) { - len = resStrLen(getStringAddress(src)); - len2 = 0; - } - - edi = resStrLen(getStringAddress(dst)); - - len -= len2; - len++; - - while (i < len) { - writeVar(0, src); - value = readArray(0, 0, len2 + i); - writeVar(0, dst); - writeArray(0, 0, edi + i, value); - i++; - } - - writeArray(0, 0, edi + i, 0); -} - void ScummEngine_v7he::o7_unknownEF() { int dst, size; int b = pop(); @@ -929,9 +881,9 @@ void ScummEngine_v7he::o7_unknownF5() { len = resStrLen(getStringAddress(array)); writeVar(0, array); - while (pos < len) { + while (pos <= len) { chr = readArray(0, 0, pos); - result += getCharsetOffsets(chr); + result += _charset->getCharWidth(chr); if (result >= max) { push(pos); return; @@ -1040,9 +992,6 @@ void ScummEngine::polygonStore(int id, bool flag, int vert1x, int vert1y, int ve int vert2y, int vert3x, int vert3y, int vert4x, int vert4y) { int i; - debug(1, "polygonStore(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d)", id, flag, vert1x, - vert1y, vert2x, vert2y, vert3x, vert3y, vert4x, vert4y); - for (i = 0; i < _WizNumPolygons; i++) if (_WizPolygons[i].id == 0) break; @@ -1090,14 +1039,10 @@ void ScummEngine_v7he::o7_polygonHit() { int y = pop(); int x = pop(); - debug(1, "o7_polygonHit(%d, %d)", x, y); - push(polygonHit(0, x, y)); } int ScummEngine_v7he::polygonHit(int id, int x, int y) { - debug(1, "polygonHit(%d, %d, %d)", id, x, y); - for (int i = 0; i < _WizNumPolygons; i++) { if ((!id || _WizPolygons[i].id == id) && _WizPolygons[i].bound.contains(x, y)) { if (polygonContains(_WizPolygons[i], x, y)) { |
