Initial re-application of let-it-snow.

This commit is contained in:
Malkierian
2025-10-30 18:59:19 -07:00
committed by Malkierian
parent 3050d9484f
commit bb497e3125
543 changed files with 28226 additions and 449 deletions
+53
View File
@@ -612,8 +612,61 @@ static ActorDBInit EnPartnerInit = {
};
extern "C" s16 gEnPartnerId;
#include "src/overlays/actors/ovl_En_Snowball/z_en_snowball.h"
static ActorDBInit EnSnowballInit = {
"En_Snowball",
"Snowball",
ACTORCAT_ITEMACTION,
(ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_ACTOR |
ACTOR_FLAG_CAN_PRESS_SWITCHES),
OBJECT_GAMEPLAY_KEEP,
sizeof(EnSnowball),
(ActorFunc)EnSnowball_Init,
(ActorFunc)EnSnowball_Destroy,
(ActorFunc)EnSnowball_Update,
(ActorFunc)EnSnowball_Draw,
nullptr,
};
extern "C" s16 gEnSnowballId;
#include "src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.h"
static ActorDBInit EnChristmasTreeInit = {
"En_ChristmasTree",
"Christmas Tree",
ACTORCAT_PROP,
(ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED |
ACTOR_FLAG_DRAW_CULLING_DISABLED),
OBJECT_GAMEPLAY_KEEP,
sizeof(EnChristmasTree),
(ActorFunc)EnChristmasTree_Init,
(ActorFunc)EnChristmasTree_Destroy,
(ActorFunc)EnChristmasTree_Update,
(ActorFunc)EnChristmasTree_Draw,
nullptr,
};
extern "C" s16 gEnChristmasTreeId;
#include "src/overlays/actors/ovl_En_ChristmasDeco/z_en_christmasdeco.h"
static ActorDBInit EnChristmasDecoInit = {
"En_ChristmasDeco",
"Christmas Decos",
ACTORCAT_PROP,
(ACTOR_FLAG_DRAW_CULLING_DISABLED),
OBJECT_GAMEPLAY_KEEP,
sizeof(EnChristmasDeco),
(ActorFunc)EnChristmasDeco_Init,
(ActorFunc)EnChristmasDeco_Destroy,
(ActorFunc)EnChristmasDeco_Update,
(ActorFunc)EnChristmasDeco_Draw,
nullptr,
};
extern "C" s16 gEnChristmasDecoId;
void ActorDB::AddBuiltInCustomActors() {
gEnPartnerId = ActorDB::Instance->AddEntry(EnPartnerInit).entry.id;
gEnSnowballId = ActorDB::Instance->AddEntry(EnSnowballInit).entry.id;
gEnChristmasTreeId = ActorDB::Instance->AddEntry(EnChristmasTreeInit).entry.id;
gEnChristmasDecoId = ActorDB::Instance->AddEntry(EnChristmasDecoInit).entry.id;
}
extern "C" ActorDBEntry* ActorDB_Retrieve(const int id) {
@@ -48,6 +48,13 @@ extern "C" {
#include "textures/nintendo_rogo_static/nintendo_rogo_static.h"
#include "objects/object_gi_rabit_mask/object_gi_rabit_mask.h"
#include "overlays/ovl_Magic_Wind/ovl_Magic_Wind.h"
#include "objects/object_wood02/object_wood02.h"
#include "scenes/overworld/spot00/spot00_room_0.h"
#include "scenes/overworld/spot04/spot04_room_0.h"
#include "scenes/overworld/spot04/spot04_room_1.h"
#include "scenes/overworld/spot20/spot20_room_0.h"
#include "scenes/overworld/spot03/spot03_room_0.h"
#include "scenes/overworld/spot15/spot15_room_0.h"
extern PlayState* gPlayState;
void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction);
@@ -198,9 +205,9 @@ Color_RGBA8 ColorRGBA8(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
colors were darker than the gDPSetPrimColor. You will see many more examples of this below in the `ApplyOrResetCustomGfxPatches` method
*/
static std::map<std::string, CosmeticOption> cosmeticOptions = {
COSMETIC_OPTION("Link.KokiriTunic", "Kokiri Tunic", COSMETICS_GROUP_LINK, ColorRGBA8( 30, 105, 27, 255), false, true, false),
COSMETIC_OPTION("Link.GoronTunic", "Goron Tunic", COSMETICS_GROUP_LINK, ColorRGBA8(100, 20, 0, 255), false, true, false),
COSMETIC_OPTION("Link.ZoraTunic", "Zora Tunic", COSMETICS_GROUP_LINK, ColorRGBA8( 0, 60, 100, 255), false, true, false),
COSMETIC_OPTION("Link.KokiriTunic", "Kokiri Tunic", COSMETICS_GROUP_LINK, ColorRGBA8(255, 0, 0, 255), false, true, false),
COSMETIC_OPTION("Link.GoronTunic", "Goron Tunic", COSMETICS_GROUP_LINK, ColorRGBA8(255, 0, 0, 255), false, true, false),
COSMETIC_OPTION("Link.ZoraTunic", "Zora Tunic", COSMETICS_GROUP_LINK, ColorRGBA8(255, 0, 0, 255), false, true, false),
COSMETIC_OPTION("Link.Hair", "Hair", COSMETICS_GROUP_LINK, ColorRGBA8(255, 173, 27, 255), false, true, true),
COSMETIC_OPTION("Link.Linen", "Linen", COSMETICS_GROUP_LINK, ColorRGBA8(255, 255, 255, 255), false, true, true),
COSMETIC_OPTION("Link.Boots", "Boots", COSMETICS_GROUP_LINK, ColorRGBA8( 93, 44, 18, 255), false, true, true),
@@ -251,7 +258,7 @@ static std::map<std::string, CosmeticOption> cosmeticOptions = {
COSMETIC_OPTION("Consumable.DDHeartBorder", "DD Heart Border", COSMETICS_GROUP_CONSUMABLE, ColorRGBA8(255, 255, 255, 255), false, true, true),
COSMETIC_OPTION("Consumable.Magic", "Magic", COSMETICS_GROUP_CONSUMABLE, ColorRGBA8( 0, 200, 0, 255), false, true, false),
COSMETIC_OPTION("Consumable.MagicActive", "Magic Active", COSMETICS_GROUP_CONSUMABLE, ColorRGBA8(250, 250, 0, 255), false, true, true),
COSMETIC_OPTION("Consumable_MagicInfinite", "Infinite Magic", COSMETICS_GROUP_CONSUMABLE, ColorRGBA8( 0, 0, 200, 255), false, true, true),
COSMETIC_OPTION("Consumable.MagicInfinite", "Infinite Magic", COSMETICS_GROUP_CONSUMABLE, ColorRGBA8( 0, 0, 200, 255), false, true, true),
COSMETIC_OPTION("Consumable.MagicBorder", "Magic Border", COSMETICS_GROUP_CONSUMABLE, ColorRGBA8(255, 255, 255, 255), false, true, true),
COSMETIC_OPTION("Consumable.MagicBorderActive", "Magic Border Active", COSMETICS_GROUP_CONSUMABLE, ColorRGBA8(255, 255, 255, 255), false, true, true),
COSMETIC_OPTION("Consumable.GreenRupee", "Green Rupee", COSMETICS_GROUP_CONSUMABLE, ColorRGBA8( 50, 255, 50, 255), false, true, true),
@@ -439,7 +446,7 @@ static std::map<std::string, CosmeticOption> cosmeticOptions = {
COSMETIC_OPTION("NPC.Dog1", "Dog 1", COSMETICS_GROUP_NPC, ColorRGBA8(255, 255, 200, 255), false, true, true),
COSMETIC_OPTION("NPC.Dog2", "Dog 2", COSMETICS_GROUP_NPC, ColorRGBA8(150, 100, 50, 255), false, true, true),
COSMETIC_OPTION("NPC.GoldenSkulltula", "Golden Skulltula", COSMETICS_GROUP_NPC, ColorRGBA8(255, 255, 255, 255), false, true, false),
COSMETIC_OPTION("NPC.Kokiri", "Kokiri", COSMETICS_GROUP_NPC, ColorRGBA8( 0, 130, 70, 255), false, true, false),
COSMETIC_OPTION("NPC.Kokiri", "Kokiri", COSMETICS_GROUP_NPC, ColorRGBA8(255, 0, 0, 255), false, true, false),
COSMETIC_OPTION("NPC.Gerudo", "Gerudo", COSMETICS_GROUP_NPC, ColorRGBA8( 90, 0, 140, 255), false, true, false),
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),
@@ -566,6 +573,23 @@ void CosmeticsUpdateTick() {
5. GFX Command: The GFX command you want to insert
*/
void ApplyOrResetCustomGfxPatches(bool manualChange) {
if (manualChange) {
PATCH_GFX(object_wood02_DL_007968, "Tree1", "gLetItSnow", 17, gsDPSetPrimColor(0, 0, 255, 255, 255, 255));
PATCH_GFX(object_wood02_DL_000090, "Tree2", "gLetItSnow", 17, gsDPSetPrimColor(0, 0, 200, 255, 255, 255));
PATCH_GFX(object_wood02_DL_000340, "Tree3", "gLetItSnow", 17, gsDPSetPrimColor(0, 0, 255, 255, 255, 255));
PATCH_GFX(object_wood02_DL_000340, "Tree4", "gLetItSnow", 24, gsDPSetPrimColor(0, 0, 255, 255, 255, 255));
PATCH_GFX(spot00_room_0DL_0139A8, "Path1", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 100, 150, 255, 60));
PATCH_GFX(spot00_room_0DL_013250, "Path2", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 100, 150, 255, 60));
PATCH_GFX(spot00_room_0DL_0143C8, "Path3", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 100, 150, 255, 60));
PATCH_GFX(spot04_room_0DL_018048, "Path4", "gLetItSnow", 24, gsDPSetPrimColor(0, 0, 100, 150, 255, 60));
PATCH_GFX(spot04_room_1DL_007810, "Path5", "gLetItSnow", 24, gsDPSetPrimColor(0, 0, 100, 150, 255, 60));
PATCH_GFX(spot20_room_0DL_0062D0, "Path6", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 200, 230, 255, 30));
PATCH_GFX(spot20_room_0DL_004460, "Path8", "gLetItSnow", 31, gsDPSetPrimColor(0, 0, 200, 230, 255, 30));
PATCH_GFX(spot20_room_0DL_004460, "Path9", "gLetItSnow", 118, gsDPSetPrimColor(0, 0, 200, 230, 255, 30));
PATCH_GFX(spot20_room_0DL_0065E8, "Path10", "gLetItSnow", 24, gsDPSetPrimColor(0, 0, 200, 230, 255, 30));
PATCH_GFX(spot03_room_0DL_00C4B0, "Path11", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 200, 230, 255, 30));
PATCH_GFX(spot15_room_0DL_00C748, "Path12", "gLetItSnow", 23, gsDPSetPrimColor(0, 0, 200, 230, 255, 30));
}
static CosmeticOption& magicFaroresPrimary = cosmeticOptions.at("Magic.FaroresPrimary");
if (manualChange || CVarGetInteger(magicFaroresPrimary.rainbowCvar, 0)) {
Color_RGBA8 color = CVarGetColor(magicFaroresPrimary.valuesCvar, magicFaroresPrimary.defaultColor);
@@ -68,6 +68,7 @@ typedef enum {
extern "C" {
#endif
uint8_t GameInteractor_NoUIActive();
void GameInteractor_SetNoUIActive(uint8_t state);
GILinkSize GameInteractor_GetLinkSize();
void GameInteractor_SetLinkSize(GILinkSize size);
uint8_t GameInteractor_InvisibleLinkActive();
@@ -36,6 +36,10 @@ uint8_t GameInteractor_NoUIActive() {
return GameInteractor::State::NoUIActive;
}
void GameInteractor_SetNoUIActive(uint8_t state) {
GameInteractor::State::NoUIActive = state;
}
// MARK: - GameInteractor::State::LinkSize
GILinkSize GameInteractor_GetLinkSize() {
return GameInteractor::State::LinkSize;
+83
View File
@@ -40,6 +40,7 @@ extern "C" {
extern SaveContext gSaveContext;
extern PlayState* gPlayState;
extern s16 gEnSnowballId;
}
/// Switches Link's age and respawns him at the last entrance he entered.
@@ -562,6 +563,87 @@ void RegisterRandomizedEnemySizes() {
});
}
static CollisionPoly snowballPoly;
static Vec3f snowballPos;
static f32 raycastResult;
static u32 iceBlockParams[] = {
0x214, 0x1, 0x11, 0x10, 0x20,
};
void RegisterSnowballs() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnSceneSpawnActors>([]() {
if (gPlayState->sceneNum != SCENE_HYRULE_FIELD && gPlayState->sceneNum != SCENE_KAKARIKO_VILLAGE) {
return;
}
int actorsSpawned = 0;
while (actorsSpawned < 30) {
snowballPos.x = (float)(Random((gPlayState->sceneNum == SCENE_HYRULE_FIELD ? -10000 : -2700) + 10000,
(gPlayState->sceneNum == SCENE_HYRULE_FIELD ? 5000 : 2000) + 10000) -
(float)10000.0f);
snowballPos.y = 5000;
snowballPos.z = (float)(Random((gPlayState->sceneNum == SCENE_HYRULE_FIELD ? -1000 : -2000) + 10000,
(gPlayState->sceneNum == SCENE_HYRULE_FIELD ? 15000 : 2000) + 10000) -
(float)10000.0f);
raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &snowballPos);
if (raycastResult > BGCHECK_Y_MIN) {
Actor_Spawn(&gPlayState->actorCtx, gPlayState, gEnSnowballId, snowballPos.x, raycastResult,
snowballPos.z, 0, 0, 0, gPlayState->sceneNum == SCENE_HYRULE_FIELD, 0);
actorsSpawned++;
}
}
});
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnSceneSpawnActors>([]() {
if (gPlayState->sceneNum != SCENE_LAKE_HYLIA) {
return;
}
int actorsSpawned = 0;
Vec3f spawnedIceBlockPos[15];
while (actorsSpawned < 15) {
Vec3f iceBlockPos;
iceBlockPos.x = (float)(Random((-4200) + 10000, (3000) + 10000) - (float)10000.0f);
iceBlockPos.y = -1713.0f;
iceBlockPos.z = (float)(Random((2600) + 10000, (9000) + 10000) - (float)10000.0f);
raycastResult = BgCheck_AnyRaycastFloor1(&gPlayState->colCtx, &snowballPoly, &iceBlockPos);
if (raycastResult > BGCHECK_Y_MIN) {
bool overlaps = false;
for (int i = 0; i < actorsSpawned; i++) {
if (Math_Vec3f_DistXZ(&spawnedIceBlockPos[i], &iceBlockPos) < 500.0f) {
overlaps = true;
break;
}
}
if (overlaps) {
continue;
}
if (LINK_IS_ADULT && !Flags_GetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER)) {
iceBlockPos.y = raycastResult;
} else {
iceBlockPos.y = -1310.0f;
}
Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_BG_SPOT08_ICEBLOCK, iceBlockPos.x, iceBlockPos.y,
iceBlockPos.z, 0, (s16)Random(0, 0xFFFF), 0, RandomElement(iceBlockParams), 0);
spawnedIceBlockPos[actorsSpawned] = iceBlockPos;
actorsSpawned++;
}
}
});
}
void InitMods() {
RandomizerRegisterHooks();
TimeSaverRegisterHooks();
@@ -574,4 +656,5 @@ void InitMods() {
RegisterPatchHandHandler();
RegisterHurtContainerModeHandler();
RandoKaleido_RegisterHooks();
RegisterSnowballs();
}
@@ -403,7 +403,7 @@ void Rando::StaticData::InitItemTable() {
itemTable[RG_DEKU_STICK_CAPACITY_30] = Item(RG_DEKU_STICK_CAPACITY_30, Text{ "Deku Stick Capacity (30)", "Capacité de Bâtons Mojo (30)", "Deku-Stab-Kapazität (30)" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_DEKU_STICK_CAPACITY_30, ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE);
itemTable[RG_MAGIC_SINGLE] = Item(RG_MAGIC_SINGLE, Text{ "Magic Meter", "Jauge de Magie", "Magische Kraft" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_SINGLE, RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie améliorée", "Verb. Magische Kraft" }, 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-Splitter" }, 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);
itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Christmas Ornament", "Christmas Ornament", "Christmas Ornament" }, 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);
// Archipelago
itemTable[RG_ARCHIPELAGO_ITEM_USEFUL] = Item(RG_ARCHIPELAGO_ITEM_USEFUL, Text{"Useful AP Item", "Useful AP Item", "Useful AP Item"}, ITEMTYPE_EVENT, GI_RUPEE_GREEN, false, LOGIC_NONE, RHT_NONE, RG_ARCHIPELAGO_ITEM_USEFUL, OBJECT_GI_LETTER, GID_LETTER_ZELDA, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER);
+55 -15
View File
@@ -67,6 +67,7 @@ const std::string Randomizer::NaviRandoMessageTableID = "RandomizerNavi";
const std::string Randomizer::IceTrapRandoMessageTableID = "RandomizerIceTrap";
const std::string Randomizer::randoMiscHintsTableID = "RandomizerMiscHints";
const std::string Randomizer::archipelagoItemsTableID = "ÁrchipelagoItems";
const std::string Randomizer::christmasTreeMessageTableID = "RandomizerChristmasTree";
static const char* englishRupeeNames[188] = {
"[P]",
@@ -4822,33 +4823,33 @@ CustomMessage Randomizer::GetRupeeMessage(u16 rupeeTextId) {
void CreateTriforcePieceMessages() {
CustomMessage TriforcePieceMessages[NUM_TRIFORCE_PIECE_MESSAGES] = {
{ "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. It's a start!",
"Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es ist ein&Anfang!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à "
{ "You found a %yChristmas Ornament%w!&%g[[current]]%w down, %c[[remaining]]%w to go. It's a start!",
"Ein %yChristmas Ornament%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es ist ein&Anfang!",
"Vous trouvez un %yChristmas Ornament%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à "
"trouver. C'est un début!" },
{ "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Progress!",
"Ein %yTriforce-Splitter%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es geht voran!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à "
{ "You found a %yChristmas Ornament%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Progress!",
"Ein %yChristmas Ornament%w! Du hast&%g[[current]]%w von %c[[required]]%w gefunden. Es geht voran!",
"Vous trouvez un %yChristmas Ornament%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à "
"trouver. Ça avance!" },
{ "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Over half-way&there!",
"Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Schon&über die "
{ "You found a %yChristmas Ornament%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Over half-way&there!",
"Ein %yChristmas Ornament%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Schon&über die "
"Hälfte!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à "
"Vous trouvez un %yChristmas Ornament%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à "
"trouver. Il en reste un&peu moins que la moitié!" },
{ "You found a %yTriforce Piece%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Almost done!",
"Ein %yTriforce-Splitter%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Fast&geschafft!",
"Vous trouvez un %yFragment de la&Triforce%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à "
{ "You found a %yChristmas Ornament%w!&%g[[current]]%w down, %c[[remaining]]%w to go. Almost done!",
"Ein %yChristmas Ornament%w! Du hast&schon %g[[current]]%w von %c[[required]]%w gefunden. Fast&geschafft!",
"Vous trouvez un %yChristmas Ornament%w! Vous en avez %g[[current]]%w, il en&reste %c[[remaining]]%w à "
"trouver. C'est presque&terminé!" },
{ "You completed the %yTriforce of&Courage%w! %gGG%w!",
{ "You found all of the %yChristmas&Ornaments%w! Visit the %gChristmas&tree%w in Kakariko Village!",
"Das %yTriforce des Mutes%w! Du hast&alle Splitter gefunden. %gGut gemacht%w!",
"Vous avez complété la %yTriforce&du Courage%w! %gFélicitations%w!" },
{ "You found a spare %yTriforce Piece%w!&You only needed %c[[required]]%w, but you have %g[[current]]%w!",
"Noch ein %yTriforce-Splitter%w! Du&brauchtest nur %c[[required]]%w, hast jetzt aber %g[[current]]%w!",
{ "You found a spare %yChristmas Ornament%w!&You only needed %c[[required]]%w, but you have %g[[current]]%w!",
"Noch ein %yChristmas Ornament%w! Du&brauchtest nur %c[[required]]%w, hast jetzt aber %g[[current]]%w!",
"Vous avez trouvé un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c[[required]]%w, mais "
"vous en avez %g[[current]]%w en&tout!" },
};
@@ -4890,6 +4891,44 @@ CustomMessage Randomizer::GetTriforcePieceMessage() {
return messageEntry;
}
void CreateChristmasTreeMessages() {
CustomMessage ChristmasTreeMessages[2] = {
{ "The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save "
"%rChristmas%w!",
"The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save "
"%rChristmas%w!",
"The %yChristmas tree%w seems to be&missing some of %gits magic%w... Find all&ornaments to save "
"%rChristmas%w!" },
{ "The tree's magic has been fully&restored. %gMerry %rChristmas%w!",
"The tree's magic has been fully&restored. %gMerry %rChristmas%w!",
"The tree's magic has been fully&restored. %gMerry %rChristmas%w!" }
};
CustomMessageManager* customMessageManager = CustomMessageManager::Instance;
customMessageManager->AddCustomMessageTable(Randomizer::christmasTreeMessageTableID);
for (unsigned int i = 0; i <= 1; i++) {
customMessageManager->CreateMessage(Randomizer::christmasTreeMessageTableID, i, ChristmasTreeMessages[i]);
}
}
CustomMessage Randomizer::GetChristmasTreeMessage() {
// Item is only given after the textbox, so reflect that inside the textbox.
uint8_t current = gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected;
uint8_t required = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED);
uint8_t messageIndex;
if (current < required) {
messageIndex = 0;
} else {
messageIndex = 1;
}
CustomMessage messageEntry =
CustomMessageManager::Instance->RetrieveMessage(Randomizer::christmasTreeMessageTableID, messageIndex);
return messageEntry;
}
void CreateNaviRandoMessages() {
CustomMessage NaviMessages[NUM_NAVI_MESSAGES] = {
@@ -5900,6 +5939,7 @@ void Randomizer::CreateCustomMessages() {
CreateGetItemMessages(getItemMessages);
CreateRupeeMessages();
CreateTriforcePieceMessages();
CreateChristmasTreeMessages();
CreateNaviRandoMessages();
CreateFireTempleGoronMessages();
CreateArchipelagoItemMessage();
@@ -35,6 +35,7 @@ class Randomizer {
static const std::string merchantMessageTableID;
static const std::string rupeeMessageTableID;
static const std::string triforcePieceMessageTableID;
static const std::string christmasTreeMessageTableID;
static const std::string NaviRandoMessageTableID;
static const std::string IceTrapRandoMessageTableID;
static const std::string randoMiscHintsTableID;
@@ -77,6 +78,7 @@ class Randomizer {
static CustomMessage GetIceTrapMessage();
static CustomMessage GetTriforcePieceMessage();
static CustomMessage GetArchipelagoItemMessage(int16_t randomizerGet, uint32_t randomizerCheck);
static CustomMessage GetChristmasTreeMessage();
};
#ifdef __cplusplus
@@ -807,7 +807,7 @@ void DrawItem(ItemTrackerItem item) {
case RG_TRIFORCE_PIECE:
actualItemId = item.id;
hasItem = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT);
itemName = "Triforce Piece";
itemName = "Christmas Ornament";
break;
case RG_GOHMA_SOUL:
actualItemId = item.id;
@@ -1669,7 +1669,7 @@ void ItemTrackerWindow::DrawElement() {
if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), SECTION_DISPLAY_HIDDEN) ==
SECTION_DISPLAY_SEPARATE) {
BeginFloatingWindows("Triforce Piece Tracker");
BeginFloatingWindows("Christmas Ornament Tracker");
DrawItemsInRows(triforcePieces);
EndFloatingWindows();
}
@@ -1992,7 +1992,7 @@ void RegisterItemTrackerWidgets() {
.Tooltip("Customize what numbers are shown for key tracking."));
SohGui::mSohMenu->AddSearchWidget({ keyTracking, "Randomizer", "Item Tracker", "General Settings" });
triforcePieceTracking = { .name = "Triforce Pieces", .type = WidgetType::WIDGET_CVAR_COMBOBOX };
triforcePieceTracking = { .name = "Christmas Ornaments", .type = WidgetType::WIDGET_CVAR_COMBOBOX };
triforcePieceTracking.CVar(CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"))
.Options(ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN)
@@ -2040,7 +2040,7 @@ void RegisterItemTrackerWidgets() {
;
SohGui::mSohMenu->AddSearchWidget({ bossSoulsTracking, "Randomizer", "Item Tracker", "General Settings", "icon" });
triforcePieceCount = { .name = "Triforce Piece Count Tracking", .type = WidgetType::WIDGET_CVAR_COMBOBOX };
triforcePieceCount = { .name = "Christmas Ornament Count Tracking", .type = WidgetType::WIDGET_CVAR_COMBOBOX };
triforcePieceCount.CVar(CVAR_TRACKER_ITEM("TriforcePieceCounts"))
.Options(ComboboxOptions()
.DefaultIndex(TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX)
@@ -2048,7 +2048,7 @@ void RegisterItemTrackerWidgets() {
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR)
.ComboMap(itemTrackerTriforcePieceTrackOptions)
.Tooltip("Customize what numbers are shown for triforce piece tracking."));
.Tooltip("Customize what numbers are shown for Christmas ornament tracking."));
SohGui::mSohMenu->AddSearchWidget({ triforcePieceCount, "Randomizer", "Item Tracker", "General Settings" });
ocarinaButtonTracking = { .name = "Ocarina Buttons", .type = WidgetType::WIDGET_CVAR_COMBOBOX };
+20 -6
View File
@@ -1313,11 +1313,23 @@ extern "C" void InitOTR(int argc, char* argv[]) {
time_t now = time(NULL);
tm* tm_now = localtime(&now);
if (tm_now->tm_mon == 11 && tm_now->tm_mday >= 24 && tm_now->tm_mday <= 25) {
CVarRegisterInteger(CVAR_GENERAL("LetItSnow"), 1);
} else {
CVarClear(CVAR_GENERAL("LetItSnow"));
}
//if (tm_now->tm_mon == 11 && tm_now->tm_mday >= 24 && tm_now->tm_mday <= 25) {
// CVarRegisterInteger(CVAR_GENERAL("LetItSnow"), 1);
//} else {
// CVarClear(CVAR_GENERAL("LetItSnow"));
//}
CVarRegisterInteger(CVAR_GENERAL("LetItSnow"), 1);
CVarRegisterInteger(CVAR_COSMETIC("Hud.AButton.Changed"), 1);
CVarRegisterColor(CVAR_COSMETIC("Hud.AButton.Value"), Color_RGBA8{ 255, 255, 255, 255 });
CVarRegisterInteger(CVAR_COSMETIC("Hud.BButton.Changed"), 1);
CVarRegisterColor(CVAR_COSMETIC("Hud.BButton.Value"), Color_RGBA8{ 255, 255, 255, 255 });
CVarRegisterInteger(CVAR_COSMETIC("Hud.CButtons.Changed"), 1);
CVarRegisterColor(CVAR_COSMETIC("Hud.CButtons.Value"), Color_RGBA8{ 255, 255, 255, 255 });
CVarRegisterInteger(CVAR_COSMETIC("Consumable.Hearts.Changed"), 1);
CVarRegisterColor(CVAR_COSMETIC("Consumable.Hearts.Value"), Color_RGBA8{ 255, 158, 0, 255 });
CVarRegisterInteger(CVAR_COSMETIC("Consumable.Magic.Changed"), 1);
CVarRegisterColor(CVAR_COSMETIC("Consumable.Magic.Value"), Color_RGBA8{ 255, 0, 0, 255 });
srand(now);
#ifdef ENABLE_REMOTE_CONTROL
@@ -2427,7 +2439,9 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
bool nonBeanMerchants = ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) ||
ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL);
Player* player = GET_PLAYER(play);
if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) {
if (textId == 0x406B && play->sceneNum == SCENE_KAKARIKO_VILLAGE) {
messageEntry = Randomizer::GetChristmasTreeMessage();
} else if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) {
if (player->getItemEntry.getItemId == RG_ICE_TRAP) {
messageEntry = Randomizer::GetIceTrapMessage();
} else if (player->getItemEntry.getItemId == RG_TRIFORCE_PIECE) {