prep for clang format (#5202)

This commit is contained in:
Archez 2025-03-25 04:22:18 -04:00 committed by GitHub
parent 0f1fb1e5de
commit aabeffa254
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
76 changed files with 299 additions and 134 deletions

View file

@ -462,7 +462,7 @@ static constexpr std::pair<u16, const char*> actorDescriptionData[] = {
{ ACTOR_EN_ZL4, "Zelda (Child)" },
{ ACTOR_EN_MM2, "Running Man (Adult Era)" },
{ ACTOR_BG_JYA_BLOCK, "Silver Block (Child Era)" },
{ ACTOR_OBJ_WARP2BLOCK, "Navi Infospot (Green, Time Block)" }
{ ACTOR_OBJ_WARP2BLOCK, "Navi Infospot (Green, Time Block)" },
};
static std::unordered_map<u16, const char*> actorDescriptions = std::unordered_map<u16, const char*>(std::begin(actorDescriptionData), std::end(actorDescriptionData));

View file

@ -17,7 +17,7 @@ typedef enum TimerDisplay {
DISPLAY_IN_GAME_TIMER,
DISPLAY_TIME_OF_DAY,
DISPLAY_CONDITIONAL_TIMER,
DISPLAY_NAVI_TIMER
DISPLAY_NAVI_TIMER,
} TimerDisplay;
typedef enum NaviTimerValues {
@ -34,4 +34,4 @@ typedef struct {
const char* timeEnable;
} TimeObject;
extern const std::vector<TimeObject> timeDisplayList;
extern const std::vector<TimeObject> timeDisplayList;

View file

@ -14,6 +14,7 @@
{ sequenceId, { sequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement } }
AudioCollection::AudioCollection() {
// clang-format off
// (originalSequenceId, label, sfxKey, category, canBeReplaced, canBeUsedAsReplacement),
sequenceMap = {
@ -328,7 +329,7 @@ AudioCollection::AudioCollection() {
//SEQUENCE_MAP_ENTRY(NA_SE_VO_DUMMY_0x88_YOBI, "NA_SE_VO_DUMMY_0x88_YOBI", "NA_SE_VO_DUMMY_0x88_YOBI", SEQ_VOICE, true, false), // ..
//SEQUENCE_MAP_ENTRY(NA_SE_VO_DUMMY_0x89_YOBI, "NA_SE_VO_DUMMY_0x89_YOBI", "NA_SE_VO_DUMMY_0x89_YOBI", SEQ_VOICE, true, false), // ..
};
// clang-format on
}
std::string AudioCollection::GetCvarKey(std::string sfxKey) {

View file

@ -618,7 +618,7 @@ void AudioEditor::DrawElement() {
{SEQ_SFX, true },
{SEQ_VOICE, true },
{SEQ_INSTRUMENT, true},
{SEQ_BGM_CUSTOM, true}
{SEQ_BGM_CUSTOM, true},
};
// make temporary sets because removing from the set we're iterating through crashes ImGui
@ -772,7 +772,7 @@ void AudioEditor::DrawElement() {
UIWidgets::PopStyleTabs();
}
std::vector<SeqType> allTypes = { SEQ_BGM_WORLD, SEQ_BGM_EVENT, SEQ_BGM_BATTLE, SEQ_OCARINA, SEQ_FANFARE, SEQ_INSTRUMENT, SEQ_SFX, SEQ_VOICE };
std::vector<SeqType> allTypes = { SEQ_BGM_WORLD, SEQ_BGM_EVENT, SEQ_BGM_BATTLE, SEQ_OCARINA, SEQ_FANFARE, SEQ_INSTRUMENT, SEQ_SFX, SEQ_VOICE, };
void AudioEditor_RandomizeAll() {
for (auto type : allTypes) {

View file

@ -1,4 +1,4 @@
#include "BossRush.h"
#include "BossRush.h"
#include "soh/OTRGlobals.h"
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
@ -34,7 +34,7 @@ BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = {
{ "All", "Alle", "Tous" },
{ "Child", "Kind", "Enfant" },
{ "Adult", "Erwachsener", "Adulte" },
{ "Ganondorf & Ganon", "Ganondorf & Ganon", "Ganondorf & Ganon" }
{ "Ganondorf & Ganon", "Ganondorf & Ganon", "Ganondorf & Ganon" },
}
},
{
@ -45,7 +45,7 @@ BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = {
{ "20", "20", "20" },
{ "3", "3", "3" },
{ "5", "5", "5" },
{ "7", "7", "7" }
{ "7", "7", "7" },
}
},
{
@ -53,7 +53,7 @@ BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = {
{
{ "Limited", "Limitiert", "Limitées" },
{ "Full", "Voll", "Pleines" },
{ "Maxed", "Maximum", "Maximum" }
{ "Maxed", "Maximum", "Maximum" },
}
},
{
@ -61,28 +61,28 @@ BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = {
{
{ "Before Ganondorf", "Vor Ganondorf", "Avant Ganondorf" },
{ "Every Boss", "Bei jedem Boss", "Tous les Boss" },
{ "Never", "Niemals", "Jamais" }
{ "Never", "Niemals", "Jamais" },
}
},
{
{ "HYPER BOSSES:", "HYPER-BOSSE:", "HYPER BOSS:" },
{
{ "No", "Nein", "Non" },
{ "Yes", "Ja", "Oui" }
{ "Yes", "Ja", "Oui" },
}
},
{
{ "MAGIC:", "MAGIE:", "MAGIE:" },
{
{ "Single", "Einzel", "Simple" },
{ "Double", "Doppel", "Double" }
{ "Double", "Doppel", "Double" },
}
},
{
{ "BIG. SWORD:", "BIG.-SCHWERT:", "EPÉE DE BIG.:" },
{
{ "No", "Nein", "Non" },
{ "Yes", "Ja", "Oui" }
{ "Yes", "Ja", "Oui" },
}
},
{
@ -93,35 +93,35 @@ BossRushSetting BossRushOptions[BR_OPTIONS_MAX] = {
{ "Fairy", "Fee", "Fée" },
{ "Red Potion", "Rotes Elixier", "Potion Rouge" },
{ "Green Potion", "Grünes Elixier", "Potion Verte" },
{ "Blue Potion", "Blaues Elixier", "Potion Bleue" }
{ "Blue Potion", "Blaues Elixier", "Potion Bleue" },
}
},
{
{ "LONGSHOT:", "ENTERHAKEN:", "SUPER GRAPPIN:" },
{
{ "No", "Nein", "Non" },
{ "Yes", "Ja", "Oui" }
{ "Yes", "Ja", "Oui" },
}
},
{
{ "HOVER BOOTS:", "GLEITSTIEFEL:", "BOTTES DES AIRS:" },
{
{ "No", "Nein", "Non" },
{ "Yes", "Ja", "Oui" }
{ "Yes", "Ja", "Oui" },
}
},
{
{ "BUNNY HOOD:", "HASENOHREN:", "MASQUE DU LAPIN:" },
{
{ "No", "Nein", "Non" },
{ "Yes", "Ja", "Oui" }
{ "Yes", "Ja", "Oui" },
}
},
{
{ "TIMER:", "TIMER:", "TIMER:" },
{
{ "Yes", "Ja", "Oui" },
{ "No", "Nein", "Non" }
{ "No", "Nein", "Non" },
}
}
};
@ -507,7 +507,7 @@ void BossRush_InitSave() {
static void* sSavePromptNoChoiceTexs[] = {
(void*)gPauseNoENGTex,
(void*)gPauseNoGERTex,
(void*)gPauseNoFRATex
(void*)gPauseNoFRATex,
};
void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) {

View file

@ -37,28 +37,28 @@ typedef enum {
typedef enum {
BR_CHOICE_AMMO_LIMITED,
BR_CHOICE_AMMO_FULL,
BR_CHOICE_AMMO_MAXED
BR_CHOICE_AMMO_MAXED,
} BossRushAmmoChoices;
typedef enum {
BR_CHOICE_HEAL_GANONDORF,
BR_CHOICE_HEAL_EVERYBOSS,
BR_CHOICE_HEAL_NEVER
BR_CHOICE_HEAL_NEVER,
} BossRushHealChoices;
typedef enum {
BR_CHOICE_HYPERBOSSES_NO,
BR_CHOICE_HYPERBOSSES_YES
BR_CHOICE_HYPERBOSSES_YES,
} BossRushHyperBossesChoices;
typedef enum {
BR_CHOICE_MAGIC_SINGLE,
BR_CHOICE_MAGIC_DOUBLE
BR_CHOICE_MAGIC_DOUBLE,
} BossRushMagicChoices;
typedef enum {
BR_CHOICE_BGS_NO,
BR_CHOICE_BGS_YES
BR_CHOICE_BGS_YES,
} BossRushBgsChoices;
typedef enum {
@ -72,20 +72,20 @@ typedef enum {
typedef enum {
BR_CHOICE_LONGSHOT_NO,
BR_CHOICE_LONGSHOT_YES
BR_CHOICE_LONGSHOT_YES,
} BossRushLongshotChoices;
typedef enum {
BR_CHOICE_HOVERBOOTS_NO,
BR_CHOICE_HOVERBOOTS_YES
BR_CHOICE_HOVERBOOTS_YES,
} BossRushHoverBootsChoices;
typedef enum {
BR_CHOICE_BUNNYHOOD_NO,
BR_CHOICE_BUNNYHOOD_YES
BR_CHOICE_BUNNYHOOD_YES,
} BossRushBunnyHoodChoices;
typedef enum {
BR_CHOICE_TIMER_YES,
BR_CHOICE_TIMER_NO
BR_CHOICE_TIMER_NO,
} BossRushTimerChoices;

View file

@ -119,6 +119,7 @@ Color_RGBA8 ColorRGBA8(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
supportsAlpha, supportsRainbow, advancedOption \
} }
// clang-format off
/*
So, you would like to add a new cosmetic option? BUCKLE UP
@ -439,6 +440,7 @@ static std::map<std::string, CosmeticOption> cosmeticOptions = {
COSMETIC_OPTION("NPC.MetalTrap", "Metal Trap", COSMETICS_GROUP_NPC, ColorRGBA8(255, 255, 255, 255), false, true, true),
COSMETIC_OPTION("NPC.IronKnuckles", "Iron Knuckles", COSMETICS_GROUP_NPC, ColorRGBA8(245, 255, 205, 255), false, true, false),
};
// clang-format on
static const char* MarginCvarList[] {
CVAR_COSMETIC("HUD.Hearts"),
@ -461,7 +463,7 @@ static const char* MarginCvarList[] {
CVAR_COSMETIC("HUD.ArcheryScore"),
CVAR_COSMETIC("HUD.TitleCard.Map"),
CVAR_COSMETIC("HUD.TitleCard.Boss"),
CVAR_COSMETIC("HUD.IGT")
CVAR_COSMETIC("HUD.IGT"),
};
static const char* MarginCvarNonAnchor[] {
@ -469,7 +471,7 @@ static const char* MarginCvarNonAnchor[] {
CVAR_COSMETIC("HUD.Timers"),
CVAR_COSMETIC("HUD.ArcheryScore"),
CVAR_COSMETIC("HUD.TitleCard.Map"),
CVAR_COSMETIC("HUD.TitleCard.Boss")
CVAR_COSMETIC("HUD.TitleCard.Boss"),
};
void SetMarginAll(const char* ButtonName, bool SetActivated, const char* tooltip) {

View file

@ -25,7 +25,7 @@ typedef enum {
COSMETICS_GROUP_NAVI,
COSMETICS_GROUP_IVAN,
COSMETICS_GROUP_MESSAGE,
COSMETICS_GROUP_MAX
COSMETICS_GROUP_MAX,
} CosmeticGroup;
#ifdef __cplusplus

View file

@ -1,6 +1,6 @@
typedef enum {
COLORSCHEME_N64,
COLORSCHEME_GAMECUBE
COLORSCHEME_GAMECUBE,
} DefaultColorScheme;
typedef enum {
@ -15,5 +15,5 @@ typedef enum {
ANCHOR_RIGHT,
ANCHOR_NONE,
HIDDEN,
ANCHOR_TO_LIFE_METER
ANCHOR_TO_LIFE_METER,
} PosType;

View file

@ -18,11 +18,11 @@ static const std::unordered_map<std::string, char> textBoxSpecialCharacters = {
};
static const std::unordered_map<std::string, std::string> percentColors = { { "w", QM_WHITE }, { "r", QM_RED }, { "g", QM_GREEN },
{ "b", QM_BLUE }, { "c", QM_LBLUE }, { "p", QM_PINK },
{ "y", QM_YELLOW }, { "B", QM_BLACK } };
{ "y", QM_YELLOW }, { "B", QM_BLACK }, };
static const std::unordered_map<std::string, std::string> colorToPercent = { { QM_WHITE, "%w" }, { QM_RED, "%r"}, { QM_GREEN, "%g" },
{ QM_BLUE, "%b" }, { QM_LBLUE, "%c"}, { QM_PINK, "%p" },
{ QM_YELLOW, "%y" }, { QM_BLACK, "%B" } };
{ QM_YELLOW, "%y" }, { QM_BLACK, "%B" }, };
static const std::unordered_map<std::string, ItemID> altarIcons = {
{ "0", ITEM_KOKIRI_EMERALD },
@ -44,7 +44,7 @@ static const std::unordered_map<std::string, ItemID> altarIcons = {
{ "m", ITEM_DUNGEON_MAP },
{ "C", ITEM_COMPASS },
{ "s", ITEM_SKULL_TOKEN },
{ "g", ITEM_MASK_GORON }
{ "g", ITEM_MASK_GORON },
};
static std::map<std::string, int> pixelWidthTable = {
@ -72,7 +72,7 @@ static std::map<std::string, int> pixelWidthTable = {
{ "í", 5 }, { "î", 5 }, { "ï", 5 }, { "ð", 7 }, { "ñ", 7 }, { "ò", 7 }, { "ó", 7 }, { "ô", 7 },
{ "õ", 7 }, { "ö", 7 }, { "÷", 11 }, { "ø", 9 }, { "ù", 7 }, { "ú", 7 }, { "û", 7 }, { "ü", 7 },
{ "ý", 8 }, { "þ", 8 }, { "ÿ", 8 }, { "Œ", 11 }, { "œ", 11 }, { "", 5 }, { "", 5 }, { "", 10 },
{ "Ÿ", 10 }, { "~", 8 }
{ "Ÿ", 10 }, { "~", 8 },
};
CustomMessage::CustomMessage(std::string english_, std::string german_, std::string french_, TextBoxType type_,

View file

@ -181,7 +181,7 @@ static const char* msgStaticTbl[] =
gFadingMessageBackgroundTex,
gMessageContinueTriangleTex,
gMessageEndSquareTex,
gMessageArrowTex
gMessageArrowTex,
};
void MessageDebug_StartTextBox(const char* tableId, uint16_t textId, uint8_t language) {

View file

@ -42,7 +42,7 @@ typedef enum {
LIST,
TARGET,
HELD,
INTERACT
INTERACT,
} RetrievalMethod;
std::array<const char*, 12> acMapping = {
@ -230,7 +230,7 @@ static std::vector<u16> noParamsActors = {
ACTOR_UNSET_15D,
ACTOR_UNSET_161,
ACTOR_UNSET_180,
ACTOR_UNSET_1AA
ACTOR_UNSET_1AA,
};
static std::unordered_map<u16, std::function<s16(s16)>> actorSpecificData;
@ -402,7 +402,7 @@ void CreateActorSpecificData() {
"Zora Tunic",
"Goron Tunic",
"Bombs (Special)",
"Bombchus"
"Bombchus",
};
int selectedItem = params & 0xFF;
@ -439,7 +439,7 @@ void CreateActorSpecificData() {
"Zora Tunic",
"Goron Tunic",
"Bombs (Special)",
"Bombchus"
"Bombchus",
};
int selectedItem = params & 0xFF;
@ -519,7 +519,7 @@ void CreateActorSpecificData() {
"Bombs (5) (35 Rupees)",
"Red Potion (40 Rupees)",
"Red Potion (50 Rupees)",
"Randomizer Item"
"Randomizer Item",
};
int selectedItem = params;
if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) {
@ -537,7 +537,7 @@ void CreateActorSpecificData() {
"Spawned Falling (2)",
//"INVALID",
"Ceiling Spot Spawner",
"On Floor"
"On Floor",
};
int selectedItem = params > 3 ? params - 1 : params;
if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) {
@ -568,7 +568,7 @@ void CreateActorSpecificData() {
"Magic Fire",
"Magic Wind",
"Magic Dark",
"Bullet Bag"
"Bullet Bag",
};
int selectedItem = params;
if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) {
@ -587,7 +587,7 @@ void CreateActorSpecificData() {
"Spawner",
"Revive Death",
"Heal",
"Heal Big"
"Heal Big",
};
int selectedItem = params;
if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) {
@ -601,7 +601,7 @@ void CreateActorSpecificData() {
static const char* items[] = {
"Cutscene", //0
"Normal", //1
"Laser" //100
"Laser", //100
};
int selectedItem = params == 100 ? 2 : params;
if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) {
@ -647,7 +647,7 @@ void CreateActorSpecificData() {
"UNK 7",
"Orange",
"Green",
"Red"
"Red",
};
int selectedItem = params + 2;
if (ImGui::Combo("Type", &selectedItem, items, IM_ARRAYSIZE(items))) {
@ -716,7 +716,7 @@ void CreateActorSpecificData() {
"Switch Flag Fall Small",
"9",
"10",
"Switch Flag Big"
"Switch Flag Big",
};
int type = (params >> 12) & 0xF;

View file

@ -1659,7 +1659,7 @@ const std::vector<std::string> state1 = {
"In Item Cutscene",
"In Cutscene",
"30", //Unknown
"Floor collision disabled"
"Floor collision disabled",
};
const std::vector<std::string> state2 = {
@ -1694,7 +1694,7 @@ const std::vector<std::string> state2 = {
"Idling",
"Disabled draw func",
"Sword Lunge",
"Void out"
"Void out",
};
const std::vector<std::string> state3 = {
@ -1705,7 +1705,7 @@ const std::vector<std::string> state3 = {
"Check Floor Water Collision",
"Force Pull Ocarina",
"Restore Nayru's Love",
"Travelling to Hook Target"
"Travelling to Hook Target",
};
class SaveEditorWindow : public Ship::GuiWindow {

View file

@ -22,6 +22,7 @@ s32 GfxPrint_Printf(GfxPrint* printer, const char* fmt, ...);
ImVec4 WHITE = ImVec4(1.0f, 1.0f, 1.0f, 1.0f);
// clang-format off
std::vector<ValueTableElement> valueTable = {
{ "Time", "gSaveContext.dayTime", "TIME:", TYPE_U16, false, []() -> void* { return &gSaveContext.dayTime; }, WHITE },
{ "Age", "gSaveContext.linkAge", "AGE:", TYPE_S32, false, []() -> void* { return &gSaveContext.linkAge; }, WHITE },
@ -71,6 +72,7 @@ std::vector<ValueTableElement> valueTable = {
"Deku Tree Warp Timer" u16 0x801F83A2
*/
};
// clang-format on
extern "C" void ValueViewer_Draw(GfxPrint* printer) {
for (int i = 0; i < valueTable.size(); i++) {

View file

@ -11,14 +11,14 @@ typedef enum {
CSMC_DISABLED,
CSMC_BOTH,
CSMC_TEXTURE,
CSMC_SIZE
CSMC_SIZE,
} ChestStyleMatchesContentsType;
typedef enum {
SGIA_DISABLED,
SGIA_JUNK,
SGIA_ALL,
SGIA_SIZE
SGIA_SIZE,
} SkipGetItemAnimationType;
typedef enum {
@ -31,7 +31,7 @@ typedef enum {
typedef enum {
BUNNY_HOOD_VANILLA,
BUNNY_HOOD_FAST,
BUNNY_HOOD_FAST_AND_JUMP
BUNNY_HOOD_FAST_AND_JUMP,
} BunnyHoodMode;
typedef enum {
@ -55,7 +55,7 @@ typedef enum {
typedef enum {
BOOTSEQUENCE_DEFAULT,
BOOTSEQUENCE_AUTHENTIC,
BOOTSEQUENCE_FILESELECT
BOOTSEQUENCE_FILESELECT,
} BootSequenceType;
typedef enum {

View file

@ -709,6 +709,7 @@ void SetupDisplayNames() {
// To add a timestamp for an item or event, add it to this list and ensure
// it has a corresponding entry in the enum (see gameplaystats.h)
// clang-format off
strcpy(itemTimestampDisplayName[ITEM_BOW], "Fairy Bow: ");
strcpy(itemTimestampDisplayName[ITEM_ARROW_FIRE], "Fire Arrows: ");
strcpy(itemTimestampDisplayName[ITEM_DINS_FIRE], "Din's Fire: ");
@ -799,6 +800,7 @@ void SetupDisplayNames() {
strcpy(itemTimestampDisplayName[TIMESTAMP_BOSSRUSH_FINISH], "Boss Rush Finished: ");
strcpy(itemTimestampDisplayName[TIMESTAMP_FOUND_GREG], "Greg Found: ");
strcpy(itemTimestampDisplayName[TIMESTAMP_TRIFORCE_COMPLETED], "Triforce Completed: ");
// clang-format on
}
void SetupDisplayColors() {

View file

@ -715,7 +715,8 @@ void RegisterEnemyDefeatCounts() {
break;
case ACTOR_EN_TP:
if (actor->params == TAILPASARAN_HEAD) { // Only count the head, otherwise each body segment will increment
// Only count the head, otherwise each body segment will increment
if (actor->params == TAILPASARAN_HEAD) {
gSaveContext.ship.stats.count[COUNT_ENEMIES_DEFEATED_TAILPASARAN]++;
}
break;
@ -833,8 +834,8 @@ void RegisterRandomizedEnemySizes() {
randomNumber = rand() % 200;
// Between 100% and 300% size.
randomScale = 1.0f + (randomNumber / 100);
// Small actor
} else {
// Small actor
randomNumber = rand() % 90;
// Between 10% and 100% size.
randomScale = 0.1f + (randomNumber / 100);

View file

@ -22,6 +22,7 @@ using namespace std::literals::string_literals;
namespace Rando {
void StaticData::HintTable_Init() {
// clang-format off
/*--------------------------
| GENERAL TEXT |
---------------------------*/
@ -46,12 +47,13 @@ void StaticData::HintTable_Init() {
"Man erzählt sich, daß #[[2]]# #[[1]]# horte.",
/*french*/ "Selon moi, #[[2]]# recèle #[[1]]#.", {QM_RED, QM_GREEN}));
// /*spanish*/ "Según dicen, #[[2]]# acapara #[[1]]#."
// clang-format on
HintTable_Init_Item();
HintTable_Init_Exclude_Overworld();
HintTable_Init_Exclude_Dungeon();
// clang-format off
/*--------------------------
| SOMETIMES HINT TEXT |
---------------------------*/
@ -2418,5 +2420,6 @@ void StaticData::HintTable_Init() {
/*german*/ "&Man kann darauf die Worte&%r\"Master Quest\"%w entziffern...",
/*french*/ "&Étrange... les mots %r\"Master&Quest\"%w sont gravés dessus."));
// clang-format on
}
}

View file

@ -4,10 +4,12 @@
namespace Rando {
void StaticData::HintTable_Init_Exclude_Dungeon() {
/*--------------------------
| DEKU TREE |
---------------------------*/
hintTextTable[RHT_DEKU_TREE_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.",
// clang-format off
/*--------------------------
| DEKU TREE |
---------------------------*/
hintTextTable[RHT_DEKU_TREE_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.",
/*german*/ "Man erzählt sich, daß im #Zentrum des Deku-Baums# #[[1]]# läge.",
/*french*/ "Selon moi, #le centre de l'Arbre Mojo# recèle #[[1]]#.", {QM_RED, QM_GREEN}));
// /*spanish*/ Según dicen, al #centro del Gran Árbol Deku# yace #[[1]]#.
@ -2173,5 +2175,6 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th
/*german*/ "",
/*french*/ "Selon moi, un #coeur dans le Château de Ganon# cache #[[1]]#.", {QM_RED, QM_GREEN}));
// clang-format on
}
}

View file

@ -4,6 +4,7 @@
namespace Rando {
void StaticData::HintTable_Init_Exclude_Overworld() {
// clang-format off
hintTextTable[RHT_KF_KOKIRI_SWORD_CHEST] = HintText(CustomMessage("They say that the #hidden treasure of the Kokiri# is #[[1]]#.",
/*german*/ "Man erzählt sich, daß der #versteckte Schatz der Kokiri# #[[1]]# sei.",
@ -1954,5 +1955,6 @@ void StaticData::HintTable_Init_Exclude_Overworld() {
hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a royal tomb# reveals #[[1]]#.", { QM_RED, QM_GREEN }));
// clang-format on
}
}

View file

@ -5,7 +5,8 @@
namespace Rando {
void StaticData::HintTable_Init_Item() {
// clang-format off
hintTextTable[RHT_KOKIRI_SWORD] = HintText(CustomMessage("the Kokiri Sword", /*german*/"das Kokiri-Schwert", /*french*/"l'Épée Kokiri"),
// /*spanish*/la Espada Kokiri
{
@ -2169,5 +2170,6 @@ void StaticData::HintTable_Init_Item() {
hintTextTable[RHT_MYSTERIOUS_ITEM_CAPITAL] = HintText(CustomMessage("Mysterious Item", /*german*/"Mysteriöser Gegenstand", /*french*/"Objet Mystérieux"));
// /*spanish*/Algo Misterioso
// clang-format on
}
}

View file

@ -149,7 +149,7 @@ const std::array<RandomizerGet, 44> easyItems = {
RG_PIECE_OF_HEART,
};
const std::array<RandomizerGet, 43> normalItems = {
RG_PIECE_OF_HEART, //35 pieces of heart
// 35 pieces of heart
RG_PIECE_OF_HEART,
RG_PIECE_OF_HEART,
RG_PIECE_OF_HEART,
@ -184,7 +184,9 @@ const std::array<RandomizerGet, 43> normalItems = {
RG_PIECE_OF_HEART,
RG_PIECE_OF_HEART,
RG_PIECE_OF_HEART,
RG_HEART_CONTAINER, //8 heart containers
RG_PIECE_OF_HEART,
// 8 heart containers
RG_HEART_CONTAINER,
RG_HEART_CONTAINER,
RG_HEART_CONTAINER,
RG_HEART_CONTAINER,

View file

@ -41,7 +41,7 @@ typedef struct {
typedef enum PlandoTabs {
TAB_HINTS,
TAB_LOCATIONS
TAB_LOCATIONS,
} PlandoTabs;
typedef enum PlandoHints {
@ -49,4 +49,4 @@ typedef enum PlandoHints {
HINT_ALL,
} PlandoHints;
#endif
#endif

View file

@ -59,6 +59,7 @@ void RegisterShuffleCows() {
static RegisterShipInitFunc initFunc(RegisterShuffleCows, { "IS_RANDO" });
void Rando::StaticData::RegisterCowLocations() {
// clang-format-off
locationTable[RC_KF_LINKS_HOUSE_COW] = Location::Base(RC_KF_LINKS_HOUSE_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_LINKS_HOUSE, 0x00, "Links House Cow", RHT_KF_LINKS_HOUSE_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW));
locationTable[RC_HF_COW_GROTTO_COW] = Location::Base(RC_HF_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_HYRULE_FIELD, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3485, -291), "Cow Grotto Cow", RHT_HF_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW));
locationTable[RC_LLR_STABLES_LEFT_COW] = Location::Base(RC_LLR_STABLES_LEFT_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_STABLE, TWO_ACTOR_PARAMS(-122, -254), "Stables Left Cow", RHT_LLR_STABLES_LEFT_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW));
@ -69,6 +70,8 @@ void Rando::StaticData::RegisterCowLocations() {
locationTable[RC_DMT_COW_GROTTO_COW] = Location::Base(RC_DMT_COW_GROTTO_COW, RCQUEST_BOTH, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_COW, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2444, -471), "Cow Grotto Cow", RHT_DMT_COW_GROTTO_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW));
locationTable[RC_GV_COW] = Location::Base(RC_GV_COW, RCQUEST_BOTH, RCTYPE_COW, ACTOR_EN_COW, SCENE_GERUDO_VALLEY, 0x00, "Cow", RHT_GV_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_GV_COW));
locationTable[RC_JABU_JABUS_BELLY_MQ_COW] = Location::Base(RC_JABU_JABUS_BELLY_MQ_COW, RCQUEST_MQ, RCTYPE_COW, ACTOR_EN_COW, SCENE_JABU_JABU, 0x00, "MQ Cow", RHT_JABU_JABUS_BELLY_MQ_COW, RG_MILK, SpoilerCollectionCheck::RandomizerInf(RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW));
// clang-format-on
}
static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterCowLocations);
static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterCowLocations);

View file

@ -185,6 +185,7 @@ void ShuffleFairies_UnregisterHooks() {
}
void Rando::StaticData::RegisterFairyLocations() {
// clang-format off
locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, "Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1));
locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, "Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2));
locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1802, "Grotto Fairy 3", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3));
@ -404,6 +405,8 @@ void Rando::StaticData::RegisterFairyLocations() {
locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), "MQ Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY));
locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY));
locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY));
// clang-format on
}
static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFairyLocations);

View file

@ -45,6 +45,7 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh
}
void Rando::StaticData::RegisterFreestandingLocations() {
// clang-format off
locationTable[RC_KF_BOULDER_RUPEE_2] = Location::Collectable(RC_KF_BOULDER_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-712, 1857), "Boulder Maze Second Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_2));
locationTable[RC_KF_BOULDER_RUPEE_1] = Location::Collectable(RC_KF_BOULDER_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(-1009, 1556), "Boulder Maze First Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BOULDER_RUPEE_1));
locationTable[RC_KF_BRIDGE_RUPEE] = Location::Collectable(RC_KF_BRIDGE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(2, -45), "Bridge Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BRIDGE_RUPEE));
@ -275,6 +276,8 @@ void Rando::StaticData::RegisterFreestandingLocations() {
locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1743, -528), "MQ Water Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART));
locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2506, -1096), "MQ Light Trial Right Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART));
locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2655, -549), "MQ Light Trial Left Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART));
// clang-format on
}
static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFreestandingLocations);
static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFreestandingLocations);

View file

@ -95,6 +95,7 @@ void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va
}
void Rando::StaticData::RegisterPotLocations() {
// clang-format off
// Overworld Pots
// Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check
locationTable[RC_KF_LINKS_HOUSE_POT] = Location::Pot(RC_KF_LINKS_HOUSE_POT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(-118, 51), "Links House Pot", RHT_POT_KOKIRI_FOREST, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_POT));
@ -643,6 +644,8 @@ void Rando::StaticData::RegisterPotLocations() {
locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -177), "MQ Lobby Left Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2));
locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(199, -79), "MQ Lobby Right Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1));
locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(197, -179), "MQ Lobby Right Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2));
// clang-format on
}
static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterPotLocations);
static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterPotLocations);

View file

@ -856,6 +856,7 @@ int EntranceShuffler::ShuffleAllEntrances() {
mCurNumRandomizedEntrances = 0;
std::vector<EntranceInfoPair> entranceShuffleTable = {
// clang-format off
// Type Parent Region Connected Region Index
{ { EntranceType::Dungeon, RR_KF_OUTSIDE_DEKU_TREE, RR_DEKU_TREE_ENTRYWAY, ENTR_DEKU_TREE_ENTRANCE },
{ EntranceType::Dungeon, RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE } },
@ -1161,6 +1162,7 @@ int EntranceShuffler::ShuffleAllEntrances() {
NO_RETURN_ENTRANCE },
{ { EntranceType::BlueWarp, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP },
NO_RETURN_ENTRANCE },
// clang-format on
};
std::map<std::string, PriorityEntrance> priorityEntranceTable = {

View file

@ -580,6 +580,7 @@ extern "C" {
}
void Rando::StaticData::RegisterFishLocations() {
// clang-format off
// Fishing Pond
locationTable[RC_LH_CHILD_FISH_1] = Location::Fish(RC_LH_CHILD_FISH_1, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 100, RAND_INF_CHILD_FISH_1, "Child Pond Fish 1", RHT_LH_POND_FISH, RG_NONE);
locationTable[RC_LH_CHILD_FISH_2] = Location::Fish(RC_LH_CHILD_FISH_2, RCQUEST_BOTH, ACTOR_FISHING, SCENE_FISHING_POND, 101, RAND_INF_CHILD_FISH_2, "Child Pond Fish 2", RHT_LH_POND_FISH, RG_NONE);
@ -630,6 +631,7 @@ void Rando::StaticData::RegisterFishLocations() {
locationTable[RC_ZD_FISH_3] = Location::Fish(RC_ZD_FISH_3, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 2, RAND_INF_ZD_FISH_3, "Fish 3", RHT_ZD_FISH, RG_FISH);
locationTable[RC_ZD_FISH_4] = Location::Fish(RC_ZD_FISH_4, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, RAND_INF_ZD_FISH_4, "Fish 4", RHT_ZD_FISH, RG_FISH);
locationTable[RC_ZD_FISH_5] = Location::Fish(RC_ZD_FISH_5, RCQUEST_BOTH, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, RAND_INF_ZD_FISH_5, "Fish 5", RHT_ZD_FISH, RG_FISH);
// clang-format on
}
static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFishLocations);

View file

@ -14,7 +14,7 @@ typedef struct {
typedef enum {
FSO_SOURCE_RANDO,
FSO_SOURCE_CVARS
FSO_SOURCE_CVARS,
} FishsanityOptionsSource;
typedef enum {

View file

@ -2047,15 +2047,15 @@ void RandomizerOnActorInitHandler(void* actorRef) {
return;
}
if (
// If child is in the adult shooting gallery or adult in the child shooting gallery, then despawn the shooting gallery man
actor->id == ACTOR_EN_SYATEKI_MAN &&
RAND_GET_OPTION(RSK_SHUFFLE_INTERIOR_ENTRANCES) &&
(
(LINK_IS_CHILD && Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x00)) || //Kakariko Village -> Adult Shooting Gallery, index 003B in the entrance table
(LINK_IS_ADULT && Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x01)) //Market -> Child Shooting Gallery, index 016D in the entrance table
)
) {
// If child is in the adult shooting gallery or adult in the child shooting gallery, then despawn the shooting
// gallery man
if (actor->id == ACTOR_EN_SYATEKI_MAN && RAND_GET_OPTION(RSK_SHUFFLE_INTERIOR_ENTRANCES) &&
((LINK_IS_CHILD &&
// Kakariko Village -> Adult Shooting Gallery, index 003B in the entrance table
Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x00)) ||
(LINK_IS_ADULT &&
// Market -> Child Shooting Gallery, index 016D in the entrance table
Entrance_SceneAndSpawnAre(SCENE_SHOOTING_GALLERY, 0x01)))) {
Actor_Kill(actor);
return;
}

View file

@ -12,6 +12,8 @@ std::unordered_map<std::string, RandomizerGet> Rando::StaticData::itemNameToEnum
void Rando::StaticData::InitItemTable() {
auto logic = Context::GetInstance()->GetLogic();
// clang-format off
itemTable[RG_NONE] = Item(RG_NONE, Text{ "No Item", "Rien", "Kein Artikel" }, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_NONE, 0, 0, 0, 0, 0, ITEM_CATEGORY_JUNK, MOD_NONE);
// Randomizer Get Randomizer Get Name Text Type Get Item ID Adv. Logic Value Hint Text Key Item ID Object ID Draw ID Text ID field Chest Animation Item Category Mod Index
itemTable[RG_KOKIRI_SWORD] = Item(RG_KOKIRI_SWORD, Text{ "Kokiri Sword", "Épée Kokiri", "Kokiri-Schwert" }, ITEMTYPE_EQUIP, GI_SWORD_KOKIRI, true, LOGIC_KOKIRI_SWORD, RHT_KOKIRI_SWORD, ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE);
@ -402,6 +404,8 @@ void Rando::StaticData::InitItemTable() {
itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie améliorée", "Verbessertes Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_DOUBLE, RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER);
itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Triforce Piece", "Triforce Piece", "Triforce-Fragment" }, ITEMTYPE_ITEM, 0xDF, true, LOGIC_TRIFORCE_PIECES, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
// clang-format on
// Init itemNameToEnum
for (auto& item : itemTable) {
// Easiest way to filter out all the empty values from the array, since we still technically want the 0/RG_NONE

View file

@ -261,6 +261,7 @@ void RegionTable_Init() {
//locations which appear in both MQ and Vanilla dungeons don't get set in both areas.
areaTable.fill(Region("Invalid Region", "Invalid Region", {}, NO_DAY_NIGHT_CYCLE, {}, {}, {}));
// clang-format off
areaTable[RR_ROOT] = Region("Root", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}),
@ -326,6 +327,8 @@ void RegionTable_Init() {
Entrance(RR_TEMPLE_OF_TIME, []{return true;}),
});
// clang-format on
// Overworld
RegionTable_Init_KokiriForest();
RegionTable_Init_LostWoods();
@ -571,4 +574,4 @@ Rando::Entrance* GetEntrance(const std::string name) {
}
return nullptr;
}
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_BottomOfTheWell() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_BOTTOM_OF_THE_WELL_ENTRYWAY] = Region("Bottom of the Well Entryway", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -293,4 +294,5 @@ void RegionTable_Init_BottomOfTheWell() {
});
#pragma endregion
}
// clang-format on
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_DekuTree() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_DEKU_TREE_ENTRYWAY] = Region("Deku Tree Entryway", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -360,4 +361,6 @@ void RegionTable_Init_DekuTree() {
Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return true;}),
Entrance(RR_KF_OUTSIDE_DEKU_TREE, []{return logic->DekuTreeClear;}, false),
});
}
// clang-format on
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_DodongosCavern() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_DODONGOS_CAVERN_ENTRYWAY] = Region("Dodongos Cavern Entryway", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -541,4 +542,6 @@ void RegionTable_Init_DodongosCavern() {
Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, []{return true;}),
Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return logic->DodongosCavernClear;}, false),
});
}
// clang-format on
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_FireTemple() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_FIRE_TEMPLE_ENTRYWAY] = Region("Fire Temple Entryway", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -715,4 +716,6 @@ void RegionTable_Init_FireTemple() {
Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_DMC_CENTRAL_LOCAL, []{return logic->FireTempleClear;}, false),
});
}
// clang-format on
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_ForestTemple() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_FOREST_TEMPLE_ENTRYWAY] = Region("Forest Temple Entryway", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -610,4 +611,6 @@ void RegionTable_Init_ForestTemple() {
Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_SACRED_FOREST_MEADOW, []{return logic->ForestTempleClear;}, false),
});
}
// clang-format on
}

View file

@ -6,6 +6,7 @@
using namespace Rando;
void RegionTable_Init_GanonsCastle() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_GANONS_CASTLE_ENTRYWAY] = Region("Ganon's Castle Entryway", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -511,4 +512,5 @@ void RegionTable_Init_GanonsCastle() {
}, {});
#pragma endregion
}
// clang-format on
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_GerudoTrainingGround() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_GERUDO_TRAINING_GROUND_ENTRYWAY] = Region("Gerudo Training Ground Entryway", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -321,4 +322,5 @@ void RegionTable_Init_GerudoTrainingGround() {
});
#pragma endregion
}
// clang-format on
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_IceCavern() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_ICE_CAVERN_ENTRYWAY] = Region("Ice Cavern Entryway", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -144,4 +145,5 @@ void RegionTable_Init_IceCavern() {
}, {});
#pragma endregion
}
// clang-format on
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_JabuJabusBelly() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_JABU_JABUS_BELLY_ENTRYWAY] = Region("Jabu Jabus Belly Entryway", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -356,4 +357,6 @@ void RegionTable_Init_JabuJabusBelly() {
Entrance(RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_ZORAS_FOUNTAIN, []{return logic->JabuJabusBellyClear;}, false),
});
}
// clang-format on
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_ShadowTemple() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_SHADOW_TEMPLE_ENTRYWAY] = Region("Shadow Temple Entryway", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -409,4 +410,6 @@ void RegionTable_Init_ShadowTemple() {
Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return logic->ShadowTempleClear;}, false),
});
}
// clang-format on
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_SpiritTemple() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_SPIRIT_TEMPLE_ENTRYWAY] = Region("Spirit Temple Entryway", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -554,4 +555,6 @@ void RegionTable_Init_SpiritTemple() {
Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_DESERT_COLOSSUS, []{return logic->SpiritTempleClear;}, false),
});
}
// clang-format on
}

View file

@ -5,6 +5,7 @@
using namespace Rando;
void RegionTable_Init_WaterTemple() {
// clang-format off
// Vanilla/MQ Decider
areaTable[RR_WATER_TEMPLE_ENTRYWAY] = Region("Water Temple Entryway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
@ -735,4 +736,6 @@ void RegionTable_Init_WaterTemple() {
Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_LAKE_HYLIA, []{return logic->WaterTempleClear;}, false),
});
}
// clang-format on
}

View file

@ -9,6 +9,7 @@ using namespace Rando;
*/
void RegionTable_Init_GerudoFortress() {
// clang-format off
areaTable[RR_GERUDO_FORTRESS] = Region("Gerudo Fortress", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->CarpenterRescue, []{return logic->CanFinishGerudoFortress();}),
@ -78,4 +79,6 @@ void RegionTable_Init_GerudoFortress() {
//Exits
Entrance(RR_GERUDO_FORTRESS, []{return true;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_CastleGrounds() {
// clang-format off
//With multi-area support {RA_CASTLE_GROUNDS} is not strictly required anymore, as any interior here could inherit both
//{RA_HYRULE_CASTLE} and {RA_OUTSIDE_GANONS_CASTLE}, but a setting to merge the latter 2 into the former may be preferred
areaTable[RR_CASTLE_GROUNDS] = Region("Castle Grounds", "Castle Grounds", {RA_CASTLE_GROUNDS}, NO_DAY_NIGHT_CYCLE, {}, {}, {
@ -114,4 +115,6 @@ void RegionTable_Init_CastleGrounds() {
Entrance(RR_GANONS_CASTLE_GROUNDS, []{return logic->BuiltRainbowBridge;}),
Entrance(RR_GANONS_CASTLE_ENTRYWAY, []{return logic->IsAdult;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_DeathMountainCrater() {
// clang-format off
areaTable[RR_DMC_UPPER_NEARBY] = Region("DMC Upper Nearby", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
Entrance(RR_DMC_UPPER_LOCAL, []{return logic->FireTimer() >= 48;}),
@ -142,4 +143,6 @@ void RegionTable_Init_DeathMountainCrater() {
//Exits
Entrance(RR_DMC_CENTRAL_LOCAL, []{return logic->FireTimer() >= 48 && logic->CanUse(RG_DISTANT_SCARECROW);}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_DeathMountainTrail() {
// clang-format off
areaTable[RR_DEATH_MOUNTAIN_TRAIL] = Region("Death Mountain", "Death Mountain", {RA_DEATH_MOUNTAIN_TRAIL}, DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET));}),
@ -98,4 +99,6 @@ void RegionTable_Init_DeathMountainTrail() {
//Exits
Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_DesertColossus() {
// clang-format off
areaTable[RR_DESERT_COLOSSUS] = Region("Desert Colossus", "Desert Colossus", {RA_DESERT_COLOSSUS}, DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->FairyPond, []{return logic->FairyPond || logic->CanUse(RG_SONG_OF_STORMS);}),
@ -74,4 +75,6 @@ void RegionTable_Init_DesertColossus() {
//Exits
Entrance(RR_DESERT_COLOSSUS, []{return true;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_GerudoValley() {
// clang-format off
areaTable[RR_GERUDO_VALLEY] = Region("Gerudo Valley", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->BugRock, []{return logic->BugRock || logic->IsChild;}),
@ -108,4 +109,6 @@ void RegionTable_Init_GerudoValley() {
//Exits
Entrance(RR_GV_FORTRESS_SIDE, []{return true;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_GoronCity() {
// clang-format off
areaTable[RR_GORON_CITY] = Region("Goron City", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}),
@ -108,4 +109,6 @@ void RegionTable_Init_GoronCity() {
//Exits
Entrance(RR_GC_GROTTO_PLATFORM, []{return true;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_Graveyard() {
// clang-format off
areaTable[RR_THE_GRAVEYARD] = Region("The Graveyard", "The Graveyard", {RA_THE_GRAVEYARD}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->ButterflyFairy, []{return logic->ButterflyFairy || (logic->CanUse(RG_STICKS) && logic->AtDay);}),
@ -120,4 +121,6 @@ void RegionTable_Init_Graveyard() {
Entrance(RR_THE_GRAVEYARD, []{return true;}),
Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, []{return logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_GY_SHADOW_FIRE_ARROWS) && logic->IsAdult && logic->CanUse(RG_FIRE_ARROWS));}),
});
// clang-format on
}

View file

@ -4,6 +4,7 @@
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, {}, {}, {
//Exits
Entrance(RR_GF_OUTSIDE_GATE, []{return true;}),
@ -35,4 +36,6 @@ void RegionTable_Init_HauntedWasteland() {
Entrance(RR_DESERT_COLOSSUS, []{return true;}),
Entrance(RR_HAUNTED_WASTELAND, []{return ctx->GetTrickOption(RT_HW_REVERSE) || false;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_HyruleField() {
// clang-format off
areaTable[RR_HYRULE_FIELD] = Region("Hyrule Field", "Hyrule Field", {RA_HYRULE_FIELD}, DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->BigPoeKill, []{return logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_EPONA) && logic->HasBottle();}),
@ -140,4 +141,6 @@ void RegionTable_Init_HyruleField() {
//Exits
Entrance(RR_HYRULE_FIELD, []{return true;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_Kakariko() {
// clang-format off
areaTable[RR_KAKARIKO_VILLAGE] = Region("Kakariko Village", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->BugRock, []{return true;}),
@ -239,4 +240,6 @@ void RegionTable_Init_Kakariko() {
Entrance(RR_KAKARIKO_VILLAGE, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->DrainWell;}),
Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, []{return logic->IsChild || (logic->DrainWell && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF));}),
});
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_KokiriForest() {
// clang-format off
areaTable[RR_KOKIRI_FOREST] = Region("Kokiri Forest", "Kokiri Forest", {RA_KOKIRI_FOREST}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}),
@ -149,4 +150,6 @@ void RegionTable_Init_KokiriForest() {
//Exits
Entrance(RR_KOKIRI_FOREST, []{return true;})
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_LakeHylia() {
// clang-format off
areaTable[RR_LAKE_HYLIA] = Region("Lake Hylia", "Lake Hylia", {RA_LAKE_HYLIA}, DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}),
@ -128,4 +129,6 @@ void RegionTable_Init_LakeHylia() {
//Exits
Entrance(RR_LAKE_HYLIA, []{return true;}),
});
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_LonLonRanch() {
// clang-format off
areaTable[RR_LON_LON_RANCH] = Region("Lon Lon Ranch", "Lon Lon Ranch", {RA_LON_LON_RANCH}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->FreedEpona, []{return logic->FreedEpona || ((logic->HasItem(RG_CHILD_WALLET) || ctx->GetOption(RSK_SKIP_EPONA_RACE)) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay);}),
@ -71,4 +72,6 @@ void RegionTable_Init_LonLonRanch() {
//Exits
Entrance(RR_LON_LON_RANCH, []{return true;}),
});
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_LostWoods() {
// clang-format off
areaTable[RR_LW_FOREST_EXIT] = Region("LW Forest Exit", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
Entrance(RR_KOKIRI_FOREST, []{return true;})
@ -128,4 +129,6 @@ void RegionTable_Init_LostWoods() {
Entrance(RR_HYRULE_FIELD, []{return true;}),
Entrance(RR_THE_LOST_WOODS, []{return logic->CanUse(RG_LONGSHOT);}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_Market() {
// clang-format off
areaTable[RR_MARKET_ENTRANCE] = Region("Market Entrance", "Market Entrance", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
Entrance(RR_HYRULE_FIELD, []{return logic->IsAdult || logic->AtDay;}),
@ -214,4 +215,6 @@ void RegionTable_Init_Market() {
//Exits
Entrance(RR_MARKET_BACK_ALLEY, []{return true;}),
});
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_SacredForestMeadow() {
// clang-format off
areaTable[RR_SFM_ENTRYWAY] = Region("SFM Entryway", "Sacred Forest Meadow", {RA_SACRED_FOREST_MEADOW}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
Entrance(RR_LW_BEYOND_MIDO, []{return true;}),
@ -71,4 +72,6 @@ void RegionTable_Init_SacredForestMeadow() {
//Exits
Entrance(RR_SACRED_FOREST_MEADOW, []{return true;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_TempleOfTime() {
// clang-format off
areaTable[RR_TOT_ENTRANCE] = Region("ToT Entrance", "ToT Entrance", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}),
@ -51,4 +52,6 @@ void RegionTable_Init_TempleOfTime() {
//Exits
Entrance(RR_TEMPLE_OF_TIME, []{return true;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_ZorasDomain() {
// clang-format off
areaTable[RR_ZORAS_DOMAIN] = Region("Zoras Domain", "Zoras Domain", {RA_ZORAS_DOMAIN}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}),
@ -90,4 +91,6 @@ void RegionTable_Init_ZorasDomain() {
//Exits
Entrance(RR_ZORAS_DOMAIN_ISLAND, []{return true;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_ZorasFountain() {
// clang-format off
areaTable[RR_ZORAS_FOUNTAIN] = Region("Zoras Fountain", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}),
@ -61,4 +62,6 @@ void RegionTable_Init_ZorasFountain() {
//Exits
Entrance(RR_ZORAS_FOUNTAIN, []{return true;}),
});
}
// clang-format on
}

View file

@ -4,6 +4,7 @@
using namespace Rando;
void RegionTable_Init_ZoraRiver() {
// clang-format off
areaTable[RR_ZR_FRONT] = Region("ZR Front", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)),
@ -104,4 +105,6 @@ void RegionTable_Init_ZoraRiver() {
//Exits
Entrance(RR_ZORAS_RIVER, []{return true;}),
});
}
// clang-format on
}

View file

@ -100,7 +100,7 @@ static const char* englishRupeeNames[175] = {
"Studs", "Super Sea Snails", "Talent", "Teef", "Telecrystals",
"Tiberium", "TokKul", "Toys", "Turnips", "Upvotes",
"V-Bucks", "Vespene Gas", "Watts", "Widgets", "Woolongs",
"World Dollars", "Wumpa Fruit", "Yen", "Zenny", "Zorkmids"
"World Dollars", "Wumpa Fruit", "Yen", "Zenny", "Zorkmids",
};
static const char* germanRupeeNames[65] = {
@ -205,7 +205,7 @@ std::unordered_map<s16, s16> getItemIdToItemId = {
{ GI_PRESCRIPTION, ITEM_PRESCRIPTION },
{ GI_FROG, ITEM_FROG },
{ GI_EYEDROPS, ITEM_EYEDROPS },
{ GI_CLAIM_CHECK, ITEM_CLAIM_CHECK }
{ GI_CLAIM_CHECK, ITEM_CLAIM_CHECK },
};
#pragma optimize("", off)
@ -400,12 +400,12 @@ void Randomizer::LoadMerchantMessages() {
}
std::map<s32, TrialKey> trialFlagToTrialKey = {
{ EVENTCHKINF_COMPLETED_LIGHT_TRIAL, TK_LIGHT_TRIAL, },
{ EVENTCHKINF_COMPLETED_FOREST_TRIAL, TK_FOREST_TRIAL, },
{ EVENTCHKINF_COMPLETED_FIRE_TRIAL, TK_FIRE_TRIAL, },
{ EVENTCHKINF_COMPLETED_WATER_TRIAL, TK_WATER_TRIAL, },
{ EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, TK_SPIRIT_TRIAL, },
{ EVENTCHKINF_COMPLETED_SHADOW_TRIAL, TK_SHADOW_TRIAL, }
{ EVENTCHKINF_COMPLETED_LIGHT_TRIAL, TK_LIGHT_TRIAL },
{ EVENTCHKINF_COMPLETED_FOREST_TRIAL, TK_FOREST_TRIAL },
{ EVENTCHKINF_COMPLETED_FIRE_TRIAL, TK_FIRE_TRIAL },
{ EVENTCHKINF_COMPLETED_WATER_TRIAL, TK_WATER_TRIAL },
{ EVENTCHKINF_COMPLETED_SPIRIT_TRIAL, TK_SPIRIT_TRIAL },
{ EVENTCHKINF_COMPLETED_SHADOW_TRIAL, TK_SHADOW_TRIAL },
};
bool Randomizer::IsTrialRequired(s32 trialFlag) {
@ -2272,7 +2272,7 @@ void RandomizerSettingsWindow::DrawElement() {
{RA_BOTTOM_OF_THE_WELL, true},
{RA_ICE_CAVERN, true},
{RA_GERUDO_TRAINING_GROUND, true},
{RA_GANONS_CASTLE, true}
{RA_GANONS_CASTLE, true},
};
static std::unordered_map<RandomizerArea, bool> areaTreeEnabled {
{RA_NONE, true},
@ -2307,7 +2307,7 @@ void RandomizerSettingsWindow::DrawElement() {
{RA_BOTTOM_OF_THE_WELL, true},
{RA_ICE_CAVERN, true},
{RA_GERUDO_TRAINING_GROUND, true},
{RA_GANONS_CASTLE, true}
{RA_GANONS_CASTLE, true},
};
static std::map<Rando::Tricks::Tag, bool> showTag {

View file

@ -13,11 +13,11 @@
// which doesn't exist yet.
typedef enum {
MOD_NONE,
MOD_RANDOMIZER
MOD_RANDOMIZER,
} ModIndex;
typedef enum {
TABLE_VANILLA = MOD_NONE,
TABLE_RANDOMIZER = MOD_RANDOMIZER
TABLE_RANDOMIZER = MOD_RANDOMIZER,
} TableIndex;
typedef struct {
@ -5666,12 +5666,12 @@ typedef struct FishIdentity {
typedef enum {
TRACKER_WINDOW_FLOATING,
TRACKER_WINDOW_WINDOW
TRACKER_WINDOW_WINDOW,
} TrackerWindowType;
typedef enum {
TRACKER_DISPLAY_ALWAYS,
TRACKER_DISPLAY_COMBO_BUTTON
TRACKER_DISPLAY_COMBO_BUTTON,
} TrackerDisplayType;
typedef enum {
@ -5774,7 +5774,7 @@ typedef enum {
WL_MID,
WL_HIGH,
WL_LOW_OR_MID,
WL_HIGH_OR_MID
WL_HIGH_OR_MID,
} RandoWaterLevel;
#define ENTRANCE_GROTTO_LOAD_START 0x0700

View file

@ -59,6 +59,7 @@ typedef struct {
} DungeonEntranceInfo;
static DungeonEntranceInfo dungeons[] = {
// clang-format off
//entryway exit, boss, reverse, bluewarp, dungeon scene, boss scene
{ ENTR_DEKU_TREE_ENTRANCE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE, ENTR_DEKU_TREE_BOSS_ENTRANCE, ENTR_DEKU_TREE_BOSS_DOOR, ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP, SCENE_DEKU_TREE, SCENE_DEKU_TREE_BOSS },
{ ENTR_DODONGOS_CAVERN_ENTRANCE, ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE, ENTR_DODONGOS_CAVERN_BOSS_DOOR, ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP, SCENE_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN_BOSS },
@ -68,6 +69,8 @@ static DungeonEntranceInfo dungeons[] = {
{ ENTR_WATER_TEMPLE_ENTRANCE, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, ENTR_WATER_TEMPLE_BOSS_ENTRANCE, ENTR_WATER_TEMPLE_BOSS_DOOR, ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP, SCENE_WATER_TEMPLE, SCENE_WATER_TEMPLE_BOSS },
{ ENTR_SPIRIT_TEMPLE_ENTRANCE, ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE, ENTR_SPIRIT_TEMPLE_BOSS_DOOR, ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP, SCENE_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE_BOSS },
{ ENTR_SHADOW_TEMPLE_ENTRANCE, ENTR_GRAVEYARD_OUTSIDE_TEMPLE, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE, ENTR_SHADOW_TEMPLE_BOSS_DOOR, ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP, SCENE_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE_BOSS },
// clang-format on
};
static s8 hasCopiedEntranceTable = 0;

View file

@ -74,6 +74,7 @@ static std::string groupTypeNames[] = {
// Entrance data for the tracker taken from the 3ds rando entrance tracker, and supplemented with scene/spawn info and meta search tags
// ENTR_HYRULE_FIELD_10 and ENTR_POTION_SHOP_KAKARIKO_1 have been repurposed for entrance randomizer
const EntranceData entranceData[] = {
// clang-format off
//index, reverse, scenes (and spawns), source name, destination name, source group, destination group, type, metaTag, oneExit
{ ENTR_LINKS_HOUSE_CHILD_SPAWN, -1, SINGLE_SCENE_INFO(SCENE_LINKS_HOUSE), "Child Spawn", "Link's House", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY},
{ ENTR_HYRULE_FIELD_10, -1, SINGLE_SCENE_INFO(SCENE_TEMPLE_OF_TIME), "Adult Spawn", "Temple of Time", ENTRANCE_GROUP_ONE_WAY, ENTRANCE_GROUP_ONE_WAY, ENTRANCE_TYPE_ONE_WAY},
@ -380,6 +381,8 @@ const EntranceData entranceData[] = {
{ ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, SINGLE_SCENE_INFO(SCENE_OUTSIDE_GANONS_CASTLE), "OGC Rainbow Bridge Exit", "Inside Ganon's Castle Entrance", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc", 1},
{ ENTR_POTION_SHOP_KAKARIKO_1, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD, {{ SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 0x02 }}, "OGC Great Fairy Fountain", "OGC Behind Pillar", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_INTERIOR, "outside ganon's castle"},
{ ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, SINGLE_SCENE_INFO(SCENE_INSIDE_GANONS_CASTLE), "Inside Ganon's Castle Entrance", "OGC Rainbow Bridge Exit", ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_GROUP_HYRULE_CASTLE, ENTRANCE_TYPE_DUNGEON, "outside ganon's castle,gc"}
// clang-format on
};
// Check if Link is in the area and return that scene/entrance for tracking

View file

@ -12,6 +12,7 @@ extern PlayState* gPlayState;
// Information necessary for entering each grotto
static const GrottoLoadInfo grottoLoadTable[NUM_GROTTOS] = {
// clang-format off
{.entranceIndex = ENTR_GROTTOS_10, .content = 0xFD, .scene = SCENE_DESERT_COLOSSUS}, // Desert Colossus -> Colossus Grotto
{.entranceIndex = ENTR_GROTTOS_4, .content = 0xEF, .scene = SCENE_LAKE_HYLIA}, // Lake Hylia -> LH Grotto
{.entranceIndex = ENTR_GROTTOS_10, .content = 0xEB, .scene = SCENE_ZORAS_RIVER}, // Zora River -> ZR Storms Grotto
@ -45,10 +46,13 @@ static const GrottoLoadInfo grottoLoadTable[NUM_GROTTOS] = {
{.entranceIndex = ENTR_GROTTOS_10, .content = 0xF0, .scene = SCENE_GERUDO_VALLEY}, // GV Fortress Side -> GV Storms Grotto
{.entranceIndex = ENTR_GROTTOS_6, .content = 0xF2, .scene = SCENE_GERUDO_VALLEY}, // GV Grotto Ledge -> GV Octorok Grotto
{.entranceIndex = ENTR_GROTTOS_12, .content = 0xF3, .scene = SCENE_LOST_WOODS}, // LW Beyond Mido -> Deku Theater
// clang-format on
};
// Information necessary for setting up returning from a grotto
static const GrottoReturnInfo grottoReturnTable[NUM_GROTTOS] = {
// clang-format off
{.entranceIndex = ENTR_DESERT_COLOSSUS_EAST_EXIT, .room = 0x00, .angle = 0xA71C, .pos = {.x = 62.5078f, .y = -32.0f, .z = -1296.2f}}, // Colossus Grotto -> Desert Colossus
{.entranceIndex = ENTR_LAKE_HYLIA_NORTH_EXIT, .room = 0x00, .angle = 0x0000, .pos = {.x = -3039.34f, .y = -1033.0f, .z = 6080.74f}}, // LH Grotto -> Lake Hylia
{.entranceIndex = ENTR_ZORAS_RIVER_WEST_EXIT, .room = 0x00, .angle = 0x0000, .pos = {.x = -1630.05f, .y = 100.0f, .z = -132.104f}}, // ZR Storms Grotto -> Zora River
@ -82,6 +86,8 @@ static const GrottoReturnInfo grottoReturnTable[NUM_GROTTOS] = {
{.entranceIndex = ENTR_GERUDO_VALLEY_WEST_EXIT, .room = 0x00, .angle = 0x9555, .pos = {.x = -1326.34f, .y = 15.0f, .z = -983.994f}}, // GV Storms Grotto -> GV Fortress Side
{.entranceIndex = ENTR_GERUDO_VALLEY_EAST_EXIT, .room = 0x00, .angle = 0x8000, .pos = {.x = 291.513f, .y = -555.0f, .z = 1478.39f}}, // GV Octorok Grotto -> GV Grotto Ledge
{.entranceIndex = ENTR_LOST_WOODS_NORTH_EXIT, .room = 0x06, .angle = 0x4000, .pos = {.x = 109.281f, .y = -20.0f, .z = -1601.42f}}, // Deku Theater -> LW Beyond Mido
// clang-format on
};
static s16 grottoExitList[NUM_GROTTOS] = {0};

View file

@ -187,6 +187,7 @@ std::unordered_map<uint32_t, RandomizerHintTextKey> StaticData::trialData = {
};
std::unordered_map<RandomizerHint, StaticHintInfo> StaticData::staticHintInfoMap = {
// clang-format off
// RH_GANONDORF_HINT is special cased due to being different based on master sword shuffle
// Altar hints are special cased due to special hint marking rules
// warp song hints are special cased due to entrances not being done properly yet
@ -211,6 +212,8 @@ std::unordered_map<RandomizerHint, StaticHintInfo> StaticData::staticHintInfoMap
{RH_KAK_50_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_50_SKULLS_HINT, true, {RC_KAK_50_GOLD_SKULLTULA_REWARD}, {}, {}, false, 50)},
{RH_KAK_100_SKULLS_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_SKULLS_HINT}, RSK_KAK_100_SKULLS_HINT, true, {RC_KAK_100_GOLD_SKULLTULA_REWARD}, {}, {}, false, 100)},
{RH_MASK_SHOP_HINT, StaticHintInfo(HINT_TYPE_ITEM, {RHT_MASK_SHOP_HINT}, RSK_MASK_SHOP_HINT, true, {RC_DEKU_THEATER_SKULL_MASK, RC_DEKU_THEATER_MASK_OF_TRUTH}, {}, {RC_MASK_SHOP_HINT})}
// clang-format on
};
std::unordered_map<std::string, uint32_t> StaticData::PopulateTranslationMap(std::unordered_map<uint32_t, CustomMessage> input){
@ -220,7 +223,8 @@ std::unordered_map<std::string, uint32_t> StaticData::PopulateTranslationMap(std
for (std::string string: strings){
if (output.contains(string)){
if (output[string] != key){
SPDLOG_DEBUG("\tREPEATED STRING IN " + message.GetEnglish(MF_CLEAN) + "\n\n"); //RANDOTODO should this cause an error of some kind?
//RANDOTODO should this cause an error of some kind?
SPDLOG_DEBUG("\tREPEATED STRING IN " + message.GetEnglish(MF_CLEAN) + "\n\n");
}
} else {
output[string] = key;
@ -237,7 +241,8 @@ std::unordered_map<std::string, uint32_t> StaticData::PopulateTranslationMap(std
for (std::string string: strings){
if (output.contains(string)){
if (output[string] != key){
SPDLOG_DEBUG("\tREPEATED STRING WITH " + string + "\n\n"); //RANDOTODO should this cause an error of some kind?
//RANDOTODO should this cause an error of some kind?
SPDLOG_DEBUG("\tREPEATED STRING WITH " + string + "\n\n");
}
} else {
output[string] = key;

View file

@ -63,6 +63,7 @@ std::vector<SplitObject> splitList;
std::vector<SplitObject> emptyList;
std::vector<SplitObject> splitObjectList = {
// clang-format off
{ SPLIT_TYPE_ITEM, ITEM_STICK, "Deku Stick", "ITEM_STICK", COLOR_WHITE },
{ SPLIT_TYPE_ITEM, ITEM_NUT, "Deku Nut", "ITEM_NUT", COLOR_WHITE },
{ SPLIT_TYPE_ITEM, ITEM_BOMB, "Bomb", "ITEM_BOMB", COLOR_WHITE },
@ -205,9 +206,12 @@ std::vector<SplitObject> splitObjectList = {
{ SPLIT_TYPE_MISC, SCENE_ZORAS_RIVER, "Lost Woods Escape", "SPECIAL_SPLIT_ENTRANCE", COLOR_WHITE },
{ SPLIT_TYPE_MISC, SCENE_LOST_WOODS, "Forest Escape", "SPECIAL_SPLIT_ENTRANCE", COLOR_WHITE },
{ SPLIT_TYPE_MISC, SCENE_KAKARIKO_VILLAGE, "Watchtower Death", "SPECIAL_SPLIT_ENTRANCE", COLOR_WHITE },
// clang-format on
};
std::map<uint32_t, std::vector<uint32_t>> popupList = {
// clang-format off
{ ITEM_STICK, { ITEM_STICK, ITEM_STICK_UPGRADE_20, ITEM_STICK_UPGRADE_30 } },
{ ITEM_NUT, { ITEM_NUT, ITEM_NUT_UPGRADE_30, ITEM_NUT_UPGRADE_40 } },
{ ITEM_BOMB, { ITEM_BOMB_BAG_20, ITEM_BOMB_BAG_30, ITEM_BOMB_BAG_40 } },
@ -229,6 +233,8 @@ std::map<uint32_t, std::vector<uint32_t>> popupList = {
{ ITEM_WALLET_ADULT, { ITEM_WALLET_ADULT, ITEM_WALLET_GIANT } },
{ ITEM_SINGLE_MAGIC, { ITEM_SINGLE_MAGIC, ITEM_DOUBLE_MAGIC } },
{ ITEM_SKULL_TOKEN, { } }
// clang-format on
};
std::string removeSpecialCharacters(const std::string& str) {

View file

@ -1,4 +1,4 @@
#include "OTRGlobals.h"
#include "OTRGlobals.h"
#include "OTRAudio.h"
#include <iostream>
#include <algorithm>
@ -579,6 +579,7 @@ extern "C" void OTRAudio_Exit() {
extern "C" void VanillaItemTable_Init() {
static GetItemEntry getItemTable[] = {
// clang-format off
GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_BOMBS_5),
GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_NUTS_5),
GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE, GI_BOMBCHUS_10),
@ -705,6 +706,7 @@ extern "C" void VanillaItemTable_Init() {
GET_ITEM_NONE,
GET_ITEM_NONE,
GET_ITEM_NONE // GI_MAX - if you need to add to this table insert it before this entry.
// clang-format on
};
ItemTableManager::Instance->AddItemTable(MOD_NONE);
for (uint8_t i = 0; i < ARRAY_COUNT(getItemTable); i++) {
@ -841,7 +843,7 @@ std::unordered_map<ItemID, GetItemID> ItemIDtoGetItemIDMap {
{ ITEM_TUNIC_ZORA, GI_TUNIC_ZORA },
{ ITEM_WALLET_ADULT, GI_WALLET_ADULT },
{ ITEM_WALLET_GIANT, GI_WALLET_GIANT },
{ ITEM_WEIRD_EGG, GI_WEIRD_EGG }
{ ITEM_WEIRD_EGG, GI_WEIRD_EGG },
};
extern "C" GetItemID RetrieveGetItemIDFromItemID(ItemID itemID) {
@ -1523,7 +1525,7 @@ std::map<std::string, SoundFontSample*> cachedCustomSFs;
extern "C" SoundFontSample* ReadCustomSample(const char* path) {
return nullptr;
/*
/*
if (!ExtensionCache.contains(path))
return nullptr;
@ -1576,7 +1578,7 @@ extern "C" SoundFontSample* ReadCustomSample(const char* path) {
}
return nullptr;
*/
*/
}
ImFont* OTRGlobals::CreateFontWithSize(float size, std::string fontPath) {
@ -2070,7 +2072,7 @@ extern "C" bool Randomizer_IsCheckShuffled(RandomizerCheck rc) {
}
extern "C" GetItemEntry GetItemMystery() {
return { ITEM_NONE_FE, 0, 0, 0, 0, 0, 0, ITEM_NONE_FE, 0, false, ITEM_FROM_NPC, ITEM_CATEGORY_JUNK, NULL, MOD_RANDOMIZER, (CustomDrawFunc)Randomizer_DrawMysteryItem };
return GET_ITEM_MYSTERY;
}
extern "C" uint8_t Randomizer_IsSeedGenerated() {

View file

@ -125,7 +125,7 @@ std::map<uint32_t, ItemMapEntry> itemMapping = {
ITEM_MAP_ENTRY(ITEM_DUNGEON_MAP),
ITEM_MAP_ENTRY(ITEM_KEY_SMALL),
ITEM_MAP_ENTRY(ITEM_MAGIC_SMALL),
ITEM_MAP_ENTRY(ITEM_MAGIC_LARGE)
ITEM_MAP_ENTRY(ITEM_MAGIC_LARGE),
};
std::map<uint32_t, ItemMapEntry> gregMapping = {

View file

@ -605,6 +605,7 @@ static bool invert_matrix(const float m[16], float invOut[16]) {
float inv[16], det;
int i;
// clang-format off
inv[0] = m[5] * m[10] * m[15] -
m[5] * m[11] * m[14] -
m[9] * m[6] * m[15] +
@ -716,6 +717,7 @@ static bool invert_matrix(const float m[16], float invOut[16]) {
m[4] * m[2] * m[9] +
m[8] * m[1] * m[6] -
m[8] * m[2] * m[5];
// clang-format on
det = m[0] * inv[0] + m[1] * inv[4] + m[2] * inv[8] + m[3] * inv[12];