Player Equip Docs (#3282)

* hopefully everything

* update docs for MS shuffle sections
This commit is contained in:
inspectredc 2023-10-30 15:56:36 +00:00 committed by GitHub
commit 5dd82f59e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 275 additions and 196 deletions

View file

@ -2,12 +2,74 @@
#define Z64ITEM_H #define Z64ITEM_H
typedef enum { typedef enum {
/* 0x00 */ EQUIP_SWORD, /* 0 */ EQUIP_TYPE_SWORD,
/* 0x01 */ EQUIP_SHIELD, /* 1 */ EQUIP_TYPE_SHIELD,
/* 0x02 */ EQUIP_TUNIC, /* 2 */ EQUIP_TYPE_TUNIC,
/* 0x03 */ EQUIP_BOOTS /* 3 */ EQUIP_TYPE_BOOTS,
/* 4 */ EQUIP_TYPE_MAX
} EquipmentType; } EquipmentType;
// `EquipInv*` enums are for Inventory.equipment (for example used in the `CHECK_OWNED_EQUIP` macro)
typedef enum {
/* 0 */ EQUIP_INV_SWORD_KOKIRI,
/* 1 */ EQUIP_INV_SWORD_MASTER,
/* 2 */ EQUIP_INV_SWORD_BIGGORON,
/* 3 */ EQUIP_INV_SWORD_BROKENGIANTKNIFE
} EquipInvSword;
typedef enum {
/* 0 */ EQUIP_INV_SHIELD_DEKU,
/* 1 */ EQUIP_INV_SHIELD_HYLIAN,
/* 2 */ EQUIP_INV_SHIELD_MIRROR
} EquipInvShield;
typedef enum {
/* 0 */ EQUIP_INV_TUNIC_KOKIRI,
/* 1 */ EQUIP_INV_TUNIC_GORON,
/* 2 */ EQUIP_INV_TUNIC_ZORA
} EquipInvTunic;
typedef enum {
/* 0 */ EQUIP_INV_BOOTS_KOKIRI,
/* 1 */ EQUIP_INV_BOOTS_IRON,
/* 2 */ EQUIP_INV_BOOTS_HOVER
} EquipInvBoots;
// `EquipValue*` enums are for ItemEquips.equipment (for example used in the `CUR_EQUIP_VALUE` macro)
typedef enum {
/* 0 */ EQUIP_VALUE_SWORD_NONE,
/* 1 */ EQUIP_VALUE_SWORD_KOKIRI,
/* 2 */ EQUIP_VALUE_SWORD_MASTER,
/* 3 */ EQUIP_VALUE_SWORD_BIGGORON,
/* 4 */ EQUIP_VALUE_SWORD_MAX
} EquipValueSword;
typedef enum {
/* 0 */ EQUIP_VALUE_SHIELD_NONE,
/* 1 */ EQUIP_VALUE_SHIELD_DEKU,
/* 2 */ EQUIP_VALUE_SHIELD_HYLIAN,
/* 3 */ EQUIP_VALUE_SHIELD_MIRROR,
/* 4 */ EQUIP_VALUE_SHIELD_MAX
} EquipValueShield;
typedef enum {
/* 0 */ EQUIP_VALUE_TUNIC_NONE,
/* 1 */ EQUIP_VALUE_TUNIC_KOKIRI,
/* 2 */ EQUIP_VALUE_TUNIC_GORON,
/* 3 */ EQUIP_VALUE_TUNIC_ZORA,
/* 4 */ EQUIP_VALUE_TUNIC_MAX
} EquipValueTunic;
typedef enum {
/* 0 */ EQUIP_VALUE_BOOTS_NONE,
/* 1 */ EQUIP_VALUE_BOOTS_KOKIRI,
/* 2 */ EQUIP_VALUE_BOOTS_IRON,
/* 3 */ EQUIP_VALUE_BOOTS_HOVER,
/* 4 */ EQUIP_VALUE_BOOTS_MAX
} EquipValueBoots;
typedef enum { typedef enum {
/* 0x00 */ UPG_QUIVER, /* 0x00 */ UPG_QUIVER,
/* 0x01 */ UPG_BOMB_BAG, /* 0x01 */ UPG_BOMB_BAG,

View file

@ -462,8 +462,8 @@ void BossRush_SetEquipment(uint8_t linkAge) {
brCButtonSlots = { SLOT_STICK, SLOT_NUT, SLOT_BOMB, SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE }; brCButtonSlots = { SLOT_STICK, SLOT_NUT, SLOT_BOMB, SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE };
Inventory_ChangeEquipment(EQUIP_SWORD, PLAYER_SWORD_KOKIRI); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI);
Inventory_ChangeEquipment(EQUIP_SHIELD, PLAYER_SHIELD_DEKU); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU);
// Set Adult equipment. // Set Adult equipment.
} else { } else {
brButtonItems = { ITEM_SWORD_MASTER, ITEM_BOW, ITEM_HAMMER, ITEM_BOMB, brButtonItems = { ITEM_SWORD_MASTER, ITEM_BOW, ITEM_HAMMER, ITEM_BOMB,
@ -471,9 +471,9 @@ void BossRush_SetEquipment(uint8_t linkAge) {
brCButtonSlots = { SLOT_BOW, SLOT_HAMMER, SLOT_BOMB, SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE }; brCButtonSlots = { SLOT_BOW, SLOT_HAMMER, SLOT_BOMB, SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE };
Inventory_ChangeEquipment(EQUIP_SWORD, PLAYER_SWORD_MASTER); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER);
Inventory_ChangeEquipment(EQUIP_SHIELD, PLAYER_SHIELD_MIRROR); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_MIRROR);
Inventory_ChangeEquipment(EQUIP_TUNIC, PLAYER_TUNIC_GORON + 1); // Game expects tunic + 1, don't ask me why. Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_GORON);
} }
// Button Items // Button Items

View file

@ -1102,9 +1102,9 @@ static bool SpeedModifierHandler(std::shared_ptr<LUS::Console> Console, const st
} }
const static std::map<std::string, uint16_t> boots { const static std::map<std::string, uint16_t> boots {
{ "kokiri", PLAYER_BOOTS_KOKIRI }, { "kokiri", EQUIP_VALUE_BOOTS_KOKIRI },
{ "iron", PLAYER_BOOTS_IRON }, { "iron", EQUIP_VALUE_BOOTS_IRON },
{ "hover", PLAYER_BOOTS_HOVER }, { "hover", EQUIP_VALUE_BOOTS_HOVER },
}; };
static bool BootsHandler(std::shared_ptr<LUS::Console> Console, const std::vector<std::string>& args, std::string* output) { static bool BootsHandler(std::shared_ptr<LUS::Console> Console, const std::vector<std::string>& args, std::string* output) {

View file

@ -1602,17 +1602,17 @@ void DrawPlayerTab() {
if (ImGui::Selectable("None")) { if (ImGui::Selectable("None")) {
player->currentSwordItemId = ITEM_NONE; player->currentSwordItemId = ITEM_NONE;
gSaveContext.equips.buttonItems[0] = ITEM_NONE; gSaveContext.equips.buttonItems[0] = ITEM_NONE;
Inventory_ChangeEquipment(EQUIP_SWORD, PLAYER_SWORD_NONE); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_NONE);
} }
if (ImGui::Selectable("Kokiri Sword")) { if (ImGui::Selectable("Kokiri Sword")) {
player->currentSwordItemId = ITEM_SWORD_KOKIRI; player->currentSwordItemId = ITEM_SWORD_KOKIRI;
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI;
Inventory_ChangeEquipment(EQUIP_SWORD, PLAYER_SWORD_KOKIRI); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI);
} }
if (ImGui::Selectable("Master Sword")) { if (ImGui::Selectable("Master Sword")) {
player->currentSwordItemId = ITEM_SWORD_MASTER; player->currentSwordItemId = ITEM_SWORD_MASTER;
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER;
Inventory_ChangeEquipment(EQUIP_SWORD, PLAYER_SWORD_MASTER); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER);
} }
if (ImGui::Selectable("Biggoron's Sword")) { if (ImGui::Selectable("Biggoron's Sword")) {
if (gSaveContext.bgsFlag) { if (gSaveContext.bgsFlag) {
@ -1629,12 +1629,12 @@ void DrawPlayerTab() {
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE;
} }
Inventory_ChangeEquipment(EQUIP_SWORD, PLAYER_SWORD_BIGGORON); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_BIGGORON);
} }
if (ImGui::Selectable("Fishing Pole")) { if (ImGui::Selectable("Fishing Pole")) {
player->currentSwordItemId = ITEM_FISHING_POLE; player->currentSwordItemId = ITEM_FISHING_POLE;
gSaveContext.equips.buttonItems[0] = ITEM_FISHING_POLE; gSaveContext.equips.buttonItems[0] = ITEM_FISHING_POLE;
Inventory_ChangeEquipment(EQUIP_SWORD, PLAYER_SWORD_MASTER); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER);
} }
ImGui::EndCombo(); ImGui::EndCombo();
@ -1642,19 +1642,19 @@ void DrawPlayerTab() {
if (ImGui::BeginCombo("Shield", curShield)) { if (ImGui::BeginCombo("Shield", curShield)) {
if (ImGui::Selectable("None")) { if (ImGui::Selectable("None")) {
player->currentShield = PLAYER_SHIELD_NONE; player->currentShield = PLAYER_SHIELD_NONE;
Inventory_ChangeEquipment(EQUIP_SHIELD, PLAYER_SHIELD_NONE); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_NONE);
} }
if (ImGui::Selectable("Deku Shield")) { if (ImGui::Selectable("Deku Shield")) {
player->currentShield = PLAYER_SHIELD_DEKU; player->currentShield = PLAYER_SHIELD_DEKU;
Inventory_ChangeEquipment(EQUIP_SHIELD, PLAYER_SHIELD_DEKU); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU);
} }
if (ImGui::Selectable("Hylian Shield")) { if (ImGui::Selectable("Hylian Shield")) {
player->currentShield = PLAYER_SHIELD_HYLIAN; player->currentShield = PLAYER_SHIELD_HYLIAN;
Inventory_ChangeEquipment(EQUIP_SHIELD, PLAYER_SHIELD_HYLIAN); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_HYLIAN);
} }
if (ImGui::Selectable("Mirror Shield")) { if (ImGui::Selectable("Mirror Shield")) {
player->currentShield = PLAYER_SHIELD_MIRROR; player->currentShield = PLAYER_SHIELD_MIRROR;
Inventory_ChangeEquipment(EQUIP_SHIELD, PLAYER_SHIELD_MIRROR); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_MIRROR);
} }
ImGui::EndCombo(); ImGui::EndCombo();
} }
@ -1662,15 +1662,15 @@ void DrawPlayerTab() {
if (ImGui::BeginCombo("Tunic", curTunic)) { if (ImGui::BeginCombo("Tunic", curTunic)) {
if (ImGui::Selectable("Kokiri Tunic")) { if (ImGui::Selectable("Kokiri Tunic")) {
player->currentTunic = PLAYER_TUNIC_KOKIRI; player->currentTunic = PLAYER_TUNIC_KOKIRI;
Inventory_ChangeEquipment(EQUIP_TUNIC, PLAYER_TUNIC_KOKIRI + 1); Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI);
} }
if (ImGui::Selectable("Goron Tunic")) { if (ImGui::Selectable("Goron Tunic")) {
player->currentTunic = PLAYER_TUNIC_GORON; player->currentTunic = PLAYER_TUNIC_GORON;
Inventory_ChangeEquipment(EQUIP_TUNIC, PLAYER_TUNIC_GORON + 1); Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_GORON);
} }
if (ImGui::Selectable("Zora Tunic")) { if (ImGui::Selectable("Zora Tunic")) {
player->currentTunic = PLAYER_TUNIC_ZORA; player->currentTunic = PLAYER_TUNIC_ZORA;
Inventory_ChangeEquipment(EQUIP_TUNIC, PLAYER_TUNIC_ZORA + 1); Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_ZORA);
} }
ImGui::EndCombo(); ImGui::EndCombo();
} }
@ -1678,15 +1678,15 @@ void DrawPlayerTab() {
if (ImGui::BeginCombo("Boots", curBoots)) { if (ImGui::BeginCombo("Boots", curBoots)) {
if (ImGui::Selectable("Kokiri Boots")) { if (ImGui::Selectable("Kokiri Boots")) {
player->currentBoots = PLAYER_BOOTS_KOKIRI; player->currentBoots = PLAYER_BOOTS_KOKIRI;
Inventory_ChangeEquipment(EQUIP_BOOTS, PLAYER_BOOTS_KOKIRI + 1); Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI);
} }
if (ImGui::Selectable("Iron Boots")) { if (ImGui::Selectable("Iron Boots")) {
player->currentBoots = PLAYER_BOOTS_IRON; player->currentBoots = PLAYER_BOOTS_IRON;
Inventory_ChangeEquipment(EQUIP_BOOTS, PLAYER_BOOTS_IRON + 1); Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_IRON);
} }
if (ImGui::Selectable("Hover Boots")) { if (ImGui::Selectable("Hover Boots")) {
player->currentBoots = PLAYER_BOOTS_HOVER; player->currentBoots = PLAYER_BOOTS_HOVER;
Inventory_ChangeEquipment(EQUIP_BOOTS, PLAYER_BOOTS_HOVER + 1); Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_HOVER);
} }
ImGui::EndCombo(); ImGui::EndCombo();
} }

View file

@ -373,7 +373,7 @@ namespace GameInteractionEffect {
GameInteractor::RawAction::ForceEquipBoots(parameters[0]); GameInteractor::RawAction::ForceEquipBoots(parameters[0]);
} }
void ForceEquipBoots::_Remove() { void ForceEquipBoots::_Remove() {
GameInteractor::RawAction::ForceEquipBoots(PLAYER_BOOTS_KOKIRI); GameInteractor::RawAction::ForceEquipBoots(EQUIP_VALUE_BOOTS_KOKIRI);
} }
// MARK: - ModifyRunSpeedModifier // MARK: - ModifyRunSpeedModifier
@ -425,9 +425,9 @@ namespace GameInteractionEffect {
GameInteractionEffectQueryResult GiveOrTakeShield::CanBeApplied() { GameInteractionEffectQueryResult GiveOrTakeShield::CanBeApplied() {
if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) { if (!GameInteractor::IsSaveLoaded() || GameInteractor::IsGameplayPaused()) {
return GameInteractionEffectQueryResult::TemporarilyNotPossible; return GameInteractionEffectQueryResult::TemporarilyNotPossible;
} else if ((parameters[0] > 0 && ((gBitFlags[parameters[0] - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_SHIELD]) & } else if ((parameters[0] > 0 && ((gBitFlags[parameters[0] - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]) &
gSaveContext.inventory.equipment)) || gSaveContext.inventory.equipment)) ||
(parameters[0] < 0 && !((gBitFlags[(parameters[0] * -1) - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_SHIELD]) & (parameters[0] < 0 && !((gBitFlags[(parameters[0] * -1) - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]) &
gSaveContext.inventory.equipment))) { gSaveContext.inventory.equipment))) {
return GameInteractionEffectQueryResult::NotPossible; return GameInteractionEffectQueryResult::NotPossible;
} else { } else {

View file

@ -97,8 +97,8 @@ void GameInteractor::RawAction::SetWeatherStorm(bool active) {
void GameInteractor::RawAction::ForceEquipBoots(int8_t boots) { void GameInteractor::RawAction::ForceEquipBoots(int8_t boots) {
Player* player = GET_PLAYER(gPlayState); Player* player = GET_PLAYER(gPlayState);
player->currentBoots = boots; player->currentBoots = BOOTS_EQUIP_TO_PLAYER(boots);
Inventory_ChangeEquipment(EQUIP_BOOTS, boots + 1); Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, boots);
Player_SetBootData(gPlayState, player); Player_SetBootData(gPlayState, player);
} }
@ -274,24 +274,24 @@ void GameInteractor::RawAction::GiveOrTakeShield(int32_t shield) {
break; break;
} }
gSaveContext.inventory.equipment &= ~(gBitFlags[shield - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_SHIELD]); gSaveContext.inventory.equipment &= ~(gBitFlags[shield - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_TYPE_SHIELD]);
if (player->currentShield == shieldToCheck) { if (player->currentShield == shieldToCheck) {
player->currentShield = PLAYER_SHIELD_NONE; player->currentShield = PLAYER_SHIELD_NONE;
Inventory_ChangeEquipment(EQUIP_SHIELD, PLAYER_SHIELD_NONE); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_NONE);
} }
} else { } else {
Item_Give(gPlayState, shield); Item_Give(gPlayState, shield);
if (player->currentShield == PLAYER_SHIELD_NONE) { if (player->currentShield == PLAYER_SHIELD_NONE) {
if (LINK_IS_CHILD && shield == ITEM_SHIELD_DEKU) { if (LINK_IS_CHILD && shield == ITEM_SHIELD_DEKU) {
player->currentShield = PLAYER_SHIELD_DEKU; player->currentShield = PLAYER_SHIELD_DEKU;
Inventory_ChangeEquipment(EQUIP_SHIELD, PLAYER_SHIELD_DEKU); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU);
} else if (LINK_IS_ADULT && shield == ITEM_SHIELD_MIRROR) { } else if (LINK_IS_ADULT && shield == ITEM_SHIELD_MIRROR) {
player->currentShield = PLAYER_SHIELD_MIRROR; player->currentShield = PLAYER_SHIELD_MIRROR;
Inventory_ChangeEquipment(EQUIP_SHIELD, PLAYER_SHIELD_MIRROR); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_MIRROR);
} else if (shield == ITEM_SHIELD_HYLIAN) { } else if (shield == ITEM_SHIELD_HYLIAN) {
player->currentShield = PLAYER_SHIELD_HYLIAN; player->currentShield = PLAYER_SHIELD_HYLIAN;
Inventory_ChangeEquipment(EQUIP_SHIELD, PLAYER_SHIELD_HYLIAN); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_HYLIAN);
} }
} }
} }

View file

@ -236,7 +236,7 @@ void RegisterOcarinaTimeTravel() {
Actor* nearbyOcarinaSpot = Actor_FindNearby(gPlayState, player, ACTOR_EN_OKARINA_TAG, ACTORCAT_PROP, 120.0f); Actor* nearbyOcarinaSpot = Actor_FindNearby(gPlayState, player, ACTOR_EN_OKARINA_TAG, ACTORCAT_PROP, 120.0f);
Actor* nearbyDoorOfTime = Actor_FindNearby(gPlayState, player, ACTOR_DOOR_TOKI, ACTORCAT_BG, 500.0f); Actor* nearbyDoorOfTime = Actor_FindNearby(gPlayState, player, ACTOR_DOOR_TOKI, ACTORCAT_BG, 500.0f);
Actor* nearbyFrogs = Actor_FindNearby(gPlayState, player, ACTOR_EN_FR, ACTORCAT_NPC, 300.0f); Actor* nearbyFrogs = Actor_FindNearby(gPlayState, player, ACTOR_EN_FR, ACTORCAT_NPC, 300.0f);
uint8_t hasMasterSword = (gBitFlags[ITEM_SWORD_MASTER - ITEM_SWORD_KOKIRI] << gEquipShifts[EQUIP_SWORD]) & gSaveContext.inventory.equipment; uint8_t hasMasterSword = CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER);
uint8_t hasOcarinaOfTime = (INV_CONTENT(ITEM_OCARINA_TIME) == ITEM_OCARINA_TIME); uint8_t hasOcarinaOfTime = (INV_CONTENT(ITEM_OCARINA_TIME) == ITEM_OCARINA_TIME);
// If TimeTravel + Player have the Ocarina of Time + Have Master Sword + is in proper range // If TimeTravel + Player have the Ocarina of Time + Have Master Sword + is in proper range
// TODO: Once Swordless Adult is fixed: Remove the Master Sword check // TODO: Once Swordless Adult is fixed: Remove the Master Sword check

View file

@ -1637,29 +1637,29 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe
// Equipment // Equipment
case RG_KOKIRI_SWORD: case RG_KOKIRI_SWORD:
return !CHECK_OWNED_EQUIP(EQUIP_SWORD, 0) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_KOKIRI) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_MASTER_SWORD: case RG_MASTER_SWORD:
return !CHECK_OWNED_EQUIP(EQUIP_SWORD, 1) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_BIGGORON_SWORD: case RG_BIGGORON_SWORD:
return !gSaveContext.bgsFlag ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !gSaveContext.bgsFlag ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_DEKU_SHIELD: case RG_DEKU_SHIELD:
case RG_BUY_DEKU_SHIELD: case RG_BUY_DEKU_SHIELD:
return !CHECK_OWNED_EQUIP(EQUIP_SHIELD, 0) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_DEKU) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_HYLIAN_SHIELD: case RG_HYLIAN_SHIELD:
case RG_BUY_HYLIAN_SHIELD: case RG_BUY_HYLIAN_SHIELD:
return !CHECK_OWNED_EQUIP(EQUIP_SHIELD, 1) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_HYLIAN) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_MIRROR_SHIELD: case RG_MIRROR_SHIELD:
return !CHECK_OWNED_EQUIP(EQUIP_SHIELD, 2) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_MIRROR) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_GORON_TUNIC: case RG_GORON_TUNIC:
case RG_BUY_GORON_TUNIC: case RG_BUY_GORON_TUNIC:
return !CHECK_OWNED_EQUIP(EQUIP_TUNIC, 1) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_ZORA_TUNIC: case RG_ZORA_TUNIC:
case RG_BUY_ZORA_TUNIC: case RG_BUY_ZORA_TUNIC:
return !CHECK_OWNED_EQUIP(EQUIP_TUNIC, 2) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_ZORA) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_IRON_BOOTS: case RG_IRON_BOOTS:
return !CHECK_OWNED_EQUIP(EQUIP_BOOTS, 1) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_HOVER_BOOTS: case RG_HOVER_BOOTS:
return !CHECK_OWNED_EQUIP(EQUIP_BOOTS, 2) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE; return !CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_HOVER) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
// Inventory Items // Inventory Items
case RG_PROGRESSIVE_STICK_UPGRADE: case RG_PROGRESSIVE_STICK_UPGRADE:
@ -5311,7 +5311,7 @@ CustomMessage Randomizer::GetSheikMessage(s16 scene, u16 originalTextId) {
//If MS shuffle is on, Sheik will hint both MS and LA as long as Link doesn't have both, to prevent hint lockout. //If MS shuffle is on, Sheik will hint both MS and LA as long as Link doesn't have both, to prevent hint lockout.
//Otherwise, she'll only give LA hint so only LA is required to move on. //Otherwise, she'll only give LA hint so only LA is required to move on.
bool needRequirements = GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) ? bool needRequirements = GetRandoSettingValue(RSK_SHUFFLE_MASTER_SWORD) ?
(!CHECK_OWNED_EQUIP(EQUIP_SWORD, 1) || INV_CONTENT(ITEM_ARROW_LIGHT) != ITEM_ARROW_LIGHT) : (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) || INV_CONTENT(ITEM_ARROW_LIGHT) != ITEM_ARROW_LIGHT) :
(INV_CONTENT(ITEM_ARROW_LIGHT) != ITEM_ARROW_LIGHT); (INV_CONTENT(ITEM_ARROW_LIGHT) != ITEM_ARROW_LIGHT);
if (needRequirements) { if (needRequirements) {
messageEntry.Replace("{{message}}", gSaveContext.sheikText, gSaveContext.sheikText, gSaveContext.sheikText); messageEntry.Replace("{{message}}", gSaveContext.sheikText, gSaveContext.sheikText, gSaveContext.sheikText);

View file

@ -1728,18 +1728,18 @@ Color_RGB8 GetColorForControllerLED() {
LEDColorSource source = static_cast<LEDColorSource>(CVarGetInteger("gLedColorSource", LED_SOURCE_TUNIC_ORIGINAL)); LEDColorSource source = static_cast<LEDColorSource>(CVarGetInteger("gLedColorSource", LED_SOURCE_TUNIC_ORIGINAL));
bool criticalOverride = CVarGetInteger("gLedCriticalOverride", 1); bool criticalOverride = CVarGetInteger("gLedCriticalOverride", 1);
if (gPlayState && (source == LED_SOURCE_TUNIC_ORIGINAL || source == LED_SOURCE_TUNIC_COSMETICS)) { if (gPlayState && (source == LED_SOURCE_TUNIC_ORIGINAL || source == LED_SOURCE_TUNIC_COSMETICS)) {
switch (CUR_EQUIP_VALUE(EQUIP_TUNIC) - 1) { switch (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC)) {
case PLAYER_TUNIC_KOKIRI: case EQUIP_VALUE_TUNIC_KOKIRI:
color = source == LED_SOURCE_TUNIC_COSMETICS color = source == LED_SOURCE_TUNIC_COSMETICS
? CVarGetColor24("gCosmetics.Link_KokiriTunic.Value", kokiriColor) ? CVarGetColor24("gCosmetics.Link_KokiriTunic.Value", kokiriColor)
: kokiriColor; : kokiriColor;
break; break;
case PLAYER_TUNIC_GORON: case EQUIP_VALUE_TUNIC_GORON:
color = source == LED_SOURCE_TUNIC_COSMETICS color = source == LED_SOURCE_TUNIC_COSMETICS
? CVarGetColor24("gCosmetics.Link_GoronTunic.Value", goronColor) ? CVarGetColor24("gCosmetics.Link_GoronTunic.Value", goronColor)
: goronColor; : goronColor;
break; break;
case PLAYER_TUNIC_ZORA: case EQUIP_VALUE_TUNIC_ZORA:
color = source == LED_SOURCE_TUNIC_COSMETICS color = source == LED_SOURCE_TUNIC_COSMETICS
? CVarGetColor24("gCosmetics.Link_ZoraTunic.Value", zoraColor) ? CVarGetColor24("gCosmetics.Link_ZoraTunic.Value", zoraColor)
: zoraColor; : zoraColor;
@ -2117,7 +2117,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT) ? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT)
: CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_CHILD); : CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_CHILD);
} else if (textId == TEXT_GANONDORF) { } else if (textId == TEXT_GANONDORF) {
if ((INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT && CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) || if ((INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT && CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) ||
!Randomizer_GetSettingValue(RSK_LIGHT_ARROWS_HINT)) { !Randomizer_GetSettingValue(RSK_LIGHT_ARROWS_HINT)) {
messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_GANONDORF_NOHINT); messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_GANONDORF_NOHINT);
} else { } else {

View file

@ -716,11 +716,11 @@ void SaveManager::InitFileDebug() {
if (LINK_AGE_IN_YEARS == YEARS_CHILD) { if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI;
Inventory_ChangeEquipment(EQUIP_SWORD, 1); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI);
if (gSaveContext.fileNum == 0xFF) { if (gSaveContext.fileNum == 0xFF) {
gSaveContext.equips.buttonItems[1] = ITEM_SLINGSHOT; gSaveContext.equips.buttonItems[1] = ITEM_SLINGSHOT;
gSaveContext.equips.cButtonSlots[0] = SLOT_SLINGSHOT; gSaveContext.equips.cButtonSlots[0] = SLOT_SLINGSHOT;
Inventory_ChangeEquipment(EQUIP_SHIELD, 1); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU);
} }
} }
@ -859,11 +859,11 @@ void SaveManager::InitFileMaxed() {
if (LINK_AGE_IN_YEARS == YEARS_CHILD) { if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI;
Inventory_ChangeEquipment(EQUIP_SWORD, 1); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_KOKIRI);
if (gSaveContext.fileNum == 0xFF) { if (gSaveContext.fileNum == 0xFF) {
gSaveContext.equips.buttonItems[1] = ITEM_SLINGSHOT; gSaveContext.equips.buttonItems[1] = ITEM_SLINGSHOT;
gSaveContext.equips.cButtonSlots[0] = SLOT_SLINGSHOT; gSaveContext.equips.cButtonSlots[0] = SLOT_SLINGSHOT;
Inventory_ChangeEquipment(EQUIP_SHIELD, 1); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_DEKU);
} }
} }

View file

@ -191,22 +191,22 @@ void Inventory_ChangeEquipment(s16 equipment, u16 value) {
u8 Inventory_DeleteEquipment(PlayState* play, s16 equipment) { u8 Inventory_DeleteEquipment(PlayState* play, s16 equipment) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
s32 pad; s32 pad;
u16 sp26 = gSaveContext.equips.equipment & gEquipMasks[equipment]; u16 equipValue = gSaveContext.equips.equipment & gEquipMasks[equipment];
// "Erasing equipment item = %d zzz=%d" // "Erasing equipment item = %d zzz=%d"
osSyncPrintf("装備アイテム抹消 = %d zzz=%d\n", equipment, sp26); osSyncPrintf("装備アイテム抹消 = %d zzz=%d\n", equipment, equipValue);
if (sp26) { if (equipValue) {
sp26 >>= gEquipShifts[equipment]; equipValue >>= gEquipShifts[equipment];
gSaveContext.equips.equipment &= gEquipNegMasks[equipment]; gSaveContext.equips.equipment &= gEquipNegMasks[equipment];
gSaveContext.inventory.equipment ^= gBitFlags[sp26 - 1] << gEquipShifts[equipment]; gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG(equipment, equipValue - 1);
if (equipment == EQUIP_TUNIC) { if (equipment == EQUIP_TYPE_TUNIC) {
gSaveContext.equips.equipment |= 0x0100; gSaveContext.equips.equipment |= EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4);
} }
if (equipment == EQUIP_SWORD) { if (equipment == EQUIP_TYPE_SWORD) {
gSaveContext.equips.buttonItems[0] = ITEM_NONE; gSaveContext.equips.buttonItems[0] = ITEM_NONE;
gSaveContext.infTable[29] = 1; gSaveContext.infTable[29] = 1;
} }
@ -215,7 +215,7 @@ u8 Inventory_DeleteEquipment(PlayState* play, s16 equipment) {
play->pauseCtx.cursorSpecialPos = PAUSE_CURSOR_PAGE_LEFT; play->pauseCtx.cursorSpecialPos = PAUSE_CURSOR_PAGE_LEFT;
} }
return sp26; return equipValue;
} }
void Inventory_ChangeUpgrade(s16 upgrade, s16 value) { void Inventory_ChangeUpgrade(s16 upgrade, s16 value) {

View file

@ -994,9 +994,9 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
gSaveContext.nextTransitionType = 2; gSaveContext.nextTransitionType = 2;
break; break;
case 71: case 71:
gSaveContext.equips.equipment |= 0x0100; gSaveContext.equips.equipment |= EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4);
Player_SetEquipmentData(play, player); Player_SetEquipmentData(play, player);
gSaveContext.equips.equipment |= 0x1000; gSaveContext.equips.equipment |= EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4);
Player_SetEquipmentData(play, player); Player_SetEquipmentData(play, player);
play->linkAgeOnLoad = 1; play->linkAgeOnLoad = 1;
play->nextEntranceIndex = 0x0053; play->nextEntranceIndex = 0x0053;

View file

@ -46,8 +46,8 @@ u32 ElfMessage_CheckCondition(ElfMessage* msg) {
return ((msg->byte0 & 1) == 1) == ((msg->byte1 & 0x0F) == CUR_UPG_VALUE(UPG_STRENGTH)); return ((msg->byte0 & 1) == 1) == ((msg->byte1 & 0x0F) == CUR_UPG_VALUE(UPG_STRENGTH));
case (ELF_MSG_CONDITION_BOOTS << 4): case (ELF_MSG_CONDITION_BOOTS << 4):
return ((msg->byte0 & 1) == 1) == return ((msg->byte0 & 1) == 1) ==
(((gBitFlags[msg->byte3 - ITEM_BOOTS_KOKIRI] << gEquipShifts[EQUIP_BOOTS]) & (CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS,
gSaveContext.inventory.equipment) != 0); msg->byte3 - ITEM_BOOTS_KOKIRI + EQUIP_INV_BOOTS_KOKIRI) != 0);
case (ELF_MSG_CONDITION_SONG << 4): case (ELF_MSG_CONDITION_SONG << 4):
return ((msg->byte0 & 1) == 1) == return ((msg->byte0 & 1) == 1) ==
(CHECK_QUEST_ITEM(msg->byte3 - ITEM_SONG_MINUET + QUEST_SONG_MINUET) != 0); (CHECK_QUEST_ITEM(msg->byte3 - ITEM_SONG_MINUET + QUEST_SONG_MINUET) != 0);

View file

@ -1617,7 +1617,7 @@ void Message_OpenText(PlayState* play, u16 textId) {
// Increments text id based on piece of heart count, assumes the piece of heart text is all // Increments text id based on piece of heart count, assumes the piece of heart text is all
// in order and that you don't have more than the intended amount of heart pieces. // in order and that you don't have more than the intended amount of heart pieces.
textId += (gSaveContext.inventory.questItems & 0xF0000000 & 0xF0000000) >> 0x1C; textId += (gSaveContext.inventory.questItems & 0xF0000000 & 0xF0000000) >> 0x1C;
} else if (!IS_RANDO && (msgCtx->textId == 0xC && CHECK_OWNED_EQUIP(EQUIP_SWORD, 2))) { } else if (!IS_RANDO && (msgCtx->textId == 0xC && CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON))) {
textId = 0xB; // Traded Giant's Knife for Biggoron Sword textId = 0xB; // Traded Giant's Knife for Biggoron Sword
} else if (!IS_RANDO && (msgCtx->textId == 0xB4 && (Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_CURSED_MAN_IN_SKULL_HOUSE)))) { } else if (!IS_RANDO && (msgCtx->textId == 0xB4 && (Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_CURSED_MAN_IN_SKULL_HOUSE)))) {
textId = 0xB5; // Destroyed Gold Skulltula textId = 0xB5; // Destroyed Gold Skulltula

View file

@ -1438,7 +1438,7 @@ Gfx* Gfx_TextureI8(Gfx* displayListHead, void* texture, s16 textureWidth, s16 te
void Inventory_SwapAgeEquipment(void) { void Inventory_SwapAgeEquipment(void) {
s16 i; s16 i;
u16 temp; u16 shieldEquipValue;
if (LINK_AGE_IN_YEARS == YEARS_CHILD) { if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
@ -1483,8 +1483,15 @@ void Inventory_SwapAgeEquipment(void) {
gSaveContext.equips.cButtonSlots[1] = SLOT_BOMB; gSaveContext.equips.cButtonSlots[1] = SLOT_BOMB;
gSaveContext.equips.cButtonSlots[2] = SLOT_OCARINA; gSaveContext.equips.cButtonSlots[2] = SLOT_OCARINA;
gSaveContext.equips.equipment = (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && gSaveContext.equips.equipment = (EQUIP_VALUE_SWORD_MASTER << (EQUIP_TYPE_SWORD * 4)) |
gSaveContext.equips.buttonItems[0] == ITEM_NONE) ? 0x1120 :0x1122; (EQUIP_VALUE_SHIELD_HYLIAN << (EQUIP_TYPE_SHIELD * 4)) |
(EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) |
(EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4));
if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) &&
gSaveContext.equips.buttonItems[0] == ITEM_NONE) {
gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4));
}
// Set the dpad to nothing // Set the dpad to nothing
gSaveContext.equips.buttonItems[4] = ITEM_NONE; gSaveContext.equips.buttonItems[4] = ITEM_NONE;
@ -1518,13 +1525,13 @@ void Inventory_SwapAgeEquipment(void) {
} else { } else {
// When becoming child, set swordless flag if player doesn't have kokiri sword // When becoming child, set swordless flag if player doesn't have kokiri sword
// Only in rando to keep swordless link bugs in vanilla // Only in rando to keep swordless link bugs in vanilla
if (IS_RANDO && (1 << 0 & gSaveContext.inventory.equipment) == 0) { if (IS_RANDO && (EQUIP_INV_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4) & gSaveContext.inventory.equipment) == 0) {
Flags_SetInfTable(INFTABLE_SWORDLESS); Flags_SetInfTable(INFTABLE_SWORDLESS);
} }
// When using enhancements, set swordless flag if player doesn't have kokiri sword or hasn't equipped a sword yet. // When using enhancements, set swordless flag if player doesn't have kokiri sword or hasn't equipped a sword yet.
// Then set the child equips button items to item none to ensure kokiri sword is not equipped // Then set the child equips button items to item none to ensure kokiri sword is not equipped
if ((CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) && ((1 << 0 & gSaveContext.inventory.equipment) == 0 || Flags_GetInfTable(INFTABLE_SWORDLESS))) { if ((CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) && ((EQUIP_INV_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4) & gSaveContext.inventory.equipment) == 0 || Flags_GetInfTable(INFTABLE_SWORDLESS))) {
Flags_SetInfTable(INFTABLE_SWORDLESS); Flags_SetInfTable(INFTABLE_SWORDLESS);
gSaveContext.childEquips.buttonItems[0] = ITEM_NONE; gSaveContext.childEquips.buttonItems[0] = ITEM_NONE;
} }
@ -1558,10 +1565,10 @@ void Inventory_SwapAgeEquipment(void) {
} }
gSaveContext.equips.equipment = gSaveContext.childEquips.equipment; gSaveContext.equips.equipment = gSaveContext.childEquips.equipment;
gSaveContext.equips.equipment &= 0xFFF0; gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4));
// Equips kokiri sword in the inventory screen only if kokiri sword exists in inventory and a sword has been equipped already // Equips kokiri sword in the inventory screen only if kokiri sword exists in inventory and a sword has been equipped already
if (!((1 << 0 & gSaveContext.inventory.equipment) == 0) && !Flags_GetInfTable(INFTABLE_SWORDLESS)) { if (!((EQUIP_INV_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4) & gSaveContext.inventory.equipment) == 0) && !Flags_GetInfTable(INFTABLE_SWORDLESS)) {
gSaveContext.equips.equipment |= 0x0001; gSaveContext.equips.equipment |= EQUIP_VALUE_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4);
} }
} else if (gSaveContext.childEquips.buttonItems[0] != ITEM_NONE) { } else if (gSaveContext.childEquips.buttonItems[0] != ITEM_NONE) {
for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) {
@ -1582,15 +1589,15 @@ void Inventory_SwapAgeEquipment(void) {
} }
gSaveContext.equips.equipment = gSaveContext.childEquips.equipment; gSaveContext.equips.equipment = gSaveContext.childEquips.equipment;
gSaveContext.equips.equipment &= 0xFFF0; gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4));
gSaveContext.equips.equipment |= 0x0001; gSaveContext.equips.equipment |= EQUIP_VALUE_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4);
} else if (IS_RANDO && Randomizer_GetSettingValue(RSK_STARTING_AGE) == RO_AGE_ADULT) { } else if (IS_RANDO && Randomizer_GetSettingValue(RSK_STARTING_AGE) == RO_AGE_ADULT) {
/*If in rando and starting age is adult, childEquips is not initialized and buttonItems[0] /*If in rando and starting age is adult, childEquips is not initialized and buttonItems[0]
will be ITEM_NONE. When changing age from adult -> child, reset equips to "default" will be ITEM_NONE. When changing age from adult -> child, reset equips to "default"
(only kokiri tunic/boots equipped, no sword, no C-button items, no D-Pad items). (only kokiri tunic/boots equipped, no sword, no C-button items, no D-Pad items).
When becoming child, set swordless flag if player doesn't have kokiri sword When becoming child, set swordless flag if player doesn't have kokiri sword
Only in rando to keep swordless link bugs in vanilla*/ Only in rando to keep swordless link bugs in vanilla*/
if (1 << 0 & gSaveContext.inventory.equipment == 0) { if (EQUIP_INV_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4) & gSaveContext.inventory.equipment == 0) {
Flags_SetInfTable(INFTABLE_SWORDLESS); Flags_SetInfTable(INFTABLE_SWORDLESS);
} }
@ -1601,7 +1608,10 @@ void Inventory_SwapAgeEquipment(void) {
gSaveContext.equips.cButtonSlots[i-1] = ITEM_NONE; gSaveContext.equips.cButtonSlots[i-1] = ITEM_NONE;
} }
} }
gSaveContext.equips.equipment = 0x1111; gSaveContext.equips.equipment = (EQUIP_VALUE_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4)) |
(EQUIP_VALUE_SHIELD_DEKU << (EQUIP_TYPE_SHIELD * 4)) |
(EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) |
(EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4));
} }
if ((CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) && if ((CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) &&
@ -1609,17 +1619,18 @@ void Inventory_SwapAgeEquipment(void) {
Flags_SetInfTable(INFTABLE_SWORDLESS); Flags_SetInfTable(INFTABLE_SWORDLESS);
if (gSaveContext.childEquips.equipment == 0) { if (gSaveContext.childEquips.equipment == 0) {
// force equip kokiri tunic and boots in scenario gSaveContext.childEquips.equipment is uninitialized // force equip kokiri tunic and boots in scenario gSaveContext.childEquips.equipment is uninitialized
gSaveContext.equips.equipment &= 0xFFF0; gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4));
gSaveContext.equips.equipment |= 0x1100; gSaveContext.equips.equipment |= (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) |
(EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4));
} }
} }
} }
CVarSetInteger("gSwitchTimeline", 0); CVarSetInteger("gSwitchTimeline", 0);
temp = gEquipMasks[EQUIP_SHIELD] & gSaveContext.equips.equipment; shieldEquipValue = gEquipMasks[EQUIP_TYPE_SHIELD] & gSaveContext.equips.equipment;
if (temp != 0) { if (shieldEquipValue != 0) {
temp >>= gEquipShifts[EQUIP_SHIELD]; shieldEquipValue >>= gEquipShifts[EQUIP_TYPE_SHIELD];
if (!(gBitFlags[temp + 3] & gSaveContext.inventory.equipment)) { if (!CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, shieldEquipValue - 1)) {
gSaveContext.equips.equipment &= gEquipNegMasks[EQUIP_SHIELD]; gSaveContext.equips.equipment &= gEquipNegMasks[EQUIP_TYPE_SHIELD];
} }
} }
} }
@ -1634,10 +1645,10 @@ void Interface_InitHorsebackArchery(PlayState* play) {
} }
void func_800849EC(PlayState* play) { void func_800849EC(PlayState* play) {
gSaveContext.inventory.equipment |= gBitFlags[2] << gEquipShifts[EQUIP_SWORD]; gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON);
gSaveContext.inventory.equipment ^= 8 << gEquipShifts[EQUIP_SWORD]; gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE);
if (gBitFlags[3] & gSaveContext.inventory.equipment) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)) {
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE;
} else { } else {
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS;
@ -1882,17 +1893,21 @@ u8 Item_Give(PlayState* play, u8 item) {
return Return_Item(item, MOD_NONE, ITEM_NONE); return Return_Item(item, MOD_NONE, ITEM_NONE);
} else if ((item >= ITEM_SWORD_KOKIRI) && (item <= ITEM_SWORD_BGS)) { } else if ((item >= ITEM_SWORD_KOKIRI) && (item <= ITEM_SWORD_BGS)) {
gSaveContext.inventory.equipment |= gBitFlags[item - ITEM_SWORD_KOKIRI] << gEquipShifts[EQUIP_SWORD]; gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_SWORD, item - ITEM_SWORD_KOKIRI + EQUIP_INV_SWORD_KOKIRI);
// Both Giant's Knife and Biggoron Sword have the same Item ID, so this part handles both of them // Both Giant's Knife and Biggoron Sword have the same Item ID, so this part handles both of them
if (item == ITEM_SWORD_BGS) { if (item == ITEM_SWORD_BGS) {
gSaveContext.swordHealth = 8; gSaveContext.swordHealth = 8;
// In rando, when buying Giant's Knife, also check // In rando, when buying Giant's Knife, also check
// for 0xE in case we don't have Kokiri Sword // without the Koriri Sword in case we don't have it
if (ALL_EQUIP_VALUE(EQUIP_SWORD) == 0xF || (IS_RANDO && ALL_EQUIP_VALUE(EQUIP_SWORD) == 0xE)) { if (ALL_EQUIP_VALUE(EQUIP_TYPE_SWORD) ==
((1 << EQUIP_INV_SWORD_KOKIRI) | (1 << EQUIP_INV_SWORD_MASTER) | (1 << EQUIP_INV_SWORD_BIGGORON) |
(1 << EQUIP_INV_SWORD_BROKENGIANTKNIFE)) ||
(IS_RANDO && ALL_EQUIP_VALUE(EQUIP_TYPE_SWORD) ==
((1 << EQUIP_INV_SWORD_MASTER) | (1 << EQUIP_INV_SWORD_BIGGORON) | (1 << EQUIP_INV_SWORD_BROKENGIANTKNIFE)))) {
gSaveContext.inventory.equipment ^= 8 << gEquipShifts[EQUIP_SWORD]; gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE);
if (gSaveContext.equips.buttonItems[0] == ITEM_SWORD_KNIFE) { if (gSaveContext.equips.buttonItems[0] == ITEM_SWORD_KNIFE) {
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS;
@ -1904,8 +1919,8 @@ u8 Item_Give(PlayState* play, u8 item) {
} else if (item == ITEM_SWORD_MASTER) { } else if (item == ITEM_SWORD_MASTER) {
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER;
gSaveContext.equips.equipment &= 0xFFF0; gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4));
gSaveContext.equips.equipment |= 0x0002; gSaveContext.equips.equipment |= EQUIP_VALUE_SWORD_MASTER << (EQUIP_TYPE_SWORD * 4);
if (play != NULL) { if (play != NULL) {
Interface_LoadItemIcon1(play, 0); Interface_LoadItemIcon1(play, 0);
} }
@ -1913,13 +1928,13 @@ u8 Item_Give(PlayState* play, u8 item) {
return Return_Item(item, MOD_NONE, ITEM_NONE); return Return_Item(item, MOD_NONE, ITEM_NONE);
} else if ((item >= ITEM_SHIELD_DEKU) && (item <= ITEM_SHIELD_MIRROR)) { } else if ((item >= ITEM_SHIELD_DEKU) && (item <= ITEM_SHIELD_MIRROR)) {
gSaveContext.inventory.equipment |= (gBitFlags[item - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_SHIELD]); gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_SHIELD, item - ITEM_SHIELD_DEKU);
return Return_Item(item, MOD_NONE, ITEM_NONE); return Return_Item(item, MOD_NONE, ITEM_NONE);
} else if ((item >= ITEM_TUNIC_KOKIRI) && (item <= ITEM_TUNIC_ZORA)) { } else if ((item >= ITEM_TUNIC_KOKIRI) && (item <= ITEM_TUNIC_ZORA)) {
gSaveContext.inventory.equipment |= (gBitFlags[item - ITEM_TUNIC_KOKIRI] << gEquipShifts[EQUIP_TUNIC]); gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_TUNIC, item - ITEM_TUNIC_KOKIRI);
return Return_Item(item, MOD_NONE, ITEM_NONE); return Return_Item(item, MOD_NONE, ITEM_NONE);
} else if ((item >= ITEM_BOOTS_KOKIRI) && (item <= ITEM_BOOTS_HOVER)) { } else if ((item >= ITEM_BOOTS_KOKIRI) && (item <= ITEM_BOOTS_HOVER)) {
gSaveContext.inventory.equipment |= (gBitFlags[item - ITEM_BOOTS_KOKIRI] << gEquipShifts[EQUIP_BOOTS]); gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_BOOTS, item - ITEM_BOOTS_KOKIRI);
return Return_Item(item, MOD_NONE, ITEM_NONE); return Return_Item(item, MOD_NONE, ITEM_NONE);
} else if ((item == ITEM_KEY_BOSS) || (item == ITEM_COMPASS) || (item == ITEM_DUNGEON_MAP)) { } else if ((item == ITEM_KEY_BOSS) || (item == ITEM_COMPASS) || (item == ITEM_DUNGEON_MAP)) {
gSaveContext.inventory.dungeonItems[gSaveContext.mapIndex] |= gBitFlags[item - ITEM_KEY_BOSS]; gSaveContext.inventory.dungeonItems[gSaveContext.mapIndex] |= gBitFlags[item - ITEM_KEY_BOSS];
@ -2610,8 +2625,8 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) {
} }
if (item == RG_MASTER_SWORD) { if (item == RG_MASTER_SWORD) {
if (!CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) { if (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) {
gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_SWORD]; gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_TYPE_SWORD];
} }
return Return_Item_Entry(giEntry, RG_NONE); return Return_Item_Entry(giEntry, RG_NONE);
} }
@ -2651,26 +2666,25 @@ u8 Item_CheckObtainability(u8 item) {
} else if ((item >= ITEM_SWORD_KOKIRI) && (item <= ITEM_SWORD_BGS)) { } else if ((item >= ITEM_SWORD_KOKIRI) && (item <= ITEM_SWORD_BGS)) {
if (item == ITEM_SWORD_BGS) { if (item == ITEM_SWORD_BGS) {
return ITEM_NONE; return ITEM_NONE;
} else if ((gBitFlags[item - ITEM_SWORD_KOKIRI] << gEquipShifts[EQUIP_SWORD]) & } else if (CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, item - ITEM_SWORD_KOKIRI + EQUIP_INV_SWORD_KOKIRI)) {
gSaveContext.inventory.equipment) {
return IS_RANDO ? ITEM_NONE : item; return IS_RANDO ? ITEM_NONE : item;
} else { } else {
return ITEM_NONE; return ITEM_NONE;
} }
} else if ((item >= ITEM_SHIELD_DEKU) && (item <= ITEM_SHIELD_MIRROR)) { } else if ((item >= ITEM_SHIELD_DEKU) && (item <= ITEM_SHIELD_MIRROR)) {
if ((gBitFlags[item - ITEM_SHIELD_DEKU] << gEquipShifts[EQUIP_SHIELD]) & gSaveContext.inventory.equipment) { if (CHECK_OWNED_EQUIP(EQUIP_TYPE_SHIELD, item - ITEM_SHIELD_DEKU + EQUIP_INV_SHIELD_DEKU)) {
return IS_RANDO ? ITEM_NONE : item; return IS_RANDO ? ITEM_NONE : item;
} else { } else {
return ITEM_NONE; return ITEM_NONE;
} }
} else if ((item >= ITEM_TUNIC_KOKIRI) && (item <= ITEM_TUNIC_ZORA)) { } else if ((item >= ITEM_TUNIC_KOKIRI) && (item <= ITEM_TUNIC_ZORA)) {
if ((gBitFlags[item - ITEM_TUNIC_KOKIRI] << gEquipShifts[EQUIP_TUNIC]) & gSaveContext.inventory.equipment) { if (CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, item - ITEM_TUNIC_KOKIRI + EQUIP_INV_TUNIC_KOKIRI)) {
return IS_RANDO ? ITEM_NONE : item; return IS_RANDO ? ITEM_NONE : item;
} else { } else {
return ITEM_NONE; return ITEM_NONE;
} }
} else if ((item >= ITEM_BOOTS_KOKIRI) && (item <= ITEM_BOOTS_HOVER)) { } else if ((item >= ITEM_BOOTS_KOKIRI) && (item <= ITEM_BOOTS_HOVER)) {
if ((gBitFlags[item - ITEM_BOOTS_KOKIRI] << gEquipShifts[EQUIP_BOOTS]) & gSaveContext.inventory.equipment) { if (CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, item - ITEM_BOOTS_KOKIRI + EQUIP_INV_BOOTS_KOKIRI)) {
return IS_RANDO ? ITEM_NONE : item; return IS_RANDO ? ITEM_NONE : item;
} else { } else {
return ITEM_NONE; return ITEM_NONE;
@ -6489,11 +6503,11 @@ void Interface_Update(PlayState* play) {
D_80125A58 = Player_GetEnvironmentalHazard(play); D_80125A58 = Player_GetEnvironmentalHazard(play);
if (D_80125A58 == 1) { if (D_80125A58 == 1) {
if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 2 || CVarGetInteger("gSuperTunic", 0) != 0) { if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == EQUIP_VALUE_TUNIC_GORON || CVarGetInteger("gSuperTunic", 0) != 0) {
D_80125A58 = 0; D_80125A58 = 0;
} }
} else if ((Player_GetEnvironmentalHazard(play) >= 2) && (Player_GetEnvironmentalHazard(play) < 5)) { } else if ((Player_GetEnvironmentalHazard(play) >= 2) && (Player_GetEnvironmentalHazard(play) < 5)) {
if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 3 || CVarGetInteger("gSuperTunic", 0) != 0) { if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == EQUIP_VALUE_TUNIC_ZORA || CVarGetInteger("gSuperTunic", 0) != 0) {
D_80125A58 = 0; D_80125A58 = 0;
} }
} }

View file

@ -669,9 +669,9 @@ void func_8008EC70(Player* this) {
void Player_SetEquipmentData(PlayState* play, Player* this) { void Player_SetEquipmentData(PlayState* play, Player* this) {
if (this->csMode != 0x56) { if (this->csMode != 0x56) {
this->currentShield = CUR_EQUIP_VALUE(EQUIP_SHIELD); this->currentShield = SHIELD_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD));
this->currentTunic = CUR_EQUIP_VALUE(EQUIP_TUNIC) - 1; this->currentTunic = TUNIC_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC));
this->currentBoots = CUR_EQUIP_VALUE(EQUIP_BOOTS) - 1; this->currentBoots = BOOTS_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS));
this->currentSwordItemId = B_BTN_ITEM; this->currentSwordItemId = B_BTN_ITEM;
Player_SetModelGroup(this, Player_ActionToModelGroup(this, this->heldItemAction)); Player_SetModelGroup(this, Player_ActionToModelGroup(this, this->heldItemAction));
Player_SetBootData(play, this); Player_SetBootData(play, this);
@ -2117,11 +2117,11 @@ void Player_DrawPause(PlayState* play, u8* segment, SkelAnime* skelAnime, Vec3f*
if (CVarGetInteger("gPauseLiveLink", 0) || CVarGetInteger("gPauseTriforce", 0)) { if (CVarGetInteger("gPauseLiveLink", 0) || CVarGetInteger("gPauseTriforce", 0)) {
uintptr_t anim = 0; // Initialise anim uintptr_t anim = 0; // Initialise anim
if (CUR_EQUIP_VALUE(EQUIP_SWORD) >= 3) { if (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) >= EQUIP_VALUE_SWORD_BIGGORON) {
EquipedStance = 1; EquipedStance = 1;
} else if (CUR_EQUIP_VALUE(EQUIP_SHIELD) == 0) { } else if (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SWORD_NONE) {
EquipedStance = 2; EquipedStance = 2;
} else if (CUR_EQUIP_VALUE(EQUIP_SHIELD) == 2 && LINK_AGE_IN_YEARS == YEARS_CHILD) { } else if (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SWORD_MASTER && LINK_AGE_IN_YEARS == YEARS_CHILD) {
EquipedStance = 3; EquipedStance = 3;
} else { } else {
// Link is idle so revert to 0 // Link is idle so revert to 0
@ -2192,8 +2192,8 @@ void Player_DrawPause(PlayState* play, u8* segment, SkelAnime* skelAnime, Vec3f*
if (FrameCountSinceLastAnim >= SwitchAtFrame) { if (FrameCountSinceLastAnim >= SwitchAtFrame) {
LastAnim = SelectedAnim; LastAnim = SelectedAnim;
if (LastAnim==1) { if (LastAnim==1) {
if ((CUR_EQUIP_VALUE(EQUIP_SWORD)!=PLAYER_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_SHIELD)!= PLAYER_SHIELD_NONE)) { // if the player has a sword and shield equipped if ((CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) != EQUIP_VALUE_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) != EQUIP_VALUE_SHIELD_NONE)) { // if the player has a sword and shield equipped
if ((LINK_AGE_IN_YEARS == YEARS_ADULT) || (CUR_EQUIP_VALUE(EQUIP_SHIELD) == PLAYER_SHIELD_DEKU)) { // if he's an adult or a kid with the deku shield if ((LINK_AGE_IN_YEARS == YEARS_ADULT) || (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU)) { // if he's an adult or a kid with the deku shield
SelectedAnim = (rand() % (6 - 2 + 1)) + 2; // select any 5 animations that aren't the default standing anim SelectedAnim = (rand() % (6 - 2 + 1)) + 2; // select any 5 animations that aren't the default standing anim
} else { //else if he's a child with a shield that isn't the deku shield } else { //else if he's a child with a shield that isn't the deku shield
s16 randval = (rand() % (5 - 2 + 1)) + 2; // 4 animations s16 randval = (rand() % (5 - 2 + 1)) + 2; // 4 animations
@ -2203,15 +2203,15 @@ void Player_DrawPause(PlayState* play, u8* segment, SkelAnime* skelAnime, Vec3f*
SelectedAnim=randval; SelectedAnim=randval;
} }
} }
} else if ((CUR_EQUIP_VALUE(EQUIP_SWORD) != PLAYER_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_SHIELD)==PLAYER_SHIELD_NONE)) { // if the player has a sword equipped but no shield } else if ((CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) != EQUIP_VALUE_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_NONE)) { // if the player has a sword equipped but no shield
s16 randval = (rand() % (5 - 2 + 1)) + 2; // 4 animations s16 randval = (rand() % (5 - 2 + 1)) + 2; // 4 animations
if (randval==4) { //if its the shield anim if (randval==4) { //if its the shield anim
SelectedAnim==6; // set to yawn anim SelectedAnim==6; // set to yawn anim
} else { } else {
SelectedAnim=randval; SelectedAnim=randval;
} }
} else if ((CUR_EQUIP_VALUE(EQUIP_SWORD) == PLAYER_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_SHIELD)!=PLAYER_SHIELD_NONE)) { //if the player has a shield equipped but no sword } else if ((CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) != EQUIP_VALUE_SHIELD_NONE)) { //if the player has a shield equipped but no sword
if ((LINK_AGE_IN_YEARS == YEARS_ADULT) || (CUR_EQUIP_VALUE(EQUIP_SHIELD) == PLAYER_SHIELD_DEKU)) {// if he's an adult or a kid with the deku shield if ((LINK_AGE_IN_YEARS == YEARS_ADULT) || (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU)) {// if he's an adult or a kid with the deku shield
s16 randval = (rand() % (5 - 2 + 1)) + 2; // 4 animations s16 randval = (rand() % (5 - 2 + 1)) + 2; // 4 animations
if (randval==5) { //if its the sword anim if (randval==5) { //if its the sword anim
SelectedAnim==6; // set to yawn anim SelectedAnim==6; // set to yawn anim
@ -2226,7 +2226,7 @@ void Player_DrawPause(PlayState* play, u8* segment, SkelAnime* skelAnime, Vec3f*
SelectedAnim=randval; SelectedAnim=randval;
} }
} }
} else if ((CUR_EQUIP_VALUE(EQUIP_SWORD) == PLAYER_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_SHIELD)==PLAYER_SHIELD_NONE)) { // if the player has no sword or shield equipped } else if ((CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) && (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_NONE)) { // if the player has no sword or shield equipped
s16 randval = (rand() % (4 - 2 + 1)) + 2; // 3 animations s16 randval = (rand() % (4 - 2 + 1)) + 2; // 3 animations
if (randval==4) { //if its the shield anim if (randval==4) { //if its the shield anim
SelectedAnim==6; // set to yawn anim SelectedAnim==6; // set to yawn anim
@ -2297,7 +2297,7 @@ void Player_DrawPause(PlayState* play, u8* segment, SkelAnime* skelAnime, Vec3f*
srcTable = gLinkPauseChildJointTable; srcTable = gLinkPauseChildJointTable;
} }
} else { } else {
if (sword == 3) { if (sword == PLAYER_SWORD_BIGGORON) {
srcTable = gLinkPauseAdultBgsJointTable; srcTable = gLinkPauseAdultBgsJointTable;
} else if (shield != PLAYER_SHIELD_NONE) { } else if (shield != PLAYER_SHIELD_NONE) {
srcTable = gLinkPauseAdultShieldJointTable; srcTable = gLinkPauseAdultShieldJointTable;

View file

@ -168,13 +168,12 @@ void Sram_OpenSave() {
} }
} }
// check for owning kokiri sword.. to restore master sword? bug or debug feature? if (LINK_AGE_IN_YEARS == YEARS_ADULT && !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) {
if (LINK_AGE_IN_YEARS == YEARS_ADULT && !CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) {
if (!IS_RANDO || !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { if (!IS_RANDO || !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) {
gSaveContext.inventory.equipment |= gBitFlags[1] << gEquipShifts[EQUIP_SWORD]; gSaveContext.inventory.equipment |= OWNED_EQUIP_FLAG(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER);
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER;
gSaveContext.equips.equipment &= ~0xF; gSaveContext.equips.equipment &= ~(0xF << (EQUIP_TYPE_SWORD * 4));
gSaveContext.equips.equipment |= 2; gSaveContext.equips.equipment |= EQUIP_VALUE_SWORD_MASTER << (EQUIP_TYPE_SWORD * 4);
} }
} }

View file

@ -91,7 +91,7 @@ void BgTokiSwd_Init(Actor* thisx, PlayState* play) {
Player* player = GET_PLAYER(gPlayState); Player* player = GET_PLAYER(gPlayState);
player->currentSwordItemId = ITEM_NONE; player->currentSwordItemId = ITEM_NONE;
gSaveContext.equips.buttonItems[0] = ITEM_NONE; gSaveContext.equips.buttonItems[0] = ITEM_NONE;
Inventory_ChangeEquipment(EQUIP_SWORD, PLAYER_SWORD_NONE); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_NONE);
} }
} }
@ -187,7 +187,7 @@ void BgTokiSwd_Draw(Actor* thisx, PlayState* play2) {
s32 pad[3]; s32 pad[3];
// Do not draw the Master Sword in the pedestal if the player has not found it yet // Do not draw the Master Sword in the pedestal if the player has not found it yet
if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && !CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) { if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) {
return; return;
} }

View file

@ -179,7 +179,7 @@ void BossGanon2_Init(Actor* thisx, PlayState* play) {
this->actor.gravity = 0.0f; this->actor.gravity = 0.0f;
hasFoundMasterSword = 1; hasFoundMasterSword = 1;
if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && !CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) { if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) {
hasFoundMasterSword = 0; hasFoundMasterSword = 0;
} }
} }

View file

@ -273,7 +273,7 @@ u32 func_809EF73C(EnDns* this) {
} }
u32 func_809EF800(EnDns* this) { u32 func_809EF800(EnDns* this) {
if (gBitFlags[4] & gSaveContext.inventory.equipment) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_DEKU)) {
return 1; return 1;
} }
if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) {

View file

@ -565,7 +565,8 @@ s32 EnGirlA_CanBuy_BluePotion(PlayState* play, EnGirlA* this) {
} }
s32 EnGirlA_CanBuy_Longsword(PlayState* play, EnGirlA* this) { s32 EnGirlA_CanBuy_Longsword(PlayState* play, EnGirlA* this) {
if ((gBitFlags[2] & gSaveContext.inventory.equipment) && !(gBitFlags[3] & gSaveContext.inventory.equipment)) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON) &&
!CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)) {
return CANBUY_RESULT_CANT_GET_NOW; return CANBUY_RESULT_CANT_GET_NOW;
} }
if (gSaveContext.rupees < this->basePrice) { if (gSaveContext.rupees < this->basePrice) {
@ -578,7 +579,7 @@ s32 EnGirlA_CanBuy_Longsword(PlayState* play, EnGirlA* this) {
} }
s32 EnGirlA_CanBuy_HylianShield(PlayState* play, EnGirlA* this) { s32 EnGirlA_CanBuy_HylianShield(PlayState* play, EnGirlA* this) {
if (gBitFlags[5] & gSaveContext.inventory.equipment) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_HYLIAN)) {
return CANBUY_RESULT_CANT_GET_NOW; return CANBUY_RESULT_CANT_GET_NOW;
} }
if (gSaveContext.rupees < this->basePrice) { if (gSaveContext.rupees < this->basePrice) {
@ -591,7 +592,7 @@ s32 EnGirlA_CanBuy_HylianShield(PlayState* play, EnGirlA* this) {
} }
s32 EnGirlA_CanBuy_DekuShield(PlayState* play, EnGirlA* this) { s32 EnGirlA_CanBuy_DekuShield(PlayState* play, EnGirlA* this) {
if (gBitFlags[4] & gSaveContext.inventory.equipment) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_DEKU)) {
return CANBUY_RESULT_CANT_GET_NOW; return CANBUY_RESULT_CANT_GET_NOW;
} }
if (gSaveContext.rupees < this->basePrice) { if (gSaveContext.rupees < this->basePrice) {
@ -608,7 +609,7 @@ s32 EnGirlA_CanBuy_GoronTunic(PlayState* play, EnGirlA* this) {
(!IS_RANDO || Randomizer_GetSettingValue(RSK_SHOPSANITY) == RO_SHOPSANITY_OFF)) { (!IS_RANDO || Randomizer_GetSettingValue(RSK_SHOPSANITY) == RO_SHOPSANITY_OFF)) {
return CANBUY_RESULT_CANT_GET_NOW; return CANBUY_RESULT_CANT_GET_NOW;
} }
if (gBitFlags[9] & gSaveContext.inventory.equipment) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON)) {
return CANBUY_RESULT_CANT_GET_NOW; return CANBUY_RESULT_CANT_GET_NOW;
} }
if (gSaveContext.rupees < this->basePrice) { if (gSaveContext.rupees < this->basePrice) {
@ -625,7 +626,7 @@ s32 EnGirlA_CanBuy_ZoraTunic(PlayState* play, EnGirlA* this) {
(!IS_RANDO || Randomizer_GetSettingValue(RSK_SHOPSANITY) == RO_SHOPSANITY_OFF)) { (!IS_RANDO || Randomizer_GetSettingValue(RSK_SHOPSANITY) == RO_SHOPSANITY_OFF)) {
return CANBUY_RESULT_CANT_GET_NOW; return CANBUY_RESULT_CANT_GET_NOW;
} }
if (gBitFlags[10] & gSaveContext.inventory.equipment) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_ZORA)) {
return CANBUY_RESULT_CANT_GET_NOW; return CANBUY_RESULT_CANT_GET_NOW;
} }
if (gSaveContext.rupees < this->basePrice) { if (gSaveContext.rupees < this->basePrice) {

View file

@ -99,9 +99,9 @@ s32 func_80A3D7C8(void) {
} else if ((IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF) && } else if ((IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MERCHANTS) != RO_SHUFFLE_MERCHANTS_OFF) &&
!Flags_GetRandomizerInf(RAND_INF_MERCHANTS_MEDIGORON)) { !Flags_GetRandomizerInf(RAND_INF_MERCHANTS_MEDIGORON)) {
return 1; return 1;
} else if (!(gBitFlags[2] & gSaveContext.inventory.equipment)) { // Don't have giant's knife } else if (!CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BIGGORON)) { // Don't have giant's knife
return 1; return 1;
} else if (gBitFlags[3] & gSaveContext.inventory.equipment) { // Have broken giant's knife } else if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)) { // Have broken giant's knife
return 2; return 2;
} else { } else {
return 3; return 3;

View file

@ -120,7 +120,7 @@ u16 EnGo_GetTextID(PlayState* play, Actor* thisx) {
} else { } else {
return 0x3041; return 0x3041;
} }
} else if (CHECK_OWNED_EQUIP(EQUIP_TUNIC, 1) || (Flags_GetInfTable(INFTABLE_10D))) { } else if (CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON) || (Flags_GetInfTable(INFTABLE_10D))) {
if (Flags_GetInfTable(INFTABLE_SPOKE_TO_GORON_LINK)) { if (Flags_GetInfTable(INFTABLE_SPOKE_TO_GORON_LINK)) {
return 0x3038; return 0x3038;
} else { } else {
@ -651,7 +651,7 @@ void EnGo_Init(Actor* thisx, PlayState* play) {
switch (this->actor.params & 0xF0) { switch (this->actor.params & 0xF0) {
case 0x00: case 0x00:
Actor_SetScale(&this->actor, 0.008f); Actor_SetScale(&this->actor, 0.008f);
if (CHECK_OWNED_EQUIP(EQUIP_TUNIC, 1)) { if (CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON)) {
EnGo_SetMovedPos(this, play); EnGo_SetMovedPos(this, play);
EnGo_SetupAction(this, EnGo_CurledUp); EnGo_SetupAction(this, EnGo_CurledUp);
} else { } else {

View file

@ -527,7 +527,7 @@ u16 EnGo2_GetTextIdGoronCityLink(PlayState* play, EnGo2* this) {
if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) { if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) {
return Flags_GetInfTable(INFTABLE_10F) ? 0x3042 : 0x3041; return Flags_GetInfTable(INFTABLE_10F) ? 0x3042 : 0x3041;
} else if (CHECK_OWNED_EQUIP(EQUIP_TUNIC, 1)) { } else if (CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON)) {
return Flags_GetInfTable(INFTABLE_SPOKE_TO_GORON_LINK) ? 0x3038 : 0x3037; return Flags_GetInfTable(INFTABLE_SPOKE_TO_GORON_LINK) ? 0x3038 : 0x3037;
} else if (Flags_GetInfTable(INFTABLE_STOPPED_GORON_LINKS_ROLLING)) { } else if (Flags_GetInfTable(INFTABLE_STOPPED_GORON_LINKS_ROLLING)) {
this->unk_20C = 0; this->unk_20C = 0;
@ -1221,7 +1221,7 @@ s32 EnGo2_IsCameraModified(EnGo2* this, PlayState* play) {
return true; return true;
} else if (((!IS_RANDO && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || } else if (((!IS_RANDO && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) ||
(IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && (IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) &&
CHECK_OWNED_EQUIP(EQUIP_TUNIC, 1)) { CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON)) {
return true; return true;
} else { } else {
return false; return false;
@ -1280,7 +1280,7 @@ void EnGo2_SelectGoronWakingUp(EnGo2* this) {
case GORON_CITY_LINK: case GORON_CITY_LINK:
if (((!IS_RANDO && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || if (((!IS_RANDO && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) ||
(IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && (IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) &&
CHECK_OWNED_EQUIP(EQUIP_TUNIC, 1)) { CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON)) {
EnGo2_WakingUp(this); EnGo2_WakingUp(this);
break; break;
} }
@ -1642,7 +1642,7 @@ void EnGo2_Init(Actor* thisx, PlayState* play) {
this->actor.home.pos = this->actor.world.pos; this->actor.home.pos = this->actor.world.pos;
if (((!IS_RANDO && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || if (((!IS_RANDO && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) ||
(IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && (IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) &&
CHECK_OWNED_EQUIP(EQUIP_TUNIC, 1)) { CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON)) {
EnGo2_GetItemAnimation(this, play); EnGo2_GetItemAnimation(this, play);
} else { } else {
this->actionFunc = EnGo2_CurledUp; this->actionFunc = EnGo2_CurledUp;

View file

@ -95,7 +95,7 @@ u16 EnKz_GetTextNoMaskAdult(PlayState* play, EnKz* this) {
if (INV_CONTENT(ITEM_TRADE_ADULT) >= ITEM_FROG) { if (INV_CONTENT(ITEM_TRADE_ADULT) >= ITEM_FROG) {
if (!Flags_GetInfTable(INFTABLE_139)) { if (!Flags_GetInfTable(INFTABLE_139)) {
if (!IS_RANDO) { if (!IS_RANDO) {
return CHECK_OWNED_EQUIP(EQUIP_TUNIC, 2) ? 0x401F : 0x4012; return CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_ZORA) ? 0x401F : 0x4012;
} else { } else {
return 0x4012; return 0x4012;
} }
@ -272,7 +272,7 @@ void func_80A9CB18(EnKz* this, PlayState* play) {
player->actor.textId = this->actor.textId; player->actor.textId = this->actor.textId;
} else { } else {
if (!IS_RANDO) { if (!IS_RANDO) {
this->actor.textId = CHECK_OWNED_EQUIP(EQUIP_TUNIC, 2) ? 0x401F : 0x4012; this->actor.textId = CHECK_OWNED_EQUIP(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_ZORA) ? 0x401F : 0x4012;
} else { } else {
this->actor.textId = 0x4012; this->actor.textId = 0x4012;
} }

View file

@ -384,7 +384,8 @@ u16 EnMd_GetTextKokiriForest(PlayState* play, EnMd* this) {
return 0x1034; return 0x1034;
} }
if ((CUR_EQUIP_VALUE(EQUIP_SHIELD) == 1) && (CUR_EQUIP_VALUE(EQUIP_SWORD) == 1)) { if ((CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU) &&
(CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_KOKIRI)) {
return 0x1033; return 0x1033;
} }

View file

@ -298,15 +298,15 @@ void EnRr_SetupReleasePlayer(EnRr* this, PlayState* play) {
this->wobbleSizeTarget = 2048.0f; this->wobbleSizeTarget = 2048.0f;
tunic = 0; tunic = 0;
shield = 0; shield = 0;
if (CUR_EQUIP_VALUE(EQUIP_SHIELD) != 3 /* Mirror shield */) { if (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) != EQUIP_VALUE_SHIELD_MIRROR) {
shield = Inventory_DeleteEquipment(play, EQUIP_SHIELD); shield = Inventory_DeleteEquipment(play, EQUIP_TYPE_SHIELD);
if (shield != 0) { if (shield != 0) {
this->eatenShield = shield; this->eatenShield = shield;
this->retreat = true; this->retreat = true;
} }
} }
if (CUR_EQUIP_VALUE(EQUIP_TUNIC) != 1 /* Kokiri tunic */ && !IS_RANDO /* Randomizer Save File */) { if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) != EQUIP_VALUE_TUNIC_KOKIRI && !IS_RANDO /* Randomizer Save File */) {
tunic = Inventory_DeleteEquipment(play, EQUIP_TUNIC); tunic = Inventory_DeleteEquipment(play, EQUIP_TYPE_TUNIC);
if (tunic != 0) { if (tunic != 0) {
this->eatenTunic = tunic; this->eatenTunic = tunic;
this->retreat = true; this->retreat = true;

View file

@ -376,7 +376,7 @@ void EnXc_SetupSerenadeAction(EnXc* this, PlayState* play) {
} }
// Player is adult and does not have iron boots and has not learned Serenade // Player is adult and does not have iron boots and has not learned Serenade
if ((!CHECK_OWNED_EQUIP(EQUIP_BOOTS, 1) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER)) && LINK_IS_ADULT) { if ((!CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER)) && LINK_IS_ADULT) {
this->action = SHEIK_ACTION_SERENADE; this->action = SHEIK_ACTION_SERENADE;
osSyncPrintf("水のセレナーデ シーク誕生!!!!!!!!!!!!!!!!!!\n"); osSyncPrintf("水のセレナーデ シーク誕生!!!!!!!!!!!!!!!!!!\n");
} else { } else {
@ -390,7 +390,7 @@ s32 EnXc_SerenadeCS(EnXc* this, PlayState* play) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
s32 stateFlags = player->stateFlags1; s32 stateFlags = player->stateFlags1;
if (((CHECK_OWNED_EQUIP(EQUIP_BOOTS, 1) && !IS_RANDO) || if (((CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && !IS_RANDO) ||
(Flags_GetTreasure(play, 2) && IS_RANDO)) && (Flags_GetTreasure(play, 2) && IS_RANDO)) &&
!Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) && !(stateFlags & 0x20000000) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER) && !(stateFlags & 0x20000000) &&
!Play_InCsMode(play)) { !Play_InCsMode(play)) {
@ -2247,7 +2247,7 @@ void EnXc_SetupDialogueAction(EnXc* this, PlayState* play) {
this->actor.textId = TEXT_SHEIK_HAVE_HOOK; this->actor.textId = TEXT_SHEIK_HAVE_HOOK;
} }
} else if (IS_RANDO && gPlayState->sceneNum == SCENE_INSIDE_GANONS_CASTLE) { } else if (IS_RANDO && gPlayState->sceneNum == SCENE_INSIDE_GANONS_CASTLE) {
if (CHECK_OWNED_EQUIP(EQUIP_SWORD, 1) && INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT && if (CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER) && INV_CONTENT(ITEM_ARROW_LIGHT) == ITEM_ARROW_LIGHT &&
CUR_CAPACITY(UPG_QUIVER) >= 30 && gSaveContext.isMagicAcquired) { CUR_CAPACITY(UPG_QUIVER) >= 30 && gSaveContext.isMagicAcquired) {
this->actor.textId = TEXT_SHEIK_HAVE_HOOK; this->actor.textId = TEXT_SHEIK_HAVE_HOOK;
} else { } else {

View file

@ -3857,7 +3857,7 @@ void func_8083819C(Player* this, PlayState* play) {
if (this->currentShield == PLAYER_SHIELD_DEKU && (CVarGetInteger("gFireproofDekuShield", 0) == 0)) { if (this->currentShield == PLAYER_SHIELD_DEKU && (CVarGetInteger("gFireproofDekuShield", 0) == 0)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_SHIELD, this->actor.world.pos.x, Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_SHIELD, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 1, true); this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 1, true);
Inventory_DeleteEquipment(play, EQUIP_SHIELD); Inventory_DeleteEquipment(play, EQUIP_TYPE_SHIELD);
Message_StartTextbox(play, 0x305F, NULL); Message_StartTextbox(play, 0x305F, NULL);
} }
} }
@ -10591,20 +10591,20 @@ void Player_UseTunicBoots(Player* this, PlayState* play) {
actionParam = Player_ItemToItemAction(item); actionParam = Player_ItemToItemAction(item);
if (actionParam >= PLAYER_IA_BOOTS_KOKIRI) { if (actionParam >= PLAYER_IA_BOOTS_KOKIRI) {
u16 bootsValue = actionParam - PLAYER_IA_BOOTS_KOKIRI + 1; u16 bootsValue = actionParam - PLAYER_IA_BOOTS_KOKIRI + 1;
if (CUR_EQUIP_VALUE(EQUIP_BOOTS) == bootsValue) { if (CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == bootsValue) {
Inventory_ChangeEquipment(EQUIP_BOOTS, PLAYER_BOOTS_KOKIRI + 1); Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI);
} else { } else {
Inventory_ChangeEquipment(EQUIP_BOOTS, bootsValue); Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, bootsValue);
} }
Player_SetEquipmentData(play, this); Player_SetEquipmentData(play, this);
func_808328EC(this, CUR_EQUIP_VALUE(EQUIP_BOOTS) == PLAYER_BOOTS_IRON + 1 ? NA_SE_PL_WALK_HEAVYBOOTS func_808328EC(this, CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS) == EQUIP_VALUE_BOOTS_IRON ? NA_SE_PL_WALK_HEAVYBOOTS
: NA_SE_PL_CHANGE_ARMS); : NA_SE_PL_CHANGE_ARMS);
} else if (actionParam >= PLAYER_IA_TUNIC_KOKIRI) { } else if (actionParam >= PLAYER_IA_TUNIC_KOKIRI) {
u16 tunicValue = actionParam - PLAYER_IA_TUNIC_KOKIRI + 1; u16 tunicValue = actionParam - PLAYER_IA_TUNIC_KOKIRI + 1;
if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == tunicValue) { if (CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC) == tunicValue) {
Inventory_ChangeEquipment(EQUIP_TUNIC, PLAYER_TUNIC_KOKIRI + 1); Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI);
} else { } else {
Inventory_ChangeEquipment(EQUIP_TUNIC, tunicValue); Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, tunicValue);
} }
Player_SetEquipmentData(play, this); Player_SetEquipmentData(play, this);
func_808328EC(this, NA_SE_PL_CHANGE_ARMS); func_808328EC(this, NA_SE_PL_CHANGE_ARMS);
@ -11254,7 +11254,7 @@ void Player_Draw(Actor* thisx, PlayState* play2) {
pos.y = -130.0f; pos.y = -130.0f;
pos.z = -150.0f; pos.z = -150.0f;
scale = 0.046f; scale = 0.046f;
} else if (CUR_EQUIP_VALUE(EQUIP_SWORD) != 2) { } else if (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) != EQUIP_VALUE_SWORD_MASTER) {
pos.x = 25.0f; pos.x = 25.0f;
pos.y = -228.0f; pos.y = -228.0f;
pos.z = 60.0f; pos.z = 60.0f;
@ -12774,16 +12774,16 @@ s32 func_8084DFF4(PlayState* play, Player* this) {
if (equipItem >= ITEM_SWORD_KOKIRI && equipItem <= ITEM_SWORD_BGS) { if (equipItem >= ITEM_SWORD_KOKIRI && equipItem <= ITEM_SWORD_BGS) {
gSaveContext.equips.buttonItems[0] = equipItem; gSaveContext.equips.buttonItems[0] = equipItem;
Inventory_ChangeEquipment(EQUIP_SWORD, equipItem - ITEM_SWORD_KOKIRI + 1); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, equipItem - ITEM_SWORD_KOKIRI + 1);
func_808328EC(this, NA_SE_IT_SWORD_PUTAWAY); func_808328EC(this, NA_SE_IT_SWORD_PUTAWAY);
} else if (equipItem >= ITEM_SHIELD_DEKU && equipItem <= ITEM_SHIELD_MIRROR) { } else if (equipItem >= ITEM_SHIELD_DEKU && equipItem <= ITEM_SHIELD_MIRROR) {
Inventory_ChangeEquipment(EQUIP_SHIELD, equipItem - ITEM_SHIELD_DEKU + 1); Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, equipItem - ITEM_SHIELD_DEKU + 1);
func_808328EC(&this->actor, NA_SE_IT_SHIELD_REMOVE); func_808328EC(&this->actor, NA_SE_IT_SHIELD_REMOVE);
Player_SetEquipmentData(play, this); Player_SetEquipmentData(play, this);
} else if (equipItem == ITEM_TUNIC_GORON || equipItem == ITEM_TUNIC_ZORA) { } else if (equipItem == ITEM_TUNIC_GORON || equipItem == ITEM_TUNIC_ZORA) {
Inventory_ChangeEquipment(EQUIP_TUNIC, equipItem - ITEM_TUNIC_KOKIRI + 1); Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, equipItem - ITEM_TUNIC_KOKIRI + 1);
func_808328EC(this, NA_SE_PL_CHANGE_ARMS); func_808328EC(this, NA_SE_PL_CHANGE_ARMS);
Player_SetEquipmentData(play, this); Player_SetEquipmentData(play, this);
} }
@ -14949,16 +14949,16 @@ void func_80852648(PlayState* play, Player* this, CsCmdActorAction* arg2) {
// If MS sword is shuffled and not in the players inventory, then we need to unequip the current sword // If MS sword is shuffled and not in the players inventory, then we need to unequip the current sword
// and set swordless flag to mimic Link having his weapon knocked out of his hand in the Ganon fight // and set swordless flag to mimic Link having his weapon knocked out of his hand in the Ganon fight
if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && !CHECK_OWNED_EQUIP(EQUIP_SWORD, 1)) { if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) {
Inventory_ChangeEquipment(EQUIP_SWORD, 0); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_NONE);
gSaveContext.equips.buttonItems[0] = ITEM_NONE; gSaveContext.equips.buttonItems[0] = ITEM_NONE;
Flags_SetInfTable(INFTABLE_SWORDLESS); Flags_SetInfTable(INFTABLE_SWORDLESS);
return; return;
} }
Inventory_ChangeEquipment(EQUIP_SWORD, 2); Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER);
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER;
Inventory_DeleteEquipment(play, 0); Inventory_DeleteEquipment(play, EQUIP_TYPE_SWORD);
} }
} }

View file

@ -2939,7 +2939,7 @@ void FileChoose_FadeOut(GameState* thisx) {
*/ */
void FileChoose_LoadGame(GameState* thisx) { void FileChoose_LoadGame(GameState* thisx) {
FileChooseContext* this = (FileChooseContext*)thisx; FileChooseContext* this = (FileChooseContext*)thisx;
u16 swordEquipMask; u16 swordEquipValue;
s32 pad; s32 pad;
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
@ -3026,9 +3026,9 @@ void FileChoose_LoadGame(GameState* thisx) {
(gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE)) { (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE)) {
gSaveContext.equips.buttonItems[0] = ITEM_NONE; gSaveContext.equips.buttonItems[0] = ITEM_NONE;
swordEquipMask = BOMSWAP16(gEquipMasks[EQUIP_SWORD]) & gSaveContext.equips.equipment; swordEquipValue = (BOMSWAP16(gEquipMasks[EQUIP_TYPE_SWORD]) & gSaveContext.equips.equipment) >> (EQUIP_TYPE_SWORD * 4);
gSaveContext.equips.equipment &= gEquipNegMasks[EQUIP_SWORD]; gSaveContext.equips.equipment &= gEquipNegMasks[EQUIP_TYPE_SWORD];
gSaveContext.inventory.equipment ^= (gBitFlags[swordEquipMask - 1] << BOMSWAP16(gEquipShifts[EQUIP_SWORD])); gSaveContext.inventory.equipment ^= (gBitFlags[swordEquipValue - 1] << BOMSWAP16(gEquipShifts[EQUIP_TYPE_SWORD]));
} }
} }

View file

@ -576,18 +576,18 @@ void KaleidoScope_DrawDebugEditor(PlayState* play) {
} }
} }
} else { } else {
i = curSection - 0x34; i = curSection - 0x34; // 0 <= i < 4
if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) { if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
gSaveContext.inventory.equipment ^= (1 << gEquipShifts[i]); gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG_ALT(i, 0);
} }
if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) { if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
gSaveContext.inventory.equipment ^= (2 << gEquipShifts[i]); gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG_ALT(i, 1);
} }
if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) { if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
gSaveContext.inventory.equipment ^= (4 << gEquipShifts[i]); gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG_ALT(i, 2);
} }
if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) { if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
gSaveContext.inventory.equipment ^= (8 << gEquipShifts[i]); gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG_ALT(i, 3);
} }
} }
} else if (curSection < 0x44) { } else if (curSection < 0x44) {

View file

@ -108,7 +108,7 @@ void KaleidoScope_DrawPlayerWork(PlayState* play) {
pos.y = -130.0f; pos.y = -130.0f;
pos.z = -150.0f; pos.z = -150.0f;
scale = 0.046f; scale = 0.046f;
} else if (CUR_EQUIP_VALUE(EQUIP_SWORD) != 2 && !CVarGetInteger("gPauseTriforce", 0)) { } else if (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) != EQUIP_VALUE_SWORD_MASTER && !CVarGetInteger("gPauseTriforce", 0)) {
pos.x = 25.0f; pos.x = 25.0f;
pos.y = -228.0f; pos.y = -228.0f;
pos.z = 60.0f; pos.z = 60.0f;
@ -153,8 +153,10 @@ void KaleidoScope_DrawPlayerWork(PlayState* play) {
extern int fbTest; extern int fbTest;
gsSPSetFB(play->state.gfxCtx->polyOpa.p++, fbTest); gsSPSetFB(play->state.gfxCtx->polyOpa.p++, fbTest);
Player_DrawPause(play, pauseCtx->playerSegment, &pauseCtx->playerSkelAnime, &pos, &link_kaleido_rot, scale, Player_DrawPause(play, pauseCtx->playerSegment, &pauseCtx->playerSkelAnime, &pos, &link_kaleido_rot, scale,
CUR_EQUIP_VALUE(EQUIP_SWORD), CUR_EQUIP_VALUE(EQUIP_TUNIC) - 1, CUR_EQUIP_VALUE(EQUIP_SHIELD), SWORD_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD)),
CUR_EQUIP_VALUE(EQUIP_BOOTS) - 1); TUNIC_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC)),
SHIELD_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD)),
BOOTS_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS)));
gsSPResetFB(play->state.gfxCtx->polyOpa.p++); gsSPResetFB(play->state.gfxCtx->polyOpa.p++);
} }
@ -464,7 +466,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
if ((pauseCtx->cursorY[PAUSE_EQUIP] == 0) && (pauseCtx->cursorX[PAUSE_EQUIP] == 3)) { if ((pauseCtx->cursorY[PAUSE_EQUIP] == 0) && (pauseCtx->cursorX[PAUSE_EQUIP] == 3)) {
if (gSaveContext.bgsFlag != 0) { if (gSaveContext.bgsFlag != 0) {
cursorItem = ITEM_HEART_PIECE_2; cursorItem = ITEM_HEART_PIECE_2;
} else if (gBitFlags[3] & gSaveContext.inventory.equipment) { } else if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)) {
cursorItem = ITEM_SWORD_KNIFE; cursorItem = ITEM_SWORD_KNIFE;
} }
} }
@ -523,28 +525,28 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
// If we're on the "swords" section of the equipment screen AND we're on a currently-equipped BGS/Giant's Knife // If we're on the "swords" section of the equipment screen AND we're on a currently-equipped BGS/Giant's Knife
if (pauseCtx->cursorY[PAUSE_EQUIP] == 0 && pauseCtx->cursorX[PAUSE_EQUIP] == 3 if (pauseCtx->cursorY[PAUSE_EQUIP] == 0 && pauseCtx->cursorX[PAUSE_EQUIP] == 3
&& CUR_EQUIP_VALUE(EQUIP_SWORD) == 3 && CHECK_OWNED_EQUIP(0,1)){ // And we have the Master Sword && CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_BIGGORON && CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)){ // And we have the Master Sword
Inventory_ChangeEquipment(EQUIP_SWORD, 2); // "Unequip" it by equipping Master Sword Inventory_ChangeEquipment(EQUIP_TYPE_SWORD, EQUIP_VALUE_SWORD_MASTER); // "Unequip" it by equipping Master Sword
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER;
gSaveContext.infTable[29] = 0; gSaveContext.infTable[29] = 0;
goto RESUME_EQUIPMENT_SWORD; // Skip to here so we don't re-equip it goto RESUME_EQUIPMENT_SWORD; // Skip to here so we don't re-equip it
} }
// If we're on the "shields" section of the equipment screen AND we're on a currently-equipped shield // If we're on the "shields" section of the equipment screen AND we're on a currently-equipped shield
if (pauseCtx->cursorY[PAUSE_EQUIP] == 1 && pauseCtx->cursorX[PAUSE_EQUIP] == CUR_EQUIP_VALUE(EQUIP_SHIELD)) { if (pauseCtx->cursorY[PAUSE_EQUIP] == 1 && pauseCtx->cursorX[PAUSE_EQUIP] == CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD)) {
Inventory_ChangeEquipment(EQUIP_SHIELD, 0); // Unequip it Inventory_ChangeEquipment(EQUIP_TYPE_SHIELD, EQUIP_VALUE_SHIELD_NONE); // Unequip it
goto RESUME_EQUIPMENT; // Skip to here so we don't re-equip it goto RESUME_EQUIPMENT; // Skip to here so we don't re-equip it
} }
// If we're on the "tunics" section of the equipment screen AND we're on a currently-equipped tunic // If we're on the "tunics" section of the equipment screen AND we're on a currently-equipped tunic
if (pauseCtx->cursorY[PAUSE_EQUIP] == 2 && pauseCtx->cursorX[PAUSE_EQUIP] == CUR_EQUIP_VALUE(EQUIP_TUNIC)) { if (pauseCtx->cursorY[PAUSE_EQUIP] == 2 && pauseCtx->cursorX[PAUSE_EQUIP] == CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC)) {
Inventory_ChangeEquipment(EQUIP_TUNIC, 1); // "Unequip" it (by equipping Kokiri Tunic) Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, EQUIP_VALUE_TUNIC_KOKIRI); // "Unequip" it (by equipping Kokiri Tunic)
goto RESUME_EQUIPMENT; // Skip to here so we don't re-equip it goto RESUME_EQUIPMENT; // Skip to here so we don't re-equip it
} }
// If we're on the "boots" section of the equipment screen AND we're on currently-equipped boots // If we're on the "boots" section of the equipment screen AND we're on currently-equipped boots
if (pauseCtx->cursorY[PAUSE_EQUIP] == 3 && pauseCtx->cursorX[PAUSE_EQUIP] == CUR_EQUIP_VALUE(EQUIP_BOOTS)) { if (pauseCtx->cursorY[PAUSE_EQUIP] == 3 && pauseCtx->cursorX[PAUSE_EQUIP] == CUR_EQUIP_VALUE(EQUIP_TYPE_BOOTS)) {
Inventory_ChangeEquipment(EQUIP_BOOTS, 1); // "Unequip" it (by equipping Kokiri Boots) Inventory_ChangeEquipment(EQUIP_TYPE_BOOTS, EQUIP_VALUE_BOOTS_KOKIRI); // "Unequip" it (by equipping Kokiri Boots)
goto RESUME_EQUIPMENT; // Skip to here so we don't re-equip it goto RESUME_EQUIPMENT; // Skip to here so we don't re-equip it
} }
} }
@ -568,7 +570,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_BGS;
} }
if ((gSaveContext.equips.buttonItems[0] == ITEM_SWORD_BGS) && (gSaveContext.bgsFlag == 0) && if ((gSaveContext.equips.buttonItems[0] == ITEM_SWORD_BGS) && (gSaveContext.bgsFlag == 0) &&
(gBitFlags[3] & gSaveContext.inventory.equipment)) { CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)) {
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE; gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE;
} }
} }

View file

@ -3551,7 +3551,7 @@ void KaleidoScope_Update(PlayState* play)
pauseCtx->worldMapPoints[3] = 1; pauseCtx->worldMapPoints[3] = 1;
} }
if (CHECK_OWNED_EQUIP(EQUIP_BOOTS, 1)) { if (CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON)) {
pauseCtx->worldMapPoints[3] = 2; pauseCtx->worldMapPoints[3] = 2;
} }
@ -3705,7 +3705,7 @@ void KaleidoScope_Update(PlayState* play)
pauseCtx->worldMapPoints[11] = 2; pauseCtx->worldMapPoints[11] = 2;
} }
if (CHECK_OWNED_EQUIP(EQUIP_BOOTS, 1)) { if (CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON)) {
pauseCtx->worldMapPoints[11] = 1; pauseCtx->worldMapPoints[11] = 1;
} }