From 47c653a0e539559dab449a81a6bf2c95e8280890 Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Wed, 26 Mar 2025 16:32:32 -0400 Subject: [PATCH] [Rando] Shuffle Crates (#5017) * location list + enums * add identity function * add new files + hook handlers + settings + crate struct * add dungeon struct + large crate locations * fix wasteland name + add overworld hints * add dungeon hints * add to item pool * opt desc + check tracker + overworld locs * add VB funcs + fix fire locs + dmc crate + shuffle crates not pots again * fix crate option def * fix gy crate area * add ow locs * context + more location_list * fix kak crate * add gv child crates + make exceptions for OOB GF crates + fix GF rht name * finish adding gv crates + align GF child crates + fix adult GF locs * fix VB draw + adjust color * begin logic * add child archery crate + overworld logic * deku + dc + rename dc locs * gtg + spirit * fire temple logic * start water temple + some renaming * finish water temple + renames * fix dmc crate * remove child GV + GF crates :( + simplify hints + french * fix dungeon hint + add french attempt * cleanup * smol crate loc list + enums * setup small crates * fix fire temple fairy hints * add logic * fix small crates + locs * align GF crates without moving * add child GV-GF crates for No Logic * convert to shipinit * whitespace * remove old comments * assets * proper cap * better comments on not-shuffled crates * update for context changes * update for rest of context changes * cleanup * fix shadow hint RHT * more cleanup * count to three * child gf logic * gv cow crate * loc list spacing * remove redundant small crates * remove left over vb funcs * split out location list * fix van spawns * move NL crates to new type * rm whitespace * more whitespacing * more more whitespace * update VB * restore support for custom models * prep dungeon for develop * update context for location changes * finish context post-develop merge * add heart crates to CSMC * update loc list + logic fix * update breakroom crates to adult only * newline to make github happy * revise vbshoulds * formatting sheesh * update vb info * BRACKET * whitespacent * ws finalfinal --- .../objects/object_kibako/bosskey_crate_top | Bin 0 -> 8284 bytes .../object_kibako/gSmallBossKeyCrateDL | 14 + .../object_kibako/gSmallBossKeyCrateDL_tri_0 | 11 + .../object_kibako/gSmallBossKeyCrateDL_vtx_0 | 26 + .../gSmallBossKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallHeartCrateDL | 14 + .../object_kibako/gSmallHeartCrateDL_tri_0 | 11 + .../object_kibako/gSmallHeartCrateDL_vtx_0 | 26 + .../object_kibako/gSmallHeartCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallJunkCrateDL | 14 + .../object_kibako/gSmallJunkCrateDL_tri_0 | 11 + .../object_kibako/gSmallJunkCrateDL_vtx_0 | 26 + .../object_kibako/gSmallJunkCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallMajorCrateDL | 14 + .../object_kibako/gSmallMajorCrateDL_tri_0 | 11 + .../object_kibako/gSmallMajorCrateDL_vtx_0 | 26 + .../object_kibako/gSmallMajorCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallMinorCrateDL | 14 + .../object_kibako/gSmallMinorCrateDL_tri_0 | 11 + .../object_kibako/gSmallMinorCrateDL_vtx_0 | 26 + .../object_kibako/gSmallMinorCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallRandoCrateDL | 14 + .../object_kibako/gSmallRandoCrateDL_tri_0 | 11 + .../object_kibako/gSmallRandoCrateDL_vtx_0 | 26 + .../object_kibako/gSmallRandoCrateDL_vtx_cull | 10 + .../object_kibako/gSmallSmallKeyCrateDL | 14 + .../object_kibako/gSmallSmallKeyCrateDL_tri_0 | 11 + .../object_kibako/gSmallSmallKeyCrateDL_vtx_0 | 26 + .../gSmallSmallKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako/gSmallTokenCrateDL | 14 + .../object_kibako/gSmallTokenCrateDL_tri_0 | 11 + .../object_kibako/gSmallTokenCrateDL_vtx_0 | 26 + .../object_kibako/gSmallTokenCrateDL_vtx_cull | 10 + .../objects/object_kibako/heart_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/junk_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/major_crate_top | Bin 0 -> 8284 bytes ...lBossKeyCrateDL_f3dlite_smallcrate_bosskey | 21 + ...SmallHeartCrateDL_f3dlite_smallcrate_heart | 21 + ..._gSmallJunkCrateDL_f3dlite_smallcrate_junk | 21 + ...SmallMajorCrateDL_f3dlite_smallcrate_major | 21 + ...SmallMinorCrateDL_f3dlite_smallcrate_minor | 21 + ...SmallRandoCrateDL_f3dlite_smallcrate_rando | 21 + ...mallKeyCrateDL_f3dlite_smallcrate_smallkey | 21 + ...SmallTokenCrateDL_f3dlite_smallcrate_token | 21 + .../objects/object_kibako/minor_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/rando_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/smallkey_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako/token_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/bosskey_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/bosskey_crate_top | Bin 0 -> 8284 bytes .../object_kibako2/gLargeBossKeyCrateDL | 16 + .../object_kibako2/gLargeBossKeyCrateDL_tri_0 | 6 + .../object_kibako2/gLargeBossKeyCrateDL_tri_1 | 9 + .../object_kibako2/gLargeBossKeyCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeBossKeyCrateDL_vtx_1 | 18 + .../gLargeBossKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeHeartCrateDL | 16 + .../object_kibako2/gLargeHeartCrateDL_tri_0 | 6 + .../object_kibako2/gLargeHeartCrateDL_tri_1 | 9 + .../object_kibako2/gLargeHeartCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeHeartCrateDL_vtx_1 | 18 + .../gLargeHeartCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeJunkCrateDL | 16 + .../object_kibako2/gLargeJunkCrateDL_tri_0 | 6 + .../object_kibako2/gLargeJunkCrateDL_tri_1 | 9 + .../object_kibako2/gLargeJunkCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeJunkCrateDL_vtx_1 | 18 + .../object_kibako2/gLargeJunkCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeMajorCrateDL | 16 + .../object_kibako2/gLargeMajorCrateDL_tri_0 | 6 + .../object_kibako2/gLargeMajorCrateDL_tri_1 | 9 + .../object_kibako2/gLargeMajorCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeMajorCrateDL_vtx_1 | 18 + .../gLargeMajorCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeMinorCrateDL | 16 + .../object_kibako2/gLargeMinorCrateDL_tri_0 | 6 + .../object_kibako2/gLargeMinorCrateDL_tri_1 | 9 + .../object_kibako2/gLargeMinorCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeMinorCrateDL_vtx_1 | 18 + .../gLargeMinorCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeRandoCrateDL | 16 + .../object_kibako2/gLargeRandoCrateDL_tri_0 | 6 + .../object_kibako2/gLargeRandoCrateDL_tri_1 | 9 + .../object_kibako2/gLargeRandoCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeRandoCrateDL_vtx_1 | 18 + .../gLargeRandoCrateDL_vtx_cull | 10 + .../object_kibako2/gLargeSmallKeyCrateDL | 16 + .../gLargeSmallKeyCrateDL_tri_0 | 6 + .../gLargeSmallKeyCrateDL_tri_1 | 9 + .../gLargeSmallKeyCrateDL_vtx_0 | 6 + .../gLargeSmallKeyCrateDL_vtx_1 | 18 + .../gLargeSmallKeyCrateDL_vtx_cull | 10 + .../objects/object_kibako2/gLargeTokenCrateDL | 16 + .../object_kibako2/gLargeTokenCrateDL_tri_0 | 6 + .../object_kibako2/gLargeTokenCrateDL_tri_1 | 9 + .../object_kibako2/gLargeTokenCrateDL_vtx_0 | 6 + .../object_kibako2/gLargeTokenCrateDL_vtx_1 | 18 + .../gLargeTokenCrateDL_vtx_cull | 10 + .../objects/object_kibako2/heart_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/heart_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/junk_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/junk_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/major_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/major_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/mask_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/mask_crate_top | Bin 0 -> 8284 bytes ...eBossKeyCrateDL_f3dlite_crate_side_bosskey | 21 + ...geBossKeyCrateDL_f3dlite_crate_top_bosskey | 21 + ...LargeHeartCrateDL_f3dlite_crate_side_heart | 21 + ...gLargeHeartCrateDL_f3dlite_crate_top_heart | 21 + ..._gLargeJunkCrateDL_f3dlite_crate_side_junk | 21 + ...t_gLargeJunkCrateDL_f3dlite_crate_top_junk | 21 + ...LargeMajorCrateDL_f3dlite_crate_side_major | 21 + ...gLargeMajorCrateDL_f3dlite_crate_top_major | 21 + ...LargeMinorCrateDL_f3dlite_crate_side_minor | 21 + ...gLargeMinorCrateDL_f3dlite_crate_top_minor | 21 + ...LargeRandoCrateDL_f3dlite_crate_side_rando | 21 + ...gLargeRandoCrateDL_f3dlite_crate_top_rando | 21 + ...mallKeyCrateDL_f3dlite_crate_side_smallkey | 21 + ...SmallKeyCrateDL_f3dlite_crate_top_smallkey | 21 + ...LargeTokenCrateDL_f3dlite_crate_side_token | 21 + ...gLargeTokenCrateDL_f3dlite_crate_top_token | 21 + .../objects/object_kibako2/minor_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/minor_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/rando_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/rando_crate_top | Bin 0 -> 8284 bytes .../object_kibako2/smallkey_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/smallkey_crate_top | Bin 0 -> 8284 bytes .../objects/object_kibako2/token_crate_side | Bin 0 -> 8284 bytes .../objects/object_kibako2/token_crate_top | Bin 0 -> 8284 bytes soh/assets/soh_assets.h | 48 ++ .../vanilla-behavior/GIVanillaBehavior.h | 32 + .../hint_list/hint_list_exclude_dungeon.cpp | 37 +- .../hint_list/hint_list_exclude_overworld.cpp | 40 ++ .../randomizer/3drando/item_pool.cpp | 12 + .../Enhancements/randomizer/ShuffleCrates.cpp | 548 ++++++++++++++++++ .../Enhancements/randomizer/ShuffleCrates.h | 16 + soh/soh/Enhancements/randomizer/context.cpp | 15 +- soh/soh/Enhancements/randomizer/location.cpp | 24 + soh/soh/Enhancements/randomizer/location.h | 15 + .../location_access/dungeons/deku_tree.cpp | 3 + .../dungeons/dodongos_cavern.cpp | 50 +- .../location_access/dungeons/fire_temple.cpp | 59 +- .../dungeons/forest_temple.cpp | 9 +- .../dungeons/gerudo_training_ground.cpp | 6 +- .../dungeons/jabujabus_belly.cpp | 10 +- .../dungeons/shadow_temple.cpp | 10 +- .../dungeons/spirit_temple.cpp | 33 +- .../location_access/dungeons/water_temple.cpp | 186 +++++- .../location_access/gerudo_fortress.cpp | 36 ++ .../overworld/death_mountain_crater.cpp | 4 +- .../overworld/gerudo_valley.cpp | 8 +- .../location_access/overworld/goron_city.cpp | 2 + .../location_access/overworld/graveyard.cpp | 3 +- .../overworld/haunted_wasteland.cpp | 17 +- .../location_access/overworld/kakariko.cpp | 70 ++- .../location_access/overworld/lake_hylia.cpp | 3 +- .../overworld/lon_lon_ranch.cpp | 1 + .../location_access/overworld/market.cpp | 28 +- soh/soh/Enhancements/randomizer/logic.cpp | 8 + soh/soh/Enhancements/randomizer/logic.h | 2 + .../randomizer/option_descriptions.cpp | 10 + .../Enhancements/randomizer/randomizer.cpp | 311 ++++++++++ soh/soh/Enhancements/randomizer/randomizer.h | 2 + .../Enhancements/randomizer/randomizerTypes.h | 305 ++++++++++ .../randomizer/randomizer_check_objects.cpp | 3 + .../randomizer/randomizer_check_tracker.cpp | 34 ++ .../Enhancements/randomizer/randomizer_inf.h | 254 ++++++++ soh/soh/Enhancements/randomizer/settings.cpp | 3 + soh/soh/Enhancements/randomizer/static_data.h | 1 + .../actors/ovl_Obj_Kibako/z_obj_kibako.c | 7 +- .../actors/ovl_Obj_Kibako/z_obj_kibako.h | 1 + .../actors/ovl_Obj_Kibako2/z_obj_kibako2.c | 7 +- .../actors/ovl_Obj_Kibako2/z_obj_kibako2.h | 1 + 174 files changed, 3667 insertions(+), 119 deletions(-) create mode 100644 soh/assets/custom/objects/object_kibako/bosskey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako/heart_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/junk_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/major_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey create mode 100644 soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token create mode 100644 soh/assets/custom/objects/object_kibako/minor_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/rando_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/smallkey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako/token_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/bosskey_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/bosskey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 create mode 100644 soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull create mode 100644 soh/assets/custom/objects/object_kibako2/heart_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/heart_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/junk_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/junk_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/major_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/major_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/mask_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/mask_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_side_bosskey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token create mode 100644 soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token create mode 100644 soh/assets/custom/objects/object_kibako2/minor_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/minor_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/rando_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/rando_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/smallkey_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/smallkey_crate_top create mode 100644 soh/assets/custom/objects/object_kibako2/token_crate_side create mode 100644 soh/assets/custom/objects/object_kibako2/token_crate_top create mode 100644 soh/soh/Enhancements/randomizer/ShuffleCrates.cpp create mode 100644 soh/soh/Enhancements/randomizer/ShuffleCrates.h diff --git a/soh/assets/custom/objects/object_kibako/bosskey_crate_top b/soh/assets/custom/objects/object_kibako/bosskey_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..4b055671e4805a8800f673465022fcc70335858d GIT binary patch literal 8284 zcmd^EPiPxw7I*d%8xd+FmW?nWI|x%mSQdK^3%cyqCX{Fprk*vsWe{c=j46{+g58@A zyF?~*BVmFigwqHiJHlj>A%u45Nx4PFl**VA31ea-d z>ehJXFmo_nRmvQgHJPDu6JB-s&;WtNNok}`BU76-gA$_VN^=jv= zoSh@0+jkoHfCG*qeu%&|bzOO4lT*$bBrAszc#7G0F5j4gRVtb4>HG-)%zTc{95{{Z z$(0GGL1Z%#${+B`6@yhH)CH&R)bVS<#<$$-@0=YxjnFP}4pDH0ESM3_X>bM6RCOik zo~%r`Cz)zGt{Mn+79oZbV|IwC$XI0ocMZAL-9Gh5&V+l;BBJ1PEuDi=C;Zq8s_p#Z z$^<`lZn_Hm9yBmd`>Q@N513qoI3QdF2S|FS>){R8<;r|>hV0znGq(?k`_#)cBu-oT zrThftcN&yFZP9N?w0WR6kzXWJDTD*T1>#DQ>j8mJMKb;h?vR`qX;@X*bK$9h zQ4RNGnS4Ud{33LnwCvRW*oa|{?j%OQeS>nRt;zk=UTP0qfl_-@&`sI`2O34V(uPWo zAi2<(O}i*E^$zZAXmKuxJC$HgG#P4T`2>>Ar}h#tqcplRdTZ$1|2GZK1hhH~`h_m^ z-Rkg7ju`^sTgF9K9r0gRjts{0dr-&W8Z%gRb$BK*qGXtCyQJWE z4A120**9YtHzp(XiWxgf;6`{Do{=?7nID7yo0I!fV`=((g?Rc}=%= z#jR(0o_F-FootwOTqg_qee5bkcua+|C@heb4Lu)OtZ`|K9sl{R6s#o>F_7 zX$_N_XD!Gtt$+jKuOywinSh;k((wQv(U;oO{)ts`a^JD;J@>zC9e@rypHKtP7Hr-5 z-1FMYo@bA{#~q*2`ycrqwJM#*<(H^rv>tp!{9p8MWLc%D`@*(Xey73u>C|bfNPc7q z;+qNWQKsUV?~Chx&EIHMTZhoVV`BPV_s!9p&JBFNYA+N0=xwXw&jP>Nd9q>;zNE^Zh8PC$?Zq-@21x1jRE_w z(SAmW8l(^9<1I+<&w5#ZwpD?RH~bC%uV1f!U3rv!WP0!UmG))7%D4V(JK1zq`?LV^ z<{tb{YKsvQ-xm)M|4XuW6D=eEI+6SrcPIDJhcV9~n}MqNORdA!3qR|b-Uw;yi_P1c z=EirM7dEq-rAM(x*X}<9?cCq>V(nzXK~`t()Xa!_5BZ`0i@WeQ=|Mzx_#Qh-^n2)h z;lU>=KdTb*UC{57yUf9IzjpcFVL4m8R{XH|;q5Q}X$Eu~-?#r|-oAEo_2#piJ2!WV zv*mgk85a@E=oLz#*I@h&UnL4WU%Y^sNOvFfG%FY8{|Fy`q1|-mpwR5xXdBSKN^fpt zL9-k0HP#y6HTM3!w)yS7tCXJJS8TA4k_-&bnL_+X{GS8<488n1a-UPb4&6ik96HaO z#oYydMgAxGN4nvPWWagbemaTFRssHb@BG#^pkDy~1zKREw7CZx?Bd;pXUDDM>3O2k z@=_g87ZNe8Kf_l?QGt;C(SHLU5^MgEdW0vD|J^dOw4itq)}nWMpLUkJkNtIez@weJ zCa{&DiOuX*?9sQriO5ejCnP&!E;BcINbM(r`Zu~WH3o^G_iTwBEB)BjWw;L--&xaQ{PaPzpJ?Yu+D`$h_>ol-(peMr$+Hp#B5=#0Yj7!A`^x z+e3bEK>X{-$q_#5kJSF@D($D4V8uX&eb;^;I)DbYzSy`e_@#}~mPGxt!_HFP;ZA~H z6YOSSKgb``{0r?@X>0CofD2U719mU03a9vq5yYQ#|JBeZpF4>d1Qqbi2EhmCbBus{*2aFA7BSS*+zHR=`fz?Z?w8}0>EZgj_^NF ze9>S<@)$S(AxC)L)5)WE-6yI8csybreiv(PJWaJ;J2`p^vl+cs;$Ll8g8YcTi@U71 z8qw4e@!1DRM}V9h=wIuPW}X0<=*;Ive4?SeBsul*!> zPOV9&2QNe(W&K6|8C@0I^e7E�DB>zxP+<{Aca3>01sa@&#-EWS5 zMm9h;^t1kY*X#KH>%t-|){`0IVq?gsCkUB?sWGiTi4poGKFEx`vm$(U1o`bye&jzZ zSc$9H+NCHLPQCc*>14-;A7-g}`2AL)X(59JGq~qROlek;+2d&|F(UQPG!v9tZAtl& zhnbHj;QgqGijOR1Lena>c&c)c=_1DOgiZ1h^XI0{^7)3%>&CQSrRL7n+O_XjN-A?a)(> zXcOswcIkhHsqcEPm-h|3JS`yW}2o zuK?d?y*zXB!;`G(YHB~|KeGBeYp3#wH~vqxlv`(~!A>eT z?_kWJznre30wMoM{3G_oQ@{b_$1Z?98Sg^>8(t+oJ)*EpQe3$Lm+17Gqc`YAiC^;9 z+LzmxJ4>C<@{Z&PMl~qp!KsJ%Mx=kS0Ps16HOOAz%7OgApQHRDZ=eNa2NJnq&L}niYF<28Y`~qj z$d6tCvW56FMpp5O3Sxyqx57@v!s#y0MVwmq4eU=1%(m9MZ;yUPXMkNvp-G9Pr-<^W zHIRRq*F|=TK{-`hU>`vHNBW;J%uJP55dw$wBCg3is9Y4bkN?lmodmFOk1%2D)VouL>bQFb4@b+yPW+jM@?jJczWH>;6Tv=5E-ZT;i|OoS$rc4-YUR{28fS+FLcFDpZ$(K9@?M#FLq}n z`n*zTdpv_=gGAg=o76ecVP#Y-)o*G~_a9gn_QcKz=T$__9I#Kt2d5u+win=YpEQC| zsC?W->Dd-*i`Eo5?b}P8o(@LmeR5KWUpV*520O44Prc(xh-KKm|w8=ilzhL!~$&s~LhGR9oQdL@!#r^cNde}}ub z@O%@Ji9Vn;eUE*WoDcFBy$R6=#;> zUM=_X|2f`;vrS|bb~eG=1b6h|JATVZ^%?Oe{%=fuh#Bn^2~Q)BlQGenSh+Wtf4C-A zwNH6aJou(|zu`(i)s^(yOemi^TJO0o-{Km0y!bsiv9;q2`_6DB&JKFgFcxH{%tN>OA3n6F zatd^4j63m=2jyR$D-Xm#Z_CwrWfc}W48HM;D=O(Tjyp@_G2}^Wi|#{3bE?Ay<$&C9 zuE-3XqHamXl#%cr%&zcVh{SuWZp-)xSNQ#fFX{~CGr+>!U^aCSo)9qCqn3w#1Z#ng zr&h?lpveqD#hqwVye5zvJCWcn(uCSc^^5W7PgEwY++qDD7s3g$z0`kH9nl7T1Kg5- z;X0w~3;&_~(87RE$au-;qFbpVtSEZ+A-*OY$jXYV|I?L`z}IKQ#GVbSiHG$<=|y(c WAFh-OtATfp(+{78qk`|i*Z%`M1f4Vh literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL new file mode 100644 index 000000000..c42484ebe --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 new file mode 100644 index 000000000..96b7903de --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallBossKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL new file mode 100644 index 000000000..1fd3a1f8b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 new file mode 100644 index 000000000..bbcb5c4c9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallHeartCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL new file mode 100644 index 000000000..e0d09ffa4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 new file mode 100644 index 000000000..a0af63d7f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallJunkCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL new file mode 100644 index 000000000..9999462e6 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 new file mode 100644 index 000000000..6eea14d8c --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMajorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL new file mode 100644 index 000000000..8237aa0e7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 new file mode 100644 index 000000000..c1c8d6cfc --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallMinorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL new file mode 100644 index 000000000..17467a73b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 new file mode 100644 index 000000000..6df8755b2 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallRandoCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL new file mode 100644 index 000000000..e3cc0ebe1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 new file mode 100644 index 000000000..692fd7ec3 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallSmallKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL new file mode 100644 index 000000000..dc73b6089 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 new file mode 100644 index 000000000..88a23f0e7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_tri_0 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 new file mode 100644 index 000000000..1a288d213 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_0 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull new file mode 100644 index 000000000..9b63c4a72 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/gSmallTokenCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/heart_crate_top b/soh/assets/custom/objects/object_kibako/heart_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..f5b47bd092e88a063328f34c17caf883277ded00 GIT binary patch literal 8284 zcmd^EPe>eD8rSt;`XH?gi=9JAhapVM9M;_2)3!7VDTYBB7j}y#tihAyFyy+w-}k*&)skIy@9Rfb zy{dZe{l0(i`@Z+=>FMeD%OC$V(Tn@p-=B2&L-T+B`we=g%})p2{X zn3xSX#tk*VQQ^GWrk-?UJJ)6##1`B3S>Afkos8EJhELBi{exV47QdX2KENwX$|iY@S$C+DR2*5A}bCh&=%%`{m4Z@T4<|$!k_T!3y*?Md`ir@A#pj~ zDjpQT0WCmu`VC2a5WQ$;UVTcQYkMjI5Y=w99p=N+4By2m8J`TrsagIgbN+M1&QG{b zx;0i#Ws;dxrg)g2m>Hmkh*sPiqRT?diwZ{9$`yKpc4SA3r z6nMc+%sCUE8E~l=pb9^f0^E5%c&=bfC0mivezt;sZSZ5rYdig;Wy(I-JJ{Rve@+*A zEq$mB`{l#?U^wc-Zy&xnujBLIlbJ*&(VL(zmQ&@Z=LOgX@8Km%YYLv5V_Tv zFQBI#sdsogeGmQ)kMSdX_$EAL6rPA5uUHklYKv=xZ@S5TmHr%4N|nT$Awj}$Fqq+p z^zL|ndKW&AJF^a>Wey%%ShDz(9q3qx8VfWtF{4C3ZE>Ai(%7L_%nt<1AJ-b^PGqn$ z7~QaP3`ulnWbi*){;S1@p88VYl{`{E=8pEiBh^VLf2b!|w3H;l#%h6N8Ii_eJOm=5 zW+ARwrZ6#o=zsL^qQxJC^h8(wX&;e?_|RTjVx+!dTlfQyR$AJNny20q;z!p0$r7Zl zFj5!djFgD`i1fKO<5KZ(`DKI;-Kz#gcGaoobwS)!oda9!7-5qK;0ro9=mUWZ8)p(3 z=0VC{WK4_~fsgEkH_TJT1B;*N9W6(45j`zA0htxV9A&>MXVI0quzE1sgFRBu>(_{CAzk(b?Ym&ef*3v$k`(wdUW*eg;jHmBtY5)dNz*2M3Ce z`x3N){Fn&U^z9R>aU%U>IOVv?C-lzU^KDCt}h~!UYBAebE+I|cP-|d|~ zd(-rQ@~Y`IYdc?UeZ2W)r*ZslXS#k|JE~VVhHI1cvCV$vp*}u0Sw0Lh}Wq-pBZg(0tL};&%hkf?Uz6#P9$1{_x*cEAemR`t6Q?C-~a` z+Q;3m996%6@=5-I8%V5grGQV_F7#$&y7ndZ`0%{SELI=!5tk;c{K-su7g3s(R|VcR z-MmbhYeOrGKkSqAY5l=EB)3ni(9Atbzj$wPb?E8k7junU{&%_xt^O|{t5NF0K(39S zPyNrfxpQC?wD@9w*j=+u>(gJZ)~nR=$^mQ)O)KL1q;dg|z&HL@C;1h$xUyfbb{fH1 z>4ro@WB|24v%2fdDt4TRh(B$Of!+8v{=e! zAsigkk2~K4XZdCIKa0=&3yHA;BKet-s0FMFqyHXo$^63==)@jfc{){pwf=Ggo<`&l z|H#M>$=8nrUpP>%nl;LQGtTwL_@nYCN)GmNTFZ0a!pa+a1o$9y0>4!I6MwX%HMsj( z^)=S?4N3^2{>cNSrOrd5MpSQ%0OBR}xP2f)MnGWj4!M)R-^ziq9(Xv{oN@9V~A4&e^h?8;z$ z?o~`wj_{#<;&bh8zJ>qS=z&BL?Ju&WaX|b+o>ec<&>|yL>(=%Yu72*r$NN(z|7iZ@ z%-r9z4w7t04&sapR{t9RHFo5eA6}_`|KmR@hu>nY-}Ub<-0>L&?%;=Kw(!hVZ|U3k z{XaKG@-MYkVFhK^-(W9MRWjUT9%}*J9U&H5e6CVtJgiCXgLD4&$lfV)n_8F}h*rI5 zo$_n^#W&;tcW=EjS6G%AWR@`#f0D4jW_4svi8;iVS_J6xM*c2*>d48*TepsG@0~WM z>Qz}`3+iLW;uhOvfc2yLtK)Z%Jgw|_<$hB$aH>qplLx75AwSVgE<#S~j(-x9oLq&g zV|n2=fs0a$OiRVFDDsD# z)FyYPkKR4M=InFdW%g;Za~Om7nfe3%FZj?cZ6NZ?`kM_ReAJ(r-}mDj0r?+wId)2D z;S7O0CcpaRlg3E(3tjn$28Jr}&FRMD#w}-mu$L7xV~3ocU}V-AYv~RM`>%8I!~RRm z#s%05t*rI`R5^=PSIm+psg!v?pobKfwrZW(&eLZ#WWdQE4kQww3V8PB;MuO^-PQJRiqX`MdZN} zUHB#FAN7C|Px#n^rLbCN258y*#P%n@d|a<0Cc4c_!AS6!ILxUM(M9jbs(NbYkB9na zR#*L}TgmsM&bO3VXf@N2BJk!mo>J6QTv68dl zq>wETeb%j{cWwLyYRuwO7kaKrAK@O{;wLkXY7!b$E0Rl|7;E14DqOFdmwx%@)|JPv z?;lwt)~n{kveFfQ5&zZyZT#oXgz~fMW<=%*d^dg~GX_4HA-Rs&2j>=O>&dc=X>%u< z&(h=g1u_}0qI7yrpl9&d+w7|KdwNG(?9V-Ah>!S)EQ_~@fT8??k8?!!B_}+COe2cR zc@6NCFRc%Bwe!kKk5wbld452C83P#q^b88;4~U86Q1NL2#z*F)sQzO9g?&+*ur|!b zxJT#tFiyy&TI5^$I%@+ZMs*umL|ZZ^a}B?{h(E^un1OpelEgpB2Gp>F|3ujOU+@ho zJ%i{ZoZP^lwJjD8@u@$=dPIAz?KmH`OetvF5Fh!+O0V%(bw-O}hG_q-`ycgQNC6*_ zILa2=f(JY3Gq1D>bigafS_b;XH`PCVJ6U2qJc{fe5G6*bYz>X^Pe28l@UU3#*-K|3TXw`OE!Wq#A1JgLW7z4`GS zpY_VO`c-XW@f1~dx$tBApC7THtO@$FRw~+xo{WcyuhGLf+W3L2Wv*u-`Nr?~8Z-B( zuZ$xu$4WiQQG6>aOJ`QU;%o+A`WQ^KZ7;o(lk;SH%3I=~A22u{pM>D8SPA+Zv!ipU zdu?0iAOa~u;vBY*+`|#)-k$GcW-<6&D_Ap(BYFnF*o}(&+!)1Vgi%Dpx5KeA5BMQBt*L@Fl)#KdWVpX?SAv0nf}XUGq_1khPOR6b_U}`$grjTyi!=#%NeV z$V7Ey0LcORpGW3&EpubZ6^1oID`qp9t)QTwP*P5XNFY^KK+0wj6cjW`)ym9bGP9td;J^e%EP`e+ zG~B-sKYsSD(^vLX?R5Fx{y2T!^WCjGy?&>~QJI2uaq$d}8Y3kG63H{>gaq;~2{PwtT4^LY5wcOo} zwLUl2GKZ+m_fuM@uY8C%j?y$z0yf< zbVZBxP`e`uo}SLfo9oNbY}o(l&u!~{>o(SyX=y(9-P6u@xwNB}ivGnz+Tb`iex_vg zoC-=>c7FZtB879yi+#iX;5h8lMzhhZO9h5&P-O%iEi2(5#aB->(2l)t#nJtf6Af<= zb>br;72&PpEwhhj9cE3lffSxiBICN8ku23(&UMK z$62qp7?aazHaLQR@c^Z<-Hq_|kU9uH+LIZ{0_!2!V6$#zbpEz_SVc-oat#X%j&MtL zB!4_L$l~vZfBjne>k;^rhFvYgy|krg_WH)oc&6+>ID%LiyWNwm_pi@yhvoOfe^=t8 z|Kvm+vKE1KOJ)49y1KQ`NT?*SIaW`ck}L2Y9Px5npTJ)a_oKt|u>8+h`{R8okcg?t z_^a(>d1#QWVk0&{^JriC5Bs1|Ev>}QZ=Nlj2&>&;Y0eIg;|&$~H|`&mkO(AUfX4IjIa#R1_v&^abdw zQSXVr(G1(8JLdoqPi5xzgN>&1(tkQvUuvmpyrG}PLEjN=83xo`d>VN5_~EV`@Jz!1<^nFK~jpKL7$d7 z^8IjF-oH}eLC4zGK+iAz7<{6f98`DePtE{Npt3&^XRhh#c%rp@D$iesgQ7<@wiiU6tn(uaOoXUN*0}*6foj=OfN^Aa-kGcO0j+4{P z69^z;`Lemacq18BG|(b3D@B|9K~kF z!9@!C$X5Q*>al9})cf{@6PWW?dGHL>!RJ>XbvgQj-^DaWc?Q2EXrm+g=Zy^fu2%oi z%yIC&b>}Y9wSQ};Xl4~=M1xBr01Mbx8doD(&L8nZf&SQDe4hT&B>z%NjV0qN+=xHx zins05c_Lm<7&+>SBrSd`8D|cD$NoHHfANjoL^Pb$(Fj+9WVn*#%z!dh56MviY_$L~T z=S06Fp3MC6agN?RagRlke|%WWD6IGsA8C~X|66@lyWn&FPv=;M8NI{PW{;>zV}H(_ z)CC5*fkeUGjK;iWEwKef(oD4GH8eKAgd= zJR$$3`ivj_Ma>gA>sW(_W)RWG$#eCqG` zBd*H>aPiK7&r1L6OK)khAX1_S@ofFY65Koe1yM-yDKvsQAM^_UCRwOxxp2$?c0bOnnjiVte)*(SEyU#5&$$75kI_ z;|=`O9_jogj}-n-K#OngB7qUr_KdXLWbs6N#M{2|cpnv??+PFq{ovofaz|v$*Z=zc zJvp(4?0Q*Ut+de_O~ehhu|SNV4|Y!M@cqI22WMf+o(V+IZ1xdeN9PKjPQqiyme+yM2ew zce_@U6*1Xkw1{Mc)e39XLX&mnXmQ%U`NvGqLl4JL(uZ&8+?5zdo=~2@vvOKp+k97=a22sedZU#hzPuarC$1}B;H}{xSL~1%U5>%w| zUH!s|B=wG@>RI~ByB$~U4}Kv;|9C*I^$cFk#CFjO?L;fh=`jaQ=sayW$MgWY@mF>e QgISwALI=;Rv2Nqc5td^Jv>+Uyk|o_yo!FUG{xu;GE8$>BND-^lb#duZO#nh51l=Kx%X@{q zLK;C32;qN)yh2_f-#4?%r7YiF(ge{!%O$zoZ)SFOW;pEidc8kS|MYZ&rD_5tN0m#0BHoMKP z+E?f5ygz>(zJb2azkmKd-|SZPvV66B+^NnS#nCU8PktG!oAqf0TI!6^s?N6AcHNAp zod22>pWLlaIY#^n|82OcNy~C$e}->lMqozwx9f&a#fNM38KsB(@u7l@=9q1-@%I<< zSNm-HHe|a#0e|1hFVYA3!;IN>JY7Ny+0+Jzs+9;lnBz(Hhzddi!#gzsYZKOWpi`PS28ONtIUVF+BpipGQi-1KFL~S<>F_O=(K$^Zbk}JC4BUQlAjc%N(POU7S5-gQW48 zILdxxJF0uPy_^35-Htk_|3CO~efNRB|^RDq;T*%N|og4ow%IG6i; zswL%if%wvJ7(BP9-p!UznWB&%O{WD1AbEQ$;r{p!rAx_)Sjs(R5zEc?&i1{IsCY?B|M4^_%1pkLIQu` z@u~d|5-_QWiC~L-U0HFR)Q(r(o5aLo3Dl*ZH!duFgI%9A4zEtcSGvT<+5$r*?jVv2 z(J)s+yrkvI@KhNvREY&NEMk2_#VcL;f@I zz0EO?WcIhJH+DQQwu4`AHjz+vAZHKgA}2Kq9Vjotqacc|s4pd;LxaU7{`zE)^)4l! zT$a^&hB%xJFY!4KeL!bt`8nM+-s#>|d%M0u`}6C+*g^jNtWV3&ktL#c+MkgDPT~K8 z{6%tfk-wiiq6KPPXM~q*fLXwK_G$UFe9CRt#|z)I1koAoFW5iwhHv+`%nu*?=J;x7 z$bj_9r~q3MzT0BKiM699C^^FMgJw12_Dje$G^M5E`q0H z-cR(G!Pnud<#B(`=eG6#BLn=1^8*|E4Nqy0h@_f%&jQG+;cB>kT0fc6p)WFW&KU@3)Rvei<-W46G z?_qn1pA;TV^-o*w`T*_<9}nm!ReEv&9>hmGO~`t*_y!}RoNua*y!WlnSpQc3(M<~P zlJ|8cT7r5)!J(|6OAZXiBDOI?NR(j2@fHy5Z)ETs@moUd+ixTSb>-(edHr?erv60} zY!BTGhr02U_f_luJj9=ov3Q%v=3)JP^xf=$|IM$zkAIwjGIw}sQ7GN@b&;92;&uai z2gvXI@7;}wkpFb>LnOGshy0>Pv1zOV_Siy5b{ltG=~g-LhE?J^S+{CjBkTUDk3R+C z={B3w-qh+Z@I(F~_>A<7_d<#pcxY{$>)< zFx%5yD|iLf19jx%Ponzo;4>3vHoR`G@pb=dcCXe>yJj{c{GcU1^D`H3um`)c6Q5q9 zBR{m0ZpVXQb@C=I?_-F6t^URT0*f^O=HVorN&CK44s{e;a>D2r7lCW~g1Aus9~X*` zdYsGpm#CFVovVHyf8nPk-lMhBL*~pLA|B7>u8v?1AQgyRdSDjdxfO4SIr50tY5ybm zU&=4FK)idt3|Lvbza1Cm81N-ZM~m}%xc&tC4APdp&xrP)aYyL+EYx6E)U?dJ&+NnW zb)QI!dwAzM#=8HU{IhaA9T%)(O8i=?~Tu-(pzT{?zzmrqi#D{hBYFYcskF3420(^mA4R@V|BNfR<_Iej^bd>OrVVS(toqF&tu3?qe2wqr6K!HX@jaLeZ?p!s z<+R*E5)CM-dSPu1p7H({UIOx?))^6zlarU3 zzQn{P{ zWAm6HFZTIQTx5M%IB>bPY^4|Zo~$_LL2}STzBR6ebk@Z`U7_uBgiFb zRB5kCjQRMCbuWp{jEv~(+b8`$`lx?;%zrk z+&`hwuZJ1XL;X46hDvFLbhR^78dX4jhyM8>->jY8X6Y>B@`2K?$xPEE!$M(CEyN+}B9f@C(I^Uu$ zzB0Xk%74e=tm8r2+#~jQV*V2!SPk)O;=lSW`DF-s>6gK>WV~dxig`10cYS~1TbzD% zMg0POR`QU?ZZp)=nBOtCclCYAFhkWD-VQOJUloa5o%wC^$N2e?)hcF60l)jz?>nj| ziqD$X2DtpD>+vPSe}~WSqnwf7UspBjU*Y@fwfylxt5x~&SNN|s+g4|`(3X?`BYd3^ zQcs!xAPbxROn&AH_)_|j{CtncSMMPI47D`Uy7?JC^)27jrS`^L=rQ_0|IixOe^rwM euIZKh@9_CPIqT;~j_u-ymDk>~WajyZ{O8}p+Kf5? literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey b/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey new file mode 100644 index 000000000..4996f1054 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallBossKeyCrateDL_f3dlite_smallcrate_bosskey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart b/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart new file mode 100644 index 000000000..f1df8a15c --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallHeartCrateDL_f3dlite_smallcrate_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk b/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk new file mode 100644 index 000000000..85a1aef61 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallJunkCrateDL_f3dlite_smallcrate_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major b/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major new file mode 100644 index 000000000..ea7b5edf0 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallMajorCrateDL_f3dlite_smallcrate_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor b/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor new file mode 100644 index 000000000..7a6580630 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallMinorCrateDL_f3dlite_smallcrate_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando b/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando new file mode 100644 index 000000000..e8ff9db18 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallRandoCrateDL_f3dlite_smallcrate_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey b/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey new file mode 100644 index 000000000..593bf9e54 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallSmallKeyCrateDL_f3dlite_smallcrate_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token b/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token new file mode 100644 index 000000000..f58840a2b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako/mat_gSmallTokenCrateDL_f3dlite_smallcrate_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako/minor_crate_top b/soh/assets/custom/objects/object_kibako/minor_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..830d8ff65b34ca91e71ff42f60422a1981d32a4e GIT binary patch literal 8284 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako/token_crate_top b/soh/assets/custom/objects/object_kibako/token_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..d4d5442860fb49fe962d1b4ee6ac461ac1aee1a8 GIT binary patch literal 8284 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 UekcppDD}WOM?7$hj8NqN0{SG^yZ`_I literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/bosskey_crate_side b/soh/assets/custom/objects/object_kibako2/bosskey_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..d5ec9241ab3b5603a02ad3cfb4f7f8f050df50a7 GIT binary patch literal 8284 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�DB>zxP+<{Aca3>01sa@&#-EWS5 zMm9h;^t1kY*X#KH>%t-|){`0IVq?gsCkUB?sWGiTi4poGKFEx`vm$(U1o`bye&jzZ zSc$9H+NCHLPQCc*>14-;A7-g}`2AL)X(59JGq~qROlek;+2d&|F(UQPG!v9tZAtl& zhnbHj;QgqGijOR1Lena>c&c)c=_1DOgiZ1h^XI0{^7)3%>&CQSrRL7n+O_XjN-A?a)(> zXcOswcIkhHsqcEPm-h|3JS`yW}2o zuK?d?y*zXB!;`G(YHB~|KeGBeYp3#wH~vqxlv`(~!A>eT z?_kWJznre30wMoM{3G_oQ@{b_$1Z?98Sg^>8(t+oJ)*EpQe3$Lm+17Gqc`YAiC^;9 z+LzmxJ4>C<@{Z&PMl~qp!KsJ%Mx=kS0Ps16HOOAz%7OgApQHRDZ=eNa2NJnq&L}niYF<28Y`~qj z$d6tCvW56FMpp5O3Sxyqx57@v!s#y0MVwmq4eU=1%(m9MZ;yUPXMkNvp-G9Pr-<^W zHIRRq*F|=TK{-`hU>`vHNBW;J%uJP55dw$wBCg3is9Y4bkN?lmodmFOk1%2D)VouL>bQFb4@b+yPW+jM@?jJczWH>;6Tv=5E-ZT;i|OoS$rc4-YUR{28fS+FLcFDpZ$(K9@?M#FLq}n z`n*zTdpv_=gGAg=o76ecVP#Y-)o*G~_a9gn_QcKz=T$__9I#Kt2d5u+win=YpEQC| zsC?W->Dd-*i`Eo5?b}P8o(@LmeR5KWUpV*520O44Prc(xh-KKm|w8=ilzhL!~$&s~LhGR9oQdL@!#r^cNde}}ub z@O%@Ji9Vn;eUE*WoDcFBy$R6=#;> zUM=_X|2f`;vrS|bb~eG=1b6h|JATVZ^%?Oe{%=fuh#Bn^2~Q)BlQGenSh+Wtf4C-A zwNH6aJou(|zu`(i)s^(yOemi^TJO0o-{Km0y!bsiv9;q2`_6DB&JKFgFcxH{%tN>OA3n6F zatd^4j63m=2jyR$D-Xm#Z_CwrWfc}W48HM;D=O(Tjyp@_G2}^Wi|#{3bE?Ay<$&C9 zuE-3XqHamXl#%cr%&zcVh{SuWZp-)xSNQ#fFX{~CGr+>!U^aCSo)9qCqn3w#1Z#ng zr&h?lpveqD#hqwVye5zvJCWcn(uCSc^^5W7PgEwY++qDD7s3g$z0`kH9nl7T1Kg5- z;X0w~3;&_~(87RE$au-;qFbpVtSEZ+A-*OY$jXYV|I?L`z}IKQ#GVbSiHG$<=|y(c WAFh-OtATfp(+{78qk`|i*Z%`M1f4Vh literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL new file mode 100644 index 000000000..c59674884 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 new file mode 100644 index 000000000..f43cacd88 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 new file mode 100644 index 000000000..d877460d4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeBossKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL new file mode 100644 index 000000000..ce8bcb69f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 new file mode 100644 index 000000000..64c96a3a3 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 new file mode 100644 index 000000000..ee780d50d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeHeartCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL new file mode 100644 index 000000000..2d9c5974c --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 new file mode 100644 index 000000000..a3a46e621 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 new file mode 100644 index 000000000..041d794d9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeJunkCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL new file mode 100644 index 000000000..190005d99 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 new file mode 100644 index 000000000..867e166d7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 new file mode 100644 index 000000000..5ab5bf39b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMajorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL new file mode 100644 index 000000000..d093960d5 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 new file mode 100644 index 000000000..9ab4cdf9a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 new file mode 100644 index 000000000..8a22d508b --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeMinorCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL new file mode 100644 index 000000000..b1c1ffd1f --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 new file mode 100644 index 000000000..3e87c23b1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 new file mode 100644 index 000000000..296988ca1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeRandoCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL new file mode 100644 index 000000000..c4d711d10 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 new file mode 100644 index 000000000..126e0bde7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 new file mode 100644 index 000000000..908b646bb --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeSmallKeyCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL new file mode 100644 index 000000000..b1b1269b9 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 new file mode 100644 index 000000000..c02cd056d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 new file mode 100644 index 000000000..dd2c07c52 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_tri_1 @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 new file mode 100644 index 000000000..e76946586 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_0 @@ -0,0 +1,6 @@ + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 new file mode 100644 index 000000000..1c6430bd4 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull new file mode 100644 index 000000000..42422b027 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/gLargeTokenCrateDL_vtx_cull @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/heart_crate_side b/soh/assets/custom/objects/object_kibako2/heart_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..d0d916c0788346102dec8cc08b1a9e2713d9f82e GIT binary patch literal 8284 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/junk_crate_top b/soh/assets/custom/objects/object_kibako2/junk_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..ef303867ccfd03e50cc146013a7ebf0ff58bfd2b GIT binary patch literal 8284 zcma)>EpubZ6^1oID`qp9t)QTwP*P5XNFY^KK+0wj6cjW`)ym9bGP9td;J^e%EP`e+ zG~B-sKYsSD(^vLX?R5Fx{y2T!^WCjGy?&>~QJI2uaq$d}8Y3kG63H{>gaq;~2{PwtT4^LY5wcOo} zwLUl2GKZ+m_fuM@uY8C%j?y$z0yf< zbVZBxP`e`uo}SLfo9oNbY}o(l&u!~{>o(SyX=y(9-P6u@xwNB}ivGnz+Tb`iex_vg zoC-=>c7FZtB879yi+#iX;5h8lMzhhZO9h5&P-O%iEi2(5#aB->(2l)t#nJtf6Af<= zb>br;72&PpEwhhj9cE3lffSxiBICN8ku23(&UMK z$62qp7?aazHaLQR@c^Z<-Hq_|kU9uH+LIZ{0_!2!V6$#zbpEz_SVc-oat#X%j&MtL zB!4_L$l~vZfBjne>k;^rhFvYgy|krg_WH)oc&6+>ID%LiyWNwm_pi@yhvoOfe^=t8 z|Kvm+vKE1KOJ)49y1KQ`NT?*SIaW`ck}L2Y9Px5npTJ)a_oKt|u>8+h`{R8okcg?t z_^a(>d1#QWVk0&{^JriC5Bs1|Ev>}QZ=Nlj2&>&;Y0eIg;|&$~H|`&mkO(AUfX4IjIa#R1_v&^abdw zQSXVr(G1(8JLdoqPi5xzgN>&1(tkQvUuvmpyrG}PLEjN=83xo`d>VN5_~EV`@Jz!1<^nFK~jpKL7$d7 z^8IjF-oH}eLC4zGK+iAz7<{6f98`DePtE{Npt3&^XRhh#c%rp@D$iesgQ7<@wiiU6tn(uaOoXUN*0}*6foj=OfN^Aa-kGcO0j+4{P z69^z;`Lemacq18BG|(b3D@B|9K~kF z!9@!C$X5Q*>al9})cf{@6PWW?dGHL>!RJ>XbvgQj-^DaWc?Q2EXrm+g=Zy^fu2%oi z%yIC&b>}Y9wSQ};Xl4~=M1xBr01Mbx8doD(&L8nZf&SQDe4hT&B>z%NjV0qN+=xHx zins05c_Lm<7&+>SBrSd`8D|cD$NoHHfANjoL^Pb$(Fj+9WVn*#%z!dh56MviY_$L~T z=S06Fp3MC6agN?RagRlke|%WWD6IGsA8C~X|66@lyWn&FPv=;M8NI{PW{;>zV}H(_ z)CC5*fkeUGjK;iWEwKef(oD4GH8eKAgd= zJR$$3`ivj_Ma>gA>sW(_W)RWG$#eCqG` zBd*H>aPiK7&r1L6OK)khAX1_S@ofFY65Koe1yM-yDKvsQAM^_UCRwOxxp2$?c0bOnnjiVte)*(SEyU#5&$$75kI_ z;|=`O9_jogj}-n-K#OngB7qUr_KdXLWbs6N#M{2|cpnv??+PFq{ovofaz|v$*Z=zc zJvp(4?0Q*Ut+de_O~ehhu|SNV4|Y!M@cqI22WMf+o(V+IZ1xdeN9PKjPQqiyme+yM2ew zce_@U6*1Xkw1{Mc)e39XLX&mnXmQ%U`NvGqLl4JL(uZ&8+?5zdo=~2@vvOKp+k97=a22sedZU#hzPuarC$1}B;H}{xSL~1%U5>%w| zUH!s|B=wG@>RI~ByB$~U4}Kv;|9C*I^$cFk#CFjO?L;fh=`jaQ=sayW$MgWY@mF>e QgISwALI=;RB}=-aI*CU-ngE0#2)aWWm-h;J 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/mask_crate_side b/soh/assets/custom/objects/object_kibako2/mask_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..634969f2ad117d3451b8c75b9cc8f9493ee6ae5a GIT binary patch literal 8284 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 Q#&X6$YPJAT7ShiD0o@t@O#lD@ literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/mask_crate_top b/soh/assets/custom/objects/object_kibako2/mask_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..d8292e33fe439000e45629da4e2315ca18f16131 GIT binary patch literal 8284 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 gLL + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey new file mode 100644 index 000000000..6bbbe0408 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeBossKeyCrateDL_f3dlite_crate_top_bosskey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart new file mode 100644 index 000000000..e79a71e40 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_side_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart new file mode 100644 index 000000000..2e20008c7 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeHeartCrateDL_f3dlite_crate_top_heart @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk new file mode 100644 index 000000000..b7eee4eb1 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_side_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk new file mode 100644 index 000000000..d59ca15f8 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeJunkCrateDL_f3dlite_crate_top_junk @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major new file mode 100644 index 000000000..e930dced0 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_side_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major new file mode 100644 index 000000000..ee053858d --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMajorCrateDL_f3dlite_crate_top_major @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor new file mode 100644 index 000000000..c9b542226 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_side_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor new file mode 100644 index 000000000..619787be2 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeMinorCrateDL_f3dlite_crate_top_minor @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando new file mode 100644 index 000000000..8e2e6bb46 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_side_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando new file mode 100644 index 000000000..ca00e4780 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeRandoCrateDL_f3dlite_crate_top_rando @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey new file mode 100644 index 000000000..b4cb8d672 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_side_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey new file mode 100644 index 000000000..a0ea43499 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeSmallKeyCrateDL_f3dlite_crate_top_smallkey @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token new file mode 100644 index 000000000..d87ec4148 --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_side_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token new file mode 100644 index 000000000..369b6a05a --- /dev/null +++ b/soh/assets/custom/objects/object_kibako2/mat_gLargeTokenCrateDL_f3dlite_crate_top_token @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/soh/assets/custom/objects/object_kibako2/minor_crate_side b/soh/assets/custom/objects/object_kibako2/minor_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..27a62c8c4d9c0eb801f2c264e2180f5f2535604f GIT binary patch literal 8284 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 AVE_OC literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/minor_crate_top b/soh/assets/custom/objects/object_kibako2/minor_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..830d8ff65b34ca91e71ff42f60422a1981d32a4e GIT binary patch literal 8284 zcmc&(!D{PD5_RTc6k`ku*~nxg@8q5JR#)E4Q^Y06#soVPm|QcP+}(V|fHB5|;8n<1 z%rDF)1Y^v@WEHZRUzlH*bE>-4Z6~>JW;5eLa;w$qQ&nAERoz{y)oOqK_NU7u{Qv78 zfBz>h6#wJjAJFnwbLmHa`(v$!E3VbL_nl$1?hL#4>FyJHNq1<~NO%3y^Q-gg!2{@V z@Hlw|y-nVx?djR{?8o%SUr3YJ{z+{ne)BZ^~{~SM@ zL&`I7+&sWn={@-;ubt-fZ1UC__D`vsN`51~#jkp7K=KB)(1w0Lp_g`}d;iM`TC9E# ze|n~R>@+Yw9=_GS#qXFNsfSJ@oVS0X|6fkD4K#N0AwEXG8vp6wy3=eo&Qcu|!|Nphd_T>A$`JgWa!-++v43nxwZVG$0G9dulT%on%#!OKR$}`xB$&Sa!*(i zf^C9W)_?ab@A*|l%57-z^JE4q_w3K%r=$GN;!}3u&w8`o^Vi>{-ZNYA4tg^8r{0tD z#e0;i2Ern%C+lw0+8jLEwWVw|xwQB-;Kv2O>^+-a*c&fL)st#Mb+doh*&G$2!H;I; zMUVK1fl3-3c?bU3;#2z`5-_QWo?wf7zO1MxRqa*xd7MXL3Dl+SH!4c_hO~(&%s33P z@%a!RV+#zG*h3^2qG67T)_XcKJaF_e?nmUn@}L}qMGjw@GL9NTgd`!K=r+sWET7PR zrFoGYs6@=`Btd>cy`f$;8OYupy2we*LI=u=@F<9)E9y%L z=+I!XkKaG--bZWAC)3^JEkzvew)XMa4}E|)vuvNHj&J<8YH#mrXn%J6$B5C$Lhdp0 zugHACNB?x%MvmJ^ef%PRHj%%c8KMQ+TmUg0c8pBmuG|h!^;6|I>cGW#1mNDeqWzlQ&H`Y)1aW*0(1Rl;-WGL9w67bP;1@pjTGm-KPuL8BJ^ zmslovNS-YI@eyWGnMvLcT+D;%895kSe}79yW##|F9QXnI2R7y#zS0sANekvZV<3NT zesA7h-d^Sx2AvUxkxQbNj)?RB@T&!~x6$Ac7630WdBeKJ5b%ed{egS6Ewv|Wd+Gy3 z47RO{ES%RS4iX)g)r0$&(GlNRUX0Zygdc68 z@w37&V8sFOWv$4&^*+<~K7L$SG}S+C+4ljQ71l%1Ppb6f06d6~Hky#}sPJ>N3{nr@ z`QJVJJ4)bPvby#}OVGF@IFuE%&q0p1h;57z5+xXMtOYpx3v+xIq%9}EtfFNl?aR+` zvikGorv60}yg&IF4s~NGtE<-Svx`4rUSc%?{L1PPc@clf1@Q0p?B8HfW{;N&h0?vR z7nx}*W;USo1o@5sJwD0<)%(_-5CD-p3N~UH&2XjP#86LW=2lsBE0$U@e4Jpd3oce4E#MvoNP_ zBS^*kk5(r;7j4Zx2iJoK-~OV!_iTF-$rm?E60N(MW8}_Auj8QdvzBD|mR3%F%nF0A zmhUnV;5+$YyVRxaQS6`6Knunn1A%WTxzzy2n)%Klx%d+y{}cJe;%Iey_|E@J_RZeh z9J2lxD5%vpZk@qwPjfAut5ysAr)Spq7aRRsn`0ahLO$&4-)8?r*X&-cop#M^hEL>x z_|ih-4d$RPJF)2{Jo%xWWFBvg&B5~RIskiCp8m!E0*iY9%)?3Ala}q>XvefmASZJT zT!rJBz91^p|3}3hK5UQ7=ZW0$4r{LGNavrCKi#z(#Kg{9BYXKVO?S}-_{RSMf0hL|TR~GydnZRg zSKNw+&5fXF{N)_6d|}SYyR04+GXE8S6Kw{M+^g%}bKh_9nC`;08-IhpLI0GTl2Q*^ z0w>^%Sr542J1K4G8^rT0fQWkHS}GUBm)s2Tx3`Wr;o|&i@PHk#COO~;VBfH^Kcj!* z3$Y*OS(NIwHC{4?mrKV5rFXsw(Xxjm8ci3R~!rC`Dlk_`b+pk;JN_$T#7{Laq*SoR-0e9H&^efcF%WfOJ^iEB?LWx+ zM^_ozA3ZHRvXEFHN;)oDr#Tu&hNSk8m=W;xkMg%@>F~QdOVKi__8&OI_II-Qq*0}+ zml*T$6ZgF&HcN!G*&qEs%Gm$>2tQo-`>))!k{wR0m}EtXyDQ;MRV(fMCw^z1?H3yT zYUlx_FX6(&_xAs>Gby|7V#~&wO@xK?N*a-IpM#{ejn6XkWFEe+aqloY7XJ9VlYn@W ztTlJB`L^Z~I-V}Cpna>2Gsk0o3JWlGhyUh1-2FoTYe!m8s--#^S`1okh{6 z_+;MF`iNgWYrSTjEVE=$U61fan12=%(Z4#0iI&OYD>%rIq1yY`_1AR|7wC%Qc5q98J;pfPG7n>qvdXuoVsG|VAn5L$LUHM>p59dwXvHv zl>IcWYYt8wyetYo=bZcMDj6&D zLHFx@-}9Vv-t%>@J32Z#J`DeSXb;Zyf0efQ!{z_|_an?a^@n{KnkQRpf3bDHG9*td3+uW^Qhh`etQTsz&tUNTFw}mWsszqzk<@VF8qT4%g`VuBSUX=F5%Oh+Qoy7KB;f&&A9#)ikTui7 zCI>|_SFfLeGv&%hO?AGa=QoNzpo3#7pNJ)5GtLRO9Gz~v|E5Y3`ZA@mNTSJ zRkQYMGp-}%F4L8W4SIvsfE}=Bra4CI(({v$DB*<^F?uh3k|TmXrFC8|khj5EI@(P_P=T4tf(_+JO7Ooe(eYQVYO$ zL=s18k%dnbk8>!q#*Y(A)L_!+Uhw56Q)`3XfIaB-NBo}dPaanJqFibT04QCtT@};mc8jDKqzUD#<)EOV7@TnZa|5U)xpt`2V*!oPg9$l&=rC(fshla1As8 z$`8lnhwFfMpu#z?k)VlvAVFtPxU?``z_M|gN-km{%`~HfO--9gR350_}4!+pF4SSh8K7214b9CMVT>K6z zg$@fH3LUN-u3%Qp+Uws-%@JqdL|f7~$-6sf5v`pffk@CEt}3aGsQbVQ<)U;dVRCqE zI{b39`IYGQ19?6Y9rf&_ib#{S4LlwnVIj%YzUYDX&|9;?W=US_{& zbu2Hlg59}(59cvI2O>Ns;>Ba9HcnPfj-L#l43T~#N4V5czuakJSdFW$qrk)X0X+AMGFCNU0* zva0(dz00&eE4AqFEBd4lgYK;KN%Vb2e|UdIyD*HbrQh7z-TH3%qS&7nuy4ev^ZaG) zOp51mSHANZ?BnRaVBdV)Y;K-NzX=ZlZ)g_{*!`aFoZpk1)P4)PqZ42!mK|cR%wB`| z>;w8e!D(DDCyE!P-;U=WuD-W!{dq&;fbjwP!{b$} z_*F8FT@?!itCr~Bn;S#N%bi!<*?F0_kIYb^hvVE;?cLTpSmxyWq%DvYga}ce-9ntt#|EC2=>_!vO+@sY4jCcCF zM16MtV|`QEJkf04AHCi3zAM#-bwtMj@jR@D1oVH=zi$OyHLxTLZ4lGZA5R#KYJVsG z5dGxAIAkUmt7Xp?pRK<)e|hKN`T<1$Mf&ah@tuP&N{cba_wCv0-_CQdiWlT<3j4?C z57>;q&QQOH_^=x6-6q2n_7OR;IKp07^ItM1Z(*2+?i_NMx6{Jgr{5}HE$uHIFJ1tz zk*(dAjXNVP+mFv}JfEj;BqlBR5G_Y9aQrXC-Pd@dzZn_yJwfzml?);ORuX~_{aFKI z`c}wmR;%=z=^n9eZT{oNtvhF3+h3h}KHn%m-z^>I-eV5zM&kPh{U7xQ8tJ}C9l{P6 z^n!0@q}~72`{XEoKwmV(s2=oY&R%-wpO?;Q1w>x>{Tt<9uUo6urFYUjiI}{{VDB{l zG5+CyE5?q9~c5O*6U>&?Zt5p|97 z)_2@{&0gl1h_M28hWugJZ;dw8>ZbU7gQNA^@R5I8_>e<$kt+eNhBrTLHt!y5Wu3~G zmk^tX%dOqqv?IB!4nFj!7XTmVd?#(!pYsyN+l&@jE33s%(Zgs5VnuW{=O{k=0Kvzx&Hm^= zB>ymfIfONkhC4@3oWI&AGwxJ^h4BZlexnS(mz_2H&NH=O{WJDgt-uFTvgR25DMfq# z!ThU!jwr^J#1rZ?JF?`&)^6j}QV;N@>Mz)L`)PmXB#lvOr|5i=aQYuB!b(pPP1Z8- zf9^jklK7wIf9d}ic`Ad>*L|S=@QvY}gN^K+qqi#y75wal%Kc~5f95OZI{k(~3yRdR z7UQ4&uRm-oD4o@s_@8(`@s0i(e=5Ivk?ell@u+wvo|`VeShucUIAfndPkhFnLeINy zty_g(T9JMaW1joqegRbbBmR(oW&fnNO~Lwp zq3N0F(!TmB=o?txx8z&gSi5lN(MyZ=U;h*xKYZL|H9cq1;o)lsDxej?cQ)ETCU&I% z!}82Q?2Bex{1`_B6KD=D##J87JkJgUf902%?Gld2`TSe?Ml+S>G$Tb0-`a@ZEBLCv z*a!HWqjiv)w)7W#qP@8ht$CvE4 zMs)fhvgj1?*$2A#ez8CJ_=xUU$fr8-dlkN#K4dSlw(rKoLKU62y->XodvL4~*!u4D zk2Rx1P3(0aqLuWUEzh~> z`l;{RvM=x}i}7uLqg)&{nC8rknQY-Rh9n0_K4FY$_a*)|?bg49Q~%^!Eaotmm}_z_ zUv8EcCtCU=11wH#r|W^-qZD?RnG2Rir6aM2^M{%L*!_zBKt~M7I61QiguhQ~{g?b7 zB^tj<<4urx7daGf1y}6`C9vEMeUgAQ^h~lPt^mrF5WzU^YPsMrK8Kw zUerH(TEt( z{mr??E%d_KMz$WP2O8y_gDc<6JauxUNI-mLnY4hR zSG$nHM>9`XzAo)weRuu9%+u8ah0)^0+%$JnYb^I&t2Q;({txvhuirEjHQmMce%1@T zaY732elDiRS@dunFko3|k= z!hAsOK;pBI8r?eXAoHuFIObVvHnrrMsPGU@qC20M=Q0L6VN{Rg&NZAV{sKRR$FeV# znA4cxoyLbovAO3ClQegzznNV(&vl0JMfwA-fntvCy;gZ3tvPGpZMx3&Bju{nsYh`J zpXz@m^iEefD2jyGZ68yPiqn2%$7J}?*Rh62={4J>7Cjv4ocTs8;BbYka#U<{qqN~=bfy$sVwd4?6aL_8#@-1Ck9Woky;{%A~BFjlH=v6%!1z9c~BNq gE9lI#@^-X$(DbS9fZ;`d;g4%nRz2e=XxX9v0Q2(xt^fc4 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/rando_crate_top b/soh/assets/custom/objects/object_kibako2/rando_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..2d211d61250cecc2530ca7829c1fe873e169ce9e GIT binary patch literal 8284 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 V4mDsu=t>#b7Gf{9h(#T@{s-5JmyrMf literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/smallkey_crate_top b/soh/assets/custom/objects/object_kibako2/smallkey_crate_top new file mode 100644 index 0000000000000000000000000000000000000000..542dfb837df5dfe96fc88c97a1be4e27dcff6615 GIT binary patch literal 8284 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 literal 0 HcmV?d00001 diff --git a/soh/assets/custom/objects/object_kibako2/token_crate_side b/soh/assets/custom/objects/object_kibako2/token_crate_side new file mode 100644 index 0000000000000000000000000000000000000000..6de4f580f866bec141d9e660d032f519448f5ac8 GIT binary patch literal 8284 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 UekcppDD}WOM?7$hj8NqN0{SG^yZ`_I literal 0 HcmV?d00001 diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index 9e56e51bd..3778f4a70 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -149,6 +149,54 @@ static const ALIGN_ASSET(2) char gBombchuBagBodyDL[] = dgBombchuBagBodyDL; #define dgBombchuBagMaskDL "__OTR__objects/object_bombchubag/gBombchuBagMaskDL" static const ALIGN_ASSET(2) char gBombchuBagMaskDL[] = dgBombchuBagMaskDL; +#define dgLargeMajorCrateDL "__OTR__objects/object_kibako2/gLargeMajorCrateDL" +static const ALIGN_ASSET(2) char gLargeMajorCrateDL[] = dgLargeMajorCrateDL; + +#define dgLargeMinorCrateDL "__OTR__objects/object_kibako2/gLargeMinorCrateDL" +static const ALIGN_ASSET(2) char gLargeMinorCrateDL[] = dgLargeMinorCrateDL; + +#define dgLargeRandoCrateDL "__OTR__objects/object_kibako2/gLargeRandoCrateDL" +static const ALIGN_ASSET(2) char gLargeRandoCrateDL[] = dgLargeRandoCrateDL; + +#define dgLargeSmallKeyCrateDL "__OTR__objects/object_kibako2/gLargeSmallKeyCrateDL" +static const ALIGN_ASSET(2) char gLargeSmallKeyCrateDL[] = dgLargeSmallKeyCrateDL; + +#define dgLargeTokenCrateDL "__OTR__objects/object_kibako2/gLargeTokenCrateDL" +static const ALIGN_ASSET(2) char gLargeTokenCrateDL[] = dgLargeTokenCrateDL; + +#define dgLargeBossKeyCrateDL "__OTR__objects/object_kibako2/gLargeBossKeyCrateDL" +static const ALIGN_ASSET(2) char gLargeBossKeyCrateDL[] = dgLargeBossKeyCrateDL; + +#define dgLargeHeartCrateDL "__OTR__objects/object_kibako2/gLargeHeartCrateDL" +static const ALIGN_ASSET(2) char gLargeHeartCrateDL[] = dgLargeHeartCrateDL; + +#define dgLargeJunkCrateDL "__OTR__objects/object_kibako2/gLargeJunkCrateDL" +static const ALIGN_ASSET(2) char gLargeJunkCrateDL[] = dgLargeJunkCrateDL; + +#define dgSmallMajorCrateDL "__OTR__objects/object_kibako/gSmallMajorCrateDL" +static const ALIGN_ASSET(2) char gSmallMajorCrateDL[] = dgSmallMajorCrateDL; + +#define dgSmallMinorCrateDL "__OTR__objects/object_kibako/gSmallMinorCrateDL" +static const ALIGN_ASSET(2) char gSmallMinorCrateDL[] = dgSmallMinorCrateDL; + +#define dgSmallRandoCrateDL "__OTR__objects/object_kibako/gSmallRandoCrateDL" +static const ALIGN_ASSET(2) char gSmallRandoCrateDL[] = dgSmallRandoCrateDL; + +#define dgSmallSmallKeyCrateDL "__OTR__objects/object_kibako/gSmallSmallKeyCrateDL" +static const ALIGN_ASSET(2) char gSmallSmallKeyCrateDL[] = dgSmallSmallKeyCrateDL; + +#define dgSmallTokenCrateDL "__OTR__objects/object_kibako/gSmallTokenCrateDL" +static const ALIGN_ASSET(2) char gSmallTokenCrateDL[] = dgSmallTokenCrateDL; + +#define dgSmallBossKeyCrateDL "__OTR__objects/object_kibako/gSmallBossKeyCrateDL" +static const ALIGN_ASSET(2) char gSmallBossKeyCrateDL[] = dgSmallBossKeyCrateDL; + +#define dgSmallHeartCrateDL "__OTR__objects/object_kibako/gSmallHeartCrateDL" +static const ALIGN_ASSET(2) char gSmallHeartCrateDL[] = dgSmallHeartCrateDL; + +#define dgSmallJunkCrateDL "__OTR__objects/object_kibako/gSmallJunkCrateDL" +static const ALIGN_ASSET(2) char gSmallJunkCrateDL[] = dgSmallJunkCrateDL; + //boss keys #define dgBossKeyCustomDL "__OTR__objects/object_bosskey/gBossKeyCustomDL" static const ALIGN_ASSET(2) char gBossKeyCustomDL[] = dgBossKeyCustomDL; diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 5ce3c2ea0..078d645b5 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -275,6 +275,22 @@ typedef enum { // #### `args` // - `*EnDoor` VB_CONSUME_SMALL_KEY, + + // #### `result` + // ```c + // itemDropped >= 0 && itemDropped < 0x1A + // ``` + // #### `args` + // - `*ObjKibako2` + VB_CRATE_DROP_ITEM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ObjKibako2` + VB_CRATE_SETUP_DRAW, // #### `result` // ```c @@ -1728,6 +1744,22 @@ typedef enum { // - None VB_SHOW_TITLE_CARD, + // #### `result` + // ```c + // (collectible >= 0) && (collectible <= 0x19 + // ``` + // #### `args` + // - `*ObjKibako` + VB_SMALL_CRATE_DROP_ITEM, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*ObjKibako` + VB_SMALL_CRATE_SETUP_DRAW, + // #### `result` // ```c // false diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index 6e6ec17d6..a54de6b64 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -126,6 +126,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_DEKU_TREE_GRASS] = HintText(CustomMessage("They say that some #grass in the Deku Tree# hides #[[1]]#.", /*german*/ "", /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_DEKU_TREE] = HintText(CustomMessage("They say that a #crate in the Deku Tree# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans l'Arbre Mojo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | DODONGOS CAVERN | @@ -304,7 +308,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_DODONGOS_CAVERN_GRASS] = HintText(CustomMessage("They say that some #grass in Dodongo's Cavern# hides #[[1]]#.", /*german*/ "!!!", /*french*/ "", {QM_RED, QM_GREEN})); - + + hintTextTable[RHT_CRATE_DODONGOS_CAVERN] = HintText(CustomMessage("They say that a #crate in Dodongo's Cavern# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | JABU JABUS BELLY | @@ -468,6 +475,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { hintTextTable[RHT_JABU_JABUS_BELLY_GRASS] = HintText(CustomMessage("They say that some #grass in Jabu Jabu's Belly# hides #[[1]]#.", /*german*/ "", /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_CRATE_JABU_JABU] = HintText(CustomMessage("They say that a #crate in Jabu Jabu's Belly# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Ventre de Jabu-Jabu# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | FOREST TEMPLE | @@ -699,6 +710,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß ein #Herz im Waldtempel# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Temple de la Fôret# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_FOREST_TEMPLE] = HintText(CustomMessage("They say that a #crate in Forest Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de la Fôret# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | FIRE TEMPLE | ---------------------------*/ @@ -903,6 +918,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "!!!", /*french*/ "Selon moi, #appeler le soleil derrière le trône d’un chevalier dans un volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #crate in Fire Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | WATER TEMPLE | ---------------------------*/ @@ -1050,6 +1069,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "!!!", /*french*/ "Selon moi, #appeler le soleil avant un duel avec son ombre# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_WATER_TEMPLE] = HintText(CustomMessage("They say that a #crate in Water Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Eau# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ @@ -1295,6 +1318,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "", /*french*/ "Selon moi, protégé par un #cercle de flammes# dans le Temple de l'Esprit se trouve #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #crate in Spirit Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ @@ -1558,6 +1585,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "!!!", /*french*/ "Selon moi, #appeler le soleil près d’un coffre invisible gardé par les morts# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #crate in Shadow Temple# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Temple de l'Ombre# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ @@ -1981,6 +2012,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß das Sehen einer #Prüfung mit Dinodorus# #[[1]]# enthülle.", /*french*/ "Selon moi, dans #une épreuve avec un Dinolfos# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_CRATE_GERUDO_TRAINING_GROUND] = HintText(CustomMessage("They say that a #crate in Gerudo Training Ground# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Gymnase Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | GANONS CASTLE | ---------------------------*/ diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index 2c28b154e..6d5242a5d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -1974,6 +1974,46 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_GROTTO_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a grotto# reveals #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GERUDO_VALLEY] = HintText(CustomMessage("They say that a #crate in Gerudo Valley# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans une vallée# a #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GERUDOS_FORTRESS] = HintText(CustomMessage("They say that a #crate in Gerudo Fortress# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans la Forteresse Gerudo# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_WASTELAND] = HintText(CustomMessage("They say that a #crate in Haunted Wasteland# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Désert Hanté# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_MARKET] = HintText(CustomMessage("They say that a #crate in the Market# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans la Place du Marché# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_KAKARIKO_VILLAGE] = HintText(CustomMessage("They say that a #crate in Kakariko Village# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Village de Cocorico# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GRAVEYARD] = HintText(CustomMessage("They say that a #crate in the Graveyard# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Cimetière# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_GORON_CITY] = HintText(CustomMessage("They say that a #crate in Goron City# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Village Goron# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that a #crate in Death Mountain Crater# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse sur le Mont du Péril# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_LON_LON_RANCH] = HintText(CustomMessage("They say that a #crate in Lon Lon Ranch# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans le Ranch Lon Lon# contient #[[1]]#.", { QM_RED, QM_GREEN })); + + hintTextTable[RHT_CRATE_LAKESIDE_LABORATORY] = HintText(CustomMessage("They say that a #crate in the Laboratory# contains #[[1]]#.", + /*german*/ "", + /*french*/ "Selon moi, une #caisse dans un laboratoire# contient #[[1]]#.", { QM_RED, QM_GREEN })); // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 8a27f8106..aca9c49d3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -713,6 +713,18 @@ void GenerateItemPool() { bool dungeonPotsActive = ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS) || ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_ALL); PlaceItemsForType(RCTYPE_POT, overworldPotsActive, dungeonPotsActive); + + // Shuffle Crates + bool overworldCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + bool overworldNLCratesActive = ctx->GetOption(RSK_LOGIC_RULES).Is(RO_LOGIC_NO_LOGIC) && + (ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_OVERWORLD) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL)); + bool dungeonCratesActive = ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_DUNGEONS) || + ctx->GetOption(RSK_SHUFFLE_CRATES).Is(RO_SHUFFLE_CRATES_ALL); + PlaceItemsForType(RCTYPE_CRATE, overworldCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_NLCRATE, overworldNLCratesActive, dungeonCratesActive); + PlaceItemsForType(RCTYPE_SMALL_CRATE, overworldCratesActive, dungeonCratesActive); auto fsMode = ctx->GetOption(RSK_FISHSANITY); if (fsMode.IsNot(RO_FISHSANITY_OFF)) { diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp new file mode 100644 index 000000000..2106b4873 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp @@ -0,0 +1,548 @@ +#include "ShuffleCrates.h" +#include "soh_assets.h" +#include "static_data.h" +#include +#include "global.h" + +extern "C" { +#include "variables.h" +#include "overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h" +#include "objects/object_kibako2/object_kibako2.h" +#include "overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h" +#include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" +#include "soh/Enhancements/enhancementTypes.h" +#include "soh/ResourceManagerHelpers.h" +extern PlayState* gPlayState; +} + +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +extern "C" void ObjKibako2_RandomizerDraw(Actor* thisx, PlayState* play) { + GetItemCategory getItemCategory; + auto crateActor = ((ObjKibako2*)thisx); + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isVanilla = csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + if (isVanilla) { + Gfx_DrawDListOpa(play, (Gfx*)gLargeRandoCrateDL); + return; + } + + GetItemEntry crateItem = + Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); + getItemCategory = crateItem.getItemCategory; + + // If they have bombchus, don't consider the bombchu item major + if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && + ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || + (crateItem.modIndex == MOD_NONE && + (crateItem.getItemId == GI_BOMBCHUS_5 || crateItem.getItemId == GI_BOMBCHUS_10 || + crateItem.getItemId == GI_BOMBCHUS_20)))) { + getItemCategory = ITEM_CATEGORY_JUNK; + // If it's a bottle and they already have one, consider the item lesser + } else if ((crateItem.modIndex == MOD_RANDOMIZER && crateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && crateItem.getItemId <= RG_BOTTLE_WITH_POE) || + (crateItem.modIndex == MOD_NONE && (crateItem.getItemId == GI_BOTTLE || crateItem.getItemId == GI_MILK_BOTTLE))) { + if (gSaveContext.inventory.items[SLOT_BOTTLE_1] != ITEM_NONE) { + getItemCategory = ITEM_CATEGORY_LESSER; + } + } + + // Change texture + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + Gfx_DrawDListOpa(play, (Gfx*)gLargeMajorCrateDL); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + Gfx_DrawDListOpa(play, (Gfx*)gLargeTokenCrateDL); + break; + case ITEM_CATEGORY_SMALL_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gLargeSmallKeyCrateDL); + break; + case ITEM_CATEGORY_BOSS_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gLargeBossKeyCrateDL); + break; + case ITEM_CATEGORY_LESSER: + switch (crateItem.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + Gfx_DrawDListOpa(play, (Gfx*)gLargeHeartCrateDL); + break; + default: + Gfx_DrawDListOpa(play, (Gfx*)gLargeMinorCrateDL); + break; + } + break; + case ITEM_CATEGORY_JUNK: + default: + Gfx_DrawDListOpa(play, (Gfx*)gLargeJunkCrateDL); + break; + } +} + +extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) { + GetItemCategory getItemCategory; + auto smallCrateActor = ((ObjKibako*)thisx); + int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isVanilla = csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + if (isVanilla) { + Gfx_DrawDListOpa(play, (Gfx*)gSmallRandoCrateDL); + return; + } + + GetItemEntry smallCrateItem = Rando::Context::GetInstance()->GetFinalGIEntry(smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); + getItemCategory = smallCrateItem.getItemCategory; + + // If they have bombchus, don't consider the bombchu item major + if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && + ((smallCrateItem.modIndex == MOD_RANDOMIZER && smallCrateItem.getItemId == RG_PROGRESSIVE_BOMBCHUS) || + (smallCrateItem.modIndex == MOD_NONE && + (smallCrateItem.getItemId == GI_BOMBCHUS_5 || smallCrateItem.getItemId == GI_BOMBCHUS_10 || smallCrateItem.getItemId == GI_BOMBCHUS_20)))) { + getItemCategory = ITEM_CATEGORY_JUNK; + // If it's a bottle and they already have one, consider the item lesser + } else if ((smallCrateItem.modIndex == MOD_RANDOMIZER && smallCrateItem.getItemId >= RG_BOTTLE_WITH_RED_POTION && + smallCrateItem.getItemId <= RG_BOTTLE_WITH_POE) || + (smallCrateItem.modIndex == MOD_NONE && (smallCrateItem.getItemId == GI_BOTTLE || smallCrateItem.getItemId == GI_MILK_BOTTLE))) { + if (gSaveContext.inventory.items[SLOT_BOTTLE_1] != ITEM_NONE) { + getItemCategory = ITEM_CATEGORY_LESSER; + } + } + + // Change texture + switch (getItemCategory) { + case ITEM_CATEGORY_MAJOR: + Gfx_DrawDListOpa(play, (Gfx*)gSmallMajorCrateDL); + break; + case ITEM_CATEGORY_SKULLTULA_TOKEN: + Gfx_DrawDListOpa(play, (Gfx*)gSmallTokenCrateDL); + break; + case ITEM_CATEGORY_SMALL_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gSmallSmallKeyCrateDL); + break; + case ITEM_CATEGORY_BOSS_KEY: + Gfx_DrawDListOpa(play, (Gfx*)gSmallBossKeyCrateDL); + break; + case ITEM_CATEGORY_LESSER: + switch (smallCrateItem.itemId) { + case ITEM_HEART_PIECE: + case ITEM_HEART_PIECE_2: + case ITEM_HEART_CONTAINER: + Gfx_DrawDListOpa(play, (Gfx*)gSmallHeartCrateDL); + break; + default: + Gfx_DrawDListOpa(play, (Gfx*)gSmallMinorCrateDL); + break; + } + break; + case ITEM_CATEGORY_JUNK: + default: + Gfx_DrawDListOpa(play, (Gfx*)gSmallJunkCrateDL); + break; + } +} + +uint8_t ObjKibako2_RandomizerHoldsItem(ObjKibako2* crateActor, PlayState* play) { + RandomizerCheck rc = crateActor->crateIdentity.randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t crateSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_CRATES).Get(); + + // Don't pull randomized item if crate isn't randomized or is already checked + if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || + (crateSetting == RO_SHUFFLE_CRATES_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(crateActor->crateIdentity.randomizerInf) || + crateActor->crateIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +uint8_t ObjKibako_RandomizerHoldsItem(ObjKibako* smallCrateActor, PlayState* play) { + RandomizerCheck rc = smallCrateActor->smallCrateIdentity.randomizerCheck; + uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); + uint8_t crateSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_CRATES).Get(); + + // Don't pull randomized item if crate isn't randomized or is already checked + if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || + (crateSetting == RO_SHUFFLE_CRATES_DUNGEONS && !isDungeon) || + Flags_GetRandomizerInf(smallCrateActor->smallCrateIdentity.randomizerInf) || + smallCrateActor->smallCrateIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +void ObjKibako2_RandomizerSpawnCollectible(ObjKibako2* crateActor, PlayState* play) { + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &crateActor->dyna.actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = crateActor->crateIdentity.randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f); +} + +void ObjKibako_RandomizerSpawnCollectible(ObjKibako* smallCrateActor, PlayState* play) { + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &smallCrateActor->actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = smallCrateActor->smallCrateIdentity.randomizerInf; + item00->itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = Rand_CenteredFloat(65536.0f); +} + +void ObjKibako2_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + uint8_t logicSetting = Rando::Context::GetInstance()->GetOption(RSK_LOGIC_RULES).Get(); + + // don't shuffle two OOB crates in GF and don't shuffle child GV/GF crates when not in no logic + if (actor->id != ACTOR_OBJ_KIBAKO2 || + (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4051 && (s16)actor->world.pos.z == -3429) || + (gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == -4571 && (s16)actor->world.pos.z == -3429) || + (logicSetting != RO_LOGIC_NO_LOGIC && + ((gPlayState->sceneNum == SCENE_GERUDOS_FORTRESS && (s16)actor->world.pos.x == 3443 && (s16)actor->world.pos.z == -4876) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -764 && (s16)actor->world.pos.z == 148) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -125) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -150) || + (gPlayState->sceneNum == SCENE_GERUDO_VALLEY && (s16)actor->world.pos.x == -860 && (s16)actor->world.pos.z == -90)))) + return; + + ObjKibako2* crateActor = static_cast(actorRef); + + crateActor->crateIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCrate(gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); +} + +void ObjKibako_RandomizerInit(void* actorRef) { + Actor* actor = static_cast(actorRef); + + if (actor->id != ACTOR_OBJ_KIBAKO) return; + + ObjKibako* smallCrateActor = static_cast(actorRef); + + smallCrateActor->smallCrateIdentity = OTRGlobals::Instance->gRandomizer->IdentifySmallCrate(gPlayState->sceneNum, (s16)actor->home.pos.x, (s16)actor->home.pos.z); +} + +void RegisterShuffleCrates() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_CRATES); + + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO2, shouldRegister, ObjKibako2_RandomizerInit); + + COND_VB_SHOULD(VB_CRATE_SETUP_DRAW, shouldRegister, { + ObjKibako2* crateActor = va_arg(args, ObjKibako2*); + if (ObjKibako2_RandomizerHoldsItem(crateActor, gPlayState)) { + crateActor->dyna.actor.draw = (ActorFunc)ObjKibako2_RandomizerDraw; + *should = false; + } + }); + + COND_VB_SHOULD(VB_CRATE_DROP_ITEM, shouldRegister, { + ObjKibako2* crateActor = va_arg(args, ObjKibako2*); + if (ObjKibako2_RandomizerHoldsItem(crateActor, gPlayState)) { + ObjKibako2_RandomizerSpawnCollectible(crateActor, gPlayState); + *should = false; + } else { + *should = true; + } + }); + + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_KIBAKO, shouldRegister, ObjKibako_RandomizerInit); + + COND_VB_SHOULD(VB_SMALL_CRATE_SETUP_DRAW, shouldRegister, { + ObjKibako* smallCrateActor = va_arg(args, ObjKibako*); + if (ObjKibako_RandomizerHoldsItem(smallCrateActor, gPlayState)) { + smallCrateActor->actor.draw = (ActorFunc)ObjKibako_RandomizerDraw; + *should = false; + } + }); + + COND_VB_SHOULD(VB_SMALL_CRATE_DROP_ITEM, shouldRegister, { + ObjKibako* smallCrateActor = va_arg(args, ObjKibako*); + if (ObjKibako_RandomizerHoldsItem(smallCrateActor, gPlayState)) { + ObjKibako_RandomizerSpawnCollectible(smallCrateActor, gPlayState); + *should = false; + } else { + *should = true; + } + }); + +} + +void Rando::StaticData::RegisterCrateLocations() { + // clang-format off + // Overworld Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_GV_FREESTANDING_POH_CRATE] = Location::Crate(RC_GV_FREESTANDING_POH_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-350, 1480), "Freestanding PoH Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_FREESTANDING_POH_CRATE)); + locationTable[RC_GV_NEAR_COW_CRATE] = Location::Crate(RC_GV_NEAR_COW_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-449, 123), "Near Cow Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_NEAR_COW_CRATE)); + locationTable[RC_GF_ABOVE_JAIL_CRATE] = Location::Crate(RC_GF_ABOVE_JAIL_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(51, -2997), "Above Jail Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ABOVE_JAIL_CRATE)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_1] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1534), "Outside Center Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_1)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_2] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1594), "Outside Center Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_2)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_3] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1782), "Outside Center Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_3)); + locationTable[RC_GF_OUTSIDE_CENTER_CRATE_4] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1842), "Outside Center Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_4)); + locationTable[RC_GF_OUTSIDE_LEFT_CRATE_1] = Location::Crate(RC_GF_OUTSIDE_LEFT_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-60, -2210), "Outside Left Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_LEFT_CRATE_1)); + locationTable[RC_GF_OUTSIDE_LEFT_CRATE_2] = Location::Crate(RC_GF_OUTSIDE_LEFT_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-120, -2210), "Outside Left Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_LEFT_CRATE_2)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_2] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1780), "Archery Range Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_2)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_3] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2020), "Archery Range Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_3)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_4] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2260), "Archery Range Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_4)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_1] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1540), "Archery Range Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_1)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_5] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2500), "Archery Range Crate 5", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_5)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_6] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2740), "Archery Range Crate 6", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_6)); + locationTable[RC_GF_ARCHERY_RANGE_CRATE_7] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2980), "Archery Range Crate 7", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_7)); + locationTable[RC_GF_ARCHERY_START_CRATE_1] = Location::Crate(RC_GF_ARCHERY_START_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3727, -243), "Near Archery Start Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_START_CRATE_1)); + locationTable[RC_GF_ARCHERY_START_CRATE_2] = Location::Crate(RC_GF_ARCHERY_START_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3667, -243), "Near Archery Start Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_START_CRATE_2)); + locationTable[RC_GF_ARCHERY_LEFT_END_CRATE_1] = Location::Crate(RC_GF_ARCHERY_LEFT_END_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3446, -4875), "Archery Left End Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1)); + locationTable[RC_GF_ARCHERY_LEFT_END_CRATE_2] = Location::Crate(RC_GF_ARCHERY_LEFT_END_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3303, -5018), "Archery Left End Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2)); + locationTable[RC_GF_ARCHERY_RIGHT_END_CRATE_1] = Location::Crate(RC_GF_ARCHERY_RIGHT_END_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3406, 414), "Archery Right End Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1)); + locationTable[RC_GF_ARCHERY_RIGHT_END_CRATE_2] = Location::Crate(RC_GF_ARCHERY_RIGHT_END_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3330, 406), "Archery Right End Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2)); + locationTable[RC_GF_KITCHEN_CRATE_1] = Location::Crate(RC_GF_KITCHEN_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1251), "Kitchen Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_1)); + locationTable[RC_GF_KITCHEN_CRATE_2] = Location::Crate(RC_GF_KITCHEN_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1191), "Kitchen Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_2)); + locationTable[RC_GF_KITCHEN_CRATE_3] = Location::Crate(RC_GF_KITCHEN_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -847), "Kitchen Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_3)); + locationTable[RC_GF_KITCHEN_CRATE_4] = Location::Crate(RC_GF_KITCHEN_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -787), "Kitchen Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_4)); + locationTable[RC_GF_KITCHEN_CRATE_5] = Location::Crate(RC_GF_KITCHEN_CRATE_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1610, -624), "Kitchen Crate 5", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_5)); + locationTable[RC_GF_BREAK_ROOM_CRATE_1] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1260, -3155), "Break Room Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_1)); + locationTable[RC_GF_BREAK_ROOM_CRATE_4] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3550), "Break Room Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_4)); + locationTable[RC_GF_BREAK_ROOM_CRATE_2] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1360, -3325), "Break Room Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_2)); + locationTable[RC_GF_BREAK_ROOM_CRATE_3] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3502), "Break Room Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_3)); + locationTable[RC_GF_NORTH_F1_CARPENTER_CRATE] = Location::Crate(RC_GF_NORTH_F1_CARPENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-510, -2213), "North F1 Carpenter Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_CRATE)); + locationTable[RC_GF_NORTH_F3_CARPENTER_CRATE] = Location::Crate(RC_GF_NORTH_F3_CARPENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1090, -2210), "North F3 Carpenter Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F3_CARPENTER_CRATE)); + locationTable[RC_GF_SOUTH_F2_CARPENTER_CRATE_1] = Location::Crate(RC_GF_SOUTH_F2_CARPENTER_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-49, 11), "South F2 Carpenter Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1)); + locationTable[RC_GF_SOUTH_F2_CARPENTER_CRATE_2] = Location::Crate(RC_GF_SOUTH_F2_CARPENTER_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(11, 11), "South F2 Carpenter Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2)); + locationTable[RC_HW_BEFORE_QUICKSAND_CRATE] = Location::Crate(RC_HW_BEFORE_QUICKSAND_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3832, 2840), "Before Quicksand Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_BEFORE_QUICKSAND_CRATE)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_1] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3235, 2313), "After Quicksand Crate 1", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_1)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_2] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3125, 2459), "After Quicksand Crate 2", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_2)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_3] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3026, 2631), "After Quicksand Crate 3", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_3)); + locationTable[RC_HW_NEAR_COLOSSUS_CRATE] = Location::Crate(RC_HW_NEAR_COLOSSUS_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(-1531, -976), "Near Colossus Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_NEAR_COLOSSUS_CRATE)); + locationTable[RC_MK_NEAR_BAZAAR_CRATE_1] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 338), "Near Bazaar Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_1)); + locationTable[RC_MK_NEAR_BAZAAR_CRATE_2] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 132), "Near Bazaar Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_2)); + locationTable[RC_MK_SHOOTING_GALLERY_CRATE_1] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-150, -576), "Shooting Gallery Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_1)); + locationTable[RC_MK_SHOOTING_GALLERY_CRATE_2] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-90, -576), "Shooting Gallery Crate 2", RHT_CRATE_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_2)); + locationTable[RC_MK_LOST_DOG_HOUSE_CRATE] = Location::Crate(RC_MK_LOST_DOG_HOUSE_CRATE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_DOG_LADY_HOUSE, TWO_ACTOR_PARAMS(176, 170), "Lost Dog House Crate", RHT_CRATE_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_LOST_DOG_HOUSE_CRATE)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_1] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(76, -210), "Guard House Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_1)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_2] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -210), "Guard House Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_2)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_3] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 120), "Guard House Crate 3", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_3)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_4] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 168), "Guard House Crate 4", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_4)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_5] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 216), "Guard House Crate 5", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_5)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1039, 10), "Near Open Grotto Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1099, 10), "Near Open Grotto Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(506, -358), "Near Open Grotto Adult Crate 3", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(483, -302), "Near Open Grotto Adult Crate 4", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4)); + locationTable[RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(186, -758), "Near Potion Shop Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(185, 776), "Near Shooting Gallery Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(92, 348), "Near Boarding House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(32, 348), "Near Boarding House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1518), "Near Impas House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1470), "Near Impas House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-433, -401), "Near Bazaar Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-489, -424), "Near Bazaar Adult Crate 2`", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2)); + locationTable[RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE] = Location::Crate(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-724, 871), "Behind GS House Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_GY_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_GY_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1732, 1366), "Near Graveyard Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GY_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_WINDMILL_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 601), "Near Windmill Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_FENCE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_FENCE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 111), "Near Fence Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-60, -46), "Near Boarding House Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_BAZAAR_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-636, -478), "Near Bazaar Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE)); + locationTable[RC_GRAVEYARD_CRATE] = Location::Crate(RC_GRAVEYARD_CRATE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1050, -350), "Freestanding PoH Crate", RHT_CRATE_GRAVEYARD, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_CRATE)); + locationTable[RC_GC_MAZE_CRATE] = Location::Crate(RC_GC_MAZE_CRATE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1124, -1339), "Maze Crate", RHT_CRATE_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_CRATE)); + locationTable[RC_DMC_CRATE] = Location::Crate(RC_DMC_CRATE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-950, 1892), "Crate", RHT_CRATE_DEATH_MOUNTAIN_CRATER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CRATE)); + locationTable[RC_LLR_NEAR_TREE_CRATE] = Location::Crate(RC_LLR_NEAR_TREE_CRATE, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(1160, -2376), "Near Tree Crate", RHT_CRATE_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_NEAR_TREE_CRATE)); + locationTable[RC_LH_LAB_CRATE] = Location::Crate(RC_LH_LAB_CRATE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(90, -119), "Lab Crate", RHT_CRATE_LAKESIDE_LABORATORY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_CRATE)); + + // No Logic Crates + locationTable[RC_GV_CRATE_BRIDGE_1] = Location::NLCrate(RC_GV_CRATE_BRIDGE_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-764, 148), "Near Bridge Crate 1", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_1)); + locationTable[RC_GV_CRATE_BRIDGE_2] = Location::NLCrate(RC_GV_CRATE_BRIDGE_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -125), "Near Bridge Crate 2", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_2)); + locationTable[RC_GV_CRATE_BRIDGE_3] = Location::NLCrate(RC_GV_CRATE_BRIDGE_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -150), "Near Bridge Crate 3", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_3)); + locationTable[RC_GV_CRATE_BRIDGE_4] = Location::NLCrate(RC_GV_CRATE_BRIDGE_4, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -90), "Near Bridge Crate 4", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_4)); + locationTable[RC_GF_ARCHERY_LEFT_END_CHILD_CRATE] = Location::NLCrate(RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3443, -4876), "Archery Left End Child Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE)); + + // MQ Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DEKU_TREE_MQ_LOBBY_CRATE] = Location::Crate(RC_DEKU_TREE_MQ_LOBBY_CRATE, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(279, 333), "MQ Lobby Crate", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -62), "MQ Slingshot Room Crate 1", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -2), "MQ Slingshot Room Crate 2", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1886, -744), "MQ Poe Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1826, -744), "MQ Poe Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1391), "MQ Poe Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1451), "MQ Poe Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1824), "MQ Poe Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1884), "MQ Poe Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1161), "MQ Poe Room Crate 7", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1221), "MQ Poe Room Crate 8", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1730, -1836), "MQ Staircase Lower Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2190, -1835), "MQ Staircase Lower Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1510, -1837), "MQ Staircase Upper Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1511, -1084), "MQ Staircase Upper Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2410, -1084), "MQ Staircase Upper Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2411, -1836), "MQ Staircase Upper Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3191, -897), "MQ Two Flames Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2776, -810), "MQ Two Flames Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1714), "MQ Larvae Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1774), "MQ Larvae Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1871, -1976), "MQ Larvae Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1811, -1976), "MQ Larvae Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1721), "MQ Larvae Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1781), "MQ Larvae Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 769), "MQ Outside Boss Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 709), "MQ Outside Boss Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1130, -654), "MQ Outside Boss Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1211, -775), "MQ Outside Boss Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -417), "MQ Outside Boss Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -534), "MQ Outside Boss Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2249, -56), "MQ Shortcut Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2189, -56), "MQ Shortcut Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2150, 55), "MQ Shortcut Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2135, -62), "MQ Shortcut Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2090, 55), "MQ Shortcut Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2030, 55), "MQ Shortcut Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1147), "MQ Lizalfos Maze Lower Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1195), "MQ Lizalfos Maze Lower Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2124, 1154), "MQ Lizalfos Maze Lower Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1817, 1330), "MQ Lizalfos Maze Upper Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1288), "MQ Lizalfos Maze Upper Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1336), "MQ Lizalfos Maze Upper Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1407, -756), "MQ Lava Torch Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(384, 351), "MQ Lava Torch Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1409, -1176), "MQ Lava Torch Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(999, -402), "MQ Lava Torch Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-150, -336), "MQ Central Pillar Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-210, -336), "MQ Central Pillar Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(299, 485), "MQ Central Pillar Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 486), "MQ Central Pillar Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(222, 204), "MQ Central Pillar Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 425), "MQ Central Pillar Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 365), "MQ Central Pillar Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 426), "MQ Central Pillar Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 366), "MQ Central Pillar Lower Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(162, 204), "MQ Central Pillar Lower Crate 8", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(31, 636), "MQ Central Pillar Lower Crate 9", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(151, 636), "MQ Central Pillar Lower Crate 10", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(102, 204), "MQ Central Pillar Lower Crate 11", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(91, 636), "MQ Central Pillar Lower Crate 12", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 522), "MQ Central Pillar Lower Crate 13", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 582), "MQ Central Pillar Lower Crate 14", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(698, 399), "MQ Lizalfos Hallway Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(437, 576), "MQ Lizalfos Hallway Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(270, 504), "MQ Lizalfos Hallway Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(686, 1016), "MQ Lizalfos Hallway Room Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 870), "MQ Lizalfos Hallway Room Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 810), "MQ Lizalfos Hallway Room Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(524, 839), "MQ Lizalfos Hallway Room Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(525, 954), "MQ Lizalfos Hallway Room Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 570), "MQ Lizalfos Hallway Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 510), "MQ Lizalfos Hallway Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -712), "MQ Storage Room A Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -821), "MQ Storage Room A Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -922), "MQ Storage Room A Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1434, -1036), "MQ Storage Room A Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1374, -1036), "MQ Storage Room A Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1265, -1036), "MQ Storage Room A Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1205, -1036), "MQ Storage Room A Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-892, -91), "MQ GS Storage Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1149, 173), "MQ GS Storage Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1157, -221), "MQ GS Storage Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-945, -315), "MQ GS Storage Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -141), "MQ GS Storage Room Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1103, -315), "MQ GS Storage Room Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-884, 65), "MQ GS Storage Room Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, 56), "MQ GS Storage Room Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1918), "MQ Dragon Room Torches Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1978), "MQ Dragon Room Torches Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1718, -2006), "MQ Dragon Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1778, -2006), "MQ Dragon Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1912), "MQ Dragon Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1972), "MQ Dragon Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1092, -1926), "MQ Dragon Room Door Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1153, -1926), "MQ Dragon Room Door Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1257, -1567), "MQ BK Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1289, -1205), "MQ BK Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-985, -1333), "MQ BK Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1297, -1300), "MQ BK Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1069, -1402), "MQ BK Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-11, -2075), "MQ Whirlpool Front Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-371, -2077), "MQ Whirlpool Front Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-455, -2394), "MQ Whirlpool Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-498, -2661), "MQ Whirlpool Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(11, -2737), "MQ Whirlpool Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-251, -2731), "MQ Whirlpool Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-119, -2481), "MQ Whirlpool Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(126, -2485), "MQ Whirlpool Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-7, -3126), "MQ Whirlpool Behind Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-87, -3126), "MQ Whirlpool Behind Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-303, -3126), "MQ Whirlpool Behind Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-390, -3126), "MQ Whirlpool Behind Gate Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-397, -3818), "MQ Dodongo Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(30, -3215), "MQ Dodongo Room Hall Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-85, -3460), "MQ Dodongo Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-271, -3826), "MQ Dodongo Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(36, -3700), "MQ Dodongo Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2766), "MQ Storage Room B Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2866), "MQ Storage Room B Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2926), "MQ Storage Room B Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1435, -2935), "MQ Storage Room B Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2875), "MQ Storage Room B Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-994, 744), "MQ Triple Torch Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-991, 976), "MQ Triple Torch Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1511, 975), "MQ Triple Torch Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 792), "MQ Triple Torch Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 975), "MQ Triple Torch Room Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 744), "MQ Triple Torch Room Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2183, 977), "MQ Triple Torch Room Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2260, 744), "MQ Triple Torch Room Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2200, 743), "MQ Triple Torch Room Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(510, -1558), "MQ Statue Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(570, -1558), "MQ Statue Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1138), "MQ Big Mirror Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1138), "MQ Big Mirror Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1186), "MQ Big Mirror Crate 3", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1186), "MQ Big Mirror Crate 4", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE] = Location::Crate(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-59, -1598), "MQ Maze Crate", RHT_CRATE_GERUDO_TRAINING_GROUND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE)); + + // Small Crates + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-141, -1945), "Platform Room Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-189, -1925), "Platform Room Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2030, -1172), "After Hammer Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2072, -1135), "After Hammer Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-971, -940), "Before Child Climb Small Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1151, -939), "Before Child Climb Small Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-512, -4592), "MQ Triple Hallway Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-666, -4671), "MQ Triple Hallway Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1599, -1322), "MQ Frozen Eye Switch Small Crate 1", RHT_CRATE_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "MQ Frozen Eye Switch Small Crate 2", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "MQ Frozen Eye Switch Small Crate 3", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1290), "MQ Lizalfos Maze Upper Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1332), "MQ Lizalfos Maze Upper Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(460, 370), "MQ Lava Torch Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1405, -975), "MQ Lava Torch Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(685, 183), "MQ Lava Torch Small Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Small Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1267, 200), "MQ Lava Torch Small Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1952), "MQ Dragon Room Torches Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1911), "MQ Dragon Room Torches Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1991), "MQ Dragon Room Torches Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1470, -622), "MQ Storage Room A Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1341, -621), "MQ Storage Room A Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1393, -621), "MQ Storage Room A Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1284, -621), "MQ Storage Room A Small Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1166, 97), "MQ GS Storage Room Lower Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-992, 382), "MQ GS Storage Room Upper Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(365, 52), "MQ Truth Spinner Small Crate 1", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -62), "MQ Truth Spinner Small Crate 2", RHT_CRATE_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -7), "MQ Truth Spinner Small Crate 3", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(366, 114), "MQ Truth Spinner Small Crate 4", RHT_CRATE_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-271, -983), "MQ Statue Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1382, 190), "MQ Beamos Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE)); + + // clang-format on +} + +static RegisterShipInitFunc initFunc(RegisterShuffleCrates, { "IS_RANDO" }); +static RegisterShipInitFunc locFunc(Rando::StaticData::RegisterCrateLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.h b/soh/soh/Enhancements/randomizer/ShuffleCrates.h new file mode 100644 index 000000000..60cd51dc2 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.h @@ -0,0 +1,16 @@ +#ifndef ShuffleCrates_H +#define ShuffleCrates_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +void ObjKibako2_RandomizerInit(void* actorRef); +void ObjKibako_RandomizerInit(void* actorRef); +#ifdef __cplusplus +}; +#endif + +#endif //ShuffleCrates_H diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 77f67873e..1f50ad58d 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -45,6 +45,7 @@ Context::Context() { &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_FREESTANDING], &mOptions[RSK_SHUFFLE_MERCHANTS], &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], @@ -180,6 +181,9 @@ void Context::GenerateLocationPool() { (location.GetRCType() == RCTYPE_FISH && !mFishsanity->GetFishLocationIncluded(&location)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OFF)) || (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OFF)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || + (location.GetRCType() == RCTYPE_NLCRATE && (mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF) || !mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC))) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OFF)) || (location.GetRCType() == RCTYPE_FAIRY && !mOptions[RSK_SHUFFLE_FAIRIES]) || (location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OFF)) || @@ -191,7 +195,11 @@ void Context::GenerateLocationPool() { // should not have a shuffled item. if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_DUNGEONS)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || - (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS))) { + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_DUNGEONS)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS)) || + (location.GetRCType() == RCTYPE_NLCRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS) && mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_DUNGEONS))) { continue; } // If we've gotten past all the conditions where an overworld location should not be @@ -204,7 +212,10 @@ void Context::GenerateLocationPool() { if ((location.GetRCType() == RCTYPE_FREESTANDING && mOptions[RSK_SHUFFLE_FREESTANDING].Is(RO_SHUFFLE_FREESTANDING_OVERWORLD)) || (location.GetRCType() == RCTYPE_POT && mOptions[RSK_SHUFFLE_POTS].Is(RO_SHUFFLE_POTS_OVERWORLD)) || - (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD))) { + (location.GetRCType() == RCTYPE_GRASS && mOptions[RSK_SHUFFLE_GRASS].Is(RO_SHUFFLE_GRASS_OVERWORLD)) || + (location.GetRCType() == RCTYPE_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD)) || + (location.GetRCType() == RCTYPE_NLCRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD) && mOptions[RSK_LOGIC_RULES].Is(RO_LOGIC_NO_LOGIC)) || + (location.GetRCType() == RCTYPE_SMALL_CRATE && mOptions[RSK_SHUFFLE_CRATES].Is(RO_SHUFFLE_CRATES_OVERWORLD))) { continue; } // also add to that dungeon's location list. diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index 7b5f98f4b..da65ea681 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -382,6 +382,30 @@ Rando::Location Rando::Location::Pot(RandomizerCheck rc, RandomizerCheckQuest qu collectionCheck }; } +Rando::Location Rando::Location::Crate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_CRATE, area_, ACTOR_OBJ_KIBAKO2, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, + collectionCheck }; +} + +Rando::Location Rando::Location::NLCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_NLCRATE, area_, ACTOR_OBJ_KIBAKO2, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, + collectionCheck }; +} + +Rando::Location Rando::Location::SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, + RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck) { + return {rc, quest_, RCTYPE_SMALL_CRATE, area_, ACTOR_OBJ_KIBAKO, scene_, actorParams_, std::move(shortName_), hintKey, vanillaItem, false, + collectionCheck }; +} + Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, int32_t actorParams_, std::string&& shortName_) { return { rc, quest_, RCTYPE_GOSSIP_STONE, area_, ACTOR_EN_GS, scene_, actorParams_, std::move(shortName_), RHT_NONE, RG_NONE, false }; } diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 3806160c8..e66fd58b9 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -204,6 +204,21 @@ class Location { RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); + static Location Crate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + + static Location NLCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + + static Location SmallCrate(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, + SpoilerCollectionCheck collectionCheck); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 129a842ef..9febbd6d8 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -219,6 +219,7 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_6, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_LOBBY_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_1F, []{return true;}), @@ -242,6 +243,8 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DEKU_TREE_MQ_2F, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index bea5801e5..8cd60f268 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -306,10 +306,12 @@ void RegionTable_Init_DodongosCavern() { //EventAccess(&logic->CanClimbDCStairs, []{return logic->HasExplosives || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));}), }, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return true;}), @@ -333,7 +335,11 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER] = Region("Dodongos Cavern MQ Stairs Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku()), + LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return true;}), @@ -392,8 +398,14 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_LARVAE_ROOM] = Region("Dodongos Cavern MQ Larvae Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, true), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts - LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, true), //implied logic->CanKillEnemy(RE_GOLD_SKULTULLA) based on entry reqs. Add crate logic when BONKO is added + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, true), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts + LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, logic->CanBreakCrates()), //implied logic->CanKillEnemy(RE_GOLD_SKULTULLA) based on entry reqs. Add crate logic when BONKO is added + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER, []{return true;}), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts @@ -416,8 +428,10 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM] = Region("Dodongos Cavern MQ Before Upper Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, logic->CanBreakCrates()), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return true;}), @@ -467,11 +481,19 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);}) && //could be a seperate room if it gets busy logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG, true))), //Implies you can avoid/kill the enemies with what you use on the skull, if this assumption is broken, add //&& (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);}) || (logic->CanAvoidEnemy(RE_FIRE_KEESE) && logic->CanAvoidEnemy(RE_MAD_SCRUB))) - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, logic->CanBreakPots()), - LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, logic->CanBreakPots()), - }, { + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, logic->CanBreakPots()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 1af91e7be..8888cdac9 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -327,7 +327,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_HAMMER_RETURN_PATH, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Region("Fire Temple Hammer Return Path", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Region("Fire Temple Hammer Return Path", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); @@ -430,7 +436,10 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM] = Region("Fire Temple MQ Near Boss Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations //If we're using the south torch as the initial torch, or using FAs, we either have to cross to the north to remove the crate, or use a trick to ignore it - LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->FireTimer() > 25 && ctx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && (logic->CanUse(RG_FIRE_ARROWS) || (logic->IsAdult && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_FAIRY_BOW)))) + LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->FireTimer() > 25 && ctx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && (logic->CanUse(RG_FIRE_ARROWS) || (logic->IsAdult && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_FAIRY_BOW)))), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, logic->FireTimer() > 25 && logic->CanBreakCrates()), + }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER, []{return true;}), @@ -450,9 +459,15 @@ void RegionTable_Init_FireTemple() { //Fairies cannot be used for this as it is time sensetive, and NL is only useful with sticks as it disables other magic while in use, so it's tunic or raw damage taking ability. //testing tells me you take 3 ticks of lava damage, which is 12 internal damage or 3/4 of a heart at x1 damage multiplier, performing this run //logic->EffectiveHealth() works in half hearts for whatever reason, meaning this needs a deeper refactor to be perfect, but it should be good enough for now - LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_GORON_TUNIC) || logic->EffectiveHealth() >= 2 || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_STICKS))))))), - LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, logic->CanBreakPots()), - LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_GORON_TUNIC) || logic->EffectiveHealth() >= 2 || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_STICKS))))))), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, logic->FireTimer() > 25 && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return true;}), @@ -522,7 +537,10 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE_CRATE_CAGE] = Region("Fire Temple MQ Lower Maze Crate Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, []{return true;}), @@ -544,7 +562,12 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE_BOX_CAGE] = Region("Fire Temple MQ Upper Maze Box Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, true), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), //Assumes maze access LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, logic->HasExplosives()), }, { @@ -563,7 +586,13 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE] = Region("Fire Temple MQ Maze Shortcut Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, logic->OpenedUpperFireShortcut;), + LOCATION(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, logic->OpenedUpperFireShortcut;), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT, []{return logic->OpenedUpperFireShortcut;}), @@ -600,8 +629,18 @@ void RegionTable_Init_FireTemple() { areaTable[RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM] = Region("Fire Temple MQ High Torch Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, logic->CanBreakPots()), - LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, logic->CanBreakPots()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, logic->CanBreakSmallCrates()), + LOCATION(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 3);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index 3e595c735..2f5ba96bf 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -530,7 +530,14 @@ void RegionTable_Init_ForestTemple() { }); //This room exists to show the actual map layout, and for when the crates get added to logic - areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE);}), Entrance(RR_FOREST_TEMPLE_MQ_BETH_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 6);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index f95b32239..5466c598c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -152,7 +152,11 @@ void RegionTable_Init_GerudoTrainingGround() { areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER] = Region("Gerudo Training Ground MQ Center", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->MQGTGMazeSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), - }, {}, { + }, + { //Locations + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_MAZE_FIRST_LOCK, []{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 3);}), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index ed28e8672..3c45682ae 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -28,10 +28,12 @@ void RegionTable_Init_JabuJabusBelly() { EventAccess(&logic->JabuWestTentacle, []{return logic->JabuRutoIn1F && logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, { //Locations - LOCATION(RC_JABU_JABUS_BELLY_DEKU_SCRUB, logic->HasItem(RG_BRONZE_SCALE) && (logic->IsChild || logic->HasItem(RG_SILVER_SCALE) || ctx->GetTrickOption(RT_JABU_ALCOVE_JUMP_DIVE) || logic->CanUse(RG_IRON_BOOTS)) && logic->CanStunDeku()), + LOCATION(RC_JABU_JABUS_BELLY_DEKU_SCRUB, logic->HasItem(RG_BRONZE_SCALE) && (logic->IsChild || logic->HasItem(RG_SILVER_SCALE) || ctx->GetTrickOption(RT_JABU_ALCOVE_JUMP_DIVE) || logic->CanUse(RG_IRON_BOOTS)) && logic->CanStunDeku()), //We can kill the Stingers with ruto - LOCATION(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, logic->JabuRutoIn1F), - LOCATION(RC_JABU_JABUS_BELLY_MAP_CHEST, logic->JabuWestTentacle), + LOCATION(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, logic->JabuRutoIn1F), + LOCATION(RC_JABU_JABUS_BELLY_MAP_CHEST, logic->JabuWestTentacle), + LOCATION(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_BEGINNING, []{return true;}), @@ -263,6 +265,8 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, logic->CanBreakPots()), LOCATION(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, logic->CanCutShrubs()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->CanUse(RG_BOOMERANG);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index 1ed814adb..3be1acac4 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -126,7 +126,15 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM] = Region("Shadow Temple MQ Spinner Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM] = Region("Shadow Temple MQ Spinner Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, []{return true;}), Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return Here(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}) && (logic->CanUse(RG_HOVER_BOOTS) || Here(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_FIRE_ARROWS);}) || (ctx->GetTrickOption(RT_SHADOW_MQ_GAP) && logic->CanUse(RG_LONGSHOT) && logic->CanJumpslashExceptHammer()));}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index 7982f9ae5..701539ff1 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -32,13 +32,15 @@ void RegionTable_Init_SpiritTemple() { EventAccess(&logic->NutCrate, []{return true;}), }, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), - LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), - LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT)))) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), + LOCATION(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), + LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CHILD_CLIMB, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), @@ -284,6 +286,10 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakPots();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakCrates();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakCrates();})), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanBreakSmallCrates();})), + }, { //Exits //we check possible adult access directly in MQSpiritSharedBrokenWallRoom, so this exit only covers Certain Access @@ -424,6 +430,7 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_MQ_FOUR_BEAMOS_ROOM] = Region("Spirit Temple MQ Four Beamos Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, logic->CanKillEnemy(RE_BEAMOS)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST, []{return logic->CanAvoidEnemy(RE_BEAMOS, true, 4) && logic->CanUse(RG_SONG_OF_TIME) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->CanUse(RG_HOOKSHOT);}), @@ -507,10 +514,14 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM] = Region("Spirit Temple MQ Big Mirror Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, logic->CanBreakPots()), - LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index ddf72fba0..0ae5ac289 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -427,7 +427,11 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH] = Region("Water Temple MQ Central Pillar High", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->MQWaterOpenedPillarB1, []{return ((logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_DINS_FIRE)) || (ctx->GetTrickOption(RT_WATER_MQ_CENTRAL_PILLAR) && logic->CanUse(RG_FIRE_ARROWS))) && (logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_LONGSHOT) && logic->CanJumpslash()));}), - }, {}, { + }, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1, []{return logic->MQWaterB1Switch && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_ZORA_TUNIC);}), }); @@ -443,15 +447,40 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1_FINAL] = Region("Water Temple MQ Central Pillar B1 Final", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, logic->CanBreakCrates()), }, {}); //Region exists to add crate/pot/box locations areaTable[RR_WATER_TEMPLE_MQ_STORAGE_ROOM] = Region("Water Temple MQ Storage Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterLevel(WL_LOW_OR_MID) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8);}), @@ -459,9 +488,19 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_2F] = Region("Water Temple MQ Behind Blue Switch 2F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, logic->CanBreakSmallCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), @@ -479,9 +518,17 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY] = Region("Water Temple MQ Lizalfos Hallway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE, []{return logic->MQWaterLevel(WL_LOW_OR_MID) && logic->CanUse(RG_DINS_FIRE);}), @@ -497,9 +544,11 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE] = Region("Water Temple MQ Lizalfos Cage", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, logic->CanKillEnemy(RE_GOLD_SKULLTULA)), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, logic->CanKillEnemy(RE_GOLD_SKULLTULA)), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, logic->CanBreakCrates()), }, {}); //This room exists to hold the wonderitems that drop from the emblems here. Specifically this assumes you are standing on the final ledge @@ -592,7 +641,15 @@ void RegionTable_Init_WaterTemple() { }); //This region assumes Iron boots to access - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL] = Region("Water Temple MQ Dragon Room Tunnel", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL] = Region("Water Temple MQ Dragon Room Tunnel", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_RIVER_POTS, []{return logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT);}), @@ -602,13 +659,28 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE] = Region("Water Temple MQ Dragon Room Alcove", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->MQWaterDragonTorches, []{return true;}), - }, {}, { + }, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, logic->CanBreakSmallCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL, []{return logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16;}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return logic->HasItem(RG_SILVER_SCALE);}), }); - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_RIVER_POTS, []{return logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL, []{return logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanUse(RG_HOOKSHOT);}), @@ -618,7 +690,8 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH] = Region("Water Temple MQ Boss Key Room Switch", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return true;}), @@ -627,7 +700,15 @@ void RegionTable_Init_WaterTemple() { }); //this exists for the crates in preparation for clips through the grate - areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_PIT] = Region("Water Temple MQ Boss Key Room Pit", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_PIT] = Region("Water Temple MQ Boss Key Room Pit", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH, []{return logic->CanHitSwitch(ED_BOOMERANG);}), }); @@ -653,7 +734,17 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_CHEST, []{return logic->CanUse(RG_IRON_BOOTS) && logic->HasItem(RG_BRONZE_SCALE) && (logic->MQWaterLevel(WL_LOW) || logic->WaterTimer() >= 24);}) }); - areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_ROOM] = Region("Water Temple MQ Triangle Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_ROOM] = Region("Water Temple MQ Triangle Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterB1Switch && ((logic->MQWaterLevel(WL_LOW) && logic->HasItem(RG_GOLDEN_SCALE)) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 40 && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_LONGSHOT))));}), Entrance(RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE, []{return logic->CanUse(RG_FIRE_ARROWS) && ((logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || (logic->CanUse(RG_LONGSHOT) && Here(RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE, []{return logic->ScarecrowsSong();})));}) @@ -661,14 +752,30 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE] = Region("Water Temple MQ Triangle Torch Cage", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, logic->CanBreakCrates()), }, {}); - areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM] = Region("Water Temple MQ Crates Whirlpools Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM] = Region("Water Temple MQ Crates Whirlpools Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), + + }, + { //Exits //we can backflip over the spikes, but land in water. Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterB1Switch && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && (logic->CanUse(RG_LONGSHOT) || logic->HasItem(RG_BRONZE_SCALE));}), @@ -683,9 +790,15 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_SINGLE_STALFOS_ROOM] = Region("Water Temple MQ Single Stalfos Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, true), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, logic->CanBreakCrates()), + }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM, []{return logic->HasItem(RG_SILVER_SCALE) || (logic->IsChild && logic->HasItem(RG_BRONZE_SCALE)) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8 && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT)));}) @@ -699,8 +812,13 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_DODONGO_ROOM] = Region("Water Temple MQ Dodongo Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, logic->CanBreakPots()), - LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, logic->CanBreakPots()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_4_TORCH_ROOM, []{return (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && Here(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return logic->CanKillEnemy(RE_DODONGO, ED_CLOSE, true, 5);});}), @@ -709,7 +827,11 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE] = Region("Water Temple MQ Basement Gated Areas", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), + LOCATION(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA) && logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, logic->CanBreakCrates()), }, { Entrance(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return true;}) }); diff --git a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp index 2dcdf71bb..6233b20ab 100644 --- a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp @@ -43,6 +43,42 @@ void RegionTable_Init_GerudoFortress() { LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, logic->CanBreakPots()), LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, logic->CanBreakPots()), LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, logic->CanBreakPots()), + LOCATION(RC_GF_ABOVE_JAIL_CRATE, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_LEFT_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSIDE_LEFT_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_3, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_4, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_5, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_6, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RANGE_CRATE_7, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_START_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_START_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, logic->IsChild && logic->HasExplosives() && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RIGHT_END_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_ARCHERY_RIGHT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_1, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_2, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_3, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_4, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_KITCHEN_CRATE_5, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_1, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_2, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_3, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_BREAK_ROOM_CRATE_4, ((logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_F1_CARPENTER_CRATE, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_F3_CARPENTER_CRATE, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), + LOCATION(RC_GF_SOUTH_F2_CARPENTER_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_GF_SOUTH_F2_CARPENTER_CRATE_2, logic->CanBreakCrates()), + + //RANDOTODO doublecheck when GF isn't a blob LOCATION(RC_GF_KITCHEN_SUN_FAIRY, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_SUNS_SONG)), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index cc5601fcb..b05b22c48 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -18,10 +18,12 @@ void RegionTable_Init_DeathMountainCrater() { }, { //Locations LOCATION(RC_DMC_WALL_FREESTANDING_POH, logic->FireTimer() >= 16 || logic->Hearts() >= 3), - LOCATION(RC_DMC_GS_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanAttack()), + LOCATION(RC_DMC_GS_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanAttack() && logic->CanBreakCrates()), LOCATION(RC_DMC_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns() && logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), LOCATION(RC_DMC_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS) && logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), LOCATION(RC_DMC_GOSSIP_STONE, logic->HasExplosives() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3)), + LOCATION(RC_DMC_CRATE, (logic->FireTimer() >= 8 || logic->Hearts() >= 3) && logic->IsChild && logic->CanBreakCrates()), + }, { //Exits Entrance(RR_DMC_UPPER_NEARBY, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index 9141f4dcd..86cc1b060 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -36,6 +36,7 @@ void RegionTable_Init_GerudoValley() { LOCATION(RC_GV_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()), LOCATION(RC_GV_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GV_GOSSIP_STONE, true), + LOCATION(RC_GV_NEAR_COW_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), @@ -57,7 +58,8 @@ void RegionTable_Init_GerudoValley() { areaTable[RR_GV_CRATE_LEDGE] = Region("GV Crate Ledge", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_GV_CRATE_FREESTANDING_POH, true), + LOCATION(RC_GV_CRATE_FREESTANDING_POH, logic->CanBreakCrates()), + LOCATION(RC_GV_FREESTANDING_POH_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_GV_UPPER_STREAM, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), @@ -70,6 +72,10 @@ void RegionTable_Init_GerudoValley() { LOCATION(RC_GV_TRADE_SAW, logic->IsAdult && logic->CanUse(RG_POACHERS_SAW)), LOCATION(RC_GV_GS_BEHIND_TENT, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), LOCATION(RC_GV_GS_PILLAR, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()), + LOCATION(RC_GV_CRATE_BRIDGE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_3, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_BRIDGE_4, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_GERUDO_FORTRESS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp index b39a389d2..8081757d2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp @@ -33,6 +33,8 @@ void RegionTable_Init_GoronCity() { LOCATION(RC_GC_UPPER_STAIRCASE_POT_1, logic->CanBreakPots()), LOCATION(RC_GC_UPPER_STAIRCASE_POT_2, logic->CanBreakPots()), LOCATION(RC_GC_UPPER_STAIRCASE_POT_3, logic->CanBreakPots()), + LOCATION(RC_GC_MAZE_CRATE, logic->BlastOrSmash() || (logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBreakCrates())), + }, { //Exits Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index 694d0e3ee..012503d9a 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -12,7 +12,7 @@ void RegionTable_Init_Graveyard() { EventAccess(&logic->BugRock, []{return true;}), }, { //Locations - LOCATION(RC_GRAVEYARD_FREESTANDING_POH, (logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_GY_POH) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_GRAVEYARD_FREESTANDING_POH, (((logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT)) && logic->CanBreakCrates()) || (ctx->GetTrickOption(RT_GY_POH) && logic->CanUse(RG_BOOMERANG))), LOCATION(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtNight), //TODO: This needs to change LOCATION(RC_GRAVEYARD_GS_WALL, logic->IsChild && logic->HookshotOrBoomerang() && logic->AtNight && logic->CanGetNightTimeGS()), LOCATION(RC_GRAVEYARD_GS_BEAN_PATCH, logic->CanSpawnSoilSkull() && logic->CanAttack()), @@ -31,6 +31,7 @@ void RegionTable_Init_Graveyard() { LOCATION(RC_GY_GRASS_10, logic->CanCutShrubs()), LOCATION(RC_GY_GRASS_11, logic->CanCutShrubs()), LOCATION(RC_GY_GRASS_12, logic->CanCutShrubs()), + LOCATION(RC_GRAVEYARD_CRATE, ((logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT)) && logic->CanBreakCrates()), }, { //Exits Entrance(RR_GRAVEYARD_SHIELD_GRAVE, []{return logic->IsAdult || logic->AtNight;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp index 437f93a64..a9b238292 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp @@ -5,7 +5,12 @@ using namespace Rando; void RegionTable_Init_HauntedWasteland() { // clang-format off - areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_HW_BEFORE_QUICKSAND_CRATE, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_GF_OUTSIDE_GATE, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_HW_CROSSING);}), @@ -25,13 +30,21 @@ void RegionTable_Init_HauntedWasteland() { LOCATION(RC_WASTELAND_NEAR_GS_POT_2, logic->CanBreakPots()), LOCATION(RC_WASTELAND_NEAR_GS_POT_3, logic->CanBreakPots()), LOCATION(RC_WASTELAND_NEAR_GS_POT_4, logic->CanBreakPots()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_HW_AFTER_QUICKSAND_CRATE_3, logic->CanBreakCrates()), }, { //Exits Entrance(RR_WASTELAND_NEAR_COLOSSUS, []{return ctx->GetTrickOption(RT_LENS_HW) || logic->CanUse(RG_LENS_OF_TRUTH);}), Entrance(RR_WASTELAND_NEAR_FORTRESS, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_HW_CROSSING);}), }); - areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Region("Wasteland Near Colossus", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Region("Wasteland Near Colossus", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, + { + //Locations + LOCATION(RC_HW_NEAR_COLOSSUS_CRATE, logic->CanBreakCrates()), + }, + { //Exits Entrance(RR_DESERT_COLOSSUS, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return ctx->GetTrickOption(RT_HW_REVERSE) || false;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 7fffa5d72..c0af2acde 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -12,33 +12,51 @@ void RegionTable_Init_Kakariko() { EventAccess(&logic->KakarikoVillageGateOpen, []{return logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER);}), }, { //Locations - LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)), - LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay), - LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay), - LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)), + LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)), + LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay), + LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay), + LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)), //Can kill lower kak skulls with pots - LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), - LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), - LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_GUARDS_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_TREE, logic->IsChild && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer())) && logic->CanGetNightTimeGS()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_KAK_GRASS_1, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_2, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_3, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_4, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_5, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_6, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_7, logic->CanCutShrubs()), + LOCATION(RC_KAK_GRASS_8, logic->CanCutShrubs()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, logic->IsAdult && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_GY_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_FENCE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp index 04ae5fe85..36d3ee1a3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -107,10 +107,11 @@ void RegionTable_Init_LakeHylia() { //Locations LOCATION(RC_LH_LAB_DIVE, logic->HasItem(RG_GOLDEN_SCALE) || (ctx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->CanUse(RG_EYEBALL_FROG)), - LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->CanBreakCrates()), LOCATION(RC_LH_LAB_FRONT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), LOCATION(RC_LH_LAB_LEFT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), LOCATION(RC_LH_LAB_RIGHT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), + LOCATION(RC_LH_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanBreakCrates()), }, { //Exits Entrance(RR_LAKE_HYLIA, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp index 00ce5a3ee..fae41664e 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp @@ -23,6 +23,7 @@ void RegionTable_Init_LonLonRanch() { LOCATION(RC_LLR_RAIN_SHED_POT_1, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_LLR_RAIN_SHED_POT_2, logic->IsChild && logic->CanBreakPots()), LOCATION(RC_LLR_RAIN_SHED_POT_3, logic->IsChild && logic->CanBreakPots()), + LOCATION(RC_LLR_NEAR_TREE_CRATE, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index 02dea3b56..368cbe2e3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -14,14 +14,18 @@ void RegionTable_Init_Market() { areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), - LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_1, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_2, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_3, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_4, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_5, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_6, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_7, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MARKET_GRASS_8, logic->IsChild && logic->CanCutShrubs()), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_NEAR_BAZAAR_CRATE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_SHOOTING_GALLERY_CRATE_2, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), @@ -107,6 +111,11 @@ void RegionTable_Init_Market() { LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_9, logic->IsAdult && logic->CanBreakPots()), LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_10, logic->IsAdult && logic->CanBreakPots()), LOCATION(RC_MK_GUARD_HOUSE_ADULT_POT_11, logic->IsAdult && logic->CanBreakPots()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_1, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_2, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_3, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_4, logic->IsChild && logic->CanBreakCrates()), + LOCATION(RC_MK_GUARD_HOUSE_CRATE_5, logic->IsChild && logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_ENTRANCE, []{return true;}), @@ -210,7 +219,8 @@ void RegionTable_Init_Market() { areaTable[RR_MARKET_DOG_LADY_HOUSE] = Region("Market Dog Lady House", "Market Dog Lady House", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), + LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), + LOCATION(RC_MK_LOST_DOG_HOUSE_CRATE, logic->CanBreakCrates()), }, { //Exits Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 62c14e6ff..97d7630e8 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1054,6 +1054,14 @@ namespace Rando { return true; } + bool Logic::CanBreakCrates() { + return true; + } + + bool Logic::CanBreakSmallCrates() { + return true; + } + bool Logic::HasExplosives(){ return CanUse(RG_BOMB_BAG) || CanUse(RG_BOMBCHU_5); } diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index d8fa9864b..c976287a7 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -237,6 +237,8 @@ class Logic { bool CanBreakUpperBeehives(); bool CanBreakLowerBeehives(); bool CanBreakPots(); + bool CanBreakCrates(); + bool CanBreakSmallCrates(); bool HasFireSource(); bool HasFireSourceWithTorch(); bool TradeQuestStep(RandomizerGet rg); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 576e8c334..fed7e033f 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -271,6 +271,16 @@ void Settings::CreateOptionDescriptions() { "Overworld - Only shuffle pots that are outside of dungeons.\n" "\n" "All pots - Shuffle all pots."; + mOptionDescriptions[RSK_SHUFFLE_CRATES] = "Crates will drop a randomized item the first time they're broken and collected. " + "Crates will have a different appearance when they hold a randomized item.\n" + "\n" + "Off - Crates will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle crates that are within dungeons.\n" + "\n" + "Overworld - Only shuffle crates that are outside of dungeons.\n" + "\n" + "All Crates - Shuffle all crates."; mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n" "\n" "The fishing pole is required to play the fishing pond minigame."; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index f99a38ba3..8d09b6839 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1899,6 +1899,261 @@ std::map rcToRandomizerInf = { { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2 }, { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1 }, { RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2 }, + // Crates + { RC_GV_FREESTANDING_POH_CRATE, RAND_INF_GV_FREESTANDING_POH_CRATE, }, + { RC_GV_NEAR_COW_CRATE, RAND_INF_GV_NEAR_COW_CRATE, }, + { RC_GV_CRATE_BRIDGE_1, RAND_INF_GV_CRATE_BRIDGE_1, }, + { RC_GV_CRATE_BRIDGE_2, RAND_INF_GV_CRATE_BRIDGE_2, }, + { RC_GV_CRATE_BRIDGE_3, RAND_INF_GV_CRATE_BRIDGE_3, }, + { RC_GV_CRATE_BRIDGE_4, RAND_INF_GV_CRATE_BRIDGE_4, }, + { RC_GF_ABOVE_JAIL_CRATE, RAND_INF_GF_ABOVE_JAIL_CRATE, }, + { RC_GF_OUTSIDE_CENTER_CRATE_1, RAND_INF_GF_OUTSIDE_CENTER_CRATE_1, }, + { RC_GF_OUTSIDE_CENTER_CRATE_2, RAND_INF_GF_OUTSIDE_CENTER_CRATE_2, }, + { RC_GF_OUTSIDE_CENTER_CRATE_3, RAND_INF_GF_OUTSIDE_CENTER_CRATE_3, }, + { RC_GF_OUTSIDE_CENTER_CRATE_4, RAND_INF_GF_OUTSIDE_CENTER_CRATE_4, }, + { RC_GF_OUTSIDE_LEFT_CRATE_1, RAND_INF_GF_OUTSIDE_LEFT_CRATE_1, }, + { RC_GF_OUTSIDE_LEFT_CRATE_2, RAND_INF_GF_OUTSIDE_LEFT_CRATE_2, }, + { RC_GF_ARCHERY_RANGE_CRATE_1, RAND_INF_GF_ARCHERY_RANGE_CRATE_1, }, + { RC_GF_ARCHERY_RANGE_CRATE_2, RAND_INF_GF_ARCHERY_RANGE_CRATE_2, }, + { RC_GF_ARCHERY_RANGE_CRATE_3, RAND_INF_GF_ARCHERY_RANGE_CRATE_3, }, + { RC_GF_ARCHERY_RANGE_CRATE_4, RAND_INF_GF_ARCHERY_RANGE_CRATE_4, }, + { RC_GF_ARCHERY_RANGE_CRATE_5, RAND_INF_GF_ARCHERY_RANGE_CRATE_5, }, + { RC_GF_ARCHERY_RANGE_CRATE_6, RAND_INF_GF_ARCHERY_RANGE_CRATE_6, }, + { RC_GF_ARCHERY_RANGE_CRATE_7, RAND_INF_GF_ARCHERY_RANGE_CRATE_7, }, + { RC_GF_ARCHERY_START_CRATE_1, RAND_INF_GF_ARCHERY_START_CRATE_1, }, + { RC_GF_ARCHERY_START_CRATE_2, RAND_INF_GF_ARCHERY_START_CRATE_2, }, + { RC_GF_ARCHERY_LEFT_END_CRATE_1, RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1, }, + { RC_GF_ARCHERY_LEFT_END_CRATE_2, RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2, }, + { RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE, }, + { RC_GF_ARCHERY_RIGHT_END_CRATE_1, RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1, }, + { RC_GF_ARCHERY_RIGHT_END_CRATE_2, RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2, }, + { RC_GF_KITCHEN_CRATE_1, RAND_INF_GF_KITCHEN_CRATE_1, }, + { RC_GF_KITCHEN_CRATE_2, RAND_INF_GF_KITCHEN_CRATE_2, }, + { RC_GF_KITCHEN_CRATE_3, RAND_INF_GF_KITCHEN_CRATE_3, }, + { RC_GF_KITCHEN_CRATE_4, RAND_INF_GF_KITCHEN_CRATE_4, }, + { RC_GF_KITCHEN_CRATE_5, RAND_INF_GF_KITCHEN_CRATE_5, }, + { RC_GF_BREAK_ROOM_CRATE_1, RAND_INF_GF_BREAK_ROOM_CRATE_1, }, + { RC_GF_BREAK_ROOM_CRATE_2, RAND_INF_GF_BREAK_ROOM_CRATE_2, }, + { RC_GF_BREAK_ROOM_CRATE_3, RAND_INF_GF_BREAK_ROOM_CRATE_3, }, + { RC_GF_BREAK_ROOM_CRATE_4, RAND_INF_GF_BREAK_ROOM_CRATE_4, }, + { RC_GF_NORTH_F1_CARPENTER_CRATE, RAND_INF_GF_NORTH_F1_CARPENTER_CRATE, }, + { RC_GF_NORTH_F3_CARPENTER_CRATE, RAND_INF_GF_NORTH_F3_CARPENTER_CRATE, }, + { RC_GF_SOUTH_F2_CARPENTER_CRATE_1, RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1, }, + { RC_GF_SOUTH_F2_CARPENTER_CRATE_2, RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2, }, + { RC_HW_BEFORE_QUICKSAND_CRATE, RAND_INF_HW_BEFORE_QUICKSAND_CRATE, }, + { RC_HW_AFTER_QUICKSAND_CRATE_1, RAND_INF_HW_AFTER_QUICKSAND_CRATE_1, }, + { RC_HW_AFTER_QUICKSAND_CRATE_2, RAND_INF_HW_AFTER_QUICKSAND_CRATE_2, }, + { RC_HW_AFTER_QUICKSAND_CRATE_3, RAND_INF_HW_AFTER_QUICKSAND_CRATE_3, }, + { RC_HW_NEAR_COLOSSUS_CRATE, RAND_INF_HW_NEAR_COLOSSUS_CRATE, }, + { RC_MK_NEAR_BAZAAR_CRATE_1, RAND_INF_MK_NEAR_BAZAAR_CRATE_1, }, + { RC_MK_NEAR_BAZAAR_CRATE_2, RAND_INF_MK_NEAR_BAZAAR_CRATE_2, }, + { RC_MK_SHOOTING_GALLERY_CRATE_1, RAND_INF_MK_SHOOTING_GALLERY_CRATE_1, }, + { RC_MK_SHOOTING_GALLERY_CRATE_2, RAND_INF_MK_SHOOTING_GALLERY_CRATE_2, }, + { RC_MK_LOST_DOG_HOUSE_CRATE, RAND_INF_MK_LOST_DOG_HOUSE_CRATE, }, + { RC_MK_GUARD_HOUSE_CRATE_1, RAND_INF_MK_GUARD_HOUSE_CRATE_1, }, + { RC_MK_GUARD_HOUSE_CRATE_2, RAND_INF_MK_GUARD_HOUSE_CRATE_2, }, + { RC_MK_GUARD_HOUSE_CRATE_3, RAND_INF_MK_GUARD_HOUSE_CRATE_3, }, + { RC_MK_GUARD_HOUSE_CRATE_4, RAND_INF_MK_GUARD_HOUSE_CRATE_4, }, + { RC_MK_GUARD_HOUSE_CRATE_5, RAND_INF_MK_GUARD_HOUSE_CRATE_5, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, }, + { RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, }, + { RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE, }, + { RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, }, + { RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, }, + { RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, }, + { RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, }, + { RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, }, + { RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1, }, + { RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2, }, + { RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, }, + { RC_KAK_NEAR_GY_CHILD_CRATE, RAND_INF_KAK_NEAR_GY_CHILD_CRATE, }, + { RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE, }, + { RC_KAK_NEAR_FENCE_CHILD_CRATE, RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE, }, + { RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, }, + { RC_KAK_NEAR_BAZAAR_CHILD_CRATE, RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE, }, + { RC_GRAVEYARD_CRATE, RAND_INF_GRAVEYARD_CRATE, }, + { RC_GC_MAZE_CRATE, RAND_INF_GC_MAZE_CRATE, }, + { RC_DMC_CRATE, RAND_INF_DMC_CRATE, }, + { RC_LLR_NEAR_TREE_CRATE, RAND_INF_LLR_NEAR_TREE_CRATE, }, + { RC_LH_LAB_CRATE, RAND_INF_LH_LAB_CRATE, }, + + { RC_DEKU_TREE_MQ_LOBBY_CRATE, RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE, }, + { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, }, + { RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, }, + { RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, }, + { RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, }, + { RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, }, + { RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, }, + { RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, }, + { RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, }, + { RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, }, + { RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, }, + + { RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, }, + { RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, }, + { RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, }, + { RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, }, + { RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, }, + { RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, }, + + { RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, }, + { RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, }, + { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, }, + { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, }, + { RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, }, + { RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, }, + { RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, }, + { RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, }, + { RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, }, + { RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, }, + { RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, }, }; BeehiveIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) { @@ -2246,6 +2501,62 @@ GrassIdentity Randomizer::IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 re } return grassIdentity; + +} + +CrateIdentity Randomizer::IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ) { + struct CrateIdentity crateIdentity; + uint32_t crateSceneNum = sceneNum; + + // pretend night is day to align crates in market and align GF child/adult crates + if (sceneNum == SCENE_MARKET_NIGHT) { + crateSceneNum = SCENE_MARKET_DAY; + } else if (sceneNum == SCENE_GERUDOS_FORTRESS && gPlayState->linkAgeOnLoad == 1 && posX == 310) { + if (posZ == -1830) { + posZ = -1842.0f; + } else if (posZ == -1770) { + posZ = -1782.0f; + } + } + + crateIdentity.randomizerInf = RAND_INF_MAX; + crateIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_OBJ_KIBAKO2, crateSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyCrate did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + crateIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + crateIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return crateIdentity; +} + +SmallCrateIdentity Randomizer::IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ) { + struct SmallCrateIdentity smallCrateIdentity; + uint32_t smallCrateSceneNum = sceneNum; + + smallCrateIdentity.randomizerInf = RAND_INF_MAX; + smallCrateIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_OBJ_KIBAKO, smallCrateSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyCrate did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + smallCrateIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + smallCrateIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return smallCrateIdentity; } u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 13718dac4..50bf6636c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -55,6 +55,8 @@ class Randomizer { PotIdentity IdentifyPot(s32 sceneNum, s32 posX, s32 posZ); FishIdentity IdentifyFish(s32 sceneNum, s32 actorParams); GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge); + CrateIdentity IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ); + SmallCrateIdentity IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ); GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, bool checkObtainability = true); ItemObtainability GetItemObtainabilityFromRandomizerCheck(RandomizerCheck randomizerCheck); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 9851f614b..8378f25fb 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -288,6 +288,9 @@ typedef enum { RCTYPE_SONG_LOCATION, // Song locations RCTYPE_BOSS_HEART_OR_OTHER_REWARD, // Boss heart container or lesser dungeon rewards (lens, ice arrow) RCTYPE_POT, // Pots + RCTYPE_CRATE, // Crates + RCTYPE_NLCRATE, // NL Crates + RCTYPE_SMALL_CRATE, // Small crates RCTYPE_DUNGEON_REWARD, // Dungeon rewards (blue warps) RCTYPE_OCARINA, // Ocarina locations RCTYPE_BEEHIVE, // Beehives @@ -2333,6 +2336,266 @@ typedef enum { RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, // End Pots + + // Overworld Crates + RC_GV_FREESTANDING_POH_CRATE, + RC_GV_NEAR_COW_CRATE, + RC_GV_CRATE_BRIDGE_1, + RC_GV_CRATE_BRIDGE_2, + RC_GV_CRATE_BRIDGE_3, + RC_GV_CRATE_BRIDGE_4, + RC_GF_ABOVE_JAIL_CRATE, + RC_GF_OUTSIDE_CENTER_CRATE_1, + RC_GF_OUTSIDE_CENTER_CRATE_2, + RC_GF_OUTSIDE_CENTER_CRATE_3, + RC_GF_OUTSIDE_CENTER_CRATE_4, + RC_GF_OUTSIDE_LEFT_CRATE_1, + RC_GF_OUTSIDE_LEFT_CRATE_2, + RC_GF_ARCHERY_RANGE_CRATE_1, + RC_GF_ARCHERY_RANGE_CRATE_2, + RC_GF_ARCHERY_RANGE_CRATE_3, + RC_GF_ARCHERY_RANGE_CRATE_4, + RC_GF_ARCHERY_RANGE_CRATE_5, + RC_GF_ARCHERY_RANGE_CRATE_6, + RC_GF_ARCHERY_RANGE_CRATE_7, + RC_GF_ARCHERY_START_CRATE_1, + RC_GF_ARCHERY_START_CRATE_2, + RC_GF_ARCHERY_LEFT_END_CRATE_1, + RC_GF_ARCHERY_LEFT_END_CRATE_2, + RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, + RC_GF_ARCHERY_RIGHT_END_CRATE_1, + RC_GF_ARCHERY_RIGHT_END_CRATE_2, + RC_GF_KITCHEN_CRATE_1, + RC_GF_KITCHEN_CRATE_2, + RC_GF_KITCHEN_CRATE_3, + RC_GF_KITCHEN_CRATE_4, + RC_GF_KITCHEN_CRATE_5, + RC_GF_BREAK_ROOM_CRATE_1, + RC_GF_BREAK_ROOM_CRATE_2, + RC_GF_BREAK_ROOM_CRATE_3, + RC_GF_BREAK_ROOM_CRATE_4, + RC_GF_NORTH_F1_CARPENTER_CRATE, + RC_GF_NORTH_F3_CARPENTER_CRATE, + RC_GF_SOUTH_F2_CARPENTER_CRATE_1, + RC_GF_SOUTH_F2_CARPENTER_CRATE_2, + RC_HW_BEFORE_QUICKSAND_CRATE, + RC_HW_AFTER_QUICKSAND_CRATE_1, + RC_HW_AFTER_QUICKSAND_CRATE_2, + RC_HW_AFTER_QUICKSAND_CRATE_3, + RC_HW_NEAR_COLOSSUS_CRATE, + RC_MK_NEAR_BAZAAR_CRATE_1, + RC_MK_NEAR_BAZAAR_CRATE_2, + RC_MK_SHOOTING_GALLERY_CRATE_1, + RC_MK_SHOOTING_GALLERY_CRATE_2, + RC_MK_LOST_DOG_HOUSE_CRATE, + RC_MK_GUARD_HOUSE_CRATE_1, + RC_MK_GUARD_HOUSE_CRATE_2, + RC_MK_GUARD_HOUSE_CRATE_3, + RC_MK_GUARD_HOUSE_CRATE_4, + RC_MK_GUARD_HOUSE_CRATE_5, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + RC_KAK_NEAR_GY_CHILD_CRATE, + RC_KAK_NEAR_WINDMILL_CHILD_CRATE, + RC_KAK_NEAR_FENCE_CHILD_CRATE, + RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + RC_KAK_NEAR_BAZAAR_CHILD_CRATE, + RC_GRAVEYARD_CRATE, + RC_GC_MAZE_CRATE, + RC_DMC_CRATE, + RC_LLR_NEAR_TREE_CRATE, + RC_LH_LAB_CRATE, + + // MQ Dungeon Crates + RC_DEKU_TREE_MQ_LOBBY_CRATE, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + + // Dungeon Small Crates + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + + // MQ Dungeon Small Crates + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, + // End Crates RC_PIERRE, RC_DELIVER_RUTOS_LETTER, @@ -5120,6 +5383,29 @@ typedef enum { RHT_POT_GANONS_CASTLE, RHT_POT_BOTTOM_OF_THE_WELL, RHT_POT_ICE_CAVERN, + // Shuffle Crates + RHT_CRATE_GERUDO_VALLEY, + RHT_CRATE_GERUDOS_FORTRESS, + RHT_CRATE_THIEVES_HIDEOUT, + RHT_CRATE_WASTELAND, + RHT_CRATE_MARKET, + RHT_CRATE_DOG_LADY_HOUSE, + RHT_CRATE_MARKET_GUARD_HOUSE, + RHT_CRATE_KAKARIKO_VILLAGE, + RHT_CRATE_GRAVEYARD, + RHT_CRATE_GORON_CITY, + RHT_CRATE_DEATH_MOUNTAIN_CRATER, + RHT_CRATE_LON_LON_RANCH, + RHT_CRATE_LAKESIDE_LABORATORY, + RHT_CRATE_DEKU_TREE, + RHT_CRATE_DODONGOS_CAVERN, + RHT_CRATE_JABU_JABU, + RHT_CRATE_FOREST_TEMPLE, + RHT_CRATE_FIRE_TEMPLE, + RHT_CRATE_WATER_TEMPLE, + RHT_CRATE_SPIRIT_TEMPLE, + RHT_CRATE_SHADOW_TEMPLE, + RHT_CRATE_GERUDO_TRAINING_GROUND, // Ganon Line RHT_GANON_JOKE01, RHT_GANON_JOKE02, @@ -5458,6 +5744,7 @@ typedef enum { RSK_SHUFFLE_WEIRD_EGG, RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, RSK_SHUFFLE_POTS, + RSK_SHUFFLE_CRATES, RSK_SHUFFLE_FROG_SONG_RUPEES, RSK_ITEM_POOL, RSK_ICE_TRAPS, @@ -5946,6 +6233,14 @@ typedef enum { RO_SHUFFLE_GRASS_ALL, } RandoOptionShuffleGrass; +// Shuffle Crates settings (off, dungeons, overworld, all) +typedef enum { + RO_SHUFFLE_CRATES_OFF, + RO_SHUFFLE_CRATES_DUNGEONS, + RO_SHUFFLE_CRATES_OVERWORLD, + RO_SHUFFLE_CRATES_ALL, +} RandoOptionShuffleCrates; + //Link's Pocket Settings (dungeon reward, advancement, anything, nothing) typedef enum { RO_LINKS_POCKET_DUNGEON_REWARD, @@ -6046,6 +6341,16 @@ typedef struct GrassIdentity { RandomizerCheck randomizerCheck; } GrassIdentity; +typedef struct CrateIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} CrateIdentity; + +typedef struct SmallCrateIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} SmallCrateIdentity; + typedef enum { TRACKER_WINDOW_FLOATING, TRACKER_WINDOW_WINDOW, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 9333913a4..55a8deaa7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -173,6 +173,9 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRCType() != RCTYPE_COW || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCows"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_POT || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShufflePots"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_GRASS || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGrass"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_CRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_NLCRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_SMALL_CRATE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleCrates"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && (location.GetRCType() != RCTYPE_ADULT_TRADE || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleAdultTrade"), RO_GENERIC_NO)) && diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 7d531cb24..0023204ef 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -61,6 +61,8 @@ bool showOverworldPots; bool showDungeonPots; bool showOverworldGrass; bool showDungeonGrass; +bool showOverworldCrates; +bool showDungeonCrates; bool showFrogSongRupees; bool showFairies; bool showStartingMapsCompasses; @@ -1290,6 +1292,25 @@ void LoadSettings() { showDungeonGrass = false; break; } + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_CRATES)) { + case RO_SHUFFLE_CRATES_ALL: + showOverworldCrates = true; + showDungeonCrates = true; + break; + case RO_SHUFFLE_CRATES_OVERWORLD: + showOverworldCrates = true; + showDungeonCrates = false; + break; + case RO_SHUFFLE_CRATES_DUNGEONS: + showOverworldCrates = false; + showDungeonCrates = true; + break; + default: + showOverworldCrates = false; + showDungeonCrates = false; + break; + } } else { // Vanilla showOverworldTokens = true; showDungeonTokens = true; @@ -1297,6 +1318,8 @@ void LoadSettings() { showDungeonPots = false; showOverworldGrass = false; showDungeonGrass = false; + showOverworldCrates = false; + showDungeonCrates = false; } fortressFast = false; @@ -1380,6 +1403,17 @@ bool IsCheckShuffled(RandomizerCheck rc) { (loc->GetRCType() != RCTYPE_GRASS || (showOverworldGrass && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonGrass && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_CRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_NLCRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea()) && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LOGIC_RULES) == + RO_LOGIC_NO_LOGIC) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_SMALL_CRATE || + (showOverworldCrates && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonCrates && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (loc->GetRCType() != RCTYPE_COW || showCows) && (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && (loc->GetRCType() != RCTYPE_FREESTANDING || diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index f061be660..70aa11c06 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -745,6 +745,260 @@ typedef enum { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, + RAND_INF_GV_FREESTANDING_POH_CRATE, + RAND_INF_GV_NEAR_COW_CRATE, + RAND_INF_GV_CRATE_BRIDGE_1, + RAND_INF_GV_CRATE_BRIDGE_2, + RAND_INF_GV_CRATE_BRIDGE_3, + RAND_INF_GV_CRATE_BRIDGE_4, + RAND_INF_GF_ABOVE_JAIL_CRATE, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_1, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_2, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_3, + RAND_INF_GF_OUTSIDE_CENTER_CRATE_4, + RAND_INF_GF_OUTSIDE_LEFT_CRATE_1, + RAND_INF_GF_OUTSIDE_LEFT_CRATE_2, + RAND_INF_GF_ARCHERY_RANGE_CRATE_1, + RAND_INF_GF_ARCHERY_RANGE_CRATE_2, + RAND_INF_GF_ARCHERY_RANGE_CRATE_3, + RAND_INF_GF_ARCHERY_RANGE_CRATE_4, + RAND_INF_GF_ARCHERY_RANGE_CRATE_5, + RAND_INF_GF_ARCHERY_RANGE_CRATE_6, + RAND_INF_GF_ARCHERY_RANGE_CRATE_7, + RAND_INF_GF_ARCHERY_START_CRATE_1, + RAND_INF_GF_ARCHERY_START_CRATE_2, + RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1, + RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2, + RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE, + RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1, + RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2, + RAND_INF_GF_KITCHEN_CRATE_1, + RAND_INF_GF_KITCHEN_CRATE_2, + RAND_INF_GF_KITCHEN_CRATE_3, + RAND_INF_GF_KITCHEN_CRATE_4, + RAND_INF_GF_KITCHEN_CRATE_5, + RAND_INF_GF_BREAK_ROOM_CRATE_1, + RAND_INF_GF_BREAK_ROOM_CRATE_2, + RAND_INF_GF_BREAK_ROOM_CRATE_3, + RAND_INF_GF_BREAK_ROOM_CRATE_4, + RAND_INF_GF_NORTH_F1_CARPENTER_CRATE, + RAND_INF_GF_NORTH_F3_CARPENTER_CRATE, + RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1, + RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2, + RAND_INF_HW_BEFORE_QUICKSAND_CRATE, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_1, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_2, + RAND_INF_HW_AFTER_QUICKSAND_CRATE_3, + RAND_INF_HW_NEAR_COLOSSUS_CRATE, + RAND_INF_MK_NEAR_BAZAAR_CRATE_1, + RAND_INF_MK_NEAR_BAZAAR_CRATE_2, + RAND_INF_MK_SHOOTING_GALLERY_CRATE_1, + RAND_INF_MK_SHOOTING_GALLERY_CRATE_2, + RAND_INF_MK_LOST_DOG_HOUSE_CRATE, + RAND_INF_MK_GUARD_HOUSE_CRATE_1, + RAND_INF_MK_GUARD_HOUSE_CRATE_2, + RAND_INF_MK_GUARD_HOUSE_CRATE_3, + RAND_INF_MK_GUARD_HOUSE_CRATE_4, + RAND_INF_MK_GUARD_HOUSE_CRATE_5, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, + RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, + RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE, + RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, + RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1, + RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2, + RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, + RAND_INF_KAK_NEAR_GY_CHILD_CRATE, + RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE, + RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE, + RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, + RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE, + RAND_INF_GRAVEYARD_CRATE, + RAND_INF_GC_MAZE_CRATE, + RAND_INF_DMC_CRATE, + RAND_INF_LLR_NEAR_TREE_CRATE, + RAND_INF_LH_LAB_CRATE, + + RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, + RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, + RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, + RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, + RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, + RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, + RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, + + RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, + RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, + RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, + + RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, + RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, + RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, + RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, + RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, + RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, + RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, + RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, + RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RAND_INF_CAUGHT_LOACH, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index ba049b32c..8ade6a95a 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -210,6 +210,7 @@ void Settings::CreateOptions() { OPT_BOOL(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD, "Shuffle Gerudo Membership Card", CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), mOptionDescriptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD]); OPT_U8(RSK_SHUFFLE_POTS, "Shuffle Pots", {"Off", "Dungeons", "Overworld", "All Pots"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShufflePots"), mOptionDescriptions[RSK_SHUFFLE_POTS], WidgetType::Combobox, RO_SHUFFLE_POTS_OFF); OPT_U8(RSK_SHUFFLE_GRASS, "Shuffle Grass", {"Off", "Dungeons", "Overworld", "All Grass/Bushes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleGrass"), mOptionDescriptions[RSK_SHUFFLE_GRASS], WidgetType::Combobox, RO_SHUFFLE_GRASS_OFF); + OPT_U8(RSK_SHUFFLE_CRATES, "Shuffle Crates", {"Off", "Dungeons", "Overworld", "All Crates"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleCrates"), mOptionDescriptions[RSK_SHUFFLE_CRATES], WidgetType::Combobox, RO_SHUFFLE_CRATES_OFF); OPT_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]); OPT_U8(RSK_SHUFFLE_MERCHANTS, "Shuffle Merchants", {"Off", "Bean Merchant Only", "All But Beans", "All"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), mOptionDescriptions[RSK_SHUFFLE_MERCHANTS], WidgetType::Combobox, RO_SHUFFLE_MERCHANTS_OFF, IMFLAG_NONE); OPT_U8(RSK_MERCHANT_PRICES, "Merchant Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MerchantPrices"), mOptionDescriptions[RSK_MERCHANT_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); @@ -662,6 +663,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_MERCHANTS], &mOptions[RSK_MERCHANT_PRICES], &mOptions[RSK_MERCHANT_PRICES_FIXED_PRICE], @@ -902,6 +904,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], &mOptions[RSK_SHUFFLE_POTS], + &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], &mOptions[RSK_SHUFFLE_OCARINA], &mOptions[RSK_SHUFFLE_OCARINA_BUTTONS], diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 1ce04687c..fe2e6441b 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -52,6 +52,7 @@ class StaticData { static void RegisterPotLocations(); static void RegisterFreestandingLocations(); static void RegisterGrassLocations(); + static void RegisterCrateLocations(); static void InitHashMaps(); static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c index 16e27e39e..18218355f 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c +++ b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.c @@ -7,6 +7,7 @@ #include "z_obj_kibako.h" #include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_CAN_PRESS_SWITCHES) @@ -68,7 +69,7 @@ void ObjKibako_SpawnCollectible(ObjKibako* this, PlayState* play) { s16 collectible; collectible = this->actor.params & 0x1F; - if ((collectible >= 0) && (collectible <= 0x19)) { + if (GameInteractor_Should(VB_SMALL_CRATE_DROP_ITEM,(collectible >= 0) && (collectible <= 0x19), this)) { Item_DropCollectible(play, &this->actor.world.pos, collectible | (((this->actor.params >> 8) & 0x3F) << 8)); } @@ -284,5 +285,9 @@ void ObjKibako_Draw(Actor* thisx, PlayState* play) { s32 pad; ObjKibako* this = (ObjKibako*)thisx; + if (!GameInteractor_Should(VB_SMALL_CRATE_SETUP_DRAW, true, thisx)) { + return; + } + Gfx_DrawDListOpa(play, gSmallWoodenBoxDL); } diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h index 68e871c78..32a35563f 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h +++ b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h @@ -12,6 +12,7 @@ typedef struct ObjKibako { /* 0x0000 */ Actor actor; /* 0x014C */ ObjKibakoActionFunc actionFunc; /* 0x0150 */ ColliderCylinder collider; + /* */ SmallCrateIdentity smallCrateIdentity; } ObjKibako; // size = 0x019C #endif diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c index d6452d253..e4008ebed 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c +++ b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c @@ -7,6 +7,7 @@ #include "z_obj_kibako2.h" #include "objects/object_kibako2/object_kibako2.h" #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -110,7 +111,7 @@ void ObjKibako2_SpawnCollectible(ObjKibako2* this, PlayState* play) { collectibleFlagTemp = this->collectibleFlag; itemDropped = this->dyna.actor.home.rot.x; - if (itemDropped >= 0 && itemDropped < 0x1A) { + if (GameInteractor_Should(VB_CRATE_DROP_ITEM,itemDropped >= 0 && itemDropped < 0x1A, this)) { Item_DropCollectible(play, &this->dyna.actor.world.pos, itemDropped | (collectibleFlagTemp << 8)); } } @@ -176,5 +177,9 @@ void ObjKibako2_Update(Actor* thisx, PlayState* play) { } void ObjKibako2_Draw(Actor* thisx, PlayState* play) { + if (!GameInteractor_Should(VB_CRATE_SETUP_DRAW, true, thisx)) { + return; + } + Gfx_DrawDListOpa(play, gLargeCrateDL); } diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h index 48c22154f..7629e6aa1 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h +++ b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h @@ -13,6 +13,7 @@ typedef struct ObjKibako2 { /* 0x0164 */ ColliderCylinder collider; /* 0x01B0 */ ObjKibako2ActionFunc actionFunc; /* 0x01B4 */ s16 collectibleFlag; + /* */ CrateIdentity crateIdentity; } ObjKibako2; // size = 0x01B8 #endif