Skip to content
4 changes: 4 additions & 0 deletions include/dusk/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ struct UserSettings {
ConfigVar<bool> instantText;
ConfigVar<bool> sunsSong;
ConfigVar<bool> autoSave;
ConfigVar<bool> enableDeselectSwords;
ConfigVar<bool> enableDeselectShields;
ConfigVar<bool> enableDeselectClothes;

ConfigVar<bool> enhancedMapMenus;

// Preferences
Expand Down
7 changes: 7 additions & 0 deletions src/d/actor/d_a_alink.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4913,9 +4913,16 @@ int daAlink_c::create() {
} else
#endif
// Event Flag: Finished Sewers
#if TARGET_PC
if (checkCasualWearFlg() && dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[47])
&& !dusk::getSettings().game.enableDeselectClothes) {
dComIfGs_setSelectEquipClothes(dItemNo_WEAR_KOKIRI_e);
}
#else
if (checkCasualWearFlg() && dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[47])) {
dComIfGs_setSelectEquipClothes(dItemNo_WEAR_KOKIRI_e);
}
#endif

if (isEnteringLV7 && checkMagicArmorHeavy()) {
dComIfGs_setSelectEquipClothes(dItemNo_WEAR_KOKIRI_e);
Expand Down
140 changes: 138 additions & 2 deletions src/d/d_menu_collect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@
#include "d/d_menu_window.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"

#if TARGET_PC
#include "dusk/settings.h"
#endif

typedef void (dMenu_Collect2D_c::*initFunc)();
static DUSK_CONSTEXPR initFunc init[] = {
&dMenu_Collect2D_c::wait_init, &dMenu_Collect2D_c::save_open_init,
Expand Down Expand Up @@ -576,6 +580,24 @@ void dMenu_Collect2D_c::screenSet() {
field_0x22d[0][2] = 0;
field_0x22d[1][2] = 0;
field_0x22d[2][2] = 0;
#if TARGET_PC
if (dComIfGs_getSelectEquipClothes() == dItemNo_WEAR_CASUAL_e
&& !dusk::getSettings().game.enableDeselectClothes
&& dComIfGs_isItemFirstBit(dItemNo_WEAR_KOKIRI_e)) {
dMeter2Info_setCloth(dItemNo_WEAR_KOKIRI_e, false);
daPy_getPlayerActorClass()->setClothesChange(0);
}
if (dComIfGs_getSelectEquipClothes() == dItemNo_WEAR_CASUAL_e
&& !dusk::getSettings().game.enableDeselectClothes) {
field_0x22d[3][2] = 0;
field_0x22d[4][2] = 0;
field_0x22d[5][2] = 0;
} else {
field_0x22d[3][2] = dComIfGs_isItemFirstBit(0x2F);
field_0x22d[4][2] = dComIfGs_isItemFirstBit(0x31);
field_0x22d[5][2] = dComIfGs_isItemFirstBit(0x30);
}
#else
if (dComIfGs_getSelectEquipClothes() == dItemNo_WEAR_CASUAL_e) {
field_0x22d[3][2] = 0;
field_0x22d[4][2] = 0;
Expand All @@ -585,6 +607,7 @@ void dMenu_Collect2D_c::screenSet() {
field_0x22d[4][2] = dComIfGs_isItemFirstBit(0x31);
field_0x22d[5][2] = dComIfGs_isItemFirstBit(0x30);
}
#endif
field_0x22d[6][2] = 0;
field_0x22d[0][3] = 1;
if (checkItemGet(dItemNo_BOW_e, 1)) {
Expand Down Expand Up @@ -1208,28 +1231,62 @@ void dMenu_Collect2D_c::changeSword() {
mDoAud_seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0);
dMeter2Info_set2DVibration();
}
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectSwords) {
dMeter2Info_setSword(dItemNo_NONE_e, false);
setEquipItemFrameColorSword(-1);
mDoAud_seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0);
dMeter2Info_set2DVibration();
}
#endif
} else if (dComIfGs_getSelectEquipSword() != dItemNo_WOOD_STICK_e) {
dMeter2Info_setSword(dItemNo_WOOD_STICK_e, false);
setEquipItemFrameColorSword(0);
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectSwords) {
dMeter2Info_setSword(dItemNo_NONE_e, false);
setEquipItemFrameColorSword(0);
Z2GetAudioMgr()->seStart(
Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#endif
break;
case 4:
if (dComIfGs_isItemFirstBit(dItemNo_LIGHT_SWORD_e)) {
if (dComIfGs_isItemFirstBit(dItemNo_LIGHT_SWORD_e)) {
if (dComIfGs_getSelectEquipSword() != dItemNo_LIGHT_SWORD_e) {
dMeter2Info_setSword(dItemNo_LIGHT_SWORD_e, false);
setEquipItemFrameColorSword(1);
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f,
0);
dMeter2Info_set2DVibration();
}
} else if (dComIfGs_getSelectEquipSword() != dItemNo_MASTER_SWORD_e) {
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectSwords) {
dMeter2Info_setSword(dItemNo_NONE_e, false);
setEquipItemFrameColorSword(-1);
mDoAud_seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0);
dMeter2Info_set2DVibration();
}
#endif
}
else if (dComIfGs_getSelectEquipSword() != dItemNo_MASTER_SWORD_e) {
dMeter2Info_setSword(dItemNo_MASTER_SWORD_e, false);
setEquipItemFrameColorSword(1);
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectSwords) {
dMeter2Info_setSword(dItemNo_NONE_e, false);
setEquipItemFrameColorSword(-1);
mDoAud_seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0);
dMeter2Info_set2DVibration();
}
#endif
break;
case 5:
if (dComIfGs_getSelectEquipSword() != dItemNo_LIGHT_SWORD_e) {
Expand All @@ -1238,6 +1295,14 @@ void dMenu_Collect2D_c::changeSword() {
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectSwords) {
dMeter2Info_setSword(dItemNo_NONE_e, false);
setEquipItemFrameColorSword(-1);
mDoAud_seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0);
dMeter2Info_set2DVibration();
}
#endif
break;
}
}
Expand All @@ -1254,6 +1319,16 @@ void dMenu_Collect2D_c::changeShield() {
0);
dMeter2Info_set2DVibration();
}
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectShields) {
dMeter2Info_setShield(dItemNo_NONE_e, false);
setEquipItemFrameColorShield(-1);
daAlink_getAlinkActorClass()->setShieldChange();
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f,
0);
dMeter2Info_set2DVibration();
}
#endif
} else if (dComIfGs_isItemFirstBit(dItemNo_WOOD_SHIELD_e)) {
if (dComIfGs_getSelectEquipShield() != dItemNo_WOOD_SHIELD_e) {
dMeter2Info_setShield(dItemNo_WOOD_SHIELD_e, false);
Expand All @@ -1263,6 +1338,16 @@ void dMenu_Collect2D_c::changeShield() {
0);
dMeter2Info_set2DVibration();
}
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectShields) {
dMeter2Info_setShield(dItemNo_NONE_e, false);
setEquipItemFrameColorShield(-1);
daAlink_getAlinkActorClass()->setShieldChange();
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f,
0);
dMeter2Info_set2DVibration();
}
#endif
}
break;
case 4:
Expand All @@ -1273,6 +1358,15 @@ void dMenu_Collect2D_c::changeShield() {
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectShields) {
dMeter2Info_setShield(dItemNo_NONE_e, false);
setEquipItemFrameColorShield(-1);
daAlink_getAlinkActorClass()->setShieldChange();
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#endif
break;
}
}
Expand All @@ -1287,6 +1381,15 @@ void dMenu_Collect2D_c::changeClothe() {
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectClothes) {
dMeter2Info_setCloth(dItemNo_WEAR_CASUAL_e, false);
setEquipItemFrameColorClothes(-1);
daPy_getPlayerActorClass()->setClothesChange(0);
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#endif
break;
case 4:
if (dComIfGs_getSelectEquipClothes() != dItemNo_WEAR_ZORA_e) {
Expand All @@ -1296,6 +1399,15 @@ void dMenu_Collect2D_c::changeClothe() {
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectClothes) {
dMeter2Info_setCloth(dItemNo_WEAR_CASUAL_e, false);
setEquipItemFrameColorClothes(-1);
daPy_getPlayerActorClass()->setClothesChange(0);
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#endif
break;
case 5:
if (dComIfGs_getSelectEquipClothes() != dItemNo_ARMOR_e) {
Expand All @@ -1305,6 +1417,15 @@ void dMenu_Collect2D_c::changeClothe() {
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#if TARGET_PC
else if (dusk::getSettings().game.enableDeselectClothes) {
dMeter2Info_setCloth(dItemNo_WEAR_CASUAL_e, false);
setEquipItemFrameColorClothes(-1);
daPy_getPlayerActorClass()->setClothesChange(0);
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibration();
}
#endif
break;
}
}
Expand Down Expand Up @@ -1505,6 +1626,11 @@ void dMenu_Collect2D_c::setEquipItemFrameColorSword(int i_frame) {
}
}
} else {
#if TARGET_PC
if (dusk::getSettings().game.enableDeselectSwords) {
mEquippedSword = dComIfGs_getSelectEquipSword();
}
#endif
for (int i = 0; i < 2; i++) {
if (i == i_frame && field_0x22d[i + 3][0] != 0) {
static_cast<J2DPicture*>(mpScreen->search(tag[i]))
Expand Down Expand Up @@ -1553,6 +1679,11 @@ void dMenu_Collect2D_c::setEquipItemFrameColorShield(int i_frame) {
}
}
} else {
#if TARGET_PC
if (dusk::getSettings().game.enableDeselectShields) {
mEquippedShield = dComIfGs_getSelectEquipShield();
}
#endif
for (int i = 0; i < 2; i++) {
if (i == i_frame && field_0x22d[i + 3][1] != 0) {
static_cast<J2DPicture*>(mpScreen->search(tag[i]))
Expand Down Expand Up @@ -1605,6 +1736,11 @@ void dMenu_Collect2D_c::setEquipItemFrameColorClothes(int i_frame) {
}
}
} else {
#if TARGET_PC
if (dusk::getSettings().game.enableDeselectClothes) {
mEquippedClothes = dComIfGs_getSelectEquipClothes();
}
#endif
for (int i = 0; i < 3; i++) {
if (i == i_frame && field_0x22d[i + 3][2] != 0) {
static_cast<J2DPicture*>(mpScreen->search(tag[i]))
Expand Down
6 changes: 6 additions & 0 deletions src/dusk/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ UserSettings g_userSettings = {
.instantText {"game.instantText", false},
.sunsSong {"game.sunsSong", false},
.autoSave {"game.autoSave", false},
.enableDeselectSwords {"game.enableDeselectSwords", false},
.enableDeselectShields {"game.enableDeselectShields", false},
.enableDeselectClothes {"game.enableDeselectClothes", false},
.enhancedMapMenus {"game.enhancedMapMenus", false},

// Preferences
Expand Down Expand Up @@ -223,6 +226,9 @@ void registerSettings() {
Register(g_userSettings.game.instantText);
Register(g_userSettings.game.sunsSong);
Register(g_userSettings.game.autoSave);
Register(g_userSettings.game.enableDeselectSwords);
Register(g_userSettings.game.enableDeselectShields);
Register(g_userSettings.game.enableDeselectClothes);
Register(g_userSettings.game.enhancedMapMenus);
Register(g_userSettings.game.enableMirrorMode);
Register(g_userSettings.game.invertCameraXAxis);
Expand Down
41 changes: 41 additions & 0 deletions src/dusk/ui/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1205,6 +1205,47 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
addOption("Quick Transform (R+Y)", getSettings().game.enableQuickTransform,
"Transform instantly by pressing R and Y simultaneously.");

leftPane.add_section("Equipments");
leftPane.register_control(
leftPane.add_select_button({
.key = "Equipment Deselection",
.getValue = [] {
int count = 0;
if (getSettings().game.enableDeselectSwords.getValue()) count++;
if (getSettings().game.enableDeselectShields.getValue()) count++;
if (getSettings().game.enableDeselectClothes.getValue()) count++;
return Rml::String{fmt::format("{} / 3", count)};
},
.isModified = [] {
return getSettings().game.enableDeselectSwords.getValue() !=
getSettings().game.enableDeselectSwords.getDefaultValue()
|| getSettings().game.enableDeselectShields.getValue() !=
getSettings().game.enableDeselectShields.getDefaultValue()
|| getSettings().game.enableDeselectClothes.getValue() !=
getSettings().game.enableDeselectClothes.getDefaultValue();
},
}),
rightPane, [](Pane& pane) {
pane.clear();
pane.add_rml(
"Allows deselection of equipped items from the Collections menu.");

auto addSubToggle = [&pane](const Rml::String& text, ConfigVar<bool>& var) {
pane.add_button({
.text = text,
.isSelected = [&var] { return var.getValue(); },
}).on_pressed([&var] {
mDoAud_seStartMenu(kSoundItemChange);
var.setValue(!var.getValue());
config::Save();
});
};

addSubToggle("Deselect Swords", getSettings().game.enableDeselectSwords);
addSubToggle("Deselect Shields", getSettings().game.enableDeselectShields);
addSubToggle("Deselect Clothes", getSettings().game.enableDeselectClothes);
});

leftPane.add_section("Speedrunning");
config_bool_select(leftPane, rightPane, getSettings().game.speedrunMode,
{
Expand Down
Loading