This commit is contained in:
parent
d1d3c56a9e
commit
37131d7b10
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
|
@ -73,7 +73,9 @@ static const ALIGN_ASSET(2) char gArrowDownTex[] = dgArrowDown;
|
|||
#define dgTriforcePiece "__OTR__textures/parameter_static/gTriforcePiece"
|
||||
static const ALIGN_ASSET(2) char gTriforcePieceTex[] = dgTriforcePiece;
|
||||
|
||||
#define dgWTriforcePiece "__OTR__textures/parameter_static/gWTriforcePiece"
|
||||
static const ALIGN_ASSET(2) char gWTriforcePieceTex[] = dgWTriforcePiece;
|
||||
|
||||
#define dgFileSelMQButtonTex "__OTR__textures/title_static/gFileSelMQButtonTex"
|
||||
static const ALIGN_ASSET(2) char gFileSelMQButtonTex[] = dgFileSelMQButtonTex;
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor.h"
|
||||
#include "soh/Enhancements/debugger/debugSaveEditor.h"
|
||||
#include "soh_assets.h"
|
||||
|
||||
extern "C" {
|
||||
extern SaveContext gSaveContext;
|
||||
|
@ -37,145 +38,146 @@ static std::vector<uint32_t> splitTime;
|
|||
static std::vector<uint32_t> splitBest;
|
||||
static std::vector<uint32_t> splitPreviousBest;
|
||||
static std::vector<uint32_t> splitStatus;
|
||||
static std::string status = "";
|
||||
static std::string status;
|
||||
static ImVec4 statusColor = COLOR_WHITE;
|
||||
static uint32_t splitCurNum = 0;
|
||||
std::string splitAttempt = "Attempt #: 1";
|
||||
static std::string splitNumDisp = "Attempt #: ";
|
||||
static ImVec4 colorChoice = ImVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
static const char* backgroundColor;
|
||||
static uint32_t itemNum;
|
||||
static std::string itemImager;
|
||||
static std::string itemNamer;
|
||||
static uint32_t splitCounter;
|
||||
static uint32_t totalPreviousBest;
|
||||
char textBuffer[25];
|
||||
static ImVec4 pieceTint;
|
||||
|
||||
using json = nlohmann::json;
|
||||
|
||||
std::vector<TimeSplitObject> splitObjects = {
|
||||
// ID, Item Name Image Name
|
||||
{ 0, "Deku Stick", "ITEM_STICK"},
|
||||
{ 1, "Deku Nut", "ITEM_NUT"},
|
||||
{ 3, "Fairy Bow", "ITEM_BOW"},
|
||||
{ 4, "Fire Arrow", "ITEM_ARROW_FIRE"},
|
||||
{ 5, "Din's Fire", "ITEM_DINS_FIRE"},
|
||||
{ 6, "Fairy Slingshot", "ITEM_SLINGSHOT"},
|
||||
{ 7, "Fairy Ocarina", "ITEM_OCARINA_FAIRY"},
|
||||
{ 8, "Ocarina of Time", "ITEM_OCARINA_TIME"},
|
||||
{ 9, "Bombchu", "ITEM_BOMBCHU"},
|
||||
{ 10, "Hookshot", "ITEM_HOOKSHOT"},
|
||||
{ 11, "Longshot", "ITEM_LONGSHOT"},
|
||||
{ 12, "Ice Arrow", "ITEM_ARROW_ICE"},
|
||||
{ 13, "Farore's Wind", "ITEM_FARORES_WIND"},
|
||||
{ 14, "Boomerang", "ITEM_BOOMERANG"},
|
||||
{ 15, "Lens of Truth", "ITEM_LENS"},
|
||||
{ 16, "Magic Bean", "ITEM_BEAN"},
|
||||
{ 17, "Megaton Hammer", "ITEM_HAMMER"},
|
||||
{ 18, "Light Arrow", "ITEM_ARROW_LIGHT"},
|
||||
{ 19, "Nayru's Love", "ITEM_NAYRUS_LOVE"},
|
||||
{ 20, "Empty Bottle", "ITEM_BOTTLE"},
|
||||
{ 21, "Red Potion", "ITEM_POTION_RED"},
|
||||
{ 22, "Green Potion", "ITEM_POTION_GREEN"},
|
||||
{ 23, "Blue Potion", "ITEM_POTION_BLUE"},
|
||||
{ 24, "Bottled Fairy", "ITEM_FAIRY"},
|
||||
{ 25, "Fish", "ITEM_FISH"},
|
||||
{ 26, "Lon Lon Milk & Bottle", "ITEM_MILK_BOTTLE"},
|
||||
{ 27, "Ruto's Letter", "ITEM_LETTER_RUTO"},
|
||||
{ 28, "Blue Fire", "ITEM_BLUE_FIRE"},
|
||||
{ 29, "Bug", "ITEM_BUG"},
|
||||
{ 30, "Big Poe", "ITEM_BIG_POE"},
|
||||
{ 32, "Poe", "ITEM_POE"},
|
||||
{ 33, "Weird Egg", "ITEM_WEIRD_EGG"},
|
||||
{ 34, "Chicken", "ITEM_CHICKEN"},
|
||||
{ 35, "Zelda's Letter", "ITEM_LETTER_ZELDA"},
|
||||
{ 36, "Keaton Mask", "ITEM_MASK_KEATON"},
|
||||
{ 37, "Skull Mask", "ITEM_MASK_SKULL"},
|
||||
{ 38, "Spooky Mask", "ITEM_MASK_SPOOKY"},
|
||||
{ 39, "Bunny Hood", "ITEM_MASK_BUNNY"},
|
||||
{ 40, "Goron Mask", "ITEM_MASK_GORON"},
|
||||
{ 41, "Zora Mask", "ITEM_MASK_ZORA"},
|
||||
{ 42, "Gerudo Mask", "ITEM_MASK_GERUDO"},
|
||||
{ 43, "Mask of Truth", "ITEM_MASK_TRUTH"},
|
||||
{ 45, "Pocket Egg", "ITEM_POCKET_EGG"},
|
||||
{ 46, "Pocket Cucco", "ITEM_POCKET_CUCCO"},
|
||||
{ 47, "Cojiro", "ITEM_COJIRO"},
|
||||
{ 48, "Odd Mushroom", "ITEM_ODD_MUSHROOM"},
|
||||
{ 49, "Odd Potion", "ITEM_ODD_POTION"},
|
||||
{ 50, "Poacher's Saw", "ITEM_SAW"},
|
||||
{ 51, "Goron's Sword (Broken)", "ITEM_SWORD_BROKEN"},
|
||||
{ 52, "Prescription", "ITEM_PRESCRIPTION"},
|
||||
{ 53, "Eyeball Frog", "ITEM_FROG"},
|
||||
{ 54, "Eye Drops", "ITEM_EYEDROPS"},
|
||||
{ 55, "Claim Check", "ITEM_CLAIM_CHECK"},
|
||||
{ 59, "Kokiri Sword", "ITEM_SWORD_KOKIRI"},
|
||||
{ 60, "Master Sword", "ITEM_SWORD_MASTER"},
|
||||
{ 61, "Giant's Knife & Biggoron's Sword", "ITEM_SWORD_BGS"},
|
||||
{ 62, "Deku Shield", "ITEM_SHIELD_DEKU"},
|
||||
{ 63, "Hylian Shield", "ITEM_SHIELD_HYLIAN"},
|
||||
{ 64, "Mirror Shield", "ITEM_SHIELD_MIRROR"},
|
||||
{ 65, "Kokiri Tunic", "ITEM_TUNIC_KOKIRI"},
|
||||
{ 66, "Goron Tunic", "ITEM_TUNIC_GORON"},
|
||||
{ 67, "Zora Tunic", "ITEM_TUNIC_ZORA"},
|
||||
{ 68, "Kokiri Boots", "ITEM_BOOTS_KOKIRI"},
|
||||
{ 69, "Iron Boots", "ITEM_BOOTS_IRON"},
|
||||
{ 70, "Hover Boots", "ITEM_BOOTS_HOVER"},
|
||||
{ 71, "Bullet Bag (30)", "ITEM_BULLET_BAG_30"},
|
||||
{ 72, "Bullet Bag (40)", "ITEM_BULLET_BAG_40"},
|
||||
{ 73, "Bullet Bag (50)", "ITEM_BULLET_BAG_50"},
|
||||
{ 74, "Quiver (30)", "ITEM_QUIVER_30"},
|
||||
{ 75, "Big Quiver (40)", "ITEM_QUIVER_40"},
|
||||
{ 76, "Biggest Quiver (50)", "ITEM_QUIVER_50"},
|
||||
{ 77, "Bomb Bag (20)", "ITEM_BOMB_BAG_20"},
|
||||
{ 78, "Big Bomb Bag (30)", "ITEM_BOMB_BAG_30"},
|
||||
{ 79, "Biggest Bomb Bag (40)", "ITEM_BOMB_BAG_40"},
|
||||
{ 80, "Goron's Bracelet", "ITEM_BRACELET"},
|
||||
{ 81, "Silver Gauntlets", "ITEM_GAUNTLETS_SILVER"},
|
||||
{ 82, "Golden Gauntlets", "ITEM_GAUNTLETS_GOLD"},
|
||||
{ 83, "Silver Scale", "ITEM_SCALE_SILVER"},
|
||||
{ 84, "Golden Scale", "ITEM_SCALE_GOLDEN"},
|
||||
{ 85, "Giant's Knife (Broken)", "ITEM_SWORD_KNIFE"},
|
||||
{ 86, "Adult's Wallet", "ITEM_WALLET_ADULT"},
|
||||
{ 87, "Giant's Wallet", "ITEM_WALLET_GIANT"},
|
||||
{ 89, "Fishing Pole", "ITEM_FISHING_POLE"},
|
||||
{ 90, "Minuet of Forest", "QUEST_SONG_MINUET"},
|
||||
{ 91, "Bolero of Fire", "QUEST_SONG_BOLERO"},
|
||||
{ 92, "Serenade of Water", "QUEST_SONG_SERENADE"},
|
||||
{ 93, "Requiem of Spirit", "QUEST_SONG_REQUIEM"},
|
||||
{ 94, "Nocturne of Shadow", "QUEST_SONG_NOCTURNE"},
|
||||
{ 95, "Prelude of Light", "QUEST_SONG_PRELUDE"},
|
||||
{ 96, "Zelda's Lullaby", "QUEST_SONG_LULLABY"},
|
||||
{ 97, "Epona's Song", "QUEST_SONG_EPONA"},
|
||||
{ 98, "Saria's Song", "QUEST_SONG_SARIA"},
|
||||
{ 99, "Sun's Song", "QUEST_SONG_SUN"},
|
||||
{ 100, "Song of Time", "QUEST_SONG_TIME"},
|
||||
{ 101, "Song of Storms", "QUEST_SONG_STORMS"},
|
||||
{ 102, "Forest Medallion", "QUEST_MEDALLION_FOREST"},
|
||||
{ 103, "Fire Medallion", "QUEST_MEDALLION_FIRE"},
|
||||
{ 104, "Water Medallion", "QUEST_MEDALLION_WATER"},
|
||||
{ 105, "Spirit Medallion", "QUEST_MEDALLION_SPIRIT"},
|
||||
{ 106, "Shadow Medallion", "QUEST_MEDALLION_SHADOW"},
|
||||
{ 107, "Light Medallion", "QUEST_MEDALLION_LIGHT"},
|
||||
{ 108, "Kokiri's Emerald", "QUEST_KOKIRI_EMERALD"},
|
||||
{ 109, "Goron's Ruby", "QUEST_GORON_RUBY"},
|
||||
{ 110, "Zora's Sapphire", "QUEST_ZORA_SAPPHIRE"},
|
||||
{ 111, "Stone of Agony", "QUEST_STONE_OF_AGONY"},
|
||||
{ 112, "Gerudo's Card", "QUEST_GERUDO_CARD"},
|
||||
{ 123, "Magic Meter", "ITEM_MAGIC_SMALL"},
|
||||
{ 124, "Double Magic Meter", "ITEM_MAGIC_LARGE"},
|
||||
{ 125, "Double Defense", "ITEM_HEART_CONTAINER"},
|
||||
{ 152, "Deku Stick Upgrade (20)", "ITEM_STICK"},
|
||||
{ 153, "Deku Stick Upgrade (30)", "ITEM_STICK"},
|
||||
{ 154, "Deku Nut Upgrade (30)", "ITEM_NUT"},
|
||||
{ 155, "Deku Nut Upgrade (40)", "ITEM_NUT"},
|
||||
{ 657, "Queen Gohma", "RG_TRIFORCE_PIECE"},
|
||||
{ 658, "King Dodongo", "RG_TRIFORCE_PIECE"},
|
||||
{ 659, "Barinade", "RG_TRIFORCE_PIECE"},
|
||||
{ 660, "Phantom Ganon", "RG_TRIFORCE_PIECE"},
|
||||
{ 661, "Volvagia", "RG_TRIFORCE_PIECE"},
|
||||
{ 662, "Morpha", "RG_TRIFORCE_PIECE"},
|
||||
{ 663, "Bongo Bongo", "RG_TRIFORCE_PIECE"},
|
||||
{ 664, "Twinrova", "RG_TRIFORCE_PIECE"},
|
||||
{ 665, "Ganondorf", "RG_TRIFORCE_PIECE"},
|
||||
{ 666, "Ganon", "RG_TRIFORCE_PIECE"},
|
||||
// ID, Item Name Image Name
|
||||
{ ITEM_STICK, "Deku Stick", "ITEM_STICK"},
|
||||
{ ITEM_NUT, "Deku Nut", "ITEM_NUT"},
|
||||
{ ITEM_BOW, "Fairy Bow", "ITEM_BOW"},
|
||||
{ ITEM_ARROW_FIRE, "Fire Arrow", "ITEM_ARROW_FIRE"},
|
||||
{ ITEM_DINS_FIRE, "Din's Fire", "ITEM_DINS_FIRE"},
|
||||
{ ITEM_SLINGSHOT, "Fairy Slingshot", "ITEM_SLINGSHOT"},
|
||||
{ ITEM_OCARINA_FAIRY, "Fairy Ocarina", "ITEM_OCARINA_FAIRY"},
|
||||
{ ITEM_OCARINA_TIME, "Ocarina of Time", "ITEM_OCARINA_TIME"},
|
||||
{ ITEM_BOMBCHU, "Bombchu", "ITEM_BOMBCHU"},
|
||||
{ ITEM_HOOKSHOT, "Hookshot", "ITEM_HOOKSHOT"},
|
||||
{ ITEM_LONGSHOT, "Longshot", "ITEM_LONGSHOT"},
|
||||
{ ITEM_ARROW_ICE, "Ice Arrow", "ITEM_ARROW_ICE"},
|
||||
{ ITEM_FARORES_WIND, "Farore's Wind", "ITEM_FARORES_WIND"},
|
||||
{ ITEM_BOOMERANG, "Boomerang", "ITEM_BOOMERANG"},
|
||||
{ ITEM_LENS, "Lens of Truth", "ITEM_LENS"},
|
||||
{ ITEM_BEAN, "Magic Bean", "ITEM_BEAN"},
|
||||
{ ITEM_HAMMER, "Megaton Hammer", "ITEM_HAMMER"},
|
||||
{ ITEM_ARROW_LIGHT, "Light Arrow", "ITEM_ARROW_LIGHT"},
|
||||
{ ITEM_NAYRUS_LOVE, "Nayru's Love", "ITEM_NAYRUS_LOVE"},
|
||||
{ ITEM_BOTTLE, "Empty Bottle", "ITEM_BOTTLE"},
|
||||
{ ITEM_POTION_RED, "Red Potion", "ITEM_POTION_RED"},
|
||||
{ ITEM_POTION_GREEN, "Green Potion", "ITEM_POTION_GREEN"},
|
||||
{ ITEM_POTION_BLUE, "Blue Potion", "ITEM_POTION_BLUE"},
|
||||
{ ITEM_FAIRY, "Bottled Fairy", "ITEM_FAIRY"},
|
||||
{ ITEM_FISH, "Fish", "ITEM_FISH"},
|
||||
{ ITEM_MILK_BOTTLE, "Lon Lon Milk & Bottle", "ITEM_MILK_BOTTLE"},
|
||||
{ ITEM_LETTER_RUTO, "Ruto's Letter", "ITEM_LETTER_RUTO"},
|
||||
{ ITEM_BLUE_FIRE, "Blue Fire", "ITEM_BLUE_FIRE"},
|
||||
{ ITEM_BUG, "Bug", "ITEM_BUG"},
|
||||
{ ITEM_BIG_POE, "Big Poe", "ITEM_BIG_POE"},
|
||||
{ ITEM_POE, "Poe", "ITEM_POE"},
|
||||
{ ITEM_WEIRD_EGG, "Weird Egg", "ITEM_WEIRD_EGG"},
|
||||
{ ITEM_CHICKEN, "Chicken", "ITEM_CHICKEN"},
|
||||
{ ITEM_LETTER_ZELDA, "Zelda's Letter", "ITEM_LETTER_ZELDA"},
|
||||
{ ITEM_MASK_KEATON, "Keaton Mask", "ITEM_MASK_KEATON"},
|
||||
{ ITEM_MASK_SKULL, "Skull Mask", "ITEM_MASK_SKULL"},
|
||||
{ ITEM_MASK_SPOOKY, "Spooky Mask", "ITEM_MASK_SPOOKY"},
|
||||
{ ITEM_MASK_BUNNY, "Bunny Hood", "ITEM_MASK_BUNNY"},
|
||||
{ ITEM_MASK_GORON, "Goron Mask", "ITEM_MASK_GORON"},
|
||||
{ ITEM_MASK_ZORA, "Zora Mask", "ITEM_MASK_ZORA"},
|
||||
{ ITEM_MASK_GERUDO, "Gerudo Mask", "ITEM_MASK_GERUDO"},
|
||||
{ ITEM_MASK_TRUTH, "Mask of Truth", "ITEM_MASK_TRUTH"},
|
||||
{ ITEM_POCKET_EGG, "Pocket Egg", "ITEM_POCKET_EGG"},
|
||||
{ ITEM_POCKET_CUCCO, "Pocket Cucco", "ITEM_POCKET_CUCCO"},
|
||||
{ ITEM_COJIRO, "Cojiro", "ITEM_COJIRO"},
|
||||
{ ITEM_ODD_MUSHROOM, "Odd Mushroom", "ITEM_ODD_MUSHROOM"},
|
||||
{ ITEM_ODD_POTION, "Odd Potion", "ITEM_ODD_POTION"},
|
||||
{ ITEM_SAW, "Poacher's Saw", "ITEM_SAW"},
|
||||
{ ITEM_SWORD_BROKEN, "Goron's Sword (Broken)", "ITEM_SWORD_BROKEN"},
|
||||
{ ITEM_PRESCRIPTION, "Prescription", "ITEM_PRESCRIPTION"},
|
||||
{ ITEM_FROG, "Eyeball Frog", "ITEM_FROG"},
|
||||
{ ITEM_EYEDROPS, "Eye Drops", "ITEM_EYEDROPS"},
|
||||
{ ITEM_CLAIM_CHECK, "Claim Check", "ITEM_CLAIM_CHECK"},
|
||||
{ ITEM_SWORD_KOKIRI, "Kokiri Sword", "ITEM_SWORD_KOKIRI"},
|
||||
{ ITEM_SWORD_MASTER, "Master Sword", "ITEM_SWORD_MASTER"},
|
||||
{ ITEM_SWORD_BGS, "Giant's Knife & Biggoron's Sword", "ITEM_SWORD_BGS"},
|
||||
{ ITEM_SHIELD_DEKU, "Deku Shield", "ITEM_SHIELD_DEKU"},
|
||||
{ ITEM_SHIELD_HYLIAN, "Hylian Shield", "ITEM_SHIELD_HYLIAN"},
|
||||
{ ITEM_SHIELD_MIRROR, "Mirror Shield", "ITEM_SHIELD_MIRROR"},
|
||||
{ ITEM_TUNIC_GORON, "Goron Tunic", "ITEM_TUNIC_GORON"},
|
||||
{ ITEM_TUNIC_ZORA, "Zora Tunic", "ITEM_TUNIC_ZORA"},
|
||||
{ ITEM_BOOTS_IRON, "Iron Boots", "ITEM_BOOTS_IRON"},
|
||||
{ ITEM_BOOTS_HOVER, "Hover Boots", "ITEM_BOOTS_HOVER"},
|
||||
{ ITEM_BULLET_BAG_30, "Bullet Bag (30)", "ITEM_BULLET_BAG_30"},
|
||||
{ ITEM_BULLET_BAG_40, "Bullet Bag (40)", "ITEM_BULLET_BAG_40"},
|
||||
{ ITEM_BULLET_BAG_50, "Bullet Bag (50)", "ITEM_BULLET_BAG_50"},
|
||||
{ ITEM_QUIVER_30, "Quiver (30)", "ITEM_QUIVER_30"},
|
||||
{ ITEM_QUIVER_40, "Big Quiver (40)", "ITEM_QUIVER_40"},
|
||||
{ ITEM_QUIVER_50, "Biggest Quiver (50)", "ITEM_QUIVER_50"},
|
||||
{ ITEM_BOMB_BAG_20, "Bomb Bag (20)", "ITEM_BOMB_BAG_20"},
|
||||
{ ITEM_BOMB_BAG_30, "Big Bomb Bag (30)", "ITEM_BOMB_BAG_30"},
|
||||
{ ITEM_BOMB_BAG_40, "Biggest Bomb Bag (40)", "ITEM_BOMB_BAG_40"},
|
||||
{ ITEM_BRACELET, "Goron's Bracelet", "ITEM_BRACELET"},
|
||||
{ ITEM_GAUNTLETS_SILVER, "Silver Gauntlets", "ITEM_GAUNTLETS_SILVER"},
|
||||
{ ITEM_GAUNTLETS_GOLD, "Golden Gauntlets", "ITEM_GAUNTLETS_GOLD"},
|
||||
{ ITEM_SCALE_SILVER, "Silver Scale", "ITEM_SCALE_SILVER"},
|
||||
{ ITEM_SCALE_GOLDEN, "Golden Scale", "ITEM_SCALE_GOLDEN"},
|
||||
{ ITEM_SWORD_KNIFE, "Giant's Knife (Broken)", "ITEM_SWORD_KNIFE"},
|
||||
{ ITEM_WALLET_ADULT, "Adult's Wallet", "ITEM_WALLET_ADULT"},
|
||||
{ ITEM_WALLET_GIANT, "Giant's Wallet", "ITEM_WALLET_GIANT"},
|
||||
{ ITEM_FISHING_POLE, "Fishing Pole", "ITEM_FISHING_POLE"},
|
||||
{ ITEM_SONG_MINUET, "Minuet of Forest", "QUEST_SONG_MINUET"},
|
||||
{ ITEM_SONG_BOLERO, "Bolero of Fire", "QUEST_SONG_BOLERO"},
|
||||
{ ITEM_SONG_SERENADE, "Serenade of Water", "QUEST_SONG_SERENADE"},
|
||||
{ ITEM_SONG_REQUIEM, "Requiem of Spirit", "QUEST_SONG_REQUIEM"},
|
||||
{ ITEM_SONG_NOCTURNE, "Nocturne of Shadow", "QUEST_SONG_NOCTURNE"},
|
||||
{ ITEM_SONG_PRELUDE, "Prelude of Light", "QUEST_SONG_PRELUDE"},
|
||||
{ ITEM_SONG_LULLABY, "Zelda's Lullaby", "QUEST_SONG_LULLABY"},
|
||||
{ ITEM_SONG_EPONA, "Epona's Song", "QUEST_SONG_EPONA"},
|
||||
{ ITEM_SONG_SARIA, "Saria's Song", "QUEST_SONG_SARIA"},
|
||||
{ ITEM_SONG_SUN, "Sun's Song", "QUEST_SONG_SUN"},
|
||||
{ ITEM_SONG_TIME, "Song of Time", "QUEST_SONG_TIME"},
|
||||
{ ITEM_SONG_STORMS, "Song of Storms", "QUEST_SONG_STORMS"},
|
||||
{ ITEM_MEDALLION_FOREST, "Forest Medallion", "QUEST_MEDALLION_FOREST"},
|
||||
{ ITEM_MEDALLION_FIRE, "Fire Medallion", "QUEST_MEDALLION_FIRE"},
|
||||
{ ITEM_MEDALLION_WATER, "Water Medallion", "QUEST_MEDALLION_WATER"},
|
||||
{ ITEM_MEDALLION_SPIRIT, "Spirit Medallion", "QUEST_MEDALLION_SPIRIT"},
|
||||
{ ITEM_MEDALLION_SHADOW, "Shadow Medallion", "QUEST_MEDALLION_SHADOW"},
|
||||
{ ITEM_MEDALLION_LIGHT, "Light Medallion", "QUEST_MEDALLION_LIGHT"},
|
||||
{ ITEM_KOKIRI_EMERALD, "Kokiri's Emerald", "QUEST_KOKIRI_EMERALD"},
|
||||
{ ITEM_GORON_RUBY, "Goron's Ruby", "QUEST_GORON_RUBY"},
|
||||
{ ITEM_ZORA_SAPPHIRE, "Zora's Sapphire", "QUEST_ZORA_SAPPHIRE"},
|
||||
{ ITEM_STONE_OF_AGONY, "Stone of Agony", "QUEST_STONE_OF_AGONY"},
|
||||
{ ITEM_GERUDO_CARD, "Gerudo's Card", "QUEST_GERUDO_CARD"},
|
||||
{ ITEM_MAGIC_SMALL, "Magic Meter", "ITEM_MAGIC_SMALL"},
|
||||
{ ITEM_MAGIC_LARGE, "Double Magic Meter", "ITEM_MAGIC_LARGE"},
|
||||
{ ITEM_DOUBLE_DEFENSE, "Double Defense", "ITEM_HEART_CONTAINER"},
|
||||
{ ITEM_STICK_UPGRADE_20, "Deku Stick Upgrade (20)", "ITEM_STICK"},
|
||||
{ ITEM_STICK_UPGRADE_30, "Deku Stick Upgrade (30)", "ITEM_STICK"},
|
||||
{ ITEM_NUT_UPGRADE_30, "Deku Nut Upgrade (30)", "ITEM_NUT"},
|
||||
{ ITEM_NUT_UPGRADE_40, "Deku Nut Upgrade (40)", "ITEM_NUT"},
|
||||
{ 657, "Queen Gohma", "SPECIAL_TRIFORCE_PIECE_WHITE"},
|
||||
{ 658, "King Dodongo", "SPECIAL_TRIFORCE_PIECE_WHITE"},
|
||||
{ 659, "Barinade", "SPECIAL_TRIFORCE_PIECE_WHITE"},
|
||||
{ 660, "Phantom Ganon", "SPECIAL_TRIFORCE_PIECE_WHITE"},
|
||||
{ 661, "Volvagia", "SPECIAL_TRIFORCE_PIECE_WHITE"},
|
||||
{ 662, "Morpha", "SPECIAL_TRIFORCE_PIECE_WHITE"},
|
||||
{ 663, "Bongo Bongo", "SPECIAL_TRIFORCE_PIECE_WHITE"},
|
||||
{ 664, "Twinrova", "SPECIAL_TRIFORCE_PIECE_WHITE"},
|
||||
{ 665, "Ganondorf", "SPECIAL_TRIFORCE_PIECE_WHITE"},
|
||||
{ 666, "Ganon", "SPECIAL_TRIFORCE_PIECE_WHITE"},
|
||||
};
|
||||
|
||||
std::string formatTimestampTimeSplit(uint32_t value) {
|
||||
|
@ -219,27 +221,28 @@ void TimeSplitSplitsHandler(GetItemEntry itemEntry) {
|
|||
}
|
||||
|
||||
void DrawTimeSplitOptions() {
|
||||
if (ImGui::Button("Reset List")) {
|
||||
splitItem.clear();
|
||||
splitTime.clear();
|
||||
splitStatus.clear();
|
||||
splitPreviousBest.clear();
|
||||
status = "List has been reset";
|
||||
statusColor = COLOR_RED;
|
||||
}
|
||||
ImGui::Text("List Name");
|
||||
ImGui::SameLine(0);
|
||||
ImGui::PushItemWidth(165.0f);
|
||||
ImGui::InputText("##List Name", textBuffer, sizeof(textBuffer));
|
||||
ImGui::PopItemWidth();
|
||||
if (ImGui::Button("Save List")) {
|
||||
json j;
|
||||
j["splitItem"] = splitItem;
|
||||
j["splitTime"] = splitTime;
|
||||
j["splitPreviousBest"] = splitPreviousBest;
|
||||
j["backgroundColor.r"] = colorChoice.x;
|
||||
j["backgroundColor.g"] = colorChoice.y;
|
||||
j["backgroundColor.b"] = colorChoice.z;
|
||||
j["backgroundColor.a"] = colorChoice.w;
|
||||
std::ofstream file("splitdata.json");
|
||||
file << j.dump(4);
|
||||
file.close();
|
||||
std::ifstream existingFile("splitdata.json");
|
||||
json existingData;
|
||||
existingFile >> existingData;
|
||||
existingFile.close();
|
||||
|
||||
existingData[textBuffer]["splitItem"] = splitItem;
|
||||
existingData[textBuffer]["splitTime"] = splitTime;
|
||||
existingData[textBuffer]["splitPreviousBest"] = splitPreviousBest;
|
||||
existingData[textBuffer]["backgroundColor.r"] = colorChoice.x;
|
||||
existingData[textBuffer]["backgroundColor.g"] = colorChoice.y;
|
||||
existingData[textBuffer]["backgroundColor.b"] = colorChoice.z;
|
||||
existingData[textBuffer]["backgroundColor.a"] = colorChoice.w;
|
||||
|
||||
std::ofstream newFile("splitdata.json");
|
||||
newFile << existingData.dump(4);
|
||||
newFile.close();
|
||||
status = "List has been saved to disk";
|
||||
statusColor = COLOR_LIGHT_BLUE;
|
||||
}
|
||||
|
@ -252,31 +255,59 @@ void DrawTimeSplitOptions() {
|
|||
file >> j;
|
||||
file.close();
|
||||
}
|
||||
int itemSize = j["splitItem"].size();
|
||||
if (j[textBuffer]["splitItem"].size() > 0) {
|
||||
splitItem.clear();
|
||||
splitTime.clear();
|
||||
splitPreviousBest.clear();
|
||||
splitBest.clear();
|
||||
splitStatus.clear();
|
||||
|
||||
for (int i = 0; i < j[textBuffer]["splitItem"].size(); i++) {
|
||||
splitItem.push_back(0);
|
||||
splitTime.push_back(0);
|
||||
splitPreviousBest.push_back(0);
|
||||
splitBest.push_back(100000);
|
||||
splitStatus.push_back(0);
|
||||
}
|
||||
splitItem = j[textBuffer]["splitItem"].get<std::vector<uint32_t>>();
|
||||
splitTime = j[textBuffer]["splitTime"].get<std::vector<uint32_t>>();
|
||||
splitPreviousBest = j[textBuffer]["splitPreviousBest"].get<std::vector<uint32_t>>();
|
||||
colorChoice.x = j[textBuffer]["backgroundColor.r"];
|
||||
colorChoice.y = j[textBuffer]["backgroundColor.g"];
|
||||
colorChoice.z = j[textBuffer]["backgroundColor.b"];
|
||||
colorChoice.w = j[textBuffer]["backgroundColor.a"];
|
||||
file.close();
|
||||
status = "List has been loaded from Save Data";
|
||||
statusColor = COLOR_LIGHT_BLUE;
|
||||
} else {
|
||||
status = "List does not exist in Save Data";
|
||||
statusColor = COLOR_RED;
|
||||
}
|
||||
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("Reset List")) {
|
||||
splitItem.clear();
|
||||
splitTime.clear();
|
||||
splitPreviousBest.clear();
|
||||
splitBest.clear();
|
||||
splitStatus.clear();
|
||||
|
||||
for (int i = 0; i < itemSize; i++) {
|
||||
splitItem.push_back(0);
|
||||
splitTime.push_back(0);
|
||||
splitPreviousBest.push_back(0);
|
||||
splitBest.push_back(100000);
|
||||
splitStatus.push_back(0);
|
||||
}
|
||||
splitItem = j["splitItem"].get<std::vector<uint32_t>>();
|
||||
splitTime = j["splitTime"].get<std::vector<uint32_t>>();
|
||||
splitPreviousBest = j["splitPreviousBest"].get<std::vector<uint32_t>>();
|
||||
colorChoice.x = j["backgroundColor.r"];
|
||||
colorChoice.y = j["backgroundColor.g"];
|
||||
colorChoice.z = j["backgroundColor.b"];
|
||||
colorChoice.w = j["backgroundColor.a"];
|
||||
file.close();
|
||||
status = "List has been loaded from Save Data";
|
||||
statusColor = COLOR_LIGHT_BLUE;
|
||||
splitPreviousBest.clear();
|
||||
status = "List has been reset";
|
||||
statusColor = COLOR_RED;
|
||||
}
|
||||
UIWidgets::Spacer(0);
|
||||
ImGui::Text("Background Color");
|
||||
if (ImGui::ColorEdit4("Background Color", (float*)&colorChoice, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) {
|
||||
Color_RGBA8 color;
|
||||
color.r = colorChoice.x;
|
||||
color.g = colorChoice.y;
|
||||
color.b = colorChoice.z;
|
||||
color.a = colorChoice.w;
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("Reset")) {
|
||||
colorChoice = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||
}
|
||||
UIWidgets::Spacer(0);
|
||||
if (ImGui::Button("New Attempt")) {
|
||||
splitStatus.clear();
|
||||
splitTime.clear();
|
||||
|
@ -299,37 +330,59 @@ void DrawTimeSplitOptions() {
|
|||
}
|
||||
}
|
||||
}
|
||||
UIWidgets::Spacer(0);
|
||||
ImGui::Text("Background Color");
|
||||
if (ImGui::ColorEdit4("Background Color", (float*)&colorChoice, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel)) {
|
||||
Color_RGBA8 color;
|
||||
color.r = colorChoice.x;
|
||||
color.g = colorChoice.y;
|
||||
color.b = colorChoice.z;
|
||||
color.a = colorChoice.w;
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("Reset")) {
|
||||
colorChoice = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||
}
|
||||
ImGui::TextColored(statusColor, status.c_str());
|
||||
UIWidgets::PaddedSeparator();
|
||||
}
|
||||
|
||||
void TimeSplitColorTint() {
|
||||
switch (itemNum) {
|
||||
case 657:
|
||||
pieceTint = COLOR_LIGHT_GREEN;
|
||||
break;
|
||||
case 658:
|
||||
pieceTint = COLOR_LIGHT_RED;
|
||||
break;
|
||||
case 659:
|
||||
pieceTint = COLOR_LIGHT_BLUE;
|
||||
break;
|
||||
case 660:
|
||||
pieceTint = COLOR_GREEN;
|
||||
break;
|
||||
case 661:
|
||||
pieceTint = COLOR_RED;
|
||||
break;
|
||||
case 662:
|
||||
pieceTint = COLOR_BLUE;
|
||||
break;
|
||||
case 663:
|
||||
pieceTint = COLOR_PURPLE;
|
||||
break;
|
||||
case 664:
|
||||
pieceTint = COLOR_ORANGE;
|
||||
break;
|
||||
case 665:
|
||||
pieceTint = COLOR_GREY;
|
||||
break;
|
||||
case 666:
|
||||
pieceTint = COLOR_YELLOW;
|
||||
break;
|
||||
default:
|
||||
pieceTint = COLOR_WHITE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DrawTimeSplitSplits(){
|
||||
uint32_t loopCounter = 0;
|
||||
uint32_t buttonID = 0;
|
||||
if (ImGui::CollapsingHeader("Time Splitter")) {
|
||||
DrawTimeSplitOptions();
|
||||
}
|
||||
|
||||
totalPreviousBest = 0;
|
||||
for (int i = 0; i < splitItem.size(); i++) {
|
||||
totalPreviousBest += splitPreviousBest[i];
|
||||
}
|
||||
|
||||
uint32_t loopCounter = 0;
|
||||
uint32_t buttonID = 0;
|
||||
ImGui::TextColored(COLOR_YELLOW, (splitAttempt).c_str());
|
||||
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(4, 0));
|
||||
ImGui::BeginTable("Splits", 5, ImGuiTableFlags_Hideable | ImGuiTableFlags_Reorderable);
|
||||
ImGui::TableSetupColumn("Item Image", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHeaderLabel, 27.0f);
|
||||
|
@ -338,53 +391,71 @@ void DrawTimeSplitSplits(){
|
|||
ImGui::TableSetupColumn("+/-", ImGuiTableColumnFlags_WidthFixed, 80.0f);
|
||||
ImGui::TableSetupColumn("Prev. Best", ImGuiTableColumnFlags_WidthFixed, 90.0f);
|
||||
ImGui::TableHeadersRow();
|
||||
|
||||
for (auto& str : splitItem) {
|
||||
ImGui::TableNextColumn();
|
||||
|
||||
// Item Image
|
||||
for (const auto& obj : splitObjects) {
|
||||
if (obj.itemID == splitItem[loopCounter]) {
|
||||
itemNum = obj.itemID;
|
||||
itemImager = obj.itemImage;
|
||||
itemNamer = obj.itemName;
|
||||
}
|
||||
}
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.0f, 0.0f, 0.0f, 0.0f));
|
||||
ImGui::ImageButton(std::to_string(buttonID).c_str(), LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemImager), ImVec2(26.0f, 26.0f), ImVec2(0, 0), ImVec2(1, 1));
|
||||
ImGui::PopStyleColor();
|
||||
|
||||
if (ImGui::IsItemActive()) {
|
||||
ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0, ImGui::GetColorU32(ImGuiCol_HeaderHovered));
|
||||
static ImVec2 mousePos = ImGui::GetMousePos();
|
||||
float curPos = ImGui::GetMousePos().y;
|
||||
if (ImGui::IsMouseDragging(0)) {
|
||||
ImVec2 dragDelta = ImGui::GetMouseDragDelta(0);
|
||||
int direction = (dragDelta.y < 0.0f) ? -1 : 1;
|
||||
int nextIndex = loopCounter + direction;
|
||||
if (ImGui::GetMousePos().y >= mousePos.y + 27.4f || ImGui::GetMousePos().y <= mousePos.y - 27.4f) {
|
||||
ImGui::ResetMouseDragDelta(0);
|
||||
mousePos = ImGui::GetMousePos();
|
||||
if (nextIndex >= 0 && nextIndex < splitItem.size()) {
|
||||
uint32_t itemTemp = splitItem[loopCounter];
|
||||
uint32_t timeTemp = splitTime[loopCounter];
|
||||
uint32_t bestTemp = splitBest[loopCounter];
|
||||
uint32_t prevTemp = splitPreviousBest[loopCounter];
|
||||
uint32_t statusTemp = splitStatus[loopCounter];
|
||||
splitItem[loopCounter] = splitItem[nextIndex];
|
||||
splitTime[loopCounter] = splitTime[nextIndex];
|
||||
splitBest[loopCounter] = splitBest[nextIndex];
|
||||
splitPreviousBest[loopCounter] = splitPreviousBest[nextIndex];
|
||||
splitStatus[loopCounter] = splitStatus[nextIndex];
|
||||
splitItem[nextIndex] = itemTemp;
|
||||
splitTime[nextIndex] = timeTemp;
|
||||
splitBest[nextIndex] = bestTemp;
|
||||
splitPreviousBest[nextIndex] - prevTemp;
|
||||
splitStatus[nextIndex] = statusTemp;
|
||||
}
|
||||
if (obj.itemImage == "SPECIAL_TRIFORCE_PIECE_WHITE") {
|
||||
TimeSplitColorTint();
|
||||
}
|
||||
}
|
||||
}
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.0f, 0.0f, 0.0f, 0.0f));
|
||||
ImGui::ImageButton(std::to_string(buttonID).c_str(), LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(itemImager),
|
||||
ImVec2(26.0f, 26.0f), ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), pieceTint);
|
||||
ImGui::PopStyleColor();
|
||||
if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) {
|
||||
ImGui::SetDragDropPayload("DragMove", &buttonID, sizeof(uint32_t));
|
||||
|
||||
ImGui::Text("Move %s", itemNamer.c_str());
|
||||
ImGui::EndDragDropSource();
|
||||
}
|
||||
if (ImGui::BeginDragDropTarget()) {
|
||||
if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DragMove")) {
|
||||
IM_ASSERT(payload->DataSize == sizeof(uint32_t));
|
||||
int nextIndex = *(const int*)payload->Data;
|
||||
uint32_t draggedItem = splitItem[nextIndex];
|
||||
uint32_t draggedTime = splitTime[nextIndex];
|
||||
uint32_t draggedBest = splitBest[nextIndex];
|
||||
uint32_t draggedPreviousBest = splitPreviousBest[nextIndex];
|
||||
uint32_t draggedStatus = splitStatus[nextIndex];
|
||||
if (loopCounter < nextIndex) {
|
||||
int v = 0;
|
||||
int o = nextIndex - v - 1;
|
||||
for (int i = loopCounter + 1; i < nextIndex + 1; ++i) {
|
||||
splitItem[nextIndex - v] = splitItem[o];
|
||||
splitTime[nextIndex - v] = splitTime[o];
|
||||
splitBest[nextIndex - v] = splitBest[o];
|
||||
splitPreviousBest[nextIndex - v] = splitPreviousBest[o];
|
||||
splitStatus[nextIndex - v] = splitStatus[o];
|
||||
v++;
|
||||
o--;
|
||||
}
|
||||
} else {
|
||||
int v = 0;
|
||||
int o = nextIndex + v + 1;
|
||||
for (int i = loopCounter - 1; i > nextIndex - 1; i--) {
|
||||
splitItem[nextIndex + v] = splitItem[o];
|
||||
splitTime[nextIndex + v] = splitTime[o];
|
||||
splitBest[nextIndex + v] = splitBest[o];
|
||||
splitPreviousBest[nextIndex + v] = splitPreviousBest[o];
|
||||
splitStatus[nextIndex + v] = splitStatus[o];
|
||||
v++;
|
||||
o++;
|
||||
}
|
||||
}
|
||||
splitItem[loopCounter] = draggedItem;
|
||||
splitTime[loopCounter] = draggedTime;
|
||||
splitBest[loopCounter] = draggedBest;
|
||||
splitPreviousBest[loopCounter] = draggedPreviousBest;
|
||||
splitStatus[loopCounter] = draggedStatus;
|
||||
}
|
||||
ImGui::EndDragDropTarget();
|
||||
}
|
||||
ImGui::TableNextColumn();
|
||||
// Item Name
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 5.0f));
|
||||
|
@ -433,12 +504,20 @@ void DrawTimeSplitSplits(){
|
|||
}
|
||||
ImGui::EndTable();
|
||||
ImGui::PopStyleVar(1);
|
||||
|
||||
UIWidgets::PaddedSeparator();
|
||||
ImGui::SetCursorPosX(ImGui::GetWindowWidth() -
|
||||
ImGui::CalcTextSize(formatTimestampTimeSplit(GAMEPLAYSTAT_TOTAL_TIME).c_str()).x -
|
||||
ImGui::CalcTextSize(formatTimestampTimeSplit(totalPreviousBest).c_str()).x - 60);
|
||||
ImGui::Text(formatTimestampTimeSplit(GAMEPLAYSTAT_TOTAL_TIME).c_str());
|
||||
ImGui::SameLine();
|
||||
ImGui::Text(" / ");
|
||||
ImGui::SameLine();
|
||||
ImGui::Text(formatTimestampTimeSplit(totalPreviousBest).c_str());
|
||||
if (splitItem.size() > 0) {
|
||||
uint32_t lastIndex = splitItem.size() - 1;
|
||||
ImGui::Text(formatTimestampTimeSplit(splitTime[lastIndex]).c_str());
|
||||
} else {
|
||||
ImGui::Text(formatTimestampTimeSplit(totalPreviousBest).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void InitializeSplitFile() {
|
||||
|
@ -464,7 +543,15 @@ void DrawTimeSplitManageList() {
|
|||
ImGui::TableNextColumn();
|
||||
uint32_t buttonID = 0;
|
||||
for (const auto& obj : splitObjects) {
|
||||
if (ImGui::ImageButton(std::to_string(buttonID).c_str(), LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(obj.itemImage), ImVec2(24.0f, 24.0f), ImVec2(0, 0), ImVec2(1, 1))) {
|
||||
if (obj.itemImage == "SPECIAL_TRIFORCE_PIECE_WHITE") {
|
||||
itemNum = obj.itemID;
|
||||
TimeSplitColorTint();
|
||||
} else {
|
||||
pieceTint = { 1, 1, 1, 1 };
|
||||
}
|
||||
if (ImGui::ImageButton(std::to_string(buttonID).c_str(),
|
||||
LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(obj.itemImage),
|
||||
ImVec2(24.0f, 24.0f), ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), pieceTint)) {
|
||||
splitItem.push_back(obj.itemID);
|
||||
splitTime.push_back(0);
|
||||
splitPreviousBest.push_back(0);
|
||||
|
@ -497,7 +584,6 @@ void TimeSplitWindow::DrawElement() {
|
|||
}
|
||||
ImGui::BeginTabBar("Split Tabs");
|
||||
if (ImGui::BeginTabItem("Splits")) {
|
||||
status = "";
|
||||
DrawTimeSplitSplits();
|
||||
ImGui::EndTabItem();
|
||||
}
|
||||
|
@ -515,6 +601,9 @@ void TimeSplitWindow::DrawElement() {
|
|||
}
|
||||
|
||||
void TimeSplitWindow::InitElement() {
|
||||
LUS::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("SPECIAL_TRIFORCE_PIECE_WHITE", gWTriforcePieceTex, ImVec4(1, 1, 1, 1));
|
||||
//LUS::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("DPAD_MINUS", gDPadMinusTex, ImVec4(1, 1, 1, 1));
|
||||
LUS::Context::GetInstance()->GetWindow()->GetGui()->LoadGuiTexture("DPAD_PLUS", gDPadTex, ImVec4(1, 1, 1, 1));
|
||||
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnItemReceive>([](GetItemEntry itemEntry) {
|
||||
TimeSplitSplitsHandler(itemEntry);
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue