aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Howell2004-09-15 06:41:11 +0000
committerTravis Howell2004-09-15 06:41:11 +0000
commit1ee9a242c3a89ee97edd77f65a882e5860de4943 (patch)
tree21431eac0a3bc26f20f8c019f3d0a08798a5258b
parent7f766fc2a55a792fbd1be2c5ed8752b8469ee9fc (diff)
downloadscummvm-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.h2
-rw-r--r--scumm/script_v72he.cpp89
-rw-r--r--scumm/script_v7he.cpp99
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)) {