From 06ceb8e661a17ed1383189148ce97acf2140fa48 Mon Sep 17 00:00:00 2001 From: cadmic Date: Sun, 8 Dec 2024 13:52:48 -0800 Subject: Use MM names for some unnamed code files (#2312) --- src/code/code_800430A0.c | 119 ------------------ src/code/code_80043480.c | 118 ------------------ src/code/code_8006C3A0.c | 33 ----- src/code/code_80097A00.c | 315 ----------------------------------------------- src/code/z_bg_collect.c | 119 ++++++++++++++++++ src/code/z_bg_item.c | 118 ++++++++++++++++++ src/code/z_env_flags.c | 33 +++++ src/code/z_inventory.c | 315 +++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 585 insertions(+), 585 deletions(-) delete mode 100644 src/code/code_800430A0.c delete mode 100644 src/code/code_80043480.c delete mode 100644 src/code/code_8006C3A0.c delete mode 100644 src/code/code_80097A00.c create mode 100644 src/code/z_bg_collect.c create mode 100644 src/code/z_bg_item.c create mode 100644 src/code/z_env_flags.c create mode 100644 src/code/z_inventory.c (limited to 'src/code') diff --git a/src/code/code_800430A0.c b/src/code/code_800430A0.c deleted file mode 100644 index 2bdfc6bcd..000000000 --- a/src/code/code_800430A0.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "global.h" -#include "terminal.h" - -/** - * Update the `carriedActor`'s position based on the dynapoly actor identified by `bgId`. - */ -void DynaPolyActor_UpdateCarriedActorPos(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) { - MtxF prevTransform; - MtxF prevTransformInv; - MtxF curTransform; - Vec3f pos; - Vec3f tempPos; - - if (DynaPoly_IsBgIdBgActor(bgId)) { - - SkinMatrix_SetTranslateRotateYXZScale( - &prevTransform, colCtx->dyna.bgActors[bgId].prevTransform.scale.x, - colCtx->dyna.bgActors[bgId].prevTransform.scale.y, colCtx->dyna.bgActors[bgId].prevTransform.scale.z, - colCtx->dyna.bgActors[bgId].prevTransform.rot.x, colCtx->dyna.bgActors[bgId].prevTransform.rot.y, - colCtx->dyna.bgActors[bgId].prevTransform.rot.z, colCtx->dyna.bgActors[bgId].prevTransform.pos.x, - colCtx->dyna.bgActors[bgId].prevTransform.pos.y, colCtx->dyna.bgActors[bgId].prevTransform.pos.z); - - if (SkinMatrix_Invert(&prevTransform, &prevTransformInv) != 2) { - - SkinMatrix_SetTranslateRotateYXZScale( - &curTransform, colCtx->dyna.bgActors[bgId].curTransform.scale.x, - colCtx->dyna.bgActors[bgId].curTransform.scale.y, colCtx->dyna.bgActors[bgId].curTransform.scale.z, - colCtx->dyna.bgActors[bgId].curTransform.rot.x, colCtx->dyna.bgActors[bgId].curTransform.rot.y, - colCtx->dyna.bgActors[bgId].curTransform.rot.z, colCtx->dyna.bgActors[bgId].curTransform.pos.x, - colCtx->dyna.bgActors[bgId].curTransform.pos.y, colCtx->dyna.bgActors[bgId].curTransform.pos.z); - - // Apply the movement of the dynapoly actor `bgId` over the last frame to the `carriedActor` position - // pos = curTransform * prevTransformInv * pos - // Note (curTransform * prevTransformInv) represents the transform relative to the previous frame - SkinMatrix_Vec3fMtxFMultXYZ(&prevTransformInv, &carriedActor->world.pos, &tempPos); - SkinMatrix_Vec3fMtxFMultXYZ(&curTransform, &tempPos, &pos); - carriedActor->world.pos = pos; - -#if DEBUG_FEATURES - if (BGCHECK_XYZ_ABSMAX <= pos.x || pos.x <= -BGCHECK_XYZ_ABSMAX || BGCHECK_XYZ_ABSMAX <= pos.y || - pos.y <= -BGCHECK_XYZ_ABSMAX || BGCHECK_XYZ_ABSMAX <= pos.z || pos.z <= -BGCHECK_XYZ_ABSMAX) { - - PRINTF(VT_FGCOL(RED)); - //! @bug file and line are not passed to PRINTF - PRINTF(T("BGCheckCollection_typicalActorPos():位置が妥当ではありません。\n" - "pos (%f,%f,%f) file:%s line:%d\n", - "BGCheckCollection_typicalActorPos(): Position is not valid. \n" - "pos (%f,%f,%f) file:%s line:%d\n"), - pos.x, pos.y, pos.z); - PRINTF(VT_RST); - } -#endif - } - } -} - -/** - * Update the `carriedActor`'s Y rotation based on the dynapoly actor identified by `bgId`. - */ -void DynaPolyActor_UpdateCarriedActorRotY(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) { - if (DynaPoly_IsBgIdBgActor(bgId)) { - s16 rotY = colCtx->dyna.bgActors[bgId].curTransform.rot.y - colCtx->dyna.bgActors[bgId].prevTransform.rot.y; - - if (carriedActor->id == ACTOR_PLAYER) { - ((Player*)carriedActor)->yaw += rotY; - } - - carriedActor->shape.rot.y += rotY; - carriedActor->world.rot.y += rotY; - } -} - -void func_80043334(CollisionContext* colCtx, Actor* actor, s32 bgId) { - if (DynaPoly_IsBgIdBgActor(bgId)) { - DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, bgId); - if (dynaActor != NULL) { - DynaPolyActor_SetActorOnTop(dynaActor); - - if (CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_CAN_PRESS_SWITCHES)) { - DynaPolyActor_SetSwitchPressed(dynaActor); - } - } - } -} - -/** - * Update the `carriedActor`'s position and Y rotation based on the dynapoly actor identified by `bgId`, according to - * the dynapoly actor's move flags (see `DYNA_TRANSFORM_POS` and `DYNA_TRANSFORM_ROT_Y`). - */ -s32 DynaPolyActor_TransformCarriedActor(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) { - s32 result = false; - DynaPolyActor* dynaActor; - - if (!DynaPoly_IsBgIdBgActor(bgId)) { - return false; - } - - if ((colCtx->dyna.bgActorFlags[bgId] & BGACTOR_1) || !(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE)) { - return false; - } - - dynaActor = DynaPoly_GetActor(colCtx, bgId); - - if (dynaActor == NULL) { - return false; - } - - if (dynaActor->transformFlags & DYNA_TRANSFORM_POS) { - DynaPolyActor_UpdateCarriedActorPos(colCtx, bgId, carriedActor); - result = true; - } - - if (dynaActor->transformFlags & DYNA_TRANSFORM_ROT_Y) { - DynaPolyActor_UpdateCarriedActorRotY(colCtx, bgId, carriedActor); - result = true; - } - - return result; -} diff --git a/src/code/code_80043480.c b/src/code/code_80043480.c deleted file mode 100644 index 1a4d9f58d..000000000 --- a/src/code/code_80043480.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "global.h" - -/** - * @param transformFlags How other actors standing on the dynapoly actor's collision move when the dynapoly actor moves. - * See `DYNA_TRANSFORM_POS`, `DYNA_TRANSFORM_ROT_Y`. - */ -void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 transformFlags) { - dynaActor->bgId = -1; - dynaActor->unk_150 = 0.0f; - dynaActor->unk_154 = 0.0f; - dynaActor->transformFlags = transformFlags; - dynaActor->interactFlags = 0; -} - -void DynaPolyActor_UnsetAllInteractFlags(DynaPolyActor* dynaActor) { - dynaActor->interactFlags = 0; -} - -void DynaPolyActor_SetActorOnTop(DynaPolyActor* dynaActor) { - dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_TOP; -} - -void DynaPolyActor_SetPlayerOnTop(DynaPolyActor* dynaActor) { - dynaActor->interactFlags |= DYNA_INTERACT_PLAYER_ON_TOP; -} - -void DynaPoly_SetPlayerOnTop(CollisionContext* colCtx, s32 floorBgId) { - DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, floorBgId); - - if (dynaActor != NULL) { - DynaPolyActor_SetPlayerOnTop(dynaActor); - } -} - -void DynaPolyActor_SetPlayerAbove(DynaPolyActor* dynaActor) { - dynaActor->interactFlags |= DYNA_INTERACT_PLAYER_ABOVE; -} - -void DynaPoly_SetPlayerAbove(CollisionContext* colCtx, s32 floorBgId) { - DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, floorBgId); - - if (dynaActor != NULL) { - DynaPolyActor_SetPlayerAbove(dynaActor); - } -} - -void DynaPolyActor_SetSwitchPressed(DynaPolyActor* dynaActor) { - dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_SWITCH_PRESSED; -} - -s32 DynaPolyActor_IsActorOnTop(DynaPolyActor* dynaActor) { - if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_TOP) { - return true; - } else { - return false; - } -} - -s32 DynaPolyActor_IsPlayerOnTop(DynaPolyActor* dynaActor) { - if (dynaActor->interactFlags & DYNA_INTERACT_PLAYER_ON_TOP) { - return true; - } else { - return false; - } -} - -s32 DynaPolyActor_IsPlayerAbove(DynaPolyActor* dynaActor) { - if (dynaActor->interactFlags & DYNA_INTERACT_PLAYER_ABOVE) { - return true; - } else { - return false; - } -} - -s32 DynaPolyActor_IsSwitchPressed(DynaPolyActor* dynaActor) { - if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_SWITCH_PRESSED) { - return true; - } else { - return false; - } -} - -s32 func_800435D8(PlayState* play, DynaPolyActor* dynaActor, s16 arg2, s16 arg3, s16 arg4) { - Vec3f posA; - Vec3f posB; - Vec3f posResult; - f32 sin = Math_SinS(dynaActor->unk_158); - f32 cos = Math_CosS(dynaActor->unk_158); - s32 bgId; - CollisionPoly* poly; - f32 a2; - f32 a3; - f32 sign = (0.0f <= dynaActor->unk_150) ? 1.0f : -1.0f; - - a2 = (f32)arg2 - 0.1f; - posA.x = dynaActor->actor.world.pos.x + (a2 * cos); - posA.y = dynaActor->actor.world.pos.y + arg4; - posA.z = dynaActor->actor.world.pos.z - (a2 * sin); - - a3 = (f32)arg3 - 0.1f; - posB.x = sign * a3 * sin + posA.x; - posB.y = posA.y; - posB.z = sign * a3 * cos + posA.z; - - if (BgCheck_EntityLineTest3(&play->colCtx, &posA, &posB, &posResult, &poly, true, false, false, true, &bgId, - &dynaActor->actor, 0.0f)) { - return false; - } - posA.x = (dynaActor->actor.world.pos.x * 2) - posA.x; - posA.z = (dynaActor->actor.world.pos.z * 2) - posA.z; - posB.x = sign * a3 * sin + posA.x; - posB.z = sign * a3 * cos + posA.z; - if (BgCheck_EntityLineTest3(&play->colCtx, &posA, &posB, &posResult, &poly, true, false, false, true, &bgId, - &dynaActor->actor, 0.0f)) { - return false; - } - return true; -} diff --git a/src/code/code_8006C3A0.c b/src/code/code_8006C3A0.c deleted file mode 100644 index 0057128e2..000000000 --- a/src/code/code_8006C3A0.c +++ /dev/null @@ -1,33 +0,0 @@ -#include "global.h" - -void CutsceneFlags_UnsetAll(PlayState* play) { - u8 i; - - for (i = 0; i < ARRAY_COUNT(play->cutsceneFlags); i++) { - play->cutsceneFlags[i] = 0; - } -} - -void CutsceneFlags_Set(PlayState* play, s16 flag) { - s16 index = flag / 16; - s16 bit = flag % 16; - s16 mask = 1 << bit; - - play->cutsceneFlags[index] |= mask; -} - -void CutsceneFlags_Unset(PlayState* play, s16 flag) { - s16 index = flag / 16; - s16 bit = flag % 16; - s16 mask = (1 << bit) ^ 0xFFFF; - - play->cutsceneFlags[index] &= mask; -} - -s32 CutsceneFlags_Get(PlayState* play, s16 flag) { - s16 index = flag / 16; - s16 bit = flag % 16; - s16 mask = 1 << bit; - - return play->cutsceneFlags[index] & mask; -} diff --git a/src/code/code_80097A00.c b/src/code/code_80097A00.c deleted file mode 100644 index b452a92e1..000000000 --- a/src/code/code_80097A00.c +++ /dev/null @@ -1,315 +0,0 @@ -#include "global.h" -#include "assets/textures/icon_item_static/icon_item_static.h" -#include "assets/textures/icon_item_24_static/icon_item_24_static.h" -#include "assets/textures/parameter_static/parameter_static.h" - -// Bit Flag array in which gBitFlags[n] is literally (1 << n) -u32 gBitFlags[] = { - (1 << 0), (1 << 1), (1 << 2), (1 << 3), (1 << 4), (1 << 5), (1 << 6), (1 << 7), - (1 << 8), (1 << 9), (1 << 10), (1 << 11), (1 << 12), (1 << 13), (1 << 14), (1 << 15), - (1 << 16), (1 << 17), (1 << 18), (1 << 19), (1 << 20), (1 << 21), (1 << 22), (1 << 23), - (1 << 24), (1 << 25), (1 << 26), (1 << 27), (1 << 28), (1 << 29), (1 << 30), (1 << 31), -}; - -u16 gEquipMasks[EQUIP_TYPE_MAX] = { - 0xF << (EQUIP_TYPE_SWORD * 4), // EQUIP_TYPE_SWORD - 0xF << (EQUIP_TYPE_SHIELD * 4), // EQUIP_TYPE_SHIELD - 0xF << (EQUIP_TYPE_TUNIC * 4), // EQUIP_TYPE_TUNIC - 0xF << (EQUIP_TYPE_BOOTS * 4), // EQUIP_TYPE_BOOTS -}; -u16 gEquipNegMasks[EQUIP_TYPE_MAX] = { - (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)), // EQUIP_TYPE_SWORD - (u16) ~(0xF << (EQUIP_TYPE_SHIELD * 4)), // EQUIP_TYPE_SHIELD - (u16) ~(0xF << (EQUIP_TYPE_TUNIC * 4)), // EQUIP_TYPE_TUNIC - (u16) ~(0xF << (EQUIP_TYPE_BOOTS * 4)), // EQUIP_TYPE_BOOTS -}; - -u32 gUpgradeMasks[UPG_MAX] = { - 0x00000007, // UPG_QUIVER - 0x00000038, // UPG_BOMB_BAG - 0x000001C0, // UPG_STRENGTH - 0x00000E00, // UPG_SCALE - 0x00003000, // UPG_WALLET - 0x0001C000, // UPG_BULLET_BAG - 0x000E0000, // UPG_DEKU_STICKS - 0x00700000, // UPG_DEKU_NUTS -}; -u32 gUpgradeNegMasks[UPG_MAX] = { - ~0x00000007, // UPG_QUIVER - ~0x00000038, // UPG_BOMB_BAG - ~0x000001C0, // UPG_STRENGTH - ~0x00000E00, // UPG_SCALE - ~0x00003000, // UPG_WALLET - ~0x0001C000, // UPG_BULLET_BAG - ~0x000E0000, // UPG_DEKU_STICKS - ~0x00700000, // UPG_DEKU_NUTS -}; - -u8 gEquipShifts[EQUIP_TYPE_MAX] = { - EQUIP_TYPE_SWORD * 4, // EQUIP_TYPE_SWORD - EQUIP_TYPE_SHIELD * 4, // EQUIP_TYPE_SHIELD - EQUIP_TYPE_TUNIC * 4, // EQUIP_TYPE_TUNIC - EQUIP_TYPE_BOOTS * 4, // EQUIP_TYPE_BOOTS -}; - -u8 gUpgradeShifts[UPG_MAX] = { - 0, // UPG_QUIVER - 3, // UPG_BOMB_BAG - 6, // UPG_STRENGTH - 9, // UPG_SCALE - 12, // UPG_WALLET - 14, // UPG_BULLET_BAG - 17, // UPG_DEKU_STICKS - 20, // UPG_DEKU_NUTS -}; - -u16 gUpgradeCapacities[UPG_MAX][4] = { - { 0, 30, 40, 50 }, // UPG_QUIVER - { 0, 20, 30, 40 }, // UPG_BOMB_BAG - { 0, 0, 0, 0 }, // UPG_STRENGTH (unused) - { 0, 0, 0, 0 }, // UPG_SCALE (unused) - { 99, 200, 500, 500 }, // UPG_WALLET - { 0, 30, 40, 50 }, // UPG_BULLET_BAG - { 0, 10, 20, 30 }, // UPG_DEKU_STICKS - { 0, 20, 30, 40 }, // UPG_DEKU_NUTS -}; - -u32 gGsFlagsMasks[] = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 }; -u32 gGsFlagsShifts[] = { 0, 8, 16, 24 }; - -void* gItemIcons[] = { - // icon_item_static 32x32 rgba32 - gItemIconDekuStickTex, // ITEM_DEKU_STICK - gItemIconDekuNutTex, // ITEM_DEKU_NUT - gItemIconBombTex, // ITEM_BOMB - gItemIconBowTex, // ITEM_BOW - gItemIconArrowFireTex, // ITEM_ARROW_FIRE - gItemIconDinsFireTex, // ITEM_DINS_FIRE - gItemIconSlingshotTex, // ITEM_SLINGSHOT - gItemIconOcarinaFairyTex, // ITEM_OCARINA_FAIRY - gItemIconOcarinaOfTimeTex, // ITEM_OCARINA_OF_TIME - gItemIconBombchuTex, // ITEM_BOMBCHU - gItemIconHookshotTex, // ITEM_HOOKSHOT - gItemIconLongshotTex, // ITEM_LONGSHOT - gItemIconArrowIceTex, // ITEM_ARROW_ICE - gItemIconFaroresWindTex, // ITEM_FARORES_WIND - gItemIconBoomerangTex, // ITEM_BOOMERANG - gItemIconLensOfTruthTex, // ITEM_LENS_OF_TRUTH - gItemIconMagicBeanTex, // ITEM_MAGIC_BEAN - gItemIconHammerTex, // ITEM_HAMMER - gItemIconArrowLightTex, // ITEM_ARROW_LIGHT - gItemIconNayrusLoveTex, // ITEM_NAYRUS_LOVE - gItemIconBottleEmptyTex, // ITEM_BOTTLE_EMPTY - gItemIconBottlePotionRedTex, // ITEM_BOTTLE_POTION_RED - gItemIconBottlePotionGreenTex, // ITEM_BOTTLE_POTION_GREEN - gItemIconBottlePotionBlueTex, // ITEM_BOTTLE_POTION_BLUE - gItemIconBottleFairyTex, // ITEM_BOTTLE_FAIRY - gItemIconBottleFishTex, // ITEM_BOTTLE_FISH - gItemIconBottleMilkFullTex, // ITEM_BOTTLE_MILK_FULL - gItemIconBottleRutosLetterTex, // ITEM_BOTTLE_RUTOS_LETTER - gItemIconBottleBlueFireTex, // ITEM_BOTTLE_BLUE_FIRE - gItemIconBottleBugTex, // ITEM_BOTTLE_BUG - gItemIconBottleBigPoeTex, // ITEM_BOTTLE_BIG_POE - gItemIconBottleMilkHalfTex, // ITEM_BOTTLE_MILK_HALF - gItemIconBottlePoeTex, // ITEM_BOTTLE_POE - gItemIconWeirdEggTex, // ITEM_WEIRD_EGG - gItemIconChickenTex, // ITEM_CHICKEN - gItemIconZeldasLetterTex, // ITEM_ZELDAS_LETTER - gItemIconMaskKeatonTex, // ITEM_MASK_KEATON - gItemIconMaskSkullTex, // ITEM_MASK_SKULL - gItemIconMaskSpookyTex, // ITEM_MASK_SPOOKY - gItemIconMaskBunnyHoodTex, // ITEM_MASK_BUNNY_HOOD - gItemIconMaskGoronTex, // ITEM_MASK_GORON - gItemIconMaskZoraTex, // ITEM_MASK_ZORA - gItemIconMaskGerudoTex, // ITEM_MASK_GERUDO - gItemIconMaskTruthTex, // ITEM_MASK_TRUTH - gItemIconSoldOutTex, // ITEM_SOLD_OUT - gItemIconPocketEggTex, // ITEM_POCKET_EGG - gItemIconPocketCuccoTex, // ITEM_POCKET_CUCCO - gItemIconCojiroTex, // ITEM_COJIRO - gItemIconOddMushroomTex, // ITEM_ODD_MUSHROOM - gItemIconOddPotionTex, // ITEM_ODD_POTION - gItemIconPoachersSawTex, // ITEM_POACHERS_SAW - gItemIconBrokenGoronsSwordTex, // ITEM_BROKEN_GORONS_SWORD - gItemIconPrescriptionTex, // ITEM_PRESCRIPTION - gItemIconEyeballFrogTex, // ITEM_EYEBALL_FROG - gItemIconEyeDropsTex, // ITEM_EYE_DROPS - gItemIconClaimCheckTex, // ITEM_CLAIM_CHECK - gItemIconBowFireTex, // ITEM_BOW_FIRE - gItemIconBowIceTex, // ITEM_BOW_ICE - gItemIconBowLightTex, // ITEM_BOW_LIGHT - gItemIconSwordKokiriTex, // ITEM_SWORD_KOKIRI - gItemIconSwordMasterTex, // ITEM_SWORD_MASTER - gItemIconSwordBiggoronTex, // ITEM_SWORD_BIGGORON - gItemIconShieldDekuTex, // ITEM_SHIELD_DEKU - gItemIconShieldHylianTex, // ITEM_SHIELD_HYLIAN - gItemIconShieldMirrorTex, // ITEM_SHIELD_MIRROR - gItemIconTunicKokiriTex, // ITEM_TUNIC_KOKIRI - gItemIconTunicGoronTex, // ITEM_TUNIC_GORON - gItemIconTunicZoraTex, // ITEM_TUNIC_ZORA - gItemIconBootsKokiriTex, // ITEM_BOOTS_KOKIRI - gItemIconBootsIronTex, // ITEM_BOOTS_IRON - gItemIconBootsHoverTex, // ITEM_BOOTS_HOVER - gItemIconBulletBag30Tex, // ITEM_BULLET_BAG_30 - gItemIconBulletBag40Tex, // ITEM_BULLET_BAG_40 - gItemIconBulletBag50Tex, // ITEM_BULLET_BAG_50 - gItemIconQuiver30Tex, // ITEM_QUIVER_30 - gItemIconQuiver40Tex, // ITEM_QUIVER_40 - gItemIconQuiver50Tex, // ITEM_QUIVER_50 - gItemIconBombBag20Tex, // ITEM_BOMB_BAG_20 - gItemIconBombBag30Tex, // ITEM_BOMB_BAG_30 - gItemIconBombBag40Tex, // ITEM_BOMB_BAG_40 - gItemIconGoronsBraceletTex, // ITEM_STRENGTH_GORONS_BRACELET - gItemIconSilverGauntletsTex, // ITEM_STRENGTH_SILVER_GAUNTLETS - gItemIconGoldenGauntletsTex, // ITEM_STRENGTH_GOLD_GAUNTLETS - gItemIconScaleSilverTex, // ITEM_SCALE_SILVER - gItemIconScaleGoldenTex, // ITEM_SCALE_GOLDEN - gItemIconBrokenGiantsKnifeTex, // ITEM_GIANTS_KNIFE - gItemIconAdultsWalletTex, // ITEM_ADULTS_WALLET - gItemIconGiantsWalletTex, // ITEM_GIANTS_WALLET - gItemIconDekuSeedsTex, // ITEM_DEKU_SEEDS - gItemIconFishingPoleTex, // ITEM_FISHING_POLE - // icon_item_static 16x24 ia8 - gSongNoteTex, // ITEM_SONG_MINUET - gSongNoteTex, // ITEM_SONG_BOLERO - gSongNoteTex, // ITEM_SONG_SERENADE - gSongNoteTex, // ITEM_SONG_REQUIEM - gSongNoteTex, // ITEM_SONG_NOCTURNE - gSongNoteTex, // ITEM_SONG_PRELUDE - gSongNoteTex, // ITEM_SONG_LULLABY - gSongNoteTex, // ITEM_SONG_EPONA - gSongNoteTex, // ITEM_SONG_SARIA - gSongNoteTex, // ITEM_SONG_SUN - gSongNoteTex, // ITEM_SONG_TIME - gSongNoteTex, // ITEM_SONG_STORMS - // icon_item_24static 24x24 rgba32 - gQuestIconMedallionForestTex, // ITEM_MEDALLION_FOREST - gQuestIconMedallionFireTex, // ITEM_MEDALLION_FIRE - gQuestIconMedallionWaterTex, // ITEM_MEDALLION_WATER - gQuestIconMedallionSpiritTex, // ITEM_MEDALLION_SPIRIT - gQuestIconMedallionShadowTex, // ITEM_MEDALLION_SHADOW - gQuestIconMedallionLightTex, // ITEM_MEDALLION_LIGHT - gQuestIconKokiriEmeraldTex, // ITEM_KOKIRI_EMERALD - gQuestIconGoronRubyTex, // ITEM_GORON_RUBY - gQuestIconZoraSapphireTex, // ITEM_ZORA_SAPPHIRE - gQuestIconStoneOfAgonyTex, // ITEM_STONE_OF_AGONY - gQuestIconGerudosCardTex, // ITEM_GERUDOS_CARD - gQuestIconGoldSkulltulaTex, // ITEM_SKULL_TOKEN - gQuestIconHeartContainerTex, // ITEM_HEART_CONTAINER - gQuestIconHeartPieceTex, // ITEM_HEART_PIECE - gQuestIconDungeonBossKeyTex, // ITEM_DUNGEON_BOSS_KEY - gQuestIconDungeonMapTex, // ITEM_DUNGEON_COMPASS (swapped with map (inconsequential)) - gQuestIconDungeonCompassTex, // ITEM_DUNGEON_MAP (swapped with compass (inconsequential)) - gQuestIconDungeonBossKeyTex, // ITEM_SMALL_KEY (but texture is boss key (inconsequential)) - gQuestIconMagicJarSmallTex, // ITEM_MAGIC_JAR_SMALL - gQuestIconMagicJarBigTex, // ITEM_MAGIC_JAR_BIG - // icon_item_static 48x48 ia8 - gHeartPieceIcon1Tex, // ITEM_HEART_PIECE_2 - gHeartPieceIcon2Tex, // ITEM_INVALID_1 - gHeartPieceIcon3Tex, // ITEM_INVALID_2 - // parameter_static 16x16 ia8 - gOcarinaBtnIconCUpTex, // ITEM_INVALID_3 - gOcarinaBtnIconCDownTex, // ITEM_INVALID_4 - gOcarinaBtnIconCLeftTex, // ITEM_INVALID_5 - gOcarinaBtnIconCRightTex, // ITEM_INVALID_6 - gOcarinaBtnIconATex, // ITEM_INVALID_7 -}; - -// Used to map item IDs to inventory slots -u8 gItemSlots[] = { - SLOT_DEKU_STICK, // ITEM_DEKU_STICK - SLOT_DEKU_NUT, // ITEM_DEKU_NUT - SLOT_BOMB, // ITEM_BOMB - SLOT_BOW, // ITEM_BOW - SLOT_ARROW_FIRE, // ITEM_ARROW_FIRE - SLOT_DINS_FIRE, // ITEM_DINS_FIRE - SLOT_SLINGSHOT, // ITEM_SLINGSHOT - SLOT_OCARINA, // ITEM_OCARINA_FAIRY - SLOT_OCARINA, // ITEM_OCARINA_OF_TIME - SLOT_BOMBCHU, // ITEM_BOMBCHU - SLOT_HOOKSHOT, // ITEM_HOOKSHOT - SLOT_HOOKSHOT, // ITEM_LONGSHOT - SLOT_ARROW_ICE, // ITEM_ARROW_ICE - SLOT_FARORES_WIND, // ITEM_FARORES_WIND - SLOT_BOOMERANG, // ITEM_BOOMERANG - SLOT_LENS_OF_TRUTH, // ITEM_LENS_OF_TRUTH - SLOT_MAGIC_BEAN, // ITEM_MAGIC_BEAN - SLOT_HAMMER, // ITEM_HAMMER - SLOT_ARROW_LIGHT, // ITEM_ARROW_LIGHT - SLOT_NAYRUS_LOVE, // ITEM_NAYRUS_LOVE - SLOT_BOTTLE_1, // ITEM_BOTTLE_EMPTY - SLOT_BOTTLE_1, // ITEM_BOTTLE_POTION_RED - SLOT_BOTTLE_1, // ITEM_BOTTLE_POTION_GREEN - SLOT_BOTTLE_1, // ITEM_BOTTLE_POTION_BLUE - SLOT_BOTTLE_1, // ITEM_BOTTLE_FAIRY - SLOT_BOTTLE_1, // ITEM_BOTTLE_FISH - SLOT_BOTTLE_1, // ITEM_BOTTLE_MILK_FULL - SLOT_BOTTLE_1, // ITEM_BOTTLE_RUTOS_LETTER - SLOT_BOTTLE_1, // ITEM_BOTTLE_BLUE_FIRE - SLOT_BOTTLE_1, // ITEM_BOTTLE_BUG - SLOT_BOTTLE_1, // ITEM_BOTTLE_BIG_POE - SLOT_BOTTLE_1, // ITEM_BOTTLE_MILK_HALF - SLOT_BOTTLE_1, // ITEM_BOTTLE_POE - SLOT_TRADE_CHILD, // ITEM_WEIRD_EGG - SLOT_TRADE_CHILD, // ITEM_CHICKEN - SLOT_TRADE_CHILD, // ITEM_ZELDAS_LETTER - SLOT_TRADE_CHILD, // ITEM_MASK_KEATON - SLOT_TRADE_CHILD, // ITEM_MASK_SKULL - SLOT_TRADE_CHILD, // ITEM_MASK_SPOOKY - SLOT_TRADE_CHILD, // ITEM_MASK_BUNNY_HOOD - SLOT_TRADE_CHILD, // ITEM_MASK_GORON - SLOT_TRADE_CHILD, // ITEM_MASK_ZORA - SLOT_TRADE_CHILD, // ITEM_MASK_GERUDO - SLOT_TRADE_CHILD, // ITEM_MASK_TRUTH - SLOT_TRADE_CHILD, // ITEM_SOLD_OUT - SLOT_TRADE_ADULT, // ITEM_POCKET_EGG - SLOT_TRADE_ADULT, // ITEM_POCKET_CUCCO - SLOT_TRADE_ADULT, // ITEM_COJIRO - SLOT_TRADE_ADULT, // ITEM_ODD_MUSHROOM - SLOT_TRADE_ADULT, // ITEM_ODD_POTION - SLOT_TRADE_ADULT, // ITEM_POACHERS_SAW - SLOT_TRADE_ADULT, // ITEM_BROKEN_GORONS_SWORD - SLOT_TRADE_ADULT, // ITEM_PRESCRIPTION - SLOT_TRADE_ADULT, // ITEM_EYEBALL_FROG - SLOT_TRADE_ADULT, // ITEM_EYE_DROPS - SLOT_TRADE_ADULT, // ITEM_CLAIM_CHECK -}; - -void Inventory_ChangeEquipment(s16 equipment, u16 value) { - gSaveContext.save.info.equips.equipment &= gEquipNegMasks[equipment]; - gSaveContext.save.info.equips.equipment |= value << gEquipShifts[equipment]; -} - -u8 Inventory_DeleteEquipment(PlayState* play, s16 equipment) { - Player* player = GET_PLAYER(play); - s32 pad; - u16 equipValue = gSaveContext.save.info.equips.equipment & gEquipMasks[equipment]; - - PRINTF(T("装備アイテム抹消 = %d zzz=%d\n", "Erasing equipment item = %d zzz=%d\n"), equipment, equipValue); - - if (equipValue) { - equipValue >>= gEquipShifts[equipment]; - - gSaveContext.save.info.equips.equipment &= gEquipNegMasks[equipment]; - gSaveContext.save.info.inventory.equipment ^= OWNED_EQUIP_FLAG(equipment, equipValue - 1); - - if (equipment == EQUIP_TYPE_TUNIC) { - gSaveContext.save.info.equips.equipment |= EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4); - } - - if (equipment == EQUIP_TYPE_SWORD) { - gSaveContext.save.info.equips.buttonItems[0] = ITEM_NONE; - gSaveContext.save.info.infTable[INFTABLE_1DX_INDEX] = 1; - } - - Player_SetEquipmentData(play, player); - play->pauseCtx.cursorSpecialPos = PAUSE_CURSOR_PAGE_LEFT; - } - - return equipValue; -} - -void Inventory_ChangeUpgrade(s16 upgrade, s16 value) { - gSaveContext.save.info.inventory.upgrades &= gUpgradeNegMasks[upgrade]; - gSaveContext.save.info.inventory.upgrades |= value << gUpgradeShifts[upgrade]; -} diff --git a/src/code/z_bg_collect.c b/src/code/z_bg_collect.c new file mode 100644 index 000000000..2bdfc6bcd --- /dev/null +++ b/src/code/z_bg_collect.c @@ -0,0 +1,119 @@ +#include "global.h" +#include "terminal.h" + +/** + * Update the `carriedActor`'s position based on the dynapoly actor identified by `bgId`. + */ +void DynaPolyActor_UpdateCarriedActorPos(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) { + MtxF prevTransform; + MtxF prevTransformInv; + MtxF curTransform; + Vec3f pos; + Vec3f tempPos; + + if (DynaPoly_IsBgIdBgActor(bgId)) { + + SkinMatrix_SetTranslateRotateYXZScale( + &prevTransform, colCtx->dyna.bgActors[bgId].prevTransform.scale.x, + colCtx->dyna.bgActors[bgId].prevTransform.scale.y, colCtx->dyna.bgActors[bgId].prevTransform.scale.z, + colCtx->dyna.bgActors[bgId].prevTransform.rot.x, colCtx->dyna.bgActors[bgId].prevTransform.rot.y, + colCtx->dyna.bgActors[bgId].prevTransform.rot.z, colCtx->dyna.bgActors[bgId].prevTransform.pos.x, + colCtx->dyna.bgActors[bgId].prevTransform.pos.y, colCtx->dyna.bgActors[bgId].prevTransform.pos.z); + + if (SkinMatrix_Invert(&prevTransform, &prevTransformInv) != 2) { + + SkinMatrix_SetTranslateRotateYXZScale( + &curTransform, colCtx->dyna.bgActors[bgId].curTransform.scale.x, + colCtx->dyna.bgActors[bgId].curTransform.scale.y, colCtx->dyna.bgActors[bgId].curTransform.scale.z, + colCtx->dyna.bgActors[bgId].curTransform.rot.x, colCtx->dyna.bgActors[bgId].curTransform.rot.y, + colCtx->dyna.bgActors[bgId].curTransform.rot.z, colCtx->dyna.bgActors[bgId].curTransform.pos.x, + colCtx->dyna.bgActors[bgId].curTransform.pos.y, colCtx->dyna.bgActors[bgId].curTransform.pos.z); + + // Apply the movement of the dynapoly actor `bgId` over the last frame to the `carriedActor` position + // pos = curTransform * prevTransformInv * pos + // Note (curTransform * prevTransformInv) represents the transform relative to the previous frame + SkinMatrix_Vec3fMtxFMultXYZ(&prevTransformInv, &carriedActor->world.pos, &tempPos); + SkinMatrix_Vec3fMtxFMultXYZ(&curTransform, &tempPos, &pos); + carriedActor->world.pos = pos; + +#if DEBUG_FEATURES + if (BGCHECK_XYZ_ABSMAX <= pos.x || pos.x <= -BGCHECK_XYZ_ABSMAX || BGCHECK_XYZ_ABSMAX <= pos.y || + pos.y <= -BGCHECK_XYZ_ABSMAX || BGCHECK_XYZ_ABSMAX <= pos.z || pos.z <= -BGCHECK_XYZ_ABSMAX) { + + PRINTF(VT_FGCOL(RED)); + //! @bug file and line are not passed to PRINTF + PRINTF(T("BGCheckCollection_typicalActorPos():位置が妥当ではありません。\n" + "pos (%f,%f,%f) file:%s line:%d\n", + "BGCheckCollection_typicalActorPos(): Position is not valid. \n" + "pos (%f,%f,%f) file:%s line:%d\n"), + pos.x, pos.y, pos.z); + PRINTF(VT_RST); + } +#endif + } + } +} + +/** + * Update the `carriedActor`'s Y rotation based on the dynapoly actor identified by `bgId`. + */ +void DynaPolyActor_UpdateCarriedActorRotY(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) { + if (DynaPoly_IsBgIdBgActor(bgId)) { + s16 rotY = colCtx->dyna.bgActors[bgId].curTransform.rot.y - colCtx->dyna.bgActors[bgId].prevTransform.rot.y; + + if (carriedActor->id == ACTOR_PLAYER) { + ((Player*)carriedActor)->yaw += rotY; + } + + carriedActor->shape.rot.y += rotY; + carriedActor->world.rot.y += rotY; + } +} + +void func_80043334(CollisionContext* colCtx, Actor* actor, s32 bgId) { + if (DynaPoly_IsBgIdBgActor(bgId)) { + DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, bgId); + if (dynaActor != NULL) { + DynaPolyActor_SetActorOnTop(dynaActor); + + if (CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_CAN_PRESS_SWITCHES)) { + DynaPolyActor_SetSwitchPressed(dynaActor); + } + } + } +} + +/** + * Update the `carriedActor`'s position and Y rotation based on the dynapoly actor identified by `bgId`, according to + * the dynapoly actor's move flags (see `DYNA_TRANSFORM_POS` and `DYNA_TRANSFORM_ROT_Y`). + */ +s32 DynaPolyActor_TransformCarriedActor(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) { + s32 result = false; + DynaPolyActor* dynaActor; + + if (!DynaPoly_IsBgIdBgActor(bgId)) { + return false; + } + + if ((colCtx->dyna.bgActorFlags[bgId] & BGACTOR_1) || !(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE)) { + return false; + } + + dynaActor = DynaPoly_GetActor(colCtx, bgId); + + if (dynaActor == NULL) { + return false; + } + + if (dynaActor->transformFlags & DYNA_TRANSFORM_POS) { + DynaPolyActor_UpdateCarriedActorPos(colCtx, bgId, carriedActor); + result = true; + } + + if (dynaActor->transformFlags & DYNA_TRANSFORM_ROT_Y) { + DynaPolyActor_UpdateCarriedActorRotY(colCtx, bgId, carriedActor); + result = true; + } + + return result; +} diff --git a/src/code/z_bg_item.c b/src/code/z_bg_item.c new file mode 100644 index 000000000..1a4d9f58d --- /dev/null +++ b/src/code/z_bg_item.c @@ -0,0 +1,118 @@ +#include "global.h" + +/** + * @param transformFlags How other actors standing on the dynapoly actor's collision move when the dynapoly actor moves. + * See `DYNA_TRANSFORM_POS`, `DYNA_TRANSFORM_ROT_Y`. + */ +void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 transformFlags) { + dynaActor->bgId = -1; + dynaActor->unk_150 = 0.0f; + dynaActor->unk_154 = 0.0f; + dynaActor->transformFlags = transformFlags; + dynaActor->interactFlags = 0; +} + +void DynaPolyActor_UnsetAllInteractFlags(DynaPolyActor* dynaActor) { + dynaActor->interactFlags = 0; +} + +void DynaPolyActor_SetActorOnTop(DynaPolyActor* dynaActor) { + dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_TOP; +} + +void DynaPolyActor_SetPlayerOnTop(DynaPolyActor* dynaActor) { + dynaActor->interactFlags |= DYNA_INTERACT_PLAYER_ON_TOP; +} + +void DynaPoly_SetPlayerOnTop(CollisionContext* colCtx, s32 floorBgId) { + DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, floorBgId); + + if (dynaActor != NULL) { + DynaPolyActor_SetPlayerOnTop(dynaActor); + } +} + +void DynaPolyActor_SetPlayerAbove(DynaPolyActor* dynaActor) { + dynaActor->interactFlags |= DYNA_INTERACT_PLAYER_ABOVE; +} + +void DynaPoly_SetPlayerAbove(CollisionContext* colCtx, s32 floorBgId) { + DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, floorBgId); + + if (dynaActor != NULL) { + DynaPolyActor_SetPlayerAbove(dynaActor); + } +} + +void DynaPolyActor_SetSwitchPressed(DynaPolyActor* dynaActor) { + dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_SWITCH_PRESSED; +} + +s32 DynaPolyActor_IsActorOnTop(DynaPolyActor* dynaActor) { + if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_TOP) { + return true; + } else { + return false; + } +} + +s32 DynaPolyActor_IsPlayerOnTop(DynaPolyActor* dynaActor) { + if (dynaActor->interactFlags & DYNA_INTERACT_PLAYER_ON_TOP) { + return true; + } else { + return false; + } +} + +s32 DynaPolyActor_IsPlayerAbove(DynaPolyActor* dynaActor) { + if (dynaActor->interactFlags & DYNA_INTERACT_PLAYER_ABOVE) { + return true; + } else { + return false; + } +} + +s32 DynaPolyActor_IsSwitchPressed(DynaPolyActor* dynaActor) { + if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_SWITCH_PRESSED) { + return true; + } else { + return false; + } +} + +s32 func_800435D8(PlayState* play, DynaPolyActor* dynaActor, s16 arg2, s16 arg3, s16 arg4) { + Vec3f posA; + Vec3f posB; + Vec3f posResult; + f32 sin = Math_SinS(dynaActor->unk_158); + f32 cos = Math_CosS(dynaActor->unk_158); + s32 bgId; + CollisionPoly* poly; + f32 a2; + f32 a3; + f32 sign = (0.0f <= dynaActor->unk_150) ? 1.0f : -1.0f; + + a2 = (f32)arg2 - 0.1f; + posA.x = dynaActor->actor.world.pos.x + (a2 * cos); + posA.y = dynaActor->actor.world.pos.y + arg4; + posA.z = dynaActor->actor.world.pos.z - (a2 * sin); + + a3 = (f32)arg3 - 0.1f; + posB.x = sign * a3 * sin + posA.x; + posB.y = posA.y; + posB.z = sign * a3 * cos + posA.z; + + if (BgCheck_EntityLineTest3(&play->colCtx, &posA, &posB, &posResult, &poly, true, false, false, true, &bgId, + &dynaActor->actor, 0.0f)) { + return false; + } + posA.x = (dynaActor->actor.world.pos.x * 2) - posA.x; + posA.z = (dynaActor->actor.world.pos.z * 2) - posA.z; + posB.x = sign * a3 * sin + posA.x; + posB.z = sign * a3 * cos + posA.z; + if (BgCheck_EntityLineTest3(&play->colCtx, &posA, &posB, &posResult, &poly, true, false, false, true, &bgId, + &dynaActor->actor, 0.0f)) { + return false; + } + return true; +} diff --git a/src/code/z_env_flags.c b/src/code/z_env_flags.c new file mode 100644 index 000000000..0057128e2 --- /dev/null +++ b/src/code/z_env_flags.c @@ -0,0 +1,33 @@ +#include "global.h" + +void CutsceneFlags_UnsetAll(PlayState* play) { + u8 i; + + for (i = 0; i < ARRAY_COUNT(play->cutsceneFlags); i++) { + play->cutsceneFlags[i] = 0; + } +} + +void CutsceneFlags_Set(PlayState* play, s16 flag) { + s16 index = flag / 16; + s16 bit = flag % 16; + s16 mask = 1 << bit; + + play->cutsceneFlags[index] |= mask; +} + +void CutsceneFlags_Unset(PlayState* play, s16 flag) { + s16 index = flag / 16; + s16 bit = flag % 16; + s16 mask = (1 << bit) ^ 0xFFFF; + + play->cutsceneFlags[index] &= mask; +} + +s32 CutsceneFlags_Get(PlayState* play, s16 flag) { + s16 index = flag / 16; + s16 bit = flag % 16; + s16 mask = 1 << bit; + + return play->cutsceneFlags[index] & mask; +} diff --git a/src/code/z_inventory.c b/src/code/z_inventory.c new file mode 100644 index 000000000..b452a92e1 --- /dev/null +++ b/src/code/z_inventory.c @@ -0,0 +1,315 @@ +#include "global.h" +#include "assets/textures/icon_item_static/icon_item_static.h" +#include "assets/textures/icon_item_24_static/icon_item_24_static.h" +#include "assets/textures/parameter_static/parameter_static.h" + +// Bit Flag array in which gBitFlags[n] is literally (1 << n) +u32 gBitFlags[] = { + (1 << 0), (1 << 1), (1 << 2), (1 << 3), (1 << 4), (1 << 5), (1 << 6), (1 << 7), + (1 << 8), (1 << 9), (1 << 10), (1 << 11), (1 << 12), (1 << 13), (1 << 14), (1 << 15), + (1 << 16), (1 << 17), (1 << 18), (1 << 19), (1 << 20), (1 << 21), (1 << 22), (1 << 23), + (1 << 24), (1 << 25), (1 << 26), (1 << 27), (1 << 28), (1 << 29), (1 << 30), (1 << 31), +}; + +u16 gEquipMasks[EQUIP_TYPE_MAX] = { + 0xF << (EQUIP_TYPE_SWORD * 4), // EQUIP_TYPE_SWORD + 0xF << (EQUIP_TYPE_SHIELD * 4), // EQUIP_TYPE_SHIELD + 0xF << (EQUIP_TYPE_TUNIC * 4), // EQUIP_TYPE_TUNIC + 0xF << (EQUIP_TYPE_BOOTS * 4), // EQUIP_TYPE_BOOTS +}; +u16 gEquipNegMasks[EQUIP_TYPE_MAX] = { + (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)), // EQUIP_TYPE_SWORD + (u16) ~(0xF << (EQUIP_TYPE_SHIELD * 4)), // EQUIP_TYPE_SHIELD + (u16) ~(0xF << (EQUIP_TYPE_TUNIC * 4)), // EQUIP_TYPE_TUNIC + (u16) ~(0xF << (EQUIP_TYPE_BOOTS * 4)), // EQUIP_TYPE_BOOTS +}; + +u32 gUpgradeMasks[UPG_MAX] = { + 0x00000007, // UPG_QUIVER + 0x00000038, // UPG_BOMB_BAG + 0x000001C0, // UPG_STRENGTH + 0x00000E00, // UPG_SCALE + 0x00003000, // UPG_WALLET + 0x0001C000, // UPG_BULLET_BAG + 0x000E0000, // UPG_DEKU_STICKS + 0x00700000, // UPG_DEKU_NUTS +}; +u32 gUpgradeNegMasks[UPG_MAX] = { + ~0x00000007, // UPG_QUIVER + ~0x00000038, // UPG_BOMB_BAG + ~0x000001C0, // UPG_STRENGTH + ~0x00000E00, // UPG_SCALE + ~0x00003000, // UPG_WALLET + ~0x0001C000, // UPG_BULLET_BAG + ~0x000E0000, // UPG_DEKU_STICKS + ~0x00700000, // UPG_DEKU_NUTS +}; + +u8 gEquipShifts[EQUIP_TYPE_MAX] = { + EQUIP_TYPE_SWORD * 4, // EQUIP_TYPE_SWORD + EQUIP_TYPE_SHIELD * 4, // EQUIP_TYPE_SHIELD + EQUIP_TYPE_TUNIC * 4, // EQUIP_TYPE_TUNIC + EQUIP_TYPE_BOOTS * 4, // EQUIP_TYPE_BOOTS +}; + +u8 gUpgradeShifts[UPG_MAX] = { + 0, // UPG_QUIVER + 3, // UPG_BOMB_BAG + 6, // UPG_STRENGTH + 9, // UPG_SCALE + 12, // UPG_WALLET + 14, // UPG_BULLET_BAG + 17, // UPG_DEKU_STICKS + 20, // UPG_DEKU_NUTS +}; + +u16 gUpgradeCapacities[UPG_MAX][4] = { + { 0, 30, 40, 50 }, // UPG_QUIVER + { 0, 20, 30, 40 }, // UPG_BOMB_BAG + { 0, 0, 0, 0 }, // UPG_STRENGTH (unused) + { 0, 0, 0, 0 }, // UPG_SCALE (unused) + { 99, 200, 500, 500 }, // UPG_WALLET + { 0, 30, 40, 50 }, // UPG_BULLET_BAG + { 0, 10, 20, 30 }, // UPG_DEKU_STICKS + { 0, 20, 30, 40 }, // UPG_DEKU_NUTS +}; + +u32 gGsFlagsMasks[] = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 }; +u32 gGsFlagsShifts[] = { 0, 8, 16, 24 }; + +void* gItemIcons[] = { + // icon_item_static 32x32 rgba32 + gItemIconDekuStickTex, // ITEM_DEKU_STICK + gItemIconDekuNutTex, // ITEM_DEKU_NUT + gItemIconBombTex, // ITEM_BOMB + gItemIconBowTex, // ITEM_BOW + gItemIconArrowFireTex, // ITEM_ARROW_FIRE + gItemIconDinsFireTex, // ITEM_DINS_FIRE + gItemIconSlingshotTex, // ITEM_SLINGSHOT + gItemIconOcarinaFairyTex, // ITEM_OCARINA_FAIRY + gItemIconOcarinaOfTimeTex, // ITEM_OCARINA_OF_TIME + gItemIconBombchuTex, // ITEM_BOMBCHU + gItemIconHookshotTex, // ITEM_HOOKSHOT + gItemIconLongshotTex, // ITEM_LONGSHOT + gItemIconArrowIceTex, // ITEM_ARROW_ICE + gItemIconFaroresWindTex, // ITEM_FARORES_WIND + gItemIconBoomerangTex, // ITEM_BOOMERANG + gItemIconLensOfTruthTex, // ITEM_LENS_OF_TRUTH + gItemIconMagicBeanTex, // ITEM_MAGIC_BEAN + gItemIconHammerTex, // ITEM_HAMMER + gItemIconArrowLightTex, // ITEM_ARROW_LIGHT + gItemIconNayrusLoveTex, // ITEM_NAYRUS_LOVE + gItemIconBottleEmptyTex, // ITEM_BOTTLE_EMPTY + gItemIconBottlePotionRedTex, // ITEM_BOTTLE_POTION_RED + gItemIconBottlePotionGreenTex, // ITEM_BOTTLE_POTION_GREEN + gItemIconBottlePotionBlueTex, // ITEM_BOTTLE_POTION_BLUE + gItemIconBottleFairyTex, // ITEM_BOTTLE_FAIRY + gItemIconBottleFishTex, // ITEM_BOTTLE_FISH + gItemIconBottleMilkFullTex, // ITEM_BOTTLE_MILK_FULL + gItemIconBottleRutosLetterTex, // ITEM_BOTTLE_RUTOS_LETTER + gItemIconBottleBlueFireTex, // ITEM_BOTTLE_BLUE_FIRE + gItemIconBottleBugTex, // ITEM_BOTTLE_BUG + gItemIconBottleBigPoeTex, // ITEM_BOTTLE_BIG_POE + gItemIconBottleMilkHalfTex, // ITEM_BOTTLE_MILK_HALF + gItemIconBottlePoeTex, // ITEM_BOTTLE_POE + gItemIconWeirdEggTex, // ITEM_WEIRD_EGG + gItemIconChickenTex, // ITEM_CHICKEN + gItemIconZeldasLetterTex, // ITEM_ZELDAS_LETTER + gItemIconMaskKeatonTex, // ITEM_MASK_KEATON + gItemIconMaskSkullTex, // ITEM_MASK_SKULL + gItemIconMaskSpookyTex, // ITEM_MASK_SPOOKY + gItemIconMaskBunnyHoodTex, // ITEM_MASK_BUNNY_HOOD + gItemIconMaskGoronTex, // ITEM_MASK_GORON + gItemIconMaskZoraTex, // ITEM_MASK_ZORA + gItemIconMaskGerudoTex, // ITEM_MASK_GERUDO + gItemIconMaskTruthTex, // ITEM_MASK_TRUTH + gItemIconSoldOutTex, // ITEM_SOLD_OUT + gItemIconPocketEggTex, // ITEM_POCKET_EGG + gItemIconPocketCuccoTex, // ITEM_POCKET_CUCCO + gItemIconCojiroTex, // ITEM_COJIRO + gItemIconOddMushroomTex, // ITEM_ODD_MUSHROOM + gItemIconOddPotionTex, // ITEM_ODD_POTION + gItemIconPoachersSawTex, // ITEM_POACHERS_SAW + gItemIconBrokenGoronsSwordTex, // ITEM_BROKEN_GORONS_SWORD + gItemIconPrescriptionTex, // ITEM_PRESCRIPTION + gItemIconEyeballFrogTex, // ITEM_EYEBALL_FROG + gItemIconEyeDropsTex, // ITEM_EYE_DROPS + gItemIconClaimCheckTex, // ITEM_CLAIM_CHECK + gItemIconBowFireTex, // ITEM_BOW_FIRE + gItemIconBowIceTex, // ITEM_BOW_ICE + gItemIconBowLightTex, // ITEM_BOW_LIGHT + gItemIconSwordKokiriTex, // ITEM_SWORD_KOKIRI + gItemIconSwordMasterTex, // ITEM_SWORD_MASTER + gItemIconSwordBiggoronTex, // ITEM_SWORD_BIGGORON + gItemIconShieldDekuTex, // ITEM_SHIELD_DEKU + gItemIconShieldHylianTex, // ITEM_SHIELD_HYLIAN + gItemIconShieldMirrorTex, // ITEM_SHIELD_MIRROR + gItemIconTunicKokiriTex, // ITEM_TUNIC_KOKIRI + gItemIconTunicGoronTex, // ITEM_TUNIC_GORON + gItemIconTunicZoraTex, // ITEM_TUNIC_ZORA + gItemIconBootsKokiriTex, // ITEM_BOOTS_KOKIRI + gItemIconBootsIronTex, // ITEM_BOOTS_IRON + gItemIconBootsHoverTex, // ITEM_BOOTS_HOVER + gItemIconBulletBag30Tex, // ITEM_BULLET_BAG_30 + gItemIconBulletBag40Tex, // ITEM_BULLET_BAG_40 + gItemIconBulletBag50Tex, // ITEM_BULLET_BAG_50 + gItemIconQuiver30Tex, // ITEM_QUIVER_30 + gItemIconQuiver40Tex, // ITEM_QUIVER_40 + gItemIconQuiver50Tex, // ITEM_QUIVER_50 + gItemIconBombBag20Tex, // ITEM_BOMB_BAG_20 + gItemIconBombBag30Tex, // ITEM_BOMB_BAG_30 + gItemIconBombBag40Tex, // ITEM_BOMB_BAG_40 + gItemIconGoronsBraceletTex, // ITEM_STRENGTH_GORONS_BRACELET + gItemIconSilverGauntletsTex, // ITEM_STRENGTH_SILVER_GAUNTLETS + gItemIconGoldenGauntletsTex, // ITEM_STRENGTH_GOLD_GAUNTLETS + gItemIconScaleSilverTex, // ITEM_SCALE_SILVER + gItemIconScaleGoldenTex, // ITEM_SCALE_GOLDEN + gItemIconBrokenGiantsKnifeTex, // ITEM_GIANTS_KNIFE + gItemIconAdultsWalletTex, // ITEM_ADULTS_WALLET + gItemIconGiantsWalletTex, // ITEM_GIANTS_WALLET + gItemIconDekuSeedsTex, // ITEM_DEKU_SEEDS + gItemIconFishingPoleTex, // ITEM_FISHING_POLE + // icon_item_static 16x24 ia8 + gSongNoteTex, // ITEM_SONG_MINUET + gSongNoteTex, // ITEM_SONG_BOLERO + gSongNoteTex, // ITEM_SONG_SERENADE + gSongNoteTex, // ITEM_SONG_REQUIEM + gSongNoteTex, // ITEM_SONG_NOCTURNE + gSongNoteTex, // ITEM_SONG_PRELUDE + gSongNoteTex, // ITEM_SONG_LULLABY + gSongNoteTex, // ITEM_SONG_EPONA + gSongNoteTex, // ITEM_SONG_SARIA + gSongNoteTex, // ITEM_SONG_SUN + gSongNoteTex, // ITEM_SONG_TIME + gSongNoteTex, // ITEM_SONG_STORMS + // icon_item_24static 24x24 rgba32 + gQuestIconMedallionForestTex, // ITEM_MEDALLION_FOREST + gQuestIconMedallionFireTex, // ITEM_MEDALLION_FIRE + gQuestIconMedallionWaterTex, // ITEM_MEDALLION_WATER + gQuestIconMedallionSpiritTex, // ITEM_MEDALLION_SPIRIT + gQuestIconMedallionShadowTex, // ITEM_MEDALLION_SHADOW + gQuestIconMedallionLightTex, // ITEM_MEDALLION_LIGHT + gQuestIconKokiriEmeraldTex, // ITEM_KOKIRI_EMERALD + gQuestIconGoronRubyTex, // ITEM_GORON_RUBY + gQuestIconZoraSapphireTex, // ITEM_ZORA_SAPPHIRE + gQuestIconStoneOfAgonyTex, // ITEM_STONE_OF_AGONY + gQuestIconGerudosCardTex, // ITEM_GERUDOS_CARD + gQuestIconGoldSkulltulaTex, // ITEM_SKULL_TOKEN + gQuestIconHeartContainerTex, // ITEM_HEART_CONTAINER + gQuestIconHeartPieceTex, // ITEM_HEART_PIECE + gQuestIconDungeonBossKeyTex, // ITEM_DUNGEON_BOSS_KEY + gQuestIconDungeonMapTex, // ITEM_DUNGEON_COMPASS (swapped with map (inconsequential)) + gQuestIconDungeonCompassTex, // ITEM_DUNGEON_MAP (swapped with compass (inconsequential)) + gQuestIconDungeonBossKeyTex, // ITEM_SMALL_KEY (but texture is boss key (inconsequential)) + gQuestIconMagicJarSmallTex, // ITEM_MAGIC_JAR_SMALL + gQuestIconMagicJarBigTex, // ITEM_MAGIC_JAR_BIG + // icon_item_static 48x48 ia8 + gHeartPieceIcon1Tex, // ITEM_HEART_PIECE_2 + gHeartPieceIcon2Tex, // ITEM_INVALID_1 + gHeartPieceIcon3Tex, // ITEM_INVALID_2 + // parameter_static 16x16 ia8 + gOcarinaBtnIconCUpTex, // ITEM_INVALID_3 + gOcarinaBtnIconCDownTex, // ITEM_INVALID_4 + gOcarinaBtnIconCLeftTex, // ITEM_INVALID_5 + gOcarinaBtnIconCRightTex, // ITEM_INVALID_6 + gOcarinaBtnIconATex, // ITEM_INVALID_7 +}; + +// Used to map item IDs to inventory slots +u8 gItemSlots[] = { + SLOT_DEKU_STICK, // ITEM_DEKU_STICK + SLOT_DEKU_NUT, // ITEM_DEKU_NUT + SLOT_BOMB, // ITEM_BOMB + SLOT_BOW, // ITEM_BOW + SLOT_ARROW_FIRE, // ITEM_ARROW_FIRE + SLOT_DINS_FIRE, // ITEM_DINS_FIRE + SLOT_SLINGSHOT, // ITEM_SLINGSHOT + SLOT_OCARINA, // ITEM_OCARINA_FAIRY + SLOT_OCARINA, // ITEM_OCARINA_OF_TIME + SLOT_BOMBCHU, // ITEM_BOMBCHU + SLOT_HOOKSHOT, // ITEM_HOOKSHOT + SLOT_HOOKSHOT, // ITEM_LONGSHOT + SLOT_ARROW_ICE, // ITEM_ARROW_ICE + SLOT_FARORES_WIND, // ITEM_FARORES_WIND + SLOT_BOOMERANG, // ITEM_BOOMERANG + SLOT_LENS_OF_TRUTH, // ITEM_LENS_OF_TRUTH + SLOT_MAGIC_BEAN, // ITEM_MAGIC_BEAN + SLOT_HAMMER, // ITEM_HAMMER + SLOT_ARROW_LIGHT, // ITEM_ARROW_LIGHT + SLOT_NAYRUS_LOVE, // ITEM_NAYRUS_LOVE + SLOT_BOTTLE_1, // ITEM_BOTTLE_EMPTY + SLOT_BOTTLE_1, // ITEM_BOTTLE_POTION_RED + SLOT_BOTTLE_1, // ITEM_BOTTLE_POTION_GREEN + SLOT_BOTTLE_1, // ITEM_BOTTLE_POTION_BLUE + SLOT_BOTTLE_1, // ITEM_BOTTLE_FAIRY + SLOT_BOTTLE_1, // ITEM_BOTTLE_FISH + SLOT_BOTTLE_1, // ITEM_BOTTLE_MILK_FULL + SLOT_BOTTLE_1, // ITEM_BOTTLE_RUTOS_LETTER + SLOT_BOTTLE_1, // ITEM_BOTTLE_BLUE_FIRE + SLOT_BOTTLE_1, // ITEM_BOTTLE_BUG + SLOT_BOTTLE_1, // ITEM_BOTTLE_BIG_POE + SLOT_BOTTLE_1, // ITEM_BOTTLE_MILK_HALF + SLOT_BOTTLE_1, // ITEM_BOTTLE_POE + SLOT_TRADE_CHILD, // ITEM_WEIRD_EGG + SLOT_TRADE_CHILD, // ITEM_CHICKEN + SLOT_TRADE_CHILD, // ITEM_ZELDAS_LETTER + SLOT_TRADE_CHILD, // ITEM_MASK_KEATON + SLOT_TRADE_CHILD, // ITEM_MASK_SKULL + SLOT_TRADE_CHILD, // ITEM_MASK_SPOOKY + SLOT_TRADE_CHILD, // ITEM_MASK_BUNNY_HOOD + SLOT_TRADE_CHILD, // ITEM_MASK_GORON + SLOT_TRADE_CHILD, // ITEM_MASK_ZORA + SLOT_TRADE_CHILD, // ITEM_MASK_GERUDO + SLOT_TRADE_CHILD, // ITEM_MASK_TRUTH + SLOT_TRADE_CHILD, // ITEM_SOLD_OUT + SLOT_TRADE_ADULT, // ITEM_POCKET_EGG + SLOT_TRADE_ADULT, // ITEM_POCKET_CUCCO + SLOT_TRADE_ADULT, // ITEM_COJIRO + SLOT_TRADE_ADULT, // ITEM_ODD_MUSHROOM + SLOT_TRADE_ADULT, // ITEM_ODD_POTION + SLOT_TRADE_ADULT, // ITEM_POACHERS_SAW + SLOT_TRADE_ADULT, // ITEM_BROKEN_GORONS_SWORD + SLOT_TRADE_ADULT, // ITEM_PRESCRIPTION + SLOT_TRADE_ADULT, // ITEM_EYEBALL_FROG + SLOT_TRADE_ADULT, // ITEM_EYE_DROPS + SLOT_TRADE_ADULT, // ITEM_CLAIM_CHECK +}; + +void Inventory_ChangeEquipment(s16 equipment, u16 value) { + gSaveContext.save.info.equips.equipment &= gEquipNegMasks[equipment]; + gSaveContext.save.info.equips.equipment |= value << gEquipShifts[equipment]; +} + +u8 Inventory_DeleteEquipment(PlayState* play, s16 equipment) { + Player* player = GET_PLAYER(play); + s32 pad; + u16 equipValue = gSaveContext.save.info.equips.equipment & gEquipMasks[equipment]; + + PRINTF(T("装備アイテム抹消 = %d zzz=%d\n", "Erasing equipment item = %d zzz=%d\n"), equipment, equipValue); + + if (equipValue) { + equipValue >>= gEquipShifts[equipment]; + + gSaveContext.save.info.equips.equipment &= gEquipNegMasks[equipment]; + gSaveContext.save.info.inventory.equipment ^= OWNED_EQUIP_FLAG(equipment, equipValue - 1); + + if (equipment == EQUIP_TYPE_TUNIC) { + gSaveContext.save.info.equips.equipment |= EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4); + } + + if (equipment == EQUIP_TYPE_SWORD) { + gSaveContext.save.info.equips.buttonItems[0] = ITEM_NONE; + gSaveContext.save.info.infTable[INFTABLE_1DX_INDEX] = 1; + } + + Player_SetEquipmentData(play, player); + play->pauseCtx.cursorSpecialPos = PAUSE_CURSOR_PAGE_LEFT; + } + + return equipValue; +} + +void Inventory_ChangeUpgrade(s16 upgrade, s16 value) { + gSaveContext.save.info.inventory.upgrades &= gUpgradeNegMasks[upgrade]; + gSaveContext.save.info.inventory.upgrades |= value << gUpgradeShifts[upgrade]; +} -- cgit v1.2.3