mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-01 16:35:20 +00:00
Still not quite right.
svn-id: r15123
This commit is contained in:
parent
7f766fc2a5
commit
1ee9a242c3
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user