Still not quite right.

svn-id: r15123
This commit is contained in:
Travis Howell 2004-09-15 06:41:11 +00:00
parent 7f766fc2a5
commit 1ee9a242c3
3 changed files with 68 additions and 122 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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");
if (len == -1) {
len = resStrLen(getStringAddress(src));
len2 = 0;
}
len = 0;
c = *ptr++;
edi = resStrLen(getStringAddress(dst));
if (len == c)
return 0;
len -= len2;
len++;
do {
len++;
if (c == 0xff) {
ptr += 3;
len += 3;
}
c = *ptr++;
} while (c);
while (i < len) {
writeVar(0, src);
value = readArray(0, 0, len2 + i);
writeVar(0, dst);
writeArray(0, 0, edi + i, value);
i++;
}
return len;
}
int ScummEngine_v7he::getCharsetOffsets(int chr) {
int width, offsX;
int result = 0;
byte *fontPtr = getResourceAddress(rtCharset, _string[0]._default.charset);
if (!fontPtr)
error("getCharsetOffsets: charset %d not found!", _string[0]._default.charset);
int offs = READ_LE_UINT32(fontPtr + 29 + chr * 4 + 4);
if (!offs)
return 0;
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;
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)) {