diff options
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h | 16 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp | 1 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ActorBehavior.h | 1 | ||||
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/ObjComb.cpp | 132 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/GeneratePools.cpp | 5 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/North.cpp | 1 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp | 1 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/South.cpp | 1 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp | 9 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/TerminaField.cpp | 4 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/West.cpp | 1 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp | 2 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Menu.cpp | 4 | ||||
| -rw-r--r-- | mm/2s2h/Rando/StaticData/Checks.cpp | 19 | ||||
| -rw-r--r-- | mm/2s2h/Rando/StaticData/Options.cpp | 1 | ||||
| -rw-r--r-- | mm/2s2h/Rando/Types.h | 21 | ||||
| -rw-r--r-- | mm/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c | 19 |
17 files changed, 229 insertions, 9 deletions
diff --git a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h index cafdb1f59..143c1d1a2 100644 --- a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h +++ b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h @@ -122,6 +122,22 @@ typedef enum { // #### `result` // ```c + // true + // ``` + // #### `args` + // - `*Actor` (ObjComb) + VB_BEEHIVE_ALREADY_BROKEN, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` (ObjComb) + VB_BEEHIVE_SPAWN_ACTOR, + + // #### `result` + // ```c // false // ``` // #### `args` diff --git a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp index 1e511a467..1eaf0b927 100644 --- a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp +++ b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp @@ -121,6 +121,7 @@ void Rando::ActorBehavior::OnFileLoad() { Rando::ActorBehavior::InitEnZowBehavior(); Rando::ActorBehavior::InitItemBHeartBehavior(); Rando::ActorBehavior::InitItemGetBehavior(); + Rando::ActorBehavior::InitObjCombBehavior(); Rando::ActorBehavior::InitObjKibakoBehavior(); Rando::ActorBehavior::InitObjGrassBehavior(); Rando::ActorBehavior::InitObjMoonStoneBehavior(); diff --git a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h index 50624e553..0f9ca1d54 100644 --- a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h +++ b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h @@ -90,6 +90,7 @@ void InitEnZotBehavior(); void InitEnZowBehavior(); void InitItemBHeartBehavior(); void InitItemGetBehavior(); +void InitObjCombBehavior(); void InitObjKibakoBehavior(); void InitObjGrassBehavior(); void InitObjMoonStoneBehavior(); diff --git a/mm/2s2h/Rando/ActorBehavior/ObjComb.cpp b/mm/2s2h/Rando/ActorBehavior/ObjComb.cpp new file mode 100644 index 000000000..f41c94f0f --- /dev/null +++ b/mm/2s2h/Rando/ActorBehavior/ObjComb.cpp @@ -0,0 +1,132 @@ +#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_Comb/z_obj_comb.h" +} + +std::map<std::tuple<s16, s16, s16>, RandoCheckId> combMap = { + // Termina Field + { { SCENE_KAKUSIANA, 0, 0 }, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_BEEHIVE }, + { { SCENE_KAKUSIANA, 10, 2 }, RC_GREAT_BAY_COAST_COW_GROTTO_BEEHIVE }, + { { SCENE_KAKUSIANA, 11, 10 }, RC_TERMINA_FIELD_BIO_BABA_GROTTO_BEEHIVE_02 }, + + // Mountain Village + { { SCENE_10YUKIYAMANOMURA2, 0, 36 }, RC_MOUNTAIN_VILLAGE_SPRING_BEEHIVE }, + { { SCENE_10YUKIYAMANOMURA2, 0, 42 }, RC_MOUNTAIN_VILLAGE_SPRING_BEEHIVE }, + + // Woodfall Temple + { { SCENE_MITURIN, 3, 17 }, RC_WOODFALL_TEMPLE_MAZE_ROOM_BEEHIVE }, + + // Pirates' Fortress + { { SCENE_PIRATE, 3, 10 }, RC_PIRATE_FORTRESS_CAPTAIN_ROOM_UPPER_BEEHIVE }, + + // Swamp Spider House + { { SCENE_KINSTA1, 2, 9 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_01 }, + { { SCENE_KINSTA1, 2, 10 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_02 }, + { { SCENE_KINSTA1, 2, 11 }, RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_03 }, + { { SCENE_KINSTA1, 4, 7 }, RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_01 }, + { { SCENE_KINSTA1, 4, 8 }, RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_02 }, + { { SCENE_KINSTA1, 4, 11 }, RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_03 }, + { { SCENE_KINSTA1, 5, 6 }, RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_01 }, + { { SCENE_KINSTA1, 5, 7 }, RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_02 }, + { { SCENE_KINSTA1, 5, 9 }, RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_03 }, +}; + +static void SpawnBeehiveItem(Actor* actor, RandoCheckId randoCheckId) { + CustomItem::Spawn( + actor->world.pos.x, actor->world.pos.y, actor->world.pos.z, 0, + 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) { + case FLAG_NONE: + if (RANDO_SAVE_CHECKS[CUSTOM_ITEM_PARAM].shuffled) { + RANDO_SAVE_CHECKS[CUSTOM_ITEM_PARAM].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), + (RandoCheckId)CUSTOM_ITEM_PARAM, actor); + }); +} + +void Rando::ActorBehavior::InitObjCombBehavior() { + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_COMB, IS_RANDO, [](Actor* actor) { + RandoCheckId randoCheckId = RC_UNKNOWN; + + s16 actorListIndex = GetActorListIndex(actor); + auto it = combMap.find({ gPlayState->sceneId, gPlayState->roomCtx.curRoom.num, actorListIndex }); + if (it != combMap.end()) { + randoCheckId = it->second; + + // Room 10 is reused for both the Great Bay Coast and Termina Field cow grottos (same room, same + // actor list); disambiguate with respawn data the same way EnCow.cpp/ObjGrass.cpp do. + if (randoCheckId == RC_GREAT_BAY_COAST_COW_GROTTO_BEEHIVE && + gSaveContext.respawn[RESPAWN_MODE_UNK_3].data == 31) { + randoCheckId = RC_TERMINA_FIELD_COW_GROTTO_BEEHIVE; + } + } + + if (!RANDO_SAVE_CHECKS[randoCheckId].shuffled || RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { + return; + } + + Rando::ActorBehavior::SetObjectRandoCheckId(actor, randoCheckId); + }); + + COND_VB_SHOULD(VB_BEEHIVE_SPAWN_ACTOR, IS_RANDO, { + Actor* actor = va_arg(args, Actor*); + RandoCheckId randoCheckId = GetObjectRandoCheckId(actor); + + if (randoCheckId == RC_UNKNOWN) { + return; + } + + SpawnBeehiveItem(actor, randoCheckId); + }); + + // The Pirates' Fortress hive permanently Actor_Kill themselves on init once their + // one-time vanilla event has already fired, and never spawn again afterward. If that happens before the + // shuffled item was actually collected, it would be lost for the rest of the file. Spawn it here instead, + // right at the hive's last position + COND_VB_SHOULD(VB_BEEHIVE_ALREADY_BROKEN, IS_RANDO, { + if (!(*should)) { + return; + } + + Actor* actor = va_arg(args, Actor*); + RandoCheckId randoCheckId = RC_UNKNOWN; + + s16 actorListIndex = GetActorListIndex(actor); + auto it = combMap.find({ gPlayState->sceneId, gPlayState->roomCtx.curRoom.num, actorListIndex }); + if (it != combMap.end()) { + randoCheckId = it->second; + + if (randoCheckId == RC_GREAT_BAY_COAST_COW_GROTTO_BEEHIVE && + gSaveContext.respawn[RESPAWN_MODE_UNK_3].data == 31) { + randoCheckId = RC_TERMINA_FIELD_COW_GROTTO_BEEHIVE; + } + } + + if (randoCheckId == RC_UNKNOWN || !RANDO_SAVE_CHECKS[randoCheckId].shuffled || + RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) { + return; + } + + SpawnBeehiveItem(actor, randoCheckId); + }); +} diff --git a/mm/2s2h/Rando/Logic/GeneratePools.cpp b/mm/2s2h/Rando/Logic/GeneratePools.cpp index 486e0bb80..ccc38b24d 100644 --- a/mm/2s2h/Rando/Logic/GeneratePools.cpp +++ b/mm/2s2h/Rando/Logic/GeneratePools.cpp @@ -75,6 +75,11 @@ void GeneratePools(RandoSaveInfo& saveInfo, std::vector<RandoCheckId>& checkPool continue; } + if (randoStaticCheck.randoCheckType == RCTYPE_BEEHIVE && + saveInfo.randoSaveOptions[RO_SHUFFLE_HIVE_DROPS] == RO_GENERIC_NO) { + continue; + } + if (randoStaticCheck.randoCheckType == RCTYPE_TREE && saveInfo.randoSaveOptions[RO_SHUFFLE_TREE_DROPS] == RO_GENERIC_NO) { continue; diff --git a/mm/2s2h/Rando/Logic/Regions/North.cpp b/mm/2s2h/Rando/Logic/Regions/North.cpp index b5a231200..aa827aa76 100644 --- a/mm/2s2h/Rando/Logic/Regions/North.cpp +++ b/mm/2s2h/Rando/Logic/Regions/North.cpp @@ -232,6 +232,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_MOUNTAIN_VILLAGE_WATERFALL_CHEST, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE] && HAS_ITEM(ITEM_LENS_OF_TRUTH) && HAS_MAGIC), CHECK(RC_MOUNTAIN_VILLAGE_WINTER_POT, CAN_HOOK_SCARECROW), CHECK(RC_MOUNTAIN_VILLAGE_SPRING_POT, CAN_HOOK_SCARECROW && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), + CHECK(RC_MOUNTAIN_VILLAGE_SPRING_BEEHIVE, CAN_USE_PROJECTILE && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), CHECK(RC_MOUNTAIN_VILLAGE_SPRING_FREESTANDING_RUPEE_01, CAN_BE_GORON && RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_01, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), CHECK(RC_MOUNTAIN_VILLAGE_SPRING_GRASS_02, RANDO_EVENTS[RE_CLEARED_SNOWHEAD_TEMPLE]), diff --git a/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp b/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp index 866f96a35..f82ca9c75 100644 --- a/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp +++ b/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp @@ -12,6 +12,7 @@ static RegisterShipInitFunc initFunc([]() { .checks = { CHECK(RC_PIRATE_FORTRESS_INTERIOR_BEEHIVE_POT_01, true), CHECK(RC_PIRATE_FORTRESS_INTERIOR_BEEHIVE_POT_02, true), + CHECK(RC_PIRATE_FORTRESS_CAPTAIN_ROOM_UPPER_BEEHIVE, CAN_USE_PROJECTILE), }, .exits = { // TO FROM EXIT(ENTRANCE(PIRATES_FORTRESS, 2), ENTRANCE(PIRATES_FORTRESS_INTERIOR, 1), true), diff --git a/mm/2s2h/Rando/Logic/Regions/South.cpp b/mm/2s2h/Rando/Logic/Regions/South.cpp index b22fcd7bf..7bca9c8b8 100644 --- a/mm/2s2h/Rando/Logic/Regions/South.cpp +++ b/mm/2s2h/Rando/Logic/Regions/South.cpp @@ -355,6 +355,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_10, true), CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_11, true), CHECK(RC_SOUTHERN_SWAMP_POISON_GRASS_12, true), + CHECK(RC_SOUTHERN_SWAMP_POISON_BEEHIVE, CAN_USE_PROJECTILE && CAN_TRAVERSE_WAIST_DEEP_WATER), CHECK(RC_ENEMY_DROP_MINI_BABA, CanKillEnemy(ACTOR_EN_KAREBABA)), }, .exits = { // TO FROM diff --git a/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp b/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp index cd603cd3e..ab42d3597 100644 --- a/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp +++ b/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp @@ -116,6 +116,9 @@ static RegisterShipInitFunc initFunc([]() { .checks = { CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_HIVE_01, CanKillEnemy(ACTOR_EN_SW) && CAN_USE_PROJECTILE), CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_HIVE_02, CanKillEnemy(ACTOR_EN_SW) && CAN_USE_PROJECTILE), + CHECK(RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_01, CAN_USE_PROJECTILE), + CHECK(RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_02, CAN_USE_PROJECTILE), + CHECK(RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_03, CAN_USE_PROJECTILE), CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_JAR, CanKillEnemy(ACTOR_EN_SW)), CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_POT_01, CanKillEnemy(ACTOR_EN_SW)), CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_POT_02, CanKillEnemy(ACTOR_EN_SW)), @@ -201,6 +204,9 @@ static RegisterShipInitFunc initFunc([]() { Regions[RR_SWAMP_SPIDER_HOUSE_GOLD_ROOM_LOWER] = RandoRegion{ .name = "Lower Gold Room", .sceneId = SCENE_KINSTA1, .checks = { CHECK(RC_SWAMP_SKULLTULA_GOLD_ROOM_HIVE, CanKillEnemy(ACTOR_EN_SW) && CAN_USE_PROJECTILE), + CHECK(RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_01, CAN_USE_PROJECTILE), + CHECK(RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_02, CAN_USE_PROJECTILE), + CHECK(RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_03, CAN_USE_PROJECTILE), CHECK(RC_SWAMP_SKULLTULA_GOLD_ROOM_PILLAR, CanKillEnemy(ACTOR_EN_SW)), CHECK(RC_SWAMP_SKULLTULA_GOLD_ROOM_WALL, CanKillEnemy(ACTOR_EN_SW) && ((RANDO_EVENTS[RE_SWAMP_SPIDER_HOUSE_GOLD_ROOM_LADDER] && CAN_USE_PROJECTILE || HAS_ITEM(ITEM_BOMBCHU)) || (HAS_ITEM(ITEM_HOOKSHOT) || CAN_BE_ZORA))), CHECK(RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_LOWER_POT_01, true), @@ -256,6 +262,9 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_SWAMP_SKULLTULA_TREE_ROOM_GRASS_01, CanKillEnemy(ACTOR_EN_SW)), CHECK(RC_SWAMP_SKULLTULA_TREE_ROOM_GRASS_02, CanKillEnemy(ACTOR_EN_SW)), CHECK(RC_SWAMP_SKULLTULA_TREE_ROOM_HIVE, CanKillEnemy(ACTOR_EN_SW) && CAN_USE_PROJECTILE), + CHECK(RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_01, CAN_USE_PROJECTILE), + CHECK(RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_02, CAN_USE_PROJECTILE), + CHECK(RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_03, CAN_USE_PROJECTILE), CHECK(RC_SWAMP_SKULLTULA_TREE_ROOM_TREE_01, CanKillEnemy(ACTOR_EN_SW)), CHECK(RC_SWAMP_SKULLTULA_TREE_ROOM_TREE_02, CanKillEnemy(ACTOR_EN_SW)), CHECK(RC_SWAMP_SKULLTULA_TREE_ROOM_TREE_03, CanKillEnemy(ACTOR_EN_SW)), diff --git a/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp b/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp index 62fadf8c7..79276189a 100644 --- a/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp +++ b/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp @@ -28,6 +28,8 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_TERMINA_FIELD_BIO_BABA_GROTTO, CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CHECK(RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_01, true), CHECK(RC_TERMINA_FIELD_BIO_BABA_GROTTO_GRASS_02, true), + CHECK(RC_TERMINA_FIELD_BIO_BABA_GROTTO_BEEHIVE_01, CAN_USE_PROJECTILE && CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), + CHECK(RC_TERMINA_FIELD_BIO_BABA_GROTTO_BEEHIVE_02, CAN_USE_PROJECTILE && CAN_BE_ZORA && CAN_USE_ABILITY(SWIM)), CHECK(RC_ENEMY_DROP_BIO_DEKU_BABA, CanKillEnemy(ACTOR_BOSS_05)), }, .exits = { // TO FROM @@ -111,6 +113,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_TERMINA_FIELD_COW_GROTTO_GRASS_71, true), CHECK(RC_TERMINA_FIELD_COW_GROTTO_GRASS_72, true), CHECK(RC_ENEMY_DROP_GIANT_BEE, CAN_USE_PROJECTILE && CanKillEnemy(ACTOR_EN_BEE)), // In a beehive + CHECK(RC_TERMINA_FIELD_COW_GROTTO_BEEHIVE, CAN_USE_PROJECTILE), }, .exits = { // TO FROM EXIT(ENTRANCE(TERMINA_FIELD, 0), ENTRANCE(GROTTOS, 17), true), @@ -154,6 +157,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_04, true), CHECK(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_05, true), CHECK(RC_ENEMY_DROP_GIANT_BEE, CAN_USE_PROJECTILE && CanKillEnemy(ACTOR_EN_BEE)), // In a beehive + CHECK(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_BEEHIVE, CAN_USE_PROJECTILE), }, .exits = { // TO FROM EXIT(ENTRANCE(TERMINA_FIELD, 0), ENTRANCE(GROTTOS, 0), true), diff --git a/mm/2s2h/Rando/Logic/Regions/West.cpp b/mm/2s2h/Rando/Logic/Regions/West.cpp index 893e8ed67..a2585095b 100644 --- a/mm/2s2h/Rando/Logic/Regions/West.cpp +++ b/mm/2s2h/Rando/Logic/Regions/West.cpp @@ -93,6 +93,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_71, true), CHECK(RC_GREAT_BAY_COAST_COW_GROTTO_GRASS_72, true), CHECK(RC_ENEMY_DROP_GIANT_BEE, CAN_USE_PROJECTILE && CanKillEnemy(ACTOR_EN_BEE)), // In a beehive + CHECK(RC_GREAT_BAY_COAST_COW_GROTTO_BEEHIVE, CAN_USE_PROJECTILE), }, .exits = { // TO FROM EXIT(ENTRANCE(GREAT_BAY_COAST, 0), ENTRANCE(GROTTOS, 27), true), diff --git a/mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp b/mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp index 87fc7b7ed..2b949fb61 100644 --- a/mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp +++ b/mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp @@ -82,6 +82,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_WOODFALL_TEMPLE_ENTRANCE_CHEST, CAN_BE_DEKU || HAS_ITEM(ITEM_HOOKSHOT)), CHECK(RC_WOODFALL_TEMPLE_SF_ENTRANCE, CAN_USE_PROJECTILE), CHECK(RC_WOODFALL_TEMPLE_ENTRANCE_POT, CAN_BE_DEKU), + CHECK(RC_WOODFALL_TEMPLE_ENTRANCE_BEEHIVE, CAN_USE_PROJECTILE), CHECK(RC_ENEMY_DROP_SKULLTULA, CanKillEnemy(ACTOR_EN_ST)), CHECK(RC_ENEMY_DROP_BOE, CanKillEnemy(ACTOR_EN_MKK)), }, @@ -145,6 +146,7 @@ static RegisterShipInitFunc initFunc([]() { CHECK(RC_WOODFALL_TEMPLE_MAZE_POT_02, true), // TODO: Trick for bombs & chus here - Doesn't need a trick. Bomb can break it from above CHECK(RC_WOODFALL_TEMPLE_SF_MAZE_BEEHIVE, CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE), + CHECK(RC_WOODFALL_TEMPLE_MAZE_ROOM_BEEHIVE, CAN_USE_PROJECTILE), // TODO: Maybe add a health check here later CHECK(RC_WOODFALL_TEMPLE_SF_MAZE_BUBBLE, true), CHECK(RC_WOODFALL_TEMPLE_SF_MAZE_SKULLTULA, CanKillEnemy(ACTOR_EN_ST)), diff --git a/mm/2s2h/Rando/Menu.cpp b/mm/2s2h/Rando/Menu.cpp index af0b08561..2b1df7727 100644 --- a/mm/2s2h/Rando/Menu.cpp +++ b/mm/2s2h/Rando/Menu.cpp @@ -261,6 +261,7 @@ static RegisterShipInitFunc refreshMetricsInit(RefreshMetrics, { "gRando.Options.RO_SHUFFLE_FROGS", "gRando.Options.RO_SHUFFLE_GOLD_SKULLTULAS", "gRando.Options.RO_SHUFFLE_GRASS_DROPS", + "gRando.Options.RO_SHUFFLE_HIVE_DROPS", "gRando.Options.RO_SHUFFLE_TRAPS", "gRando.Options.RO_SHUFFLE_OCARINA_BUTTONS", "gRando.Options.RO_SHUFFLE_OWL_STATUES", @@ -541,8 +542,7 @@ static void DrawShufflesTab() { CVarCheckbox("Shuffle Grass Drops", Rando::StaticData::Options[RO_SHUFFLE_GRASS_DROPS].cvar); CVarCheckbox("Shuffle Tree Drops", Rando::StaticData::Options[RO_SHUFFLE_TREE_DROPS].cvar); CVarCheckbox("Shuffle Frogs", Rando::StaticData::Options[RO_SHUFFLE_FROGS].cvar); - CVarCheckbox("Shuffle Hive Drops", "gPlaceholderBool", - CheckboxOptions({ { .disabled = true, .disabledTooltip = "Coming Soon" } })); + CVarCheckbox("Shuffle Hive Drops", Rando::StaticData::Options[RO_SHUFFLE_HIVE_DROPS].cvar); CVarCheckbox("Shuffle Freestanding Items", Rando::StaticData::Options[RO_SHUFFLE_FREESTANDING_ITEMS].cvar); CVarCheckbox("Shuffle Wonder Items", "gPlaceholderBool", CheckboxOptions({ { .disabled = true, .disabledTooltip = "Coming Soon" } })); diff --git a/mm/2s2h/Rando/StaticData/Checks.cpp b/mm/2s2h/Rando/StaticData/Checks.cpp index 101b5e9c4..526dbced4 100644 --- a/mm/2s2h/Rando/StaticData/Checks.cpp +++ b/mm/2s2h/Rando/StaticData/Checks.cpp @@ -99,6 +99,7 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = { RC(RC_GORON_VILLAGE_SCRUB_DEED, RCTYPE_NPC, SCENE_11GORONNOSATO, FLAG_WEEK_EVENT_REG, WEEKEVENTREG_61_80, RI_DEED_MOUNTAIN), RC(RC_GREAT_BAY_COAST_COW_BACK, RCTYPE_COW, SCENE_KAKUSIANA, FLAG_NONE, 0x16, RI_MILK_REFILL), RC(RC_GREAT_BAY_COAST_COW_FRONT, RCTYPE_COW, SCENE_KAKUSIANA, FLAG_NONE, 0x15, RI_MILK_REFILL), + RC(RC_GREAT_BAY_COAST_COW_GROTTO_BEEHIVE, RCTYPE_BEEHIVE, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_NONE), RC(RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_CHEST, RCTYPE_CHEST, SCENE_KAKUSIANA, FLAG_CYCL_SCENE_CHEST, 0x17, RI_RUPEE_RED), RC(RC_GREAT_BAY_COAST_FISHERMAN_MINIGAME, RCTYPE_MINIGAME, SCENE_30GYOSON, FLAG_WEEK_EVENT_REG, WEEKEVENTREG_RECEIVED_FISHERMANS_JUMPING_GAME_HEART_PIECE, RI_HEART_PIECE), RC(RC_GREAT_BAY_COAST_MARINE_LAB_FISH_PIECE_OF_HEART, RCTYPE_NPC, SCENE_LABO, FLAG_NONE, 0x00, RI_HEART_PIECE), @@ -352,11 +353,23 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = { RC(RC_SWAMP_SKULLTULA_TREE_ROOM_TREE_01, RCTYPE_SKULL_TOKEN, SCENE_KINSTA1, FLAG_CYCL_SCENE_CHEST, 0x15, RI_GS_TOKEN_SWAMP), RC(RC_SWAMP_SKULLTULA_TREE_ROOM_TREE_02, RCTYPE_SKULL_TOKEN, SCENE_KINSTA1, FLAG_CYCL_SCENE_CHEST, 0x18, RI_GS_TOKEN_SWAMP), RC(RC_SWAMP_SKULLTULA_TREE_ROOM_TREE_03, RCTYPE_SKULL_TOKEN, SCENE_KINSTA1, FLAG_CYCL_SCENE_CHEST, 0x1d, RI_GS_TOKEN_SWAMP), + RC(RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_01, RCTYPE_BEEHIVE, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_NONE), + RC(RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_02, RCTYPE_BEEHIVE, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_NONE), + RC(RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_03, RCTYPE_BEEHIVE, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_NONE), RC(RC_SWAMP_SPIDER_HOUSE_MASK_OF_TRUTH, RCTYPE_NPC, SCENE_KINSTA1, FLAG_WEEK_EVENT_REG, WEEKEVENTREG_RECEIVED_MASK_OF_TRUTH, RI_MASK_TRUTH), + RC(RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_01, RCTYPE_BEEHIVE, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_NONE), + RC(RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_02, RCTYPE_BEEHIVE, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_NONE), + RC(RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_03, RCTYPE_BEEHIVE, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_NONE), + RC(RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_01, RCTYPE_BEEHIVE, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_NONE), + RC(RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_02, RCTYPE_BEEHIVE, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_NONE), + RC(RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_03, RCTYPE_BEEHIVE, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_NONE), RC(RC_SWORDSMAN_SCHOOL_PIECE_OF_HEART, RCTYPE_MINIGAME, SCENE_DOUJOU, FLAG_WEEK_EVENT_REG, WEEKEVENTREG_RECEIVED_SWORDSMANS_SCHOOL_HEART_PIECE, RI_HEART_PIECE), RC(RC_TERMINA_FIELD_BIO_BABA_GROTTO, RCTYPE_HEART, SCENE_KAKUSIANA, FLAG_CYCL_SCENE_COLLECTIBLE, 0x02, RI_HEART_PIECE), + RC(RC_TERMINA_FIELD_BIO_BABA_GROTTO_BEEHIVE_01, RCTYPE_BEEHIVE, SCENE_KAKUSIANA, FLAG_CYCL_SCENE_COLLECTIBLE, 0x03, RI_RUPEE_BLUE), + RC(RC_TERMINA_FIELD_BIO_BABA_GROTTO_BEEHIVE_02, RCTYPE_BEEHIVE, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_NONE), RC(RC_TERMINA_FIELD_COW_BACK, RCTYPE_COW, SCENE_KAKUSIANA, FLAG_NONE, 0x14, RI_MILK_REFILL), RC(RC_TERMINA_FIELD_COW_FRONT, RCTYPE_COW, SCENE_KAKUSIANA, FLAG_NONE, 0x13, RI_MILK_REFILL), + RC(RC_TERMINA_FIELD_COW_GROTTO_BEEHIVE, RCTYPE_BEEHIVE, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_NONE), RC(RC_TERMINA_FIELD_DODONGO_GROTTO_CHEST, RCTYPE_CHEST, SCENE_KAKUSIANA, FLAG_CYCL_SCENE_CHEST, 0x00, RI_HEART_PIECE), RC(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO, RCTYPE_HEART, SCENE_KAKUSIANA, FLAG_WEEK_EVENT_REG, WEEKEVENTREG_RECEIVED_GOSSIP_STONE_GROTTO_HEART_PIECE, RI_HEART_PIECE), RC(RC_TERMINA_FIELD_GROTTO_SCRUB, RCTYPE_NPC, SCENE_KAKUSIANA, FLAG_WEEK_EVENT_REG, WEEKEVENTREG_RECEIVED_BUSINESS_SCRUB_HEART_PIECE, RI_HEART_PIECE), @@ -397,11 +410,13 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = { RC(RC_WOODFALL_TEMPLE_COMPASS_CHEST, RCTYPE_CHEST, SCENE_MITURIN, FLAG_CYCL_SCENE_CHEST, 0x1c, RI_WOODFALL_COMPASS), RC(RC_WOODFALL_TEMPLE_DARK_CHEST, RCTYPE_CHEST, SCENE_MITURIN, FLAG_CYCL_SCENE_CHEST, 0x19, RI_WOODFALL_STRAY_FAIRY), RC(RC_WOODFALL_TEMPLE_ENTRANCE_CHEST, RCTYPE_CHEST, SCENE_MITURIN, FLAG_CYCL_SCENE_CHEST, 0x18, RI_WOODFALL_STRAY_FAIRY), + RC(RC_WOODFALL_TEMPLE_ENTRANCE_BEEHIVE, RCTYPE_BEEHIVE, SCENE_MITURIN, FLAG_CYCL_SCENE_COLLECTIBLE, 0x20, RI_RUPEE_BLUE), RC(RC_WOODFALL_TEMPLE_MAP_CHEST, RCTYPE_CHEST, SCENE_MITURIN, FLAG_CYCL_SCENE_CHEST, 0x1d, RI_WOODFALL_MAP), RC(RC_WOODFALL_TEMPLE_SF_ENTRANCE, RCTYPE_STRAY_FAIRY, SCENE_MITURIN, FLAG_CYCL_SCENE_SWITCH, 0x2B, RI_WOODFALL_STRAY_FAIRY), RC(RC_WOODFALL_TEMPLE_SF_MAIN_BUBBLE, RCTYPE_STRAY_FAIRY, SCENE_MITURIN, FLAG_CYCL_SCENE_SWITCH, 0x30, RI_WOODFALL_STRAY_FAIRY), RC(RC_WOODFALL_TEMPLE_SF_MAIN_DEKU_BABA, RCTYPE_STRAY_FAIRY, SCENE_MITURIN, FLAG_CYCL_SCENE_SWITCH, 0x2E, RI_WOODFALL_STRAY_FAIRY), RC(RC_WOODFALL_TEMPLE_SF_MAIN_POT, RCTYPE_STRAY_FAIRY, SCENE_MITURIN, FLAG_CYCL_SCENE_COLLECTIBLE, 0x1C, RI_WOODFALL_STRAY_FAIRY), + RC(RC_WOODFALL_TEMPLE_MAZE_ROOM_BEEHIVE, RCTYPE_BEEHIVE, SCENE_MITURIN, FLAG_NONE, 0x0, RI_NONE), RC(RC_WOODFALL_TEMPLE_SF_MAZE_BEEHIVE, RCTYPE_STRAY_FAIRY, SCENE_MITURIN, FLAG_CYCL_SCENE_COLLECTIBLE, 0x1D, RI_WOODFALL_STRAY_FAIRY), RC(RC_WOODFALL_TEMPLE_SF_MAZE_BUBBLE, RCTYPE_STRAY_FAIRY, SCENE_MITURIN, FLAG_CYCL_SCENE_SWITCH, 0x2F, RI_WOODFALL_STRAY_FAIRY), RC(RC_WOODFALL_TEMPLE_SF_MAZE_SKULLTULA, RCTYPE_STRAY_FAIRY, SCENE_MITURIN, FLAG_CYCL_SCENE_SWITCH, 0x31, RI_WOODFALL_STRAY_FAIRY), @@ -813,6 +828,7 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = { RC(RC_MOON_TRIAL_LINK_POT_07, RCTYPE_POT, SCENE_LAST_LINK, FLAG_NONE, 0x0, RI_MAGIC_JAR_BIG), RC(RC_MOON_TRIAL_LINK_POT_08, RCTYPE_POT, SCENE_LAST_LINK, FLAG_NONE, 0x0, RI_MAGIC_JAR_BIG), RC(RC_MOUNTAIN_VILLAGE_SPRING_FREESTANDING_RUPEE_01, RCTYPE_FREESTANDING, SCENE_10YUKIYAMANOMURA, FLAG_CYCL_SCENE_COLLECTIBLE, 0x09, RI_RUPEE_RED), + RC(RC_MOUNTAIN_VILLAGE_SPRING_BEEHIVE, RCTYPE_BEEHIVE, SCENE_10YUKIYAMANOMURA2, FLAG_NONE, 0x0, RI_NONE), RC(RC_MOUNTAIN_VILLAGE_SPRING_POT, RCTYPE_POT, SCENE_10YUKIYAMANOMURA2, FLAG_CYCL_SCENE_COLLECTIBLE, 0x26, RI_FAIRY_REFILL), RC(RC_MOUNTAIN_VILLAGE_WINTER_POT, RCTYPE_POT, SCENE_10YUKIYAMANOMURA, FLAG_CYCL_SCENE_COLLECTIBLE, 0x20, RI_FAIRY_REFILL), RC(RC_OCEAN_SPIDER_HOUSE_COLORED_SKULLS_POT_01, RCTYPE_POT, SCENE_KINDAN2, FLAG_CYCL_SCENE_COLLECTIBLE, 0x3b, RI_ARROWS_10), @@ -845,6 +861,7 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = { RC(RC_PINNACLE_ROCK_POT_11, RCTYPE_POT, SCENE_SINKAI, FLAG_CYCL_SCENE_COLLECTIBLE, 0x20, RI_MAGIC_JAR_SMALL), RC(RC_PIRATE_FORTRESS_CAPTAIN_ROOM_BARREL_01, RCTYPE_BARREL, SCENE_PIRATE, FLAG_NONE, 0x0, RI_NONE), RC(RC_PIRATE_FORTRESS_CAPTAIN_ROOM_BARREL_02, RCTYPE_BARREL, SCENE_PIRATE, FLAG_NONE, 0x0, RI_NONE), + RC(RC_PIRATE_FORTRESS_CAPTAIN_ROOM_UPPER_BEEHIVE, RCTYPE_BEEHIVE, SCENE_PIRATE, FLAG_NONE, 0x0, RI_NONE), RC(RC_PIRATE_FORTRESS_ENTRANCE_BARREL, RCTYPE_BARREL, SCENE_TORIDE, FLAG_NONE, 0x0, RI_NONE), RC(RC_PIRATE_FORTRESS_INTERIOR_BARREL_MAZE_POT_01, RCTYPE_POT, SCENE_PIRATE, FLAG_CYCL_SCENE_COLLECTIBLE, 0x22, RI_RECOVERY_HEART), RC(RC_PIRATE_FORTRESS_INTERIOR_BARREL_MAZE_POT_02, RCTYPE_POT, SCENE_PIRATE, FLAG_CYCL_SCENE_COLLECTIBLE, 0x23, RI_RUPEE_BLUE), @@ -1795,6 +1812,7 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = { RC(RC_SOUTHERN_SWAMP_POISON_GRASS_12, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK), RC(RC_SOUTHERN_SWAMP_POISON_GRASS_13, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK), RC(RC_SOUTHERN_SWAMP_POISON_GRASS_14, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK), + RC(RC_SOUTHERN_SWAMP_POISON_BEEHIVE, RCTYPE_BEEHIVE, SCENE_20SICHITAI, FLAG_CYCL_SCENE_COLLECTIBLE, 0x28, RI_RUPEE_RED), RC(RC_SOUTHERN_SWAMP_POISON_GRASS_15, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK), RC(RC_SOUTHERN_SWAMP_POISON_GRASS_16, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK), RC(RC_SOUTHERN_SWAMP_POISON_GRASS_17, RCTYPE_GRASS, SCENE_20SICHITAI, FLAG_NONE, 0x0, RI_JUNK), @@ -1890,6 +1908,7 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = { RC(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_03, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK), RC(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_04, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK), RC(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_05, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK), + RC(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_BEEHIVE, RCTYPE_BEEHIVE, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_NONE), RC(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_01, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK), RC(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_02, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK), RC(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_03, RCTYPE_GRASS, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_JUNK), diff --git a/mm/2s2h/Rando/StaticData/Options.cpp b/mm/2s2h/Rando/StaticData/Options.cpp index a534382d8..5db59ab6b 100644 --- a/mm/2s2h/Rando/StaticData/Options.cpp +++ b/mm/2s2h/Rando/StaticData/Options.cpp @@ -52,6 +52,7 @@ std::map<RandoOptionId, RandoStaticOption> Options = { RO(RO_SHUFFLE_FROGS, RO_GENERIC_OFF), RO(RO_SHUFFLE_GOLD_SKULLTULAS, RO_GENERIC_OFF), RO(RO_SHUFFLE_GRASS_DROPS, RO_GENERIC_OFF), + RO(RO_SHUFFLE_HIVE_DROPS, RO_GENERIC_OFF), RO(RO_SHUFFLE_OCARINA_BUTTONS, RO_GENERIC_OFF), RO(RO_SHUFFLE_OWL_STATUES, RO_GENERIC_OFF), RO(RO_SHUFFLE_POT_DROPS, RO_GENERIC_OFF), diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h index 7d91c586c..f85437cfa 100644 --- a/mm/2s2h/Rando/Types.h +++ b/mm/2s2h/Rando/Types.h @@ -12,6 +12,7 @@ typedef enum { RCTYPE_FROG, RCTYPE_GRASS, RCTYPE_HEART, + RCTYPE_BEEHIVE, RCTYPE_MINIGAME, RCTYPE_NPC, RCTYPE_OWL, @@ -104,6 +105,7 @@ typedef enum { RC_GORON_VILLAGE_SCRUB_DEED, RC_GREAT_BAY_COAST_COW_BACK, RC_GREAT_BAY_COAST_COW_FRONT, + RC_GREAT_BAY_COAST_COW_GROTTO_BEEHIVE, RC_GREAT_BAY_COAST_FISHERMAN_GROTTO_CHEST, RC_GREAT_BAY_COAST_FISHERMAN_MINIGAME, RC_GREAT_BAY_COAST_MARINE_LAB_FISH_PIECE_OF_HEART, @@ -357,11 +359,23 @@ typedef enum { RC_SWAMP_SKULLTULA_TREE_ROOM_TREE_01, RC_SWAMP_SKULLTULA_TREE_ROOM_TREE_02, RC_SWAMP_SKULLTULA_TREE_ROOM_TREE_03, + RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_01, + RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_02, + RC_SWAMP_SPIDER_HOUSE_GOLD_ROOM_BEEHIVE_03, RC_SWAMP_SPIDER_HOUSE_MASK_OF_TRUTH, + RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_01, + RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_02, + RC_SWAMP_SPIDER_HOUSE_POT_ROOM_BEEHIVE_03, + RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_01, + RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_02, + RC_SWAMP_SPIDER_HOUSE_TREE_ROOM_BEEHIVE_03, RC_SWORDSMAN_SCHOOL_PIECE_OF_HEART, RC_TERMINA_FIELD_BIO_BABA_GROTTO, + RC_TERMINA_FIELD_BIO_BABA_GROTTO_BEEHIVE_01, + RC_TERMINA_FIELD_BIO_BABA_GROTTO_BEEHIVE_02, RC_TERMINA_FIELD_COW_BACK, RC_TERMINA_FIELD_COW_FRONT, + RC_TERMINA_FIELD_COW_GROTTO_BEEHIVE, RC_TERMINA_FIELD_DODONGO_GROTTO_CHEST, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO, RC_TERMINA_FIELD_GROTTO_SCRUB, @@ -402,7 +416,9 @@ typedef enum { RC_WOODFALL_TEMPLE_COMPASS_CHEST, RC_WOODFALL_TEMPLE_DARK_CHEST, RC_WOODFALL_TEMPLE_ENTRANCE_CHEST, + RC_WOODFALL_TEMPLE_ENTRANCE_BEEHIVE, RC_WOODFALL_TEMPLE_MAP_CHEST, + RC_WOODFALL_TEMPLE_MAZE_ROOM_BEEHIVE, RC_WOODFALL_TEMPLE_SF_ENTRANCE, RC_WOODFALL_TEMPLE_SF_MAIN_BUBBLE, RC_WOODFALL_TEMPLE_SF_MAIN_DEKU_BABA, @@ -818,6 +834,7 @@ typedef enum { RC_MOON_TRIAL_LINK_POT_07, RC_MOON_TRIAL_LINK_POT_08, RC_MOUNTAIN_VILLAGE_SPRING_FREESTANDING_RUPEE_01, + RC_MOUNTAIN_VILLAGE_SPRING_BEEHIVE, RC_MOUNTAIN_VILLAGE_SPRING_POT, RC_MOUNTAIN_VILLAGE_WINTER_POT, RC_OCEAN_SPIDER_HOUSE_COLORED_SKULLS_POT_01, @@ -850,6 +867,7 @@ typedef enum { RC_PINNACLE_ROCK_POT_11, RC_PIRATE_FORTRESS_CAPTAIN_ROOM_BARREL_01, RC_PIRATE_FORTRESS_CAPTAIN_ROOM_BARREL_02, + RC_PIRATE_FORTRESS_CAPTAIN_ROOM_UPPER_BEEHIVE, RC_PIRATE_FORTRESS_ENTRANCE_BARREL, RC_PIRATE_FORTRESS_INTERIOR_BARREL_MAZE_POT_01, RC_PIRATE_FORTRESS_INTERIOR_BARREL_MAZE_POT_02, @@ -1801,6 +1819,7 @@ typedef enum { RC_SOUTHERN_SWAMP_POISON_GRASS_13, RC_SOUTHERN_SWAMP_POISON_GRASS_14, RC_SOUTHERN_SWAMP_POISON_GRASS_15, + RC_SOUTHERN_SWAMP_POISON_BEEHIVE, RC_SOUTHERN_SWAMP_POISON_GRASS_16, RC_SOUTHERN_SWAMP_POISON_GRASS_17, RC_SOUTHERN_SWAMP_POISON_GRASS_18, @@ -1895,6 +1914,7 @@ typedef enum { RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_03, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_04, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_GRASS_05, + RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_BEEHIVE, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_01, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_02, RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_4_GRASS_03, @@ -2967,6 +2987,7 @@ typedef enum { RO_SHUFFLE_FROGS, RO_SHUFFLE_GOLD_SKULLTULAS, RO_SHUFFLE_GRASS_DROPS, + RO_SHUFFLE_HIVE_DROPS, RO_SHUFFLE_OCARINA_BUTTONS, RO_SHUFFLE_OWL_STATUES, RO_SHUFFLE_POT_DROPS, diff --git a/mm/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c b/mm/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c index db4b62aee..90b5f39d9 100644 --- a/mm/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c +++ b/mm/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c @@ -6,6 +6,7 @@ #include "z_obj_comb.h" #include "objects/object_comb/object_comb.h" +#include "GameInteractor/GameInteractor.h" #define FLAGS 0x00000000 @@ -315,12 +316,14 @@ void func_8098D99C(ObjComb* this, PlayState* play) { void func_8098DA74(ObjComb* this, PlayState* play) { s32 temp_v0 = OBJCOMB_GET_8000(&this->actor) | OBJCOMB_GET_80(&this->actor); - if (temp_v0 == 0) { - func_8098D870(this, play); - } else if (temp_v0 == 1) { - func_8098D8C8(this, play); - } else { - func_8098D99C(this, play); + if (GameInteractor_Should(VB_BEEHIVE_SPAWN_ACTOR, true, this)) { + if (temp_v0 == 0) { + func_8098D870(this, play); + } else if (temp_v0 == 1) { + func_8098D8C8(this, play); + } else { + func_8098D99C(this, play); + } } } @@ -332,7 +335,9 @@ void ObjComb_Init(Actor* thisx, PlayState* play) { Actor_ProcessInitChain(&this->actor, sInitChain); Collider_InitJntSph(play, &this->collider); - if ((sp2C == 1) && OBJCOMB_GET_10(&this->actor) && CHECK_WEEKEVENTREG(WEEKEVENTREG_83_02)) { + if (GameInteractor_Should(VB_BEEHIVE_ALREADY_BROKEN, + (sp2C == 1) && OBJCOMB_GET_10(&this->actor) && CHECK_WEEKEVENTREG(WEEKEVENTREG_83_02), + this)) { Actor_Kill(&this->actor); return; } |
