mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-04 17:29:11 +00:00
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
This commit is contained in:
parent
ffe024844b
commit
b611b65bf4
@ -76,6 +76,7 @@ typedef std::vector<RectItem> RectItems;
|
||||
struct MessageItem {
|
||||
uint16 messageNum;
|
||||
uint32 messageParam;
|
||||
MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {}
|
||||
};
|
||||
|
||||
typedef std::vector<MessageItem> 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) {
|
||||
|
@ -22,10 +22,10 @@
|
||||
|
||||
static const uint32 hitRectListOffsets[] = {
|
||||
// Scene1001
|
||||
0x004B4858,
|
||||
1, 0x004B4860,
|
||||
// Scene1002
|
||||
0x004B4134,
|
||||
0
|
||||
1, 0x004B4138,
|
||||
0, 0
|
||||
};
|
||||
|
||||
static const uint32 rectListOffsets[] = {
|
||||
|
Binary file not shown.
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -146,7 +146,7 @@ void SmackerPlayer::update() {
|
||||
}
|
||||
|
||||
if (_doubleSurface) {
|
||||
// TODO .text:0046422D mov byte ptr [eax+28h], 1
|
||||
// TODO
|
||||
}
|
||||
|
||||
// TODO _vm->_screen->_skipUpdate = true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user