Skip to content

Commit

Permalink
Initial starting items implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
garrettjoecox committed Feb 3, 2025
1 parent c915a33 commit 79bd079
Show file tree
Hide file tree
Showing 7 changed files with 268 additions and 12 deletions.
106 changes: 103 additions & 3 deletions mm/2s2h/Rando/Menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,10 +203,110 @@ static void DrawItemsTab() {
CheckboxOptions({ { .disabled = true, .disabledTooltip = "Coming Soon" } }));
ImGui::EndChild();
ImGui::BeginChild("randoItemsStarting", ImVec2(0, 0));
ImGui::BeginChild("randoStartingItemsColumn1", ImVec2(columnWidth, 0));
ImGui::SeparatorText("Starting Options");
CVarCheckbox("Wallet Full", Rando::StaticData::Options[RO_STARTING_RUPEES].cvar);
CVarCheckbox("Consumables Full", Rando::StaticData::Options[RO_STARTING_CONSUMABLES].cvar);
CVarCheckbox("Maps and Compasses", Rando::StaticData::Options[RO_STARTING_MAPS_AND_COMPASSES].cvar);
CVarSliderInt("Health", Rando::StaticData::Options[RO_STARTING_HEALTH].cvar,
IntSliderOptions()
.Min(1)
.Max(20)
.DefaultValue(3)
.LabelPosition(LabelPosition::None)
.Format("%d Hearts")
.Color(Colors::Red));
ImGui::EndChild();
ImGui::SameLine();
ImGui::BeginChild("randoStartingItemsColumn2", ImVec2(columnWidth, 0));
ImGui::SeparatorText("Starting Items");
CVarSliderInt(
"Starting Health", "gPlaceholderInt",
IntSliderOptions({ { .disabled = true, .disabledTooltip = "Coming Soon" } }).Min(3).Max(20).DefaultValue(3));
int checkedItemIndex = 0;
for (size_t i = 0; i < Rando::StaticData::StartingItemsMap.size(); i++) {
RandoItemId itemId = Rando::StaticData::StartingItemsMap[i];
std::string itemName = Rando::StaticData::Items[itemId].name;
RandoOptionId optionId;
uint32_t defaults = 0;
if (i < 32) {
optionId = RO_STARTING_ITEMS_1;
} else if (i < 64) {
optionId = RO_STARTING_ITEMS_2;
defaults = -2145385984;
} else {
optionId = RO_STARTING_ITEMS_3;
defaults = 2048;
}
uint32_t startingItems = CVarGetInteger(Rando::StaticData::Options[optionId].cvar, defaults);

bool checked = (startingItems & (1 << i)) != 0;
if (checked) {
const char* texturePath = Rando::StaticData::GetIconTexturePath(itemId);
ImTextureID textureId = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(texturePath);
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.0f, 1.0f, 1.0f, 0.0f));
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1.0f, 1.0f, 1.0f, 0.2f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(1.0f, 1.0f, 1.0f, 0.1f));
if (ImGui::ImageButton(std::to_string(i).c_str(), textureId, ImVec2(columnWidth / 8, columnWidth / 8),
ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1))) {
startingItems &= ~(1 << i);
CVarSetInteger(Rando::StaticData::Options[optionId].cvar, startingItems);
Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
}
ImGui::PopStyleColor(3);
ImGui::PopStyleVar(2);
UIWidgets::Tooltip(itemName.c_str());
checkedItemIndex++;
}
if (checkedItemIndex % 8 != 0) {
ImGui::SameLine(0, 0);
}
}
ImGui::EndChild();
ImGui::SameLine();
ImGui::BeginChild("randoStartingItemsColumn3", ImVec2(columnWidth, 0));
ImGui::SeparatorText("Available Items");
int uncheckedItemIndex = 0;
for (size_t i = 0; i < Rando::StaticData::StartingItemsMap.size(); i++) {
RandoItemId itemId = Rando::StaticData::StartingItemsMap[i];
std::string itemName = Rando::StaticData::Items[itemId].name;
RandoOptionId optionId;
uint32_t defaults = 0;
if (i < 32) {
optionId = RO_STARTING_ITEMS_1;
} else if (i < 64) {
optionId = RO_STARTING_ITEMS_2;
defaults = -2145385984;
} else {
optionId = RO_STARTING_ITEMS_3;
defaults = 2048;
}
uint32_t startingItems = CVarGetInteger(Rando::StaticData::Options[optionId].cvar, defaults);

bool checked = (startingItems & (1 << i)) != 0;
if (!checked) {
const char* texturePath = Rando::StaticData::GetIconTexturePath(itemId);
ImTextureID textureId = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(texturePath);
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.0f, 1.0f, 1.0f, 0.0f));
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1.0f, 1.0f, 1.0f, 0.2f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(1.0f, 1.0f, 1.0f, 0.1f));
if (ImGui::ImageButton(std::to_string(i).c_str(), textureId, ImVec2(columnWidth / 8, columnWidth / 8),
ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1))) {
startingItems |= (1 << i);
CVarSetInteger(Rando::StaticData::Options[optionId].cvar, startingItems);
Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesOnNextTick();
}
ImGui::PopStyleColor(3);
ImGui::PopStyleVar(2);
UIWidgets::Tooltip(itemName.c_str());
uncheckedItemIndex++;
}
if (uncheckedItemIndex % 8 != 0) {
ImGui::SameLine(0, 0);
}
}
ImGui::EndChild();
ImGui::EndChild();
}

Expand Down
66 changes: 58 additions & 8 deletions mm/2s2h/Rando/MiscBehavior/OnFileCreate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,16 +58,62 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) {
// Persist options to the save
gSaveContext.save.shipSaveInfo.rando.finalSeed = finalSeed;
for (auto& [randoOptionId, randoStaticOption] : Rando::StaticData::Options) {
RANDO_SAVE_OPTIONS[randoOptionId] = CVarGetInteger(randoStaticOption.cvar, 0);
uint32_t defaults = 0;
switch (randoOptionId) {
case RO_STARTING_ITEMS_2:
defaults = -2145385984;
break;
case RO_STARTING_ITEMS_3:
defaults = 2048;
break;
default:
break;
}
RANDO_SAVE_OPTIONS[randoOptionId] = CVarGetInteger(randoStaticOption.cvar, defaults);
}

if (RANDO_SAVE_OPTIONS[RO_STARTING_HEALTH] != 3) {
gSaveContext.save.saveInfo.playerData.healthCapacity =
gSaveContext.save.saveInfo.playerData.health = RANDO_SAVE_OPTIONS[RO_STARTING_HEALTH] * 0x10;
}

if (RANDO_SAVE_OPTIONS[RO_STARTING_CONSUMABLES]) {
GiveItem(RI_DEKU_STICK);
GiveItem(RI_DEKU_NUT);
AMMO(ITEM_DEKU_STICK) = CUR_CAPACITY(UPG_DEKU_STICKS);
AMMO(ITEM_DEKU_NUT) = CUR_CAPACITY(UPG_DEKU_NUTS);
}

std::vector<RandoItemId> startingItems = {};
for (size_t i = 0; i < Rando::StaticData::StartingItemsMap.size(); i++) {
RandoItemId itemId = Rando::StaticData::StartingItemsMap[i];
RandoOptionId optionId;
if (i < 32) {
optionId = RO_STARTING_ITEMS_1;
} else if (i < 64) {
optionId = RO_STARTING_ITEMS_2;
} else {
optionId = RO_STARTING_ITEMS_3;
}
uint32_t startingItemsBits = RANDO_SAVE_OPTIONS[optionId];
if ((startingItemsBits & (1 << i)) != 0) {
startingItems.push_back(itemId);
}
}

// TODO: This should be driven by the UI
std::vector<RandoItemId> startingItems = {
RI_PROGRESSIVE_SWORD,
RI_SHIELD_HERO,
RI_OCARINA,
RI_SONG_TIME,
};
if (RANDO_SAVE_OPTIONS[RO_STARTING_MAPS_AND_COMPASSES]) {
std::vector<RandoItemId> MapsAndCompasses = {
RI_GREAT_BAY_COMPASS, RI_GREAT_BAY_MAP, RI_SNOWHEAD_COMPASS,
RI_SNOWHEAD_MAP, RI_STONE_TOWER_COMPASS, RI_STONE_TOWER_MAP,
RI_TINGLE_MAP_CLOCK_TOWN, RI_TINGLE_MAP_GREAT_BAY, RI_TINGLE_MAP_ROMANI_RANCH,
RI_TINGLE_MAP_SNOWHEAD, RI_TINGLE_MAP_STONE_TOWER, RI_TINGLE_MAP_WOODFALL,
RI_WOODFALL_COMPASS, RI_WOODFALL_MAP,
};

for (RandoItemId itemId : MapsAndCompasses) {
startingItems.push_back(itemId);
}
}

std::unordered_map<RandoCheckId, bool> checkPool;
std::vector<RandoItemId> itemPool;
Expand Down Expand Up @@ -261,6 +307,10 @@ void Rando::MiscBehavior::OnFileCreate(s16 fileNum) {
GiveItem(ConvertItem(startingItem));
}

if (RANDO_SAVE_OPTIONS[RO_STARTING_RUPEES]) {
gSaveContext.save.saveInfo.playerData.rupees = CUR_CAPACITY(UPG_WALLET);
}

if (RANDO_SAVE_OPTIONS[RO_LOGIC] == RO_LOGIC_VANILLA) {
GiveItem(RI_SWORD_KOKIRI);
GiveItem(RI_SHIELD_HERO);
Expand Down
91 changes: 91 additions & 0 deletions mm/2s2h/Rando/StaticData/Items.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,85 @@ std::map<RandoItemId, RandoStaticItem> Items = {
};
// clang-format on

std::vector<RandoItemId> StartingItemsMap = {
RI_ARROW_FIRE,
RI_ARROW_ICE,
RI_ARROW_LIGHT,
RI_BOMBERS_NOTEBOOK,
RI_BOTTLE_EMPTY,
RI_DEED_LAND,
RI_DEED_MOUNTAIN,
RI_DEED_OCEAN,
RI_DEED_SWAMP,
RI_DOUBLE_DEFENSE,
RI_GREAT_FAIRY_SWORD,
RI_GREAT_SPIN_ATTACK,
RI_HOOKSHOT,
RI_LENS,
RI_LETTER_TO_KAFEI,
RI_LETTER_TO_MAMA,
RI_MASK_ALL_NIGHT,
RI_MASK_BLAST,
RI_MASK_BREMEN,
RI_MASK_BUNNY,
RI_MASK_CAPTAIN,
RI_MASK_CIRCUS_LEADER,
RI_MASK_COUPLE,
RI_MASK_DEKU,
RI_MASK_DON_GERO,
RI_MASK_FIERCE_DEITY,
RI_MASK_GARO,
RI_MASK_GIANT,
RI_MASK_GIBDO,
RI_MASK_GORON,
RI_MASK_GREAT_FAIRY,
RI_MASK_KAFEIS_MASK,
RI_MASK_KAMARO,
RI_MASK_KEATON,
RI_MASK_POSTMAN,
RI_MASK_ROMANI,
RI_MASK_SCENTS,
RI_MASK_STONE,
RI_MASK_TRUTH,
RI_MASK_ZORA,
RI_MOONS_TEAR,
RI_OCARINA,
RI_PENDANT_OF_MEMORIES,
RI_PICTOGRAPH_BOX,
RI_POWDER_KEG,
RI_PROGRESSIVE_BOMB_BAG,
RI_PROGRESSIVE_BOMB_BAG,
RI_PROGRESSIVE_BOMB_BAG,
RI_PROGRESSIVE_BOW,
RI_PROGRESSIVE_BOW,
RI_PROGRESSIVE_BOW,
RI_PROGRESSIVE_MAGIC,
RI_PROGRESSIVE_MAGIC,
RI_PROGRESSIVE_SWORD,
RI_PROGRESSIVE_SWORD,
RI_PROGRESSIVE_SWORD,
RI_PROGRESSIVE_WALLET,
RI_PROGRESSIVE_WALLET,
RI_REMAINS_GOHT,
RI_REMAINS_GYORG,
RI_REMAINS_ODOLWA,
RI_REMAINS_TWINMOLD,
RI_ROOM_KEY,
RI_SHIELD_HERO,
RI_SHIELD_MIRROR,
RI_SONG_ELEGY,
RI_SONG_EPONA,
RI_SONG_HEALING,
RI_PROGRESSIVE_LULLABY,
RI_PROGRESSIVE_LULLABY,
RI_SONG_NOVA,
RI_SONG_OATH,
RI_SONG_SOARING,
RI_SONG_SONATA,
RI_SONG_STORMS,
RI_SONG_TIME,
};

RandoItemId GetItemIdFromName(const char* name) {
for (auto& [randoItemId, randoStaticItem] : Items) {
if (strcmp(name, randoStaticItem.spoilerName) == 0) {
Expand Down Expand Up @@ -266,6 +345,18 @@ const char* GetIconTexturePath(RandoItemId randoItemId) {
case RI_WOODFALL_MAP:
case RI_STONE_TOWER_MAP:
return (const char*)gItemIcons[ITEM_COMPASS];
case RI_PROGRESSIVE_BOMB_BAG:
return (const char*)gItemIcons[ITEM_BOMB_BAG_20];
case RI_PROGRESSIVE_BOW:
return (const char*)gItemIcons[ITEM_BOW];
case RI_PROGRESSIVE_SWORD:
return (const char*)gItemIcons[ITEM_SWORD_KOKIRI];
case RI_PROGRESSIVE_WALLET:
return (const char*)gItemIcons[ITEM_WALLET_ADULT];
case RI_PROGRESSIVE_LULLABY:
return (const char*)gItemIcons[ITEM_SONG_LULLABY];
case RI_PROGRESSIVE_MAGIC:
return (const char*)gItemIcons[ITEM_MAGIC_JAR_SMALL];
default:
break;
}
Expand Down
7 changes: 7 additions & 0 deletions mm/2s2h/Rando/StaticData/Options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ std::map<RandoOptionId, RandoStaticOption> Options = {
RO(RO_SHUFFLE_OWL_STATUES),
RO(RO_SHUFFLE_POT_DROPS),
RO(RO_SHUFFLE_SHOPS),
RO(RO_STARTING_CONSUMABLES),
RO(RO_STARTING_HEALTH),
RO(RO_STARTING_ITEMS_1),
RO(RO_STARTING_ITEMS_2),
RO(RO_STARTING_ITEMS_3),
RO(RO_STARTING_MAPS_AND_COMPASSES),
RO(RO_STARTING_RUPEES),
};
// clang-format on

Expand Down
1 change: 1 addition & 0 deletions mm/2s2h/Rando/StaticData/StaticData.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct RandoStaticItem {
};

extern std::map<RandoItemId, RandoStaticItem> Items;
extern std::vector<RandoItemId> StartingItemsMap;

RandoItemId GetItemIdFromName(const char* name);
u8 GetIconForZMessage(RandoItemId itemId);
Expand Down
7 changes: 7 additions & 0 deletions mm/2s2h/Rando/Types.h
Original file line number Diff line number Diff line change
Expand Up @@ -1726,6 +1726,13 @@ typedef enum {
RO_SHUFFLE_OWL_STATUES,
RO_SHUFFLE_POT_DROPS,
RO_SHUFFLE_SHOPS,
RO_STARTING_CONSUMABLES,
RO_STARTING_HEALTH,
RO_STARTING_ITEMS_1,
RO_STARTING_ITEMS_2,
RO_STARTING_ITEMS_3,
RO_STARTING_MAPS_AND_COMPASSES,
RO_STARTING_RUPEES,
RO_MAX,
} RandoOptionId;

Expand Down
2 changes: 1 addition & 1 deletion mm/include/z64save.h
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ typedef struct RandoSaveInfo {
u8 randoAccess[RANDO_ACCESS_MAX];
RandoSaveCheck randoSaveChecks[RC_MAX];
u32 finalSeed;
s8 randoSaveOptions[RO_MAX]; // Type here may change in the future
u32 randoSaveOptions[RO_MAX]; // Type here may change in the future
s8 foundDungeonKeys[9]; // Tracks the number of dungeon keys found, opposed to the number of keys in the inventory
} RandoSaveInfo;

Expand Down

0 comments on commit 79bd079

Please sign in to comment.