Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
d9a08b0
Update Z3DR
Tacoman369 Aug 25, 2026
79ac89d
Shopsanity Initial
Tacoman369 Aug 29, 2026
63434a2
Update Z3DR
Tacoman369 Aug 29, 2026
2bcb347
Shop Updates
Tacoman369 Aug 30, 2026
3a66a88
Shopsanity text base (#203)
pizza1398 Aug 30, 2026
a2acd46
Trick Names
Tacoman369 Sep 3, 2026
c40d95b
Shopsanity Initial
Tacoman369 Aug 29, 2026
69a4e14
Shop Updates
Tacoman369 Aug 30, 2026
9982fe4
Shopsanity text base (#203)
pizza1398 Aug 30, 2026
f68f994
Trick Names
Tacoman369 Sep 3, 2026
e4f862a
English Trick Names
pizza1398 Sep 3, 2026
6ab82e8
fix: Fix related crashes from Shopsanity implementation.
PhlexPlexico Sep 5, 2026
da92dd2
nit: Update Z3DR
PhlexPlexico Sep 5, 2026
ba65c2d
Merge branch 'Shopsanity' of https://github.com/Z3DR/MM3D_Randomizer …
Tacoman369 Sep 5, 2026
c092f3d
fix: Update module to use shopsanity branch.
PhlexPlexico Sep 5, 2026
ac9c5ad
Shop Messages
Tacoman369 Sep 5, 2026
cf5cd59
Merge branch 'Shopsanity' of https://github.com/Z3DR/MM3D_Randomizer …
Tacoman369 Sep 5, 2026
02d8042
Implement Shop Messages
Tacoman369 Sep 5, 2026
b94f3f2
Item Type
Tacoman369 Sep 5, 2026
dec19b7
Location Flags
Tacoman369 Sep 5, 2026
a2a1fbe
Update Z3dr
Tacoman369 Sep 5, 2026
cffd1d6
Update item_location.cpp
Tacoman369 Sep 6, 2026
7db453a
Update hints.cpp
Tacoman369 Sep 6, 2026
73d4a34
Update item_location.cpp
Tacoman369 Sep 6, 2026
61d2d8d
Refactor CreateShopMessage(s)
pizza1398 Sep 6, 2026
8b7c93f
Refactor CreateShopMessages again
pizza1398 Sep 6, 2026
ea31d18
Try to use GetIceTrapName
pizza1398 Sep 6, 2026
23bf598
nit: Update magic bean description.
PhlexPlexico Sep 6, 2026
69b8547
fix: Update flags to use actual actor params.
PhlexPlexico Sep 6, 2026
18d00e5
fix: Adjust hint message for ice traps.
PhlexPlexico Sep 7, 2026
bfcb25d
Add Curiosity Shop Bomb Bag messages
pizza1398 Sep 7, 2026
77324ac
Add TrickNames to Tingle shops
pizza1398 Sep 7, 2026
0b114f5
Spoiler & Pool
Tacoman369 Sep 7, 2026
31d44a7
Update Z3DR
Tacoman369 Sep 7, 2026
ec8f371
Update IceTrapModels list
pizza1398 Sep 8, 2026
3a28af1
Scrubsanity Initial
Tacoman369 Sep 8, 2026
4f21dba
feat: Include In-Game Option menu during save creation. (#205)
PhlexPlexico Sep 8, 2026
71011b5
Beansanity
Tacoman369 Sep 13, 2026
6f9956d
NonShopItems
Tacoman369 Sep 14, 2026
f57b1f4
Update fill.cpp
Tacoman369 Sep 14, 2026
cb23954
ShopPrices
Tacoman369 Sep 14, 2026
2545115
Update fill.cpp
Tacoman369 Sep 14, 2026
adb2254
InitialScrubPurchaseText
Tacoman369 Sep 14, 2026
174eb48
Match Ice Trap TrickNames to their appearance
pizza1398 Sep 14, 2026
75a6273
fix: Update Z3DR
PhlexPlexico Sep 14, 2026
f42f8cc
MilkBar
Tacoman369 Sep 14, 2026
d6cdf57
Use NonShopItems for messages
pizza1398 Sep 15, 2026
abb6391
Update shop messages
pizza1398 Sep 15, 2026
3c9cac9
Curiosity Shop messages
pizza1398 Sep 15, 2026
bc4f594
Update Z3DR
Tacoman369 Sep 15, 2026
86adb2b
Disable custom pricing on incompatible shops
pizza1398 Sep 16, 2026
2bc3bca
Update patchside data tables
pizza1398 Sep 17, 2026
558d57e
Merge branch 'Shopsanity' of https://github.com/Z3DR/MM3D_Randomizer …
Tacoman369 Sep 17, 2026
c7d9219
Update Z3DR
Tacoman369 Sep 17, 2026
5d10cea
Rudimentary Gorman milk purchase message
pizza1398 Sep 17, 2026
68e7ecb
Settings Updates
Tacoman369 Sep 17, 2026
2f6094f
PirateCutsceneDesc Fix
Tacoman369 Sep 17, 2026
c5d35e4
Update settings.cpp
Tacoman369 Sep 17, 2026
4953a63
nit: Docs update for latest changes
PhlexPlexico Sep 17, 2026
cc43564
Update item_location.cpp
Tacoman369 Sep 18, 2026
295728a
Update item_location.cpp
Tacoman369 Sep 18, 2026
e20e8f1
Add secondary requirements to scrub messages
pizza1398 Sep 18, 2026
d7d3241
fix: Include new shuffle setting for SFX for Link only.
PhlexPlexico Sep 18, 2026
a673c41
nit: revert back to shopsanity branch for mm3dr.
PhlexPlexico Sep 18, 2026
3ad9715
nit: Update repo to point back to dev.
PhlexPlexico Sep 18, 2026
77a87c6
nit: Update docs
PhlexPlexico Sep 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Z3DR
Submodule Z3DR updated 53 files
+31 −0 code/gen_sfx_categories.py
+6 −0 code/include/game/actor.h
+9 −7 code/include/game/common_data.h
+14 −0 code/include/rnd/actors/en_akindonuts.h
+2 −0 code/include/rnd/actors/en_giant.h
+72 −0 code/include/rnd/actors/en_girla.h
+12 −0 code/include/rnd/actors/en_in.h
+12 −0 code/include/rnd/actors/en_ms.h
+23 −0 code/include/rnd/actors/en_tab.h
+3 −0 code/include/rnd/item_override.h
+2 −0 code/include/rnd/models.h
+6 −0 code/include/rnd/ocarina.h
+20 −3 code/include/rnd/savefile.h
+34 −12 code/include/rnd/settings.h
+13 −0 code/include/rnd/sfx.h
+151 −0 code/include/rnd/shops.h
+1 −0 code/include/rnd/spoiler_data.h
+62 −6 code/mm.ld
+1 −1 code/patch.py
+11 −0 code/source/asm/actors/en_akindonuts_hooks.s
+11 −0 code/source/asm/actors/en_akindonuts_patches.s
+16 −0 code/source/asm/actors/en_girla_hooks.s
+6 −0 code/source/asm/actors/en_girla_patches.s
+11 −0 code/source/asm/actors/en_in_hooks.s
+21 −0 code/source/asm/actors/en_in_patches.s
+22 −0 code/source/asm/actors/en_ms_hooks.s
+11 −0 code/source/asm/actors/en_ms_patches.s
+11 −0 code/source/asm/actors/en_tab_hooks.s
+6 −0 code/source/asm/actors/en_tab_patches.s
+12 −1 code/source/asm/en_giant_hooks.s
+6 −1 code/source/asm/en_giant_patches.s
+1 −1 code/source/asm/fairy_hooks.s
+6 −0 code/source/asm/patches.s
+43 −16 code/source/asm/sound_hooks.s
+18 −8 code/source/asm/sound_patches.s
+1 −1 code/source/common/debug.cpp
+8 −14 code/source/lib/abi.c
+8 −4 code/source/main.cpp
+37 −0 code/source/rnd/actors/en_akindonuts.cpp
+25 −0 code/source/rnd/actors/en_giant.cpp
+251 −0 code/source/rnd/actors/en_girla.cpp
+22 −0 code/source/rnd/actors/en_in.cpp
+18 −0 code/source/rnd/actors/en_ms.cpp
+40 −0 code/source/rnd/actors/en_tab.cpp
+19 −9 code/source/rnd/gfx.cpp
+5 −1 code/source/rnd/item_effect.cpp
+120 −11 code/source/rnd/item_override.cpp
+5 −4 code/source/rnd/item_table.cpp
+26 −0 code/source/rnd/models.cpp
+81 −23 code/source/rnd/ocarina.cpp
+38 −2 code/source/rnd/savefile.cpp
+256 −0 code/source/rnd/sfx.cpp
+131 −0 code/source/rnd/shops.cpp
103 changes: 99 additions & 4 deletions docs/release-notes/changelog-latest-nightly.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,103 @@
# Latest Nightly Changes

## Features
- N/A

## Fixes
- Adjust fairies to ensure they are repeatable if the item is not in inventory.
- Adjust fairies to properly respect the fairy bits stored in ext data.
### Shopsanity
- **Shopsanity.** New setting *Off* / *On*. Shuffles 21 shop slots across five shops:

| Shop | Slots | Vanilla stock |
|---|---|---|
| West Clock Town Trading Post | 8 | Red Potion, Green Potion, Hero's Shield, Bottle with Fairy, Deku Stick, 30 Arrows, 10 Deku Nuts, Magic Bean |
| West Clock Town Bomb Shop | 4 | 10 Bombs, 10 Bombchu, Bomb Bag purchase, Big Bomb Bag purchase |
| Southern Swamp Magic Hags' Potion Shop | 3 | Blue Potion, Green Potion, Red Potion |
| Goron Village Shop | 3 | 10 Bombs, 10 Bombchu, Red Potion |
| Zora Hall Shop | 3 | Hero's Shield, 10 Arrows, Red Potion |

The **Milk Bar** (Milk and Chateau Romani, sold separately) and the **Gorman Track milk** purchase
are shuffled in the same pass. The two Bomb Bag purchases also need **Shuffle Main Inventory** to
be on. Tingle maps, scrub purchases and the Curiosity Shop's All-Night Mask keep their own
settings.
- **Shared shelves.** Alternate versions of a shelf sell the same check, share its price and text,
and sell out together: the Trading Post part-timer after 10pm, the Goron Shop in spring, and the
stolen Bomb Bag Sakon fences at the Curiosity Shop (the Bomb Shop's Big Bomb Bag — buying either
one retires both).
- **Shopsanity Prices.** *Random* or *Affordable*. *Random*


### Magic beans
- **Beansanity.** **Shuffle Magic Beans** is no longer hidden and can be turned on. It adds a
**Magic Bean Pack** (a stack of 20 beans) to the item pool and turns the Deku Palace Bean Salesman
into a randomized check costing 60 rupees.
(`71011b5` (Shopsanity), mm3dr `7537273` (shopsanity))
- **The Bean Pack unlocks buying beans.** Logic requires the pack before any bean purchase counts,
and the pack is never placed in a shop since you could not buy it there. The Trading Post's bean
shelf refuses the sale until you have found beans.
(`71011b5` (Shopsanity), mm3dr `e0991d3` (shopsanity))

### Music and sound
- **Music randomizer.** New cosmetic option **Shuffle Music**: *Off*, *Background Music*, *Fanfares* or *All*. The generator shuffles tracks within compatible groups (area, event, battle, fanfare and ocarina music) and the patch plays the shuffled track in place of the original. The same option is also available from the new in-game Options menu.
([MM3D_Randomizer#204](https://github.com/Z3DR/MM3D_Randomizer/pull/204), [mm3dr#190](https://github.com/Z3DR/mm3dr/pull/190))
- **Sound effect randomizer.** New in-game option **Shuffle Sound Effects**: *Off*, *Categorical* or *Chaos*.
([mm3dr#191](https://github.com/Z3DR/mm3dr/pull/191))
- **Mute toggles.** New in-game options **Mute Sound Effects** and **Mute Background Music**.
([mm3dr#189](https://github.com/Z3DR/mm3dr/pull/189))

### Ocarina
- **Fast Ocarina Songs.** New in-game option that skips the song replay after playing any ocarina song: *Don't Skip*, *Skip (No Audio)* or *Skip (Keep Audio)*. This replaces the old fast playback that only applied to Elegy of Emptiness and Song of Soaring.
([mm3dr#188](https://github.com/Z3DR/mm3dr/pull/188))

### Options
- **In-game Options menu.** New Options page on the ingame menu. It holds Fast Ocarina Songs, the mute toggles, Shuffle Music and Shuffle Sound Effects.
([mm3dr#188](https://github.com/Z3DR/mm3dr/pull/188))
- New **In-Game Options** menu in the generator. Lets you override the initial settings of new saves.
(`9886b27`, mm3dr `82c0c77`)

### Quality of life
- **Pirates' cutscene skip.** Skips the cutscene played when heading to Great Bay Temple. *A generator option to toggle this still needs to be added.*
([mm3dr#181](https://github.com/Z3DR/mm3dr/pull/181))

### Ice traps
- **More ice trap disguises.** Ice traps can now look like masks (including transformation masks), trade items, Bomber's Notebook, Tingle maps, the Ocarina of Time, and Skulltula tokens.
(`ec8f371` (Shopsanity))

## Bug Fixes

### Stray fairies
- Fairy chests are now overridden when the fairy inside holds a major item.
([mm3dr#178](https://github.com/Z3DR/mm3dr/pull/178))
- Chest flags now account for fairies.
([mm3dr#184](https://github.com/Z3DR/mm3dr/pull/184))
- Stray fairies are only counted in the stray fairy bits.
([mm3dr#185](https://github.com/Z3DR/mm3dr/pull/185))
- Fairies without a collider no longer give their item twice or show an overhead item.
([mm3dr#186](https://github.com/Z3DR/mm3dr/pull/186), [mm3dr#187](https://github.com/Z3DR/mm3dr/pull/187))
- Stray fairy item text now names the correct progressive item.
([mm3dr#183](https://github.com/Z3DR/mm3dr/pull/183))
- Added a 120-tick delay to item updates with stray fairies so the item is given properly.
([mm3dr#192](https://github.com/Z3DR/mm3dr/pull/192))

### Items
- Mystery Milk is removed correctly again; room key, letters and pendant are still kept.
([mm3dr#187](https://github.com/Z3DR/mm3dr/pull/187))
- Removed a bad instruction from the trade item hooks.
(mm3dr `319b404`)
- Ice traps disguised as Double Defense and as songs now use the correct models.
- Kokiri Sword removed from Ice Trap disguises (redundant with Progressive Sword).
(`ec8f371` (Shopsanity))

### Camera and movement
- Free camera no longer resets while swimming as Zora or rolling as Goron.
([mm3dr#177](https://github.com/Z3DR/mm3dr/pull/177))

### Tracker and text
- Great Bay is now marked as discovered on the spoiler menu when entered.
([mm3dr#179](https://github.com/Z3DR/mm3dr/pull/179))

## Other Changes

- **Custom text commands.** Added two-character commands: `>[1-5]` starts a choice, and `>>`, `><` and `<<` align the active line right, center and left.
([mm3dr#180](https://github.com/Z3DR/mm3dr/pull/180), [mm3dr#182](https://github.com/Z3DR/mm3dr/pull/182))
- The in-game tracker now labels "Inside Clock Tower" as "Clock Tower".
(mm3dr `8f9f13e` (shopsanity))
- New ingame options are ready to have generator settings added.
(mm3dr `34a5e15`)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Nightly 08CEFA

## Features
- N/A

## Fixes
- Adjust fairies to ensure they are repeatable if the item is not in inventory.
- Adjust fairies to properly respect the fairy bits stored in ext data.
8 changes: 4 additions & 4 deletions source/custom_messages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -335,13 +335,13 @@ void CreateBaselineCustomMessages() {

// Ice Trap
CreateMessage(0x0012, 0xFFFF, 0x3FFFFFFF, 0xFF0000,
{" #FOOL!#",
{"><#FOOL!#",
// French
"#IDIOT!#",
"><#IDIOT!#",
// NOT Spanish
" #FOOL!#",
"><#FOOL!#",
// German
"#NARR!#",
"><#NARR!#",
},
{QM_RED}, {}, {}, 0x0, false, false, MESSAGE_END_NORMAL);

Expand Down
34 changes: 32 additions & 2 deletions source/fill.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
#include "hints.hpp"
#include "hint_list.hpp"
#include "entrance.hpp"
//#include "shops.hpp"
#include "shops.hpp"
#include "debug.hpp"

#include <vector>
Expand Down Expand Up @@ -522,6 +522,10 @@ static void AssumedFill(const std::vector<ItemKey>& items, const std::vector<Loc
PlacementLog_Msg("\n Attempted to place " + ItemTable(item).GetName().GetNAEnglish() + " at " + Location(selectedLocation)->GetName());
itemsToPlace.push_back(item);
}
else if (Location(selectedLocation)->IsCategory(Category::cShop) && (item == MAGIC_BEAN_PACK)) {
//Magic Bean Pack is what enables buying beans at shops so it cannot go into a shop itself
itemsToPlace.push_back(item);
}
else {
PlaceItemInLocation(selectedLocation, item);
//PlacementLog_Msg("Placed " + ItemTable(item).GetName().GetNAEnglish() + " at " + Location(selectedLocation)->GetName());
Expand Down Expand Up @@ -781,6 +785,7 @@ static void RandomizeLinksPocket() {
int VanillaFill() {
//Perform minimum needed initialization
// CitraPrint("Starting VanillaFill\n");
ResetNonShopItems();
AreaTable_Init(); //Reset the world graph to intialize the proper locations
ItemReset(); //Reset shops incase of shopsanity random
GenerateLocationPool();
Expand Down Expand Up @@ -832,14 +837,15 @@ int Fill() {
wothLocations.clear();
ocarinaObtainable = false;
songOfTimeObtainable = false;
ResetNonShopItems(); //Before any placement -- see ResetNonShopItems
AreaTable_Init(); //Reset the world graph to intialize the proper locations
ItemReset(); //Reset shops incase of shopsanity random
GenerateLocationPool();
GenerateItemPool();
GenerateStartingInventory();
RemoveStartingItemsFromPool();
FillExcludedLocations();

showItemProgress = true;

//Place dungeon rewards
Expand Down Expand Up @@ -994,6 +1000,30 @@ int Fill() {

AssumedFill(gfItems, gfLocations, true);
}

//Place Shop Items first
//NonShopItems is already sized by ResetNonShopItems
if (Shopsanity){
CitraPrint("Placing Shopsanity Items");
for (size_t i = 0; i < ShopLocationLists.size(); i++) {
for (size_t j = 0; j < ShopLocationLists[i].size(); j++) {
int shopsanityPrice = GetShopPrice();
NonShopItems[GetShopIndex(ShopLocationLists[i][j])].Price = shopsanityPrice; //Set the price for the item to be passed
Location(ShopLocationLists[i][j])->SetShopsanityPrice(shopsanityPrice); //Set the price for the location to be passed
}
}
}
//Below may not be needed?
// //Get all locations and items that dont have a shopsanity price attached
// std::vector<LocationKey> shopLocations = {};
// for (size_t i = 0; i < ShopLocationLists.size(); i++){
// for (int j = 0; j < ShopLocationLists[i].size(); j++){
// LocationKey loc = ShopLocationLists[i][j];
// if (!(Location(loc)->HasShopsanityPrice())) {
// shopLocations.push_back(loc);
// }
// }
// }

//Place Main Inventory First
//So first get all items in the pool + DekuMask,
Expand Down
Loading
Loading