diff --git a/engines/dragons/dragons.cpp b/engines/dragons/dragons.cpp index ea7d2a5ba31..a23d1606d79 100644 --- a/engines/dragons/dragons.cpp +++ b/engines/dragons/dragons.cpp @@ -362,7 +362,6 @@ void DragonsEngine::gameLoop() if ((_cursor->_iniUnderCursor & 0x8000) != 0) { if (_cursor->_iniUnderCursor == 0x8002) { LAB_80027294: - uVar7 = 0; if (_cursor->iniItemInHand == 0) { if ((bit_flags_8006fbd8 & 3) != 1) { sequenceId = _dragonVAR->getVar(7); @@ -372,19 +371,11 @@ void DragonsEngine::gameLoop() } } else { - actorId = 0; - do { - if (unkArray_uint16[actorId] == 0) break; - uVar7 = uVar7 + 1; - actorId = (uint)uVar7; - } while (uVar7 < 0x29); - if (uVar7 < 0x29) { + if(_inventory->addItem(_cursor->iniItemInHand)) { _cursor->_sequenceID = 1; waitForFrames(1); - uVar6 = _cursor->iniItemInHand; _cursor->iniItemInHand = 0; _cursor->_iniUnderCursor = 0; - unkArray_uint16[(uint)uVar7] = uVar6; actorId = uVar3; continue; } @@ -478,7 +469,6 @@ void DragonsEngine::gameLoop() continue; } if (_cursor->_iniUnderCursor != 0) { - actorId_00 = 0; if ((_cursor->_sequenceID != 4) && (_cursor->_sequenceID != 2)) { _cursor->data_800728b0_cursor_seqID = _cursor->_sequenceID; _cursor->data_80072890 = _cursor->_iniUnderCursor; @@ -490,27 +480,19 @@ void DragonsEngine::gameLoop() walkFlickerToObject(); goto LAB_8002790c; } - if (_cursor->_iniUnderCursor != unkArray_uint16[0]) { - actorId = 1; - do { - actorId_00 = actorId; - actorId = actorId_00 + 1; - } while (_cursor->_iniUnderCursor != unkArray_uint16[actorId_00 & 0xffff]); - } - puVar9 = unkArray_uint16 + (actorId_00 & 0xffff); - Actor *actor = _actorManager->getActor(actorId_00 + 0x17); - *puVar9 = _cursor->iniItemInHand; + Actor *actor = _inventory->getInventoryItemActor(_cursor->_iniUnderCursor); + uint16 tmpId = _cursor->iniItemInHand; + _inventory->replaceItem(_cursor->_iniUnderCursor, _cursor->iniItemInHand); _cursor->data_8007283c = actor->_sequenceID; actor->clearFlag(ACTOR_FLAG_40); _cursor->iniItemInHand = _cursor->_iniUnderCursor; _cursor->_sequenceID = 5; actorId = uVar3; - if (*puVar9 != 0) { - actorId = actorId_00 + 0x17 & 0xffff; + if (tmpId != 0) { actor->flags = 0; actor->priorityLayer = 0; actor->field_e = 0x100; - actor->updateSequence(getINI((uint)*puVar9 - 1)->field_8 * 2 + 10); + actor->updateSequence(getINI(tmpId - 1)->field_8 * 2 + 10); actor->setFlag(ACTOR_FLAG_40); actor->setFlag(ACTOR_FLAG_80); actor->setFlag(ACTOR_FLAG_100); @@ -520,38 +502,22 @@ void DragonsEngine::gameLoop() } continue; } - uVar6 = 0; if (_cursor->iniItemInHand == 0) goto LAB_80027b58; //drop item back into inventory - actorId = 0; - do { - Actor *actor = _actorManager->getActor(actorId + 0x17); - if (((((int)(short)actor->x_pos - 0x10 <= (int)_cursor->_x) && - ((int)_cursor->_x < (int)(short)actor->x_pos + 0x10)) && - ((int)(short)actor->y_pos - 0xc <= (int)_cursor->_y)) && - (actorId = (uint)uVar6, (int)_cursor->_y < (int)(short)actor->y_pos + 0xc)) { - break; - } - uVar6 = uVar6 + 1; - actorId = (uint)uVar6; - } while (uVar6 < 0x29); - if (actorId != 0x29) { - actorId_00 = (uint)(ushort)(uVar6 + 0x17); - unkArray_uint16[actorId] = _cursor->iniItemInHand; - Actor *actor = _actorManager->getActor(actorId_00); - actor->flags = 0; - actor->priorityLayer = 0; - actor->field_e = 0x100; + Actor *invActor = _inventory->addItemIfPositionIsEmpty(_cursor->iniItemInHand, _cursor->_x, _cursor->_y); + if (invActor != NULL) { + invActor->flags = 0; + invActor->priorityLayer = 0; + invActor->field_e = 0x100; + invActor->updateSequence( + getINI(_cursor->iniItemInHand - 1)->field_8 * 2 + 10); _cursor->iniItemInHand = 0; - actor->updateSequence( - getINI((uint)unkArray_uint16[actorId] - 1)->field_8 * 2 + 10); - uVar6 = _cursor->_sequenceID; - actor->setFlag(ACTOR_FLAG_40); - actor->setFlag(ACTOR_FLAG_80); - actor->setFlag(ACTOR_FLAG_100); - actor->setFlag(ACTOR_FLAG_200); - actor->priorityLayer = 6; - if (uVar6 == 5) { + invActor->setFlag(ACTOR_FLAG_40); + invActor->setFlag(ACTOR_FLAG_80); + invActor->setFlag(ACTOR_FLAG_100); + invActor->setFlag(ACTOR_FLAG_200); + invActor->priorityLayer = 6; + if (_cursor->_sequenceID == 5) { _cursor->_sequenceID = 4; } } @@ -1219,7 +1185,6 @@ void DragonsEngine::reset() { opCode1A_tbl[i].field8 = 0; } - memset(unkArray_uint16, 0, sizeof(unkArray_uint16)); setSceneUpdateFunction(NULL); } diff --git a/engines/dragons/dragons.h b/engines/dragons/dragons.h index 0b660e9ad2e..fa953407bfd 100644 --- a/engines/dragons/dragons.h +++ b/engines/dragons/dragons.h @@ -139,7 +139,6 @@ public: Talk *_talk; Sound *_sound; - uint16 unkArray_uint16[42]; opCode1AStruct opCode1A_tbl[8]; uint16 data_800633fc; diff --git a/engines/dragons/inventory.cpp b/engines/dragons/inventory.cpp index b28b6ac4c2c..dc794472e59 100644 --- a/engines/dragons/inventory.cpp +++ b/engines/dragons/inventory.cpp @@ -160,11 +160,11 @@ void Inventory::openInventory() { item->x_pos = item->target_x_pos = invXPosTable[i] + 0x10; item->y_pos = item->target_y_pos = invYPosTable[i] + 0xc; - if (_vm->unkArray_uint16[i]) { + if (unkArray_uint16[i]) { item->flags = 0; //clear all flags item->field_e = 0x100; item->priorityLayer = 0; - item->updateSequence(_vm->getINI(_vm->unkArray_uint16[i] - 1)->field_8 * 2 + 10); + item->updateSequence(_vm->getINI(unkArray_uint16[i] - 1)->field_8 * 2 + 10); item->setFlag(ACTOR_FLAG_200); item->setFlag(ACTOR_FLAG_100); item->setFlag(ACTOR_FLAG_80); @@ -247,11 +247,11 @@ void Inventory::draw() { uint16 Inventory::getIniAtPosition(int16 x, int16 y) { for (int i = 0; i < 0x29; i++) { - if (_vm->unkArray_uint16[i]) { + if (unkArray_uint16[i]) { Actor *item = _vm->_actorManager->getActor(i + 0x17); if (item->x_pos - 0x10 <= x && x < item->x_pos + 0x10 && item->y_pos - 0xc <= y && y < item->y_pos + 0xc) { - return _vm->unkArray_uint16[i]; + return unkArray_uint16[i]; } } } @@ -259,11 +259,12 @@ uint16 Inventory::getIniAtPosition(int16 x, int16 y) { } void Inventory::loadInventoryItemsFromSave() { + memset(unkArray_uint16, 0, sizeof(unkArray_uint16)); int j = 0; for (int i=0; i < _vm->_dragonINIResource->totalRecords() && j < 0x29; i++ ) { DragonINI *ini = _vm->_dragonINIResource->getRecord(i); if (ini->sceneId == 1) { - _vm->unkArray_uint16[j++] = i + 1; + unkArray_uint16[j++] = i + 1; } } } @@ -332,4 +333,56 @@ void Inventory::setPositionFromSceneId(uint32 sceneId) { _actor->y_pos = positionTable[_screenPositionIndex].y; } +bool Inventory::addItem(uint16 initId) { + for (int i = 0; i < 0x29; i++) { + if (unkArray_uint16[i] == 0) { + unkArray_uint16[i] = initId; + return true; + } + } + + return false; +} + +Actor *Inventory::getInventoryItemActor(uint16 iniId) { + for (int i = 0; i < 0x29; i++) { + if (unkArray_uint16[i] == iniId) { + return _vm->_actorManager->getActor(i + 0x17); + } + } + error("getInventoryItemActor(%d) not found", iniId); +} + +void Inventory::replaceItem(uint16 existingIniId, uint16 newIniId) { + for (int i = 0; i < 0x29; i++) { + if (unkArray_uint16[i] == existingIniId) { + unkArray_uint16[i] = newIniId; + return; + } + } +} + +Actor *Inventory::addItemIfPositionIsEmpty(uint16 iniId, uint16 x, uint16 y) { + for (int i = 0; i < 0x29; i++) { + Actor *actor = _vm->_actorManager->getActor(i + 0x17); + if ((((actor->x_pos - 0x10 <= x) && + (x < actor->x_pos + 0x10)) && + (actor->y_pos - 0xc <= y)) && + (y < actor->y_pos + 0xc)) { + unkArray_uint16[i] = iniId; + return actor; + } + } + return NULL; +} + +bool Inventory::clearItem(uint16 iniId) { + for (int i = 0; i < 0x29; i++) { + if(unkArray_uint16[i] == iniId) { + unkArray_uint16[i] = 0; + } + } + return false; +} + } // End of namespace Dragons \ No newline at end of file diff --git a/engines/dragons/inventory.h b/engines/dragons/inventory.h index 73a95062230..6cd6e8233ca 100644 --- a/engines/dragons/inventory.h +++ b/engines/dragons/inventory.h @@ -50,6 +50,7 @@ private: uint16 inventionBookPrevFlickerINISceneId; Common::Point inventionBookPrevFlickerINIPosition; + uint16 unkArray_uint16[42]; public: Inventory(DragonsEngine *vm); @@ -88,6 +89,14 @@ public: void openInventionBook(); void closeInventionBook(); + + bool addItem(uint16 iniId); + Actor *addItemIfPositionIsEmpty(uint16 iniId, uint16 x, uint16 y); + void replaceItem(uint16 existingIniId, uint16 newIniId); + bool clearItem(uint16 iniId); + + Actor *getInventoryItemActor(uint16 iniId); + private: void setPositionFromSceneId(uint32 sceneId); void animateBagIn(); diff --git a/engines/dragons/scriptopcodes.cpp b/engines/dragons/scriptopcodes.cpp index 6cec4b4b618..4e5d6113e9d 100644 --- a/engines/dragons/scriptopcodes.cpp +++ b/engines/dragons/scriptopcodes.cpp @@ -1176,12 +1176,9 @@ void ScriptOpcodes::opCode_Unk7(ScriptOpCall &scriptOpCall) { _vm->_cursor->iniItemInHand = 0; } else { - for (int i = 0; i < 0x29; i++) { - if (_vm->unkArray_uint16[i] - 1 == ini->id) { - _vm->unkArray_uint16[i] = 0; - if (_vm->_inventory->getType() == 1) { - ini->actor->clearFlag(ACTOR_FLAG_40); - } + if (_vm->_inventory->clearItem(ini->id + 1)) { + if (_vm->_inventory->getType() == 1) { + ini->actor->clearFlag(ACTOR_FLAG_40); } } } @@ -1189,19 +1186,13 @@ void ScriptOpcodes::opCode_Unk7(ScriptOpCall &scriptOpCall) { if (sceneId == 1) { if (_vm->_cursor->iniItemInHand != 0) { - uint16 freeSlot = 0; - for( ;_vm->unkArray_uint16[freeSlot] != 0; freeSlot++) { - if (_vm->unkArray_uint16[freeSlot] == 0) { - break; - } - } - _vm->unkArray_uint16[freeSlot] = _vm->_cursor->iniItemInHand; + _vm->_inventory->addItem(_vm->_cursor->iniItemInHand); if (_vm->_inventory->getType() == 1) { - Actor *actor = _vm->_actorManager->getActor(freeSlot + 0x17); + Actor *actor = _vm->_inventory->getInventoryItemActor(_vm->_cursor->iniItemInHand); actor->flags = 0; actor->priorityLayer = 0; actor->field_e = 0x100; - actor->updateSequence((_vm->getINI(_vm->unkArray_uint16[freeSlot] - 1)->field_8 * 2 + 10) & 0xfffe); + actor->updateSequence((_vm->getINI(_vm->_cursor->iniItemInHand - 1)->field_8 * 2 + 10) & 0xfffe); actor->setFlag(ACTOR_FLAG_40); actor->setFlag(ACTOR_FLAG_80); actor->setFlag(ACTOR_FLAG_100);