Skip to content

Rando: Boss Soul Shuffle #3300

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 26 commits into from
Nov 20, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
582771a
insert witty commit message here
stratomaster64 Oct 18, 2023
51e965c
Cleaned up soul helpers; added check for ganon soul
stratomaster64 Oct 19, 2023
db4a30a
don't commit at fucking 2am
stratomaster64 Oct 19, 2023
0751c59
also remove phantom ganon's horses if he's not there
stratomaster64 Oct 19, 2023
e005985
Added tracker support
stratomaster64 Oct 19, 2023
ce94c04
Merge remote-tracking branch 'upstream/develop-rando' into soulcalibur
stratomaster64 Oct 20, 2023
4d31463
merge pt 2
stratomaster64 Oct 20, 2023
f41bbea
actually get it running
stratomaster64 Oct 20, 2023
9d8eab4
add souls back to item list
stratomaster64 Oct 20, 2023
2e50fbb
Rework boss soul helper
stratomaster64 Oct 27, 2023
be37cab
pls build on mac
stratomaster64 Oct 28, 2023
9b49d73
playtest feedback; cleanup
stratomaster64 Oct 30, 2023
279af81
Implement custom draw for souls;
stratomaster64 Oct 30, 2023
0a5722d
Fix map/compass hints not showing V/MQ status
stratomaster64 Oct 30, 2023
e1706e2
test model v1
stratomaster64 Oct 31, 2023
b344710
refine boss soul model (thanks sitton76!)
stratomaster64 Nov 1, 2023
58aab05
cleanup hook
stratomaster64 Nov 1, 2023
4006c10
don't kill ganon if no ganon boss soul setting;
stratomaster64 Nov 2, 2023
8ad79a7
horseshit
stratomaster64 Nov 5, 2023
f7b8e8e
Merge remote-tracking branch 'upstream/develop-rando' into soulcalibur
stratomaster64 Nov 5, 2023
4ff7e54
clean out old OTRExporter
stratomaster64 Nov 5, 2023
5de2e73
move boss soul assets
stratomaster64 Nov 5, 2023
05ba787
does this work?
stratomaster64 Nov 5, 2023
e90dc91
gee bill how come you had TWO master swords?
stratomaster64 Nov 5, 2023
aa00765
Merge remote-tracking branch 'upstream/develop-rando' into soulcalibur
stratomaster64 Nov 17, 2023
ae715bd
put boss souls back on the menu
stratomaster64 Nov 17, 2023
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
49 changes: 49 additions & 0 deletions soh/soh/Enhancements/mods.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1015,6 +1015,54 @@ void RegisterRandomizerSheikSpawn() {
});
}

//Boss souls require an additional item (represented by a RAND_INF) to spawn a boss in a particular lair
void RegisterBossSouls() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnActorInit>([](void* actor) {
if (!gPlayState) return;
if (!IS_RANDO || !(OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BOSS_SOULS))) return;
RandomizerInf rand_inf = RAND_INF_MAX;
Actor* actual = (Actor*)actor;
switch (gPlayState->sceneNum){
case SCENE_DEKU_TREE_BOSS:
rand_inf = RAND_INF_GOHMA_SOUL;
break;
case SCENE_DODONGOS_CAVERN_BOSS:
rand_inf = RAND_INF_KING_DODONGO_SOUL;
break;
case SCENE_JABU_JABU_BOSS:
rand_inf = RAND_INF_BARINADE_SOUL;
break;
case SCENE_FOREST_TEMPLE_BOSS:
rand_inf = RAND_INF_PHANTOM_GANON_SOUL;
break;
case SCENE_FIRE_TEMPLE_BOSS:
rand_inf = RAND_INF_VOLVAGIA_SOUL;
break;
case SCENE_WATER_TEMPLE_BOSS:
rand_inf = RAND_INF_MORPHA_SOUL;
break;
case SCENE_SHADOW_TEMPLE_BOSS:
rand_inf = RAND_INF_BONGO_BONGO_SOUL;
break;
case SCENE_SPIRIT_TEMPLE_BOSS:
rand_inf = RAND_INF_TWINROVA_SOUL;
break;
case SCENE_GANONDORF_BOSS:
rand_inf = RAND_INF_GANON_SOUL;
break;
case SCENE_GANON_BOSS:
rand_inf = RAND_INF_GANON_SOUL;
break;
default: break;
}

if (!Flags_GetRandomizerInf(rand_inf) && actual->category == ACTORCAT_BOSS) {
Actor_Delete(&gPlayState->actorCtx, actual, gPlayState);
}
});

}

void InitMods() {
RegisterTTS();
RegisterInfiniteMoney();
Expand All @@ -1041,5 +1089,6 @@ void InitMods() {
RegisterEnemyDefeatCounts();
RegisterAltTrapTypes();
RegisterRandomizerSheikSpawn();
RegisterBossSouls();
NameTag_RegisterHooks();
}
3 changes: 2 additions & 1 deletion soh/soh/Enhancements/randomizer/3drando/fill.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -716,7 +716,8 @@ static void RandomizeDungeonRewards() {
}

for (size_t i = 0; i < dungeonRewardLocations.size(); i++) {
const auto index = Location(dungeonRewardLocations[i])->GetPlacedItem().GetItemID() - baseOffset;
const auto itemID = Location(dungeonRewardLocations[i])->GetPlacedItem().GetItemID();
const auto index = itemID - baseOffset;
rDungeonRewardOverrides[i] = index;

//set the player's dungeon reward on file creation instead of pushing it to them at the start.
Expand Down
101 changes: 101 additions & 0 deletions soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1939,6 +1939,107 @@ void HintTable_Init_Item() {
Text{"a Piece of the Triforce", /*french*/"un fragment de la Triforce", /*spanish*/"un fragmento de la Trifuerza"}
);

hintTable[GOHMA_BOSS_SOUL] = HintText::Item({
//obscure text
Text{"a regal soul", "", ""},
Text("some spider essence", "", ""),
}, {
//ambiguous text
Text("something webbed", "", "")
}, {
//clear text
Text("the soul of Gohma", "", "")}
);

hintTable[KING_DODONGO_BOSS_SOUL] = HintText::Item({
//obscure text
Text{"a royal soul", "", ""},
Text("some reptile essence", "", ""),
}, {
//ambiguous text
Text("something spectral", "", "")
}, {
//clear text
Text("the soul of King Dodongo", "", "")
});
hintTable[BARINADE_BOSS_SOUL] = HintText::Item({
//obscure text
Text{"an infectuous soul", "", ""},
Text("some parasitic essence", "", ""),
}, {
//ambiguous text
Text("something fishy", "", "")
}, {
//clear text
Text("the soul of Barinade", "", "")
});
hintTable[PHANTOM_GANON_BOSS_SOUL] = HintText::Item({
//obscure text
Text{"a duplicate soul", "", ""},
Text("some illusionary essence", "", ""),
}, {
//ambiguous text
Text("something spectral", "", "")
}, {
//clear text
Text("the soul of Phantom Ganon", "", "")
});
hintTable[VOLVAGIA_BOSS_SOUL] = HintText::Item({
//obscure text
Text{"a draconic soul", "", ""},
Text("some magmatic essence", "", ""),
}, {
//ambiguous text
Text("something hot", "", "")
}, {
//clear text
Text("the soul of Volvagia", "", "")
});
hintTable[MORPHA_BOSS_SOUL] = HintText::Item({
//obscure text
Text{"an aquatic soul", "", ""},
Text("some liquid essence", "", ""),
}, {
//ambiguous text
Text("something wet", "", "")
}, {
//clear text
Text("the soul of Barinade", "", "")
});
hintTable[BONGO_BONGO_BOSS_SOUL] = HintText::Item({
//obscure text
Text{"a shadowy soul", "", ""},
Text("some handy essence", "", ""),
}, {
//ambiguous text
Text("something dark", "", "")
}, {
//clear text
Text("the soul of Bongo Bongo", "", "")
});
hintTable[TWINROVA_BOSS_SOUL] = HintText::Item({
//obscure text
Text{"old souls", "", ""},
Text("twin essences", "", ""),
}, {
//ambiguous text
Text("something spiritual", "", "")
}, {
//clear text
Text("the soul of Twinrova", "", "")
});
hintTable[GANON_BOSS_SOUL] = HintText::Item({
//obscure text
Text{"an evil soul", "", ""},
Text("some powerful essence", "", ""),
}, {
//ambiguous text
Text("something strong", "", "")
}, {
//clear text
Text("the soul of Ganon", "", "")
});

hintTable[EPONA] = HintText::Item({
//obscure text
Text{"a horse", /*french*/"un fidèle destrier", /*spanish*/"una yegua"},
Expand Down
11 changes: 11 additions & 0 deletions soh/soh/Enhancements/randomizer/3drando/item_list.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,17 @@ void ItemTable_Init() { // RandomizerGet
itemTable[TRIFORCE] = Item(RG_TRIFORCE, Text{"Triforce", "Triforce", "Trifuerza"}, ITEMTYPE_EVENT, GI_RUPEE_RED_LOSE, false, &noVariable, NONE);
itemTable[HINT] = Item(RG_HINT, Text{"Hint", "Indice", "Pista"}, ITEMTYPE_EVENT, GI_RUPEE_BLUE_LOSE, false, &noVariable, NONE);

//Boss Souls
itemTable[GOHMA_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Gohma's Soul", "Ame de Gohma", "Alma de Gohma"}, ITEMTYPE_ITEM, 0xE1, true, &CanSummonGohma, NONE);
itemTable[KING_DODONGO_BOSS_SOUL] = Item(RG_KING_DODONGO_SOUL, Text{"King Dodongo's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE2, true, &CanSummonKingDodongo, NONE);
itemTable[BARINADE_BOSS_SOUL] = Item(RG_BARINADE_SOUL, Text{"Barinade's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE3, true, &CanSummonBarinade, NONE);
itemTable[PHANTOM_GANON_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Phantom Ganon's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE4, true, &CanSummonPhantomGanon, NONE);
itemTable[VOLVAGIA_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Volvagia's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE5, true, &CanSummonVolvagia, NONE);
itemTable[MORPHA_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Morpha's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE6, true, &CanSummonMorpha, NONE);
itemTable[BONGO_BONGO_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Bongo Bongo's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE7, true, &CanSummonBongoBongo, NONE);
itemTable[TWINROVA_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Twinrova's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE8, true, &CanSummonTwinrova, NONE);
itemTable[GANON_BOSS_SOUL] = Item(RG_GOHMA_SOUL, Text{"Ganon's Soul", "Ame de ", "Alma de "}, ITEMTYPE_ITEM, 0xE9, true, &CanSummonGanon, NONE);

// itemTable[HOOKSHOT] = Item(RG_HOOKSHOT, Text{"Hookshot", "Grappin", "Gancho"}, ITEMTYPE_ITEM, 0x80, true, &ProgressiveHookshot, HOOKSHOT);
// itemTable[LONGSHOT] = Item(RG_LONGSHOT, Text{"Longshot", "Super-Grappin", "Supergancho"}, ITEMTYPE_ITEM, 0x80, true, &ProgressiveHookshot, LONGSHOT);
// itemTable[FAIRY_OCARINA] = Item(RG_FAIRY_OCARINA, Text{"Fairy Ocarina", "Ocarina des fées", "Ocarina de las Hadas"}, ITEMTYPE_ITEM, 0x8B, true, &ProgressiveOcarina, FAIRY_OCARINA);
Expand Down
13 changes: 13 additions & 0 deletions soh/soh/Enhancements/randomizer/3drando/item_pool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,19 @@ void GenerateItemPool() {
PlaceItemInLocation(KAK_100_GOLD_SKULLTULA_REWARD, HUGE_RUPEE, false, true);
}

if (ShuffleBossSouls.IsNot(BOSSSOULS_OFF)) {
AddItemToMainPool(GOHMA_BOSS_SOUL);
AddItemToMainPool(KING_DODONGO_BOSS_SOUL);
AddItemToMainPool(BARINADE_BOSS_SOUL);
AddItemToMainPool(PHANTOM_GANON_BOSS_SOUL);
AddItemToMainPool(VOLVAGIA_BOSS_SOUL);
AddItemToMainPool(BONGO_BONGO_BOSS_SOUL);
AddItemToMainPool(TWINROVA_BOSS_SOUL);
if (ShuffleBossSouls.Is(BOSSSOULS_ON_PLUS_GANON)) {
AddItemToMainPool(GANON_BOSS_SOUL);
}
}

if (BombchusInLogic) {
AddItemToMainPool(PROGRESSIVE_BOMBCHUS, 5);
} else {
Expand Down
11 changes: 11 additions & 0 deletions soh/soh/Enhancements/randomizer/3drando/keys.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,17 @@ typedef enum {
TRIFORCE,
TRIFORCE_PIECE,
TRIFORCE_COMPLETED,

GOHMA_BOSS_SOUL,
KING_DODONGO_BOSS_SOUL,
BARINADE_BOSS_SOUL,
PHANTOM_GANON_BOSS_SOUL,
VOLVAGIA_BOSS_SOUL,
MORPHA_BOSS_SOUL,
BONGO_BONGO_BOSS_SOUL,
TWINROVA_BOSS_SOUL,
GANON_BOSS_SOUL,

EPONA,
HINT,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,9 +253,9 @@ void AreaTable_Init_DekuTree() {
{
// Events
EventAccess(&DekuTreeClear, { [] {
return DekuTreeClear ||
return DekuTreeClear || (CanSummonGohma &&
(CanJumpslash && (Nuts || CanUse(SLINGSHOT) || CanUse(BOW) ||
HookshotOrBoomerang));
HookshotOrBoomerang)));
}}),
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,10 +290,10 @@ void AreaTable_Init_DodongosCavern() {
// Events
EventAccess(&DodongosCavernClear,
{ [] {
return DodongosCavernClear ||
return DodongosCavernClear || (CanSummonKingDodongo &&
(Here(DODONGOS_CAVERN_BOSS_ROOM,
[] { return HasExplosives || (CanUse(MEGATON_HAMMER) && LogicDCHammerFloor); }) &&
(Bombs || GoronBracelet) && CanJumpslash); /*todo add chu kill to tricks*/
(Bombs || GoronBracelet) && CanJumpslash)); /*todo add chu kill to tricks*/
}}),
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ void AreaTable_Init_FireTemple() {
{
// Events
EventAccess(&FireTempleClear,
{ [] { return FireTempleClear || (FireTimer >= 64 && CanUse(MEGATON_HAMMER)); }}),
{ [] { return FireTempleClear || (CanSummonVolvagia && (FireTimer >= 64 && CanUse(MEGATON_HAMMER))); }}),
},
{
// Locations
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -421,8 +421,8 @@ void AreaTable_Init_ForestTemple() {
{
// Events
EventAccess(&ForestTempleClear, { [] {
return ForestTempleClear || ((CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) &&
(CanUse(HOOKSHOT) || CanUse(BOW) || CanUse(SLINGSHOT)));
return ForestTempleClear || (CanSummonPhantomGanon && ((CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) &&
(CanUse(HOOKSHOT) || CanUse(BOW) || CanUse(SLINGSHOT))));
} }),
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ void AreaTable_Init_JabuJabusBelly() {
{
// Events //todo: add pot kill trick
EventAccess(&JabuJabusBellyClear,
{ [] { return JabuJabusBellyClear || (CanUse(BOOMERANG) && CanJumpslash); } }),
{ [] { return JabuJabusBellyClear || (CanSummonBarinade && (CanUse(BOOMERANG) && CanJumpslash)); } }),
},
{
// Locations
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,10 +194,10 @@ void AreaTable_Init_ShadowTemple() {
{
// Events
EventAccess(&ShadowTempleClear, { [] {
return ShadowTempleClear ||
return ShadowTempleClear || (CanSummonBongoBongo &&
((CanUse(LENS_OF_TRUTH) || LogicLensBongo) &&
(CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)) &&
(CanUse(HOOKSHOT) || CanUse(BOW) || CanUse(SLINGSHOT) || LogicShadowBongo));
(CanUse(HOOKSHOT) || CanUse(BOW) || CanUse(SLINGSHOT) || LogicShadowBongo)));
} }),
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -259,8 +259,8 @@ void AreaTable_Init_SpiritTemple() {
{
// Events
EventAccess(&SpiritTempleClear, { [] {
return SpiritTempleClear || (CanUse(MIRROR_SHIELD) &&
(CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)));
return SpiritTempleClear || (CanSummonTwinrova && (CanUse(MIRROR_SHIELD) &&
(CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD))));
} }),
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -318,14 +318,14 @@ void AreaTable_Init_WaterTemple() {
{
// Events
EventAccess(&WaterTempleClear, { [] {
return WaterTempleClear ||
(CanUse(HOOKSHOT) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD)));
return WaterTempleClear || (CanSummonMorpha &&
(CanUse(HOOKSHOT) && (CanUse(KOKIRI_SWORD) || CanUse(MASTER_SWORD) || CanUse(BIGGORON_SWORD))));
} }),
},
{
// Locations
LocationAccess(WATER_TEMPLE_MORPHA_HEART, { [] { return WaterTempleClear; } }),
LocationAccess(MORPHA, { [] { return WaterTempleClear; } }),
LocationAccess(MORPHA, { [] { return CanSummonMorpha && WaterTempleClear; } }),
},
{
// Exits
Expand Down
Loading