From 57ce0cf8d9827e1c88013a318f35e9677167d900 Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Tue, 19 Sep 2023 20:10:12 +0200 Subject: Doc/Cleanup pass on object handling (#1227) * `Object_InitBank` -> `Object_InitContext` * Add and use `OBJECT_SPACE_SIZE_BASE` * Remove `OBJECT_EXCHANGE_BANK_MAX` -> use `ARRAY_COUNT()` instead * "object status" -> "object load entry" * Misc. cleanup/renames * Partial docs and way too much batch renaming and cleanup for a single commit * ctrl shift h * format * format clang-11.1 * fix regressions * Improve a `@bug` comment * Move `OBJECT_SPACE_SIZE_BASE` from header to near `Object_InitContext` * "objectID" -> "objectId" * Revert iterator index to `i` in `Actor_KillActorsWithUnloadedObject` * "object load entry index" -> "object entry" * `Object_UpdateLoadEntries` -> `Object_UpdateEntries` * Run format.sh * "object entry" -> "object slot" (except internal usage) * Proper `Object_SpawnPersistent` doc Co-authored-by: fig02 * fixup one comment "object bank index" -> "object slot" * Amend `Object_SpawnPersistent` comment to mention running out of free slots * `Actor_KillActorsWithUnloadedObject` -> `Actor_KillAllWithMissingObject` * Remove useless mention of what uses `Object_SpawnPersistent` * Fix mistake on `Object_SpawnPersistent` doing sync dma, not async * run formatter * `Object_InitContext` -> `Object_Init` * `waitObjectSlot` -> `requiredObjectSlot` * `Object_Init` -> `func_80097DD8` * one objectIndex -> objectSlot * Remove `OBJECT_SPACE_SIZE_BASE` * light fix on the merge (rm OBJECT_EXCHANGE_BANK_MAX) * `func_80097DD8` -> `Object_InitContext` --------- Co-authored-by: fig02 --- src/code/z_actor.c | 58 +++++----- src/code/z_effect_soft_sprite_old_init.c | 6 +- src/code/z_en_item00.c | 12 +- src/code/z_kankyo.c | 2 +- src/code/z_play.c | 24 ++-- src/code/z_player_lib.c | 2 +- src/code/z_scene.c | 190 +++++++++++++++++-------------- 7 files changed, 155 insertions(+), 139 deletions(-) (limited to 'src/code') diff --git a/src/code/z_actor.c b/src/code/z_actor.c index aa1f16291..4ef0bf10f 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -799,7 +799,7 @@ void Actor_SetScale(Actor* actor, f32 scale) { } void Actor_SetObjectDependency(PlayState* play, Actor* actor) { - gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[actor->objBankIndex].segment); + gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[actor->objectSlot].segment); } void Actor_Init(Actor* actor, PlayState* play) { @@ -818,7 +818,7 @@ void Actor_Init(Actor* actor, PlayState* play) { CollisionCheck_InitInfo(&actor->colChkInfo); actor->floorBgId = BGCHECK_SCENE; ActorShape_Init(&actor->shape, 0.0f, NULL, 0.0f); - if (Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { + if (Object_IsLoaded(&play->objectCtx, actor->objectSlot)) { Actor_SetObjectDependency(play, actor); actor->init(actor, play); actor->init = NULL; @@ -2143,13 +2143,13 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { actor->sfx = 0; if (actor->init != NULL) { - if (Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { + if (Object_IsLoaded(&play->objectCtx, actor->objectSlot)) { Actor_SetObjectDependency(play, actor); actor->init(actor, play); actor->init = NULL; } actor = actor->next; - } else if (!Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { + } else if (!Object_IsLoaded(&play->objectCtx, actor->objectSlot)) { Actor_Kill(actor); actor = actor->next; } else if ((requiredActorFlag && !(actor->flags & requiredActorFlag)) || @@ -2272,8 +2272,8 @@ void Actor_Draw(PlayState* play, Actor* actor) { Matrix_Scale(actor->scale.x, actor->scale.y, actor->scale.z, MTXMODE_APPLY); Actor_SetObjectDependency(play, actor); - gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[actor->objBankIndex].segment); - gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.status[actor->objBankIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[actor->objectSlot].segment); + gSPSegment(POLY_XLU_DISP++, 0x06, play->objectCtx.slots[actor->objectSlot].segment); if (actor->colorFilterTimer != 0) { Color_RGBA8 color = { 0, 0, 0, 255 }; @@ -2570,7 +2570,7 @@ void Actor_KillAllWithMissingObject(PlayState* play, ActorContext* actorCtx) { for (i = 0; i < ARRAY_COUNT(actorCtx->actorLists); i++) { actor = actorCtx->actorLists[i].head; while (actor != NULL) { - if (!Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { + if (!Object_IsLoaded(&play->objectCtx, actor->objectSlot)) { Actor_Kill(actor); } actor = actor->next; @@ -2745,7 +2745,7 @@ Actor* Actor_Spawn(ActorContext* actorCtx, PlayState* play, s16 actorId, f32 pos s32 pad; Actor* actor; ActorInit* actorInit; - s32 objBankIndex; + s32 objectSlot; ActorOverlay* overlayEntry; uintptr_t temp; char* name; @@ -2828,13 +2828,13 @@ Actor* Actor_Spawn(ActorContext* actorCtx, PlayState* play, s16 actorId, f32 pos : NULL); } - objBankIndex = Object_GetIndex(&play->objectCtx, actorInit->objectId); + objectSlot = Object_GetSlot(&play->objectCtx, actorInit->objectId); - if ((objBankIndex < 0) || + if ((objectSlot < 0) || ((actorInit->category == ACTORCAT_ENEMY) && Flags_GetClear(play, play->roomCtx.curRoom.num))) { // "No data bank!! (profilep->bank=%d)" osSyncPrintf(VT_COL(RED, WHITE) "データバンク無し!!<データバンク=%d>(profilep->bank=%d)\n" VT_RST, - objBankIndex, actorInit->objectId); + objectSlot, actorInit->objectId); Actor_FreeOverlay(overlayEntry); return NULL; } @@ -2864,10 +2864,10 @@ Actor* Actor_Spawn(ActorContext* actorCtx, PlayState* play, s16 actorId, f32 pos actor->flags = actorInit->flags; if (actorInit->id == ACTOR_EN_PART) { - actor->objBankIndex = rotZ; + actor->objectSlot = rotZ; rotZ = 0; } else { - actor->objBankIndex = objBankIndex; + actor->objectSlot = objectSlot; } actor->init = actorInit->init; @@ -3155,7 +3155,7 @@ s16 func_80032D60(s16* arg0, s16 arg1, s16 arg2, s16 arg3) { void BodyBreak_Alloc(BodyBreak* bodyBreak, s32 count, PlayState* play) { u32 matricesSize; u32 dListsSize; - u32 objectIdsSize; + u32 objectSlotsSize; matricesSize = (count + 1) * sizeof(*bodyBreak->matrices); bodyBreak->matrices = ZeldaArena_MallocDebug(matricesSize, "../z_actor.c", 7540); @@ -3165,13 +3165,13 @@ void BodyBreak_Alloc(BodyBreak* bodyBreak, s32 count, PlayState* play) { bodyBreak->dLists = ZeldaArena_MallocDebug(dListsSize, "../z_actor.c", 7543); if (bodyBreak->dLists != NULL) { - objectIdsSize = (count + 1) * sizeof(*bodyBreak->objectIds); - bodyBreak->objectIds = ZeldaArena_MallocDebug(objectIdsSize, "../z_actor.c", 7546); + objectSlotsSize = (count + 1) * sizeof(*bodyBreak->objectSlots); + bodyBreak->objectSlots = ZeldaArena_MallocDebug(objectSlotsSize, "../z_actor.c", 7546); - if (bodyBreak->objectIds != NULL) { + if (bodyBreak->objectSlots != NULL) { Lib_MemSet((u8*)bodyBreak->matrices, matricesSize, 0); Lib_MemSet((u8*)bodyBreak->dLists, dListsSize, 0); - Lib_MemSet((u8*)bodyBreak->objectIds, objectIdsSize, 0); + Lib_MemSet((u8*)bodyBreak->objectSlots, objectSlotsSize, 0); bodyBreak->val = 1; return; } @@ -3186,20 +3186,20 @@ void BodyBreak_Alloc(BodyBreak* bodyBreak, s32 count, PlayState* play) { ZeldaArena_FreeDebug(bodyBreak->dLists, "../z_actor.c", 7561); } - if (bodyBreak->objectIds != NULL) { - ZeldaArena_FreeDebug(bodyBreak->objectIds, "../z_actor.c", 7564); + if (bodyBreak->objectSlots != NULL) { + ZeldaArena_FreeDebug(bodyBreak->objectSlots, "../z_actor.c", 7564); } } void BodyBreak_SetInfo(BodyBreak* bodyBreak, s32 limbIndex, s32 minLimbIndex, s32 maxLimbIndex, u32 count, Gfx** dList, - s16 objectId) { + s16 objectSlot) { PlayState* play = Effect_GetPlayState(); if ((play->actorCtx.freezeFlashTimer == 0) && (bodyBreak->val > 0)) { if ((limbIndex >= minLimbIndex) && (limbIndex <= maxLimbIndex) && (*dList != NULL)) { bodyBreak->dLists[bodyBreak->val] = *dList; Matrix_Get(&bodyBreak->matrices[bodyBreak->val]); - bodyBreak->objectIds[bodyBreak->val] = objectId; + bodyBreak->objectSlots[bodyBreak->val] = objectSlot; bodyBreak->val++; } @@ -3219,7 +3219,7 @@ void BodyBreak_SetInfo(BodyBreak* bodyBreak, s32 limbIndex, s32 minLimbIndex, s3 s32 BodyBreak_SpawnParts(Actor* actor, BodyBreak* bodyBreak, PlayState* play, s16 type) { EnPart* spawnedEnPart; MtxF* mtx; - s16 objBankIndex; + s16 objectSlot; if (bodyBreak->val != BODYBREAK_STATUS_READY) { return false; @@ -3231,17 +3231,17 @@ s32 BodyBreak_SpawnParts(Actor* actor, BodyBreak* bodyBreak, PlayState* play, s1 Matrix_Get(&bodyBreak->matrices[bodyBreak->count]); if (1) { - if (bodyBreak->objectIds[bodyBreak->count] >= 0) { - objBankIndex = bodyBreak->objectIds[bodyBreak->count]; + if (bodyBreak->objectSlots[bodyBreak->count] > BODYBREAK_OBJECT_SLOT_DEFAULT) { + objectSlot = bodyBreak->objectSlots[bodyBreak->count]; } else { - objBankIndex = actor->objBankIndex; + objectSlot = actor->objectSlot; } } mtx = &bodyBreak->matrices[bodyBreak->count]; spawnedEnPart = (EnPart*)Actor_SpawnAsChild(&play->actorCtx, actor, play, ACTOR_EN_PART, mtx->xw, mtx->yw, - mtx->zw, 0, 0, objBankIndex, type); + mtx->zw, 0, 0, objectSlot, type); if (spawnedEnPart != NULL) { Matrix_MtxFToYXZRotS(&bodyBreak->matrices[bodyBreak->count], &spawnedEnPart->actor.shape.rot, 0); @@ -3256,7 +3256,7 @@ s32 BodyBreak_SpawnParts(Actor* actor, BodyBreak* bodyBreak, PlayState* play, s1 ZeldaArena_FreeDebug(bodyBreak->matrices, "../z_actor.c", 7678); ZeldaArena_FreeDebug(bodyBreak->dLists, "../z_actor.c", 7679); - ZeldaArena_FreeDebug(bodyBreak->objectIds, "../z_actor.c", 7680); + ZeldaArena_FreeDebug(bodyBreak->objectSlots, "../z_actor.c", 7680); return true; } @@ -4329,7 +4329,7 @@ Actor* func_800358DC(Actor* actor, Vec3f* spawnPos, Vec3s* spawnRot, f32* arg3, EnPart* spawnedEnPart; spawnedEnPart = (EnPart*)Actor_SpawnAsChild(&play->actorCtx, actor, play, ACTOR_EN_PART, spawnPos->x, spawnPos->y, - spawnPos->z, spawnRot->x, spawnRot->y, actor->objBankIndex, params); + spawnPos->z, spawnRot->x, spawnRot->y, actor->objectSlot, params); if (spawnedEnPart != NULL) { spawnedEnPart->actor.scale = actor->scale; spawnedEnPart->actor.speed = arg3[0]; diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c index f2d7d0a54..253996b62 100644 --- a/src/code/z_effect_soft_sprite_old_init.c +++ b/src/code/z_effect_soft_sprite_old_init.c @@ -49,7 +49,7 @@ void EffectSs_DrawGEffect(PlayState* play, EffectSs* this, void* texture) { MtxF mfTransBillboard; s32 pad1; Mtx* mtx; - void* object = play->objectCtx.status[this->rgObjBankIdx].segment; + void* objectPtr = play->objectCtx.slots[this->rgObjectSlot].segment; OPEN_DISPS(gfxCtx, "../z_effect_soft_sprite_old_init.c", 196); @@ -58,8 +58,8 @@ void EffectSs_DrawGEffect(PlayState* play, EffectSs* this, void* texture) { SkinMatrix_SetScale(&mfScale, scale, scale, scale); SkinMatrix_MtxFMtxFMult(&mfTrans, &play->billboardMtxF, &mfTransBillboard); SkinMatrix_MtxFMtxFMult(&mfTransBillboard, &mfScale, &mfResult); - gSegments[6] = VIRTUAL_TO_PHYSICAL(object); - gSPSegment(POLY_XLU_DISP++, 0x06, object); + gSegments[6] = VIRTUAL_TO_PHYSICAL(objectPtr); + gSPSegment(POLY_XLU_DISP++, 0x06, objectPtr); mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult); diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c index 2755c0565..b7b9e79cd 100644 --- a/src/code/z_en_item00.c +++ b/src/code/z_en_item00.c @@ -236,7 +236,7 @@ void EnItem00_Init(Actor* thisx, PlayState* play) { this->scale = 0.01f; break; case ITEM00_SHIELD_DEKU: - this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_SHIELD_1); + this->actor.objectSlot = Object_GetSlot(&play->objectCtx, OBJECT_GI_SHIELD_1); Actor_SetObjectDependency(play, &this->actor); Actor_SetScale(&this->actor, 0.5f); this->scale = 0.5f; @@ -245,7 +245,7 @@ void EnItem00_Init(Actor* thisx, PlayState* play) { this->actor.world.rot.x = 0x4000; break; case ITEM00_SHIELD_HYLIAN: - this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_SHIELD_2); + this->actor.objectSlot = Object_GetSlot(&play->objectCtx, OBJECT_GI_SHIELD_2); Actor_SetObjectDependency(play, &this->actor); Actor_SetScale(&this->actor, 0.5f); this->scale = 0.5f; @@ -255,7 +255,7 @@ void EnItem00_Init(Actor* thisx, PlayState* play) { break; case ITEM00_TUNIC_ZORA: case ITEM00_TUNIC_GORON: - this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_CLOTHES); + this->actor.objectSlot = Object_GetSlot(&play->objectCtx, OBJECT_GI_CLOTHES); Actor_SetObjectDependency(play, &this->actor); Actor_SetScale(&this->actor, 0.5f); this->scale = 0.5f; @@ -765,10 +765,10 @@ void EnItem00_Draw(Actor* thisx, PlayState* play) { case ITEM00_RECOVERY_HEART: if (this->despawnTimer < 0) { if (this->despawnTimer == -1) { - s8 bankIndex = Object_GetIndex(&play->objectCtx, OBJECT_GI_HEART); + s8 objectSlot = Object_GetSlot(&play->objectCtx, OBJECT_GI_HEART); - if (Object_IsLoaded(&play->objectCtx, bankIndex)) { - this->actor.objBankIndex = bankIndex; + if (Object_IsLoaded(&play->objectCtx, objectSlot)) { + this->actor.objectSlot = objectSlot; Actor_SetObjectDependency(play, &this->actor); this->despawnTimer = -2; } diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c index 0cd66f64d..6fffcaf97 100644 --- a/src/code/z_kankyo.c +++ b/src/code/z_kankyo.c @@ -432,7 +432,7 @@ void Environment_Init(PlayState* play2, EnvironmentContext* envCtx, s32 unused) play->csCtx.actorCues[i] = NULL; } - if (Object_GetIndex(&play->objectCtx, OBJECT_GAMEPLAY_FIELD_KEEP) < 0 && !play->envCtx.sunMoonDisabled) { + if (Object_GetSlot(&play->objectCtx, OBJECT_GAMEPLAY_FIELD_KEEP) < 0 && !play->envCtx.sunMoonDisabled) { play->envCtx.sunMoonDisabled = true; // "Sun setting other than field keep! So forced release!" osSyncPrintf(VT_COL(YELLOW, BLACK) "\n\nフィールド常駐以外、太陽設定!よって強制解除!\n" VT_RST); diff --git a/src/code/z_play.c b/src/code/z_play.c index c4d891548..2ece8f970 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -482,8 +482,8 @@ void Play_Update(PlayState* this) { ActorOverlayTable_LogPrint(); } - gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.mainKeepIndex].segment); - gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.subKeepIndex].segment); + gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); + gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); gSegments[2] = VIRTUAL_TO_PHYSICAL(this->sceneSegment); if (FrameAdvance_Update(&this->frameAdvCtx, &input[1])) { @@ -855,7 +855,7 @@ void Play_Update(PlayState* this) { AnimationContext_Reset(&this->animationCtx); PLAY_LOG(3561); - Object_UpdateBank(&this->objectCtx); + Object_UpdateEntries(&this->objectCtx); PLAY_LOG(3577); @@ -1035,21 +1035,21 @@ void Play_Draw(PlayState* this) { OPEN_DISPS(gfxCtx, "../z_play.c", 3907); - gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.mainKeepIndex].segment); - gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.subKeepIndex].segment); + gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); + gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); gSegments[2] = VIRTUAL_TO_PHYSICAL(this->sceneSegment); gSPSegment(POLY_OPA_DISP++, 0x00, NULL); gSPSegment(POLY_XLU_DISP++, 0x00, NULL); gSPSegment(OVERLAY_DISP++, 0x00, NULL); - gSPSegment(POLY_OPA_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment); - gSPSegment(POLY_XLU_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment); - gSPSegment(OVERLAY_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x04, this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); + gSPSegment(POLY_XLU_DISP++, 0x04, this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); + gSPSegment(OVERLAY_DISP++, 0x04, this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); - gSPSegment(POLY_OPA_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment); - gSPSegment(POLY_XLU_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment); - gSPSegment(OVERLAY_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment); + gSPSegment(POLY_OPA_DISP++, 0x05, this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); + gSPSegment(POLY_XLU_DISP++, 0x05, this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); + gSPSegment(OVERLAY_DISP++, 0x05, this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); gSPSegment(POLY_OPA_DISP++, 0x02, this->sceneSegment); gSPSegment(POLY_XLU_DISP++, 0x02, this->sceneSegment); @@ -1434,7 +1434,7 @@ void Play_InitScene(PlayState* this, s32 spawn) { this->numActorEntries = 0; - Object_InitBank(this, &this->objectCtx); + Object_InitContext(this, &this->objectCtx); LightContext_Init(this, &this->lightCtx); TransitionActor_InitContext(&this->state, &this->transiActorCtx); func_80096FD4(this, &this->roomCtx.curRoom); diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c index ad90fed5a..57fdfd532 100644 --- a/src/code/z_player_lib.c +++ b/src/code/z_player_lib.c @@ -1370,7 +1370,7 @@ void Player_DrawHookshotReticle(PlayState* play, Player* this, f32 arg2) { gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_player_lib.c", 2587), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPSegment(OVERLAY_DISP++, 0x06, play->objectCtx.status[this->actor.objBankIndex].segment); + gSPSegment(OVERLAY_DISP++, 0x06, play->objectCtx.slots[this->actor.objectSlot].segment); gSPDisplayList(OVERLAY_DISP++, gLinkAdultHookshotReticleDL); CLOSE_DISPS(play->state.gfxCtx, "../z_player_lib.c", 2592); diff --git a/src/code/z_scene.c b/src/code/z_scene.c index 7de8b3a22..72d77af17 100644 --- a/src/code/z_scene.c +++ b/src/code/z_scene.c @@ -3,64 +3,77 @@ RomFile sNaviQuestHintFiles[]; -s32 Object_Spawn(ObjectContext* objectCtx, s16 objectId) { +/** + * Spawn an object file of a specified ID that will persist through room changes. + * + * This waits for the file to be fully loaded, the data is available when the function returns. + * + * @return The new object slot corresponding to the requested object ID. + * + * @note This function is not meant to be called externally to spawn object files on the fly. + * When an object is spawned with this function, all objects that come before it in the entry list will be treated as + * persistent, which will likely cause either the amount of free slots or object space memory to run out. + * This function is only meant to be called internally on scene load, before the object list from any room is processed. + */ +s32 Object_SpawnPersistent(ObjectContext* objectCtx, s16 objectId) { u32 size; - objectCtx->status[objectCtx->num].id = objectId; + objectCtx->slots[objectCtx->numEntries].id = objectId; size = gObjectTable[objectId].vromEnd - gObjectTable[objectId].vromStart; - osSyncPrintf("OBJECT[%d] SIZE %fK SEG=%x\n", objectId, size / 1024.0f, objectCtx->status[objectCtx->num].segment); + osSyncPrintf("OBJECT[%d] SIZE %fK SEG=%x\n", objectId, size / 1024.0f, + objectCtx->slots[objectCtx->numEntries].segment); - osSyncPrintf("num=%d adrs=%x end=%x\n", objectCtx->num, (uintptr_t)objectCtx->status[objectCtx->num].segment + size, - objectCtx->spaceEnd); + osSyncPrintf("num=%d adrs=%x end=%x\n", objectCtx->numEntries, + (uintptr_t)objectCtx->slots[objectCtx->numEntries].segment + size, objectCtx->spaceEnd); - ASSERT(((objectCtx->num < OBJECT_EXCHANGE_BANK_MAX) && - (((uintptr_t)objectCtx->status[objectCtx->num].segment + size) < (uintptr_t)objectCtx->spaceEnd)), + ASSERT(((objectCtx->numEntries < ARRAY_COUNT(objectCtx->slots)) && + (((uintptr_t)objectCtx->slots[objectCtx->numEntries].segment + size) < (uintptr_t)objectCtx->spaceEnd)), "this->num < OBJECT_EXCHANGE_BANK_MAX && (this->status[this->num].Segment + size) < this->endSegment", "../z_scene.c", 142); - DmaMgr_RequestSyncDebug(objectCtx->status[objectCtx->num].segment, gObjectTable[objectId].vromStart, size, + DmaMgr_RequestSyncDebug(objectCtx->slots[objectCtx->numEntries].segment, gObjectTable[objectId].vromStart, size, "../z_scene.c", 145); - if (objectCtx->num < OBJECT_EXCHANGE_BANK_MAX - 1) { - objectCtx->status[objectCtx->num + 1].segment = - (void*)ALIGN16((uintptr_t)objectCtx->status[objectCtx->num].segment + size); + if (objectCtx->numEntries < (ARRAY_COUNT(objectCtx->slots) - 1)) { + objectCtx->slots[objectCtx->numEntries + 1].segment = + (void*)ALIGN16((uintptr_t)objectCtx->slots[objectCtx->numEntries].segment + size); } - objectCtx->num++; - objectCtx->unk_09 = objectCtx->num; + objectCtx->numEntries++; + objectCtx->numPersistentEntries = objectCtx->numEntries; - return objectCtx->num - 1; + return objectCtx->numEntries - 1; } -void Object_InitBank(PlayState* play, ObjectContext* objectCtx) { - PlayState* play2 = play; // Needs to be a new variable to match (possibly a sub struct?) +void Object_InitContext(PlayState* play, ObjectContext* objectCtx) { + PlayState* play2 = play; u32 spaceSize; s32 i; if (play2->sceneId == SCENE_HYRULE_FIELD) { - spaceSize = 1024000; + spaceSize = 1000 * 1024; } else if (play2->sceneId == SCENE_GANON_BOSS) { if (gSaveContext.sceneLayer != 4) { - spaceSize = 1177600; + spaceSize = 1150 * 1024; } else { - spaceSize = 1024000; + spaceSize = 1000 * 1024; } } else if (play2->sceneId == SCENE_SPIRIT_TEMPLE_BOSS) { - spaceSize = 1075200; + spaceSize = 1050 * 1024; } else if (play2->sceneId == SCENE_CHAMBER_OF_THE_SAGES) { - spaceSize = 1075200; + spaceSize = 1050 * 1024; } else if (play2->sceneId == SCENE_GANONDORF_BOSS) { - spaceSize = 1075200; + spaceSize = 1050 * 1024; } else { - spaceSize = 1024000; + spaceSize = 1000 * 1024; } - objectCtx->num = objectCtx->unk_09 = 0; - objectCtx->mainKeepIndex = objectCtx->subKeepIndex = 0; + objectCtx->numEntries = objectCtx->numPersistentEntries = 0; + objectCtx->mainKeepSlot = objectCtx->subKeepSlot = 0; - for (i = 0; i < OBJECT_EXCHANGE_BANK_MAX; i++) { - objectCtx->status[i].id = OBJECT_INVALID; + for (i = 0; i < ARRAY_COUNT(objectCtx->slots); i++) { + objectCtx->slots[i].id = OBJECT_INVALID; } osSyncPrintf(VT_FGCOL(GREEN)); @@ -68,42 +81,43 @@ void Object_InitBank(PlayState* play, ObjectContext* objectCtx) { osSyncPrintf("オブジェクト入れ替えバンク情報 %8.3fKB\n", spaceSize / 1024.0f); osSyncPrintf(VT_RST); - objectCtx->spaceStart = objectCtx->status[0].segment = - GameState_Alloc(&play->state, spaceSize, "../z_scene.c", 219); + objectCtx->spaceStart = objectCtx->slots[0].segment = GameState_Alloc(&play->state, spaceSize, "../z_scene.c", 219); objectCtx->spaceEnd = (void*)((uintptr_t)objectCtx->spaceStart + spaceSize); - objectCtx->mainKeepIndex = Object_Spawn(objectCtx, OBJECT_GAMEPLAY_KEEP); - gSegments[4] = VIRTUAL_TO_PHYSICAL(objectCtx->status[objectCtx->mainKeepIndex].segment); + objectCtx->mainKeepSlot = Object_SpawnPersistent(objectCtx, OBJECT_GAMEPLAY_KEEP); + gSegments[4] = VIRTUAL_TO_PHYSICAL(objectCtx->slots[objectCtx->mainKeepSlot].segment); } -void Object_UpdateBank(ObjectContext* objectCtx) { +void Object_UpdateEntries(ObjectContext* objectCtx) { s32 i; - ObjectStatus* status = &objectCtx->status[0]; + ObjectEntry* entry = &objectCtx->slots[0]; RomFile* objectFile; u32 size; - for (i = 0; i < objectCtx->num; i++) { - if (status->id < 0) { - if (status->dmaRequest.vromAddr == 0) { - osCreateMesgQueue(&status->loadQueue, &status->loadMsg, 1); - objectFile = &gObjectTable[-status->id]; + for (i = 0; i < objectCtx->numEntries; i++) { + if (entry->id < 0) { + if (entry->dmaRequest.vromAddr == 0) { + osCreateMesgQueue(&entry->loadQueue, &entry->loadMsg, 1); + objectFile = &gObjectTable[-entry->id]; size = objectFile->vromEnd - objectFile->vromStart; - osSyncPrintf("OBJECT EXCHANGE BANK-%2d SIZE %8.3fK SEG=%08x\n", i, size / 1024.0f, status->segment); - DmaMgr_RequestAsync(&status->dmaRequest, status->segment, objectFile->vromStart, size, 0, - &status->loadQueue, NULL, "../z_scene.c", 266); - } else if (osRecvMesg(&status->loadQueue, NULL, OS_MESG_NOBLOCK) == 0) { - status->id = -status->id; + + osSyncPrintf("OBJECT EXCHANGE BANK-%2d SIZE %8.3fK SEG=%08x\n", i, size / 1024.0f, entry->segment); + + DmaMgr_RequestAsync(&entry->dmaRequest, entry->segment, objectFile->vromStart, size, 0, + &entry->loadQueue, NULL, "../z_scene.c", 266); + } else if (osRecvMesg(&entry->loadQueue, NULL, OS_MESG_NOBLOCK) == 0) { + entry->id = -entry->id; } } - status++; + entry++; } } -s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId) { +s32 Object_GetSlot(ObjectContext* objectCtx, s16 objectId) { s32 i; - for (i = 0; i < objectCtx->num; i++) { - if (ABS(objectCtx->status[i].id) == objectId) { + for (i = 0; i < objectCtx->numEntries; i++) { + if (ABS(objectCtx->slots[i].id) == objectId) { return i; } } @@ -111,8 +125,8 @@ s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId) { return -1; } -s32 Object_IsLoaded(ObjectContext* objectCtx, s32 bankIndex) { - if (objectCtx->status[bankIndex].id > 0) { +s32 Object_IsLoaded(ObjectContext* objectCtx, s32 slot) { + if (objectCtx->slots[slot].id > 0) { return true; } else { return false; @@ -124,30 +138,30 @@ void func_800981B8(ObjectContext* objectCtx) { s32 id; u32 size; - for (i = 0; i < objectCtx->num; i++) { - id = objectCtx->status[i].id; + for (i = 0; i < objectCtx->numEntries; i++) { + id = objectCtx->slots[i].id; size = gObjectTable[id].vromEnd - gObjectTable[id].vromStart; - osSyncPrintf("OBJECT[%d] SIZE %fK SEG=%x\n", objectCtx->status[i].id, size / 1024.0f, - objectCtx->status[i].segment); - osSyncPrintf("num=%d adrs=%x end=%x\n", objectCtx->num, (uintptr_t)objectCtx->status[i].segment + size, + osSyncPrintf("OBJECT[%d] SIZE %fK SEG=%x\n", objectCtx->slots[i].id, size / 1024.0f, + objectCtx->slots[i].segment); + osSyncPrintf("num=%d adrs=%x end=%x\n", objectCtx->numEntries, (uintptr_t)objectCtx->slots[i].segment + size, objectCtx->spaceEnd); - DmaMgr_RequestSyncDebug(objectCtx->status[i].segment, gObjectTable[id].vromStart, size, "../z_scene.c", 342); + DmaMgr_RequestSyncDebug(objectCtx->slots[i].segment, gObjectTable[id].vromStart, size, "../z_scene.c", 342); } } -void* func_800982FC(ObjectContext* objectCtx, s32 bankIndex, s16 objectId) { - ObjectStatus* status = &objectCtx->status[bankIndex]; +void* func_800982FC(ObjectContext* objectCtx, s32 slot, s16 objectId) { + ObjectEntry* entry = &objectCtx->slots[slot]; RomFile* objectFile = &gObjectTable[objectId]; u32 size; void* nextPtr; - status->id = -objectId; - status->dmaRequest.vromAddr = 0; + entry->id = -objectId; + entry->dmaRequest.vromAddr = 0; size = objectFile->vromEnd - objectFile->vromStart; - osSyncPrintf("OBJECT EXCHANGE NO=%2d BANK=%3d SIZE=%8.3fK\n", bankIndex, objectId, size / 1024.0f); + osSyncPrintf("OBJECT EXCHANGE NO=%2d BANK=%3d SIZE=%8.3fK\n", slot, objectId, size / 1024.0f); - nextPtr = (void*)ALIGN16((uintptr_t)status->segment + size); + nextPtr = (void*)ALIGN16((uintptr_t)entry->segment + size); ASSERT(nextPtr < objectCtx->spaceEnd, "nextptr < this->endSegment", "../z_scene.c", 381); @@ -191,7 +205,7 @@ void Scene_CommandPlayerEntryList(PlayState* play, SceneCmd* cmd) { linkObjectId = gLinkObjectIds[((void)0, gSaveContext.save.linkAge)]; gActorOverlayTable[playerEntry->id].initInfo->objectId = linkObjectId; - Object_Spawn(&play->objectCtx, linkObjectId); + Object_SpawnPersistent(&play->objectCtx, linkObjectId); } void Scene_CommandActorEntryList(PlayState* play, SceneCmd* cmd) { @@ -226,8 +240,8 @@ void Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) { void Scene_CommandSpecialFiles(PlayState* play, SceneCmd* cmd) { if (cmd->specialFiles.keepObjectId != OBJECT_INVALID) { - play->objectCtx.subKeepIndex = Object_Spawn(&play->objectCtx, cmd->specialFiles.keepObjectId); - gSegments[5] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[play->objectCtx.subKeepIndex].segment); + play->objectCtx.subKeepSlot = Object_SpawnPersistent(&play->objectCtx, cmd->specialFiles.keepObjectId); + gSegments[5] = VIRTUAL_TO_PHYSICAL(play->objectCtx.slots[play->objectCtx.subKeepSlot].segment); } if (cmd->specialFiles.naviQuestHintFileId != NAVI_QUEST_HINTS_NONE) { @@ -250,25 +264,27 @@ void Scene_CommandObjectList(PlayState* play, SceneCmd* cmd) { s32 i; s32 j; s32 k; - ObjectStatus* status; - ObjectStatus* status2; - ObjectStatus* firstStatus; - s16* objectEntry = SEGMENTED_TO_VIRTUAL(cmd->objectList.data); + ObjectEntry* entry; + ObjectEntry* invalidatedEntry; + ObjectEntry* entries; + s16* objectListEntry = SEGMENTED_TO_VIRTUAL(cmd->objectList.data); void* nextPtr; k = 0; - i = play->objectCtx.unk_09; - firstStatus = &play->objectCtx.status[0]; - status = &play->objectCtx.status[i]; - - while (i < play->objectCtx.num) { - if (status->id != *objectEntry) { - status2 = &play->objectCtx.status[i]; - for (j = i; j < play->objectCtx.num; j++) { - status2->id = OBJECT_INVALID; - status2++; + i = play->objectCtx.numPersistentEntries; + entries = play->objectCtx.slots; + entry = &play->objectCtx.slots[i]; + + while (i < play->objectCtx.numEntries) { + if (entry->id != *objectListEntry) { + + invalidatedEntry = &play->objectCtx.slots[i]; + for (j = i; j < play->objectCtx.numEntries; j++) { + invalidatedEntry->id = OBJECT_INVALID; + invalidatedEntry++; } - play->objectCtx.num = i; + + play->objectCtx.numEntries = i; Actor_KillAllWithMissingObject(play, &play->actorCtx); continue; @@ -276,24 +292,24 @@ void Scene_CommandObjectList(PlayState* play, SceneCmd* cmd) { i++; k++; - objectEntry++; - status++; + objectListEntry++; + entry++; } - ASSERT(cmd->objectList.length <= OBJECT_EXCHANGE_BANK_MAX, + ASSERT(cmd->objectList.length <= ARRAY_COUNT(play->objectCtx.slots), "scene_info->object_bank.num <= OBJECT_EXCHANGE_BANK_MAX", "../z_scene.c", 705); while (k < cmd->objectList.length) { - nextPtr = func_800982FC(&play->objectCtx, i, *objectEntry); - if (i < OBJECT_EXCHANGE_BANK_MAX - 1) { - firstStatus[i + 1].segment = nextPtr; + nextPtr = func_800982FC(&play->objectCtx, i, *objectListEntry); + if (i < (ARRAY_COUNT(play->objectCtx.slots) - 1)) { + entries[i + 1].segment = nextPtr; } i++; k++; - objectEntry++; + objectListEntry++; } - play->objectCtx.num = i; + play->objectCtx.numEntries = i; } void Scene_CommandLightList(PlayState* play, SceneCmd* cmd) { -- cgit v1.2.3