summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEblo <7004497+Eblo@users.noreply.github.com>2026-07-28 00:21:18 -0400
committerGitHub <noreply@github.com>2026-07-27 23:21:18 -0500
commit630536f681e0b362f58793cd1d8d003c817621bf (patch)
treef0b582f26c680f37b759c24d47f8486c70d59d87
parent2c83cc890d70f4f68e1ca1e7bee753905efca467 (diff)
[Rando] Shuffle Wonder Items (#1785)
* Shuffle Wonder Items * Add swordsman school gong Rupee * Add Termina Field wall items * Remove unneeded hardcoded actor position * Make EnItem00 wonder items invisible
-rw-r--r--mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h8
-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/EnItem00.cpp7
-rw-r--r--mm/2s2h/Rando/ActorBehavior/WonderItems.cpp182
-rw-r--r--mm/2s2h/Rando/CheckTracker/CheckTracker.cpp1
-rw-r--r--mm/2s2h/Rando/Logic/GeneratePools.cpp5
-rw-r--r--mm/2s2h/Rando/Logic/Logic.h6
-rw-r--r--mm/2s2h/Rando/Logic/Regions/Central.cpp18
-rw-r--r--mm/2s2h/Rando/Logic/Regions/East.cpp14
-rw-r--r--mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp16
-rw-r--r--mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp9
-rw-r--r--mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp31
-rw-r--r--mm/2s2h/Rando/Logic/Regions/TerminaField.cpp36
-rw-r--r--mm/2s2h/Rando/Menu.cpp4
-rw-r--r--mm/2s2h/Rando/StaticData/Checks.cpp115
-rw-r--r--mm/2s2h/Rando/StaticData/Options.cpp1
-rw-r--r--mm/2s2h/Rando/Types.h116
-rw-r--r--mm/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c13
19 files changed, 571 insertions, 13 deletions
diff --git a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h
index 8103fe6b1..0f620bdd3 100644
--- a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h
+++ b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h
@@ -1027,6 +1027,14 @@ typedef enum {
// #### `result`
// ```c
+ // true
+ // ```
+ // #### `args`
+ // - `ObjDora*`
+ VB_GONG_DROP_COLLECTIBLE,
+
+ // #### `result`
+ // ```c
// phi_f0 > 0.0f
// ```
// #### `args`
diff --git a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp
index f31d40759..e2e3aaef7 100644
--- a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp
+++ b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.cpp
@@ -134,6 +134,7 @@ void Rando::ActorBehavior::OnFileLoad() {
Rando::ActorBehavior::InitPlayerBehavior();
Rando::ActorBehavior::InitSoulsBehavior();
Rando::ActorBehavior::InitTrapsBehavior();
+ Rando::ActorBehavior::InitWonderItemsBehavior();
COND_HOOK(ShouldVanillaBehavior, IS_RANDO, MiscVanillaBehaviorHandler);
}
diff --git a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h
index 0b46a56d7..c932b24e2 100644
--- a/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h
+++ b/mm/2s2h/Rando/ActorBehavior/ActorBehavior.h
@@ -103,6 +103,7 @@ void InitObjWarpstoneBehavior();
void InitPlayerBehavior();
void InitSoulsBehavior();
void InitTrapsBehavior();
+void InitWonderItemsBehavior();
} // namespace ActorBehavior
diff --git a/mm/2s2h/Rando/ActorBehavior/EnItem00.cpp b/mm/2s2h/Rando/ActorBehavior/EnItem00.cpp
index feed09798..718652112 100644
--- a/mm/2s2h/Rando/ActorBehavior/EnItem00.cpp
+++ b/mm/2s2h/Rando/ActorBehavior/EnItem00.cpp
@@ -113,6 +113,11 @@ void Rando::ActorBehavior::InitEnItem00Behavior() {
// Prevent the original item from spawning
*should = false;
- spawnReplacementItem(actor->world.pos, randoStaticCheck);
+ EnItem00* replacementItem = spawnReplacementItem(actor->world.pos, randoStaticCheck);
+
+ // Wonder Items are supposed to be invisible
+ if (randoStaticCheck.randoCheckType == RCTYPE_WONDER_ITEM) {
+ replacementItem->actor.draw = NULL;
+ }
});
}
diff --git a/mm/2s2h/Rando/ActorBehavior/WonderItems.cpp b/mm/2s2h/Rando/ActorBehavior/WonderItems.cpp
new file mode 100644
index 000000000..5d5ee4d3c
--- /dev/null
+++ b/mm/2s2h/Rando/ActorBehavior/WonderItems.cpp
@@ -0,0 +1,182 @@
+#include "ActorBehavior.h"
+#include <libultraship/bridge/consolevariablebridge.h>
+#include "2s2h/ObjectExtension/ActorListIndex.h"
+
+extern "C" {
+#include "overlays/actors/ovl_En_Invisible_Ruppe/z_en_invisible_ruppe.h"
+#include "overlays/actors/ovl_En_Gakufu/z_en_gakufu.h"
+#include "overlays/actors/ovl_En_Hit_Tag/z_en_hit_tag.h"
+#include "overlays/actors/ovl_Obj_Dora/z_obj_dora.h"
+
+extern Vec3f sRewardDropsSpawnTerminaFieldPos;
+extern u8 sRewardDropsIndex[];
+extern void EnGakufu_PlayRewardCutscene(EnGakufu* enGakufu, PlayState* play);
+}
+
+extern EnItem00* spawnReplacementItem(Vec3f& pos, Rando::StaticData::RandoStaticCheck& randoStaticCheck);
+extern int isDropActorAtPosition(PlayState* play, Actor* callingActor_, Actor* actor, void* verifyData);
+extern void SpawnDropItem(Vec3f position, RandoCheckId randoCheckId);
+
+// clang-format off
+std::map<std::tuple<s16, s16, s16, s16>, RandoCheckId> enWonderItemMap = {
+ // Pirates' Fortress
+ { { ACTOR_EN_HIT_TAG, SCENE_KAIZOKU, 0, 24 }, RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_01 },
+ { { ACTOR_EN_HIT_TAG, SCENE_KAIZOKU, 0, 25 }, RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_04 },
+ { { ACTOR_EN_HIT_TAG, SCENE_PIRATE, 3, 9 }, RC_PIRATE_FORTRESS_INTERIOR_WONDER_ITEM_01 },
+ // Swamp Spider House
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_KINSTA1, 4, 25 }, RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_01 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_KINSTA1, 4, 26 }, RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_02 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_KINSTA1, 4, 27 }, RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_03 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_KINSTA1, 4, 28 }, RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_04 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_KINSTA1, 4, 29 }, RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_05 },
+ { { ACTOR_EN_HIT_TAG, SCENE_KINSTA1, 1, 10 }, RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_06 },
+ { { ACTOR_EN_HIT_TAG, SCENE_KINSTA1, 1, 11 }, RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_09 },
+ { { ACTOR_EN_HIT_TAG, SCENE_KINSTA1, 1, 12 }, RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_12 },
+ { { ACTOR_EN_HIT_TAG, SCENE_KINSTA1, 1, 13 }, RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_15 },
+ // Oceanside Spider House
+ { { ACTOR_EN_HIT_TAG, SCENE_KINDAN2, 1, 0 }, RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_01 },
+ { { ACTOR_EN_HIT_TAG, SCENE_KINDAN2, 1, 1 }, RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_04 },
+ { { ACTOR_EN_HIT_TAG, SCENE_KINDAN2, 1, 2 }, RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_07 },
+ // Termina Field
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 89 }, RC_TERMINA_FIELD_WONDER_ITEM_01 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 90 }, RC_TERMINA_FIELD_WONDER_ITEM_02 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 91 }, RC_TERMINA_FIELD_WONDER_ITEM_03 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 92 }, RC_TERMINA_FIELD_WONDER_ITEM_04 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 93 }, RC_TERMINA_FIELD_WONDER_ITEM_05 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 94 }, RC_TERMINA_FIELD_WONDER_ITEM_06 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 95 }, RC_TERMINA_FIELD_WONDER_ITEM_07 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 96 }, RC_TERMINA_FIELD_WONDER_ITEM_08 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 97 }, RC_TERMINA_FIELD_WONDER_ITEM_09 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 98 }, RC_TERMINA_FIELD_WONDER_ITEM_10 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_00KEIKOKU, 0, 99 }, RC_TERMINA_FIELD_WONDER_ITEM_11 },
+ { { ACTOR_EN_HIT_TAG, SCENE_00KEIKOKU, 0, 100 }, RC_TERMINA_FIELD_WONDER_ITEM_12 },
+ { { ACTOR_EN_HIT_TAG, SCENE_00KEIKOKU, 0, 101 }, RC_TERMINA_FIELD_WONDER_ITEM_15 },
+ { { ACTOR_EN_HIT_TAG, SCENE_00KEIKOKU, 0, 102 }, RC_TERMINA_FIELD_WONDER_ITEM_18 },
+ // Romani Ranch
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_F01, 0, 42 }, RC_ROMANI_RANCH_WONDER_ITEM_01 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_F01, 0, 43 }, RC_ROMANI_RANCH_WONDER_ITEM_02 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_F01, 0, 44 }, RC_ROMANI_RANCH_WONDER_ITEM_03 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_F01, 0, 45 }, RC_ROMANI_RANCH_WONDER_ITEM_04 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_F01, 0, 46 }, RC_ROMANI_RANCH_WONDER_ITEM_05 },
+ { { ACTOR_EN_INVISIBLE_RUPPE, SCENE_F01, 0, 47 }, RC_ROMANI_RANCH_WONDER_ITEM_06 },
+ // Cucco Shack
+ { { ACTOR_EN_HIT_TAG, SCENE_F01C, 0, 17 }, RC_CUCCO_SHACK_WONDER_ITEM_01 },
+ { { ACTOR_EN_HIT_TAG, SCENE_F01C, 0, 18 }, RC_CUCCO_SHACK_WONDER_ITEM_04 },
+ // Ikana Graveyard
+ { { ACTOR_EN_HIT_TAG, SCENE_BOTI, 0, 10 }, RC_IKANA_GRAVEYARD_WONDER_ITEM_01 },
+ { { ACTOR_EN_HIT_TAG, SCENE_BOTI, 0, 11 }, RC_IKANA_GRAVEYARD_WONDER_ITEM_04 },
+ { { ACTOR_EN_HIT_TAG, SCENE_BOTI, 0, 12 }, RC_IKANA_GRAVEYARD_WONDER_ITEM_07 },
+ { { ACTOR_EN_HIT_TAG, SCENE_BOTI, 1, 9 }, RC_IKANA_GRAVEYARD_WONDER_ITEM_10 },
+ // Stock Pot Inn
+ { { ACTOR_EN_HIT_TAG, SCENE_YADOYA, 0, 14 }, RC_STOCK_POT_INN_WONDER_ITEM_01 },
+ // East Clock Town
+ { { ACTOR_EN_HIT_TAG, SCENE_TOWN, 0, 42 }, RC_CLOCK_TOWN_EAST_WONDER_ITEM_01 },
+ { { ACTOR_EN_HIT_TAG, SCENE_TOWN, 0, 43 }, RC_CLOCK_TOWN_EAST_WONDER_ITEM_04 },
+ { { ACTOR_EN_HIT_TAG, SCENE_TOWN, 0, 44 }, RC_CLOCK_TOWN_EAST_WONDER_ITEM_07 },
+ // South Clock Town
+ { { ACTOR_EN_HIT_TAG, SCENE_CLOCKTOWER, 0, 29 }, RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_01 },
+};
+// clang-format on
+
+bool SpawnDroppedWonderItems(Vec3f position, u32 params) {
+ Actor* dropActor = SubS_FindActorCustom(gPlayState, NULL, NULL, ACTORCAT_ITEMACTION, ACTOR_EN_HIT_TAG, &position,
+ isDropActorAtPosition);
+
+ if (dropActor == nullptr) {
+ dropActor = Actor_FindNearby(gPlayState, &GET_PLAYER(gPlayState)->actor, ACTOR_EN_GAKUFU, ACTORCAT_ITEMACTION,
+ 99999.9f);
+ if (dropActor == nullptr || ((EnGakufu*)dropActor)->actionFunc != EnGakufu_PlayRewardCutscene) {
+ return false;
+ }
+ }
+
+ s16 actorListIndex = GetActorListIndex(dropActor);
+
+ // Cheesing it to avoid dupe spawns
+ if (actorListIndex == -1) {
+ return true;
+ }
+
+ RandoCheckId baseRandoCheckId = RC_UNKNOWN;
+ if (dropActor->id == ACTOR_EN_GAKUFU) {
+ s32 hour = TIME_TO_HOURS_F(CURRENT_TIME);
+ baseRandoCheckId = RandoCheckId(RC_TERMINA_FIELD_WALL_WONDER_ITEM_01 + sRewardDropsIndex[hour]);
+ position = sRewardDropsSpawnTerminaFieldPos;
+ } else {
+ auto it = enWonderItemMap.find(
+ { ACTOR_EN_HIT_TAG, gPlayState->sceneId, gPlayState->roomCtx.curRoom.num, actorListIndex });
+ if (it != enWonderItemMap.end()) {
+ baseRandoCheckId = it->second;
+ }
+ }
+
+ if (baseRandoCheckId == RC_UNKNOWN) {
+ return false;
+ }
+
+ if (!RANDO_SAVE_CHECKS[baseRandoCheckId].cycleObtained)
+ SpawnDropItem(position, baseRandoCheckId);
+ if (!RANDO_SAVE_CHECKS[baseRandoCheckId + 1].cycleObtained)
+ SpawnDropItem(position, RandoCheckId(baseRandoCheckId + 1));
+ if (!RANDO_SAVE_CHECKS[baseRandoCheckId + 2].cycleObtained)
+ SpawnDropItem(position, RandoCheckId(baseRandoCheckId + 2));
+ // Set this as a quick and dirty condition to avoid spawning dupes
+ SetActorListIndex(dropActor, -1);
+ return true;
+}
+
+void WonderItemInit(Actor* actor, RandoCheckId randoCheckId, bool isInvisible, bool* should) {
+ auto randoSaveCheck = RANDO_SAVE_CHECKS[randoCheckId];
+
+ if (!randoSaveCheck.shuffled || randoSaveCheck.cycleObtained) {
+ return;
+ }
+
+ Actor* customActor = (Actor*)spawnReplacementItem(actor->world.pos, Rando::StaticData::Checks[randoCheckId]);
+ if (isInvisible) {
+ customActor->draw = NULL;
+ }
+
+ *should = false;
+}
+
+void Rando::ActorBehavior::InitWonderItemsBehavior() {
+ bool shouldRegister = IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_WONDER_ITEMS];
+
+ COND_VB_SHOULD(VB_DROP_COLLECTIBLE, shouldRegister, {
+ Vec3f position = va_arg(args, Vec3f);
+ u32 params = va_arg(args, u32);
+ if (SpawnDroppedWonderItems(position, params)) {
+ *should = false;
+ }
+ });
+
+ COND_VB_SHOULD(VB_GONG_DROP_COLLECTIBLE, shouldRegister, {
+ ObjDora* objDora = va_arg(args, ObjDora*);
+ if (!RANDO_SAVE_CHECKS[RC_SWORDSMAN_SCHOOL_WONDER_ITEM].cycleObtained) {
+ SpawnDropItem(objDora->actor.world.pos, RC_SWORDSMAN_SCHOOL_WONDER_ITEM);
+ *should = false;
+ }
+ });
+
+ COND_ID_HOOK(ShouldActorInit, ACTOR_EN_INVISIBLE_RUPPE, shouldRegister, [](Actor* actor, bool* should) {
+ RandoCheckId randoCheckId = RC_UNKNOWN;
+ auto it = enWonderItemMap.find(
+ { actor->id, gPlayState->sceneId, gPlayState->roomCtx.curRoom.num, GetActorListIndex(actor) });
+ if (it != enWonderItemMap.end()) {
+ randoCheckId = it->second;
+ }
+
+ if (randoCheckId != RC_UNKNOWN && RANDO_SAVE_CHECKS[randoCheckId].shuffled ||
+ RANDO_SAVE_CHECKS[randoCheckId].cycleObtained) {
+ WonderItemInit(actor, randoCheckId, true, should);
+ }
+ });
+
+ COND_ID_HOOK(ShouldActorInit, ACTOR_EN_SCOPECOIN, shouldRegister, [](Actor* actor, bool* should) {
+ if (GetActorListIndex(actor) == 207) { // Pillar Rupee in Termina Field
+ WonderItemInit(actor, RC_TERMINA_FIELD_WONDER_ITEM_21,
+ !(gPlayState->actorCtx.flags & ACTORCTX_FLAG_TELESCOPE_ON), should);
+ }
+ });
+}
diff --git a/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp b/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp
index f362a2bfe..05e17feeb 100644
--- a/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp
+++ b/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp
@@ -142,6 +142,7 @@ std::vector<const char*> checkTypeIconList = {
/*RCTYPE_STRAY_FAIRY*/ gStrayFairyGreatBayIconTex,
/*RCTYPE_TINGLE_SHOP*/ gItemIconAdultsWalletTex,
/*RCTYPE_TREE*/ gItemIconDekuStickTex,
+ /*RCTYPE_WONDER_ITEM*/ gPauseUnusedCursorTex,
};
static constexpr ImVec4 tintColor = {};
diff --git a/mm/2s2h/Rando/Logic/GeneratePools.cpp b/mm/2s2h/Rando/Logic/GeneratePools.cpp
index 8a5195a8c..cca6253e6 100644
--- a/mm/2s2h/Rando/Logic/GeneratePools.cpp
+++ b/mm/2s2h/Rando/Logic/GeneratePools.cpp
@@ -113,6 +113,11 @@ void GeneratePools(RandoSaveInfo& saveInfo, std::vector<RandoCheckId>& checkPool
continue;
}
+ if (randoStaticCheck.randoCheckType == RCTYPE_WONDER_ITEM &&
+ saveInfo.randoSaveOptions[RO_SHUFFLE_WONDER_ITEMS] == RO_GENERIC_NO) {
+ continue;
+ }
+
if (randoStaticCheck.randoCheckType == RCTYPE_TINGLE_SHOP &&
saveInfo.randoSaveOptions[RO_SHUFFLE_TINGLE_SHOPS] == RO_GENERIC_NO) {
continue;
diff --git a/mm/2s2h/Rando/Logic/Logic.h b/mm/2s2h/Rando/Logic/Logic.h
index 13be4294c..4e4cf2393 100644
--- a/mm/2s2h/Rando/Logic/Logic.h
+++ b/mm/2s2h/Rando/Logic/Logic.h
@@ -350,6 +350,12 @@ inline bool canPlaySong(u8 songId) {
Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT));
case OCARINA_SONG_SCARECROW_SPAWN:
return FoundOcarinaButtons() >= 2;
+ case OCARINA_SONG_TERMINA_WALL:
+ return (Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_A) &&
+ Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_DOWN) &&
+ Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_RIGHT) &&
+ Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_LEFT) &&
+ Flags_GetRandoInf(RANDO_INF_OBTAINED_OCARINA_BUTTON_C_UP));
default:
return true;
}
diff --git a/mm/2s2h/Rando/Logic/Regions/Central.cpp b/mm/2s2h/Rando/Logic/Regions/Central.cpp
index 96373840a..c4b811850 100644
--- a/mm/2s2h/Rando/Logic/Regions/Central.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/Central.cpp
@@ -95,6 +95,15 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_CLOCK_TOWN_EAST_UPPER_CHEST, true),
CHECK(RC_CLOCK_TOWN_BOMBERS_NOTEBOOK, RANDO_EVENTS[RE_BOMBER_CODE]),
CHECK(RC_CLOCK_TOWN_POSTBOX, HAS_ITEM(ITEM_MASK_POSTMAN)),
+ CHECK(RC_CLOCK_TOWN_EAST_WONDER_ITEM_01, CAN_USE_SWORD || CAN_USE_PROJECTILE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CLOCK_TOWN_EAST_WONDER_ITEM_02, CAN_USE_SWORD || CAN_USE_PROJECTILE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CLOCK_TOWN_EAST_WONDER_ITEM_03, CAN_USE_SWORD || CAN_USE_PROJECTILE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CLOCK_TOWN_EAST_WONDER_ITEM_04, CAN_USE_SWORD || CAN_USE_PROJECTILE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CLOCK_TOWN_EAST_WONDER_ITEM_05, CAN_USE_SWORD || CAN_USE_PROJECTILE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CLOCK_TOWN_EAST_WONDER_ITEM_06, CAN_USE_SWORD || CAN_USE_PROJECTILE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CLOCK_TOWN_EAST_WONDER_ITEM_07, true),
+ CHECK(RC_CLOCK_TOWN_EAST_WONDER_ITEM_08, true),
+ CHECK(RC_CLOCK_TOWN_EAST_WONDER_ITEM_09, true),
},
.exits = { // TO FROM
EXIT(ENTRANCE(TERMINA_FIELD, 7), ENTRANCE(EAST_CLOCK_TOWN, 0), true),
@@ -201,6 +210,9 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_CLOCK_TOWN_SOUTH_CHEST_UPPER, ((CAN_BE_DEKU && Flags_GetRandoInf(RANDO_INF_OBTAINED_MOONS_TEAR)) || HAS_ITEM(ITEM_HOOKSHOT)) && FINAL_DAY()),
CHECK(RC_CLOCK_TOWN_SOUTH_CHEST_LOWER, (CAN_BE_DEKU && Flags_GetRandoInf(RANDO_INF_OBTAINED_MOONS_TEAR)) || HAS_ITEM(ITEM_HOOKSHOT)),
CHECK(RC_CLOCK_TOWN_SOUTH_OWL_STATUE, CAN_USE_SWORD),
+ CHECK(RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_01, CAN_USE_PROJECTILE),
+ CHECK(RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_02, CAN_USE_PROJECTILE),
+ CHECK(RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_03, CAN_USE_PROJECTILE),
},
.exits = { // TO FROM
EXIT(ENTRANCE(CLOCK_TOWER_INTERIOR, 1), ENTRANCE(SOUTH_CLOCK_TOWN, 0), true),
@@ -298,6 +310,9 @@ static RegisterShipInitFunc initFunc([]() {
Flags_GetRandoInf(RANDO_INF_OBTAINED_LETTER_TO_MAMA) || Flags_GetRandoInf(RANDO_INF_OBTAINED_LETTER_TO_KAFEI)) &&
MIDNIGHT()
),
+ CHECK(RC_STOCK_POT_INN_WONDER_ITEM_01, CAN_BE_ZORA && HAS_MAGIC),
+ CHECK(RC_STOCK_POT_INN_WONDER_ITEM_02, CAN_BE_ZORA && HAS_MAGIC),
+ CHECK(RC_STOCK_POT_INN_WONDER_ITEM_03, CAN_BE_ZORA && HAS_MAGIC),
},
.exits = { // TO FROM
EXIT(ENTRANCE(EAST_CLOCK_TOWN, 9), ENTRANCE(STOCK_POT_INN, 0), true), // From ground floor
@@ -382,6 +397,9 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_SWORDSMAN_SCHOOL_POT_03, CAN_USE_HUMAN_SWORD && AFTER(TIME_NIGHT3_AM_12_00)),
CHECK(RC_SWORDSMAN_SCHOOL_POT_04, CAN_USE_HUMAN_SWORD && AFTER(TIME_NIGHT3_AM_12_00)),
CHECK(RC_SWORDSMAN_SCHOOL_POT_05, CAN_USE_HUMAN_SWORD && AFTER(TIME_NIGHT3_AM_12_00)),
+ CHECK(RC_SWORDSMAN_SCHOOL_WONDER_ITEM, (CAN_BE_GORON || CAN_BE_ZORA || CAN_BE_DEKU || CAN_USE_SWORD ||
+ HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_HOOKSHOT) || HAS_ITEM(ITEM_BOW)) &&
+ BEFORE(TIME_NIGHT3_PM_11_00)),
},
.exits = { // TO FROM
EXIT(ENTRANCE(WEST_CLOCK_TOWN, 3), ENTRANCE(SWORDMANS_SCHOOL, 0), true),
diff --git a/mm/2s2h/Rando/Logic/Regions/East.cpp b/mm/2s2h/Rando/Logic/Regions/East.cpp
index c0d60438a..541f65420 100644
--- a/mm/2s2h/Rando/Logic/Regions/East.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/East.cpp
@@ -228,6 +228,16 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_IKANA_GRAVEYARD_GRASS_07, true),
CHECK(RC_IKANA_GRAVEYARD_GRASS_08, true),
CHECK(RC_IKANA_GRAVEYARD_GRASS_09, true),
+ // Rocks can be picked up and thrown at these:
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_01, true),
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_02, true),
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_03, true),
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_04, true),
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_05, true),
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_06, true),
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_07, true),
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_08, true),
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_09, true),
CHECK(RC_ENEMY_DROP_STALCHILD, CanKillEnemy(ACTOR_EN_SKB) && IS_NIGHT()), // Night only
CHECK(RC_ENEMY_DROP_BAD_BAT, CanKillEnemy(ACTOR_EN_BAT) && IS_DAY()), // Day only
},
@@ -248,6 +258,10 @@ static RegisterShipInitFunc initFunc([]() {
Regions[RR_IKANA_GRAVEYARD_UPPER] = RandoRegion{ .name = "Upper", .sceneId = SCENE_BOTI,
.checks = {
CHECK(RC_IKANA_GRAVEYARD_CAPTAIN_MASK, CanKillEnemy(ACTOR_EN_SKB) && CanKillEnemy(ACTOR_EN_BSB)),
+ // Rocks can be picked up and thrown at this:
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_10, true),
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_11, true),
+ CHECK(RC_IKANA_GRAVEYARD_WONDER_ITEM_12, true),
CHECK(RC_ENEMY_DROP_STALCHILD, CanKillEnemy(ACTOR_EN_SKB)),
CHECK(RC_ENEMY_DROP_BAD_BAT, CanKillEnemy(ACTOR_EN_BAT) && IS_DAY()), // Day only
CHECK(RC_ENEMY_DROP_CAPTAIN_KEETA, CanKillEnemy(ACTOR_EN_SKB) && CanKillEnemy(ACTOR_EN_BSB)),
diff --git a/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp b/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp
index 779c6ad73..75b7ae574 100644
--- a/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/MilkRoad.cpp
@@ -23,6 +23,12 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_CUCCO_SHACK_LARGE_CRATE_02, true),
CHECK(RC_CUCCO_SHACK_LARGE_CRATE_03, true),
CHECK(RC_CUCCO_SHACK_TREE, true),
+ CHECK(RC_CUCCO_SHACK_WONDER_ITEM_01, CAN_USE_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CUCCO_SHACK_WONDER_ITEM_02, CAN_USE_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CUCCO_SHACK_WONDER_ITEM_03, CAN_USE_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CUCCO_SHACK_WONDER_ITEM_04, CAN_USE_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CUCCO_SHACK_WONDER_ITEM_05, CAN_USE_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_CUCCO_SHACK_WONDER_ITEM_06, CAN_USE_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
},
.exits = { // TO FROM
EXIT(ENTRANCE(ROMANI_RANCH, 4), ENTRANCE(CUCCO_SHACK, 0), true),
@@ -147,7 +153,9 @@ static RegisterShipInitFunc initFunc([]() {
.checks = {
CHECK(RC_ROMANI_RANCH_BARN_COW_LEFT, CAN_PLAY_SONG(EPONA) && BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_NIGHT),
CHECK(RC_ROMANI_RANCH_BARN_COW_MIDDLE, CAN_PLAY_SONG(EPONA) && BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_NIGHT),
- CHECK(RC_ROMANI_RANCH_BARN_COW_RIGHT, CAN_PLAY_SONG(EPONA) && BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_NIGHT)
+ CHECK(RC_ROMANI_RANCH_BARN_COW_RIGHT, CAN_PLAY_SONG(EPONA) && BREAK_BOULDER_BEFORE_OR_BEAT_ALIENS_NIGHT),
+ CHECK(RC_ROMANI_RANCH_BARN_WONDER_ITEM_01, true),
+ CHECK(RC_ROMANI_RANCH_BARN_WONDER_ITEM_02, true),
},
.exits = { // TO FROM
EXIT(ENTRANCE(ROMANI_RANCH, 2), ENTRANCE(RANCH_HOUSE, 0), true),
@@ -242,6 +250,12 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_ROMANI_RANCH_TREE_05, true),
CHECK(RC_ROMANI_RANCH_TREE_06, true),
CHECK(RC_ROMANI_RANCH_TREE_07, true),
+ CHECK(RC_ROMANI_RANCH_WONDER_ITEM_01, true),
+ CHECK(RC_ROMANI_RANCH_WONDER_ITEM_02, true),
+ CHECK(RC_ROMANI_RANCH_WONDER_ITEM_03, true),
+ CHECK(RC_ROMANI_RANCH_WONDER_ITEM_04, true),
+ CHECK(RC_ROMANI_RANCH_WONDER_ITEM_05, true),
+ CHECK(RC_ROMANI_RANCH_WONDER_ITEM_06, true),
// TODO: Time logic is wrong for entrance rando
CHECK(RC_ENEMY_DROP_ALIEN, CanKillEnemy(ACTOR_EN_INVADEPOH) && IS_NIGHT1() && CAN_BE_GORON && HAS_ITEM(ITEM_POWDER_KEG)), // Night 1 only
},
diff --git a/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp b/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp
index f82ca9c75..7f817cca5 100644
--- a/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/PiratesFortress.cpp
@@ -27,6 +27,9 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_PIRATE_FORTRESS_CAPTAIN_ROOM_BARREL_01, RANDO_EVENTS[RE_PIRATE_FORTRESS_BEEHIVE_HIT]),
CHECK(RC_PIRATE_FORTRESS_CAPTAIN_ROOM_BARREL_02, RANDO_EVENTS[RE_PIRATE_FORTRESS_BEEHIVE_HIT]),
CHECK(RC_PIRATE_FORTRESS_INTERIOR_HOOKSHOT_CHEST, RANDO_EVENTS[RE_PIRATE_FORTRESS_BEEHIVE_HIT]),
+ CHECK(RC_PIRATE_FORTRESS_INTERIOR_WONDER_ITEM_01, RANDO_EVENTS[RE_PIRATE_FORTRESS_BEEHIVE_HIT] && CAN_USE_PROJECTILE),
+ CHECK(RC_PIRATE_FORTRESS_INTERIOR_WONDER_ITEM_02, RANDO_EVENTS[RE_PIRATE_FORTRESS_BEEHIVE_HIT] && CAN_USE_PROJECTILE),
+ CHECK(RC_PIRATE_FORTRESS_INTERIOR_WONDER_ITEM_03, RANDO_EVENTS[RE_PIRATE_FORTRESS_BEEHIVE_HIT] && CAN_USE_PROJECTILE),
CHECK(RC_ENEMY_DROP_SHELLBLADE, CanKillEnemy(ACTOR_EN_SB)),
},
.exits = { // TO FROM
@@ -265,6 +268,12 @@ static RegisterShipInitFunc initFunc([]() {
.checks = {
CHECK(RC_PIRATE_FORTRESS_PLAZA_LARGE_CRATE_01, true),
CHECK(RC_PIRATE_FORTRESS_PLAZA_LOWER_CHEST, true),
+ CHECK(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_01, CAN_USE_PROJECTILE),
+ CHECK(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_02, CAN_USE_PROJECTILE),
+ CHECK(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_03, CAN_USE_PROJECTILE),
+ CHECK(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_04, CAN_USE_PROJECTILE),
+ CHECK(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_05, CAN_USE_PROJECTILE),
+ CHECK(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_06, CAN_USE_PROJECTILE),
},
.exits = { // TO FROM
EXIT(ENTRANCE(PIRATES_FORTRESS_INTERIOR, 0), ENTRANCE(PIRATES_FORTRESS, 1), true),
diff --git a/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp b/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp
index ab42d3597..c720ee131 100644
--- a/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/SpiderHouses.cpp
@@ -40,7 +40,10 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_OCEAN_SPIDER_HOUSE_ENTRANCE_POT_01, true),
CHECK(RC_OCEAN_SPIDER_HOUSE_ENTRANCE_POT_02, true),
CHECK(RC_OCEAN_SPIDER_HOUSE_ENTRANCE_POT_03, true),
- CHECK(RC_OCEAN_SPIDER_HOUSE_ENTRANCE_POT_04, true)
+ CHECK(RC_OCEAN_SPIDER_HOUSE_ENTRANCE_POT_04, true),
+ CHECK(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_07, CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_08, CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_09, CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_NUT)),
},
.connections = {
CONNECTION(RR_OCEAN_SPIDER_HOUSE_ENTRANCE_UPPER, CAN_BE_GORON),
@@ -50,6 +53,12 @@ static RegisterShipInitFunc initFunc([]() {
Regions[RR_OCEAN_SPIDER_HOUSE_ENTRANCE_UPPER] = RandoRegion{ .name = "Entrance Upper", .sceneId = SCENE_KINDAN2,
.checks = {
CHECK(RC_OCEAN_SPIDER_HOUSE_WALLET, HAS_ENOUGH_SKULLTULA_TOKENS(SCENE_KINDAN2)),
+ CHECK(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_01, CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE),
+ CHECK(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_02, CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE),
+ CHECK(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_03, CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE),
+ CHECK(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_04, CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE),
+ CHECK(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_05, CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE),
+ CHECK(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_06, CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE),
},
.exits = { // TO FROM
EXIT(ENTRANCE(GREAT_BAY_COAST, 8), ENTRANCE(OCEANSIDE_SPIDER_HOUSE, 0), true)
@@ -140,6 +149,11 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_SWAMP_SKULLTULA_POT_ROOM_WALL, CanKillEnemy(ACTOR_EN_SW)),
CHECK(RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_06, true),
CHECK(RC_SWAMP_SPIDER_HOUSE_JAR_ROOM_POT_07, true),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_01, true),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_02, true),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_03, true),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_04, true),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_05, true),
},
.connections = {
CONNECTION(RR_SWAMP_SPIDER_HOUSE_CENTER_ROOM_UPPER, true),
@@ -157,9 +171,18 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_SWAMP_SKULLTULA_MAIN_ROOM_LOWER_RIGHT_SOFT_SOIL, HAS_BOTTLE && CAN_ACCESS(BUGS) && CanKillEnemy(ACTOR_EN_SW)),
CHECK(RC_SWAMP_SKULLTULA_MAIN_ROOM_PILLAR, CanKillEnemy(ACTOR_EN_SW)),
CHECK(RC_SWAMP_SKULLTULA_MAIN_ROOM_WATER, CanKillEnemy(ACTOR_EN_SW)),
- CHECK(RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_LOWER_POT_01, true),
- CHECK(RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_LOWER_POT_02, true),
- CHECK(RC_SWAMP_SPIDER_HOUSE_MAIN_ROOM_LOWER_POT_03, true),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_06, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_07, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_08, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_09, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_10, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_11, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_12, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_13, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_14, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_15, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_16, CAN_USE_PROJECTILE),
+ CHECK(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_17, CAN_USE_PROJECTILE),
},
.connections = {
CONNECTION(RR_SWAMP_SPIDER_HOUSE_ENTRANCE, true),
diff --git a/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp b/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp
index 0c1df9df8..d9d041433 100644
--- a/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp
+++ b/mm/2s2h/Rando/Logic/Regions/TerminaField.cpp
@@ -511,6 +511,42 @@ static RegisterShipInitFunc initFunc([]() {
CHECK(RC_TERMINA_FIELD_MAN_IN_THE_TREE_RUPEE_02, true),
CHECK(RC_TERMINA_FIELD_TREE_01, true),
CHECK(RC_TERMINA_FIELD_TREE_02, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_01, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_02, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_03, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_04, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_05, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_06, CAN_BE_GORON && HAS_MAGIC),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_07, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_08, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_09, CAN_BE_GORON && HAS_MAGIC),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_10, CAN_BE_GORON && HAS_MAGIC),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_11, CAN_BE_GORON && HAS_MAGIC),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_12, CAN_USE_PROJECTILE || HAS_ITEM(ITEM_BOMBCHU)),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_13, CAN_USE_PROJECTILE || HAS_ITEM(ITEM_BOMBCHU)),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_14, CAN_USE_PROJECTILE || HAS_ITEM(ITEM_BOMBCHU)),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_15, CAN_USE_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_16, CAN_USE_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_17, CAN_USE_SWORD || CAN_BE_GORON || CAN_USE_PROJECTILE || CAN_USE_EXPLOSIVE || HAS_ITEM(ITEM_DEKU_STICK) || HAS_ITEM(ITEM_DEKU_NUT)),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_18, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_19, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_20, true),
+ CHECK(RC_TERMINA_FIELD_WONDER_ITEM_21, true),
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_01, canPlaySong(OCARINA_SONG_TERMINA_WALL) && IS_DAY()), // Only obtainable 6-7 A.M.
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_02, canPlaySong(OCARINA_SONG_TERMINA_WALL) && IS_DAY()), // Only obtainable 6-7 A.M.
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_03, canPlaySong(OCARINA_SONG_TERMINA_WALL) && IS_DAY()), // Only obtainable 6-7 A.M.
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_04, canPlaySong(OCARINA_SONG_TERMINA_WALL)),
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_05, canPlaySong(OCARINA_SONG_TERMINA_WALL)),
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_06, canPlaySong(OCARINA_SONG_TERMINA_WALL)),
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_07, canPlaySong(OCARINA_SONG_TERMINA_WALL)),
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_08, canPlaySong(OCARINA_SONG_TERMINA_WALL)),
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_09, canPlaySong(OCARINA_SONG_TERMINA_WALL) && IS_NIGHT()), // Only obtainable 8-9 P.M. and 4-5 A.M.
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_10, canPlaySong(OCARINA_SONG_TERMINA_WALL) && IS_NIGHT()), // Only obtainable 8-9 P.M. and 4-5 A.M.
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_11, canPlaySong(OCARINA_SONG_TERMINA_WALL) && IS_NIGHT()), // Only obtainable 8-9 P.M. and 4-5 A.M.
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_12, canPlaySong(OCARINA_SONG_TERMINA_WALL)),
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_13, canPlaySong(OCARINA_SONG_TERMINA_WALL)),
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_14, canPlaySong(OCARINA_SONG_TERMINA_WALL)),
+ CHECK(RC_TERMINA_FIELD_WALL_WONDER_ITEM_15, canPlaySong(OCARINA_SONG_TERMINA_WALL)),
CHECK(RC_ENEMY_DROP_BLUE_BUBBLE, CanKillEnemy(ACTOR_EN_BB) && IS_NIGHT()), // Night only
CHECK(RC_ENEMY_DROP_DEKU_BABA, CanKillEnemy(ACTOR_EN_DEKUBABA)),
CHECK(RC_ENEMY_DROP_CHUCHU, CanKillEnemy(ACTOR_EN_SLIME) && IS_DAY()), // Day only
diff --git a/mm/2s2h/Rando/Menu.cpp b/mm/2s2h/Rando/Menu.cpp
index 0b4e969ff..5be6cbd1f 100644
--- a/mm/2s2h/Rando/Menu.cpp
+++ b/mm/2s2h/Rando/Menu.cpp
@@ -348,6 +348,7 @@ static RegisterShipInitFunc refreshMetricsInit(RefreshMetrics, {
"gRando.Options.RO_SHUFFLE_TREE_DROPS",
"gRando.Options.RO_SHUFFLE_TYCOON_WALLET",
"gRando.Options.RO_SHUFFLE_TRIFORCE_PIECES",
+ "gRando.Options.RO_SHUFFLE_WONDER_ITEMS",
"gRando.Options.RO_SKULLTULA_TOKENS_MAX",
"gRando.Options.RO_SKULLTULA_TOKENS_REQUIRED",
"gRando.Options.RO_STARTING_CONSUMABLES",
@@ -616,8 +617,7 @@ static void DrawShufflesTab() {
CVarCheckbox("Shuffle Frogs", Rando::StaticData::Options[RO_SHUFFLE_FROGS].cvar);
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" } }));
+ CVarCheckbox("Shuffle Wonder Items", Rando::StaticData::Options[RO_SHUFFLE_WONDER_ITEMS].cvar);
ImGui::EndChild();
ImGui::SameLine();
ImGui::BeginChild("randoLocationsColumn3", ImVec2(columnWidth, halfHeight));
diff --git a/mm/2s2h/Rando/StaticData/Checks.cpp b/mm/2s2h/Rando/StaticData/Checks.cpp
index d270063da..cfb0e9126 100644
--- a/mm/2s2h/Rando/StaticData/Checks.cpp
+++ b/mm/2s2h/Rando/StaticData/Checks.cpp
@@ -2394,6 +2394,121 @@ std::map<RandoCheckId, RandoStaticCheck> Checks = {
RC(RC_TERMINA_FIELD_COW_GROTTO_BUTTERFLY_03, RCTYPE_BUTTERFLY, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_NONE),
RC(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_BUTTERFLY_01, RCTYPE_BUTTERFLY, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_NONE),
RC(RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_BUTTERFLY_02, RCTYPE_BUTTERFLY, SCENE_KAKUSIANA, FLAG_NONE, 0x0, RI_NONE),
+
+ // Wonder Items
+ RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_04, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_05, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_06, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_07, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_08, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_EAST_WONDER_ITEM_09, RCTYPE_WONDER_ITEM, SCENE_TOWN, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_CLOCKTOWER, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_CLOCKTOWER, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_CLOCKTOWER, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CUCCO_SHACK_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_F01C, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CUCCO_SHACK_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_F01C, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CUCCO_SHACK_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_F01C, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CUCCO_SHACK_WONDER_ITEM_04, RCTYPE_WONDER_ITEM, SCENE_F01C, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CUCCO_SHACK_WONDER_ITEM_05, RCTYPE_WONDER_ITEM, SCENE_F01C, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_CUCCO_SHACK_WONDER_ITEM_06, RCTYPE_WONDER_ITEM, SCENE_F01C, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_04, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_05, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_06, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_07, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_08, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_09, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_10, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_11, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_IKANA_GRAVEYARD_WONDER_ITEM_12, RCTYPE_WONDER_ITEM, SCENE_BOTI, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_04, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_05, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_06, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_07, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_08, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_09, RCTYPE_WONDER_ITEM, SCENE_KINDAN2, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_PIRATE_FORTRESS_INTERIOR_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_PIRATE, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_PIRATE_FORTRESS_INTERIOR_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_PIRATE, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_PIRATE_FORTRESS_INTERIOR_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_PIRATE, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_KAIZOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_KAIZOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_KAIZOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_04, RCTYPE_WONDER_ITEM, SCENE_KAIZOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_05, RCTYPE_WONDER_ITEM, SCENE_KAIZOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_06, RCTYPE_WONDER_ITEM, SCENE_KAIZOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_ROMANI_RANCH_BARN_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_OMOYA, FLAG_CYCL_SCENE_COLLECTIBLE, 0x1, RI_RUPEE_BLUE),
+ RC(RC_ROMANI_RANCH_BARN_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_OMOYA, FLAG_CYCL_SCENE_COLLECTIBLE, 0x2, RI_RUPEE_BLUE),
+ RC(RC_ROMANI_RANCH_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_F01, FLAG_CYCL_SCENE_COLLECTIBLE, 0xA, RI_RUPEE_BLUE),
+ RC(RC_ROMANI_RANCH_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_F01, FLAG_CYCL_SCENE_COLLECTIBLE, 0xB, RI_RUPEE_BLUE),
+ RC(RC_ROMANI_RANCH_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_F01, FLAG_CYCL_SCENE_COLLECTIBLE, 0xC, RI_RUPEE_GREEN),
+ RC(RC_ROMANI_RANCH_WONDER_ITEM_04, RCTYPE_WONDER_ITEM, SCENE_F01, FLAG_CYCL_SCENE_COLLECTIBLE, 0xD, RI_RUPEE_GREEN),
+ RC(RC_ROMANI_RANCH_WONDER_ITEM_05, RCTYPE_WONDER_ITEM, SCENE_F01, FLAG_CYCL_SCENE_COLLECTIBLE, 0xE, RI_RUPEE_GREEN),
+ RC(RC_ROMANI_RANCH_WONDER_ITEM_06, RCTYPE_WONDER_ITEM, SCENE_F01, FLAG_CYCL_SCENE_COLLECTIBLE, 0xF, RI_RUPEE_GREEN),
+ RC(RC_STOCK_POT_INN_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_YADOYA, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_STOCK_POT_INN_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_YADOYA, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_STOCK_POT_INN_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_YADOYA, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_CYCL_SCENE_COLLECTIBLE, 0x25, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_CYCL_SCENE_COLLECTIBLE, 0x26, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_CYCL_SCENE_COLLECTIBLE, 0x27, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_04, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_CYCL_SCENE_COLLECTIBLE, 0x28, RI_RUPEE_BLUE),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_05, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_CYCL_SCENE_COLLECTIBLE, 0x29, RI_RUPEE_RED),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_06, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_07, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_08, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_09, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_10, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_11, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_12, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_13, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_14, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_15, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_16, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_17, RCTYPE_WONDER_ITEM, SCENE_KINSTA1, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_SWORDSMAN_SCHOOL_WONDER_ITEM, RCTYPE_WONDER_ITEM, SCENE_DOUJOU, FLAG_NONE, 0x0, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_RED),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_RED),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_RED),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_04, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_RED),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_05, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_06, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_07, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_08, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_09, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_10, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_RED),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_11, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_12, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_13, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_14, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WALL_WONDER_ITEM_15, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_01, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x13, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_02, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x17, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_03, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x18, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_04, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x19, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_05, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x1A, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_06, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x11, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_07, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x1B, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_08, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x1C, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_09, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x1D, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_10, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x1E, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_11, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_CYCL_SCENE_COLLECTIBLE, 0x1F, RI_RUPEE_BLUE),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_12, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_13, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_14, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_15, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_16, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_17, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_18, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_19, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_20, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_GREEN),
+ RC(RC_TERMINA_FIELD_WONDER_ITEM_21, RCTYPE_WONDER_ITEM, SCENE_00KEIKOKU, FLAG_NONE, 0x0, RI_RUPEE_RED),
};
// clang-format on
diff --git a/mm/2s2h/Rando/StaticData/Options.cpp b/mm/2s2h/Rando/StaticData/Options.cpp
index 8427d6d6d..d06fab31e 100644
--- a/mm/2s2h/Rando/StaticData/Options.cpp
+++ b/mm/2s2h/Rando/StaticData/Options.cpp
@@ -71,6 +71,7 @@ std::map<RandoOptionId, RandoStaticOption> Options = {
RO(RO_SHUFFLE_TYCOON_WALLET, RO_GENERIC_OFF),
RO(RO_SHUFFLE_TREE_DROPS, RO_GENERIC_OFF),
RO(RO_SHUFFLE_TRIFORCE_PIECES, RO_GENERIC_OFF),
+ RO(RO_SHUFFLE_WONDER_ITEMS, RO_GENERIC_OFF),
RO(RO_SKULLTULA_TOKENS_MAX, SPIDER_HOUSE_TOKENS_REQUIRED),
RO(RO_SKULLTULA_TOKENS_REQUIRED, SPIDER_HOUSE_TOKENS_REQUIRED),
RO(RO_STARTING_CONSUMABLES, RO_GENERIC_OFF),
diff --git a/mm/2s2h/Rando/Types.h b/mm/2s2h/Rando/Types.h
index 55ccb62d6..3000cade9 100644
--- a/mm/2s2h/Rando/Types.h
+++ b/mm/2s2h/Rando/Types.h
@@ -26,6 +26,7 @@ typedef enum {
RCTYPE_STRAY_FAIRY,
RCTYPE_TINGLE_SHOP,
RCTYPE_TREE,
+ RCTYPE_WONDER_ITEM,
RCTYPE_MAX,
} RandoCheckType;
@@ -2398,6 +2399,120 @@ typedef enum {
RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_BUTTERFLY_01,
RC_TERMINA_FIELD_GOSSIP_STONE_GROTTO_3_BUTTERFLY_02,
+ RC_CLOCK_TOWN_EAST_WONDER_ITEM_01,
+ RC_CLOCK_TOWN_EAST_WONDER_ITEM_02,
+ RC_CLOCK_TOWN_EAST_WONDER_ITEM_03,
+ RC_CLOCK_TOWN_EAST_WONDER_ITEM_04,
+ RC_CLOCK_TOWN_EAST_WONDER_ITEM_05,
+ RC_CLOCK_TOWN_EAST_WONDER_ITEM_06,
+ RC_CLOCK_TOWN_EAST_WONDER_ITEM_07,
+ RC_CLOCK_TOWN_EAST_WONDER_ITEM_08,
+ RC_CLOCK_TOWN_EAST_WONDER_ITEM_09,
+ RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_01,
+ RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_02,
+ RC_CLOCK_TOWN_SOUTH_WONDER_ITEM_03,
+ RC_CUCCO_SHACK_WONDER_ITEM_01,
+ RC_CUCCO_SHACK_WONDER_ITEM_02,
+ RC_CUCCO_SHACK_WONDER_ITEM_03,
+ RC_CUCCO_SHACK_WONDER_ITEM_04,
+ RC_CUCCO_SHACK_WONDER_ITEM_05,
+ RC_CUCCO_SHACK_WONDER_ITEM_06,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_01,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_02,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_03,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_04,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_05,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_06,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_07,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_08,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_09,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_10,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_11,
+ RC_IKANA_GRAVEYARD_WONDER_ITEM_12,
+ RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_01,
+ RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_02,
+ RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_03,
+ RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_04,
+ RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_05,
+ RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_06,
+ RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_07,
+ RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_08,
+ RC_OCEAN_SPIDER_HOUSE_WONDER_ITEM_09,
+ RC_PIRATE_FORTRESS_INTERIOR_WONDER_ITEM_01,
+ RC_PIRATE_FORTRESS_INTERIOR_WONDER_ITEM_02,
+ RC_PIRATE_FORTRESS_INTERIOR_WONDER_ITEM_03,
+ RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_01,
+ RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_02,
+ RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_03,
+ RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_04,
+ RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_05,
+ RC_PIRATE_FORTRESS_PLAZA_WONDER_ITEM_06,
+ RC_ROMANI_RANCH_BARN_WONDER_ITEM_01,
+ RC_ROMANI_RANCH_BARN_WONDER_ITEM_02,
+ RC_ROMANI_RANCH_WONDER_ITEM_01,
+ RC_ROMANI_RANCH_WONDER_ITEM_02,
+ RC_ROMANI_RANCH_WONDER_ITEM_03,
+ RC_ROMANI_RANCH_WONDER_ITEM_04,
+ RC_ROMANI_RANCH_WONDER_ITEM_05,
+ RC_ROMANI_RANCH_WONDER_ITEM_06,
+ RC_STOCK_POT_INN_WONDER_ITEM_01,
+ RC_STOCK_POT_INN_WONDER_ITEM_02,
+ RC_STOCK_POT_INN_WONDER_ITEM_03,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_01,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_02,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_03,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_04,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_05,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_06,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_07,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_08,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_09,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_10,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_11,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_12,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_13,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_14,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_15,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_16,
+ RC_SWAMP_SPIDER_HOUSE_WONDER_ITEM_17,
+ RC_SWORDSMAN_SCHOOL_WONDER_ITEM,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_01,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_02,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_03,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_04,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_05,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_06,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_07,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_08,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_09,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_10,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_11,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_12,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_13,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_14,
+ RC_TERMINA_FIELD_WALL_WONDER_ITEM_15,
+ RC_TERMINA_FIELD_WONDER_ITEM_01,
+ RC_TERMINA_FIELD_WONDER_ITEM_02,
+ RC_TERMINA_FIELD_WONDER_ITEM_03,
+ RC_TERMINA_FIELD_WONDER_ITEM_04,
+ RC_TERMINA_FIELD_WONDER_ITEM_05,
+ RC_TERMINA_FIELD_WONDER_ITEM_06,
+ RC_TERMINA_FIELD_WONDER_ITEM_07,
+ RC_TERMINA_FIELD_WONDER_ITEM_08,
+ RC_TERMINA_FIELD_WONDER_ITEM_09,
+ RC_TERMINA_FIELD_WONDER_ITEM_10,
+ RC_TERMINA_FIELD_WONDER_ITEM_11,
+ RC_TERMINA_FIELD_WONDER_ITEM_12,
+ RC_TERMINA_FIELD_WONDER_ITEM_13,
+ RC_TERMINA_FIELD_WONDER_ITEM_14,
+ RC_TERMINA_FIELD_WONDER_ITEM_15,
+ RC_TERMINA_FIELD_WONDER_ITEM_16,
+ RC_TERMINA_FIELD_WONDER_ITEM_17,
+ RC_TERMINA_FIELD_WONDER_ITEM_18,
+ RC_TERMINA_FIELD_WONDER_ITEM_19,
+ RC_TERMINA_FIELD_WONDER_ITEM_20,
+ RC_TERMINA_FIELD_WONDER_ITEM_21,
+
RC_MAX,
} RandoCheckId;
@@ -3033,6 +3148,7 @@ typedef enum {
RO_SHUFFLE_TYCOON_WALLET,
RO_SHUFFLE_TREE_DROPS,
RO_SHUFFLE_TRIFORCE_PIECES,
+ RO_SHUFFLE_WONDER_ITEMS,
RO_SKULLTULA_TOKENS_MAX,
RO_SKULLTULA_TOKENS_REQUIRED,
RO_STARTING_CONSUMABLES,
diff --git a/mm/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c b/mm/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
index ef051de4f..532fe699d 100644
--- a/mm/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
+++ b/mm/src/overlays/actors/ovl_Obj_Dora/z_obj_dora.c
@@ -6,6 +6,7 @@
#include "z_obj_dora.h"
#include "assets/objects/object_dora/object_dora.h"
+#include "GameInteractor/GameInteractor.h"
#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED)
@@ -284,11 +285,13 @@ void ObjDora_UpdateCollision(ObjDora* this, PlayState* play) {
if ((ObjDora_IsHalfHour(time) == true) && (this->rupeeDropTimer == 0)) {
Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
- itemDrop = Item_DropCollectible(play, &this->actor.world.pos, ITEM00_RUPEE_BLUE);
- itemDrop->world.rot.y = this->actor.world.rot.y;
- itemDrop->world.rot.y += (s32)DEG_TO_BINANG_ALT3(Rand_Centered() * 90.0f);
- itemDrop->velocity.y = 5.0f;
- itemDrop->gravity = -1.0f;
+ if (GameInteractor_Should(VB_GONG_DROP_COLLECTIBLE, true, this)) {
+ itemDrop = Item_DropCollectible(play, &this->actor.world.pos, ITEM00_RUPEE_BLUE);
+ itemDrop->world.rot.y = this->actor.world.rot.y;
+ itemDrop->world.rot.y += (s32)DEG_TO_BINANG_ALT3(Rand_Centered() * 90.0f);
+ itemDrop->velocity.y = 5.0f;
+ itemDrop->gravity = -1.0f;
+ }
this->rupeeDropTimer = 40;
}
break;