summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
Diffstat (limited to 'mm')
-rw-r--r--mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h16
-rw-r--r--mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp1
-rw-r--r--mm/2s2h/Rando/ActorBehavior/ActorBehavior.h1
-rw-r--r--mm/2s2h/Rando/ActorBehavior/ObjComb.cpp132
-rw-r--r--mm/2s2h/Rando/Logic/GeneratePools.cpp5
-rw-r--r--mm/2s2h/Rando/Logic/Regions/North.cpp1
-rw-r--r--mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp1
-rw-r--r--mm/2s2h/Rando/Logic/Regions/South.cpp1
-rw-r--r--mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp9
-rw-r--r--mm/2s2h/Rando/Logic/Regions/TerminaField.cpp4
-rw-r--r--mm/2s2h/Rando/Logic/Regions/West.cpp1
-rw-r--r--mm/2s2h/Rando/Logic/Regions/WoodfallTemple.cpp2
-rw-r--r--mm/2s2h/Rando/Menu.cpp4
-rw-r--r--mm/2s2h/Rando/StaticData/Checks.cpp19
-rw-r--r--mm/2s2h/Rando/StaticData/Options.cpp1
-rw-r--r--mm/2s2h/Rando/Types.h21
-rw-r--r--mm/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c19
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;
}