From 37131d7b108583008db9aa719f4a188f711eb366 Mon Sep 17 00:00:00 2001 From: Caladius Date: Sat, 2 Mar 2024 16:31:34 -0500 Subject: [PATCH] - --- .../gWTriforcePiece.rgba32.png | Bin 0 -> 1486 bytes soh/assets/soh_assets.h | 2 + .../Enhancements/timesplits/TimeSplits.cpp | 537 ++++++++++-------- 3 files changed, 315 insertions(+), 224 deletions(-) create mode 100644 soh/assets/custom/textures/parameter_static/gWTriforcePiece.rgba32.png diff --git a/soh/assets/custom/textures/parameter_static/gWTriforcePiece.rgba32.png b/soh/assets/custom/textures/parameter_static/gWTriforcePiece.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..dfdd947f551c32dd167e85bf79bee896aa817157 GIT binary patch literal 1486 zcmV;<1u^=GP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vG?BLDy{BLR4&KXw2B1!GA>K~z{r?N>`| z8&wp&_RQGh8GCHkP1?q85-2HYQUPkasX&4v(W>1e1Qiks5G+8fx`GOc6+fw{hy_Im zRxCheS0PmbAt4o|ZThE;(zCPSao9BobY~k)P)G-aF@hXKd?q zI`AlAw~mht>k^R3yQX!XH07X$sqodn?7~MYni6}bft*Je+CJ)TaCO+u2J0l*C3~rAb$-Pjm zR=qPb@%PW3|NB&{Ww@-VJ+W#5YPmWdxs^I%v)RFBvw>G}Lm&_Uj^j{71r`_8T{os8 zpIOs;V$}jJT%7vG>-7koP8)Q+4nD68qA0?aEd$VMHKA6kK_r@bH<`-5Y%N(4s}e95 zNxa2z{IhiKa0nm>9284c2o40m>2yM0|0WcmL95wJoNag^S%gNl{Xf&a!)nIF=4`fLKNs`esD5BMpC(d2_rB^;Yw1BDbtz&LkRzwlW zaX6gYodlG?EXh>*u?I%>KO`Nc9577A?!x7&^3X+Rs3_0r|(6Qxpl%-Zq}^c0Xv=RVZ6 z+7n(yV#HK>_`?>4i|sb%1wn8iF%S8Cfdn%z4GsozQU|@$rs|OXnz(Y3jA5HD!-@hh zi^mhm+!4hiG0Pb_J+PW53F1)zd4Q^b=HzlEc1>%BhX+|Mkf?H58$Eme>Irk@ZLBC@ zHj?@l8F@((O{)>a-RUYokQZ1ea8Q_Z>;si*ja~bFZU_dcKNw6zJf1l`I~RY$TFUT1 z0qIQs?P9UKcLQ$1z?hL5N4sqfIw!Am1@IUK8ktNUEpM@Bfq()Y#e)J`OvvQq^{pwK35c(H5*2X!@#U2OK4DrlL(3lB_0!i9&k9!L|w=h**sdScsx)n zE@DV4=$*3k`yUf0sZS8seFe~z9h4R2G zOCo3II0(7yA|w(SNG2oT^=?2f0$ z-d-Z1QZ%!&dw=qk$j^`ey+U{C+ zo79f3wLt@u%e1m9;x;J}kYlI;MWYcs)?pwx#F~-U>(lqY^ul|G4(>aIC99e%aJA`5 zz<0Sm9=;j7EIJ+Ba*N0dYFWpAzX0>;B&ekVjEz4H+ee0QRW~FZ6lPH0fK)02vFI!a z4kz1};=VN$I``tfy|4RxN|@bTh9v>9_`=8Ka^)ylSI0LTepui;Acu`51NFL&Z$BAi z*%cYw8azET6#6X?@Yga6`5)0ZH|2+h-v;6EO)Z&>+Wh`LN2OA%i=xc$+5Oa~yLavU z2#qm`?!q14gw<+o5B7AwVKj5~T0P*B8;)Nss~i13Uj#4FP@93HZ9eUd obqiQ8?&$;nHvSjzUl#!I4;WvzDY1oMy8r+H07*qoM6N<$g7g-trT_o{ literal 0 HcmV?d00001 diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h index d8f771ea0..973b54f46 100644 --- a/soh/assets/soh_assets.h +++ b/soh/assets/soh_assets.h @@ -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; diff --git a/soh/soh/Enhancements/timesplits/TimeSplits.cpp b/soh/soh/Enhancements/timesplits/TimeSplits.cpp index 4f345cbaf..f015f05e3 100644 --- a/soh/soh/Enhancements/timesplits/TimeSplits.cpp +++ b/soh/soh/Enhancements/timesplits/TimeSplits.cpp @@ -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 splitTime; static std::vector splitBest; static std::vector splitPreviousBest; static std::vector 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 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>(); + splitTime = j[textBuffer]["splitTime"].get>(); + splitPreviousBest = j[textBuffer]["splitPreviousBest"].get>(); + 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>(); - splitTime = j["splitTime"].get>(); - splitPreviousBest = j["splitPreviousBest"].get>(); - 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([](GetItemEntry itemEntry) { TimeSplitSplitsHandler(itemEntry); });