Review combatLoad

This commit is contained in:
Alexander Batalov 2022-12-13 23:03:42 +03:00
parent 7596d4d721
commit 0fe6d88a3a
1 changed files with 37 additions and 50 deletions

View File

@ -2087,17 +2087,10 @@ int _find_cid(int a1, int cid, Object** critterList, int critterListLength)
// 0x420E4C // 0x420E4C
int combatLoad(File* stream) int combatLoad(File* stream)
{ {
int v14;
int a2;
Object* obj;
int v24;
int i;
int j;
if (fileReadUInt32(stream, &gCombatState) == -1) return -1; if (fileReadUInt32(stream, &gCombatState) == -1) return -1;
if (!isInCombat()) { if (!isInCombat()) {
obj = objectFindFirst(); Object* obj = objectFindFirst();
while (obj != NULL) { while (obj != NULL) {
if (PID_TYPE(obj->pid) == OBJ_TYPE_CRITTER) { if (PID_TYPE(obj->pid) == OBJ_TYPE_CRITTER) {
if (obj->data.critter.combat.whoHitMeCid == -1) { if (obj->data.critter.combat.whoHitMeCid == -1) {
@ -2116,56 +2109,47 @@ int combatLoad(File* stream)
if (fileReadInt32(stream, &_list_noncom) == -1) return -1; if (fileReadInt32(stream, &_list_noncom) == -1) return -1;
if (fileReadInt32(stream, &_list_total) == -1) return -1; if (fileReadInt32(stream, &_list_total) == -1) return -1;
if (objectListCreate(-1, gElevation, 1, &_combat_list) != _list_total) { if (objectListCreate(-1, gElevation, OBJ_TYPE_CRITTER, &_combat_list) != _list_total) {
objectListFree(_combat_list); objectListFree(_combat_list);
return -1; return -1;
} }
if (fileReadInt32(stream, &v24) == -1) return -1; if (fileReadInt32(stream, &(gDude->cid)) == -1) return -1;
gDude->cid = v24; for (int index = 0; index < _list_total; index++) {
if (_combat_list[index]->data.critter.combat.whoHitMeCid == -1) {
for (i = 0; i < _list_total; i++) { _combat_list[index]->data.critter.combat.whoHitMe = NULL;
if (_combat_list[i]->data.critter.combat.whoHitMeCid == -1) {
_combat_list[i]->data.critter.combat.whoHitMe = NULL;
} else { } else {
for (j = 0; j < _list_total; j++) { // NOTE: Uninline.
if (_combat_list[i]->data.critter.combat.whoHitMeCid == _combat_list[j]->cid) { int found = _find_cid(0, _combat_list[index]->data.critter.combat.whoHitMeCid, _combat_list, _list_total);
break; if (found == _list_total) {
} _combat_list[index]->data.critter.combat.whoHitMe = NULL;
}
if (j == _list_total) {
_combat_list[i]->data.critter.combat.whoHitMe = NULL;
} else { } else {
_combat_list[i]->data.critter.combat.whoHitMe = _combat_list[j]; _combat_list[index]->data.critter.combat.whoHitMe = _combat_list[found];
} }
} }
} }
for (i = 0; i < _list_total; i++) { for (int index = 0; index < _list_total; index++) {
if (fileReadInt32(stream, &v24) == -1) return -1; int cid;
if (fileReadInt32(stream, &cid) == -1) return -1;
for (j = i; j < _list_total; j++) { // NOTE: Uninline.
if (v24 == _combat_list[j]->cid) { int found = _find_cid(index, cid, _combat_list, _list_total);
break; if (found == _list_total) {
}
}
if (j == _list_total) {
return -1; return -1;
} }
obj = _combat_list[i]; Object* obj = _combat_list[index];
_combat_list[i] = _combat_list[j]; _combat_list[index] = _combat_list[found];
_combat_list[j] = obj; _combat_list[found] = obj;
} }
for (i = 0; i < _list_total; i++) { for (int index = 0; index < _list_total; index++) {
_combat_list[i]->cid = i; _combat_list[index]->cid = index;
} }
if (_aiInfoList) { if (_aiInfoList != NULL) {
internal_free(_aiInfoList); internal_free(_aiInfoList);
} }
@ -2174,39 +2158,42 @@ int combatLoad(File* stream)
return -1; return -1;
} }
for (v14 = 0; v14 < _list_total; v14++) { for (int index = 0; index < _list_total; index++) {
CombatAiInfo* aiInfo = &(_aiInfoList[v14]); CombatAiInfo* aiInfo = &(_aiInfoList[index]);
if (fileReadInt32(stream, &a2) == -1) return -1; int friendlyId;
if (fileReadInt32(stream, &friendlyId) == -1) return -1;
if (a2 == -1) { if (friendlyId == -1) {
aiInfo->friendlyDead = NULL; aiInfo->friendlyDead = NULL;
} else { } else {
// SFALL: Fix incorrect object type search when loading a game in // SFALL: Fix incorrect object type search when loading a game in
// combat mode. // combat mode.
aiInfo->friendlyDead = objectTypedFindById(a2, OBJ_TYPE_CRITTER); aiInfo->friendlyDead = objectTypedFindById(friendlyId, OBJ_TYPE_CRITTER);
if (aiInfo->friendlyDead == NULL) return -1; if (aiInfo->friendlyDead == NULL) return -1;
} }
if (fileReadInt32(stream, &a2) == -1) return -1; int targetId;
if (fileReadInt32(stream, &targetId) == -1) return -1;
if (a2 == -1) { if (targetId == -1) {
aiInfo->lastTarget = NULL; aiInfo->lastTarget = NULL;
} else { } else {
// SFALL: Fix incorrect object type search when loading a game in // SFALL: Fix incorrect object type search when loading a game in
// combat mode. // combat mode.
aiInfo->lastTarget = objectTypedFindById(a2, OBJ_TYPE_CRITTER); aiInfo->lastTarget = objectTypedFindById(targetId, OBJ_TYPE_CRITTER);
if (aiInfo->lastTarget == NULL) return -1; if (aiInfo->lastTarget == NULL) return -1;
} }
if (fileReadInt32(stream, &a2) == -1) return -1; int itemId;
if (fileReadInt32(stream, &itemId) == -1) return -1;
if (a2 == -1) { if (itemId == -1) {
aiInfo->lastItem = NULL; aiInfo->lastItem = NULL;
} else { } else {
// SFALL: Fix incorrect object type search when loading a game in // SFALL: Fix incorrect object type search when loading a game in
// combat mode. // combat mode.
aiInfo->lastItem = objectTypedFindById(a2, OBJ_TYPE_ITEM); aiInfo->lastItem = objectTypedFindById(itemId, OBJ_TYPE_ITEM);
if (aiInfo->lastItem == NULL) return -1; if (aiInfo->lastItem == NULL) return -1;
} }