diff options
| author | Eblo <7004497+Eblo@users.noreply.github.com> | 2025-11-20 13:33:08 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-20 13:33:08 -0500 |
| commit | b5fed649cd8e7bc0e268ea4fedbfc92ab6ccfa31 (patch) | |
| tree | 67f7b6693dadc6f8650f0810df0b12cbf6a81a83 | |
| parent | eec21ccddd8b65ff9eca67a32c0d33a8f0c881c5 (diff) | |
Convert mundane shuffles to ObjectExtension (#1297)
* Convert pot shuffle to ActorExtension
* Convert crate shuffle to ActorExtension
* Convert barrel shuffle to ActorExtension
* Use ObjectExtension for mundane checks
* Convert grass to ObjectExtension
Add two missed grass checks in Woods of Mystery
* Convert cows to ObjectExtension
* Fix cow relocations
* Convert freestandings to ObjectExtension
* Convert remaining snowballs to use ActorListIndex
* Wrong ID for one snowball
* Apply feedback, document how identification works
| -rw-r--r-- | mm/2s2h/GameInteractor/GameInteractor.h | 2 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp | 8 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ActorBehavior.h | 4 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/EnCow.cpp | 144 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/EnItem00.cpp | 133 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp | 1259 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ObjKibako.cpp | 239 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ObjSnowball.cpp | 118 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ObjTaru.cpp | 113 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ObjTsubo.cpp | 656 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/South.cpp | 2 | ||||
| -rw-r--r-- | mm/2s2h/Rando/StaticData/Checks.cpp | 2 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Types.h | 2 | ||||
| -rw-r--r-- | mm/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c | 3 | ||||
| -rw-r--r-- | mm/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c | 5 |
15 files changed, 954 insertions, 1736 deletions
diff --git a/mm/2s2h/GameInteractor/GameInteractor.h b/mm/2s2h/GameInteractor/GameInteractor.h index 42ba0abab..5ca04dadd 100644 --- a/mm/2s2h/GameInteractor/GameInteractor.h +++ b/mm/2s2h/GameInteractor/GameInteractor.h @@ -260,6 +260,8 @@ typedef enum { VB_ENEMY_DROP_COLLECTIBLE, VB_DRAW_SLIME_RANDO_ITEM, VB_ENABLE_OBJECT_DEPENDENCY, + VB_OBJ_MURE2_SET_CHILD_ROOM, + VB_OBJ_MURE3_DROP_COLLECTIBLE, } GIVanillaBehavior; typedef enum { diff --git a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp index 465d6f132..4689fc867 100644 --- a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp +++ b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp @@ -30,13 +30,13 @@ void MiscVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list opti } } -RandoCheckId Rando::ActorBehavior::GetActorRandoCheckId(Actor* actor) { - const ActorRandoCheckId* actorRandoCheckId = ObjectExtension::GetInstance().Get<ActorRandoCheckId>(actor); +RandoCheckId Rando::ActorBehavior::GetObjectRandoCheckId(void* object) { + const ActorRandoCheckId* actorRandoCheckId = ObjectExtension::GetInstance().Get<ActorRandoCheckId>(object); return actorRandoCheckId != nullptr ? actorRandoCheckId->randoCheckId : RC_UNKNOWN; } -void Rando::ActorBehavior::SetActorRandoCheckId(const Actor* actor, RandoCheckId rc) { - ObjectExtension::GetInstance().Set<ActorRandoCheckId>(actor, ActorRandoCheckId{ rc }); +void Rando::ActorBehavior::SetObjectRandoCheckId(const void* object, RandoCheckId rc) { + ObjectExtension::GetInstance().Set<ActorRandoCheckId>(object, ActorRandoCheckId{ rc }); } // Entry point for the module, run once on game boot diff --git a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h index 40e0993aa..019a08a44 100644 --- a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h +++ b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h @@ -10,8 +10,8 @@ namespace ActorBehavior { void Init(); void OnFileLoad(); -RandoCheckId GetActorRandoCheckId(Actor* actor); -void SetActorRandoCheckId(const Actor* actor, RandoCheckId rc); +RandoCheckId GetObjectRandoCheckId(void* actor); +void SetObjectRandoCheckId(const void* object, RandoCheckId rc); void InitDmChar01Behavior(); void InitDmChar05Behavior(); diff --git a/mm/2s2h/Rando/ActorBehavior/EnCow.cpp b/mm/2s2h/Rando/ActorBehavior/EnCow.cpp index cbd93de7f..854b04f63 100644 --- a/mm/2s2h/Rando/ActorBehavior/EnCow.cpp +++ b/mm/2s2h/Rando/ActorBehavior/EnCow.cpp @@ -1,63 +1,77 @@ #include "ActorBehavior.h" #include <libultraship/bridge/consolevariablebridge.h> +#include "2s2h/ObjectExtension/ActorListIndex.h" extern "C" { #include "variables.h" #include "overlays/actors/ovl_En_Cow/z_en_cow.h" } -#define IS_AT(xx, zz) (actor->home.pos.x == xx && actor->home.pos.z == zz) +std::map<std::tuple<s16, s16, s16>, RandoCheckId> cowMap = { + { { SCENE_REDEAD, 9, 0 }, RC_BENEATH_THE_WELL_COW }, + { { SCENE_F01, 0, 7 }, RC_ROMANI_RANCH_FIELD_COW_ENTRANCE }, + { { SCENE_F01, 0, 8 }, RC_ROMANI_RANCH_FIELD_COW_NEAR_HOUSE_BACK }, + { { SCENE_F01, 0, 9 }, RC_ROMANI_RANCH_FIELD_COW_NEAR_HOUSE_FRONT }, + { { SCENE_OMOYA, 0, 5 }, RC_ROMANI_RANCH_BARN_COW_MIDDLE }, + { { SCENE_OMOYA, 0, 6 }, RC_ROMANI_RANCH_BARN_COW_LEFT }, + { { SCENE_OMOYA, 0, 7 }, RC_ROMANI_RANCH_BARN_COW_RIGHT }, + { { SCENE_KAKUSIANA, 10, 3 }, RC_GREAT_BAY_COAST_COW_BACK }, + { { SCENE_KAKUSIANA, 10, 7 }, RC_GREAT_BAY_COAST_COW_FRONT }, +}; -RandoCheckId IdentifyCow(Actor* actor) { - RandoCheckId randoCheckId = RC_UNKNOWN; - s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_UNK_3].data; - switch (gPlayState->sceneId) { - case SCENE_REDEAD: - randoCheckId = RC_BENEATH_THE_WELL_COW; - break; - case SCENE_F01: - if (IS_AT(1947.0f, 1152.0f)) { - randoCheckId = RC_ROMANI_RANCH_FIELD_COW_ENTRANCE; - } else if (IS_AT(1126.0f, -1527.0f)) { - randoCheckId = RC_ROMANI_RANCH_FIELD_COW_NEAR_HOUSE_BACK; - } else if (IS_AT(1086.0f, -1290.0f)) { - randoCheckId = RC_ROMANI_RANCH_FIELD_COW_NEAR_HOUSE_FRONT; - } - break; - case SCENE_OMOYA: - if (IS_AT(-311.0f, -97.0f)) { - randoCheckId = RC_ROMANI_RANCH_BARN_COW_MIDDLE; - } else if (IS_AT(-82.0f, -127.0f)) { - randoCheckId = RC_ROMANI_RANCH_BARN_COW_LEFT; - } else if (IS_AT(-83.0f, -32.0f)) { - randoCheckId = RC_ROMANI_RANCH_BARN_COW_RIGHT; +void Rando::ActorBehavior::InitEnCowBehavior() { + // Identify cow based on scene ID, room, and actor list index + COND_ID_HOOK(ShouldActorInit, ACTOR_EN_COW, IS_RANDO, [](Actor* actor, bool* should) { + RandoCheckId randoCheckId = RC_UNKNOWN; + + s16 actorListIndex = GetActorListIndex(actor); + auto it = cowMap.find({ gPlayState->sceneId, gPlayState->roomCtx.curRoom.num, actorListIndex }); + if (it != cowMap.end()) { + randoCheckId = it->second; + // Adjust for Termina Field cow grotto + if (gPlayState->sceneId == SCENE_KAKUSIANA && gSaveContext.respawn[RESPAWN_MODE_UNK_3].data == 31) { + randoCheckId = (RandoCheckId)(randoCheckId + (RC_TERMINA_FIELD_COW_BACK - RC_GREAT_BAY_COAST_COW_BACK)); } - break; - case SCENE_KAKUSIANA: - if (respawnData == -1) { - if (IS_AT(2394.0f, 907.0f)) { - randoCheckId = RC_GREAT_BAY_COAST_COW_BACK; - } - if (IS_AT(2466.0f, 952.0f)) { - randoCheckId = RC_GREAT_BAY_COAST_COW_FRONT; - } + + if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { + return; } - if (respawnData == 31) { - if (IS_AT(2394.0f, 907.0f)) { - randoCheckId = RC_TERMINA_FIELD_COW_BACK; - } - if (IS_AT(2466.0f, 952.0f)) { - randoCheckId = RC_TERMINA_FIELD_COW_FRONT; - } + + SetObjectRandoCheckId(actor, randoCheckId); + + switch (randoCheckId) { + case RC_ROMANI_RANCH_BARN_COW_LEFT: + actor->world.pos.x = -470.0f; + actor->world.pos.y = 1.0f; + actor->world.pos.z = 53.0f; + actor->shape.rot.y = 7116.0f; + break; + case RC_ROMANI_RANCH_BARN_COW_RIGHT: + actor->world.pos.x = -208.0f; + actor->world.pos.y = 0.0f; + actor->world.pos.z = 87.0f; + actor->shape.rot.y = -32768.0f; + break; + case RC_GREAT_BAY_COAST_COW_FRONT: + case RC_TERMINA_FIELD_COW_FRONT: + actor->world.pos.x = 2503.0f; + actor->world.pos.y = 0.0f; + actor->world.pos.z = 907.0f; + actor->shape.rot.y = -5085.0f; + break; + case RC_GREAT_BAY_COAST_COW_BACK: + case RC_TERMINA_FIELD_COW_BACK: + actor->world.pos.x = 2269.0f; + actor->world.pos.y = 0.0f; + actor->world.pos.z = 907.0f; + actor->shape.rot.y = 2950.0f; + break; + default: + break; } - break; - default: - break; - } - return randoCheckId; -} + } + }); -void Rando::ActorBehavior::InitEnCowBehavior() { COND_VB_SHOULD(VB_GIVE_ITEM_FROM_COW, IS_RANDO, { // Original Should is the Range check, if it fails just Return. Actor* actor = va_arg(args, Actor*); @@ -66,7 +80,7 @@ void Rando::ActorBehavior::InitEnCowBehavior() { *should = false; return; } - RandoCheckId randoCheckId = IdentifyCow(actor); + RandoCheckId randoCheckId = GetObjectRandoCheckId(actor); if (randoCheckId == RC_UNKNOWN) { *should = true; @@ -90,38 +104,4 @@ void Rando::ActorBehavior::InitEnCowBehavior() { } *should = gPlayState->msgCtx.songPlayed == OCARINA_SONG_EPONAS; }); - - COND_ID_HOOK(ShouldActorInit, ACTOR_EN_COW, IS_RANDO, [](Actor* refActor, bool* should) { - RandoCheckId randoCheckId = IdentifyCow(refActor); - switch (randoCheckId) { - case RC_ROMANI_RANCH_BARN_COW_LEFT: - refActor->world.pos.x = -470.0f; - refActor->world.pos.y = 1.0f; - refActor->world.pos.z = 53.0f; - refActor->shape.rot.y = 7116.0f; - break; - case RC_ROMANI_RANCH_BARN_COW_RIGHT: - refActor->world.pos.x = -208.0f; - refActor->world.pos.y = 0.0f; - refActor->world.pos.z = 87.0f; - refActor->shape.rot.y = -32768.0f; - break; - case RC_GREAT_BAY_COAST_COW_FRONT: - case RC_TERMINA_FIELD_COW_FRONT: - refActor->world.pos.x = 2503.0f; - refActor->world.pos.y = 0.0f; - refActor->world.pos.z = 907.0f; - refActor->shape.rot.y = -5085.0f; - break; - case RC_GREAT_BAY_COAST_COW_BACK: - case RC_TERMINA_FIELD_COW_BACK: - refActor->world.pos.x = 2269.0f; - refActor->world.pos.y = 0.0f; - refActor->world.pos.z = 907.0f; - refActor->shape.rot.y = 2950.0f; - break; - default: - break; - } - }); } diff --git a/mm/2s2h/Rando/ActorBehavior/EnItem00.cpp b/mm/2s2h/Rando/ActorBehavior/EnItem00.cpp index 604c48883..4daa74bb1 100644 --- a/mm/2s2h/Rando/ActorBehavior/EnItem00.cpp +++ b/mm/2s2h/Rando/ActorBehavior/EnItem00.cpp @@ -1,33 +1,89 @@ #include "ActorBehavior.h" #include <libultraship/bridge/consolevariablebridge.h> +#include "2s2h/ObjectExtension/ActorListIndex.h" #include "2s2h/CustomItem/CustomItem.h" extern "C" { #include "functions.h" #include "variables.h" +#include "overlays/actors/ovl_Obj_Mure3/z_obj_mure3.h" } -std::map<std::pair<float, float>, RandoCheckId> freestandingMap = { - // Beneath the Graveyard // - { { -99.000000f, -260.000000f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_FREESTANDING_RUPEE_01 }, - { { -133.640945f, -280.000610f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_FREESTANDING_RUPEE_02 }, - { { -133.640945f, -319.999390f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_FREESTANDING_RUPEE_03 }, - { { -99.000000f, -340.000000f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_FREESTANDING_RUPEE_04 }, - { { -64.359055f, -319.999390f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_FREESTANDING_RUPEE_05 }, - { { -64.359055f, -280.000610f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_FREESTANDING_RUPEE_06 }, - { { -99.000000f, -300.000000f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_FREESTANDING_RUPEE_07 }, - - // Deku Palace // - { { 439.640961f, 1368.999390f }, RC_DEKU_PALACE_FREESTANDING_RUPEE_12 }, - { { 439.640961f, 1329.000610f }, RC_DEKU_PALACE_FREESTANDING_RUPEE_13 }, - { { 405.0f, 1309.0f }, RC_DEKU_PALACE_FREESTANDING_RUPEE_14 }, - { { 370.359039f, 1329.000610f }, RC_DEKU_PALACE_FREESTANDING_RUPEE_15 }, - { { 370.359039f, 1368.999390f }, RC_DEKU_PALACE_FREESTANDING_RUPEE_16 }, - { { 405.0, 1389.0 }, RC_DEKU_PALACE_FREESTANDING_RUPEE_17 }, - { { 405.0, 1349.0 }, RC_DEKU_PALACE_FREESTANDING_RUPEE_18 }, +std::map<std::tuple<u16, u8, s16>, RandoCheckId> freestandingMap = { + { { SCENE_HAKASHITA, 0, 0 }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_FREESTANDING_RUPEE_01 }, + { { SCENE_22DEKUCITY, 1, 17 }, RC_DEKU_PALACE_FREESTANDING_RUPEE_12 }, }; +EnItem00* spawnReplacementItem(Vec3f& pos, Rando::StaticData::RandoStaticCheck& randoStaticCheck) { + s16 itemParams = CustomItem::KILL_ON_TOUCH; + // Freestanding PoH & HC cannot be picked up by boomerangs + if (randoStaticCheck.randoCheckType == RCTYPE_FREESTANDING) { + itemParams |= CustomItem::ABLE_TO_ZORA_RANG; + } + // The heart piece in the bio baba grotto beehive needs to be tossed to fall to the ground + if (randoStaticCheck.randoCheckId == RC_TERMINA_FIELD_BIO_BABA_GROTTO) { + itemParams |= CustomItem::TOSS_ON_SPAWN; + } + + // If it hasn't been collected yet, spawn a dummy item + return CustomItem::Spawn( + pos.x, pos.y, pos.z, 0, itemParams, randoStaticCheck.randoCheckId, + [](Actor* actor, PlayState* play) { + auto& randoStaticCheck = Rando::StaticData::Checks[(RandoCheckId)CUSTOM_ITEM_PARAM]; + switch (randoStaticCheck.flagType) { + case FLAG_NONE: + if (RANDO_SAVE_CHECKS[randoStaticCheck.randoCheckId].shuffled) { + RANDO_SAVE_CHECKS[randoStaticCheck.randoCheckId].eligible = true; + } + break; + case FLAG_CYCL_SCENE_COLLECTIBLE: + Flags_SetCollectible(play, randoStaticCheck.flag); + break; + default: + break; + } + }, + [](Actor* actor, PlayState* play) { + auto& randoSaveCheck = RANDO_SAVE_CHECKS[CUSTOM_ITEM_PARAM]; + Matrix_Scale(30.0f, 30.0f, 30.0f, MTXMODE_APPLY); + Rando::DrawItem(Rando::ConvertItem(randoSaveCheck.randoItemId, (RandoCheckId)CUSTOM_ITEM_PARAM), actor); + }); +} + void Rando::ActorBehavior::InitEnItem00Behavior() { + // Identify freestanding based on the spawner's scene ID, room, and actor list index. The resulting RC is the base + // value, with each child incrementing to it to get its own RC. The RCs must be contiguous for this to work. + COND_VB_SHOULD(VB_OBJ_MURE3_DROP_COLLECTIBLE, IS_RANDO, { + Actor* actor = va_arg(args, Actor*); + auto it = freestandingMap.find({ gPlayState->sceneId, actor->room, GetActorListIndex(actor) }); + if (it != freestandingMap.end()) { + s32 i = va_arg(args, s32); + RandoCheckId randoCheckId = static_cast<RandoCheckId>(it->second + i); + auto randoStaticCheck = Rando::StaticData::Checks[randoCheckId]; + auto randoSaveCheck = RANDO_SAVE_CHECKS[randoStaticCheck.randoCheckId]; + if (randoSaveCheck.shuffled && !randoSaveCheck.cycleObtained) { + ObjMure3* objMure3 = (ObjMure3*)actor; + Vec3f spawnPos; + spawnPos.y = objMure3->actor.world.pos.y; + if (i < 6) { // Ring of Rupees + s16 yRot = objMure3->actor.world.rot.y + 0x2AAA * i; + spawnPos.x = (Math_SinS(yRot) * 40.0f) + objMure3->actor.world.pos.x; + spawnPos.z = (Math_CosS(yRot) * 40.0f) + objMure3->actor.world.pos.z; + objMure3->unk148[i] = spawnReplacementItem(spawnPos, randoStaticCheck); + objMure3->unk148[i]->actor.room = actor->room; + } else { // Center Rupee + spawnPos.x = objMure3->actor.world.pos.x; + spawnPos.z = objMure3->actor.world.pos.z; + objMure3->unk160 = (Actor*)spawnReplacementItem(spawnPos, randoStaticCheck); + objMure3->unk160->room = actor->room; + } + *should = false; + } + } + }); + + // For freestandings that are identifiable based on collectible flags, pre-empt their normal spawns and spawn a + // custom item in their places. COND_ID_HOOK(ShouldActorInit, ACTOR_EN_ITEM00, IS_RANDO, [](Actor* actor, bool* should) { EnItem00* item00 = (EnItem00*)actor; @@ -39,12 +95,7 @@ void Rando::ActorBehavior::InitEnItem00Behavior() { auto randoStaticCheck = Rando::StaticData::GetCheckFromFlag(FLAG_CYCL_SCENE_COLLECTIBLE, ENITEM00_GET_7F00(actor), gPlayState->sceneId); if (randoStaticCheck.randoCheckId == RC_UNKNOWN) { - auto it = freestandingMap.find({ item00->actor.home.pos.x, item00->actor.home.pos.z }); - if (it == freestandingMap.end()) { - return; - } else { - randoStaticCheck = Rando::StaticData::Checks[it->second]; - } + return; } // Pots handle their own items, ignore them @@ -61,38 +112,6 @@ void Rando::ActorBehavior::InitEnItem00Behavior() { // Prevent the original item from spawning *should = false; - s16 itemParams = CustomItem::KILL_ON_TOUCH; - // Freestanding PoH & HC cannot be picked up by boomerangs - if (randoStaticCheck.randoCheckType == RCTYPE_FREESTANDING) { - itemParams |= CustomItem::ABLE_TO_ZORA_RANG; - } - // The heart piece in the bio baba grotto beehive needs to be tossed to fall to the ground - if (randoStaticCheck.randoCheckId == RC_TERMINA_FIELD_BIO_BABA_GROTTO) { - itemParams |= CustomItem::TOSS_ON_SPAWN; - } - - // If it hasn't been collected yet, spawn a dummy item - CustomItem::Spawn( - actor->world.pos.x, actor->world.pos.y, actor->world.pos.z, 0, itemParams, randoStaticCheck.randoCheckId, - [](Actor* actor, PlayState* play) { - auto& randoStaticCheck = Rando::StaticData::Checks[(RandoCheckId)CUSTOM_ITEM_PARAM]; - switch (randoStaticCheck.flagType) { - case FLAG_NONE: - if (RANDO_SAVE_CHECKS[randoStaticCheck.randoCheckId].shuffled) { - RANDO_SAVE_CHECKS[randoStaticCheck.randoCheckId].eligible = true; - } - break; - case FLAG_CYCL_SCENE_COLLECTIBLE: - Flags_SetCollectible(play, randoStaticCheck.flag); - break; - default: - break; - } - }, - [](Actor* actor, PlayState* play) { - auto& randoSaveCheck = RANDO_SAVE_CHECKS[CUSTOM_ITEM_PARAM]; - Matrix_Scale(30.0f, 30.0f, 30.0f, MTXMODE_APPLY); - Rando::DrawItem(Rando::ConvertItem(randoSaveCheck.randoItemId, (RandoCheckId)CUSTOM_ITEM_PARAM), actor); - }); + spawnReplacementItem(actor->world.pos, randoStaticCheck); }); } diff --git a/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp b/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp index 7a6727fbb..8f3ec4494 100644 --- a/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp +++ b/mm/2s2h/Rando/ActorBehavior/ObjGrass.cpp @@ -4,6 +4,8 @@ #include "2s2h/CustomItem/CustomItem.h" #include "2s2h/Rando/Rando.h" #include "2s2h/ShipInit.hpp" +#include "2s2h/ObjectExtension/ActorListIndex.h" +#include "2s2h/ObjectExtension/ObjectExtension.h" #include "2s2h/Enhancements/FrameInterpolation/FrameInterpolation.h" #include "assets/2s2h_assets.h" #include "assets/overlays/ovl_Obj_Grass/ovl_Obj_Grass.h" @@ -13,1014 +15,130 @@ extern "C" { #include "overlays/actors/ovl_Obj_Grass/z_obj_grass.h" #include "overlays/actors/ovl_En_Kusa/z_en_kusa.h" #include "overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.h" +#include "overlays/actors/ovl_Obj_Mure2/z_obj_mure2.h" void ObjGrass_OverrideMatrixCurrent(MtxF* matrix); +extern ObjGrass* sGrassManager; } // clang-format off -std::map<int16_t, std::map<std::pair<float, float>, RandoCheckId>> overworldGrassMap = { - // Termina Field // - { SCENE_00KEIKOKU, - { - { { -3932.00f, 2092.00f }, RC_TERMINA_FIELD_GRASS_01 }, - { { -3954.00f, 2122.00f }, RC_TERMINA_FIELD_GRASS_02 }, - { { -3996.00f, 2118.00f }, RC_TERMINA_FIELD_GRASS_03 }, - { { -4012.00f, 2080.00f }, RC_TERMINA_FIELD_GRASS_04 }, - { { -3972.00f, 2066.00f }, RC_TERMINA_FIELD_GRASS_05 }, - { { -3901.00f, 2122.00f }, RC_TERMINA_FIELD_GRASS_06 }, - { { -3972.00f, 2166.00f }, RC_TERMINA_FIELD_GRASS_07 }, - { { -4043.00f, 2122.00f }, RC_TERMINA_FIELD_GRASS_08 }, - { { -4043.00f, 2050.00f }, RC_TERMINA_FIELD_GRASS_09 }, - { { -4008.00f, 2015.00f }, RC_TERMINA_FIELD_GRASS_10 }, - { { -3960.00f, 2007.00f }, RC_TERMINA_FIELD_GRASS_11 }, - { { -3930.00f, 2044.00f }, RC_TERMINA_FIELD_GRASS_12 }, - { { -3036.00f, 2613.00f }, RC_TERMINA_FIELD_GRASS_13 }, - { { -3058.00f, 2643.00f }, RC_TERMINA_FIELD_GRASS_14 }, - { { -3100.00f, 2639.00f }, RC_TERMINA_FIELD_GRASS_15 }, - { { -3116.00f, 2601.00f }, RC_TERMINA_FIELD_GRASS_16 }, - { { -3076.00f, 2587.00f }, RC_TERMINA_FIELD_GRASS_17 }, - { { -3005.00f, 2643.00f }, RC_TERMINA_FIELD_GRASS_18 }, - { { -3076.00f, 2687.00f }, RC_TERMINA_FIELD_GRASS_19 }, - { { -3147.00f, 2643.00f }, RC_TERMINA_FIELD_GRASS_20 }, - { { -3147.00f, 2571.00f }, RC_TERMINA_FIELD_GRASS_21 }, - { { -3112.00f, 2536.00f }, RC_TERMINA_FIELD_GRASS_22 }, - { { -3064.00f, 2528.00f }, RC_TERMINA_FIELD_GRASS_23 }, - { { -3034.00f, 2565.00f }, RC_TERMINA_FIELD_GRASS_24 }, - { { -2852.00f, 1585.00f }, RC_TERMINA_FIELD_GRASS_25 }, - { { -2874.00f, 1615.00f }, RC_TERMINA_FIELD_GRASS_26 }, - { { -2916.00f, 1611.00f }, RC_TERMINA_FIELD_GRASS_27 }, - { { -2932.00f, 1573.00f }, RC_TERMINA_FIELD_GRASS_28 }, - { { -2892.00f, 1559.00f }, RC_TERMINA_FIELD_GRASS_29 }, - { { -2821.00f, 1615.00f }, RC_TERMINA_FIELD_GRASS_30 }, - { { -2892.00f, 1659.00f }, RC_TERMINA_FIELD_GRASS_31 }, - { { -2963.00f, 1615.00f }, RC_TERMINA_FIELD_GRASS_32 }, - { { -2963.00f, 1543.00f }, RC_TERMINA_FIELD_GRASS_33 }, - { { -2928.00f, 1508.00f }, RC_TERMINA_FIELD_GRASS_34 }, - { { -2880.00f, 1500.00f }, RC_TERMINA_FIELD_GRASS_35 }, - { { -2850.00f, 1537.00f }, RC_TERMINA_FIELD_GRASS_36 }, - { { -2676.00f, -1137.00f }, RC_TERMINA_FIELD_GRASS_37 }, - { { -2698.00f, -1107.00f }, RC_TERMINA_FIELD_GRASS_38 }, - { { -2740.00f, -1111.00f }, RC_TERMINA_FIELD_GRASS_39 }, - { { -2756.00f, -1149.00f }, RC_TERMINA_FIELD_GRASS_40 }, - { { -2716.00f, -1163.00f }, RC_TERMINA_FIELD_GRASS_41 }, - { { -2645.00f, -1107.00f }, RC_TERMINA_FIELD_GRASS_42 }, - { { -2716.00f, -1063.00f }, RC_TERMINA_FIELD_GRASS_43 }, - { { -2787.00f, -1107.00f }, RC_TERMINA_FIELD_GRASS_44 }, - { { -2787.00f, -1179.00f }, RC_TERMINA_FIELD_GRASS_45 }, - { { -2752.00f, -1214.00f }, RC_TERMINA_FIELD_GRASS_46 }, - { { -2704.00f, -1222.00f }, RC_TERMINA_FIELD_GRASS_47 }, - { { -2674.00f, -1185.00f }, RC_TERMINA_FIELD_GRASS_48 }, - { { -2645.00f, 4303.00f }, RC_TERMINA_FIELD_GRASS_49 }, - { { -2667.00f, 4333.00f }, RC_TERMINA_FIELD_GRASS_50 }, - { { -2709.00f, 4329.00f }, RC_TERMINA_FIELD_GRASS_51 }, - { { -2725.00f, 4291.00f }, RC_TERMINA_FIELD_GRASS_52 }, - { { -2685.00f, 4277.00f }, RC_TERMINA_FIELD_GRASS_53 }, - { { -2614.00f, 4333.00f }, RC_TERMINA_FIELD_GRASS_54 }, - { { -2685.00f, 4377.00f }, RC_TERMINA_FIELD_GRASS_55 }, - { { -2756.00f, 4333.00f }, RC_TERMINA_FIELD_GRASS_56 }, - { { -2756.00f, 4261.00f }, RC_TERMINA_FIELD_GRASS_57 }, - { { -2721.00f, 4226.00f }, RC_TERMINA_FIELD_GRASS_58 }, - { { -2673.00f, 4218.00f }, RC_TERMINA_FIELD_GRASS_59 }, - { { -2643.00f, 4255.00f }, RC_TERMINA_FIELD_GRASS_60 }, - { { -1418.00f, -2600.00f }, RC_TERMINA_FIELD_GRASS_61 }, - { { -1440.00f, -2570.00f }, RC_TERMINA_FIELD_GRASS_62 }, - { { -1482.00f, -2574.00f }, RC_TERMINA_FIELD_GRASS_63 }, - { { -1498.00f, -2612.00f }, RC_TERMINA_FIELD_GRASS_64 }, - { { -1458.00f, -2626.00f }, RC_TERMINA_FIELD_GRASS_65 }, - { { -1387.00f, -2570.00f }, RC_TERMINA_FIELD_GRASS_66 }, - { { -1458.00f, -2526.00f }, RC_TERMINA_FIELD_GRASS_67 }, - { { -1529.00f, -2570.00f }, RC_TERMINA_FIELD_GRASS_68 }, - { { -1529.00f, -2642.00f }, RC_TERMINA_FIELD_GRASS_69 }, - { { -1494.00f, -2677.00f }, RC_TERMINA_FIELD_GRASS_70 }, - { { -1446.00f, -2685.00f }, RC_TERMINA_FIELD_GRASS_71 }, - { { -1416.00f, -2648.00f }, RC_TERMINA_FIELD_GRASS_72 }, - { { -1383.00f, 3960.00f }, RC_TERMINA_FIELD_GRASS_73 }, - { { -1405.00f, 3990.00f }, RC_TERMINA_FIELD_GRASS_74 }, - { { -1447.00f, 3986.00f }, RC_TERMINA_FIELD_GRASS_75 }, - { { -1463.00f, 3948.00f }, RC_TERMINA_FIELD_GRASS_76 }, - { { -1423.00f, 3934.00f }, RC_TERMINA_FIELD_GRASS_77 }, - { { -1352.00f, 3990.00f }, RC_TERMINA_FIELD_GRASS_78 }, - { { -1423.00f, 4034.00f }, RC_TERMINA_FIELD_GRASS_79 }, - { { -1494.00f, 3990.00f }, RC_TERMINA_FIELD_GRASS_80 }, - { { -1494.00f, 3918.00f }, RC_TERMINA_FIELD_GRASS_81 }, - { { -1459.00f, 3883.00f }, RC_TERMINA_FIELD_GRASS_82 }, - { { -1411.00f, 3875.00f }, RC_TERMINA_FIELD_GRASS_83 }, - { { -1381.00f, 3912.00f }, RC_TERMINA_FIELD_GRASS_84 }, - { { -271.00f, 3243.00f }, RC_TERMINA_FIELD_GRASS_85 }, - { { -293.00f, 3273.00f }, RC_TERMINA_FIELD_GRASS_86 }, - { { -335.00f, 3269.00f }, RC_TERMINA_FIELD_GRASS_87 }, - { { -351.00f, 3231.00f }, RC_TERMINA_FIELD_GRASS_88 }, - { { -311.00f, 3217.00f }, RC_TERMINA_FIELD_GRASS_89 }, - { { -240.00f, 3273.00f }, RC_TERMINA_FIELD_GRASS_90 }, - { { -311.00f, 3317.00f }, RC_TERMINA_FIELD_GRASS_91 }, - { { -382.00f, 3273.00f }, RC_TERMINA_FIELD_GRASS_92 }, - { { -382.00f, 3201.00f }, RC_TERMINA_FIELD_GRASS_93 }, - { { -347.00f, 3166.00f }, RC_TERMINA_FIELD_GRASS_94 }, - { { -299.00f, 3158.00f }, RC_TERMINA_FIELD_GRASS_95 }, - { { -269.00f, 3195.00f }, RC_TERMINA_FIELD_GRASS_96 }, - { { 954.00f, -2549.00f }, RC_TERMINA_FIELD_GRASS_97 }, - { { 932.00f, -2519.00f }, RC_TERMINA_FIELD_GRASS_98 }, - { { 890.00f, -2523.00f }, RC_TERMINA_FIELD_GRASS_99 }, - { { 874.00f, -2561.00f }, RC_TERMINA_FIELD_GRASS_100 }, - { { 914.00f, -2575.00f }, RC_TERMINA_FIELD_GRASS_101 }, - { { 985.00f, -2519.00f }, RC_TERMINA_FIELD_GRASS_102 }, - { { 914.00f, -2475.00f }, RC_TERMINA_FIELD_GRASS_103 }, - { { 843.00f, -2519.00f }, RC_TERMINA_FIELD_GRASS_104 }, - { { 843.00f, -2591.00f }, RC_TERMINA_FIELD_GRASS_105 }, - { { 878.00f, -2626.00f }, RC_TERMINA_FIELD_GRASS_106 }, - { { 926.00f, -2634.00f }, RC_TERMINA_FIELD_GRASS_107 }, - { { 956.00f, -2597.00f }, RC_TERMINA_FIELD_GRASS_108 }, - { { 1286.00f, 3183.00f }, RC_TERMINA_FIELD_GRASS_109 }, - { { 1264.00f, 3213.00f }, RC_TERMINA_FIELD_GRASS_110 }, - { { 1222.00f, 3209.00f }, RC_TERMINA_FIELD_GRASS_111 }, - { { 1206.00f, 3171.00f }, RC_TERMINA_FIELD_GRASS_112 }, - { { 1246.00f, 3157.00f }, RC_TERMINA_FIELD_GRASS_113 }, - { { 1317.00f, 3213.00f }, RC_TERMINA_FIELD_GRASS_114 }, - { { 1246.00f, 3257.00f }, RC_TERMINA_FIELD_GRASS_115 }, - { { 1175.00f, 3213.00f }, RC_TERMINA_FIELD_GRASS_116 }, - { { 1175.00f, 3141.00f }, RC_TERMINA_FIELD_GRASS_117 }, - { { 1210.00f, 3106.00f }, RC_TERMINA_FIELD_GRASS_118 }, - { { 1258.00f, 3098.00f }, RC_TERMINA_FIELD_GRASS_119 }, - { { 1288.00f, 3135.00f }, RC_TERMINA_FIELD_GRASS_120 }, - { { 1554.00f, 2053.00f }, RC_TERMINA_FIELD_GRASS_121 }, - { { 1532.00f, 2083.00f }, RC_TERMINA_FIELD_GRASS_122 }, - { { 1490.00f, 2079.00f }, RC_TERMINA_FIELD_GRASS_123 }, - { { 1474.00f, 2041.00f }, RC_TERMINA_FIELD_GRASS_124 }, - { { 1514.00f, 2027.00f }, RC_TERMINA_FIELD_GRASS_125 }, - { { 1585.00f, 2083.00f }, RC_TERMINA_FIELD_GRASS_126 }, - { { 1514.00f, 2127.00f }, RC_TERMINA_FIELD_GRASS_127 }, - { { 1443.00f, 2083.00f }, RC_TERMINA_FIELD_GRASS_128 }, - { { 1443.00f, 2011.00f }, RC_TERMINA_FIELD_GRASS_129 }, - { { 1478.00f, 1976.00f }, RC_TERMINA_FIELD_GRASS_130 }, - { { 1526.00f, 1968.00f }, RC_TERMINA_FIELD_GRASS_131 }, - { { 1556.00f, 2005.00f }, RC_TERMINA_FIELD_GRASS_132 }, - { { 1770.00f, 2736.00f }, RC_TERMINA_FIELD_GRASS_133 }, - { { 1748.00f, 2766.00f }, RC_TERMINA_FIELD_GRASS_134 }, - { { 1706.00f, 2762.00f }, RC_TERMINA_FIELD_GRASS_135 }, - { { 1690.00f, 2724.00f }, RC_TERMINA_FIELD_GRASS_136 }, - { { 1730.00f, 2710.00f }, RC_TERMINA_FIELD_GRASS_137 }, - { { 1801.00f, 2766.00f }, RC_TERMINA_FIELD_GRASS_138 }, - { { 1730.00f, 2810.00f }, RC_TERMINA_FIELD_GRASS_139 }, - { { 1659.00f, 2766.00f }, RC_TERMINA_FIELD_GRASS_140 }, - { { 1659.00f, 2694.00f }, RC_TERMINA_FIELD_GRASS_141 }, - { { 1694.00f, 2659.00f }, RC_TERMINA_FIELD_GRASS_142 }, - { { 1742.00f, 2651.00f }, RC_TERMINA_FIELD_GRASS_143 }, - { { 1772.00f, 2688.00f }, RC_TERMINA_FIELD_GRASS_144 }, - { { 2007.00f, -1295.00f }, RC_TERMINA_FIELD_GRASS_145 }, - { { 1985.00f, -1265.00f }, RC_TERMINA_FIELD_GRASS_146 }, - { { 1943.00f, -1269.00f }, RC_TERMINA_FIELD_GRASS_147 }, - { { 1927.00f, -1307.00f }, RC_TERMINA_FIELD_GRASS_148 }, - { { 1967.00f, -1321.00f }, RC_TERMINA_FIELD_GRASS_149 }, - { { 2038.00f, -1265.00f }, RC_TERMINA_FIELD_GRASS_150 }, - { { 1967.00f, -1221.00f }, RC_TERMINA_FIELD_GRASS_151 }, - { { 1896.00f, -1265.00f }, RC_TERMINA_FIELD_GRASS_152 }, - { { 1896.00f, -1337.00f }, RC_TERMINA_FIELD_GRASS_153 }, - { { 1931.00f, -1372.00f }, RC_TERMINA_FIELD_GRASS_154 }, - { { 1979.00f, -1380.00f }, RC_TERMINA_FIELD_GRASS_155 }, - { { 2009.00f, -1343.00f }, RC_TERMINA_FIELD_GRASS_156 }, - { { 2637.00f, 565.00f }, RC_TERMINA_FIELD_GRASS_157 }, - { { 2615.00f, 595.00f }, RC_TERMINA_FIELD_GRASS_158 }, - { { 2573.00f, 591.00f }, RC_TERMINA_FIELD_GRASS_159 }, - { { 2557.00f, 553.00f }, RC_TERMINA_FIELD_GRASS_160 }, - { { 2597.00f, 539.00f }, RC_TERMINA_FIELD_GRASS_161 }, - { { 2668.00f, 595.00f }, RC_TERMINA_FIELD_GRASS_162 }, - { { 2597.00f, 639.00f }, RC_TERMINA_FIELD_GRASS_163 }, - { { 2526.00f, 595.00f }, RC_TERMINA_FIELD_GRASS_164 }, - { { 2526.00f, 523.00f }, RC_TERMINA_FIELD_GRASS_165 }, - { { 2561.00f, 488.00f }, RC_TERMINA_FIELD_GRASS_166 }, - { { 2609.00f, 480.00f }, RC_TERMINA_FIELD_GRASS_167 }, - { { 2639.00f, 517.00f }, RC_TERMINA_FIELD_GRASS_168 }, - { { 2718.00f, 2414.00f }, RC_TERMINA_FIELD_GRASS_169 }, - { { 2696.00f, 2444.00f }, RC_TERMINA_FIELD_GRASS_170 }, - { { 2654.00f, 2440.00f }, RC_TERMINA_FIELD_GRASS_171 }, - { { 2638.00f, 2402.00f }, RC_TERMINA_FIELD_GRASS_172 }, - { { 2678.00f, 2388.00f }, RC_TERMINA_FIELD_GRASS_173 }, - { { 2749.00f, 2444.00f }, RC_TERMINA_FIELD_GRASS_174 }, - { { 2678.00f, 2488.00f }, RC_TERMINA_FIELD_GRASS_175 }, - { { 2607.00f, 2444.00f }, RC_TERMINA_FIELD_GRASS_176 }, - { { 2607.00f, 2372.00f }, RC_TERMINA_FIELD_GRASS_177 }, - { { 2642.00f, 2337.00f }, RC_TERMINA_FIELD_GRASS_178 }, - { { 2690.00f, 2329.00f }, RC_TERMINA_FIELD_GRASS_179 }, - { { 2720.00f, 2366.00f }, RC_TERMINA_FIELD_GRASS_180 }, - { { 2933.00f, 1832.00f }, RC_TERMINA_FIELD_GRASS_181 }, - { { 2911.00f, 1862.00f }, RC_TERMINA_FIELD_GRASS_182 }, - { { 2869.00f, 1858.00f }, RC_TERMINA_FIELD_GRASS_183 }, - { { 2853.00f, 1820.00f }, RC_TERMINA_FIELD_GRASS_184 }, - { { 2893.00f, 1806.00f }, RC_TERMINA_FIELD_GRASS_185 }, - { { 2964.00f, 1862.00f }, RC_TERMINA_FIELD_GRASS_186 }, - { { 2893.00f, 1906.00f }, RC_TERMINA_FIELD_GRASS_187 }, - { { 2822.00f, 1862.00f }, RC_TERMINA_FIELD_GRASS_188 }, - { { 2822.00f, 1790.00f }, RC_TERMINA_FIELD_GRASS_189 }, - { { 2857.00f, 1755.00f }, RC_TERMINA_FIELD_GRASS_190 }, - { { 2905.00f, 1747.00f }, RC_TERMINA_FIELD_GRASS_191 }, - { { 2935.00f, 1784.00f }, RC_TERMINA_FIELD_GRASS_192 }, - { { 3847.00f, 742.00f }, RC_TERMINA_FIELD_GRASS_193 }, - { { 3825.00f, 772.00f }, RC_TERMINA_FIELD_GRASS_194 }, - { { 3783.00f, 768.00f }, RC_TERMINA_FIELD_GRASS_195 }, - { { 3767.00f, 730.00f }, RC_TERMINA_FIELD_GRASS_196 }, - { { 3807.00f, 716.00f }, RC_TERMINA_FIELD_GRASS_197 }, - { { 3878.00f, 772.00f }, RC_TERMINA_FIELD_GRASS_198 }, - { { 3807.00f, 816.00f }, RC_TERMINA_FIELD_GRASS_199 }, - { { 3736.00f, 772.00f }, RC_TERMINA_FIELD_GRASS_200 }, - { { 3736.00f, 700.00f }, RC_TERMINA_FIELD_GRASS_201 }, - { { 3771.00f, 665.00f }, RC_TERMINA_FIELD_GRASS_202 }, - { { 3819.00f, 657.00f }, RC_TERMINA_FIELD_GRASS_203 }, - { { 3849.00f, 694.00f }, RC_TERMINA_FIELD_GRASS_204 }, - { { 4455.00f, 418.00f }, RC_TERMINA_FIELD_GRASS_205 }, - { { 4433.00f, 448.00f }, RC_TERMINA_FIELD_GRASS_206 }, - { { 4391.00f, 444.00f }, RC_TERMINA_FIELD_GRASS_207 }, - { { 4375.00f, 406.00f }, RC_TERMINA_FIELD_GRASS_208 }, - { { 4415.00f, 392.00f }, RC_TERMINA_FIELD_GRASS_209 }, - { { 4486.00f, 448.00f }, RC_TERMINA_FIELD_GRASS_210 }, - { { 4415.00f, 492.00f }, RC_TERMINA_FIELD_GRASS_211 }, - { { 4344.00f, 448.00f }, RC_TERMINA_FIELD_GRASS_212 }, - { { 4344.00f, 376.00f }, RC_TERMINA_FIELD_GRASS_213 }, - { { 4379.00f, 341.00f }, RC_TERMINA_FIELD_GRASS_214 }, - { { 4427.00f, 333.00f }, RC_TERMINA_FIELD_GRASS_215 }, - { { 4457.00f, 370.00f }, RC_TERMINA_FIELD_GRASS_216 }, - } }, - // Great Bay Coast - { SCENE_30GYOSON, - { - { { 863.00f, 4646.00f }, RC_GREAT_BAY_COAST_GRASS_01 }, - { { 769.00f, 4647.00f }, RC_GREAT_BAY_COAST_GRASS_02 }, - { { 885.00f, 4881.00f }, RC_GREAT_BAY_COAST_GRASS_03 }, - { { 793.00f, 4880.00f }, RC_GREAT_BAY_COAST_GRASS_04 }, - { { 782.00f, 4766.00f }, RC_GREAT_BAY_COAST_GRASS_05 }, - } }, - // Clock Town - { SCENE_ALLEY, - { - { { -1900.00f, 316.00f }, RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_01 }, - { { -1921.00f, 228.00f }, RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_02 }, - { { -1864.00f, 216.00f }, RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_03 }, - } }, - // Romani Ranch - { SCENE_F01, - { - { { -135.00f, 1834.00f }, RC_ROMANI_RANCH_GRASS_01 }, - { { -157.00f, 1864.00f }, RC_ROMANI_RANCH_GRASS_02 }, - { { -199.00f, 1860.00f }, RC_ROMANI_RANCH_GRASS_03 }, - { { -215.00f, 1822.00f }, RC_ROMANI_RANCH_GRASS_04 }, - { { -175.00f, 1808.00f }, RC_ROMANI_RANCH_GRASS_05 }, - { { -104.00f, 1864.00f }, RC_ROMANI_RANCH_GRASS_06 }, - { { -175.00f, 1908.00f }, RC_ROMANI_RANCH_GRASS_07 }, - { { -246.00f, 1864.00f }, RC_ROMANI_RANCH_GRASS_08 }, - { { -246.00f, 1792.00f }, RC_ROMANI_RANCH_GRASS_09 }, - { { -211.00f, 1757.00f }, RC_ROMANI_RANCH_GRASS_10 }, - { { -163.00f, 1749.00f }, RC_ROMANI_RANCH_GRASS_11 }, - { { -133.00f, 1786.00f }, RC_ROMANI_RANCH_GRASS_12 }, - { { -1529.00f, 1630.00f }, RC_ROMANI_RANCH_GRASS_13 }, - { { -1551.00f, 1660.00f }, RC_ROMANI_RANCH_GRASS_14 }, - { { -1593.00f, 1656.00f }, RC_ROMANI_RANCH_GRASS_15 }, - { { -1609.00f, 1618.00f }, RC_ROMANI_RANCH_GRASS_16 }, - { { -1569.00f, 1604.00f }, RC_ROMANI_RANCH_GRASS_17 }, - { { -1498.00f, 1660.00f }, RC_ROMANI_RANCH_GRASS_18 }, - { { -1569.00f, 1704.00f }, RC_ROMANI_RANCH_GRASS_19 }, - { { -1640.00f, 1660.00f }, RC_ROMANI_RANCH_GRASS_20 }, - { { -1640.00f, 1588.00f }, RC_ROMANI_RANCH_GRASS_21 }, - { { -1605.00f, 1553.00f }, RC_ROMANI_RANCH_GRASS_22 }, - { { -1557.00f, 1545.00f }, RC_ROMANI_RANCH_GRASS_23 }, - { { -1527.00f, 1582.00f }, RC_ROMANI_RANCH_GRASS_24 }, - { { 1874.00f, 1167.00f }, RC_ROMANI_RANCH_GRASS_25 }, - { { 1852.00f, 1197.00f }, RC_ROMANI_RANCH_GRASS_26 }, - { { 1810.00f, 1193.00f }, RC_ROMANI_RANCH_GRASS_27 }, - { { 1794.00f, 1155.00f }, RC_ROMANI_RANCH_GRASS_28 }, - { { 1834.00f, 1141.00f }, RC_ROMANI_RANCH_GRASS_29 }, - { { 1905.00f, 1197.00f }, RC_ROMANI_RANCH_GRASS_30 }, - { { 1834.00f, 1241.00f }, RC_ROMANI_RANCH_GRASS_31 }, - { { 1763.00f, 1197.00f }, RC_ROMANI_RANCH_GRASS_32 }, - { { 1763.00f, 1125.00f }, RC_ROMANI_RANCH_GRASS_33 }, - { { 1798.00f, 1090.00f }, RC_ROMANI_RANCH_GRASS_34 }, - { { 1846.00f, 1082.00f }, RC_ROMANI_RANCH_GRASS_35 }, - { { 1876.00f, 1119.00f }, RC_ROMANI_RANCH_GRASS_36 }, - { { 1203.00f, -1379.00f }, RC_ROMANI_RANCH_GRASS_37 }, - { { 1181.00f, -1349.00f }, RC_ROMANI_RANCH_GRASS_38 }, - { { 1139.00f, -1353.00f }, RC_ROMANI_RANCH_GRASS_39 }, - { { 1123.00f, -1391.00f }, RC_ROMANI_RANCH_GRASS_40 }, - { { 1163.00f, -1405.00f }, RC_ROMANI_RANCH_GRASS_41 }, - { { 1234.00f, -1349.00f }, RC_ROMANI_RANCH_GRASS_42 }, - { { 1163.00f, -1305.00f }, RC_ROMANI_RANCH_GRASS_43 }, - { { 1092.00f, -1349.00f }, RC_ROMANI_RANCH_GRASS_44 }, - { { 1092.00f, -1421.00f }, RC_ROMANI_RANCH_GRASS_45 }, - { { 1127.00f, -1456.00f }, RC_ROMANI_RANCH_GRASS_46 }, - { { 1175.00f, -1464.00f }, RC_ROMANI_RANCH_GRASS_47 }, - { { 1205.00f, -1427.00f }, RC_ROMANI_RANCH_GRASS_48 }, - { { -223.00f, -2271.00f }, RC_ROMANI_RANCH_GRASS_49 }, - { { -143.00f, -2271.00f }, RC_ROMANI_RANCH_GRASS_50 }, - { { -166.00f, -2214.00f }, RC_ROMANI_RANCH_GRASS_51 }, - { { -223.00f, -2191.00f }, RC_ROMANI_RANCH_GRASS_52 }, - { { -280.00f, -2214.00f }, RC_ROMANI_RANCH_GRASS_53 }, - { { -303.00f, -2271.00f }, RC_ROMANI_RANCH_GRASS_54 }, - { { -280.00f, -2328.00f }, RC_ROMANI_RANCH_GRASS_55 }, - { { -223.00f, -2351.00f }, RC_ROMANI_RANCH_GRASS_56 }, - { { -166.00f, -2328.00f }, RC_ROMANI_RANCH_GRASS_57 }, - } }, - // Southern Swamp(Cleaned) - { SCENE_20SICHITAI2, - { - { { 115.00f, -977.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_01 }, - { { 93.00f, -947.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_02 }, - { { 51.00f, -951.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_03 }, - { { 35.00f, -989.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_04 }, - { { 75.00f, -1003.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_05 }, - { { 146.00f, -947.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_06 }, - { { 75.00f, -903.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_07 }, - { { 4.00f, -947.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_08 }, - { { 4.00f, -1019.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_09 }, - { { 39.00f, -1054.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_10 }, - { { 87.00f, -1062.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_11 }, - { { 117.00f, -1025.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_12 }, - { { 3013.00f, -896.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_13 }, - { { 3093.00f, -896.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_14 }, - { { 3070.00f, -839.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_15 }, - { { 3013.00f, -816.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_16 }, - { { 2956.00f, -839.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_17 }, - { { 2933.00f, -896.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_18 }, - { { 2956.00f, -953.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_19 }, - { { 3013.00f, -976.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_20 }, - { { 3070.00f, -953.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_21 }, - { { 2982.00f, -1255.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_22 }, - { { 3062.00f, -1255.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_23 }, - { { 3039.00f, -1198.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_24 }, - { { 2982.00f, -1175.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_25 }, - { { 2925.00f, -1198.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_26 }, - { { 2902.00f, -1255.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_27 }, - { { 2925.00f, -1312.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_28 }, - { { 2982.00f, -1335.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_29 }, - { { 3039.00f, -1312.00f }, RC_SOUTHERN_SWAMP_CLEARED_GRASS_30 }, - } }, - // Southern Swamp(Poisoned) - { SCENE_20SICHITAI, - { - { { 115.00f, -977.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_01 }, - { { 93.00f, -947.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_02 }, - { { 51.00f, -951.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_03 }, - { { 35.00f, -989.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_04 }, - { { 75.00f, -1003.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_05 }, - { { 146.00f, -947.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_06 }, - { { 75.00f, -903.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_07 }, - { { 4.00f, -947.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_08 }, - { { 4.00f, -1019.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_09 }, - { { 39.00f, -1054.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_10 }, - { { 87.00f, -1062.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_11 }, - { { 117.00f, -1025.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_12 }, - { { 3013.00f, -896.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_13 }, - { { 3093.00f, -896.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_14 }, - { { 3070.00f, -839.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_15 }, - { { 3013.00f, -816.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_16 }, - { { 2956.00f, -839.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_17 }, - { { 2933.00f, -896.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_18 }, - { { 2956.00f, -953.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_19 }, - { { 3013.00f, -976.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_20 }, - { { 3070.00f, -953.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_21 }, - { { 2982.00f, -1255.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_22 }, - { { 3062.00f, -1255.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_23 }, - { { 3039.00f, -1198.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_24 }, - { { 2982.00f, -1175.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_25 }, - { { 2925.00f, -1198.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_26 }, - { { 2902.00f, -1255.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_27 }, - { { 2925.00f, -1312.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_28 }, - { { 2982.00f, -1335.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_29 }, - { { 3039.00f, -1312.00f }, RC_SOUTHERN_SWAMP_POISON_GRASS_30 }, - } }, - // Road to Southern Swamp - { SCENE_24KEMONOMITI, - { - { { 2734.00f, 3399.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_01 }, - { { 2757.00f, 3443.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_02 }, - { { 127.00f, 1839.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_03 }, - { { 47.00f, 1839.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_04 }, - { { 70.00f, 1782.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_05 }, - { { 127.00f, 1759.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_06 }, - { { 184.00f, 1782.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_07 }, - { { 207.00f, 1839.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_08 }, - { { 184.00f, 1896.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_09 }, - { { 127.00f, 1919.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_10 }, - { { 70.00f, 1896.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_11 }, - { { 321.00f, 1647.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_12 }, - { { 241.00f, 1647.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_13 }, - { { 264.00f, 1590.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_14 }, - { { 321.00f, 1567.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_15 }, - { { 378.00f, 1590.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_16 }, - { { 401.00f, 1647.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_17 }, - { { 378.00f, 1704.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_18 }, - { { 321.00f, 1727.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_19 }, - { { 264.00f, 1704.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_20 }, - } }, - { SCENE_10YUKIYAMANOMURA2, - { - { { -279.00f, 1379.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_01 }, - { { -203.00f, 1155.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_02 }, - { { -545.00f, 1069.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_03 }, - { { 267.00f, 402.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_04 }, - { { 267.00f, 482.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_05 }, - { { 324.00f, 459.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_06 }, - { { 347.00f, 402.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_07 }, - { { 324.00f, 345.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_08 }, - { { 267.00f, 322.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_09 }, - { { 210.00f, 345.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_10 }, - { { 187.00f, 402.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_11 }, - { { 210.00f, 459.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_12 }, - { { 86.00f, 145.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_13 }, - { { 86.00f, 225.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_14 }, - { { 143.00f, 202.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_15 }, - { { 166.00f, 145.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_16 }, - { { 143.00f, 88.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_17 }, - { { 86.00f, 65.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_18 }, - { { 29.00f, 88.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_19 }, - { { 6.00f, 145.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_20 }, - { { 29.00f, 202.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_21 }, - { { 365.00f, 165.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_22 }, - { { 365.00f, 245.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_23 }, - { { 422.00f, 222.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_24 }, - { { 445.00f, 165.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_25 }, - { { 422.00f, 108.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_26 }, - { { 365.00f, 85.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_27 }, - { { 308.00f, 108.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_28 }, - { { 285.00f, 165.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_29 }, - { { 308.00f, 222.00f }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_30 }, - } }, - { SCENE_17SETUGEN2, - { - { { -1383.00f, 1049.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_01 }, - { { -1405.00f, 1079.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_02 }, - { { -1447.00f, 1075.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_03 }, - { { -1463.00f, 1037.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_04 }, - { { -1423.00f, 1023.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_05 }, - { { -1352.00f, 1079.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_06 }, - { { -1423.00f, 1123.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_07 }, - { { -1494.00f, 1079.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_08 }, - { { -1494.00f, 1007.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_09 }, - { { -1459.00f, 972.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_10 }, - { { -1411.00f, 964.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_11 }, - { { -1381.00f, 1001.00f }, RC_TWIN_ISLANDS_SPRING_GRASS_12 }, - } }, - { SCENE_BOTI, - { - { { -597.00f, -1943.00f }, RC_IKANA_GRAVEYARD_GRASS_01 }, - { { -597.00f, -1863.00f }, RC_IKANA_GRAVEYARD_GRASS_02 }, - { { -540.00f, -1886.00f }, RC_IKANA_GRAVEYARD_GRASS_03 }, - { { -517.00f, -1943.00f }, RC_IKANA_GRAVEYARD_GRASS_04 }, - { { -540.00f, -2000.00f }, RC_IKANA_GRAVEYARD_GRASS_05 }, - { { -597.00f, -2023.00f }, RC_IKANA_GRAVEYARD_GRASS_06 }, - { { -654.00f, -2000.00f }, RC_IKANA_GRAVEYARD_GRASS_07 }, - { { -677.00f, -1943.00f }, RC_IKANA_GRAVEYARD_GRASS_08 }, - { { -654.00f, -1886.00f }, RC_IKANA_GRAVEYARD_GRASS_09 }, - } }, - { SCENE_KOEPONARACE, - { - { { 2810.00f, 446.00f }, RC_GORMAN_TRACK_GRASS_01 }, - { { 2788.00f, 476.00f }, RC_GORMAN_TRACK_GRASS_02 }, - { { 2746.00f, 472.00f }, RC_GORMAN_TRACK_GRASS_03 }, - { { 2730.00f, 434.00f }, RC_GORMAN_TRACK_GRASS_04 }, - { { 2770.00f, 420.00f }, RC_GORMAN_TRACK_GRASS_05 }, - { { 2841.00f, 476.00f }, RC_GORMAN_TRACK_GRASS_06 }, - { { 2770.00f, 520.00f }, RC_GORMAN_TRACK_GRASS_07 }, - { { 2699.00f, 476.00f }, RC_GORMAN_TRACK_GRASS_08 }, - { { 2699.00f, 404.00f }, RC_GORMAN_TRACK_GRASS_09 }, - { { 2734.00f, 369.00f }, RC_GORMAN_TRACK_GRASS_10 }, - { { 2782.00f, 361.00f }, RC_GORMAN_TRACK_GRASS_11 }, - { { 2812.00f, 398.00f }, RC_GORMAN_TRACK_GRASS_12 }, - { { 2502.00f, -353.00f }, RC_GORMAN_TRACK_GRASS_13 }, - { { 2480.00f, -323.00f }, RC_GORMAN_TRACK_GRASS_14 }, - { { 2438.00f, -327.00f }, RC_GORMAN_TRACK_GRASS_15 }, - { { 2422.00f, -365.00f }, RC_GORMAN_TRACK_GRASS_16 }, - { { 2462.00f, -379.00f }, RC_GORMAN_TRACK_GRASS_17 }, - { { 2533.00f, -323.00f }, RC_GORMAN_TRACK_GRASS_18 }, - { { 2462.00f, -279.00f }, RC_GORMAN_TRACK_GRASS_19 }, - { { 2391.00f, -323.00f }, RC_GORMAN_TRACK_GRASS_20 }, - { { 2391.00f, -395.00f }, RC_GORMAN_TRACK_GRASS_21 }, - { { 2426.00f, -430.00f }, RC_GORMAN_TRACK_GRASS_22 }, - { { 2474.00f, -438.00f }, RC_GORMAN_TRACK_GRASS_23 }, - { { 2504.00f, -401.00f }, RC_GORMAN_TRACK_GRASS_24 }, - } }, - { SCENE_26SARUNOMORI, - { - { { 81.00f, 85.00f }, RC_WOODS_OF_MYSTERY_GRASS_01 }, - { { 44.00f, 125.00f }, RC_WOODS_OF_MYSTERY_GRASS_02 }, - { { 91.00f, 137.00f }, RC_WOODS_OF_MYSTERY_GRASS_03 }, - { { -77.00f, 779.00f }, RC_WOODS_OF_MYSTERY_GRASS_04 }, - { { 6.00f, 988.00f }, RC_WOODS_OF_MYSTERY_GRASS_05 }, - { { -796.00f, 793.00f }, RC_WOODS_OF_MYSTERY_GRASS_06 }, - { { -946.00f, 1054.00f }, RC_WOODS_OF_MYSTERY_GRASS_07 }, - { { -798.00f, 56.00f }, RC_WOODS_OF_MYSTERY_GRASS_08 }, - { { -872.00f, -3.00f }, RC_WOODS_OF_MYSTERY_GRASS_09 }, - { { -952.00f, 77.00f }, RC_WOODS_OF_MYSTERY_GRASS_10 }, - { { -915.00f, -74.00f }, RC_WOODS_OF_MYSTERY_GRASS_11 }, - { { -958.00f, -755.00f }, RC_WOODS_OF_MYSTERY_GRASS_12 }, - { { -906.00f, -1034.00f }, RC_WOODS_OF_MYSTERY_GRASS_13 }, - { { -1894.00f, -874.00f }, RC_WOODS_OF_MYSTERY_GRASS_14 }, - { { -1876.00f, -821.00f }, RC_WOODS_OF_MYSTERY_GRASS_15 }, - { { -1696.00f, -892.00f }, RC_WOODS_OF_MYSTERY_GRASS_16 }, - { { -1690.00f, -1023.00f }, RC_WOODS_OF_MYSTERY_GRASS_17 }, - { { -1631.00f, -727.00f }, RC_WOODS_OF_MYSTERY_GRASS_18 }, - { { -1942.00f, 42.00f }, RC_WOODS_OF_MYSTERY_GRASS_19 }, - { { -1702.00f, -24.00f }, RC_WOODS_OF_MYSTERY_GRASS_20 }, - { { 100.00f, -970.00f }, RC_WOODS_OF_MYSTERY_GRASS_21 }, - } }, - { SCENE_21MITURINMAE, - { - { { -135.00f, -1401.00f }, RC_WOODFALL_GRASS_01 }, - { { -200.00f, -1447.00f }, RC_WOODFALL_GRASS_02 }, - { { -186.00f, -1379.00f }, RC_WOODFALL_GRASS_03 }, - { { 70.00f, -1409.00f }, RC_WOODFALL_GRASS_04 }, - { { 126.00f, -1455.00f }, RC_WOODFALL_GRASS_05 }, - { { 114.00f, -1377.00f }, RC_WOODFALL_GRASS_06 }, - } }, +// For large swathes of grass that share a singular actor +std::map<std::tuple<s16, u8>, std::tuple<s16, RandoCheckId>> grassObjMap = { + { { SCENE_00KEIKOKU, 0 }, { 18, RC_TERMINA_FIELD_GRASS_01 } }, + { { SCENE_F01, 0 }, { 5, RC_ROMANI_RANCH_GRASS_01 } }, + { { SCENE_20SICHITAI2, 0 }, { 1, RC_SOUTHERN_SWAMP_CLEARED_GRASS_01 } }, + { { SCENE_20SICHITAI2, 2 }, { 1, RC_SOUTHERN_SWAMP_CLEARED_GRASS_13 } }, + { { SCENE_20SICHITAI, 0 }, { 1, RC_SOUTHERN_SWAMP_POISON_GRASS_01 } }, + { { SCENE_20SICHITAI, 2 }, { 1, RC_SOUTHERN_SWAMP_POISON_GRASS_13 } }, + { { SCENE_24KEMONOMITI, 0 }, { 2, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_03 } }, + { { SCENE_17SETUGEN2, 0 }, { 1, RC_TWIN_ISLANDS_SPRING_GRASS_01 } }, + { { SCENE_KOEPONARACE, 0 }, { 2, RC_GORMAN_TRACK_GRASS_01 } }, + { { SCENE_KAKUSIANA, 5 }, { 2, RC_LONE_PEAK_SHRINE_GRASS_01 } }, + { { SCENE_KAKUSIANA, 12 }, { 1, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_01 } }, + { { SCENE_KAKUSIANA, 13 }, { 1, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_01 } }, }; -std::map<int16_t, std::map<std::pair<float, float>, RandoCheckId>> grottoGrassMap = { - { -1, - { - { { 2285.00f, 883.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_01 }, - { { 2263.00f, 913.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_02 }, - { { 2221.00f, 909.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_03 }, - { { 2205.00f, 871.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_04 }, - { { 2245.00f, 857.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_05 }, - { { 2316.00f, 913.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_06 }, - { { 2245.00f, 957.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_07 }, - { { 2174.00f, 913.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_08 }, - { { 2174.00f, 841.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_09 }, - { { 2209.00f, 806.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_10 }, - { { 2257.00f, 798.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_11 }, - { { 2287.00f, 835.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_12 }, - { { 2324.00f, 1073.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_13 }, - { { 2302.00f, 1103.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_14 }, - { { 2260.00f, 1099.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_15 }, - { { 2244.00f, 1061.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_16 }, - { { 2284.00f, 1047.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_17 }, - { { 2355.00f, 1103.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_18 }, - { { 2284.00f, 1147.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_19 }, - { { 2213.00f, 1103.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_20 }, - { { 2213.00f, 1031.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_21 }, - { { 2248.00f, 996.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_22 }, - { { 2296.00f, 988.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_23 }, - { { 2326.00f, 1025.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_24 }, - { { 2438.00f, 993.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_25 }, - { { 2416.00f, 1023.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_26 }, - { { 2374.00f, 1019.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_27 }, - { { 2358.00f, 981.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_28 }, - { { 2398.00f, 967.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_29 }, - { { 2469.00f, 1023.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_30 }, - { { 2398.00f, 1067.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_31 }, - { { 2327.00f, 1023.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_32 }, - { { 2327.00f, 951.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_33 }, - { { 2362.00f, 916.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_34 }, - { { 2410.00f, 908.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_35 }, - { { 2440.00f, 945.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_36 }, - { { 2466.00f, 747.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_37 }, - { { 2444.00f, 777.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_38 }, - { { 2402.00f, 773.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_39 }, - { { 2386.00f, 735.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_40 }, - { { 2426.00f, 721.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_41 }, - { { 2497.00f, 777.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_42 }, - { { 2426.00f, 821.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_43 }, - { { 2355.00f, 777.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_44 }, - { { 2355.00f, 705.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_45 }, - { { 2390.00f, 670.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_46 }, - { { 2438.00f, 662.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_47 }, - { { 2468.00f, 699.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_48 }, - { { 2576.00f, 842.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_49 }, - { { 2554.00f, 872.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_50 }, - { { 2512.00f, 868.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_51 }, - { { 2496.00f, 830.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_52 }, - { { 2536.00f, 816.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_53 }, - { { 2607.00f, 872.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_54 }, - { { 2536.00f, 916.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_55 }, - { { 2465.00f, 872.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_56 }, - { { 2465.00f, 800.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_57 }, - { { 2500.00f, 765.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_58 }, - { { 2548.00f, 757.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_59 }, - { { 2578.00f, 794.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_60 }, - { { 2593.00f, 1073.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_61 }, - { { 2571.00f, 1103.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_62 }, - { { 2529.00f, 1099.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_63 }, - { { 2513.00f, 1061.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_64 }, - { { 2553.00f, 1047.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_65 }, - { { 2624.00f, 1103.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_66 }, - { { 2553.00f, 1147.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_67 }, - { { 2482.00f, 1103.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_68 }, - { { 2482.00f, 1031.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_69 }, - { { 2517.00f, 996.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_70 }, - { { 2565.00f, 988.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_71 }, - { { 2595.00f, 1025.00f }, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_72 }, - } }, - { ENTRANCE(GROTTOS, 16), - { - { { 4323.00f, -466.00f }, RC_LONE_PEAK_SHRINE_GRASS_01 }, - { { 4301.00f, -436.00f }, RC_LONE_PEAK_SHRINE_GRASS_02 }, - { { 4259.00f, -440.00f }, RC_LONE_PEAK_SHRINE_GRASS_03 }, - { { 4243.00f, -478.00f }, RC_LONE_PEAK_SHRINE_GRASS_04 }, - { { 4283.00f, -492.00f }, RC_LONE_PEAK_SHRINE_GRASS_05 }, - { { 4354.00f, -436.00f }, RC_LONE_PEAK_SHRINE_GRASS_06 }, - { { 4283.00f, -392.00f }, RC_LONE_PEAK_SHRINE_GRASS_07 }, - { { 4212.00f, -436.00f }, RC_LONE_PEAK_SHRINE_GRASS_08 }, - { { 4212.00f, -508.00f }, RC_LONE_PEAK_SHRINE_GRASS_09 }, - { { 4247.00f, -543.00f }, RC_LONE_PEAK_SHRINE_GRASS_10 }, - { { 4295.00f, -551.00f }, RC_LONE_PEAK_SHRINE_GRASS_11 }, - { { 4325.00f, -514.00f }, RC_LONE_PEAK_SHRINE_GRASS_12 }, - { { 4592.00f, -613.00f }, RC_LONE_PEAK_SHRINE_GRASS_13 }, - { { 4570.00f, -583.00f }, RC_LONE_PEAK_SHRINE_GRASS_14 }, - { { 4528.00f, -587.00f }, RC_LONE_PEAK_SHRINE_GRASS_15 }, - { { 4512.00f, -625.00f }, RC_LONE_PEAK_SHRINE_GRASS_16 }, - { { 4552.00f, -639.00f }, RC_LONE_PEAK_SHRINE_GRASS_17 }, - { { 4623.00f, -583.00f }, RC_LONE_PEAK_SHRINE_GRASS_18 }, - { { 4552.00f, -539.00f }, RC_LONE_PEAK_SHRINE_GRASS_19 }, - { { 4481.00f, -583.00f }, RC_LONE_PEAK_SHRINE_GRASS_20 }, - { { 4481.00f, -655.00f }, RC_LONE_PEAK_SHRINE_GRASS_21 }, - { { 4516.00f, -690.00f }, RC_LONE_PEAK_SHRINE_GRASS_22 }, - { { 4564.00f, -698.00f }, RC_LONE_PEAK_SHRINE_GRASS_23 }, - { { 4594.00f, -661.00f }, RC_LONE_PEAK_SHRINE_GRASS_24 }, - } }, - { ENTRANCE(GROTTOS, 12), - { - { { 4137.00f, 1073.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_01 }, - { { 4115.00f, 1103.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_02 }, - { { 4073.00f, 1099.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_03 }, - { { 4057.00f, 1061.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_04 }, - { { 4097.00f, 1047.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_05 }, - { { 4168.00f, 1103.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_06 }, - { { 4097.00f, 1147.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_07 }, - { { 4026.00f, 1103.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_08 }, - { { 4026.00f, 1031.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_09 }, - { { 4061.00f, 996.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_10 }, - { { 4109.00f, 988.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_11 }, - { { 4139.00f, 1025.00f }, RC_DEKU_PALACE_BEAN_SALESMAN_GROTTO_GRASS_12 }, - } }, - { 31, - { - { { 2285.00f, 883.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_01 }, - { { 2263.00f, 913.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_02 }, - { { 2221.00f, 909.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_03 }, - { { 2205.00f, 871.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_04 }, - { { 2245.00f, 857.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_05 }, - { { 2316.00f, 913.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_06 }, - { { 2245.00f, 957.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_07 }, - { { 2174.00f, 913.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_08 }, - { { 2174.00f, 841.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_09 }, - { { 2209.00f, 806.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_10 }, - { { 2257.00f, 798.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_11 }, - { { 2287.00f, 835.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_12 }, - { { 2324.00f, 1073.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_13 }, - { { 2302.00f, 1103.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_14 }, - { { 2260.00f, 1099.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_15 }, - { { 2244.00f, 1061.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_16 }, - { { 2284.00f, 1047.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_17 }, - { { 2355.00f, 1103.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_18 }, - { { 2284.00f, 1147.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_19 }, - { { 2213.00f, 1103.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_20 }, - { { 2213.00f, 1031.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_21 }, - { { 2248.00f, 996.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_22 }, - { { 2296.00f, 988.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_23 }, - { { 2326.00f, 1025.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_24 }, - { { 2438.00f, 993.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_25 }, - { { 2416.00f, 1023.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_26 }, - { { 2374.00f, 1019.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_27 }, - { { 2358.00f, 981.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_28 }, - { { 2398.00f, 967.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_29 }, - { { 2469.00f, 1023.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_30 }, - { { 2398.00f, 1067.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_31 }, - { { 2327.00f, 1023.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_32 }, - { { 2327.00f, 951.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_33 }, - { { 2362.00f, 916.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_34 }, - { { 2410.00f, 908.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_35 }, - { { 2440.00f, 945.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_36 }, - { { 2466.00f, 747.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_37 }, - { { 2444.00f, 777.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_38 }, - { { 2402.00f, 773.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_39 }, - { { 2386.00f, 735.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_40 }, - { { 2426.00f, 721.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_41 }, - { { 2497.00f, 777.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_42 }, - { { 2426.00f, 821.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_43 }, - { { 2355.00f, 777.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_44 }, - { { 2355.00f, 705.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_45 }, - { { 2390.00f, 670.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_46 }, - { { 2438.00f, 662.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_47 }, - { { 2468.00f, 699.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_48 }, - { { 2576.00f, 842.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_49 }, - { { 2554.00f, 872.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_50 }, - { { 2512.00f, 868.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_51 }, - { { 2496.00f, 830.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_52 }, - { { 2536.00f, 816.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_53 }, - { { 2607.00f, 872.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_54 }, - { { 2536.00f, 916.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_55 }, - { { 2465.00f, 872.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_56 }, - { { 2465.00f, 800.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_57 }, - { { 2500.00f, 765.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_58 }, - { { 2548.00f, 757.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_59 }, - { { 2578.00f, 794.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_60 }, - { { 2593.00f, 1073.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_61 }, - { { 2571.00f, 1103.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_62 }, - { { 2529.00f, 1099.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_63 }, - { { 2513.00f, 1061.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_64 }, - { { 2553.00f, 1047.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_65 }, - { { 2624.00f, 1103.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_66 }, - { { 2553.00f, 1147.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_67 }, - { { 2482.00f, 1103.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_68 }, - { { 2482.00f, 1031.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_69 }, - { { 2517.00f, 996.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_70 }, - { { 2565.00f, 988.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_71 }, - { { 2595.00f, 1025.00f }, RC_TERMINA_FIELD_COW_GROTTO_GRASS_72 }, - } }, - { ENTRANCE(GROTTOS, 11), - { - { { 2927.00f, 1308.00f }, RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_01 }, - { { 2966.00f, 1409.00f }, RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_02 }, - } }, - { ENTRANCE(GROTTOS, 13), - { - { { 5415.00f, 454.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_01 }, - { { 5393.00f, 484.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_02 }, - { { 5351.00f, 480.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_03 }, - { { 5335.00f, 442.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_04 }, - { { 5375.00f, 428.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_05 }, - { { 5446.00f, 484.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_06 }, - { { 5375.00f, 528.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_07 }, - { { 5304.00f, 484.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_08 }, - { { 5304.00f, 412.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_09 }, - { { 5339.00f, 377.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_10 }, - { { 5387.00f, 369.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_11 }, - { { 5417.00f, 406.00f }, RC_TERMINA_FIELD_PEAHAT_GROTTO_GRASS_12 }, - } }, - { ENTRANCE(GROTTOS, 2), - { - { { 1153.00f, 218.00f }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_01 }, - { { 1199.00f, -365.00f }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_02 }, - { { 1252.00f, -372.00f }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_03 }, - { { 1295.00f, 27.00f }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_04 }, - { { 1321.00f, 113.00f }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_05 }, - } }, - { ENTRANCE(GROTTOS, 0), - { - { { -42.00f, -3.00f }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_01 }, - { { 87.00f, -26.00f }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_02 }, - { { 103.00f, -112.00f }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_03 }, - { { 113.00f, 43.00f }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_04 }, - { { 137.00f, 93.00f }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_05 }, - } }, - { 51, - { - { { 2339.00f, 129.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_14 }, - } }, - { 55, - { - { { 2339.00f, 129.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_14 }, - } }, - { 59, - { - { { 2339.00f, 129.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_14 }, - } }, - { 61, - { - { { 2339.00f, 129.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_SOUTHERN_SWAMP_GROTTO_GRASS_14 }, - } }, - { 62, - { - { { 2339.00f, 129.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_14 }, - } }, - { 63, - { - { { 2339.00f, 129.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_14 }, - } }, - { -72, - { - { { 2339.00f, 129.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_IKANA_GRAVEYARD_GROTTO_GRASS_14 }, - } }, - { -76, - { - { { 2339.00f, 129.00f }, RC_IKANA_CANYON_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_IKANA_CANYON_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_IKANA_CANYON_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_IKANA_CANYON_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_IKANA_CANYON_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_IKANA_CANYON_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_IKANA_CANYON_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_IKANA_CANYON_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_IKANA_CANYON_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_IKANA_CANYON_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_IKANA_CANYON_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_IKANA_CANYON_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_IKANA_CANYON_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_IKANA_CANYON_GROTTO_GRASS_14 }, - } }, - { 92, - { - { { 2339.00f, 129.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_14 }, - } }, - { -102, - { - { { 2339.00f, 129.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_14 }, - } }, - { -103, - { - { { 2339.00f, 129.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_14 }, - } }, - { -106, - { - { { 2339.00f, 129.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_ROAD_TO_IKANA_GROTTO_GRASS_14 }, - } }, - { -107, - { - { { 2339.00f, 129.00f }, RC_ZORA_CAPE_GROTTO_GRASS_01 }, - { { 2345.00f, -174.00f }, RC_ZORA_CAPE_GROTTO_GRASS_02 }, - { { 2355.00f, -310.00f }, RC_ZORA_CAPE_GROTTO_GRASS_03 }, - { { 2355.00f, -225.00f }, RC_ZORA_CAPE_GROTTO_GRASS_04 }, - { { 2391.00f, -313.00f }, RC_ZORA_CAPE_GROTTO_GRASS_05 }, - { { 2403.00f, -360.00f }, RC_ZORA_CAPE_GROTTO_GRASS_06 }, - { { 2460.00f, 215.00f }, RC_ZORA_CAPE_GROTTO_GRASS_07 }, - { { 2484.00f, -213.00f }, RC_ZORA_CAPE_GROTTO_GRASS_08 }, - { { 2500.00f, 26.00f }, RC_ZORA_CAPE_GROTTO_GRASS_09 }, - { { 2508.00f, 152.00f }, RC_ZORA_CAPE_GROTTO_GRASS_10 }, - { { 2520.00f, -463.00f }, RC_ZORA_CAPE_GROTTO_GRASS_11 }, - { { 2522.00f, -243.00f }, RC_ZORA_CAPE_GROTTO_GRASS_12 }, - { { 2524.00f, 58.00f }, RC_ZORA_CAPE_GROTTO_GRASS_13 }, - { { 2534.00f, -190.00f }, RC_ZORA_CAPE_GROTTO_GRASS_14 }, - } }, +std::map<s8, std::tuple<s16, RandoCheckId>> cowGrottoMap = { + { -1, { 6, RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_01 } }, + { 31, { 6, RC_TERMINA_FIELD_COW_GROTTO_GRASS_01 } }, }; -// clang-format on - -#define ENKUSA_RC (actor->home.rot.x) - -float roundToWholeNumber(float value) { - int rounded = std::round(value); - float fnum = static_cast<float>(rounded); - - return fnum; -} -RandoCheckId IdentifyGrass(Vec3f pos) { - RandoCheckId randoCheckId = RC_UNKNOWN; - pos.x = roundToWholeNumber(pos.x); - pos.z = roundToWholeNumber(pos.z); - - const auto& grassMap = (gPlayState->sceneId != SCENE_KAKUSIANA) ? overworldGrassMap : grottoGrassMap; - uint32_t key = - (gPlayState->sceneId != SCENE_KAKUSIANA) ? static_cast<uint16_t>(gPlayState->sceneId) - : (gSaveContext.save.entrance == ENTRANCE(GROTTOS, 4) || gSaveContext.save.entrance == ENTRANCE(GROTTOS, 10)) - ? gSaveContext.respawn[RESPAWN_MODE_UNK_3].data - : gSaveContext.save.entrance; - - auto it = grassMap.find(key); - if (it == grassMap.end()) { - return randoCheckId; - } - - auto innerIt = it->second.find({ pos.x, pos.z }); - if (innerIt == it->second.end()) { - return randoCheckId; - } +// For lone grass actors spawned directly by the scene +std::map<std::tuple<s16, s16, s16>, RandoCheckId> enKusaMap = { + { { SCENE_30GYOSON, 0, 110 }, RC_GREAT_BAY_COAST_GRASS_01 }, + { { SCENE_30GYOSON, 0, 111 }, RC_GREAT_BAY_COAST_GRASS_02 }, + { { SCENE_30GYOSON, 0, 112 }, RC_GREAT_BAY_COAST_GRASS_03 }, + { { SCENE_30GYOSON, 0, 113 }, RC_GREAT_BAY_COAST_GRASS_04 }, + { { SCENE_30GYOSON, 0, 114 }, RC_GREAT_BAY_COAST_GRASS_05 }, + // Laundry Pool + { { SCENE_ALLEY, 0, 13 }, RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_01 }, + { { SCENE_ALLEY, 0, 14 }, RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_02 }, + { { SCENE_ALLEY, 0, 15 }, RC_CLOCK_TOWN_LAUNDRY_POOL_GRASS_03 }, + // Road to Southern Swamp + { { SCENE_24KEMONOMITI, 0, 47 }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_01 }, + { { SCENE_24KEMONOMITI, 0, 48 }, RC_ROAD_TO_SOUTHERN_SWAMP_GRASS_02 }, + // Mountain Village (spring) + { { SCENE_10YUKIYAMANOMURA2, 0, 26 }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_01 }, + { { SCENE_10YUKIYAMANOMURA2, 0, 27 }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_02 }, + { { SCENE_10YUKIYAMANOMURA2, 0, 28 }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_03 }, + // Woods of Mystery + { { SCENE_26SARUNOMORI, 1, 3 }, RC_WOODS_OF_MYSTERY_GRASS_01 }, + { { SCENE_26SARUNOMORI, 1, 4 }, RC_WOODS_OF_MYSTERY_GRASS_02 }, + { { SCENE_26SARUNOMORI, 1, 5 }, RC_WOODS_OF_MYSTERY_GRASS_03 }, + { { SCENE_26SARUNOMORI, 0, 0 }, RC_WOODS_OF_MYSTERY_GRASS_04 }, + { { SCENE_26SARUNOMORI, 0, 1 }, RC_WOODS_OF_MYSTERY_GRASS_05 }, + { { SCENE_26SARUNOMORI, 3, 7 }, RC_WOODS_OF_MYSTERY_GRASS_06 }, + { { SCENE_26SARUNOMORI, 3, 8 }, RC_WOODS_OF_MYSTERY_GRASS_07 }, + { { SCENE_26SARUNOMORI, 4, 6 }, RC_WOODS_OF_MYSTERY_GRASS_08 }, + { { SCENE_26SARUNOMORI, 4, 7 }, RC_WOODS_OF_MYSTERY_GRASS_09 }, + { { SCENE_26SARUNOMORI, 4, 8 }, RC_WOODS_OF_MYSTERY_GRASS_10 }, + { { SCENE_26SARUNOMORI, 4, 9 }, RC_WOODS_OF_MYSTERY_GRASS_11 }, + { { SCENE_26SARUNOMORI, 5, 7 }, RC_WOODS_OF_MYSTERY_GRASS_12 }, + { { SCENE_26SARUNOMORI, 5, 8 }, RC_WOODS_OF_MYSTERY_GRASS_13 }, + { { SCENE_26SARUNOMORI, 8, 1 }, RC_WOODS_OF_MYSTERY_GRASS_14 }, + { { SCENE_26SARUNOMORI, 8, 2 }, RC_WOODS_OF_MYSTERY_GRASS_15 }, + { { SCENE_26SARUNOMORI, 8, 3 }, RC_WOODS_OF_MYSTERY_GRASS_16 }, + { { SCENE_26SARUNOMORI, 8, 4 }, RC_WOODS_OF_MYSTERY_GRASS_17 }, + { { SCENE_26SARUNOMORI, 8, 6 }, RC_WOODS_OF_MYSTERY_GRASS_18 }, + { { SCENE_26SARUNOMORI, 7, 7 }, RC_WOODS_OF_MYSTERY_GRASS_19 }, + { { SCENE_26SARUNOMORI, 7, 8 }, RC_WOODS_OF_MYSTERY_GRASS_20 }, + { { SCENE_26SARUNOMORI, 2, 1 }, RC_WOODS_OF_MYSTERY_GRASS_21 }, + { { SCENE_26SARUNOMORI, 6, 1 }, RC_WOODS_OF_MYSTERY_GRASS_22 }, + { { SCENE_26SARUNOMORI, 6, 2 }, RC_WOODS_OF_MYSTERY_GRASS_23 }, + // Woodfall + { { SCENE_21MITURINMAE, 0, 18 }, RC_WOODFALL_GRASS_01 }, + { { SCENE_21MITURINMAE, 0, 17 }, RC_WOODFALL_GRASS_02 }, + { { SCENE_21MITURINMAE, 0, 19 }, RC_WOODFALL_GRASS_03 }, + { { SCENE_21MITURINMAE, 0, 22 }, RC_WOODFALL_GRASS_04 }, + { { SCENE_21MITURINMAE, 0, 21 }, RC_WOODFALL_GRASS_05 }, + { { SCENE_21MITURINMAE, 0, 20 }, RC_WOODFALL_GRASS_06 }, + // Woodfall (Clear) + { { SCENE_21MITURINMAE, 0, 10 }, RC_WOODFALL_GRASS_01 }, + { { SCENE_21MITURINMAE, 0, 9 }, RC_WOODFALL_GRASS_02 }, + { { SCENE_21MITURINMAE, 0, 11 }, RC_WOODFALL_GRASS_03 }, + { { SCENE_21MITURINMAE, 0, 14 }, RC_WOODFALL_GRASS_04 }, + { { SCENE_21MITURINMAE, 0, 13 }, RC_WOODFALL_GRASS_05 }, + { { SCENE_21MITURINMAE, 0, 12 }, RC_WOODFALL_GRASS_06 }, + // Grottos (unique) + { { SCENE_KAKUSIANA, 0, 1 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_01 }, + { { SCENE_KAKUSIANA, 0, 4 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_02 }, + { { SCENE_KAKUSIANA, 0, 6 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_03 }, + { { SCENE_KAKUSIANA, 0, 7 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_04 }, + { { SCENE_KAKUSIANA, 0, 8 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_05 }, + { { SCENE_KAKUSIANA, 2, 0 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_01 }, + { { SCENE_KAKUSIANA, 2, 1 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_02 }, + { { SCENE_KAKUSIANA, 2, 2 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_03 }, + { { SCENE_KAKUSIANA, 2, 3 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_04 }, + { { SCENE_KAKUSIANA, 2, 4 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_05 }, + { { SCENE_KAKUSIANA, 11, 0 }, RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_01 }, + { { SCENE_KAKUSIANA, 11, 3 }, RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_02 }, +}; - randoCheckId = innerIt->second; - if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { - return RC_UNKNOWN; - } +// For lone grass actors spawned in chest grottos +std::map<s8, RandoCheckId> chestGrottoMap = { + { 51, RC_PATH_TO_SNOWHEAD_GROTTO_GRASS_01 }, + { 55, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_GRASS_01 }, + { 59, RC_MOUNTAIN_VILLAGE_TUNNEL_GROTTO_GRASS_01 }, + { 61, RC_SOUTHERN_SWAMP_GROTTO_GRASS_01 }, + { 62, RC_ROAD_TO_SOUTHERN_SWAMP_GROTTO_GRASS_01 }, + { 63, RC_TERMINA_FIELD_TALL_GRASS_GROTTO_GRASS_01 }, + { -72, RC_IKANA_GRAVEYARD_GROTTO_GRASS_01 }, + { -76, RC_IKANA_CANYON_GROTTO_GRASS_01 }, + { 92, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_01 }, + { -102, RC_TERMINA_FIELD_PILLAR_GROTTO_GRASS_01 }, + { -103, RC_TWIN_ISLANDS_RAMP_GROTTO_GRASS_01 }, + { -106, RC_ROAD_TO_IKANA_GROTTO_GRASS_01 }, + { -107, RC_ZORA_CAPE_GROTTO_GRASS_01 }, +}; - return randoCheckId; -} +// For batches of grass spawned by Obj_Mure2 +std::map<std::tuple<u16, u8, s16>, RandoCheckId> objMure2GrassMap = { + { { SCENE_10YUKIYAMANOMURA2, 0, 29 }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_04 }, + { { SCENE_10YUKIYAMANOMURA2, 0, 30 }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_13 }, + { { SCENE_10YUKIYAMANOMURA2, 0, 31 }, RC_MOUNTAIN_VILLAGE_SPRING_GRASS_22 }, + { { SCENE_BOTI, 1, 47 }, RC_IKANA_GRAVEYARD_GRASS_01 }, +}; +// clang-format on void SpawnGrassDrop(Vec3f pos, RandoCheckId randoCheckId) { CustomItem::Spawn( @@ -1044,7 +162,8 @@ void EnKusaBush_RandoDraw(Actor* actor, PlayState* play) { return; } - RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[ENKUSA_RC].randoItemId, (RandoCheckId)ENKUSA_RC); + RandoCheckId randoCheckId = Rando::ActorBehavior::GetObjectRandoCheckId(actor); + RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[randoCheckId].randoItemId, randoCheckId); RandoItemType randoItemType = Rando::StaticData::Items[randoItemId].randoItemType; switch (randoItemType) { @@ -1196,8 +315,30 @@ void ObjGrass_RandoDrawXlu(ObjGrass* objGrass, ObjGrassElement* grassElem, Rando } void Rando::ActorBehavior::InitObjGrassBehavior() { + /* + * Identify directly spawned actor grass by scene ID, room, and actor list index. If this is a common chest grotto, + * use respawn data to retrieve the base RC. The grass actors and RCs are both in contiguous order, so the base RC + * can be incremented to get each grass actor's target RC value. + */ COND_ID_HOOK(OnActorInit, ACTOR_EN_KUSA, IS_RANDO, [](Actor* actor) { - RandoCheckId randoCheckId = IdentifyGrass(actor->home.pos); + s16 actorListIndex = GetActorListIndex(actor); + if (actorListIndex < 0) { // This grass was placed by a spawner, not scene data + return; + } + + RandoCheckId randoCheckId = RC_UNKNOWN; + if (gPlayState->sceneId == SCENE_KAKUSIANA && actor->room == 4) { // Common chest grotto + auto it = chestGrottoMap.find(gSaveContext.respawn[RESPAWN_MODE_UNK_3].data); + if (it != chestGrottoMap.end()) { + randoCheckId = static_cast<RandoCheckId>(it->second + actorListIndex); + } + } else { + auto it = enKusaMap.find({ gPlayState->sceneId, actor->room, actorListIndex }); + if (it != enKusaMap.end()) { + randoCheckId = it->second; + } + } + if (randoCheckId == RC_UNKNOWN) { return; } @@ -1206,12 +347,99 @@ void Rando::ActorBehavior::InitObjGrassBehavior() { return; } - ENKUSA_RC = randoCheckId; + SetObjectRandoCheckId(actor, randoCheckId); + }); + + /* + * Identify actor grass that was spawned by a spawner actor, by scene ID, room, and the spawner's actor list index. + * The RCs and child grass are contiguous, so they can increment the base value to get their target RC. + */ + COND_VB_SHOULD(VB_OBJ_MURE2_SET_CHILD_ROOM, IS_RANDO, { + Actor* actor = va_arg(args, Actor*); + ObjMure2* objMure2 = (ObjMure2*)actor; + s32 i = va_arg(args, s32); + Actor* child = objMure2->actors[i]; + if (child != nullptr && child->id == ACTOR_EN_KUSA) { + auto it = objMure2GrassMap.find({ gPlayState->sceneId, actor->room, GetActorListIndex(actor) }); + if (it != objMure2GrassMap.end()) { + RandoCheckId randoCheckId = static_cast<RandoCheckId>(it->second + i); + SetObjectRandoCheckId(child, randoCheckId); + } + } + }); + + /* + * This handles non-actor grass, which can be complicated to follow. Scenes define Obj_Grass_Unit, which itself has + * multiple grass children elements. Once a grass unit is done initializing, its child elements get added to a + * singleton ObjGrass manager to handle all the grass elements in the scene and room. The grass unit itself gets + * killed. + * + * This hook checks that, upon killing a grass object, whether it is the last one for the scene. If it is, it then + * consults the ObjGrass manager singleton to iterate its children and grandchildren for each ObjGrassElement to + * assign its respective RC. RCs are derived from the scene ID and room, as there is only one ObjGrass manager per + * scene. Cow grottos use respawn data instead. The order that grass elements are processed is deterministic each + * load and contiguous, so we can just increment the base RC like always. + */ + COND_ID_HOOK(OnActorKill, ACTOR_OBJ_GRASS_UNIT, IS_RANDO, [](Actor* actor) { + s16 maxActiveGrassGroups = 0; + RandoCheckId baseCheckId; + + if (gPlayState->sceneId == SCENE_KAKUSIANA && actor->room == 10) { // Cow grottos + auto it = cowGrottoMap.find(gSaveContext.respawn[RESPAWN_MODE_UNK_3].data); + if (it == cowGrottoMap.end()) { + return; + } + maxActiveGrassGroups = std::get<s16>(it->second); + baseCheckId = std::get<RandoCheckId>(it->second); + } else { + auto it = grassObjMap.find({ gPlayState->sceneId, actor->room }); + if (it == grassObjMap.end()) { + return; + } + maxActiveGrassGroups = std::get<s16>(it->second); + baseCheckId = std::get<RandoCheckId>(it->second); + } + + if (sGrassManager->activeGrassGroups < maxActiveGrassGroups) { + return; + } + + ObjGrassGroup* grassGroup; + int grassIndex = 0; + for (int i = 0; i < sGrassManager->activeGrassGroups; i++) { + grassGroup = &sGrassManager->grassGroups[i]; + for (int j = 0; j < grassGroup->count; j++) { + RandoCheckId randoCheckId = RandoCheckId(baseCheckId + grassIndex++); + if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { + continue; + } + SetObjectRandoCheckId(&grassGroup->elements[j], randoCheckId); + } + } + }); + + // If actor grass was not spawned directly in the scene, we must manually free the extension RC. + COND_ID_HOOK(OnActorDestroy, ACTOR_EN_KUSA, IS_RANDO, [](Actor* actor) { + if (GetActorListIndex(actor) < 0) { + ObjectExtension_Free(actor); + } + }); + + // There should only be one of this actor active at any time. Iterate its grandchildren and free the extension. + COND_ID_HOOK(OnActorDestroy, ACTOR_OBJ_GRASS, IS_RANDO, [](Actor* actor) { + ObjGrassGroup* grassGroup; + ObjGrass* objGrass = (ObjGrass*)actor; + for (int i = 0; i < objGrass->activeGrassGroups; i++) { + grassGroup = &objGrass->grassGroups[i]; + for (int j = 0; j < grassGroup->count; j++) { + ObjectExtension_Free(&grassGroup->elements[j]); + } + } }); COND_VB_SHOULD(VB_KUSA_BUSH_DRAW_BE_OVERRIDDEN, IS_RANDO, { Actor* actor = va_arg(args, Actor*); - if (ENKUSA_RC != RC_UNKNOWN) { + if (GetObjectRandoCheckId(actor) != RC_UNKNOWN) { *should = false; actor->draw = EnKusaBush_RandoDraw; } @@ -1221,7 +449,7 @@ void Rando::ActorBehavior::InitObjGrassBehavior() { ObjGrass* objGrass = va_arg(args, ObjGrass*); ObjGrassElement* grassElem = va_arg(args, ObjGrassElement*); s32 j = va_arg(args, s32); - RandoCheckId randoCheckId = IdentifyGrass(grassElem->pos); + RandoCheckId randoCheckId = GetObjectRandoCheckId(grassElem); if (randoCheckId != RC_UNKNOWN) { *should = false; ObjGrass_RandoDrawOpa(objGrass, grassElem, j, randoCheckId); @@ -1231,7 +459,7 @@ void Rando::ActorBehavior::InitObjGrassBehavior() { COND_VB_SHOULD(VB_OBJGRASS_XLU_DRAW_BE_OVERRIDDEN, IS_RANDO, { ObjGrass* objGrass = va_arg(args, ObjGrass*); ObjGrassElement* grassElem = va_arg(args, ObjGrassElement*); - RandoCheckId randoCheckId = IdentifyGrass(grassElem->pos); + RandoCheckId randoCheckId = GetObjectRandoCheckId(grassElem); if (randoCheckId != RC_UNKNOWN) { *should = false; ObjGrass_RandoDrawXlu(objGrass, grassElem, randoCheckId); @@ -1241,37 +469,34 @@ void Rando::ActorBehavior::InitObjGrassBehavior() { COND_VB_SHOULD(VB_CARRY_GRASS_DRAW_BE_OVERRIDDEN, IS_RANDO, { ObjGrassCarry* grassCarryActor = va_arg(args, ObjGrassCarry*); Actor* actor = &grassCarryActor->actor; - RandoCheckId randoCheckId = IdentifyGrass(grassCarryActor->grassElem->pos); - ENKUSA_RC = randoCheckId; + RandoCheckId randoCheckId = GetObjectRandoCheckId(grassCarryActor->grassElem); + SetObjectRandoCheckId(actor, randoCheckId); if (randoCheckId != RC_UNKNOWN) { *should = false; grassCarryActor->actor.draw = EnKusaBush_RandoDraw; } }); + // The grass has been destroyed, so spawn a collectible item based on the grass's RC value. COND_VB_SHOULD(VB_GRASS_DROP_COLLECTIBLE, IS_RANDO, { auto actorId = static_cast<ActorId>(va_arg(args, int32_t)); - ObjGrassElement* grassElemActor; - EnKusa* kusaActor; - ObjGrassCarry* grassCarryActor; - Vec3f grassIdPos = gZeroVec3f; Vec3f collectiblePos = gZeroVec3f; + RandoCheckId randoCheckId; if (actorId == ACTOR_OBJ_GRASS) { - grassElemActor = va_arg(args, ObjGrassElement*); - grassIdPos = grassElemActor->pos; - collectiblePos = grassIdPos; + ObjGrassElement* grassElemActor = va_arg(args, ObjGrassElement*); + collectiblePos = grassElemActor->pos; + randoCheckId = GetObjectRandoCheckId(grassElemActor); } else if (actorId == ACTOR_EN_KUSA) { - kusaActor = va_arg(args, EnKusa*); - grassIdPos = kusaActor->actor.home.pos; + EnKusa* kusaActor = va_arg(args, EnKusa*); collectiblePos = kusaActor->actor.world.pos; + randoCheckId = GetObjectRandoCheckId(kusaActor); } else if (actorId == ACTOR_OBJ_GRASS_CARRY) { - grassCarryActor = va_arg(args, ObjGrassCarry*); - grassIdPos = grassCarryActor->grassElem->pos; + ObjGrassCarry* grassCarryActor = va_arg(args, ObjGrassCarry*); collectiblePos = grassCarryActor->actor.world.pos; + randoCheckId = GetObjectRandoCheckId(grassCarryActor); } - RandoCheckId randoCheckId = IdentifyGrass(grassIdPos); if (randoCheckId == RC_UNKNOWN) { return; } diff --git a/mm/2s2h/Rando/ActorBehavior/ObjKibako.cpp b/mm/2s2h/Rando/ActorBehavior/ObjKibako.cpp index eff252a17..a21d48762 100644 --- a/mm/2s2h/Rando/ActorBehavior/ObjKibako.cpp +++ b/mm/2s2h/Rando/ActorBehavior/ObjKibako.cpp @@ -1,6 +1,7 @@ #include "ActorBehavior.h" #include <libultraship/bridge/consolevariablebridge.h> #include "2s2h/CustomItem/CustomItem.h" +#include "2s2h/ObjectExtension/ActorListIndex.h" #include "assets/2s2h_assets.h" extern "C" { @@ -9,122 +10,133 @@ extern "C" { #include "src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h" } -#define OBJKIBAKO_RC (actor->home.rot.x) - -std::map<std::pair<float, float>, RandoCheckId> crateMap = { +std::map<std::tuple<s16, s16, s16>, RandoCheckId> crateMap = { // Clock Town // - { { -1668.0f, 615.0f }, RC_CLOCK_TOWN_LAUNDRY_SMALL_CRATE }, - { { 759.0f, -458.0f }, RC_CLOCK_TOWN_EAST_SMALL_CRATE_01 }, - { { 1100.0f, -460.0f }, RC_CLOCK_TOWN_EAST_SMALL_CRATE_02 }, + { { SCENE_ALLEY, 0, 7 }, RC_CLOCK_TOWN_LAUNDRY_SMALL_CRATE }, + { { SCENE_TOWN, 0, 11 }, RC_CLOCK_TOWN_EAST_SMALL_CRATE_01 }, + { { SCENE_TOWN, 0, 10 }, RC_CLOCK_TOWN_EAST_SMALL_CRATE_02 }, // Great Bay Temple // - { { 1725.0f, -2100.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_01 }, - { { 1725.0f, -2070.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_02 }, - { { 1755.0f, -2100.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_03 }, - { { 1755.0f, -2070.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_04 }, - { { 960.0f, -2100.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_05 }, - { { 930.0f, -2100.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_06 }, - { { 960.0f, -2070.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_07 }, - { { 930.0f, -2070.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_08 }, - { { 960.0f, -2880.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_09 }, - { { 960.0f, -2910.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_10 }, - { { 930.0f, -2880.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_11 }, - { { 930.0f, -2910.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_12 }, - { { 1725.0f, -2880.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_13 }, - { { 1755.0f, -2880.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_14 }, - { { 1725.0f, -2910.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_15 }, - { { 1755.0f, -2910.0f }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_16 }, - { { 2415.0f, 240.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_01 }, - { { 2415.0f, 192.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_02 }, - { { 2415.0f, 144.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_03 }, - { { 2409.0f, 990.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_04 }, - { { 2457.0f, 990.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_05 }, - { { 2457.0f, 1050.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_06 }, - { { 2409.0f, 1050.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_07 }, - { { 1845.0f, 1944.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_LARGE_CRATE_01 }, - { { 1845.0f, 1992.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_LARGE_CRATE_02 }, - { { 1845.0f, 2040.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_LARGE_CRATE_03 }, - { { 1305.0f, 1944.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_LARGE_CRATE_04 }, - { { 1245.0f, 1944.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_LARGE_CRATE_05 }, + { { SCENE_SEA, 5, 15 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_01 }, + { { SCENE_SEA, 5, 7 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_02 }, + { { SCENE_SEA, 5, 9 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_03 }, + { { SCENE_SEA, 5, 17 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_04 }, + { { SCENE_SEA, 5, 13 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_05 }, + { { SCENE_SEA, 5, 3 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_06 }, + { { SCENE_SEA, 5, 5 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_07 }, + { { SCENE_SEA, 5, 11 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_08 }, + { { SCENE_SEA, 5, 12 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_09 }, + { { SCENE_SEA, 5, 4 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_10 }, + { { SCENE_SEA, 5, 2 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_11 }, + { { SCENE_SEA, 5, 10 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_12 }, + { { SCENE_SEA, 5, 14 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_13 }, + { { SCENE_SEA, 5, 8 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_14 }, + { { SCENE_SEA, 5, 6 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_15 }, + { { SCENE_SEA, 5, 16 }, RC_GREAT_BAY_TEMPLE_GEKKO_SMALL_CRATE_16 }, + { { SCENE_SEA, 10, 28 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_01 }, + { { SCENE_SEA, 10, 27 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_02 }, + { { SCENE_SEA, 10, 26 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_03 }, + { { SCENE_SEA, 10, 22 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_04 }, + { { SCENE_SEA, 10, 24 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_05 }, + { { SCENE_SEA, 10, 25 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_06 }, + { { SCENE_SEA, 10, 23 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_LARGE_CRATE_07 }, + { { SCENE_SEA, 2, 12 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_LARGE_CRATE_01 }, + { { SCENE_SEA, 2, 14 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_LARGE_CRATE_02 }, + { { SCENE_SEA, 2, 13 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_LARGE_CRATE_03 }, + { { SCENE_SEA, 2, 11 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_LARGE_CRATE_04 }, + { { SCENE_SEA, 2, 10 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_LARGE_CRATE_05 }, // Pirates Fortress // - { { 797.0f, -915.0f }, RC_PIRATE_FORTRESS_PLAZA_LARGE_CRATE_01 }, - { { 1151.0f, 180.0f }, RC_PIRATE_FORTRESS_PLAZA_LARGE_CRATE_02 }, - { { 889.0f, 180.0f }, RC_PIRATE_FORTRESS_PLAZA_LARGE_CRATE_03 }, + { { SCENE_KAIZOKU, 0, 27 }, RC_PIRATE_FORTRESS_PLAZA_LARGE_CRATE_01 }, + { { SCENE_KAIZOKU, 0, 28 }, RC_PIRATE_FORTRESS_PLAZA_LARGE_CRATE_02 }, + { { SCENE_KAIZOKU, 0, 29 }, RC_PIRATE_FORTRESS_PLAZA_LARGE_CRATE_03 }, // Snowhead Temple // - { { 1247.0f, 49.0f }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_LARGE_CRATE }, - { { 263.0f, 1301.0f }, RC_SNOWHEAD_TEMPLE_DUAL_SWITCHES_ROOM_LARGE_CRATE_01 }, - { { 282.0f, 1257.0f }, RC_SNOWHEAD_TEMPLE_DUAL_SWITCHES_ROOM_LARGE_CRATE_02 }, - { { 1296.0f, 330.0f }, RC_SNOWHEAD_TEMPLE_MAP_ROOM_LARGE_CRATE_01 }, - { { 1248.0f, 330.0f }, RC_SNOWHEAD_TEMPLE_MAP_ROOM_LARGE_CRATE_02 }, - { { 1200.0f, 330.0f }, RC_SNOWHEAD_TEMPLE_MAP_ROOM_LARGE_CRATE_03 }, - { { 1152.0f, 330.0f }, RC_SNOWHEAD_TEMPLE_MAP_ROOM_LARGE_CRATE_04 }, - { { 1104.0f, 330.0f }, RC_SNOWHEAD_TEMPLE_MAP_ROOM_LARGE_CRATE_05 }, + { { SCENE_HAKUGIN, 2, 17 }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_LARGE_CRATE }, + { { SCENE_HAKUGIN, 8, 16 }, RC_SNOWHEAD_TEMPLE_DUAL_SWITCHES_ROOM_LARGE_CRATE_01 }, + { { SCENE_HAKUGIN, 8, 15 }, RC_SNOWHEAD_TEMPLE_DUAL_SWITCHES_ROOM_LARGE_CRATE_02 }, + { { SCENE_HAKUGIN, 9, 6 }, RC_SNOWHEAD_TEMPLE_MAP_ROOM_LARGE_CRATE_01 }, + { { SCENE_HAKUGIN, 9, 9 }, RC_SNOWHEAD_TEMPLE_MAP_ROOM_LARGE_CRATE_02 }, + { { SCENE_HAKUGIN, 9, 10 }, RC_SNOWHEAD_TEMPLE_MAP_ROOM_LARGE_CRATE_03 }, + { { SCENE_HAKUGIN, 9, 8 }, RC_SNOWHEAD_TEMPLE_MAP_ROOM_LARGE_CRATE_04 }, + { { SCENE_HAKUGIN, 9, 7 }, RC_SNOWHEAD_TEMPLE_MAP_ROOM_LARGE_CRATE_05 }, // Stone Tower Temple // - { { 435.0f, -705.0f }, RC_STONE_TOWER_TEMPLE_ENTRANCE_SMALL_CRATE_01 }, - { { 465.0f, -705.0f }, RC_STONE_TOWER_TEMPLE_ENTRANCE_SMALL_CRATE_02 }, - { { 1050.0f, -2910.0f }, RC_STONE_TOWER_TEMPLE_MIRRORS_ROOM_LARGE_CRATE_01 }, - { { 1530.0f, -2910.0f }, RC_STONE_TOWER_TEMPLE_MIRRORS_ROOM_LARGE_CRATE_02 }, - { { 495.0f, -885.0f }, RC_STONE_TOWER_TEMPLE_CENTER_SMALL_CRATE_01 }, - { { 495.0f, -855.0f }, RC_STONE_TOWER_TEMPLE_CENTER_SMALL_CRATE_02 }, - { { 495.0f, -825.0f }, RC_STONE_TOWER_TEMPLE_CENTER_SMALL_CRATE_03 }, - { { -1410.0f, -330.0f }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_01 }, - { { -1410.0f, -390.0f }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_02 }, - { { -1410.0f, -450.0f }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_03 }, - { { -1410.0f, -510.0f }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_04 }, - { { -1410.0f, -570.0f }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_05 }, - { { -1485.0f, -390.0f }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_SMALL_CRATE_01 }, - { { -1485.0f, -510.0f }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_SMALL_CRATE_02 }, - { { 495.0f, -705.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_SMALL_CRATE_01 }, - { { 495.0f, -735.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_SMALL_CRATE_02 }, - { { -525.0f, -165.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_SMALL_CRATE_03 }, - { { -555.0f, -165.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_SMALL_CRATE_04 }, - { { -585.0f, -165.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_SMALL_CRATE_05 }, - { { 1815.0f, -1215.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_01 }, - { { 1845.0f, -1215.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_02 }, - { { 1875.0f, -1215.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_03 }, - { { 1815.0f, -1305.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_04 }, - { { 1845.0f, -1305.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_05 }, - { { 1875.0f, -1305.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_06 }, + { { SCENE_INISIE_N, 0, 17 }, RC_STONE_TOWER_TEMPLE_ENTRANCE_SMALL_CRATE_01 }, + { { SCENE_INISIE_N, 0, 18 }, RC_STONE_TOWER_TEMPLE_ENTRANCE_SMALL_CRATE_02 }, + { { SCENE_INISIE_N, 7, 30 }, RC_STONE_TOWER_TEMPLE_MIRRORS_ROOM_LARGE_CRATE_01 }, + { { SCENE_INISIE_N, 7, 29 }, RC_STONE_TOWER_TEMPLE_MIRRORS_ROOM_LARGE_CRATE_02 }, + { { SCENE_INISIE_N, 1, 22 }, RC_STONE_TOWER_TEMPLE_CENTER_SMALL_CRATE_01 }, + { { SCENE_INISIE_N, 1, 23 }, RC_STONE_TOWER_TEMPLE_CENTER_SMALL_CRATE_02 }, + { { SCENE_INISIE_N, 1, 24 }, RC_STONE_TOWER_TEMPLE_CENTER_SMALL_CRATE_03 }, + { { SCENE_INISIE_N, 2, 28 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_01 }, + { { SCENE_INISIE_N, 2, 27 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_02 }, + { { SCENE_INISIE_N, 2, 26 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_03 }, + { { SCENE_INISIE_N, 2, 25 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_04 }, + { { SCENE_INISIE_N, 2, 24 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_LARGE_CRATE_05 }, + { { SCENE_INISIE_N, 2, 31 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_SMALL_CRATE_01 }, + { { SCENE_INISIE_N, 2, 30 }, RC_STONE_TOWER_TEMPLE_SWITCH_ROOM_SMALL_CRATE_02 }, + { { SCENE_INISIE_R, 0, 12 }, RC_STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_SMALL_CRATE_01 }, + { { SCENE_INISIE_R, 0, 11 }, RC_STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_SMALL_CRATE_02 }, + { { SCENE_INISIE_R, 0, 15 }, RC_STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_SMALL_CRATE_03 }, + { { SCENE_INISIE_R, 0, 14 }, RC_STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_SMALL_CRATE_04 }, + { { SCENE_INISIE_R, 0, 13 }, RC_STONE_TOWER_TEMPLE_INVERTED_ENTRANCE_SMALL_CRATE_05 }, + { { SCENE_INISIE_R, 3, 43 }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_01 }, + { { SCENE_INISIE_R, 3, 44 }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_02 }, + { { SCENE_INISIE_R, 3, 42 }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_03 }, + { { SCENE_INISIE_R, 3, 39 }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_04 }, + { { SCENE_INISIE_R, 3, 40 }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_05 }, + { { SCENE_INISIE_R, 3, 41 }, RC_STONE_TOWER_TEMPLE_INVERTED_PATH_TO_GOMESS_SMALL_CRATE_06 }, // Termina Field // - { { 1750.0f, 830.0f }, RC_TERMINA_FIELD_SCRUB_LARGE_CRATE }, + { { SCENE_KAKUSIANA, 9, 0 }, RC_TERMINA_FIELD_SCRUB_LARGE_CRATE }, // Gorman Track // - { { -1624.0f, -891.0f }, RC_GORMAN_TRACK_LARGE_CRATE }, + { { SCENE_KOEPONARACE, 0, 73 }, RC_GORMAN_TRACK_LARGE_CRATE }, // Romani Ranch // - { { -576.0f, -1193.0f }, RC_ROMANI_RANCH_FIELD_LARGE_CRATE }, + { { SCENE_F01, 0, 35 }, RC_ROMANI_RANCH_FIELD_LARGE_CRATE }, // Cucco Shack // - { { -3439.0f, -583.0f }, RC_CUCCO_SHACK_LARGE_CRATE_01 }, - { { -3382.0f, -565.0f }, RC_CUCCO_SHACK_LARGE_CRATE_02 }, - { { -3325.0f, -546.0f }, RC_CUCCO_SHACK_LARGE_CRATE_03 }, + { { SCENE_F01C, 0, 22 }, RC_CUCCO_SHACK_LARGE_CRATE_01 }, + { { SCENE_F01C, 0, 15 }, RC_CUCCO_SHACK_LARGE_CRATE_02 }, + { { SCENE_F01C, 0, 14 }, RC_CUCCO_SHACK_LARGE_CRATE_03 }, - // Goron Village // - { { -1184.0f, -3051.0f }, RC_GORON_VILLAGE_LARGE_CRATE }, + // Goron Village (winter and spring) // + { { SCENE_11GORONNOSATO, 1, 3 }, RC_GORON_VILLAGE_LARGE_CRATE }, + { { SCENE_11GORONNOSATO2, 1, 3 }, RC_GORON_VILLAGE_LARGE_CRATE }, // Swamp Spider House // - { { -828.0f, -210.0f }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_01 }, - { { -876.0f, -210.0f }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_02 }, - { { -876.0f, -509.0f }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_03 }, - { { -870.0f, -876.0f }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_04 }, - { { -810.0f, -876.0f }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_05 }, - { { -690.0f, -876.0f }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_06 }, - { { -301.0f, -1299.0f }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_LARGE_CRATE_01 }, - { { -241.0f, -1299.0f }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_LARGE_CRATE_02 }, + { { SCENE_KINSTA1, 3, 8 }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_01 }, + { { SCENE_KINSTA1, 3, 5 }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_02 }, + { { SCENE_KINSTA1, 3, 6 }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_03 }, + { { SCENE_KINSTA1, 3, 7 }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_04 }, + { { SCENE_KINSTA1, 3, 9 }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_05 }, + { { SCENE_KINSTA1, 3, 10 }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_LARGE_CRATE_06 }, + { { SCENE_KINSTA1, 2, 7 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_LARGE_CRATE_01 }, + { { SCENE_KINSTA1, 2, 8 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_LARGE_CRATE_02 }, }; +// Identify the crate RC by scene ID, room, and actor list index +RandoCheckId getCrateRandoCheck(Actor* actor) { + RandoCheckId randoCheckId = RC_UNKNOWN; + + s16 actorListIndex = GetActorListIndex(actor); + auto it = crateMap.find({ gPlayState->sceneId, gPlayState->roomCtx.curRoom.num, actorListIndex }); + if (it != crateMap.end()) { + randoCheckId = it->second; + } + return randoCheckId; +} + void ObjKibako_RandoDraw(Actor* actor, PlayState* play) { if (!CVarGetInteger("gRando.CSMC", 0)) { Gfx_DrawDListOpa(play, (Gfx*)gSmallJunkCrateDL); return; } - RandoItemId randoItemId = - Rando::ConvertItem(RANDO_SAVE_CHECKS[OBJKIBAKO_RC].randoItemId, (RandoCheckId)OBJKIBAKO_RC); + RandoCheckId randoCheckId = getCrateRandoCheck(actor); + RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[randoCheckId].randoItemId, randoCheckId); RandoItemType randoItemType = Rando::StaticData::Items[randoItemId].randoItemType; switch (randoItemType) { @@ -164,8 +176,8 @@ void ObjKibako2_RandoDraw(Actor* actor, PlayState* play) { return; } - RandoItemId randoItemId = - Rando::ConvertItem(RANDO_SAVE_CHECKS[OBJKIBAKO_RC].randoItemId, (RandoCheckId)OBJKIBAKO_RC); + RandoCheckId randoCheckId = getCrateRandoCheck(actor); + RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[randoCheckId].randoItemId, randoCheckId); RandoItemType randoItemType = Rando::StaticData::Items[randoItemId].randoItemType; switch (randoItemType) { @@ -199,46 +211,29 @@ void ObjKibako2_RandoDraw(Actor* actor, PlayState* play) { } } -void Rando::ActorBehavior::InitObjKibakoBehavior() { - COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO, IS_RANDO, [](Actor* actor) { - RandoCheckId randoCheckId = RC_UNKNOWN; - - auto it = crateMap.find({ actor->home.pos.x, actor->home.pos.z }); - if (it == crateMap.end()) { - return; - } - - randoCheckId = it->second; +void initCrateBehavior(Actor* actor) { + RandoCheckId randoCheckId = getCrateRandoCheck(actor); + if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { + return; + } - if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { - return; - } + Rando::ActorBehavior::SetObjectRandoCheckId(actor, randoCheckId); +} - OBJKIBAKO_RC = randoCheckId; +void Rando::ActorBehavior::InitObjKibakoBehavior() { + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO, IS_RANDO, [](Actor* actor) { + initCrateBehavior(actor); actor->draw = ObjKibako_RandoDraw; }); COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO2, IS_RANDO, [](Actor* actor) { - RandoCheckId randoCheckId = RC_UNKNOWN; - - auto it = crateMap.find({ actor->home.pos.x, actor->home.pos.z }); - if (it == crateMap.end()) { - return; - } - - randoCheckId = it->second; - - if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { - return; - } - - OBJKIBAKO_RC = randoCheckId; + initCrateBehavior(actor); actor->draw = ObjKibako2_RandoDraw; }); COND_VB_SHOULD(VB_CRATE_DRAW_BE_OVERRIDDEN, IS_RANDO, { Actor* actor = va_arg(args, Actor*); - if (OBJKIBAKO_RC != RC_UNKNOWN) { + if (getCrateRandoCheck(actor) != RC_UNKNOWN) { *should = false; actor->draw = ObjKibako_RandoDraw; } @@ -251,7 +246,9 @@ void Rando::ActorBehavior::InitObjKibakoBehavior() { return; } - if (OBJKIBAKO_RC == RC_UNKNOWN) { + RandoCheckId randoCheckId = getCrateRandoCheck(actor); + + if (randoCheckId == RC_UNKNOWN) { return; } @@ -259,7 +256,7 @@ void Rando::ActorBehavior::InitObjKibakoBehavior() { EnItem00* spawn = CustomItem::Spawn( actor->world.pos.x, actor->world.pos.y, actor->world.pos.z, 0, - CustomItem::KILL_ON_TOUCH | CustomItem::TOSS_ON_SPAWN, OBJKIBAKO_RC, + CustomItem::KILL_ON_TOUCH | CustomItem::TOSS_ON_SPAWN, randoCheckId, [](Actor* actor, PlayState* play) { auto& randoStaticCheck = Rando::StaticData::Checks[(RandoCheckId)CUSTOM_ITEM_PARAM]; switch (randoStaticCheck.flagType) { diff --git a/mm/2s2h/Rando/ActorBehavior/ObjSnowball.cpp b/mm/2s2h/Rando/ActorBehavior/ObjSnowball.cpp index 4ca166bdd..1e7e0acda 100644 --- a/mm/2s2h/Rando/ActorBehavior/ObjSnowball.cpp +++ b/mm/2s2h/Rando/ActorBehavior/ObjSnowball.cpp @@ -104,39 +104,88 @@ std::map<std::tuple<s16, s16, s16>, RandoCheckId> snowballActorIdMap = { { { SCENE_17SETUGEN, 0, 65 }, RC_TWIN_ISLANDS_SMALL_SNOWBALL_04 }, { { SCENE_17SETUGEN, 0, 66 }, RC_TWIN_ISLANDS_SMALL_SNOWBALL_05 }, { { SCENE_17SETUGEN, 0, 67 }, RC_TWIN_ISLANDS_SMALL_SNOWBALL_06 }, -}; -std::map<std::pair<float, float>, RandoCheckId> snowballCoordsMap = { - { { -1025.00f, 137.00f }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_01 }, - { { -1062.00f, 891.00f }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_02 }, - { { 1863.00f, 705.00f }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_03 }, - { { -197.00f, -172.00f }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_04 }, - { { 1462.00f, 863.00f }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_05 }, - { { 1674.00f, 6811.00f }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_01 }, - { { 2061.00f, 6748.00f }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_02 }, - { { 203.00f, 6068.00f }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_03 }, - { { 623.00f, 6237.00f }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_04 }, - { { 987.00f, 4607.00f }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_09 }, - { { 976.00f, 4691.00f }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_10 }, - { { 979.00f, 4517.00f }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_11 }, - { { 427.00f, -613.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_01 }, - { { 65.00f, 345.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_02 }, - { { -179.00f, -876.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_03 }, - { { 851.00f, 643.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_04 }, - { { 371.00f, 778.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_05 }, - { { -563.00f, -523.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_06 }, - { { 1203.00f, 109.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_07 }, - { { -1029.00f, -25.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_08 }, - { { -880.00f, 497.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_09 }, - { { -395.00f, 677.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_10 }, - { { 5.00f, -560.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_11 }, - { { 60.00f, -46.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_12 }, - { { 1001.00f, -426.00f }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_13 }, + // The following large snowballs have different ActorListIndex values each day. Having repeat check map entries is + // fine, so long as there are no overlaps in values for a given scene. Duplicates are organized by Day 1, 2, 3: + { { SCENE_10YUKIYAMANOMURA, 0, 14 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_01 }, + { { SCENE_10YUKIYAMANOMURA, 0, 45 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_01 }, + { { SCENE_10YUKIYAMANOMURA, 0, 16 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_01 }, + { { SCENE_10YUKIYAMANOMURA, 0, 17 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_02 }, + { { SCENE_10YUKIYAMANOMURA, 0, 13 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_02 }, + { { SCENE_10YUKIYAMANOMURA, 0, 12 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_02 }, + { { SCENE_10YUKIYAMANOMURA, 0, 18 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_03 }, + { { SCENE_10YUKIYAMANOMURA, 0, 47 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_03 }, + { { SCENE_10YUKIYAMANOMURA, 0, 44 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_03 }, + { { SCENE_10YUKIYAMANOMURA, 0, 46 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_04 }, + { { SCENE_10YUKIYAMANOMURA, 0, 48 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_04 }, + { { SCENE_10YUKIYAMANOMURA, 0, 34 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_04 }, + { { SCENE_10YUKIYAMANOMURA, 0, 52 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_05 }, + { { SCENE_10YUKIYAMANOMURA, 0, 15 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_05 }, + { { SCENE_10YUKIYAMANOMURA, 0, 51 }, RC_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_05 }, + { { SCENE_13HUBUKINOMITI, 0, 26 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_01 }, + { { SCENE_13HUBUKINOMITI, 0, 28 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_01 }, + { { SCENE_13HUBUKINOMITI, 0, 23 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_01 }, + { { SCENE_13HUBUKINOMITI, 0, 42 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_02 }, + { { SCENE_13HUBUKINOMITI, 0, 24 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_02 }, + { { SCENE_13HUBUKINOMITI, 0, 19 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_02 }, + { { SCENE_13HUBUKINOMITI, 0, 31 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_03 }, + { { SCENE_13HUBUKINOMITI, 0, 46 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_03 }, + { { SCENE_13HUBUKINOMITI, 0, 22 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_03 }, + { { SCENE_13HUBUKINOMITI, 0, 30 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_04 }, + { { SCENE_13HUBUKINOMITI, 0, 27 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_04 }, + { { SCENE_13HUBUKINOMITI, 0, 29 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_04 }, + { { SCENE_13HUBUKINOMITI, 0, 41 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_09 }, + { { SCENE_13HUBUKINOMITI, 0, 45 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_09 }, + { { SCENE_13HUBUKINOMITI, 0, 47 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_09 }, + { { SCENE_13HUBUKINOMITI, 0, 43 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_10 }, + { { SCENE_13HUBUKINOMITI, 0, 48 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_10 }, + { { SCENE_13HUBUKINOMITI, 0, 20 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_10 }, + { { SCENE_13HUBUKINOMITI, 0, 44 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_11 }, + { { SCENE_13HUBUKINOMITI, 0, 25 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_11 }, + { { SCENE_13HUBUKINOMITI, 0, 21 }, RC_PATH_TO_MOUNTAIN_VILLAGE_LARGE_SNOWBALL_11 }, + { { SCENE_17SETUGEN, 0, 18 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_01 }, + { { SCENE_17SETUGEN, 0, 53 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_01 }, + { { SCENE_17SETUGEN, 0, 43 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_01 }, + { { SCENE_17SETUGEN, 0, 19 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_02 }, + { { SCENE_17SETUGEN, 0, 49 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_02 }, + { { SCENE_17SETUGEN, 0, 45 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_02 }, + { { SCENE_17SETUGEN, 0, 22 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_03 }, + { { SCENE_17SETUGEN, 0, 17 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_03 }, + { { SCENE_17SETUGEN, 0, 42 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_03 }, + { { SCENE_17SETUGEN, 0, 30 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_04 }, + { { SCENE_17SETUGEN, 0, 52 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_04 }, + { { SCENE_17SETUGEN, 0, 44 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_04 }, + { { SCENE_17SETUGEN, 0, 54 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_05 }, + { { SCENE_17SETUGEN, 0, 21 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_05 }, + { { SCENE_17SETUGEN, 0, 28 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_05 }, + { { SCENE_17SETUGEN, 0, 55 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_06 }, + { { SCENE_17SETUGEN, 0, 51 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_06 }, + { { SCENE_17SETUGEN, 0, 13 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_06 }, + { { SCENE_17SETUGEN, 0, 56 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_07 }, + { { SCENE_17SETUGEN, 0, 47 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_07 }, + { { SCENE_17SETUGEN, 0, 40 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_07 }, + { { SCENE_17SETUGEN, 0, 57 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_08 }, + { { SCENE_17SETUGEN, 0, 48 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_08 }, + { { SCENE_17SETUGEN, 0, 20 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_08 }, + { { SCENE_17SETUGEN, 0, 58 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_09 }, + { { SCENE_17SETUGEN, 0, 16 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_09 }, + { { SCENE_17SETUGEN, 0, 46 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_09 }, + { { SCENE_17SETUGEN, 0, 59 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_10 }, + { { SCENE_17SETUGEN, 0, 11 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_10 }, + { { SCENE_17SETUGEN, 0, 14 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_10 }, + { { SCENE_17SETUGEN, 0, 60 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_11 }, + { { SCENE_17SETUGEN, 0, 29 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_11 }, + { { SCENE_17SETUGEN, 0, 41 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_11 }, + { { SCENE_17SETUGEN, 0, 61 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_12 }, + // Note: RC_TWIN_ISLANDS_LARGE_SNOWBALL_12 does not exist on Day 2 + { { SCENE_17SETUGEN, 0, 15 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_12 }, + { { SCENE_17SETUGEN, 0, 12 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_13 }, + { { SCENE_17SETUGEN, 0, 50 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_13 }, + { { SCENE_17SETUGEN, 0, 4 }, RC_TWIN_ISLANDS_LARGE_SNOWBALL_13 }, }; // clang-format on -// We primarily rely on the ActorListIndex, however in some scenes the ActorListIndex for Large -// snowballs is inconsistent based on the day, so we fallback to the coords which are consistent +// Identify the snowball based on scene ID, room, and actor list index void IdentifySnowball(Actor* actor, bool* should) { s16 actorListIndex = GetActorListIndex(actor); RandoCheckId randoCheckId = RC_UNKNOWN; @@ -144,18 +193,13 @@ void IdentifySnowball(Actor* actor, bool* should) { auto it = snowballActorIdMap.find({ gPlayState->sceneId, gPlayState->roomCtx.curRoom.num, actorListIndex }); if (it != snowballActorIdMap.end()) { randoCheckId = it->second; - } else { - auto it2 = snowballCoordsMap.find({ actor->home.pos.x, actor->home.pos.z }); - if (it2 != snowballCoordsMap.end()) { - randoCheckId = it2->second; - } } if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { return; } - Rando::ActorBehavior::SetActorRandoCheckId(actor, randoCheckId); + Rando::ActorBehavior::SetObjectRandoCheckId(actor, randoCheckId); } void SpawnSnowballDrop(Vec3f pos, RandoCheckId randoCheckId) { @@ -180,7 +224,7 @@ void Rando::ActorBehavior::InitObjSnowballBehavior() { COND_VB_SHOULD(VB_SNOWBALL_DROP_COLLECTIBLE, IS_RANDO, { Actor* actor = va_arg(args, Actor*); - RandoCheckId randoCheckId = GetActorRandoCheckId(actor); + RandoCheckId randoCheckId = GetObjectRandoCheckId(actor); if (randoCheckId == RC_UNKNOWN) { return; @@ -202,7 +246,7 @@ void Rando::ActorBehavior::InitObjSnowballBehavior() { return; } - RandoCheckId randoCheckId = GetActorRandoCheckId(actor); + RandoCheckId randoCheckId = GetObjectRandoCheckId(actor); if (randoCheckId == RC_UNKNOWN) { return; diff --git a/mm/2s2h/Rando/ActorBehavior/ObjTaru.cpp b/mm/2s2h/Rando/ActorBehavior/ObjTaru.cpp index 50aba379c..19532e82a 100644 --- a/mm/2s2h/Rando/ActorBehavior/ObjTaru.cpp +++ b/mm/2s2h/Rando/ActorBehavior/ObjTaru.cpp @@ -1,5 +1,6 @@ #include "ActorBehavior.h" #include <libultraship/bridge/consolevariablebridge.h> +#include "2s2h/ObjectExtension/ActorListIndex.h" #include "2s2h/CustomItem/CustomItem.h" #include "assets/2s2h_assets.h" @@ -8,56 +9,54 @@ extern "C" { #include "src/overlays/actors/ovl_Obj_Taru/z_obj_taru.h" } -#define OBJTARU_RC (actor->home.rot.x) - -std::map<std::pair<float, float>, RandoCheckId> barrelMap = { +std::map<std::tuple<s16, s16, s16>, RandoCheckId> barrelMap = { // Great Bay Temple // - { { -540.0f, 3450.0f }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_01 }, - { { -480.0f, 3450.0f }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_02 }, - { { -540.0f, 3510.0f }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_03 }, - { { -480.0f, 3510.0f }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_04 }, - { { 480.0f, 3510.0f }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_05 }, - { { 540.0f, 3510.0f }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_06 }, - { { 480.0f, 3450.0f }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_07 }, - { { 540.0f, 3450.0f }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_08 }, - { { -360.0f, -1455.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_BARREL_01 }, - { { -240.0f, -1455.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_BARREL_02 }, - { { -300.0f, -1590.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_BARREL_03 }, - { { 2685.0f, -1200.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_BARREL_01 }, - { { 2685.0f, -1260.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_BARREL_02 }, - { { 1785.0f, 2190.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_BARREL_01 }, - { { 1785.0f, 2070.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_BARREL_02 }, - { { 1785.0f, 2010.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_BARREL_03 }, - { { 1305.0f, 2058.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_BARREL_04 }, - { { 1305.0f, 1998.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_BARREL_05 }, + { { SCENE_SEA, 13, 0 }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_01 }, + { { SCENE_SEA, 13, 1 }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_02 }, + { { SCENE_SEA, 13, 2 }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_03 }, + { { SCENE_SEA, 13, 3 }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_04 }, + { { SCENE_SEA, 13, 4 }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_05 }, + { { SCENE_SEA, 13, 5 }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_06 }, + { { SCENE_SEA, 13, 6 }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_07 }, + { { SCENE_SEA, 13, 7 }, RC_GREAT_BAY_TEMPLE_ENTRANCE_BARREL_08 }, + { { SCENE_SEA, 12, 11 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_BARREL_01 }, + { { SCENE_SEA, 12, 12 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_BARREL_02 }, + { { SCENE_SEA, 12, 10 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_BARREL_03 }, + { { SCENE_SEA, 9, 7 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_BARREL_01 }, + { { SCENE_SEA, 9, 6 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_BARREL_02 }, + { { SCENE_SEA, 2, 2 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_BARREL_01 }, + { { SCENE_SEA, 2, 5 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_BARREL_02 }, + { { SCENE_SEA, 2, 6 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_BARREL_03 }, + { { SCENE_SEA, 2, 4 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_BARREL_04 }, + { { SCENE_SEA, 2, 3 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_SWITCH_ROOM_BARREL_05 }, // Pirates Fortress // - { { 3880.0f, -850.0f }, RC_PIRATE_FORTRESS_CAPTAIN_ROOM_BARREL_01 }, - { { 3880.0f, -910.0f }, RC_PIRATE_FORTRESS_CAPTAIN_ROOM_BARREL_02 }, - { { -80.0f, 1320.0f }, RC_PIRATE_FORTRESS_ENTRANCE_BARREL }, - { { 3740.0f, -1860.0f }, RC_PIRATE_FORTRESS_INTERIOR_GUARDED_BARREL }, - { { 2680.0f, -1440.0f }, RC_PIRATE_FORTRESS_PLAZA_BARREL }, - { { 2520.0f, 440.0f }, RC_PIRATE_FORTRESS_SEWERS_END_BARREL_01 }, - { { 2580.0f, 400.0f }, RC_PIRATE_FORTRESS_SEWERS_END_BARREL_02 }, - { { 2520.0f, 381.0f }, RC_PIRATE_FORTRESS_SEWERS_END_BARREL_03 }, - { { 2580.0f, 341.0f }, RC_PIRATE_FORTRESS_SEWERS_END_BARREL_04 }, - { { 2520.0f, 321.0f }, RC_PIRATE_FORTRESS_SEWERS_END_BARREL_05 }, - { { 1880.0f, -2020.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_01 }, - { { 1880.0f, -2080.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_02 }, - { { 1880.0f, -2140.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_03 }, - { { 2171.0f, -1503.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_04 }, - { { 2171.0f, -1443.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_05 }, - { { 2171.0f, -1383.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_06 }, - { { 2070.0f, -2250.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_07 }, - { { 2070.0f, -2310.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_08 }, - { { 2070.0f, -2370.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_09 }, - { { 2070.0f, -2430.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_10 }, - { { 1570.0f, -2310.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_11 }, - { { 1510.0f, -2310.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_12 }, - { { 1570.0f, -2370.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_13 }, - { { 1570.0f, -2430.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_14 }, - { { 1510.0f, -2370.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_15 }, - { { 1510.0f, -2430.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_16 }, + { { SCENE_PIRATE, 3, 7 }, RC_PIRATE_FORTRESS_CAPTAIN_ROOM_BARREL_01 }, + { { SCENE_PIRATE, 3, 6 }, RC_PIRATE_FORTRESS_CAPTAIN_ROOM_BARREL_02 }, + { { SCENE_TORIDE, 0, 7 }, RC_PIRATE_FORTRESS_ENTRANCE_BARREL }, + { { SCENE_PIRATE, 13, 1 }, RC_PIRATE_FORTRESS_INTERIOR_GUARDED_BARREL }, + { { SCENE_KAIZOKU, 0, 8 }, RC_PIRATE_FORTRESS_PLAZA_BARREL }, + { { SCENE_PIRATE, 9, 8 }, RC_PIRATE_FORTRESS_SEWERS_END_BARREL_01 }, + { { SCENE_PIRATE, 9, 9 }, RC_PIRATE_FORTRESS_SEWERS_END_BARREL_02 }, + { { SCENE_PIRATE, 9, 7 }, RC_PIRATE_FORTRESS_SEWERS_END_BARREL_03 }, + { { SCENE_PIRATE, 9, 6 }, RC_PIRATE_FORTRESS_SEWERS_END_BARREL_04 }, + { { SCENE_PIRATE, 9, 5 }, RC_PIRATE_FORTRESS_SEWERS_END_BARREL_05 }, + { { SCENE_PIRATE, 11, 21 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_01 }, + { { SCENE_PIRATE, 11, 20 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_02 }, + { { SCENE_PIRATE, 11, 19 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_03 }, + { { SCENE_PIRATE, 11, 18 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_04 }, + { { SCENE_PIRATE, 11, 17 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_05 }, + { { SCENE_PIRATE, 11, 16 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_06 }, + { { SCENE_PIRATE, 11, 12 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_07 }, + { { SCENE_PIRATE, 11, 10 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_08 }, + { { SCENE_PIRATE, 11, 9 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_09 }, + { { SCENE_PIRATE, 11, 15 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_10 }, + { { SCENE_PIRATE, 11, 7 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_11 }, + { { SCENE_PIRATE, 11, 6 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_12 }, + { { SCENE_PIRATE, 11, 11 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_13 }, + { { SCENE_PIRATE, 11, 14 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_14 }, + { { SCENE_PIRATE, 11, 8 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_15 }, + { { SCENE_PIRATE, 11, 13 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_BARREL_16 }, }; void ObjTaru_RandoDraw(Actor* actor, PlayState* play) { @@ -66,7 +65,8 @@ void ObjTaru_RandoDraw(Actor* actor, PlayState* play) { return; } - RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[OBJTARU_RC].randoItemId, (RandoCheckId)OBJTARU_RC); + RandoCheckId randoCheckId = Rando::ActorBehavior::GetObjectRandoCheckId(actor); + RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[randoCheckId].randoItemId, randoCheckId); RandoItemType randoItemType = Rando::StaticData::Items[randoItemId].randoItemType; switch (randoItemType) { @@ -101,28 +101,29 @@ void ObjTaru_RandoDraw(Actor* actor, PlayState* play) { } void Rando::ActorBehavior::InitObjTaruBehavior() { + // Identify the barrel based on scene ID, room, and actor list index COND_ID_HOOK(OnActorInit, ACTOR_OBJ_TARU, IS_RANDO, [](Actor* actor) { RandoCheckId randoCheckId = RC_UNKNOWN; - auto it = barrelMap.find({ actor->home.pos.x, actor->home.pos.z }); - if (it == barrelMap.end()) { - return; + s16 actorListIndex = GetActorListIndex(actor); + auto it = barrelMap.find({ gPlayState->sceneId, gPlayState->roomCtx.curRoom.num, actorListIndex }); + if (it != barrelMap.end()) { + randoCheckId = it->second; } - randoCheckId = it->second; - if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { return; } - OBJTARU_RC = randoCheckId; + Rando::ActorBehavior::SetObjectRandoCheckId(actor, randoCheckId); actor->draw = ObjTaru_RandoDraw; }); COND_VB_SHOULD(VB_BARREL_OR_CRATE_DROP_COLLECTIBLE, IS_RANDO, { Actor* actor = va_arg(args, Actor*); + RandoCheckId randoCheckId = GetObjectRandoCheckId(actor); - if (actor->id != ACTOR_OBJ_TARU || OBJTARU_RC == RC_UNKNOWN) { + if (actor->id != ACTOR_OBJ_TARU || randoCheckId == RC_UNKNOWN) { return; } @@ -130,7 +131,7 @@ void Rando::ActorBehavior::InitObjTaruBehavior() { EnItem00* spawn = CustomItem::Spawn( actor->world.pos.x, actor->world.pos.y, actor->world.pos.z, 0, - CustomItem::KILL_ON_TOUCH | CustomItem::TOSS_ON_SPAWN, OBJTARU_RC, + CustomItem::KILL_ON_TOUCH | CustomItem::TOSS_ON_SPAWN, randoCheckId, [](Actor* actor, PlayState* play) { auto& randoStaticCheck = Rando::StaticData::Checks[(RandoCheckId)CUSTOM_ITEM_PARAM]; switch (randoStaticCheck.flagType) { diff --git a/mm/2s2h/Rando/ActorBehavior/ObjTsubo.cpp b/mm/2s2h/Rando/ActorBehavior/ObjTsubo.cpp index 356524558..4517c1273 100644 --- a/mm/2s2h/Rando/ActorBehavior/ObjTsubo.cpp +++ b/mm/2s2h/Rando/ActorBehavior/ObjTsubo.cpp @@ -4,6 +4,7 @@ #include "2s2h/CustomItem/CustomItem.h" #include "2s2h/Rando/Rando.h" #include "2s2h/ShipInit.hpp" +#include "2s2h/ObjectExtension/ActorListIndex.h" #include "assets/2s2h_assets.h" extern "C" { @@ -14,372 +15,322 @@ extern "C" { void ObjTsubo_Draw(Actor* actor, PlayState* play); } -std::map<SceneId, std::map<std::pair<float, float>, RandoCheckId>> potMap = { +std::map<std::tuple<s16, s16, s16>, RandoCheckId> potMap = { // Deku Shrine // - { SCENE_DANPEI, - { - { { 1881.0f, 980.0f }, RC_DEKU_SHRINE_POT_01 }, - { { 2373.0f, 0.0f }, RC_DEKU_SHRINE_POT_02 }, - } }, + { { SCENE_DANPEI, 0, 14 }, RC_DEKU_SHRINE_POT_01 }, + { { SCENE_DANPEI, 0, 15 }, RC_DEKU_SHRINE_POT_02 }, // Stone Tower // - { SCENE_F40, - { - { { 1204.0f, 1871.0f }, RC_STONE_TOWER_HIGHER_SCARECROW_POT_02 }, - { { 1364.0f, 2391.0f }, RC_STONE_TOWER_HIGHER_SCARECROW_POT_08 }, - { { -1116.0f, 2231.0f }, RC_STONE_TOWER_LOWER_SCARECROW_POT_02 }, - { { -1116.0f, 2031.0f }, RC_STONE_TOWER_LOWER_SCARECROW_POT_04 }, - { { -1116.0f, 1511.0f }, RC_STONE_TOWER_LOWER_SCARECROW_POT_11 }, - } }, + { { SCENE_F40, 0, 52 }, RC_STONE_TOWER_HIGHER_SCARECROW_POT_02 }, + { { SCENE_F40, 0, 57 }, RC_STONE_TOWER_HIGHER_SCARECROW_POT_08 }, + { { SCENE_F40, 0, 47 }, RC_STONE_TOWER_LOWER_SCARECROW_POT_02 }, + { { SCENE_F40, 0, 45 }, RC_STONE_TOWER_LOWER_SCARECROW_POT_04 }, + { { SCENE_F40, 0, 48 }, RC_STONE_TOWER_LOWER_SCARECROW_POT_11 }, // Beneath the Graveyard // - { SCENE_HAKASHITA, - { - { { 1270.0f, 380.0f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_1_BATS_POT_03 }, - { { -1121.0f, -879.0f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_AFTER_PIT_POT_01 }, - { { -1200.0f, -881.0f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_AFTER_PIT_POT_02 }, - { { -1200.0f, -1400.0f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_AFTER_PIT_POT_03 }, - { { -1120.0f, -1400.0f }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_AFTER_PIT_POT_04 }, - } }, + { { SCENE_HAKASHITA, 1, 6 }, RC_BENEATH_THE_GRAVEYARD_NIGHT_1_BATS_POT_03 }, + { { SCENE_HAKASHITA, 3, 12 }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_AFTER_PIT_POT_01 }, + { { SCENE_HAKASHITA, 3, 11 }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_AFTER_PIT_POT_02 }, + { { SCENE_HAKASHITA, 3, 7 }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_AFTER_PIT_POT_03 }, + { { SCENE_HAKASHITA, 3, 8 }, RC_BENEATH_THE_GRAVEYARD_NIGHT_2_AFTER_PIT_POT_04 }, // Snowhead Temple - Goht's Lair // - { SCENE_HAKUGIN_BS, - { - { { -1250.0f, -1250.0f }, RC_SNOWHEAD_TEMPLE_BOSS_POT_01 }, - { { -1400.0f, -60.0f }, RC_SNOWHEAD_TEMPLE_BOSS_POT_02 }, - { { -1600.0f, -60.0f }, RC_SNOWHEAD_TEMPLE_BOSS_POT_03 }, - { { -1250.0f, 1250.0f }, RC_SNOWHEAD_TEMPLE_BOSS_POT_04 }, - { { 61.0f, 1440.0f }, RC_SNOWHEAD_TEMPLE_BOSS_POT_05 }, - { { 61.0f, 1740.0f }, RC_SNOWHEAD_TEMPLE_BOSS_POT_06 }, - { { 1250.0f, 1250.0f }, RC_SNOWHEAD_TEMPLE_BOSS_POT_07 }, - { { 1460.0f, -60.0f }, RC_SNOWHEAD_TEMPLE_BOSS_POT_08 }, - { { 1660.0f, -60.0f }, RC_SNOWHEAD_TEMPLE_BOSS_POT_09 }, - { { 1250.0f, -1250.0f }, RC_SNOWHEAD_TEMPLE_BOSS_POT_10 }, - { { 150.0f, -1170.0f }, RC_SNOWHEAD_TEMPLE_BOSS_EARLY_POT_01 }, - { { -150.0f, -1170.0f }, RC_SNOWHEAD_TEMPLE_BOSS_EARLY_POT_02 }, - { { 0.0f, -1400.0f }, RC_SNOWHEAD_TEMPLE_BOSS_EARLY_POT_03 }, - { { 0.0f, -1600.0f }, RC_SNOWHEAD_TEMPLE_BOSS_EARLY_POT_04 }, - } }, + { { SCENE_HAKUGIN_BS, 0, 9 }, RC_SNOWHEAD_TEMPLE_BOSS_POT_01 }, + { { SCENE_HAKUGIN_BS, 0, 1 }, RC_SNOWHEAD_TEMPLE_BOSS_POT_02 }, + { { SCENE_HAKUGIN_BS, 0, 3 }, RC_SNOWHEAD_TEMPLE_BOSS_POT_03 }, + { { SCENE_HAKUGIN_BS, 0, 10 }, RC_SNOWHEAD_TEMPLE_BOSS_POT_04 }, + { { SCENE_HAKUGIN_BS, 0, 7 }, RC_SNOWHEAD_TEMPLE_BOSS_POT_05 }, + { { SCENE_HAKUGIN_BS, 0, 8 }, RC_SNOWHEAD_TEMPLE_BOSS_POT_06 }, + { { SCENE_HAKUGIN_BS, 0, 11 }, RC_SNOWHEAD_TEMPLE_BOSS_POT_07 }, + { { SCENE_HAKUGIN_BS, 0, 2 }, RC_SNOWHEAD_TEMPLE_BOSS_POT_08 }, + { { SCENE_HAKUGIN_BS, 0, 4 }, RC_SNOWHEAD_TEMPLE_BOSS_POT_09 }, + { { SCENE_HAKUGIN_BS, 0, 12 }, RC_SNOWHEAD_TEMPLE_BOSS_POT_10 }, + { { SCENE_HAKUGIN_BS, 0, 13 }, RC_SNOWHEAD_TEMPLE_BOSS_EARLY_POT_01 }, + { { SCENE_HAKUGIN_BS, 0, 14 }, RC_SNOWHEAD_TEMPLE_BOSS_EARLY_POT_02 }, + { { SCENE_HAKUGIN_BS, 0, 5 }, RC_SNOWHEAD_TEMPLE_BOSS_EARLY_POT_03 }, + { { SCENE_HAKUGIN_BS, 0, 6 }, RC_SNOWHEAD_TEMPLE_BOSS_EARLY_POT_04 }, // Snowhead Temple // - { SCENE_HAKUGIN, - { - { { -1052.0f, 338.0f }, RC_SNOWHEAD_TEMPLE_BLOCK_ROOM_POT_01 }, - { { -1091.0f, 327.0f }, RC_SNOWHEAD_TEMPLE_BLOCK_ROOM_POT_02 }, - { { 930.0f, 1065.0f }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_POT_01 }, - { { 810.0f, 1065.0f }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_POT_02 }, - { { 870.0f, 1005.0f }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_POT_03 }, - { { 870.0f, 1125.0f }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_POT_04 }, - { { 870.0f, 1065.0f }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_POT_05 }, - { { 795.0f, -60.0f }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_AFTER_POT_01 }, - { { 825.0f, -75.0f }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_AFTER_POT_02 }, - { { -585.0f, -645.0f }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_POT_01 }, - { { -645.0f, -585.0f }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_POT_02 }, - { { 570.0f, -90.0f }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_LEVEL_2_POT_01 }, - { { 510.0f, -90.0f }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_LEVEL_2_POT_02 }, - { { 435.0f, -570.0f }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_NEAR_BOSS_KEY_POT_01 }, - { { 410.0f, -526.0f }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_NEAR_BOSS_KEY_POT_02 }, - { { 473.0f, 458.0f }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_SCARECROW_POT_01 }, - { { 519.0f, 535.0f }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_SCARECROW_POT_02 }, - { { -1543.0f, 703.0f }, RC_SNOWHEAD_TEMPLE_COMPASS_ROOM_POT_01 }, - { { -1507.0f, 655.0f }, RC_SNOWHEAD_TEMPLE_COMPASS_ROOM_POT_02 }, - { { -351.0f, 1153.0f }, RC_SNOWHEAD_TEMPLE_COMPASS_ROOM_POT_03 }, - { { -378.0f, 1169.0f }, RC_SNOWHEAD_TEMPLE_COMPASS_ROOM_POT_04 }, - { { -1525.0f, 679.0f }, RC_SNOWHEAD_TEMPLE_COMPASS_ROOM_POT_05 }, - { { -727.0f, 993.0f }, RC_SNOWHEAD_TEMPLE_DUAL_SWITCHES_POT_01 }, - { { -675.0f, 920.0f }, RC_SNOWHEAD_TEMPLE_DUAL_SWITCHES_POT_02 }, - { { 225.0f, 975.0f }, RC_SNOWHEAD_TEMPLE_ENTRANCE_POT_01 }, - { { 225.0f, 1065.0f }, RC_SNOWHEAD_TEMPLE_ENTRANCE_POT_02 }, - { { -452.0f, -995.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_01 }, - { { -473.0f, -958.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_02 }, - { { -493.0f, -921.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_03 }, - { { -420.0f, -930.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_04 }, - { { -1275.0f, -600.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_05 }, - { { -1305.0f, -623.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_06 }, - { { -1335.0f, -645.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_07 }, - { { -870.0f, -105.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_01 }, - { { -915.0f, -105.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_02 }, - { { 135.0f, -1050.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_03 }, - { { 150.0f, -990.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_04 }, - { { -1184.0f, -1316.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_05 }, - { { -1116.0f, -1374.0f }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_06 }, - { { 1320.0f, -690.0f }, RC_SNOWHEAD_TEMPLE_WIZZROBE_POT_01 }, - { { 1440.0f, -690.0f }, RC_SNOWHEAD_TEMPLE_WIZZROBE_POT_02 }, - { { 1380.0f, -690.0f }, RC_SNOWHEAD_TEMPLE_WIZZROBE_POT_03 }, - { { 1440.0f, -630.0f }, RC_SNOWHEAD_TEMPLE_WIZZROBE_POT_04 }, - { { 1440.0f, -570.0f }, RC_SNOWHEAD_TEMPLE_WIZZROBE_POT_05 }, - } }, + { { SCENE_HAKUGIN, 3, 7 }, RC_SNOWHEAD_TEMPLE_BLOCK_ROOM_POT_01 }, + { { SCENE_HAKUGIN, 3, 0 }, RC_SNOWHEAD_TEMPLE_BLOCK_ROOM_POT_02 }, + { { SCENE_HAKUGIN, 2, 8 }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_POT_01 }, + { { SCENE_HAKUGIN, 2, 7 }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_POT_02 }, + { { SCENE_HAKUGIN, 2, 9 }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_POT_03 }, + { { SCENE_HAKUGIN, 2, 10 }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_POT_04 }, + { { SCENE_HAKUGIN, 2, 11 }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_POT_05 }, + { { SCENE_HAKUGIN, 2, 2 }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_AFTER_POT_01 }, + { { SCENE_HAKUGIN, 2, 1 }, RC_SNOWHEAD_TEMPLE_BRIDGE_ROOM_AFTER_POT_02 }, + { { SCENE_HAKUGIN, 4, 48 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_POT_01 }, + { { SCENE_HAKUGIN, 4, 49 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_BOTTOM_POT_02 }, + { { SCENE_HAKUGIN, 4, 47 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_LEVEL_2_POT_01 }, + { { SCENE_HAKUGIN, 4, 46 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_LEVEL_2_POT_02 }, + { { SCENE_HAKUGIN, 4, 29 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_NEAR_BOSS_KEY_POT_01 }, + { { SCENE_HAKUGIN, 4, 30 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_NEAR_BOSS_KEY_POT_02 }, + { { SCENE_HAKUGIN, 4, 27 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_SCARECROW_POT_01 }, + { { SCENE_HAKUGIN, 4, 28 }, RC_SNOWHEAD_TEMPLE_CENTRAL_ROOM_SCARECROW_POT_02 }, + { { SCENE_HAKUGIN, 1, 5 }, RC_SNOWHEAD_TEMPLE_COMPASS_ROOM_POT_01 }, + { { SCENE_HAKUGIN, 1, 6 }, RC_SNOWHEAD_TEMPLE_COMPASS_ROOM_POT_02 }, + { { SCENE_HAKUGIN, 1, 7 }, RC_SNOWHEAD_TEMPLE_COMPASS_ROOM_POT_03 }, + { { SCENE_HAKUGIN, 1, 8 }, RC_SNOWHEAD_TEMPLE_COMPASS_ROOM_POT_04 }, + { { SCENE_HAKUGIN, 1, 9 }, RC_SNOWHEAD_TEMPLE_COMPASS_ROOM_POT_05 }, + { { SCENE_HAKUGIN, 8, 12 }, RC_SNOWHEAD_TEMPLE_DUAL_SWITCHES_POT_01 }, + { { SCENE_HAKUGIN, 8, 11 }, RC_SNOWHEAD_TEMPLE_DUAL_SWITCHES_POT_02 }, + { { SCENE_HAKUGIN, 0, 21 }, RC_SNOWHEAD_TEMPLE_ENTRANCE_POT_01 }, + { { SCENE_HAKUGIN, 0, 22 }, RC_SNOWHEAD_TEMPLE_ENTRANCE_POT_02 }, + { { SCENE_HAKUGIN, 5, 12 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_01 }, + { { SCENE_HAKUGIN, 5, 13 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_02 }, + { { SCENE_HAKUGIN, 5, 14 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_03 }, + { { SCENE_HAKUGIN, 5, 15 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_04 }, + { { SCENE_HAKUGIN, 5, 18 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_05 }, + { { SCENE_HAKUGIN, 5, 17 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_06 }, + { { SCENE_HAKUGIN, 5, 16 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_LOWER_POT_07 }, + { { SCENE_HAKUGIN, 5, 4 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_01 }, + { { SCENE_HAKUGIN, 5, 6 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_02 }, + { { SCENE_HAKUGIN, 5, 5 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_03 }, + { { SCENE_HAKUGIN, 5, 3 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_04 }, + { { SCENE_HAKUGIN, 5, 8 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_05 }, + { { SCENE_HAKUGIN, 5, 7 }, RC_SNOWHEAD_TEMPLE_PILLARS_ROOM_UPPER_POT_06 }, + { { SCENE_HAKUGIN, 12, 8 }, RC_SNOWHEAD_TEMPLE_WIZZROBE_POT_01 }, + { { SCENE_HAKUGIN, 12, 10 }, RC_SNOWHEAD_TEMPLE_WIZZROBE_POT_02 }, + { { SCENE_HAKUGIN, 12, 11 }, RC_SNOWHEAD_TEMPLE_WIZZROBE_POT_03 }, + { { SCENE_HAKUGIN, 12, 12 }, RC_SNOWHEAD_TEMPLE_WIZZROBE_POT_04 }, + { { SCENE_HAKUGIN, 12, 9 }, RC_SNOWHEAD_TEMPLE_WIZZROBE_POT_05 }, // The Moon - Majora's Lair // - { SCENE_LAST_BS, - { - { { 80.0f, 800.0f }, RC_MOON_MAJORA_POT_01 }, - { { -80.0f, 800.0f }, RC_MOON_MAJORA_POT_02 }, - } }, + { { SCENE_LAST_BS, 0, 2 }, RC_MOON_MAJORA_POT_01 }, + { { SCENE_LAST_BS, 0, 1 }, RC_MOON_MAJORA_POT_02 }, // The Moon - Goron Trial // - { SCENE_LAST_GORON, - { - { { -5670.0f, -2280.0f }, RC_MOON_TRIAL_GORON_POT_01 }, - { { -5610.0f, -2280.0f }, RC_MOON_TRIAL_GORON_POT_02 }, - { { -2700.0f, -2490.0f }, RC_MOON_TRIAL_GORON_POT_03 }, - { { -2640.0f, -2490.0f }, RC_MOON_TRIAL_GORON_POT_04 }, - { { -2580.0f, -2490.0f }, RC_MOON_TRIAL_GORON_POT_05 }, - { { -7200.0f, -1290.0f }, RC_MOON_TRIAL_GORON_POT_06 }, - { { -7260.0f, -1290.0f }, RC_MOON_TRIAL_GORON_POT_07 }, - { { -7200.0f, -1410.0f }, RC_MOON_TRIAL_GORON_POT_08 }, - { { -7260.0f, -1410.0f }, RC_MOON_TRIAL_GORON_POT_09 }, - { { -4890.0f, -1380.0f }, RC_MOON_TRIAL_GORON_POT_10 }, - { { -4890.0f, -1320.0f }, RC_MOON_TRIAL_GORON_POT_11 }, - { { -420.0f, -1425.0f }, RC_MOON_TRIAL_GORON_EARLY_POT_01 }, - { { -480.0f, -1425.0f }, RC_MOON_TRIAL_GORON_EARLY_POT_02 }, - { { -420.0f, -1275.0f }, RC_MOON_TRIAL_GORON_EARLY_POT_03 }, - { { -480.0f, -1275.0f }, RC_MOON_TRIAL_GORON_EARLY_POT_04 }, - } }, + { { SCENE_LAST_GORON, 0, 22 }, RC_MOON_TRIAL_GORON_POT_01 }, + { { SCENE_LAST_GORON, 0, 21 }, RC_MOON_TRIAL_GORON_POT_02 }, + { { SCENE_LAST_GORON, 0, 25 }, RC_MOON_TRIAL_GORON_POT_03 }, + { { SCENE_LAST_GORON, 0, 23 }, RC_MOON_TRIAL_GORON_POT_04 }, + { { SCENE_LAST_GORON, 0, 24 }, RC_MOON_TRIAL_GORON_POT_05 }, + { { SCENE_LAST_GORON, 0, 35 }, RC_MOON_TRIAL_GORON_POT_06 }, + { { SCENE_LAST_GORON, 0, 33 }, RC_MOON_TRIAL_GORON_POT_07 }, + { { SCENE_LAST_GORON, 0, 34 }, RC_MOON_TRIAL_GORON_POT_08 }, + { { SCENE_LAST_GORON, 0, 32 }, RC_MOON_TRIAL_GORON_POT_09 }, + { { SCENE_LAST_GORON, 0, 26 }, RC_MOON_TRIAL_GORON_POT_10 }, + { { SCENE_LAST_GORON, 0, 27 }, RC_MOON_TRIAL_GORON_POT_11 }, + { { SCENE_LAST_GORON, 0, 29 }, RC_MOON_TRIAL_GORON_EARLY_POT_01 }, + { { SCENE_LAST_GORON, 0, 28 }, RC_MOON_TRIAL_GORON_EARLY_POT_02 }, + { { SCENE_LAST_GORON, 0, 31 }, RC_MOON_TRIAL_GORON_EARLY_POT_03 }, + { { SCENE_LAST_GORON, 0, 30 }, RC_MOON_TRIAL_GORON_EARLY_POT_04 }, // The Moon - Link Trial // - { SCENE_LAST_LINK, - { - { { -270.0f, -90.0f }, RC_MOON_TRIAL_LINK_POT_01 }, - { { -270.0f, -150.0f }, RC_MOON_TRIAL_LINK_POT_02 }, - { { -210.0f, -90.0f }, RC_MOON_TRIAL_LINK_POT_03 }, - { { -210.0f, -150.0f }, RC_MOON_TRIAL_LINK_POT_04 }, - { { 210.0f, -90.0f }, RC_MOON_TRIAL_LINK_POT_05 }, - { { 210.0f, -150.0f }, RC_MOON_TRIAL_LINK_POT_06 }, - { { 270.0f, -90.0f }, RC_MOON_TRIAL_LINK_POT_07 }, - { { 270.0f, -150.0f }, RC_MOON_TRIAL_LINK_POT_08 }, - } }, - // Pirate's Fortress // - { SCENE_PIRATE, - { - { { 4020.0f, -1860.0f }, RC_PIRATE_FORTRESS_INTERIOR_GUARDED_POT_01 }, - { { 2040.0f, -1380.0f }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_POT_02 }, - { { 1920.0f, -640.0f }, RC_PIRATE_FORTRESS_SEWERS_WATERWAY_POT_01 }, - } }, + { { SCENE_LAST_LINK, 0, 3 }, RC_MOON_TRIAL_LINK_POT_01 }, + { { SCENE_LAST_LINK, 0, 1 }, RC_MOON_TRIAL_LINK_POT_02 }, + { { SCENE_LAST_LINK, 0, 4 }, RC_MOON_TRIAL_LINK_POT_03 }, + { { SCENE_LAST_LINK, 0, 2 }, RC_MOON_TRIAL_LINK_POT_04 }, + { { SCENE_LAST_LINK, 0, 7 }, RC_MOON_TRIAL_LINK_POT_05 }, + { { SCENE_LAST_LINK, 0, 5 }, RC_MOON_TRIAL_LINK_POT_06 }, + { { SCENE_LAST_LINK, 0, 8 }, RC_MOON_TRIAL_LINK_POT_07 }, + { { SCENE_LAST_LINK, 0, 6 }, RC_MOON_TRIAL_LINK_POT_08 }, + // Pirates' Fortress Interior // + { { SCENE_PIRATE, 13, 6 }, RC_PIRATE_FORTRESS_INTERIOR_GUARDED_POT_01 }, + { { SCENE_PIRATE, 11, 35 }, RC_PIRATE_FORTRESS_SEWERS_HEART_PIECE_ROOM_POT_02 }, + { { SCENE_PIRATE, 10, 8 }, RC_PIRATE_FORTRESS_SEWERS_WATERWAY_POT_01 }, // Beneath the Well // - { SCENE_REDEAD, - { - { { 1620.0f, -960.0f }, RC_BENEATH_THE_WELL_BIG_POE_POT_01 }, - { { 1620.0f, -1560.0f }, RC_BENEATH_THE_WELL_BIG_POE_POT_02 }, - { { 2280.0f, -1560.0f }, RC_BENEATH_THE_WELL_BIG_POE_POT_03 }, - { { 2280.0f, -960.0f }, RC_BENEATH_THE_WELL_BIG_POE_POT_04 }, - { { 1185.0f, -915.0f }, RC_BENEATH_THE_WELL_MIDDLE_POT_01 }, - { { 1185.0f, -945.0f }, RC_BENEATH_THE_WELL_MIDDLE_POT_02 }, - { { 1185.0f, -975.0f }, RC_BENEATH_THE_WELL_MIDDLE_POT_03 }, - { { 1185.0f, -1005.0f }, RC_BENEATH_THE_WELL_MIDDLE_POT_04 }, - { { 1185.0f, -1035.0f }, RC_BENEATH_THE_WELL_MIDDLE_POT_05 }, - { { 1185.0f, -1065.0f }, RC_BENEATH_THE_WELL_MIDDLE_POT_06 }, - { { 1185.0f, -1095.0f }, RC_BENEATH_THE_WELL_MIDDLE_POT_07 }, - { { 1185.0f, -1125.0f }, RC_BENEATH_THE_WELL_MIDDLE_POT_08 }, - { { 1185.0f, -1155.0f }, RC_BENEATH_THE_WELL_MIDDLE_POT_09 }, - { { 1185.0f, -1185.0f }, RC_BENEATH_THE_WELL_MIDDLE_POT_10 }, - } }, + { { SCENE_REDEAD, 12, 7 }, RC_BENEATH_THE_WELL_BIG_POE_POT_01 }, + { { SCENE_REDEAD, 12, 8 }, RC_BENEATH_THE_WELL_BIG_POE_POT_02 }, + { { SCENE_REDEAD, 12, 6 }, RC_BENEATH_THE_WELL_BIG_POE_POT_03 }, + { { SCENE_REDEAD, 12, 5 }, RC_BENEATH_THE_WELL_BIG_POE_POT_04 }, + { { SCENE_REDEAD, 6, 14 }, RC_BENEATH_THE_WELL_MIDDLE_POT_01 }, + { { SCENE_REDEAD, 6, 15 }, RC_BENEATH_THE_WELL_MIDDLE_POT_02 }, + { { SCENE_REDEAD, 6, 16 }, RC_BENEATH_THE_WELL_MIDDLE_POT_03 }, + { { SCENE_REDEAD, 6, 17 }, RC_BENEATH_THE_WELL_MIDDLE_POT_04 }, + { { SCENE_REDEAD, 6, 18 }, RC_BENEATH_THE_WELL_MIDDLE_POT_05 }, + { { SCENE_REDEAD, 6, 19 }, RC_BENEATH_THE_WELL_MIDDLE_POT_06 }, + { { SCENE_REDEAD, 6, 20 }, RC_BENEATH_THE_WELL_MIDDLE_POT_07 }, + { { SCENE_REDEAD, 6, 21 }, RC_BENEATH_THE_WELL_MIDDLE_POT_08 }, + { { SCENE_REDEAD, 6, 22 }, RC_BENEATH_THE_WELL_MIDDLE_POT_09 }, + { { SCENE_REDEAD, 6, 23 }, RC_BENEATH_THE_WELL_MIDDLE_POT_10 }, // Woodfall Temple // - { SCENE_MITURIN, - { - { { 120.0f, 2100.0f }, RC_WOODFALL_TEMPLE_ENTRANCE_POT }, - { { 660.0f, -120.0f }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_01 }, - { { 660.0f, 120.0f }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_02 }, - { { 630.0f, 510.0f }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_03 }, - { { 570.0f, 570.0f }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_04 }, - { { 510.0f, 630.0f }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_05 }, - { { 510.0f, 510.0f }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_06 }, - { { 675.0f, 255.0f }, RC_WOODFALL_TEMPLE_MAIN_ROOM_UPPER_POT_01 }, - { { 645.0f, 255.0f }, RC_WOODFALL_TEMPLE_MAIN_ROOM_UPPER_POT_02 }, - { { -780.0f, -165.0f }, RC_WOODFALL_TEMPLE_MAZE_POT_01 }, - { { -780.0f, -105.0f }, RC_WOODFALL_TEMPLE_MAZE_POT_02 }, - { { -120.0f, -2220.0f }, RC_WOODFALL_TEMPLE_PRE_BOSS_POT_01 }, - { { 120.0f, -2220.0f }, RC_WOODFALL_TEMPLE_PRE_BOSS_POT_02 }, - { { 1335.0f, 585.0f }, RC_WOODFALL_TEMPLE_WATER_ROOM_POT_01 }, - { { 1335.0f, 615.0f }, RC_WOODFALL_TEMPLE_WATER_ROOM_POT_02 }, - { { 1335.0f, 645.0f }, RC_WOODFALL_TEMPLE_WATER_ROOM_POT_03 }, - { { 1335.0f, 675.0f }, RC_WOODFALL_TEMPLE_WATER_ROOM_POT_04 }, - } }, + { { SCENE_MITURIN, 2, 22 }, RC_WOODFALL_TEMPLE_ENTRANCE_POT }, + { { SCENE_MITURIN, 1, 22 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_01 }, + { { SCENE_MITURIN, 1, 23 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_02 }, + { { SCENE_MITURIN, 1, 27 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_03 }, + { { SCENE_MITURIN, 1, 24 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_04 }, + { { SCENE_MITURIN, 1, 26 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_05 }, + { { SCENE_MITURIN, 1, 21 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_LOWER_POT_06 }, + { { SCENE_MITURIN, 1, 10 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_UPPER_POT_01 }, + { { SCENE_MITURIN, 1, 11 }, RC_WOODFALL_TEMPLE_MAIN_ROOM_UPPER_POT_02 }, + { { SCENE_MITURIN, 3, 13 }, RC_WOODFALL_TEMPLE_MAZE_POT_01 }, + { { SCENE_MITURIN, 3, 14 }, RC_WOODFALL_TEMPLE_MAZE_POT_02 }, + { { SCENE_MITURIN, 0, 28 }, RC_WOODFALL_TEMPLE_PRE_BOSS_POT_01 }, + { { SCENE_MITURIN, 0, 29 }, RC_WOODFALL_TEMPLE_PRE_BOSS_POT_02 }, + { { SCENE_MITURIN, 5, 14 }, RC_WOODFALL_TEMPLE_WATER_ROOM_POT_01 }, + { { SCENE_MITURIN, 5, 15 }, RC_WOODFALL_TEMPLE_WATER_ROOM_POT_02 }, + { { SCENE_MITURIN, 5, 16 }, RC_WOODFALL_TEMPLE_WATER_ROOM_POT_03 }, + { { SCENE_MITURIN, 5, 17 }, RC_WOODFALL_TEMPLE_WATER_ROOM_POT_04 }, // Swamp Spider House // - { SCENE_KINSTA1, - { - { { -30.0f, -1650.0f }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_LOWER_POT_01 }, - { { 30.0f, -1650.0f }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_LOWER_POT_02 }, - { { 330.0f, -1651.0f }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_POT_01 }, - { { 330.0f, -1590.0f }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_POT_02 }, - { { 330.0f, -1531.0f }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_POT_03 }, - { { 330.0f, -1470.0f }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_POT_04 }, - { { 544.0f, -569.0f }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_01 }, - { { 483.0f, -569.0f }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_02 }, - { { 575.0f, -538.0f }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_03 }, - { { 514.0f, -539.0f }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_04 }, - { { 454.0f, -539.0f }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_05 }, - { { 451.0f, -1232.0f }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_06 }, - { { 451.0f, -1290.0f }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_07 }, - { { 90.0f, -209.0f }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_LOWER_POT_01 }, - { { 89.0f, -269.0f }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_LOWER_POT_02 }, - { { -90.0f, -270.0f }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_LOWER_POT_03 }, - { { 330.0f, -210.0f }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_UPPER_LEFT_POT_01 }, - { { 270.0f, -210.0f }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_UPPER_LEFT_POT_02 }, - { { -270.0f, -210.0f }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_UPPER_RIGHT_POT_01 }, - { { -330.0f, -210.0f }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_UPPER_RIGHT_POT_02 }, - { { -871.0f, -872.0f }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_POT_01 }, - { { -809.0f, -870.0f }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_POT_02 }, - } }, + { { SCENE_KINSTA1, 2, 0 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_LOWER_POT_01 }, + { { SCENE_KINSTA1, 2, 1 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_LOWER_POT_02 }, + { { SCENE_KINSTA1, 2, 2 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_POT_01 }, + { { SCENE_KINSTA1, 2, 5 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_POT_02 }, + { { SCENE_KINSTA1, 2, 4 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_POT_03 }, + { { SCENE_KINSTA1, 2, 3 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_UPPER_POT_04 }, + { { SCENE_KINSTA1, 4, 23 }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_01 }, + { { SCENE_KINSTA1, 4, 21 }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_02 }, + { { SCENE_KINSTA1, 4, 24 }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_03 }, + { { SCENE_KINSTA1, 4, 22 }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_04 }, + { { SCENE_KINSTA1, 4, 20 }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_05 }, + { { SCENE_KINSTA1, 4, 3 }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_06 }, + { { SCENE_KINSTA1, 4, 4 }, RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_07 }, + { { SCENE_KINSTA1, 1, 7 }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_LOWER_POT_01 }, + { { SCENE_KINSTA1, 1, 6 }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_LOWER_POT_02 }, + { { SCENE_KINSTA1, 1, 5 }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_LOWER_POT_03 }, + { { SCENE_KINSTA1, 1, 9 }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_UPPER_LEFT_POT_01 }, + { { SCENE_KINSTA1, 1, 8 }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_UPPER_LEFT_POT_02 }, + { { SCENE_KINSTA1, 1, 4 }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_UPPER_RIGHT_POT_01 }, + { { SCENE_KINSTA1, 1, 3 }, RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_UPPER_RIGHT_POT_02 }, + { { SCENE_KINSTA1, 3, 0 }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_POT_01 }, + { { SCENE_KINSTA1, 3, 1 }, RC_SWAMP_SPIDER_HOUSE_MONUMENT_ROOM_POT_02 }, // Ocean Spider House // - { SCENE_KINDAN2, - { - { { 64.0f, -1650.0f }, RC_OCEAN_SPIDER_HOUSE_MAIN_ROOM_POT_01 }, - { { 2.0f, -1722.0f }, RC_OCEAN_SPIDER_HOUSE_MAIN_ROOM_WEB_POT }, - { { -569.0f, -1200.0f }, RC_OCEAN_SPIDER_HOUSE_STORAGE_POT_02 }, - { { -630.0f, -1200.0f }, RC_OCEAN_SPIDER_HOUSE_STORAGE_POT_03 }, - } }, + { { SCENE_KINDAN2, 1, 28 }, RC_OCEAN_SPIDER_HOUSE_MAIN_ROOM_POT_01 }, + { { SCENE_KINDAN2, 1, 27 }, RC_OCEAN_SPIDER_HOUSE_MAIN_ROOM_WEB_POT }, + { { SCENE_KINDAN2, 5, 12 }, RC_OCEAN_SPIDER_HOUSE_STORAGE_POT_02 }, + { { SCENE_KINDAN2, 5, 13 }, RC_OCEAN_SPIDER_HOUSE_STORAGE_POT_03 }, // Great Bay Temple - Gyorg's Lair // - { SCENE_SEA_BS, - { - { { 150.0f, 150.0f }, RC_GREAT_BAY_TEMPLE_BOSS_POT_01 }, - { { -150.0f, 150.0f }, RC_GREAT_BAY_TEMPLE_BOSS_POT_02 }, - { { -150.0f, -150.0f }, RC_GREAT_BAY_TEMPLE_BOSS_POT_03 }, - { { 150.0f, -150.0f }, RC_GREAT_BAY_TEMPLE_BOSS_POT_04 }, - { { 1200.0f, -1200.0f }, RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_01 }, - { { 1200.0f, 1200.0f }, RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_02 }, - { { -1200.0f, 1200.0f }, RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_03 }, - { { -1200.0f, -1200.0f }, RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_04 }, - } }, + { { SCENE_SEA_BS, 0, 2 }, RC_GREAT_BAY_TEMPLE_BOSS_POT_01 }, + { { SCENE_SEA_BS, 0, 3 }, RC_GREAT_BAY_TEMPLE_BOSS_POT_02 }, + { { SCENE_SEA_BS, 0, 4 }, RC_GREAT_BAY_TEMPLE_BOSS_POT_03 }, + { { SCENE_SEA_BS, 0, 1 }, RC_GREAT_BAY_TEMPLE_BOSS_POT_04 }, + { { SCENE_SEA_BS, 0, 5 }, RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_01 }, + { { SCENE_SEA_BS, 0, 8 }, RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_02 }, + { { SCENE_SEA_BS, 0, 7 }, RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_03 }, + { { SCENE_SEA_BS, 0, 6 }, RC_GREAT_BAY_TEMPLE_BOSS_UNDERWATER_POT_04 }, // Great Bay Temple // - { SCENE_SEA, - { - { { -1905.0f, -1200.0f }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_03 }, - { { -1755.0f, -1200.0f }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_06 }, - { { -1755.0f, -1680.0f }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_07 }, - { { -1755.0f, -1725.0f }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_08 }, - { { -1755.0f, -1770.0f }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_09 }, - { { -1905.0f, -1680.0f }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_10 }, - { { -1905.0f, -1725.0f }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_11 }, - { { -1905.0f, -1770.0f }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_12 }, - { { 600.0f, -30.0f }, RC_GREAT_BAY_TEMPLE_CENTRAL_ROOM_POT_01 }, - { { 600.0f, 30.0f }, RC_GREAT_BAY_TEMPLE_CENTRAL_ROOM_POT_02 }, - { { 1265.0f, -785.0f }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_01 }, - { { 1235.0f, -815.0f }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_02 }, - { { 1575.0f, -1155.0f }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_03 }, - { { 1605.0f, -1125.0f }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_04 }, - { { 1170.0f, -1078.0f }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_01 }, - { { 1310.0f, -1078.0f }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_02 }, - { { 1310.0f, -1218.0f }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_03 }, - { { 540.0f, -930.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_POT_01 }, - { { -540.0f, -930.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_POT_02 }, - { { -540.0f, -2070.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_POT_03 }, - { { 540.0f, -2070.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_POT_04 }, - { { -479.0f, 2141.0f }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_01 }, - { { -524.0f, 2141.0f }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_02 }, - { { -391.0f, 1959.0f }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_03 }, - { { -436.0f, 1959.0f }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_04 }, - { { -391.0f, 1810.0f }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_05 }, - { { -436.0f, 1810.0f }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_06 }, - { { -524.0f, 1628.0f }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_07 }, - { { -479.0f, 1628.0f }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_08 }, - { { 2970.0f, 1020.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_UPPER_POT_01 }, - { { 2970.0f, 960.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_UPPER_POT_02 }, - { { 1500.0f, 540.0f }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_SURFACE_POT_01 }, - { { 1590.0f, 540.0f }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_SURFACE_POT_02 }, - { { 1712.0f, 1215.0f }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_SURFACE_POT_03 }, - { { 1500.0f, 1030.0f }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_03 }, - { { 1590.0f, 1250.0f }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_04 }, - { { 1635.0f, 1620.0f }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_05 }, - { { 1470.0f, 1665.0f }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_07 }, - { { 1455.0f, 1620.0f }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_08 }, - { { 2835.0f, -555.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_01 }, - { { 2835.0f, -495.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_02 }, - { { 2745.0f, -495.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_03 }, - { { 2745.0f, -555.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_04 }, - { { 2730.0f, -975.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_05 }, - { { 2775.0f, -975.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_06 }, - { { 3555.0f, -720.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_07 }, - { { 3555.0f, -675.0f }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_08 }, - { { -1530.0f, 60.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_01 }, - { { -1560.0f, 30.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_02 }, - { { -2130.0f, 60.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_03 }, - { { -2100.0f, 30.0f }, RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_04 }, - { { -2250.0f, -1890.0f }, RC_GREAT_BAY_TEMPLE_WART_POT_01 }, - { { -2280.0f, -1920.0f }, RC_GREAT_BAY_TEMPLE_WART_POT_02 }, - { { -2280.0f, -2760.0f }, RC_GREAT_BAY_TEMPLE_WART_POT_03 }, - { { -2250.0f, -2790.0f }, RC_GREAT_BAY_TEMPLE_WART_POT_04 }, - { { -1410.0f, -2790.0f }, RC_GREAT_BAY_TEMPLE_WART_POT_05 }, - { { -1380.0f, -2760.0f }, RC_GREAT_BAY_TEMPLE_WART_POT_06 }, - { { -1380.0f, -1920.0f }, RC_GREAT_BAY_TEMPLE_WART_POT_07 }, - { { -1410.0f, -1890.0f }, RC_GREAT_BAY_TEMPLE_WART_POT_08 }, - } }, + { { SCENE_SEA, 14, 3 }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_03 }, + { { SCENE_SEA, 14, 5 }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_06 }, + { { SCENE_SEA, 14, 4 }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_07 }, + { { SCENE_SEA, 14, 10 }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_08 }, + { { SCENE_SEA, 14, 9 }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_09 }, + { { SCENE_SEA, 14, 2 }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_10 }, + { { SCENE_SEA, 14, 8 }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_11 }, + { { SCENE_SEA, 14, 7 }, RC_GREAT_BAY_TEMPLE_BEFORE_WART_POT_12 }, + { { SCENE_SEA, 0, 16 }, RC_GREAT_BAY_TEMPLE_CENTRAL_ROOM_POT_01 }, + { { SCENE_SEA, 0, 17 }, RC_GREAT_BAY_TEMPLE_CENTRAL_ROOM_POT_02 }, + { { SCENE_SEA, 4, 9 }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_01 }, + { { SCENE_SEA, 4, 20 }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_02 }, + { { SCENE_SEA, 4, 10 }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_03 }, + { { SCENE_SEA, 4, 21 }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_SURFACE_POT_04 }, + { { SCENE_SEA, 4, 11 }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_01 }, + { { SCENE_SEA, 4, 13 }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_02 }, + { { SCENE_SEA, 4, 12 }, RC_GREAT_BAY_TEMPLE_COMPASS_ROOM_WATER_POT_03 }, + { { SCENE_SEA, 12, 9 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_POT_01 }, + { { SCENE_SEA, 12, 7 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_POT_02 }, + { { SCENE_SEA, 12, 6 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_POT_03 }, + { { SCENE_SEA, 12, 8 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_1_POT_04 }, + { { SCENE_SEA, 11, 5 }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_01 }, + { { SCENE_SEA, 11, 3 }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_02 }, + { { SCENE_SEA, 11, 15 }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_03 }, + { { SCENE_SEA, 11, 1 }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_04 }, + { { SCENE_SEA, 11, 14 }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_05 }, + { { SCENE_SEA, 11, 0 }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_06 }, + { { SCENE_SEA, 11, 2 }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_07 }, + { { SCENE_SEA, 11, 4 }, RC_GREAT_BAY_TEMPLE_PRE_BOSS_POT_08 }, + { { SCENE_SEA, 10, 5 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_UPPER_POT_01 }, + { { SCENE_SEA, 10, 4 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_3_UPPER_POT_02 }, + { { SCENE_SEA, 1, 3 }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_SURFACE_POT_01 }, + { { SCENE_SEA, 1, 4 }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_SURFACE_POT_02 }, + { { SCENE_SEA, 1, 16 }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_SURFACE_POT_03 }, + { { SCENE_SEA, 1, 5 }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_03 }, + { { SCENE_SEA, 1, 6 }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_04 }, + { { SCENE_SEA, 1, 11 }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_05 }, + { { SCENE_SEA, 1, 13 }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_07 }, + { { SCENE_SEA, 1, 10 }, RC_GREAT_BAY_TEMPLE_MAP_ROOM_WATER_POT_08 }, + { { SCENE_SEA, 9, 24 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_01 }, + { { SCENE_SEA, 9, 25 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_02 }, + { { SCENE_SEA, 9, 23 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_03 }, + { { SCENE_SEA, 9, 22 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_04 }, + { { SCENE_SEA, 9, 26 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_05 }, + { { SCENE_SEA, 9, 27 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_06 }, + { { SCENE_SEA, 9, 20 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_07 }, + { { SCENE_SEA, 9, 21 }, RC_GREAT_BAY_TEMPLE_GREEN_PIPE_2_POT_08 }, + { { SCENE_SEA, 6, 11 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_01 }, + { { SCENE_SEA, 6, 10 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_02 }, + { { SCENE_SEA, 6, 8 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_03 }, + { { SCENE_SEA, 6, 9 }, RC_GREAT_BAY_TEMPLE_RED_PIPE_BEFORE_WART_POT_04 }, + { { SCENE_SEA, 7, 2 }, RC_GREAT_BAY_TEMPLE_WART_POT_01 }, + { { SCENE_SEA, 7, 0 }, RC_GREAT_BAY_TEMPLE_WART_POT_02 }, + { { SCENE_SEA, 7, 6 }, RC_GREAT_BAY_TEMPLE_WART_POT_03 }, + { { SCENE_SEA, 7, 1 }, RC_GREAT_BAY_TEMPLE_WART_POT_04 }, + { { SCENE_SEA, 7, 7 }, RC_GREAT_BAY_TEMPLE_WART_POT_05 }, + { { SCENE_SEA, 7, 4 }, RC_GREAT_BAY_TEMPLE_WART_POT_06 }, + { { SCENE_SEA, 7, 5 }, RC_GREAT_BAY_TEMPLE_WART_POT_07 }, + { { SCENE_SEA, 7, 3 }, RC_GREAT_BAY_TEMPLE_WART_POT_08 }, // Stone Tower Temple // - { SCENE_INISIE_N, - { - { { -30.0f, -1995.0f }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_01 }, - { { -30.0f, -1965.0f }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_02 }, - { { -30.0f, -1935.0f }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_03 }, - { { -30.0f, -1905.0f }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_04 }, - { { 30.0f, -1995.0f }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_05 }, - { { 30.0f, -1965.0f }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_06 }, - { { 30.0f, -1935.0f }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_07 }, - { { 30.0f, -1905.0f }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_08 }, - { { 45.0f, -690.0f }, RC_STONE_TOWER_TEMPLE_ENTRANCE_POT_01 }, - { { -45.0f, -690.0f }, RC_STONE_TOWER_TEMPLE_ENTRANCE_POT_02 }, - { { -1275.0f, -1395.0f }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_POT_01 }, - { { -1275.0f, -1305.0f }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_POT_02 }, - { { -1425.0f, -1395.0f }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_POT_03 }, - { { -1425.0f, -1305.0f }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_POT_04 }, - { { -1275.0f, -705.0f }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_AFTER_BLOCK_POT_01 }, - { { -1275.0f, -615.0f }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_AFTER_BLOCK_POT_02 }, - { { -1425.0f, -705.0f }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_AFTER_BLOCK_POT_03 }, - { { -1425.0f, -615.0f }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_AFTER_BLOCK_POT_04 }, - { { 1350.0f, -1770.0f }, RC_STONE_TOWER_TEMPLE_MIRROR_ROOM_POT_01 }, - { { 1230.0f, -1770.0f }, RC_STONE_TOWER_TEMPLE_MIRROR_ROOM_POT_02 }, - { { 810.0f, -1260.0f }, RC_STONE_TOWER_TEMPLE_WATER_ROOM_UNDERWATER_LOWER_POT_01 }, - { { 750.0f, -1260.0f }, RC_STONE_TOWER_TEMPLE_WATER_ROOM_UNDERWATER_LOWER_POT_02 }, - { { 810.0f, -1320.0f }, RC_STONE_TOWER_TEMPLE_WATER_ROOM_UNDERWATER_LOWER_POT_03 }, - { { 1800.0f, -900.0f }, RC_STONE_TOWER_TEMPLE_WATER_ROOM_UNDERWATER_UPPER_POT_01 }, - { { 1800.0f, -840.0f }, RC_STONE_TOWER_TEMPLE_WATER_ROOM_UNDERWATER_UPPER_POT_02 }, - { { 615.0f, -3375.0f }, RC_STONE_TOWER_TEMPLE_WIND_ROOM_POT_01 }, - { { 585.0f, -3375.0f }, RC_STONE_TOWER_TEMPLE_WIND_ROOM_POT_02 }, - { { 615.0f, -3465.0f }, RC_STONE_TOWER_TEMPLE_WIND_ROOM_POT_03 }, - { { 585.0f, -3465.0f }, RC_STONE_TOWER_TEMPLE_WIND_ROOM_POT_04 }, - } }, + { { SCENE_INISIE_N, 8, 14 }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_01 }, + { { SCENE_INISIE_N, 8, 15 }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_02 }, + { { SCENE_INISIE_N, 8, 18 }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_03 }, + { { SCENE_INISIE_N, 8, 21 }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_04 }, + { { SCENE_INISIE_N, 8, 16 }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_05 }, + { { SCENE_INISIE_N, 8, 17 }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_06 }, + { { SCENE_INISIE_N, 8, 19 }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_07 }, + { { SCENE_INISIE_N, 8, 20 }, RC_STONE_TOWER_TEMPLE_SPIKED_BAR_ROOM_POT_08 }, + { { SCENE_INISIE_N, 0, 7 }, RC_STONE_TOWER_TEMPLE_ENTRANCE_POT_01 }, + { { SCENE_INISIE_N, 0, 8 }, RC_STONE_TOWER_TEMPLE_ENTRANCE_POT_02 }, + { { SCENE_INISIE_N, 4, 15 }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_POT_01 }, + { { SCENE_INISIE_N, 4, 16 }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_POT_02 }, + { { SCENE_INISIE_N, 4, 13 }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_POT_03 }, + { { SCENE_INISIE_N, 4, 14 }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_POT_04 }, + { { SCENE_INISIE_N, 4, 17 }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_AFTER_BLOCK_POT_01 }, + { { SCENE_INISIE_N, 4, 12 }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_AFTER_BLOCK_POT_02 }, + { { SCENE_INISIE_N, 4, 18 }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_AFTER_BLOCK_POT_03 }, + { { SCENE_INISIE_N, 4, 11 }, RC_STONE_TOWER_TEMPLE_LAVA_ROOM_AFTER_BLOCK_POT_04 }, + { { SCENE_INISIE_N, 7, 6 }, RC_STONE_TOWER_TEMPLE_MIRROR_ROOM_POT_01 }, + { { SCENE_INISIE_N, 7, 5 }, RC_STONE_TOWER_TEMPLE_MIRROR_ROOM_POT_02 }, + { { SCENE_INISIE_N, 3, 12 }, RC_STONE_TOWER_TEMPLE_WATER_ROOM_UNDERWATER_LOWER_POT_01 }, + { { SCENE_INISIE_N, 3, 10 }, RC_STONE_TOWER_TEMPLE_WATER_ROOM_UNDERWATER_LOWER_POT_02 }, + { { SCENE_INISIE_N, 3, 11 }, RC_STONE_TOWER_TEMPLE_WATER_ROOM_UNDERWATER_LOWER_POT_03 }, + { { SCENE_INISIE_N, 3, 13 }, RC_STONE_TOWER_TEMPLE_WATER_ROOM_UNDERWATER_UPPER_POT_01 }, + { { SCENE_INISIE_N, 3, 14 }, RC_STONE_TOWER_TEMPLE_WATER_ROOM_UNDERWATER_UPPER_POT_02 }, + { { SCENE_INISIE_N, 9, 12 }, RC_STONE_TOWER_TEMPLE_WIND_ROOM_POT_01 }, + { { SCENE_INISIE_N, 9, 14 }, RC_STONE_TOWER_TEMPLE_WIND_ROOM_POT_02 }, + { { SCENE_INISIE_N, 9, 11 }, RC_STONE_TOWER_TEMPLE_WIND_ROOM_POT_03 }, + { { SCENE_INISIE_N, 9, 13 }, RC_STONE_TOWER_TEMPLE_WIND_ROOM_POT_04 }, // Stone Tower Temple - Inverted // - { SCENE_INISIE_R, - { - { { 2070.0f, -1620.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_01 }, - { { 2790.0f, -1620.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_02 }, - { { 2790.0f, -900.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_03 }, - { { 2070.0f, -900.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_04 }, - { { -735.0f, -1215.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_POE_MAZE_SIDE_POT_01 }, - { { -735.0f, -1305.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_POE_MAZE_SIDE_POT_02 }, - { { -1605.0f, -1395.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_POE_WIZZROBE_SIDE_POT_01 }, - { { -1605.0f, -1305.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_POE_WIZZROBE_SIDE_POT_02 }, - { { -30.0f, -1995.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_01 }, - { { -30.0f, -1965.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_02 }, - { { -30.0f, -1935.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_03 }, - { { -30.0f, -1905.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_04 }, - { { 30.0f, -1995.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_05 }, - { { 30.0f, -1965.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_06 }, - { { 30.0f, -1935.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_07 }, - { { 30.0f, -1905.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_08 }, - { { 1350.0f, -630.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_UPDRAFTS_BRIDGE_POT_01 }, - { { 1230.0f, -630.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_UPDRAFTS_BRIDGE_POT_02 }, - { { 735.0f, -1215.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_UPDRAFTS_LEDGE_POT_02 }, - { { 735.0f, -1305.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_UPDRAFTS_LEDGE_POT_03 }, - { { -1290.0f, -510.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_WIZZROBE_POT_01 }, - { { -1290.0f, -450.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_WIZZROBE_POT_02 }, - { { -1410.0f, -450.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_WIZZROBE_POT_03 }, - { { -1410.0f, -510.0f }, RC_STONE_TOWER_TEMPLE_INVERTED_WIZZROBE_POT_04 }, - } }, + { { SCENE_INISIE_R, 11, 4 }, RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_01 }, + { { SCENE_INISIE_R, 11, 1 }, RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_02 }, + { { SCENE_INISIE_R, 11, 2 }, RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_03 }, + { { SCENE_INISIE_R, 11, 3 }, RC_STONE_TOWER_TEMPLE_INVERTED_GOMESS_POT_04 }, + { { SCENE_INISIE_R, 2, 11 }, RC_STONE_TOWER_TEMPLE_INVERTED_POE_MAZE_SIDE_POT_01 }, + { { SCENE_INISIE_R, 2, 9 }, RC_STONE_TOWER_TEMPLE_INVERTED_POE_MAZE_SIDE_POT_02 }, + { { SCENE_INISIE_R, 2, 12 }, RC_STONE_TOWER_TEMPLE_INVERTED_POE_WIZZROBE_SIDE_POT_01 }, + { { SCENE_INISIE_R, 2, 10 }, RC_STONE_TOWER_TEMPLE_INVERTED_POE_WIZZROBE_SIDE_POT_02 }, + { { SCENE_INISIE_R, 8, 20 }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_01 }, + { { SCENE_INISIE_R, 8, 18 }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_02 }, + { { SCENE_INISIE_R, 8, 22 }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_03 }, + { { SCENE_INISIE_R, 8, 24 }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_04 }, + { { SCENE_INISIE_R, 8, 21 }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_05 }, + { { SCENE_INISIE_R, 8, 19 }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_06 }, + { { SCENE_INISIE_R, 8, 23 }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_07 }, + { { SCENE_INISIE_R, 8, 25 }, RC_STONE_TOWER_TEMPLE_INVERTED_PRE_BOSS_POT_08 }, + { { SCENE_INISIE_R, 3, 17 }, RC_STONE_TOWER_TEMPLE_INVERTED_UPDRAFTS_BRIDGE_POT_01 }, + { { SCENE_INISIE_R, 3, 16 }, RC_STONE_TOWER_TEMPLE_INVERTED_UPDRAFTS_BRIDGE_POT_02 }, + { { SCENE_INISIE_R, 3, 26 }, RC_STONE_TOWER_TEMPLE_INVERTED_UPDRAFTS_LEDGE_POT_02 }, + { { SCENE_INISIE_R, 3, 23 }, RC_STONE_TOWER_TEMPLE_INVERTED_UPDRAFTS_LEDGE_POT_03 }, + { { SCENE_INISIE_R, 4, 8 }, RC_STONE_TOWER_TEMPLE_INVERTED_WIZZROBE_POT_01 }, + { { SCENE_INISIE_R, 4, 13 }, RC_STONE_TOWER_TEMPLE_INVERTED_WIZZROBE_POT_02 }, + { { SCENE_INISIE_R, 4, 12 }, RC_STONE_TOWER_TEMPLE_INVERTED_WIZZROBE_POT_03 }, + { { SCENE_INISIE_R, 4, 9 }, RC_STONE_TOWER_TEMPLE_INVERTED_WIZZROBE_POT_04 }, }; -#define OBJTSUBO_RC (actor->home.rot.x) - -RandoCheckId IdentifyPot(Actor* actor) { +// Identify the pot based on either the collectible flag if it exists or the scene Id, room, and actor list index +void IdentifyPot(Actor* actor, bool* should) { + RandoCheckId randoCheckId = RC_UNKNOWN; + s16 actorListIndex = GetActorListIndex(actor); auto randoStaticCheck = Rando::StaticData::GetCheckFromFlag(FLAG_CYCL_SCENE_COLLECTIBLE, OBJ_TSUBO_PFE00(actor), gPlayState->sceneId); if (randoStaticCheck.randoCheckId != RC_UNKNOWN && randoStaticCheck.randoCheckType == RCTYPE_POT) { - return randoStaticCheck.randoCheckId; + // Pots using collectible flags + randoCheckId = randoStaticCheck.randoCheckId; + } else { + auto it = potMap.find({ gPlayState->sceneId, gPlayState->roomCtx.curRoom.num, actorListIndex }); + if (it != potMap.end()) { + randoCheckId = it->second; + } } - RandoCheckId randoCheckId = RC_UNKNOWN; - auto it = potMap.find((SceneId)gPlayState->sceneId); - if (it == potMap.end()) { - return randoCheckId; + if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { + return; } - auto innerIt = it->second.find({ actor->home.pos.x, actor->home.pos.z }); - if (innerIt == it->second.end()) { - return randoCheckId; - } - return innerIt->second; + Rando::ActorBehavior::SetObjectRandoCheckId(actor, randoCheckId); } void ObjTsubo_RandoDraw(Actor* actor, PlayState* play) { @@ -388,7 +339,8 @@ void ObjTsubo_RandoDraw(Actor* actor, PlayState* play) { return; } - RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[OBJTSUBO_RC].randoItemId, (RandoCheckId)OBJTSUBO_RC); + RandoCheckId randoCheckId = Rando::ActorBehavior::GetObjectRandoCheckId(actor); + RandoItemId randoItemId = Rando::ConvertItem(RANDO_SAVE_CHECKS[randoCheckId].randoItemId, randoCheckId); RandoItemType randoItemType = Rando::StaticData::Items[randoItemId].randoItemType; switch (randoItemType) { @@ -423,22 +375,12 @@ void ObjTsubo_RandoDraw(Actor* actor, PlayState* play) { } void Rando::ActorBehavior::InitObjTsuboBehavior() { - COND_ID_HOOK(OnActorInit, ACTOR_OBJ_TSUBO, IS_RANDO, [](Actor* actor) { - RandoCheckId randoCheckId = IdentifyPot(actor); - if (randoCheckId == RC_UNKNOWN) { - return; - } - - if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { - return; - } - - OBJTSUBO_RC = randoCheckId; - }); + COND_ID_HOOK(ShouldActorInit, ACTOR_OBJ_TSUBO, IS_RANDO, IdentifyPot); COND_VB_SHOULD(VB_POT_DRAW_BE_OVERRIDDEN, IS_RANDO, { Actor* actor = va_arg(args, Actor*); - if (OBJTSUBO_RC != RC_UNKNOWN) { + RandoCheckId randoCheckId = Rando::ActorBehavior::GetObjectRandoCheckId(actor); + if (randoCheckId != RC_UNKNOWN) { *should = false; actor->draw = ObjTsubo_RandoDraw; } @@ -446,7 +388,7 @@ void Rando::ActorBehavior::InitObjTsuboBehavior() { COND_VB_SHOULD(VB_POT_DROP_COLLECTIBLE, IS_RANDO, { Actor* actor = va_arg(args, Actor*); - RandoCheckId randoCheckId = (RandoCheckId)OBJTSUBO_RC; + RandoCheckId randoCheckId = Rando::ActorBehavior::GetObjectRandoCheckId(actor); if (randoCheckId == RC_UNKNOWN) { return; } @@ -469,7 +411,7 @@ void Rando::ActorBehavior::InitObjTsuboBehavior() { *should = false; // Clear the stored Check ID for pots that are on a timed respawn - OBJTSUBO_RC = RC_UNKNOWN; + Rando::ActorBehavior::SetObjectRandoCheckId(actor, RC_UNKNOWN); actor->draw = ObjTsubo_Draw; }); } diff --git a/mm/2s2h/Rando/Logic/Regions/South.cpp b/mm/2s2h/Rando/Logic/Regions/South.cpp index c72cff0dc..08610e059 100644 --- a/mm/2s2h/Rando/Logic/Regions/South.cpp +++ b/mm/2s2h/Rando/Logic/Regions/South.cpp @@ -514,6 +514,8 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_WOODS_OF_MYSTERY_GRASS_19, true), CHECK(RC_WOODS_OF_MYSTERY_GRASS_20, true), CHECK(RC_WOODS_OF_MYSTERY_GRASS_21, true), + CHECK(RC_WOODS_OF_MYSTERY_GRASS_22, true), + CHECK(RC_WOODS_OF_MYSTERY_GRASS_23, true), }, .exits = { // TO FROM EXIT(ENTRANCE(SOUTHERN_SWAMP_POISONED, 7), ENTRANCE(WOODS_OF_MYSTERY, 0), true), diff --git a/mm/2s2h/Rando/StaticData/Checks.cpp b/mm/2s2h/Rando/StaticData/Checks.cpp index 7c713ce61..8ed159f45 100644 --- a/mm/2s2h/Rando/StaticData/Checks.cpp +++ b/mm/2s2h/Rando/StaticData/Checks.cpp @@ -2195,6 +2195,8 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = { RC(RC_WOODS_OF_MYSTERY_GRASS_19, RCTYPE_GRASS, SCENE_26SARUNOMORI, FLAG_NONE, 0x0, RI_JUNK), RC(RC_WOODS_OF_MYSTERY_GRASS_20, RCTYPE_GRASS, SCENE_26SARUNOMORI, FLAG_NONE, 0x0, RI_JUNK), RC(RC_WOODS_OF_MYSTERY_GRASS_21, RCTYPE_GRASS, SCENE_26SARUNOMORI, FLAG_NONE, 0x0, RI_JUNK), + RC(RC_WOODS_OF_MYSTERY_GRASS_22, RCTYPE_GRASS, SCENE_26SARUNOMORI, FLAG_NONE, 0x0, RI_JUNK), + RC(RC_WOODS_OF_MYSTERY_GRASS_23, RCTYPE_GRASS, SCENE_26SARUNOMORI, FLAG_NONE, 0x0, RI_JUNK), RC(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_01, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK), RC(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_02, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK), RC(RC_WOODS_OF_MYSTERY_GROTTO_GRASS_03, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 297749727..f1836683e 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -2200,6 +2200,8 @@ typedef enum { RC_WOODS_OF_MYSTERY_GRASS_19, RC_WOODS_OF_MYSTERY_GRASS_20, RC_WOODS_OF_MYSTERY_GRASS_21, + RC_WOODS_OF_MYSTERY_GRASS_22, + RC_WOODS_OF_MYSTERY_GRASS_23, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_01, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_02, RC_WOODS_OF_MYSTERY_GROTTO_GRASS_03, diff --git a/mm/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c b/mm/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c index cda32e6b2..2caef7b0c 100644 --- a/mm/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c +++ b/mm/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c @@ -7,6 +7,7 @@ #include "z_obj_mure2.h" #include "2s2h/ShipUtils.h" +#include "GameInteractor/GameInteractor.h" #define FLAGS 0x00000000 @@ -142,7 +143,7 @@ void ObjMure2_SpawnChildren(ObjMure2* this, PlayState* play) { this->actors[i] = Actor_SpawnAsChildAndCutscene( &play->actorCtx, play, sActorIds[childType], pos->x, pos->y, pos->z, this->actor.world.rot.x, 0, this->actor.world.rot.z, childParams, this->actor.csId, this->actor.halfDaysBits, NULL); - if (this->actors[i] != NULL) { + if (GameInteractor_Should(VB_OBJ_MURE2_SET_CHILD_ROOM, this->actors[i] != NULL, this, i)) { this->actors[i]->room = this->actor.room; } } diff --git a/mm/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c b/mm/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c index 6a974685c..540ff63c4 100644 --- a/mm/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c +++ b/mm/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c @@ -5,6 +5,7 @@ */ #include "z_obj_mure3.h" +#include "GameInteractor/GameInteractor.h" #define FLAGS 0x00000000 @@ -84,7 +85,7 @@ void func_8098F220(ObjMure3* this, PlayState* play) { yRot = this->actor.world.rot.y; for (i = 0; i < 6; i++) { - if (!((this->unk164 >> i) & 1)) { + if (GameInteractor_Should(VB_OBJ_MURE3_DROP_COLLECTIBLE, !((this->unk164 >> i) & 1), this, i)) { spawnPos.x = (Math_SinS(yRot) * 40.0f) + this->actor.world.pos.x; spawnPos.z = (Math_CosS(yRot) * 40.0f) + this->actor.world.pos.z; this->unk148[i] = (EnItem00*)Item_DropCollectible2(play, &spawnPos, 0x4000); @@ -95,7 +96,7 @@ void func_8098F220(ObjMure3* this, PlayState* play) { yRot += 0x2AAA; } - if (!((this->unk164 >> 6) & 1)) { + if (GameInteractor_Should(VB_OBJ_MURE3_DROP_COLLECTIBLE, !((this->unk164 >> 6) & 1), this, 6)) { spawnPos.x = this->actor.world.pos.x; spawnPos.z = this->actor.world.pos.z; this->unk160 = Item_DropCollectible2(play, &spawnPos, 0x4002); |
