DRAGONS: refactored inventory logic into inventory class

This commit is contained in:
Eric Fry 2019-08-02 23:04:30 +10:00 committed by Eugene Sandulenko
parent 4bd381242a
commit c20d288e22
5 changed files with 92 additions and 75 deletions

View file

@ -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);
}

View file

@ -139,7 +139,6 @@ public:
Talk *_talk;
Sound *_sound;
uint16 unkArray_uint16[42];
opCode1AStruct opCode1A_tbl[8];
uint16 data_800633fc;

View file

@ -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

View file

@ -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();

View file

@ -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);