GOB: Move getTotTextItemPart() from Inter_v3 to Inter_v2
This commit is contained in:
parent
f7d13415ee
commit
edacb7ada7
3 changed files with 184 additions and 184 deletions
|
@ -439,6 +439,7 @@ protected:
|
||||||
void o2_animPalInit(OpFuncParams ¶ms);
|
void o2_animPalInit(OpFuncParams ¶ms);
|
||||||
void o2_addHotspot(OpFuncParams ¶ms);
|
void o2_addHotspot(OpFuncParams ¶ms);
|
||||||
void o2_removeHotspot(OpFuncParams ¶ms);
|
void o2_removeHotspot(OpFuncParams ¶ms);
|
||||||
|
void o2_getTotTextItemPart(OpFuncParams ¶ms);
|
||||||
void o2_goblinFunc(OpFuncParams ¶ms);
|
void o2_goblinFunc(OpFuncParams ¶ms);
|
||||||
void o2_stopSound(OpFuncParams ¶ms);
|
void o2_stopSound(OpFuncParams ¶ms);
|
||||||
void o2_loadSound(OpFuncParams ¶ms);
|
void o2_loadSound(OpFuncParams ¶ms);
|
||||||
|
@ -540,7 +541,6 @@ protected:
|
||||||
virtual void setupOpcodesFunc();
|
virtual void setupOpcodesFunc();
|
||||||
virtual void setupOpcodesGob();
|
virtual void setupOpcodesGob();
|
||||||
|
|
||||||
void o3_getTotTextItemPart(OpFuncParams ¶ms);
|
|
||||||
void o3_speakerOn(OpFuncParams ¶ms);
|
void o3_speakerOn(OpFuncParams ¶ms);
|
||||||
void o3_speakerOff(OpFuncParams ¶ms);
|
void o3_speakerOff(OpFuncParams ¶ms);
|
||||||
void o3_copySprite(OpFuncParams ¶ms);
|
void o3_copySprite(OpFuncParams ¶ms);
|
||||||
|
|
|
@ -124,6 +124,7 @@ void Inter_v2::setupOpcodesFunc() {
|
||||||
|
|
||||||
OPCODEFUNC(0x18, o2_addHotspot);
|
OPCODEFUNC(0x18, o2_addHotspot);
|
||||||
OPCODEFUNC(0x19, o2_removeHotspot);
|
OPCODEFUNC(0x19, o2_removeHotspot);
|
||||||
|
OPCODEFUNC(0x1A, o2_getTotTextItemPart);
|
||||||
|
|
||||||
OPCODEFUNC(0x25, o2_goblinFunc);
|
OPCODEFUNC(0x25, o2_goblinFunc);
|
||||||
|
|
||||||
|
@ -1195,6 +1196,188 @@ void Inter_v2::o2_removeHotspot(OpFuncParams ¶ms) {
|
||||||
_vm->_game->_hotspots->remove((stateType2 << 12) + id);
|
_vm->_game->_hotspots->remove((stateType2 << 12) + id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Inter_v2::o2_getTotTextItemPart(OpFuncParams ¶ms) {
|
||||||
|
byte *totData;
|
||||||
|
int16 totTextItem;
|
||||||
|
int16 part, curPart = 0;
|
||||||
|
int16 offX = 0, offY = 0;
|
||||||
|
int16 collId = 0, collCmd;
|
||||||
|
uint32 stringStartVar, stringVar;
|
||||||
|
bool end;
|
||||||
|
|
||||||
|
totTextItem = _vm->_game->_script->readInt16();
|
||||||
|
stringStartVar = _vm->_game->_script->readVarIndex();
|
||||||
|
part = _vm->_game->_script->readValExpr();
|
||||||
|
|
||||||
|
stringVar = stringStartVar;
|
||||||
|
if (part == -1) {
|
||||||
|
warning("o2_getTotTextItemPart, part == -1");
|
||||||
|
_vm->_draw->_hotspotText = GET_VARO_STR(stringVar);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_VARO_UINT8(stringVar, 0);
|
||||||
|
|
||||||
|
TextItem *textItem = _vm->_game->_resources->getTextItem(totTextItem);
|
||||||
|
if (!textItem)
|
||||||
|
return;
|
||||||
|
|
||||||
|
totData = textItem->getData();
|
||||||
|
|
||||||
|
// Skip background rectangles
|
||||||
|
while (((int16) READ_LE_UINT16(totData)) != -1)
|
||||||
|
totData += 9;
|
||||||
|
totData += 2;
|
||||||
|
|
||||||
|
while (*totData != 1) {
|
||||||
|
switch (*totData) {
|
||||||
|
case 2:
|
||||||
|
case 5:
|
||||||
|
totData++;
|
||||||
|
offX = READ_LE_UINT16(totData);
|
||||||
|
offY = READ_LE_UINT16(totData + 2);
|
||||||
|
totData += 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
totData += 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
totData++;
|
||||||
|
|
||||||
|
collCmd = *totData++;
|
||||||
|
if (collCmd & 0x80) {
|
||||||
|
collId = READ_LE_UINT16(totData);
|
||||||
|
totData += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip collision coordinates
|
||||||
|
if (collCmd & 0x40)
|
||||||
|
totData += 8;
|
||||||
|
|
||||||
|
if ((collCmd & 0x8F) && ((-collId - 1) == part)) {
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
if ((*totData < 1) || (*totData > 7)) {
|
||||||
|
if (*totData >= 32) {
|
||||||
|
WRITE_VARO_UINT8(stringVar++, *totData++);
|
||||||
|
n++;
|
||||||
|
} else
|
||||||
|
totData++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((n != 0) || (*totData == 1) ||
|
||||||
|
(*totData == 6) || (*totData == 7)) {
|
||||||
|
WRITE_VARO_UINT8(stringVar, 0);
|
||||||
|
delete textItem;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (*totData) {
|
||||||
|
case 2:
|
||||||
|
case 5:
|
||||||
|
totData += 5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
totData += 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
case 8:
|
||||||
|
case 9:
|
||||||
|
totData++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
if (curPart == part) {
|
||||||
|
WRITE_VARO_UINT8(stringVar++, 0xFF);
|
||||||
|
WRITE_VARO_UINT16(stringVar, offX);
|
||||||
|
WRITE_VARO_UINT16(stringVar + 2, offY);
|
||||||
|
WRITE_VARO_UINT16(stringVar + 4,
|
||||||
|
totData - _vm->_game->_resources->getTexts());
|
||||||
|
WRITE_VARO_UINT8(stringVar + 6, 0);
|
||||||
|
delete textItem;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
end = false;
|
||||||
|
while (!end) {
|
||||||
|
switch (*totData) {
|
||||||
|
case 2:
|
||||||
|
case 5:
|
||||||
|
if (ABS(offY - READ_LE_UINT16(totData + 3)) > 1)
|
||||||
|
end = true;
|
||||||
|
else
|
||||||
|
totData += 5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
totData += 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
totData += totData[1] * 2 + 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (*totData < 32)
|
||||||
|
end = true;
|
||||||
|
while (*totData >= 32)
|
||||||
|
totData++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (part >= 0)
|
||||||
|
curPart++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
while (1) {
|
||||||
|
|
||||||
|
while (*totData >= 32)
|
||||||
|
WRITE_VARO_UINT8(stringVar++, *totData++);
|
||||||
|
WRITE_VARO_UINT8(stringVar, 0);
|
||||||
|
|
||||||
|
if (((*totData != 2) && (*totData != 5)) ||
|
||||||
|
(ABS(offY - READ_LE_UINT16(totData + 3)) > 1)) {
|
||||||
|
|
||||||
|
if (curPart == part) {
|
||||||
|
delete textItem;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
stringVar = stringStartVar;
|
||||||
|
WRITE_VARO_UINT8(stringVar, 0);
|
||||||
|
|
||||||
|
while (*totData >= 32)
|
||||||
|
totData++;
|
||||||
|
|
||||||
|
if (part >= 0)
|
||||||
|
curPart++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
} else
|
||||||
|
totData += 5;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete textItem;
|
||||||
|
}
|
||||||
|
|
||||||
void Inter_v2::o2_goblinFunc(OpFuncParams ¶ms) {
|
void Inter_v2::o2_goblinFunc(OpFuncParams ¶ms) {
|
||||||
OpGobParams gobParams;
|
OpGobParams gobParams;
|
||||||
int16 cmd;
|
int16 cmd;
|
||||||
|
|
|
@ -50,7 +50,6 @@ void Inter_v3::setupOpcodesDraw() {
|
||||||
void Inter_v3::setupOpcodesFunc() {
|
void Inter_v3::setupOpcodesFunc() {
|
||||||
Inter_v2::setupOpcodesFunc();
|
Inter_v2::setupOpcodesFunc();
|
||||||
|
|
||||||
OPCODEFUNC(0x1A, o3_getTotTextItemPart);
|
|
||||||
OPCODEFUNC(0x22, o3_speakerOn);
|
OPCODEFUNC(0x22, o3_speakerOn);
|
||||||
OPCODEFUNC(0x23, o3_speakerOff);
|
OPCODEFUNC(0x23, o3_speakerOff);
|
||||||
OPCODEFUNC(0x32, o3_copySprite);
|
OPCODEFUNC(0x32, o3_copySprite);
|
||||||
|
@ -66,188 +65,6 @@ void Inter_v3::setupOpcodesGob() {
|
||||||
OPCODEGOB(100, o3_wobble);
|
OPCODEGOB(100, o3_wobble);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Inter_v3::o3_getTotTextItemPart(OpFuncParams ¶ms) {
|
|
||||||
byte *totData;
|
|
||||||
int16 totTextItem;
|
|
||||||
int16 part, curPart = 0;
|
|
||||||
int16 offX = 0, offY = 0;
|
|
||||||
int16 collId = 0, collCmd;
|
|
||||||
uint32 stringStartVar, stringVar;
|
|
||||||
bool end;
|
|
||||||
|
|
||||||
totTextItem = _vm->_game->_script->readInt16();
|
|
||||||
stringStartVar = _vm->_game->_script->readVarIndex();
|
|
||||||
part = _vm->_game->_script->readValExpr();
|
|
||||||
|
|
||||||
stringVar = stringStartVar;
|
|
||||||
if (part == -1) {
|
|
||||||
warning("o3_getTotTextItemPart, part == -1");
|
|
||||||
_vm->_draw->_hotspotText = GET_VARO_STR(stringVar);
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE_VARO_UINT8(stringVar, 0);
|
|
||||||
|
|
||||||
TextItem *textItem = _vm->_game->_resources->getTextItem(totTextItem);
|
|
||||||
if (!textItem)
|
|
||||||
return;
|
|
||||||
|
|
||||||
totData = textItem->getData();
|
|
||||||
|
|
||||||
// Skip background rectangles
|
|
||||||
while (((int16) READ_LE_UINT16(totData)) != -1)
|
|
||||||
totData += 9;
|
|
||||||
totData += 2;
|
|
||||||
|
|
||||||
while (*totData != 1) {
|
|
||||||
switch (*totData) {
|
|
||||||
case 2:
|
|
||||||
case 5:
|
|
||||||
totData++;
|
|
||||||
offX = READ_LE_UINT16(totData);
|
|
||||||
offY = READ_LE_UINT16(totData + 2);
|
|
||||||
totData += 4;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
case 4:
|
|
||||||
totData += 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 6:
|
|
||||||
totData++;
|
|
||||||
|
|
||||||
collCmd = *totData++;
|
|
||||||
if (collCmd & 0x80) {
|
|
||||||
collId = READ_LE_UINT16(totData);
|
|
||||||
totData += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip collision coordinates
|
|
||||||
if (collCmd & 0x40)
|
|
||||||
totData += 8;
|
|
||||||
|
|
||||||
if ((collCmd & 0x8F) && ((-collId - 1) == part)) {
|
|
||||||
int n = 0;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
if ((*totData < 1) || (*totData > 7)) {
|
|
||||||
if (*totData >= 32) {
|
|
||||||
WRITE_VARO_UINT8(stringVar++, *totData++);
|
|
||||||
n++;
|
|
||||||
} else
|
|
||||||
totData++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((n != 0) || (*totData == 1) ||
|
|
||||||
(*totData == 6) || (*totData == 7)) {
|
|
||||||
WRITE_VARO_UINT8(stringVar, 0);
|
|
||||||
delete textItem;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (*totData) {
|
|
||||||
case 2:
|
|
||||||
case 5:
|
|
||||||
totData += 5;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
case 4:
|
|
||||||
totData += 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 7:
|
|
||||||
case 8:
|
|
||||||
case 9:
|
|
||||||
totData++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 10:
|
|
||||||
if (curPart == part) {
|
|
||||||
WRITE_VARO_UINT8(stringVar++, 0xFF);
|
|
||||||
WRITE_VARO_UINT16(stringVar, offX);
|
|
||||||
WRITE_VARO_UINT16(stringVar + 2, offY);
|
|
||||||
WRITE_VARO_UINT16(stringVar + 4,
|
|
||||||
totData - _vm->_game->_resources->getTexts());
|
|
||||||
WRITE_VARO_UINT8(stringVar + 6, 0);
|
|
||||||
delete textItem;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
end = false;
|
|
||||||
while (!end) {
|
|
||||||
switch (*totData) {
|
|
||||||
case 2:
|
|
||||||
case 5:
|
|
||||||
if (ABS(offY - READ_LE_UINT16(totData + 3)) > 1)
|
|
||||||
end = true;
|
|
||||||
else
|
|
||||||
totData += 5;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
totData += 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 10:
|
|
||||||
totData += totData[1] * 2 + 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (*totData < 32)
|
|
||||||
end = true;
|
|
||||||
while (*totData >= 32)
|
|
||||||
totData++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (part >= 0)
|
|
||||||
curPart++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
while (1) {
|
|
||||||
|
|
||||||
while (*totData >= 32)
|
|
||||||
WRITE_VARO_UINT8(stringVar++, *totData++);
|
|
||||||
WRITE_VARO_UINT8(stringVar, 0);
|
|
||||||
|
|
||||||
if (((*totData != 2) && (*totData != 5)) ||
|
|
||||||
(ABS(offY - READ_LE_UINT16(totData + 3)) > 1)) {
|
|
||||||
|
|
||||||
if (curPart == part) {
|
|
||||||
delete textItem;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
stringVar = stringStartVar;
|
|
||||||
WRITE_VARO_UINT8(stringVar, 0);
|
|
||||||
|
|
||||||
while (*totData >= 32)
|
|
||||||
totData++;
|
|
||||||
|
|
||||||
if (part >= 0)
|
|
||||||
curPart++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
} else
|
|
||||||
totData += 5;
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete textItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Inter_v3::o3_speakerOn(OpFuncParams ¶ms) {
|
void Inter_v3::o3_speakerOn(OpFuncParams ¶ms) {
|
||||||
int16 frequency = _vm->_game->_script->readValExpr();
|
int16 frequency = _vm->_game->_script->readValExpr();
|
||||||
int32 length = -1;
|
int32 length = -1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue