From b611b65bf42a3f2d710199fa69428ec1012a0108 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 13 Jul 2011 18:34:20 +0000 Subject: NEVERHOOD: Change addHitRect to use an explicit count - This is since the alignment stuff didn't work and it's not worth it to investigate - Add possibility to write out hardcoded message lists instead of reading from the exe for special lists --- devtools/create_neverhood/create_neverhood.cpp | 55 ++++++++++++++++++------- devtools/create_neverhood/tables.h | 6 +-- dists/engine-data/neverhood.dat | Bin 2138 -> 2138 bytes engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 2 +- engines/neverhood/scene.cpp | 2 +- engines/neverhood/smackerplayer.cpp | 2 +- 7 files changed, 47 insertions(+), 22 deletions(-) diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp index 951a2f0ef1..84f3f74ac8 100644 --- a/devtools/create_neverhood/create_neverhood.cpp +++ b/devtools/create_neverhood/create_neverhood.cpp @@ -76,6 +76,7 @@ typedef std::vector RectItems; struct MessageItem { uint16 messageNum; uint32 messageParam; + MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {} }; typedef std::vector MessageItems; @@ -103,14 +104,10 @@ byte *getData(uint32 offset) { return data + offset - dataStart + fileStart; } -void addHitRect(uint32 offset) { +void addHitRect(uint32 count, uint32 offset) { HitRectList *hitRectList = new HitRectList(); hitRectList->id = offset; byte *item = getData(offset); - uint32 count = READ_LE_UINT32(item); - //printf("count = %d\n", count); - // Align to 16 bytes - item = data + ((offset + 4 + 16) & 0xFFFFFFF0) - dataStart + fileStart; for (uint32 i = 0; i < count; i++) { HitRect hitRect; hitRect.x1 = READ_LE_UINT16(item + 0); @@ -128,15 +125,43 @@ void addHitRect(uint32 offset) { void addMessage(uint32 count, uint32 offset) { MessageList *messageList = new MessageList(); messageList->id = offset; - byte *item = getData(offset); - for (uint32 i = 0; i < count; i++) { - MessageItem messageItem; - messageItem.messageNum = READ_LE_UINT16(item + 0); - messageItem.messageParam = READ_LE_UINT32(item + 4); - //printf("%04X, %08X\n", messageItem.messageNum, messageItem.messageParam); - item += 8; - messageList->messageItems.push_back(messageItem); + + // Special code for message lists which are set at runtime (but otherwise constant) + switch (offset) { + // Scene 1002 rings + case 0x004B4200: + messageList->messageItems.push_back(MessageItem(0x4800, 258)); + messageList->messageItems.push_back(MessageItem(0x100D, 0x4A845A00)); + messageList->messageItems.push_back(MessageItem(0x4805, 1)); + break; + case 0x004B4218: + messageList->messageItems.push_back(MessageItem(0x4800, 297)); + messageList->messageItems.push_back(MessageItem(0x100D, 0x43807801)); + messageList->messageItems.push_back(MessageItem(0x4805, 2)); + break; + case 0x004B4230: + messageList->messageItems.push_back(MessageItem(0x4800, 370)); + messageList->messageItems.push_back(MessageItem(0x100D, 0x46C26A01)); + break; + case 0x004B4240: + messageList->messageItems.push_back(MessageItem(0x4800, 334)); + messageList->messageItems.push_back(MessageItem(0x100D, 0x468C7B11)); + messageList->messageItems.push_back(MessageItem(0x4805, 1)); + break; + case 0x004B4258: + messageList->messageItems.push_back(MessageItem(0x4800, 425)); + messageList->messageItems.push_back(MessageItem(0x100D, 0x42845B19)); + messageList->messageItems.push_back(MessageItem(0x4805, 1)); + break; + default: + // Read message list from the exe + byte *item = getData(offset); + for (uint32 i = 0; i < count; i++) { + messageList->messageItems.push_back(MessageItem(READ_LE_UINT16(item + 0), READ_LE_UINT32(item + 4))); + item += 8; + } } + messageLists.push_back(messageList); } @@ -180,8 +205,8 @@ int main(int argc, char *argv[]) { loadExe("nhc.exe"); - for (int i = 0; hitRectListOffsets[i] != 0; i++) { - addHitRect(hitRectListOffsets[i]); + for (int i = 0; hitRectListOffsets[i] != 0; i += 2) { + addHitRect(hitRectListOffsets[i], hitRectListOffsets[i + 1]); } for (int i = 0; rectListOffsets[i] != 0; i += 2) { diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index d6e230af5e..7aba996ef8 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -22,10 +22,10 @@ static const uint32 hitRectListOffsets[] = { // Scene1001 - 0x004B4858, + 1, 0x004B4860, // Scene1002 - 0x004B4134, - 0 + 1, 0x004B4138, + 0, 0 }; static const uint32 rectListOffsets[] = { diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 99e3fcc1ca..f02d72ca1b 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 4354797695..c2d3e6d887 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -33,7 +33,7 @@ GameModule::GameModule(NeverhoodEngine *vm) // Other initializations moved to actual engine class - // TODO .text:0048AD96 + // TODO // TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 562624d57f..9acda937e2 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -58,7 +58,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false), _flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { - // TODO .text:0041C4D3 DirtySurface + // TODO createSurface(surfacePriority, 320, 200); _x = x; _y = y; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 1aee786458..3851cfa3ad 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -178,7 +178,7 @@ Background *Scene::addBackground(Background *background) { void Scene::update() { if (_smkFileHash != 0) { - // TODO .text:0040138D + // TODO //**** ALL TODO _smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0); _savedUpdateHandlerCb = _updateHandlerCb; diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index a13276a1f8..bbb0db144c 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -146,7 +146,7 @@ void SmackerPlayer::update() { } if (_doubleSurface) { - // TODO .text:0046422D mov byte ptr [eax+28h], 1 + // TODO } // TODO _vm->_screen->_skipUpdate = true; -- cgit v1.2.3