Add heart chest texture from 2ship. Remove size matches contents option

This commit is contained in:
Demur Rumed 2025-06-14 20:56:56 +00:00
commit e938975dd1
14 changed files with 83 additions and 142 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -38,6 +38,12 @@ static const ALIGN_ASSET(2) char gSkullTreasureChestFrontTex[] = dgSkullTreasure
#define dgSkullTreasureChestSideAndTopTex "__OTR__objects/object_box/gSkullTreasureChestSideAndTopTex" #define dgSkullTreasureChestSideAndTopTex "__OTR__objects/object_box/gSkullTreasureChestSideAndTopTex"
static const ALIGN_ASSET(2) char gSkullTreasureChestSideAndTopTex[] = dgSkullTreasureChestSideAndTopTex; static const ALIGN_ASSET(2) char gSkullTreasureChestSideAndTopTex[] = dgSkullTreasureChestSideAndTopTex;
#define dgHealthTreasureChestFrontTex "__OTR__objects/object_box/gHealthTreasureChestFrontTex"
static const ALIGN_ASSET(2) char gHealthTreasureChestFrontTex[] = dgHealthTreasureChestFrontTex;
#define dgHealthTreasureChestSideAndTopTex "__OTR__objects/object_box/gHealthTreasureChestSideAndTopTex"
static const ALIGN_ASSET(2) char gHealthTreasureChestSideAndTopTex[] = dgHealthTreasureChestSideAndTopTex;
#define dgTitleRandomizerSubtitleTex "__OTR__objects/object_mag/gTitleRandomizerSubtitleTex" #define dgTitleRandomizerSubtitleTex "__OTR__objects/object_mag/gTitleRandomizerSubtitleTex"
static const ALIGN_ASSET(2) char gTitleRandomizerSubtitleTex[] = dgTitleRandomizerSubtitleTex; static const ALIGN_ASSET(2) char gTitleRandomizerSubtitleTex[] = dgTitleRandomizerSubtitleTex;

View file

@ -7,13 +7,6 @@ typedef enum {
WARP_MODE_OVERRIDE_VANILLA_AS_MQ, WARP_MODE_OVERRIDE_VANILLA_AS_MQ,
} BetterDebugWarpOverrideMQMode; } BetterDebugWarpOverrideMQMode;
typedef enum {
CSMC_DISABLED,
CSMC_BOTH,
CSMC_TEXTURE,
CSMC_SIZE,
} ChestStyleMatchesContentsType;
typedef enum { typedef enum {
SGIA_DISABLED, SGIA_DISABLED,
SGIA_JUNK, SGIA_JUNK,

View file

@ -23,10 +23,11 @@ typedef enum GetItemFrom {
typedef enum GetItemCategory { typedef enum GetItemCategory {
/* 0x00 */ ITEM_CATEGORY_JUNK, /* 0x00 */ ITEM_CATEGORY_JUNK,
/* 0x01 */ ITEM_CATEGORY_LESSER, /* 0x01 */ ITEM_CATEGORY_LESSER,
/* 0x02 */ ITEM_CATEGORY_BOSS_KEY, /* 0x02 */ ITEM_CATEGORY_HEALTH,
/* 0x03 */ ITEM_CATEGORY_SMALL_KEY, /* 0x03 */ ITEM_CATEGORY_BOSS_KEY,
/* 0x04 */ ITEM_CATEGORY_SKULLTULA_TOKEN, /* 0x04 */ ITEM_CATEGORY_SMALL_KEY,
/* 0x05 */ ITEM_CATEGORY_MAJOR, /* 0x05 */ ITEM_CATEGORY_SKULLTULA_TOKEN,
/* 0x06 */ ITEM_CATEGORY_MAJOR,
} GetItemCategory; } GetItemCategory;
#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, getItemId) \ #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, itemCategory, modIndex, getItemId) \
@ -63,7 +64,7 @@ typedef struct GetItemEntry {
/* 0x0C */ uint16_t /* 0x0C */ uint16_t
collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. collectable; // determines whether the item can be collected on the overworld. Will be true in most cases.
/* 0x0E */ GetItemFrom getItemFrom; /* 0x0E */ GetItemFrom getItemFrom;
/* 0x0F */ GetItemCategory getItemCategory; // Primarily made and used for chest size/texture matches contents /* 0x0F */ GetItemCategory getItemCategory; // Primarily made and used for container texture matches contents
/* 0x10 */ uint16_t drawItemId; // Will be a copy of itemId unless the item is an ice trap. Needed for particles to /* 0x10 */ uint16_t drawItemId; // Will be a copy of itemId unless the item is an ice trap. Needed for particles to
// function on ice traps. // function on ice traps.
/* 0x11 */ uint16_t drawModIndex; // Will be a copy of modIndex unless the item is an ice trap. Needed for particles /* 0x11 */ uint16_t drawModIndex; // Will be a copy of modIndex unless the item is an ice trap. Needed for particles

View file

@ -20,11 +20,10 @@ extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play);
extern "C" void ObjKibako2_RandomizerDraw(Actor* thisx, PlayState* play) { extern "C" void ObjKibako2_RandomizerDraw(Actor* thisx, PlayState* play) {
GetItemCategory getItemCategory; GetItemCategory getItemCategory;
auto crateActor = ((ObjKibako2*)thisx); auto crateActor = ((ObjKibako2*)thisx);
int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); bool csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), 0);
int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0);
int isVanilla = int isVanilla = !csmc || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY));
csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY));
if (isVanilla) { if (isVanilla) {
Gfx_DrawDListOpa(play, (Gfx*)gLargeRandoCrateDL); Gfx_DrawDListOpa(play, (Gfx*)gLargeRandoCrateDL);
@ -88,11 +87,10 @@ extern "C" void ObjKibako2_RandomizerDraw(Actor* thisx, PlayState* play) {
extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) { extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) {
GetItemCategory getItemCategory; GetItemCategory getItemCategory;
auto smallCrateActor = ((ObjKibako*)thisx); auto smallCrateActor = ((ObjKibako*)thisx);
int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); bool csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), 0);
int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0);
int isVanilla = int isVanilla = !csmc || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY));
csmc == CSMC_DISABLED || csmc == CSMC_SIZE || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY));
if (isVanilla) { if (isVanilla) {
Gfx_DrawDListOpa(play, (Gfx*)gSmallRandoCrateDL); Gfx_DrawDListOpa(play, (Gfx*)gSmallRandoCrateDL);
@ -134,18 +132,12 @@ extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) {
case ITEM_CATEGORY_BOSS_KEY: case ITEM_CATEGORY_BOSS_KEY:
Gfx_DrawDListOpa(play, (Gfx*)gSmallBossKeyCrateDL); Gfx_DrawDListOpa(play, (Gfx*)gSmallBossKeyCrateDL);
break; break;
case ITEM_CATEGORY_LESSER: case ITEM_CATEGORY_HEALTH:
switch (smallCrateItem.itemId) {
case ITEM_HEART_PIECE:
case ITEM_HEART_PIECE_2:
case ITEM_HEART_CONTAINER:
Gfx_DrawDListOpa(play, (Gfx*)gSmallHeartCrateDL); Gfx_DrawDListOpa(play, (Gfx*)gSmallHeartCrateDL);
break; break;
default: case ITEM_CATEGORY_LESSER:
Gfx_DrawDListOpa(play, (Gfx*)gSmallMinorCrateDL); Gfx_DrawDListOpa(play, (Gfx*)gSmallMinorCrateDL);
break; break;
}
break;
case ITEM_CATEGORY_JUNK: case ITEM_CATEGORY_JUNK:
default: default:
Gfx_DrawDListOpa(play, (Gfx*)gSmallJunkCrateDL); Gfx_DrawDListOpa(play, (Gfx*)gSmallJunkCrateDL);

View file

@ -32,11 +32,10 @@ extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) {
if (grassActor->grassIdentity.randomizerCheck != RC_MAX && if (grassActor->grassIdentity.randomizerCheck != RC_MAX &&
Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) == 0) { Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) == 0) {
int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); bool csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), 0);
int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0);
if ((csmc == CSMC_BOTH || csmc == CSMC_TEXTURE) && if (csmc && (!requiresStoneAgony || (requiresStoneAgony && CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) {
(!requiresStoneAgony || (requiresStoneAgony && CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) {
auto itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, auto itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck,
true, GI_NONE); true, GI_NONE);
GetItemCategory getItemCategory = itemEntry.getItemCategory; GetItemCategory getItemCategory = itemEntry.getItemCategory;
@ -46,18 +45,10 @@ extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) {
DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, play); DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, play);
break; break;
case ITEM_CATEGORY_LESSER: case ITEM_CATEGORY_LESSER:
switch (itemEntry.itemId) { DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMinorDL, (Gfx*)gRandoCuttableGrassMinorDL, play);
case ITEM_HEART_PIECE:
case ITEM_HEART_PIECE_2:
case ITEM_HEART_CONTAINER:
DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushHeartDL, (Gfx*)gRandoCuttableGrassHeartDL,
play);
break; break;
default: case ITEM_CATEGORY_HEALTH:
DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushMinorDL, (Gfx*)gRandoCuttableGrassMinorDL, DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushHeartDL, (Gfx*)gRandoCuttableGrassHeartDL, play);
play);
break;
}
break; break;
case ITEM_CATEGORY_BOSS_KEY: case ITEM_CATEGORY_BOSS_KEY:
DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushBossKeyDL, (Gfx*)gRandoCuttableGrassBossKeyDL, play); DrawTypeOfGrass(grassActor, (Gfx*)gRandoBushBossKeyDL, (Gfx*)gRandoCuttableGrassBossKeyDL, play);

View file

@ -327,6 +327,7 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() {
getItemEntry.modIndex == MOD_RANDOMIZER) && getItemEntry.modIndex == MOD_RANDOMIZER) &&
(getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK || (getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK ||
getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN || getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN ||
getItemEntry.getItemCategory == ITEM_CATEGORY_HEALTH ||
getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER))))) { getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER))))) {
Item_DropCollectible(gPlayState, &spawnPos, static_cast<int16_t>(ITEM00_SOH_GIVE_ITEM_ENTRY | 0x8000)); Item_DropCollectible(gPlayState, &spawnPos, static_cast<int16_t>(ITEM00_SOH_GIVE_ITEM_ENTRY | 0x8000));
} }

View file

@ -41,7 +41,7 @@ void Rando::StaticData::InitItemTable() {
itemTable[RG_GERUDO_MEMBERSHIP_CARD] = Item(RG_GERUDO_MEMBERSHIP_CARD, Text{ "Gerudo Membership Card", "Carte Gerudo", "Gerudo-Pass" }, ITEMTYPE_ITEM, GI_GERUDO_CARD, true, LOGIC_GERUDO_CARD, RHT_GERUDO_MEMBERSHIP_CARD, ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_GERUDO_MEMBERSHIP_CARD] = Item(RG_GERUDO_MEMBERSHIP_CARD, Text{ "Gerudo Membership Card", "Carte Gerudo", "Gerudo-Pass" }, ITEMTYPE_ITEM, GI_GERUDO_CARD, true, LOGIC_GERUDO_CARD, RHT_GERUDO_MEMBERSHIP_CARD, ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE);
itemTable[RG_MAGIC_BEAN] = Item(RG_MAGIC_BEAN, Text{ "Magic Bean", "Haricots Magiques", "Wundererbse" }, ITEMTYPE_ITEM, GI_BEAN, true, LOGIC_MAGIC_BEAN, RHT_MAGIC_BEAN, ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_MAGIC_BEAN] = Item(RG_MAGIC_BEAN, Text{ "Magic Bean", "Haricots Magiques", "Wundererbse" }, ITEMTYPE_ITEM, GI_BEAN, true, LOGIC_MAGIC_BEAN, RHT_MAGIC_BEAN, ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE);
itemTable[RG_MAGIC_BEAN_PACK] = Item(RG_MAGIC_BEAN_PACK, Text{ "Magic Bean Pack", "Paquet de Haricots Magiques", "Wundererbsen-Packung" }, ITEMTYPE_ITEM, RG_MAGIC_BEAN_PACK, true, LOGIC_MAGIC_BEAN, RHT_MAGIC_BEAN_PACK, RG_MAGIC_BEAN_PACK, OBJECT_GI_BEAN, GID_BEAN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_MAGIC_BEAN_PACK] = Item(RG_MAGIC_BEAN_PACK, Text{ "Magic Bean Pack", "Paquet de Haricots Magiques", "Wundererbsen-Packung" }, ITEMTYPE_ITEM, RG_MAGIC_BEAN_PACK, true, LOGIC_MAGIC_BEAN, RHT_MAGIC_BEAN_PACK, RG_MAGIC_BEAN_PACK, OBJECT_GI_BEAN, GID_BEAN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_DOUBLE_DEFENSE] = Item(RG_DOUBLE_DEFENSE, Text{ "Double Defense", "Double Défence", "Doppelte Verteidigung" }, ITEMTYPE_ITEM, RG_DOUBLE_DEFENSE, true, LOGIC_DOUBLE_DEFENSE, RHT_DOUBLE_DEFENSE, RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_DOUBLE_DEFENSE] = Item(RG_DOUBLE_DEFENSE, Text{ "Double Defense", "Double Défence", "Doppelte Verteidigung" }, ITEMTYPE_ITEM, RG_DOUBLE_DEFENSE, true, LOGIC_DOUBLE_DEFENSE, RHT_DOUBLE_DEFENSE, RG_DOUBLE_DEFENSE, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xE9, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_HEALTH, MOD_RANDOMIZER);
itemTable[RG_DOUBLE_DEFENSE].SetCustomDrawFunc(Randomizer_DrawDoubleDefense); itemTable[RG_DOUBLE_DEFENSE].SetCustomDrawFunc(Randomizer_DrawDoubleDefense);
// Trade Quest Items // Trade Quest Items
itemTable[RG_WEIRD_EGG] = Item(RG_WEIRD_EGG, Text{ "Weird Egg", "Oeuf Curieux", "Seltsames Ei" }, ITEMTYPE_ITEM, GI_WEIRD_EGG, true, LOGIC_WEIRD_EGG, RHT_WEIRD_EGG, ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_WEIRD_EGG] = Item(RG_WEIRD_EGG, Text{ "Weird Egg", "Oeuf Curieux", "Seltsames Ei" }, ITEMTYPE_ITEM, GI_WEIRD_EGG, true, LOGIC_WEIRD_EGG, RHT_WEIRD_EGG, ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE);
@ -259,8 +259,8 @@ void Rando::StaticData::InitItemTable() {
itemTable[RG_RED_RUPEE] = Item(RG_RED_RUPEE, Text{ "Red Rupee", "Rubis Rouge", "Roter Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_RED, false, LOGIC_NONE, RHT_RED_RUPEE, ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_RED_RUPEE] = Item(RG_RED_RUPEE, Text{ "Red Rupee", "Rubis Rouge", "Roter Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_RED, false, LOGIC_NONE, RHT_RED_RUPEE, ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
itemTable[RG_PURPLE_RUPEE] = Item(RG_PURPLE_RUPEE, Text{ "Purple Rupee", "Rubis Pourpre", "Violetter Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_PURPLE, false, LOGIC_NONE, RHT_PURPLE_RUPEE, ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_PURPLE_RUPEE] = Item(RG_PURPLE_RUPEE, Text{ "Purple Rupee", "Rubis Pourpre", "Violetter Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_PURPLE, false, LOGIC_NONE, RHT_PURPLE_RUPEE, ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE);
itemTable[RG_HUGE_RUPEE] = Item(RG_HUGE_RUPEE, Text{ "Huge Rupee", "Énorme Rubis", "Riesiger Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, false, LOGIC_NONE, RHT_HUGE_RUPEE, ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_HUGE_RUPEE] = Item(RG_HUGE_RUPEE, Text{ "Huge Rupee", "Énorme Rubis", "Riesiger Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, false, LOGIC_NONE, RHT_HUGE_RUPEE, ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE);
itemTable[RG_PIECE_OF_HEART] = Item(RG_PIECE_OF_HEART, Text{ "Piece of Heart", "Quart de Coeur", "Herzstück" }, ITEMTYPE_ITEM, GI_HEART_PIECE, true, LOGIC_PIECE_OF_HEART, RHT_PIECE_OF_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_PIECE_OF_HEART] = Item(RG_PIECE_OF_HEART, Text{ "Piece of Heart", "Quart de Coeur", "Herzstück" }, ITEMTYPE_ITEM, GI_HEART_PIECE, true, LOGIC_PIECE_OF_HEART, RHT_PIECE_OF_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_HEALTH, MOD_NONE);
itemTable[RG_HEART_CONTAINER] = Item(RG_HEART_CONTAINER, Text{ "Heart Container", "Réceptacle de Coeur", "Herzcontainer" }, ITEMTYPE_ITEM, GI_HEART_CONTAINER_2, true, LOGIC_HEART_CONTAINER, RHT_HEART_CONTAINER, ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_HEART_CONTAINER] = Item(RG_HEART_CONTAINER, Text{ "Heart Container", "Réceptacle de Coeur", "Herzcontainer" }, ITEMTYPE_ITEM, GI_HEART_CONTAINER_2, true, LOGIC_HEART_CONTAINER, RHT_HEART_CONTAINER, ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_HEALTH, MOD_NONE);
itemTable[RG_ICE_TRAP] = Item(RG_ICE_TRAP, Text{ "Ice Trap", "Piège de Glace", "Eisfalle" }, ITEMTYPE_ITEM, RG_ICE_TRAP, false, LOGIC_NONE, RHT_ICE_TRAP, RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_ICE_TRAP] = Item(RG_ICE_TRAP, Text{ "Ice Trap", "Piège de Glace", "Eisfalle" }, ITEMTYPE_ITEM, RG_ICE_TRAP, false, LOGIC_NONE, RHT_ICE_TRAP, RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_MILK] = Item(RG_MILK, Text{ "Milk", "Lait", "Milch" }, ITEMTYPE_ITEM, GI_MILK, false, LOGIC_NONE, RHT_NONE, ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_MILK] = Item(RG_MILK, Text{ "Milk", "Lait", "Milch" }, ITEMTYPE_ITEM, GI_MILK, false, LOGIC_NONE, RHT_NONE, ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE);
itemTable[RG_FISH] = Item(RG_FISH, Text{ "Fish", "Poisson", "Fisch" }, ITEMTYPE_ITEM, GI_FISH, false, LOGIC_NONE, RHT_NONE, ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_FISH] = Item(RG_FISH, Text{ "Fish", "Poisson", "Fisch" }, ITEMTYPE_ITEM, GI_FISH, false, LOGIC_NONE, RHT_NONE, ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE);
@ -283,7 +283,7 @@ void Rando::StaticData::InitItemTable() {
itemTable[RG_GREEN_POTION_REFILL] = Item(RG_GREEN_POTION_REFILL, Text{ "Green Potion Refill", "Recharge de Potion Verte", "Nachfüllpackung des grünen Elixiers" }, ITEMTYPE_REFILL, GI_POTION_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_GREEN_POTION_REFILL] = Item(RG_GREEN_POTION_REFILL, Text{ "Green Potion Refill", "Recharge de Potion Verte", "Nachfüllpackung des grünen Elixiers" }, ITEMTYPE_REFILL, GI_POTION_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE);
itemTable[RG_BLUE_POTION_REFILL] = Item(RG_BLUE_POTION_REFILL, Text{ "Blue Potion Refill", "Recharge de Potion Bleue", "Nachfüllpackung des blauen Elixiers" }, ITEMTYPE_REFILL, GI_POTION_BLUE, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_BLUE_POTION_REFILL] = Item(RG_BLUE_POTION_REFILL, Text{ "Blue Potion Refill", "Recharge de Potion Bleue", "Nachfüllpackung des blauen Elixiers" }, ITEMTYPE_REFILL, GI_POTION_BLUE, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE);
// Treasure Game // Treasure Game
itemTable[RG_TREASURE_GAME_HEART] = Item(RG_TREASURE_GAME_HEART, Text{ "Piece of Heart (WINNER)", "Quart de Coeur (Chasse-aux-Trésors)", "Herzstück (Schatztruhenminispiel)" }, ITEMTYPE_ITEM, GI_HEART_PIECE_WIN, true, LOGIC_PIECE_OF_HEART, RHT_TREASURE_GAME_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_TREASURE_GAME_HEART] = Item(RG_TREASURE_GAME_HEART, Text{ "Piece of Heart (WINNER)", "Quart de Coeur (Chasse-aux-Trésors)", "Herzstück (Schatztruhenminispiel)" }, ITEMTYPE_ITEM, GI_HEART_PIECE_WIN, true, LOGIC_PIECE_OF_HEART, RHT_TREASURE_GAME_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_HEALTH, MOD_NONE);
itemTable[RG_TREASURE_GAME_GREEN_RUPEE] = Item(RG_TREASURE_GAME_GREEN_RUPEE, Text{ "Green Rupee (LOSER)", "Rubis Vert (Chasse-aux-Trésors)", "Grüner Rubin (Schatztruhenminispiel)" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN_LOSE, false, LOGIC_NONE, RHT_TREASURE_GAME_GREEN_RUPEE, ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_TREASURE_GAME_GREEN_RUPEE] = Item(RG_TREASURE_GAME_GREEN_RUPEE, Text{ "Green Rupee (LOSER)", "Rubis Vert (Chasse-aux-Trésors)", "Grüner Rubin (Schatztruhenminispiel)" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN_LOSE, false, LOGIC_NONE, RHT_TREASURE_GAME_GREEN_RUPEE, ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE);
// Shop // Shop
itemTable[RG_BUY_DEKU_NUTS_5] = Item(RG_BUY_DEKU_NUTS_5, Text{ "Buy Deku Nut (5)", "Acheter: Noix Mojo (5)", "Deku-Nuß kaufen (5)" }, ITEMTYPE_SHOP, GI_NUTS_5_2, true, LOGIC_BUY_NUTS, RHT_DEKU_NUTS_5, ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 15); itemTable[RG_BUY_DEKU_NUTS_5] = Item(RG_BUY_DEKU_NUTS_5, Text{ "Buy Deku Nut (5)", "Acheter: Noix Mojo (5)", "Deku-Nuß kaufen (5)" }, ITEMTYPE_SHOP, GI_NUTS_5_2, true, LOGIC_BUY_NUTS, RHT_DEKU_NUTS_5, ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 15);

View file

@ -844,9 +844,6 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li
case VB_PLAY_SLOW_CHEST_CS: { case VB_PLAY_SLOW_CHEST_CS: {
if (CVarGetInteger(CVAR_ENHANCEMENT("FastChests"), 0)) { if (CVarGetInteger(CVAR_ENHANCEMENT("FastChests"), 0)) {
*should = false; *should = false;
} else if (CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED) && *should) {
EnBox* enBox = va_arg(args, EnBox*);
*should = enBox->dyna.actor.scale.x != 0.005f;
} }
break; break;
} }

View file

@ -682,8 +682,8 @@ extern "C" void VanillaItemTable_Init() {
GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, GI_GERUDO_CARD), GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, GI_GERUDO_CARD),
GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, GI_OCARINA_FAIRY), GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, GI_OCARINA_FAIRY),
GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_SEEDS_5), GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_SEEDS_5),
GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, GI_HEART_CONTAINER), GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_HEALTH, MOD_NONE, GI_HEART_CONTAINER),
GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, GI_HEART_PIECE), GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_HEALTH, MOD_NONE, GI_HEART_PIECE),
GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY, MOD_NONE, GI_KEY_BOSS), GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY, MOD_NONE, GI_KEY_BOSS),
GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, GI_COMPASS), GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, GI_COMPASS),
GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, GI_MAP), GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, GI_MAP),
@ -700,7 +700,7 @@ extern "C" void VanillaItemTable_Init() {
GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_GREEN), GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_GREEN),
GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_BLUE), GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_BLUE),
GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_RED), GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_RED),
GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, GI_HEART_CONTAINER_2), GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_HEALTH, MOD_NONE, GI_HEART_CONTAINER_2),
GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, GI_MILK), GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, GI_MILK),
GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, GI_MASK_GORON), GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, GI_MASK_GORON),
GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, GI_MASK_ZORA), GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE, GI_MASK_ZORA),
@ -739,7 +739,7 @@ extern "C" void VanillaItemTable_Init() {
GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_BLUE_LOSE), GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_BLUE_LOSE),
GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_RED_LOSE), GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_RED_LOSE),
GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_PURPLE_LOSE), GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, GI_RUPEE_PURPLE_LOSE),
GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, GI_HEART_PIECE_WIN), GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_HEALTH, MOD_NONE, GI_HEART_PIECE_WIN),
GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, GI_STICK_UPGRADE_20), GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, GI_STICK_UPGRADE_20),
GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, GI_STICK_UPGRADE_30), GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, GI_STICK_UPGRADE_30),
GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, GI_NUT_UPGRADE_30), GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, GI_NUT_UPGRADE_30),

View file

@ -87,13 +87,6 @@ static const std::unordered_map<int32_t, const char*> skipGetItemAnimationOption
{ SGIA_ALL, "All Items" }, { SGIA_ALL, "All Items" },
}; };
static const std::unordered_map<int32_t, const char*> chestStyleMatchesContentsOptions = {
{ CSMC_DISABLED, "Disabled" },
{ CSMC_BOTH, "Both" },
{ CSMC_TEXTURE, "Texture Only" },
{ CSMC_SIZE, "Size Only" },
};
static const std::unordered_map<int32_t, const char*> timeTravelOptions = { static const std::unordered_map<int32_t, const char*> timeTravelOptions = {
{ TIME_TRAVEL_DISABLED, "Disabled" }, { TIME_TRAVEL_DISABLED, "Disabled" },
{ TIME_TRAVEL_OOT, "Ocarina of Time" }, { TIME_TRAVEL_OOT, "Ocarina of Time" },

View file

@ -53,29 +53,21 @@ void SohMenu::AddMenuEnhancements() {
"This doesn't work if the save was made in grottos, fairy fountains, or dungeons.")); "This doesn't work if the save was made in grottos, fairy fountains, or dungeons."));
AddWidget(path, "Containers Match Contents", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Containers Match Contents", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Chest Size & Texture Matches Contents", WIDGET_CVAR_COMBOBOX) AddWidget(path, "Containers Match Contents", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents")) .CVar(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"))
.Callback([](WidgetInfo& info) { .Callback([](WidgetInfo& info) {
if (CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED) == CSMC_DISABLED) { if (!CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), 0)) {
CVarSetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); CVarSetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0);
} }
}) })
.Options(ComboboxOptions() .Options(CheckboxOptions().Tooltip(
.ComboMap(chestStyleMatchesContentsOptions) "Container textures are changed to help identify the item inside.\n"
.DefaultIndex(CSMC_DISABLED)
.Tooltip("Chest sizes and textures are changed to help identify the item inside.\n"
" - Major items: Large gold chests\n"
" - Lesser items: Large brown chests\n"
" - Junk items: Small brown chests\n"
" - Small keys: Small silver chests\n"
" - Boss keys: Vanilla size and texture\n"
" - Skulltula Tokens: Small Skulltula chest\n"
"\n" "\n"
"NOTE: Textures will not apply if you are using a mod pack with a custom chest model.")); "NOTE: Textures will not apply if you are using a mod pack with a custom chest model."));
AddWidget(path, "Chests of Agony", WIDGET_CVAR_CHECKBOX) AddWidget(path, "Chests of Agony", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony")) .CVar(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"))
.PreFunc([](WidgetInfo& info) { .PreFunc([](WidgetInfo& info) {
info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchesContents"), CSMC_DISABLED); info.isHidden = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchesContents"), 0);
}) })
.Options(CheckboxOptions().Tooltip("Only change the size/texture of chests if you have the Stone of Agony.")); .Options(CheckboxOptions().Tooltip("Only change the size/texture of chests if you have the Stone of Agony."));

View file

@ -55,7 +55,7 @@ void EnBox_AppearAnimation(EnBox*, PlayState*);
void EnBox_WaitOpen(EnBox*, PlayState*); void EnBox_WaitOpen(EnBox*, PlayState*);
void EnBox_Open(EnBox*, PlayState*); void EnBox_Open(EnBox*, PlayState*);
void EnBox_CreateExtraChestTextures(); void EnBox_CreateExtraChestTextures();
void EnBox_UpdateSizeAndTexture(EnBox*, PlayState*); void EnBox_UpdateTexture(EnBox*, PlayState*);
const ActorInit En_Box_InitVars = { const ActorInit En_Box_InitVars = {
ACTOR_EN_BOX, ACTOR_EN_BOX,
@ -84,11 +84,13 @@ Gfx gGoldTreasureChestChestSideAndLidDL[116] = { 0 };
Gfx gKeyTreasureChestChestSideAndLidDL[116] = { 0 }; Gfx gKeyTreasureChestChestSideAndLidDL[116] = { 0 };
Gfx gChristmasRedTreasureChestChestSideAndLidDL[116] = { 0 }; Gfx gChristmasRedTreasureChestChestSideAndLidDL[116] = { 0 };
Gfx gChristmasGreenTreasureChestChestSideAndLidDL[116] = { 0 }; Gfx gChristmasGreenTreasureChestChestSideAndLidDL[116] = { 0 };
Gfx gSkullTreasureChestChestFrontDL[128] = { 0 }; Gfx gHealthTreasureChestChestSideAndLidDL[116] = { 0 };
Gfx gHealthTreasureChestChestFrontDL[128] = { 0 };
Gfx gGoldTreasureChestChestFrontDL[128] = { 0 }; Gfx gGoldTreasureChestChestFrontDL[128] = { 0 };
Gfx gKeyTreasureChestChestFrontDL[128] = { 0 }; Gfx gKeyTreasureChestChestFrontDL[128] = { 0 };
Gfx gChristmasRedTreasureChestChestFrontDL[128] = { 0 }; Gfx gChristmasRedTreasureChestChestFrontDL[128] = { 0 };
Gfx gChristmasGreenTreasureChestChestFrontDL[128] = { 0 }; Gfx gChristmasGreenTreasureChestChestFrontDL[128] = { 0 };
Gfx gSkullTreasureChestChestFrontDL[128] = { 0 };
u8 hasCreatedRandoChestTextures = 0; u8 hasCreatedRandoChestTextures = 0;
u8 hasCustomChestDLs = 0; u8 hasCustomChestDLs = 0;
u8 hasChristmasChestTexturesAvailable = 0; u8 hasChristmasChestTexturesAvailable = 0;
@ -203,7 +205,7 @@ void EnBox_Init(Actor* thisx, PlayState* play2) {
} }
} }
EnBox_UpdateSizeAndTexture(this, play); EnBox_UpdateTexture(this, play);
// For SOH we spawn a chest actor instead of rendering the object from scratch for forest boss // For SOH we spawn a chest actor instead of rendering the object from scratch for forest boss
// key chest, and it's up on the wall so disable gravity for it. // key chest, and it's up on the wall so disable gravity for it.
if (play->sceneNum == SCENE_FOREST_TEMPLE && this->dyna.actor.params == 10222) { if (play->sceneNum == SCENE_FOREST_TEMPLE && this->dyna.actor.params == 10222) {
@ -542,7 +544,7 @@ void EnBox_SpawnIceSmoke(EnBox* this, PlayState* play) {
void EnBox_Update(Actor* thisx, PlayState* play) { void EnBox_Update(Actor* thisx, PlayState* play) {
EnBox* this = (EnBox*)thisx; EnBox* this = (EnBox*)thisx;
EnBox_UpdateSizeAndTexture(this, play); EnBox_UpdateTexture(this, play);
if (this->movementFlags & ENBOX_MOVE_STICK_TO_GROUND) { if (this->movementFlags & ENBOX_MOVE_STICK_TO_GROUND) {
this->movementFlags &= ~ENBOX_MOVE_STICK_TO_GROUND; this->movementFlags &= ~ENBOX_MOVE_STICK_TO_GROUND;
@ -573,13 +575,13 @@ void EnBox_Update(Actor* thisx, PlayState* play) {
} }
} }
void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) { void EnBox_UpdateTexture(EnBox* this, PlayState* play) {
EnBox_CreateExtraChestTextures(); EnBox_CreateExtraChestTextures();
int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), 0);
int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0);
GetItemCategory getItemCategory; GetItemCategory getItemCategory;
int isVanilla = csmc == CSMC_DISABLED || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)) || int isVanilla = csmc == 0 || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)) ||
(play->sceneNum == SCENE_TREASURE_BOX_SHOP && (play->sceneNum == SCENE_TREASURE_BOX_SHOP &&
this->dyna.actor.room != 6); // Exclude treasure game chests except for the final room this->dyna.actor.room != 6); // Exclude treasure game chests except for the final room
@ -607,20 +609,6 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) {
} }
// Change size // Change size
if (!isVanilla && (csmc == CSMC_BOTH || csmc == CSMC_SIZE)) {
switch (getItemCategory) {
case ITEM_CATEGORY_JUNK:
case ITEM_CATEGORY_SMALL_KEY:
case ITEM_CATEGORY_SKULLTULA_TOKEN:
Actor_SetScale(&this->dyna.actor, 0.005f);
Actor_SetFocus(&this->dyna.actor, 20.0f);
break;
default:
Actor_SetScale(&this->dyna.actor, 0.01f);
Actor_SetFocus(&this->dyna.actor, 40.0f);
break;
}
} else {
switch (this->type) { switch (this->type) {
case ENBOX_TYPE_SMALL: case ENBOX_TYPE_SMALL:
case ENBOX_TYPE_6: case ENBOX_TYPE_6:
@ -633,11 +621,9 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) {
Actor_SetScale(&this->dyna.actor, 0.01f); Actor_SetScale(&this->dyna.actor, 0.01f);
Actor_SetFocus(&this->dyna.actor, 40.0f); Actor_SetFocus(&this->dyna.actor, 40.0f);
} }
}
// Change texture // Change texture
if (!isVanilla && hasCreatedRandoChestTextures && !hasCustomChestDLs && if (!isVanilla && hasCreatedRandoChestTextures && !hasCustomChestDLs && csmc) {
(csmc == CSMC_BOTH || csmc == CSMC_TEXTURE)) {
switch (getItemCategory) { switch (getItemCategory) {
case ITEM_CATEGORY_MAJOR: case ITEM_CATEGORY_MAJOR:
this->boxBodyDL = gGoldTreasureChestChestFrontDL; this->boxBodyDL = gGoldTreasureChestChestFrontDL;
@ -655,6 +641,10 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) {
this->boxBodyDL = gTreasureChestBossKeyChestFrontDL; this->boxBodyDL = gTreasureChestBossKeyChestFrontDL;
this->boxLidDL = gTreasureChestBossKeyChestSideAndTopDL; this->boxLidDL = gTreasureChestBossKeyChestSideAndTopDL;
break; break;
case ITEM_CATEGORY_HEALTH:
this->boxBodyDL = gHealthTreasureChestChestFrontDL;
this->boxLidDL = gHealthTreasureChestChestSideAndLidDL;
break;
case ITEM_CATEGORY_LESSER: case ITEM_CATEGORY_LESSER:
case ITEM_CATEGORY_JUNK: case ITEM_CATEGORY_JUNK:
default: default:
@ -682,36 +672,6 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) {
this->boxLidDL = gChristmasGreenTreasureChestChestSideAndLidDL; this->boxLidDL = gChristmasGreenTreasureChestChestSideAndLidDL;
} }
} }
// Chest Sizes Match Contents can make certain chests unreachable, so nudge
// the ones that cause problems.
// https://github.com/gamestabled/OoT3D_Randomizer/blob/68cf3f190d319e554bdeebc7f16e67578430dbc3/code/src/actors/chest.c#L57
s16 params = this->dyna.actor.params;
s16 sceneNum = play->sceneNum;
s16 room = this->dyna.actor.room;
s16 isLarge = this->dyna.actor.scale.x == 0.01f;
// Make Ganon's Castle Zelda's Lullaby chest reachable when large.
if ((params & 0xF000) == 0x8000 && sceneNum == SCENE_INSIDE_GANONS_CASTLE && room == 9) {
this->dyna.actor.world.pos.z = isLarge ? -962.0f : -952.0f;
}
// Make MQ Deku Tree Song of Time chest reachable when large.
if (params == 0x5AA0 && sceneNum == SCENE_DEKU_TREE && room == 5) {
this->dyna.actor.world.pos.x = isLarge ? -1380.0f : -1376.0f;
}
// Make Ganon's Castle Gold Gauntlets chest reachable with hookshot from the
// switch platform when small.
if (params == 0x36C5 && sceneNum == SCENE_INSIDE_GANONS_CASTLE && room == 12) {
this->dyna.actor.world.pos.x = isLarge ? 1757.0f : 1777.0f;
this->dyna.actor.world.pos.z = isLarge ? -3595.0f : -3626.0f;
}
// Make Spirit Temple Compass Chest reachable with hookshot when small.
if (params == 0x3804 && sceneNum == SCENE_SPIRIT_TEMPLE && room == 14) {
this->dyna.actor.world.pos.x = isLarge ? 358.0f : 400.0f;
}
} }
void EnBox_CreateExtraChestTextures() { void EnBox_CreateExtraChestTextures() {
@ -740,6 +700,8 @@ void EnBox_CreateExtraChestTextures() {
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gChristmasRedTreasureChestSideAndTopTex), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gChristmasRedTreasureChestSideAndTopTex),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gChristmasGreenTreasureChestFrontTex), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gChristmasGreenTreasureChestFrontTex),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gChristmasGreenTreasureChestSideAndTopTex), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gChristmasGreenTreasureChestSideAndTopTex),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gHealthTreasureChestFrontTex),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gHealthTreasureChestSideAndTopTex),
}; };
Gfx gNoOp[] = { gsDPNoOp() }; Gfx gNoOp[] = { gsDPNoOp() };
@ -752,6 +714,7 @@ void EnBox_CreateExtraChestTextures() {
gKeyTreasureChestChestFrontDL[frontIndex] = *frontCmd; gKeyTreasureChestChestFrontDL[frontIndex] = *frontCmd;
gChristmasRedTreasureChestChestFrontDL[frontIndex] = *frontCmd; gChristmasRedTreasureChestChestFrontDL[frontIndex] = *frontCmd;
gChristmasGreenTreasureChestChestFrontDL[frontIndex] = *frontCmd; gChristmasGreenTreasureChestChestFrontDL[frontIndex] = *frontCmd;
gHealthTreasureChestChestFrontDL[frontIndex] = *frontCmd;
// Set the second instruction of img OTR hash opcode to noop, since we will replace it with the // Set the second instruction of img OTR hash opcode to noop, since we will replace it with the
// OTR filepath opcode below // OTR filepath opcode below
@ -764,6 +727,7 @@ void EnBox_CreateExtraChestTextures() {
gKeyTreasureChestChestFrontDL[frontIndex] = gNoOp[0]; gKeyTreasureChestChestFrontDL[frontIndex] = gNoOp[0];
gChristmasRedTreasureChestChestFrontDL[frontIndex] = gNoOp[0]; gChristmasRedTreasureChestChestFrontDL[frontIndex] = gNoOp[0];
gChristmasGreenTreasureChestChestFrontDL[frontIndex] = gNoOp[0]; gChristmasGreenTreasureChestChestFrontDL[frontIndex] = gNoOp[0];
gHealthTreasureChestChestFrontDL[frontIndex] = gNoOp[0];
} }
frontIndex++; frontIndex++;
@ -774,6 +738,7 @@ void EnBox_CreateExtraChestTextures() {
gKeyTreasureChestChestFrontDL[frontIndex] = *frontCmd; gKeyTreasureChestChestFrontDL[frontIndex] = *frontCmd;
gChristmasRedTreasureChestChestFrontDL[frontIndex] = *frontCmd; gChristmasRedTreasureChestChestFrontDL[frontIndex] = *frontCmd;
gChristmasGreenTreasureChestChestFrontDL[frontIndex] = *frontCmd; gChristmasGreenTreasureChestChestFrontDL[frontIndex] = *frontCmd;
gHealthTreasureChestChestFrontDL[frontIndex] = *frontCmd;
gSkullTreasureChestChestFrontDL[5] = gTreasureChestChestTextures[0]; gSkullTreasureChestChestFrontDL[5] = gTreasureChestChestTextures[0];
gSkullTreasureChestChestFrontDL[23] = gTreasureChestChestTextures[1]; gSkullTreasureChestChestFrontDL[23] = gTreasureChestChestTextures[1];
@ -795,6 +760,10 @@ void EnBox_CreateExtraChestTextures() {
gChristmasGreenTreasureChestChestFrontDL[23] = gTreasureChestChestTextures[9]; gChristmasGreenTreasureChestChestFrontDL[23] = gTreasureChestChestTextures[9];
gChristmasGreenTreasureChestChestFrontDL[37] = gTreasureChestChestTextures[8]; gChristmasGreenTreasureChestChestFrontDL[37] = gTreasureChestChestTextures[8];
gChristmasGreenTreasureChestChestFrontDL[50] = gTreasureChestChestTextures[9]; gChristmasGreenTreasureChestChestFrontDL[50] = gTreasureChestChestTextures[9];
gHealthTreasureChestChestFrontDL[5] = gTreasureChestChestTextures[10];
gHealthTreasureChestChestFrontDL[23] = gTreasureChestChestTextures[11];
gHealthTreasureChestChestFrontDL[37] = gTreasureChestChestTextures[10];
gHealthTreasureChestChestFrontDL[50] = gTreasureChestChestTextures[11];
Gfx* sideCmd = ResourceMgr_LoadGfxByName(gTreasureChestChestSideAndLidDL); Gfx* sideCmd = ResourceMgr_LoadGfxByName(gTreasureChestChestSideAndLidDL);
int sideIndex = 0; int sideIndex = 0;
@ -804,6 +773,7 @@ void EnBox_CreateExtraChestTextures() {
gKeyTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd; gKeyTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd;
gChristmasRedTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd; gChristmasRedTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd;
gChristmasGreenTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd; gChristmasGreenTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd;
gHealthTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd;
// Set the second instruction of img OTR hash opcode to noop, since we will replace it with the // Set the second instruction of img OTR hash opcode to noop, since we will replace it with the
// OTR filepath opcode below // OTR filepath opcode below
@ -816,6 +786,7 @@ void EnBox_CreateExtraChestTextures() {
gKeyTreasureChestChestSideAndLidDL[sideIndex] = gNoOp[0]; gKeyTreasureChestChestSideAndLidDL[sideIndex] = gNoOp[0];
gChristmasRedTreasureChestChestSideAndLidDL[sideIndex] = gNoOp[0]; gChristmasRedTreasureChestChestSideAndLidDL[sideIndex] = gNoOp[0];
gChristmasGreenTreasureChestChestSideAndLidDL[sideIndex] = gNoOp[0]; gChristmasGreenTreasureChestChestSideAndLidDL[sideIndex] = gNoOp[0];
gHealthTreasureChestChestSideAndLidDL[sideIndex] = gNoOp[0];
} }
sideIndex++; sideIndex++;
@ -826,6 +797,7 @@ void EnBox_CreateExtraChestTextures() {
gKeyTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd; gKeyTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd;
gChristmasRedTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd; gChristmasRedTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd;
gChristmasGreenTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd; gChristmasGreenTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd;
gHealthTreasureChestChestSideAndLidDL[sideIndex] = *sideCmd;
gSkullTreasureChestChestSideAndLidDL[5] = gTreasureChestChestTextures[0]; gSkullTreasureChestChestSideAndLidDL[5] = gTreasureChestChestTextures[0];
gSkullTreasureChestChestSideAndLidDL[29] = gTreasureChestChestTextures[1]; gSkullTreasureChestChestSideAndLidDL[29] = gTreasureChestChestTextures[1];
@ -842,6 +814,9 @@ void EnBox_CreateExtraChestTextures() {
gChristmasGreenTreasureChestChestSideAndLidDL[5] = gTreasureChestChestTextures[8]; gChristmasGreenTreasureChestChestSideAndLidDL[5] = gTreasureChestChestTextures[8];
gChristmasGreenTreasureChestChestSideAndLidDL[29] = gTreasureChestChestTextures[9]; gChristmasGreenTreasureChestChestSideAndLidDL[29] = gTreasureChestChestTextures[9];
gChristmasGreenTreasureChestChestSideAndLidDL[45] = gTreasureChestChestTextures[8]; gChristmasGreenTreasureChestChestSideAndLidDL[45] = gTreasureChestChestTextures[8];
gHealthTreasureChestChestSideAndLidDL[5] = gTreasureChestChestTextures[10];
gHealthTreasureChestChestSideAndLidDL[29] = gTreasureChestChestTextures[11];
gHealthTreasureChestChestSideAndLidDL[45] = gTreasureChestChestTextures[10];
ResourceMgr_ListFiles("objects/object_box/gChristmas*", &hasChristmasChestTexturesAvailable); ResourceMgr_ListFiles("objects/object_box/gChristmas*", &hasChristmasChestTexturesAvailable);
hasCreatedRandoChestTextures = 1; hasCreatedRandoChestTextures = 1;