diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/gob/inter.h | 2 | ||||
-rw-r--r-- | engines/gob/inter_v2.cpp | 183 | ||||
-rw-r--r-- | engines/gob/inter_v3.cpp | 183 |
3 files changed, 184 insertions, 184 deletions
diff --git a/engines/gob/inter.h b/engines/gob/inter.h index 2aa837e777..fabd31b66d 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -439,6 +439,7 @@ protected: void o2_animPalInit(OpFuncParams ¶ms); void o2_addHotspot(OpFuncParams ¶ms); void o2_removeHotspot(OpFuncParams ¶ms); + void o2_getTotTextItemPart(OpFuncParams ¶ms); void o2_goblinFunc(OpFuncParams ¶ms); void o2_stopSound(OpFuncParams ¶ms); void o2_loadSound(OpFuncParams ¶ms); @@ -540,7 +541,6 @@ protected: virtual void setupOpcodesFunc(); virtual void setupOpcodesGob(); - void o3_getTotTextItemPart(OpFuncParams ¶ms); void o3_speakerOn(OpFuncParams ¶ms); void o3_speakerOff(OpFuncParams ¶ms); void o3_copySprite(OpFuncParams ¶ms); diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp index 6b7a4f03bd..9346a6adb8 100644 --- a/engines/gob/inter_v2.cpp +++ b/engines/gob/inter_v2.cpp @@ -124,6 +124,7 @@ void Inter_v2::setupOpcodesFunc() { OPCODEFUNC(0x18, o2_addHotspot); OPCODEFUNC(0x19, o2_removeHotspot); + OPCODEFUNC(0x1A, o2_getTotTextItemPart); OPCODEFUNC(0x25, o2_goblinFunc); @@ -1195,6 +1196,188 @@ void Inter_v2::o2_removeHotspot(OpFuncParams ¶ms) { _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) { OpGobParams gobParams; int16 cmd; diff --git a/engines/gob/inter_v3.cpp b/engines/gob/inter_v3.cpp index edf56012d9..d6d4c52476 100644 --- a/engines/gob/inter_v3.cpp +++ b/engines/gob/inter_v3.cpp @@ -50,7 +50,6 @@ void Inter_v3::setupOpcodesDraw() { void Inter_v3::setupOpcodesFunc() { Inter_v2::setupOpcodesFunc(); - OPCODEFUNC(0x1A, o3_getTotTextItemPart); OPCODEFUNC(0x22, o3_speakerOn); OPCODEFUNC(0x23, o3_speakerOff); OPCODEFUNC(0x32, o3_copySprite); @@ -66,188 +65,6 @@ void Inter_v3::setupOpcodesGob() { 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) { int16 frequency = _vm->_game->_script->readValExpr(); int32 length = -1; |