diff --git a/.gitignore b/.gitignore index 7cdd2de5..6a9a0b37 100644 --- a/.gitignore +++ b/.gitignore @@ -334,3 +334,6 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ +/KhTracker/Images/ReportTest3.png +/KhTracker/Images/ReportTest2.png +/KhTracker/Images/ReportTest1.png diff --git a/KhTracker/App.config b/KhTracker/App.config index 9b5f7950..9b2ee32d 100644 --- a/KhTracker/App.config +++ b/KhTracker/App.config @@ -1,12 +1,12 @@ - + -
+
- + @@ -43,59 +43,191 @@ True - - True - True - - 0 - - - 0 - 570 880 - - 500 - - - 680 - True True - + + False + + + True + + + True + + False - + + True + + False - + + True + + False - + + True + + False - + + 0 + + + False + + + True + + + True + + + False + + + True + + + False + + + False + + + False + + + True + + + False + + + True + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + True + + + True + + + True + + + True + + + True + + True + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + False + + + False + + + True + + + False + + + False + + + True + + + False + + + False + - - + + - \ No newline at end of file + diff --git a/KhTracker/App.xaml b/KhTracker/App.xaml index 6224880f..729c0591 100644 --- a/KhTracker/App.xaml +++ b/KhTracker/App.xaml @@ -6,9 +6,15 @@ Exit="App_Exit"> - pack://application:,,,/Fonts/#HVD Comic Serif Pro + pack://application:,,,/Fonts/#HVD Comic Serif Pro + pack://application:,,,/Fonts/#KHGummi + pack://application:,,,/Fonts/#KHMenu + pack://application:,,,/Fonts/#KHIcon - + + + + diff --git a/KhTracker/App.xaml.cs b/KhTracker/App.xaml.cs index fd7c956d..ac77e910 100644 --- a/KhTracker/App.xaml.cs +++ b/KhTracker/App.xaml.cs @@ -1,9 +1,4 @@ using System; -using System.Collections.Generic; -using System.Configuration; -using System.Data; -using System.Linq; -using System.Threading.Tasks; using System.Windows; namespace KhTracker @@ -34,7 +29,7 @@ private void App_Exit(object sender, ExitEventArgs e) void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { - (MainWindow as MainWindow).Save("kh2fm-tracker-autosave.txt"); + (MainWindow as MainWindow).Save("KhTrackerAutoSaves\\" + "Tracker-CrashBackup_" + DateTime.Now.ToString("yy-MM-dd_H-m") + ".tsv"); } } } diff --git a/KhTracker/AutoTracking/Ability.cs b/KhTracker/AutoTracking/Ability.cs index eaff1f10..492f10aa 100644 --- a/KhTracker/AutoTracking/Ability.cs +++ b/KhTracker/AutoTracking/Ability.cs @@ -66,11 +66,13 @@ public override byte[] UpdateMemory() } int curLevel = convertedData - levelOffset - equipped; - if (curLevel > Level) + //if (curLevel > Level) { Level = curLevel; - if (App.logger != null) - App.logger.Record(Name + " level " + Level.ToString() + " obtained"); + if (curLevel > Level) + App.logger?.Record(Name + " level " + Level.ToString() + " obtained"); + else if (curLevel < Level) + App.logger?.Record(Name + " level " + Level.ToString() + " removed"); } } else diff --git a/KhTracker/AutoTracking/AutoTracker.cs b/KhTracker/AutoTracking/AutoTracker.cs index 7d2ba613..2f076e8a 100644 --- a/KhTracker/AutoTracking/AutoTracker.cs +++ b/KhTracker/AutoTracking/AutoTracker.cs @@ -16,6 +16,10 @@ using System.Windows.Threading; using System.ComponentModel; using System.Runtime.InteropServices; +using System.Collections; +using System.Security.Cryptography; +using System.IO; +//using System.IO; namespace KhTracker { @@ -24,10 +28,11 @@ namespace KhTracker /// public partial class MainWindow : Window { - MemoryReader memory; + #region Variables + MemoryReader memory;//, testMemory; private Int32 ADDRESS_OFFSET; - private static DispatcherTimer aTimer; + private static DispatcherTimer aTimer, checkTimer; private List importantChecks; private Ability highJump; private Ability quickRun; @@ -43,7 +48,11 @@ public partial class MainWindow : Window private DriveForm master; private DriveForm limit; private DriveForm final; - + private DriveForm anti; + + private DriveForm finalReal; + private DriveForm valorReal; + private Magic fire; private Magic blizzard; private Magic thunder; @@ -51,29 +60,11 @@ public partial class MainWindow : Window private Magic reflect; private Magic cure; - private Report rep1; - private Report rep2; - private Report rep3; - private Report rep4; - private Report rep5; - private Report rep6; - private Report rep7; - private Report rep8; - private Report rep9; - private Report rep10; - private Report rep11; - private Report rep12; - private Report rep13; - - private Summon chickenLittle; - private Summon stitch; - private Summon genie; - private Summon peterPan; - - private ImportantCheck promiseCharm; - private ImportantCheck peace; - private ImportantCheck nonexist; - private ImportantCheck connection; + private Report reportItem; + private Summon charmItem; + private ImportantCheck proofItem; + private ImportantCheck visitItem; + private ImportantCheck extraItem; private TornPage pages; @@ -92,25 +83,169 @@ public partial class MainWindow : Window private int magnetLevel; private int tornPageCount; - private bool forcedFinal; private CheckEveryCheck checkEveryCheck; - public void InitPCSX2Tracker(object sender, RoutedEventArgs e) + private bool pcFilesLoaded = false; + + public static bool pcsx2tracking = false; //game version + private bool onContinue = false; //for death counter + private bool eventInProgress = false; //boss detection + + //private int lastVersion = 0; + + private int[] temp = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + private int[] tempPre = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + #endregion + + /// + /// Autotracking Startup + /// + + public void StartHotkey() + { + if (data.usedHotkey) + return; + + data.usedHotkey = true; + InitTracker(null, null); + //int vercheck = CheckVersion(); + //if (vercheck == 1) + //{ + // InitAutoTracker(true); + // return; + //} + //else if (vercheck == 2) + //{ + // InitAutoTracker(false); + // return; + //} + //else + //{ + // MessageBox.Show("No game detected.\nPlease start KH2 before using Hotkey."); + // data.usedHotkey = false; + //} + } + + //buttons merged so no need for both of these anymore + //public void InitPCSX2Tracker(object sender, RoutedEventArgs e) + //{ + // pcsx2tracking = true; + // InitAutoTracker(true); + //} + // + //public void InitPCTracker(object sender, RoutedEventArgs e) + //{ + // pcsx2tracking = false; + // InitAutoTracker(false); + //} + + public void InitTracker(object sender, RoutedEventArgs e) + { + if (aTimer != null && aTimer.IsEnabled) + { + return; + } + + InitTracker(); + } + + private void InitTracker() { - InitAutoTracker(true); + //connection trying visual + Connect.Visibility = Visibility.Visible; + Connect2.Visibility = Visibility.Collapsed; + + //check timer already running! + if (checkTimer != null && checkTimer.IsEnabled) + return; + + //reset timer if already running + aTimer?.Stop(); + + //start timer for checking game version + checkTimer = new DispatcherTimer(); + checkTimer.Tick += InitSearch; + checkTimer.Interval = new TimeSpan(0, 0, 0, 2, 5); + checkTimer.Start(); } - public void InitPCTracker(object sender, RoutedEventArgs e) + public void InitSearch(object sender, EventArgs e) { - InitAutoTracker(false); + //NOTE: connected version + //0 = none | 1 = ps2 | 2 = pc + int checkedVer = CheckVersion(); + + if (checkedVer == 0) //no game was detected. + { + //return and keep trying to connect if auto-connect is enabled. + if (AutoConnectOption.IsChecked) + { + return; + } + else + { + Connect.Visibility = Visibility.Collapsed; + Connect2.Visibility = Visibility.Visible; + Connect2.Source = data.AD_Cross; + checkTimer.Stop(); + checkTimer = null; + memory = null; + if(data.usedHotkey) + { + MessageBox.Show("No game detected.\nPlease start KH2 before using Hotkey."); + data.usedHotkey = false; + } + else + MessageBox.Show("Please start KH2 before starting the Auto Tracker."); + } + } + else + { + //if for some reason user starts playing an different version + if (data.lastVersion !=0 && data.lastVersion != checkedVer) + { + //reset tracker + OnReset(null, null); + } + + //stop timer for checking game version + if (checkTimer!= null) + { + checkTimer.Stop(); + checkTimer = null; + } + + //set correct connect visual + if (data.lastVersion == 1) + { + //Console.WriteLine("PCSX2 Found, starting Auto-Tracker"); + Connect2.Source = data.AD_PS2; + } + else + { + //Console.WriteLine("PC Found, starting Auto-Tracker"); + Connect2.Source = data.AD_PCred; + } + + //make visual visible + Connect.Visibility = Visibility.Collapsed; + Connect2.Visibility = Visibility.Visible; + + //finally start auto-tracking process + InitAutoTracker(pcsx2tracking); + } } - public void InitAutoTracker(bool PCSX2) + public int CheckVersion() { + bool pcsx2Success = true; + bool pcSuccess = true; int tries = 0; + + //check emulator do { - memory = new MemoryReader(PCSX2); + memory = new MemoryReader(true); if (tries < 20) { tries++; @@ -118,21 +253,63 @@ public void InitAutoTracker(bool PCSX2) else { memory = null; - MessageBox.Show("Please start KH2 before loading the Auto Tracker."); - return; + //Console.WriteLine("No PCSX2 Version Detected"); + pcsx2Success = false; + break; + } + } while (!memory.Hooked); + if (pcsx2Success) + { + pcsx2tracking = true; + if (data.lastVersion == 0) + data.lastVersion = 1; + return 1; + } + + //check pc now + tries = 0; + do + { + memory = new MemoryReader(false); + if (tries < 20) + { + tries++; + } + else + { + memory = null; + //Console.WriteLine("No PC Version Detected"); + pcSuccess = false; + break; } } while (!memory.Hooked); + if (pcSuccess) + { + pcsx2tracking = false; + if (data.lastVersion == 0) + data.lastVersion = 2; + return 2; + } + + //no version found + return 0; + } + public async void InitAutoTracker(bool PCSX2) + { // PC Address anchors int Now = 0x0714DB8; int Save = 0x09A70B0; - int Sys3 = 0x2A59DF0; - int Bt10 = 0x2A74880; + int Sys3 = 0x0; //old base address 0x2A59DF0; + int Bt10 = 0x0; //old base address 0x2A74880; int BtlEnd = 0x2A0D3E0; int Slot1 = 0x2A20C98; + int NextSlot = 0x278; - if (PCSX2 == false) + if (!PCSX2) { + Connect2.Source = data.AD_PCred; + try { CheckPCOffset(); @@ -140,44 +317,127 @@ public void InitAutoTracker(bool PCSX2) catch (Win32Exception) { memory = null; + Connect2.Source = data.AD_Cross; MessageBox.Show("Unable to access KH2FM try running KHTracker as admin"); return; } catch { memory = null; + Connect2.Source = data.AD_Cross; MessageBox.Show("Error connecting to KH2FM"); return; } + + + //Connect2.Source = data.AD_PCred; + //Connect.Visibility = Visibility.Collapsed; + //Connect2.Visibility = Visibility.Visible; + //check for if the system files are loaded + //this helps ensure that ICs on levels/drives don't mistrack + while (!pcFilesLoaded) + { + Sys3 = ReadPcPointer(0x2AE3550); + Bt10 = ReadPcPointer(0x2AE3558); + pcFilesLoaded = CheckPCLoaded(Sys3, Bt10); + await Task.Delay(100); + } + + FinishSetup(PCSX2, Now, Save, Sys3, Bt10, BtlEnd, Slot1, NextSlot); } else { try { - findAddressOffset(); + CheckPS2Offset(); } catch (Win32Exception) { memory = null; + Connect2.Source = data.AD_Cross; MessageBox.Show("Unable to access PCSX2 try running KHTracker as admin"); return; } catch { memory = null; + Connect2.Source = data.AD_Cross; MessageBox.Show("Error connecting to PCSX2"); return; } - + // PCSX2 anchors Now = 0x032BAE0; Save = 0x032BB30; - Sys3 = 0x1CCB300; - Bt10 = 0x1CE5D80; + Sys3 = ReadMemInt(0x1C61AF8); //old base address 0x1CCB300; + Bt10 = ReadMemInt(0x1C61AFC); //old base address 0x1CE5D80; BtlEnd = 0x1D490C0; Slot1 = 0x1C6C750; + NextSlot = 0x268; + + FinishSetup(PCSX2, Now, Save, Sys3, Bt10, BtlEnd, Slot1, NextSlot); + } + } + + private void CheckPS2Offset() + { + bool found = false; + Int32 offset = 0x00000000; + Int32 testAddr = 0x0032EE36; + string good = "F680"; + while (!found) + { + string tester = BytesToHex(memory.ReadMemory(testAddr + offset, 2)); + if (tester == "Service not started. Waiting for PCSX2") + { + break; + } + else if (tester == good) + { + found = true; + } + else + { + offset += 0x10000000; + } + } + ADDRESS_OFFSET = offset; + } + + private void CheckPCOffset() + { + Int32 testAddr = 0x009AA376 - 0x1000; + string good = "F680"; + string tester = BytesToHex(memory.ReadMemory(testAddr, 2)); + if (tester == good) + { + ADDRESS_OFFSET = -0x1000; + } + } + + private bool CheckPCLoaded(int system3, int battle0) + { + //Testchecks if these files have been loaded into memeory + string testS = ReadMemString(system3, 3); + string testB = ReadMemString(battle0, 3); + + //Console.WriteLine("sys: " + testS); + //Console.WriteLine("btl: " + testB); + + if (testB == testS && testS == "BAR") + { + //all important files loaded + Connect2.Source = data.AD_PC; + return true; } + //Console.WriteLine("Not yet"); + return false; + } + + private void FinishSetup(bool PCSX2, Int32 Now, Int32 Save, Int32 Sys3, Int32 Bt10, Int32 BtlEnd, Int32 Slot1, Int32 NextSlot) + { + #region Add ICs importantChecks = new List(); importantChecks.Add(highJump = new Ability(memory, Save + 0x25CE, ADDRESS_OFFSET, 93, "HighJump")); importantChecks.Add(quickRun = new Ability(memory, Save + 0x25D0, ADDRESS_OFFSET, 97, "QuickRun")); @@ -187,13 +447,26 @@ public void InitAutoTracker(bool PCSX2) importantChecks.Add(secondChance = new Ability(memory, Save + 0x2544, ADDRESS_OFFSET, "SecondChance", Save)); importantChecks.Add(onceMore = new Ability(memory, Save + 0x2544, ADDRESS_OFFSET, "OnceMore", Save)); - - importantChecks.Add(valor = new DriveForm(memory, Save + 0x36C0, ADDRESS_OFFSET, 1, Save + 0x32F6, Save + 0x06B2, "Valor")); + importantChecks.Add(wisdom = new DriveForm(memory, Save + 0x36C0, ADDRESS_OFFSET, 2, Save + 0x332E, "Wisdom")); importantChecks.Add(limit = new DriveForm(memory, Save + 0x36CA, ADDRESS_OFFSET, 3, Save + 0x3366, "Limit")); importantChecks.Add(master = new DriveForm(memory, Save + 0x36C0, ADDRESS_OFFSET, 6, Save + 0x339E, "Master")); - importantChecks.Add(final = new DriveForm(memory, Save + 0x36C0, ADDRESS_OFFSET, 4, Save + 0x33D6, "Final")); + importantChecks.Add(anti = new DriveForm(memory, Save + 0x36C0, ADDRESS_OFFSET, 5, Save + 0x340C, "Anti")); + + if (!data.altFinalTracking) + { + importantChecks.Add(valor = new DriveForm(memory, Save + 0x36C0, ADDRESS_OFFSET, 1, Save + 0x32F6, Save + 0x06B2, "Valor")); + importantChecks.Add(final = new DriveForm(memory, Save + 0x36C0, ADDRESS_OFFSET, 4, Save + 0x33D6, "Final")); + } + else + { + importantChecks.Add(valor = new DriveForm(memory, Save + 0x36C0, ADDRESS_OFFSET, 7, Save + 0x32F6, "Valor")); + importantChecks.Add(final = new DriveForm(memory, Save + 0x36C2, ADDRESS_OFFSET, 1, Save + 0x33D6, "Final")); + importantChecks.Add(finalReal = new DriveForm(memory, Save + 0x36C0, ADDRESS_OFFSET, 4, Save + 0x33D6, "FinalReal")); + importantChecks.Add(valorReal = new DriveForm(memory, Save + 0x36C0, ADDRESS_OFFSET, 1, Save + 0x32F6, Save + 0x06B2, "ValorReal")); + } + int fireCount = fire != null ? fire.Level : 0; int blizzardCount = blizzard != null ? blizzard.Level : 0; int thunderCount = thunder != null ? thunder.Level : 0; @@ -215,171 +488,97 @@ public void InitAutoTracker(bool PCSX2) magnet.Level = magnetCount; reflect.Level = reflectCount; - importantChecks.Add(rep1 = new Report(memory, Save + 0x36C4, ADDRESS_OFFSET, 6, "Report1")); - importantChecks.Add(rep2 = new Report(memory, Save + 0x36C4, ADDRESS_OFFSET, 7, "Report2")); - importantChecks.Add(rep3 = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 0, "Report3")); - importantChecks.Add(rep4 = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 1, "Report4")); - importantChecks.Add(rep5 = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 2, "Report5")); - importantChecks.Add(rep6 = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 3, "Report6")); - importantChecks.Add(rep7 = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 4, "Report7")); - importantChecks.Add(rep8 = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 5, "Report8")); - importantChecks.Add(rep9 = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 6, "Report9")); - importantChecks.Add(rep10 = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 7, "Report10")); - importantChecks.Add(rep11 = new Report(memory, Save + 0x36C6, ADDRESS_OFFSET, 0, "Report11")); - importantChecks.Add(rep12 = new Report(memory, Save + 0x36C6, ADDRESS_OFFSET, 1, "Report12")); - importantChecks.Add(rep13 = new Report(memory, Save + 0x36C6, ADDRESS_OFFSET, 2, "Report13")); - - importantChecks.Add(chickenLittle = new Summon(memory, Save + 0x36C0, ADDRESS_OFFSET, 3, "Baseball")); - importantChecks.Add(stitch = new Summon(memory, Save + 0x36C0, ADDRESS_OFFSET, 0, "Ukulele")); - importantChecks.Add(genie = new Summon(memory, Save + 0x36C4, ADDRESS_OFFSET, 4, "Lamp")); - importantChecks.Add(peterPan = new Summon(memory, Save + 0x36C4, ADDRESS_OFFSET, 5, "Feather")); - - importantChecks.Add(promiseCharm = new Proof(memory, Save + 0x3694, ADDRESS_OFFSET, "PromiseCharm")); - importantChecks.Add(peace = new Proof(memory, Save + 0x36B4, ADDRESS_OFFSET, "Peace")); - importantChecks.Add(nonexist = new Proof(memory, Save + 0x36B3, ADDRESS_OFFSET, "Nonexistence")); - importantChecks.Add(connection = new Proof(memory, Save + 0x36B2, ADDRESS_OFFSET, "Connection")); - + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C4, ADDRESS_OFFSET, 6, "Report1")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C4, ADDRESS_OFFSET, 7, "Report2")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 0, "Report3")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 1, "Report4")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 2, "Report5")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 3, "Report6")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 4, "Report7")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 5, "Report8")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 6, "Report9")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C5, ADDRESS_OFFSET, 7, "Report10")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C6, ADDRESS_OFFSET, 0, "Report11")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C6, ADDRESS_OFFSET, 1, "Report12")); + importantChecks.Add(reportItem = new Report(memory, Save + 0x36C6, ADDRESS_OFFSET, 2, "Report13")); + + importantChecks.Add(charmItem = new Summon(memory, Save + 0x36C0, ADDRESS_OFFSET, 3, "Baseball")); + importantChecks.Add(charmItem = new Summon(memory, Save + 0x36C0, ADDRESS_OFFSET, 0, "Ukulele")); + importantChecks.Add(charmItem = new Summon(memory, Save + 0x36C4, ADDRESS_OFFSET, 4, "Lamp")); + importantChecks.Add(charmItem = new Summon(memory, Save + 0x36C4, ADDRESS_OFFSET, 5, "Feather")); + + importantChecks.Add(proofItem = new Proof(memory, Save + 0x3694, ADDRESS_OFFSET, "PromiseCharm")); + importantChecks.Add(proofItem = new Proof(memory, Save + 0x36B4, ADDRESS_OFFSET, "Peace")); + importantChecks.Add(proofItem = new Proof(memory, Save + 0x36B3, ADDRESS_OFFSET, "Nonexistence")); + importantChecks.Add(proofItem = new Proof(memory, Save + 0x36B2, ADDRESS_OFFSET, "Connection")); + + importantChecks.Add(visitItem = new Visit(memory, Save + 0x35AE, ADDRESS_OFFSET, "AuronWep")); + importantChecks.Add(visitItem = new Visit(memory, Save + 0x35AF, ADDRESS_OFFSET, "MulanWep")); + importantChecks.Add(visitItem = new Visit(memory, Save + 0x35B3, ADDRESS_OFFSET, "BeastWep")); + importantChecks.Add(visitItem = new Visit(memory, Save + 0x35B4, ADDRESS_OFFSET, "JackWep")); + importantChecks.Add(visitItem = new Visit(memory, Save + 0x35B5, ADDRESS_OFFSET, "SimbaWep")); + importantChecks.Add(visitItem = new Visit(memory, Save + 0x35B6, ADDRESS_OFFSET, "SparrowWep")); + importantChecks.Add(visitItem = new Visit(memory, Save + 0x35C0, ADDRESS_OFFSET, "AladdinWep")); + importantChecks.Add(visitItem = new Visit(memory, Save + 0x35C2, ADDRESS_OFFSET, "TronWep")); + importantChecks.Add(visitItem = new Visit(memory, Save + 0x3643, ADDRESS_OFFSET, "MembershipCard")); + importantChecks.Add(visitItem = new Visit(memory, Save + 0x3649, ADDRESS_OFFSET, "IceCream")); + importantChecks.Add(visitItem = new Visit(memory, Save + 0x364A, ADDRESS_OFFSET, "Picture")); + + importantChecks.Add(extraItem = new Extra(memory, Save + 0x3696, ADDRESS_OFFSET, "HadesCup")); + importantChecks.Add(extraItem = new Extra(memory, Save + 0x3644, ADDRESS_OFFSET, "OlympusStone")); + importantChecks.Add(extraItem = new Extra(memory, Save + 0x365F, ADDRESS_OFFSET, "UnknownDisk")); + importantChecks.Add(extraItem = new Extra(memory, Save + 0x363C, ADDRESS_OFFSET, "MunnyPouch1")); + importantChecks.Add(extraItem = new Extra(memory, Save + 0x3695, ADDRESS_OFFSET, "MunnyPouch2")); + + //change this for flag checking to determine amount of pages? int count = pages != null ? pages.Quantity : 0; importantChecks.Add(pages = new TornPage(memory, Save + 0x3598, ADDRESS_OFFSET, "TornPage")); pages.Quantity = count; + #endregion + if (PCSX2) world = new World(memory, ADDRESS_OFFSET, Now, 0x00351EC8, Save + 0x1CFF); else world = new World(memory, ADDRESS_OFFSET, Now, BtlEnd + 0x820, Save + 0x1CFF); - stats = new Stats(memory, ADDRESS_OFFSET, Save + 0x24FE, Slot1 + 0x188, Save + 0x3524); + stats = new Stats(memory, ADDRESS_OFFSET, Save + 0x24FE, Slot1 + 0x188, Save + 0x3524, Save + 0x3700, NextSlot); rewards = new Rewards(memory, ADDRESS_OFFSET, Bt10); - forcedFinal = false; - checkEveryCheck = new CheckEveryCheck(memory, ADDRESS_OFFSET, Save, Sys3, Bt10, world, stats, rewards); + if(!data.altFinalTracking) + checkEveryCheck = new CheckEveryCheck(memory, ADDRESS_OFFSET, Save, Sys3, Bt10, world, stats, rewards, valor, wisdom, limit, master, final); + - LevelIcon.Visibility = Visibility.Visible; + // set stat info visibiliy Level.Visibility = Visibility.Visible; - StrengthIcon.Visibility = Visibility.Visible; Strength.Visibility = Visibility.Visible; - MagicIcon.Visibility = Visibility.Visible; Magic.Visibility = Visibility.Visible; - DefenseIcon.Visibility = Visibility.Visible; Defense.Visibility = Visibility.Visible; - Weapon.Visibility = Visibility.Visible; - - broadcast.LevelIcon.Visibility = Visibility.Visible; - broadcast.Level.Visibility = Visibility.Visible; - broadcast.StrengthIcon.Visibility = Visibility.Visible; - broadcast.Strength.Visibility = Visibility.Visible; - broadcast.MagicIcon.Visibility = Visibility.Visible; - broadcast.Magic.Visibility = Visibility.Visible; - broadcast.DefenseIcon.Visibility = Visibility.Visible; - broadcast.Defense.Visibility = Visibility.Visible; - broadcast.Weapon.Visibility = Visibility.Visible; - - broadcast.WorldRow.Height = new GridLength(6, GridUnitType.Star); - broadcast.GrowthAbilityRow.Height = new GridLength(1, GridUnitType.Star); - //FormRow.Height = new GridLength(0.65, GridUnitType.Star); + if (FormsGrowthOption.IsChecked) + FormRow.Height = new GridLength(0.5, GridUnitType.Star); + + //levelcheck visibility + NextLevelDisplay(); + DeathCounterDisplay(); SetBindings(); SetTimer(); - OnTimedEvent(null, null); - } - - private void CheckPCOffset() - { - Int32 testAddr = 0x009AA376 - 0x1000; - string good = "F680"; - string tester = BytesToHex(memory.ReadMemory(testAddr, 2)); - if (tester == good) - { - ADDRESS_OFFSET = -0x1000; - } - } - - private void findAddressOffset() - { - bool found = false; - Int32 offset = 0x00000000; - Int32 testAddr = 0x0032EE36; - string good = "F680"; - while (!found) - { - string tester = BytesToHex(memory.ReadMemory(testAddr + offset, 2)); - if (tester == "Service not started. Waiting for PCSX2") - { - break; - } - else if (tester == good) - { - found = true; - } - else - { - offset = offset + 0x10000000; - } - } - ADDRESS_OFFSET = offset; + //OnTimedEvent(null, null); } - private void SetBindings() - { - BindStats(Level, "Level", stats); - BindWeapon(Weapon, "Weapon", stats); - BindStats(Strength, "Strength", stats); - BindStats(Magic, "Magic", stats); - BindStats(Defense, "Defense", stats); - - BindLevel(broadcast.ValorLevel, "Level", valor); - BindLevel(broadcast.WisdomLevel, "Level", wisdom); - BindLevel(broadcast.LimitLevel, "Level", limit); - BindLevel(broadcast.MasterLevel, "Level", master); - BindLevel(broadcast.FinalLevel, "Level", final); - - BindAbility(broadcast.HighJump, "Obtained", highJump); - BindAbility(broadcast.QuickRun, "Obtained", quickRun); - BindAbility(broadcast.DodgeRoll, "Obtained", dodgeRoll); - BindAbility(broadcast.AerialDodge, "Obtained", aerialDodge); - BindAbility(broadcast.Glide, "Obtained", glide); - - BindAbilityLevel(broadcast.HighJumpLevel, "Level", highJump, new GrowthAbilityConverter()); - BindAbilityLevel(broadcast.QuickRunLevel, "Level", quickRun, new GrowthAbilityConverter()); - BindAbilityLevel(broadcast.DodgeRollLevel, "Level", dodgeRoll, new GrowthAbilityConverter()); - BindAbilityLevel(broadcast.AerialDodgeLevel, "Level", aerialDodge, new GrowthAbilityConverter()); - BindAbilityLevel(broadcast.GlideLevel, "Level", glide, new GrowthAbilityConverter()); - - //track in main window - BindAbility(HighJump, "Obtained", highJump); - BindAbility(QuickRun, "Obtained", quickRun); - BindAbility(DodgeRoll, "Obtained", dodgeRoll); - BindAbility(AerialDodge, "Obtained", aerialDodge); - BindAbility(Glide, "Obtained", glide); - - BindAbilityLevel(HighJumpLevel, "Level", highJump, new GrowthAbilityConverter()); - BindAbilityLevel(QuickRunLevel, "Level", quickRun, new GrowthAbilityConverter()); - BindAbilityLevel(DodgeRollLevel, "Level", dodgeRoll, new GrowthAbilityConverter()); - BindAbilityLevel(AerialDodgeLevel, "Level", aerialDodge, new GrowthAbilityConverter()); - BindAbilityLevel(GlideLevel, "Level", glide, new GrowthAbilityConverter()); - - BindLevel(ValorLevel, "Level", valor); - BindLevel(WisdomLevel, "Level", wisdom); - BindLevel(LimitLevel, "Level", limit); - BindLevel(MasterLevel, "Level", master); - BindLevel(FinalLevel, "Level", final); - - BindForm(ValorM, "Obtained", valor); - BindForm(WisdomM, "Obtained", wisdom); - BindForm(LimitM, "Obtained", limit); - BindForm(MasterM, "Obtained", master); - BindForm(FinalM, "Obtained", final); - } + /// + /// Autotracking general + /// private void SetTimer() { - if (aTimer != null) - aTimer.Stop(); - + aTimer?.Stop(); aTimer = new DispatcherTimer(); aTimer.Tick += OnTimedEvent; - aTimer.Interval = new TimeSpan(0, 0, 0, 0, 500); + aTimer.Interval = new TimeSpan(0, 0, 0, 0, 200); aTimer.Start(); + + data.wasTracking = true; } private void OnTimedEvent(object sender, EventArgs e) @@ -387,24 +586,120 @@ private void OnTimedEvent(object sender, EventArgs e) previousChecks.Clear(); previousChecks.AddRange(newChecks); newChecks.Clear(); + int correctSlot = 0; try { - stats.UpdateMemory(); - world.UpdateMemory(); - UpdateMagicAddresses(); - UpdateWorldProgress(world); + //current world + world.UpdateMemory(); + + //test displaying sora's correct stats for PR 1st forsed fight + if (world.worldNum == 16 && world.roomNumber == 1 && (world.eventID1 == 0x33 || world.eventID1 == 0x34)) + correctSlot = 2; //move forward this number of slots + //updates + stats.UpdateMemory(correctSlot); + HighlightWorld(world); + UpdateStatValues(); + UpdateWorldProgress(world, false, null); + UpdateFormProgression(); + DeathCheck(); + LevelsProgressionBonus(); + DrivesProgressionBonus(); + if (LevelValue.Text == "1" && StrengthValue.Text == "0" && MagicValue.Text == "0") + AddProgressionPoints(0); + + if (data.mode == Mode.PointsHints || data.ScoreMode) + { + UpdatePointScore(0); //update score + GetBoss(world, false, null); + } importantChecks.ForEach(delegate (ImportantCheck importantCheck) { importantCheck.UpdateMemory(); }); + + #region For Debugging + ////Modified to only update if any of these actually change instead of updating every tick + //temp[0] = world.roomNumber; + //temp[1] = world.worldNum; + //temp[2] = world.eventID1; + //temp[3] = world.eventID2; + //temp[4] = world.eventID3; + //temp[5] = world.eventComplete; + //temp[6] = world.cupRound; + //if (!Enumerable.SequenceEqual(temp, tempPre)) + //{ + // Console.WriteLine("world num = " + world.worldNum); + // Console.WriteLine("room num = " + world.roomNumber); + // Console.WriteLine("event id1 = " + world.eventID1); + // Console.WriteLine("event id2 = " + world.eventID2); + // Console.WriteLine("event id3 = " + world.eventID3); + // Console.WriteLine("event cpl = " + world.eventComplete); + // Console.WriteLine("Cup Round = " + world.cupRound); + // Console.WriteLine("==========================="); + // tempPre[0] = temp[0]; + // tempPre[1] = temp[1]; + // tempPre[2] = temp[2]; + // tempPre[3] = temp[3]; + // tempPre[4] = temp[4]; + // tempPre[5] = temp[5]; + // tempPre[6] = temp[6]; + //} + + //string cntrl = BytesToHex(memory.ReadMemory(0x2A148E8, 1)); //sora controlable + //Console.WriteLine(cntrl); + + //string tester = BytesToHex(memory.ReadMemory(0x2A22BC0, 4)); + //Console.WriteLine(tester); + + //int testint = BitConverter.ToInt32(memory.ReadMemory(0x2A22BC0, 4), 0); + //Console.WriteLine(testint); + //Console.WriteLine(testint+0x2A22BC0+0x10); + #endregion } catch { + aTimer.Stop(); - MessageBox.Show("KH2FM has exited. Stopping Auto Tracker."); + //aTimer = null; + pcFilesLoaded = false; + + if (AutoConnectOption.IsChecked) + { + InitTracker(); + } + else + { + Connect.Visibility = Visibility.Collapsed; + Connect2.Visibility = Visibility.Visible; + Connect2.Source = data.AD_Cross; + if (Disconnect.IsChecked) + { + MessageBox.Show("KH2FM has exited. Stopping Auto Tracker."); + } + data.usedHotkey = false; + } + + if(AutoSaveProgress2Option.IsChecked) + { + if (!Directory.Exists("KhTrackerAutoSaves")) + { + Directory.CreateDirectory("KhTrackerAutoSaves\\"); + } + Save("KhTrackerAutoSaves\\" + "ConnectionLost-Backup_" + DateTime.Now.ToString("yy-MM-dd_H-m") + ".tsv"); + } + + //reset currently highlighted world + if (WorldHighlightOption.IsChecked && world.previousworldName != null && data.WorldsData.ContainsKey(world.previousworldName)) + { + foreach (Rectangle Box in data.WorldsData[world.previousworldName].top.Children.OfType().Where(Box => Box.Name.EndsWith("SelWG"))) + { + Box.Visibility = Visibility.Collapsed; + } + } + return; } @@ -412,52 +707,188 @@ private void OnTimedEvent(object sender, EventArgs e) DetermineItemLocations(); } - private void TrackItem(string itemName, WorldGrid world) + private bool CheckSynthPuzzle() { - foreach (ContentControl item in ItemPool.Children) + if (pcsx2tracking) { - if (item.Name == itemName && item.IsVisible) + //reminder: FFFF = unloaded) + string Jounal = BytesToHex(memory.ReadMemory(0x035F144 + ADDRESS_OFFSET, 2)); //in journal + //reminder: FF = none | 01 = save menu | 03 = load menu | 05 = moogle | 07 = item popup | 08 = pause menu (cutscene/fight) | 0A = pause Menu (normal) + string menu = BytesToHex(memory.ReadMemory(0x035F2EC + ADDRESS_OFFSET, 2)); //in a menu + + if ((Jounal == "FFFF" && menu == "0500") || (Jounal != "FFFF" && menu == "0A00")) // in moogle shop / in puzzle menu { - if (world.Handle_Report(item as Item, this, data)) - { - world.Add_Item(item as Item, this); - if (App.logger != null) - App.logger.Record(item.Name + " tracked"); - } - break; + return true; + } + return false; + } + else + { + string Jounal = BytesToHex(memory.ReadMemory(0x741230, 2)); //in journal + //reminder: FF = none | 01 = save menu | 03 = load menu | 05 = moogle | 07 = item popup | 08 = pause menu (cutscene/fight) | 0A = pause Menu (normal) + string menu = BytesToHex(memory.ReadMemory(0x741320, 2)); //in a menu + + if ((Jounal == "FFFF" && menu == "0500") || (Jounal != "FFFF" && menu == "0A00")) // in moogle shop / in puzzle menu + { + return true; } + return false; } } - private void TrackQuantities() + //private bool CheckTornPage(Item item) + //{ + // //return true and track item for anything that isn't a torn page + // if (!item.Name.StartsWith("TornPage")) + // return true; + // + // int Tracked = WorldGrid.Real_Pages; //current number of pages tracked to any of the world grids + // int Inventory = memory.ReadMemory(ADDRESS_OFFSET + 0x09A70B0 + 0x3598, 1)[0]; //number of pages currently in sora's inventory + // int Used = 0; //number of torn pages used so far in 100 AW + // + // //don't try tracking a torn page if we already tracked 5 + // //as there should only ever be 5 total under normal means. + // if(Tracked >= 5) + // return false; + // + // //note: Save = 0x09A70B0; + // //check current 100 AW story flags to see what pages have been used already. + // if (new BitArray(memory.ReadMemory(ADDRESS_OFFSET + 0x09A70B0 + 0x1DB1, 1))[1]) //page 1 used flag + // Used = 1; + // if (new BitArray(memory.ReadMemory(ADDRESS_OFFSET + 0x09A70B0 + 0x1DB1, 1))[1]) //page 2 used flag + // Used = 2; + // if (new BitArray(memory.ReadMemory(ADDRESS_OFFSET + 0x09A70B0 + 0x1DB1, 1))[1]) //page 3 used flag + // Used = 3; + // if (new BitArray(memory.ReadMemory(ADDRESS_OFFSET + 0x09A70B0 + 0x1DB1, 1))[1]) //page 4 used flag + // Used = 4; + // + // //if number of torn pages used + current number of pages in sora's inventory + // //are equal to the current number of pages tracked, then don't track anything. + // if (Used + Inventory == Tracked) + // return false; + // + // return true; + //} + + private void DeathCheck() { - while (fire.Level > fireLevel) + //Note: 04 = dying, 05 = continue screen. + //note: if i try tracking a death when pausecheck is "0400" then that should give a + //more accurate death count in the event that continue is selected too fast (i hope) + + string PauseCheck; + + if (pcsx2tracking) { - ++fireLevel; - Magic magic = new Magic(null, 0, 0, 0, "Fire" + fireLevel.ToString()); - newChecks.Add(magic); - collectedChecks.Add(magic); + PauseCheck = BytesToHex(memory.ReadMemory(0x0347E08 + ADDRESS_OFFSET, 2)); } - while (blizzard.Level > blizzardLevel) + else { - ++blizzardLevel; - Magic magic = new Magic(null, 0, 0, 0, "Blizzard" + blizzardLevel.ToString()); - newChecks.Add(magic); - collectedChecks.Add(magic); + PauseCheck = BytesToHex(memory.ReadMemory(0xAB9078, 2)); } - while (thunder.Level > thunderLevel) + + //if oncontinue is true then we want to check if the values for sora is currently dying or on continue screen. + //we need to chck this to prevent the counter rapidly counting up every frame adnd such + if (onContinue) { - ++thunderLevel; - Magic magic = new Magic(null, 0, 0, 0, "Thunder" + thunderLevel.ToString()); - newChecks.Add(magic); - collectedChecks.Add(magic); + if (PauseCheck == "0400" || PauseCheck == "0500") + return; + else + onContinue = false; } - while (cure.Level > cureLevel) + + // if sora is currently dying or on the continue screen + // then increase death count and set oncontinue + if (PauseCheck == "0400" || PauseCheck == "0500") { - ++cureLevel; - Magic magic = new Magic(null, 0, 0, 0, "Cure" + cureLevel.ToString()); - newChecks.Add(magic); - collectedChecks.Add(magic); + DeathCounter++; + onContinue = true; + } + + DeathValue.Text = DeathCounter.ToString(); + } + + private void UpdateStatValues() + { + // we don't need bindings anymore (i think) so use this instead + + //Main window + //Stats + stats.SetNextLevelCheck(stats.Level); + LevelValue.Text = stats.Level.ToString(); + StrengthValue.Text = stats.Strength.ToString(); + MagicValue.Text = stats.Magic.ToString(); + DefenseValue.Text = stats.Defense.ToString(); + //forms + ValorLevel.Text = valor.VisualLevel.ToString(); + WisdomLevel.Text = wisdom.VisualLevel.ToString(); + LimitLevel.Text = limit.VisualLevel.ToString(); + MasterLevel.Text = master.VisualLevel.ToString(); + FinalLevel.Text = final.VisualLevel.ToString(); + //growth + HighJumpLevel.Text = highJump.Level.ToString(); + QuickRunLevel.Text = quickRun.Level.ToString(); + DodgeRollLevel.Text = dodgeRoll.Level.ToString(); + AerialDodgeLevel.Text = aerialDodge.Level.ToString(); + GlideLevel.Text = glide.Level.ToString(); + } + + private void TrackItem(string itemName, WorldGrid world) + { + Grid ItemRow; + try //try getting itemrow grid from dictionary + { + ItemRow = data.Items[itemName].Item2; + } + catch //if item is not from pool (growth) then log the item and return + { + App.logger?.Record(itemName + " tracked"); + return; + } + + //do a check in the report handler to actually make sure reports don't + //track to the wrong place in the case of mismatched seeds/hints + if (ItemRow.FindName(itemName) is Item item && item.IsVisible) + { + bool validItem = world.ReportHandler(item); + + if (validItem) + { + world.Add_Item(item); + App.logger?.Record(item.Name + " tracked"); + } + } + } + + private void TrackQuantities() + { + while (fire.Level > fireLevel) + { + ++fireLevel; + Magic magic = new Magic(null, 0, 0, 0, "Fire" + fireLevel.ToString()); + newChecks.Add(magic); + collectedChecks.Add(magic); + } + while (blizzard.Level > blizzardLevel) + { + ++blizzardLevel; + Magic magic = new Magic(null, 0, 0, 0, "Blizzard" + blizzardLevel.ToString()); + newChecks.Add(magic); + collectedChecks.Add(magic); + } + while (thunder.Level > thunderLevel) + { + ++thunderLevel; + Magic magic = new Magic(null, 0, 0, 0, "Thunder" + thunderLevel.ToString()); + newChecks.Add(magic); + collectedChecks.Add(magic); + } + while (cure.Level > cureLevel) + { + ++cureLevel; + Magic magic = new Magic(null, 0, 0, 0, "Cure" + cureLevel.ToString()); + newChecks.Add(magic); + collectedChecks.Add(magic); } while (reflect.Level > reflectLevel) { @@ -482,73 +913,955 @@ private void TrackQuantities() } } - private void UpdateMagicAddresses() + //progression hints level bonus + private void LevelsProgressionBonus() { - if (world.worldName == "SimulatedTwilightTown" // (and not in Data Roxas fight) - && !(world.roomNumber == 21 && (world.eventID1 == 99 || world.eventID3 == 113 || world.eventID1 == 114))) + //if sora's current level is great than the max specified level (usually 50), then do nothing + if (stats.Level > (data.Levels_ProgressionValues.Count * 10) || !data.UsingProgressionHints) + return; + + //every 10 levels, reward the player the progression points for that part + while (stats.Level > data.NextLevelMilestone) { - fire.UseSTTAddress(true); - blizzard.UseSTTAddress(true); - thunder.UseSTTAddress(true); - cure.UseSTTAddress(true); - reflect.UseSTTAddress(true); - magnet.UseSTTAddress(true); + data.NextLevelMilestone += 10; + AddProgressionPoints(data.Levels_ProgressionValues[data.LevelsPreviousIndex++]); } - else + } + + private void DrivesProgressionBonus() + { + if (!data.UsingProgressionHints) + return; + + //check valor + while (valor.Level > data.DriveLevels[0]) + { + //Console.WriteLine("data.DriveLevels[0] Current = " + data.DriveLevels[0]); + //Console.WriteLine("data.Drives_ProgressionValues[data.DriveLevels[0]] = " + data.Drives_ProgressionValues[data.DriveLevels[0] - 1]); + AddProgressionPoints(data.Drives_ProgressionValues[data.DriveLevels[0] - 1]); + data.DriveLevels[0]++; + } + while (wisdom.Level > data.DriveLevels[1]) + { + AddProgressionPoints(data.Drives_ProgressionValues[data.DriveLevels[1] - 1]); + data.DriveLevels[1]++; + } + while (limit.Level > data.DriveLevels[2]) + { + AddProgressionPoints(data.Drives_ProgressionValues[data.DriveLevels[2] - 1]); + data.DriveLevels[2]++; + } + while (master.Level > data.DriveLevels[3]) + { + AddProgressionPoints(data.Drives_ProgressionValues[data.DriveLevels[3] - 1]); + data.DriveLevels[3]++; + } + while (final.Level > data.DriveLevels[4]) { - fire.UseSTTAddress(false); - blizzard.UseSTTAddress(false); - thunder.UseSTTAddress(false); - cure.UseSTTAddress(false); - reflect.UseSTTAddress(false); - magnet.UseSTTAddress(false); + AddProgressionPoints(data.Drives_ProgressionValues[data.DriveLevels[4] - 1]); + data.DriveLevels[4]++; } } - private void UpdateCollectedItems() + private void UpdateWorldProgress(World world, bool usingSave, Tuple saveTuple) { - foreach (ImportantCheck check in importantChecks) + string wName; + int wRoom; + int wID1; + int wID2; + int wID3; + int wCom; + if (!usingSave) { - // handle these separately due to the way they are stored in memory - if (check.GetType() == typeof(Magic) || check.GetType() == typeof(TornPage)) - continue; + wName = world.worldName; + wRoom = world.roomNumber; + wID1 = world.eventID1; + wID2 = world.eventID2; + wID3 = world.eventID3; + wCom = world.eventComplete; + } + else + { + wName = saveTuple.Item1; + wRoom = saveTuple.Item2; + wID1 = saveTuple.Item3; + wID2 = saveTuple.Item4; + wID3 = saveTuple.Item5; + wCom = 1; + } - if (check.Obtained && collectedChecks.Contains(check) == false) - { - // skip auto tracking final if it was forced and valor - if (check.Name == "Valor" && valor.genieFix == true) + if (wName == "DestinyIsland" || wName == "Unknown") + return; + + //check event + var eventTuple = new Tuple(wName, wRoom, wID1, wID2, wID3, 0); + if (data.eventLog.Contains(eventTuple)) + return; + + //check for valid progression Content Controls first + ContentControl progressionM = data.WorldsData[wName].progression; + + //Get current icon prefixes (simple, game, or custom icons) + bool OldToggled = Properties.Settings.Default.OldProg; + bool CustomToggled = Properties.Settings.Default.CustomIcons; + string Prog = "Min-"; //Default + if (OldToggled) + Prog = "Old-"; + if (CustomProgFound && CustomToggled) + Prog = "Cus-"; + + //progression defaults + int curProg = data.WorldsData[wName].progress; //current world progress int + int newProg = 99; + bool updateProgression = true; + bool updateProgressionPoints = true; + + //get current world's new progress key + switch (wName) + { + case "SimulatedTwilightTown": + switch (wRoom) //check based on room number now, then based on events in each room { - valor.Obtained = false; + case 1: + if ((wID3 == 56 || wID3 == 55) && curProg == 0) // Roxas' Room (Day 1)/(Day 6) + newProg = 1; + break; + case 8: + if (wID1 == 110 || wID1 == 111) // Get Ollete Munny Pouch (min/max munny cutscenes) + newProg = 2; + break; + case 34: + if (wID1 == 157 && wCom == 1) // Twilight Thorn finish + newProg = 3; + break; + case 5: + if (wID1 == 87 && wCom == 1) // Axel 1 Finish + newProg = 4; + if (wID1 == 88 && wCom == 1) // Setzer finish + newProg = 5; + break; + case 21: + if (wID3 == 1) // Mansion: Computer Room + newProg = 6; + break; + case 20: + if (wID1 == 137 && wCom == 1) // Axel 2 finish + newProg = 7; + break; + default: //if not in any of the above rooms then just leave + updateProgression = false; + break; } - else if (check.Name == "Final") + break; + case "TwilightTown": + switch (wRoom) { - // if forced Final, start tracking the Final Form check - if (!forcedFinal && stats.form == 5) - { - forcedFinal = true; - checkEveryCheck.TrackCheck(0x001D); - } - // if not forced Final, track Final Form check like normal - // else if Final was forced, check the tracked Final Form check - else if (!forcedFinal || checkEveryCheck.UpdateTargetMemory()) - { - collectedChecks.Add(check); - newChecks.Add(check); - } + case 9: + if (wID3 == 117 && curProg == 0) // Roxas' Room (Day 1) + newProg = 1; + break; + case 8: + if (wID3 == 108 && wCom == 1) // Station Nobodies + newProg = 2; + break; + case 27: + if (wID3 == 4) // Yen Sid after new clothes + newProg = 3; + break; + case 4: + if (wID1 == 80 && wCom == 1) // Sandlot finish + newProg = 4; + break; + case 41: + if (wID1 == 186 && wCom == 1) // Mansion fight finish + newProg = 5; + break; + case 40: + if (wID1 == 161 && wCom == 1) // Betwixt and Between finish + newProg = 6; + break; + case 20: + if (wID1 == 213 && wCom == 1) // Data Axel finish + newProg = 7; + break; + default: + updateProgression = false; + break; } - else + break; + case "HollowBastion": + switch (wRoom) { - collectedChecks.Add(check); - newChecks.Add(check); + case 0: + case 10: + if ((wID3 == 1 || wID3 == 2) && curProg == 0) // Villain's Vale (HB1) + newProg = 1; + break; + case 8: + if (wID1 == 52 && wCom == 1) // Bailey finish + newProg = 2; + break; + case 5: + if (wID3 == 20) // Ansem Study post Computer + newProg = 3; + break; + case 20: + if (wID1 == 86 && wCom == 1) // Corridor finish + newProg = 4; + break; + case 18: + if (wID1 == 73 && wCom == 1) // Dancers finish + newProg = 5; + break; + case 4: + if (wID1 == 55 && wCom == 1) // HB Demyx finish + newProg = 6; + else if (wID1 == 114 && wCom == 1) // Data Demyx finish + { + if (curProg == 9) //sephi finished + newProg = 11; //data demyx + sephi finished + else if (curProg != 11) //just demyx + newProg = 10; + if (data.UsingProgressionHints) + { + UpdateProgressionPoints(wName, 10); + updateProgressionPoints = false; + } + } + break; + case 16: + if (wID1 == 65 && wCom == 1) // FF Cloud finish + newProg = 7; + break; + case 17: + if (wID1 == 66 && wCom == 1) // 1k Heartless finish + newProg = 8; + break; + case 1: + if (wID1 == 75 && wCom == 1) // Sephiroth finish + { + if (curProg == 10) //demyx finish + newProg = 11; //data demyx + sephi finished + else if (curProg != 11) //just sephi + newProg = 9; + if(data.UsingProgressionHints) + { + UpdateProgressionPoints(wName, 9); + updateProgressionPoints = false; + } + } + break; + //CoR + case 21: + if ((wID3 == 1 || wID3 == 2) && data.WorldsData["GoA"].progress == 0) //Enter CoR + { + GoAProgression.SetResourceReference(ContentProperty, Prog + data.ProgressKeys["GoA"][1]); + data.WorldsData["GoA"].progress = 1; + data.WorldsData["GoA"].progression.ToolTip = data.ProgressKeys["GoADesc"][1]; + if (data.UsingProgressionHints) + UpdateProgressionPoints("CavernofRemembrance", 1); + data.eventLog.Add(eventTuple); + return; + } + break; + case 22: + if (wID3 == 1 && data.WorldsData["GoA"].progress <= 1 && wCom == 1) //valves after skip + { + GoAProgression.SetResourceReference(ContentProperty, Prog + data.ProgressKeys["GoA"][5]); + data.WorldsData["GoA"].progress = 5; + data.WorldsData["GoA"].progression.ToolTip = data.ProgressKeys["GoADesc"][5]; + if (data.UsingProgressionHints) + UpdateProgressionPoints("CavernofRemembrance", 3); + data.eventLog.Add(eventTuple); + return; + } + break; + case 24: + if (wID3 == 1 && wCom == 1) //first fight + { + GoAProgression.SetResourceReference(ContentProperty, Prog + data.ProgressKeys["GoA"][2]); + data.WorldsData["GoA"].progress = 2; + data.WorldsData["GoA"].progression.ToolTip = data.ProgressKeys["GoADesc"][2]; + if (data.UsingProgressionHints) + UpdateProgressionPoints("CavernofRemembrance", 2); + data.eventLog.Add(eventTuple); + return; + } + if (wID3 == 2 && wCom == 1) //second fight + { + GoAProgression.SetResourceReference(ContentProperty, Prog + data.ProgressKeys["GoA"][3]); + data.WorldsData["GoA"].progress = 3; + data.WorldsData["GoA"].progression.ToolTip = data.ProgressKeys["GoADesc"][3]; + if (data.UsingProgressionHints) + UpdateProgressionPoints("CavernofRemembrance", 4); + data.eventLog.Add(eventTuple); + return; + } + break; + case 25: + if (wID3 == 3 && wCom == 1) //transport + { + GoAProgression.SetResourceReference(ContentProperty, Prog + data.ProgressKeys["GoA"][4]); + data.WorldsData["GoA"].progress = 4; + data.WorldsData["GoA"].progression.ToolTip = data.ProgressKeys["GoADesc"][4]; + if (data.UsingProgressionHints) + UpdateProgressionPoints("CavernofRemembrance", 5); + data.eventLog.Add(eventTuple); + return; + } + break; + default: + updateProgression = false; + break; } - } + break; + case "BeastsCastle": + switch (wRoom) + { + case 0: + case 2: + if ((wID3 == 1 || wID3 == 10) && curProg == 0) // Entrance Hall (BC1) + newProg = 1; + break; + case 11: + if (wID1 == 72 && wCom == 1) // Thresholder finish + newProg = 2; + break; + case 3: + if (wID1 == 69 && wCom == 1) // Beast finish + newProg = 3; + break; + case 5: + if (wID1 == 79 && wCom == 1) // Dark Thorn finish + newProg = 4; + break; + case 4: + if (wID1 == 74 && wCom == 1) // Dragoons finish + newProg = 5; + break; + case 15: + if (wID1 == 82 && wCom == 1) // Xaldin finish + newProg = 6; + else if (wID1 == 97 && wCom == 1) // Data Xaldin finish + newProg = 7; + break; + default: + updateProgression = false; + break; + } + break; + case "OlympusColiseum": + switch (wRoom) + { + case 3: + if ((wID3 == 1 || wID3 == 12) && curProg == 0) // The Coliseum (OC1) | Underworld Entrance (OC2) + newProg = 1; + break; + case 7: + if (wID1 == 114 && wCom == 1) // Cerberus finish + newProg = 2; + break; + case 0: + if ((wID3 == 1 || wID3 == 12) && curProg == 0) // (reverse rando) + newProg = 1; + if (wID1 == 141 && wCom == 1) // Urns finish + newProg = 3; + break; + case 17: + if (wID1 == 123 && wCom == 1) // OC Demyx finish + newProg = 4; + break; + case 8: + if (wID1 == 116 && wCom == 1) // OC Pete finish + newProg = 5; + break; + case 18: + if (wID1 == 171 && wCom == 1) // Hydra finish + newProg = 6; + break; + case 6: + if (wID1 == 126 && wCom == 1) // Auron Statue fight finish + newProg = 7; + break; + case 19: + if (wRoom == 19 && wID1 == 202 && wCom == 1) // Hades finish + newProg = 8; + break; + case 34: + if (wID1 == 151 && wCom == 1) // AS Zexion finish + newProg = 9; + if (wID1 == 152 && wCom == 1) // Data Zexion finish + newProg = 10; + //else if ((wID1 == 152) && wCom == 1) // Data Zexion finish + //{ + // if (data.UsingProgressionHints) + // UpdateProgressionPoints(wName, 10); + // data.eventLog.Add(eventTuple); + // return; + //} + break; + default: + updateProgression = false; + break; + } + break; + case "Agrabah": + switch (wRoom) + { + case 0: + case 4: + if ((wID3 == 1 || wID3 == 10) && curProg == 0) // Agrabah (Ag1) || The Vault (Ag2) + newProg = 1; + break; + case 9: + if (wID1 == 2 && wCom == 1) // Abu finish + newProg = 2; + break; + case 13: + if (wID1 == 79 && wCom == 1) // Chasm fight finish + newProg = 3; + break; + case 10: + if (wID1 == 58 && wCom == 1) // Treasure Room finish + newProg = 4; + break; + case 3: + if (wID1 == 59 && wCom == 1) // Lords finish + newProg = 5; + break; + case 14: + if (wID1 == 101 && wCom == 1) // Carpet finish + newProg = 6; + break; + case 5: + if (wID1 == 62 && wCom == 1) // Genie Jafar finish + newProg = 7; + break; + case 33: + if (wID1 == 142 && wCom == 1) // AS Lexaeus finish + newProg = 8; + if (wID1 == 147 && wCom == 1) // Data Lexaeus finish + newProg = 9; + //else if ((wID1 == 147) && wCom == 1) // Data Lexaeus + //{ + // if (data.UsingProgressionHints) + // UpdateProgressionPoints(wName, 9); + // data.eventLog.Add(eventTuple); + // return; + //} + break; + default: + updateProgression = false; + break; + } + break; + case "LandofDragons": + switch (wRoom) + { + case 0: + case 12: + if ((wID3 == 1 || wID3 == 10) && curProg == 0) // Bamboo Grove (LoD1) + newProg = 1; + break; + case 1: + if (wID1 == 70 && wCom == 1) // Mission 3 (Search) finish + newProg = 2; + break; + case 3: + if (wID1 == 71 && wCom == 1) // Mountain Climb finish + newProg = 3; + break; + case 5: + if (wID1 == 72 && wCom == 1) // Cave finish + newProg = 4; + break; + case 7: + if (wID1 == 73 && wCom == 1) // Summit finish + newProg = 5; + break; + case 9: + if (wID1 == 75 && wCom == 1) // Shan Yu finish + newProg = 6; + break; + case 10: + if (wID1 == 78 && wCom == 1) // Antechamber fight finish + newProg = 7; + break; + case 8: + if (wID1 == 79 && wCom == 1) // Storm Rider finish + newProg = 8; + break; + default: + updateProgression = false; + break; + } + break; + case "HundredAcreWood": + switch (wRoom) + { + case 2: + if ((wID3 == 1 || wID3 == 21 || wID3 == 22) && curProg == 0) // Pooh's house + newProg = 1; + break; + case 6: + if (wID1 == 55 && wCom == 1) //A Blustery Rescue Complete + newProg = 2; + break; + case 7: + if (wID1 == 57 && wCom == 1) //Hunny Slider Complete + newProg = 3; + break; + case 8: + if (wID1 == 59 && wCom == 1) //Balloon Bounce Complete + newProg = 4; + break; + case 9: + if (wID1 == 61 && wCom == 1) //The Expotition Complete + newProg = 5; + break; + case 1: + if (wID1 == 52 && wCom == 1) //The Hunny Pot Complete + newProg = 6; + break; + default: + updateProgression = false; + break; + } + break; + case "PrideLands": + switch (wRoom) + { + case 4: + case 16: + if ((wID3 == 1 || wID3 == 10) && curProg == 0) // Wildebeest Valley (PL1) + newProg = 1; + break; + case 12: + if (wID3 == 1) // Oasis after talking to Simba + newProg = 2; + break; + case 2: + if (wID1 == 51 && wCom == 1) // Hyenas 1 Finish + newProg = 3; + break; + case 14: + if (wID1 == 55 && wCom == 1) // Scar finish + newProg = 4; + break; + case 5: + if (wID1 == 57 && wCom == 1) // Hyenas 2 Finish + newProg = 5; + break; + case 15: + if (wID1 == 59 && wCom == 1) // Groundshaker finish + newProg = 6; + break; + default: + updateProgression = false; + break; + } + break; + case "Atlantica": + switch (wRoom) + { + case 2: + if (wID1 == 63) // Tutorial + newProg = 1; + break; + case 9: + if (wID1 == 65) // Ursula's Revenge + newProg = 2; + break; + case 4: + if (wID1 == 55) // A New Day is Dawning + newProg = 3; + break; + default: + updateProgression = false; + break; + } + break; + case "DisneyCastle": + switch (wRoom) + { + case 0: + if (wID3 == 22 && curProg == 0) // Cornerstone Hill (TR) (Audience Chamber has no Evt 0x16) + newProg = 1; + else if (wID1 == 51 && wCom == 1) // Minnie Escort finish + newProg = 2; + else if (wID3 == 6) // Windows popup (Audience Chamber has no Evt 0x06) + newProg = 4; + break; + case 1: + if (wID1 == 53 && curProg == 0) // Library (DC) + newProg = 1; + else if (wID1 == 58 && wCom == 1) // Old Pete finish + newProg = 3; + break; + case 2: + if (wID1 == 52 && wCom == 1) // Boat Pete finish + newProg = 5; + break; + case 3: + if (wID1 == 53 && wCom == 1) // DC Pete finish + newProg = 6; + break; + //case 38: + // if ((wID1 == 145 || wID1 == 150) && wCom == 1) // Marluxia finish + // { + // if (curProg == 8) + // newProg = 9; //marluxia + LW finished + // else if (curProg != 9) + // newProg = 7; + // if(data.UsingProgressionHints) + // { + // if (wID1 == 145) + // UpdateProgressionPoints(wName, 7); // AS + // else + // { + // UpdateProgressionPoints(wName, 8); // Data + // data.eventLog.Add(eventTuple); + // return; + // } + // + // updateProgressionPoints = false; + // } + // } + // break; + case 38: + case 7: + if ((wID1 == 145 || wID1 == 150) && wCom == 1) // Marluxia finish + { + //Marluxia + if (curProg != 9 && curProg != 10 && curProg != 11) + { + //check if as/data + if (wID1 == 145) + newProg = 7; + if (wID1 == 150) + newProg = 8; + } + //check for LW + else if (curProg == 9 || curProg == 10) + { + //check if as/data + if (wID1 == 145) + newProg = 10; + if (wID1 == 150) + newProg = 11; + } + //progression + if (data.UsingProgressionHints) + { + if (wID1 == 145) + UpdateProgressionPoints(wName, 7); // AS + else + { + UpdateProgressionPoints(wName, 8); // Data + data.eventLog.Add(eventTuple); + return; + } + updateProgressionPoints = false; + } + } + if (wID1 == 67 && wCom == 1) // Lingering Will finish + { + //LW + if (curProg != 7 && curProg != 8) + { + newProg = 9; + } + //as marluxia beaten + else if (curProg == 7) + { + newProg = 10; + } + //data marluxia + else if (curProg == 8) + { + newProg = 11; + } + //progression + if (data.UsingProgressionHints) + { + UpdateProgressionPoints(wName, 9); + updateProgressionPoints = false; + } + + } + break; + //if (wID1 == 67 && wCom == 1) // Lingering Will finish + //{ + // if (curProg == 7) + // newProg = 9; //marluxia + LW finished + // else if (curProg != 9) + // newProg = 8; + // if (data.UsingProgressionHints) + // { + // UpdateProgressionPoints(wName, 9); + // updateProgressionPoints = false; + // } + //} + //break; + default: + updateProgression = false; + break; + } + break; + case "HalloweenTown": + switch (wRoom) + { + case 1: + case 4: + if ((wID3 == 1 || wID3 == 10) && curProg == 0) // Hinterlands (HT1) + newProg = 1; + break; + case 6: + if (wID1 == 53 && wCom == 1) // Candy Cane Lane fight finish + newProg = 2; + break; + case 3: + if (wID1 == 52 && wCom == 1) // Prison Keeper finish + newProg = 3; + break; + case 9: + if (wID1 == 55 && wCom == 1) // Oogie Boogie finish + newProg = 4; + break; + case 10: + if (wID1 == 62 && wCom == 1) // Children Fight + newProg = 5; + if (wID1 == 63 && wCom == 1) // Presents minigame + newProg = 6; + break; + case 7: + if (wID1 == 64 && wCom == 1) // Experiment finish + newProg = 7; + break; + case 32: + if (wID1 == 115 && wCom == 1) // AS Vexen finish + newProg = 8; + if (wID1 == 146 && wCom == 1) // Data Vexen finish + newProg = 9; + //else if (wID1 == 146 && wCom == 1) // Data Vexen finish + //{ + // if(data.UsingProgressionHints) + // UpdateProgressionPoints(wName, 9); + // data.eventLog.Add(eventTuple); + // return; + //} + break; + default: + updateProgression = false; + break; + } + break; + case "PortRoyal": + switch (wRoom) + { + case 0: + if (wID3 == 1 && curProg == 0) // Rampart (PR1) + newProg = 1; + break; + case 10: + if (wID3 == 10 && curProg == 0) // Treasure Heap (PR2) + newProg = 1; + if (wID1 == 60 && wCom == 1) // Barbossa finish + newProg = 6; + break; + case 2: + if (wID1 == 55 && wCom == 1) // Town finish + newProg = 2; + break; + case 9: + if (wID1 == 59 && wCom == 1) // 1min pirates finish + newProg = 3; + break; + case 7: + if (wID1 == 58 && wCom == 1) // Medalion fight finish + newProg = 4; + break; + case 3: + if (wID1 == 56 && wCom == 1) // barrels finish + newProg = 5; + break; + case 18: + if (wID1 == 85 && wCom == 1) // Grim Reaper 1 finish + newProg = 7; + break; + case 14: + if (wID1 == 62 && wCom == 1) // Gambler finish + newProg = 8; + break; + case 1: + if (wID1 == 54 && wCom == 1) // Grim Reaper 2 finish + newProg = 9; + break; + default: + updateProgression = false; + break; + } + break; + case "SpaceParanoids": + switch (wRoom) + { + case 1: + if ((wID3 == 1 || wID3 == 10) && curProg == 0) // Canyon (SP1) + newProg = 1; + break; + case 3: + if (wID1 == 54 && wCom == 1) // Screens finish + newProg = 2; + break; + case 4: + if (wID1 == 55 && wCom == 1) // Hostile Program finish + newProg = 3; + break; + case 7: + if (wID1 == 57 && wCom == 1) // Solar Sailer finish + newProg = 4; + break; + case 9: + if (wID1 == 59 && wCom == 1) // MCP finish + newProg = 5; + break; + case 33: + if (wID1 == 143 && wCom == 1) // AS Larxene finish + newProg = 6; + if (wID1 == 148 && wCom == 1) // Data Larxene finish + newProg = 7; + //else if (wID1 == 148 && wCom == 1) // Data Larxene finish + //{ + // if (data.UsingProgressionHints) + // UpdateProgressionPoints(wName, 7); + // data.eventLog.Add(eventTuple); + // return; + //} + break; + default: + updateProgression = false; + break; + } + break; + case "TWTNW": + switch (wRoom) + { + case 1: + if (wID3 == 1) // Alley to Between + newProg = 1; + break; + case 21: + if (wID1 == 65 && wCom == 1) // Roxas finish + newProg = 2; + else if (wID1 == 99 && wCom == 1) // Data Roxas finish + { + SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, Prog + data.ProgressKeys["SimulatedTwilightTown"][8]); + data.WorldsData["SimulatedTwilightTown"].progress = 8; + data.WorldsData["SimulatedTwilightTown"].progression.ToolTip = data.ProgressKeys["SimulatedTwilightTownDesc"][8]; + if (data.UsingProgressionHints) + UpdateProgressionPoints("SimulatedTwilightTown", 8); + data.eventLog.Add(eventTuple); + return; + } + break; + case 10: + if (wID1 == 57 && wCom == 1) // Xigbar finish + newProg = 3; + else if (wID1 == 100 && wCom == 1) // Data Xigbar finish + { + LandofDragonsProgression.SetResourceReference(ContentProperty, Prog + data.ProgressKeys["LandofDragons"][9]); + data.WorldsData["LandofDragons"].progress = 9; + data.WorldsData["LandofDragons"].progression.ToolTip = data.ProgressKeys["LandofDragonsDesc"][9]; + if (data.UsingProgressionHints) + UpdateProgressionPoints("LandofDragons", 9); + data.eventLog.Add(eventTuple); + return; + } + break; + case 14: + if (wID1 == 58 && wCom == 1) // Luxord finish + newProg = 4; + else if (wID1 == 101 && wCom == 1) // Data Luxord finish + { + PortRoyalProgression.SetResourceReference(ContentProperty, Prog + data.ProgressKeys["PortRoyal"][10]); + data.WorldsData["PortRoyal"].progress = 10; + data.WorldsData["PortRoyal"].progression.ToolTip = data.ProgressKeys["PortRoyalDesc"][10]; + if (data.UsingProgressionHints) + UpdateProgressionPoints("PortRoyal", 10); + data.eventLog.Add(eventTuple); + return; + } + break; + case 15: + if (wID1 == 56 && wCom == 1) // Saix finish + newProg = 5; + else if (wID1 == 102 && wCom == 1) // Data Saix finish + { + PrideLandsProgression.SetResourceReference(ContentProperty, Prog + data.ProgressKeys["PrideLands"][7]); + data.WorldsData["PrideLands"].progress = 7; + data.WorldsData["PrideLands"].progression.ToolTip = data.ProgressKeys["PrideLandsDesc"][7]; + if (data.UsingProgressionHints) + UpdateProgressionPoints("PrideLands", 7); + data.eventLog.Add(eventTuple); + return; + } + break; + case 19: + if (wID1 == 59 && wCom == 1) // Xemnas 1 finish + newProg = 6; + break; + case 20: + if (wID1 == 98 && wCom == 1) // Data Xemnas finish + { + newProg = 7; + } + else if (wID1 == 74 && wCom == 1 && data.revealFinalXemnas) // Regular Final Xemnas finish + { + if (data.UsingProgressionHints) + UpdateProgressionPointsTWTNW(wName); + data.eventLog.Add(eventTuple); + return; + } + break; + default: + updateProgression = false; + break; + } + break; + case "GoA": + if (wRoom == 32) + { + if (HashGrid.Visibility == Visibility.Visible) + { + HashGrid.Visibility = Visibility.Collapsed; + } + } + return; + default: //return if any other world + return; } - TrackQuantities(); + + //progression wasn't updated + if (newProg == 99 || updateProgression == false) + return; + + //progression points + if (updateProgressionPoints == true && data.UsingProgressionHints) + UpdateProgressionPoints(wName, newProg); + + //made it this far, now just set the progression icon based on newProg + progressionM.SetResourceReference(ContentProperty, Prog + data.ProgressKeys[wName][newProg]); + data.WorldsData[wName].progress = newProg; + data.WorldsData[wName].progression.ToolTip = data.ProgressKeys[wName + "Desc"][newProg]; + + //log event + data.eventLog.Add(eventTuple); } // Sometimes level rewards and levels dont update on the same tick // Previous tick checks are placed on the current tick with the info of both ticks // This way level checks don't get misplaced + //Note: apparently the above is completely untrue, but its's not like it currently breaks anything so... private void DetermineItemLocations() { if (previousChecks.Count == 0) @@ -622,721 +1935,835 @@ private void DetermineItemLocations() } else { - if (data.WorldsData.ContainsKey(world.previousworldName)) + //check if user is currently in shop or puzzle and track item to Creations if so + if (CheckSynthPuzzle()) + { + TrackItem(check.Name + count, data.WorldsData["PuzzSynth"].worldGrid); + } + else { - // add check to current world - TrackItem(check.Name + count, data.WorldsData[world.previousworldName].worldGrid); + if (world.previousworldName != null && data.WorldsData.ContainsKey(world.previousworldName)) + { + // add check to current world + TrackItem(check.Name + count, data.WorldsData[world.previousworldName].worldGrid); + } } } } } - void UpdateWorldProgress(World world) + private void UpdateCollectedItems() { - if (world.worldName == "SimulatedTwilightTown") + foreach (ImportantCheck check in importantChecks) { - if (world.roomNumber == 1 && world.eventID3 == 56 && data.WorldsData[world.worldName].progress == 0) // Roxas' Room (Day 1) - { - broadcast.SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "STTChests"); - SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "STTChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 34 && world.eventID1 == 157 && world.eventComplete == 1) // Twilight Thorn finish - { - broadcast.SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "TwilightThorn"); - SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "TwilightThorn"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 5 && world.eventID1 == 88 && world.eventComplete == 1) // Setzer finish - { - broadcast.SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "Struggle"); - SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "Struggle"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 1 && world.eventID3 == 55 && data.WorldsData[world.worldName].progress == 0) // Roxas' Room (Day 6) - { - broadcast.SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "STTChests"); - SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "STTChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 21 && world.eventID3 == 1) // Mansion: Computer Room - { - broadcast.SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "ComputerRoom"); - SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "ComputerRoom"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 20 && world.eventID1 == 137 && world.eventComplete == 1) // Axel finish + // handle these separately due to the way they are stored in memory + if (check.GetType() == typeof(Magic) || check.GetType() == typeof(TornPage)) + continue; + + if (check.Obtained && collectedChecks.Contains(check) == false) { - broadcast.SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "Axel"); - SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "Axel"); - data.WorldsData[world.worldName].progress = 5; + // skip auto tracking final if it was forced and valor + if (check.Name == "Valor" && valor.genieFix == true && !data.altFinalTracking) + { + valor.Obtained = false; + } + else if (check.Name == "Final" && !data.altFinalTracking) + { + // if forced Final, start tracking the Final Form check + if (!data.forcedFinal && stats.form == 5) + { + data.forcedFinal = true; + checkEveryCheck.TrackCheck(0x001D); + } + // if not forced Final, track Final Form check like normal + // else if Final was forced, check the tracked Final Form check + else if (!data.forcedFinal || checkEveryCheck.UpdateTargetMemory()) + { + collectedChecks.Add(check); + newChecks.Add(check); + } + } + else + { + collectedChecks.Add(check); + newChecks.Add(check); + } } } - else if (world.worldName == "TwilightTown") + TrackQuantities(); + } + + private void GetBoss(World world, bool usingSave, Tuple saveTuple) + { + //temp values + string boss = "None"; + string wName; + int wRoom; + int wID1; + int wID2; + int wID3; + int wCup; + if (!usingSave) { - if (world.roomNumber == 27 && world.eventID3 == 4) // Yen Sid after new clothes - { - broadcast.TwilightTownProgression.SetResourceReference(ContentProperty, "MysteriousTower"); - TwilightTownProgression.SetResourceReference(ContentProperty, "MysteriousTower"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 4 && world.eventID1 == 80 && world.eventComplete == 1) // Sandlot finish - { - broadcast.TwilightTownProgression.SetResourceReference(ContentProperty, "Sandlot"); - TwilightTownProgression.SetResourceReference(ContentProperty, "Sandlot"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 41 && world.eventID1 == 186 && world.eventComplete == 1) // Mansion fight finish - { - broadcast.TwilightTownProgression.SetResourceReference(ContentProperty, "Mansion"); - TwilightTownProgression.SetResourceReference(ContentProperty, "Mansion"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 40 && world.eventID1 == 161 && world.eventComplete == 1) // Betwixt and Between finish - { - broadcast.TwilightTownProgression.SetResourceReference(ContentProperty, "BetwixtandBetween"); - TwilightTownProgression.SetResourceReference(ContentProperty, "BetwixtandBetween"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 20 && world.eventID1 == 213 && world.eventComplete == 1) // Data Axel finish - { - broadcast.TwilightTownProgression.SetResourceReference(ContentProperty, "DataAxel"); - TwilightTownProgression.SetResourceReference(ContentProperty, "DataAxel"); - data.WorldsData[world.worldName].progress = 5; - } + wName = world.worldName; + wRoom = world.roomNumber; + wID1 = world.eventID1; + wID2 = world.eventID2; + wID3 = world.eventID3; + wCup = world.cupRound; } - else if (world.worldName == "HollowBastion") + else { - if (world.roomNumber == 0 && world.eventID3 == 1 && data.WorldsData[world.worldName].progress == 0) // Villain's Vale (HB1) - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "HBChests"); - HollowBastionProgression.SetResourceReference(ContentProperty, "HBChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 8 && world.eventID1 == 52 && world.eventComplete == 1) // Bailey finish - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "Bailey"); - HollowBastionProgression.SetResourceReference(ContentProperty, "Bailey"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 10 && world.eventID3 == 2 && data.WorldsData[world.worldName].progress == 0) // Marketplace (HB2) - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "HBChests"); - HollowBastionProgression.SetResourceReference(ContentProperty, "HBChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 5 && world.eventID3 == 20) // Ansem Study post Computer - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "AnsemStudy"); - HollowBastionProgression.SetResourceReference(ContentProperty, "AnsemStudy"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 20 && world.eventID1 == 86 && world.eventComplete == 1) // Corridor finish - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "Corridor"); - HollowBastionProgression.SetResourceReference(ContentProperty, "Corridor"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 18 && world.eventID1 == 73 && world.eventComplete == 1) // Dancers finish - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "Dancers"); - HollowBastionProgression.SetResourceReference(ContentProperty, "Dancers"); - data.WorldsData[world.worldName].progress = 5; - } - else if (world.roomNumber == 4 && world.eventID1 == 55 && world.eventComplete == 1) // HB Demyx finish - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "HBDemyx"); - HollowBastionProgression.SetResourceReference(ContentProperty, "HBDemyx"); - data.WorldsData[world.worldName].progress = 6; - } - else if (world.roomNumber == 16 && world.eventID1 == 65 && world.eventComplete == 1) // FF Cloud finish - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "FinalFantasy"); - HollowBastionProgression.SetResourceReference(ContentProperty, "FinalFantasy"); - data.WorldsData[world.worldName].progress = 7; - } - else if (world.roomNumber == 17 && world.eventID1 == 66 && world.eventComplete == 1) // 1k Heartless finish - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "1000Heartless"); - HollowBastionProgression.SetResourceReference(ContentProperty, "1000Heartless"); - data.WorldsData[world.worldName].progress = 8; - } - else if (world.roomNumber == 1 && world.eventID1 == 75 && world.eventComplete == 1) // Sephiroth finish - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "Sephiroth"); - HollowBastionProgression.SetResourceReference(ContentProperty, "Sephiroth"); - data.WorldsData[world.worldName].progress = 9; - } - else if (world.roomNumber == 4 && world.eventID1 == 114 && world.eventComplete == 1) // Data Demyx finish - { - broadcast.HollowBastionProgression.SetResourceReference(ContentProperty, "DataDemyx"); - HollowBastionProgression.SetResourceReference(ContentProperty, "DataDemyx"); - data.WorldsData[world.worldName].progress = 10; - } + wName = saveTuple.Item1; + wRoom = saveTuple.Item2; + wID1 = saveTuple.Item3; + wID2 = saveTuple.Item4; + wID3 = saveTuple.Item5; + wCup = saveTuple.Item6; } - else if (world.worldName == "BeastsCastle") + + //stops awarding points for a single boss each tick + if (!usingSave) { - if (world.roomNumber == 0 && world.eventID3 == 1 && data.WorldsData[world.worldName].progress == 0) // Entrance Hall (BC1) - { - broadcast.BeastsCastleProgression.SetResourceReference(ContentProperty, "BCChests"); - BeastsCastleProgression.SetResourceReference(ContentProperty, "BCChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 11 && world.eventID1 == 72 && world.eventComplete == 1) // Thresholder finish - { - broadcast.BeastsCastleProgression.SetResourceReference(ContentProperty, "Thresholder"); - BeastsCastleProgression.SetResourceReference(ContentProperty, "Thresholder"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 3 && world.eventID1 == 69 && world.eventComplete == 1) // Beast finish - { - broadcast.BeastsCastleProgression.SetResourceReference(ContentProperty, "Beast"); - BeastsCastleProgression.SetResourceReference(ContentProperty, "Beast"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 5 && world.eventID1 == 79 && world.eventComplete == 1) // Dark Thorn finish - { - broadcast.BeastsCastleProgression.SetResourceReference(ContentProperty, "DarkThorn"); - BeastsCastleProgression.SetResourceReference(ContentProperty, "DarkThorn"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 2 && world.eventID3 == 10 && data.WorldsData[world.worldName].progress == 0) // Belle's Room (BC2) - { - broadcast.BeastsCastleProgression.SetResourceReference(ContentProperty, "BCChests"); - BeastsCastleProgression.SetResourceReference(ContentProperty, "BCChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 4 && world.eventID1 == 74 && world.eventComplete == 1) // Dragoons finish - { - broadcast.BeastsCastleProgression.SetResourceReference(ContentProperty, "Dragoons"); - BeastsCastleProgression.SetResourceReference(ContentProperty, "Dragoons"); - data.WorldsData[world.worldName].progress = 5; - } - else if (world.roomNumber == 15 && world.eventID1 == 82 && world.eventComplete == 1) // Xaldin finish - { - broadcast.BeastsCastleProgression.SetResourceReference(ContentProperty, "Xaldin"); - BeastsCastleProgression.SetResourceReference(ContentProperty, "Xaldin"); - data.WorldsData[world.worldName].progress = 6; - } - else if (world.roomNumber == 15 && world.eventID1 == 97 && world.eventComplete == 1) // Data Xaldin finish - { - broadcast.BeastsCastleProgression.SetResourceReference(ContentProperty, "DataXaldin"); - BeastsCastleProgression.SetResourceReference(ContentProperty, "DataXaldin"); - data.WorldsData[world.worldName].progress = 7; - } + if (world.eventComplete == 1 && eventInProgress) + return; + else + eventInProgress = false; } - else if (world.worldName == "OlympusColiseum") + + //eventlog check + var eventTuple = new Tuple(wName, wRoom, wID1, wID2, wID3, wCup); + if (data.bossEventLog.Contains(eventTuple)) + return; + + + //boss beaten events (taken mostly from progression code) + switch (wName) { - if (world.roomNumber == 0 & world.eventID3 == 1 && data.WorldsData[world.worldName].progress == 0) // The Coliseum (OC1) - { - broadcast.OlympusColiseumProgression.SetResourceReference(ContentProperty, "OCChests"); - OlympusColiseumProgression.SetResourceReference(ContentProperty, "OCChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 7 && world.eventID1 == 114 && world.eventComplete == 1) // Cerberus finish - { - broadcast.OlympusColiseumProgression.SetResourceReference(ContentProperty, "Cerberus"); - OlympusColiseumProgression.SetResourceReference(ContentProperty, "Cerberus"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 17 && world.eventID1 == 123 && world.eventComplete == 1) // OC Demyx finish - { - broadcast.OlympusColiseumProgression.SetResourceReference(ContentProperty, "OCDemyx"); - OlympusColiseumProgression.SetResourceReference(ContentProperty, "OCDemyx"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 8 && world.eventID1 == 116 && world.eventComplete == 1) // OC Pete finish - { - broadcast.OlympusColiseumProgression.SetResourceReference(ContentProperty, "OCPete"); - OlympusColiseumProgression.SetResourceReference(ContentProperty, "OCPete"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 18 && world.eventID1 == 171 && world.eventComplete == 1) // Hydra finish - { - broadcast.OlympusColiseumProgression.SetResourceReference(ContentProperty, "Hydra"); - OlympusColiseumProgression.SetResourceReference(ContentProperty, "Hydra"); - data.WorldsData[world.worldName].progress = 5; - } - else if (world.roomNumber == 3 & world.eventID3 == 12 && data.WorldsData[world.worldName].progress == 0) // Underworld Entrance (OC2) - { - broadcast.OlympusColiseumProgression.SetResourceReference(ContentProperty, "OCChests"); - OlympusColiseumProgression.SetResourceReference(ContentProperty, "OCChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 6 && world.eventID1 == 126 && world.eventComplete == 1) // Auron Statue fight finish - { - broadcast.OlympusColiseumProgression.SetResourceReference(ContentProperty, "AuronStatue"); - OlympusColiseumProgression.SetResourceReference(ContentProperty, "AuronStatue"); - data.WorldsData[world.worldName].progress = 6; - } - else if (world.roomNumber == 19 && world.eventID1 == 202 && world.eventComplete == 1) // Hades finish - { - broadcast.OlympusColiseumProgression.SetResourceReference(ContentProperty, "Hades"); - OlympusColiseumProgression.SetResourceReference(ContentProperty, "Hades"); - data.WorldsData[world.worldName].progress = 7; - } - else if (world.roomNumber == 34 && (world.eventID1 == 151 || world.eventID1 == 152) && world.eventComplete == 1) // Zexion finish - { - broadcast.OlympusColiseumProgression.SetResourceReference(ContentProperty, "Zexion"); - OlympusColiseumProgression.SetResourceReference(ContentProperty, "Zexion"); - data.WorldsData[world.worldName].progress = 8; - } - } - else if (world.worldName == "Agrabah") - { - if (world.roomNumber == 0 && world.eventID3 == 1 && data.WorldsData[world.worldName].progress == 0) // Agrabah (Ag1) - { - broadcast.AgrabahProgression.SetResourceReference(ContentProperty, "AGChests"); - AgrabahProgression.SetResourceReference(ContentProperty, "AGChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 9 && world.eventID1 == 2 && world.eventComplete == 1) // Abu finish - { - broadcast.AgrabahProgression.SetResourceReference(ContentProperty, "Abu"); - AgrabahProgression.SetResourceReference(ContentProperty, "Abu"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 13 && world.eventID1 == 79 && world.eventComplete == 1) // Chasm fight finish - { - broadcast.AgrabahProgression.SetResourceReference(ContentProperty, "Chasm"); - AgrabahProgression.SetResourceReference(ContentProperty, "Chasm"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 10 && world.eventID1 == 58 && world.eventComplete == 1) // Treasure Room finish - { - broadcast.AgrabahProgression.SetResourceReference(ContentProperty, "TreasureRoom"); - AgrabahProgression.SetResourceReference(ContentProperty, "TreasureRoom"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 3 && world.eventID1 == 59 && world.eventComplete == 1) // Lords finish - { - broadcast.AgrabahProgression.SetResourceReference(ContentProperty, "Lords"); - AgrabahProgression.SetResourceReference(ContentProperty, "Lords"); - data.WorldsData[world.worldName].progress = 5; - } - else if (world.roomNumber == 4 && world.eventID3 == 10 && data.WorldsData[world.worldName].progress == 0) // The Vault (Ag2) - { - broadcast.AgrabahProgression.SetResourceReference(ContentProperty, "AGChests"); - AgrabahProgression.SetResourceReference(ContentProperty, "AGChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 14 && world.eventID1 == 100 && world.eventComplete == 1) // Carpet finish - { - broadcast.AgrabahProgression.SetResourceReference(ContentProperty, "Carpet"); - AgrabahProgression.SetResourceReference(ContentProperty, "Carpet"); - data.WorldsData[world.worldName].progress = 6; - } - else if (world.roomNumber == 5 && world.eventID1 == 62 && world.eventComplete == 1) // Genie Jafar finish - { - broadcast.AgrabahProgression.SetResourceReference(ContentProperty, "GenieJafar"); - AgrabahProgression.SetResourceReference(ContentProperty, "GenieJafar"); - data.WorldsData[world.worldName].progress = 7; - } - else if (world.roomNumber == 33 && (world.eventID1 == 142 || world.eventID1 == 147) && world.eventComplete == 1) // Lexaeus finish - { - broadcast.AgrabahProgression.SetResourceReference(ContentProperty, "Lexaeus"); - AgrabahProgression.SetResourceReference(ContentProperty, "Lexaeus"); - data.WorldsData[world.worldName].progress = 8; - } + case "SimulatedTwilightTown": + switch (wRoom) //check based on room number now, then based on events in each room + { + case 34: + if (wID1 == 157) // Twilight Thorn finish + boss = "Twilight Thorn"; + break; + case 3: + if (wID1 == 180) // Seifer Battle (Day 4) + boss = "Seifer"; + break; + case 4: + //Tutorial Seifer shouldn't give points + //if (wID1 == 77) // Tutorial 4 - Fighting + // boss = "Seifer (1)"; + if (wID1 == 78) // Seifer I Battle + boss = "Seifer (2)"; + break; + case 5: + if (wID1 == 84) // Hayner Struggle + boss = "Hayner"; + if (wID1 == 85) // Vivi Struggle + boss = "Vivi"; + if (wID1 == 87) // Axel 1 Finish + boss = "Axel I"; + if (wID1 == 88) // Setzer Struggle + boss = "Setzer"; + break; + case 20: + if (wID1 == 137) // Axel 2 finish + boss = "Axel II"; + break; + default: + break; + } + break; + case "TwilightTown": + switch (wRoom) + { + case 20: + if (wID1 == 213) // Data Axel finish + boss = "Axel (Data)"; + break; + case 4: + if (wID1 == 181) // Seifer II Battle + boss = "Seifer (3)"; + if (wID1 == 182) // Hayner Battle (Struggle Competition) + boss = "Hayner (SR)"; + if (wID1 == 183) // Setzer Battle (Struggle Competition) + boss = "Setzer (SR)"; + if (wID1 == 184) // Seifer Battle (Struggle Competition) + boss = "Seifer (4)"; + break; + default: + break; + } + break; + case "HollowBastion": + switch (wRoom) + { + case 4: + if (wID1 == 55) // HB Demyx finish + boss = "Demyx"; + else if (wID1 == 114) // Data Demyx finish + boss = "Demyx (Data)"; + break; + case 1: + if (wID1 == 75) // Sephiroth finish + boss = "Sephiroth"; + break; + default: + break; + } + break; + case "BeastsCastle": + switch (wRoom) + { + case 11: + if (wID1 == 72) // Thresholder finish + boss = "Thresholder"; + break; + case 3: + if (wID1 == 69) // Beast finish + boss = "The Beast"; + break; + case 5: + if (wID1 == 78) // Shadow Stalker + boss = "Shadow Stalker"; + if (wID1 == 79) // Dark Thorn finish + boss = "Dark Thorn"; + break; + case 15: + if (wID1 == 82) // Xaldin finish + boss = "Xaldin"; + else if (wID1 == 97) // Data Xaldin finish + boss = "Xaldin (Data)"; + break; + default: + break; + } + break; + case "OlympusColiseum": + switch (wRoom) + { + case 7: + if (wID1 == 114) // Cerberus finish + boss = "Cerberus"; + break; + case 8: + if (wID1 == 116) // OC Pete finish + boss = "Pete OC II"; + break; + case 18: + if (wID1 == 171) // Hydra finish + boss = "Hydra"; + break; + case 19: + if (wID1 == 202) // Hades finish + boss = "Hades II (1)"; + break; + case 34: + if (wID1 == 151) // Zexion finish + boss = "Zexion"; + else if (wID1 == 152) // Data Zexion finish + boss = "Zexion (Data)"; + break; + case 9: //Cups + if (wID1 == 189 && wCup == 10) + boss = "FF Team 1"; //Leon & Yuffie + if (wID1 == 190 && wCup == 10) + boss = "Cerberus (Cups)"; + if (wID1 == 191 && wCup == 10) + boss = "Hercules"; + if (wID1 == 192 && wCup == 10) + boss = "Hades Cups"; + //paradox cups + if (wID1 == 193 && wCup == 10) + boss = "FF Team 2"; //Leon (3) & Yuffie (3) + if (wID1 == 194 && wCup == 10) + boss = "Cerberus (Cups)"; + if (wID1 == 195 && wCup == 10) + boss = "Hercules"; + //hades paradox + if (wID1 == 196 && wCup == 5) + boss = "Volcano Lord (Cups)"; + if (wID1 == 196 && wCup == 10) + boss = "FF Team 3"; // Yuffie (1) & Tifa + if (wID1 == 196 && wCup == 15) + boss = "Blizzard Lord (Cups)"; + if (wID1 == 196 && wCup == 20) + boss = "Pete Cups"; + if (wID1 == 196 && wCup == 25) + boss = "FF Team 4"; // Cloud & Tifa (1) + if (wID1 == 196 && wCup == 30) + boss = "Hades Cups"; + if (wID1 == 196 && wCup == 40) + boss = "FF Team 5"; // Leon (1) & Cloud (1) + if (wID1 == 196 && wCup == 48) + boss = "Cerberus (Cups)"; + if (wID1 == 196 && wCup == 49) + boss = "FF Team 6"; // Leon (2), Cloud (2), Yuffie (2), & Tifa (2) + if (wID1 == 196 && wCup == 50) + boss = "Hades II"; + break; + default: + break; + } + break; + case "Agrabah": + switch (wRoom) + { + case 3: + if (wID1 == 59) // Lords finish + boss = "Twin Lords"; + break; + case 5: + if (wID1 == 62) // Genie Jafar finish + boss = "Jafar"; + break; + case 33: + if (wID1 == 142) // Lexaeus finish + boss = "Lexaeus"; + else if (wID1 == 147) // Data Lexaeus finish + boss = "Lexaeus (Data)"; + break; + default: + break; + } + break; + case "LandofDragons": + switch (wRoom) + { + case 9: + if (wID1 == 75) // Shan Yu finish + boss = "Shan-Yu"; + break; + case 7: + if (wID1 == 76) // Riku + boss = "Riku"; + break; + case 8: + if (wID1 == 79) // Storm Rider finish + boss = "Storm Rider"; + break; + default: + break; + } + break; + case "PrideLands": + switch (wRoom) + { + case 14: + if (wID1 == 55) // Scar finish + boss = "Scar"; + break; + case 15: + if (wID1 == 59) // Groundshaker finish + boss = "Groundshaker"; + break; + default: + break; + } + break; + case "DisneyCastle": + switch (wRoom) + { + case 1: + if (wID1 == 58) // Old Pete finish + boss = "Past Pete"; + break; + case 2: + if (wID1 == 52) // Boat Pete finish + boss = "Boat Pete"; + break; + case 3: + if (wID1 == 53) // DC Pete finish + boss = "Pete TR"; + break; + case 38: + if (wID1 == 145) // Marluxia finish + boss = "Marluxia"; + else if (wID1 == 150) // Data Marluxia finish + boss = "Marluxia (Data)"; + break; + case 7: + if (wID1 == 67) // Lingering Will finish + boss = "Terra"; + break; + default: + break; + } + break; + case "HalloweenTown": + switch (wRoom) + { + case 3: + if (wID1 == 52) // Prison Keeper finish + boss = "Prison Keeper"; + break; + case 9: + if (wID1 == 55) // Oogie Boogie finish + boss = "Oogie Boogie"; + break; + case 7: + if (wID1 == 64) // Experiment finish + boss = "The Experiment"; + break; + case 32: + if (wID1 == 115) // Vexen finish + boss = "Vexen"; + if (wID1 == 146) // Data Vexen finish + boss = "Vexen (Data)"; + break; + default: + break; + } + break; + case "PortRoyal": + switch (wRoom) + { + case 10: + if (wID1 == 60) // Barbossa finish + boss = "Barbossa"; + break; + case 18: + if (wID1 == 85) // Grim Reaper 1 finish + boss = "Grim Reaper I"; + break; + case 1: + if (wID1 == 54) // Grim Reaper 2 finish + boss = "Grim Reaper II"; + break; + default: + break; + } + break; + case "SpaceParanoids": + switch (wRoom) + { + case 4: + if (wID1 == 55) // Hostile Program finish + boss = "Hostile Program"; + break; + case 9: + if (wID1 == 58) // Sark finish + boss = "Sark"; + else if (wID1 == 59) // MCP finish + boss = "MCP"; + break; + case 33: + if (wID1 == 143) // Larxene finish + boss = "Larxene"; + else if (wID1 == 148) // Data Larxene finish + boss = "Larxene (Data)"; + break; + default: + break; + } + break; + case "TWTNW": + switch (wRoom) + { + case 21: + if (wID1 == 65) // Roxas finish + boss = "Roxas"; + else if (wID1 == 99) // Data Roxas finish + boss = "Roxas (Data)"; + break; + case 10: + if (wID1 == 57) // Xigbar finish + boss = "Xigbar"; + else if (wID1 == 100) // Data Xigbar finish + boss = "Xigbar (Data)"; + break; + case 14: + if (wID1 == 58) // Luxord finish + boss = "Luxord"; + else if (wID1 == 101) // Data Luxord finish + boss = "Luxord (Data)"; + break; + case 15: + if (wID1 == 56) // Saix finish + boss = "Saix"; + else if (wID1 == 102) // Data Saix finish + boss = "Saix (Data)"; + break; + case 19: + if (wID1 == 59) // Xemnas 1 finish + boss = "Xemnas"; + else if (wID1 == 97) // Data Xemnas I finish + boss = "Xemnas (Data)"; + break; + case 20: + if (wID1 == 74) // Final Xemnas finish + boss = "Final Xemnas"; + else if (wID1 == 98) // Data Final Xemnas finish + boss = "Final Xemnas (Data)"; + break; + case 23: + if (wID1 == 73) // Armor Xemnas II + boss = "Armor Xemnas II"; + break; + case 24: + if (wID1 == 71) // Armor Xemnas I + boss = "Armor Xemnas I"; + break; + default: + break; + } + break; + default: + break; } - else if (world.worldName == "LandofDragons") + + //return if bo boss beaten found + + + if (!usingSave) { - if (world.roomNumber == 0 && world.eventID3 == 1 && data.WorldsData[world.worldName].progress == 0) // Bamboo Grove (LoD1) - { - broadcast.LandofDragonsProgression.SetResourceReference(ContentProperty, "LoDChests"); - LandofDragonsProgression.SetResourceReference(ContentProperty, "LoDChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 5 && world.eventID1 == 72 && world.eventComplete == 1) // Cave finish - { - broadcast.LandofDragonsProgression.SetResourceReference(ContentProperty, "Cave"); - LandofDragonsProgression.SetResourceReference(ContentProperty, "Cave"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 7 && world.eventID1 == 73 && world.eventComplete == 1) // Summit finish - { - broadcast.LandofDragonsProgression.SetResourceReference(ContentProperty, "Summit"); - LandofDragonsProgression.SetResourceReference(ContentProperty, "Summit"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 9 && world.eventID1 == 75 && world.eventComplete == 1) // Shan Yu finish - { - broadcast.LandofDragonsProgression.SetResourceReference(ContentProperty, "ShanYu"); - LandofDragonsProgression.SetResourceReference(ContentProperty, "ShanYu"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 12 && world.eventID3 == 10 && data.WorldsData[world.worldName].progress == 0) // Village (LoD2) - { - broadcast.LandofDragonsProgression.SetResourceReference(ContentProperty, "LoDChests"); - LandofDragonsProgression.SetResourceReference(ContentProperty, "LoDChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 10 && world.eventID1 == 78 && world.eventComplete == 1) // Antechamber fight finish - { - broadcast.LandofDragonsProgression.SetResourceReference(ContentProperty, "ThroneRoom"); - LandofDragonsProgression.SetResourceReference(ContentProperty, "ThroneRoom"); - data.WorldsData[world.worldName].progress = 5; - } - else if (world.roomNumber == 8 && world.eventID1 == 79 && world.eventComplete == 1) // Storm Rider finish - { - broadcast.LandofDragonsProgression.SetResourceReference(ContentProperty, "StormRider"); - LandofDragonsProgression.SetResourceReference(ContentProperty, "StormRider"); - data.WorldsData[world.worldName].progress = 6; - } + //if the boss was found and beaten then set flag + //we do this to stop things happening every frame + if (world.eventComplete == 1) + eventInProgress = true; + else + return; } - else if (world.worldName == "HundredAcreWood") + + if (boss == "None") + return; + + App.logger?.Record("Beaten Boss: " + boss); + + //get points for boss kills + GetBossPoints(boss); + + //add to log + data.bossEventLog.Add(eventTuple); + } + + private void GetBossPoints(string boss) + { + int points; + string bossType; + string replacementType; + + if (boss == "Twin Lords") { - if (world.roomNumber == 2 && (world.eventID3 == 1 || world.eventID3 == 22)) // Pooh's house (eventID3 == 1 is when not skipping AW0) - { - broadcast.HundredAcreWoodProgression.SetResourceReference(ContentProperty, "Pooh"); - HundredAcreWoodProgression.SetResourceReference(ContentProperty, "Pooh"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 4 && world.eventID3 == 1) // Piglet's house - { - broadcast.HundredAcreWoodProgression.SetResourceReference(ContentProperty, "Piglet"); - HundredAcreWoodProgression.SetResourceReference(ContentProperty, "Piglet"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 3 && world.eventID3 == 1) // Rabbit's house + if (data.BossRandoFound) { - broadcast.HundredAcreWoodProgression.SetResourceReference(ContentProperty, "Rabbit"); - HundredAcreWoodProgression.SetResourceReference(ContentProperty, "Rabbit"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 5 && world.eventID3 == 1) // Kanga's house - { - broadcast.HundredAcreWoodProgression.SetResourceReference(ContentProperty, "Kanga"); - HundredAcreWoodProgression.SetResourceReference(ContentProperty, "Kanga"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 9 && world.eventID3 == 1) // Spooky Cave - { - broadcast.HundredAcreWoodProgression.SetResourceReference(ContentProperty, "SpookyCave"); - HundredAcreWoodProgression.SetResourceReference(ContentProperty, "SpookyCave"); - data.WorldsData[world.worldName].progress = 5; + //BlizzardLord + replacementType = Codes.FindBossType(data.BossList["Blizzard Lord"]); + if (replacementType == "Unknown") + { + Console.WriteLine("Unknown Replacement Boss: " + data.BossList["Blizzard Lord"] + ". Using default points."); + + if (App.logger != null) + App.logger.Record("Unknown Replacement Boss: " + data.BossList["Blizzard Lord"] + ". Using default points."); + + replacementType = "boss_other"; + } + else + { + if (App.logger != null) + App.logger.Record("Blizzard Lord Replacement: " + data.BossList["Blizzard Lord"]); + } + + points = data.PointsDatanew[replacementType]; + + //Volcano Lord + replacementType = Codes.FindBossType(data.BossList["Volcano Lord"]); + if (replacementType == "Unknown") + { + Console.WriteLine("Unknown Replacement Boss: " + data.BossList["Volcano Lord"] + ". Using default points."); + + if (App.logger != null) + App.logger.Record("Unknown Replacement Boss: " + data.BossList["Volcano Lord"] + ". Using default points."); + + replacementType = "boss_other"; + } + else + { + if (App.logger != null) + App.logger.Record("Volcano Lord Replacement: " + data.BossList["Volcano Lord"]); + } + + points += data.PointsDatanew[replacementType]; + + //bonus points here should be sum of both boss types / 2 + if (points > 1) + points += points / 2; } - else if (world.roomNumber == 1 && world.eventID3 == 1) // Starry Hill + else { - broadcast.HundredAcreWoodProgression.SetResourceReference(ContentProperty, "StarryHill"); - HundredAcreWoodProgression.SetResourceReference(ContentProperty, "StarryHill"); - data.WorldsData[world.worldName].progress = 6; + points = data.PointsDatanew["boss_other"] * 2; } } - else if (world.worldName == "PrideLands") + else if (boss.StartsWith("FF Team")) { - if (world.roomNumber == 16 && world.eventID3 == 1 && data.WorldsData[world.worldName].progress == 0) // Wildebeest Valley (PL1) - { - broadcast.PrideLandsProgression.SetResourceReference(ContentProperty, "PLChests"); - PrideLandsProgression.SetResourceReference(ContentProperty, "PLChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 12 && world.eventID3 == 1) // Oasis after talking to Simba - { - broadcast.PrideLandsProgression.SetResourceReference(ContentProperty, "Simba"); - PrideLandsProgression.SetResourceReference(ContentProperty, "Simba"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 14 && world.eventID1 == 55 && world.eventComplete == 1) // Scar finish - { - broadcast.PrideLandsProgression.SetResourceReference(ContentProperty, "Scar"); - PrideLandsProgression.SetResourceReference(ContentProperty, "Scar"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 4 && world.eventID3 == 10 && data.WorldsData[world.worldName].progress == 0) // Savannah (PL2) + if (data.BossRandoFound) { - broadcast.PrideLandsProgression.SetResourceReference(ContentProperty, "PLChests"); - PrideLandsProgression.SetResourceReference(ContentProperty, "PLChests"); - data.WorldsData[world.worldName].progress = 1; + string[] test = { "Unknown", "Unknown", "Unknown", "Unknown" }; + + if (boss == "FF Team 6") + { + test[0] = "Leon (2)"; + test[1] = "Cloud (2)"; + test[2] = "Yuffie (2)"; + test[3] = "Tifa (2)"; + + replacementType = Codes.FindBossType(data.BossList[test[0]]); + if (replacementType == "Unknown") + { + //Console.WriteLine("Unknown Replacement Boss: " + data.BossList[test[0]] + ". Using default points."); + App.logger?.Record("Unknown Replacement Boss: " + data.BossList[test[0]] + ". Using default points."); + replacementType = "boss_other"; + } + else App.logger?.Record(test[0] + " Replacement: " + data.BossList[test[0]]); + + points = data.PointsDatanew[replacementType]; + + replacementType = Codes.FindBossType(data.BossList[test[1]]); + if (replacementType == "Unknown") + { + //Console.WriteLine("Unknown Replacement Boss: " + data.BossList[test[1]] + ". Using default points."); + App.logger?.Record("Unknown Replacement Boss: " + data.BossList[test[1]] + ". Using default points."); + replacementType = "boss_other"; + } + else App.logger?.Record(test[1] + " Replacement: " + data.BossList[test[1]]); + + points += data.PointsDatanew[replacementType]; + + replacementType = Codes.FindBossType(data.BossList[test[2]]); + if (replacementType == "Unknown") + { + //Console.WriteLine("Unknown Replacement Boss: " + data.BossList[test[2]] + ". Using default points."); + App.logger?.Record("Unknown Replacement Boss: " + data.BossList[test[2]] + ". Using default points."); + replacementType = "boss_other"; + } + else App.logger?.Record(test[2] + " Replacement: " + data.BossList[test[2]]); + + points += data.PointsDatanew[replacementType]; + + replacementType = Codes.FindBossType(data.BossList[test[3]]); + if (replacementType == "Unknown") + { + //Console.WriteLine("Unknown Replacement Boss: " + data.BossList[test[3]] + ". Using default points."); + App.logger?.Record("Unknown Replacement Boss: " + data.BossList[test[3]] + ". Using default points."); + replacementType = "boss_other"; + } + else App.logger?.Record(test[3] + " Replacement: " + data.BossList[test[3]]); + + points += data.PointsDatanew[replacementType]; + + //bonus points here should be sum of both boss types / 2 + if (points > 1) + points += points / 2; + } + else + { + if (boss == "FF Team 1") + { + test[0] = "Leon"; + test[1] = "Yuffie"; + } + if (boss == "FF Team 2") + { + test[0] = "Leon (3)"; + test[1] = "Yuffie (3)"; + } + if (boss == "FF Team 3") + { + test[0] = "Yuffie (1)"; + test[1] = "Tifa"; + } + if (boss == "FF Team 4") + { + test[0] = "Cloud"; + test[1] = "Tifa (1)"; + } + if (boss == "FF Team 5") + { + test[0] = "Leon (1)"; + test[1] = "Cloud (1)"; + } + + replacementType = Codes.FindBossType(data.BossList[test[0]]); + if (replacementType == "Unknown") + { + //Console.WriteLine("Unknown Replacement Boss: " + data.BossList[test[0]] + ". Using default points."); + App.logger?.Record("Unknown Replacement Boss: " + data.BossList[test[0]] + ". Using default points."); + replacementType = "boss_other"; + } + else App.logger?.Record(test[0] + " Replacement: " + data.BossList[test[0]]); + + points = data.PointsDatanew[replacementType]; + + replacementType = Codes.FindBossType(data.BossList[test[1]]); + if (replacementType == "Unknown") + { + //Console.WriteLine("Unknown Replacement Boss: " + data.BossList[test[1]] + ". Using default points."); + App.logger?.Record("Unknown Replacement Boss: " + data.BossList[test[1]] + ". Using default points."); + replacementType = "boss_other"; + } + else App.logger?.Record(test[1] + " Replacement: " + data.BossList[test[1]]); + + points += data.PointsDatanew[replacementType]; + + //bonus points here should be sum of both boss types / 2 + if (points > 1) + points += points / 2; + } } - else if (world.roomNumber == 15 && world.eventID1 == 59 && world.eventComplete == 1) // Groundshaker finish + else { - broadcast.PrideLandsProgression.SetResourceReference(ContentProperty, "Groundshaker"); - PrideLandsProgression.SetResourceReference(ContentProperty, "Groundshaker"); - data.WorldsData[world.worldName].progress = 4; + if (boss == "FF Team 6") + { + points = data.PointsDatanew["boss_other"] * 4; + } + else + { + points = data.PointsDatanew["boss_other"] * 2; + } } } - else if (world.worldName == "Atlantica") + else { - if (world.roomNumber == 2 && world.eventID1 == 63) // Tutorial + bossType = Codes.FindBossType(boss); + if (bossType == "Unknown") { - AtlanticaProgression.SetResourceReference(ContentProperty, "Tutorial"); - data.WorldsData[world.worldName].progress = 1; + Console.WriteLine("Unknown Boss: " + boss + ". Using default points."); + + if (App.logger != null) + App.logger.Record("Unknown Boss: " + boss + ". Using default points."); + + bossType = "boss_other"; } - else if (world.roomNumber == 9 && world.eventID1 == 65) // Ursula's Revenge + + if (data.BossRandoFound && data.BossList.ContainsKey(boss)) { - AtlanticaProgression.SetResourceReference(ContentProperty, "Ursula"); - data.WorldsData[world.worldName].progress = 2; + replacementType = Codes.FindBossType(data.BossList[boss]); + + if (replacementType == "Unknown") + { + //Console.WriteLine("Unknown Replacement Boss: " + data.BossList[boss] + ". Using default points."); + App.logger?.Record("Unknown Replacement Boss: " + data.BossList[boss] + ". Using default points."); + + replacementType = "boss_other"; + } + else + { + App.logger?.Record(boss + " Replacement: " + data.BossList[boss]); + } + + points = data.PointsDatanew[replacementType]; + + //add extra points for bosses in special arenas + int bonuspoints = 0; + switch (bossType) + { + case "boss_as": + case "boss_datas": + case "boss_sephi": + case "boss_terra": + //case "boss_final": + bonuspoints += data.PointsDatanew[bossType]; + break; + case "boss_other": + if (boss == "Final Xemnas") + bonuspoints += data.PointsDatanew["boss_final"]; + break; + } + + points += bonuspoints; } - else if (world.roomNumber == 4 && world.eventID1 == 55) // A New Day is Dawning + else { - AtlanticaProgression.SetResourceReference(ContentProperty, "NewDay"); - data.WorldsData[world.worldName].progress = 3; + points = data.PointsDatanew[bossType]; + + //logging + if(data.BossRandoFound) + { + App.logger?.Record("No replacement found? Boss: " + boss); + } } } - else if (world.worldName == "DisneyCastle") + + UpdatePointScore(points); + } + + private void HighlightWorld(World world) + { + if (WorldHighlightOption.IsChecked == false) + return; + + if (world.previousworldName != null && data.WorldsData.ContainsKey(world.previousworldName)) { - if (world.roomNumber == 1 && world.eventID1 == 53 && data.WorldsData[world.worldName].progress == 0) // Library (DC) + foreach (Rectangle Box in data.WorldsData[world.previousworldName].top.Children.OfType().Where(Box => Box.Name.EndsWith("SelWG"))) { - broadcast.DisneyCastleProgression.SetResourceReference(ContentProperty, "DCChests"); - DisneyCastleProgression.SetResourceReference(ContentProperty, "DCChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 0 && world.eventID1 == 51 && world.eventComplete == 1) // Minnie Escort finish - { - broadcast.DisneyCastleProgression.SetResourceReference(ContentProperty, "Minnie"); - DisneyCastleProgression.SetResourceReference(ContentProperty, "Minnie"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 0 && world.eventID3 == 22 && data.WorldsData[world.worldName].progress == 0) // Cornerstone Hill (TR) (Audience Chamber has no Evt 0x16) - { - broadcast.DisneyCastleProgression.SetResourceReference(ContentProperty, "DCChests"); - DisneyCastleProgression.SetResourceReference(ContentProperty, "DCChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 1 && world.eventID1 == 58 && world.eventComplete == 1) // Old Pete finish - { - broadcast.DisneyCastleProgression.SetResourceReference(ContentProperty, "OldPete"); - DisneyCastleProgression.SetResourceReference(ContentProperty, "OldPete"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 0 && world.eventID3 == 6) // Windows popup (Audience Chamber has no Evt 0x06) - { - broadcast.DisneyCastleProgression.SetResourceReference(ContentProperty, "Windows"); - DisneyCastleProgression.SetResourceReference(ContentProperty, "Windows"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 2 && world.eventID1 == 52 && world.eventComplete == 1) // Boat Pete finish - { - broadcast.DisneyCastleProgression.SetResourceReference(ContentProperty, "BoatPete"); - DisneyCastleProgression.SetResourceReference(ContentProperty, "BoatPete"); - data.WorldsData[world.worldName].progress = 5; - } - else if (world.roomNumber == 3 && world.eventID1 == 53 && world.eventComplete == 1) // DC Pete finish - { - broadcast.DisneyCastleProgression.SetResourceReference(ContentProperty, "DCPete"); - DisneyCastleProgression.SetResourceReference(ContentProperty, "DCPete"); - data.WorldsData[world.worldName].progress = 6; - } - else if (world.roomNumber == 38 && (world.eventID1 == 145 || world.eventID1 == 150) && world.eventComplete == 1) // Marluxia finish - { - broadcast.DisneyCastleProgression.SetResourceReference(ContentProperty, "Marluxia"); - DisneyCastleProgression.SetResourceReference(ContentProperty, "Marluxia"); - data.WorldsData[world.worldName].progress = 7; - } - else if (world.roomNumber == 7 && world.eventID1 == 67 && world.eventComplete == 1) // Lingering Will finish - { - broadcast.DisneyCastleProgression.SetResourceReference(ContentProperty, "LingeringWill"); - DisneyCastleProgression.SetResourceReference(ContentProperty, "LingeringWill"); - data.WorldsData[world.worldName].progress = 8; + Box.Visibility = Visibility.Collapsed; } } - else if (world.worldName == "HalloweenTown") + + if (data.WorldsData.ContainsKey(world.worldName)) { - if (world.roomNumber == 4 && world.eventID3 == 1 && data.WorldsData[world.worldName].progress == 0) // Hinterlands (HT1) - { - broadcast.HalloweenTownProgression.SetResourceReference(ContentProperty, "HTChests"); - HalloweenTownProgression.SetResourceReference(ContentProperty, "HTChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 6 && world.eventID1 == 53 && world.eventComplete == 1) // Candy Cane Lane fight finish - { - broadcast.HalloweenTownProgression.SetResourceReference(ContentProperty, "CandyCaneLane"); - HalloweenTownProgression.SetResourceReference(ContentProperty, "CandyCaneLane"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 3 && world.eventID1 == 52 && world.eventComplete == 1) // Prison Keeper finish + foreach (Rectangle Box in data.WorldsData[world.worldName].top.Children.OfType().Where(Box => Box.Name.EndsWith("SelWG"))) { - broadcast.HalloweenTownProgression.SetResourceReference(ContentProperty, "PrisonKeeper"); - HalloweenTownProgression.SetResourceReference(ContentProperty, "PrisonKeeper"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 9 && world.eventID1 == 55 && world.eventComplete == 1) // Oogie Boogie finish - { - broadcast.HalloweenTownProgression.SetResourceReference(ContentProperty, "OogieBoogie"); - HalloweenTownProgression.SetResourceReference(ContentProperty, "OogieBoogie"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 1 && world.eventID3 == 10 && data.WorldsData[world.worldName].progress == 0) // Dr. Finklestein's Lab (HT2) - { - broadcast.HalloweenTownProgression.SetResourceReference(ContentProperty, "HTChests"); - HalloweenTownProgression.SetResourceReference(ContentProperty, "HTChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 10 && world.eventID1 == 63 && world.eventComplete == 1) // Presents minigame - { - broadcast.HalloweenTownProgression.SetResourceReference(ContentProperty, "Presents"); - HalloweenTownProgression.SetResourceReference(ContentProperty, "Presents"); - data.WorldsData[world.worldName].progress = 5; - } - else if (world.roomNumber == 7 && world.eventID1 == 64 && world.eventComplete == 1) // Experiment finish - { - broadcast.HalloweenTownProgression.SetResourceReference(ContentProperty, "Experiment"); - HalloweenTownProgression.SetResourceReference(ContentProperty, "Experiment"); - data.WorldsData[world.worldName].progress = 6; - } - else if (world.roomNumber == 32 && (world.eventID1 == 115 || world.eventID1 == 146) && world.eventComplete == 1) // Vexen finish - { - broadcast.HalloweenTownProgression.SetResourceReference(ContentProperty, "Vexen"); - HalloweenTownProgression.SetResourceReference(ContentProperty, "Vexen"); - data.WorldsData[world.worldName].progress = 7; + Box.Visibility = Visibility.Visible; } } - else if (world.worldName == "PortRoyal") + } + + /// + /// Bindings & helpers + /// + + private void SetBindings() + { + BindWeapon(SorasHeartWeapon, "Weapon", stats); + + //changes opacity for stat icons + BindAbility(HighJump, "Obtained", highJump); + BindAbility(QuickRun, "Obtained", quickRun); + BindAbility(DodgeRoll, "Obtained", dodgeRoll); + BindAbility(AerialDodge, "Obtained", aerialDodge); + BindAbility(Glide, "Obtained", glide); + + BindForm(WisdomM, "Obtained", wisdom); + BindForm(LimitM, "Obtained", limit); + BindForm(MasterM, "Obtained", master); + + if (data.altFinalTracking) { - if (world.roomNumber == 0 && world.eventID3 == 1 && data.WorldsData[world.worldName].progress == 0) // Rampart (PR1) - { - broadcast.PortRoyalProgression.SetResourceReference(ContentProperty, "PRChests"); - PortRoyalProgression.SetResourceReference(ContentProperty, "PRChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 2 && world.eventID1 == 55 && world.eventComplete == 1) // Town finish - { - broadcast.PortRoyalProgression.SetResourceReference(ContentProperty, "Town"); - PortRoyalProgression.SetResourceReference(ContentProperty, "Town"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 10 && world.eventID1 == 60 && world.eventComplete == 1) // Barbossa finish - { - broadcast.PortRoyalProgression.SetResourceReference(ContentProperty, "Barbossa"); - PortRoyalProgression.SetResourceReference(ContentProperty, "Barbossa"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 10 && world.eventID3 == 10 && data.WorldsData[world.worldName].progress == 0) // Treasure Heap (PR2) - { - broadcast.PortRoyalProgression.SetResourceReference(ContentProperty, "PRChests"); - PortRoyalProgression.SetResourceReference(ContentProperty, "PRChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 14 && world.eventID1 == 62 && world.eventComplete == 1) // Gambler finish - { - broadcast.PortRoyalProgression.SetResourceReference(ContentProperty, "Gambler"); - PortRoyalProgression.SetResourceReference(ContentProperty, "Gambler"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 1 && world.eventID1 == 54 && world.eventComplete == 1) // Grim Reaper finish - { - broadcast.PortRoyalProgression.SetResourceReference(ContentProperty, "GrimReaper"); - PortRoyalProgression.SetResourceReference(ContentProperty, "GrimReaper"); - data.WorldsData[world.worldName].progress = 5; - } + BindForm(ValorM, "Obtained", valorReal); + BindForm(FinalM, "Obtained", finalReal); } - else if (world.worldName == "SpaceParanoids") + else { - if (world.roomNumber == 1 && world.eventID3 == 1 && data.WorldsData[world.worldName].progress == 0) // Canyon (SP1) - { - broadcast.SpaceParanoidsProgression.SetResourceReference(ContentProperty, "SPChests"); - SpaceParanoidsProgression.SetResourceReference(ContentProperty, "SPChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 3 && world.eventID1 == 54 && world.eventComplete == 1) // Screens finish - { - broadcast.SpaceParanoidsProgression.SetResourceReference(ContentProperty, "Screens"); - SpaceParanoidsProgression.SetResourceReference(ContentProperty, "Screens"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 4 && world.eventID1 == 55 && world.eventComplete == 1) // Hostile Program finish - { - broadcast.SpaceParanoidsProgression.SetResourceReference(ContentProperty, "HostileProgram"); - SpaceParanoidsProgression.SetResourceReference(ContentProperty, "HostileProgram"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 1 && world.eventID3 == 10 && data.WorldsData[world.worldName].progress == 0) // Canyon (SP2) - { - broadcast.SpaceParanoidsProgression.SetResourceReference(ContentProperty, "SPChests"); - SpaceParanoidsProgression.SetResourceReference(ContentProperty, "SPChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 7 && world.eventID1 == 57 && world.eventComplete == 1) // Solar Sailer finish - { - broadcast.SpaceParanoidsProgression.SetResourceReference(ContentProperty, "SolarSailer"); - SpaceParanoidsProgression.SetResourceReference(ContentProperty, "SolarSailer"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 9 && world.eventID1 == 59 && world.eventComplete == 1) // MCP finish - { - broadcast.SpaceParanoidsProgression.SetResourceReference(ContentProperty, "MCP"); - SpaceParanoidsProgression.SetResourceReference(ContentProperty, "MCP"); - data.WorldsData[world.worldName].progress = 5; - } - else if (world.roomNumber == 33 && (world.eventID1 == 143 || world.eventID1 == 148) && world.eventComplete == 1) // Larxene finish - { - broadcast.SpaceParanoidsProgression.SetResourceReference(ContentProperty, "Larxene"); - SpaceParanoidsProgression.SetResourceReference(ContentProperty, "Larxene"); - data.WorldsData[world.worldName].progress = 6; - } + BindForm(ValorM, "Obtained", valor); + BindForm(FinalM, "Obtained", final); } - else if (world.worldName == "TWTNW") - { - if (world.roomNumber == 1 && world.eventID3 == 1) // Alley to Between - { - broadcast.TWTNWProgression.SetResourceReference(ContentProperty, "TWTNWChests"); - TWTNWProgression.SetResourceReference(ContentProperty, "TWTNWChests"); - data.WorldsData[world.worldName].progress = 1; - } - else if (world.roomNumber == 21 && world.eventID1 == 65 && world.eventComplete == 1) // Roxas finish - { - broadcast.TWTNWProgression.SetResourceReference(ContentProperty, "Roxas"); - TWTNWProgression.SetResourceReference(ContentProperty, "Roxas"); - data.WorldsData[world.worldName].progress = 2; - } - else if (world.roomNumber == 10 && world.eventID1 == 57 && world.eventComplete == 1) // Xigbar finish - { - broadcast.TWTNWProgression.SetResourceReference(ContentProperty, "Xigbar"); - TWTNWProgression.SetResourceReference(ContentProperty, "Xigbar"); - data.WorldsData[world.worldName].progress = 3; - } - else if (world.roomNumber == 14 && world.eventID1 == 58 && world.eventComplete == 1) // Luxord finish - { - broadcast.TWTNWProgression.SetResourceReference(ContentProperty, "Luxord"); - TWTNWProgression.SetResourceReference(ContentProperty, "Luxord"); - data.WorldsData[world.worldName].progress = 4; - } - else if (world.roomNumber == 15 && world.eventID1 == 56 && world.eventComplete == 1) // Saix finish - { - broadcast.TWTNWProgression.SetResourceReference(ContentProperty, "Saix"); - TWTNWProgression.SetResourceReference(ContentProperty, "Saix"); - data.WorldsData[world.worldName].progress = 5; - } - else if (world.roomNumber == 19 && world.eventID1 == 59 && world.eventComplete == 1) // Xemnas 1 finish - { - broadcast.TWTNWProgression.SetResourceReference(ContentProperty, "Xemnas1"); - TWTNWProgression.SetResourceReference(ContentProperty, "Xemnas1"); - data.WorldsData[world.worldName].progress = 6; - } - else if (world.roomNumber == 20 && world.eventID1 == 98 && world.eventComplete == 1) // Data Xemnas finish - { - broadcast.TWTNWProgression.SetResourceReference(ContentProperty, "DataXemnas"); - TWTNWProgression.SetResourceReference(ContentProperty, "DataXemnas"); - data.WorldsData[world.worldName].progress = 7; - } + } - // Handle data fights - else if (world.roomNumber == 21 && world.eventID1 == 99 && world.eventComplete == 1) // Data Roxas finish - { - broadcast.SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "DataRoxas"); - SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, "DataRoxas"); - data.WorldsData["SimulatedTwilightTown"].progress = 3; - } - else if (world.roomNumber == 10 && world.eventID1 == 100 && world.eventComplete == 1) // Data Xigbar finish - { - broadcast.LandofDragonsProgression.SetResourceReference(ContentProperty, "DataXigbar"); - LandofDragonsProgression.SetResourceReference(ContentProperty, "DataXigbar"); - data.WorldsData["LandofDragons"].progress = 7; - } - else if (world.roomNumber == 15 && world.eventID1 == 102 && world.eventComplete == 1) // Data Saix finish - { - broadcast.PrideLandsProgression.SetResourceReference(ContentProperty, "DataSaix"); - PrideLandsProgression.SetResourceReference(ContentProperty, "DataSaix"); - data.WorldsData["PrideLands"].progress = 5; - } - else if (world.roomNumber == 14 && world.eventID1 == 101 && world.eventComplete == 1) // Data Luxord finish - { - broadcast.PortRoyalProgression.SetResourceReference(ContentProperty, "DataLuxord"); - PortRoyalProgression.SetResourceReference(ContentProperty, "DataLuxord"); - data.WorldsData["PortRoyal"].progress = 6; - } - } + private void BindForm(ContentControl img, string property, object source) + { + Binding binding = new Binding(property); + binding.Source = source; + binding.Converter = new ObtainedConverter(); + img.SetBinding(OpacityProperty, binding); + } + + private void BindAbility(ContentControl img, string property, object source) + { + Binding binding = new Binding(property); + binding.Source = source; + binding.Converter = new ObtainedConverter(); + img.SetBinding(OpacityProperty, binding); + } + + private void BindWeapon(Image img, string property, object source) + { + Binding binding = new Binding(property); + binding.Source = source; + binding.Converter = new WeaponConverter(); + img.SetBinding(Image.SourceProperty, binding); } private string BytesToHex(byte[] bytes) @@ -1348,65 +2775,153 @@ private string BytesToHex(byte[] bytes) return BitConverter.ToString(bytes).Replace("-", ""); } - private void BindStats(Image img, string property, object source) + public string GetWorld() { - Binding binding = new Binding(property); - binding.Source = source; - binding.Converter = new NumberConverter(); - img.SetBinding(Image.SourceProperty, binding); + return world.worldName; } - private void BindLevel(Image img, string property, object source) + //public void UpdateUsedPages() + //{ + // + // + // data.usedPages++; + //} + + public int GetUsedPages(int save) { - Binding binding = new Binding(property); - binding.Source = source; - binding.Converter = new LevelConverter(); - img.SetBinding(Image.SourceProperty, binding); + save = save - 0x3598; + int used = 0; + bool PigFlag = new BitArray(memory.ReadMemory(save + 0x1DB0, 1))[1]; + bool Page1Flag = new BitArray(memory.ReadMemory(save + 0x1DB1, 1))[1]; + bool Page2Flag = new BitArray(memory.ReadMemory(save + 0x1DB2, 1))[1]; + bool Page3Flag = new BitArray(memory.ReadMemory(save + 0x1DB3, 1))[1]; + bool Page4Flag = new BitArray(memory.ReadMemory(save + 0x1DB4, 1))[1]; + bool Page5Flag = new BitArray(memory.ReadMemory(save + 0x1DB5, 1))[0]; + + if (PigFlag && Page5Flag) + { + data.usedPages = 5; + return data.usedPages; + } + + if (Page1Flag) used++; + if (Page2Flag) used++; + if (Page3Flag) used++; + if (Page4Flag) used++; + + data.usedPages = used; + + return data.usedPages; } - private void BindForm(ContentControl img, string property, object source) + public void UpdateFormProgression() { - Binding binding = new Binding(property); - binding.Source = source; - binding.Converter = new ObtainedConverter(); - img.SetBinding(OpacityProperty, binding); + int found = 0; + string drives = ""; + bool OldToggled = Properties.Settings.Default.OldProg; + bool CustomToggled = Properties.Settings.Default.CustomIcons; + string Prog = "Min-"; //Default + if (OldToggled) + Prog = "Old-"; + if (CustomProgFound && CustomToggled) + Prog = "Cus-"; + + if (ValorM.Opacity == 1) + found++; + if (WisdomM.Opacity == 1) + found++; + if (LimitM.Opacity == 1) + found++; + if (MasterM.Opacity == 1) + found++; + if (FinalM.Opacity == 1) + found++; + + + switch (found) + { + case 1: + drives = "Drive3"; + break; + case 2: + drives = "Drive4"; + break; + case 3: + drives = "Drive5"; + break; + case 4: + drives = "Drive6"; + break; + case 5: + drives = "Drive7"; + break; + default: + drives = "Drive2"; + break; + } + + DriveFormsCap.SetResourceReference(ContentProperty, Prog + drives); } - private void BindFormLevel(Image img, string property, object source, IValueConverter convertor) + private int ReadMemInt(int address) { - Binding binding = new Binding(property); - binding.Source = source; - binding.Converter = new LevelConverter(); - img.SetBinding(Image.SourceProperty, binding); + address = address + ADDRESS_OFFSET; + return BitConverter.ToInt32(memory.ReadMemory(address, 4), 0); } - private void BindWeapon(Image img, string property, object source) + private string ReadMemString(int address, int length) { - Binding binding = new Binding(property); - binding.Source = source; - binding.Converter = new WeaponConverter(); - img.SetBinding(Image.SourceProperty, binding); + address = address + ADDRESS_OFFSET; + string result = Encoding.Default.GetString(memory.ReadMemory(address, length), 0, length); + return result.TrimEnd('\0'); } - private void BindAbilityLevel(Image img, string property, object source, IValueConverter convertor) + private int ReadPcPointer(int address) { - Binding binding = new Binding(property); - binding.Source = source; - binding.Converter = convertor; - img.SetBinding(Image.SourceProperty, binding); + long origAddress = BitConverter.ToInt64(memory.ReadMemory(address, 8), 0); + long baseAddress = memory.GetBaseAddress(); + long result = origAddress - baseAddress; + return (int)result; } - private void BindAbility(Image img, string property, object source) + //progression hints - compare last saved progression point + //must be checked this way cause of OnTimedEvent + public void UpdateProgressionPoints(string worldName, int prog) { - Binding binding = new Binding(property); - binding.Source = source; - binding.Converter = new ObtainedConverter(); - img.SetBinding(OpacityProperty, binding); + //if event is current, skip + //if ((world.eventID1 == data.PrevEventID1 && world.eventID3 == data.PrevEventID3 + // && world.worldName == data.PrevWorld && world.roomNumber == data.PrevRoomNum) + // || !data.UsingProgressionHints) + // return; + + AddProgressionPoints(GetProgressionPointsReward(worldName, prog)); + + //data.PrevEventID1 = world.eventID1; + //data.PrevEventID3 = world.eventID3; + //data.PrevWorld = world.worldName; + //data.PrevRoomNum = world.roomNumber; } - - public string GetWorld() + public void UpdateProgressionPointsTWTNW(string worldName) { - return world.worldName; + //if event is current, skip + //if ((world.eventID1 == data.PrevEventID1 && world.eventID3 == data.PrevEventID3 + // && world.worldName == data.PrevWorld && world.roomNumber == data.PrevRoomNum) + // || !data.UsingProgressionHints) + // return; + //Console.WriteLine("Defeated Final Xemnas"); + + data.TWTNW_ProgressionValues.Add(200); + AddProgressionPoints(GetProgressionPointsReward(worldName, data.TWTNW_ProgressionValues.Count)); + data.TWTNW_ProgressionValues.RemoveAt(data.TWTNW_ProgressionValues.Count - 1); + + data.TWTNW_ProgressionValues.Add(-200); + AddProgressionPoints(GetProgressionPointsReward(worldName, data.TWTNW_ProgressionValues.Count)); + data.TWTNW_ProgressionValues.RemoveAt(data.TWTNW_ProgressionValues.Count - 1); + + //data.PrevEventID1 = world.eventID1; + //data.PrevEventID3 = world.eventID3; + //data.PrevWorld = world.worldName; + //data.PrevRoomNum = world.roomNumber; } } -} +} \ No newline at end of file diff --git a/KhTracker/AutoTracking/CheckEveryCheck.cs b/KhTracker/AutoTracking/CheckEveryCheck.cs index aec3d0e0..62045614 100644 --- a/KhTracker/AutoTracking/CheckEveryCheck.cs +++ b/KhTracker/AutoTracking/CheckEveryCheck.cs @@ -10,7 +10,6 @@ namespace KhTracker /* Author: Coraccio aka Racci * Implemented to track Final Form after being forced * (Searches all checks except for Sora/Drive levels, where it only looks through the important checks already scanned by Rewards) - * (Skips searching through Drive levels since forms cannot be on other forms as per rando logic) */ class CheckEveryCheck { @@ -22,8 +21,19 @@ class CheckEveryCheck public World World; public Stats Stats; public Rewards Rewards; + public DriveForm Valor; + public DriveForm Wisdom; + public DriveForm Limit; + public DriveForm Master; + public DriveForm Final; private bool onLevels = false; private Dictionary targetLevel; + private bool onValor = false; + private bool onWisdom = false; + private bool onLimit = false; + private bool onMaster = false; + private bool onFinal = false; + private Dictionary targetDriveLevel; private int target; public int Target @@ -38,490 +48,602 @@ public bool TargetObtained get { return targetObtained; } } - public CheckEveryCheck(MemoryReader mem, int offset, int saveAnchor, int sysAnchor, int battleAnchor, World world, Stats stats, Rewards rewards) + public CheckEveryCheck(MemoryReader mem, int offset, int saveAnchor, int sysAnchor, int battleAnchor, World world, Stats stats, Rewards rewards, + DriveForm valor, DriveForm wisdom, DriveForm limit, DriveForm master, DriveForm final) { memory = mem; ADDRESS_OFFSET = offset; Save = saveAnchor; - Sys3 = sysAnchor; - Btl0 = battleAnchor; + Sys3 = GetSubOffset(sysAnchor, 7); + Btl0 = GetSubOffset(battleAnchor, 6); World = world; Stats = stats; Rewards = rewards; + Valor = valor; + Wisdom = wisdom; + Limit = limit; + Master = master; + Final = final; + checksList = new List(); + #region Chest // Chest (317) - checksList.Add(new Check(this, Sys3 + 0x1442A, Save + 0x23AC, 1)); // Bamboo Grove - checksList.Add(new Check(this, Sys3 + 0x14436, Save + 0x23D9, 7)); // Bamboo Grove - checksList.Add(new Check(this, Sys3 + 0x14442, Save + 0x23DA, 0)); // Bamboo Grove - checksList.Add(new Check(this, Sys3 + 0x1444E, Save + 0x23AD, 1)); // Checkpoint - checksList.Add(new Check(this, Sys3 + 0x1445A, Save + 0x23AD, 2)); // Checkpoint - checksList.Add(new Check(this, Sys3 + 0x14466, Save + 0x23AD, 3)); // Mountain Trail - checksList.Add(new Check(this, Sys3 + 0x14472, Save + 0x23AD, 4)); // Mountain Trail - checksList.Add(new Check(this, Sys3 + 0x1447E, Save + 0x23AD, 5)); // Mountain Trail - checksList.Add(new Check(this, Sys3 + 0x1448A, Save + 0x23AD, 6)); // Mountain Trail - checksList.Add(new Check(this, Sys3 + 0x14496, Save + 0x23AD, 7)); // Village Cave - checksList.Add(new Check(this, Sys3 + 0x144A2, Save + 0x23AE, 0)); // Village Cave - checksList.Add(new Check(this, Sys3 + 0x144AE, Save + 0x23AE, 1)); // Ridge - checksList.Add(new Check(this, Sys3 + 0x144BA, Save + 0x23AE, 2)); // Ridge - checksList.Add(new Check(this, Sys3 + 0x144C6, Save + 0x23AE, 3)); // Throne Room - checksList.Add(new Check(this, Sys3 + 0x144D2, Save + 0x23AE, 4)); // Throne Room - checksList.Add(new Check(this, Sys3 + 0x144DE, Save + 0x23AE, 5)); // Throne Room - checksList.Add(new Check(this, Sys3 + 0x144EA, Save + 0x23AE, 6)); // Throne Room - checksList.Add(new Check(this, Sys3 + 0x144F6, Save + 0x23AE, 7)); // Throne Room - checksList.Add(new Check(this, Sys3 + 0x14502, Save + 0x23AF, 0)); // Throne Room - checksList.Add(new Check(this, Sys3 + 0x1450E, Save + 0x23AF, 1)); // Throne Room - checksList.Add(new Check(this, Sys3 + 0x1451A, Save + 0x23AF, 2)); // Throne Room - checksList.Add(new Check(this, Sys3 + 0x14526, Save + 0x23AF, 3)); // Agrabah - checksList.Add(new Check(this, Sys3 + 0x14532, Save + 0x23AF, 4)); // Agrabah - checksList.Add(new Check(this, Sys3 + 0x1453E, Save + 0x23AF, 5)); // Agrabah - checksList.Add(new Check(this, Sys3 + 0x1454A, Save + 0x23AF, 6)); // Agrabah - checksList.Add(new Check(this, Sys3 + 0x14556, Save + 0x23AF, 7)); // Agrabah - checksList.Add(new Check(this, Sys3 + 0x14562, Save + 0x23B0, 0)); // Agrabah - checksList.Add(new Check(this, Sys3 + 0x1456E, Save + 0x23DA, 3)); // Agrabah - checksList.Add(new Check(this, Sys3 + 0x14562, Save + 0x23B0, 1)); // Bazaar - checksList.Add(new Check(this, Sys3 + 0x14562, Save + 0x23B0, 2)); // Bazaar - checksList.Add(new Check(this, Sys3 + 0x14592, Save + 0x23B0, 3)); // Bazaar - checksList.Add(new Check(this, Sys3 + 0x1459E, Save + 0x23B0, 4)); // Bazaar - checksList.Add(new Check(this, Sys3 + 0x145AA, Save + 0x23B0, 5)); // Bazaar - checksList.Add(new Check(this, Sys3 + 0x145B6, Save + 0x23B0, 6)); // Palace Walls - checksList.Add(new Check(this, Sys3 + 0x145C2, Save + 0x23DB, 5)); // Palace Walls - checksList.Add(new Check(this, Sys3 + 0x145CE, Save + 0x23B0, 7)); // The Cave of Wonders: Entrance - checksList.Add(new Check(this, Sys3 + 0x145DA, Save + 0x23B1, 0)); // The Cave of Wonders: Entrance - checksList.Add(new Check(this, Sys3 + 0x145E6, Save + 0x23B1, 2)); // The Cave of Wonders: Valley of Stone - checksList.Add(new Check(this, Sys3 + 0x145F2, Save + 0x23B1, 3)); // The Cave of Wonders: Valley of Stone - checksList.Add(new Check(this, Sys3 + 0x145FE, Save + 0x23B1, 4)); // The Cave of Wonders: Valley of Stone - checksList.Add(new Check(this, Sys3 + 0x1460A, Save + 0x23B1, 5)); // The Cave of Wonders: Valley of Stone - checksList.Add(new Check(this, Sys3 + 0x14616, Save + 0x23D8, 7)); // The Cave of Wonders: Chasm of Challenges - checksList.Add(new Check(this, Sys3 + 0x14622, Save + 0x23B1, 6)); // The Cave of Wonders: Chasm of Challenges - checksList.Add(new Check(this, Sys3 + 0x1462E, Save + 0x23DA, 4)); // The Cave of Wonders: Treasure Room - checksList.Add(new Check(this, Sys3 + 0x1463A, Save + 0x23DA, 5)); // The Cave of Wonders: Treasure Room - checksList.Add(new Check(this, Sys3 + 0x14646, Save + 0x23B1, 1)); // Ruined Chamber - checksList.Add(new Check(this, Sys3 + 0x14652, Save + 0x23D8, 6)); // Ruined Chamber - checksList.Add(new Check(this, Sys3 + 0x1465E, Save + 0x23B2, 0)); // Cornerstone Hill - checksList.Add(new Check(this, Sys3 + 0x1466A, Save + 0x23B2, 1)); // Cornerstone Hill - checksList.Add(new Check(this, Sys3 + 0x14676, Save + 0x23B2, 3)); // Pier - checksList.Add(new Check(this, Sys3 + 0x14682, Save + 0x23B2, 4)); // Pier - checksList.Add(new Check(this, Sys3 + 0x1468E, Save + 0x23B2, 5)); // Waterway - checksList.Add(new Check(this, Sys3 + 0x1469A, Save + 0x23B2, 6)); // Waterway - checksList.Add(new Check(this, Sys3 + 0x146A6, Save + 0x23B2, 7)); // Waterway - checksList.Add(new Check(this, Sys3 + 0x146B2, Save + 0x23B4, 1)); // Courtyard (DC) - checksList.Add(new Check(this, Sys3 + 0x146BE, Save + 0x23B4, 2)); // Courtyard (DC) - checksList.Add(new Check(this, Sys3 + 0x146CA, Save + 0x23B4, 3)); // Courtyard (DC) - checksList.Add(new Check(this, Sys3 + 0x146D6, Save + 0x23B4, 4)); // Courtyard (DC) - checksList.Add(new Check(this, Sys3 + 0x146E2, Save + 0x23B4, 5)); // Courtyard (DC) - checksList.Add(new Check(this, Sys3 + 0x146EE, Save + 0x23B4, 6)); // Courtyard (DC) - checksList.Add(new Check(this, Sys3 + 0x146FA, Save + 0x23B4, 7)); // Courtyard (DC) - checksList.Add(new Check(this, Sys3 + 0x14706, Save + 0x23B4, 0)); // Library - checksList.Add(new Check(this, Sys3 + 0x14712, Save + 0x23C9, 7)); // Pooh Bear's House - checksList.Add(new Check(this, Sys3 + 0x1471E, Save + 0x23B5, 4)); // Pooh Bear's House - checksList.Add(new Check(this, Sys3 + 0x1472A, Save + 0x23B5, 5)); // Pooh Bear's House - checksList.Add(new Check(this, Sys3 + 0x14736, Save + 0x23B6, 4)); // Piglet's House - checksList.Add(new Check(this, Sys3 + 0x14742, Save + 0x23B6, 2)); // Piglet's House - checksList.Add(new Check(this, Sys3 + 0x1474E, Save + 0x23B6, 3)); // Piglet's House - checksList.Add(new Check(this, Sys3 + 0x1475A, Save + 0x23CA, 0)); // Rabbit's House - checksList.Add(new Check(this, Sys3 + 0x14766, Save + 0x23B5, 7)); // Rabbit's House - checksList.Add(new Check(this, Sys3 + 0x14772, Save + 0x23B6, 0)); // Rabbit's House - checksList.Add(new Check(this, Sys3 + 0x1477E, Save + 0x23B6, 5)); // Kanga's House - checksList.Add(new Check(this, Sys3 + 0x1478A, Save + 0x23B6, 6)); // Kanga's House - checksList.Add(new Check(this, Sys3 + 0x14796, Save + 0x23B6, 7)); // Kanga's House - checksList.Add(new Check(this, Sys3 + 0x147A2, Save + 0x23B7, 1)); // The Spooky Cave - checksList.Add(new Check(this, Sys3 + 0x147AE, Save + 0x23B7, 2)); // The Spooky Cave - checksList.Add(new Check(this, Sys3 + 0x147BA, Save + 0x23B7, 3)); // The Spooky Cave - checksList.Add(new Check(this, Sys3 + 0x147C6, Save + 0x23B7, 4)); // The Spooky Cave - checksList.Add(new Check(this, Sys3 + 0x147D2, Save + 0x23B7, 6)); // The Spooky Cave - checksList.Add(new Check(this, Sys3 + 0x147DE, Save + 0x23B7, 7)); // The Spooky Cave - checksList.Add(new Check(this, Sys3 + 0x147EA, Save + 0x23C9, 6)); // Starry Hill - checksList.Add(new Check(this, Sys3 + 0x147F6, Save + 0x23B5, 1)); // Starry Hill - checksList.Add(new Check(this, Sys3 + 0x14802, Save + 0x23B8, 0)); // Underworld Entrance - checksList.Add(new Check(this, Sys3 + 0x1480E, Save + 0x23B9, 6)); // Cave of the Dead: Passage - checksList.Add(new Check(this, Sys3 + 0x1481A, Save + 0x23B9, 7)); // Cave of the Dead: Passage - checksList.Add(new Check(this, Sys3 + 0x14826, Save + 0x23BA, 0)); // Cave of the Dead: Passage - checksList.Add(new Check(this, Sys3 + 0x14832, Save + 0x23BA, 1)); // Cave of the Dead: Passage - checksList.Add(new Check(this, Sys3 + 0x1483E, Save + 0x23BA, 2)); // Cave of the Dead: Passage - checksList.Add(new Check(this, Sys3 + 0x1484A, Save + 0x23B8, 4)); // Cave of the Dead: Inner Chamber - checksList.Add(new Check(this, Sys3 + 0x14856, Save + 0x23B8, 3)); // Cave of the Dead: Inner Chamber - checksList.Add(new Check(this, Sys3 + 0x14862, Save + 0x23B8, 5)); // Underworld Caverns: Entrance - checksList.Add(new Check(this, Sys3 + 0x1486E, Save + 0x23B8, 6)); // Underworld Caverns: Entrance - checksList.Add(new Check(this, Sys3 + 0x1487A, Save + 0x23DA, 6)); // Underworld Caverns: Entrance - checksList.Add(new Check(this, Sys3 + 0x14886, Save + 0x23BA, 3)); // Underworld Caverns: The Lost Road - checksList.Add(new Check(this, Sys3 + 0x14892, Save + 0x23BA, 4)); // Underworld Caverns: The Lost Road - checksList.Add(new Check(this, Sys3 + 0x1489E, Save + 0x23BA, 5)); // Underworld Caverns: The Lost Road - checksList.Add(new Check(this, Sys3 + 0x148AA, Save + 0x23BA, 6)); // Underworld Caverns: The Lost Road - checksList.Add(new Check(this, Sys3 + 0x148B6, Save + 0x23BA, 7)); // Underworld Caverns: Atrium - checksList.Add(new Check(this, Sys3 + 0x148C2, Save + 0x23BB, 0)); // Underworld Caverns: Atrium - checksList.Add(new Check(this, Sys3 + 0x148CE, Save + 0x23B9, 4)); // The Lock - checksList.Add(new Check(this, Sys3 + 0x148DA, Save + 0x23B9, 0)); // The Lock - checksList.Add(new Check(this, Sys3 + 0x148E6, Save + 0x23B9, 2)); // The Lock - checksList.Add(new Check(this, Sys3 + 0x148F2, Save + 0x23BB, 5)); // Courtyard (BC) - checksList.Add(new Check(this, Sys3 + 0x148FE, Save + 0x23BB, 6)); // Courtyard (BC) - checksList.Add(new Check(this, Sys3 + 0x1490A, Save + 0x23DA, 7)); // Courtyard (BC) - checksList.Add(new Check(this, Sys3 + 0x14916, Save + 0x23BB, 2)); // Belle's Room - checksList.Add(new Check(this, Sys3 + 0x14922, Save + 0x23BB, 3)); // Belle's Room - checksList.Add(new Check(this, Sys3 + 0x1492E, Save + 0x23BB, 7)); // The East Wing - checksList.Add(new Check(this, Sys3 + 0x1493A, Save + 0x23BC, 0)); // The East Wing - checksList.Add(new Check(this, Sys3 + 0x14946, Save + 0x23BC, 1)); // The West Wing - checksList.Add(new Check(this, Sys3 + 0x14952, Save + 0x23BC, 2)); // The West Wing - checksList.Add(new Check(this, Sys3 + 0x1495E, Save + 0x23BC, 3)); // The West Wing - checksList.Add(new Check(this, Sys3 + 0x1496A, Save + 0x23BC, 4)); // The West Wing - checksList.Add(new Check(this, Sys3 + 0x14976, Save + 0x23BB, 5)); // The West Wing - checksList.Add(new Check(this, Sys3 + 0x14982, Save + 0x23DB, 0)); // The West Wing - checksList.Add(new Check(this, Sys3 + 0x1498E, Save + 0x23BD, 0)); // Dungeon - checksList.Add(new Check(this, Sys3 + 0x1499A, Save + 0x23BD, 1)); // Dungeon - checksList.Add(new Check(this, Sys3 + 0x149A6, Save + 0x23BD, 2)); // Secret Passage - checksList.Add(new Check(this, Sys3 + 0x149B2, Save + 0x23BD, 5)); // Secret Passage - checksList.Add(new Check(this, Sys3 + 0x149BE, Save + 0x23BD, 3)); // Secret Passage - checksList.Add(new Check(this, Sys3 + 0x149CA, Save + 0x23BC, 6)); // The West Wing - checksList.Add(new Check(this, Sys3 + 0x149D6, Save + 0x23BC, 7)); // The West Wing - checksList.Add(new Check(this, Sys3 + 0x149E2, Save + 0x23BB, 4)); // Beast's Room - checksList.Add(new Check(this, Sys3 + 0x149EE, Save + 0x23CA, 2)); // Pit Cell - checksList.Add(new Check(this, Sys3 + 0x149FA, Save + 0x23BD, 6)); // Pit Cell - checksList.Add(new Check(this, Sys3 + 0x14A06, Save + 0x23BE, 1)); // Canyon - checksList.Add(new Check(this, Sys3 + 0x14A12, Save + 0x23BE, 2)); // Canyon - checksList.Add(new Check(this, Sys3 + 0x14A1E, Save + 0x23BE, 3)); // Canyon - checksList.Add(new Check(this, Sys3 + 0x14A2A, Save + 0x23DB, 6)); // Canyon - checksList.Add(new Check(this, Sys3 + 0x14A36, Save + 0x23BE, 4)); // I/O Tower: Hallway - checksList.Add(new Check(this, Sys3 + 0x14A42, Save + 0x23BE, 5)); // I/O Tower: Hallway - checksList.Add(new Check(this, Sys3 + 0x14A4E, Save + 0x23BF, 1)); // I/O Tower: Communications Room - checksList.Add(new Check(this, Sys3 + 0x14A5A, Save + 0x23DA, 1)); // I/O Tower: Communications Room - checksList.Add(new Check(this, Sys3 + 0x14A66, Save + 0x23BF, 4)); // Central Computer Mesa - checksList.Add(new Check(this, Sys3 + 0x14A72, Save + 0x23BF, 5)); // Central Computer Mesa - checksList.Add(new Check(this, Sys3 + 0x14A7E, Save + 0x23BF, 6)); // Central Computer Mesa - checksList.Add(new Check(this, Sys3 + 0x14A8A, Save + 0x23D9, 0)); // Central Computer Mesa - checksList.Add(new Check(this, Sys3 + 0x14A96, Save + 0x23C0, 2)); // Graveyard - checksList.Add(new Check(this, Sys3 + 0x14AA2, Save + 0x23C0, 3)); // Graveyard - checksList.Add(new Check(this, Sys3 + 0x14AAE, Save + 0x23C0, 1)); // Dr. Finkelstein's Lab - checksList.Add(new Check(this, Sys3 + 0x14ABA, Save + 0x23BF, 7)); // Halloween Town Square - checksList.Add(new Check(this, Sys3 + 0x14AC6, Save + 0x23C0, 0)); // Halloween Town Square - checksList.Add(new Check(this, Sys3 + 0x14AD2, Save + 0x23C0, 4)); // Hinterlands - checksList.Add(new Check(this, Sys3 + 0x14ADE, Save + 0x23C0, 5)); // Hinterlands - checksList.Add(new Check(this, Sys3 + 0x14AEA, Save + 0x23C0, 6)); // Hinterlands - checksList.Add(new Check(this, Sys3 + 0x14AF6, Save + 0x23C1, 0)); // Candy Cane Lane - checksList.Add(new Check(this, Sys3 + 0x14B02, Save + 0x23C1, 1)); // Candy Cane Lane - checksList.Add(new Check(this, Sys3 + 0x14B0E, Save + 0x23C1, 2)); // Candy Cane Lane - checksList.Add(new Check(this, Sys3 + 0x14B1A, Save + 0x23C1, 3)); // Candy Cane Lane - checksList.Add(new Check(this, Sys3 + 0x14B26, Save + 0x23C1, 6)); // Santa's House - checksList.Add(new Check(this, Sys3 + 0x14B32, Save + 0x23C1, 4)); // Santa's House - checksList.Add(new Check(this, Sys3 + 0x14B3E, Save + 0x23C2, 1)); // Rampart - checksList.Add(new Check(this, Sys3 + 0x14B4A, Save + 0x23C2, 2)); // Rampart - checksList.Add(new Check(this, Sys3 + 0x14B56, Save + 0x23C2, 3)); // Rampart - checksList.Add(new Check(this, Sys3 + 0x14B62, Save + 0x23C2, 4)); // Town - checksList.Add(new Check(this, Sys3 + 0x14B6E, Save + 0x23C2, 5)); // Town - checksList.Add(new Check(this, Sys3 + 0x14B7A, Save + 0x23C2, 6)); // Town - checksList.Add(new Check(this, Sys3 + 0x14B86, Save + 0x23C2, 7)); // Town - checksList.Add(new Check(this, Sys3 + 0x14B92, Save + 0x23C3, 1)); // Isla de Muerta: Cave Mouth - checksList.Add(new Check(this, Sys3 + 0x14B9E, Save + 0x23C3, 2)); // Isla de Muerta: Cave Mouth - checksList.Add(new Check(this, Sys3 + 0x14BAA, Save + 0x23CA, 7)); // Isla de Muerta: Powder Store - checksList.Add(new Check(this, Sys3 + 0x14BB6, Save + 0x23CB, 0)); // Isla de Muerta: Powder Store - checksList.Add(new Check(this, Sys3 + 0x14BC2, Save + 0x23C3, 4)); // Isla de Muerta: Moonlight Nook - checksList.Add(new Check(this, Sys3 + 0x14BCE, Save + 0x23C3, 5)); // Isla de Muerta: Moonlight Nook - checksList.Add(new Check(this, Sys3 + 0x14BDA, Save + 0x23CB, 1)); // Isla de Muerta: Moonlight Nook - checksList.Add(new Check(this, Sys3 + 0x14BE6, Save + 0x23C3, 3)); // Ship Graveyard: The Interceptor's Hold - checksList.Add(new Check(this, Sys3 + 0x14BF2, Save + 0x23C3, 6)); // Ship Graveyard: Seadrift Keep - checksList.Add(new Check(this, Sys3 + 0x14BFE, Save + 0x23C3, 7)); // Ship Graveyard: Seadrift Keep - checksList.Add(new Check(this, Sys3 + 0x14C0A, Save + 0x23CB, 2)); // Ship Graveyard: Seadrift Keep - checksList.Add(new Check(this, Sys3 + 0x14C16, Save + 0x23C4, 0)); // Ship Graveyard: Seadrift Row - checksList.Add(new Check(this, Sys3 + 0x14C22, Save + 0x23C4, 1)); // Ship Graveyard: Seadrift Row - checksList.Add(new Check(this, Sys3 + 0x14C2E, Save + 0x23CB, 3)); // Ship Graveyard: Seadrift Row - checksList.Add(new Check(this, Sys3 + 0x14C3A, Save + 0x23C6, 1)); // Borough - checksList.Add(new Check(this, Sys3 + 0x14C46, Save + 0x23C6, 2)); // Borough - checksList.Add(new Check(this, Sys3 + 0x14C52, Save + 0x23C6, 3)); // Borough - checksList.Add(new Check(this, Sys3 + 0x14C5E, Save + 0x23C8, 7)); // Borough - checksList.Add(new Check(this, Sys3 + 0x14C6A, Save + 0x23DB, 1)); // Borough - checksList.Add(new Check(this, Sys3 + 0x14C76, Save + 0x23C9, 4)); // Postern - checksList.Add(new Check(this, Sys3 + 0x14C82, Save + 0x23C5, 4)); // Postern - checksList.Add(new Check(this, Sys3 + 0x14C8E, Save + 0x23C5, 5)); // Postern - checksList.Add(new Check(this, Sys3 + 0x14C9A, Save + 0x23C6, 7)); // Corridors - checksList.Add(new Check(this, Sys3 + 0x14CA6, Save + 0x23C7, 0)); // Corridors - checksList.Add(new Check(this, Sys3 + 0x14CB2, Save + 0x23C7, 1)); // Corridors - checksList.Add(new Check(this, Sys3 + 0x14CBE, Save + 0x23C9, 1)); // Corridors - checksList.Add(new Check(this, Sys3 + 0x14CCA, Save + 0x23C4, 7)); // Ansem's Study - checksList.Add(new Check(this, Sys3 + 0x14CD6, Save + 0x23C4, 6)); // Ansem's Study - checksList.Add(new Check(this, Sys3 + 0x14CE2, Save + 0x23C9, 3)); // Restoration Site - checksList.Add(new Check(this, Sys3 + 0x14CEE, Save + 0x23DB, 2)); // Restoration Site - checksList.Add(new Check(this, Sys3 + 0x14CFA, Save + 0x23C4, 2)); // Crystal Fissure - checksList.Add(new Check(this, Sys3 + 0x14D06, Save + 0x23D9, 1)); // Crystal Fissure - checksList.Add(new Check(this, Sys3 + 0x14D12, Save + 0x23C4, 3)); // Crystal Fissure - checksList.Add(new Check(this, Sys3 + 0x14D1E, Save + 0x23C4, 4)); // Crystal Fissure - checksList.Add(new Check(this, Sys3 + 0x14D2A, Save + 0x23D9, 3)); // Postern - checksList.Add(new Check(this, Sys3 + 0x14D36, Save + 0x23C9, 5)); // Heartless Manufactory - checksList.Add(new Check(this, Sys3 + 0x14D42, Save + 0x23D9, 4)); // Gorge - checksList.Add(new Check(this, Sys3 + 0x14D4E, Save + 0x23CF, 0)); // Gorge - checksList.Add(new Check(this, Sys3 + 0x14D5A, Save + 0x23CF, 1)); // Gorge - checksList.Add(new Check(this, Sys3 + 0x14D66, Save + 0x23CE, 5)); // Elephant Graveyard - checksList.Add(new Check(this, Sys3 + 0x14D72, Save + 0x23CE, 6)); // Elephant Graveyard - checksList.Add(new Check(this, Sys3 + 0x14D7E, Save + 0x23CE, 7)); // Elephant Graveyard - checksList.Add(new Check(this, Sys3 + 0x14D8A, Save + 0x23DB, 3)); // Elephant Graveyard - checksList.Add(new Check(this, Sys3 + 0x14D96, Save + 0x23DB, 4)); // Elephant Graveyard - checksList.Add(new Check(this, Sys3 + 0x14DA2, Save + 0x23D0, 3)); // Pride Rock - checksList.Add(new Check(this, Sys3 + 0x14DAE, Save + 0x23CD, 4)); // Pride Rock - checksList.Add(new Check(this, Sys3 + 0x14DBA, Save + 0x23CD, 5)); // Pride Rock - checksList.Add(new Check(this, Sys3 + 0x14DC6, Save + 0x23CE, 0)); // Wildebeest Valley - checksList.Add(new Check(this, Sys3 + 0x14DD2, Save + 0x23CE, 1)); // Wildebeest Valley - checksList.Add(new Check(this, Sys3 + 0x14DDE, Save + 0x23CE, 2)); // Wildebeest Valley - checksList.Add(new Check(this, Sys3 + 0x14DEA, Save + 0x23CE, 3)); // Wildebeest Valley - checksList.Add(new Check(this, Sys3 + 0x14DF6, Save + 0x23CE, 4)); // Wildebeest Valley - checksList.Add(new Check(this, Sys3 + 0x14E02, Save + 0x23CF, 2)); // Wastelands - checksList.Add(new Check(this, Sys3 + 0x14E0E, Save + 0x23CF, 3)); // Wastelands - checksList.Add(new Check(this, Sys3 + 0x14E1A, Save + 0x23CF, 4)); // Wastelands - checksList.Add(new Check(this, Sys3 + 0x14E26, Save + 0x23CF, 5)); // Jungle - checksList.Add(new Check(this, Sys3 + 0x14E32, Save + 0x23CF, 6)); // Jungle - checksList.Add(new Check(this, Sys3 + 0x14E3E, Save + 0x23CF, 7)); // Jungle - checksList.Add(new Check(this, Sys3 + 0x14E4A, Save + 0x23D0, 0)); // Oasis - checksList.Add(new Check(this, Sys3 + 0x14E56, Save + 0x23D9, 5)); // Oasis - checksList.Add(new Check(this, Sys3 + 0x14E62, Save + 0x23D0, 1)); // Oasis - checksList.Add(new Check(this, Sys3 + 0x14E6E, Save + 0x23CA, 1)); // Station of Serenity - checksList.Add(new Check(this, Sys3 + 0x14E7A, Save + 0x23D7, 1)); // Station of Calling - checksList.Add(new Check(this, Sys3 + 0x14E86, Save + 0x23D1, 5)); // Central Station (STT) - checksList.Add(new Check(this, Sys3 + 0x14E92, Save + 0x23D1, 6)); // Central Station (STT) - checksList.Add(new Check(this, Sys3 + 0x14E9E, Save + 0x23D1, 7)); // Central Station (STT) - checksList.Add(new Check(this, Sys3 + 0x14EAA, Save + 0x23D2, 3)); // Sunset Terrace (STT) - checksList.Add(new Check(this, Sys3 + 0x14EB6, Save + 0x23D2, 4)); // Sunset Terrace (STT) - checksList.Add(new Check(this, Sys3 + 0x14EC2, Save + 0x23D2, 5)); // Sunset Terrace (STT) - checksList.Add(new Check(this, Sys3 + 0x14ECE, Save + 0x23D2, 6)); // Sunset Terrace (STT) - checksList.Add(new Check(this, Sys3 + 0x14EDA, Save + 0x23D4, 2)); // Mansion: Foyer (STT) - checksList.Add(new Check(this, Sys3 + 0x14EE6, Save + 0x23D4, 3)); // Mansion: Foyer (STT) - checksList.Add(new Check(this, Sys3 + 0x14EF2, Save + 0x23D4, 4)); // Mansion: Foyer (STT) - checksList.Add(new Check(this, Sys3 + 0x14EFE, Save + 0x23D5, 0)); // Mansion: Dining Room (STT) - checksList.Add(new Check(this, Sys3 + 0x14F0A, Save + 0x23D5, 1)); // Mansion: Dining Room (STT) - checksList.Add(new Check(this, Sys3 + 0x14F16, Save + 0x23D5, 4)); // Mansion: Library (STT) - checksList.Add(new Check(this, Sys3 + 0x14F22, Save + 0x23D6, 0)); // Mansion: Basement Corridor (STT) - checksList.Add(new Check(this, Sys3 + 0x14F2E, Save + 0x23D4, 0)); // The Old Mansion - checksList.Add(new Check(this, Sys3 + 0x14F3A, Save + 0x23D4, 1)); // The Old Mansion - checksList.Add(new Check(this, Sys3 + 0x14F46, Save + 0x23D3, 3)); // The Woods - checksList.Add(new Check(this, Sys3 + 0x14F52, Save + 0x23D3, 4)); // The Woods - checksList.Add(new Check(this, Sys3 + 0x14F5E, Save + 0x23D3, 5)); // The Woods - checksList.Add(new Check(this, Sys3 + 0x14F6A, Save + 0x23D0, 5)); // Tram Common - checksList.Add(new Check(this, Sys3 + 0x14F76, Save + 0x23D0, 6)); // Tram Common - checksList.Add(new Check(this, Sys3 + 0x14F82, Save + 0x23D0, 7)); // Tram Common - checksList.Add(new Check(this, Sys3 + 0x14F8E, Save + 0x23D1, 0)); // Tram Common - checksList.Add(new Check(this, Sys3 + 0x14F9A, Save + 0x23D1, 1)); // Tram Common - checksList.Add(new Check(this, Sys3 + 0x14FA6, Save + 0x23D1, 2)); // Tram Common - checksList.Add(new Check(this, Sys3 + 0x14FB2, Save + 0x23D8, 5)); // Tram Common - checksList.Add(new Check(this, Sys3 + 0x14FBE, Save + 0x23D2, 0)); // Central Station (TT) - checksList.Add(new Check(this, Sys3 + 0x14FCA, Save + 0x23D2, 1)); // Central Station (TT) - checksList.Add(new Check(this, Sys3 + 0x14FD6, Save + 0x23D2, 2)); // Central Station (TT) - checksList.Add(new Check(this, Sys3 + 0x14FE2, Save + 0x23D6, 2)); // The Tower - checksList.Add(new Check(this, Sys3 + 0x14FEE, Save + 0x23D6, 3)); // The Tower - checksList.Add(new Check(this, Sys3 + 0x14FFA, Save + 0x23DB, 7)); // The Tower - checksList.Add(new Check(this, Sys3 + 0x15006, Save + 0x23D6, 4)); // Tower: Entryway - checksList.Add(new Check(this, Sys3 + 0x15012, Save + 0x23D6, 5)); // Tower: Entryway - checksList.Add(new Check(this, Sys3 + 0x1501E, Save + 0x23D6, 6)); // Tower: Sorcerer's Loft - checksList.Add(new Check(this, Sys3 + 0x1502A, Save + 0x23D6, 7)); // Tower: Wardrobe - checksList.Add(new Check(this, Sys3 + 0x15036, Save + 0x23D8, 0)); // Underground Concourse - checksList.Add(new Check(this, Sys3 + 0x15042, Save + 0x23D8, 1)); // Underground Concourse - checksList.Add(new Check(this, Sys3 + 0x1504E, Save + 0x23D8, 2)); // Underground Concourse - checksList.Add(new Check(this, Sys3 + 0x1505A, Save + 0x23D8, 3)); // Underground Concourse - checksList.Add(new Check(this, Sys3 + 0x15066, Save + 0x23D7, 6)); // Tunnelway - checksList.Add(new Check(this, Sys3 + 0x15072, Save + 0x23D7, 7)); // Tunnelway - checksList.Add(new Check(this, Sys3 + 0x1507E, Save + 0x23D2, 7)); // Sunset Terrace (TT) - checksList.Add(new Check(this, Sys3 + 0x1508A, Save + 0x23D3, 0)); // Sunset Terrace (TT) - checksList.Add(new Check(this, Sys3 + 0x15096, Save + 0x23D3, 1)); // Sunset Terrace (TT) - checksList.Add(new Check(this, Sys3 + 0x150A2, Save + 0x23D3, 2)); // Sunset Terrace (TT) - checksList.Add(new Check(this, Sys3 + 0x150AE, Save + 0x23D4, 5)); // Mansion: Foyer (TT) - checksList.Add(new Check(this, Sys3 + 0x150BA, Save + 0x23D4, 6)); // Mansion: Foyer (TT) - checksList.Add(new Check(this, Sys3 + 0x150C6, Save + 0x23D4, 7)); // Mansion: Foyer (TT) - checksList.Add(new Check(this, Sys3 + 0x150D2, Save + 0x23D5, 2)); // Mansion: Dining Room (TT) - checksList.Add(new Check(this, Sys3 + 0x150DE, Save + 0x23D5, 3)); // Mansion: Dining Room (TT) - checksList.Add(new Check(this, Sys3 + 0x150EA, Save + 0x23D5, 5)); // Mansion: Library (TT) - checksList.Add(new Check(this, Sys3 + 0x150F6, Save + 0x23D6, 1)); // Mansion: Basement Corridor (TT) - checksList.Add(new Check(this, Sys3 + 0x15102, Save + 0x23CB, 4)); // Fragment Crossing - checksList.Add(new Check(this, Sys3 + 0x1510E, Save + 0x23CB, 5)); // Fragment Crossing - checksList.Add(new Check(this, Sys3 + 0x1511A, Save + 0x23CB, 6)); // Fragment Crossing - checksList.Add(new Check(this, Sys3 + 0x15126, Save + 0x23CB, 7)); // Fragment Crossing - checksList.Add(new Check(this, Sys3 + 0x15132, Save + 0x23CD, 3)); // Memory's Skyscraper - checksList.Add(new Check(this, Sys3 + 0x1513E, Save + 0x23DC, 0)); // Memory's Skyscraper - checksList.Add(new Check(this, Sys3 + 0x1514A, Save + 0x23DC, 1)); // Memory's Skyscraper - checksList.Add(new Check(this, Sys3 + 0x15156, Save + 0x23CA, 5)); // The Brink of Despair - checksList.Add(new Check(this, Sys3 + 0x15162, Save + 0x23DA, 2)); // The Brink of Despair - checksList.Add(new Check(this, Sys3 + 0x1516E, Save + 0x23CC, 0)); // Nothing's Call - checksList.Add(new Check(this, Sys3 + 0x1517A, Save + 0x23CC, 1)); // Nothing's Call - checksList.Add(new Check(this, Sys3 + 0x15186, Save + 0x23CA, 6)); // Twilight's View - checksList.Add(new Check(this, Sys3 + 0x15192, Save + 0x23CC, 2)); // Naught's Skyway - checksList.Add(new Check(this, Sys3 + 0x1519E, Save + 0x23CC, 3)); // Naught's Skyway - checksList.Add(new Check(this, Sys3 + 0x151AA, Save + 0x23CC, 4)); // Naught's Skyway - checksList.Add(new Check(this, Sys3 + 0x151B6, Save + 0x23CC, 7)); // Ruin and Creation's Passage - checksList.Add(new Check(this, Sys3 + 0x151C2, Save + 0x23CD, 0)); // Ruin and Creation's Passage - checksList.Add(new Check(this, Sys3 + 0x151CE, Save + 0x23CD, 1)); // Ruin and Creation's Passage - checksList.Add(new Check(this, Sys3 + 0x151DA, Save + 0x23CD, 2)); // Ruin and Creation's Passage - checksList.Add(new Check(this, Sys3 + 0x151E6, Save + 0x23DC, 2)); // Cavern of Remembrance: Depths - checksList.Add(new Check(this, Sys3 + 0x151F2, Save + 0x23DC, 3)); // Cavern of Remembrance: Depths - checksList.Add(new Check(this, Sys3 + 0x151FE, Save + 0x23DC, 4)); // Cavern of Remembrance: Depths - checksList.Add(new Check(this, Sys3 + 0x1520A, Save + 0x23DC, 5)); // Cavern of Remembrance: Depths - checksList.Add(new Check(this, Sys3 + 0x15216, Save + 0x23DC, 6)); // Cavern of Remembrance: Depths - checksList.Add(new Check(this, Sys3 + 0x15222, Save + 0x23DC, 7)); // Cavern of Remembrance: Depths - checksList.Add(new Check(this, Sys3 + 0x1522E, Save + 0x23DD, 0)); // Cavern of Remembrance: Mining Area - checksList.Add(new Check(this, Sys3 + 0x1523A, Save + 0x23DD, 1)); // Cavern of Remembrance: Mining Area - checksList.Add(new Check(this, Sys3 + 0x15246, Save + 0x23DD, 2)); // Cavern of Remembrance: Mining Area - checksList.Add(new Check(this, Sys3 + 0x15252, Save + 0x23DD, 3)); // Cavern of Remembrance: Mining Area - checksList.Add(new Check(this, Sys3 + 0x1525E, Save + 0x23DD, 4)); // Cavern of Remembrance: Mining Area - checksList.Add(new Check(this, Sys3 + 0x1526A, Save + 0x23DD, 5)); // Cavern of Remembrance: Mining Area - checksList.Add(new Check(this, Sys3 + 0x15276, Save + 0x23DD, 6)); // Cavern of Remembrance: Engine Chamber - checksList.Add(new Check(this, Sys3 + 0x15282, Save + 0x23DD, 7)); // Cavern of Remembrance: Engine Chamber - checksList.Add(new Check(this, Sys3 + 0x1528E, Save + 0x23DE, 0)); // Cavern of Remembrance: Engine Chamber - checksList.Add(new Check(this, Sys3 + 0x1529A, Save + 0x23DE, 1)); // Cavern of Remembrance: Engine Chamber - checksList.Add(new Check(this, Sys3 + 0x152A6, Save + 0x23DE, 2)); // Cavern of Remembrance: Mineshaft - checksList.Add(new Check(this, Sys3 + 0x152B2, Save + 0x23DE, 3)); // Cavern of Remembrance: Mineshaft - checksList.Add(new Check(this, Sys3 + 0x152BE, Save + 0x23DE, 4)); // Cavern of Remembrance: Mineshaft - checksList.Add(new Check(this, Sys3 + 0x152CA, Save + 0x23DE, 5)); // Cavern of Remembrance: Mineshaft - checksList.Add(new Check(this, Sys3 + 0x152D6, Save + 0x23DE, 6)); // Cavern of Remembrance: Mineshaft - checksList.Add(new Check(this, Sys3 + 0x152E2, Save + 0x23DF, 1)); // Garden of Assemblage - checksList.Add(new Check(this, Sys3 + 0x152EE, Save + 0x23DF, 2)); // Garden of Assemblage - checksList.Add(new Check(this, Sys3 + 0x152FA, Save + 0x23DF, 3)); // Garden of Assemblage + checksList.Add(new Check(this, Sys3, 0x1442A, Save + 0x23AC, 1)); // Bamboo Grove + checksList.Add(new Check(this, Sys3, 0x14436, Save + 0x23D9, 7)); // Bamboo Grove + checksList.Add(new Check(this, Sys3, 0x14442, Save + 0x23DA, 0)); // Bamboo Grove + checksList.Add(new Check(this, Sys3, 0x1444E, Save + 0x23AD, 1)); // Checkpoint + checksList.Add(new Check(this, Sys3, 0x1445A, Save + 0x23AD, 2)); // Checkpoint + checksList.Add(new Check(this, Sys3, 0x14466, Save + 0x23AD, 3)); // Mountain Trail + checksList.Add(new Check(this, Sys3, 0x14472, Save + 0x23AD, 4)); // Mountain Trail + checksList.Add(new Check(this, Sys3, 0x1447E, Save + 0x23AD, 5)); // Mountain Trail + checksList.Add(new Check(this, Sys3, 0x1448A, Save + 0x23AD, 6)); // Mountain Trail + checksList.Add(new Check(this, Sys3, 0x14496, Save + 0x23AD, 7)); // Village Cave + checksList.Add(new Check(this, Sys3, 0x144A2, Save + 0x23AE, 0)); // Village Cave + checksList.Add(new Check(this, Sys3, 0x144AE, Save + 0x23AE, 1)); // Ridge + checksList.Add(new Check(this, Sys3, 0x144BA, Save + 0x23AE, 2)); // Ridge + checksList.Add(new Check(this, Sys3, 0x144C6, Save + 0x23AE, 3)); // Throne Room + checksList.Add(new Check(this, Sys3, 0x144D2, Save + 0x23AE, 4)); // Throne Room + checksList.Add(new Check(this, Sys3, 0x144DE, Save + 0x23AE, 5)); // Throne Room + checksList.Add(new Check(this, Sys3, 0x144EA, Save + 0x23AE, 6)); // Throne Room + checksList.Add(new Check(this, Sys3, 0x144F6, Save + 0x23AE, 7)); // Throne Room + checksList.Add(new Check(this, Sys3, 0x14502, Save + 0x23AF, 0)); // Throne Room + checksList.Add(new Check(this, Sys3, 0x1450E, Save + 0x23AF, 1)); // Throne Room + checksList.Add(new Check(this, Sys3, 0x1451A, Save + 0x23AF, 2)); // Throne Room + checksList.Add(new Check(this, Sys3, 0x14526, Save + 0x23AF, 3)); // Agrabah + checksList.Add(new Check(this, Sys3, 0x14532, Save + 0x23AF, 4)); // Agrabah + checksList.Add(new Check(this, Sys3, 0x1453E, Save + 0x23AF, 5)); // Agrabah + checksList.Add(new Check(this, Sys3, 0x1454A, Save + 0x23AF, 6)); // Agrabah + checksList.Add(new Check(this, Sys3, 0x14556, Save + 0x23AF, 7)); // Agrabah + checksList.Add(new Check(this, Sys3, 0x14562, Save + 0x23B0, 0)); // Agrabah + checksList.Add(new Check(this, Sys3, 0x1456E, Save + 0x23DA, 3)); // Agrabah + checksList.Add(new Check(this, Sys3, 0x14562, Save + 0x23B0, 1)); // Bazaar + checksList.Add(new Check(this, Sys3, 0x14562, Save + 0x23B0, 2)); // Bazaar + checksList.Add(new Check(this, Sys3, 0x14592, Save + 0x23B0, 3)); // Bazaar + checksList.Add(new Check(this, Sys3, 0x1459E, Save + 0x23B0, 4)); // Bazaar + checksList.Add(new Check(this, Sys3, 0x145AA, Save + 0x23B0, 5)); // Bazaar + checksList.Add(new Check(this, Sys3, 0x145B6, Save + 0x23B0, 6)); // Palace Walls + checksList.Add(new Check(this, Sys3, 0x145C2, Save + 0x23DB, 5)); // Palace Walls + checksList.Add(new Check(this, Sys3, 0x145CE, Save + 0x23B0, 7)); // The Cave of Wonders: Entrance + checksList.Add(new Check(this, Sys3, 0x145DA, Save + 0x23B1, 0)); // The Cave of Wonders: Entrance + checksList.Add(new Check(this, Sys3, 0x145E6, Save + 0x23B1, 2)); // The Cave of Wonders: Valley of Stone + checksList.Add(new Check(this, Sys3, 0x145F2, Save + 0x23B1, 3)); // The Cave of Wonders: Valley of Stone + checksList.Add(new Check(this, Sys3, 0x145FE, Save + 0x23B1, 4)); // The Cave of Wonders: Valley of Stone + checksList.Add(new Check(this, Sys3, 0x1460A, Save + 0x23B1, 5)); // The Cave of Wonders: Valley of Stone + checksList.Add(new Check(this, Sys3, 0x14616, Save + 0x23D8, 7)); // The Cave of Wonders: Chasm of Challenges + checksList.Add(new Check(this, Sys3, 0x14622, Save + 0x23B1, 6)); // The Cave of Wonders: Chasm of Challenges + checksList.Add(new Check(this, Sys3, 0x1462E, Save + 0x23DA, 4)); // The Cave of Wonders: Treasure Room + checksList.Add(new Check(this, Sys3, 0x1463A, Save + 0x23DA, 5)); // The Cave of Wonders: Treasure Room + checksList.Add(new Check(this, Sys3, 0x14646, Save + 0x23B1, 1)); // Ruined Chamber + checksList.Add(new Check(this, Sys3, 0x14652, Save + 0x23D8, 6)); // Ruined Chamber + checksList.Add(new Check(this, Sys3, 0x1465E, Save + 0x23B2, 0)); // Cornerstone Hill + checksList.Add(new Check(this, Sys3, 0x1466A, Save + 0x23B2, 1)); // Cornerstone Hill + checksList.Add(new Check(this, Sys3, 0x14676, Save + 0x23B2, 3)); // Pier + checksList.Add(new Check(this, Sys3, 0x14682, Save + 0x23B2, 4)); // Pier + checksList.Add(new Check(this, Sys3, 0x1468E, Save + 0x23B2, 5)); // Waterway + checksList.Add(new Check(this, Sys3, 0x1469A, Save + 0x23B2, 6)); // Waterway + checksList.Add(new Check(this, Sys3, 0x146A6, Save + 0x23B2, 7)); // Waterway + checksList.Add(new Check(this, Sys3, 0x146B2, Save + 0x23B4, 1)); // Courtyard (DC) + checksList.Add(new Check(this, Sys3, 0x146BE, Save + 0x23B4, 2)); // Courtyard (DC) + checksList.Add(new Check(this, Sys3, 0x146CA, Save + 0x23B4, 3)); // Courtyard (DC) + checksList.Add(new Check(this, Sys3, 0x146D6, Save + 0x23B4, 4)); // Courtyard (DC) + checksList.Add(new Check(this, Sys3, 0x146E2, Save + 0x23B4, 5)); // Courtyard (DC) + checksList.Add(new Check(this, Sys3, 0x146EE, Save + 0x23B4, 6)); // Courtyard (DC) + checksList.Add(new Check(this, Sys3, 0x146FA, Save + 0x23B4, 7)); // Courtyard (DC) + checksList.Add(new Check(this, Sys3, 0x14706, Save + 0x23B4, 0)); // Library + checksList.Add(new Check(this, Sys3, 0x14712, Save + 0x23C9, 7)); // Pooh Bear's House + checksList.Add(new Check(this, Sys3, 0x1471E, Save + 0x23B5, 4)); // Pooh Bear's House + checksList.Add(new Check(this, Sys3, 0x1472A, Save + 0x23B5, 5)); // Pooh Bear's House + checksList.Add(new Check(this, Sys3, 0x14736, Save + 0x23B6, 4)); // Piglet's House + checksList.Add(new Check(this, Sys3, 0x14742, Save + 0x23B6, 2)); // Piglet's House + checksList.Add(new Check(this, Sys3, 0x1474E, Save + 0x23B6, 3)); // Piglet's House + checksList.Add(new Check(this, Sys3, 0x1475A, Save + 0x23CA, 0)); // Rabbit's House + checksList.Add(new Check(this, Sys3, 0x14766, Save + 0x23B5, 7)); // Rabbit's House + checksList.Add(new Check(this, Sys3, 0x14772, Save + 0x23B6, 0)); // Rabbit's House + checksList.Add(new Check(this, Sys3, 0x1477E, Save + 0x23B6, 5)); // Kanga's House + checksList.Add(new Check(this, Sys3, 0x1478A, Save + 0x23B6, 6)); // Kanga's House + checksList.Add(new Check(this, Sys3, 0x14796, Save + 0x23B6, 7)); // Kanga's House + checksList.Add(new Check(this, Sys3, 0x147A2, Save + 0x23B7, 1)); // The Spooky Cave + checksList.Add(new Check(this, Sys3, 0x147AE, Save + 0x23B7, 2)); // The Spooky Cave + checksList.Add(new Check(this, Sys3, 0x147BA, Save + 0x23B7, 3)); // The Spooky Cave + checksList.Add(new Check(this, Sys3, 0x147C6, Save + 0x23B7, 4)); // The Spooky Cave + checksList.Add(new Check(this, Sys3, 0x147D2, Save + 0x23B7, 6)); // The Spooky Cave + checksList.Add(new Check(this, Sys3, 0x147DE, Save + 0x23B7, 7)); // The Spooky Cave + checksList.Add(new Check(this, Sys3, 0x147EA, Save + 0x23C9, 6)); // Starry Hill + checksList.Add(new Check(this, Sys3, 0x147F6, Save + 0x23B5, 1)); // Starry Hill + checksList.Add(new Check(this, Sys3, 0x14802, Save + 0x23B8, 0)); // Underworld Entrance + checksList.Add(new Check(this, Sys3, 0x1480E, Save + 0x23B9, 6)); // Cave of the Dead: Passage + checksList.Add(new Check(this, Sys3, 0x1481A, Save + 0x23B9, 7)); // Cave of the Dead: Passage + checksList.Add(new Check(this, Sys3, 0x14826, Save + 0x23BA, 0)); // Cave of the Dead: Passage + checksList.Add(new Check(this, Sys3, 0x14832, Save + 0x23BA, 1)); // Cave of the Dead: Passage + checksList.Add(new Check(this, Sys3, 0x1483E, Save + 0x23BA, 2)); // Cave of the Dead: Passage + checksList.Add(new Check(this, Sys3, 0x1484A, Save + 0x23B8, 4)); // Cave of the Dead: Inner Chamber + checksList.Add(new Check(this, Sys3, 0x14856, Save + 0x23B8, 3)); // Cave of the Dead: Inner Chamber + checksList.Add(new Check(this, Sys3, 0x14862, Save + 0x23B8, 5)); // Underworld Caverns: Entrance + checksList.Add(new Check(this, Sys3, 0x1486E, Save + 0x23B8, 6)); // Underworld Caverns: Entrance + checksList.Add(new Check(this, Sys3, 0x1487A, Save + 0x23DA, 6)); // Underworld Caverns: Entrance + checksList.Add(new Check(this, Sys3, 0x14886, Save + 0x23BA, 3)); // Underworld Caverns: The Lost Road + checksList.Add(new Check(this, Sys3, 0x14892, Save + 0x23BA, 4)); // Underworld Caverns: The Lost Road + checksList.Add(new Check(this, Sys3, 0x1489E, Save + 0x23BA, 5)); // Underworld Caverns: The Lost Road + checksList.Add(new Check(this, Sys3, 0x148AA, Save + 0x23BA, 6)); // Underworld Caverns: The Lost Road + checksList.Add(new Check(this, Sys3, 0x148B6, Save + 0x23BA, 7)); // Underworld Caverns: Atrium + checksList.Add(new Check(this, Sys3, 0x148C2, Save + 0x23BB, 0)); // Underworld Caverns: Atrium + checksList.Add(new Check(this, Sys3, 0x148CE, Save + 0x23B9, 4)); // The Lock + checksList.Add(new Check(this, Sys3, 0x148DA, Save + 0x23B9, 0)); // The Lock + checksList.Add(new Check(this, Sys3, 0x148E6, Save + 0x23B9, 2)); // The Lock + checksList.Add(new Check(this, Sys3, 0x148F2, Save + 0x23BB, 5)); // Courtyard (BC) + checksList.Add(new Check(this, Sys3, 0x148FE, Save + 0x23BB, 6)); // Courtyard (BC) + checksList.Add(new Check(this, Sys3, 0x1490A, Save + 0x23DA, 7)); // Courtyard (BC) + checksList.Add(new Check(this, Sys3, 0x14916, Save + 0x23BB, 2)); // Belle's Room + checksList.Add(new Check(this, Sys3, 0x14922, Save + 0x23BB, 3)); // Belle's Room + checksList.Add(new Check(this, Sys3, 0x1492E, Save + 0x23BB, 7)); // The East Wing + checksList.Add(new Check(this, Sys3, 0x1493A, Save + 0x23BC, 0)); // The East Wing + checksList.Add(new Check(this, Sys3, 0x14946, Save + 0x23BC, 1)); // The West Wing + checksList.Add(new Check(this, Sys3, 0x14952, Save + 0x23BC, 2)); // The West Wing + checksList.Add(new Check(this, Sys3, 0x1495E, Save + 0x23BC, 3)); // The West Wing + checksList.Add(new Check(this, Sys3, 0x1496A, Save + 0x23BC, 4)); // The West Wing + checksList.Add(new Check(this, Sys3, 0x14976, Save + 0x23BB, 5)); // The West Wing + checksList.Add(new Check(this, Sys3, 0x14982, Save + 0x23DB, 0)); // The West Wing + checksList.Add(new Check(this, Sys3, 0x1498E, Save + 0x23BD, 0)); // Dungeon + checksList.Add(new Check(this, Sys3, 0x1499A, Save + 0x23BD, 1)); // Dungeon + checksList.Add(new Check(this, Sys3, 0x149A6, Save + 0x23BD, 2)); // Secret Passage + checksList.Add(new Check(this, Sys3, 0x149B2, Save + 0x23BD, 5)); // Secret Passage + checksList.Add(new Check(this, Sys3, 0x149BE, Save + 0x23BD, 3)); // Secret Passage + checksList.Add(new Check(this, Sys3, 0x149CA, Save + 0x23BC, 6)); // The West Wing + checksList.Add(new Check(this, Sys3, 0x149D6, Save + 0x23BC, 7)); // The West Wing + checksList.Add(new Check(this, Sys3, 0x149E2, Save + 0x23BB, 4)); // Beast's Room + checksList.Add(new Check(this, Sys3, 0x149EE, Save + 0x23CA, 2)); // Pit Cell + checksList.Add(new Check(this, Sys3, 0x149FA, Save + 0x23BD, 6)); // Pit Cell + checksList.Add(new Check(this, Sys3, 0x14A06, Save + 0x23BE, 1)); // Canyon + checksList.Add(new Check(this, Sys3, 0x14A12, Save + 0x23BE, 2)); // Canyon + checksList.Add(new Check(this, Sys3, 0x14A1E, Save + 0x23BE, 3)); // Canyon + checksList.Add(new Check(this, Sys3, 0x14A2A, Save + 0x23DB, 6)); // Canyon + checksList.Add(new Check(this, Sys3, 0x14A36, Save + 0x23BE, 4)); // I/O Tower: Hallway + checksList.Add(new Check(this, Sys3, 0x14A42, Save + 0x23BE, 5)); // I/O Tower: Hallway + checksList.Add(new Check(this, Sys3, 0x14A4E, Save + 0x23BF, 1)); // I/O Tower: Communications Room + checksList.Add(new Check(this, Sys3, 0x14A5A, Save + 0x23DA, 1)); // I/O Tower: Communications Room + checksList.Add(new Check(this, Sys3, 0x14A66, Save + 0x23BF, 4)); // Central Computer Mesa + checksList.Add(new Check(this, Sys3, 0x14A72, Save + 0x23BF, 5)); // Central Computer Mesa + checksList.Add(new Check(this, Sys3, 0x14A7E, Save + 0x23BF, 6)); // Central Computer Mesa + checksList.Add(new Check(this, Sys3, 0x14A8A, Save + 0x23D9, 0)); // Central Computer Mesa + checksList.Add(new Check(this, Sys3, 0x14A96, Save + 0x23C0, 2)); // Graveyard + checksList.Add(new Check(this, Sys3, 0x14AA2, Save + 0x23C0, 3)); // Graveyard + checksList.Add(new Check(this, Sys3, 0x14AAE, Save + 0x23C0, 1)); // Dr. Finkelstein's Lab + checksList.Add(new Check(this, Sys3, 0x14ABA, Save + 0x23BF, 7)); // Halloween Town Square + checksList.Add(new Check(this, Sys3, 0x14AC6, Save + 0x23C0, 0)); // Halloween Town Square + checksList.Add(new Check(this, Sys3, 0x14AD2, Save + 0x23C0, 4)); // Hinterlands + checksList.Add(new Check(this, Sys3, 0x14ADE, Save + 0x23C0, 5)); // Hinterlands + checksList.Add(new Check(this, Sys3, 0x14AEA, Save + 0x23C0, 6)); // Hinterlands + checksList.Add(new Check(this, Sys3, 0x14AF6, Save + 0x23C1, 0)); // Candy Cane Lane + checksList.Add(new Check(this, Sys3, 0x14B02, Save + 0x23C1, 1)); // Candy Cane Lane + checksList.Add(new Check(this, Sys3, 0x14B0E, Save + 0x23C1, 2)); // Candy Cane Lane + checksList.Add(new Check(this, Sys3, 0x14B1A, Save + 0x23C1, 3)); // Candy Cane Lane + checksList.Add(new Check(this, Sys3, 0x14B26, Save + 0x23C1, 6)); // Santa's House + checksList.Add(new Check(this, Sys3, 0x14B32, Save + 0x23C1, 4)); // Santa's House + checksList.Add(new Check(this, Sys3, 0x14B3E, Save + 0x23C2, 1)); // Rampart + checksList.Add(new Check(this, Sys3, 0x14B4A, Save + 0x23C2, 2)); // Rampart + checksList.Add(new Check(this, Sys3, 0x14B56, Save + 0x23C2, 3)); // Rampart + checksList.Add(new Check(this, Sys3, 0x14B62, Save + 0x23C2, 4)); // Town + checksList.Add(new Check(this, Sys3, 0x14B6E, Save + 0x23C2, 5)); // Town + checksList.Add(new Check(this, Sys3, 0x14B7A, Save + 0x23C2, 6)); // Town + checksList.Add(new Check(this, Sys3, 0x14B86, Save + 0x23C2, 7)); // Town + checksList.Add(new Check(this, Sys3, 0x14B92, Save + 0x23C3, 1)); // Isla de Muerta: Cave Mouth + checksList.Add(new Check(this, Sys3, 0x14B9E, Save + 0x23C3, 2)); // Isla de Muerta: Cave Mouth + checksList.Add(new Check(this, Sys3, 0x14BAA, Save + 0x23CA, 7)); // Isla de Muerta: Powder Store + checksList.Add(new Check(this, Sys3, 0x14BB6, Save + 0x23CB, 0)); // Isla de Muerta: Powder Store + checksList.Add(new Check(this, Sys3, 0x14BC2, Save + 0x23C3, 4)); // Isla de Muerta: Moonlight Nook + checksList.Add(new Check(this, Sys3, 0x14BCE, Save + 0x23C3, 5)); // Isla de Muerta: Moonlight Nook + checksList.Add(new Check(this, Sys3, 0x14BDA, Save + 0x23CB, 1)); // Isla de Muerta: Moonlight Nook + checksList.Add(new Check(this, Sys3, 0x14BE6, Save + 0x23C3, 3)); // Ship Graveyard: The Interceptor's Hold + checksList.Add(new Check(this, Sys3, 0x14BF2, Save + 0x23C3, 6)); // Ship Graveyard: Seadrift Keep + checksList.Add(new Check(this, Sys3, 0x14BFE, Save + 0x23C3, 7)); // Ship Graveyard: Seadrift Keep + checksList.Add(new Check(this, Sys3, 0x14C0A, Save + 0x23CB, 2)); // Ship Graveyard: Seadrift Keep + checksList.Add(new Check(this, Sys3, 0x14C16, Save + 0x23C4, 0)); // Ship Graveyard: Seadrift Row + checksList.Add(new Check(this, Sys3, 0x14C22, Save + 0x23C4, 1)); // Ship Graveyard: Seadrift Row + checksList.Add(new Check(this, Sys3, 0x14C2E, Save + 0x23CB, 3)); // Ship Graveyard: Seadrift Row + checksList.Add(new Check(this, Sys3, 0x14C3A, Save + 0x23C6, 1)); // Borough + checksList.Add(new Check(this, Sys3, 0x14C46, Save + 0x23C6, 2)); // Borough + checksList.Add(new Check(this, Sys3, 0x14C52, Save + 0x23C6, 3)); // Borough + checksList.Add(new Check(this, Sys3, 0x14C5E, Save + 0x23C8, 7)); // Borough + checksList.Add(new Check(this, Sys3, 0x14C6A, Save + 0x23DB, 1)); // Borough + checksList.Add(new Check(this, Sys3, 0x14C76, Save + 0x23C9, 4)); // Postern + checksList.Add(new Check(this, Sys3, 0x14C82, Save + 0x23C5, 4)); // Postern + checksList.Add(new Check(this, Sys3, 0x14C8E, Save + 0x23C5, 5)); // Postern + checksList.Add(new Check(this, Sys3, 0x14C9A, Save + 0x23C6, 7)); // Corridors + checksList.Add(new Check(this, Sys3, 0x14CA6, Save + 0x23C7, 0)); // Corridors + checksList.Add(new Check(this, Sys3, 0x14CB2, Save + 0x23C7, 1)); // Corridors + checksList.Add(new Check(this, Sys3, 0x14CBE, Save + 0x23C9, 1)); // Corridors + checksList.Add(new Check(this, Sys3, 0x14CCA, Save + 0x23C4, 7)); // Ansem's Study + checksList.Add(new Check(this, Sys3, 0x14CD6, Save + 0x23C4, 6)); // Ansem's Study + checksList.Add(new Check(this, Sys3, 0x14CE2, Save + 0x23C9, 3)); // Restoration Site + checksList.Add(new Check(this, Sys3, 0x14CEE, Save + 0x23DB, 2)); // Restoration Site + checksList.Add(new Check(this, Sys3, 0x14CFA, Save + 0x23C4, 2)); // Crystal Fissure + checksList.Add(new Check(this, Sys3, 0x14D06, Save + 0x23D9, 1)); // Crystal Fissure + checksList.Add(new Check(this, Sys3, 0x14D12, Save + 0x23C4, 3)); // Crystal Fissure + checksList.Add(new Check(this, Sys3, 0x14D1E, Save + 0x23C4, 4)); // Crystal Fissure + checksList.Add(new Check(this, Sys3, 0x14D2A, Save + 0x23D9, 3)); // Postern + checksList.Add(new Check(this, Sys3, 0x14D36, Save + 0x23C9, 5)); // Heartless Manufactory + checksList.Add(new Check(this, Sys3, 0x14D42, Save + 0x23D9, 4)); // Gorge + checksList.Add(new Check(this, Sys3, 0x14D4E, Save + 0x23CF, 0)); // Gorge + checksList.Add(new Check(this, Sys3, 0x14D5A, Save + 0x23CF, 1)); // Gorge + checksList.Add(new Check(this, Sys3, 0x14D66, Save + 0x23CE, 5)); // Elephant Graveyard + checksList.Add(new Check(this, Sys3, 0x14D72, Save + 0x23CE, 6)); // Elephant Graveyard + checksList.Add(new Check(this, Sys3, 0x14D7E, Save + 0x23CE, 7)); // Elephant Graveyard + checksList.Add(new Check(this, Sys3, 0x14D8A, Save + 0x23DB, 3)); // Elephant Graveyard + checksList.Add(new Check(this, Sys3, 0x14D96, Save + 0x23DB, 4)); // Elephant Graveyard + checksList.Add(new Check(this, Sys3, 0x14DA2, Save + 0x23D0, 3)); // Pride Rock + checksList.Add(new Check(this, Sys3, 0x14DAE, Save + 0x23CD, 4)); // Pride Rock + checksList.Add(new Check(this, Sys3, 0x14DBA, Save + 0x23CD, 5)); // Pride Rock + checksList.Add(new Check(this, Sys3, 0x14DC6, Save + 0x23CE, 0)); // Wildebeest Valley + checksList.Add(new Check(this, Sys3, 0x14DD2, Save + 0x23CE, 1)); // Wildebeest Valley + checksList.Add(new Check(this, Sys3, 0x14DDE, Save + 0x23CE, 2)); // Wildebeest Valley + checksList.Add(new Check(this, Sys3, 0x14DEA, Save + 0x23CE, 3)); // Wildebeest Valley + checksList.Add(new Check(this, Sys3, 0x14DF6, Save + 0x23CE, 4)); // Wildebeest Valley + checksList.Add(new Check(this, Sys3, 0x14E02, Save + 0x23CF, 2)); // Wastelands + checksList.Add(new Check(this, Sys3, 0x14E0E, Save + 0x23CF, 3)); // Wastelands + checksList.Add(new Check(this, Sys3, 0x14E1A, Save + 0x23CF, 4)); // Wastelands + checksList.Add(new Check(this, Sys3, 0x14E26, Save + 0x23CF, 5)); // Jungle + checksList.Add(new Check(this, Sys3, 0x14E32, Save + 0x23CF, 6)); // Jungle + checksList.Add(new Check(this, Sys3, 0x14E3E, Save + 0x23CF, 7)); // Jungle + checksList.Add(new Check(this, Sys3, 0x14E4A, Save + 0x23D0, 0)); // Oasis + checksList.Add(new Check(this, Sys3, 0x14E56, Save + 0x23D9, 5)); // Oasis + checksList.Add(new Check(this, Sys3, 0x14E62, Save + 0x23D0, 1)); // Oasis + checksList.Add(new Check(this, Sys3, 0x14E6E, Save + 0x23CA, 1)); // Station of Serenity + checksList.Add(new Check(this, Sys3, 0x14E7A, Save + 0x23D7, 1)); // Station of Calling + checksList.Add(new Check(this, Sys3, 0x14E86, Save + 0x23D1, 5)); // Central Station (STT) + checksList.Add(new Check(this, Sys3, 0x14E92, Save + 0x23D1, 6)); // Central Station (STT) + checksList.Add(new Check(this, Sys3, 0x14E9E, Save + 0x23D1, 7)); // Central Station (STT) + checksList.Add(new Check(this, Sys3, 0x14EAA, Save + 0x23D2, 3)); // Sunset Terrace (STT) + checksList.Add(new Check(this, Sys3, 0x14EB6, Save + 0x23D2, 4)); // Sunset Terrace (STT) + checksList.Add(new Check(this, Sys3, 0x14EC2, Save + 0x23D2, 5)); // Sunset Terrace (STT) + checksList.Add(new Check(this, Sys3, 0x14ECE, Save + 0x23D2, 6)); // Sunset Terrace (STT) + checksList.Add(new Check(this, Sys3, 0x14EDA, Save + 0x23D4, 2)); // Mansion: Foyer (STT) + checksList.Add(new Check(this, Sys3, 0x14EE6, Save + 0x23D4, 3)); // Mansion: Foyer (STT) + checksList.Add(new Check(this, Sys3, 0x14EF2, Save + 0x23D4, 4)); // Mansion: Foyer (STT) + checksList.Add(new Check(this, Sys3, 0x14EFE, Save + 0x23D5, 0)); // Mansion: Dining Room (STT) + checksList.Add(new Check(this, Sys3, 0x14F0A, Save + 0x23D5, 1)); // Mansion: Dining Room (STT) + checksList.Add(new Check(this, Sys3, 0x14F16, Save + 0x23D5, 4)); // Mansion: Library (STT) + checksList.Add(new Check(this, Sys3, 0x14F22, Save + 0x23D6, 0)); // Mansion: Basement Corridor (STT) + checksList.Add(new Check(this, Sys3, 0x14F2E, Save + 0x23D4, 0)); // The Old Mansion + checksList.Add(new Check(this, Sys3, 0x14F3A, Save + 0x23D4, 1)); // The Old Mansion + checksList.Add(new Check(this, Sys3, 0x14F46, Save + 0x23D3, 3)); // The Woods + checksList.Add(new Check(this, Sys3, 0x14F52, Save + 0x23D3, 4)); // The Woods + checksList.Add(new Check(this, Sys3, 0x14F5E, Save + 0x23D3, 5)); // The Woods + checksList.Add(new Check(this, Sys3, 0x14F6A, Save + 0x23D0, 5)); // Tram Common + checksList.Add(new Check(this, Sys3, 0x14F76, Save + 0x23D0, 6)); // Tram Common + checksList.Add(new Check(this, Sys3, 0x14F82, Save + 0x23D0, 7)); // Tram Common + checksList.Add(new Check(this, Sys3, 0x14F8E, Save + 0x23D1, 0)); // Tram Common + checksList.Add(new Check(this, Sys3, 0x14F9A, Save + 0x23D1, 1)); // Tram Common + checksList.Add(new Check(this, Sys3, 0x14FA6, Save + 0x23D1, 2)); // Tram Common + checksList.Add(new Check(this, Sys3, 0x14FB2, Save + 0x23D8, 5)); // Tram Common + checksList.Add(new Check(this, Sys3, 0x14FBE, Save + 0x23D2, 0)); // Central Station (TT) + checksList.Add(new Check(this, Sys3, 0x14FCA, Save + 0x23D2, 1)); // Central Station (TT) + checksList.Add(new Check(this, Sys3, 0x14FD6, Save + 0x23D2, 2)); // Central Station (TT) + checksList.Add(new Check(this, Sys3, 0x14FE2, Save + 0x23D6, 2)); // The Tower + checksList.Add(new Check(this, Sys3, 0x14FEE, Save + 0x23D6, 3)); // The Tower + checksList.Add(new Check(this, Sys3, 0x14FFA, Save + 0x23DB, 7)); // The Tower + checksList.Add(new Check(this, Sys3, 0x15006, Save + 0x23D6, 4)); // Tower: Entryway + checksList.Add(new Check(this, Sys3, 0x15012, Save + 0x23D6, 5)); // Tower: Entryway + checksList.Add(new Check(this, Sys3, 0x1501E, Save + 0x23D6, 6)); // Tower: Sorcerer's Loft + checksList.Add(new Check(this, Sys3, 0x1502A, Save + 0x23D6, 7)); // Tower: Wardrobe + checksList.Add(new Check(this, Sys3, 0x15036, Save + 0x23D8, 0)); // Underground Concourse + checksList.Add(new Check(this, Sys3, 0x15042, Save + 0x23D8, 1)); // Underground Concourse + checksList.Add(new Check(this, Sys3, 0x1504E, Save + 0x23D8, 2)); // Underground Concourse + checksList.Add(new Check(this, Sys3, 0x1505A, Save + 0x23D8, 3)); // Underground Concourse + checksList.Add(new Check(this, Sys3, 0x15066, Save + 0x23D7, 6)); // Tunnelway + checksList.Add(new Check(this, Sys3, 0x15072, Save + 0x23D7, 7)); // Tunnelway + checksList.Add(new Check(this, Sys3, 0x1507E, Save + 0x23D2, 7)); // Sunset Terrace (TT) + checksList.Add(new Check(this, Sys3, 0x1508A, Save + 0x23D3, 0)); // Sunset Terrace (TT) + checksList.Add(new Check(this, Sys3, 0x15096, Save + 0x23D3, 1)); // Sunset Terrace (TT) + checksList.Add(new Check(this, Sys3, 0x150A2, Save + 0x23D3, 2)); // Sunset Terrace (TT) + checksList.Add(new Check(this, Sys3, 0x150AE, Save + 0x23D4, 5)); // Mansion: Foyer (TT) + checksList.Add(new Check(this, Sys3, 0x150BA, Save + 0x23D4, 6)); // Mansion: Foyer (TT) + checksList.Add(new Check(this, Sys3, 0x150C6, Save + 0x23D4, 7)); // Mansion: Foyer (TT) + checksList.Add(new Check(this, Sys3, 0x150D2, Save + 0x23D5, 2)); // Mansion: Dining Room (TT) + checksList.Add(new Check(this, Sys3, 0x150DE, Save + 0x23D5, 3)); // Mansion: Dining Room (TT) + checksList.Add(new Check(this, Sys3, 0x150EA, Save + 0x23D5, 5)); // Mansion: Library (TT) + checksList.Add(new Check(this, Sys3, 0x150F6, Save + 0x23D6, 1)); // Mansion: Basement Corridor (TT) + checksList.Add(new Check(this, Sys3, 0x15102, Save + 0x23CB, 4)); // Fragment Crossing + checksList.Add(new Check(this, Sys3, 0x1510E, Save + 0x23CB, 5)); // Fragment Crossing + checksList.Add(new Check(this, Sys3, 0x1511A, Save + 0x23CB, 6)); // Fragment Crossing + checksList.Add(new Check(this, Sys3, 0x15126, Save + 0x23CB, 7)); // Fragment Crossing + checksList.Add(new Check(this, Sys3, 0x15132, Save + 0x23CD, 3)); // Memory's Skyscraper + checksList.Add(new Check(this, Sys3, 0x1513E, Save + 0x23DC, 0)); // Memory's Skyscraper + checksList.Add(new Check(this, Sys3, 0x1514A, Save + 0x23DC, 1)); // Memory's Skyscraper + checksList.Add(new Check(this, Sys3, 0x15156, Save + 0x23CA, 5)); // The Brink of Despair + checksList.Add(new Check(this, Sys3, 0x15162, Save + 0x23DA, 2)); // The Brink of Despair + checksList.Add(new Check(this, Sys3, 0x1516E, Save + 0x23CC, 0)); // Nothing's Call + checksList.Add(new Check(this, Sys3, 0x1517A, Save + 0x23CC, 1)); // Nothing's Call + checksList.Add(new Check(this, Sys3, 0x15186, Save + 0x23CA, 6)); // Twilight's View + checksList.Add(new Check(this, Sys3, 0x15192, Save + 0x23CC, 2)); // Naught's Skyway + checksList.Add(new Check(this, Sys3, 0x1519E, Save + 0x23CC, 3)); // Naught's Skyway + checksList.Add(new Check(this, Sys3, 0x151AA, Save + 0x23CC, 4)); // Naught's Skyway + checksList.Add(new Check(this, Sys3, 0x151B6, Save + 0x23CC, 7)); // Ruin and Creation's Passage + checksList.Add(new Check(this, Sys3, 0x151C2, Save + 0x23CD, 0)); // Ruin and Creation's Passage + checksList.Add(new Check(this, Sys3, 0x151CE, Save + 0x23CD, 1)); // Ruin and Creation's Passage + checksList.Add(new Check(this, Sys3, 0x151DA, Save + 0x23CD, 2)); // Ruin and Creation's Passage + checksList.Add(new Check(this, Sys3, 0x151E6, Save + 0x23DC, 2)); // Cavern of Remembrance: Depths + checksList.Add(new Check(this, Sys3, 0x151F2, Save + 0x23DC, 3)); // Cavern of Remembrance: Depths + checksList.Add(new Check(this, Sys3, 0x151FE, Save + 0x23DC, 4)); // Cavern of Remembrance: Depths + checksList.Add(new Check(this, Sys3, 0x1520A, Save + 0x23DC, 5)); // Cavern of Remembrance: Depths + checksList.Add(new Check(this, Sys3, 0x15216, Save + 0x23DC, 6)); // Cavern of Remembrance: Depths + checksList.Add(new Check(this, Sys3, 0x15222, Save + 0x23DC, 7)); // Cavern of Remembrance: Depths + checksList.Add(new Check(this, Sys3, 0x1522E, Save + 0x23DD, 0)); // Cavern of Remembrance: Mining Area + checksList.Add(new Check(this, Sys3, 0x1523A, Save + 0x23DD, 1)); // Cavern of Remembrance: Mining Area + checksList.Add(new Check(this, Sys3, 0x15246, Save + 0x23DD, 2)); // Cavern of Remembrance: Mining Area + checksList.Add(new Check(this, Sys3, 0x15252, Save + 0x23DD, 3)); // Cavern of Remembrance: Mining Area + checksList.Add(new Check(this, Sys3, 0x1525E, Save + 0x23DD, 4)); // Cavern of Remembrance: Mining Area + checksList.Add(new Check(this, Sys3, 0x1526A, Save + 0x23DD, 5)); // Cavern of Remembrance: Mining Area + checksList.Add(new Check(this, Sys3, 0x15276, Save + 0x23DD, 6)); // Cavern of Remembrance: Engine Chamber + checksList.Add(new Check(this, Sys3, 0x15282, Save + 0x23DD, 7)); // Cavern of Remembrance: Engine Chamber + checksList.Add(new Check(this, Sys3, 0x1528E, Save + 0x23DE, 0)); // Cavern of Remembrance: Engine Chamber + checksList.Add(new Check(this, Sys3, 0x1529A, Save + 0x23DE, 1)); // Cavern of Remembrance: Engine Chamber + checksList.Add(new Check(this, Sys3, 0x152A6, Save + 0x23DE, 2)); // Cavern of Remembrance: Mineshaft + checksList.Add(new Check(this, Sys3, 0x152B2, Save + 0x23DE, 3)); // Cavern of Remembrance: Mineshaft + checksList.Add(new Check(this, Sys3, 0x152BE, Save + 0x23DE, 4)); // Cavern of Remembrance: Mineshaft + checksList.Add(new Check(this, Sys3, 0x152CA, Save + 0x23DE, 5)); // Cavern of Remembrance: Mineshaft + checksList.Add(new Check(this, Sys3, 0x152D6, Save + 0x23DE, 6)); // Cavern of Remembrance: Mineshaft + checksList.Add(new Check(this, Sys3, 0x152E2, Save + 0x23DF, 1)); // Garden of Assemblage + checksList.Add(new Check(this, Sys3, 0x152EE, Save + 0x23DF, 2)); // Garden of Assemblage + checksList.Add(new Check(this, Sys3, 0x152FA, Save + 0x23DF, 3)); // Garden of Assemblage + #endregion - // Bonus (35) - checksList.Add(new Check(this, Btl0 + 0x2A9D8, Save + 0x3704, 2)); // Thresholder - checksList.Add(new Check(this, Btl0 + 0x2AA08, Save + 0x3704, 3)); // Dark Thorn - checksList.Add(new Check(this, Btl0 + 0x2AA48, Save + 0x3704, 4)); // Xaldin - checksList.Add(new Check(this, Btl0 + 0x2AA88, Save + 0x3704, 5)); // Cerberus - checksList.Add(new Check(this, Btl0 + 0x2AAA8, Save + 0x3704, 6)); // Pete I - checksList.Add(new Check(this, Btl0 + 0x2AAD8, Save + 0x3704, 7)); // Hydra - checksList.Add(new Check(this, Btl0 + 0x2AB08, Save + 0x3705, 0)); // Hades - checksList.Add(new Check(this, Btl0 + 0x2AB48, Save + 0x3705, 1)); // Shan Yu - checksList.Add(new Check(this, Btl0 + 0x2AB88, Save + 0x3705, 2)); // Storm Rider - checksList.Add(new Check(this, Btl0 + 0x2ABF8, Save + 0x3705, 7)); // Genie Jafar - checksList.Add(new Check(this, Btl0 + 0x2AC08, Save + 0x3706, 0)); // Boat Pete - checksList.Add(new Check(this, Btl0 + 0x2AC38, Save + 0x3706, 1)); // Pete II - checksList.Add(new Check(this, Btl0 + 0x2AC68, Save + 0x3706, 2)); // Prison Keeper - checksList.Add(new Check(this, Btl0 + 0x2AD28, Save + 0x3706, 5)); // Barbossa - checksList.Add(new Check(this, Btl0 + 0x2AD68, Save + 0x3706, 6)); // Grim Reaper II - checksList.Add(new Check(this, Btl0 + 0x2ADD8, Save + 0x3707, 0)); // Luxord - checksList.Add(new Check(this, Btl0 + 0x2AE28, Save + 0x3707, 4)); // Demyx II - checksList.Add(new Check(this, Btl0 + 0x2AE98, Save + 0x3707, 6)); // Groundshaker - checksList.Add(new Check(this, Btl0 + 0x2AEB8, Save + 0x3707, 7)); // Hostile Program - checksList.Add(new Check(this, Btl0 + 0x2AEF8, Save + 0x3708, 0)); // MCP - checksList.Add(new Check(this, Btl0 + 0x2AF38, Save + 0x3708, 1)); // Twilight Thorn - checksList.Add(new Check(this, Btl0 + 0x2AF68, Save + 0x3708, 5)); // Volcanic Lord & Blizzard Lord - checksList.Add(new Check(this, Btl0 + 0x2AFA8, Save + 0x3708, 6)); // Queen Minnie Escort - checksList.Add(new Check(this, Btl0 + 0x2B038, Save + 0x3709, 2)); // Abu Escort - checksList.Add(new Check(this, Btl0 + 0x2B078, Save + 0x3709, 3)); // Village Cave Heartless - checksList.Add(new Check(this, Btl0 + 0x2B118, Save + 0x3709, 7)); // Bailey Nobodies - checksList.Add(new Check(this, Btl0 + 0x2B228, Save + 0x370A, 6)); // Station of Serenity Nobodies - checksList.Add(new Check(this, Btl0 + 0x2B268, Save + 0x370B, 1)); // Phil's Training - checksList.Add(new Check(this, Btl0 + 0x2B2A8, Save + 0x370B, 3)); // Grim Reaper I - checksList.Add(new Check(this, Btl0 + 0x2B2E8, Save + 0x370B, 4)); // 1000 Heartless - checksList.Add(new Check(this, Btl0 + 0x2B2F8, Save + 0x370B, 5)); // Solar Sailer Heartless - checksList.Add(new Check(this, Btl0 + 0x2B338, Save + 0x370B, 6)); // The Interceptor Pirates - checksList.Add(new Check(this, Btl0 + 0x2B368, Save + 0x370B, 7)); // Betwixt and Between Nobodies - checksList.Add(new Check(this, Btl0 + 0x2B468, Save + 0x370C, 5)); // Roxas - checksList.Add(new Check(this, Btl0 + 0x2B4F8, Save + 0x370D, 1)); // Axel I + #region Bonus + // Bonus (120) + checksList.Add(new Check(this, Btl0, 0x2A9D8, Save + 0x3704, 2)); // Thresholder - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2A9DA, Save + 0x3704, 2)); // Thresholder - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AA08, Save + 0x3704, 3)); // Dark Thorn - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AA0A, Save + 0x3704, 3)); // Dark Thorn - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AA48, Save + 0x3704, 4)); // Xaldin - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AA4A, Save + 0x3704, 4)); // Xaldin - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AA88, Save + 0x3704, 5)); // Cerberus - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AA8A, Save + 0x3704, 5)); // Cerberus - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AAA8, Save + 0x3704, 6)); // Pete I - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AAAA, Save + 0x3704, 6)); // Pete I - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AAD8, Save + 0x3704, 7)); // Hydra - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AADA, Save + 0x3704, 7)); // Hydra - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AB08, Save + 0x3705, 0)); // Hades - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AB0A, Save + 0x3705, 0)); // Hades - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AB48, Save + 0x3705, 1)); // Shan Yu - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AB48, Save + 0x3705, 1)); // Shan Yu - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AB88, Save + 0x3705, 2)); // Storm Rider - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AB8A, Save + 0x3705, 2)); // Storm Rider - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2ABC8, Save + 0x3705, 4)); // Beast - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2ABCA, Save + 0x3705, 4)); // Beast - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2ABF8, Save + 0x3705, 7)); // Genie Jafar - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2ABFA, Save + 0x3705, 7)); // Genie Jafar - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AC08, Save + 0x3706, 0)); // Boat Pete - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AC0A, Save + 0x3706, 0)); // Boat Pete - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AC38, Save + 0x3706, 1)); // Pete II - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AC3A, Save + 0x3706, 1)); // Pete II - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AC68, Save + 0x3706, 2)); // Prison Keeper - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AC6A, Save + 0x3706, 2)); // Prison Keeper - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2ACA8, Save + 0x3706, 3)); // Oogie Boogie - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2ACAA, Save + 0x3706, 3)); // Oogie Boogie - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2ACE8, Save + 0x3706, 4)); // The Experiment - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2ACEA, Save + 0x3706, 4)); // The Experiment - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AD28, Save + 0x3706, 5)); // Barbossa - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AD2A, Save + 0x3706, 5)); // Barbossa - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AD68, Save + 0x3706, 6)); // Grim Reaper II - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AD6A, Save + 0x3706, 6)); // Grim Reaper II - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2ADA8, Save + 0x3706, 7)); // Xigbar - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2ADAA, Save + 0x3706, 7)); // Xigbar - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2ADD8, Save + 0x3707, 0)); // Luxord - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2ADDA, Save + 0x3707, 0)); // Luxord - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2ADE8, Save + 0x3707, 1)); // Saïx - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2ADEA, Save + 0x3707, 1)); // Saïx - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AE18, Save + 0x3707, 2)); // Xemnas I - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AE1A, Save + 0x3707, 2)); // Xemnas I - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AE28, Save + 0x3707, 4)); // Demyx II - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AE2A, Save + 0x3707, 4)); // Demyx II - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AE58, Save + 0x3707, 5)); // Scar - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AE5A, Save + 0x3707, 5)); // Scar - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AE98, Save + 0x3707, 6)); // Groundshaker - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AE9A, Save + 0x3707, 6)); // Groundshaker - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AEB8, Save + 0x3707, 7)); // Hostile Program - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AEBA, Save + 0x3707, 7)); // Hostile Program - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AEF8, Save + 0x3708, 0)); // MCP - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AEFA, Save + 0x3708, 0)); // MCP - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AF38, Save + 0x3708, 1)); // Twilight Thorn - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AF3A, Save + 0x3708, 1)); // Twilight Thorn - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AF48, Save + 0x3708, 2)); // Axel II - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AF4A, Save + 0x3708, 2)); // Axel II - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AF58, Save + 0x3708, 3)); // Sephiroth - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AF5A, Save + 0x3708, 3)); // Sephiroth - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AF68, Save + 0x3708, 5)); // Volcanic Lord & Blizzard Lord - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AF6A, Save + 0x3708, 5)); // Volcanic Lord & Blizzard Lord - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AFA8, Save + 0x3708, 6)); // Queen Minnie Escort - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2AFAA, Save + 0x3708, 6)); // Queen Minnie Escort - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AFB8, Save + 0x3708, 7)); // The Interceptor Barrels - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AFBA, Save + 0x3708, 7)); // The Interceptor Barrels - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2AFF8, Save + 0x3709, 0)); // Lock, Shock & Barrel - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2AFFA, Save + 0x3709, 0)); // Lock, Shock & Barrel - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B038, Save + 0x3709, 2)); // Abu Escort - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B03A, Save + 0x3709, 2)); // Abu Escort - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B078, Save + 0x3709, 3)); // Village Cave Heartless - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B07A, Save + 0x3709, 3)); // Village Cave Heartless - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B098, Save + 0x3709, 5)); // Dataspace Monitors - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B09A, Save + 0x3709, 5)); // Dataspace Monitors - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B0D8, Save + 0x3709, 6)); // Treasure Room Heartless - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B0DA, Save + 0x3709, 6)); // Treasure Room Heartless - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B118, Save + 0x3709, 7)); // Bailey Nobodies - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B11A, Save + 0x3709, 7)); // Bailey Nobodies - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B128, Save + 0x370A, 1)); // Hyenas I - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B12A, Save + 0x370A, 1)); // Hyenas I - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B158, Save + 0x370A, 2)); // Hyenas II - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B15A, Save + 0x370A, 2)); // Hyenas II - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B228, Save + 0x370A, 6)); // Station of Serenity Nobodies - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B22A, Save + 0x370A, 6)); // Station of Serenity Nobodies - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B238, Save + 0x370B, 0)); // The Old Mansion Nobodies - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B23A, Save + 0x370B, 0)); // The Old Mansion Nobodies - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B268, Save + 0x370B, 1)); // Phil's Training - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B26A, Save + 0x370B, 1)); // Phil's Training - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B278, Save + 0x370B, 2)); // Demyx I - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B27A, Save + 0x370B, 2)); // Demyx I - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B2A8, Save + 0x370B, 3)); // Grim Reaper I - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B2AA, Save + 0x370B, 3)); // Grim Reaper I - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B2E8, Save + 0x370B, 4)); // 1000 Heartless - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B2EA, Save + 0x370B, 4)); // 1000 Heartless - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B2F8, Save + 0x370B, 5)); // Solar Sailer Heartless - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B2FA, Save + 0x370B, 5)); // Solar Sailer Heartless - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B338, Save + 0x370B, 6)); // The Interceptor Pirates - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B33A, Save + 0x370B, 6)); // The Interceptor Pirates - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B368, Save + 0x370B, 7)); // Betwixt and Between Nobodies - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B36A, Save + 0x370B, 7)); // Betwixt and Between Nobodies - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B378, Save + 0x370C, 0)); // Vexen - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B37A, Save + 0x370C, 0)); // Vexen - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B3A8, Save + 0x370C, 1)); // Lexaeus - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B3AA, Save + 0x370C, 1)); // Lexaeus - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B3D8, Save + 0x370C, 2)); // Zexion - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B3DA, Save + 0x370C, 2)); // Zexion - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B408, Save + 0x370C, 3)); // Marluxia - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B40A, Save + 0x370C, 3)); // Marluxia - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B438, Save + 0x370C, 4)); // Larxene - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B43A, Save + 0x370C, 4)); // Larxene - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B468, Save + 0x370C, 5)); // Roxas - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B46A, Save + 0x370C, 5)); // Roxas - Slot 2 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B478, Save + 0x370C, 6)); // Lingering Will - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B47A, Save + 0x370C, 6)); // Lingering Will - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B4A8, Save + 0x370C, 7)); // Xemnas II - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B4AA, Save + 0x370C, 7)); // Xemnas II - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B4C8, Save + 0x370D, 0)); // Transport to Remembrance Nobodies III - Slot 1 (Statsanity) + checksList.Add(new Check(this, Btl0, 0x2B4CA, Save + 0x370D, 0)); // Transport to Remembrance Nobodies III - Slot 2 (Plando) + checksList.Add(new Check(this, Btl0, 0x2B4F8, Save + 0x370D, 1)); // Axel I - Slot 1 + checksList.Add(new Check(this, Btl0, 0x2B4FA, Save + 0x370D, 1)); // Axel I - Slot 2 (Plando) + #endregion + #region popup // Popup (92, excluding AS and Data) (using corresponding progress flags) - checksList.Add(new Check(this, Sys3 + 0x15606, Save + 0x1DB4, 6)); // Sweet Memories - checksList.Add(new Check(this, Sys3 + 0x15612, Save + 0x1DB4, 6)); // Spooky Cave Map - checksList.Add(new Check(this, Sys3 + 0x1561E, Save + 0x1DB5, 5)); // Starry Hill Cure - checksList.Add(new Check(this, Sys3 + 0x1562A, Save + 0x1DB5, 5)); // Starry Hill Orichalcum+ - checksList.Add(new Check(this, Sys3 + 0x15492, Save + 0x1D74, 4)); // Agrabah Map - checksList.Add(new Check(this, Sys3 + 0x1549E, Save + 0x1D72, 4)); // Lamp Charm - checksList.Add(new Check(this, Sys3 + 0x155B2, Save + 0x1D77, 3)); // Wishing Lamp - checksList.Add(new Check(this, Sys3 + 0x15546, Save + 0x1DF4, 2)); // Undersea Kingdom Map - checksList.Add(new Check(this, Sys3 + 0x155E2, Save + 0x1DF5, 3)); // Mysterious Abyss - checksList.Add(new Check(this, Sys3 + 0x155EE, Save + 0x1DF4, 1)); // Last Song Blizzard - checksList.Add(new Check(this, Sys3 + 0x155FA, Save + 0x1DF4, 1)); // Last Song Orichalcum+ - checksList.Add(new Check(this, Sys3 + 0x153F6, Save + 0x1D32, 5)); // Dark Thorn Cure - checksList.Add(new Check(this, Sys3 + 0x15552, Save + 0x1D39, 0)); // Rumbling Rose - checksList.Add(new Check(this, Sys3 + 0x1555E, Save + 0x1D39, 0)); // Castle Walls Map - checksList.Add(new Check(this, Sys3 + 0x156C6, Save + 0x1D31, 2)); // Ansem Report 4 - checksList.Add(new Check(this, Sys3 + 0x15456, Save + 0x1E10, 4)); // Disney Castle Map - checksList.Add(new Check(this, Sys3 + 0x1546E, Save + 0x1E32, 4)); // Window of Time Map - checksList.Add(new Check(this, Sys3 + 0x15432, Save + 0x1E33, 2)); // Monochrome - checksList.Add(new Check(this, Sys3 + 0x15462, Save + 0x1E11, 7)); // Wisdom Form - checksList.Add(new Check(this, Sys3 + 0x15816, Save + 0x1E14, 2)); // Proof of Connection (sometimes slightly early) - checksList.Add(new Check(this, Sys3 + 0x15822, Save + 0x1E14, 2)); // Manifest Illusion (early) - checksList.Add(new Check(this, Sys3 + 0x154AA, Save + 0x1E53, 2)); // Oogie Magnet - checksList.Add(new Check(this, Sys3 + 0x155BE, Save + 0x1E55, 1)); // Present - checksList.Add(new Check(this, Sys3 + 0x155CA, Save + 0x1E55, 4)); // Decoy Presents - checksList.Add(new Check(this, Sys3 + 0x155D6, Save + 0x1E56, 0)); // Decisive Pumpkin - checksList.Add(new Check(this, Sys3 + 0x1538A, Save + 0x3DA9, 7)); // Marketplace Map (Random flag? PS2:32F8D9(80)) - checksList.Add(new Check(this, Sys3 + 0x15396, Save + 0x1D10, 6)); // Membership Card - checksList.Add(new Check(this, Sys3 + 0x153A2, Save + 0x1D10, 6)); // Merlin Blizzard - checksList.Add(new Check(this, Sys3 + 0x156EA, Save + 0x1D18, 3)); // Ansem Report 7 (late) - checksList.Add(new Check(this, Sys3 + 0x15402, Save + 0x3DAA, 4)); // Baseball Charm (Random flag? PS2:32F8DA(10)) - checksList.Add(new Check(this, Sys3 + 0x1550A, Save + 0x1D12, 6)); // Master Form - checksList.Add(new Check(this, Sys3 + 0x15636, Save + 0x1D1D, 4)); // Sleeping Lion - checksList.Add(new Check(this, Sys3 + 0x15522, Save + 0x1D14, 6)); // FF Fights Cure - checksList.Add(new Check(this, Sys3 + 0x156A2, Save + 0x1D19, 3)); // Ansem Report 1 - checksList.Add(new Check(this, Sys3 + 0x1552E, Save + 0x1D23, 0)); // Ice Cream - checksList.Add(new Check(this, Sys3 + 0x1553A, Save + 0x1D23, 0)); // Picture - checksList.Add(new Check(this, Sys3 + 0x1582E, Save + 0x1D27, 5)); // Winner's Proof - checksList.Add(new Check(this, Sys3 + 0x1583A, Save + 0x1D27, 5)); // Proof of Peace - checksList.Add(new Check(this, Sys3 + 0x15642, Save + 0x1D1F, 7)); // Fenrir - checksList.Add(new Check(this, Sys3 + 0x153D2, Save + 0x1D94, 6)); // Encampment Area Map - checksList.Add(new Check(this, Sys3 + 0x153C6, Save + 0x1D96, 0)); // Mission 3 AP Boost - checksList.Add(new Check(this, Sys3 + 0x153DE, Save + 0x1D96, 6)); // Village Area Map - checksList.Add(new Check(this, Sys3 + 0x153EA, Save + 0x1D92, 2)); // Hidden Dragon - checksList.Add(new Check(this, Sys3 + 0x1540E, Save + 0x1D5A, 4)); // Coliseum Map - checksList.Add(new Check(this, Sys3 + 0x1541A, Save + 0x1D5B, 3)); // Olympus Stone - checksList.Add(new Check(this, Sys3 + 0x156D2, Save + 0x1D5B, 3)); // Ansem Report 5 - checksList.Add(new Check(this, Sys3 + 0x15426, Save + 0x1D55, 7)); // Hero's Crest - checksList.Add(new Check(this, Sys3 + 0x15582, Save + 0x1D5F, 2)); // Auron's Statue - checksList.Add(new Check(this, Sys3 + 0x1558E, Save + 0x1D56, 5)); // Guardian Soul - checksList.Add(new Check(this, Sys3 + 0x1543E, Save + 0x1D57, 6)); // Pain & Panic Cup Protect Belt (slightly early) - checksList.Add(new Check(this, Sys3 + 0x1544A, Save + 0x1D57, 6)); // Pain & Panic Cup Serenity Gem (slightly early) - checksList.Add(new Check(this, Sys3 + 0x154CE, Save + 0x1D58, 0)); // Cerberus Cup Rising Dragon (slightly early) - checksList.Add(new Check(this, Sys3 + 0x154DA, Save + 0x1D58, 0)); // Cerberus Cup Serenity Crystal (slightly early) - checksList.Add(new Check(this, Sys3 + 0x1559A, Save + 0x1D58, 1)); // Titan Cup Genji Shield (slightly early) - checksList.Add(new Check(this, Sys3 + 0x155A6, Save + 0x1D58, 2)); // Titan Cup Skillful Ring (slightly early) - checksList.Add(new Check(this, Sys3 + 0x1564E, Save + 0x1D58, 4)); // Goddess of Fate Cup Fatal Crest (slightly early) - checksList.Add(new Check(this, Sys3 + 0x1565A, Save + 0x1D58, 4)); // Goddess of Fate Cup Orichalcum+ (slightly early) - checksList.Add(new Check(this, Sys3 + 0x15696, Save + 0x1D5A, 1)); // Hades Cup Trophy (slightly early) - checksList.Add(new Check(this, Sys3 + 0x15474, Save + 0x1E92, 4)); // Isla de Muerta Map - checksList.Add(new Check(this, Sys3 + 0x15486, Save + 0x1E93, 6)); // Follow the Wind - checksList.Add(new Check(this, Sys3 + 0x1556A, Save + 0x1E95, 2)); // Cursed Medallion - checksList.Add(new Check(this, Sys3 + 0x15576, Save + 0x1E95, 2)); // Ship Graveyard Map - checksList.Add(new Check(this, Sys3 + 0x156DE, Save + 0x1E95, 7)); // Ansem Report 6 - checksList.Add(new Check(this, Sys3 + 0x154B6, Save + 0x1DD2, 1)); // Circle of Life - checksList.Add(new Check(this, Sys3 + 0x154C2, Save + 0x1DD4, 7)); // Scar Fire - checksList.Add(new Check(this, Sys3 + 0x15336, Save + 0x1CD6, 3)); // Twilight Town Map - checksList.Add(new Check(this, Sys3 + 0x15306, Save + 0x1CD6, 5)); // Olette Munny Pouch - checksList.Add(new Check(this, Sys3 + 0x15312, Save + 0x1CDC, 2)); // Champion Belt - checksList.Add(new Check(this, Sys3 + 0x1531E, Save + 0x1CDC, 2)); // Medal - checksList.Add(new Check(this, Sys3 + 0x1532A, Save + 0x1CDC, 2)); // "The Struggle" Trophy - checksList.Add(new Check(this, Sys3 + 0x15342, Save + 0x1CE0, 6)); // Namine's Sketches - checksList.Add(new Check(this, Sys3 + 0x1534E, Save + 0x1CE0, 6)); // Mansion Map - checksList.Add(new Check(this, Sys3 + 0x15516, Save + 0x1EB2, 3)); // Photon Debugger - checksList.Add(new Check(this, Sys3 + 0x1535A, Save + 0x1CE3, 7)); // Mickey Munny Pouch - checksList.Add(new Check(this, Sys3 + 0x15366, Save + 0x1CE3, 7)); // Crystal Orb - checksList.Add(new Check(this, Sys3 + 0x156AE, Save + 0x1CE3, 7)); // Ansem Report 2 - checksList.Add(new Check(this, Sys3 + 0x15372, Save + 0x1CE5, 2)); // Star Seeker - checksList.Add(new Check(this, Sys3 + 0x1537E, Save + 0x1CE5, 2)); // Valor Form - checksList.Add(new Check(this, Sys3 + 0x154E6, Save + 0x1CE6, 4)); // Seifer's Trophy - checksList.Add(new Check(this, Sys3 + 0x154F2, Save + 0x1CE6, 7)); // Oathkeeper (early) - checksList.Add(new Check(this, Sys3 + 0x154FE, Save + 0x1CE6, 7)); // Limit Form (early) - checksList.Add(new Check(this, Sys3 + 0x1570E, Save + 0x1CE8, 3)); // Ansem Report 10 - checksList.Add(new Check(this, Sys3 + 0x15666, Save + 0x1CE9, 1)); // Bond of Flame - checksList.Add(new Check(this, Sys3 + 0x15672, Save + 0x1ED1, 1)); // Two Become One - checksList.Add(new Check(this, Sys3 + 0x156F6, Save + 0x1ED1, 1)); // Ansem Report 8 - checksList.Add(new Check(this, Sys3 + 0x156BA, Save + 0x1ED2, 2)); // Ansem Report 3 - checksList.Add(new Check(this, Sys3 + 0x1567E, Save + 0x1ED2, 4)); // Oblivion - checksList.Add(new Check(this, Sys3 + 0x1568A, Save + 0x1ED2, 4)); // Castle That Never Was Map - checksList.Add(new Check(this, Sys3 + 0x15702, Save + 0x1ED2, 7)); // Ansem Report 9 - checksList.Add(new Check(this, Sys3 + 0x15726, Save + 0x1ED3, 2)); // Ansem Report 12 (early) - checksList.Add(new Check(this, Sys3 + 0x1571A, Save + 0x1ED3, 6)); // Ansem Report 11 - checksList.Add(new Check(this, Sys3 + 0x15732, Save + 0x1ED4, 5)); // Ansem Report 13 + checksList.Add(new Check(this, Sys3, 0x15606, Save + 0x1DB4, 6)); // Sweet Memories + checksList.Add(new Check(this, Sys3, 0x15612, Save + 0x1DB4, 6)); // Spooky Cave Map + checksList.Add(new Check(this, Sys3, 0x1561E, Save + 0x1DB5, 5)); // Starry Hill Cure + checksList.Add(new Check(this, Sys3, 0x1562A, Save + 0x1DB5, 5)); // Starry Hill Orichalcum+ + checksList.Add(new Check(this, Sys3, 0x15492, Save + 0x1D74, 4)); // Agrabah Map + checksList.Add(new Check(this, Sys3, 0x1549E, Save + 0x1D72, 4)); // Lamp Charm + checksList.Add(new Check(this, Sys3, 0x155B2, Save + 0x1D77, 3)); // Wishing Lamp + checksList.Add(new Check(this, Sys3, 0x15546, Save + 0x1DF4, 2)); // Undersea Kingdom Map + checksList.Add(new Check(this, Sys3, 0x155E2, Save + 0x1DF5, 3)); // Mysterious Abyss + checksList.Add(new Check(this, Sys3, 0x155EE, Save + 0x1DF4, 1)); // Last Song Blizzard + checksList.Add(new Check(this, Sys3, 0x155FA, Save + 0x1DF4, 1)); // Last Song Orichalcum+ + checksList.Add(new Check(this, Sys3, 0x153F6, Save + 0x1D32, 5)); // Dark Thorn Cure + checksList.Add(new Check(this, Sys3, 0x15552, Save + 0x1D39, 0)); // Rumbling Rose + checksList.Add(new Check(this, Sys3, 0x1555E, Save + 0x1D39, 0)); // Castle Walls Map + checksList.Add(new Check(this, Sys3, 0x156C6, Save + 0x1D31, 2)); // Ansem Report 4 + checksList.Add(new Check(this, Sys3, 0x15456, Save + 0x1E10, 4)); // Disney Castle Map + checksList.Add(new Check(this, Sys3, 0x1546E, Save + 0x1E32, 4)); // Window of Time Map + checksList.Add(new Check(this, Sys3, 0x15432, Save + 0x1E33, 2)); // Monochrome + checksList.Add(new Check(this, Sys3, 0x15462, Save + 0x1E11, 7)); // Wisdom Form + checksList.Add(new Check(this, Sys3, 0x15816, Save + 0x1E14, 2)); // Proof of Connection (sometimes slightly early) + checksList.Add(new Check(this, Sys3, 0x15822, Save + 0x1E14, 2)); // Manifest Illusion (early) + checksList.Add(new Check(this, Sys3, 0x154AA, Save + 0x1E53, 2)); // Oogie Magnet + checksList.Add(new Check(this, Sys3, 0x155BE, Save + 0x1E55, 1)); // Present + checksList.Add(new Check(this, Sys3, 0x155CA, Save + 0x1E55, 4)); // Decoy Presents + checksList.Add(new Check(this, Sys3, 0x155D6, Save + 0x1E56, 0)); // Decisive Pumpkin + checksList.Add(new Check(this, Sys3, 0x1538A, Save + 0x1D17, 4)); // Marketplace Map + checksList.Add(new Check(this, Sys3, 0x15396, Save + 0x1D10, 6)); // Membership Card + checksList.Add(new Check(this, Sys3, 0x153A2, Save + 0x1D10, 6)); // Merlin Blizzard + checksList.Add(new Check(this, Sys3, 0x156EA, Save + 0x1D18, 3)); // Ansem Report 7 (late) + checksList.Add(new Check(this, Sys3, 0x15402, Save + 0x3DAA, 4)); // Baseball Charm (Random flag? PS2:32F8DA(10)) + checksList.Add(new Check(this, Sys3, 0x1550A, Save + 0x1D12, 6)); // Master Form + checksList.Add(new Check(this, Sys3, 0x15636, Save + 0x1D1D, 4)); // Sleeping Lion + checksList.Add(new Check(this, Sys3, 0x15522, Save + 0x1D14, 6)); // FF Fights Cure + checksList.Add(new Check(this, Sys3, 0x156A2, Save + 0x1D19, 3)); // Ansem Report 1 + checksList.Add(new Check(this, Sys3, 0x1552E, Save + 0x1D23, 0)); // Ice Cream + checksList.Add(new Check(this, Sys3, 0x1553A, Save + 0x1D23, 0)); // Picture + checksList.Add(new Check(this, Sys3, 0x1582E, Save + 0x1D27, 5)); // Winner's Proof + checksList.Add(new Check(this, Sys3, 0x1583A, Save + 0x1D27, 5)); // Proof of Peace + checksList.Add(new Check(this, Sys3, 0x15642, Save + 0x1D1F, 7)); // Fenrir + checksList.Add(new Check(this, Sys3, 0x153D2, Save + 0x1D94, 6)); // Encampment Area Map + checksList.Add(new Check(this, Sys3, 0x153C6, Save + 0x1D96, 0)); // Mission 3 AP Boost + checksList.Add(new Check(this, Sys3, 0x153DE, Save + 0x1D96, 6)); // Village Area Map + checksList.Add(new Check(this, Sys3, 0x153EA, Save + 0x1D92, 2)); // Hidden Dragon + checksList.Add(new Check(this, Sys3, 0x1540E, Save + 0x1D5A, 4)); // Coliseum Map + checksList.Add(new Check(this, Sys3, 0x1541A, Save + 0x1D5B, 3)); // Olympus Stone + checksList.Add(new Check(this, Sys3, 0x156D2, Save + 0x1D5B, 3)); // Ansem Report 5 + checksList.Add(new Check(this, Sys3, 0x15426, Save + 0x1D55, 7)); // Hero's Crest + checksList.Add(new Check(this, Sys3, 0x15582, Save + 0x1D5F, 2)); // Auron's Statue + checksList.Add(new Check(this, Sys3, 0x1558E, Save + 0x1D56, 5)); // Guardian Soul + checksList.Add(new Check(this, Sys3, 0x1543E, Save + 0x1D57, 6)); // Pain & Panic Cup Protect Belt (slightly early) + checksList.Add(new Check(this, Sys3, 0x1544A, Save + 0x1D57, 6)); // Pain & Panic Cup Serenity Gem (slightly early) + checksList.Add(new Check(this, Sys3, 0x154CE, Save + 0x1D58, 0)); // Cerberus Cup Rising Dragon (slightly early) + checksList.Add(new Check(this, Sys3, 0x154DA, Save + 0x1D58, 0)); // Cerberus Cup Serenity Crystal (slightly early) + checksList.Add(new Check(this, Sys3, 0x1559A, Save + 0x1D58, 1)); // Titan Cup Genji Shield (slightly early) + checksList.Add(new Check(this, Sys3, 0x155A6, Save + 0x1D58, 2)); // Titan Cup Skillful Ring (slightly early) + checksList.Add(new Check(this, Sys3, 0x1564E, Save + 0x1D58, 4)); // Goddess of Fate Cup Fatal Crest (slightly early) + checksList.Add(new Check(this, Sys3, 0x1565A, Save + 0x1D58, 4)); // Goddess of Fate Cup Orichalcum+ (slightly early) + checksList.Add(new Check(this, Sys3, 0x15696, Save + 0x1D5A, 1)); // Hades Cup Trophy (slightly early) + checksList.Add(new Check(this, Sys3, 0x1547A, Save + 0x1E92, 4)); // Isla de Muerta Map + checksList.Add(new Check(this, Sys3, 0x15486, Save + 0x1E93, 6)); // Follow the Wind + checksList.Add(new Check(this, Sys3, 0x1556A, Save + 0x1E95, 2)); // Cursed Medallion + checksList.Add(new Check(this, Sys3, 0x15576, Save + 0x1E95, 2)); // Ship Graveyard Map + checksList.Add(new Check(this, Sys3, 0x156DE, Save + 0x1E95, 7)); // Ansem Report 6 + checksList.Add(new Check(this, Sys3, 0x154B6, Save + 0x1DD2, 1)); // Circle of Life + checksList.Add(new Check(this, Sys3, 0x154C2, Save + 0x1DD4, 7)); // Scar Fire + checksList.Add(new Check(this, Sys3, 0x15336, Save + 0x1CD6, 3)); // Twilight Town Map + checksList.Add(new Check(this, Sys3, 0x15306, Save + 0x1CD6, 5)); // Olette Munny Pouch + checksList.Add(new Check(this, Sys3, 0x15312, Save + 0x1CDC, 2)); // Champion Belt + checksList.Add(new Check(this, Sys3, 0x1531E, Save + 0x1CDC, 2)); // Medal + checksList.Add(new Check(this, Sys3, 0x1532A, Save + 0x1CDC, 2)); // "The Struggle" Trophy + checksList.Add(new Check(this, Sys3, 0x15342, Save + 0x1CE0, 6)); // Namine's Sketches + checksList.Add(new Check(this, Sys3, 0x1534E, Save + 0x1CE0, 6)); // Mansion Map + checksList.Add(new Check(this, Sys3, 0x15516, Save + 0x1EB2, 3)); // Photon Debugger + checksList.Add(new Check(this, Sys3, 0x1535A, Save + 0x1CE3, 7)); // Mickey Munny Pouch + checksList.Add(new Check(this, Sys3, 0x15366, Save + 0x1CE3, 7)); // Crystal Orb + checksList.Add(new Check(this, Sys3, 0x156AE, Save + 0x1CE3, 7)); // Ansem Report 2 + checksList.Add(new Check(this, Sys3, 0x15372, Save + 0x1CE5, 2)); // Star Seeker + checksList.Add(new Check(this, Sys3, 0x1537E, Save + 0x1CE5, 2)); // Valor Form + checksList.Add(new Check(this, Sys3, 0x154E6, Save + 0x1CE6, 4)); // Seifer's Trophy + checksList.Add(new Check(this, Sys3, 0x154F2, Save + 0x1CE6, 7)); // Oathkeeper (early) + checksList.Add(new Check(this, Sys3, 0x154FE, Save + 0x1CE6, 7)); // Limit Form (early) + checksList.Add(new Check(this, Sys3, 0x1570E, Save + 0x1CE8, 3)); // Ansem Report 10 + checksList.Add(new Check(this, Sys3, 0x15666, Save + 0x1CE9, 1)); // Bond of Flame + checksList.Add(new Check(this, Sys3, 0x15672, Save + 0x1ED1, 1)); // Two Become One + checksList.Add(new Check(this, Sys3, 0x156F6, Save + 0x1ED1, 1)); // Ansem Report 8 + checksList.Add(new Check(this, Sys3, 0x156BA, Save + 0x1ED2, 2)); // Ansem Report 3 + checksList.Add(new Check(this, Sys3, 0x1567E, Save + 0x1ED2, 4)); // Oblivion + checksList.Add(new Check(this, Sys3, 0x1568A, Save + 0x1ED2, 4)); // Castle That Never Was Map + checksList.Add(new Check(this, Sys3, 0x15702, Save + 0x1ED2, 7)); // Ansem Report 9 + checksList.Add(new Check(this, Sys3, 0x15726, Save + 0x1ED3, 2)); // Ansem Report 12 (early) + checksList.Add(new Check(this, Sys3, 0x1571A, Save + 0x1ED3, 6)); // Ansem Report 11 + checksList.Add(new Check(this, Sys3, 0x15732, Save + 0x1ED4, 5)); // Ansem Report 13 + #endregion // Popup for Absent Silhouette and Data (using defeat cutscene IDs) (18) - checksList.Add(new Check(this, Sys3 + 0x1573E, World, "HalloweenTown", 0x20, 0x79)); // AS Vexen - checksList.Add(new Check(this, Sys3 + 0x1577A, World, "HalloweenTown", 0x20, 0x79)); // Data Vexen - checksList.Add(new Check(this, Sys3 + 0x1574A, World, "Agrabah", 0x21, 0x7B)); // AS Lexaeus - checksList.Add(new Check(this, Sys3 + 0x15786, World, "Agrabah", 0x21, 0x7B)); // Data Lexaeus - checksList.Add(new Check(this, Sys3 + 0x15756, World, "OlympusColiseum", 0x22, 0x7D)); // AS Zexion - checksList.Add(new Check(this, Sys3 + 0x15792, World, "OlympusColiseum", 0x22, 0x7D)); // Data Zexion - checksList.Add(new Check(this, Sys3 + 0x1576E, World, "DisneyCastle", 0x26, 0x7F)); // AS Marluxia - checksList.Add(new Check(this, Sys3 + 0x157AA, World, "DisneyCastle", 0x26, 0x7F)); // Data Marluxia - checksList.Add(new Check(this, Sys3 + 0x15762, World, "SpaceParanoids", 0x21, 0x81)); // AS Larxene - checksList.Add(new Check(this, Sys3 + 0x1579E, World, "SpaceParanoids", 0x21, 0x81)); // Data Larxene - checksList.Add(new Check(this, Sys3 + 0x157DA, World, "TWTNW", 0x14, 0x6A)); // Data Xemnas - checksList.Add(new Check(this, Sys3 + 0x157E6, World, "LandofDragons", 0x0A, 0x6C)); // Data Xigbar - checksList.Add(new Check(this, Sys3 + 0x157C2, World, "BeastsCastle", 0x0F, 0x63)); // Data Xaldin - checksList.Add(new Check(this, Sys3 + 0x157F2, World, "PrideLands", 0x0F, 0x6E)); // Data Saix - checksList.Add(new Check(this, Sys3 + 0x157CE, World, "TwilightTown", 0x14, 0xD4)); // Data Axel - checksList.Add(new Check(this, Sys3 + 0x157B6, World, "HollowBastion", 0x04, 0x8D)); // Data Demyx - checksList.Add(new Check(this, Sys3 + 0x157FE, World, "PortRoyal", 0x0E, 0x70)); // Data Luxord - checksList.Add(new Check(this, Sys3 + 0x1580A, World, "SimulatedTwilightTown", 0x15, 0x72)); // Data Roxas + checksList.Add(new Check(this, Sys3, 0x1573E, World, "HalloweenTown", 0x20, 0x79)); // AS Vexen + checksList.Add(new Check(this, Sys3, 0x1574A, World, "Agrabah", 0x21, 0x7B)); // AS Lexaeus + checksList.Add(new Check(this, Sys3, 0x15756, World, "OlympusColiseum", 0x22, 0x7D)); // AS Zexion + checksList.Add(new Check(this, Sys3, 0x1576E, World, "DisneyCastle", 0x26, 0x7F)); // AS Marluxia + checksList.Add(new Check(this, Sys3, 0x15762, World, "SpaceParanoids", 0x21, 0x81)); // AS Larxene + + if (!MainWindow.data.dataSplit) //data split off + { + checksList.Add(new Check(this, Sys3, 0x1577A, World, "HalloweenTown", 0x20, 0x79)); // Data Vexen + checksList.Add(new Check(this, Sys3, 0x15786, World, "Agrabah", 0x21, 0x7B)); // Data Lexaeus + checksList.Add(new Check(this, Sys3, 0x15792, World, "OlympusColiseum", 0x22, 0x7D)); // Data Zexion + checksList.Add(new Check(this, Sys3, 0x157AA, World, "DisneyCastle", 0x26, 0x7F)); // Data Marluxia + checksList.Add(new Check(this, Sys3, 0x1579E, World, "SpaceParanoids", 0x21, 0x81)); // Data Larxene + } + else //data split on + { + checksList.Add(new Check(this, Sys3, 0x1577A, World, "HalloweenTown", 0x20, 0x83)); // Data Vexen + checksList.Add(new Check(this, Sys3, 0x15786, World, "Agrabah", 0x21, 0x85)); // Data Lexaeus + checksList.Add(new Check(this, Sys3, 0x15792, World, "OlympusColiseum", 0x22, 0x87)); // Data Zexion + checksList.Add(new Check(this, Sys3, 0x157AA, World, "DisneyCastle", 0x26, 0x89)); // Data Marluxia + checksList.Add(new Check(this, Sys3, 0x1579E, World, "SpaceParanoids", 0x21, 0x8B)); // Data Larxene + } + + checksList.Add(new Check(this, Sys3, 0x157DA, World, "TWTNW", 0x14, 0x6A)); // Data Xemnas + checksList.Add(new Check(this, Sys3, 0x157E6, World, "LandofDragons", 0x0A, 0x6C)); // Data Xigbar + checksList.Add(new Check(this, Sys3, 0x157C2, World, "BeastsCastle", 0x0F, 0x63)); // Data Xaldin + checksList.Add(new Check(this, Sys3, 0x157F2, World, "PrideLands", 0x0F, 0x6E)); // Data Saix + checksList.Add(new Check(this, Sys3, 0x157CE, World, "TwilightTown", 0x14, 0xD4)); // Data Axel + checksList.Add(new Check(this, Sys3, 0x157B6, World, "HollowBastion", 0x04, 0x8D)); // Data Demyx + checksList.Add(new Check(this, Sys3, 0x157FE, World, "PortRoyal", 0x0E, 0x70)); // Data Luxord + checksList.Add(new Check(this, Sys3, 0x1580A, World, "SimulatedTwilightTown", 0x15, 0x72)); // Data Roxas - // Handle Sora levels separately, since Rewards already scans through them - // Skip Drive levels, since forms cannot be on other forms + + OffsetCorrection(); + // Handle Sora levels and Drive levels separately, since Rewards already scans through them } public bool TrackCheck(int targetValue) @@ -543,14 +665,24 @@ private void FindTargetCheck() targetCheck.Add(check); } } + // Search through levels, handled separately using Rewards onLevels = false; + onValor = false; + onWisdom = false; + onLimit = false; + onMaster = false; + onFinal = false; + targetLevel = null; + targetDriveLevel = null; if (MainWindow.data.codes.itemCodes.ContainsKey(target)) { + string checkName = MainWindow.data.codes.itemCodes[target]; + + // Sora levels int swordLevel = 100; int shieldLevel = 100; int staffLevel = 100; - string checkName = MainWindow.data.codes.itemCodes[target]; Tuple swordReward = Rewards.GetLevelRewards("Sword").FirstOrDefault(reward => reward.Item2 == checkName); Tuple shieldReward = Rewards.GetLevelRewards("Shield").FirstOrDefault(reward => reward.Item2 == checkName); Tuple staffReward = Rewards.GetLevelRewards("Staff").FirstOrDefault(reward => reward.Item2 == checkName); @@ -576,13 +708,92 @@ private void FindTargetCheck() }; onLevels = true; } + + // Drive levels + Tuple valorReward = Rewards.valorChecks.FirstOrDefault(reward => reward.Item2 == checkName); + Tuple wisdomReward = Rewards.wisdomChecks.FirstOrDefault(reward => reward.Item2 == checkName); + Tuple limitReward = Rewards.limitChecks.FirstOrDefault(reward => reward.Item2 == checkName); + Tuple masterReward = Rewards.masterChecks.FirstOrDefault(reward => reward.Item2 == checkName); + Tuple finalReward = Rewards.finalChecks.FirstOrDefault(reward => reward.Item2 == checkName); + if (!(valorReward == null && wisdomReward == null && limitReward == null && masterReward == null && finalReward == null)) + { + targetDriveLevel = new Dictionary(); + if (valorReward != null) + { + onValor = true; + targetDriveLevel.Add("Valor", valorReward.Item1); + } + if (wisdomReward != null) + { + onWisdom = true; + targetDriveLevel.Add("Wisdom", wisdomReward.Item1); + } + if (limitReward != null) + { + onLimit = true; + targetDriveLevel.Add("Limit", limitReward.Item1); + } + if (masterReward != null) + { + onMaster = true; + targetDriveLevel.Add("Master", masterReward.Item1); + } + if (finalReward != null) + { + onFinal = true; + targetDriveLevel.Add("Final", finalReward.Item1); + } + } } } public bool UpdateTargetMemory() { targetObtained = false; - if (targetCheck != null) + if (onLevels) + { + if (Stats.Level >= targetLevel[Stats.Weapon]) + { + targetObtained = true; + } + } + if (onValor) + { + if (Valor.Level >= targetDriveLevel["Valor"]) + { + targetObtained = true; + } + } + if (onWisdom) + { + if (Wisdom.Level >= targetDriveLevel["Wisdom"]) + { + targetObtained = true; + } + } + if (onLimit) + { + if (Limit.Level >= targetDriveLevel["Limit"]) + { + targetObtained = true; + } + } + if (onMaster) + { + if (Master.Level >= targetDriveLevel["Master"]) + { + targetObtained = true; + } + } + if (onFinal) + { + if (Final.Level >= targetDriveLevel["Final"]) + { + targetObtained = true; + } + } + + if (!targetObtained && targetCheck != null) { foreach (Check check in targetCheck) { @@ -593,22 +804,14 @@ public bool UpdateTargetMemory() } } } - if (!targetObtained && onLevels) - { - if (Stats.Level >= targetLevel[Stats.Weapon]) - { - targetObtained = true; - } - } return targetObtained; } - - class Check { public CheckEveryCheck outer; + public int addBase; public int addrCheck; public int addrObtained; public int bit; @@ -624,18 +827,20 @@ public bool Obtained get { return obtained; } } - public Check(CheckEveryCheck outerClass, int addressCheck, int addressObtained, int bitIndex) + public Check(CheckEveryCheck outerClass, int addressBase, int addressCheck, int addressObtained, int bitIndex) { outer = outerClass; + addBase = addressBase; addrCheck = addressCheck; addrObtained = addressObtained; bit = bitIndex; } // for Absent Silhouette and Data fight popups where no flag exists; instead uses defeat cutscene IDs - public Check(CheckEveryCheck outerClass, int addressCheck, World world, string worldName, int roomID, int eventID) + public Check(CheckEveryCheck outerClass, int addressBase, int addressCheck, World world, string worldName, int roomID, int eventID) { outer = outerClass; + addBase = addressBase; addrCheck = addressCheck; World = world; this.worldName = worldName; @@ -662,5 +867,74 @@ public bool UpdateMemory() } } + // too lazy to do this correctly. there's so much here man + // let's just opt to keep as much as possible the same and do an offset correction + private void OffsetCorrection() + { + foreach (Check check in checksList) + { + //check what type of file we are editing + if (check.addBase == Sys3) + { + //do offset correction based on old anchor + check.addrCheck = Sys3 + (check.addrCheck - 0x14424); + } + else if (check.addBase == Btl0) + { + //do offset correction based on old anchor + check.addrCheck = Btl0 + (check.addrCheck - 0x2A9C8); + } + } + } + + //we can't use hard addresses anymore, so we need to do checks and + //such to get the correct offsets from pointers and whatnot + private int GetSubOffset(int offset, int subfile) + { + int baseAddress = offset; + offset = offset + (subfile * 0x10); + + if (subfile == 7) + { + //double check correct subfile name + if (ReadMemString(offset + 0x4) == "trsr") + { + return GetAddress(baseAddress, offset); + } + else + return 0; + } + else if (subfile == 6) + { + //double check correct subfile name + if (ReadMemString(offset + 0x4) == "bons") + { + return GetAddress(baseAddress, offset); + } + else + return 0; + } + + return 0; + } + + private int ReadMemInt(int address) + { + return BitConverter.ToInt32(memory.ReadMemory(address, 4), 0); + } + + private int GetAddress(int baseAddress, int subAddress) + { + int off1 = ReadMemInt(baseAddress + 0x8); + int off2 = ReadMemInt(subAddress + 0x8); + int offFinal = off2 - off1; + return baseAddress + offFinal; + } + + private string ReadMemString(int address) + { + string result = Encoding.Default.GetString(memory.ReadMemory(address, 4), 0, 4); + return result.TrimEnd('\0'); + } } } diff --git a/KhTracker/AutoTracking/Convertor.cs b/KhTracker/AutoTracking/Convertor.cs index d81d46bb..2b78252b 100644 --- a/KhTracker/AutoTracking/Convertor.cs +++ b/KhTracker/AutoTracking/Convertor.cs @@ -46,7 +46,7 @@ public object Convert(object value, Type targetType, object parameter, CultureIn } else { - return 0.25; + return 0.45; } } @@ -63,88 +63,40 @@ public object ConvertBack(object value, Type targetType, object parameter, Cultu } } - public class LevelConverter : IValueConverter + public class WeaponConverter : IValueConverter { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if ((int)value == 2) - { - return "Images/Numbers/2.png"; - } - else if ((int)value == 3) - { - return "Images/Numbers/3.png"; - } - else if ((int)value == 4) - { - return "Images/Numbers/4.png"; - } - else if ((int)value == 5) - { - return "Images/Numbers/5.png"; - } - else if ((int)value == 6) - { - return "Images/Numbers/6.png"; - } - else if ((int)value == 7) - { - return "Images/Numbers/7.png"; - } - else - { - return null; - } - } + private string CusPath = "pack://application:,,,/CustomImages/System/stats/"; + private string EnabledPath1 = "Images/System/stats/"; //sword + private string EnabledPath2 = "Images/System/stats/"; //shield + private string EnabledPath3 = "Images/System/stats/"; //staff + private bool CusMode = Properties.Settings.Default.CustomIcons; - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - if ((string)value == "Images/Numbers/2.png") - { - return 2; - } - else if ((string)value == "Images/Numbers/3.png") - { - return 3; - } - else if ((string)value == "Images/Numbers/4.png") - { - return 4; - } - else if ((string)value == "Images/Numbers/5.png") - { - return 5; - } - else if ((string)value == "Images/Numbers/6.png") - { - return 6; - } - else if ((string)value == "Images/Numbers/7.png") - { - return 7; + //get the correct path + { + if (CusMode) + { + if (MainWindow.CustomSwordFound) + EnabledPath1 = CusPath; + if (MainWindow.CustomShieldFound) + EnabledPath2 = CusPath; + if (MainWindow.CustomStaffFound) + EnabledPath3 = CusPath; + } } - else - { - return 1; - } - } - } - public class WeaponConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { if ((string)value == "Sword") { - return "Images/Simple/sword.png"; + return EnabledPath1 + "sword.png"; } else if ((string)value == "Shield") { - return "Images/Simple/shield.png"; + return EnabledPath2 + "shield.png"; } else if ((string)value == "Staff") { - return "Images/Simple/staff.png"; + return EnabledPath3 + "staff.png"; } else { @@ -154,15 +106,28 @@ public object Convert(object value, Type targetType, object parameter, CultureIn public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { - if ((string)value == "Images/Simple/sword.png") + //get the correct path + { + if (CusMode) + { + if (MainWindow.CustomSwordFound) + EnabledPath1 = CusPath; + if (MainWindow.CustomShieldFound) + EnabledPath2 = CusPath; + if (MainWindow.CustomStaffFound) + EnabledPath3 = CusPath; + } + } + + if ((string)value == EnabledPath1 + "sword.png") { return "Sword"; } - else if ((string)value == "Images/Simple/shield.png") + else if ((string)value == EnabledPath2 + "shield.png") { return "Shield"; } - else if ((string)value == "Images/Simple/staff.png") + else if ((string)value == EnabledPath3 + "staff.png") { return "Staff"; } @@ -173,86 +138,4 @@ public object ConvertBack(object value, Type targetType, object parameter, Cultu } } - public class GrowthAbilityConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if ((int)value == 1) - { - return ""; - } - else if ((int)value == 2) - { - return "Images/Numbers/2.png"; - } - else if ((int)value == 3) - { - return "Images/Numbers/3.png"; - } - else if ((int)value == 4) - { - return "Images/Numbers/4.png"; - } - else - { - return null; - } - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - if ((string)value == "") - { - return 1; - } - else if ((string)value == "Images/Numbers/2.png") - { - return 2; - } - else if ((string)value == "Images/Numbers/3.png") - { - return 3; - } - else if ((string)value == "Images/Numbers/4.png") - { - return 4; - } - else - { - return 0; - } - } - } - - public class NumberConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if ((int)value >= 0) - { - if ((int)value > 99) - value = 99; - - return "Images/Numbers/" + (value).ToString() + ".png"; - } - else - { - return null; - } - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - if ((string)value != null) - { - string val = (string)value; - val = val.Substring(val.LastIndexOf('/')); - return int.Parse(val.Substring(0, val.IndexOf('.'))); - } - else - { - return 1; - } - } - } } \ No newline at end of file diff --git a/KhTracker/AutoTracking/DriveForm.cs b/KhTracker/AutoTracking/DriveForm.cs index f8f7f450..0842dbff 100644 --- a/KhTracker/AutoTracking/DriveForm.cs +++ b/KhTracker/AutoTracking/DriveForm.cs @@ -11,6 +11,7 @@ class DriveForm : ImportantCheck { public int[] previousLevels = new int[3]; private int level = 0; + private int visualLevel = 0; public int Level { get { return level; } @@ -20,6 +21,15 @@ public int Level OnPropertyChanged("Level"); } } + public int VisualLevel + { + get { return visualLevel; } + set + { + visualLevel = value; + OnPropertyChanged("VisualLevel"); + } + } private int byteNum; private int levelAddr; private int genieFixAddr; @@ -56,6 +66,8 @@ public override byte[] UpdateMemory() previousLevels[1] = previousLevels[2]; previousLevels[2] = Level; + VisualLevel = levelData[0]; + if (Level < levelData[0]) { Level = levelData[0]; diff --git a/KhTracker/AutoTracking/Extra.cs b/KhTracker/AutoTracking/Extra.cs new file mode 100644 index 00000000..b7eaaef6 --- /dev/null +++ b/KhTracker/AutoTracking/Extra.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Collections; + +namespace KhTracker +{ + class Extra : ImportantCheck + { + public Extra(MemoryReader mem, int address, int offset, string name) : base(mem, address, offset, name) { } + + public override byte[] UpdateMemory() + { + byte[] data = base.UpdateMemory(); + bool flag = new BitArray(data)[0]; + if (Obtained == false && flag == true) + { + Obtained = true; + //App.logger.Record(Name + " obtained"); + } + return null; + } + } +} \ No newline at end of file diff --git a/KhTracker/AutoTracking/Magic.cs b/KhTracker/AutoTracking/Magic.cs index eace3def..0eb837bc 100644 --- a/KhTracker/AutoTracking/Magic.cs +++ b/KhTracker/AutoTracking/Magic.cs @@ -11,7 +11,7 @@ namespace KhTracker class Magic : ImportantCheck { private int sttAddress; - private bool useSTTAddress; + //private bool useSTTAddress; private int level; public int Level @@ -31,10 +31,14 @@ public Magic(MemoryReader mem, int address, int sttAddr, int offset, string name public override byte[] UpdateMemory() { byte[] data; - if (useSTTAddress) - data = memory.ReadMemory(sttAddress + ADDRESS_OFFSET, Bytes); - else - data = base.UpdateMemory(); + + //if (useSTTAddress) + // data = memory.ReadMemory(sttAddress + ADDRESS_OFFSET, Bytes); + //else + data = base.UpdateMemory(); + + //data = base.UpdateMemory(); + if (Obtained == false && data[0] > 0) { Obtained = true; @@ -51,9 +55,9 @@ public override byte[] UpdateMemory() return null; } - public void UseSTTAddress(bool toggle) - { - useSTTAddress = toggle; - } + //public void UseSTTAddress(bool toggle) + //{ + // useSTTAddress = toggle; + //} } } \ No newline at end of file diff --git a/KhTracker/AutoTracking/MemoryReader.cs b/KhTracker/AutoTracking/MemoryReader.cs index b9ec83a1..71b6fbd5 100644 --- a/KhTracker/AutoTracking/MemoryReader.cs +++ b/KhTracker/AutoTracking/MemoryReader.cs @@ -37,7 +37,6 @@ public MemoryReader(bool ps2) return; } Hooked = true; - } public byte[] ReadMemory(Int32 address, int bytesToRead) @@ -58,5 +57,11 @@ public byte[] ReadMemory(Int32 address, int bytesToRead) return buffer; } + + public long GetBaseAddress() + { + ProcessModule processModule = process.MainModule; + return processModule.BaseAddress.ToInt64(); + } } } diff --git a/KhTracker/AutoTracking/Rewards.cs b/KhTracker/AutoTracking/Rewards.cs index 5d54a497..7608a464 100644 --- a/KhTracker/AutoTracking/Rewards.cs +++ b/KhTracker/AutoTracking/Rewards.cs @@ -1,8 +1,12 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; +using System.Runtime.InteropServices.WindowsRuntime; using System.Text; using System.Threading.Tasks; +using System.Windows.Controls; +using System.Windows.Markup; namespace KhTracker { @@ -18,15 +22,19 @@ class Rewards public List> finalChecks; public int ADDRESS_OFFSET; - int Bt10; - + //int Bt10; + int Lvup; + int Fmlv; + MemoryReader memory; public Rewards(MemoryReader mem, int offset, int bt10) { ADDRESS_OFFSET = offset; memory = mem; - Bt10 = bt10; + //Bt10 = bt10; + Lvup = GetSubOffset(bt10, 5); + Fmlv = GetSubOffset(bt10, 16); swordChecks = new List>(); shieldChecks = new List>(); staffChecks = new List>(); @@ -39,152 +47,70 @@ public Rewards(MemoryReader mem, int offset, int bt10) } // populate reward lists - public void ReadRewards() + private void ReadRewards() { + //level array + // lv99 checks only (31, 33, 47, 49, 53, 59, 65, 73, 85, 99) + int[] soraLevels = {2, 4, 7, 9, 10, 12, 14, 15, 17, 20, 23, 25, 28, 30, 31, + 32, 33, 34, 36, 39, 41, 44, 46, 47, 48, 49, 50, 53, 59, 65, 73, 85, 99}; + // if sword - ReadReward(Bt10 + 0x25940, 2, swordChecks, 2); - ReadReward(Bt10 + 0x25960, 2, swordChecks, 4); - ReadReward(Bt10 + 0x25990, 2, swordChecks, 7); - ReadReward(Bt10 + 0x259B0, 2, swordChecks, 9); - ReadReward(Bt10 + 0x259C0, 2, swordChecks, 10); - ReadReward(Bt10 + 0x259E0, 2, swordChecks, 12); - ReadReward(Bt10 + 0x25A00, 2, swordChecks, 14); - ReadReward(Bt10 + 0x25A10, 2, swordChecks, 15); - ReadReward(Bt10 + 0x25A30, 2, swordChecks, 17); - ReadReward(Bt10 + 0x25A60, 2, swordChecks, 20); - ReadReward(Bt10 + 0x25A90, 2, swordChecks, 23); - ReadReward(Bt10 + 0x25AB0, 2, swordChecks, 25); - ReadReward(Bt10 + 0x25AE0, 2, swordChecks, 28); - ReadReward(Bt10 + 0x25B00, 2, swordChecks, 30); - ReadReward(Bt10 + 0x25B10, 2, swordChecks, 31); // 99 - ReadReward(Bt10 + 0x25B20, 2, swordChecks, 32); - ReadReward(Bt10 + 0x25B30, 2, swordChecks, 33); // 99 - ReadReward(Bt10 + 0x25B40, 2, swordChecks, 34); - ReadReward(Bt10 + 0x25B60, 2, swordChecks, 36); - ReadReward(Bt10 + 0x25B90, 2, swordChecks, 39); - ReadReward(Bt10 + 0x25BB0, 2, swordChecks, 41); - ReadReward(Bt10 + 0x25BE0, 2, swordChecks, 44); - ReadReward(Bt10 + 0x25C00, 2, swordChecks, 46); - ReadReward(Bt10 + 0x25C10, 2, swordChecks, 47); // 99 - ReadReward(Bt10 + 0x25C20, 2, swordChecks, 48); - ReadReward(Bt10 + 0x25C30, 2, swordChecks, 49); // 99 - ReadReward(Bt10 + 0x25C40, 2, swordChecks, 50); - ReadReward(Bt10 + 0x25C70, 2, swordChecks, 53); // 99 - ReadReward(Bt10 + 0x25CD0, 2, swordChecks, 59); // 99 - ReadReward(Bt10 + 0x25D30, 2, swordChecks, 65); // 99 - ReadReward(Bt10 + 0x25DB0, 2, swordChecks, 73); // 99 - ReadReward(Bt10 + 0x25E70, 2, swordChecks, 85); // 99 - ReadReward(Bt10 + 0x25F50, 2, swordChecks, 99); // 99 + foreach (int level in soraLevels) + { + ReadReward(Lvup + (level * 0x10), 2, swordChecks, level); + } // if shield - ReadReward(Bt10 + 0x25942, 2, shieldChecks, 2); - ReadReward(Bt10 + 0x25962, 2, shieldChecks, 4); - ReadReward(Bt10 + 0x25992, 2, shieldChecks, 7); - ReadReward(Bt10 + 0x259B2, 2, shieldChecks, 9); - ReadReward(Bt10 + 0x259C2, 2, shieldChecks, 10); - ReadReward(Bt10 + 0x259E2, 2, shieldChecks, 12); - ReadReward(Bt10 + 0x25A02, 2, shieldChecks, 14); - ReadReward(Bt10 + 0x25A12, 2, shieldChecks, 15); - ReadReward(Bt10 + 0x25A32, 2, shieldChecks, 17); - ReadReward(Bt10 + 0x25A62, 2, shieldChecks, 20); - ReadReward(Bt10 + 0x25A92, 2, shieldChecks, 23); - ReadReward(Bt10 + 0x25AB2, 2, shieldChecks, 25); - ReadReward(Bt10 + 0x25AE2, 2, shieldChecks, 28); - ReadReward(Bt10 + 0x25B02, 2, shieldChecks, 30); - ReadReward(Bt10 + 0x25B12, 2, shieldChecks, 31); // 99 - ReadReward(Bt10 + 0x25B22, 2, shieldChecks, 32); - ReadReward(Bt10 + 0x25B32, 2, shieldChecks, 33); // 99 - ReadReward(Bt10 + 0x25B42, 2, shieldChecks, 34); - ReadReward(Bt10 + 0x25B62, 2, shieldChecks, 36); - ReadReward(Bt10 + 0x25B92, 2, shieldChecks, 39); - ReadReward(Bt10 + 0x25BB2, 2, shieldChecks, 41); - ReadReward(Bt10 + 0x25BE2, 2, shieldChecks, 44); - ReadReward(Bt10 + 0x25C02, 2, shieldChecks, 46); - ReadReward(Bt10 + 0x25C12, 2, shieldChecks, 47); // 99 - ReadReward(Bt10 + 0x25C22, 2, shieldChecks, 48); - ReadReward(Bt10 + 0x25C32, 2, shieldChecks, 49); // 99 - ReadReward(Bt10 + 0x25C42, 2, shieldChecks, 50); - ReadReward(Bt10 + 0x25C72, 2, shieldChecks, 53); // 99 - ReadReward(Bt10 + 0x25CD2, 2, shieldChecks, 59); // 99 - ReadReward(Bt10 + 0x25D32, 2, shieldChecks, 65); // 99 - ReadReward(Bt10 + 0x25DB2, 2, shieldChecks, 73); // 99 - ReadReward(Bt10 + 0x25E72, 2, shieldChecks, 85); // 99 - ReadReward(Bt10 + 0x25F52, 2, shieldChecks, 99); // 99 + foreach (int level in soraLevels) + { + ReadReward(Lvup + (level * 0x10) + 0x2, 2, shieldChecks, level); + } // if staff - ReadReward(Bt10 + 0x25944, 2, staffChecks, 2); - ReadReward(Bt10 + 0x25964, 2, staffChecks, 4); - ReadReward(Bt10 + 0x25994, 2, staffChecks, 7); - ReadReward(Bt10 + 0x259B4, 2, staffChecks, 9); - ReadReward(Bt10 + 0x259C4, 2, staffChecks, 10); - ReadReward(Bt10 + 0x259E4, 2, staffChecks, 12); - ReadReward(Bt10 + 0x25A04, 2, staffChecks, 14); - ReadReward(Bt10 + 0x25A14, 2, staffChecks, 15); - ReadReward(Bt10 + 0x25A34, 2, staffChecks, 17); - ReadReward(Bt10 + 0x25A64, 2, staffChecks, 20); - ReadReward(Bt10 + 0x25A94, 2, staffChecks, 23); - ReadReward(Bt10 + 0x25AB4, 2, staffChecks, 25); - ReadReward(Bt10 + 0x25AE4, 2, staffChecks, 28); - ReadReward(Bt10 + 0x25B04, 2, staffChecks, 30); - ReadReward(Bt10 + 0x25B14, 2, staffChecks, 31); // 99 - ReadReward(Bt10 + 0x25B24, 2, staffChecks, 32); - ReadReward(Bt10 + 0x25B34, 2, staffChecks, 33); // 99 - ReadReward(Bt10 + 0x25B44, 2, staffChecks, 34); - ReadReward(Bt10 + 0x25B64, 2, staffChecks, 36); - ReadReward(Bt10 + 0x25B94, 2, staffChecks, 39); - ReadReward(Bt10 + 0x25BB4, 2, staffChecks, 41); - ReadReward(Bt10 + 0x25BE4, 2, staffChecks, 44); - ReadReward(Bt10 + 0x25C04, 2, staffChecks, 46); - ReadReward(Bt10 + 0x25C14, 2, staffChecks, 47); // 99 - ReadReward(Bt10 + 0x25C24, 2, staffChecks, 48); - ReadReward(Bt10 + 0x25C34, 2, staffChecks, 49); // 99 - ReadReward(Bt10 + 0x25C44, 2, staffChecks, 50); - ReadReward(Bt10 + 0x25C74, 2, staffChecks, 53); // 99 - ReadReward(Bt10 + 0x25CD4, 2, staffChecks, 59); // 99 - ReadReward(Bt10 + 0x25D34, 2, staffChecks, 65); // 99 - ReadReward(Bt10 + 0x25DB4, 2, staffChecks, 73); // 99 - ReadReward(Bt10 + 0x25E74, 2, staffChecks, 85); // 99 - ReadReward(Bt10 + 0x25F54, 2, staffChecks, 99); // 99 - - // valor - ReadReward(Bt10 + 0x344AE, 2, valorChecks, 2); - ReadReward(Bt10 + 0x344B6, 2, valorChecks, 3); - ReadReward(Bt10 + 0x344BE, 2, valorChecks, 4); - ReadReward(Bt10 + 0x344C6, 2, valorChecks, 5); - ReadReward(Bt10 + 0x344CE, 2, valorChecks, 6); - ReadReward(Bt10 + 0x344D6, 2, valorChecks, 7); - - // wisdom - ReadReward(Bt10 + 0x344E6, 2, wisdomChecks, 2); - ReadReward(Bt10 + 0x344EE, 2, wisdomChecks, 3); - ReadReward(Bt10 + 0x344F6, 2, wisdomChecks, 4); - ReadReward(Bt10 + 0x344FE, 2, wisdomChecks, 5); - ReadReward(Bt10 + 0x34506, 2, wisdomChecks, 6); - ReadReward(Bt10 + 0x3450E, 2, wisdomChecks, 7); - - // limit - ReadReward(Bt10 + 0x3451E, 2, limitChecks, 2); - ReadReward(Bt10 + 0x34526, 2, limitChecks, 3); - ReadReward(Bt10 + 0x3452E, 2, limitChecks, 4); - ReadReward(Bt10 + 0x34536, 2, limitChecks, 5); - ReadReward(Bt10 + 0x3453E, 2, limitChecks, 6); - ReadReward(Bt10 + 0x34546, 2, limitChecks, 7); - - // master - ReadReward(Bt10 + 0x34556, 2, masterChecks, 2); - ReadReward(Bt10 + 0x3455E, 2, masterChecks, 3); - ReadReward(Bt10 + 0x34566, 2, masterChecks, 4); - ReadReward(Bt10 + 0x3456E, 2, masterChecks, 5); - ReadReward(Bt10 + 0x34576, 2, masterChecks, 6); - ReadReward(Bt10 + 0x3457E, 2, masterChecks, 7); - - // final - ReadReward(Bt10 + 0x3458E, 2, finalChecks, 2); - ReadReward(Bt10 + 0x34596, 2, finalChecks, 3); - ReadReward(Bt10 + 0x3459E, 2, finalChecks, 4); - ReadReward(Bt10 + 0x345A6, 2, finalChecks, 5); - ReadReward(Bt10 + 0x345AE, 2, finalChecks, 6); - ReadReward(Bt10 + 0x345B6, 2, finalChecks, 7); + foreach (int level in soraLevels) + { + ReadReward(Lvup + (level * 0x10) + 0x4, 2, shieldChecks, level); + } + + //forms + int offset = 0; + for (int type = 0; type < 6; ++type) + { + //each type has 7 levels + for (int level = 1; level < 8; ++level) + { + //skip level 1 (impossible to obtain item) + if (level == 1) + { + offset = offset + 0x8; + continue; + } + + switch (type) + { + case 0: //summons + //do nothing for now + break; + case 1: //valor + ReadReward(Fmlv + offset + 0x2, 2, valorChecks, level); + break; + case 2: //wisdom + ReadReward(Fmlv + offset + 0x2, 2, wisdomChecks, level); + break; + case 3: //limit + ReadReward(Fmlv + offset + 0x2, 2, limitChecks, level); + break; + case 4: //master + ReadReward(Fmlv + offset + 0x2, 2, masterChecks, level); + break; + case 5: //final + ReadReward(Fmlv + offset + 0x2, 2, finalChecks, level); + break; + } + + offset = offset + 0x8; + } + } } private void ReadReward(int address, int byteCount, List> rewards, int level) @@ -224,5 +150,57 @@ public List> GetLevelRewards(string weapon) return staffChecks; } } + + //we can't use hard addresses anymore, so we need to do checks and + //such to get the correct offsets from pointers and whatnot + private int GetSubOffset(int offset, int subfile) + { + int baseAddress = offset; + offset = offset + (subfile * 0x10); + + if (subfile == 5) //lvup + { + //double check correct subfile name + if (ReadMemString(offset + 0x4) == "lvup") + { + return GetAddress(baseAddress, offset) + 0x3C; + } + else + return 0; + } + else if (subfile == 16) //fmlv + { + //double check correct subfile name + if (ReadMemString(offset + 0x4) == "fmlv") + { + return GetAddress(baseAddress, offset) + 0x8; + } + else + return 0; + } + + return 0; + } + + private int ReadMemInt(int address) + { + address = address + ADDRESS_OFFSET; + return BitConverter.ToInt32(memory.ReadMemory(address, 4), 0); + } + + private int GetAddress(int baseAddress, int subAddress) + { + int off1 = ReadMemInt(baseAddress + 0x8); + int off2 = ReadMemInt(subAddress + 0x8); + int offFinal = off2 - off1; + return baseAddress + offFinal; + } + + private string ReadMemString(int address) + { + address = address + ADDRESS_OFFSET; + string result = Encoding.Default.GetString(memory.ReadMemory(address, 4), 0, 4); + return result.TrimEnd('\0'); + } } } diff --git a/KhTracker/AutoTracking/Stats.cs b/KhTracker/AutoTracking/Stats.cs index cbe26c53..344a9267 100644 --- a/KhTracker/AutoTracking/Stats.cs +++ b/KhTracker/AutoTracking/Stats.cs @@ -9,6 +9,13 @@ namespace KhTracker { class Stats : INotifyPropertyChanged { + //next level check stuff + private int[] levelChecks1 = { 1, 1 }; + private int[] levelChecks50 = { 0, 2, 4, 7, 9, 10, 12, 14, 15, 17, 20, 23, 25, 28, 30, 32, 34, 36, 39, 41, 44, 46, 48, 50 }; + private int[] levelChecks99 = { 0, 7, 9, 12, 15, 17, 20, 23, 25, 28, 31, 33, 36, 39, 41, 44, 47, 49, 53, 59, 65, 73, 85, 99 }; + private int[] currentCheckArray; + private int nextLevelCheck = 0; + public int[] previousLevels = new int[3]; private int level; public int Level @@ -60,24 +67,52 @@ public int Defense OnPropertyChanged("Defense"); } } + private int bonuslevel; + public int BonusLevel + { + get { return bonuslevel; } + set + { + bonuslevel = value; + OnPropertyChanged("BonusLevel"); + } + } + + //show next level check + MainWindow window = (MainWindow)App.Current.MainWindow; + private int levelCheck; + public int LevelCheck + { + get { return levelCheck; } + set + { + levelCheck = value; + window.NextLevelValue.Text = ">" + value; + OnPropertyChanged("LevelCheck"); + } + } public int form; private int levelAddress; private int statsAddress; private int formAddress; + private int bonusAddress; + private int nextSlotNum; public int ADDRESS_OFFSET; MemoryReader memory; - public Stats(MemoryReader mem, int offset, int lvlAddress, int statsAddr, int formAddr) + public Stats(MemoryReader mem, int offset, int lvlAddress, int statsAddr, int formAddr, int bonusLvl, int nextSlot) { ADDRESS_OFFSET = offset; memory = mem; levelAddress = lvlAddress; statsAddress = statsAddr; formAddress = formAddr; + bonusAddress = bonusLvl; + nextSlotNum = nextSlot; } // this is not working @@ -92,7 +127,7 @@ public void OnPropertyChanged(string info) } } - public void UpdateMemory() + public void UpdateMemory(int correctSlot) { byte[] levelData = memory.ReadMemory(levelAddress + ADDRESS_OFFSET, 2); @@ -110,7 +145,7 @@ public void UpdateMemory() if (Level != levelData[1]) Level = levelData[1]; - byte[] statsData = memory.ReadMemory(statsAddress + ADDRESS_OFFSET, 5); + byte[] statsData = memory.ReadMemory(statsAddress - (nextSlotNum * correctSlot) + ADDRESS_OFFSET, 5); if (Strength != statsData[0]) Strength = statsData[0]; if (Magic != statsData[2]) @@ -120,6 +155,51 @@ public void UpdateMemory() byte[] modelData = memory.ReadMemory(formAddress + ADDRESS_OFFSET, 1); form = modelData[0]; + + byte[] BonusData = memory.ReadMemory(bonusAddress + ADDRESS_OFFSET, 1); + BonusLevel = BonusData[0]; + + //change levelreward number + if (level >= currentCheckArray[currentCheckArray.Length - 1]) + { + LevelCheck = currentCheckArray[currentCheckArray.Length - 1]; + return; + } + + if (Level >= currentCheckArray[nextLevelCheck]) + { + nextLevelCheck++; + LevelCheck = currentCheckArray[nextLevelCheck]; + } + } + + public void SetMaxLevelCheck(int lvl) + { + switch(lvl) + { + case 50: + currentCheckArray = levelChecks50; + break; + case 99: + currentCheckArray = levelChecks99; + break; + default: + currentCheckArray = levelChecks1; + break; + } + } + + public void SetNextLevelCheck(int lvl) + { + for (int i = 0; i < currentCheckArray.Length; i++) + { + if (lvl < currentCheckArray[i]) + { + nextLevelCheck = i; + LevelCheck = currentCheckArray[nextLevelCheck]; + break; + } + } } } } diff --git a/KhTracker/AutoTracking/TornPage.cs b/KhTracker/AutoTracking/TornPage.cs index d8c18ce1..201ed41b 100644 --- a/KhTracker/AutoTracking/TornPage.cs +++ b/KhTracker/AutoTracking/TornPage.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Text; using System.Threading.Tasks; @@ -28,21 +29,34 @@ public TornPage(MemoryReader mem, int address, int offset, string name) : base(m public override byte[] UpdateMemory() { byte[] data = base.UpdateMemory(); - if (current < data[0]) + int used = (App.Current.MainWindow as MainWindow).GetUsedPages(Address); + int total = used + data[0]; + + if (Quantity < total) { // add the difference incase of getting multiple at the same time - Quantity += data[0] - current; + Quantity += total - current; if (App.logger != null) App.logger.Record(Quantity.ToString() + " torn pages obtained"); } - else if (current > data[0]) - { - // reduce quantity so when you regrab a torn page after dying the quantity goes back to where it should be - if ((App.Current.MainWindow as MainWindow).GetWorld() != "HundredAcreWood") - Quantity -= current - data[0]; - } - current = data[0]; + current = total; return null; + + //if (current < data[0]) + //{ + // // add the difference incase of getting multiple at the same time + // Quantity += data[0] - current; + // if (App.logger != null) + // App.logger.Record(Quantity.ToString() + " torn pages obtained"); + //} + //else if (current > data[0]) + //{ + // // reduce quantity so when you regrab a torn page after dying the quantity goes back to where it should be + // if ((App.Current.MainWindow as MainWindow).GetWorld() != "HundredAcreWood") + // Quantity -= current - data[0]; + // else + // (App.Current.MainWindow as MainWindow).UpdateUsedPages(); + //} } } } \ No newline at end of file diff --git a/KhTracker/AutoTracking/Visit.cs b/KhTracker/AutoTracking/Visit.cs new file mode 100644 index 00000000..40013ceb --- /dev/null +++ b/KhTracker/AutoTracking/Visit.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Collections; + +namespace KhTracker +{ + class Visit : ImportantCheck + { + public Visit(MemoryReader mem, int address, int offset, string name) : base(mem, address, offset, name) + { + } + + public override byte[] UpdateMemory() + { + byte[] data = base.UpdateMemory(); + bool flag = new BitArray(data)[0]; + if (Obtained == false && flag == true) + { + Obtained = true; + //App.logger.Record(Name + " obtained"); + } + return null; + } + } +} \ No newline at end of file diff --git a/KhTracker/AutoTracking/World.cs b/KhTracker/AutoTracking/World.cs index f5693583..57de85cf 100644 --- a/KhTracker/AutoTracking/World.cs +++ b/KhTracker/AutoTracking/World.cs @@ -20,12 +20,11 @@ public string worldName if (world != value) { world = value; - if (App.logger != null) - App.logger.RecordWorld(value); + App.logger?.RecordWorld(value); } } } - private int worldNum; + public int worldNum; private int worldAddress; private int eventCompleteAddress; private int SttAddress; @@ -36,6 +35,7 @@ public string worldName public int eventID3; public int eventComplete; public int inStt; + public int cupRound; public int ADDRESS_OFFSET; @@ -49,36 +49,44 @@ public World(MemoryReader mem, int offset, int address, int completeAddress, int eventCompleteAddress = completeAddress; SttAddress = sttAddress; - worldCodes = new Dictionary(); - worldCodes.Add(02, "TwilightTown"); - worldCodes.Add(03, "DestinyIsland"); - worldCodes.Add(04, "HollowBastion"); - worldCodes.Add(05, "BeastsCastle"); - worldCodes.Add(06, "OlympusColiseum"); - worldCodes.Add(07, "Agrabah"); - worldCodes.Add(08, "LandofDragons"); - worldCodes.Add(09, "HundredAcreWood"); - worldCodes.Add(10, "PrideLands"); - worldCodes.Add(11, "Atlantica"); - worldCodes.Add(12, "DisneyCastle"); - worldCodes.Add(13, "DisneyCastle"); // Timeless River - worldCodes.Add(14, "HalloweenTown"); - worldCodes.Add(16, "PortRoyal"); - worldCodes.Add(17, "SpaceParanoids"); - worldCodes.Add(18, "TWTNW"); - worldCodes.Add(255, "GoA"); + worldCodes = new Dictionary + { + { 01, "GoA" }, // Title Demo + { 02, "TwilightTown" }, + { 03, "DestinyIsland" }, + { 04, "HollowBastion" }, + { 05, "BeastsCastle" }, + { 06, "OlympusColiseum" }, + { 07, "Agrabah" }, + { 08, "LandofDragons" }, + { 09, "HundredAcreWood" }, + { 10, "PrideLands" }, + { 11, "Atlantica" }, + { 12, "DisneyCastle" }, + { 13, "DisneyCastle" }, // Timeless River + { 14, "HalloweenTown" }, + { 16, "PortRoyal" }, + { 17, "SpaceParanoids" }, + { 18, "TWTNW" }, + { 255, "GoA" } + }; } public void UpdateMemory() { previousworldName = worldName; + //this shouldn't happen, but use unknown as the world in case it ever does + if (worldName == null) + worldName = "Unknown"; + byte[] worldData = memory.ReadMemory(worldAddress + ADDRESS_OFFSET, 9); worldNum = worldData[0]; roomNumber = worldData[1]; eventID1 = worldData[4]; eventID2 = worldData[6]; eventID3 = worldData[8]; + cupRound = worldData[2]; byte[] eventData = memory.ReadMemory(eventCompleteAddress + ADDRESS_OFFSET, 1); eventComplete = eventData[0]; diff --git a/KhTracker/BroadcastWindow.xaml b/KhTracker/BroadcastWindow.xaml deleted file mode 100644 index 6b0a0ccb..00000000 --- a/KhTracker/BroadcastWindow.xaml +++ /dev/null @@ -1,895 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/KhTracker/BroadcastWindow.xaml.cs b/KhTracker/BroadcastWindow.xaml.cs deleted file mode 100644 index e30cff4f..00000000 --- a/KhTracker/BroadcastWindow.xaml.cs +++ /dev/null @@ -1,412 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Shapes; - -namespace KhTracker -{ - /// - /// Interaction logic for BroadcastWindow.xaml - /// - public partial class BroadcastWindow : Window - { - public bool canClose = false; - Dictionary worlds = new Dictionary(); - Dictionary totals = new Dictionary(); - Dictionary important = new Dictionary(); - Dictionary Progression = new Dictionary(); - List Numbers = null; - Data data; - - public BroadcastWindow(Data dataIn) - { - InitializeComponent(); - //Item.UpdateTotal += new Item.TotalHandler(UpdateTotal); - Numbers = dataIn.Numbers; - worlds.Add("SorasHeart",0); - worlds.Add("DriveForms", 0); - worlds.Add("SimulatedTwilightTown",0); - worlds.Add("TwilightTown",0); - worlds.Add("HollowBastion",0); - worlds.Add("BeastsCastle",0); - worlds.Add("OlympusColiseum",0); - worlds.Add("Agrabah",0); - worlds.Add("LandofDragons",0); - worlds.Add("HundredAcreWood",0); - worlds.Add("PrideLands",0); - worlds.Add("DisneyCastle",0); - worlds.Add("HalloweenTown",0); - worlds.Add("PortRoyal",0); - worlds.Add("SpaceParanoids",0); - worlds.Add("TWTNW",0); - worlds.Add("GoA", 0); - worlds.Add("Report", 0); - worlds.Add("TornPage", 0); - worlds.Add("Fire", 0); - worlds.Add("Blizzard", 0); - worlds.Add("Thunder", 0); - worlds.Add("Cure", 0); - worlds.Add("Reflect", 0); - worlds.Add("Magnet", 0); - worlds.Add("Atlantica", 0); - - totals.Add("SorasHeart", -1); - totals.Add("DriveForms", -1); - totals.Add("SimulatedTwilightTown", -1); - totals.Add("TwilightTown", -1); - totals.Add("HollowBastion", -1); - totals.Add("BeastsCastle", -1); - totals.Add("OlympusColiseum", -1); - totals.Add("Agrabah", -1); - totals.Add("LandofDragons", -1); - totals.Add("HundredAcreWood", -1); - totals.Add("PrideLands", -1); - totals.Add("DisneyCastle", -1); - totals.Add("HalloweenTown", -1); - totals.Add("PortRoyal", -1); - totals.Add("SpaceParanoids", -1); - totals.Add("TWTNW", -1); - totals.Add("Atlantica", -1); - - important.Add("Fire", 0); - important.Add("Blizzard", 0); - important.Add("Thunder", 0); - important.Add("Cure", 0); - important.Add("Reflect", 0); - important.Add("Magnet", 0); - important.Add("Valor", 0); - important.Add("Wisdom", 0); - important.Add("Limit", 0); - important.Add("Master", 0); - important.Add("Final", 0); - important.Add("Nonexistence", 0); - important.Add("Connection", 0); - important.Add("Peace", 0); - important.Add("PromiseCharm", 0); - important.Add("Feather", 0); - important.Add("Ukulele", 0); - important.Add("Baseball", 0); - important.Add("Lamp", 0); - important.Add("Report", 0); - important.Add("TornPage", 0); - important.Add("SecondChance", 0); - important.Add("OnceMore", 0); - - Progression.Add("SimulatedTwilightTown", SimulatedTwilightTownProgression); - Progression.Add("TwilightTown", TwilightTownProgression); - Progression.Add("HollowBastion", HollowBastionProgression); - Progression.Add("BeastsCastle", BeastsCastleProgression); - Progression.Add("OlympusColiseum", OlympusColiseumProgression); - Progression.Add("Agrabah", AgrabahProgression); - Progression.Add("LandofDragons", LandofDragonsProgression); - Progression.Add("HundredAcreWood", HundredAcreWoodProgression); - Progression.Add("PrideLands", PrideLandsProgression); - Progression.Add("DisneyCastle", DisneyCastleProgression); - Progression.Add("HalloweenTown", HalloweenTownProgression); - Progression.Add("PortRoyal", PortRoyalProgression); - Progression.Add("SpaceParanoids", SpaceParanoidsProgression); - Progression.Add("TWTNW", TWTNWProgression); - - data = dataIn; - - foreach (Item item in data.Items) - { - item.UpdateTotal += new Item.TotalHandler(UpdateTotal); - item.UpdateFound += new Item.FoundHandler(UpdateFound); - } - - Top = Properties.Settings.Default.BroadcastWindowY; - Left = Properties.Settings.Default.BroadcastWindowX; - - Width = Properties.Settings.Default.BroadcastWindowWidth; - Height = Properties.Settings.Default.BroadcastWindowHeight; - } - - private void Window_LocationChanged(object sender, EventArgs e) - { - Properties.Settings.Default.BroadcastWindowY = RestoreBounds.Top; - Properties.Settings.Default.BroadcastWindowX = RestoreBounds.Left; - } - - private void Window_SizeChanged(object sender, SizeChangedEventArgs e) - { - Properties.Settings.Default.BroadcastWindowWidth = RestoreBounds.Width; - Properties.Settings.Default.BroadcastWindowHeight = RestoreBounds.Height; - } - - public void UpdateFound(string item, string world, bool add) - { - string worldName = world; - if (add) worlds[worldName]++; else worlds[worldName]--; - //Console.WriteLine(worlds[worldName]); - - while (item.Any(char.IsDigit)) - { - item = item.Remove(item.Length - 1, 1); - } - - if (add) important[item]++; else important[item]--; - worlds["Report"] = important["Report"]; - worlds["TornPage"] = important["TornPage"]; - worlds["Fire"] = important["Fire"]; - worlds["Blizzard"] = important["Blizzard"]; - worlds["Thunder"] = important["Thunder"]; - worlds["Cure"] = important["Cure"]; - worlds["Reflect"] = important["Reflect"]; - worlds["Magnet"] = important["Magnet"]; - //Console.WriteLine(item); - - UpdateNumbers(); - - } - - public void UpdateNumbers() - { - foreach(KeyValuePair world in worlds) - { - if (world.Value < 52) - { - BitmapImage number = Numbers[world.Value + 1]; - if ((data.WorldsData.ContainsKey(world.Key) && world.Key != "GoA" && data.WorldsData[world.Key].hintedHint) - || (data.WorldsData.ContainsKey(world.Key) && world.Key != "GoA" && data.WorldsData[world.Key].complete)) - { - number = data.BlueNumbers[world.Value + 1]; - Image bar = FindName(world.Key + "Bar") as Image; - bar.Source = new BitmapImage(new Uri("Images/BarBlue.png", UriKind.Relative)); - } - - if (world.Key == "TornPage" || world.Key == "Fire" || world.Key == "Blizzard" - || world.Key == "Thunder" || world.Key == "Cure" || world.Key == "Reflect" || world.Key == "Magnet") - { - number = data.SingleNumbers[world.Value + 1]; - } - - Image worldFound = this.FindName(world.Key + "Found") as Image; - worldFound.Source = number; - - if (world.Key == "Fire" || world.Key == "Blizzard" || world.Key == "Thunder" - || world.Key == "Cure" || world.Key == "Reflect" || world.Key == "Magnet") - { - if (world.Value == 0) - { - worldFound.Source = null; - } - } - } - } - - foreach (KeyValuePair total in totals) - { - Image worldTotal = this.FindName(total.Key + "Total") as Image; - if (total.Value == -1) - { - worldTotal.Source = data.SingleNumbers[0]; - } - else if ((data.WorldsData.ContainsKey(total.Key) && total.Key != "GoA" && data.WorldsData[total.Key].hintedHint) - || (data.WorldsData.ContainsKey(total.Key) && total.Key != "GoA" && data.WorldsData[total.Key].complete)) - { - if (total.Value <= 10) - worldTotal.Source = data.BlueSingleNumbers[total.Value]; - else - worldTotal.Source = data.BlueNumbers[total.Value]; - } - else - { - if (total.Value <= 10) - worldTotal.Source = data.SingleNumbers[total.Value]; - else - worldTotal.Source = data.Numbers[total.Value]; - } - - // Format fixing for double digit numbers - if (total.Key != "GoA" && total.Key != "Atlantica") - { - if (total.Value >= 11) - { - (worldTotal.Parent as Grid).ColumnDefinitions[3].Width = new GridLength(2, GridUnitType.Star); - (worldTotal.Parent as Grid).ColumnDefinitions[0].Width = new GridLength(0, GridUnitType.Star); - } - else - { - (worldTotal.Parent as Grid).ColumnDefinitions[3].Width = new GridLength(1, GridUnitType.Star); - (worldTotal.Parent as Grid).ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star); - } - } - } - - foreach(KeyValuePair impCheck in important) - { - ContentControl imp = this.FindName(impCheck.Key) as ContentControl; - if (impCheck.Value > 0) - { - imp.Opacity = 1; - } - else - { - if (impCheck.Key != "Report" && impCheck.Key != "TornPage") - imp.Opacity = 0.25; - } - } - } - - public void UpdateTotal(string world, int checks) - { - string worldName = world; - totals[worldName] = checks+1; - - UpdateNumbers(); - } - - - void BroadcastWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) - { - this.Hide(); - if (!canClose) - { - e.Cancel = true; - } - } - - public void OnResetHints() - { - SorasHeartBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - DriveFormsBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - HollowBastionBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - TwilightTownBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - LandofDragonsBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - BeastsCastleBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - OlympusColiseumBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - SpaceParanoidsBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - HalloweenTownBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - PortRoyalBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - AgrabahBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - PrideLandsBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - DisneyCastleBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - HundredAcreWoodBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - SimulatedTwilightTownBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - TWTNWBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - } - - public void OnReset() - { - worlds.Clear(); - worlds.Add("SorasHeart", 0); - worlds.Add("DriveForms", 0); - worlds.Add("SimulatedTwilightTown", 0); - worlds.Add("TwilightTown", 0); - worlds.Add("HollowBastion", 0); - worlds.Add("BeastsCastle", 0); - worlds.Add("OlympusColiseum", 0); - worlds.Add("Agrabah", 0); - worlds.Add("LandofDragons", 0); - worlds.Add("HundredAcreWood", 0); - worlds.Add("PrideLands", 0); - worlds.Add("DisneyCastle", 0); - worlds.Add("HalloweenTown", 0); - worlds.Add("PortRoyal", 0); - worlds.Add("SpaceParanoids", 0); - worlds.Add("TWTNW", 0); - worlds.Add("GoA", 0); - worlds.Add("Report", 0); - worlds.Add("TornPage", 0); - worlds.Add("Fire", 0); - worlds.Add("Blizzard", 0); - worlds.Add("Thunder", 0); - worlds.Add("Cure", 0); - worlds.Add("Reflect", 0); - worlds.Add("Magnet", 0); - worlds.Add("Atlantica", 0); - - totals.Clear(); - totals.Add("SorasHeart", -1); - totals.Add("DriveForms", -1); - totals.Add("SimulatedTwilightTown", -1); - totals.Add("TwilightTown", -1); - totals.Add("HollowBastion", -1); - totals.Add("BeastsCastle", -1); - totals.Add("OlympusColiseum", -1); - totals.Add("Agrabah", -1); - totals.Add("LandofDragons", -1); - totals.Add("HundredAcreWood", -1); - totals.Add("PrideLands", -1); - totals.Add("DisneyCastle", -1); - totals.Add("HalloweenTown", -1); - totals.Add("PortRoyal", -1); - totals.Add("SpaceParanoids", -1); - totals.Add("TWTNW", -1); - totals.Add("Atlantica", -1); - - important.Clear(); - important.Add("Fire", 0); - important.Add("Blizzard", 0); - important.Add("Thunder", 0); - important.Add("Cure", 0); - important.Add("Reflect", 0); - important.Add("Magnet", 0); - important.Add("Valor", 0); - important.Add("Wisdom", 0); - important.Add("Limit", 0); - important.Add("Master", 0); - important.Add("Final", 0); - important.Add("Nonexistence", 0); - important.Add("Connection", 0); - important.Add("Peace", 0); - important.Add("PromiseCharm", 0); - important.Add("Feather", 0); - important.Add("Ukulele", 0); - important.Add("Baseball", 0); - important.Add("Lamp", 0); - important.Add("Report", 0); - important.Add("TornPage", 0); - important.Add("SecondChance", 0); - important.Add("OnceMore", 0); - - SorasHeartBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - DriveFormsBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - HollowBastionBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - TwilightTownBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - LandofDragonsBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - BeastsCastleBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - OlympusColiseumBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - SpaceParanoidsBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - HalloweenTownBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - PortRoyalBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - AgrabahBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - PrideLandsBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - DisneyCastleBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - HundredAcreWoodBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - SimulatedTwilightTownBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - TWTNWBar.Source = new BitmapImage(new Uri("Images/Bar.png", UriKind.Relative)); - - Collected.Source = data.Numbers[1]; - } - - public void ToggleProgression(bool toggle) - { - if (toggle == true) - { - foreach (string key in Progression.Keys.ToList()) - { - Progression[key].Visibility = Visibility.Visible; - } - } - else - { - foreach (string key in Progression.Keys.ToList()) - { - Progression[key].Visibility = Visibility.Hidden; - } - } - } - } -} diff --git a/KhTracker/Codes.cs b/KhTracker/Codes.cs deleted file mode 100644 index 1317674d..00000000 --- a/KhTracker/Codes.cs +++ /dev/null @@ -1,861 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace KhTracker -{ - public class Codes - { - public string FindCode(string code) - { - if (Free.Contains(code)) - { - return "GoA"; - } - else if (SimulatedTwilightTown.Contains(code)) - { - return "SimulatedTwilightTown"; - } - else if (TwilightTown.Contains(code)) - { - return "TwilightTown"; - } - else if (HollowBastion.Contains(code)) - { - return "HollowBastion"; - } - else if (LandOfDragons.Contains(code)) - { - return "LandofDragons"; - } - else if (BeastsCastle.Contains(code)) - { - return "BeastsCastle"; - } - else if (OlympusColiseum.Contains(code)) - { - return "OlympusColiseum"; - } - else if (DisneyCastle.Contains(code)) - { - return "DisneyCastle"; - } - else if (PortRoyal.Contains(code)) - { - return "PortRoyal"; - } - else if (Agrabah.Contains(code)) - { - return "Agrabah"; - } - else if (HalloweenTown.Contains(code)) - { - return "HalloweenTown"; - } - else if (PrideLands.Contains(code)) - { - return "PrideLands"; - } - else if (Atlantica.Contains(code)) - { - return "Atlantica"; - } - else if (AcreWood.Contains(code)) - { - return "HundredAcreWood"; - } - else if (SpaceParanoids.Contains(code)) - { - return "SpaceParanoids"; - } - else if (TheWorldThatNeverWas.Contains(code)) - { - return "TWTNW"; - } - else if (Forms.Contains(code)) - { - return "DriveForms"; - } - else if (Levels.Contains(code)) - { - return "SorasHeart"; - } - - return ""; - } - - static public string GetHintTextName(string worldName) - { - if (worldName == "SimulatedTwilightTown") - { - return "Simulated Twilight Town"; - } - else if (worldName == "TwilightTown") - { - return "Twilight Town"; - } - else if (worldName == "HollowBastion") - { - return "Hollow Bastion"; - } - else if (worldName == "LandofDragons") - { - return "Land of Dragons"; - } - else if (worldName == "BeastsCastle") - { - return "Beasts Castle"; - } - else if (worldName == "OlympusColiseum") - { - return "Olympus Coliseum"; - } - else if (worldName == "DisneyCastle") - { - return "Disney Castle"; - } - else if (worldName == "PortRoyal") - { - return "Port Royal"; - } - else if (worldName == "HalloweenTown") - { - return "Halloween Town"; - } - else if (worldName == "PrideLands") - { - return "Pride Lands"; - } - else if (worldName == "HundredAcreWood") - { - return "Hundred Acre Wood"; - } - else if (worldName == "SpaceParanoids") - { - return "Space Paranoids"; - } - else if (worldName == "DriveForms") - { - return "Drive Forms"; - } - else if (worldName == "SorasHeart") - { - return "Soras Heart"; - } - - return worldName; - } - - public string GetDefault(int index) - { - return Default[index]; - } - - public Dictionary itemCodes = new Dictionary - { - {21, "Fire"}, - {22, "Blizzard"}, - {23, "Thunder"}, - {24, "Cure"}, - {25, "Ukulele"}, - {26, "Valor"}, - {27, "Wisdom"}, - {29, "Final"}, - {31, "Master"}, - {32, "TornPage"}, - {87, "Magnet"}, - {88, "Reflect"}, - {159, "Lamp"}, - {160, "Feather"}, - {226, "Report1"}, - {227, "Report2"}, - {228, "Report3"}, - {229, "Report4"}, - {230, "Report5"}, - {231, "Report6"}, - {232, "Report7"}, - {233, "Report8"}, - {234, "Report9" }, - {235, "Report10"}, - {236, "Report11"}, - {237, "Report12"}, - {238, "Report13"}, - {383, "Baseball"}, - {415, "SecondChance"}, - {416, "OnceMore"}, - {524, "PromiseCharm"}, - {563, "Limit"}, - {593, "Connection"}, - {594, "Nonexistence"}, - {595, "Peace"}, - }; - - string[] Default = new string[] - { - "HollowBastion", - "TwilightTown", - "TWTNW", - "BeastsCastle", - "OlympusColiseum", - "PortRoyal", - "HollowBastion", - "TWTNW", - "TWTNW", - "TwilightTown", - "TWTNW", - "TWTNW", - "TWTNW" - }; - - string[] Free = new string[] { - "11CE05E2", - "11CE05EE", - "11CE05FA", - "11D18DDE", - "11D18DDC", - "11D18DE8", - "11D18DE4", - "11D18DE6", - "11D18DE0", - "11D18DE2" }; - - string[] SimulatedTwilightTown = new string[] { - "11CE016E", - "11CE017A", - "11CE0186", - "11CE0192", - "11CE019E", - "11CE01AA", - "11CE01B6", - "11CE01C2", - "11CE01CE", - "11CE01DA", - "11CE01E6", - "11CE01F2", - "11CE01FE", - "11CE020A", - "11CE0216", - "11CE0222", - "21D10FA8", - "21D10CB8", - "21D11278", - "11CE0636", - "11CE0606", - "11CE0612", - "11CE061E", - "11CE062A", - "11CE0642", - "11CE064E", - - "11CE0B0A"}; // data roxas - - string[] TwilightTown = new string[] { - "11CE022E", - "11CE023A", - "11CE0246", - "11CE0252", - "11CE025E", - "11CE026A", - "11CE0276", - "11CE0282", - "11CE028E", - "11CE029A", - "11CE02A6", - "11CE02B2", - "11CE02BE", - "11CE02CA", - "11CE02D6", - "11CE02E2", - "11CE02EE", - "11CE02FA", - "11CE0306", - "11CE0312", - "11CE031E", - "11CE032A", - "11CE0336", - "11CE0342", - "11CE034E", - "11CE035A", - "11CE0366", - "11CE0372", - "11CE037E", - "11CE038A", - "11CE0396", - "11CE03A2", - "11CE03AE", - "11CE03BA", - "11CE03C6", - "11CE03D2", - "11CE03DE", - "11CE03EA", - "11CE03F6", - "21D110E8", - "11CE065A", - "11CE0666", - "11CE0672", - "11CE067E", - "11CE07E6", - "11CE07F2", - "11CE07FE", - "11CE0966", - "11CE09AE", - "11CE0A0E", - - "11CE0ACE" }; //data axel - - string[] HollowBastion = new string[] { - "11CDFF3A", - "11CDFF46", - "11CDFF52", - "11CDFF5E", - "11CDFF6A", - "11CDFF76", - "11CDFF82", - "11CDFF8E", - "11CDFF9A", - "11CDFFA6", - "11CDFFB2", - "11CDFFBE", - "11CDFFCA", - "11CDFFD6", - "11CDFFE2", - "11CDFFEE", - "11CDFFFA", - "11CE0006", - "11CE0012", - "11CE001E", - "11CE002A", - "11CE0036", - "21D10E98", - "21D10BA8", - "21D11068", - "11CE068A", - "11CE0696", - "11CE06A2", - "11CE0702", - "11CE080A", - "11CE0822", - "11CE082E", - "11CE083A", - "11CE0936", - "11CE0942", - "11CE09A2", - "11CE09EA", - "11CE0B3A", //shroom - "11CE0B2E", //shroom - - "11CE04E6", //cor - "11CE04F2", - "11CE04FE", - "11CE050A", - "11CE0516", - "11CE0522", - "11CE052E", - "11CE053A", - "11CE0546", - "11CE0552", - "11CE055E", - "11CE056A", - "11CE0576", - "11CE0582", - "11CE058E", - "11CE059A", - "11CE05A6", - "11CE05B2", - "11CE05BE", - "11CE05CA", - "11CE05D6", - - "11CE0AB6" }; //data demyx - - string[] LandOfDragons = new string[] { - "11CDF72A", - "11CDF736", - "11CDF742", - "11CDF74E", - "11CDF75A", - "11CDF766", - "11CDF772", - "11CDF77E", - "11CDF78A", - "11CDF796", - "11CDF7A2", - "11CDF7AE", - "11CDF7BA", - "11CDF7C6", - "11CDF7D2", - "11CDF7DE", - "11CDF7EA", - "11CDF7F6", - "11CDF802", - "11CDF80E", - "11CDF81A", - "21D10DF8", - "21D108C8", - "21D10908", - "11CE06D2", - "11CE06C6", - "11CE06DE", - "11CE06EA", - - "11CE0AE6" }; //data xigbar - - string[] BeastsCastle = new string[] { - "11CDFBF2", - "11CDFBFE", - "11CDFC0A", - "11CDFC16", - "11CDFC22", - "11CDFC2E", - "11CDFC3A", - "11CDFC46", - "11CDFC52", - "11CDFC5E", - "11CDFC6A", - "11CDFC76", - "11CDFC82", - "11CDFC8E", - "11CDFC9A", - "11CDFCA6", - "11CDFCB2", - "11CDFCBE", - "11CDFCCA", - "11CDFCD6", - "11CDFCE2", - "21D10758", - "21D10788", - "21D107C8", - "11CE06F6", - "11CE0852", - "11CE085E", - "11CE09C6", - - "11CE0AC2" }; //data xaldin - - string[] OlympusColiseum = new string[] { - "11CDFB02", - "11CDFB0E", - "11CDFB1A", - "11CDFB26", - "11CDFB32", - "11CDFB3E", - "11CDFB4A", - "11CDFB56", - "11CDFB62", - "11CDFB6E", - "11CDFB7A", - "11CDFB86", - "11CDFB92", - "11CDFB9E", - "11CDFBAA", - "11CDFBB6", - "11CDFBC2", - "11CDFBCE", - "11CDFBDA", - "11CDFBE6", - "21D10808", - "21D10FE8", - "21D10828", - "21D10858", - "21D10888", - "11CE070E", - "11CE071A", - "11CE09D2", - "11CE0726", - "11CE0882", - "11CE088E", - - "11CE073E", //cups - "11CE074A", - "11CE07CE", - "11CE07DA", - "11CE089A", - "11CE08A6", - "11CE094E", - "11CE095A", - "11CE0996", //hades cup - - "11CE0A56", //AS zexion - "11CE0A92"}; //data zexion - - string[] DisneyCastle = new string[] { - "11CDF9B2", - "11CDF9BE", - "11CDF9CA", - "11CDF9D6", - "11CDF9E2", - "11CDF9EE", - "11CDF9FA", - "11CDFA06", - "21D10D28", - "11CE0756", - "11CE0B16", //terra - "11CE0B22", //terra - - "11CDF95E", //timeless river - "11CDF96A", - "11CDF976", - "11CDF982", - "11CDF98E", - "11CDF99A", - "11CDF9A6", - "21D10988", - "21D109B8", - "11CE076E", - "11CE0732", - "11CE0762", - - "11CE0A6E", //AS marluxia - "11CE0AAA"}; //data marluxia - - string[] PortRoyal = new string[] { - "11CDFE3E", - "11CDFE4A", - "11CDFE56", - "11CDFE62", - "11CDFE6E", - "11CDFE7A", - "11CDFE86", - "11CDFE92", - "11CDFE9E", - "11CDFEAA", - "11CDFEB6", - "11CDFEC2", - "11CDFECE", - "11CDFEDA", - "11CDFEE6", - "11CDFEF2", - "11CDFEFE", - "11CDFF0A", - "11CDFF16", - "11CDFF22", - "11CDFF2E", - "21D110B8", - "21D10AA8", - "21D11028", - "21D10AE8", - "11CE077A", - "11CE0786", - "11CE086A", - "11CE0876", - "11CE09DE", - - "11CE0AFE"}; //data luxord - - string[] Agrabah = new string[] { - "11CDF826", - "11CDF832", - "11CDF83E", - "11CDF84A", - "11CDF856", - "11CDF862", - "11CDF86E", - "11CDF87A", - "11CDF886", - "11CDF892", - "11CDF89E", - "11CDF8AA", - "11CDF8B6", - "11CDF8C2", - "11CDF8CE", - "11CDF8DA", - "11CDF8E6", - "11CDF8F2", - "11CDF8FE", - "11CDF90A", - "11CDF916", - "11CDF922", - "11CDF92E", - "11CDF93A", - "11CDF946", - "11CDF952", - "21D10DB8", - "21D10CE8", - "21D10978", - "11CE0792", - "11CE079E", - "11CE08B2", - - "11CE0A4A", //AS lexaeus - "11CE0A86"}; //data lexaeus - - string[] HalloweenTown = new string[] { - "11CDFD96", - "11CDFDA2", - "11CDFDAE", - "11CDFDBA", - "11CDFDC6", - "11CDFDD2", - "11CDFDDE", - "11CDFDEA", - "11CDFDF6", - "11CDFE02", - "11CDFE0E", - "11CDFE1A", - "11CDFE26", - "11CDFE32", - "21D109E8", - "11CE07AA", - "11CE08BE", - "11CE08CA", - "11CE08D6", - - "11CE0A3E", //AS vexen - "11CE0A7A"}; //data vexen - - string[] PrideLands = new string[] { - "11CE0042", - "11CE004E", - "11CE005A", - "11CE0066", - "11CE0072", - "11CE007E", - "11CE008A", - "11CE0096", - "11CE00A2", - "11CE00AE", - "11CE00BA", - "11CE00C6", - "11CE00D2", - "11CE00DE", - "11CE00EA", - "11CE00F6", - "11CE0102", - "11CE010E", - "11CE011A", - "11CE0126", - "11CE0132", - "11CE013E", - "11CE014A", - "11CE0156", - "11CE0162", - "21D10C18", - "11CE07B6", - "11CE07C2", - - "11CE0AF2"}; //data saix - - string[] Atlantica = new string[] { - "11CE0846", - "11CE08E2", - "11CE08EE", - "11CE08FA"}; - - string[] AcreWood = new string[] { - "11CDFA12", - "11CDFA1E", - "11CDFA2A", - "11CDFA36", - "11CDFA42", - "11CDFA4E", - "11CDFA5A", - "11CDFA66", - "11CDFA72", - "11CDFA7E", - "11CDFA8A", - "11CDFA96", - "11CDFAA2", - "11CDFAAE", - "11CDFABA", - "11CDFAC6", - "11CDFAD2", - "11CDFADE", - "11CDFAEA", - "11CDFAF6", - "11CE0906", - "11CE0912", - "11CE091E", - "11CE092A"}; - - string[] SpaceParanoids = new string[] { - "11CDFCEE", - "11CDFCFA", - "11CDFD06", - "11CDFD12", - "11CDFD1E", - "11CDFD2A", - "11CDFD36", - "11CDFD42", - "11CDFD4E", - "11CDFD5A", - "11CDFD66", - "11CDFD72", - "11CDFD7E", - "11CDFD8A", - "21D10C38", - "21D11078", - "21D10C78", - "11CE0816", - "11CE0A62", //AS larxene - "11CE0A9E"}; //data larxene - - string[] TheWorldThatNeverWas = new string[] { - "11CE0402", - "11CE040E", - "11CE041A", - "11CE0426", - "11CE0432", - "11CE043E", - "11CE044A", - "11CE0456", - "11CE0462", - "11CE046E", - "11CE047A", - "11CE0486", - "11CE0492", - "11CE049E", - "11CE04AA", - "11CE04B6", - "11CE04C2", - "11CE04CE", - "11CE04DA", - "21D111E8", - "21D10B58", - "11CE0972", - "11CE097E", - "11CE098A", - "11CE09BA", - "11CE09F6", - "11CE0A02", - "11CE0A1A", - "11CE0A26", - "11CE0A32", - - "11CE0ADA"}; //data xemnas - - string[] Forms = new string[] { - "11D1A22E", //valor - "11D1A236", - "11D1A23E", - "11D1A246", - "11D1A24E", - "11D1A256", - "11D1A266", //wisdom - "11D1A26E", - "11D1A276", - "11D1A27E", - "11D1A286", - "11D1A28E", - "11D1A29E", //limit - "11D1A2A6", - "11D1A2AE", - "11D1A2B6", - "11D1A2BE", - "11D1A2C6", - "11D1A2D6", //master - "11D1A2DE", - "11D1A2E6", - "11D1A2EE", - "11D1A2F6", - "11D1A2FE", - "11D1A30E", //Final - "11D1A316", - "11D1A31E", - "11D1A326", - "11D1A32E", - "11D1A336"}; - - string[] Levels = new string[] { - "11D0B6C0", //Lvl 2 - "11D0B6E0", //Lvl 4 - "11D0B710", //Lvl 7 - "11D0B730", //Lvl 9 - "11D0B740", //Lvl 10 - "11D0B760", //Lvl 12 - "11D0B780", //Lvl 14 - "11D0B790", //Lvl 15 - "11D0B7B0", //Lvl 17 - "11D0B7E0", //Lvl 20 - "11D0B810", //Lvl 23 - "11D0B830", //Lvl 25 - "11D0B860", //Lvl 28 - "11D0B880", //Lvl 30 - "11D0B8A0", //Lvl 32 - "11D0B8C0", //Lvl 34 - "11D0B8E0", //Lvl 36 - "11D0B910", //Lvl 39 - "11D0B930", //Lvl 41 - "11D0B960", //Lvl 44 - "11D0B980", //Lvl 46 - "11D0B9A0", //Lvl 48 - "11D0B9C0", //Lvl 50 - - "11D0B6D0", //Lvl 3 - "11D0B6F0", //Lvl 5 - "11D0B700", //Lvl 6 - "11D0B720", //Lvl 8 - "11D0B750", //Lvl 11 - "11D0B770", //Lvl 13 - "11D0B7A0", //Lvl 16 - "11D0B7C0", //Lvl 18 - "11D0B7D0", //Lvl 19 - "11D0B7F0", //Lvl 21 - "11D0B800", //Lvl 22 - "11D0B820", //Lvl 24 - "11D0B840", //Lvl 26 - "11D0B850", //Lvl 27 - "11D0B870", //Lvl 29 - "11D0B890", //Lvl 31 - "11D0B8B0", //Lvl 33 - "11D0B8D0", //Lvl 35 - "11D0B8F0", //Lvl 37 - "11D0B920", //Lvl 40 - "11D0B940", //Lvl 42 - "11D0B950", //Lvl 43 - "11D0B970", //Lvl 45 - "11D0B990", //Lvl 47 - "11D0B9B0", //Lvl 49 - - "11D0B9D0", //Lvl 51-99 - "11D0B9E0", - "11D0B9F0", - "11D0BA00", - "11D0BA10", - "11D0BA20", - "11D0BA30", - "11D0BA40", - "11D0BA50", - "11D0BA60", - "11D0BA70", - "11D0BA80", - "11D0BA90", - "11D0BAA0", - "11D0BAB0", - "11D0BAC0", - "11D0BAD0", - "11D0BAE0", - "11D0BAF0", - "11D0BB00", - "11D0BB10", - "11D0BB20", - "11D0BB30", - "11D0BB40", - "11D0BB50", - "11D0BB60", - "11D0BB70", - "11D0BB80", - "11D0BB90", - "11D0BBA0", - "11D0BBB0", - "11D0BBC0", - "11D0BBD0", - "11D0BBE0", - "11D0BBF0", - "11D0BC00", - "11D0BC10", - "11D0BC20", - "11D0BC30", - "11D0BC40", - "11D0BC50", - "11D0BC60", - "11D0BC70", - "11D0BC80", - "11D0BC90", - "11D0BCA0", - "11D0BCB0", - "11D0BCC0", - "11D0BCD0"}; - } -} diff --git a/KhTracker/Core/Codes.cs b/KhTracker/Core/Codes.cs new file mode 100644 index 00000000..924c0351 --- /dev/null +++ b/KhTracker/Core/Codes.cs @@ -0,0 +1,1808 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Controls; + +namespace KhTracker +{ + public class Codes + { + //Helpers + public string FindCode(string code) + { + if (Free.Contains(code)) + { + return "GoA"; + } + else if (SimulatedTwilightTown.Contains(code)) + { + return "SimulatedTwilightTown"; + } + else if (TwilightTown.Contains(code)) + { + return "TwilightTown"; + } + else if (HollowBastion.Contains(code)) + { + return "HollowBastion"; + } + else if (LandOfDragons.Contains(code)) + { + return "LandofDragons"; + } + else if (BeastsCastle.Contains(code)) + { + return "BeastsCastle"; + } + else if (OlympusColiseum.Contains(code)) + { + return "OlympusColiseum"; + } + else if (DisneyCastle.Contains(code)) + { + return "DisneyCastle"; + } + else if (PortRoyal.Contains(code)) + { + return "PortRoyal"; + } + else if (Agrabah.Contains(code)) + { + return "Agrabah"; + } + else if (HalloweenTown.Contains(code)) + { + return "HalloweenTown"; + } + else if (PrideLands.Contains(code)) + { + return "PrideLands"; + } + else if (Atlantica.Contains(code)) + { + return "Atlantica"; + } + else if (AcreWood.Contains(code)) + { + return "HundredAcreWood"; + } + else if (SpaceParanoids.Contains(code)) + { + return "SpaceParanoids"; + } + else if (TheWorldThatNeverWas.Contains(code)) + { + return "TWTNW"; + } + else if (Forms.Contains(code)) + { + return "DriveForms"; + } + else if (Levels.Contains(code)) + { + return "SorasHeart"; + } + + return ""; + } + + public static string GetHintTextName(string worldName) + { + switch(worldName) + { + case "SimulatedTwilightTown": + return "Simulated Twilight Town"; + case "TwilightTown": + return "Twilight Town"; + case "HollowBastion": + return "Hollow Bastion"; + case "LandofDragons": + return "Land of Dragons"; + case "BeastsCastle": + return "Beast's Castle"; + case "OlympusColiseum": + return "Olympus Coliseum"; + case "DisneyCastle": + return "Disney Castle"; + case "PortRoyal": + return "Port Royal"; + case "HalloweenTown": + return "Halloween Town"; + case "PrideLands": + return "Pride Lands"; + case "HundredAcreWood": + return "Hundred Acre Wood"; + case "SpaceParanoids": + return "Space Paranoids"; + case "DriveForms": + return "Drive Forms"; + case "SorasHeart": + return "Sora's Heart"; + case "PuzzSynth": + return "Creations"; + default: + return worldName; + } + } + + public static string GetWorldName(string worldName) + { + switch (worldName) + { + case "Simulated Twilight Town": + return "SimulatedTwilightTown"; + case "Twilight Town": + return "TwilightTown"; + case "Hollow Bastion": + return "HollowBastion"; + case "Land of Dragons": + return "LandofDragons"; + case "Beast's Castle": + return "BeastsCastle"; + case "Olympus Coliseum": + return "OlympusColiseum"; + case "Disney Castle": + return "DisneyCastle"; + case "Port Royal": + return "PortRoyal"; + case "Halloween Town": + return "HalloweenTown"; + case "Pride Lands": + return "PrideLands"; + case "Hundred Acre Wood": + return "HundredAcreWood"; + case "Space Paranoids": + return "SpaceParanoids"; + case "Drive Forms": + return "DriveForms"; + case "Sora's Heart": + return "SorasHeart"; + case "Creations": + return "PuzzSynth"; + default: + return worldName; + } + } + + public string GetDefault(int index) + { + return Default[index]; + } + + public static string FindShortName(string name) + { + if (shortNames.ContainsKey(name)) + return shortNames[name]; + else + return name; + } + + public static string FindItemType(string name) + { + if (itemTypes.Keys.Contains(name)) + return itemTypes[name]; + else + return "Unknown"; + } + + public static string GetTextColor(string name) + { + if (getColors.Keys.Contains(name)) + return getColors[name]; + else if (name.EndsWith("important checks")) + return "Gold"; + else + return "DefWhite"; + } + + public static string FindItemName(string name) + { + if (convertItemNames.ContainsKey(name)) + return convertItemNames[name]; + else + return name; + } + + public static string ConvertSeedGenName(string name) + { + if (convertOpenKH.ContainsKey(name)) + return convertOpenKH[name]; + else + return "Unknown"; + } + + public static string FindBossType(string name) + { + if (bossTypes.Keys.Contains(name)) + return bossTypes[name]; + else + return "boss_other"; + } + + //Dictionaries + public Dictionary itemCodes = new Dictionary + { + {21, "Fire"}, + {22, "Blizzard"}, + {23, "Thunder"}, + {24, "Cure"}, + {25, "Ukulele"}, + {26, "Valor"}, + {89, "Valor"}, //Dummy (Seedgen 3.0.1) + {27, "Wisdom"}, + {29, "Final"}, + {115, "Final"}, //Dummy (Seedgen 3.0.1) + {31, "Master"}, + {32, "TornPage"}, + {87, "Magnet"}, + {88, "Reflect"}, + {159, "Lamp"}, + {160, "Feather"}, + {226, "Report1"}, + {227, "Report2"}, + {228, "Report3"}, + {229, "Report4"}, + {230, "Report5"}, + {231, "Report6"}, + {232, "Report7"}, + {233, "Report8"}, + {234, "Report9" }, + {235, "Report10"}, + {236, "Report11"}, + {237, "Report12"}, + {238, "Report13"}, + {383, "Baseball"}, + {415, "SecondChance"}, + {416, "OnceMore"}, + {524, "PromiseCharm"}, + {563, "Limit"}, + {593, "Connection"}, + {594, "Nonexistence"}, + {595, "Peace"}, + {54, "AuronWep"}, + {55, "MulanWep"}, + {59, "BeastWep"}, + {60, "JackWep"}, + {61, "SimbaWep"}, + {62, "SparrowWep"}, + {72, "AladdinWep"}, + {74, "TronWep"}, + {369, "MembershipCard"}, + {375, "IceCream"}, + {376, "Picture"}, + {30, "Anti"}, + {537, "HadesCup"}, + {370, "OlympusStone"}, + {462, "UnknownDisk"}, + {362, "MunnyPouch1"}, + {535, "MunnyPouch2"} + }; + + public static Dictionary shortNames = new Dictionary() + { + {"Secret Ansem's Report 1", "Ansem's Report"}, + {"Secret Ansem's Report 2", "Ansem's Report"}, + {"Secret Ansem's Report 3", "Ansem's Report"}, + {"Secret Ansem's Report 4", "Ansem's Report"}, + {"Secret Ansem's Report 5", "Ansem's Report"}, + {"Secret Ansem's Report 6", "Ansem's Report"}, + {"Secret Ansem's Report 7", "Ansem's Report"}, + {"Secret Ansem's Report 8", "Ansem's Report"}, + {"Secret Ansem's Report 9", "Ansem's Report"}, + {"Secret Ansem's Report 10", "Ansem's Report"}, + {"Secret Ansem's Report 11", "Ansem's Report"}, + {"Secret Ansem's Report 12", "Ansem's Report"}, + {"Secret Ansem's Report 13", "Ansem's Report"}, + {"Baseball Charm (Chicken Little)", "Baseball Charm"}, + {"Lamp Charm (Genie)", "Lamp Charm"}, + {"Ukulele Charm (Stitch)", "Ukulele Charm"}, + {"Feather Charm (Peter Pan)", "Feather Charm"}, + {"PromiseCharm", "Promise Charm"}, + {"Battlefields of War (Auron)", "Battlefields of War"}, + {"Sword of the Ancestor (Mulan)", "Sword of the Ancestor"}, + {"Beast's Claw (Beast)", "Beast's Claw"}, + {"Bone Fist (Jack Skellington)", "Bone Fist"}, + {"Proud Fang (Simba)", "Proud Fang"}, + {"Skill and Crossbones (Jack Sparrow)", "Skill and Crossbones"}, + {"Scimitar (Aladdin)", "Scimitar"}, + {"Identity Disk (Tron)", "Identity Disk"}, + {"Sora's Heart", "Levels" }, + {"Drive Forms", "Drives" }, + {"Simulated Twilight Town", "STT" }, + {"Twilight Town", "TT" }, + {"Hollow Bastion", "HB" }, + {"Beast's Castle", "BC" }, + {"Olympus Coliseum", "OC" }, + {"Agrabah", "AG" }, + {"Land of Dragons", "LoD" }, + {"Hundred Acre Wood", "100AW" }, + {"Pride Lands", "PL" }, + {"Disney Castle", "DC" }, + {"Halloween Town", "HT" }, + {"Port Royal", "PR" }, + {"Space Paranoids", "SP" }, + {"Atlantica", "AT" } + }; + + public static Dictionary itemTypes = new Dictionary() + { + {"Report1", "report"}, + {"Report2", "report"}, + {"Report3", "report"}, + {"Report4", "report"}, + {"Report5", "report"}, + {"Report6", "report"}, + {"Report7", "report"}, + {"Report8", "report"}, + {"Report9", "report"}, + {"Report10", "report"}, + {"Report11", "report"}, + {"Report12", "report"}, + {"Report13", "report"}, + {"Fire", "magic"}, + {"Fire1", "magic"}, + {"Fire2", "magic"}, + {"Fire3", "magic"}, + {"Blizzard", "magic"}, + {"Blizzard1", "magic"}, + {"Blizzard2", "magic"}, + {"Blizzard3", "magic"}, + {"Thunder", "magic"}, + {"Thunder1", "magic"}, + {"Thunder2", "magic"}, + {"Thunder3", "magic"}, + {"Cure", "magic"}, + {"Cure1", "magic"}, + {"Cure2", "magic"}, + {"Cure3", "magic"}, + {"Reflect", "magic"}, + {"Reflect1", "magic"}, + {"Reflect2", "magic"}, + {"Reflect3", "magic"}, + {"Magnet", "magic"}, + {"Magnet1", "magic"}, + {"Magnet2", "magic"}, + {"Magnet3", "magic"}, + {"Valor", "form"}, + {"Wisdom", "form"}, + {"Limit", "form"}, + {"Master", "form"}, + {"Final", "form"}, + {"OnceMore", "ability"}, + {"SecondChance", "ability"}, + {"TornPage", "page"}, + {"TornPage1", "page"}, + {"TornPage2", "page"}, + {"TornPage3", "page"}, + {"TornPage4", "page"}, + {"TornPage5", "page"}, + {"Baseball", "summon"}, + {"Lamp", "summon"}, + {"Ukulele", "summon"}, + {"Feather", "summon"}, + {"Connection", "proof"}, + {"Nonexistence", "proof"}, + {"Peace", "proof"}, + {"PromiseCharm", "proof"}, + {"AuronWep", "visit"}, + {"MulanWep", "visit"}, + {"BeastWep", "visit"}, + {"JackWep", "visit"}, + {"SimbaWep", "visit"}, + {"SparrowWep", "visit"}, + {"AladdinWep", "visit"}, + {"TronWep", "visit"}, + {"MembershipCard", "visit"}, + {"IceCream", "visit"}, + {"Picture", "visit"}, + {"Anti", "form"}, + {"HadesCup", "other"}, + {"OlympusStone", "other"}, + {"UnknownDisk", "other"}, + {"MunnyPouch", "other"}, + {"MunnyPouch1", "other"}, + {"MunnyPouch2", "other"}, + //ghost versions + {"Ghost_Report1", "report"}, + {"Ghost_Report2", "report"}, + {"Ghost_Report3", "report"}, + {"Ghost_Report4", "report"}, + {"Ghost_Report5", "report"}, + {"Ghost_Report6", "report"}, + {"Ghost_Report7", "report"}, + {"Ghost_Report8", "report"}, + {"Ghost_Report9", "report"}, + {"Ghost_Report10", "report"}, + {"Ghost_Report11", "report"}, + {"Ghost_Report12", "report"}, + {"Ghost_Report13", "report"}, + {"Ghost_Fire1", "magic"}, + {"Ghost_Fire2", "magic"}, + {"Ghost_Fire3", "magic"}, + {"Ghost_Blizzard1", "magic"}, + {"Ghost_Blizzard2", "magic"}, + {"Ghost_Blizzard3", "magic"}, + {"Ghost_Thunder1", "magic"}, + {"Ghost_Thunder2", "magic"}, + {"Ghost_Thunder3", "magic"}, + {"Ghost_Cure1", "magic"}, + {"Ghost_Cure2", "magic"}, + {"Ghost_Cure3", "magic"}, + {"Ghost_Reflect1", "magic"}, + {"Ghost_Reflect2", "magic"}, + {"Ghost_Reflect3", "magic"}, + {"Ghost_Magnet1", "magic"}, + {"Ghost_Magnet2", "magic"}, + {"Ghost_Magnet3", "magic"}, + {"Ghost_Valor", "form"}, + {"Ghost_Wisdom", "form"}, + {"Ghost_Limit", "form"}, + {"Ghost_Master", "form"}, + {"Ghost_Final", "form"}, + {"Ghost_OnceMore", "ability"}, + {"Ghost_SecondChance", "ability"}, + {"Ghost_TornPage1", "page"}, + {"Ghost_TornPage2", "page"}, + {"Ghost_TornPage3", "page"}, + {"Ghost_TornPage4", "page"}, + {"Ghost_TornPage5", "page"}, + {"Ghost_Baseball", "summon"}, + {"Ghost_Lamp", "summon"}, + {"Ghost_Ukulele", "summon"}, + {"Ghost_Feather", "summon"}, + {"Ghost_Connection", "proof"}, + {"Ghost_Nonexistence", "proof"}, + {"Ghost_Peace", "proof"}, + {"Ghost_PromiseCharm", "proof"}, + {"Ghost_AuronWep", "visit"}, + {"Ghost_MulanWep", "visit"}, + {"Ghost_BeastWep", "visit"}, + {"Ghost_JackWep", "visit"}, + {"Ghost_SimbaWep", "visit"}, + {"Ghost_SparrowWep", "visit"}, + {"Ghost_AladdinWep", "visit"}, + {"Ghost_TronWep", "visit"}, + {"Ghost_MembershipCard", "visit"}, + {"Ghost_IceCream", "visit"}, + {"Ghost_Picture", "visit"}, + {"Ghost_Anti", "form"}, + {"Ghost_HadesCup", "other"}, + {"Ghost_OlympusStone", "other"}, + {"Ghost_UnknownDisk", "other"}, + {"Ghost_MunnyPouch1", "other"}, + {"Ghost_MunnyPouch2", "other"}, + //seedgen names + {"Fire Element", "magic"}, + {"Blizzard Element", "magic"}, + {"Thunder Element", "magic"}, + {"Cure Element", "magic"}, + {"Magnet Element", "magic"}, + {"Reflect Element", "magic"}, + {"Ukulele Charm (Stitch)", "summon"}, + {"Lamp Charm (Genie)", "summon"}, + {"Feather Charm (Peter Pan)", "summon"}, + {"Baseball Charm (Chicken Little)", "summon"}, + {"Valor Form", "form"}, + {"Wisdom Form", "form"}, + {"Final Form", "form"}, + {"Master Form", "form"}, + {"Limit Form", "form"}, + {"Second Chance", "ability"}, + {"Once More", "ability"}, + {"Promise Charm", "proof"}, + {"Proof of Connection", "proof"}, + {"Proof of Nonexistence", "proof"}, + {"Proof of Peace", "proof"}, + {"Torn Pages", "page"}, + {"Secret Ansem's Report 1", "report"}, + {"Secret Ansem's Report 2", "report"}, + {"Secret Ansem's Report 3", "report"}, + {"Secret Ansem's Report 4", "report"}, + {"Secret Ansem's Report 5", "report"}, + {"Secret Ansem's Report 6", "report"}, + {"Secret Ansem's Report 7", "report"}, + {"Secret Ansem's Report 8", "report"}, + {"Secret Ansem's Report 9", "report"}, + {"Secret Ansem's Report 10", "report"}, + {"Secret Ansem's Report 11", "report"}, + {"Secret Ansem's Report 12", "report"}, + {"Secret Ansem's Report 13", "report"}, + {"Battlefields of War (Auron)", "visit"}, + {"Sword of the Ancestor (Mulan)", "visit"}, + {"Beast's Claw (Beast)", "visit"}, + {"Bone Fist (Jack Skellington)", "visit"}, + {"Proud Fang (Simba)", "visit"}, + {"Skill and Crossbones (Jack Sparrow)", "visit"}, + {"Scimitar (Aladdin)", "visit"}, + {"Identity Disk (Tron)", "visit"}, + {"Membership Card", "visit"}, + {"Ice Cream", "visit"}, + {"Anti-Form", "form"}, + {"Hades Cup Trophy", "other"}, + {"Olympus Stone", "other"}, + {"Unknown Disk", "other"}, + {"Munny Pouch", "other"} + }; + + public static Dictionary convertItemNames = new Dictionary() + { + {"Secret Ansem's Report 1", "Report1"}, + {"Secret Ansem's Report 2", "Report2"}, + {"Secret Ansem's Report 3", "Report3"}, + {"Secret Ansem's Report 4", "Report4"}, + {"Secret Ansem's Report 5", "Report5"}, + {"Secret Ansem's Report 6", "Report6"}, + {"Secret Ansem's Report 7", "Report7"}, + {"Secret Ansem's Report 8", "Report8"}, + {"Secret Ansem's Report 9", "Report9"}, + {"Secret Ansem's Report 10", "Report10"}, + {"Secret Ansem's Report 11", "Report11"}, + {"Secret Ansem's Report 12", "Report12"}, + {"Secret Ansem's Report 13", "Report13"}, + {"Valor Form", "Valor"}, + {"Wisdom Form", "Wisdom"}, + {"Limit Form", "Limit"}, + {"Master Form", "Master"}, + {"Final Form", "Final"}, + {"Once More", "OnceMore"}, + {"Second Chance", "SecondChance"}, + {"Baseball Charm (Chicken Little)", "Baseball"}, + {"Lamp Charm (Genie)", "Lamp"}, + {"Ukulele Charm (Stitch)", "Ukulele"}, + {"Feather Charm (Peter Pan)", "Feather"}, + {"Proof of Connection", "Connection"}, + {"Proof of Nonexistence", "Nonexistence"}, + {"Proof of Peace", "Peace"}, + {"PromiseCharm", "PromiseCharm"}, + {"Battlefields of War (Auron)", "AuronWep"}, + {"Sword of the Ancestor (Mulan)", "MulanWep"}, + {"Beast's Claw (Beast)", "BeastWep"}, + {"Bone Fist (Jack Skellington)", "JackWep"}, + {"Proud Fang (Simba)", "SimbaWep"}, + {"Skill and Crossbones (Jack Sparrow)", "SparrowWep"}, + {"Scimitar (Aladdin)", "AladdinWep"}, + {"Identity Disk (Tron)", "TronWep"}, + {"Membership Card", "MembershipCard"}, + {"Ice Cream", "IceCream"}, + {"Picture", "Picture"}, + {"Anti-Form", "Anti"}, + {"Hades Cup Trophy", "HadesCup"}, + {"Olympus Stone", "OlympusStone"}, + {"Unknown Disk", "UnknownDisk"} + }; + + public static Dictionary convertOpenKH = new Dictionary() + { + {"Level", "SorasHeart" }, + {"Form Levels", "DriveForms" }, + {"Simulated Twilight Town", "SimulatedTwilightTown" }, + {"Twilight Town", "TwilightTown" }, + {"Hollow Bastion", "HollowBastion" }, + {"Beast's Castle", "BeastsCastle" }, + {"Olympus Coliseum", "OlympusColiseum" }, + {"Agrabah", "Agrabah" }, + {"Land of Dragons", "LandofDragons" }, + {"Hundred Acre Wood", "HundredAcreWood" }, + {"Pride Lands", "PrideLands" }, + {"Disney Castle / Timeless River", "DisneyCastle" }, + {"Halloween Town", "HalloweenTown" }, + {"Port Royal", "PortRoyal" }, + {"Space Paranoids", "SpaceParanoids" }, + {"The World That Never Was", "TWTNW" }, + {"Atlantica", "Atlantica" }, + {"Proof of Connection", "Connection" }, + {"Proof of Nonexistence", "Nonexistence" }, + {"Proof of Peace", "Peace" }, + {"PromiseCharm", "PromiseCharm" }, + {"Valor Form", "Valor" }, + {"Wisdom Form", "Wisdom" }, + {"Limit Form", "Limit" }, + {"Master Form", "Master" }, + {"Final Form", "Final" }, + {"Fire Element", "Fire" }, + {"Blizzard Element", "Blizzard" }, + {"Thunder Element", "Thunder" }, + {"Cure Element", "Cure" }, + {"Magnet Element", "Magnet" }, + {"Reflect Element", "Reflect" }, + {"Ukulele Charm (Stitch)", "Ukulele" }, + {"Baseball Charm (Chicken Little)", "Baseball" }, + {"Lamp Charm (Genie)", "Lamp" }, + {"Feather Charm (Peter Pan)", "Feather" }, + {"Torn Pages", "TornPage" }, + {"Second Chance", "SecondChance" }, + {"Once More", "OnceMore" }, + {"Secret Ansem's Report 1", "Report1"}, + {"Secret Ansem's Report 2", "Report2"}, + {"Secret Ansem's Report 3", "Report3"}, + {"Secret Ansem's Report 4", "Report4"}, + {"Secret Ansem's Report 5", "Report5"}, + {"Secret Ansem's Report 6", "Report6"}, + {"Secret Ansem's Report 7", "Report7"}, + {"Secret Ansem's Report 8", "Report8"}, + {"Secret Ansem's Report 9", "Report9"}, + {"Secret Ansem's Report 10", "Report10"}, + {"Secret Ansem's Report 11", "Report11"}, + {"Secret Ansem's Report 12", "Report12"}, + {"Secret Ansem's Report 13", "Report13"}, + {"Secret Ansem's Report 14", "Report14"}, + {"Secret Ansem's Report 15", "Report15"}, + {"Secret Ansem's Report 16", "Report16"}, + {"Battlefields of War (Auron)", "AuronWep"}, + {"Sword of the Ancestor (Mulan)", "MulanWep"}, + {"Beast's Claw (Beast)", "BeastWep"}, + {"Bone Fist (Jack Skellington)", "JackWep"}, + {"Proud Fang (Simba)", "SimbaWep"}, + {"Skill and Crossbones (Jack Sparrow)", "SparrowWep"}, + {"Scimitar (Aladdin)", "AladdinWep"}, + {"Identity Disk (Tron)", "TronWep"}, + {"Membership Card", "MembershipCard"}, + {"Ice Cream", "IceCream"}, + {"Picture", "Picture"}, + {"Anti-Form", "Anti"}, + {"Hades Cup Trophy", "HadesCup"}, + {"Olympus Stone", "OlympusStone"}, + {"Unknown Disk", "UnknownDisk"}, + {"Garden of Assemblage", "GoA"}, + {"", "GoA"}, + {"Critical Bonuses", "GoA"}, + {"Creations", "PuzzSynth"}, + {"Empty", "Empty"}, + {"Munny Pouch", "MunnyPouch" } + }; + + public static Dictionary bossTypes = new Dictionary() + { + {"Armor Xemnas I", "boss_other"}, + {"Armor Xemnas II", "boss_other"}, + {"Axel (Data)", "boss_datas"}, + {"Axel I", "boss_other"}, + {"Axel II", "boss_other"}, + {"Barbossa", "boss_other"}, + {"Blizzard Lord", "boss_other"}, + {"Blizzard Lord (Cups)", "boss_other"}, + {"Cerberus", "boss_other"}, + {"Cerberus (Cups)", "boss_other"}, + {"Cloud", "boss_other"}, + {"Cloud (1)", "boss_other"}, + {"Cloud (2)", "boss_other"}, + {"Dark Thorn", "boss_other"}, + {"Demyx", "boss_other"}, + {"Demyx (Data)", "boss_datas"}, + {"Grim Reaper I", "boss_other"}, + {"Grim Reaper II", "boss_other"}, + {"Hades Cups", "boss_other"}, + {"Hades II", "boss_other"}, + {"Hades II (1)", "boss_other"}, + {"Hayner", "boss_other"}, + {"Hercules", "boss_other"}, + {"Hostile Program", "boss_other"}, + {"Larxene", "boss_as"}, + {"Larxene (Data)", "boss_datas"}, + {"Leon", "boss_other"}, + {"Leon (1)", "boss_other"}, + {"Leon (2)", "boss_other"}, + {"Leon (3)", "boss_other"}, + {"Lexaeus", "boss_as"}, + {"Lexaeus (Data)", "boss_datas"}, + {"Luxord", "boss_other"}, + {"Luxord (Data)", "boss_datas"}, + {"Marluxia", "boss_as"}, + {"Marluxia (Data)", "boss_datas"}, + {"Past Pete", "boss_other"}, + {"Pete Cups", "boss_other"}, + {"Pete OC II", "boss_other"}, + {"Prison Keeper", "boss_other"}, + {"Roxas", "boss_other"}, + {"Roxas (Data)", "boss_datas"}, + {"Saix", "boss_other"}, + {"Saix (Data)", "boss_datas"}, + {"Sark", "boss_other"}, + {"Scar", "boss_other"}, + {"Seifer", "boss_other"}, + {"Seifer (1)", "boss_other"}, + {"Seifer (2)", "boss_other"}, + {"Seifer (3)", "boss_other"}, + {"Seifer (4)", "boss_other"}, + {"Sephiroth", "boss_sephi"}, + {"Setzer", "boss_other"}, + {"Shan-Yu", "boss_other"}, + {"Terra", "boss_terra"}, + {"The Beast", "boss_other"}, + {"The Experiment", "boss_other"}, + {"Thresholder", "boss_other"}, + {"Tifa", "boss_other"}, + {"Tifa (1)", "boss_other"}, + {"Tifa (2)", "boss_other"}, + {"Twilight Thorn", "boss_other"}, + {"Vexen", "boss_as"}, + {"Vexen (Data)", "boss_datas"}, + {"Vivi", "boss_other"}, + {"Volcano Lord", "boss_other"}, + {"Volcano Lord (Cups)", "boss_other"}, + {"Xaldin", "boss_other"}, + {"Xaldin (Data)", "boss_datas"}, + {"Xemnas", "boss_other"}, + {"Xemnas (Data)", "boss_datas"}, + {"Final Xemnas", "boss_other"}, + {"Final Xemnas (Data)", "boss_datas"}, + {"Xigbar", "boss_other"}, + {"Xigbar (Data)", "boss_datas"}, + {"Yuffie", "boss_other"}, + {"Yuffie (1)", "boss_other"}, + {"Yuffie (2)", "boss_other"}, + {"Yuffie (3)", "boss_other"}, + {"Zexion", "boss_as"}, + {"Zexion (Data)", "boss_datas"}, + {"Hydra", "boss_other"}, + {"Jafar", "boss_other"}, + {"Storm Rider", "boss_other"}, + {"Groundshaker", "boss_other"}, + {"Boat Pete", "boss_other"}, + {"Pete TR", "boss_other"}, + {"Oogie Boogie", "boss_other"}, + {"MCP", "boss_other"} + }; + + public static Dictionary bossLocations = new Dictionary() + { + //Orgmembers (AS) + {"Marluxia", "DC"}, + {"Marluxia (Data)", "DC"}, + {"Lexaeus", "AG"}, + {"Lexaeus (Data)", "AG"}, + {"Larxene", "SP"}, + {"Larxene (Data)", "SP"}, + {"Vexen", "HT"}, + {"Vexen (Data)", "HT"}, + {"Zexion", "OC"}, + {"Zexion (Data)", "OC"}, + //Orgmembers (Normal) + {"Armor Xemnas I", "TWTNW"}, + {"Armor Xemnas II", "TWTNW"}, + {"Final Xemnas", "TWTNW"}, + {"Final Xemnas (Data)", "TWTNW"}, + {"Axel (Data)", "TT"}, + {"Axel I", "STT"}, + {"Axel II", "STT"}, + {"Demyx", "HB"}, + {"Demyx (Data)", "HB"}, + {"Luxord", "TWTNW"}, + {"Luxord (Data)", "PR"}, + {"Roxas", "TWTNW"}, + {"Roxas (Data)", "STT"}, + {"Saix", "TWTNW"}, + {"Saix (Data)", "PL"}, + {"Xaldin", "BC"}, + {"Xaldin (Data)", "BC"}, + {"Xemnas", "TWTNW"}, + {"Xemnas (Data)", "TWTNW"}, + {"Xigbar", "TWTNW"}, + {"Xigbar (Data)", "LoD"}, + // + {"Blizzard Lord", "AG"}, + {"Volcano Lord", "AG"}, + {"Jafar", "AG"}, + // + {"Barbossa", "PR"}, + {"Grim Reaper I", "PR"}, + {"Grim Reaper II", "PR"}, + // + {"Thresholder", "BC"}, + {"The Beast", "BC"}, + {"Shadow Stalker", "BC"}, + {"Dark Thorn", "BC"}, + // + {"Hostile Program", "SP"}, + {"Sark", "SP"}, + {"MCP", "SP"}, + {"Past Pete", "DC"}, + {"Boat Pete", "DC"}, + {"Pete TR", "DC"}, + // + {"Prison Keeper", "HT"}, + {"Oogie Boogie", "HT"}, + {"The Experiment", "HT"}, + // + {"Shan-Yu", "LoD"}, + {"Riku", "LoD"}, + {"Storm Rider", "LoD"}, + // + {"Scar", "PL"}, + {"Groundshaker", "PL"}, + //STT + {"Twilight Thorn", "STT"}, + {"Hayner", "STT"}, + {"Vivi", "STT"}, + {"Setzer", "STT"}, + // + {"Seifer", "STT"}, + {"Seifer (1)", "STT"}, + {"Seifer (2)", "STT"}, + {"Seifer (3)", "TT"}, + {"Seifer (4)", "TT"}, + // + {"Sephiroth", "HB"}, + {"Terra", "DC"}, + // + {"Hades I", "OC"}, //should probably skip this one for hinting and whatnot + {"Hades Escape", "OC" }, //should probably skip this one for hinting and whatnot + {"Cerberus", "OC"}, + {"Pete OC II", "OC"}, + {"Hydra", "OC"}, + {"Hades II", "OC"}, + {"Hades II (1)", "OC"}, + //Cups + {"Blizzard Lord (Cups)", "OC"}, + {"Volcano Lord (Cups)", "OC"}, + {"Cerberus (Cups)", "OC"}, + {"Hercules", "OC"}, + {"Hades Cups", "OC"}, + {"Pete Cups", "OC"}, + {"Cloud", "OC"}, + {"Cloud (1)", "OC"}, + {"Cloud (2)", "OC"}, + {"Leon", "OC"}, + {"Leon (1)", "OC"}, + {"Leon (2)", "OC"}, + {"Leon (3)", "OC"}, + {"Tifa", "OC"}, + {"Tifa (1)", "OC"}, + {"Tifa (2)", "OC"}, + {"Yuffie", "OC"}, + {"Yuffie (1)", "OC"}, + {"Yuffie (2)", "OC"}, + {"Yuffie (3)", "OC"}, + }; + + public static List bossDups = new List() + { + {"Hades Escape"}, + {"Hades I"}, + {"Hades II"}, + {"Blizzard Lord (Cups)"}, + {"Volcano Lord (Cups)"}, + {"Cerberus (Cups)"}, + {"Hades Cups"}, + {"Pete Cups"}, + {"Pete OC II"}, + {"Cloud (1)"}, + {"Cloud (2)"}, + {"Leon (1)"}, + {"Leon (2)"}, + {"Leon (3)"}, + {"Tifa (1)"}, + {"Tifa (2)"}, + {"Yuffie (1)"}, + {"Yuffie (2)"}, + {"Yuffie (3)"}, + //NOTE: temp solution, just don't hint seifer at all for now. + //seifer 1 is always shadow roxas as of this note and all other seifers except tutorial don't work + {"Seifer"}, + {"Seifer (1)"}, + {"Seifer (2)"}, + {"Seifer (3)"}, + {"Seifer (4)"}, + }; + + public static Dictionary getColors = new Dictionary() + { + {"Sora's Heart", "Pink" }, + {"Drive Forms", "Gold" }, + {"Simulated Twilight Town", "WhiteBlue" }, + {"Twilight Town", "Orange" }, + {"Hollow Bastion", "Pink" }, + {"Beast's Castle", "Pink" }, + {"Olympus Coliseum", "Green" }, + {"Agrabah", "Gold" }, + {"Land of Dragons", "Red" }, + {"Hundred Acre Wood", "Gold" }, + {"Pride Lands", "Red" }, + {"Disney Castle", "LightBlue" }, + {"Halloween Town", "Purple" }, + {"Port Royal", "DarkBlue" }, + {"Space Paranoids", "DarkBlue" }, + {"TWTNW", "White" }, + {"Atlantica", "LightBlue" }, + {"Creations", "Pink"}, + {"GoA", "WhiteBlue"}, + {"Secret Ansem's Report 1", "White"}, + {"Secret Ansem's Report 2", "White"}, + {"Secret Ansem's Report 3", "White"}, + {"Secret Ansem's Report 4", "White"}, + {"Secret Ansem's Report 5", "White"}, + {"Secret Ansem's Report 6", "White"}, + {"Secret Ansem's Report 7", "White"}, + {"Secret Ansem's Report 8", "White"}, + {"Secret Ansem's Report 9", "White"}, + {"Secret Ansem's Report 10", "White"}, + {"Secret Ansem's Report 11", "White"}, + {"Secret Ansem's Report 12", "White"}, + {"Secret Ansem's Report 13", "White"}, + {"Valor Form", "Red"}, + {"Wisdom Form", "LightBlue"}, + {"Limit Form", "Orange"}, + {"Master Form", "Gold"}, + {"Final Form", "White"}, + {"Anti-Form", "DarkBlue"}, + {"Once More", "LightBlue"}, + {"Second Chance", "Green"}, + {"Baseball Charm", "Gold"}, + {"Lamp Charm", "Purple"}, + {"Ukulele Charm", "LightBlue"}, + {"Feather Charm", "Red"}, + {"Proof of Connection", "OffWhite"}, + {"Proof of Nonexistence", "OffWhite"}, + {"Proof of Peace", "OffWhite"}, + {"Promise Charm", "Pink"}, + {"Battlefields of War", "Green"}, + {"Sword of the Ancestor", "Orange"}, + {"Beast's Claw", "Pink"}, + {"Bone Fist", "Purple"}, + {"Proud Fang", "Red"}, + {"Skill and Crossbones", "DarkBlue"}, + {"Scimitar", "Gold"}, + {"Identity Disk", "DarkBlue"}, + {"Membership Card", "Purple"}, + {"Ice Cream", "LightBlue"}, + {"Picture", "Orange"}, + {"Hades Cup Trophy", "DarkBlue"}, + {"Olympus Stone", "Gold"}, + {"Unknown Disk", "White"}, + {"Munny Pouch", "Red"}, + {"Fire Element", "Orange" }, + {"Blizzard Element", "DarkBlue" }, + {"Thunder Element", "Gold" }, + {"Cure Element", "Green" }, + {"Magnet Element", "Pink" }, + {"Reflect Element", "WhiteBlue" }, + {"Torn Pages", "Gold" } + }; + + public static Dictionary HashInt = new Dictionary + { + {"ability-unequip", 1}, + {"accessory", 2}, + {"ai-mode-frequent", 3}, + {"ai-mode-moderate", 4}, + {"ai-mode-rare", 5}, + {"ai-settings", 6}, + {"armor", 7}, + {"button-circle", 8}, + {"button-cross", 9}, + {"button-l1", 10}, + {"button-l2", 11}, + {"button-r1", 12}, + {"button-r2", 13}, + {"button-square", 14}, + {"button-triangle", 15}, + {"exclamation-mark", 16}, + {"form", 17}, + {"gumi-block", 18}, + {"gumi-blueprint", 19}, + {"gumi-brush", 20}, + {"gumi-gear", 21}, + {"gumi-ship", 22}, + {"item-consumable", 23}, + {"item-key", 24}, + {"item-tent", 25}, + {"magic", 26}, + {"material", 27}, + {"party", 28}, + {"question-mark", 29}, + {"rank-a", 30}, + {"rank-b", 31}, + {"rank-c", 32}, + {"rank-s", 33}, + {"weapon-keyblade", 34}, + {"weapon-shield", 35}, + {"weapon-staff", 36} + }; + + //private Dictionary GetItemPool = new Dictionary() + //{ + // {"Report1", 0}, + // {"Report2", 0}, + // {"Report3", 0}, + // {"Report4", 0}, + // {"Report5", 0}, + // {"Report6", 0}, + // {"Report7", 0}, + // {"Report8", 0}, + // {"Report9", 0}, + // {"Report10", 0}, + // {"Report11", 0}, + // {"Report12", 0}, + // {"Report13", 0}, + // {"Fire1", 1}, + // {"Fire2", 1}, + // {"Fire3", 1}, + // {"Blizzard1", 1}, + // {"Blizzard2", 1}, + // {"Blizzard3", 1}, + // {"Thunder1", 1}, + // {"Thunder2", 1}, + // {"Thunder3", 1}, + // {"Cure1", 1}, + // {"Cure2", 1}, + // {"Cure3", 1}, + // {"HadesCup", 1}, + // {"OlympusStone", 1}, + // {"Reflect1", 2}, + // {"Reflect2", 2}, + // {"Reflect3", 2}, + // {"Magnet1", 2}, + // {"Magnet2", 2}, + // {"Magnet3", 2}, + // {"Valor", 2}, + // {"Wisdom", 2}, + // {"Limit", 2}, + // {"Master", 2}, + // {"Final", 2}, + // {"Anti", 2}, + // {"OnceMore", 2}, + // {"SecondChance", 2}, + // {"UnknownDisk", 3}, + // {"TornPage1", 3}, + // {"TornPage2", 3}, + // {"TornPage3", 3}, + // {"TornPage4", 3}, + // {"TornPage5", 3}, + // {"Baseball", 3}, + // {"Lamp", 3}, + // {"Ukulele", 3}, + // {"Feather", 3}, + // {"Connection", 3}, + // {"Nonexistence", 3}, + // {"Peace", 3}, + // {"PromiseCharm", 3}, + // {"BeastWep", 4}, + // {"JackWep", 4}, + // {"SimbaWep", 4}, + // {"AuronWep", 4}, + // {"MulanWep", 4}, + // {"SparrowWep", 4}, + // {"AladdinWep", 4}, + // {"TronWep", 4}, + // {"MembershipCard", 4}, + // {"Picture", 4}, + // {"IceCream", 4}, + // {"Ghost_Report1", 5}, + // {"Ghost_Report2", 5}, + // {"Ghost_Report3", 5}, + // {"Ghost_Report4", 5}, + // {"Ghost_Report5", 5}, + // {"Ghost_Report6", 5}, + // {"Ghost_Report7", 5}, + // {"Ghost_Report8", 5}, + // {"Ghost_Report9", 5}, + // {"Ghost_Report10", 5}, + // {"Ghost_Report11", 5}, + // {"Ghost_Report12", 5}, + // {"Ghost_Report13", 5}, + // {"Ghost_Fire1", 6}, + // {"Ghost_Fire2", 6}, + // {"Ghost_Fire3", 6}, + // {"Ghost_Blizzard1", 6}, + // {"Ghost_Blizzard2", 6}, + // {"Ghost_Blizzard3", 6}, + // {"Ghost_Thunder1", 6}, + // {"Ghost_Thunder2", 6}, + // {"Ghost_Thunder3", 6}, + // {"Ghost_Cure1", 6}, + // {"Ghost_Cure2", 6}, + // {"Ghost_Cure3", 6}, + // {"Ghost_HadesCup", 6}, + // {"Ghost_OlympusStone", 6}, + // {"Ghost_Reflect1", 7}, + // {"Ghost_Reflect2", 7}, + // {"Ghost_Reflect3", 7}, + // {"Ghost_Magnet1", 7}, + // {"Ghost_Magnet2", 7}, + // {"Ghost_Magnet3", 7}, + // {"Ghost_Valor", 7}, + // {"Ghost_Wisdom", 7}, + // {"Ghost_Limit", 7}, + // {"Ghost_Master", 7}, + // {"Ghost_Final", 7}, + // {"Ghost_Anti", 7}, + // {"Ghost_OnceMore", 7}, + // {"Ghost_SecondChance", 7}, + // {"Ghost_UnknownDisk", 8}, + // {"Ghost_TornPage1", 8}, + // {"Ghost_TornPage2", 8}, + // {"Ghost_TornPage3", 8}, + // {"Ghost_TornPage4", 8}, + // {"Ghost_TornPage5", 8}, + // {"Ghost_Baseball", 8}, + // {"Ghost_Lamp", 8}, + // {"Ghost_Ukulele", 8}, + // {"Ghost_Feather", 8}, + // {"Ghost_Connection", 8}, + // {"Ghost_Nonexistence", 8}, + // {"Ghost_Peace", 8}, + // {"Ghost_PromiseCharm", 8}, + // {"Ghost_BeastWep", 9}, + // {"Ghost_JackWep", 9}, + // {"Ghost_SimbaWep", 9}, + // {"Ghost_AuronWep", 9}, + // {"Ghost_MulanWep", 9}, + // {"Ghost_SparrowWep", 9}, + // {"Ghost_AladdinWep", 9}, + // {"Ghost_TronWep", 9}, + // {"Ghost_MembershipCard", 9}, + // {"Ghost_Picture", 9}, + // {"Ghost_IceCream", 9} + //}; + + //Code Lists + + string[] Default = new string[] + { + "HollowBastion", + "TwilightTown", + "TWTNW", + "BeastsCastle", + "OlympusColiseum", + "PortRoyal", + "HollowBastion", + "TWTNW", + "TWTNW", + "TwilightTown", + "TWTNW", + "TWTNW", + "TWTNW" + }; + + string[] Free = new string[] { + "11CE05E2", + "11CE05EE", + "11CE05FA", + "11D18DDE", + "11D18DDC", + "11D18DE8", + "11D18DE4", + "11D18DE6", + "11D18DE0", + "11D18DE2" }; + + string[] SimulatedTwilightTown = new string[] { + "11CE016E", + "11CE017A", + "11CE0186", + "11CE0192", + "11CE019E", + "11CE01AA", + "11CE01B6", + "11CE01C2", + "11CE01CE", + "11CE01DA", + "11CE01E6", + "11CE01F2", + "11CE01FE", + "11CE020A", + "11CE0216", + "11CE0222", + "21D10FA8", + "21D10CB8", + "21D11278", + "11CE0636", + "11CE0606", + "11CE0612", + "11CE061E", + "11CE062A", + "11CE0642", + "11CE064E", + + "11CE0B0A"}; // data roxas + + string[] TwilightTown = new string[] { + "11CE022E", + "11CE023A", + "11CE0246", + "11CE0252", + "11CE025E", + "11CE026A", + "11CE0276", + "11CE0282", + "11CE028E", + "11CE029A", + "11CE02A6", + "11CE02B2", + "11CE02BE", + "11CE02CA", + "11CE02D6", + "11CE02E2", + "11CE02EE", + "11CE02FA", + "11CE0306", + "11CE0312", + "11CE031E", + "11CE032A", + "11CE0336", + "11CE0342", + "11CE034E", + "11CE035A", + "11CE0366", + "11CE0372", + "11CE037E", + "11CE038A", + "11CE0396", + "11CE03A2", + "11CE03AE", + "11CE03BA", + "11CE03C6", + "11CE03D2", + "11CE03DE", + "11CE03EA", + "11CE03F6", + "21D110E8", + "11CE065A", + "11CE0666", + "11CE0672", + "11CE067E", + "11CE07E6", + "11CE07F2", + "11CE07FE", + "11CE0966", + "11CE09AE", + "11CE0A0E", + + "11CE0ACE" }; //data axel + + string[] HollowBastion = new string[] { + "11CDFF3A", + "11CDFF46", + "11CDFF52", + "11CDFF5E", + "11CDFF6A", + "11CDFF76", + "11CDFF82", + "11CDFF8E", + "11CDFF9A", + "11CDFFA6", + "11CDFFB2", + "11CDFFBE", + "11CDFFCA", + "11CDFFD6", + "11CDFFE2", + "11CDFFEE", + "11CDFFFA", + "11CE0006", + "11CE0012", + "11CE001E", + "11CE002A", + "11CE0036", + "21D10E98", + "21D10BA8", + "21D11068", + "11CE068A", + "11CE0696", + "11CE06A2", + "11CE0702", + "11CE080A", + "11CE0822", + "11CE082E", + "11CE083A", + "11CE0936", + "11CE0942", + "11CE09A2", + "11CE09EA", + "11CE0B3A", //shroom + "11CE0B2E", //shroom + + "11CE04E6", //cor + "11CE04F2", + "11CE04FE", + "11CE050A", + "11CE0516", + "11CE0522", + "11CE052E", + "11CE053A", + "11CE0546", + "11CE0552", + "11CE055E", + "11CE056A", + "11CE0576", + "11CE0582", + "11CE058E", + "11CE059A", + "11CE05A6", + "11CE05B2", + "11CE05BE", + "11CE05CA", + "11CE05D6", + + "11CE0AB6" }; //data demyx + + string[] LandOfDragons = new string[] { + "11CDF72A", + "11CDF736", + "11CDF742", + "11CDF74E", + "11CDF75A", + "11CDF766", + "11CDF772", + "11CDF77E", + "11CDF78A", + "11CDF796", + "11CDF7A2", + "11CDF7AE", + "11CDF7BA", + "11CDF7C6", + "11CDF7D2", + "11CDF7DE", + "11CDF7EA", + "11CDF7F6", + "11CDF802", + "11CDF80E", + "11CDF81A", + "21D10DF8", + "21D108C8", + "21D10908", + "11CE06D2", + "11CE06C6", + "11CE06DE", + "11CE06EA", + + "11CE0AE6" }; //data xigbar + + string[] BeastsCastle = new string[] { + "11CDFBF2", + "11CDFBFE", + "11CDFC0A", + "11CDFC16", + "11CDFC22", + "11CDFC2E", + "11CDFC3A", + "11CDFC46", + "11CDFC52", + "11CDFC5E", + "11CDFC6A", + "11CDFC76", + "11CDFC82", + "11CDFC8E", + "11CDFC9A", + "11CDFCA6", + "11CDFCB2", + "11CDFCBE", + "11CDFCCA", + "11CDFCD6", + "11CDFCE2", + "21D10758", + "21D10788", + "21D107C8", + "11CE06F6", + "11CE0852", + "11CE085E", + "11CE09C6", + + "11CE0AC2" }; //data xaldin + + string[] OlympusColiseum = new string[] { + "11CDFB02", + "11CDFB0E", + "11CDFB1A", + "11CDFB26", + "11CDFB32", + "11CDFB3E", + "11CDFB4A", + "11CDFB56", + "11CDFB62", + "11CDFB6E", + "11CDFB7A", + "11CDFB86", + "11CDFB92", + "11CDFB9E", + "11CDFBAA", + "11CDFBB6", + "11CDFBC2", + "11CDFBCE", + "11CDFBDA", + "11CDFBE6", + "21D10808", + "21D10FE8", + "21D10828", + "21D10858", + "21D10888", + "11CE070E", + "11CE071A", + "11CE09D2", + "11CE0726", + "11CE0882", + "11CE088E", + + "11CE073E", //cups + "11CE074A", + "11CE07CE", + "11CE07DA", + "11CE089A", + "11CE08A6", + "11CE094E", + "11CE095A", + "11CE0996", //hades cup + + "11CE0A56", //AS zexion + "11CE0A92"}; //data zexion + + string[] DisneyCastle = new string[] { + "11CDF9B2", + "11CDF9BE", + "11CDF9CA", + "11CDF9D6", + "11CDF9E2", + "11CDF9EE", + "11CDF9FA", + "11CDFA06", + "21D10D28", + "11CE0756", + "11CE0B16", //terra + "11CE0B22", //terra + + "11CDF95E", //timeless river + "11CDF96A", + "11CDF976", + "11CDF982", + "11CDF98E", + "11CDF99A", + "11CDF9A6", + "21D10988", + "21D109B8", + "11CE076E", + "11CE0732", + "11CE0762", + + "11CE0A6E", //AS marluxia + "11CE0AAA"}; //data marluxia + + string[] PortRoyal = new string[] { + "11CDFE3E", + "11CDFE4A", + "11CDFE56", + "11CDFE62", + "11CDFE6E", + "11CDFE7A", + "11CDFE86", + "11CDFE92", + "11CDFE9E", + "11CDFEAA", + "11CDFEB6", + "11CDFEC2", + "11CDFECE", + "11CDFEDA", + "11CDFEE6", + "11CDFEF2", + "11CDFEFE", + "11CDFF0A", + "11CDFF16", + "11CDFF22", + "11CDFF2E", + "21D110B8", + "21D10AA8", + "21D11028", + "21D10AE8", + "11CE077A", + "11CE0786", + "11CE086A", + "11CE0876", + "11CE09DE", + + "11CE0AFE"}; //data luxord + + string[] Agrabah = new string[] { + "11CDF826", + "11CDF832", + "11CDF83E", + "11CDF84A", + "11CDF856", + "11CDF862", + "11CDF86E", + "11CDF87A", + "11CDF886", + "11CDF892", + "11CDF89E", + "11CDF8AA", + "11CDF8B6", + "11CDF8C2", + "11CDF8CE", + "11CDF8DA", + "11CDF8E6", + "11CDF8F2", + "11CDF8FE", + "11CDF90A", + "11CDF916", + "11CDF922", + "11CDF92E", + "11CDF93A", + "11CDF946", + "11CDF952", + "21D10DB8", + "21D10CE8", + "21D10978", + "11CE0792", + "11CE079E", + "11CE08B2", + + "11CE0A4A", //AS lexaeus + "11CE0A86"}; //data lexaeus + + string[] HalloweenTown = new string[] { + "11CDFD96", + "11CDFDA2", + "11CDFDAE", + "11CDFDBA", + "11CDFDC6", + "11CDFDD2", + "11CDFDDE", + "11CDFDEA", + "11CDFDF6", + "11CDFE02", + "11CDFE0E", + "11CDFE1A", + "11CDFE26", + "11CDFE32", + "21D109E8", + "11CE07AA", + "11CE08BE", + "11CE08CA", + "11CE08D6", + + "11CE0A3E", //AS vexen + "11CE0A7A"}; //data vexen + + string[] PrideLands = new string[] { + "11CE0042", + "11CE004E", + "11CE005A", + "11CE0066", + "11CE0072", + "11CE007E", + "11CE008A", + "11CE0096", + "11CE00A2", + "11CE00AE", + "11CE00BA", + "11CE00C6", + "11CE00D2", + "11CE00DE", + "11CE00EA", + "11CE00F6", + "11CE0102", + "11CE010E", + "11CE011A", + "11CE0126", + "11CE0132", + "11CE013E", + "11CE014A", + "11CE0156", + "11CE0162", + "21D10C18", + "11CE07B6", + "11CE07C2", + + "11CE0AF2"}; //data saix + + string[] Atlantica = new string[] { + "11CE0846", + "11CE08E2", + "11CE08EE", + "11CE08FA"}; + + string[] AcreWood = new string[] { + "11CDFA12", + "11CDFA1E", + "11CDFA2A", + "11CDFA36", + "11CDFA42", + "11CDFA4E", + "11CDFA5A", + "11CDFA66", + "11CDFA72", + "11CDFA7E", + "11CDFA8A", + "11CDFA96", + "11CDFAA2", + "11CDFAAE", + "11CDFABA", + "11CDFAC6", + "11CDFAD2", + "11CDFADE", + "11CDFAEA", + "11CDFAF6", + "11CE0906", + "11CE0912", + "11CE091E", + "11CE092A"}; + + string[] SpaceParanoids = new string[] { + "11CDFCEE", + "11CDFCFA", + "11CDFD06", + "11CDFD12", + "11CDFD1E", + "11CDFD2A", + "11CDFD36", + "11CDFD42", + "11CDFD4E", + "11CDFD5A", + "11CDFD66", + "11CDFD72", + "11CDFD7E", + "11CDFD8A", + "21D10C38", + "21D11078", + "21D10C78", + "11CE0816", + "11CE0A62", //AS larxene + "11CE0A9E"}; //data larxene + + string[] TheWorldThatNeverWas = new string[] { + "11CE0402", + "11CE040E", + "11CE041A", + "11CE0426", + "11CE0432", + "11CE043E", + "11CE044A", + "11CE0456", + "11CE0462", + "11CE046E", + "11CE047A", + "11CE0486", + "11CE0492", + "11CE049E", + "11CE04AA", + "11CE04B6", + "11CE04C2", + "11CE04CE", + "11CE04DA", + "21D111E8", + "21D10B58", + "11CE0972", + "11CE097E", + "11CE098A", + "11CE09BA", + "11CE09F6", + "11CE0A02", + "11CE0A1A", + "11CE0A26", + "11CE0A32", + + "11CE0ADA"}; //data xemnas + + string[] Forms = new string[] { + "11D1A22E", //valor + "11D1A236", + "11D1A23E", + "11D1A246", + "11D1A24E", + "11D1A256", + "11D1A266", //wisdom + "11D1A26E", + "11D1A276", + "11D1A27E", + "11D1A286", + "11D1A28E", + "11D1A29E", //limit + "11D1A2A6", + "11D1A2AE", + "11D1A2B6", + "11D1A2BE", + "11D1A2C6", + "11D1A2D6", //master + "11D1A2DE", + "11D1A2E6", + "11D1A2EE", + "11D1A2F6", + "11D1A2FE", + "11D1A30E", //Final + "11D1A316", + "11D1A31E", + "11D1A326", + "11D1A32E", + "11D1A336"}; + + string[] Levels = new string[] { + "11D0B6C0", //Lvl 2 + "11D0B6E0", //Lvl 4 + "11D0B710", //Lvl 7 + "11D0B730", //Lvl 9 + "11D0B740", //Lvl 10 + "11D0B760", //Lvl 12 + "11D0B780", //Lvl 14 + "11D0B790", //Lvl 15 + "11D0B7B0", //Lvl 17 + "11D0B7E0", //Lvl 20 + "11D0B810", //Lvl 23 + "11D0B830", //Lvl 25 + "11D0B860", //Lvl 28 + "11D0B880", //Lvl 30 + "11D0B8A0", //Lvl 32 + "11D0B8C0", //Lvl 34 + "11D0B8E0", //Lvl 36 + "11D0B910", //Lvl 39 + "11D0B930", //Lvl 41 + "11D0B960", //Lvl 44 + "11D0B980", //Lvl 46 + "11D0B9A0", //Lvl 48 + "11D0B9C0", //Lvl 50 + + "11D0B6D0", //Lvl 3 + "11D0B6F0", //Lvl 5 + "11D0B700", //Lvl 6 + "11D0B720", //Lvl 8 + "11D0B750", //Lvl 11 + "11D0B770", //Lvl 13 + "11D0B7A0", //Lvl 16 + "11D0B7C0", //Lvl 18 + "11D0B7D0", //Lvl 19 + "11D0B7F0", //Lvl 21 + "11D0B800", //Lvl 22 + "11D0B820", //Lvl 24 + "11D0B840", //Lvl 26 + "11D0B850", //Lvl 27 + "11D0B870", //Lvl 29 + "11D0B890", //Lvl 31 + "11D0B8B0", //Lvl 33 + "11D0B8D0", //Lvl 35 + "11D0B8F0", //Lvl 37 + "11D0B920", //Lvl 40 + "11D0B940", //Lvl 42 + "11D0B950", //Lvl 43 + "11D0B970", //Lvl 45 + "11D0B990", //Lvl 47 + "11D0B9B0", //Lvl 49 + + "11D0B9D0", //Lvl 51-99 + "11D0B9E0", + "11D0B9F0", + "11D0BA00", + "11D0BA10", + "11D0BA20", + "11D0BA30", + "11D0BA40", + "11D0BA50", + "11D0BA60", + "11D0BA70", + "11D0BA80", + "11D0BA90", + "11D0BAA0", + "11D0BAB0", + "11D0BAC0", + "11D0BAD0", + "11D0BAE0", + "11D0BAF0", + "11D0BB00", + "11D0BB10", + "11D0BB20", + "11D0BB30", + "11D0BB40", + "11D0BB50", + "11D0BB60", + "11D0BB70", + "11D0BB80", + "11D0BB90", + "11D0BBA0", + "11D0BBB0", + "11D0BBC0", + "11D0BBD0", + "11D0BBE0", + "11D0BBF0", + "11D0BC00", + "11D0BC10", + "11D0BC20", + "11D0BC30", + "11D0BC40", + "11D0BC50", + "11D0BC60", + "11D0BC70", + "11D0BC80", + "11D0BC90", + "11D0BCA0", + "11D0BCB0", + "11D0BCC0", + "11D0BCD0"}; + } +} diff --git a/KhTracker/Core/Data.cs b/KhTracker/Core/Data.cs new file mode 100644 index 00000000..0f7a87ae --- /dev/null +++ b/KhTracker/Core/Data.cs @@ -0,0 +1,245 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Media.Imaging; +using KhTracker.Hotkeys; + +namespace KhTracker +{ + public class Data + { + public Mode mode = Mode.None; + public bool hintsLoaded = false; + public Button selected = null; + public bool dragDrop = true; + public bool ScoreMode = false; + public int usedPages = 0; + public bool forcedFinal; + public bool dataSplit = false; + public string seedgenVersion = ""; + public bool altFinalTracking = false; + public int convertedSeedHash = 0; + public string[] seedHashVisual = null; + public bool ShouldResetHash = true; + public bool SeedHashLoaded = false; + public bool SpoilerWorldCompletion = false; + public bool SpoilerReportMode = false; + public string openKHHintText = "None"; + public string openKHBossText = "None"; + public string[] hintFileText = new string[3]; + public bool legacyJsmartee = false; + public bool legacyShan = false; + public string[] shanHintFileText = null; + public bool saveFileLoaded = false; + public bool seedLoaded = false; + public int lastVersion = 0; + public bool wasTracking = false; + public Codes codes = new Codes(); + + //Report stuff + public List> reportInformation = new List>(); + public List reportLocations = new List(); + public List reportLocationsUsed = new List() { false, false, false, false, false, false, false, false, false, false, false, false, false }; + public List reportAttempts = new List() { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; + public List ReportAttemptVisual = new List(); + + //extra world stuff + public Dictionary> ProgressKeys = new Dictionary>(); + public Dictionary WorldsTop = new Dictionary(); + public Dictionary WorldsData = new Dictionary(); + + //Item lists + public List Reports = new List(); + public List TornPages = new List(); + public List VisitLocks = new List(); + public Dictionary> Items = new Dictionary>(); + + //event tracking + public List> eventLog = new List>(); + public List> bossEventLog = new List>(); + + //auto-detect + public BitmapImage AD_Connect; + public BitmapImage AD_PC; + public BitmapImage AD_PCred; + public BitmapImage AD_PS2; + public BitmapImage AD_Cross; + + //for points hints + public Dictionary GhostItems = new Dictionary(); + public Dictionary PointsDatanew = new Dictionary() + { + //items + { "proof", 0 }, + { "form", 0 }, + { "magic", 0 }, + { "summon", 0 }, + { "ability", 0 }, + { "page", 0 }, + { "report", 0 }, + { "other", 0}, + { "visit", 0}, + //bossrelated + { "boss_as", 0 }, + { "boss_datas", 0 }, + { "boss_sephi", 0 }, + { "boss_terra", 0 }, + { "boss_other", 0 }, + { "boss_final", 0 }, + //other + { "complete", 0 }, + { "bonus", 0 }, + { "formlv", 0 }, + { "deaths", 0 }, + //collection bonus + { "collection_magic", 0 }, + { "collection_page", 0 }, + { "collection_pouches", 0}, + + { "collection_proof", 0 }, + { "collection_form", 0 }, + { "collection_summon", 0 }, + { "collection_ability", 0 }, + { "collection_report", 0 }, + { "collection_visit", 0}, + }; + public static Dictionary> WorldItems = new Dictionary>(); + public List TrackedReports = new List(); + public List SpoilerRevealTypes = new List(); + + //for boss rando points + public bool BossRandoFound = false; + public Dictionary BossList = new Dictionary(); + public List enabledWorlds = new List(); + //for boss rando progression + public string progressionType = "Disabled"; + public List> progBossInformation = new List>(); + + //Progression JsmarteeHints stuff + public bool UsingProgressionHints = false; + public int ProgressionPoints = 0; + public int TotalProgressionPoints = 0; + public int WorldsEnabled = 0; + public bool revealFinalXemnas = false; + + #region Hint Order Logic + public List HintCosts = new List() { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10 }; + //public int NumOfHints = 20; + public int ProgressionCurrentHint = 0; + public List HintRevealOrder = new List(); + public List> HintRevealsStored = new List>(); + public bool synthOn = false; + public bool puzzlesOn = false; + public bool calulating = false; + public List previousWorldsHinted = new List(); + #endregion + + #region Bonuses and Sora/Drive Levels + public int ReportBonus = 1; + public int WorldCompleteBonus = 0; + public Dictionary StoredWorldCompleteBonus = new Dictionary() + { + { "SorasHeart", 0 }, + { "DriveForms", 0 }, + { "SimulatedTwilightTown", 0 }, + { "TwilightTown", 0 }, + { "HollowBastion", 0 }, + { "BeastsCastle", 0 }, + { "OlympusColiseum", 0 }, + { "Agrabah", 0 }, + { "LandofDragons", 0 }, + { "HundredAcreWood", 0 }, + { "PrideLands", 0 }, + { "DisneyCastle", 0 }, + { "HalloweenTown", 0 }, + { "PortRoyal", 0 }, + { "SpaceParanoids", 0 }, + { "TWTNW", 0 }, + { "GoA", 0 }, + { "Atlantica", 0 }, + { "PuzzSynth", 0 } + }; + // Sora Level - 10 20 30 40 50 + public List Levels_ProgressionValues = new List() { 1, 1, 1, 2, 4 }; + public int LevelsPreviousIndex = 0; + public int NextLevelMilestone = 9; + // Drive Level - 2 3 4 5 6 7 + public List Drives_ProgressionValues = new List() { 0, 0, 0, 1, 0, 2 }; + public List DriveLevels = new List() { 1, 1, 1, 1, 1 }; + #endregion + + #region World Progression Values + public List STT_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8 }; + public List TT_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7 }; + public List HB_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + public List CoR_ProgressionValues = new List() { 0, 0, 0, 0, 0 }; + public List BC_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7 }; + public List OC_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + public List AG_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8 }; + public List LoD_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + public List HAW_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6 }; + public List PL_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7 }; + public List AT_ProgressionValues = new List() { 1, 2, 3 }; + public List DC_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + public List HT_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8 }; + public List PR_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + public List SP_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6 }; + public List TWTNW_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7 }; + #endregion + + //Hotkey stuff + public bool usedHotkey = false; + public GlobalHotkey startAutoTracker1, startAutoTracker2; + } + + public class WorldData + { + public bool hinted; //currently hinted? (for hinted hint logic) + public bool hintedHint; //currently hinted hint? + //Progression JsmarteeHints + public bool hintedProgression; + public bool complete; //are all checks found? + public int progress; //current world progression + public bool containsGhost; //contains ghost item? + public int visitLocks; //visit lock progress + + public List checkCount = new List(); + + public Grid top; + public Button world; + public ContentControl progression; + public OutlinedTextBlock value; + public WorldGrid worldGrid; + + public WorldData(Grid Top, Button World, ContentControl Progression, OutlinedTextBlock Value, WorldGrid itemgrid, bool Hinted, int VisitLock) + { + top = Top; + world = World; + progression = Progression; + value = Value; + worldGrid = itemgrid; + hinted = Hinted; + hintedHint = false; + complete = false; + progress = 0; + containsGhost = false; + visitLocks = VisitLock; + } + } + + public enum Mode + { + JsmarteeHints, + ShanHints, + OpenKHJsmarteeHints, + OpenKHShanHints, + PointsHints, + PathHints, + SpoilerHints, + None + } +} \ No newline at end of file diff --git a/KhTracker/Core/HintModes.cs b/KhTracker/Core/HintModes.cs new file mode 100644 index 00000000..f9e5e780 --- /dev/null +++ b/KhTracker/Core/HintModes.cs @@ -0,0 +1,1940 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.IO; +using System.IO.Compression; +using Microsoft.Win32; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Windows.Input; +using System.Security.Cryptography; +using System.Security.Policy; +using System.Windows.Documents; +using System.Windows.Forms; +using System.Reflection; +using System.Windows.Markup; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar; +using System.Windows.Shapes; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolBar; + +namespace KhTracker +{ + public partial class MainWindow + { + private void ShanHints(Dictionary hintObject) + { + data.ShouldResetHash = true; + var worlds = JsonSerializer.Deserialize>>(hintObject["world"].ToString()); + + //Joke JsmarteeHints test + bool debug = false; + if (debug) + { + var random = new Random(); + List usedvalues = new List(); + for (int i = 1; i <= 13; i++) //do this for each of the 13 reports + { + //get random number + int index = random.Next(JokeHints.Count); + + //should never happen, but might as well make a failsafe + if (usedvalues.Count == JokeHints.Count) + usedvalues.Clear(); + + //prevent the same hint appearing in multiple reports + while (usedvalues.Contains(index)) + index = random.Next(JokeHints.Count); + + //add joke hint to report + string joke = JokeHints[index]; + data.reportInformation.Add(new Tuple(joke, joke, -99)); //-99 is used to define the report as a joke + data.reportLocations.Add("Joke"); //location "Joke" used so that the tracker doesn't actually care where the hint is placed (doesn't matter for shan hints) + + usedvalues.Add(index); + } + + //start adding score data + if (data.ScoreMode) + ScoreModifier(hintObject); + + //turn reports back on + //ReportsToggle(true); + data.hintsLoaded = true; + } + + //TEMP + SortedDictionary TEMP = new SortedDictionary(); + foreach (var world in worlds) + { + foreach (var item in world.Value) + { + if (item.StartsWith("Secret")) + { + int index = int.Parse(item.Remove(0, 21)) - 1; + Console.WriteLine(index + " - " + Codes.ConvertSeedGenName(world.Key) + " _ " + item); + TEMP.Add(index, Codes.ConvertSeedGenName(world.Key)); + } + } + } + + //fix for using starting reports option + if (TEMP.Count < 13 && data.progressionType != "Disabled") + { + for (int i = 0; i < 13; ++i) + { + if (!ShanReportLocationFix(TEMP, i)) + { + TEMP.Add(i, "GoA"); + } + + if (TEMP.Count == 13) + break; + } + } + + if (TEMP.Count == 13 && data.progressionType != "Disabled") + { + foreach (var item in TEMP) + { + Console.WriteLine(item.Value + " | " + item.Key); + data.reportLocations.Add(item.Value); + } + + data.hintsLoaded = true; + } + + foreach (var world in worlds) + { + if (world.Key == "Critical Bonuses" || world.Key == "Garden of Assemblage") + { + continue; + } + foreach (var item in world.Value) + { + data.WorldsData[Codes.ConvertSeedGenName(world.Key)].checkCount.Add(Codes.ConvertSeedGenName(item)); + } + //for progression hints + //data.reportInformation.Add(new Tuple(world.Key, null, 0)); + } + + if (data.progressionType != "Reports") + { + foreach (var key in data.WorldsData.Keys.ToList()) + { + if (key == "GoA") + continue; + + data.WorldsData[key].worldGrid.WorldComplete(); + SetWorldValue(data.WorldsData[key].value, 0); + } + } + + SetProgressionHints(data.UsingProgressionHints); + } + + private bool ShanReportLocationFix(SortedDictionary TEMP, int number) + { + try + { + string test = TEMP[number]; + } + catch + { + return false; + } + + return true; + } + + private void JsmarteeHints(Dictionary hintObject) + { + if (data.progressionType == "Reports") + { + //clear the reveal order since it assumes shans/points + data.WorldsEnabled = data.HintRevealOrder.Count; + data.HintRevealOrder.Clear(); + } + + data.ShouldResetHash = true; + var reports = JsonSerializer.Deserialize>>(hintObject["Reports"].ToString()); + List reportKeys = reports.Keys.Select(int.Parse).ToList(); + reportKeys.Sort(); + + foreach (var report in reportKeys) + { + var world = Codes.ConvertSeedGenName(reports[report.ToString()]["World"].ToString()); + if (data.UsingProgressionHints && !data.puzzlesOn && world.ToString().Contains("PuzzSynth")) + continue; + var count = reports[report.ToString()]["Count"].ToString(); + var location = Codes.ConvertSeedGenName(reports[report.ToString()]["Location"].ToString()); + data.reportInformation.Add(new Tuple(null, world, int.Parse(count))); + data.reportLocations.Add(location); + } + + //start adding score data + if (data.ScoreMode) + ScoreModifier(hintObject); + + data.hintsLoaded = true; + + SetProgressionHints(data.UsingProgressionHints); + } + + private void PathHints(Dictionary hintObject) + { + if (data.progressionType == "Reports") + { + ProgressionPathHints(hintObject); + return; + } + + data.ShouldResetHash = true; + var worlds = JsonSerializer.Deserialize>>(hintObject["world"].ToString()); + var reports = JsonSerializer.Deserialize>>(hintObject["Reports"].ToString()); + List reportKeys = reports.Keys.Select(int.Parse).ToList(); + reportKeys.Sort(); + + foreach (var world in worlds) + { + if (world.Key == "Critical Bonuses" || world.Key == "Garden of Assemblage") + { + continue; + } + foreach (var item in world.Value) + { + data.WorldsData[Codes.ConvertSeedGenName(world.Key)].checkCount.Add(Codes.ConvertSeedGenName(item)); + } + + } + + foreach (var key in data.WorldsData.Keys.ToList()) + { + if (key == "GoA") + continue; + + data.WorldsData[key].worldGrid.WorldComplete(); + SetWorldValue(data.WorldsData[key].value, 0); + } + + foreach (int report in reportKeys) + { + var hinttext = reports[report.ToString()]["Text"].ToString(); + int hintproofs = 0; + var hintworld = Codes.ConvertSeedGenName(reports[report.ToString()]["HintedWorld"].ToString()); + var location = Codes.ConvertSeedGenName(reports[report.ToString()]["Location"].ToString()); + + //turn proof names to value. con = 1 | non = 10 | peace = 100 + List hintprooflist = new List(JsonSerializer.Deserialize>(reports[report.ToString()]["ProofPath"].ToString())); + foreach (string proof in hintprooflist) + { + switch (proof) + { + case "Connection": + hintproofs += 1; + break; + case "Nonexistence": + hintproofs += 10; + break; + case "Peace": + hintproofs += 100; + break; + } + } + + data.reportInformation.Add(new Tuple(hinttext, hintworld, hintproofs)); + data.reportLocations.Add(location); + } + + //set pathproof defaults + foreach (string key in data.WorldsData.Keys.ToList()) + { + //adjust grid sizes for path proof icons + data.WorldsData[key].top.ColumnDefinitions[1].Width = new GridLength(0.1, GridUnitType.Star); + + //get grid for path proof collumn and set visibility + Grid pathgrid = data.WorldsData[key].top.FindName(key + "Path") as Grid; + pathgrid.Visibility = Visibility.Visible; //main grid + foreach (Image child in pathgrid.Children) + { + child.Visibility = Visibility.Hidden; //each icon hidden by default + } + } + + //start adding score data + if (data.ScoreMode) + ScoreModifier(hintObject); + + data.hintsLoaded = true; + + SetProgressionHints(data.UsingProgressionHints); + } + + private void SpoilerHints(Dictionary hintObject) + { + if (data.progressionType == "Reports") + { + ProgressionSpoilerHints(hintObject); + return; + } + + bool TMP_bossReports = false; + data.ShouldResetHash = true; + var worlds = JsonSerializer.Deserialize>>(hintObject["world"].ToString()); + List reveals = new List(JsonSerializer.Deserialize>(hintObject["reveal"].ToString())); + var reports = JsonSerializer.Deserialize>>(hintObject["Reports"].ToString()); + List reportKeys = reports.Keys.Select(int.Parse).ToList(); + reportKeys.Sort(); + var hintableItems = new List(); + //fallback for older seeds + try + { + hintableItems = new List(JsonSerializer.Deserialize>(hintObject["hintableItems"].ToString())); + } + catch { } + + + //set if world value should change color on completion + if (reveals.Contains("complete")) + { + data.SpoilerWorldCompletion = true; + } + + //set if reports should reveal items or not + if (reveals.Contains("reportmode")) + { + data.SpoilerReportMode = true; + //ReportsToggle(true); + } + + //reports reveal bosses + if(reveals.Contains("bossreports")) + { + //ReportsToggle(true); + TMP_bossReports = true; + } + + Dictionary counts = new Dictionary + { + {"Fire", 1 }, {"Blizzard", 1 }, {"Thunder", 1 }, + {"Cure", 1 }, {"Magnet", 1 }, {"Reflect", 1}, + {"TornPage", 1}, {"MunnyPouch", 1}, + }; + + foreach (var world in worlds) + { + if (world.Key == "Critical Bonuses" || world.Key == "Garden of Assemblage") + { + continue; + } + foreach (string item in world.Value) + { + string worldname = Codes.ConvertSeedGenName(world.Key); + string checkname = Codes.ConvertSeedGenName(item); + + data.WorldsData[worldname].checkCount.Add(checkname); + + //add ghosts if report mode is off + if (!data.SpoilerReportMode) + { + //Skip adding ghosts for item types that aren't in reveals list + if (!reveals.Contains(Codes.FindItemType(item))) + { + continue; + } + + WorldGrid grid = data.WorldsData[worldname].worldGrid; + if (counts.Keys.ToList().Contains(checkname)) + { + grid.Add_Ghost(data.GhostItems["Ghost_" + checkname + counts[checkname]]); + counts[checkname] += 1; + } + else + { + grid.Add_Ghost(data.GhostItems["Ghost_" + checkname]); + } + } + } + } + + foreach (var key in data.WorldsData.Keys.ToList()) + { + if (key == "GoA") + continue; + + if (data.SpoilerWorldCompletion) + data.WorldsData[key].worldGrid.WorldComplete(); + SetWorldValue(data.WorldsData[key].value, 0); + } + + //add setup report info if report mode is on + if (data.SpoilerReportMode) + { + data.SpoilerRevealTypes.AddRange(reveals); + + foreach (var report in reportKeys) + { + string worldstring = reports[report.ToString()]["World"].ToString(); + int dummyvalue = 0; + if (worldstring.StartsWith("Nothing_")) + { + worldstring = worldstring.Remove(0, 8); + dummyvalue = -1; + } + + var worldhint = Codes.ConvertSeedGenName(worldstring); + var location = Codes.ConvertSeedGenName(reports[report.ToString()]["Location"].ToString()); + + data.reportInformation.Add(new Tuple(worldhint, null, dummyvalue)); + data.reportLocations.Add(location); + } + data.hintsLoaded = true; + } + else if (data.BossRandoFound && TMP_bossReports) + { + //get random based on seed hash + Random rand = new Random(data.convertedSeedHash); + + //setup lists + List keyList = new List(data.BossList.Keys); + + //Remove bosses for worlds not enabled and remove "duplicates" + foreach (var key in data.BossList.Keys) + { + //remove duplicates + if (Codes.bossDups.Contains(key)) + { + keyList.Remove(key); + continue; + } + + if (!data.enabledWorlds.Contains(Codes.bossLocations[key])) + keyList.Remove(key); + else if (key.Contains("(Data)")) + { + //special case for some datas. we normally don't want + //to hint datas unless the world the normally are in is off + // (only applies for datas where the data fight is in a different world) + switch(key) + { + case "Axel (Data)": + if (data.enabledWorlds.Contains("STT")) + keyList.Remove(key); + break; + case "Saix (Data)": + case "Luxord (Data)": + case "Roxas (Data)": + case "Xigbar (Data)": + if (data.enabledWorlds.Contains("TWTNW")) + keyList.Remove(key); + break; + default: + keyList.Remove(key); + break; + } + } + } + + //get report info + foreach (var report in reportKeys) + { + //get a boss + string boss = keyList[rand.Next(0, keyList.Count)]; + //get boss types + string origType = Codes.FindBossType(boss); + string replaceType = Codes.FindBossType(data.BossList[boss]); + + //prioritize special arenas and bosses (50%?) + while (origType == "boss_other" && replaceType == "boss_other") + { + int reroll = rand.Next(1, 10); + if (reroll > 5) //50% chance to keep basic bosses + { + break; + } + + boss = keyList[rand.Next(0, keyList.Count)]; + origType = Codes.FindBossType(boss); + replaceType = Codes.FindBossType(data.BossList[boss]); + } + + //report location and final hint string + string worldhint; + + if (boss == data.BossList[boss]) + { + string tmp_origBoss = boss; + if (tmp_origBoss == "Hades II (1)" || tmp_origBoss == "Hades II" || tmp_origBoss == "Hades I") + { + tmp_origBoss = "Hades"; + } + if (tmp_origBoss == "Pete OC II") + { + tmp_origBoss = "Pete OC"; + } + + worldhint = tmp_origBoss + " is unchanged"; + } + else + { + string tmp_origBoss = boss; + string tmp_replBoss = data.BossList[boss]; + + if (tmp_origBoss == "Hades II (1)" || tmp_origBoss == "Hades II" || tmp_origBoss == "Hades I") + { + tmp_origBoss = "Hades"; + } + if (tmp_origBoss == "Pete OC II") + { + tmp_origBoss = "Pete OC"; + } + + if (tmp_replBoss == "Hades II (1)" || tmp_replBoss == "Hades II" || tmp_replBoss == "Hades I") + { + tmp_replBoss = "Hades"; + } + if (tmp_replBoss == "Pete OC II") + { + tmp_replBoss = "Pete OC"; + } + + worldhint = tmp_origBoss + " became " + tmp_replBoss; + } + + int dummyvalue = -12345; //use this for boss reports i guess + data.reportInformation.Add(new Tuple(worldhint, null, dummyvalue)); + var location = Codes.ConvertSeedGenName(reports[report.ToString()]["Location"].ToString()); + data.reportLocations.Add(location); + + keyList.Remove(boss); + } + + data.hintsLoaded = true; + } + else if (hintableItems.Contains("report")) + { + //dummy blank text for reports + foreach (var report in reportKeys) + { + string worldstring = reports[report.ToString()]["World"].ToString(); + var worldhint = Codes.ConvertSeedGenName(worldstring); + var location = Codes.ConvertSeedGenName(reports[report.ToString()]["Location"].ToString()); + + data.reportInformation.Add(new Tuple(worldhint, "", -999)); + data.reportLocations.Add(location); + } + data.hintsLoaded = true; + } + + //start adding score data + if (data.ScoreMode) + ScoreModifier(hintObject); + + SetProgressionHints(data.UsingProgressionHints); + } + + private void ScoreModifier(Dictionary hintObject) + { + var points = JsonSerializer.Deserialize>(hintObject["checkValue"].ToString()); + + //set point values + foreach (var point in points) + { + if (data.PointsDatanew.Keys.Contains(point.Key)) + { + data.PointsDatanew[point.Key] = point.Value; + } + else + { + Console.WriteLine($"Something went wrong in setting point values. Unknown Key: {point.Key}"); + } + } + } + + /// + /// points hints and logic + /// + + //used to be a ton of ints + //split into two dictionarys now as it's much easier to handle and uses far less if statements. + private Dictionary WorldPoints = new Dictionary() + { + {"SimulatedTwilightTown", 0}, + {"TwilightTown", 0}, + {"HollowBastion", 0}, + {"LandofDragons", 0}, + {"BeastsCastle", 0}, + {"OlympusColiseum", 0}, + {"DisneyCastle", 0}, + {"PortRoyal", 0}, + {"Agrabah", 0}, + {"HalloweenTown", 0}, + {"PrideLands", 0}, + {"Atlantica", 0}, + {"HundredAcreWood", 0}, + {"SpaceParanoids", 0}, + {"TWTNW", 0}, + {"DriveForms", 0}, + {"SorasHeart", 0}, + {"PuzzSynth", 0} + }; + private Dictionary WorldPoints_c = new Dictionary() + { + {"SimulatedTwilightTown", 0}, + {"TwilightTown", 0}, + {"HollowBastion", 0}, + {"LandofDragons", 0}, + {"BeastsCastle", 0}, + {"OlympusColiseum", 0}, + {"DisneyCastle", 0}, + {"PortRoyal", 0}, + {"Agrabah", 0}, + {"HalloweenTown", 0}, + {"PrideLands", 0}, + {"Atlantica", 0}, + {"HundredAcreWood", 0}, + {"SpaceParanoids", 0}, + {"TWTNW", 0}, + {"DriveForms", 0}, + {"SorasHeart", 0}, + {"PuzzSynth", 0} + }; + + private void PointsHints(Dictionary hintObject) + { + data.ShouldResetHash = true; + + var worldsP = JsonSerializer.Deserialize>>(hintObject["world"].ToString()); + var reportsP = JsonSerializer.Deserialize>>(hintObject["Reports"].ToString()); + var points = JsonSerializer.Deserialize>(hintObject["checkValue"].ToString()); + + List reportKeysP = reportsP.Keys.Select(int.Parse).ToList(); + reportKeysP.Sort(); + + //set point values + foreach (var point in points) + { + if (data.PointsDatanew.Keys.Contains(point.Key)) + { + data.PointsDatanew[point.Key] = point.Value; + } + else + { + Console.WriteLine($"Something went wrong in setting point values. error: {point.Key}"); + } + } + + #region Points fallback and other stuff + //Fallback values for older seeds + if (!points.Keys.Contains("report")) + data.PointsDatanew["report"] = data.PointsDatanew["page"]; + if (!points.Keys.Contains("bonus")) + data.PointsDatanew["bonus"] = 10; + if (!points.Keys.Contains("complete")) + data.PointsDatanew["complete"] = 10; + if (!points.Keys.Contains("formlv")) + data.PointsDatanew["formlv"] = 3; + if (!points.Keys.Contains("visit")) + data.PointsDatanew["visit"] = 1; + if (!points.Keys.Contains("other")) + data.PointsDatanew["other"] = data.PointsDatanew["ability"]; + + if (!points.Keys.Contains("collection_proof")) + data.PointsDatanew["collection_proof"] = 0; + if (!points.Keys.Contains("collection_form")) + data.PointsDatanew["collection_form"] = 0; + if (!points.Keys.Contains("collection_magic")) + data.PointsDatanew["collection_magic"] = data.PointsDatanew["magic"]; + if (!points.Keys.Contains("collection_summon")) + data.PointsDatanew["collection_summon"] = 0; + if (!points.Keys.Contains("collection_ability")) + data.PointsDatanew["collection_ability"] = 0; + if (!points.Keys.Contains("collection_page")) + data.PointsDatanew["collection_page"] = data.PointsDatanew["collection_page"] * 5; + if (!points.Keys.Contains("collection_report")) + data.PointsDatanew["collection_report"] = 0; + if (!points.Keys.Contains("collection_pouches")) + data.PointsDatanew["collection_pouches"] = data.PointsDatanew["other"]; + if (!points.Keys.Contains("collection_visit")) + data.PointsDatanew["collection_visit"] = 0; + #endregion + + //get point totals for each world + foreach (var world in worldsP) + { + if (world.Key == "Critical Bonuses" || world.Key == "Garden of Assemblage") + { + continue; + } + foreach (var item in world.Value) + { + + string itemName = item; + string itemType = Codes.FindItemType(item); + + //Zero point items are not ICs + if (data.PointsDatanew[itemType] == 0) + continue; + + data.WorldsData[Codes.ConvertSeedGenName(world.Key)].checkCount.Add(Codes.ConvertSeedGenName(item)); + + //string itemType = Codes.FindItemType(item); + if (data.PointsDatanew.Keys.Contains(itemType)) + { + WorldPoints[Codes.ConvertSeedGenName(world.Key)] += data.PointsDatanew[itemType]; + } + else + { + Console.WriteLine($"Something went wrong in getting world points. error: {itemType}"); + } + } + } + + //set points for each world + if (data.progressionType != "Reports") + { + foreach (var key in data.WorldsData.Keys.ToList()) + { + if (key == "GoA") + continue; + + data.WorldsData[key].worldGrid.WorldComplete(); + + if (WorldPoints.Keys.Contains(key)) + { + SetWorldValue(data.WorldsData[key].value, WorldPoints[key]); + } + else + { + Console.WriteLine($"Something went wrong in setting world point numbers. error: {key}"); + } + } + } + + //set hints for each report + foreach (var reportP in reportKeysP) + { + var worldP = Codes.ConvertSeedGenName(reportsP[reportP.ToString()]["World"].ToString()); + var checkP = reportsP[reportP.ToString()]["check"].ToString(); + var locationP = Codes.ConvertSeedGenName(reportsP[reportP.ToString()]["Location"].ToString()); + + data.reportInformation.Add(new Tuple(worldP, checkP, 0)); + data.reportLocations.Add(locationP); + } + + //ReportsToggle(true); + data.hintsLoaded = true; + WorldPoints_c = WorldPoints; + SetProgressionHints(data.UsingProgressionHints); + } + + public int GetPoints(string worldName) + { + if (WorldPoints_c.Keys.Contains(worldName)) + { + return WorldPoints_c[worldName]; + } + else + { + return 0; + } + } + + public void SetPoints(string name, int value) + { + if (WorldPoints_c.Keys.Contains(name)) + { + WorldPoints_c[name] = value; + } + } + + public void UpdatePointScore(int points) + { + if (data.mode != Mode.PointsHints && !data.ScoreMode) + return; + + int WorldBlue = 0; + int num = PointTotal + points; //get new point total + PointTotal = num; //set new point total + + //adjust point score based on bonus and form levels + //do this after setting new PointTotal value to avoid score + //increasing forever when adding/removing items + if (aTimer != null) + { + int BonusTotal = stats.BonusLevel * data.PointsDatanew["bonus"]; + int Valorlv = (valor.VisualLevel - 1) * data.PointsDatanew["formlv"]; + int Wisdomlv = (wisdom.VisualLevel - 1) * data.PointsDatanew["formlv"]; + int Limitlv = (limit.VisualLevel - 1) * data.PointsDatanew["formlv"]; + int Masterlv = (master.VisualLevel - 1) * data.PointsDatanew["formlv"]; + int Finallv = (final.VisualLevel - 1) * data.PointsDatanew["formlv"]; + int Deaths = DeathCounter * data.PointsDatanew["deaths"]; + + num += BonusTotal + Valorlv + Wisdomlv + Limitlv + Masterlv + Finallv + Deaths; + } + + //add bonus points for completeing a world + foreach (var key in data.WorldsData.Keys.ToList()) + { + if (key == "GoA") + continue; + + if (data.WorldsData[key].complete && data.WorldsData[key].checkCount.Count != 0) + WorldBlue += data.PointsDatanew["complete"]; + } + num += WorldBlue; + + //add bonus points for collecting all multis in a set + if (data.PointsDatanew["collection_magic"] > 0) + { + if (WorldGrid.Real_Fire == 3) + num += data.PointsDatanew["collection_magic"]; + if (WorldGrid.Real_Blizzard == 3) + num += data.PointsDatanew["collection_magic"]; + if (WorldGrid.Real_Thunder == 3) + num += data.PointsDatanew["collection_magic"]; + if (WorldGrid.Real_Cure == 3) + num += data.PointsDatanew["collection_magic"]; + if (WorldGrid.Real_Magnet == 3) + num += data.PointsDatanew["collection_magic"]; + if (WorldGrid.Real_Reflect == 3) + num += data.PointsDatanew["collection_magic"]; + } + if (data.PointsDatanew["collection_page"] > 0) + { + if (WorldGrid.Real_Pages == 5) + num += data.PointsDatanew["collection_page"]; + } + if (data.PointsDatanew["collection_pouches"] > 0) + { + if (WorldGrid.Real_Pouches == 2) + num += data.PointsDatanew["collection_pouches"]; + } + if (data.PointsDatanew["collection_form"] > 0) + { + if (AntiFormOption.IsChecked) + { + if (WorldGrid.Form_Count == 6) + num += data.PointsDatanew["collection_form"]; + } + else + { + if (WorldGrid.Form_Count == 5) + num += data.PointsDatanew["collection_form"]; + } + } + if (data.PointsDatanew["collection_proof"] > 0) + { + if (PromiseCharmOption.IsChecked) + { + if (WorldGrid.Proof_Count == 4) + num += data.PointsDatanew["collection_proof"]; + } + else + { + if (WorldGrid.Proof_Count == 3) + num += data.PointsDatanew["collection_proof"]; + } + } + if (data.PointsDatanew["collection_summon"] > 0) + { + if (WorldGrid.Summon_Count == 4) + num += data.PointsDatanew["collection_summon"]; + } + if (data.PointsDatanew["collection_ability"] > 0) + { + if (WorldGrid.Ability_Count == 2) + num += data.PointsDatanew["collection_ability"]; + } + if (data.PointsDatanew["collection_visit"] > 0) + { + if (WorldGrid.Visit_Count == 11) + num += data.PointsDatanew["collection_visit"]; + } + if (data.PointsDatanew["collection_report"] > 0) + { + if (WorldGrid.Report_Count == 13) + num += data.PointsDatanew["collection_report"]; + } + + ScoreValue.Text = num.ToString(); + } + + //static public int WorldNameToIndex(string worldName) + //{ + // switch (worldName) + // { + // case "SorasHeart": + // return 0; + // case "DriveForms": + // return 1; + // case "SimulatedTwilightTown": + // return 2; + // case "TwilightTown": + // return 3; + // case "HollowBastion": + // return 4; + // case "BeastsCastle": + // return 5; + // case "OlympusColiseum": + // return 6; + // case "Agrabah": + // return 7; + // case "LandofDragons": + // return 8; + // case "HundredAcreWood": + // return 9; + // case "PrideLands": + // return 10; + // case "DisneyCastle": + // return 11; + // case "HalloweenTown": + // return 12; + // case "PortRoyal": + // return 13; + // case "SpaceParanoids": + // return 14; + // case "TWTNW": + // return 15; + // case "Atlantica": + // return 17; + // case "PuzzSynth": + // return 18; + // default: //GoA + // return 16; + // } + //} + + public List JokeHints = new List + { + "\"Call my shorty Zemnas the way she give me dome\" -Raisin", + "Have you tried contacting Tech Support Nomura?", + "Soul Eater is a Keyblade", + "Soul Eater is not a Keyblade", + "This report was is in the chest you just opened", + "I heard Xemnas is already half Xehanort", + "Bad luck and misfortune will infest your pathetic soul for all eternity", + "Have you tried freezing Demyx's bubbles?", + "Phil Cup hoards Pumpkinhead", + "Jungle Slider 50 Fruits has the Promise Charm", + "Put me back, please", + "They put bugs in Riku!", + "The knowledge, it fills me. It is neat.", + "Doubleflight is locked by winning Fruitball", + "Barbossa but with a squid face is holding Proof of Fantasies", + "Grinding 5000 munny in STT will reward you with 5000 munny", + "Two Cycling the Wardrobe Push will reward you with nothing", + "Have you considered enabling Dodge Slash?", + "Xehanort is a meany head", + "Computer Password: Sea Salt Ice Cream", + "A talking rat king showed up today and ate my ice cream", + "Oui fycdat ouin desa dnyhcmydehk drec", + "Roxas was placed into a simulation to mine bitcoin", + "Have you checked the third song of Atlantica?", + "Pull the pedestal to get the Master Form Keyblade", + "Violence is on the Path to Peace", + "Have you tried checking vanilla?", + "Stop is held by Ruler of the Sky", + "I heard that Sora can't read", + "Tron can be synthesized using two Gales and a Dark Matter", + "Steal Piglet's belongings before saving them", + "One of the Seven Seeing-stones can be found in DiZ's basement", + "Use the lock-on button to find the old lady's cat", + "The proof of owned lamers is on the 10th Seifer Struggle in TT3", + "Dog Street is on the Way of the Hero", + "Get up on the Hydra's back!", + "If only you could sell this useless hint", + "The dog in the sack in STT is Pluto's Nobody", + "Reading Yen Sid's book rewards you with confusion", + "Mission 3 of Asteroid Sweep is a foolish choice", + "Defeat Hayabusa to get Fireglow", + "Have you tried checking the world that takes place on Earth?", + "Defeating the Pirate Ship in Phantom Storm will reward with 300 crabs", + "Leon's real name is Smitty Werbenjägermanjensen", + "Need exp? Grind the Bolt Towers in Minnie Escort", + "Have you tried suplexing the Phantom Train in STT yet?", + "Collect the 7 Chaos Emeralds to unlock the Door to Darkness", + "Try to BLJ to cross the gap for COR skip", + "Before you attempt Shan Yu Skip, we need to talk about parallel universes", + "Jump, Aerial Dodge, Magnet", + "Found Genie? Consider DNFing if you have", + "Chicken Little can be found in Thanksgiving Town", + "It's Oogie Boogie, they put bugs in him!", + "Lion Dash can be found in the first room of Pride Lands", + "Doing 1k will make you a True Warrior of the Three Kingdoms", + "There's a free shield in the graveyard", + "Die it's faster", + "Piglet's grandpa's name is Trespassers Will", + "This is Auron's hint, and you're not a part of it", + "Be sure to have 7 ethers for the Hyenas fight", + "ARC, Reload!" + }; + + /// + /// progression hints and logic + /// + + private void ProgressionPathHints(Dictionary hintObject) + { + data.ShouldResetHash = true; + var worlds = JsonSerializer.Deserialize>>(hintObject["world"].ToString()); + var progHints = JsonSerializer.Deserialize>>(hintObject["Reports"].ToString()); + List progHintsKeys = progHints.Keys.Select(int.Parse).ToList(); + progHintsKeys.Sort(); + + foreach (var world in worlds) + { + if (world.Key == "Critical Bonuses" || world.Key == "Garden of Assemblage") + { + continue; + } + foreach (var item in world.Value) + { + data.WorldsData[Codes.ConvertSeedGenName(world.Key)].checkCount.Add(Codes.ConvertSeedGenName(item)); + } + } + + //done here for timing + SetProgressionHints(data.UsingProgressionHints); + + foreach (var key in data.WorldsData.Keys.ToList()) + { + if (key == "GoA") + continue; + + data.WorldsData[key].worldGrid.WorldComplete(); + SetWorldValue(data.WorldsData[key].value, 0); + } + + //locally track the worlds that are empty and contain the "has nothing, sorry" text + //then place these at the end of the hint list + List> tempReportInformation = new List>(); + List tempReportLocations = new List(); + foreach (int hint in progHintsKeys) + { + var hinttext = progHints[hint.ToString()]["Text"].ToString(); + int hintproofs = 0; + var hintworld = Codes.ConvertSeedGenName(progHints[hint.ToString()]["HintedWorld"].ToString()); + var location = Codes.ConvertSeedGenName(progHints[hint.ToString()]["Location"].ToString()); + + //turn proof names to value. con = 1 | non = 10 | peace = 100 + List hintprooflist = new List(JsonSerializer.Deserialize>(progHints[hint.ToString()]["ProofPath"].ToString())); + foreach (string proof in hintprooflist) + { + switch (proof) + { + case "Connection": + hintproofs += 1; + break; + case "Nonexistence": + hintproofs += 10; + break; + case "Peace": + hintproofs += 100; + break; + } + } + + if (hinttext.Contains("has nothing, sorry")) + tempReportInformation.Add(new Tuple(hinttext, hintworld, hintproofs)); + else + data.reportInformation.Add(new Tuple(hinttext, hintworld, hintproofs)); + data.reportLocations.Add(location); + } + + if (tempReportInformation.Count > 0) + { + foreach (var loc in tempReportInformation) + data.reportInformation.Add(loc); + foreach (var loc in tempReportLocations) + data.reportLocations.Add(loc); + } + + //set pathproof defaults + foreach (string key in data.WorldsData.Keys.ToList()) + { + //adjust grid sizes for path proof icons + data.WorldsData[key].top.ColumnDefinitions[1].Width = new GridLength(0.1, GridUnitType.Star); + + //get grid for path proof collumn and set visibility + Grid pathgrid = data.WorldsData[key].top.FindName(key + "Path") as Grid; + pathgrid.Visibility = Visibility.Visible; //main grid + foreach (Image child in pathgrid.Children) + { + child.Visibility = Visibility.Hidden; //each icon hidden by default + } + } + + //start adding score data + if (data.ScoreMode) + ScoreModifier(hintObject); + + //ReportsToggle(true); + data.hintsLoaded = true; + } + + private void ProgressionSpoilerHints(Dictionary hintObject) + { + bool TMP_bossReports = false; + data.ShouldResetHash = true; + var worlds = JsonSerializer.Deserialize>>(hintObject["world"].ToString()); + List reveals = new List(JsonSerializer.Deserialize>(hintObject["reveal"].ToString())); + var reports = JsonSerializer.Deserialize>>(hintObject["Reports"].ToString()); + List reportKeys = reports.Keys.Select(int.Parse).ToList(); + reportKeys.Sort(); + + //set if world value should change color on completion + if (reveals.Contains("complete")) + { + data.SpoilerWorldCompletion = true; + } + + //set if reports should reveal items or not + if (reveals.Contains("reportmode")) + { + data.SpoilerReportMode = true; + //ReportsToggle(true); + } + + //reports reveal bosses + if (reveals.Contains("bossreports")) + { + //ReportsToggle(true); + TMP_bossReports = true; + } + + //if (!reveals.Contains("reportmode") && !reveals.Contains("bossreports")) + // ReportsToggle(false); + + Dictionary counts = new Dictionary + { + {"Fire", 1 }, {"Blizzard", 1 }, {"Thunder", 1 }, + {"Cure", 1 }, {"Magnet", 1 }, {"Reflect", 1}, + {"TornPage", 1}, {"MunnyPouch", 1}, + }; + + foreach (var world in worlds) + { + if (world.Key == "Critical Bonuses" || world.Key == "Garden of Assemblage") + { + continue; + } + foreach (string item in world.Value) + { + //Ignore reports as ICs if report mode is false + //if (!data.SpoilerReportMode && item.Contains("Report")) + // continue; + + if (item.Contains("Report") && !data.SpoilerReportMode && !TMP_bossReports) + continue; + + string worldname = Codes.ConvertSeedGenName(world.Key); + string checkname = Codes.ConvertSeedGenName(item); + + data.WorldsData[worldname].checkCount.Add(checkname); + + //add ghosts if report mode is off + if (!data.SpoilerReportMode) + { + //Skip adding ghosts for item types that aren't in reveals list + if (!reveals.Contains(Codes.FindItemType(item))) + { + continue; + } + + WorldGrid grid = data.WorldsData[worldname].worldGrid; + if (counts.Keys.ToList().Contains(checkname)) + { + grid.Add_Ghost(data.GhostItems["Ghost_" + checkname + counts[checkname]]); + counts[checkname] += 1; + } + else + { + grid.Add_Ghost(data.GhostItems["Ghost_" + checkname]); + } + } + } + } + + foreach (var key in data.WorldsData.Keys.ToList()) + { + if (key == "GoA") + continue; + + if (data.SpoilerWorldCompletion) + data.WorldsData[key].worldGrid.WorldComplete(); + SetWorldValue(data.WorldsData[key].value, 0); + } + + //add setup report info if report mode is on + if (data.SpoilerReportMode) + { + data.SpoilerRevealTypes.AddRange(reveals); + + foreach (var report in reportKeys) + { + string worldstring = reports[report.ToString()]["World"].ToString(); + int dummyvalue = 0; + string location; + if (worldstring.StartsWith("Nothing_")) + { + worldstring = worldstring.Remove(0, 8); + dummyvalue = -1; + } + if (worldstring.Contains("Creations") && !data.puzzlesOn) + { + //still need to get and add location for report to track to correct world + //we can't just skip everything if creations was set to be hinted + location = Codes.ConvertSeedGenName(reports[report.ToString()]["Location"].ToString()); + data.reportLocations.Add(location); + continue; + } + + + var worldhint = Codes.ConvertSeedGenName(worldstring); + location = Codes.ConvertSeedGenName(reports[report.ToString()]["Location"].ToString()); + + + data.reportInformation.Add(new Tuple(worldhint, null, dummyvalue)); + data.reportLocations.Add(location); + + Console.WriteLine("WORLDSTRING = " + worldstring); + Console.WriteLine("LOCATION = " + location); + Console.WriteLine(data.reportInformation.Count); + } + data.hintsLoaded = true; + } + else if (data.BossRandoFound && TMP_bossReports) + { + //get random based on seed hash + Random rand = new Random(data.convertedSeedHash); + + //setup lists + List keyList = new List(data.BossList.Keys); + + //Remove bosses for worlds not enabled and remove "duplicates" + foreach (var key in data.BossList.Keys) + { + if (!data.enabledWorlds.Contains(Codes.bossLocations[key])) + keyList.Remove(key); + else if (key.Contains("Cups")) + keyList.Remove(key); + else if (key == "Hades II") + keyList.Remove(key); + else if (key.Contains("(Data)")) + { + //special case for some datas. we normally don't want + //to hint datas unless the world the normally are in is off + // (only applies for datas where the data fight is in a different world) + switch (key) + { + case "Axel (Data)": + if (data.enabledWorlds.Contains("STT")) + keyList.Remove(key); + break; + case "Luxord (Data)": + case "Roxas (Data)": + case "Xigbar (Data)": + if (data.enabledWorlds.Contains("TWTNW")) + keyList.Remove(key); + break; + default: + keyList.Remove(key); + break; + } + } + } + + //get report info + foreach (var report in reportKeys) + { + //get a boss + string boss = keyList[rand.Next(0, keyList.Count)]; + //get boss types + string origType = Codes.FindBossType(boss); + string replaceType = Codes.FindBossType(data.BossList[boss]); + + //prioritize special arenas and bosses (50%?) + while (origType == "boss_other" && replaceType == "boss_other") + { + int reroll = rand.Next(1, 10); + if (reroll > 5) //50% chance to keep basic bosses + { + break; + } + + boss = keyList[rand.Next(0, keyList.Count)]; + origType = Codes.FindBossType(boss); + replaceType = Codes.FindBossType(data.BossList[boss]); + } + + //report location and final hint string + string worldhint; + + if (boss == data.BossList[boss]) + { + string tmp_origBoss = boss; + if (tmp_origBoss == "Hades II (1)") + { + tmp_origBoss = "Hades"; + } + if (tmp_origBoss == "Pete OC II") + { + tmp_origBoss = "Pete"; + } + + worldhint = tmp_origBoss + " is unchanged"; + } + else + { + string tmp_origBoss = boss; + string tmp_replBoss = data.BossList[boss]; + + if (tmp_origBoss == "Hades II (1)") + { + tmp_origBoss = "Hades"; + } + if (tmp_origBoss == "Pete OC II") + { + tmp_origBoss = "Pete"; + } + + if (tmp_replBoss == "Hades II (1)") + { + tmp_replBoss = "Hades"; + } + if (tmp_replBoss == "Pete OC II") + { + tmp_replBoss = "Pete"; + } + + worldhint = tmp_origBoss + " became " + tmp_replBoss; + } + + int dummyvalue = -12345; //use this for boss reports i guess + data.reportInformation.Add(new Tuple(worldhint, null, dummyvalue)); + var location = Codes.ConvertSeedGenName(reports[report.ToString()]["Location"].ToString()); + data.reportLocations.Add(location); + + keyList.Remove(boss); + } + + data.hintsLoaded = true; + } + + //start adding score data + if (data.ScoreMode) + ScoreModifier(hintObject); + + SetProgressionHints(data.UsingProgressionHints); + } + + public void SetProgressionHints(bool usingProgHints) + { + //if it calls here and not in progression or using outdated seed methods somehow + if (!usingProgHints || data.mode == Mode.JsmarteeHints || data.mode == Mode.ShanHints) + return; + + //creations specific changes + if (!data.puzzlesOn && data.synthOn && data.progressionType == "Reports") + { + //data.WorldsData["PuzzSynth"].value.Text = ""; + //let's just make the value invisible + if (data.WorldsData["PuzzSynth"].value.Visibility == Visibility.Visible) + { + data.WorldsData["PuzzSynth"].value.Visibility = Visibility.Hidden; + } + } + + //fix later so if a specific variable/value from hint file was passed + if (data.progressionType == "Bosses") + { + //ProgressionCollectedValue.Text = data.ProgressionPoints.ToString(); + //ProgressionTotalValue.Text = data.HintCosts[0].ToString(); + + BossTextRow.Height = new GridLength(1, GridUnitType.Star); + + if (data.mode != Mode.OpenKHShanHints && data.mode != Mode.SpoilerHints) + { + InfoRow.Height = new GridLength(1.2, GridUnitType.Star); + InfoTextRow.Height = new GridLength(2, GridUnitType.Star); + HashBossSpacer.Height = new GridLength(1.2, GridUnitType.Star); + DC_Row1.Height = new GridLength(1, GridUnitType.Star); + TextRowSpacer.Height = new GridLength(0.05, GridUnitType.Star); + Grid.SetColumnSpan(MainTextVB, 2); + } + else if (data.mode == Mode.SpoilerHints && data.SpoilerReportMode) + { + InfoRow.Height = new GridLength(1.2, GridUnitType.Star); + InfoTextRow.Height = new GridLength(2, GridUnitType.Star); + HashBossSpacer.Height = new GridLength(1.2, GridUnitType.Star); + DC_Row1.Height = new GridLength(1, GridUnitType.Star); + TextRowSpacer.Height = new GridLength(0.05, GridUnitType.Star); + Grid.SetColumnSpan(MainTextVB, 2); + } + else + { + MainTextRow.Height = new GridLength(0, GridUnitType.Star); + TextRowSpacer.Height = new GridLength(0, GridUnitType.Star); + } + + ProgressionBossHints(); + + return; + } + + //Per Hint Mode Changes + if (data.mode == Mode.OpenKHJsmarteeHints) + { + //set progression points display + data.ProgressionPoints = 0; + data.ProgressionCurrentHint = 0; + ProgressionCollectedValue.Text = data.ProgressionPoints.ToString(); + ProgressionTotalValue.Text = data.HintCosts[data.ProgressionCurrentHint].ToString(); + } + else if (data.mode == Mode.OpenKHShanHints) + { + // get world count from options/ data, use a hash from options / data + //Console.WriteLine("WORLDS ENABLED COUNT = " + data.WorldsEnabled + "\nPROGRESSION HASH = " + data.ProgressionHash); + + //set the seed of math.random with progressionhash + Random random = new Random(data.convertedSeedHash); + //Console.WriteLine("RNG TEST = " + random.Next(data.WorldsEnabled)); + + //shuffle list created from shananas function change + int nextIndex = 0; + string tempTuple; + for (int i = 0; i < data.HintRevealOrder.Count; i++) + { + nextIndex = random.Next(data.HintRevealOrder.Count); + tempTuple = data.HintRevealOrder[nextIndex]; + data.HintRevealOrder[nextIndex] = data.HintRevealOrder[i]; + data.HintRevealOrder[i] = tempTuple; + } + + //Console.WriteLine("~~~~~~~~~~~~~~~~~"); + //foreach (string name in data.HintRevealOrder) + // Console.WriteLine(name); + //Console.WriteLine("data.HintRevealOrder.count = " + data.HintRevealOrder.Count); + //Console.WriteLine("~~~~~~~~~~~~~~~~~"); + + //set progression points display + data.ProgressionPoints = 0; + data.ProgressionCurrentHint = 0; + ProgressionCollectedValue.Text = data.ProgressionPoints.ToString(); + ProgressionTotalValue.Text = data.HintCosts[data.ProgressionCurrentHint].ToString(); + } //DONE + else if (data.mode == Mode.PointsHints) //points + { + //get world count from options/data, use a hash from options/data + //Console.WriteLine("WORLDS ENABLED COUNT = " + data.WorldsEnabled + "\nPROGRESSION HASH = " + data.ProgressionHash); + + //set the seed of math.random with progressionhash + Random random = new Random(data.convertedSeedHash); + //Console.WriteLine("RNG TEST = " + random.Next(data.WorldsEnabled)); + + //shuffle already created list from Options + string temp = ""; + int tempIndex = 0; + for (int i = 0; i < data.HintRevealOrder.Count; i++) + { + tempIndex = random.Next(data.HintRevealOrder.Count); + temp = data.HintRevealOrder[i]; + data.HintRevealOrder[i] = data.HintRevealOrder[tempIndex]; + data.HintRevealOrder[tempIndex] = temp; + } + + //set progression points display + data.ProgressionPoints = 0; + data.ProgressionCurrentHint = 0; + ProgressionCollectedValue.Text = data.ProgressionPoints.ToString(); + ProgressionTotalValue.Text = data.HintCosts[data.ProgressionCurrentHint].ToString(); + } + else if (data.mode == Mode.PathHints) + { + foreach (string world in data.HintRevealOrder) + { + data.WorldsData[world].hintedProgression = true; + } + + //set progression points display + data.ProgressionPoints = 0; + data.ProgressionCurrentHint = 0; + ProgressionCollectedValue.Text = data.ProgressionPoints.ToString(); + ProgressionTotalValue.Text = data.HintCosts[data.ProgressionCurrentHint].ToString(); + } + else if (data.mode == Mode.SpoilerHints) + { + //set progression points display + data.ProgressionPoints = 0; + data.ProgressionCurrentHint = 0; + ProgressionCollectedValue.Text = data.ProgressionPoints.ToString(); + ProgressionTotalValue.Text = data.HintCosts[data.ProgressionCurrentHint].ToString(); + } + } + + public void AddProgressionPoints(int points) + { + if (!data.UsingProgressionHints) + return; + + if (data.WorldsEnabled == 0) + data.WorldsEnabled = data.HintRevealOrder.Count; + + //reveal logic + List worldsRevealed = new List(); + + #region Debug stuff + //Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~"); + //Console.WriteLine("Current Hint Cost = " + data.HintCosts[data.ProgressionCurrentHint]); + //Console.WriteLine("Current Progression Hint = " + data.ProgressionCurrentHint); + //Console.WriteLine("Points added = " + points); + //Console.WriteLine("New Points at = " + (data.ProgressionPoints + points)); + //Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~"); + #endregion + + data.ProgressionPoints += points; + data.TotalProgressionPoints += points; + data.calulating = true; + + if (data.ProgressionCurrentHint >= data.HintCosts.Count - 1 || + data.ProgressionCurrentHint == data.HintCosts.Count || data.ProgressionCurrentHint == data.HintRevealOrder.Count) + { + //update points anyway + //ProgressionCollectedValue.Visibility = Visibility.Hidden; + //ProgressionCollectedBar.Visibility = Visibility.Hidden; + PPCount.Width = new GridLength(0, GridUnitType.Star); + PPSep.Width = new GridLength(0, GridUnitType.Star); + ProgressionTotalValue.Text = data.TotalProgressionPoints.ToString(); + return; + } + + //loop in the event that one progression point rewards a lot + while (data.ProgressionPoints >= data.HintCosts[data.ProgressionCurrentHint] && data.ProgressionCurrentHint < data.HintCosts.Count && data.ProgressionCurrentHint < data.HintRevealOrder.Count) + { + #region More Debug + //Console.WriteLine("Current Progression Hint = " + data.ProgressionCurrentHint); + //Console.WriteLine("data.HintCosts.count = " + data.HintCosts.Count); + //Console.WriteLine("PROGRESSION CURRENT HINT = " + data.ProgressionCurrentHint); + //update points and current hint + #endregion + data.ProgressionPoints -= data.HintCosts[data.ProgressionCurrentHint]; + data.ProgressionCurrentHint++; + + //reveal hints/world + worldsRevealed.Add(ProgressionReveal(data.ProgressionCurrentHint - 1)); + + if (data.ProgressionCurrentHint >= data.HintCosts.Count - 1 || data.ProgressionCurrentHint == data.HintCosts.Count || + data.ProgressionCurrentHint == data.HintRevealOrder.Count) //revealed last hint + break; + } + + if (data.ProgressionCurrentHint >= data.HintCosts.Count - 1 || data.ProgressionCurrentHint == data.HintCosts.Count || + data.ProgressionCurrentHint == data.HintRevealOrder.Count) + { + //update points + //ProgressionCollectedValue.Visibility = Visibility.Hidden; + //ProgressionCollectedBar.Visibility = Visibility.Hidden; + PPCount.Width = new GridLength(0, GridUnitType.Star); + PPSep.Width = new GridLength(0, GridUnitType.Star); + ProgressionTotalValue.Text = data.TotalProgressionPoints.ToString(); + //Console.WriteLine("Revealed last hint!"); + } + else + { + //update points + ProgressionCollectedValue.Text = data.ProgressionPoints.ToString(); + ProgressionTotalValue.Text = data.HintCosts[data.ProgressionCurrentHint].ToString(); + } + data.WorldsData["GoA"].value.Text = data.ProgressionCurrentHint.ToString(); + + if (worldsRevealed.Count > 0) + HighlightProgHintedWorlds(worldsRevealed); + data.calulating = false; + } + + public string ProgressionReveal(int hintNum) + { + string RealWorldName = ""; + //shouldn't ever get here but break in case + if (!data.UsingProgressionHints || data.mode == Mode.JsmarteeHints || data.mode == Mode.ShanHints) + return ""; + + //fix later so if a specific variable/value from hint file was passed + if (data.progressionType == "Bosses") + { + data.WorldsData["GoA"].worldGrid.ProgBossHint(hintNum); + + return ""; + } + + if (data.mode == Mode.OpenKHJsmarteeHints) //jsmartee + { + RealWorldName = data.reportInformation[hintNum].Item2; + //Console.WriteLine("Jsmartee Revealing " + RealWorldName); + data.WorldsData[RealWorldName].hintedProgression = true; + + data.WorldsData[RealWorldName].worldGrid.ProgressionReport_Jsmartee(hintNum); + } + else if (data.mode == Mode.OpenKHShanHints) //shans + { + //Console.WriteLine("data.reportInformation.count = " + data.HintRevealOrder.Count); + //Console.WriteLine("hintNum = " + hintNum); + RealWorldName = data.HintRevealOrder[hintNum]; + //Console.WriteLine("Shananas Revealing " + RealWorldName); + data.WorldsData[RealWorldName].hintedProgression = true; + + data.WorldsData[RealWorldName].worldGrid.WorldComplete(); + SetWorldValue(data.WorldsData[RealWorldName].value, data.WorldsData[RealWorldName].worldGrid.Children.Count); + + string codesRealWorldName = Codes.GetHintTextName(RealWorldName); + SetHintText(codesRealWorldName, "is now unhidden!", "", true, false, false); + data.HintRevealsStored.Add(new Tuple(codesRealWorldName, "is now unhidden!", "", true, false, false)); + //Console.WriteLine("SOME CHECK COUNT THING = " + data.WorldsData[RealWorldName].worldGrid.Children.Count); + } + else if (data.mode == Mode.PointsHints) //points + { + //potential problem + RealWorldName = data.HintRevealOrder[hintNum]; + //Console.WriteLine("Points Revealing " + RealWorldName); + data.WorldsData[RealWorldName].hintedProgression = true; + + data.WorldsData[RealWorldName].worldGrid.WorldComplete(); + + if (WorldPoints.Keys.Contains(RealWorldName)) + { + SetWorldValue(data.WorldsData[RealWorldName].value, WorldPoints[RealWorldName]); + } + //else + //{ + // Console.WriteLine($"Something went wrong in setting world point numbers. error: {RealWorldName}"); + //} + + data.HintRevealsStored.Add(new Tuple(Codes.GetHintTextName(RealWorldName), "has been revealed!", "", true, false, false)); + SetHintText(Codes.GetHintTextName(RealWorldName), "has been revealed!", "", true, false, false); + } + else if (data.mode == Mode.PathHints) //path + { + RealWorldName = data.reportInformation[hintNum].Item2; + //Console.WriteLine("Path Revealing " + RealWorldName); + data.WorldsData[RealWorldName].hintedProgression = true; + + data.WorldsData[RealWorldName].worldGrid.ProgressionReport_Path(hintNum); + } + else if (data.mode == Mode.SpoilerHints && data.SpoilerReportMode) //spoiler + { + RealWorldName = data.reportInformation[hintNum].Item1; + //Console.WriteLine("Spoiler Revealing " + RealWorldName); + data.WorldsData[RealWorldName].hintedProgression = true; + + SetWorldValue(data.WorldsData[RealWorldName].value, data.WorldsData[RealWorldName].worldGrid.Children.Count); + data.WorldsData[RealWorldName].worldGrid.ProgressionReport_Spoiler(hintNum); + + data.HintRevealsStored.Add(new Tuple(Codes.GetHintTextName(RealWorldName), "has been revealed!", "", true, false, false)); + SetHintText(Codes.GetHintTextName(RealWorldName), "has been revealed!", "", true, false, false); + } + + return RealWorldName; + } + + public void HighlightProgHintedWorlds(List worlds) + { + if (!WorldHintHighlightOption.IsChecked) + return; + + //unhighlight hinted worlds + if (data.previousWorldsHinted.Count >= 0) + { + foreach (var world in data.previousWorldsHinted) + { + if (world == null || world == "") + continue; + + foreach (var Box in data.WorldsData[world].top.Children.OfType()) + { + if (Box.Opacity != 0.9 && !Box.Name.EndsWith("SelWG")) + Box.Fill = (SolidColorBrush)FindResource("DefaultRec"); + + if (Box.Name.EndsWith("SelWG") && !WorldHighlightOption.IsChecked) + Box.Visibility = Visibility.Collapsed; + } + } + } + + //now higlight worlds + foreach (var world in worlds) + { + if (world == null || world == "") + continue; + + foreach (var Box in data.WorldsData[world].top.Children.OfType()) //set currently selected world colors + { + //Console.WriteLine("asdfasdfasdf - " + world.ToString()); + if (Box.Opacity != 0.9 && !Box.Name.EndsWith("SelWG")) + Box.Fill = (SolidColorBrush)FindResource("ProgressionHinted"); + + if (Box.Name.EndsWith("SelWG") && !WorldHighlightOption.IsChecked) + Box.Visibility = Visibility.Visible; + } + } + + data.previousWorldsHinted = worlds; + } + + public int GetProgressionPointsReward(string worldName, int prog) + { + int temp = 0; + switch (worldName) + { + case "SimulatedTwilightTown": + //if the world is done, give the bonus point right away + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + //if the progression marker was > 0, give the bonus - no bonus for 0 at prog point + temp = (data.STT_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.STT_ProgressionValues[prog - 1] > 0) //store the bonus point for later + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.STT_ProgressionValues[prog - 1] + temp; + case "TwilightTown": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.TT_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.TT_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.TT_ProgressionValues[prog - 1] + temp; + case "HollowBastion": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.HB_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.HB_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.HB_ProgressionValues[prog - 1] + temp; + case "CavernofRemembrance": + if (data.WorldsData["HollowBastion"].complete && data.WorldsData["HollowBastion"].hintedProgression) + temp = (data.CoR_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.CoR_ProgressionValues[prog - 1] > 0) + data.WorldsData["HollowBastion"].worldGrid.WorldCompleteProgressionBonus(); + return data.CoR_ProgressionValues[prog - 1] + temp; + case "BeastsCastle": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.BC_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.BC_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.BC_ProgressionValues[prog - 1] + temp; + case "OlympusColiseum": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.OC_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.OC_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.OC_ProgressionValues[prog - 1] + temp; + case "Agrabah": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.AG_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.AG_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.AG_ProgressionValues[prog - 1] + temp; + case "LandofDragons": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.LoD_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.LoD_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.LoD_ProgressionValues[prog - 1] + temp; + case "HundredAcreWood": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.HAW_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.HAW_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.HAW_ProgressionValues[prog - 1] + temp; + case "PrideLands": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.PL_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.PL_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.PL_ProgressionValues[prog - 1] + temp; + case "Atlantica": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.AT_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.AT_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.AT_ProgressionValues[prog - 1] + temp; + case "DisneyCastle": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.DC_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.DC_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.DC_ProgressionValues[prog - 1] + temp; + case "HalloweenTown": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.HT_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.HT_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.HT_ProgressionValues[prog - 1] + temp; + case "PortRoyal": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.PR_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.PR_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.PR_ProgressionValues[prog - 1] + temp; + case "SpaceParanoids": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.SP_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.SP_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.SP_ProgressionValues[prog - 1] + temp; + case "TWTNW": + if (data.WorldsData[worldName].complete && data.WorldsData[worldName].hintedProgression) + temp = (data.TWTNW_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + else if (data.TWTNW_ProgressionValues[prog - 1] > 0) + data.WorldsData[worldName].worldGrid.WorldCompleteProgressionBonus(); + return data.TWTNW_ProgressionValues[prog - 1] + temp; + case "GoA": + //if (data.WorldsData["HollowBastion"].complete && data.WorldsData["HollowBastion"].hintedProgression) + // temp = (data.HB_ProgressionValues[prog - 1] > 0 ? data.WorldCompleteBonus : 0); + //else if (data.HB_ProgressionValues[prog - 1] > 0) + // data.WorldsData["HollowBastion"].worldGrid.WorldCompleteProgressionBonus(); + //return data.CoR_ProgressionValues[prog - 1] + temp; + return 0; + default: //return if any other world + return 0; + } + } + + public void ProgressionBossHints() + { + data.progBossInformation.Clear(); + int TempCost = data.HintCosts[0]; + + //get random based on seed hash + Random rand = new Random(data.convertedSeedHash); + + //setup lists + List keyList = new List(data.BossList.Keys); + + //Remove bosses for worlds not enabled and remove "duplicates" + foreach (var key in data.BossList.Keys) + { + //remove duplicates + if (Codes.bossDups.Contains(key)) + { + keyList.Remove(key); + continue; + } + + if (!data.enabledWorlds.Contains(Codes.bossLocations[key])) + keyList.Remove(key); + else if (key.Contains("(Data)")) + { + //special case for some datas. we normally don't want + //to hint datas unless the world they're normally in is off + // (only applies for datas where the data fight is in a different world) + switch (key) + { + case "Axel (Data)": + if (data.enabledWorlds.Contains("STT")) + keyList.Remove(key); + break; + case "Saix (Data)": + case "Luxord (Data)": + case "Roxas (Data)": + case "Xigbar (Data)": + if (data.enabledWorlds.Contains("TWTNW")) + keyList.Remove(key); + break; + default: + keyList.Remove(key); + break; + } + } + } + + //set new hint cost length (do i need to do it this way? oh well i'm tired and this should work fine enough) + data.HintCosts = new List(); + + //get hint info + data.WorldsEnabled = keyList.Count + 1; + while (keyList.Count > 0) + { + //get a boss + string boss = keyList[rand.Next(0, keyList.Count)]; + + //final hint string + //string worldhint; + string BossA; + string middle; + string BossB = ""; + + if (boss == data.BossList[boss]) + { + string tmp_origBoss = boss; + if (tmp_origBoss == "Hades II (1)" || tmp_origBoss == "Hades II" || tmp_origBoss == "Hades I") + { + tmp_origBoss = "Hades"; + } + if (tmp_origBoss == "Pete TR" || tmp_origBoss == "Pete OC II") + { + tmp_origBoss = "Pete"; + } + + if (tmp_origBoss.EndsWith(" (1)") || tmp_origBoss.EndsWith(" (2)") || + tmp_origBoss.EndsWith(" (3)") || tmp_origBoss.EndsWith(" (4)")) + { + tmp_origBoss = tmp_origBoss.Substring(0, tmp_origBoss.Length-4); + } + + BossA = tmp_origBoss; + middle = "is unchanged"; + } + else + { + string tmp_origBoss = boss; + string tmp_replBoss = data.BossList[boss]; + + if (tmp_origBoss == "Hades II (1)" || tmp_origBoss == "Hades II" || tmp_origBoss == "Hades I") + { + tmp_origBoss = "Hades"; + } + if (tmp_origBoss == "Pete TR") + { + tmp_origBoss = "Pete"; + } + + if (tmp_replBoss == "Hades II (1)" || tmp_replBoss == "Hades II" || tmp_replBoss == "Hades I") + { + tmp_replBoss = "Hades"; + } + if (tmp_replBoss == "Pete TR" || tmp_replBoss == "Pete OC II") + { + tmp_replBoss = "Pete"; + } + + if (tmp_origBoss.EndsWith(" (1)") || tmp_origBoss.EndsWith(" (2)") || + tmp_origBoss.EndsWith(" (3)") || tmp_origBoss.EndsWith(" (4)")) + { + tmp_origBoss = tmp_origBoss.Substring(0, tmp_origBoss.Length - 4); + } + + if (tmp_replBoss.EndsWith(" (1)") || tmp_replBoss.EndsWith(" (2)") || + tmp_replBoss.EndsWith(" (3)") || tmp_replBoss.EndsWith(" (4)")) + { + tmp_replBoss = tmp_replBoss.Substring(0, tmp_replBoss.Length - 4); + } + + BossA = tmp_origBoss; + middle = "became"; + BossB = tmp_replBoss; + } + + data.progBossInformation.Add(new Tuple(BossA, middle, BossB)); + + keyList.Remove(boss); + + data.HintCosts.Add(TempCost); + } + + //add one more time + data.HintCosts.Add(TempCost); + } + + } +} \ No newline at end of file diff --git a/KhTracker/Core/Images.cs b/KhTracker/Core/Images.cs new file mode 100644 index 00000000..606ef430 --- /dev/null +++ b/KhTracker/Core/Images.cs @@ -0,0 +1,699 @@ +using System; +using System.Windows; +using System.Windows.Media.Imaging; +using System.Windows.Media; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Controls; + +namespace KhTracker +{ + public partial class MainWindow : Window + { + //dumb stuff to help figure out what to do about custom images + public static bool CustomSwordFound = false; + public static bool CustomStaffFound = false; + public static bool CustomShieldFound = false; + public static bool CustomLevelFound = false; + public static bool CustomStrengthFound = false; + public static bool CustomMagicFound = false; + public static bool CustomDefenseFound = false; + public static bool CustomProgFound = false; + //item | dictionary key | ghost | shadow | path + private Dictionary> CusItemCheck; + private Dictionary> CusItemCheckG; + + //handle adding all custom images and such + public void InitImages() + { + //for autodetect (won't bother making this customizable for now) + data.AD_Connect = new BitmapImage(new Uri("Images/System/config/searching.png", UriKind.Relative)); + data.AD_PC = new BitmapImage(new Uri("Images/System/config/pc_connected.png", UriKind.Relative)); + data.AD_PCred = new BitmapImage(new Uri("Images/System/config/pc_detected.png", UriKind.Relative)); + data.AD_PS2 = new BitmapImage(new Uri("Images/System/config/pcsx2.png", UriKind.Relative)); + data.AD_Cross = new BitmapImage(new Uri("Images/System/cross.png", UriKind.Relative)); + + //check for custom stat and weapon icons + if (File.Exists("CustomImages/System/stats/sword.png")) + CustomSwordFound = true; + if (File.Exists("CustomImages/System/stats/staff.png")) + CustomStaffFound = true; + if (File.Exists("CustomImages/System/stats/shield.png")) + CustomShieldFound = true; + if (File.Exists("CustomImages/System/stats/level.png")) + CustomLevelFound = true; + if (File.Exists("CustomImages/System/stats/strength.png")) + CustomStrengthFound = true; + if (File.Exists("CustomImages/System/stats/magic.png")) + CustomMagicFound = true; + if (File.Exists("CustomImages/System/stats/defence.png")) + CustomDefenseFound = true; + + //check for custom progression icons. if these 4 are there then assume all progression icons are there + //no reason for these 4 specific ones, i just picked 4 completely unrelated ones at random. + if (File.Exists("CustomImages/Progression/chest.png") && File.Exists("CustomImages/Progression/emblem.png") && + File.Exists("CustomImages/Progression/100_acre_wood/hunny_slider.png") && File.Exists("CustomImages/Progression/halloween_town/oogie_boogie.png")) + CustomProgFound = true; + + //helps determine what item images need replacing with custom image loading + CusItemCheck = new Dictionary> + { + {Report1, new Tuple("Cus-Report1", Ghost_Report1, S_Report1, "CustomImages/Checks/ansem_report01.png")}, + {Report2, new Tuple("Cus-Report2", Ghost_Report2, S_Report2, "CustomImages/Checks/ansem_report02.png")}, + {Report3, new Tuple("Cus-Report3", Ghost_Report3, S_Report3, "CustomImages/Checks/ansem_report03.png")}, + {Report4, new Tuple("Cus-Report4", Ghost_Report4, S_Report4, "CustomImages/Checks/ansem_report04.png")}, + {Report5, new Tuple("Cus-Report5", Ghost_Report5, S_Report5, "CustomImages/Checks/ansem_report05.png")}, + {Report6, new Tuple("Cus-Report6", Ghost_Report6, S_Report6, "CustomImages/Checks/ansem_report06.png")}, + {Report7, new Tuple("Cus-Report7", Ghost_Report7, S_Report7, "CustomImages/Checks/ansem_report07.png")}, + {Report8, new Tuple("Cus-Report8", Ghost_Report8, S_Report8, "CustomImages/Checks/ansem_report08.png")}, + {Report9, new Tuple("Cus-Report9", Ghost_Report9, S_Report9, "CustomImages/Checks/ansem_report09.png")}, + {Report10, new Tuple("Cus-Report10", Ghost_Report10, S_Report10, "CustomImages/Checks/ansem_report10.png")}, + {Report11, new Tuple("Cus-Report11", Ghost_Report11, S_Report11, "CustomImages/Checks/ansem_report11.png")}, + {Report12, new Tuple("Cus-Report12", Ghost_Report12, S_Report12, "CustomImages/Checks/ansem_report12.png")}, + {Report13, new Tuple("Cus-Report13", Ghost_Report13, S_Report13, "CustomImages/Checks/ansem_report13.png")}, + {Fire1, new Tuple("Cus-Fire1", Ghost_Fire1, S_Fire, "CustomImages/Checks/magic_fire.png")}, + {Fire2, new Tuple("Cus-Fire2", Ghost_Fire2, null, "CustomImages/Checks/magic_fire.png")}, + {Fire3, new Tuple("Cus-Fire3", Ghost_Fire3, null, "CustomImages/Checks/magic_fire.png")}, + {Blizzard1, new Tuple("Cus-Blizzard1", Ghost_Blizzard1, S_Blizzard, "CustomImages/Checks/magic_blizzard.png")}, + {Blizzard2, new Tuple("Cus-Blizzard2", Ghost_Blizzard2, null, "CustomImages/Checks/magic_blizzard.png")}, + {Blizzard3, new Tuple("Cus-Blizzard3", Ghost_Blizzard3, null, "CustomImages/Checks/magic_blizzard.png")}, + {Thunder1, new Tuple("Cus-Thunder1", Ghost_Thunder1, S_Thunder, "CustomImages/Checks/magic_thunder.png")}, + {Thunder2, new Tuple("Cus-Thunder2", Ghost_Thunder2, null, "CustomImages/Checks/magic_thunder.png")}, + {Thunder3, new Tuple("Cus-Thunder3", Ghost_Thunder3, null, "CustomImages/Checks/magic_thunder.png")}, + {Cure1, new Tuple("Cus-Cure1", Ghost_Cure1, S_Cure, "CustomImages/Checks/magic_cure.png")}, + {Cure2, new Tuple("Cus-Cure2", Ghost_Cure2, null, "CustomImages/Checks/magic_cure.png")}, + {Cure3, new Tuple("Cus-Cure3", Ghost_Cure3, null, "CustomImages/Checks/magic_cure.png")}, + {Reflect1, new Tuple("Cus-Reflect1", Ghost_Reflect1, S_Reflect, "CustomImages/Checks/magic_reflect.png")}, + {Reflect2, new Tuple("Cus-Reflect2", Ghost_Reflect2, null, "CustomImages/Checks/magic_reflect.png")}, + {Reflect3, new Tuple("Cus-Reflect3", Ghost_Reflect3, null, "CustomImages/Checks/magic_reflect.png")}, + {Magnet1, new Tuple("Cus-Magnet1", Ghost_Magnet1, S_Magnet, "CustomImages/Checks/magic_magnet.png")}, + {Magnet2, new Tuple("Cus-Magnet2", Ghost_Magnet2, null, "CustomImages/Checks/magic_magnet.png")}, + {Magnet3, new Tuple("Cus-Magnet3", Ghost_Magnet3, null, "CustomImages/Checks/magic_magnet.png")}, + {TornPage1, new Tuple("Cus-TornPage1", Ghost_TornPage1, S_TornPage, "CustomImages/Checks/torn_pages.png")}, + {TornPage2, new Tuple("Cus-TornPage2", Ghost_TornPage2, null, "CustomImages/Checks/torn_pages.png")}, + {TornPage3, new Tuple("Cus-TornPage3", Ghost_TornPage3, null, "CustomImages/Checks/torn_pages.png")}, + {TornPage4, new Tuple("Cus-TornPage4", Ghost_TornPage4, null, "CustomImages/Checks/torn_pages.png")}, + {TornPage5, new Tuple("Cus-TornPage5", Ghost_TornPage5, null, "CustomImages/Checks/torn_pages.png")}, + {Valor, new Tuple("Cus-Valor", Ghost_Valor, S_Valor, "CustomImages/Checks/form_valor.png")}, + {Wisdom, new Tuple("Cus-Wisdom", Ghost_Wisdom, S_Wisdom, "CustomImages/Checks/form_wisdom.png")}, + {Limit, new Tuple("Cus-Limit", Ghost_Limit, S_Limit, "CustomImages/Checks/form_limit.png")}, + {Master, new Tuple("Cus-Master", Ghost_Master, S_Master, "CustomImages/Checks/form_master.png")}, + {Final, new Tuple("Cus-Final", Ghost_Final, S_Final, "CustomImages/Checks/form_final.png")}, + {Lamp, new Tuple("Cus-Lamp", Ghost_Lamp, S_Lamp, "CustomImages/Checks/summon_genie.png")}, + {Ukulele, new Tuple("Cus-Ukulele", Ghost_Ukulele, S_Ukulele, "CustomImages/Checks/summon_stitch.png")}, + {Baseball, new Tuple("Cus-Baseball", Ghost_Baseball, S_Baseball, "CustomImages/Checks/summon_chicken_little.png")}, + {Feather, new Tuple("Cus-Feather", Ghost_Feather, S_Feather, "CustomImages/Checks/summon_peter_pan.png")}, + {Nonexistence, new Tuple("Cus-Nonexistence", Ghost_Nonexistence, S_Nonexistence, "CustomImages/Checks/proof_nonexistence.png")}, + {Connection, new Tuple("Cus-Connection", Ghost_Connection, S_Connection, "CustomImages/Checks/proof_connection.png")}, + {Peace, new Tuple("Cus-Peace", Ghost_Peace, S_Peace, "CustomImages/Checks/proof_peace.png")}, + {PromiseCharm, new Tuple("Cus-PromiseCharm", Ghost_PromiseCharm, S_PromiseCharm, "CustomImages/Checks/promise_charm.png")}, + {OnceMore, new Tuple("Cus-OnceMore", Ghost_OnceMore, S_OnceMore, "CustomImages/Checks/once_more.png")}, + {SecondChance, new Tuple("Cus-SecondChance", Ghost_SecondChance, S_SecondChance, "CustomImages/Checks/second_chance.png")}, + {MulanWep, new Tuple("Cus-MulanWep", Ghost_MulanWep, S_MulanWep, "CustomImages/Checks/lock_AncestorSword.png")}, + {AuronWep, new Tuple("Cus-AuronWep", Ghost_AuronWep, S_AuronWep, "CustomImages/Checks/lock_BattlefieldsofWar.png")}, + {BeastWep, new Tuple("Cus-BeastWep", Ghost_BeastWep, S_BeastWep, "CustomImages/Checks/lock_BeastClaw.png")}, + {JackWep, new Tuple("Cus-JackWep", Ghost_JackWep, S_JackWep, "CustomImages/Checks/lock_BoneFist.png")}, + {IceCream, new Tuple("Cus-IceCream", Ghost_IceCream, S_IceCream, "CustomImages/Checks/lock_IceCream.png")}, + {TronWep, new Tuple("Cus-TronWep", Ghost_TronWep, S_TronWep, "CustomImages/Checks/lock_IdentityDisk.png")}, + {Picture, new Tuple("Cus-Picture", Ghost_Picture, S_Picture, "CustomImages/Checks/lock_Picture.png")}, + {MembershipCard, new Tuple("Cus-MembershipCard", Ghost_MembershipCard, S_MembershipCard, "CustomImages/Checks/lock_membershipcard.png")}, + {SimbaWep, new Tuple("Cus-SimbaWep", Ghost_SimbaWep, S_SimbaWep, "CustomImages/Checks/lock_ProudFang.png")}, + {AladdinWep, new Tuple("Cus-AladdinWep", Ghost_AladdinWep, S_AladdinWep, "CustomImages/Checks/lock_Scimitar.png")}, + {SparrowWep, new Tuple("Cus-SparrowWep", Ghost_SparrowWep, S_SparrowWep, "CustomImages/Checks/lock_SkillCrossbones.png")}, + {HadesCup, new Tuple("Cus-HadesCup", Ghost_HadesCup, S_HadesCup, "CustomImages/Checks/aux_hades_cup.png")}, + {OlympusStone, new Tuple("Cus-OlympusStone", Ghost_OlympusStone, S_OlympusStone, "CustomImages/Checks/aux_olympus_stone.png")}, + {UnknownDisk, new Tuple("Cus-UnknownDisk", Ghost_UnknownDisk, S_UnknownDisk, "CustomImages/Checks/aux_UnknownDisk.png")}, + {MunnyPouch1, new Tuple("Cus-MunnyPouch1", Ghost_MunnyPouch1, S_MunnyPouch, "CustomImages/Checks/aux_munny_pouch.png")}, + {MunnyPouch2, new Tuple("Cus-MunnyPouch2", Ghost_MunnyPouch2, null, "CustomImages/Checks/aux_munny_pouch.png")}, + {Anti, new Tuple("Cus-Anti", Ghost_Anti, S_Anti, "CustomImages/Checks/form_anti.png")} + }; + + //ghost items + CusItemCheckG = new Dictionary> + { + {Ghost_Report1, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report1")}, + {Ghost_Report2, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report2")}, + {Ghost_Report3, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report3")}, + {Ghost_Report4, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report4")}, + {Ghost_Report5, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report5")}, + {Ghost_Report6, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report6")}, + {Ghost_Report7, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report7")}, + {Ghost_Report8, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report8")}, + {Ghost_Report9, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report9")}, + {Ghost_Report10, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report10")}, + {Ghost_Report11, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report11")}, + {Ghost_Report12, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report12")}, + {Ghost_Report13, new Tuple("CustomImages/GhostChecks/ansem_report.png", "Cus-G_Report13")}, + {Ghost_Fire1, new Tuple("CustomImages/GhostChecks/magic_fire.png", "Cus-G_Fire1")}, + {Ghost_Fire2, new Tuple("CustomImages/GhostChecks/magic_fire.png", "Cus-G_Fire2")}, + {Ghost_Fire3, new Tuple("CustomImages/GhostChecks/magic_fire.png", "Cus-G_Fire3")}, + {Ghost_Blizzard1, new Tuple("CustomImages/GhostChecks/magic_blizzard.png", "Cus-G_Blizzard1")}, + {Ghost_Blizzard2, new Tuple("CustomImages/GhostChecks/magic_blizzard.png", "Cus-G_Blizzard2")}, + {Ghost_Blizzard3, new Tuple("CustomImages/GhostChecks/magic_blizzard.png", "Cus-G_Blizzard3")}, + {Ghost_Thunder1, new Tuple("CustomImages/GhostChecks/magic_thunder.png", "Cus-G_Thunder1")}, + {Ghost_Thunder2, new Tuple("CustomImages/GhostChecks/magic_thunder.png", "Cus-G_Thunder2")}, + {Ghost_Thunder3, new Tuple("CustomImages/GhostChecks/magic_thunder.png", "Cus-G_Thunder3")}, + {Ghost_Cure1, new Tuple("CustomImages/GhostChecks/magic_cure.png", "Cus-G_Cure1")}, + {Ghost_Cure2, new Tuple("CustomImages/GhostChecks/magic_cure.png", "Cus-G_Cure2")}, + {Ghost_Cure3, new Tuple("CustomImages/GhostChecks/magic_cure.png", "Cus-G_Cure3")}, + {Ghost_Reflect1, new Tuple("CustomImages/GhostChecks/magic_reflect.png", "Cus-G_Reflect1")}, + {Ghost_Reflect2, new Tuple("CustomImages/GhostChecks/magic_reflect.png", "Cus-G_Reflect2")}, + {Ghost_Reflect3, new Tuple("CustomImages/GhostChecks/magic_reflect.png", "Cus-G_Reflect3")}, + {Ghost_Magnet1, new Tuple("CustomImages/GhostChecks/magic_magnet.png", "Cus-G_Magnet1")}, + {Ghost_Magnet2, new Tuple("CustomImages/GhostChecks/magic_magnet.png", "Cus-G_Magnet2")}, + {Ghost_Magnet3, new Tuple("CustomImages/GhostChecks/magic_magnet.png", "Cus-G_Magnet3")}, + {Ghost_TornPage1, new Tuple("CustomImages/GhostChecks/torn_pages.png", "Cus-G_TornPage1")}, + {Ghost_TornPage2, new Tuple("CustomImages/GhostChecks/torn_pages.png", "Cus-G_TornPage2")}, + {Ghost_TornPage3, new Tuple("CustomImages/GhostChecks/torn_pages.png", "Cus-G_TornPage3")}, + {Ghost_TornPage4, new Tuple("CustomImages/GhostChecks/torn_pages.png", "Cus-G_TornPage4")}, + {Ghost_TornPage5, new Tuple("CustomImages/GhostChecks/torn_pages.png", "Cus-G_TornPage5")}, + {Ghost_Valor, new Tuple("CustomImages/GhostChecks/form_valor.png", "Cus-G_Valor")}, + {Ghost_Wisdom, new Tuple("CustomImages/GhostChecks/form_wisdom.png", "Cus-G_Wisdom")}, + {Ghost_Limit, new Tuple("CustomImages/GhostChecks/form_limit.png", "Cus-G_Limit")}, + {Ghost_Master, new Tuple("CustomImages/GhostChecks/form_master.png", "Cus-G_Master")}, + {Ghost_Final, new Tuple("CustomImages/GhostChecks/form_final.png", "Cus-G_Final")}, + {Ghost_Lamp, new Tuple("CustomImages/GhostChecks/summon_genie.png", "Cus-G_Lamp")}, + {Ghost_Ukulele, new Tuple("CustomImages/GhostChecks/summon_stitch.png", "Cus-G_Ukulele")}, + {Ghost_Baseball, new Tuple("CustomImages/GhostChecks/summon_chicken_little.png", "Cus-G_Baseball" )}, + {Ghost_Feather, new Tuple("CustomImages/GhostChecks/summon_peter_pan.png", "Cus-G_Feather")}, + {Ghost_Nonexistence, new Tuple("CustomImages/GhostChecks/proof_nonexistence.png", "Cus-G_Nonexistence")}, + {Ghost_Connection, new Tuple("CustomImages/GhostChecks/proof_connection.png", "Cus-G_Connection")}, + {Ghost_Peace, new Tuple("CustomImages/GhostChecks/proof_peace.png", "Cus-G_Peace")}, + {Ghost_PromiseCharm, new Tuple("CustomImages/GhostChecks/promise_charm.png", "Cus-G_PromiseCharm")}, + {Ghost_OnceMore, new Tuple("CustomImages/GhostChecks/once_more.png", "Cus-G_OnceMore")}, + {Ghost_SecondChance, new Tuple("CustomImages/GhostChecks/second_chance.png", "Cus-G_SecondChance")}, + {Ghost_MulanWep, new Tuple("CustomImages/GhostChecks/lock_AncestorSword.png", "Cus-G_MulanWep")}, + {Ghost_AuronWep, new Tuple("CustomImages/GhostChecks/lock_BattlefieldsofWar.png", "Cus-G_AuronWep")}, + {Ghost_BeastWep, new Tuple("CustomImages/GhostChecks/lock_BeastClaw.png", "Cus-G_BeastWep")}, + {Ghost_JackWep, new Tuple("CustomImages/GhostChecks/lock_BoneFist.png", "Cus-G_JackWep")}, + {Ghost_IceCream, new Tuple("CustomImages/GhostChecks/lock_IceCream.png", "Cus-G_IceCream")}, + {Ghost_TronWep, new Tuple("CustomImages/GhostChecks/lock_IdentityDisk.png", "Cus-G_TronWep")}, + {Ghost_Picture, new Tuple("CustomImages/GhostChecks/lock_Picture.png", "Cus-G_Picture")}, + {Ghost_MembershipCard, new Tuple("CustomImages/GhostChecks/lock_membershipcard.png", "Cus-G_MembershipCard")}, + {Ghost_SimbaWep, new Tuple("CustomImages/GhostChecks/lock_ProudFang.png", "Cus-G_SimbaWep")}, + {Ghost_AladdinWep, new Tuple("CustomImages/GhostChecks/lock_Scimitar.png", "Cus-G_AladdinWep")}, + {Ghost_SparrowWep, new Tuple("CustomImages/GhostChecks/lock_SkillCrossbones.png", "Cus-G_SparrowWep")}, + {Ghost_HadesCup, new Tuple("CustomImages/GhostChecks/aux_hades_cup.png", "Cus-G_HadesCup")}, + {Ghost_OlympusStone, new Tuple("CustomImages/GhostChecks/aux_olympus_stone.png", "Cus-G_OlympusStone")}, + {Ghost_UnknownDisk, new Tuple("CustomImages/GhostChecks/aux_UnknownDisk.png", "Cus-G_UnknownDisk")}, + {Ghost_MunnyPouch1, new Tuple("CustomImages/GhostChecks/aux_munny_pouch.png", "Cus-G_MunnyPouch1")}, + {Ghost_MunnyPouch2, new Tuple("CustomImages/GhostChecks/aux_munny_pouch.png", "Cus-G_MunnyPouch2")}, + {Ghost_Anti, new Tuple("CustomImages/GhostChecks/form_anti.png", "Cus-G_Anti")} + }; + } + + private void MainBG_DefToggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (MainDefOption.IsChecked == false) + { + MainDefOption.IsChecked = true; + return; + } + + MainImg1Option.IsChecked = false; + MainImg2Option.IsChecked = false; + MainImg3Option.IsChecked = false; + + Properties.Settings.Default.MainBG = 0; + + if (MainDefOption.IsChecked) + { + Background = Application.Current.Resources["BG-Default"] as SolidColorBrush; + } + } + + private void MainBG_Img1Toggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (MainImg1Option.IsChecked == false) + { + MainImg1Option.IsChecked = true; + return; + } + + MainDefOption.IsChecked = false; + MainImg2Option.IsChecked = false; + MainImg3Option.IsChecked = false; + + Properties.Settings.Default.MainBG = 1; + + if (MainImg1Option.IsChecked) + { + if (File.Exists("CustomImages/background.png")) + Background = Application.Current.Resources["BG-Image1"] as ImageBrush; + else + Background = Application.Current.Resources["BG-ImageDef1"] as ImageBrush; + } + } + + private void MainBG_Img2Toggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (MainImg2Option.IsChecked == false) + { + MainImg2Option.IsChecked = true; + return; + } + + MainDefOption.IsChecked = false; + MainImg1Option.IsChecked = false; + MainImg3Option.IsChecked = false; + + Properties.Settings.Default.MainBG = 2; + + if (MainImg2Option.IsChecked) + { + if (File.Exists("CustomImages/background.png")) + Background = Application.Current.Resources["BG-Image2"] as ImageBrush; + else + Background = Application.Current.Resources["BG-ImageDef2"] as ImageBrush; + } + } + + private void MainBG_Img3Toggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (MainImg3Option.IsChecked == false) + { + MainImg3Option.IsChecked = true; + return; + } + + MainDefOption.IsChecked = false; + MainImg1Option.IsChecked = false; + MainImg2Option.IsChecked = false; + + Properties.Settings.Default.MainBG = 3; + + if (MainImg3Option.IsChecked) + { + if (File.Exists("CustomImages/background.png")) + Background = Application.Current.Resources["BG-Image3"] as ImageBrush; + else + Background = Application.Current.Resources["BG-ImageDef3"] as ImageBrush; + } + } + + private void CustomChecksCheck() + { + if (!CustomFolderOption.IsChecked) + return; + + string[] checkFiles = { }; + string[] checkFilesG = { }; + + if (Directory.Exists("CustomImages/Checks/")) + { + checkFiles = Directory.GetFiles("CustomImages/Checks/", "*.png", SearchOption.TopDirectoryOnly); + } + + if (Directory.Exists("CustomImages/GhostChecks/")) + { + checkFilesG = Directory.GetFiles("CustomImages/GhostChecks/", "*.png", SearchOption.TopDirectoryOnly); + } + + + //if list isn't empty then compare against dictionary to determine what icons to replace + + // key | item1 | item2 | item3 | item4 + //main window | dic key | ghost | shadow | path + + // ghost should always use main widnow icons if any are found first. + if (checkFiles.Length > 0) + { + //check if i actually need this lowercase edit + checkFiles = checkFiles.Select(s => s.ToLowerInvariant()).ToArray(); + + foreach (var item in CusItemCheck) + { + if (checkFiles.Contains(item.Value.Item4.ToLower())) + { + //main item + Item main = item.Key; + main.SetResourceReference(ContentProperty, item.Value.Item1); + + //item shadow + if (item.Value.Item3 != null) + { + ContentControl shadow = item.Value.Item3; + shadow.SetResourceReference(ContentProperty, item.Value.Item1); + } + + //ghost item + if (item.Value.Item2 != null) + { + Item ghost = item.Value.Item2; + if (Codes.FindItemType(ghost.Name) != "report") + ghost.SetResourceReference(ContentProperty, item.Value.Item1); + else + ghost.SetResourceReference(ContentProperty, "Cus-Report"); + } + } + } + } + + //if custom ghost icons are found then set those (otherwise keep using the main window ones) + if (checkFilesG.Length > 0) + { + //check if i actually need this lowercase edit + checkFilesG = checkFilesG.Select(s => s.ToLowerInvariant()).ToArray(); + + foreach (var item in CusItemCheckG) + { + if (checkFilesG.Contains(item.Value.Item1.ToLower())) + { + //main item + Item ghost = item.Key as Item; + if (Codes.FindItemType(ghost.Name) != "report") + ghost.SetResourceReference(ContentProperty, item.Value.Item2); + else + ghost.SetResourceReference(ContentProperty, "Cus-G_Report"); + + } + } + } + + //check if folders exists then start checking if each file exists in it + if (Directory.Exists("CustomImages/Checks/")) + { + if (File.Exists("CustomImages/System/drive_growth/high_jump.png")) + HighJump.SetResourceReference(ContentProperty, "Cus-HighJump"); + if (File.Exists("CustomImages/System/drive_growth/quick_run.png")) + QuickRun.SetResourceReference(ContentProperty, "Cus-QuickRun"); + if (File.Exists("CustomImages/System/drive_growth/dodge_roll.png")) + DodgeRoll.SetResourceReference(ContentProperty, "Cus-DodgeRoll"); + if (File.Exists("CustomImages/System/drive_growth/aerial_didge.png")) + AerialDodge.SetResourceReference(ContentProperty, "Cus-AerialDodge"); + if (File.Exists("CustomImages/System/drive_growth/glide.png")) + Glide.SetResourceReference(ContentProperty, "Cus-Glide"); + + if (File.Exists("CustomImages/System/drive_growth/valor.png")) + ValorM.SetResourceReference(ContentProperty, "Cus-Valor"); + if (File.Exists("CustomImages/System/drive_growth/wisdom.png")) + WisdomM.SetResourceReference(ContentProperty, "Cus-Wisdom"); + if (File.Exists("CustomImages/System/drive_growth/limit.png")) + LimitM.SetResourceReference(ContentProperty, "Cus-Limit"); + if (File.Exists("CustomImages/System/drive_growth/master.png")) + MasterM.SetResourceReference(ContentProperty, "Cus-Master"); + if (File.Exists("CustomImages/System/drive_growth/final.png")) + FinalM.SetResourceReference(ContentProperty, "Cus-Final"); + } + + if (CustomLevelFound) + LevelIcon.SetResourceReference(ContentProperty, "Cus-LevelIcon"); + + if (CustomStrengthFound) + StrengthIcon.SetResourceReference(ContentProperty, "Cus-StrengthIcon"); + + if (CustomMagicFound) + MagicIcon.SetResourceReference(ContentProperty, "Cus-MagicIcon"); + + if (CustomDefenseFound) + DefenseIcon.SetResourceReference(ContentProperty, "Cus-DefenseIcon"); + + //visit locks + if(Directory.Exists("CustomImages/Worlds/Locks/")) + { + if (File.Exists("CustomImages/Worlds/Locks/HB.png")) + HollowBastionLock.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/HB.png", UriKind.Absolute)); + if (File.Exists("CustomImages/Worlds/Locks/OC.png")) + OlympusColiseumLock.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/OC.png", UriKind.Absolute)); + if (File.Exists("CustomImages/Worlds/Locks/LD.png")) + LandofDragonsLock.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/LD.png", UriKind.Absolute)); + if (File.Exists("CustomImages/Worlds/Locks/PL.png")) + PrideLandsLock.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/PL.png", UriKind.Absolute)); + if (File.Exists("CustomImages/Worlds/Locks/HT.png")) + HalloweenTownLock.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/HT.png", UriKind.Absolute)); + if (File.Exists("CustomImages/Worlds/Locks/SP.png")) + SpaceParanoidsLock.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/SP.png", UriKind.Absolute)); + if (File.Exists("CustomImages/Worlds/Locks/BC.png")) + BeastsCastleLock.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/BC.png", UriKind.Absolute)); + if (File.Exists("CustomImages/Worlds/Locks/AG.png")) + AgrabahLock.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/AG.png", UriKind.Absolute)); + if (File.Exists("CustomImages/Worlds/Locks/PR.png")) + PortRoyalLock.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/PR.png", UriKind.Absolute)); + if (File.Exists("CustomImages/Worlds/Locks/TT3.png")) + TwilightTownLock_1.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/TT3.png", UriKind.Absolute)); + if (File.Exists("CustomImages/Worlds/Locks/TT2.png")) + TwilightTownLock_2.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/Worlds/Locks/TT2.png", UriKind.Absolute)); + } + + //world cross + if (File.Exists("CustomImages/System/crossworld.png")) + { + SorasHeartCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + DriveFormsCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + SimulatedTwilightTownCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + TwilightTownCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + HollowBastionCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + BeastsCastleCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + OlympusColiseumCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + AgrabahCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + LandofDragonsCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + HundredAcreWoodCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + PrideLandsCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + DisneyCastleCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + HalloweenTownCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + PortRoyalCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + TWTNWCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + SpaceParanoidsCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + AtlanticaCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + PuzzSynthCross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + GoACross.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/crossworld.png", UriKind.Absolute)); + } + + //DeathCounter counter skull + if (File.Exists("CustomImages/System/stats/deaths.png")) + DeathIcon.Source = new BitmapImage(new Uri("pack://application:,,,/CustomImages/System/stats/deaths.png", UriKind.Absolute)); + } + + private void CustomWorldCheck() + { + if (!CustomFolderOption.IsChecked) + return; + + string[] worldFiles = { }; + + if (Directory.Exists("CustomImages/Worlds/")) + { + worldFiles = Directory.GetFiles("CustomImages/Worlds/", "*.png", SearchOption.TopDirectoryOnly); + } + + if (worldFiles.Length > 0) + { + //check if i actually need this lowercase edit + worldFiles = worldFiles.Select(s => s.ToLowerInvariant()).ToArray(); + + foreach (var item in CusItemCheckG) + { + if (worldFiles.Contains(item.Value.Item1.ToLower())) + { + //main item + Item ghost = item.Key as Item; + ghost.SetResourceReference(ContentProperty, item.Value.Item2); + } + } + } + + ///TODO: update and maybe set up dictionary? + //Main Window + if (Directory.Exists("CustomImages/Worlds/")) + { + if (File.Exists("CustomImages/Worlds/simulated_twilight_town.png")) + { + SimulatedTwilightTown.SetResourceReference(ContentProperty, "Cus-SimulatedImage"); + } + if (File.Exists("CustomImages/Worlds/land_of_dragons.png")) + { + LandofDragons.SetResourceReference(ContentProperty, "Cus-LandofDragonsImage"); + } + if (File.Exists("CustomImages/Worlds/pride_land.png")) + { + PrideLands.SetResourceReference(ContentProperty, "Cus-PrideLandsImage"); + } + if (File.Exists("CustomImages/Worlds/halloween_town.png")) + { + HalloweenTown.SetResourceReference(ContentProperty, "Cus-HalloweenTownImage"); + } + if (File.Exists("CustomImages/Worlds/space_paranoids.png")) + { + SpaceParanoids.SetResourceReference(ContentProperty, "Cus-SpaceParanoidsImage"); + } + if (File.Exists("CustomImages/Worlds/drive_form.png")) + { + DriveForms.SetResourceReference(ContentProperty, "Cus-DriveFormsImage"); + } + if (File.Exists("CustomImages/Worlds/twilight_town.png")) + { + TwilightTown.SetResourceReference(ContentProperty, "Cus-TwilightTownImage"); + } + if (File.Exists("CustomImages/Worlds/beast's_castle.png")) + { + BeastsCastle.SetResourceReference(ContentProperty, "Cus-BeastCastleImage"); + } + if (File.Exists("CustomImages/Worlds/agrabah.png")) + { + Agrabah.SetResourceReference(ContentProperty, "Cus-AgrabahImage"); + } + if (File.Exists("CustomImages/Worlds/100_acre_wood.png")) + { + HundredAcreWood.SetResourceReference(ContentProperty, "Cus-HundredAcreImage"); + } + if (File.Exists("CustomImages/Worlds/port_royal.png")) + { + PortRoyal.SetResourceReference(ContentProperty, "Cus-PortRoyalImage"); + } + if (File.Exists("CustomImages/Worlds/the_world_that_never_was.png")) + { + TWTNW.SetResourceReference(ContentProperty, "Cus-TWTNWImage"); + } + if (File.Exists("CustomImages/Worlds/atlantica.png")) + { + Atlantica.SetResourceReference(ContentProperty, "Cus-AtlanticaImage"); + } + if (File.Exists("CustomImages/Worlds/replica_data.png")) + { + GoA.SetResourceReference(ContentProperty, "Cus-GardenofAssemblageImage"); + } + if (File.Exists("CustomImages/Worlds/level.png")) + { + SorasHeart.SetResourceReference(ContentProperty, "Cus-SoraHeartImage"); + } + if (File.Exists("CustomImages/Worlds/disney_castle.png")) + { + DisneyCastle.SetResourceReference(ContentProperty, "Cus-DisneyCastleImage"); + } + if (File.Exists("CustomImages/Worlds/hollow_bastion.png")) + { + HollowBastion.SetResourceReference(ContentProperty, "Cus-HollowBastionImage"); + } + if (File.Exists("CustomImages/Worlds/olympus_coliseum.png")) + { + OlympusColiseum.SetResourceReference(ContentProperty, "Cus-OlympusImage"); + } + + //check for custom cavern, timeless, and cups toggles + //if (File.Exists("CustomImages/Worlds/Level01.png") && SoraLevel01Option.IsChecked) + //{ + // SorasHeartType.SetResourceReference(ContentProperty, "Cus-SoraLevel01"); + //} + //if (File.Exists("CustomImages/Worlds/Level50.png") && SoraLevel50Option.IsChecked) + //{ + // SorasHeartType.SetResourceReference(ContentProperty, "Cus-SoraLevel50"); + //} + //if (File.Exists("CustomImages/Worlds/Level99.png") && SoraLevel99Option.IsChecked) + //{ + // SorasHeartType.SetResourceReference(ContentProperty, "Cus-SoraLevel99"); + //} + + //puzzle/synth display + if (File.Exists("CustomImages/Worlds/PuzzSynth.png") && PuzzleOption.IsChecked && SynthOption.IsChecked) //both on + { + PuzzSynth.SetResourceReference(ContentProperty, "Cus-PuzzSynth"); + } + if (File.Exists("CustomImages/Worlds/Synth.png") && !PuzzleOption.IsChecked && SynthOption.IsChecked) //synth on puzzle off + { + PuzzSynth.SetResourceReference(ContentProperty, "Cus-PuzzSynth_S"); + } + if (File.Exists("CustomImages/Worlds/Puzzle.png") && PuzzleOption.IsChecked && !SynthOption.IsChecked) //synth off puzzle on + { + PuzzSynth.SetResourceReference(ContentProperty, "Cus-PuzzSynth_P"); + } + } + + } + + public void SetItemImage() + { + LevelIcon.SetResourceReference(ContentProperty, "LevelIcon"); + StrengthIcon.SetResourceReference(ContentProperty, "StrengthIcon"); + MagicIcon.SetResourceReference(ContentProperty, "MagicIcon"); + DefenseIcon.SetResourceReference(ContentProperty, "DefenseIcon"); + DeathIcon.SetResourceReference(ContentProperty, "DeathIcon"); + + string type = "Min-"; + if (OldCheckOption.IsChecked) + type = "Old-"; + + // Item icons + foreach (var item in data.Items.Keys) + { + data.Items[item].Item1.SetResourceReference(ContentProperty, type + item); + + //dirty way of doing this, but oh well + //shadows + if (CusItemCheck[data.Items[item].Item1].Item3 != null) + CusItemCheck[data.Items[item].Item1].Item3.SetResourceReference(ContentProperty, type + item); + } + + // Ghost icons + foreach (var item in data.GhostItems.Values) + { + if (Codes.FindItemType(item.Name) != "report") + item.SetResourceReference(ContentProperty, type + item.Name.Remove(0, 6)); + else + item.SetResourceReference(ContentProperty, type + "Report"); + } + + // stat/info icons + ValorM.SetResourceReference(ContentProperty, "Valor"); + WisdomM.SetResourceReference(ContentProperty, "Wisdom"); + LimitM.SetResourceReference(ContentProperty, "Limit"); + MasterM.SetResourceReference(ContentProperty, "Master"); + FinalM.SetResourceReference(ContentProperty, "Final"); + HighJump.SetResourceReference(ContentProperty, "HighJump"); + QuickRun.SetResourceReference(ContentProperty, "QuickRun"); + DodgeRoll.SetResourceReference(ContentProperty, "DodgeRoll"); + AerialDodge.SetResourceReference(ContentProperty, "AerialDodge"); + Glide.SetResourceReference(ContentProperty, "Glide"); + + CustomChecksCheck(); + } + + public void SetWorldImage() + { + string type = "Min-"; + if (OldWorldOption.IsChecked) + type = "Old-"; + + //main window worlds + SorasHeart.SetResourceReference(ContentProperty, type + "SoraHeartImage"); + SimulatedTwilightTown.SetResourceReference(ContentProperty, type + "SimulatedImage"); + HollowBastion.SetResourceReference(ContentProperty, type + "HollowBastionImage"); + OlympusColiseum.SetResourceReference(ContentProperty, type + "OlympusImage"); + LandofDragons.SetResourceReference(ContentProperty, type + "LandofDragonsImage"); + PrideLands.SetResourceReference(ContentProperty, type + "PrideLandsImage"); + HalloweenTown.SetResourceReference(ContentProperty, type + "HalloweenTownImage"); + SpaceParanoids.SetResourceReference(ContentProperty, type + "SpaceParanoidsImage"); + GoA.SetResourceReference(ContentProperty, type + "GardenofAssemblageImage"); + DriveForms.SetResourceReference(ContentProperty, type + "DriveFormsImage"); + TwilightTown.SetResourceReference(ContentProperty, type + "TwilightTownImage"); + BeastsCastle.SetResourceReference(ContentProperty, type + "BeastCastleImage"); + Agrabah.SetResourceReference(ContentProperty, type + "AgrabahImage"); + HundredAcreWood.SetResourceReference(ContentProperty, type + "HundredAcreImage"); + PortRoyal.SetResourceReference(ContentProperty, type + "PortRoyalImage"); + TWTNW.SetResourceReference(ContentProperty, type + "TWTNWImage"); + Atlantica.SetResourceReference(ContentProperty, type + "AtlanticaImage"); + DisneyCastle.SetResourceReference(ContentProperty, type + "DisneyCastleImage"); + + //puzzle/synth display + if (PuzzleOption.IsChecked && SynthOption.IsChecked) //both on + { + PuzzSynth.SetResourceReference(ContentProperty, type + "PuzzSynth"); + } + if (!PuzzleOption.IsChecked && SynthOption.IsChecked) //synth on puzzle off + { + PuzzSynth.SetResourceReference(ContentProperty, type + "PuzzSynth_S"); + } + if (PuzzleOption.IsChecked && !SynthOption.IsChecked) //synth off puzzle on + { + PuzzSynth.SetResourceReference(ContentProperty, type + "PuzzSynth_P"); + } + + CustomWorldCheck(); + } + } +} \ No newline at end of file diff --git a/KhTracker/Core/ItemPool.cs b/KhTracker/Core/ItemPool.cs new file mode 100644 index 00000000..95e3e038 --- /dev/null +++ b/KhTracker/Core/ItemPool.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Media.Imaging; +using System.Windows.Media; +using System.IO; + +namespace KhTracker +{ + //creating this to try and set up custom itemgrid layouts + public partial class MainWindow : Window + { + //nothing yet, get basic funtionallity working first + + + } +} diff --git a/KhTracker/Log.cs b/KhTracker/Core/Log.cs similarity index 100% rename from KhTracker/Log.cs rename to KhTracker/Core/Log.cs diff --git a/KhTracker/Core/Options.cs b/KhTracker/Core/Options.cs new file mode 100644 index 00000000..e8586c8a --- /dev/null +++ b/KhTracker/Core/Options.cs @@ -0,0 +1,3156 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; +using System.IO; +using System.IO.Compression; +using Microsoft.Win32; +using System.Linq; +using System.Text; +using System.Text.Json; +using Path = System.IO.Path; +using KhTracker.Hotkeys; +using System.Windows.Input; +using System.Xml.Linq; +using System.Text.Json.Serialization; +using System.Security.Policy; +using System.Linq.Expressions; +using System.Windows.Markup; +using System.Reflection; +using System.Diagnostics.PerformanceData; +using MessageForm = System.Windows.Forms; + +//using System.Text.Json.Serialization; +//using YamlDotNet.Serialization; + +namespace KhTracker +{ + public partial class MainWindow : Window + { + /// + /// Save/load progress + /// + + private void DropFile(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop)) + { + string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); + + if (Path.GetExtension(files[0]).ToUpper() == ".HINT") + LoadHints(files[0]); + else if (Path.GetExtension(files[0]).ToUpper() == ".PNACH") + ParseSeed(files[0]); + else if (Path.GetExtension(files[0]).ToUpper() == ".ZIP") + OpenKHSeed(files[0]); + else if (Path.GetExtension(files[0]).ToUpper() == ".TSV") + Load(files[0]); + } + } + + private void SaveProgress(object sender, RoutedEventArgs e) + { + SaveFileDialog saveFileDialog = new SaveFileDialog + { + DefaultExt = ".tsv", + Filter = "Tracker Save File (*.tsv)|*.tsv", + FileName = "kh2fm-tracker-save", + InitialDirectory = AppDomain.CurrentDomain.BaseDirectory + }; + if (saveFileDialog.ShowDialog() == true) + { + Save(saveFileDialog.FileName); + } + } + + public void Save(string filename) + { + #region Settings + var settingInfo = new bool[31]; + //Display toggles + settingInfo[0] = ReportsOption.IsChecked; + settingInfo[1] = TornPagesOption.IsChecked; + settingInfo[2] = PromiseCharmOption.IsChecked; + settingInfo[3] = AbilitiesOption.IsChecked; + settingInfo[4] = AntiFormOption.IsChecked; + settingInfo[5] = VisitLockOption.IsChecked; + settingInfo[6] = ExtraChecksOption.IsChecked; + settingInfo[7] = SoraLevel01Option.IsChecked; + settingInfo[8] = SoraLevel50Option.IsChecked; + settingInfo[9] = SoraLevel99Option.IsChecked; + //World toggles + settingInfo[10] = SoraHeartOption.IsChecked; + settingInfo[11] = DrivesOption.IsChecked; + settingInfo[12] = SimulatedOption.IsChecked; + settingInfo[13] = TwilightTownOption.IsChecked; + settingInfo[14] = HollowBastionOption.IsChecked; + settingInfo[15] = BeastCastleOption.IsChecked; + settingInfo[16] = OlympusOption.IsChecked; + settingInfo[17] = AgrabahOption.IsChecked; + settingInfo[18] = LandofDragonsOption.IsChecked; + settingInfo[19] = DisneyCastleOption.IsChecked; + settingInfo[20] = PrideLandsOption.IsChecked; + settingInfo[21] = PortRoyalOption.IsChecked; + settingInfo[22] = HalloweenTownOption.IsChecked; + settingInfo[23] = SpaceParanoidsOption.IsChecked; + settingInfo[24] = TWTNWOption.IsChecked; + settingInfo[25] = HundredAcreWoodOption.IsChecked; + settingInfo[26] = AtlanticaOption.IsChecked; + settingInfo[27] = SynthOption.IsChecked; + settingInfo[28] = PuzzleOption.IsChecked; + //other + settingInfo[29] = GhostItemOption.IsChecked; + settingInfo[30] = GhostMathOption.IsChecked; + #endregion + + #region ReportInfo + var attempsInfo = new int[13]; + for (int i = 0; i < 13; ++i) + { + int attempts = 3; + if (data.hintsLoaded) + attempts = data.reportAttempts[i]; + + attempsInfo[i] = attempts; + } + #endregion + + #region WorldInfo + Dictionary worldvalueInfo = new Dictionary(); + foreach (string worldKey in data.WorldsData.Keys.ToList()) + { + var worldData = data.WorldsData[worldKey]; + List worldItems = new List(); + foreach (Item item in worldData.worldGrid.Children) + { + worldItems.Add(item.Name); + } + var testingthing = new + { + //Value = worldData.value.Text, //do i need this? + //Progression = worldData.progress, //or this? + Items = worldItems + //Hinted = worldData.hinted, + //HintedHint = worldData.hintedHint, + //GhostHint = worldData.containsGhost, + //Complete = worldData.complete, + //Locks = worldData.visitLocks, + }; + worldvalueInfo.Add(worldKey, testingthing); + }; + #endregion + + #region Counters + var counterInfo = new int[8]{1,1,1,1,1,1,0,0}; + counterInfo[0] = data.DriveLevels[0]; + counterInfo[1] = data.DriveLevels[1]; + counterInfo[2] = data.DriveLevels[2]; + counterInfo[3] = data.DriveLevels[3]; + counterInfo[4] = data.DriveLevels[4]; + if(stats != null) + counterInfo[5] = stats.Level; + counterInfo[6] = DeathCounter; + counterInfo[7] = data.usedPages; + #endregion + + FileStream file = File.Create(filename); + StreamWriter writer = new StreamWriter(file); + var saveInfo = new + { + Version = Title, + SeedHash = data.seedHashVisual, + Settings = settingInfo, + SeedHints = data.openKHHintText, + BossHints = data.openKHBossText, + RandomSeed = data.convertedSeedHash, + Worlds = worldvalueInfo, + Reports = data.reportInformation, + Attemps = attempsInfo, + Counters = counterInfo, + ForcedFinal = data.forcedFinal, + Events = data.eventLog, + BossEvents = data.bossEventLog, + LegacyJsmartee = data.legacyJsmartee, + LegacyJHints = data.hintFileText, + LegacyShan = data.legacyShan, + LegacySHints = data.shanHintFileText + }; + + var saveFinal = JsonSerializer.Serialize(saveInfo); + string saveFinal64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(saveFinal)); + string saveScrambled = ScrambleText(saveFinal64, true); + writer.WriteLine(saveScrambled); + writer.Close(); + } + + private void LoadProgress(object sender, RoutedEventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog + { + DefaultExt = ".tsv", + Filter = "Tracker Save File (*.tsv)|*.tsv", + FileName = "kh2fm-tracker-save", + InitialDirectory = AppDomain.CurrentDomain.BaseDirectory + }; + if (openFileDialog.ShowDialog() == true) + { + Load(openFileDialog.FileName); + } + } + + private void Load(string filename) + { + if (!InProgressCheck("tsv")) + return; + + //open file + StreamReader reader = new StreamReader(File.Open(filename, FileMode.Open)); + var savescrambled = reader.ReadLine(); + reader.Close(); + + //start reading save + var save64 = ScrambleText(savescrambled, false); + var saveData = Encoding.UTF8.GetString(Convert.FromBase64String(save64)); + var saveObject = JsonSerializer.Deserialize>(saveData); + + //check save version + if (saveObject.ContainsKey("Version")) + { + string saveVer = saveObject["Version"].ToString(); + if (saveVer != Title) + { + //Console.WriteLine("Different save version!"); + string message = "This save was made with a different version of the tracker. " + + "\n Loading this may cause unintended effects. " + + "\n Do you still want to continue loading?"; + string caption = "Save Version Mismatch"; + MessageForm.MessageBoxButtons buttons = MessageForm.MessageBoxButtons.YesNo; + MessageForm.DialogResult result; + + result = MessageForm.MessageBox.Show(message, caption, buttons); + if (result == MessageForm.DialogResult.No) + { + return; + } + } + } + + //reset + OnReset(null, null); + + //check legacy hint styles + if (saveObject.ContainsKey("LegacyJsmartee")) + { + if (saveObject["LegacyJsmartee"].ToString().ToLower() == "true") + { + LoadLegacy(saveObject, "Jsmartee"); + return; + } + } + if (saveObject.ContainsKey("LegacyShan")) + { + if (saveObject["LegacyShan"].ToString().ToLower() == "true") + { + LoadLegacy(saveObject, "Shan"); + return; + } + } + + //continue to loading normally + LoadNormal(saveObject); + + if (data.wasTracking) + { + InitTracker(); + } + } + + private void LoadNormal(Dictionary Savefile) + { + //Check Settings + if (Savefile.ContainsKey("Settings")) + { + var setting = JsonSerializer.Deserialize(Savefile["Settings"].ToString()); + //Display toggles + ReportsToggle(setting[0]); + TornPagesToggle(setting[1]); + PromiseCharmToggle(setting[2]); + AbilitiesToggle(setting[3]); + AntiFormToggle(setting[4]); + VisitLockToggle(setting[5]); + ExtraChecksToggle(setting[6]); + if (setting[7]) + SoraLevel01Toggle(true); + else if (setting[8]) + SoraLevel50Toggle(true); + else if (setting[9]) + SoraLevel99Toggle(true); + //World toggles + SoraHeartToggle(setting[10]); + DrivesToggle(setting[11]); + SimulatedToggle(setting[12]); + TwilightTownToggle(setting[13]); + HollowBastionToggle(setting[14]); + BeastCastleToggle(setting[15]); + OlympusToggle(setting[16]); + AgrabahToggle(setting[17]); + LandofDragonsToggle(setting[18]); + DisneyCastleToggle(setting[19]); + PrideLandsToggle(setting[20]); + PortRoyalToggle(setting[21]); + HalloweenTownToggle(setting[22]); + SpaceParanoidsToggle(setting[23]); + TWTNWToggle(setting[24]); + HundredAcreWoodToggle(setting[25]); + AtlanticaToggle(setting[26]); + SynthToggle(setting[27]); + PuzzleToggle(setting[28]); + ////other + //settingInfo[29] = GhostItemOption.IsChecked; + //settingInfo[30] = GhostMathOption.IsChecked; + } + + //check if enemy rando data exists + if (Savefile.ContainsKey("BossHints")) + { + if (Savefile["BossHints"].ToString() != "None") + { + data.BossRandoFound = true; + data.openKHBossText = Savefile["BossHints"].ToString(); + + var enemyText = Encoding.UTF8.GetString(Convert.FromBase64String(data.openKHBossText)); + try + { + var enemyObject = JsonSerializer.Deserialize>(enemyText); + var bosses = JsonSerializer.Deserialize>>(enemyObject["BOSSES"].ToString()); + + foreach (var bosspair in bosses) + { + string bossOrig = bosspair["original"].ToString(); + string bossRepl = bosspair["new"].ToString(); + + data.BossList.Add(bossOrig, bossRepl); + } + } + catch + { + data.BossRandoFound = false; + data.openKHBossText = "None"; + App.logger?.Record("error while trying to parse bosses from save."); + } + } + } + + //use random seed from save + if(Savefile.ContainsKey("RandomSeed")) + { + if (Savefile["RandomSeed"] != null) + { + var seednumber = JsonSerializer.Deserialize(Savefile["RandomSeed"].ToString()); + data.convertedSeedHash = seednumber; + } + } + + //check hintsdata + if (Savefile.ContainsKey("SeedHints")) + { + if (Savefile["SeedHints"].ToString() != "None") + { + data.openKHHintText = Savefile["SeedHints"].ToString(); + var hintText = Encoding.UTF8.GetString(Convert.FromBase64String(data.openKHHintText)); + var hintObject = JsonSerializer.Deserialize>(hintText); + var settings = new List(); + var hintableItems = new List(); + //fallback for older seeds + try + { + hintableItems = new List(JsonSerializer.Deserialize>(hintObject["reveal"].ToString())); + } + catch + { + App.logger?.Record("Older seed. no reveal list. (This is probably fine)"); + } + + data.ShouldResetHash = false; + + //if (hintObject.ContainsKey("generatorVersion")) + //{ + // data.seedgenVersion = hintObject["generatorVersion"].ToString(); + //} + + //if (hintObject.ContainsKey("dummy_forms")) + //{ + // if (hintObject["dummy_forms"].ToString() == "true") + // data.altFinalTracking = true; + //} + + if (hintObject.ContainsKey("settings")) + { + settings = JsonSerializer.Deserialize>(hintObject["settings"].ToString()); + + #region Settings + + if (hintableItems.Contains("report")) + ReportsToggle(true); + else + ReportsToggle(false); + + if (hintableItems.Contains("page")) + TornPagesToggle(true); + else + TornPagesToggle(false); + + if (hintableItems.Contains("ability")) + AbilitiesToggle(true); + else + AbilitiesToggle(false); + + if (hintableItems.Count == 0) + { + ReportsToggle(true); + TornPagesToggle(true); + AbilitiesToggle(true); + } + + //item settings + PromiseCharmToggle(false); + //AbilitiesToggle(false); + VisitLockToggle(false); + ExtraChecksToggle(false); + AntiFormToggle(false); + + //world settings + SoraHeartToggle(true); + DrivesToggle(false); + SimulatedToggle(false); + TwilightTownToggle(false); + HollowBastionToggle(false); + BeastCastleToggle(false); + OlympusToggle(false); + AgrabahToggle(false); + LandofDragonsToggle(false); + DisneyCastleToggle(false); + PrideLandsToggle(false); + PortRoyalToggle(false); + HalloweenTownToggle(false); + SpaceParanoidsToggle(false); + TWTNWToggle(false); + HundredAcreWoodToggle(false); + AtlanticaToggle(false); + PuzzleToggle(false); + SynthToggle(false); + + //progression hints GoA Current Hint Count + data.WorldsData["GoA"].value.Visibility = Visibility.Hidden; + + //settings visuals + SettingRow.Height = new GridLength(0.5, GridUnitType.Star); + Setting_BetterSTT.Width = new GridLength(0, GridUnitType.Star); + Setting_Level_01.Width = new GridLength(0, GridUnitType.Star); + Setting_Level_50.Width = new GridLength(0, GridUnitType.Star); + Setting_Level_99.Width = new GridLength(0, GridUnitType.Star); + Setting_Absent.Width = new GridLength(0, GridUnitType.Star); + Setting_Absent_Split.Width = new GridLength(0, GridUnitType.Star); + Setting_Datas.Width = new GridLength(0, GridUnitType.Star); + Setting_Sephiroth.Width = new GridLength(0, GridUnitType.Star); + Setting_Terra.Width = new GridLength(0, GridUnitType.Star); + Setting_Cups.Width = new GridLength(0, GridUnitType.Star); + Setting_HadesCup.Width = new GridLength(0, GridUnitType.Star); + Setting_Cavern.Width = new GridLength(0, GridUnitType.Star); + Setting_Transport.Width = new GridLength(0, GridUnitType.Star); + Double SpacerValue = 10; + #endregion + + //to be safe about this i guess + //bool abilitiesOn = true; + bool puzzleOn = false; + //bool synthOn = false; + + //load settings from hints + foreach (string setting in settings) + { + Console.WriteLine("setting found = " + setting); + + switch (setting) + { + //items + case "PromiseCharm": + PromiseCharmToggle(true); + break; + //case "Level1Mode": + // abilitiesOn = false; + // break; + case "visit_locking": + VisitLockToggle(true); + break; + case "extra_ics": + ExtraChecksToggle(true); + break; + case "Anti-Form": + AntiFormToggle(true); + break; + //worlds + case "Level": + SoraHeartToggle(false); + SoraLevel01Toggle(true); + AbilitiesToggle(true); + Setting_Level_01.Width = new GridLength(1.5, GridUnitType.Star); + SpacerValue--; + break; + case "ExcludeFrom50": + SoraLevel50Toggle(true); + AbilitiesToggle(true); + Setting_Level_50.Width = new GridLength(1.5, GridUnitType.Star); + SpacerValue--; + data.HintRevealOrder.Add("SorasHeart"); + break; + case "ExcludeFrom99": + SoraLevel99Toggle(true); + AbilitiesToggle(true); + Setting_Level_99.Width = new GridLength(1.5, GridUnitType.Star); + SpacerValue--; + data.HintRevealOrder.Add("SorasHeart"); + break; + case "Simulated Twilight Town": + SimulatedToggle(true); + data.enabledWorlds.Add("STT"); + data.HintRevealOrder.Add("SimulatedTwilightTown"); + break; + case "Hundred Acre Wood": + HundredAcreWoodToggle(true); + data.enabledWorlds.Add("HundredAcreWood"); + data.HintRevealOrder.Add("HundredAcreWood"); + break; + case "Atlantica": + AtlanticaToggle(true); + data.enabledWorlds.Add("Atlantica"); + data.HintRevealOrder.Add("Atlantica"); + break; + case "Puzzle": + PuzzleToggle(true); + puzzleOn = true; + data.puzzlesOn = true; + break; + case "Synthesis": + SynthToggle(true); + //synthOn = true; + data.synthOn = true; + break; + case "Form Levels": + DrivesToggle(true); + data.HintRevealOrder.Add("DriveForms"); + break; + case "Land of Dragons": + LandofDragonsToggle(true); + data.enabledWorlds.Add("LoD"); + data.HintRevealOrder.Add("LandofDragons"); + break; + case "Beast's Castle": + BeastCastleToggle(true); + data.enabledWorlds.Add("BC"); + data.HintRevealOrder.Add("BeastsCastle"); + break; + case "Hollow Bastion": + HollowBastionToggle(true); + data.enabledWorlds.Add("HB"); + data.HintRevealOrder.Add("HollowBastion"); + break; + case "Twilight Town": + TwilightTownToggle(true); + data.enabledWorlds.Add("TT"); + data.HintRevealOrder.Add("TwilightTown"); + break; + case "The World That Never Was": + TWTNWToggle(true); + data.enabledWorlds.Add("TWTNW"); + data.HintRevealOrder.Add("TWTNW"); + break; + case "Space Paranoids": + SpaceParanoidsToggle(true); + data.enabledWorlds.Add("SP"); + data.HintRevealOrder.Add("SpaceParanoids"); + break; + case "Port Royal": + PortRoyalToggle(true); + data.enabledWorlds.Add("PR"); + data.HintRevealOrder.Add("PortRoyal"); + break; + case "Olympus Coliseum": + OlympusToggle(true); + data.enabledWorlds.Add("OC"); + data.HintRevealOrder.Add("OlympusColiseum"); + break; + case "Agrabah": + AgrabahToggle(true); + data.enabledWorlds.Add("AG"); + data.HintRevealOrder.Add("Agrabah"); + break; + case "Halloween Town": + HalloweenTownToggle(true); + data.enabledWorlds.Add("HT"); + data.HintRevealOrder.Add("HalloweenTown"); + break; + case "Pride Lands": + PrideLandsToggle(true); + data.enabledWorlds.Add("PL"); + data.HintRevealOrder.Add("PrideLands"); + break; + case "Disney Castle / Timeless River": + DisneyCastleToggle(true); + data.enabledWorlds.Add("DC"); + data.HintRevealOrder.Add("DisneyCastle"); + break; + //settings + case "better_stt": + Setting_BetterSTT.Width = new GridLength(1.1, GridUnitType.Star); + SpacerValue--; + break; + case "Cavern of Remembrance": + Setting_Cavern.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Data Split": + Setting_Absent_Split.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + data.dataSplit = true; + break; + case "Absent Silhouettes": + if (!data.dataSplit) //only use if we didn't already set the data split version + { + Setting_Absent.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + } + break; + case "Sephiroth": + Setting_Sephiroth.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Lingering Will (Terra)": + Setting_Terra.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Data Organization XIII": + Setting_Datas.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Transport to Remembrance": + Setting_Transport.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Olympus Cups": + Setting_Cups.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Hades Paradox Cup": + Setting_HadesCup.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "ScoreMode": + data.ScoreMode = true; + break; + //progression hints + case "ProgressionHints": + data.UsingProgressionHints = true; + data.WorldsData["GoA"].value.Visibility = Visibility.Visible; + data.WorldsData["GoA"].value.Text = "0"; + //Console.WriteLine("ENABLING PROGRESSION HINTS"); + break; + case "dummy_forms": + data.altFinalTracking = true; + break; + } + } + + //if (abilitiesOn == false) + // AbilitiesToggle(false); + + //prevent creations hinting twice for progression + if ((puzzleOn || hintObject["hintsType"].ToString() == "Path") && !data.HintRevealOrder.Contains("PuzzSynth")) + { + data.HintRevealOrder.Add("PuzzSynth"); + } + + Setting_Spacer.Width = new GridLength(SpacerValue, GridUnitType.Star); + SettingsText.Text = "Settings:"; + + } + + if (hintObject.ContainsKey("ProgressionType")) + { + data.progressionType = hintObject["ProgressionType"].ToString(); + } + + if (hintObject.ContainsKey("ProgressionSettings")) + { + if (data.progressionType != "Bosses") + data.progressionType = "Reports"; + + var progressionSettings = JsonSerializer.Deserialize>>(hintObject["ProgressionSettings"].ToString()); + + foreach (var setting in progressionSettings) + { + //Console.WriteLine("progression setting found = " + setting.Key); + + switch (setting.Key) + { + case "HintCosts": + data.HintCosts.Clear(); + foreach (int cost in setting.Value) + data.HintCosts.Add(cost); + data.HintCosts.Add(data.HintCosts[data.HintCosts.Count - 1] + 1); //duplicates the last cost for logic reasons + break; + case "SimulatedTwilightTown": + data.STT_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.STT_ProgressionValues.Add(cost); + break; + case "TwilightTown": + data.TT_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.TT_ProgressionValues.Add(cost); + break; + case "HollowBastion": + data.HB_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.HB_ProgressionValues.Add(cost); + break; + case "CavernofRemembrance": + data.CoR_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.CoR_ProgressionValues.Add(cost); + break; + case "LandofDragons": + data.LoD_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.LoD_ProgressionValues.Add(cost); + break; + case "BeastsCastle": + data.BC_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.BC_ProgressionValues.Add(cost); + break; + case "OlympusColiseum": + data.OC_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.OC_ProgressionValues.Add(cost); + break; + case "DisneyCastle": + data.DC_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.DC_ProgressionValues.Add(cost); + break; + case "Agrabah": + data.AG_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.AG_ProgressionValues.Add(cost); + break; + case "PortRoyal": + data.PR_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.PR_ProgressionValues.Add(cost); + break; + case "HalloweenTown": + data.HT_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.HT_ProgressionValues.Add(cost); + break; + case "PrideLands": + data.PL_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.PL_ProgressionValues.Add(cost); + break; + case "HundredAcreWood": + data.HAW_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.HAW_ProgressionValues.Add(cost); + break; + case "SpaceParanoids": + data.SP_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.SP_ProgressionValues.Add(cost); + break; + case "TWTNW": + data.TWTNW_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.TWTNW_ProgressionValues.Add(cost); + break; + case "Atlantica": + data.AT_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.AT_ProgressionValues.Add(cost); + break; + case "ReportBonus": + data.ReportBonus = setting.Value[0]; + break; + case "WorldCompleteBonus": + data.WorldCompleteBonus = setting.Value[0]; + break; + case "Levels": + data.Levels_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.Levels_ProgressionValues.Add(cost); + break; + case "Drives": + data.Drives_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.Drives_ProgressionValues.Add(cost); + break; + case "FinalXemnasReveal": + data.revealFinalXemnas = setting.Value[0] == 0 ? false : true; + break; + } + } + //data.NumOfHints = data.HintCosts.Count; + //set text correctly + ProgressionCollectedValue.Visibility = Visibility.Visible; + ProgressionCollectedBar.Visibility = Visibility.Visible; + ProgressionCollectedValue.Text = "0"; + ProgressionTotalValue.Text = data.HintCosts[0].ToString(); + } + + switch (hintObject["hintsType"].ToString()) + { + case "Shananas": + { + SetMode(Mode.OpenKHShanHints); + ShanHints(hintObject); + } + break; + case "JSmartee": + { + SetMode(Mode.OpenKHJsmarteeHints); + JsmarteeHints(hintObject); + } + break; + case "Points": + { + SetMode(Mode.PointsHints); + PointsHints(hintObject); + } + break; + case "Path": + { + SetMode(Mode.PathHints); + PathHints(hintObject); + } + break; + case "Spoiler": + { + SetMode(Mode.SpoilerHints); + SpoilerHints(hintObject); + } + break; + default: + break; + } + + } + } + + //replace the hint text with the one in the save + //why? i dunno might be important incase the way i gen boss hints changes or somethin + if (Savefile.ContainsKey("Reports")) + { + var reportInfo = JsonSerializer.Deserialize>>(Savefile["Reports"].ToString()); + data.reportInformation = reportInfo; + } + + //forced final check (unsure if this will actually help with it not mistracking) + if (Savefile.ContainsKey("ForcedFinal")) + { + string forced = Savefile["ForcedFinal"].ToString().ToLower(); + if (forced == "true") + data.forcedFinal = true; + else + data.forcedFinal = false; + } + + //track obtained items + if (Savefile.ContainsKey("Worlds")) + { + var worlds = JsonSerializer.Deserialize>>(Savefile["Worlds"].ToString()); + foreach (var world in worlds) + { + var itemlist = JsonSerializer.Deserialize>(world.Value["Items"].ToString()); + foreach (string item in itemlist) + { + WorldGrid grid = FindName(world.Key + "Grid") as WorldGrid; + Item importantCheck = FindName(item) as Item; + if (grid.ReportHandler(importantCheck)) + { + //add items, skip ghosts. ghosts are always added by reports anyway + if (!item.StartsWith("Ghost_")) + grid.Add_Item(importantCheck); + } + } + } + } + + //track events/progression + if (Savefile.ContainsKey("Events")) + { + var eventlist = JsonSerializer.Deserialize>>(Savefile["Events"].ToString()); + for (int i = 0; i < eventlist.Count; ++i) + { + UpdateWorldProgress(null, true, eventlist[i]); + } + } + + //track boss events + if (Savefile.ContainsKey("BossEvents") && data.BossRandoFound) + { + var bossEventlist = JsonSerializer.Deserialize>>(Savefile["BossEvents"].ToString()); + for (int i = 0; i < bossEventlist.Count; ++i) + { + GetBoss(null, true, bossEventlist[i]); + } + } + + //fix counters + if (Savefile.ContainsKey("Counters")) + { + var counters = JsonSerializer.Deserialize(Savefile["Counters"].ToString()); + for (int i = 0; i < counters.Length; ++i) + { + if (i < 5) + { + FakeDrivesProgressionBonus(i, counters[i]); + } + else if (i == 5) + { + //need to add sora levels one at a time to get points correctly + for (int l = 0; l < counters[i]; ++l) + { + FakeLevelsProgressionBonus(l+1); + } + } + } + DeathCounter = counters[6]; + data.usedPages = counters[7]; + } + + //fix reports attempts + if (Savefile.ContainsKey("Attemps")) + { + var attempts = JsonSerializer.Deserialize(Savefile["Attemps"].ToString()); + string[] failNames = new string[4]{ "Fail3", "Fail2", "Fail1", "Fail0"}; + + for (int i = 0; i < 13; ++i) + { + data.ReportAttemptVisual[i].SetResourceReference(ContentControl.ContentProperty, failNames[attempts[i]]); + data.reportAttempts[i] = attempts[i]; + } + } + + //check hash + if (Savefile.ContainsKey("SeedHash")) + { + if (Savefile["SeedHash"] != null) + { + try + { + var hash = JsonSerializer.Deserialize(Savefile["SeedHash"].ToString()); + data.seedHashVisual = hash; + + //Set Icons + HashIcon1.SetResourceReference(ContentProperty, hash[0]); + HashIcon2.SetResourceReference(ContentProperty, hash[1]); + HashIcon3.SetResourceReference(ContentProperty, hash[2]); + HashIcon4.SetResourceReference(ContentProperty, hash[3]); + HashIcon5.SetResourceReference(ContentProperty, hash[4]); + HashIcon6.SetResourceReference(ContentProperty, hash[5]); + HashIcon7.SetResourceReference(ContentProperty, hash[6]); + data.SeedHashLoaded = true; + + //make visible + if (SeedHashOption.IsChecked) + { + SetHintText(""); + HashGrid.Visibility = Visibility.Visible; + } + } + catch + { + data.seedHashVisual = null; + HashGrid.Visibility = Visibility.Hidden; + App.logger?.Record("error while trying to parse seed hash. text corrupted?"); + } + } + + } + + //end of loading + data.saveFileLoaded = true; + } + + private void LoadLegacy(Dictionary Savefile, string LegacyType) + { + if (LegacyType == "Jsmartee") + { + SetMode(Mode.JsmarteeHints); + + var hintStrings = JsonSerializer.Deserialize(Savefile["LegacyJHints"].ToString()); + string line1 = hintStrings[0]; + data.hintFileText[0] = line1; + string[] reportvalues = line1.Split('.'); + + string line2 = hintStrings[1]; + data.hintFileText[1] = line2; + line2 = line2.TrimEnd('.'); + string[] reportorder = line2.Split('.'); + + string line3 = hintStrings[2]; + data.hintFileText[2] = line3; + LoadSettings(line3); + + for (int i = 0; i < reportorder.Length; ++i) + { + string location = data.codes.FindCode(reportorder[i]); + if (location == "") + location = data.codes.GetDefault(i); + + data.reportLocations.Add(location); + string[] temp = reportvalues[i].Split(','); + data.reportInformation.Add(new Tuple(null, data.codes.FindCode(temp[0]), int.Parse(temp[1]) - 32)); + } + + //end of loading + data.hintsLoaded = true; + data.legacyJsmartee = true; + data.saveFileLoaded = true; + } + else + { + //bool autotrackeron = false; + //bool ps2tracking = false; + ////check for autotracking on and which version + //if (aTimer != null) + // autotrackeron = true; + // + //if (pcsx2tracking) + // ps2tracking = true; + + //FixDictionary(); + SetMode(Mode.ShanHints); + + var hintStrings = JsonSerializer.Deserialize(Savefile["LegacySHints"].ToString()); + + if (data.shanHintFileText != null) + { + data.shanHintFileText = null; + } + + foreach (string world in data.WorldsData.Keys.ToList()) + { + data.WorldsData[world].checkCount.Clear(); + } + + bool check1 = false; + bool check2 = false; + for (int i = 0; i < hintStrings.Length; ++i) + { + string line = hintStrings[i]; + data.shanHintFileText[i] = line; + + // ignore comment lines + if (line.Length >= 2 && line[0] == '/' && line[1] == '/') + continue; + + string[] codes = line.Split(','); + if (codes.Length == 5) + { + string world = data.codes.FindCode(codes[2]); + + //stupid fix + string[] idCode = codes[4].Split('/', ' '); + + int id = Convert.ToInt32(idCode[0], 16); + if (world == "" || world == "GoA" || data.codes.itemCodes.ContainsKey(id) == false || (id >= 226 && id <= 238)) + continue; + + string item = data.codes.itemCodes[Convert.ToInt32(codes[4], 16)]; + data.WorldsData[world].checkCount.Add(item); + } + else if (codes.Length == 1) + { + if (codes[0] == "//Remove High Jump LVl" || codes[0] == "//Remove Quick Run LVl") + { + check1 = true; + } + else if (codes[0] == "//Remove Dodge Roll LVl") + { + check2 = true; + } + } + } + data.legacyShan = true; + + if (check1 == true && check2 == false) + { + foreach (string world in data.WorldsData.Keys.ToList()) + { + data.WorldsData[world].checkCount.Clear(); + } + } + + foreach (var key in data.WorldsData.Keys.ToList()) + { + if (key == "GoA") + continue; + + data.WorldsData[key].worldGrid.WorldComplete(); + SetWorldValue(data.WorldsData[key].value, 0); + } + + //end of loading + data.saveFileLoaded = true; + + //if (autotrackeron) + //{ + // InitAutoTracker(ps2tracking); + //} + } + } + + //progress helpers + + private string ScrambleText(string input, bool scramble) + { + //scrambles/unscrambles input text based on a seed + //why have this? i dunno i suppose to make saves more "secure" + //figure if people really want to cheat they would have to look at this code + Random r = new Random(16964); //why this number? who knows... (let me know if you figure it out lol) + if (scramble) + { + char[] chars = input.ToArray(); + for (int i = 0; i < chars.Length; i++) + { + int randomIndex = r.Next(0, chars.Length); + char temp = chars[randomIndex]; + chars[randomIndex] = chars[i]; + chars[i] = temp; + } + return new string(chars); + } + else + { + char[] scramChars = input.ToArray(); + List swaps = new List(); + for (int i = 0; i < scramChars.Length; i++) + { + swaps.Add(r.Next(0, scramChars.Length)); + } + for (int i = scramChars.Length - 1; i >= 0; i--) + { + char temp = scramChars[swaps[i]]; + scramChars[swaps[i]] = scramChars[i]; + scramChars[i] = temp; + } + return new string(scramChars); + } + } + + //trigger autotracker specific stuff with save loading + private void FakeDrivesProgressionBonus(int drive, int level) + { + if (!data.UsingProgressionHints) + return; + + while (drive == 0 && (level > data.DriveLevels[0])) + { + AddProgressionPoints(data.Drives_ProgressionValues[data.DriveLevels[0] - 1]); + data.DriveLevels[0]++; + } + while (drive == 1 && (level > data.DriveLevels[1])) + { + AddProgressionPoints(data.Drives_ProgressionValues[data.DriveLevels[1] - 1]); + data.DriveLevels[1]++; + } + while (drive == 2 && (level > data.DriveLevels[2])) + { + AddProgressionPoints(data.Drives_ProgressionValues[data.DriveLevels[2] - 1]); + data.DriveLevels[2]++; + } + while (drive == 3 && (level > data.DriveLevels[3])) + { + AddProgressionPoints(data.Drives_ProgressionValues[data.DriveLevels[3] - 1]); + data.DriveLevels[3]++; + } + while (drive == 4 && (level > data.DriveLevels[4])) + { + AddProgressionPoints(data.Drives_ProgressionValues[data.DriveLevels[4] - 1]); + data.DriveLevels[4]++; + } + } + + private void FakeLevelsProgressionBonus(int level) + { + //if sora's current level is great than the max specified level (usually 50), then do nothing + if (level > (data.Levels_ProgressionValues.Count * 10) || !data.UsingProgressionHints) + return; + + //every 10 levels, reward the player the progression points for that part + while (level > data.NextLevelMilestone) + { + data.NextLevelMilestone += 10; + AddProgressionPoints(data.Levels_ProgressionValues[data.LevelsPreviousIndex++]); + } + } + + /// + /// Load hints + /// + + //Shans Classic + private void ParseSeed(object sender, RoutedEventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog + { + DefaultExt = ".pnach", + Filter = "pnach files (*.pnach)|*.pnach", + Title = "Select Seed File" + }; + if (openFileDialog.ShowDialog() == true) + { + ParseSeed(openFileDialog.FileName); + } + } + + public void ParseSeed(string filename) + { + if (!InProgressCheck("seed")) + return; + + //bool autotrackeron = false; + //bool ps2tracking = false; + //check for autotracking on and which version + //if (aTimer != null) + // autotrackeron = true; + // + //if (pcsx2tracking) + // ps2tracking = true; + + //FixDictionary(); + SetMode(Mode.ShanHints); + + if (data.shanHintFileText != null) + { + data.shanHintFileText = null; + } + + foreach (string world in data.WorldsData.Keys.ToList()) + { + data.WorldsData[world].checkCount.Clear(); + } + + StreamReader streamReader = new StreamReader(filename); + bool check1 = false; + bool check2 = false; + + int lineNum = 0; + while (streamReader.EndOfStream == false) + { + string line = streamReader.ReadLine(); + data.shanHintFileText[lineNum] = line; + + // ignore comment lines + if (line.Length >= 2 && line[0] == '/' && line[1] == '/') + continue; + + string[] codes = line.Split(','); + if (codes.Length == 5) + { + string world = data.codes.FindCode(codes[2]); + + //stupid fix + string[] idCode = codes[4].Split('/', ' '); + + int id = Convert.ToInt32(idCode[0], 16); + if (world == "" || world == "GoA" || data.codes.itemCodes.ContainsKey(id) == false || (id >= 226 && id <= 238)) + continue; + + string item = data.codes.itemCodes[Convert.ToInt32(codes[4], 16)]; + data.WorldsData[world].checkCount.Add(item); + } + else if (codes.Length == 1) + { + if (codes[0] == "//Remove High Jump LVl" || codes[0] == "//Remove Quick Run LVl") + { + check1 = true; + } + else if (codes[0] == "//Remove Dodge Roll LVl") + { + check2 = true; + } + } + + lineNum++; + } + streamReader.Close(); + data.legacyShan = true; + + if (check1 == true && check2 == false) + { + foreach (string world in data.WorldsData.Keys.ToList()) + { + data.WorldsData[world].checkCount.Clear(); + } + } + + foreach (var key in data.WorldsData.Keys.ToList()) + { + if (key == "GoA") + continue; + + data.WorldsData[key].worldGrid.WorldComplete(); + SetWorldValue(data.WorldsData[key].value, 0); + } + + data.seedLoaded = true; + + if (data.wasTracking) + InitTracker(); + } + + //Jsmartee Classic + private void LoadHints(object sender, RoutedEventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog + { + DefaultExt = ".hint", + Filter = "Jsmartee hint file (*.hint)|*.hint", + Title = "Select Hint File" + }; + if (openFileDialog.ShowDialog() == true) + { + LoadHints(openFileDialog.FileName); + } + } + + public void LoadHints(string filename) + { + if (!InProgressCheck("hints")) + return; + + SetMode(Mode.JsmarteeHints); + //ResetHints(); + + StreamReader streamReader = new StreamReader(filename); + + if (streamReader.EndOfStream) + { + SetHintText("Error loading hints"); + streamReader.Close(); + return; + } + + string line1 = streamReader.ReadLine(); + data.hintFileText[0] = line1; + string[] reportvalues = line1.Split('.'); + + if (streamReader.EndOfStream) + { + SetHintText("Error loading hints"); + streamReader.Close(); + return; + } + + string line2 = streamReader.ReadLine(); + data.hintFileText[1] = line2; + line2 = line2.TrimEnd('.'); + string[] reportorder = line2.Split('.'); + + string line3 = streamReader.ReadLine().Substring(24); + data.hintFileText[2] = line3; + LoadSettings(line3); + + streamReader.Close(); + + for (int i = 0; i < reportorder.Length; ++i) + { + string location = data.codes.FindCode(reportorder[i]); + if (location == "") + location = data.codes.GetDefault(i); + + data.reportLocations.Add(location); + string[] temp = reportvalues[i].Split(','); + data.reportInformation.Add(new Tuple(null, data.codes.FindCode(temp[0]), int.Parse(temp[1]) - 32)); + } + + data.hintsLoaded = true; + data.legacyJsmartee = true; + + if (data.wasTracking) + InitTracker(); + } + + //Seed Gen + private void OpenKHSeed(object sender, RoutedEventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog + { + DefaultExt = ".zip", + Filter = "OpenKH Seeds (*.zip)|*.zip", + Title = "Select Seed File" + }; + if (openFileDialog.ShowDialog() == true) + OpenKHSeed(openFileDialog.FileName); + } + + private void OpenKHSeed(string filename) + { + if (!InProgressCheck("seed")) + return; + + using (ZipArchive archive = ZipFile.OpenRead(filename)) + { + ZipArchiveEntry hintsfile = null; + ZipArchiveEntry hashfile = null; + ZipArchiveEntry hashfileBackup = null; + ZipArchiveEntry enemyfile = null; + + //get and temp store these files to grab data from later. + //we used to just read them as we went along, but things got more complicated as time went on.. + foreach (var entry in archive.Entries) + { + switch (entry.Name) + { + case "HintFile.Hints": + hintsfile = entry; + break; + case "enemies.rando": + enemyfile = entry; + break; + case "randoseed-hash-icons.csv": + hashfile = entry; + break; + case "sys.yml": + hashfileBackup = entry; + break; + default: + break; + } + } + + if (enemyfile != null) + { + using (var reader3 = new StreamReader(enemyfile.Open())) + { + data.BossRandoFound = true; + data.openKHBossText = reader3.ReadToEnd(); + var enemyText = Encoding.UTF8.GetString(Convert.FromBase64String(data.openKHBossText)); + try + { + var enemyObject = JsonSerializer.Deserialize>(enemyText); + var bosses = JsonSerializer.Deserialize>>(enemyObject["BOSSES"].ToString()); + + foreach (var bosspair in bosses) + { + string bossOrig = bosspair["original"].ToString(); + string bossRepl = bosspair["new"].ToString(); + + data.BossList.Add(bossOrig, bossRepl); + } + } + catch + { + data.BossRandoFound = false; + data.openKHBossText = "None"; + App.logger?.Record("error while trying to parse bosses."); + } + + reader3.Close(); + } + } + + if (hashfile != null || hashfileBackup != null) + { + string[] hash = null; + //new method + if (hashfile != null) + { + using (var reader = new StreamReader(hashfile.Open())) + { + string[] separatingStrings = { "," }; + string text = reader.ReadToEnd(); + hash = text.Split(separatingStrings, System.StringSplitOptions.RemoveEmptyEntries); + reader.Close(); + } + } + //old method + else if (hashfileBackup != null) + { + using (var readerB = new StreamReader(hashfileBackup.Open())) + { + string[] separatingStrings = { "- en: ", " ", "'", "{", "}", ":", "icon" }; + string text1 = readerB.ReadLine(); + string text2 = readerB.ReadLine(); + string text = text1 + text2; + hash = text.Split(separatingStrings, System.StringSplitOptions.RemoveEmptyEntries); + readerB.Close(); + } + } + //load hash visual + if (hash != null) + { + //Set Icons + HashIcon1.SetResourceReference(ContentProperty, hash[0]); + HashIcon2.SetResourceReference(ContentProperty, hash[1]); + HashIcon3.SetResourceReference(ContentProperty, hash[2]); + HashIcon4.SetResourceReference(ContentProperty, hash[3]); + HashIcon5.SetResourceReference(ContentProperty, hash[4]); + HashIcon6.SetResourceReference(ContentProperty, hash[5]); + HashIcon7.SetResourceReference(ContentProperty, hash[6]); + data.SeedHashLoaded = true; + data.seedHashVisual = hash; + + //make visible + if (SeedHashOption.IsChecked) + { + SetHintText(""); + HashGrid.Visibility = Visibility.Visible; + } + + HashToSeed(hash); + } + } + + if (hintsfile != null) + { + using (StreamReader reader = new StreamReader(hintsfile.Open())) + { + data.openKHHintText = reader.ReadToEnd(); + var hintText = Encoding.UTF8.GetString(Convert.FromBase64String(data.openKHHintText)); + var hintObject = JsonSerializer.Deserialize>(hintText); + var settings = new List(); + var hintableItems = new List(); + //fallback for older seeds + try + { + hintableItems = new List(JsonSerializer.Deserialize>(hintObject["hintableItems"].ToString())); + } + catch { } + + data.ShouldResetHash = false; + + //if (hintObject.ContainsKey("generatorVersion")) + //{ + // data.seedgenVersion = hintObject["generatorVersion"].ToString(); + //} + + if (hintObject.ContainsKey("settings")) + { + settings = JsonSerializer.Deserialize>(hintObject["settings"].ToString()); + + #region Settings + + TornPagesToggle(false); + AbilitiesToggle(false); + ReportsToggle(false); + ExtraChecksToggle(false); + VisitLockToggle(false); + foreach (string item in hintableItems) + { + switch (item) + { + case "magic": + break; + case "form": + break; + case "summon": + break; + case "page": + TornPagesToggle(true); + break; + case "ability": + AbilitiesToggle(true); + break; + case "report": + ReportsToggle(true); + break; + case "other": + ExtraChecksToggle(true); + break; + case "visit": + VisitLockToggle(true); + break; + case "proof": + break; + } + } + + //if (hintableItems.Contains("report")) + // ReportsToggle(true); + //else + // ReportsToggle(false); + // + //if (hintableItems.Contains("page")) + // TornPagesToggle(true); + //else + // TornPagesToggle(false); + // + //if (hintableItems.Contains("ability")) + // AbilitiesToggle(true); + //else + // AbilitiesToggle(false); + // + //if (hintableItems.Count == 0) + //{ + // ReportsToggle(true); + // TornPagesToggle(true); + // AbilitiesToggle(true); + //} + + //item settings + PromiseCharmToggle(false); + //AbilitiesToggle(false); + //VisitLockToggle(false); + //ExtraChecksToggle(false); + AntiFormToggle(false); + + //world settings + SoraHeartToggle(true); + DrivesToggle(false); + SimulatedToggle(false); + TwilightTownToggle(false); + HollowBastionToggle(false); + BeastCastleToggle(false); + OlympusToggle(false); + AgrabahToggle(false); + LandofDragonsToggle(false); + DisneyCastleToggle(false); + PrideLandsToggle(false); + PortRoyalToggle(false); + HalloweenTownToggle(false); + SpaceParanoidsToggle(false); + TWTNWToggle(false); + HundredAcreWoodToggle(false); + AtlanticaToggle(false); + PuzzleToggle(false); + SynthToggle(false); + + //progression hints GoA Current Hint Count + data.WorldsData["GoA"].value.Visibility = Visibility.Hidden; + + //settings visuals + SettingRow.Height = new GridLength(0.5, GridUnitType.Star); + Setting_BetterSTT.Width = new GridLength(0, GridUnitType.Star); + Setting_Level_01.Width = new GridLength(0, GridUnitType.Star); + Setting_Level_50.Width = new GridLength(0, GridUnitType.Star); + Setting_Level_99.Width = new GridLength(0, GridUnitType.Star); + Setting_Absent.Width = new GridLength(0, GridUnitType.Star); + Setting_Absent_Split.Width = new GridLength(0, GridUnitType.Star); + Setting_Datas.Width = new GridLength(0, GridUnitType.Star); + Setting_Sephiroth.Width = new GridLength(0, GridUnitType.Star); + Setting_Terra.Width = new GridLength(0, GridUnitType.Star); + Setting_Cups.Width = new GridLength(0, GridUnitType.Star); + Setting_HadesCup.Width = new GridLength(0, GridUnitType.Star); + Setting_Cavern.Width = new GridLength(0, GridUnitType.Star); + Setting_Transport.Width = new GridLength(0, GridUnitType.Star); + Double SpacerValue = 10; + #endregion + + //to be safe about this i guess + //bool abilitiesOn = true; + bool puzzleOn = false; + bool synthOn = false; + + //load settings from hints + foreach (string setting in settings) + { + Console.WriteLine("setting found = " + setting); + + switch (setting) + { + //items + case "PromiseCharm": + PromiseCharmToggle(true); + break; + //case "Level1Mode": + // abilitiesOn = false; + // break; + case "visit_locking": + VisitLockToggle(true); + break; + //case "extra_ics": + // ExtraChecksToggle(true); + // break; + case "Anti-Form": + AntiFormToggle(true); + break; + //worlds + case "Level": + SoraHeartToggle(false); + SoraLevel01Toggle(true); + //AbilitiesToggle(true); + Setting_Level_01.Width = new GridLength(1.5, GridUnitType.Star); + SpacerValue--; + break; + case "ExcludeFrom50": + SoraLevel50Toggle(true); + //AbilitiesToggle(true); + Setting_Level_50.Width = new GridLength(1.5, GridUnitType.Star); + SpacerValue--; + data.HintRevealOrder.Add("SorasHeart"); + break; + case "ExcludeFrom99": + SoraLevel99Toggle(true); + //AbilitiesToggle(true); + Setting_Level_99.Width = new GridLength(1.5, GridUnitType.Star); + SpacerValue--; + data.HintRevealOrder.Add("SorasHeart"); + break; + case "Simulated Twilight Town": + SimulatedToggle(true); + data.enabledWorlds.Add("STT"); + data.HintRevealOrder.Add("SimulatedTwilightTown"); + break; + case "Hundred Acre Wood": + HundredAcreWoodToggle(true); + data.enabledWorlds.Add("HundredAcreWood"); + data.HintRevealOrder.Add("HundredAcreWood"); + break; + case "Atlantica": + AtlanticaToggle(true); + data.enabledWorlds.Add("Atlantica"); + data.HintRevealOrder.Add("Atlantica"); + break; + case "Puzzle": + PuzzleToggle(true); + puzzleOn = true; + data.puzzlesOn = true; + break; + case "Synthesis": + SynthToggle(true); + synthOn = true; + data.synthOn = true; + break; + case "Form Levels": + DrivesToggle(true); + data.HintRevealOrder.Add("DriveForms"); + break; + case "Land of Dragons": + LandofDragonsToggle(true); + data.enabledWorlds.Add("LoD"); + data.HintRevealOrder.Add("LandofDragons"); + break; + case "Beast's Castle": + BeastCastleToggle(true); + data.enabledWorlds.Add("BC"); + data.HintRevealOrder.Add("BeastsCastle"); + break; + case "Hollow Bastion": + HollowBastionToggle(true); + data.enabledWorlds.Add("HB"); + data.HintRevealOrder.Add("HollowBastion"); + break; + case "Twilight Town": + TwilightTownToggle(true); + data.enabledWorlds.Add("TT"); + data.HintRevealOrder.Add("TwilightTown"); + break; + case "The World That Never Was": + TWTNWToggle(true); + data.enabledWorlds.Add("TWTNW"); + data.HintRevealOrder.Add("TWTNW"); + break; + case "Space Paranoids": + SpaceParanoidsToggle(true); + data.enabledWorlds.Add("SP"); + data.HintRevealOrder.Add("SpaceParanoids"); + break; + case "Port Royal": + PortRoyalToggle(true); + data.enabledWorlds.Add("PR"); + data.HintRevealOrder.Add("PortRoyal"); + break; + case "Olympus Coliseum": + OlympusToggle(true); + data.enabledWorlds.Add("OC"); + data.HintRevealOrder.Add("OlympusColiseum"); + break; + case "Agrabah": + AgrabahToggle(true); + data.enabledWorlds.Add("AG"); + data.HintRevealOrder.Add("Agrabah"); + break; + case "Halloween Town": + HalloweenTownToggle(true); + data.enabledWorlds.Add("HT"); + data.HintRevealOrder.Add("HalloweenTown"); + break; + case "Pride Lands": + PrideLandsToggle(true); + data.enabledWorlds.Add("PL"); + data.HintRevealOrder.Add("PrideLands"); + break; + case "Disney Castle / Timeless River": + DisneyCastleToggle(true); + data.enabledWorlds.Add("DC"); + data.HintRevealOrder.Add("DisneyCastle"); + break; + //settings + case "better_stt": + Setting_BetterSTT.Width = new GridLength(1.1, GridUnitType.Star); + SpacerValue--; + break; + case "Cavern of Remembrance": + Setting_Cavern.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Data Split": + Setting_Absent_Split.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + data.dataSplit = true; + break; + case "Absent Silhouettes": + if (!data.dataSplit) //only use if we didn't already set the data split version + { + Setting_Absent.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + } + break; + case "Sephiroth": + Setting_Sephiroth.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Lingering Will (Terra)": + Setting_Terra.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Data Organization XIII": + Setting_Datas.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Transport to Remembrance": + Setting_Transport.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Olympus Cups": + Setting_Cups.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "Hades Paradox Cup": + Setting_HadesCup.Width = new GridLength(1, GridUnitType.Star); + SpacerValue--; + break; + case "ScoreMode": + data.ScoreMode = true; + break; + //progression hints + case "ProgressionHints": + data.UsingProgressionHints = true; + data.WorldsData["GoA"].value.Visibility = Visibility.Visible; + data.WorldsData["GoA"].value.Text = "0"; + //Console.WriteLine("ENABLING PROGRESSION HINTS"); + break; + case "dummy_forms": + data.altFinalTracking = true; + break; + } + } + + //if (abilitiesOn == false) + // AbilitiesToggle(false); + + //prevent creations hinting twice for progression + if ((puzzleOn || hintObject["hintsType"].ToString() == "Path") && !data.HintRevealOrder.Contains("PuzzSynth")) + { + data.HintRevealOrder.Add("PuzzSynth"); + } + + Setting_Spacer.Width = new GridLength(SpacerValue, GridUnitType.Star); + SettingsText.Text = "Settings:"; + + } + + if (hintObject.ContainsKey("ProgressionType")) + { + data.progressionType = hintObject["ProgressionType"].ToString(); + } + + if (hintObject.ContainsKey("ProgressionSettings")) + { + var progressionSettings = JsonSerializer.Deserialize>>(hintObject["ProgressionSettings"].ToString()); + + if (data.progressionType == "Disabled") + data.progressionType = "Reports"; + + foreach (var setting in progressionSettings) + { + //Console.WriteLine("progression setting found = " + setting.Key); + + switch (setting.Key) + { + case "HintCosts": + data.HintCosts.Clear(); + foreach (int cost in setting.Value) + data.HintCosts.Add(cost); + data.HintCosts.Add(data.HintCosts[data.HintCosts.Count - 1] + 1); //duplicates the last cost for logic reasons + break; + case "SimulatedTwilightTown": + data.STT_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.STT_ProgressionValues.Add(cost); + break; + case "TwilightTown": + data.TT_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.TT_ProgressionValues.Add(cost); + break; + case "HollowBastion": + data.HB_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.HB_ProgressionValues.Add(cost); + break; + case "CavernofRemembrance": + data.CoR_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.CoR_ProgressionValues.Add(cost); + break; + case "LandofDragons": + data.LoD_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.LoD_ProgressionValues.Add(cost); + break; + case "BeastsCastle": + data.BC_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.BC_ProgressionValues.Add(cost); + break; + case "OlympusColiseum": + data.OC_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.OC_ProgressionValues.Add(cost); + break; + case "DisneyCastle": + data.DC_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.DC_ProgressionValues.Add(cost); + break; + case "Agrabah": + data.AG_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.AG_ProgressionValues.Add(cost); + break; + case "PortRoyal": + data.PR_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.PR_ProgressionValues.Add(cost); + break; + case "HalloweenTown": + data.HT_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.HT_ProgressionValues.Add(cost); + break; + case "PrideLands": + data.PL_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.PL_ProgressionValues.Add(cost); + break; + case "HundredAcreWood": + data.HAW_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.HAW_ProgressionValues.Add(cost); + break; + case "SpaceParanoids": + data.SP_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.SP_ProgressionValues.Add(cost); + break; + case "TWTNW": + data.TWTNW_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.TWTNW_ProgressionValues.Add(cost); + break; + case "Atlantica": + data.AT_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.AT_ProgressionValues.Add(cost); + break; + case "ReportBonus": + data.ReportBonus = setting.Value[0]; + break; + case "WorldCompleteBonus": + data.WorldCompleteBonus = setting.Value[0]; + break; + case "Levels": + data.Levels_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.Levels_ProgressionValues.Add(cost); + break; + case "Drives": + data.Drives_ProgressionValues.Clear(); + foreach (int cost in setting.Value) + data.Drives_ProgressionValues.Add(cost); + break; + case "FinalXemnasReveal": + data.revealFinalXemnas = setting.Value[0] == 0 ? false : true; + break; + } + } + //data.NumOfHints = data.HintCosts.Count; + //set text correctly + ProgressionCollectedValue.Visibility = Visibility.Visible; + ProgressionCollectedBar.Visibility = Visibility.Visible; + ProgressionCollectedValue.Text = "0"; + ProgressionTotalValue.Text = data.HintCosts[0].ToString(); + } + + switch (hintObject["hintsType"].ToString()) + { + case "Shananas": + { + SetMode(Mode.OpenKHShanHints); + ShanHints(hintObject); + } + break; + case "JSmartee": + { + SetMode(Mode.OpenKHJsmarteeHints); + JsmarteeHints(hintObject); + } + break; + case "Points": + { + SetMode(Mode.PointsHints); + PointsHints(hintObject); + } + break; + case "Path": + { + SetMode(Mode.PathHints); + PathHints(hintObject); + } + break; + case "Spoiler": + { + SetMode(Mode.SpoilerHints); + SpoilerHints(hintObject); + } + break; + default: + break; + } + + reader.Close(); + } + } + + archive.Dispose(); + + data.seedLoaded = true; + } + + if (data.wasTracking) + { + InitTracker(); + } + } + + //hint helpers + + private void SetMode(Mode mode) + { + if (mode == Mode.ShanHints || mode == Mode.OpenKHShanHints) + { + ModeDisplay.Header = "Shan Hints"; + data.mode = mode; + //ReportsToggle(false); + } + else if (mode == Mode.JsmarteeHints || mode == Mode.OpenKHJsmarteeHints) + { + ModeDisplay.Header = "Jsmartee Hints"; + data.mode = mode; + //ReportsToggle(true); + } + else if (mode == Mode.PointsHints) + { + ModeDisplay.Header = "Points Hints"; + data.mode = mode; + //ReportsToggle(true); + //high score mode should not be on if points hints is on + if (data.ScoreMode == true) + data.ScoreMode = false; + + UpdatePointScore(0); + ShowCheckCountToggle(null, null); + } + else if (mode == Mode.PathHints) + { + ModeDisplay.Header = "Path Hints"; + data.mode = mode; + //ReportsToggle(true); + } + else if (mode == Mode.SpoilerHints) + { + ModeDisplay.Header = "Spoiler Hints"; + data.mode = mode; + } + + if (data.ScoreMode && mode != Mode.PointsHints) + { + UpdatePointScore(0); + ShowCheckCountToggle(null, null); + + ModeDisplay.Header += " | HSM"; + } + + if (data.UsingProgressionHints) + { + if (data.progressionType == "Reports") + { + CollectionGrid.Visibility = Visibility.Collapsed; + ScoreGrid.Visibility = Visibility.Collapsed; + ProgressionCollectionGrid.Visibility = Visibility.Visible; + ChestIcon.SetResourceReference(ContentProperty, "ProgPoints"); + ModeDisplay.Header += " | Progression"; + } + else if (data.progressionType == "Bosses") + ModeDisplay.Header += " | Prog. Bosses"; + } + } + + private void LoadSettings(string settings) + { + //item settings + ReportsToggle(false); + PromiseCharmToggle(false); + AbilitiesToggle(false); + VisitLockToggle(false); + ExtraChecksToggle(false); + AntiFormToggle(false); + TornPagesToggle(false); + + //world settings + SoraHeartToggle(true); + DrivesToggle(false); + SimulatedToggle(false); + TwilightTownToggle(false); + HollowBastionToggle(false); + BeastCastleToggle(false); + OlympusToggle(false); + AgrabahToggle(false); + LandofDragonsToggle(false); + DisneyCastleToggle(false); + PrideLandsToggle(false); + PortRoyalToggle(false); + HalloweenTownToggle(false); + SpaceParanoidsToggle(false); + TWTNWToggle(false); + HundredAcreWoodToggle(false); + AtlanticaToggle(false); + PuzzleToggle(false); + SynthToggle(false); + + string[] settinglist = settings.Split('-'); + + foreach (string setting in settinglist) + { + string trimmed = setting.Trim(); + switch (trimmed) + { + case "Secret Ansem Reports": + ReportsToggle(true); + break; + case "Promise Charm": + PromiseCharmToggle(true); + break; + case "Second Chance & Once More": + AbilitiesToggle(true); + break; + case "AntiForm": + AntiFormToggle(true); + break; + case "Visit Locks": + VisitLockToggle(true); + break; + case "Extra Checks": + ExtraChecksToggle(true); + break; + case "Level01": + SoraLevel01Toggle(true); + break; + case "Level50": + SoraLevel50Toggle(true); + break; + case "Level99": + SoraLevel99Toggle(true); + break; + case "Sora's Heart": + SoraHeartToggle(true); + break; + case "Drive Forms": + DrivesToggle(true); + break; + case "Simulated Twilight Town": + SimulatedToggle(true); + data.enabledWorlds.Add("STT"); + break; + case "Twilight Town": + TwilightTownToggle(true); + data.enabledWorlds.Add("TT"); + break; + case "Hollow Bastion": + HollowBastionToggle(true); + data.enabledWorlds.Add("HB"); + break; + case "Beast Castle": + BeastCastleToggle(true); + data.enabledWorlds.Add("BC"); + break; + case "Olympus": + OlympusToggle(true); + data.enabledWorlds.Add("OC"); + break; + case "Agrabah": + AgrabahToggle(true); + data.enabledWorlds.Add("AG"); + break; + case "Land of Dragons": + LandofDragonsToggle(true); + data.enabledWorlds.Add("LoD"); + break; + case "Disney Castle": + DisneyCastleToggle(true); + data.enabledWorlds.Add("DC"); + break; + case "Pride Lands": + PrideLandsToggle(true); + data.enabledWorlds.Add("PL"); + break; + case "Port Royal": + PortRoyalToggle(true); + data.enabledWorlds.Add("PR"); + break; + case "Halloween Town": + HalloweenTownToggle(true); + data.enabledWorlds.Add("HT"); + break; + case "Space Paranoids": + SpaceParanoidsToggle(true); + data.enabledWorlds.Add("SP"); + break; + case "TWTNW": + TWTNWToggle(true); + data.enabledWorlds.Add("TWTNW"); + break; + case "100 Acre Wood": + HundredAcreWoodToggle(true); + break; + case "Atlantica": + AtlanticaToggle(true); + break; + case "Puzzles": + PuzzleToggle(true); + break; + case "Synthesis": + SynthToggle(true); + break; + case "Score Mode": + data.ScoreMode = true; + break; + case "Boss Rando": + data.BossRandoFound = true; + break; + case "Torn Pages": + TornPagesToggle(true); + break; + } + } + } + + //Turns the zip seed icon hash to a numerical based seed + private void HashToSeed(string[] hash) + { + int icon1 = Codes.HashInt[hash[0]]; + int icon2 = Codes.HashInt[hash[1]]; + int icon3 = Codes.HashInt[hash[2]]; + int icon4 = Codes.HashInt[hash[3]]; + int icon5 = Codes.HashInt[hash[4]]; + int icon6 = Codes.HashInt[hash[5]]; + int icon7 = Codes.HashInt[hash[6]]; + + int final = (icon1 + icon2) * (icon3 + icon4) * (icon5 + icon6) - icon7; + data.convertedSeedHash = final; + } + + private void OnReset(object sender, RoutedEventArgs e) + { + if (aTimer != null) + { + aTimer.Stop(); + aTimer = null; + pcFilesLoaded = false; + } + + if (sender != null && !AutoConnectOption.IsChecked) + data.wasTracking = false; + + //chnage visuals based on if autotracking was done before + if (data.wasTracking) + { + //connection trying visual + Connect.Visibility = Visibility.Visible; + Connect2.Visibility = Visibility.Collapsed; + } + else + { + if (!AutoConnectOption.IsChecked) + { + Connect.Visibility = Visibility.Collapsed; + Connect2.Visibility = Visibility.Collapsed; + } + + //SettingRow.Height = new GridLength(0, GridUnitType.Star); + FormRow.Height = new GridLength(0, GridUnitType.Star); + Level.Visibility = Visibility.Collapsed; + Strength.Visibility = Visibility.Collapsed; + Magic.Visibility = Visibility.Collapsed; + Defense.Visibility = Visibility.Collapsed; + } + + collectedChecks.Clear(); + newChecks.Clear(); + ModeDisplay.Header = ""; + HintTextMiddle.Text = ""; + HintTextBegin.Text = ""; + HintTextEnd.Text = ""; + data.mode = Mode.None; + collected = 0; + PointTotal = 0; + data.SpoilerRevealTypes.Clear(); + data.SpoilerReportMode = false; + data.SpoilerWorldCompletion = false; + data.usedPages = 0; + CollectedValue.Text = "0"; + data.ScoreMode = false; + data.forcedFinal = false; + data.BossRandoFound = false; + data.dataSplit = false; + data.BossList.Clear(); + data.bossEventLog.Clear(); + data.convertedSeedHash = 0; + data.enabledWorlds.Clear(); + data.seedgenVersion = ""; + data.altFinalTracking = false; + data.eventLog.Clear(); + data.openKHHintText = "None"; + data.openKHBossText = "None"; + data.legacyJsmartee = false; + data.hintFileText = null; + data.legacyShan = false; + data.shanHintFileText = null; + data.hintsLoaded = false; + data.seedLoaded = false; + data.saveFileLoaded = false; + + //prog boss hint stuff + BossHintTextMiddle.Text = ""; + BossHintTextBegin.Text = ""; + BossHintTextEnd.Text = ""; + data.progBossInformation.Clear(); + data.progressionType = "Disabled"; + InfoRow.Height = new GridLength(0.8, GridUnitType.Star); + InfoTextRow.Height = new GridLength(1, GridUnitType.Star); + BossTextRow.Height = new GridLength(0, GridUnitType.Star); + MainTextRow.Height = new GridLength(1, GridUnitType.Star); + HashBossSpacer.Height = new GridLength(0, GridUnitType.Star); + DC_Row1.Height = new GridLength(0, GridUnitType.Star); + TextRowSpacer.Height = new GridLength(0, GridUnitType.Star); + Grid.SetColumnSpan(MainTextVB, 1); + + //clear progression hints stuff + data.reportLocationsUsed = new List() { false, false, false, false, false, false, false, false, false, false, false, false, false }; + data.UsingProgressionHints = false; + data.ProgressionPoints = 0; + data.TotalProgressionPoints = 0; + data.ReportBonus = 1; + data.WorldCompleteBonus = 0; + data.ProgressionCurrentHint = 0; + data.WorldsEnabled = 0; + data.HintRevealOrder.Clear(); + data.LevelsPreviousIndex = 0; + data.NextLevelMilestone = 9; + data.Levels_ProgressionValues = new List() { 1, 1, 1, 2, 4 }; + data.Drives_ProgressionValues = new List() { 0, 0, 0, 1, 0, 2 }; + data.DriveLevels = new List() { 1, 1, 1, 1, 1 }; + data.HintRevealsStored.Clear(); + data.WorldsData["GoA"].value.Visibility = Visibility.Hidden; + //clear last hinted green world + if (data.previousWorldsHinted.Count >= 0) + { + foreach (var world in data.previousWorldsHinted) + { + if (world == null || world == "") + continue; + + foreach (var Box in data.WorldsData[world].top.Children.OfType()) + { + if (Box.Opacity != 0.9 && !Box.Name.EndsWith("SelWG")) + Box.Fill = (SolidColorBrush)FindResource("DefaultRec"); + + if (Box.Name.EndsWith("SelWG") && !WorldHighlightOption.IsChecked) + Box.Visibility = Visibility.Collapsed; + } + } + } + data.previousWorldsHinted.Clear(); + data.StoredWorldCompleteBonus = new Dictionary() + { + { "SorasHeart", 0 }, + { "DriveForms", 0 }, + { "SimulatedTwilightTown", 0 }, + { "TwilightTown", 0 }, + { "HollowBastion", 0 }, + { "BeastsCastle", 0 }, + { "OlympusColiseum", 0 }, + { "Agrabah", 0 }, + { "LandofDragons", 0 }, + { "HundredAcreWood", 0 }, + { "PrideLands", 0 }, + { "DisneyCastle", 0 }, + { "HalloweenTown", 0 }, + { "PortRoyal", 0 }, + { "SpaceParanoids", 0 }, + { "TWTNW", 0 }, + { "GoA", 0 }, + { "Atlantica", 0 }, + { "PuzzSynth", 0 } + }; + data.STT_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8 }; + data.TT_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7 }; + data.HB_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + data.CoR_ProgressionValues = new List() { 0, 0, 0, 0, 0 }; + data.BC_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7 }; + data.OC_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + data.AG_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8 }; + data.LoD_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + data.HAW_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6 }; + data.PL_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7 }; + data.AT_ProgressionValues = new List() { 1, 2, 3 }; + data.DC_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + data.HT_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8 }; + data.PR_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + data.SP_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6 }; + data.TWTNW_ProgressionValues = new List() { 1, 2, 3, 4, 5, 6, 7 }; + data.HintCosts = new List() { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10 }; + + //hotkey stuff + data.usedHotkey = false; + + //unselect any currently selected world grid + if (data.selected != null) + { + foreach (var Box in data.WorldsData[data.selected.Name].top.Children.OfType()) + { + if (Box.Opacity != 0.9 && !Box.Name.EndsWith("SelWG")) + Box.Fill = (SolidColorBrush)FindResource("DefaultRec"); + + if (Box.Name.EndsWith("SelWG")) + Box.Visibility = Visibility.Collapsed; + } + } + data.selected = null; + + //return items to itempool + foreach (WorldData worldData in data.WorldsData.Values.ToList()) + { + for (int j = worldData.worldGrid.Children.Count - 1; j >= 0; --j) + { + Item item = worldData.worldGrid.Children[j] as Item; + Grid pool; + + if(item.Name.StartsWith("Ghost_")) + pool = VisualTreeHelper.GetChild(ItemPool, 4) as Grid; + else + pool = data.Items[item.Name].Item2; + + worldData.worldGrid.Children.Remove(worldData.worldGrid.Children[j]); + pool.Children.Add(item); + + item.MouseDown -= item.Item_Return; + item.MouseEnter -= item.Report_Hover; + if (data.dragDrop) + { + item.MouseDoubleClick -= item.Item_Click; + item.MouseDoubleClick += item.Item_Click; + item.MouseMove -= item.Item_MouseMove; + item.MouseMove += item.Item_MouseMove; + } + else + { + item.MouseDown -= item.Item_MouseDown; + item.MouseDown += item.Item_MouseDown; + item.MouseUp -= item.Item_MouseUp; + item.MouseUp += item.Item_MouseUp; + } + } + } + + // Reset 1st column row heights + RowDefinitionCollection rows1 = ((data.WorldsData["SorasHeart"].worldGrid.Parent as Grid).Parent as Grid).RowDefinitions; + foreach (RowDefinition row in rows1) + { + // don't reset turned off worlds + if (row.Height.Value != 0) + row.Height = new GridLength(1, GridUnitType.Star); + } + + // Reset 2nd column row heights + RowDefinitionCollection rows2 = ((data.WorldsData["DriveForms"].worldGrid.Parent as Grid).Parent as Grid).RowDefinitions; + foreach (RowDefinition row in rows2) + { + // don't reset turned off worlds + if (row.Height.Value != 0) + row.Height = new GridLength(1, GridUnitType.Star); + } + + //fix puzzsynth value if it was hidden (progression hints) + if (data.WorldsData["PuzzSynth"].value.Visibility == Visibility.Hidden) + { + data.WorldsData["PuzzSynth"].value.Visibility = Visibility.Visible; + } + + foreach (var key in data.WorldsData.Keys.ToList()) + { + data.WorldsData[key].complete = false; + data.WorldsData[key].checkCount.Clear(); + data.WorldsData[key].progress = 0; + + //world cross reset + string crossname = key + "Cross"; + + if (data.WorldsData[key].top.FindName(crossname) is Image Cross) + { + Cross.Visibility = Visibility.Collapsed; + } + + //reset highlighted world + foreach (Rectangle Box in data.WorldsData[key].top.Children.OfType().Where(Box => Box.Name.EndsWith("SelWG"))) + { + Box.Visibility = Visibility.Collapsed; + } + } + + TwilightTownProgression.SetResourceReference(ContentProperty, ""); + HollowBastionProgression.SetResourceReference(ContentProperty, ""); + LandofDragonsProgression.SetResourceReference(ContentProperty, ""); + BeastsCastleProgression.SetResourceReference(ContentProperty, ""); + OlympusColiseumProgression.SetResourceReference(ContentProperty, ""); + SpaceParanoidsProgression.SetResourceReference(ContentProperty, ""); + HalloweenTownProgression.SetResourceReference(ContentProperty, ""); + PortRoyalProgression.SetResourceReference(ContentProperty, ""); + AgrabahProgression.SetResourceReference(ContentProperty, ""); + PrideLandsProgression.SetResourceReference(ContentProperty, ""); + DisneyCastleProgression.SetResourceReference(ContentProperty, ""); + HundredAcreWoodProgression.SetResourceReference(ContentProperty, ""); + SimulatedTwilightTownProgression.SetResourceReference(ContentProperty, ""); + TWTNWProgression.SetResourceReference(ContentProperty, ""); + AtlanticaProgression.SetResourceReference(ContentProperty, ""); + GoAProgression.SetResourceReference(ContentProperty, ""); + DriveFormsCap.SetResourceReference(ContentProperty, ""); + ChestIcon.SetResourceReference(ContentProperty, "Chest"); + + SorasHeartWeapon.SetResourceReference(ContentProperty, ""); + + NextLevelCol.Width = new GridLength(0, GridUnitType.Star); + + ValorM.Opacity = .45; + WisdomM.Opacity = .45; + LimitM.Opacity = .45; + MasterM.Opacity = .45; + FinalM.Opacity = .45; + HighJump.Opacity = .45; + QuickRun.Opacity = .45; + DodgeRoll.Opacity = .45; + AerialDodge.Opacity = .45; + Glide.Opacity = .45; + + ValorLevel.Text = "1"; + WisdomLevel.Text = "1"; + LimitLevel.Text = "1"; + MasterLevel.Text = "1"; + FinalLevel.Text = "1"; + HighJumpLevel.Text = ""; + QuickRunLevel.Text = ""; + DodgeRollLevel.Text = ""; + AerialDodgeLevel.Text = ""; + GlideLevel.Text = ""; + + fireLevel = 0; + blizzardLevel = 0; + thunderLevel = 0; + cureLevel = 0; + reflectLevel = 0; + magnetLevel = 0; + tornPageCount = 0; + + if (fire != null) + fire.Level = 0; + if (blizzard != null) + blizzard.Level = 0; + if (thunder != null) + thunder.Level = 0; + if (cure != null) + cure.Level = 0; + if (reflect != null) + reflect.Level = 0; + if (magnet != null) + magnet.Level = 0; + if (pages != null) + pages.Quantity = 0; + + if (highJump != null) + highJump.Level = 0; + if (quickRun != null) + quickRun.Level = 0; + if (dodgeRoll != null) + dodgeRoll.Level = 0; + if (aerialDodge != null) + aerialDodge.Level = 0; + if (glide != null) + glide.Level = 0; + + //hide & reset seed hash + if (data.ShouldResetHash) + { + HashGrid.Visibility = Visibility.Collapsed; + data.SeedHashLoaded = false; + } + + foreach (string value in data.PointsDatanew.Keys.ToList()) + { + data.PointsDatanew[value] = 0; + } + + foreach (string world in WorldPoints.Keys.ToList()) + { + WorldPoints[world] = 0; + WorldPoints_c[world] = 0; + } + + WorldGrid.Real_Fire = 0; + WorldGrid.Real_Blizzard = 0; + WorldGrid.Real_Thunder = 0; + WorldGrid.Real_Cure = 0; + WorldGrid.Real_Reflect = 0; + WorldGrid.Real_Magnet = 0; + WorldGrid.Real_Pages = 0; + WorldGrid.Real_Pouches = 0; + WorldGrid.Proof_Count = 0; + WorldGrid.Form_Count = 0; + WorldGrid.Summon_Count = 0; + WorldGrid.Ability_Count = 0; + WorldGrid.Report_Count = 0; + WorldGrid.Visit_Count = 0; + + FireCount.Text = "3"; + BlizzardCount.Text = "3"; + ThunderCount.Text = "3"; + CureCount.Text = "3"; + ReflectCount.Text = "3"; + MagnetCount.Text = "3"; + PageCount.Text = "5"; + MunnyCount.Text = "2"; + + WorldGrid.Ghost_Fire = 0; + WorldGrid.Ghost_Blizzard = 0; + WorldGrid.Ghost_Thunder = 0; + WorldGrid.Ghost_Cure = 0; + WorldGrid.Ghost_Reflect = 0; + WorldGrid.Ghost_Magnet = 0; + WorldGrid.Ghost_Pages = 0; + WorldGrid.Ghost_Pouches = 0; + WorldGrid.Ghost_Fire_obtained = 0; + WorldGrid.Ghost_Blizzard_obtained = 0; + WorldGrid.Ghost_Thunder_obtained = 0; + WorldGrid.Ghost_Cure_obtained = 0; + WorldGrid.Ghost_Reflect_obtained = 0; + WorldGrid.Ghost_Magnet_obtained = 0; + WorldGrid.Ghost_Pages_obtained = 0; + WorldGrid.Ghost_Pouches_obtained = 0; + + Ghost_FireCount.Visibility = Visibility.Hidden; + Ghost_BlizzardCount.Visibility = Visibility.Hidden; + Ghost_ThunderCount.Visibility = Visibility.Hidden; + Ghost_CureCount.Visibility = Visibility.Hidden; + Ghost_ReflectCount.Visibility = Visibility.Hidden; + Ghost_MagnetCount.Visibility = Visibility.Hidden; + Ghost_PageCount.Visibility = Visibility.Hidden; + Ghost_MunnyCount.Visibility = Visibility.Hidden; + + FireCount.Fill = (SolidColorBrush)FindResource("Color_Black"); + FireCount.Stroke = (SolidColorBrush)FindResource("Color_Trans"); + FireCount.Fill = (LinearGradientBrush)FindResource("Color_Fire"); + FireCount.Stroke = (SolidColorBrush)FindResource("Color_Black"); + BlizzardCount.Fill = (SolidColorBrush)FindResource("Color_Black"); + BlizzardCount.Stroke = (SolidColorBrush)FindResource("Color_Trans"); + BlizzardCount.Fill = (LinearGradientBrush)FindResource("Color_Blizzard"); + BlizzardCount.Stroke = (SolidColorBrush)FindResource("Color_Black"); + ThunderCount.Fill = (SolidColorBrush)FindResource("Color_Black"); + ThunderCount.Stroke = (SolidColorBrush)FindResource("Color_Trans"); + ThunderCount.Fill = (LinearGradientBrush)FindResource("Color_Thunder"); + ThunderCount.Stroke = (SolidColorBrush)FindResource("Color_Black"); + CureCount.Fill = (SolidColorBrush)FindResource("Color_Black"); + CureCount.Stroke = (SolidColorBrush)FindResource("Color_Trans"); + CureCount.Fill = (LinearGradientBrush)FindResource("Color_Cure"); + CureCount.Stroke = (SolidColorBrush)FindResource("Color_Black"); + MagnetCount.Fill = (SolidColorBrush)FindResource("Color_Black"); + MagnetCount.Stroke = (SolidColorBrush)FindResource("Color_Trans"); + MagnetCount.Fill = (LinearGradientBrush)FindResource("Color_Magnet"); + MagnetCount.Stroke = (SolidColorBrush)FindResource("Color_Black"); + ReflectCount.Fill = (SolidColorBrush)FindResource("Color_Black"); + ReflectCount.Stroke = (SolidColorBrush)FindResource("Color_Trans"); + ReflectCount.Fill = (LinearGradientBrush)FindResource("Color_Reflect"); + ReflectCount.Stroke = (SolidColorBrush)FindResource("Color_Black"); + PageCount.Fill = (SolidColorBrush)FindResource("Color_Black"); + PageCount.Stroke = (SolidColorBrush)FindResource("Color_Trans"); + PageCount.Fill = (LinearGradientBrush)FindResource("Color_Page"); + PageCount.Stroke = (SolidColorBrush)FindResource("Color_Black"); + MunnyCount.Fill = (SolidColorBrush)FindResource("Color_Black"); + MunnyCount.Stroke = (SolidColorBrush)FindResource("Color_Trans"); + MunnyCount.Fill = (LinearGradientBrush)FindResource("Color_Pouch"); + MunnyCount.Stroke = (SolidColorBrush)FindResource("Color_Black"); + + Data.WorldItems.Clear(); + data.TrackedReports.Clear(); + + CollectionGrid.Visibility = Visibility.Visible; + ScoreGrid.Visibility = Visibility.Hidden; + ProgressionCollectionGrid.Visibility = Visibility.Hidden; + + //reset settings row + SettingsText.Text = ""; + Setting_BetterSTT.Width = new GridLength(0, GridUnitType.Star); + Setting_Level_01.Width = new GridLength(0, GridUnitType.Star); + Setting_Level_50.Width = new GridLength(0, GridUnitType.Star); + Setting_Level_99.Width = new GridLength(0, GridUnitType.Star); + Setting_Absent.Width = new GridLength(0, GridUnitType.Star); + Setting_Absent_Split.Width = new GridLength(0, GridUnitType.Star); + Setting_Datas.Width = new GridLength(0, GridUnitType.Star); + Setting_Sephiroth.Width = new GridLength(0, GridUnitType.Star); + Setting_Terra.Width = new GridLength(0, GridUnitType.Star); + Setting_Cups.Width = new GridLength(0, GridUnitType.Star); + Setting_HadesCup.Width = new GridLength(0, GridUnitType.Star); + Setting_Cavern.Width = new GridLength(0, GridUnitType.Star); + Setting_Transport.Width = new GridLength(0, GridUnitType.Star); + Setting_Spacer.Width = new GridLength(10, GridUnitType.Star); + + //reset pathhints edits + foreach (string key in data.WorldsData.Keys.ToList()) + { + data.WorldsData[key].top.ColumnDefinitions[1].Width = new GridLength(0, GridUnitType.Star); + + Grid pathgrid = data.WorldsData[key].top.FindName(key + "Path") as Grid; + pathgrid.Visibility = Visibility.Hidden; + foreach (Image child in pathgrid.Children) + { + if (child.Name.Contains(key + "Path_Non") && child.Source.ToString().Contains("cross.png")) //reset non icon to default image + child.Source = new BitmapImage(new Uri("Images/Checks/Simple/proof_of_nonexistence.png", UriKind.Relative)); + child.Visibility = Visibility.Hidden; + } + } + + UpdatePointScore(0); + ReportsToggle(true); + TornPagesToggle(true); + ResetHints(); + VisitLockToggle(VisitLockOption.IsChecked); + + DeathCounter = 0; + DeathValue.Text = "0"; + DeathCol.Width = new GridLength(0, GridUnitType.Star); + DeathCounterGrid.Visibility = Visibility.Collapsed; + + foreach (Grid itempool in ItemPool.Children) + { + foreach (var item in itempool.Children) + { + ContentControl check = item as ContentControl; + + if (check != null && !check.Name.Contains("Ghost")) + check.Opacity = 1.0; + } + } + + NextLevelDisplay(); + + //reset progression visuals + PPCount.Width = new GridLength(1.15, GridUnitType.Star); + PPSep.Width = new GridLength(0.3, GridUnitType.Star); + + if (data.wasTracking && sender != null) + InitTracker(); + } + + private bool InProgressCheck(string type) + { + string message = ""; + string caption = ""; + + if (data.seedLoaded | data.saveFileLoaded) + { + if(type == "tsv") + { + message = "Hints were already loaded into the tracker!" + + "\n Any progress made so far would be lost if you continue." + + "\n Proceed anyway?"; + caption = "Progress Load Confirmation"; + } + if (type == "seed") + { + message = "A Randomizer Seed was already loaded into the tracker!" + + "\n Any progress made so far would be lost if you continue." + + "\n Proceed anyway?"; + caption = "Seed Load Confirmation"; + } + if (type == "hints") + { + message = "Hints were already loaded into the tracker!" + + "\n Any progress made so far would be lost if you continue." + + "\n Proceed anyway?"; + caption = "Hints Load Confirmation"; + + } + + MessageForm.MessageBoxButtons buttons = MessageForm.MessageBoxButtons.OKCancel; + MessageForm.DialogResult result; + + result = MessageForm.MessageBox.Show(message, caption, buttons); + if (result == MessageForm.DialogResult.Cancel) + { + return false; + } + else + { + OnReset(null, null); + return true; + } + } + else + { + OnReset(null, null); + return true; + } + } + + private void ResetHints() + { + data.hintsLoaded = false; + data.reportLocations.Clear(); + data.reportInformation.Clear(); + data.reportAttempts = new List() { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; + + foreach (var key in data.WorldsData.Keys.ToList()) + { + data.WorldsData[key].hinted = false; + data.WorldsData[key].hintedHint = false; + data.WorldsData[key].containsGhost = false; + //progression hints per world + data.WorldsData[key].hintedProgression = false; + } + data.WorldsData["GoA"].hinted = true; + + foreach (ContentControl report in data.ReportAttemptVisual) + { + report.SetResourceReference(ContentProperty, "Fail0"); + } + + foreach (WorldData worldData in data.WorldsData.Values.ToList()) + { + if (worldData.value != null) + SetWorldValue(worldData.value, -999999); + } + + for (int i = 0; i < data.Reports.Count; ++i) + { + data.Reports[i].HandleItemReturn(); + } + } + + /// + /// Hotkey logic + /// + + private void LoadHotkeyBind() + { + if (!Directory.Exists("./KhTrackerSettings")) + { + Directory.CreateDirectory("./KhTrackerSettings"); + } + + if (!File.Exists("./KhTrackerSettings/AutoTrackerKeybinds.txt")) + { + //Console.WriteLine("File not found, making"); + using (FileStream fs = File.Create("./KhTrackerSettings/AutoTrackerKeybinds.txt")) + { + // Add some text to file + Byte[] title = new UTF8Encoding(true).GetBytes("Control\n"); + fs.Write(title, 0, title.Length); + byte[] author = new UTF8Encoding(true).GetBytes("F12"); + fs.Write(author, 0, author.Length); + } + } + string[] lines = System.IO.File.ReadAllLines("./KhTrackerSettings/AutoTrackerKeybinds.txt"); + string mod1 = ""; + ModifierKeys _mod1 = ModifierKeys.None; + string mod2 = ""; + ModifierKeys _mod2 = ModifierKeys.None; + string mod3 = ""; + ModifierKeys _mod3 = ModifierKeys.None; + string key = ""; + int modsUsed = 0; + Key _key; + + Console.WriteLine(lines[1]); + + //break out early if empty file + if (lines.Length == 0) + { + Console.WriteLine("No keybind set"); + data.startAutoTracker1 = null; + return; + } + + if (lines.Length > 1) + key = lines[1]; + + //get first line, split around +'s + string modifiers = lines[0].ToLower(); + if (modifiers.IndexOf('+') > 0) + { + mod1 = modifiers.Substring(0, modifiers.IndexOf('+')); + modifiers = modifiers.Substring(modifiers.IndexOf('+') + 1); + modsUsed++; + } + else + { + mod1 = modifiers; + } + if (modifiers.IndexOf('+') > 0) + { + mod2 = modifiers.Substring(0, modifiers.IndexOf('+')); + modifiers = modifiers.Substring(modifiers.IndexOf('+') + 1); + modsUsed++; + } + else + { + mod2 = modifiers; + } + if (modifiers.Length > 0) + { + mod3 = modifiers; + modsUsed++; + } + + if (mod1.Contains("ctrl")) + mod1 = "control"; + if (mod2.Contains("ctrl")) + mod2 = "control"; + if (mod3.Contains("ctrl")) + mod3 = "control"; + + //capitalize all letters + mod1 = UpperCaseFirst(mod1); + mod2 = UpperCaseFirst(mod2); + mod3 = UpperCaseFirst(mod3); + key = UpperCaseFirst(key); + + //if no modifiers, only 1 key + if (key == "") + { + Enum.TryParse(mod1, out _key); + data.startAutoTracker1 = new GlobalHotkey(ModifierKeys.None, _key, StartHotkey); + HotkeysManager.AddHotkey(data.startAutoTracker1); + return; + } + + //check for modifiers, however many + if (mod1 != "") + Enum.TryParse(mod1, out _mod1); + if (mod2 != "") + Enum.TryParse(mod2, out _mod2); + if (mod3 != "") + Enum.TryParse(mod3, out _mod3); + + //per used amount + if (modsUsed == 3) + { + Console.WriteLine("idk = " + mod1 + " " + mod2 + " " + mod3 + " " + key); + if (key == "1" || key == "2" || key == "3" || key == "4" || key == "5" + || key == "6" || key == "7" || key == "8" || key == "9" || key == "0") + { + Enum.TryParse(ConvertKeyNumber(key, true), out _key); + data.startAutoTracker1 = new GlobalHotkey((_mod1 | _mod2 | _mod3), _key, StartHotkey); + HotkeysManager.AddHotkey(data.startAutoTracker1); + + Enum.TryParse(ConvertKeyNumber(key, false), out _key); + data.startAutoTracker2 = new GlobalHotkey((_mod1 | _mod2 | _mod3), _key, StartHotkey); + HotkeysManager.AddHotkey(data.startAutoTracker2); + return; + } + Enum.TryParse(key, out _key); + data.startAutoTracker1 = new GlobalHotkey((_mod1 | _mod2 | _mod3), _key, StartHotkey); + HotkeysManager.AddHotkey(data.startAutoTracker1); + return; + } + else if (modsUsed == 2) + { + Console.WriteLine("idk = " + mod1 + " " + mod2 + " " + key); + if (key == "1" || key == "2" || key == "3" || key == "4" || key == "5" + || key == "6" || key == "7" || key == "8" || key == "9" || key == "0") + { + Enum.TryParse(ConvertKeyNumber(key, true), out _key); + data.startAutoTracker1 = new GlobalHotkey((_mod1 | _mod2), _key, StartHotkey); + HotkeysManager.AddHotkey(data.startAutoTracker1); + + Enum.TryParse(ConvertKeyNumber(key, false), out _key); + data.startAutoTracker2 = new GlobalHotkey((_mod1 | _mod2), _key, StartHotkey); + HotkeysManager.AddHotkey(data.startAutoTracker2); + return; + } + Enum.TryParse(key, out _key); + data.startAutoTracker1 = new GlobalHotkey((_mod1 | _mod2), _key, StartHotkey); + HotkeysManager.AddHotkey(data.startAutoTracker1); + return; + } + else + { + Console.WriteLine("idk = " + mod1 + " " + key); + if (key == "1" || key == "2" || key == "3" || key == "4" || key == "5" + || key == "6" || key == "7" || key == "8" || key == "9" || key == "0") + { + Enum.TryParse(ConvertKeyNumber(key, true), out _key); + data.startAutoTracker1 = new GlobalHotkey(_mod1, _key, StartHotkey); + HotkeysManager.AddHotkey(data.startAutoTracker1); + + Enum.TryParse(ConvertKeyNumber(key, false), out _key); + data.startAutoTracker2 = new GlobalHotkey(_mod1, _key, StartHotkey); + HotkeysManager.AddHotkey(data.startAutoTracker2); + return; + } + Enum.TryParse(ConvertKey(key), out _key); + data.startAutoTracker1 = new GlobalHotkey(_mod1, _key, StartHotkey); + HotkeysManager.AddHotkey(data.startAutoTracker1); + return; + } + } + + private string UpperCaseFirst(string word) + { + if (word.Length <= 0) + return ""; + + string firstLetter1 = word.Substring(0, 1); + string firstLetter2 = firstLetter1.ToUpper(); + string rest = word.Substring(1); + + return firstLetter2 + rest; + } + + private string ConvertKey(string key) + { + switch (key) + { + case ".": + return "OemPeriod"; + case ",": + return "OemComma"; + case "?": + return "OemPeriod"; + case "\"": + return "OemQuestion"; + case "'": + return "OemQuotes"; + case "[": + return "OemOpenBrackets"; + case "{": + return "OemOpenBrackets"; + case "]": + return "OemCloseBrackets"; + case "}": + return "OemCloseBrackets"; + case "\\": + return "OemBackslash"; + case ":": + return "OemSemicolon"; + case ";": + return "OemSemicolon"; + case "-": + return "OemMinus"; + case "_": + return "OemMinus"; + case "+": + return "OemPlus"; + case "=": + return "OemPlus"; + case "|": + return "OemPipe"; + + default: + return key; + } + } + + private string ConvertKeyNumber(string num, bool type) + { + switch (num) + { + case "1": + if (type) + return "D1"; + else + return "NumPad1"; + case "2": + if (type) + return "D2"; + else + return "NumPad2"; + case "3": + if (type) + return "D3"; + else + return "NumPad3"; + case "4": + if (type) + return "D4"; + else + return "NumPad4"; + case "5": + if (type) + return "D5"; + else + return "NumPad5"; + case "6": + if (type) + return "D6"; + else + return "NumPad6"; + case "7": + if (type) + return "D7"; + else + return "NumPad7"; + case "8": + if (type) + return "D8"; + else + return "NumPad8"; + case "9": + if (type) + return "D9"; + else + return "NumPad9"; + default: + if (type) + return "D0"; + else + return "NumPad0"; + } + } + } +} diff --git a/KhTracker/Core/Text.cs b/KhTracker/Core/Text.cs new file mode 100644 index 00000000..baf9c675 --- /dev/null +++ b/KhTracker/Core/Text.cs @@ -0,0 +1,316 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.Windows; +using System.Windows.Documents; +using System.Windows.Markup; +using System.Windows.Media; + +namespace KhTracker +{ + [ContentProperty("Text")] + public class OutlinedTextBlock : FrameworkElement + { + private void UpdatePen() + { + _Pen = new Pen(Stroke, StrokeThickness) + { + DashCap = PenLineCap.Round, + EndLineCap = PenLineCap.Round, + LineJoin = PenLineJoin.Round, + StartLineCap = PenLineCap.Round + }; + + InvalidateVisual(); + } + + public static readonly DependencyProperty FillProperty = DependencyProperty.Register( + "Fill", + typeof(Brush), + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(Brushes.Black, FrameworkPropertyMetadataOptions.AffectsRender)); + + public static readonly DependencyProperty StrokeProperty = DependencyProperty.Register( + "Stroke", + typeof(Brush), + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(Brushes.Black, FrameworkPropertyMetadataOptions.AffectsRender, StrokePropertyChangedCallback)); + + private static void StrokePropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) + { + (dependencyObject as OutlinedTextBlock)?.UpdatePen(); + } + + public static readonly DependencyProperty StrokeThicknessProperty = DependencyProperty.Register( + "StrokeThickness", + typeof(double), + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(1d, FrameworkPropertyMetadataOptions.AffectsRender, StrokePropertyChangedCallback)); + + public static readonly DependencyProperty FontFamilyProperty = TextElement.FontFamilyProperty.AddOwner( + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(OnFormattedTextUpdated)); + + public static readonly DependencyProperty FontSizeProperty = TextElement.FontSizeProperty.AddOwner( + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(OnFormattedTextUpdated)); + + public static readonly DependencyProperty FontStretchProperty = TextElement.FontStretchProperty.AddOwner( + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(OnFormattedTextUpdated)); + + public static readonly DependencyProperty FontStyleProperty = TextElement.FontStyleProperty.AddOwner( + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(OnFormattedTextUpdated)); + + public static readonly DependencyProperty FontWeightProperty = TextElement.FontWeightProperty.AddOwner( + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(OnFormattedTextUpdated)); + + public static readonly DependencyProperty TextProperty = DependencyProperty.Register( + "Text", + typeof(string), + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(OnFormattedTextInvalidated)); + + public static readonly DependencyProperty TextAlignmentProperty = DependencyProperty.Register( + "TextAlignment", + typeof(TextAlignment), + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(OnFormattedTextUpdated)); + + public static readonly DependencyProperty TextDecorationsProperty = DependencyProperty.Register( + "TextDecorations", + typeof(TextDecorationCollection), + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(OnFormattedTextUpdated)); + + public static readonly DependencyProperty TextTrimmingProperty = DependencyProperty.Register( + "TextTrimming", + typeof(TextTrimming), + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(OnFormattedTextUpdated)); + + public static readonly DependencyProperty TextWrappingProperty = DependencyProperty.Register( + "TextWrapping", + typeof(TextWrapping), + typeof(OutlinedTextBlock), + new FrameworkPropertyMetadata(TextWrapping.NoWrap, OnFormattedTextUpdated)); + + private FormattedText _FormattedText; + private Geometry _TextGeometry; + private Pen _Pen; + + public Brush Fill + { + get { return (Brush)GetValue(FillProperty); } + set { SetValue(FillProperty, value); } + } + + public FontFamily FontFamily + { + get { return (FontFamily)GetValue(FontFamilyProperty); } + set { SetValue(FontFamilyProperty, value); } + } + + [TypeConverter(typeof(FontSizeConverter))] + public double FontSize + { + get { return (double)GetValue(FontSizeProperty); } + set { SetValue(FontSizeProperty, value); } + } + + public FontStretch FontStretch + { + get { return (FontStretch)GetValue(FontStretchProperty); } + set { SetValue(FontStretchProperty, value); } + } + + public FontStyle FontStyle + { + get { return (FontStyle)GetValue(FontStyleProperty); } + set { SetValue(FontStyleProperty, value); } + } + + public FontWeight FontWeight + { + get { return (FontWeight)GetValue(FontWeightProperty); } + set { SetValue(FontWeightProperty, value); } + } + + public Brush Stroke + { + get { return (Brush)GetValue(StrokeProperty); } + set { SetValue(StrokeProperty, value); } + } + + public double StrokeThickness + { + get { return (double)GetValue(StrokeThicknessProperty); } + set { SetValue(StrokeThicknessProperty, value); } + } + + public string Text + { + get { return (string)GetValue(TextProperty); } + set { SetValue(TextProperty, value); } + } + + public TextAlignment TextAlignment + { + get { return (TextAlignment)GetValue(TextAlignmentProperty); } + set { SetValue(TextAlignmentProperty, value); } + } + + public TextDecorationCollection TextDecorations + { + get { return (TextDecorationCollection)GetValue(TextDecorationsProperty); } + set { SetValue(TextDecorationsProperty, value); } + } + + public TextTrimming TextTrimming + { + get { return (TextTrimming)GetValue(TextTrimmingProperty); } + set { SetValue(TextTrimmingProperty, value); } + } + + public TextWrapping TextWrapping + { + get { return (TextWrapping)GetValue(TextWrappingProperty); } + set { SetValue(TextWrappingProperty, value); } + } + + public OutlinedTextBlock() + { + UpdatePen(); + TextDecorations = new TextDecorationCollection(); + } + + protected override void OnRender(DrawingContext drawingContext) + { + EnsureGeometry(); + + //Fill = ColorOverride(Text); + + drawingContext.DrawGeometry(null, _Pen, _TextGeometry); + drawingContext.DrawGeometry(Fill, null, _TextGeometry); + } + + protected override Size MeasureOverride(Size availableSize) + { + EnsureFormattedText(); + + // constrain the formatted text according to the available size + + double w = availableSize.Width; + double h = availableSize.Height; + + // the Math.Min call is important - without this constraint (which seems arbitrary, but is the maximum allowable text width), things blow up when availableSize is infinite in both directions + // the Math.Max call is to ensure we don't hit zero, which will cause MaxTextHeight to throw + _FormattedText.MaxTextWidth = Math.Min(3579139, w); + _FormattedText.MaxTextHeight = Math.Max(0.0001d, h); + + // return the desired size + return new Size(Math.Ceiling(_FormattedText.Width), Math.Ceiling(_FormattedText.Height)); + } + + protected override Size ArrangeOverride(Size finalSize) + { + EnsureFormattedText(); + + // update the formatted text with the final size + _FormattedText.MaxTextWidth = finalSize.Width; + _FormattedText.MaxTextHeight = Math.Max(0.0001d, finalSize.Height); + + // need to re-generate the geometry now that the dimensions have changed + _TextGeometry = null; + + return finalSize; + } + + private static void OnFormattedTextInvalidated(DependencyObject dependencyObject, + DependencyPropertyChangedEventArgs e) + { + var outlinedTextBlock = (OutlinedTextBlock)dependencyObject; + outlinedTextBlock._FormattedText = null; + outlinedTextBlock._TextGeometry = null; + + outlinedTextBlock.InvalidateMeasure(); + outlinedTextBlock.InvalidateVisual(); + } + + private static void OnFormattedTextUpdated(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) + { + var outlinedTextBlock = (OutlinedTextBlock)dependencyObject; + outlinedTextBlock.UpdateFormattedText(); + outlinedTextBlock._TextGeometry = null; + + outlinedTextBlock.InvalidateMeasure(); + outlinedTextBlock.InvalidateVisual(); + } + + private void EnsureFormattedText() + { + if (_FormattedText != null) + { + return; + } + + _FormattedText = new FormattedText( + Text ?? "", + CultureInfo.CurrentUICulture, + FlowDirection, + new Typeface(FontFamily, FontStyle, FontWeight, FontStretch), + FontSize, + Brushes.Black); + + UpdateFormattedText(); + } + + private void UpdateFormattedText() + { + if (_FormattedText == null) + { + return; + } + + _FormattedText.MaxLineCount = TextWrapping == TextWrapping.NoWrap ? 1 : int.MaxValue; + _FormattedText.TextAlignment = TextAlignment; + _FormattedText.Trimming = TextTrimming; + + _FormattedText.SetFontSize(FontSize); + _FormattedText.SetFontStyle(FontStyle); + _FormattedText.SetFontWeight(FontWeight); + _FormattedText.SetFontFamily(FontFamily); + _FormattedText.SetFontStretch(FontStretch); + _FormattedText.SetTextDecorations(TextDecorations); + } + + private void EnsureGeometry() + { + if (_TextGeometry != null) + { + return; + } + + EnsureFormattedText(); + _TextGeometry = _FormattedText.BuildGeometry(new Point(0, 0)); + } + + //private Brush ColorOverride(string text) + //{ + // if (Text == null) + // return Brushes.White; + // + // if (!text.StartsWith("Joke:")) + // { + // return Brushes.White; + // } + // + // + // Text.Remove(0, 6); + // + // return Brushes.Purple; + //} + } +} \ No newline at end of file diff --git a/KhTracker/Core/Toggles.cs b/KhTracker/Core/Toggles.cs new file mode 100644 index 00000000..747b6f20 --- /dev/null +++ b/KhTracker/Core/Toggles.cs @@ -0,0 +1,1456 @@ +using System; +//using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Media.Imaging; +using System.Windows.Media; +using System.Windows.Shapes; +using System.Linq; +using System.Collections.Generic; +using System.Windows.Data; +using System.IO; + +namespace KhTracker +{ + public partial class MainWindow : Window + { + /// + /// Helpers + /// + + private void HandleItemToggle(bool toggle, Item button, bool init) + { + if (toggle && button.IsEnabled == false) + { + button.IsEnabled = true; + button.Visibility = Visibility.Visible; + if (!init) + { + SetTotal(true); + } + } + else if (toggle == false && button.IsEnabled) + { + button.IsEnabled = false; + button.Visibility = Visibility.Hidden; + SetTotal(false); + + button.HandleItemReturn(); + } + } + + private void HandleWorldToggle(bool toggle, Button button, UniformGrid grid) + { + //make grid visible + if (toggle && !button.IsEnabled) + { + var outerGrid = ((button.Parent as Grid).Parent as Grid).Parent as Grid; + int row = (int)((button.Parent as Grid).Parent as Grid).GetValue(Grid.RowProperty); + outerGrid.RowDefinitions[row].Height = new GridLength(1, GridUnitType.Star); + button.IsEnabled = true; + button.Visibility = Visibility.Visible; + } + else if (!toggle && button.IsEnabled) + { + //if world was previously selected, unselect it and reset highlighted visual + if (data.selected == button) + { + foreach (var Box in data.WorldsData[button.Name].top.Children.OfType()) + { + if (Box.Opacity != 0.9 && !Box.Name.EndsWith("SelWG")) + Box.Fill = (SolidColorBrush)FindResource("DefaultRec"); + + if (Box.Name.EndsWith("SelWG")) + Box.Visibility = Visibility.Collapsed; + } + data.selected = null; + } + + //return all items in world to itempool + for (int i = grid.Children.Count - 1; i >= 0; --i) + { + Item item = grid.Children[i] as Item; + item.HandleItemReturn(); + } + + //resize grid and collapse it + var outerGrid = ((button.Parent as Grid).Parent as Grid).Parent as Grid; + int row = (int)((button.Parent as Grid).Parent as Grid).GetValue(Grid.RowProperty); + outerGrid.RowDefinitions[row].Height = new GridLength(0, GridUnitType.Star); + button.IsEnabled = false; + button.Visibility = Visibility.Collapsed; + } + } + + /// + /// Options + /// + + private void AutoSaveProgressToggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.AutoSaveProgress = AutoSaveProgressOption.IsChecked; + } + + private void AutoSaveProgress2Toggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.AutoSaveProgress2 = AutoSaveProgress2Option.IsChecked; + } + + private void TopMostToggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.TopMost = TopMostOption.IsChecked; + Topmost = TopMostOption.IsChecked; + } + + private void DragDropToggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.DragDrop = DragAndDropOption.IsChecked; + data.dragDrop = DragAndDropOption.IsChecked; + + List itempools = new List(); + foreach (Grid pool in ItemPool.Children) + { + itempools.Add(pool); + } + + foreach (string key in data.Items.Keys) + { + Item item = data.Items[key].Item1; + if (itempools.Contains(item.Parent)) + { + if (data.dragDrop == false) + { + item.MouseDoubleClick -= item.Item_Click; + item.MouseMove -= item.Item_MouseMove; + + item.MouseDown -= item.Item_MouseDown; + item.MouseDown += item.Item_MouseDown; + item.MouseUp -= item.Item_MouseUp; + item.MouseUp += item.Item_MouseUp; + } + else + { + item.MouseDoubleClick -= item.Item_Click; + item.MouseDoubleClick += item.Item_Click; + item.MouseMove -= item.Item_MouseMove; + item.MouseMove += item.Item_MouseMove; + + item.MouseDown -= item.Item_MouseDown; + item.MouseUp -= item.Item_MouseUp; + } + } + } + } + + private void AutoConnectToggle(object sender, RoutedEventArgs e) + { + AutoConnectToggle(AutoConnectOption.IsChecked); + } + + private void AutoConnectToggle(bool toggle) + { + Properties.Settings.Default.AutoConnect = toggle; + AutoConnectOption.IsChecked = toggle; + } + + //private void AutoDetectToggle(object sender, RoutedEventArgs e) + //{ + // Properties.Settings.Default.AutoDetect = AutoDetectOption.IsChecked; + // + // if (AutoDetectOption.IsChecked) + // { + // Connect.Visibility = Visibility.Visible; + // Connect2.Visibility = Visibility.Collapsed; + // SetAutoDetectTimer(); + // + // SettingRow.Height = new GridLength(0.5, GridUnitType.Star); + // + // TrackPCSX2Toggle.IsEnabled = false; + // TrackPCToggle.IsEnabled = false; + // } + // else + // { + // Connect.Visibility = Visibility.Collapsed; + // Connect2.Visibility = Visibility.Collapsed; + // + // if (SettingsText.Text == "Settings:") + // SettingRow.Height = new GridLength(0.5, GridUnitType.Star); + // else + // SettingRow.Height = new GridLength(0, GridUnitType.Star); + // + // TrackPCSX2Toggle.IsEnabled = true; + // TrackPCToggle.IsEnabled = true; + // } + //} + + /// + /// Toggles + /// + + private void ReportsToggle(object sender, RoutedEventArgs e) + { + ReportsToggle(ReportsOption.IsChecked); + } + + private void ReportsToggle(bool toggle) + { + Properties.Settings.Default.AnsemReports = toggle; + ReportsOption.IsChecked = toggle; + Double Size; + + //Set gridsizes based on toggle + if (toggle) + Size = 1.0; + else + Size = 0.0; + + ReportRow.Height = new GridLength(Size, GridUnitType.Star); + + //set reports + for (int i = 0; i < data.Reports.Count; ++i) + { + HandleItemToggle(toggle, data.Reports[i], false); + } + } + + private void PromiseCharmToggle(object sender, RoutedEventArgs e) + { + PromiseCharmToggle(PromiseCharmOption.IsChecked); + } + + private void PromiseCharmToggle(bool toggle) + { + Properties.Settings.Default.PromiseCharm = toggle; + PromiseCharmOption.IsChecked = toggle; + if (toggle) + { + PromiseCharmCol.Width = new GridLength(1.0, GridUnitType.Star); + } + else + { + PromiseCharmCol.Width = new GridLength(0, GridUnitType.Star); + } + + HandleItemToggle(toggle, PromiseCharm, false); + } + + private void AbilitiesToggle(object sender, RoutedEventArgs e) + { + AbilitiesToggle(AbilitiesOption.IsChecked); + } + + private void AbilitiesToggle(bool toggle) + { + Properties.Settings.Default.Abilities = toggle; + AbilitiesOption.IsChecked = toggle; + if (toggle) + { + OnceMoreCol.Width = new GridLength(1.0, GridUnitType.Star); + SecondChanceCol.Width = new GridLength(1.0, GridUnitType.Star); + } + else + { + OnceMoreCol.Width = new GridLength(0, GridUnitType.Star); + SecondChanceCol.Width = new GridLength(0, GridUnitType.Star); + } + + HandleItemToggle(toggle, OnceMore, false); + HandleItemToggle(toggle, SecondChance, false); + } + + private void AntiFormToggle(object sender, RoutedEventArgs e) + { + AntiFormToggle(AntiFormOption.IsChecked); + } + + private void AntiFormToggle(bool toggle) + { + Properties.Settings.Default.AntiForm = toggle; + AntiFormOption.IsChecked = toggle; + + if (toggle) + { + AntiFormCol.Width = new GridLength(1.0, GridUnitType.Star); + } + else + { + AntiFormCol.Width = new GridLength(0, GridUnitType.Star); + } + + HandleItemToggle(toggle, Anti, false); + } + + private void VisitLockToggle(object sender, RoutedEventArgs e) + { + VisitLockToggle(VisitLockOption.IsChecked); + } + + private void VisitLockToggle(bool toggle) + { + Properties.Settings.Default.WorldVisitLock = toggle; + VisitLockOption.IsChecked = toggle; + + int value = 0; + + if (toggle) + { + value = 1; + + S_MulanWep.Visibility = Visibility.Visible; + S_AuronWep.Visibility = Visibility.Visible; + S_BeastWep.Visibility = Visibility.Visible; + S_JackWep.Visibility = Visibility.Visible; + S_IceCream.Visibility = Visibility.Visible; + S_TronWep.Visibility = Visibility.Visible; + S_Picture.Visibility = Visibility.Visible; + S_MembershipCard.Visibility = Visibility.Visible; + S_SimbaWep.Visibility = Visibility.Visible; + S_AladdinWep.Visibility = Visibility.Visible; + S_SparrowWep.Visibility = Visibility.Visible; + + Cross01.Visibility = Visibility.Collapsed; + Cross02.Visibility = Visibility.Collapsed; + Cross03.Visibility = Visibility.Collapsed; + Cross04.Visibility = Visibility.Collapsed; + Cross05.Visibility = Visibility.Collapsed; + Cross06.Visibility = Visibility.Collapsed; + Cross07.Visibility = Visibility.Collapsed; + Cross08.Visibility = Visibility.Collapsed; + Cross09.Visibility = Visibility.Collapsed; + Cross10.Visibility = Visibility.Collapsed; + Cross11.Visibility = Visibility.Collapsed; + + VisitsRow.Height = new GridLength(1, GridUnitType.Star); + } + else + { + S_MulanWep.Visibility = Visibility.Collapsed; + S_AuronWep.Visibility = Visibility.Collapsed; + S_BeastWep.Visibility = Visibility.Collapsed; + S_JackWep.Visibility = Visibility.Collapsed; + S_IceCream.Visibility = Visibility.Collapsed; + S_TronWep.Visibility = Visibility.Collapsed; + S_Picture.Visibility = Visibility.Collapsed; + S_MembershipCard.Visibility = Visibility.Collapsed; + S_SimbaWep.Visibility = Visibility.Collapsed; + S_AladdinWep.Visibility = Visibility.Collapsed; + S_SparrowWep.Visibility = Visibility.Collapsed; + + Cross01.Visibility = Visibility.Visible; + Cross02.Visibility = Visibility.Visible; + Cross03.Visibility = Visibility.Visible; + Cross04.Visibility = Visibility.Visible; + Cross05.Visibility = Visibility.Visible; + Cross06.Visibility = Visibility.Visible; + Cross07.Visibility = Visibility.Visible; + Cross08.Visibility = Visibility.Visible; + Cross09.Visibility = Visibility.Visible; + Cross10.Visibility = Visibility.Visible; + Cross11.Visibility = Visibility.Visible; + + if(ExtraChecksOption.IsChecked) + VisitsRow.Height = new GridLength(1, GridUnitType.Star); + else + VisitsRow.Height = new GridLength(0, GridUnitType.Star); + } + + + //set lock values + data.WorldsData["TwilightTown"].visitLocks = value * 11; + data.WorldsData["HollowBastion"].visitLocks = value; + data.WorldsData["BeastsCastle"].visitLocks = value; + data.WorldsData["OlympusColiseum"].visitLocks = value; + data.WorldsData["Agrabah"].visitLocks = value; + data.WorldsData["LandofDragons"].visitLocks = value; + data.WorldsData["PrideLands"].visitLocks = value; + data.WorldsData["HalloweenTown"].visitLocks = value; + data.WorldsData["PortRoyal"].visitLocks = value; + data.WorldsData["SpaceParanoids"].visitLocks = value; + + for (int i = 0; i < data.VisitLocks.Count; ++i) + { + HandleItemToggle(toggle, data.VisitLocks[i], false); + } + + VisitLockCheck(); + } + + private void TornPagesToggle(object sender, RoutedEventArgs e) + { + TornPagesToggle(TornPagesOption.IsChecked); + } + + private void TornPagesToggle(bool toggle) + { + Properties.Settings.Default.TornPages = toggle; + TornPagesOption.IsChecked = toggle; + + if (toggle) + { + PageSep.Width = new GridLength(0.1, GridUnitType.Star); + PageNum.Width = new GridLength(0.6, GridUnitType.Star); + PageImg.Width = new GridLength(1.0, GridUnitType.Star); + } + else + { + PageSep.Width = new GridLength(0, GridUnitType.Star); + PageNum.Width = new GridLength(0, GridUnitType.Star); + PageImg.Width = new GridLength(0, GridUnitType.Star); + } + + HandleItemToggle(toggle, TornPage1, false); + HandleItemToggle(toggle, TornPage2, false); + HandleItemToggle(toggle, TornPage3, false); + HandleItemToggle(toggle, TornPage4, false); + HandleItemToggle(toggle, TornPage5, false); + } + + private void ExtraChecksToggle(object sender, RoutedEventArgs e) + { + ExtraChecksToggle(ExtraChecksOption.IsChecked); + } + + private void ExtraChecksToggle(bool toggle) + { + Properties.Settings.Default.ExtraChecks = toggle; + ExtraChecksOption.IsChecked = toggle; + + if (toggle) + { + HadesCupCol.Width = new GridLength(1.0, GridUnitType.Star); + OlympusStoneCol.Width = new GridLength(1.0, GridUnitType.Star); + UnknownDiskCol.Width = new GridLength(1.0, GridUnitType.Star); + + MunnySep.Width = new GridLength(0.1, GridUnitType.Star); + MunnyNum.Width = new GridLength(0.6, GridUnitType.Star); + MunnyImg.Width = new GridLength(1.0, GridUnitType.Star); + + VisitsRow.Height = new GridLength(1, GridUnitType.Star); + } + else + { + HadesCupCol.Width = new GridLength(0, GridUnitType.Star); + OlympusStoneCol.Width = new GridLength(0, GridUnitType.Star); + UnknownDiskCol.Width = new GridLength(0, GridUnitType.Star); + + MunnySep.Width = new GridLength(0, GridUnitType.Star); + MunnyNum.Width = new GridLength(0, GridUnitType.Star); + MunnyImg.Width = new GridLength(0, GridUnitType.Star); + + if (VisitLockOption.IsChecked) + VisitsRow.Height = new GridLength(1, GridUnitType.Star); + else + VisitsRow.Height = new GridLength(0, GridUnitType.Star); + } + + HandleItemToggle(toggle, HadesCup, false); + HandleItemToggle(toggle, OlympusStone, false); + HandleItemToggle(toggle, UnknownDisk, false); + HandleItemToggle(toggle, MunnyPouch1, false); + HandleItemToggle(toggle, MunnyPouch2, false); + } + + private void SeedHashToggle(object sender, RoutedEventArgs e) + { + SeedHashToggle(SeedHashOption.IsChecked); + } + + private void SeedHashToggle(bool toggle) + { + Properties.Settings.Default.SeedHash = toggle; + SeedHashOption.IsChecked = toggle; + + if (toggle) + { + HintTextBegin.Text = ""; + HintTextMiddle.Text = ""; + HintTextEnd.Text = ""; + } + + if (data.SeedHashLoaded && toggle) + HashGrid.Visibility = Visibility.Visible; + else + HashGrid.Visibility = Visibility.Collapsed; + } + + private void WorldProgressToggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.WorldProgress = WorldProgressOption.IsChecked; + if (WorldProgressOption.IsChecked) + { + foreach (string key in data.WorldsData.Keys.ToList()) + { + if (data.WorldsData[key].progression != null) + data.WorldsData[key].progression.Visibility = Visibility.Visible; + } + } + else + { + foreach (string key in data.WorldsData.Keys.ToList()) + { + if (data.WorldsData[key].progression != null) + data.WorldsData[key].progression.Visibility = Visibility.Hidden; + } + } + } + + private void FormsGrowthToggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.FormsGrowth = FormsGrowthOption.IsChecked; + + if (FormsGrowthOption.IsChecked && aTimer != null) + FormRow.Height = new GridLength(0.5, GridUnitType.Star); + else + FormRow.Height = new GridLength(0, GridUnitType.Star); + } + + private void GhostItemToggle(object sender, RoutedEventArgs e) + { + GhostItemToggle(GhostItemOption.IsChecked); + } + + private void GhostItemToggle(bool toggle) + { + Properties.Settings.Default.GhostItem = toggle; + GhostItemOption.IsChecked = toggle; + + foreach (var item in data.GhostItems.Values) + { + HandleItemToggle(toggle, item, false); + } + + WorldGrid.Ghost_Fire = 0; + WorldGrid.Ghost_Blizzard = 0; + WorldGrid.Ghost_Thunder = 0; + WorldGrid.Ghost_Cure = 0; + WorldGrid.Ghost_Reflect = 0; + WorldGrid.Ghost_Magnet = 0; + WorldGrid.Ghost_Pages = 0; + WorldGrid.Ghost_Fire_obtained = 0; + WorldGrid.Ghost_Blizzard_obtained = 0; + WorldGrid.Ghost_Thunder_obtained = 0; + WorldGrid.Ghost_Cure_obtained = 0; + WorldGrid.Ghost_Reflect_obtained = 0; + WorldGrid.Ghost_Magnet_obtained = 0; + WorldGrid.Ghost_Pages_obtained = 0; + WorldGrid.Ghost_Pouches_obtained = 0; + } + + private void GhostMathToggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.GhostMath = GhostMathOption.IsChecked; + + if (GhostItemOption.IsChecked && (data.mode == Mode.PointsHints || data.ScoreMode)) + { + int add = -1; + + //subtract points (math on) + if (!GhostMathOption.IsChecked) + add = 1; + + foreach (WorldData worldData in data.WorldsData.Values.ToList()) + { + if (worldData.value == null) + continue; + + if (worldData.containsGhost) + { + int ghostnum = GetGhostPoints(worldData.worldGrid) * add; + int worldnum = -1; + + if (worldData.value.Text != "?") + worldnum = int.Parse(worldData.value.Text); + + SetWorldValue(worldData.value, worldnum + ghostnum); + } + } + } + } + + private void ShowCheckCountToggle(object sender, RoutedEventArgs e) + { + ShowCheckCountToggle(CheckCountOption.IsChecked); + } + + private void ShowCheckCountToggle(bool toggle) + { + Properties.Settings.Default.CheckCount = toggle; + CheckCountOption.IsChecked = toggle; + + //don't do anything if not in points mode + if (data.mode != Mode.PointsHints && !data.ScoreMode) + return; + + //don't do anything if progression hints + if (data.UsingProgressionHints && data.progressionType == "Reports") + return; + + //if check count should be shown and replace the score IN POINTS MODE + if (toggle) + { + CollectionGrid.Visibility = Visibility.Visible; + ScoreGrid.Visibility = Visibility.Collapsed; + ProgressionCollectionGrid.Visibility = Visibility.Collapsed; + + ChestIcon.SetResourceReference(ContentProperty, "Chest"); + } + //if points should show and replace check count IN POINTS MODE + else + { + CollectionGrid.Visibility = Visibility.Collapsed; + ScoreGrid.Visibility = Visibility.Visible; + ProgressionCollectionGrid.Visibility = Visibility.Collapsed; + + ChestIcon.SetResourceReference(ContentProperty, "Score"); + } + } + + private void NextLevelCheckToggle(object sender, RoutedEventArgs e) + { + NextLevelCheckToggle(NextLevelCheckOption.IsChecked); + } + + private void NextLevelCheckToggle(bool toggle) + { + Properties.Settings.Default.NextLevelCheck = toggle; + NextLevelCheckOption.IsChecked = toggle; + + NextLevelDisplay(); + } + + private void NextLevelDisplay() + { + bool Visible = NextLevelCheckOption.IsChecked; + + //default + int levelsetting = 1; + + if (SoraLevel50Option.IsChecked) + levelsetting = 50; + + if (SoraLevel99Option.IsChecked) + levelsetting = 99; + + if (memory != null && stats != null) + { + try + { + stats.SetMaxLevelCheck(levelsetting); + stats.SetNextLevelCheck(stats.Level); + } + catch + { + Console.WriteLine("Tried to edit while loading"); + } + } + + if (levelsetting == 1 || Level.Visibility != Visibility.Visible) + { + NextLevelCol.Width = new GridLength(0, GridUnitType.Star); + return; + } + + if (Visible && memory != null) + { + NextLevelCol.Width = new GridLength(0.8, GridUnitType.Star); + } + else + { + NextLevelCol.Width = new GridLength(0, GridUnitType.Star); + } + } + + private void DeathCounterToggle(object sender, RoutedEventArgs e) + { + DeathCounterToggle(DeathCounterOption.IsChecked); + } + + private void DeathCounterToggle(bool toggle) + { + Properties.Settings.Default.DeathCounter = toggle; + DeathCounterOption.IsChecked = toggle; + + DeathCounterDisplay(); + } + + private void DeathCounterDisplay() + { + if (DeathCounterOption.IsChecked && memory != null) + { + DeathCounterGrid.Visibility = Visibility.Visible; + DeathCol.Width = new GridLength(0.2, GridUnitType.Star); + + HashSpacer1.Width = new GridLength(0.00, GridUnitType.Star); + HashSpacer2.Width = new GridLength(1.75, GridUnitType.Star); + } + else + { + DeathCounterGrid.Visibility = Visibility.Collapsed; + DeathCol.Width = new GridLength(0, GridUnitType.Star); + + HashSpacer1.Width = new GridLength(0.75, GridUnitType.Star); + HashSpacer2.Width = new GridLength(0.75, GridUnitType.Star); + } + } + + private void SoraLevel01Toggle(object sender, RoutedEventArgs e) + { + SoraLevel01Toggle(SoraLevel01Option.IsChecked); + } + + private void SoraLevel01Toggle(bool toggle) + { + //mimic radio button + if (SoraLevel01Option.IsChecked == false) + { + SoraLevel01Option.IsChecked = true; + //return; + } + SoraLevel50Option.IsChecked = false; + SoraLevel99Option.IsChecked = false; + Properties.Settings.Default.WorldLevel50 = SoraLevel50Option.IsChecked; + Properties.Settings.Default.WorldLevel99 = SoraLevel99Option.IsChecked; + Properties.Settings.Default.WorldLevel1 = toggle; + + NextLevelDisplay(); + } + + private void SoraLevel50Toggle(object sender, RoutedEventArgs e) + { + SoraLevel50Toggle(SoraLevel50Option.IsChecked); + } + + private void SoraLevel50Toggle(bool toggle) + { + //mimic radio button + if (SoraLevel50Option.IsChecked == false) + { + SoraLevel50Option.IsChecked = true; + //return; + } + SoraLevel01Option.IsChecked = false; + SoraLevel99Option.IsChecked = false; + Properties.Settings.Default.WorldLevel1 = SoraLevel50Option.IsChecked; + Properties.Settings.Default.WorldLevel99 = SoraLevel99Option.IsChecked; + Properties.Settings.Default.WorldLevel50 = toggle; + + NextLevelDisplay(); + } + + private void SoraLevel99Toggle(object sender, RoutedEventArgs e) + { + SoraLevel99Toggle(SoraLevel99Option.IsChecked); + } + + private void SoraLevel99Toggle(bool toggle) + { + //mimic radio button + if (SoraLevel99Option.IsChecked == false) + { + SoraLevel99Option.IsChecked = true; + //return; + } + SoraLevel50Option.IsChecked = false; + SoraLevel01Option.IsChecked = false; + Properties.Settings.Default.WorldLevel50 = SoraLevel50Option.IsChecked; + Properties.Settings.Default.WorldLevel1 = SoraLevel01Option.IsChecked; + Properties.Settings.Default.WorldLevel99 = toggle; + + NextLevelDisplay(); + } + + /// + /// Visual + /// + + private void WorldHighlightToggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.WorldHighlight = WorldHighlightOption.IsChecked; + + if (WorldHighlightOption.IsChecked == true && data.selected != null) //set previousl selected world to default colors + { + foreach (var Box in data.WorldsData[data.selected.Name].top.Children.OfType()) + { + if (Box.Name.EndsWith("SelWG")) + Box.Visibility = Visibility.Collapsed; + } + } + } + + private void WorldHintHighlightToggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.WorldHintHighlight = WorldHintHighlightOption.IsChecked; + + if (!WorldHintHighlightOption.IsChecked) + { + if (data.previousWorldsHinted.Count >= 0) + { + foreach (var world in data.previousWorldsHinted) + { + foreach (var Box in data.WorldsData[world].top.Children.OfType()) + { + if (Box.Opacity != 0.9 && !Box.Name.EndsWith("SelWG")) + Box.Fill = (SolidColorBrush)FindResource("DefaultRec"); + + if (Box.Name.EndsWith("SelWG") && !WorldHighlightOption.IsChecked) + Box.Visibility = Visibility.Collapsed; + } + } + } + } + } + + private void NewWorldLayoutToggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (NewWorldLayoutOption.IsChecked == false) + { + NewWorldLayoutOption.IsChecked = true; + return; + } + + OldWorldLayoutOption.IsChecked = false; + Properties.Settings.Default.NewWorldLayout = NewWorldLayoutOption.IsChecked; + Properties.Settings.Default.OldWorldLayout = OldWorldLayoutOption.IsChecked; + + if (NewWorldLayoutOption.IsChecked) + { + bool[] TempWorldState = new bool[19]; + TempWorldState[0] = Properties.Settings.Default.SoraHeart; + TempWorldState[1] = Properties.Settings.Default.Drives; + TempWorldState[2] = Properties.Settings.Default.Simulated; + TempWorldState[3] = Properties.Settings.Default.TwilightTown; + TempWorldState[4] = Properties.Settings.Default.HollowBastion; + TempWorldState[5] = Properties.Settings.Default.BeastCastle; + TempWorldState[6] = Properties.Settings.Default.Olympus; + TempWorldState[7] = Properties.Settings.Default.Agrabah; + TempWorldState[8] = Properties.Settings.Default.LandofDragons; + TempWorldState[9] = Properties.Settings.Default.DisneyCastle; + TempWorldState[10] = Properties.Settings.Default.PrideLands; + TempWorldState[11] = Properties.Settings.Default.PortRoyal; + TempWorldState[12] = Properties.Settings.Default.HalloweenTown; + TempWorldState[13] = Properties.Settings.Default.SpaceParanoids; + TempWorldState[14] = Properties.Settings.Default.TWTNW; + TempWorldState[15] = Properties.Settings.Default.HundredAcre; + TempWorldState[16] = Properties.Settings.Default.Atlantica; + TempWorldState[17] = Properties.Settings.Default.Puzzle; + TempWorldState[18] = Properties.Settings.Default.Synth; + + ReloadWorlds(null); + + WorldsLeft.Children.Clear(); + WorldsRight.Children.Clear(); + + WorldsLeft.Children.Add(SorasHeartTop); + Grid.SetRow(SorasHeartTop, 0); + WorldsLeft.Children.Add(SimulatedTwilightTownTop); + Grid.SetRow(SimulatedTwilightTownTop, 1); + WorldsLeft.Children.Add(TwilightTownTop); + Grid.SetRow(TwilightTownTop, 2); + WorldsLeft.Children.Add(HollowBastionTop); + Grid.SetRow(HollowBastionTop, 3); + WorldsLeft.Children.Add(LandofDragonsTop); + Grid.SetRow(LandofDragonsTop, 4); + WorldsLeft.Children.Add(BeastsCastleTop); + Grid.SetRow(BeastsCastleTop, 5); + WorldsLeft.Children.Add(OlympusColiseumTop); + Grid.SetRow(OlympusColiseumTop, 6); + WorldsLeft.Children.Add(DisneyCastleTop); + Grid.SetRow(DisneyCastleTop, 7); + WorldsLeft.Children.Add(GoATop); + Grid.SetRow(GoATop, 8); + + + WorldsRight.Children.Add(DriveFormsTop); + Grid.SetRow(DriveFormsTop, 0); + WorldsRight.Children.Add(PortRoyalTop); + Grid.SetRow(PortRoyalTop, 1); + WorldsRight.Children.Add(AgrabahTop); + Grid.SetRow(AgrabahTop, 2); + WorldsRight.Children.Add(HalloweenTownTop); + Grid.SetRow(HalloweenTownTop, 3); + WorldsRight.Children.Add(PrideLandsTop); + Grid.SetRow(PrideLandsTop, 4); + WorldsRight.Children.Add(SpaceParanoidsTop); + Grid.SetRow(SpaceParanoidsTop, 5); + WorldsRight.Children.Add(TWTNWTop); + Grid.SetRow(TWTNWTop, 6); + WorldsRight.Children.Add(HundredAcreWoodTop); + Grid.SetRow(HundredAcreWoodTop, 7); + WorldsRight.Children.Add(AtlanticaTop); + Grid.SetRow(AtlanticaTop, 8); + WorldsRight.Children.Add(PuzzSynthTop); + Grid.SetRow(PuzzSynthTop, 9); + + ReloadWorlds(TempWorldState); + } + } + + private void OldWorldLayoutToggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (OldWorldLayoutOption.IsChecked == false) + { + OldWorldLayoutOption.IsChecked = true; + return; + } + + NewWorldLayoutOption.IsChecked = false; + Properties.Settings.Default.NewWorldLayout = NewWorldLayoutOption.IsChecked; + Properties.Settings.Default.OldWorldLayout = OldWorldLayoutOption.IsChecked; + + if (OldWorldLayoutOption.IsChecked) + { + bool[] TempWorldState = new bool[19]; + TempWorldState[0] = Properties.Settings.Default.SoraHeart; + TempWorldState[1] = Properties.Settings.Default.Drives; + TempWorldState[2] = Properties.Settings.Default.Simulated; + TempWorldState[3] = Properties.Settings.Default.TwilightTown; + TempWorldState[4] = Properties.Settings.Default.HollowBastion; + TempWorldState[5] = Properties.Settings.Default.BeastCastle; + TempWorldState[6] = Properties.Settings.Default.Olympus; + TempWorldState[7] = Properties.Settings.Default.Agrabah; + TempWorldState[8] = Properties.Settings.Default.LandofDragons; + TempWorldState[9] = Properties.Settings.Default.DisneyCastle; + TempWorldState[10] = Properties.Settings.Default.PrideLands; + TempWorldState[11] = Properties.Settings.Default.PortRoyal; + TempWorldState[12] = Properties.Settings.Default.HalloweenTown; + TempWorldState[13] = Properties.Settings.Default.SpaceParanoids; + TempWorldState[14] = Properties.Settings.Default.TWTNW; + TempWorldState[15] = Properties.Settings.Default.HundredAcre; + TempWorldState[16] = Properties.Settings.Default.Atlantica; + TempWorldState[17] = Properties.Settings.Default.Puzzle; + TempWorldState[18] = Properties.Settings.Default.Synth; + + ReloadWorlds(null); + + WorldsLeft.Children.Clear(); + WorldsRight.Children.Clear(); + + WorldsLeft.Children.Add(SorasHeartTop); + Grid.SetRow(SorasHeartTop, 0); + WorldsLeft.Children.Add(SimulatedTwilightTownTop); + Grid.SetRow(SimulatedTwilightTownTop, 1); + WorldsLeft.Children.Add(HollowBastionTop); + Grid.SetRow(HollowBastionTop, 2); + WorldsLeft.Children.Add(OlympusColiseumTop); + Grid.SetRow(OlympusColiseumTop, 3); + WorldsLeft.Children.Add(LandofDragonsTop); + Grid.SetRow(LandofDragonsTop, 4); + WorldsLeft.Children.Add(PrideLandsTop); + Grid.SetRow(PrideLandsTop, 5); + WorldsLeft.Children.Add(HalloweenTownTop); + Grid.SetRow(HalloweenTownTop, 6); + WorldsLeft.Children.Add(SpaceParanoidsTop); + Grid.SetRow(SpaceParanoidsTop, 7); + WorldsLeft.Children.Add(GoATop); + Grid.SetRow(GoATop, 8); + + WorldsRight.Children.Add(DriveFormsTop); + Grid.SetRow(DriveFormsTop, 0); + WorldsRight.Children.Add(TwilightTownTop); + Grid.SetRow(TwilightTownTop, 1); + WorldsRight.Children.Add(BeastsCastleTop); + Grid.SetRow(BeastsCastleTop, 2); + WorldsRight.Children.Add(AgrabahTop); + Grid.SetRow(AgrabahTop, 3); + WorldsRight.Children.Add(HundredAcreWoodTop); + Grid.SetRow(HundredAcreWoodTop, 4); + WorldsRight.Children.Add(DisneyCastleTop); + Grid.SetRow(DisneyCastleTop, 5); + WorldsRight.Children.Add(PortRoyalTop); + Grid.SetRow(PortRoyalTop, 6); + WorldsRight.Children.Add(TWTNWTop); + Grid.SetRow(TWTNWTop, 7); + WorldsRight.Children.Add(AtlanticaTop); + Grid.SetRow(AtlanticaTop, 8); + WorldsRight.Children.Add(PuzzSynthTop); + Grid.SetRow(PuzzSynthTop, 9); + + ReloadWorlds(TempWorldState); + } + } + + private void ReloadWorlds(bool[] stateArr) + { + if (stateArr == null) + { + SoraHeartToggle(true); + DrivesToggle(true); + SimulatedToggle(true); + TwilightTownToggle(true); + HollowBastionToggle(true); + BeastCastleToggle(true); + OlympusToggle(true); + AgrabahToggle(true); + LandofDragonsToggle(true); + DisneyCastleToggle(true); + PrideLandsToggle(true); + PortRoyalToggle(true); + HalloweenTownToggle(true); + SpaceParanoidsToggle(true); + TWTNWToggle(true); + HundredAcreWoodToggle(true); + AtlanticaToggle(true); + PuzzleToggle(true); + SynthToggle(true); + } + else + { + SoraHeartToggle(stateArr[0]); + DrivesToggle(stateArr[1]); + SimulatedToggle(stateArr[2]); + TwilightTownToggle(stateArr[3]); + HollowBastionToggle(stateArr[4]); + BeastCastleToggle(stateArr[5]); + OlympusToggle(stateArr[6]); + AgrabahToggle(stateArr[7]); + LandofDragonsToggle(stateArr[8]); + DisneyCastleToggle(stateArr[9]); + PrideLandsToggle(stateArr[10]); + PortRoyalToggle(stateArr[11]); + HalloweenTownToggle(stateArr[12]); + SpaceParanoidsToggle(stateArr[13]); + TWTNWToggle(stateArr[14]); + HundredAcreWoodToggle(stateArr[15]); + AtlanticaToggle(stateArr[16]); + PuzzleToggle(stateArr[17]); + SynthToggle(stateArr[18]); + } + } + + private void ColorHintToggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.ColorHints = ColorHintOption.IsChecked; + } + + private void MinCheckToggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (MinCheckOption.IsChecked == false) + { + MinCheckOption.IsChecked = true; + return; + } + + OldCheckOption.IsChecked = false; + Properties.Settings.Default.MinCheck = MinCheckOption.IsChecked; + Properties.Settings.Default.OldCheck = OldCheckOption.IsChecked; + + SetItemImage(); + CustomChecksCheck(); + } + + private void OldCheckToggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (OldCheckOption.IsChecked == false) + { + OldCheckOption.IsChecked = true; + return; + } + + MinCheckOption.IsChecked = false; + Properties.Settings.Default.MinCheck = MinCheckOption.IsChecked; + Properties.Settings.Default.OldCheck = OldCheckOption.IsChecked; + + SetItemImage(); + CustomChecksCheck(); + } + + private void MinWorldToggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (MinWorldOption.IsChecked == false) + { + MinWorldOption.IsChecked = true; + return; + } + + OldWorldOption.IsChecked = false; + Properties.Settings.Default.MinWorld = MinWorldOption.IsChecked; + Properties.Settings.Default.OldWorld = OldWorldOption.IsChecked; + + SetWorldImage(); + CustomWorldCheck(); + } + + private void OldWorldToggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (OldWorldOption.IsChecked == false) + { + OldWorldOption.IsChecked = true; + return; + } + + MinWorldOption.IsChecked = false; + Properties.Settings.Default.MinWorld = MinWorldOption.IsChecked; + Properties.Settings.Default.OldWorld = OldWorldOption.IsChecked; + + SetWorldImage(); + CustomWorldCheck(); + } + + private void MinProgToggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (MinProgOption.IsChecked == false) + { + MinProgOption.IsChecked = true; + return; + } + + OldProgOption.IsChecked = false; + Properties.Settings.Default.MinProg = MinProgOption.IsChecked; + Properties.Settings.Default.OldProg = OldProgOption.IsChecked; + + SetProgressIcons(); + } + + private void OldProgToggle(object sender, RoutedEventArgs e) + { + // Mimicing radio buttons so you cant toggle a button off + if (OldProgOption.IsChecked == false) + { + OldProgOption.IsChecked = true; + return; + } + + MinProgOption.IsChecked = false; + Properties.Settings.Default.MinProg = MinProgOption.IsChecked; + Properties.Settings.Default.OldProg = OldProgOption.IsChecked; + + SetProgressIcons(); + } + + private void CustomImageToggle(object sender, RoutedEventArgs e) + { + Properties.Settings.Default.CustomIcons = CustomFolderOption.IsChecked; + + if (CustomFolderOption.IsChecked) + { + CustomChecksCheck(); + CustomWorldCheck(); + SetProgressIcons(); + } + else + { + //reload check icons + SetItemImage(); + //reload world icons + SetWorldImage(); + } + } + + private void SetProgressIcons() + { + bool OldToggled = Properties.Settings.Default.OldProg; + bool CustomToggled = Properties.Settings.Default.CustomIcons; + string Prog = "Min-"; //Default + if (OldToggled) + Prog = "Old-"; + if (CustomProgFound && CustomToggled) + Prog = "Cus-"; + + foreach (string world in data.WorldsData.Keys.ToList()) + { + if (world == "SorasHeart" || world == "DriveForms" || world == "PuzzSynth") + continue; + + data.WorldsData[world].progression.SetResourceReference(ContentProperty, Prog + data.ProgressKeys[world][data.WorldsData[world].progress]); + data.WorldsData[world].progression.ToolTip = data.ProgressKeys[world + "Desc"][data.WorldsData[world].progress]; + } + } + + /// + /// Worlds + /// + + private void SoraHeartToggle(object sender, RoutedEventArgs e) + { + SoraHeartToggle(SoraHeartOption.IsChecked); + } + + private void SoraHeartToggle(bool toggle) + { + Properties.Settings.Default.SoraHeart = toggle; + SoraHeartOption.IsChecked = toggle; + HandleWorldToggle(toggle, SorasHeart, SorasHeartGrid); + } + + private void DrivesToggle(object sender, RoutedEventArgs e) + { + DrivesToggle(DrivesOption.IsChecked); + } + + private void DrivesToggle(bool toggle) + { + Properties.Settings.Default.Drives = toggle; + DrivesOption.IsChecked = toggle; + HandleWorldToggle(toggle, DriveForms, DriveFormsGrid); + } + + private void SimulatedToggle(object sender, RoutedEventArgs e) + { + SimulatedToggle(SimulatedOption.IsChecked); + } + + private void SimulatedToggle(bool toggle) + { + Properties.Settings.Default.Simulated = toggle; + SimulatedOption.IsChecked = toggle; + HandleWorldToggle(toggle, SimulatedTwilightTown, SimulatedTwilightTownGrid); + } + + private void TwilightTownToggle(object sender, RoutedEventArgs e) + { + TwilightTownToggle(TwilightTownOption.IsChecked); + } + + private void TwilightTownToggle(bool toggle) + { + Properties.Settings.Default.TwilightTown = toggle; + TwilightTownOption.IsChecked = toggle; + HandleWorldToggle(toggle, TwilightTown, TwilightTownGrid); + } + + private void HollowBastionToggle(object sender, RoutedEventArgs e) + { + HollowBastionToggle(HollowBastionOption.IsChecked); + } + + private void HollowBastionToggle(bool toggle) + { + Properties.Settings.Default.HollowBastion = toggle; + HollowBastionOption.IsChecked = toggle; + HandleWorldToggle(toggle, HollowBastion, HollowBastionGrid); + } + + private void BeastCastleToggle(object sender, RoutedEventArgs e) + { + BeastCastleToggle(BeastCastleOption.IsChecked); + } + + private void BeastCastleToggle(bool toggle) + { + Properties.Settings.Default.BeastCastle = toggle; + BeastCastleOption.IsChecked = toggle; + HandleWorldToggle(toggle, BeastsCastle, BeastsCastleGrid); + } + + private void OlympusToggle(object sender, RoutedEventArgs e) + { + OlympusToggle(OlympusOption.IsChecked); + } + + private void OlympusToggle(bool toggle) + { + Properties.Settings.Default.Olympus = toggle; + OlympusOption.IsChecked = toggle; + HandleWorldToggle(toggle, OlympusColiseum, OlympusColiseumGrid); + } + + private void AgrabahToggle(object sender, RoutedEventArgs e) + { + AgrabahToggle(AgrabahOption.IsChecked); + } + + private void AgrabahToggle(bool toggle) + { + Properties.Settings.Default.Agrabah = toggle; + AgrabahOption.IsChecked = toggle; + HandleWorldToggle(toggle, Agrabah, AgrabahGrid); + } + + private void LandofDragonsToggle(object sender, RoutedEventArgs e) + { + LandofDragonsToggle(LandofDragonsOption.IsChecked); + } + + private void LandofDragonsToggle(bool toggle) + { + Properties.Settings.Default.LandofDragons = toggle; + LandofDragonsOption.IsChecked = toggle; + HandleWorldToggle(toggle, LandofDragons, LandofDragonsGrid); + } + + private void DisneyCastleToggle(object sender, RoutedEventArgs e) + { + DisneyCastleToggle(DisneyCastleOption.IsChecked); + } + + private void DisneyCastleToggle(bool toggle) + { + Properties.Settings.Default.DisneyCastle = toggle; + DisneyCastleOption.IsChecked = toggle; + HandleWorldToggle(toggle, DisneyCastle, DisneyCastleGrid); + } + + private void PrideLandsToggle(object sender, RoutedEventArgs e) + { + PrideLandsToggle(PrideLandsOption.IsChecked); + } + + private void PrideLandsToggle(bool toggle) + { + Properties.Settings.Default.PrideLands = toggle; + PrideLandsOption.IsChecked = toggle; + HandleWorldToggle(toggle, PrideLands, PrideLandsGrid); + } + + private void PortRoyalToggle(object sender, RoutedEventArgs e) + { + PortRoyalToggle(PortRoyalOption.IsChecked); + } + + private void PortRoyalToggle(bool toggle) + { + Properties.Settings.Default.PortRoyal = toggle; + PortRoyalOption.IsChecked = toggle; + HandleWorldToggle(toggle, PortRoyal, PortRoyalGrid); + } + + private void HalloweenTownToggle(object sender, RoutedEventArgs e) + { + HalloweenTownToggle(HalloweenTownOption.IsChecked); + } + + private void HalloweenTownToggle(bool toggle) + { + Properties.Settings.Default.HalloweenTown = toggle; + HalloweenTownOption.IsChecked = toggle; + HandleWorldToggle(toggle, HalloweenTown, HalloweenTownGrid); + } + + private void SpaceParanoidsToggle(object sender, RoutedEventArgs e) + { + SpaceParanoidsToggle(SpaceParanoidsOption.IsChecked); + } + + private void SpaceParanoidsToggle(bool toggle) + { + Properties.Settings.Default.SpaceParanoids = toggle; + SpaceParanoidsOption.IsChecked = toggle; + HandleWorldToggle(toggle, SpaceParanoids, SpaceParanoidsGrid); + } + + private void TWTNWToggle(object sender, RoutedEventArgs e) + { + TWTNWToggle(TWTNWOption.IsChecked); + } + + private void TWTNWToggle(bool toggle) + { + Properties.Settings.Default.TWTNW = toggle; + TWTNWOption.IsChecked = toggle; + HandleWorldToggle(toggle, TWTNW, TWTNWGrid); + } + + private void HundredAcreWoodToggle(object sender, RoutedEventArgs e) + { + HundredAcreWoodToggle(HundredAcreWoodOption.IsChecked); + } + + private void HundredAcreWoodToggle(bool toggle) + { + Properties.Settings.Default.HundredAcre = toggle; + HundredAcreWoodOption.IsChecked = toggle; + HandleWorldToggle(toggle, HundredAcreWood, HundredAcreWoodGrid); + } + + private void AtlanticaToggle(object sender, RoutedEventArgs e) + { + AtlanticaToggle(AtlanticaOption.IsChecked); + } + + private void AtlanticaToggle(bool toggle) + { + Properties.Settings.Default.Atlantica = toggle; + AtlanticaOption.IsChecked = toggle; + HandleWorldToggle(toggle, Atlantica, AtlanticaGrid); + } + + private void SynthToggle(object sender, RoutedEventArgs e) + { + SynthToggle(SynthOption.IsChecked); + } + + private void SynthToggle(bool toggle) + { + Properties.Settings.Default.Synth = toggle; + SynthOption.IsChecked = toggle; + + //Check puzzle state + bool PuzzleOn = PuzzleOption.IsChecked; + + //hide if both off + if (!toggle && !PuzzleOn) + { + HandleWorldToggle(false, PuzzSynth, PuzzSynthGrid); + } + else //check and change display + { + if (!PuzzleOn) //puzzles wasn't on before so show world + { + HandleWorldToggle(true, PuzzSynth, PuzzSynthGrid); + } + SetWorldImage(); + } + } + + private void PuzzleToggle(object sender, RoutedEventArgs e) + { + PuzzleToggle(PuzzleOption.IsChecked); + } + + private void PuzzleToggle(bool toggle) + { + Properties.Settings.Default.Puzzle = toggle; + PuzzleOption.IsChecked = toggle; + + //Check synth state + bool SynthOn = SynthOption.IsChecked; + + if (!toggle && !SynthOn) //hide if both off + { + HandleWorldToggle(false, PuzzSynth, PuzzSynthGrid); + } + else //check and change display + { + if (!SynthOn) //synth wasn't on before so show world + { + HandleWorldToggle(true, PuzzSynth, PuzzSynthGrid); + } + SetWorldImage(); + } + } + + + //private void LegacyToggle(object sender, RoutedEventArgs e) + //{ + // LegacyToggle(LegacyOption.IsChecked); + //} + // + //private void LegacyToggle(bool toggle) + //{ + // Properties.Settings.Default.Legacy = toggle; + // LegacyOption.IsChecked = toggle; + //} + + //toggle for Disconnect message + private void DisconnectToggle(object sender, RoutedEventArgs e) + { + DisconnectToggle(Disconnect.IsChecked); + } + + private void DisconnectToggle(bool toggle) + { + Properties.Settings.Default.Disconnect = toggle; + Disconnect.IsChecked = toggle; + + //logic + } + } +} diff --git a/KhTracker/CustomImages.zip b/KhTracker/CustomImages.zip new file mode 100644 index 00000000..7cbbe228 Binary files /dev/null and b/KhTracker/CustomImages.zip differ diff --git a/KhTracker/CustomImages/Checks/ansem_report.png b/KhTracker/CustomImages/Checks/ansem_report.png new file mode 100644 index 00000000..4dfc7844 Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report01.png b/KhTracker/CustomImages/Checks/ansem_report01.png new file mode 100644 index 00000000..bc83d5fb Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report01.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report02.png b/KhTracker/CustomImages/Checks/ansem_report02.png new file mode 100644 index 00000000..095b3abf Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report02.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report03.png b/KhTracker/CustomImages/Checks/ansem_report03.png new file mode 100644 index 00000000..dfecc727 Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report03.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report04.png b/KhTracker/CustomImages/Checks/ansem_report04.png new file mode 100644 index 00000000..60cab2af Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report04.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report05.png b/KhTracker/CustomImages/Checks/ansem_report05.png new file mode 100644 index 00000000..dfaba274 Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report05.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report06.png b/KhTracker/CustomImages/Checks/ansem_report06.png new file mode 100644 index 00000000..535d7591 Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report06.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report07.png b/KhTracker/CustomImages/Checks/ansem_report07.png new file mode 100644 index 00000000..c5765db9 Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report07.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report08.png b/KhTracker/CustomImages/Checks/ansem_report08.png new file mode 100644 index 00000000..1dc29ffc Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report08.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report09.png b/KhTracker/CustomImages/Checks/ansem_report09.png new file mode 100644 index 00000000..3411788f Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report09.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report10.png b/KhTracker/CustomImages/Checks/ansem_report10.png new file mode 100644 index 00000000..d008d766 Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report10.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report11.png b/KhTracker/CustomImages/Checks/ansem_report11.png new file mode 100644 index 00000000..80b0ee90 Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report11.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report12.png b/KhTracker/CustomImages/Checks/ansem_report12.png new file mode 100644 index 00000000..655edadb Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report12.png differ diff --git a/KhTracker/CustomImages/Checks/ansem_report13.png b/KhTracker/CustomImages/Checks/ansem_report13.png new file mode 100644 index 00000000..eb5245e0 Binary files /dev/null and b/KhTracker/CustomImages/Checks/ansem_report13.png differ diff --git a/KhTracker/CustomImages/Checks/aux_hades_cup.png b/KhTracker/CustomImages/Checks/aux_hades_cup.png new file mode 100644 index 00000000..2a2afe51 Binary files /dev/null and b/KhTracker/CustomImages/Checks/aux_hades_cup.png differ diff --git a/KhTracker/CustomImages/Checks/aux_munny_pouch.png b/KhTracker/CustomImages/Checks/aux_munny_pouch.png new file mode 100644 index 00000000..a01e60a8 Binary files /dev/null and b/KhTracker/CustomImages/Checks/aux_munny_pouch.png differ diff --git a/KhTracker/CustomImages/Checks/aux_olympus_stone.png b/KhTracker/CustomImages/Checks/aux_olympus_stone.png new file mode 100644 index 00000000..be6f2c21 Binary files /dev/null and b/KhTracker/CustomImages/Checks/aux_olympus_stone.png differ diff --git a/KhTracker/CustomImages/Checks/aux_unknowndisk.png b/KhTracker/CustomImages/Checks/aux_unknowndisk.png new file mode 100644 index 00000000..4e5ed007 Binary files /dev/null and b/KhTracker/CustomImages/Checks/aux_unknowndisk.png differ diff --git a/KhTracker/CustomImages/Checks/form_anti.png b/KhTracker/CustomImages/Checks/form_anti.png new file mode 100644 index 00000000..2dc20b59 Binary files /dev/null and b/KhTracker/CustomImages/Checks/form_anti.png differ diff --git a/KhTracker/CustomImages/Checks/form_final.png b/KhTracker/CustomImages/Checks/form_final.png new file mode 100644 index 00000000..42d94ab2 Binary files /dev/null and b/KhTracker/CustomImages/Checks/form_final.png differ diff --git a/KhTracker/CustomImages/Checks/form_limit.png b/KhTracker/CustomImages/Checks/form_limit.png new file mode 100644 index 00000000..f557b1bc Binary files /dev/null and b/KhTracker/CustomImages/Checks/form_limit.png differ diff --git a/KhTracker/CustomImages/Checks/form_master.png b/KhTracker/CustomImages/Checks/form_master.png new file mode 100644 index 00000000..48c2ae93 Binary files /dev/null and b/KhTracker/CustomImages/Checks/form_master.png differ diff --git a/KhTracker/CustomImages/Checks/form_valor.png b/KhTracker/CustomImages/Checks/form_valor.png new file mode 100644 index 00000000..069f120b Binary files /dev/null and b/KhTracker/CustomImages/Checks/form_valor.png differ diff --git a/KhTracker/CustomImages/Checks/form_wisdom.png b/KhTracker/CustomImages/Checks/form_wisdom.png new file mode 100644 index 00000000..4169374a Binary files /dev/null and b/KhTracker/CustomImages/Checks/form_wisdom.png differ diff --git a/KhTracker/CustomImages/Checks/lock_ancestorsword.png b/KhTracker/CustomImages/Checks/lock_ancestorsword.png new file mode 100644 index 00000000..99614717 Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_ancestorsword.png differ diff --git a/KhTracker/CustomImages/Checks/lock_battlefieldsofwar.png b/KhTracker/CustomImages/Checks/lock_battlefieldsofwar.png new file mode 100644 index 00000000..3fe059a2 Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_battlefieldsofwar.png differ diff --git a/KhTracker/CustomImages/Checks/lock_beastclaw.png b/KhTracker/CustomImages/Checks/lock_beastclaw.png new file mode 100644 index 00000000..287e2ad3 Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_beastclaw.png differ diff --git a/KhTracker/CustomImages/Checks/lock_bonefist.png b/KhTracker/CustomImages/Checks/lock_bonefist.png new file mode 100644 index 00000000..b0b755ed Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_bonefist.png differ diff --git a/KhTracker/CustomImages/Checks/lock_icecream.png b/KhTracker/CustomImages/Checks/lock_icecream.png new file mode 100644 index 00000000..fa0659b0 Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_icecream.png differ diff --git a/KhTracker/CustomImages/Checks/lock_identitydisk.png b/KhTracker/CustomImages/Checks/lock_identitydisk.png new file mode 100644 index 00000000..30a40f8b Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_identitydisk.png differ diff --git a/KhTracker/CustomImages/Checks/lock_membershipcard.png b/KhTracker/CustomImages/Checks/lock_membershipcard.png new file mode 100644 index 00000000..b52bf1bd Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_membershipcard.png differ diff --git a/KhTracker/CustomImages/Checks/lock_picture.png b/KhTracker/CustomImages/Checks/lock_picture.png new file mode 100644 index 00000000..bc1afb13 Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_picture.png differ diff --git a/KhTracker/CustomImages/Checks/lock_proudfang.png b/KhTracker/CustomImages/Checks/lock_proudfang.png new file mode 100644 index 00000000..93182a07 Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_proudfang.png differ diff --git a/KhTracker/CustomImages/Checks/lock_scimitar.png b/KhTracker/CustomImages/Checks/lock_scimitar.png new file mode 100644 index 00000000..76ae236a Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_scimitar.png differ diff --git a/KhTracker/CustomImages/Checks/lock_skillcrossbones.png b/KhTracker/CustomImages/Checks/lock_skillcrossbones.png new file mode 100644 index 00000000..676411a7 Binary files /dev/null and b/KhTracker/CustomImages/Checks/lock_skillcrossbones.png differ diff --git a/KhTracker/CustomImages/Checks/magic_blizzard.png b/KhTracker/CustomImages/Checks/magic_blizzard.png new file mode 100644 index 00000000..e2e4584e Binary files /dev/null and b/KhTracker/CustomImages/Checks/magic_blizzard.png differ diff --git a/KhTracker/CustomImages/Checks/magic_cure.png b/KhTracker/CustomImages/Checks/magic_cure.png new file mode 100644 index 00000000..37bd6243 Binary files /dev/null and b/KhTracker/CustomImages/Checks/magic_cure.png differ diff --git a/KhTracker/CustomImages/Checks/magic_fire.png b/KhTracker/CustomImages/Checks/magic_fire.png new file mode 100644 index 00000000..dad8ef11 Binary files /dev/null and b/KhTracker/CustomImages/Checks/magic_fire.png differ diff --git a/KhTracker/CustomImages/Checks/magic_magnet.png b/KhTracker/CustomImages/Checks/magic_magnet.png new file mode 100644 index 00000000..93805fd1 Binary files /dev/null and b/KhTracker/CustomImages/Checks/magic_magnet.png differ diff --git a/KhTracker/CustomImages/Checks/magic_reflect.png b/KhTracker/CustomImages/Checks/magic_reflect.png new file mode 100644 index 00000000..abab7fdf Binary files /dev/null and b/KhTracker/CustomImages/Checks/magic_reflect.png differ diff --git a/KhTracker/CustomImages/Checks/magic_thunder.png b/KhTracker/CustomImages/Checks/magic_thunder.png new file mode 100644 index 00000000..0f07ae54 Binary files /dev/null and b/KhTracker/CustomImages/Checks/magic_thunder.png differ diff --git a/KhTracker/CustomImages/Checks/once_more.png b/KhTracker/CustomImages/Checks/once_more.png new file mode 100644 index 00000000..ac900a83 Binary files /dev/null and b/KhTracker/CustomImages/Checks/once_more.png differ diff --git a/KhTracker/CustomImages/Checks/promise_charm.png b/KhTracker/CustomImages/Checks/promise_charm.png new file mode 100644 index 00000000..809e6ab5 Binary files /dev/null and b/KhTracker/CustomImages/Checks/promise_charm.png differ diff --git a/KhTracker/CustomImages/Checks/proof_connection.png b/KhTracker/CustomImages/Checks/proof_connection.png new file mode 100644 index 00000000..a6b5d2b8 Binary files /dev/null and b/KhTracker/CustomImages/Checks/proof_connection.png differ diff --git a/KhTracker/CustomImages/Checks/proof_nonexistence.png b/KhTracker/CustomImages/Checks/proof_nonexistence.png new file mode 100644 index 00000000..c4ba0ee6 Binary files /dev/null and b/KhTracker/CustomImages/Checks/proof_nonexistence.png differ diff --git a/KhTracker/CustomImages/Checks/proof_peace.png b/KhTracker/CustomImages/Checks/proof_peace.png new file mode 100644 index 00000000..217bd28f Binary files /dev/null and b/KhTracker/CustomImages/Checks/proof_peace.png differ diff --git a/KhTracker/CustomImages/Checks/second_chance.png b/KhTracker/CustomImages/Checks/second_chance.png new file mode 100644 index 00000000..d94d4ccd Binary files /dev/null and b/KhTracker/CustomImages/Checks/second_chance.png differ diff --git a/KhTracker/CustomImages/Checks/summon_chicken_little.png b/KhTracker/CustomImages/Checks/summon_chicken_little.png new file mode 100644 index 00000000..b6a851f1 Binary files /dev/null and b/KhTracker/CustomImages/Checks/summon_chicken_little.png differ diff --git a/KhTracker/CustomImages/Checks/summon_genie.png b/KhTracker/CustomImages/Checks/summon_genie.png new file mode 100644 index 00000000..c5f66bec Binary files /dev/null and b/KhTracker/CustomImages/Checks/summon_genie.png differ diff --git a/KhTracker/CustomImages/Checks/summon_peter_pan.png b/KhTracker/CustomImages/Checks/summon_peter_pan.png new file mode 100644 index 00000000..c650fe55 Binary files /dev/null and b/KhTracker/CustomImages/Checks/summon_peter_pan.png differ diff --git a/KhTracker/CustomImages/Checks/summon_stitch.png b/KhTracker/CustomImages/Checks/summon_stitch.png new file mode 100644 index 00000000..88e19cce Binary files /dev/null and b/KhTracker/CustomImages/Checks/summon_stitch.png differ diff --git a/KhTracker/CustomImages/Checks/torn_pages.png b/KhTracker/CustomImages/Checks/torn_pages.png new file mode 100644 index 00000000..273331dd Binary files /dev/null and b/KhTracker/CustomImages/Checks/torn_pages.png differ diff --git a/KhTracker/CustomImages/GhostChecks/ansem_report.png b/KhTracker/CustomImages/GhostChecks/ansem_report.png new file mode 100644 index 00000000..2bbcd7d6 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/ansem_report.png differ diff --git a/KhTracker/CustomImages/GhostChecks/aux_hades_cup.png b/KhTracker/CustomImages/GhostChecks/aux_hades_cup.png new file mode 100644 index 00000000..3eeb76e0 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/aux_hades_cup.png differ diff --git a/KhTracker/CustomImages/GhostChecks/aux_munny_pouch.png b/KhTracker/CustomImages/GhostChecks/aux_munny_pouch.png new file mode 100644 index 00000000..9bf30265 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/aux_munny_pouch.png differ diff --git a/KhTracker/CustomImages/GhostChecks/aux_olympus_stone.png b/KhTracker/CustomImages/GhostChecks/aux_olympus_stone.png new file mode 100644 index 00000000..31b39b3d Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/aux_olympus_stone.png differ diff --git a/KhTracker/CustomImages/GhostChecks/aux_unknowndisk.png b/KhTracker/CustomImages/GhostChecks/aux_unknowndisk.png new file mode 100644 index 00000000..7ed03b4d Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/aux_unknowndisk.png differ diff --git a/KhTracker/CustomImages/GhostChecks/form_anti.png b/KhTracker/CustomImages/GhostChecks/form_anti.png new file mode 100644 index 00000000..c6745fa9 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/form_anti.png differ diff --git a/KhTracker/CustomImages/GhostChecks/form_final.png b/KhTracker/CustomImages/GhostChecks/form_final.png new file mode 100644 index 00000000..bf871d98 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/form_final.png differ diff --git a/KhTracker/CustomImages/GhostChecks/form_limit.png b/KhTracker/CustomImages/GhostChecks/form_limit.png new file mode 100644 index 00000000..0ecd6e46 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/form_limit.png differ diff --git a/KhTracker/CustomImages/GhostChecks/form_master.png b/KhTracker/CustomImages/GhostChecks/form_master.png new file mode 100644 index 00000000..e123c025 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/form_master.png differ diff --git a/KhTracker/CustomImages/GhostChecks/form_valor.png b/KhTracker/CustomImages/GhostChecks/form_valor.png new file mode 100644 index 00000000..456d1a65 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/form_valor.png differ diff --git a/KhTracker/CustomImages/GhostChecks/form_wisdom.png b/KhTracker/CustomImages/GhostChecks/form_wisdom.png new file mode 100644 index 00000000..dde4aad6 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/form_wisdom.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_ancestorsword.png b/KhTracker/CustomImages/GhostChecks/lock_ancestorsword.png new file mode 100644 index 00000000..8c405893 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_ancestorsword.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_battlefieldsofwar.png b/KhTracker/CustomImages/GhostChecks/lock_battlefieldsofwar.png new file mode 100644 index 00000000..34284305 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_battlefieldsofwar.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_beastclaw.png b/KhTracker/CustomImages/GhostChecks/lock_beastclaw.png new file mode 100644 index 00000000..7535dfda Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_beastclaw.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_bonefist.png b/KhTracker/CustomImages/GhostChecks/lock_bonefist.png new file mode 100644 index 00000000..17b80371 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_bonefist.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_icecream.png b/KhTracker/CustomImages/GhostChecks/lock_icecream.png new file mode 100644 index 00000000..64b18471 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_icecream.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_identitydisk.png b/KhTracker/CustomImages/GhostChecks/lock_identitydisk.png new file mode 100644 index 00000000..26819cd7 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_identitydisk.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_membershipcard.png b/KhTracker/CustomImages/GhostChecks/lock_membershipcard.png new file mode 100644 index 00000000..5c3c0135 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_membershipcard.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_picture.png b/KhTracker/CustomImages/GhostChecks/lock_picture.png new file mode 100644 index 00000000..9dd9f3b4 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_picture.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_proudfang.png b/KhTracker/CustomImages/GhostChecks/lock_proudfang.png new file mode 100644 index 00000000..148146d4 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_proudfang.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_scimitar.png b/KhTracker/CustomImages/GhostChecks/lock_scimitar.png new file mode 100644 index 00000000..272aa18a Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_scimitar.png differ diff --git a/KhTracker/CustomImages/GhostChecks/lock_skillcrossbones.png b/KhTracker/CustomImages/GhostChecks/lock_skillcrossbones.png new file mode 100644 index 00000000..89c9d35f Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/lock_skillcrossbones.png differ diff --git a/KhTracker/CustomImages/GhostChecks/magic_blizzard.png b/KhTracker/CustomImages/GhostChecks/magic_blizzard.png new file mode 100644 index 00000000..ca6fbacf Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/magic_blizzard.png differ diff --git a/KhTracker/CustomImages/GhostChecks/magic_cure.png b/KhTracker/CustomImages/GhostChecks/magic_cure.png new file mode 100644 index 00000000..2c4dfd72 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/magic_cure.png differ diff --git a/KhTracker/CustomImages/GhostChecks/magic_fire.png b/KhTracker/CustomImages/GhostChecks/magic_fire.png new file mode 100644 index 00000000..fa67e79b Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/magic_fire.png differ diff --git a/KhTracker/CustomImages/GhostChecks/magic_magnet.png b/KhTracker/CustomImages/GhostChecks/magic_magnet.png new file mode 100644 index 00000000..69682f04 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/magic_magnet.png differ diff --git a/KhTracker/CustomImages/GhostChecks/magic_reflect.png b/KhTracker/CustomImages/GhostChecks/magic_reflect.png new file mode 100644 index 00000000..ab042fa6 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/magic_reflect.png differ diff --git a/KhTracker/CustomImages/GhostChecks/magic_thunder.png b/KhTracker/CustomImages/GhostChecks/magic_thunder.png new file mode 100644 index 00000000..40915f47 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/magic_thunder.png differ diff --git a/KhTracker/CustomImages/GhostChecks/once_more.png b/KhTracker/CustomImages/GhostChecks/once_more.png new file mode 100644 index 00000000..69f3eee8 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/once_more.png differ diff --git a/KhTracker/CustomImages/GhostChecks/promise_charm.png b/KhTracker/CustomImages/GhostChecks/promise_charm.png new file mode 100644 index 00000000..202cae49 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/promise_charm.png differ diff --git a/KhTracker/CustomImages/GhostChecks/proof_connection.png b/KhTracker/CustomImages/GhostChecks/proof_connection.png new file mode 100644 index 00000000..202a0317 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/proof_connection.png differ diff --git a/KhTracker/CustomImages/GhostChecks/proof_nonexistence.png b/KhTracker/CustomImages/GhostChecks/proof_nonexistence.png new file mode 100644 index 00000000..adc6974f Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/proof_nonexistence.png differ diff --git a/KhTracker/CustomImages/GhostChecks/proof_peace.png b/KhTracker/CustomImages/GhostChecks/proof_peace.png new file mode 100644 index 00000000..1d75f675 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/proof_peace.png differ diff --git a/KhTracker/CustomImages/GhostChecks/second_chance.png b/KhTracker/CustomImages/GhostChecks/second_chance.png new file mode 100644 index 00000000..337d843f Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/second_chance.png differ diff --git a/KhTracker/CustomImages/GhostChecks/summon_chicken_little.png b/KhTracker/CustomImages/GhostChecks/summon_chicken_little.png new file mode 100644 index 00000000..57615bb6 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/summon_chicken_little.png differ diff --git a/KhTracker/CustomImages/GhostChecks/summon_genie.png b/KhTracker/CustomImages/GhostChecks/summon_genie.png new file mode 100644 index 00000000..3c5b8330 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/summon_genie.png differ diff --git a/KhTracker/CustomImages/GhostChecks/summon_peter_pan.png b/KhTracker/CustomImages/GhostChecks/summon_peter_pan.png new file mode 100644 index 00000000..4fdb3621 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/summon_peter_pan.png differ diff --git a/KhTracker/CustomImages/GhostChecks/summon_stitch.png b/KhTracker/CustomImages/GhostChecks/summon_stitch.png new file mode 100644 index 00000000..18948f89 Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/summon_stitch.png differ diff --git a/KhTracker/CustomImages/GhostChecks/torn_pages.png b/KhTracker/CustomImages/GhostChecks/torn_pages.png new file mode 100644 index 00000000..2caaeb6d Binary files /dev/null and b/KhTracker/CustomImages/GhostChecks/torn_pages.png differ diff --git a/KhTracker/CustomImages/Progression/100_acre_wood/balloon_bounce.png b/KhTracker/CustomImages/Progression/100_acre_wood/balloon_bounce.png new file mode 100644 index 00000000..6c6fe145 Binary files /dev/null and b/KhTracker/CustomImages/Progression/100_acre_wood/balloon_bounce.png differ diff --git a/KhTracker/CustomImages/Progression/100_acre_wood/blustery_rescue.png b/KhTracker/CustomImages/Progression/100_acre_wood/blustery_rescue.png new file mode 100644 index 00000000..78261e74 Binary files /dev/null and b/KhTracker/CustomImages/Progression/100_acre_wood/blustery_rescue.png differ diff --git a/KhTracker/CustomImages/Progression/100_acre_wood/expotition.png b/KhTracker/CustomImages/Progression/100_acre_wood/expotition.png new file mode 100644 index 00000000..922e6726 Binary files /dev/null and b/KhTracker/CustomImages/Progression/100_acre_wood/expotition.png differ diff --git a/KhTracker/CustomImages/Progression/100_acre_wood/hunny_pot.png b/KhTracker/CustomImages/Progression/100_acre_wood/hunny_pot.png new file mode 100644 index 00000000..7af26729 Binary files /dev/null and b/KhTracker/CustomImages/Progression/100_acre_wood/hunny_pot.png differ diff --git a/KhTracker/CustomImages/Progression/100_acre_wood/hunny_slider.png b/KhTracker/CustomImages/Progression/100_acre_wood/hunny_slider.png new file mode 100644 index 00000000..993d55a0 Binary files /dev/null and b/KhTracker/CustomImages/Progression/100_acre_wood/hunny_slider.png differ diff --git a/KhTracker/CustomImages/Progression/agrabah/abu.png b/KhTracker/CustomImages/Progression/agrabah/abu.png new file mode 100644 index 00000000..b19ad924 Binary files /dev/null and b/KhTracker/CustomImages/Progression/agrabah/abu.png differ diff --git a/KhTracker/CustomImages/Progression/agrabah/chasm_of_challenges.png b/KhTracker/CustomImages/Progression/agrabah/chasm_of_challenges.png new file mode 100644 index 00000000..756117ce Binary files /dev/null and b/KhTracker/CustomImages/Progression/agrabah/chasm_of_challenges.png differ diff --git a/KhTracker/CustomImages/Progression/agrabah/elemental_lords.png b/KhTracker/CustomImages/Progression/agrabah/elemental_lords.png new file mode 100644 index 00000000..b771ef8e Binary files /dev/null and b/KhTracker/CustomImages/Progression/agrabah/elemental_lords.png differ diff --git a/KhTracker/CustomImages/Progression/agrabah/jafar.png b/KhTracker/CustomImages/Progression/agrabah/jafar.png new file mode 100644 index 00000000..279af85f Binary files /dev/null and b/KhTracker/CustomImages/Progression/agrabah/jafar.png differ diff --git a/KhTracker/CustomImages/Progression/agrabah/lexaeus.png b/KhTracker/CustomImages/Progression/agrabah/lexaeus.png new file mode 100644 index 00000000..f1e68c8f Binary files /dev/null and b/KhTracker/CustomImages/Progression/agrabah/lexaeus.png differ diff --git a/KhTracker/CustomImages/Progression/agrabah/lexaeusdata.png b/KhTracker/CustomImages/Progression/agrabah/lexaeusdata.png new file mode 100644 index 00000000..cfc201ea Binary files /dev/null and b/KhTracker/CustomImages/Progression/agrabah/lexaeusdata.png differ diff --git a/KhTracker/CustomImages/Progression/agrabah/magic_switches.png b/KhTracker/CustomImages/Progression/agrabah/magic_switches.png new file mode 100644 index 00000000..2c70f89c Binary files /dev/null and b/KhTracker/CustomImages/Progression/agrabah/magic_switches.png differ diff --git a/KhTracker/CustomImages/Progression/agrabah/treasure_room.png b/KhTracker/CustomImages/Progression/agrabah/treasure_room.png new file mode 100644 index 00000000..8bae23b7 Binary files /dev/null and b/KhTracker/CustomImages/Progression/agrabah/treasure_room.png differ diff --git a/KhTracker/CustomImages/Progression/atlantica/concert.png b/KhTracker/CustomImages/Progression/atlantica/concert.png new file mode 100644 index 00000000..b79606b1 Binary files /dev/null and b/KhTracker/CustomImages/Progression/atlantica/concert.png differ diff --git a/KhTracker/CustomImages/Progression/atlantica/tutorial.png b/KhTracker/CustomImages/Progression/atlantica/tutorial.png new file mode 100644 index 00000000..2188acbf Binary files /dev/null and b/KhTracker/CustomImages/Progression/atlantica/tutorial.png differ diff --git a/KhTracker/CustomImages/Progression/atlantica/ursula.png b/KhTracker/CustomImages/Progression/atlantica/ursula.png new file mode 100644 index 00000000..c41b87be Binary files /dev/null and b/KhTracker/CustomImages/Progression/atlantica/ursula.png differ diff --git a/KhTracker/CustomImages/Progression/beast's_castle/beast.png b/KhTracker/CustomImages/Progression/beast's_castle/beast.png new file mode 100644 index 00000000..0eb1d635 Binary files /dev/null and b/KhTracker/CustomImages/Progression/beast's_castle/beast.png differ diff --git a/KhTracker/CustomImages/Progression/beast's_castle/dark_thorn.png b/KhTracker/CustomImages/Progression/beast's_castle/dark_thorn.png new file mode 100644 index 00000000..e8e8f8e4 Binary files /dev/null and b/KhTracker/CustomImages/Progression/beast's_castle/dark_thorn.png differ diff --git a/KhTracker/CustomImages/Progression/beast's_castle/dragoons.png b/KhTracker/CustomImages/Progression/beast's_castle/dragoons.png new file mode 100644 index 00000000..f0b4081c Binary files /dev/null and b/KhTracker/CustomImages/Progression/beast's_castle/dragoons.png differ diff --git a/KhTracker/CustomImages/Progression/beast's_castle/thresholder.png b/KhTracker/CustomImages/Progression/beast's_castle/thresholder.png new file mode 100644 index 00000000..57d6dae3 Binary files /dev/null and b/KhTracker/CustomImages/Progression/beast's_castle/thresholder.png differ diff --git a/KhTracker/CustomImages/Progression/beast's_castle/xaldin.png b/KhTracker/CustomImages/Progression/beast's_castle/xaldin.png new file mode 100644 index 00000000..372d83a0 Binary files /dev/null and b/KhTracker/CustomImages/Progression/beast's_castle/xaldin.png differ diff --git a/KhTracker/CustomImages/Progression/beast's_castle/xaldin_story.png b/KhTracker/CustomImages/Progression/beast's_castle/xaldin_story.png new file mode 100644 index 00000000..04a20a5b Binary files /dev/null and b/KhTracker/CustomImages/Progression/beast's_castle/xaldin_story.png differ diff --git a/KhTracker/CustomImages/Progression/chest.png b/KhTracker/CustomImages/Progression/chest.png new file mode 100644 index 00000000..9f5f9c9c Binary files /dev/null and b/KhTracker/CustomImages/Progression/chest.png differ diff --git a/KhTracker/CustomImages/Progression/disney_castle/lingering_will.png b/KhTracker/CustomImages/Progression/disney_castle/lingering_will.png new file mode 100644 index 00000000..a8ae8734 Binary files /dev/null and b/KhTracker/CustomImages/Progression/disney_castle/lingering_will.png differ diff --git a/KhTracker/CustomImages/Progression/disney_castle/marluxia.png b/KhTracker/CustomImages/Progression/disney_castle/marluxia.png new file mode 100644 index 00000000..f1e68c8f Binary files /dev/null and b/KhTracker/CustomImages/Progression/disney_castle/marluxia.png differ diff --git a/KhTracker/CustomImages/Progression/disney_castle/marluxia_and_lingering_will.png b/KhTracker/CustomImages/Progression/disney_castle/marluxia_and_lingering_will.png new file mode 100644 index 00000000..efe4dc0b Binary files /dev/null and b/KhTracker/CustomImages/Progression/disney_castle/marluxia_and_lingering_will.png differ diff --git a/KhTracker/CustomImages/Progression/disney_castle/marluxiadata.png b/KhTracker/CustomImages/Progression/disney_castle/marluxiadata.png new file mode 100644 index 00000000..b3ad4d21 Binary files /dev/null and b/KhTracker/CustomImages/Progression/disney_castle/marluxiadata.png differ diff --git a/KhTracker/CustomImages/Progression/disney_castle/marluxiadata_and_lingering_will.png b/KhTracker/CustomImages/Progression/disney_castle/marluxiadata_and_lingering_will.png new file mode 100644 index 00000000..a7981316 Binary files /dev/null and b/KhTracker/CustomImages/Progression/disney_castle/marluxiadata_and_lingering_will.png differ diff --git a/KhTracker/CustomImages/Progression/disney_castle/minnie.png b/KhTracker/CustomImages/Progression/disney_castle/minnie.png new file mode 100644 index 00000000..6f99c6d1 Binary files /dev/null and b/KhTracker/CustomImages/Progression/disney_castle/minnie.png differ diff --git a/KhTracker/CustomImages/Progression/disney_castle/old_pete.png b/KhTracker/CustomImages/Progression/disney_castle/old_pete.png new file mode 100644 index 00000000..60b6ffe5 Binary files /dev/null and b/KhTracker/CustomImages/Progression/disney_castle/old_pete.png differ diff --git a/KhTracker/CustomImages/Progression/disney_castle/pete.png b/KhTracker/CustomImages/Progression/disney_castle/pete.png new file mode 100644 index 00000000..14a2fb97 Binary files /dev/null and b/KhTracker/CustomImages/Progression/disney_castle/pete.png differ diff --git a/KhTracker/CustomImages/Progression/disney_castle/steamboat_pete.png b/KhTracker/CustomImages/Progression/disney_castle/steamboat_pete.png new file mode 100644 index 00000000..bf76308d Binary files /dev/null and b/KhTracker/CustomImages/Progression/disney_castle/steamboat_pete.png differ diff --git a/KhTracker/CustomImages/Progression/disney_castle/windows_of_time.png b/KhTracker/CustomImages/Progression/disney_castle/windows_of_time.png new file mode 100644 index 00000000..c85fd646 Binary files /dev/null and b/KhTracker/CustomImages/Progression/disney_castle/windows_of_time.png differ diff --git a/KhTracker/CustomImages/Progression/drive_forms/2.png b/KhTracker/CustomImages/Progression/drive_forms/2.png new file mode 100644 index 00000000..5bdbc5b8 Binary files /dev/null and b/KhTracker/CustomImages/Progression/drive_forms/2.png differ diff --git a/KhTracker/CustomImages/Progression/drive_forms/3.png b/KhTracker/CustomImages/Progression/drive_forms/3.png new file mode 100644 index 00000000..42115d2b Binary files /dev/null and b/KhTracker/CustomImages/Progression/drive_forms/3.png differ diff --git a/KhTracker/CustomImages/Progression/drive_forms/4.png b/KhTracker/CustomImages/Progression/drive_forms/4.png new file mode 100644 index 00000000..cde4fec9 Binary files /dev/null and b/KhTracker/CustomImages/Progression/drive_forms/4.png differ diff --git a/KhTracker/CustomImages/Progression/drive_forms/5.png b/KhTracker/CustomImages/Progression/drive_forms/5.png new file mode 100644 index 00000000..d0e9932f Binary files /dev/null and b/KhTracker/CustomImages/Progression/drive_forms/5.png differ diff --git a/KhTracker/CustomImages/Progression/drive_forms/6.png b/KhTracker/CustomImages/Progression/drive_forms/6.png new file mode 100644 index 00000000..a6c3856e Binary files /dev/null and b/KhTracker/CustomImages/Progression/drive_forms/6.png differ diff --git a/KhTracker/CustomImages/Progression/drive_forms/7.png b/KhTracker/CustomImages/Progression/drive_forms/7.png new file mode 100644 index 00000000..d28c745c Binary files /dev/null and b/KhTracker/CustomImages/Progression/drive_forms/7.png differ diff --git a/KhTracker/CustomImages/Progression/emblem.png b/KhTracker/CustomImages/Progression/emblem.png new file mode 100644 index 00000000..1bf5c3db Binary files /dev/null and b/KhTracker/CustomImages/Progression/emblem.png differ diff --git a/KhTracker/CustomImages/Progression/halloween_town/candy_cane_lane.png b/KhTracker/CustomImages/Progression/halloween_town/candy_cane_lane.png new file mode 100644 index 00000000..ad6bbf5e Binary files /dev/null and b/KhTracker/CustomImages/Progression/halloween_town/candy_cane_lane.png differ diff --git a/KhTracker/CustomImages/Progression/halloween_town/children.png b/KhTracker/CustomImages/Progression/halloween_town/children.png new file mode 100644 index 00000000..6d33619d Binary files /dev/null and b/KhTracker/CustomImages/Progression/halloween_town/children.png differ diff --git a/KhTracker/CustomImages/Progression/halloween_town/experiment.png b/KhTracker/CustomImages/Progression/halloween_town/experiment.png new file mode 100644 index 00000000..87307f35 Binary files /dev/null and b/KhTracker/CustomImages/Progression/halloween_town/experiment.png differ diff --git a/KhTracker/CustomImages/Progression/halloween_town/oogie_boogie.png b/KhTracker/CustomImages/Progression/halloween_town/oogie_boogie.png new file mode 100644 index 00000000..e75e792e Binary files /dev/null and b/KhTracker/CustomImages/Progression/halloween_town/oogie_boogie.png differ diff --git a/KhTracker/CustomImages/Progression/halloween_town/presents.png b/KhTracker/CustomImages/Progression/halloween_town/presents.png new file mode 100644 index 00000000..3f842bb2 Binary files /dev/null and b/KhTracker/CustomImages/Progression/halloween_town/presents.png differ diff --git a/KhTracker/CustomImages/Progression/halloween_town/prison_keeper.png b/KhTracker/CustomImages/Progression/halloween_town/prison_keeper.png new file mode 100644 index 00000000..5c653e2f Binary files /dev/null and b/KhTracker/CustomImages/Progression/halloween_town/prison_keeper.png differ diff --git a/KhTracker/CustomImages/Progression/halloween_town/vexen.png b/KhTracker/CustomImages/Progression/halloween_town/vexen.png new file mode 100644 index 00000000..f1e68c8f Binary files /dev/null and b/KhTracker/CustomImages/Progression/halloween_town/vexen.png differ diff --git a/KhTracker/CustomImages/Progression/halloween_town/vexendata.png b/KhTracker/CustomImages/Progression/halloween_town/vexendata.png new file mode 100644 index 00000000..1e9e9563 Binary files /dev/null and b/KhTracker/CustomImages/Progression/halloween_town/vexendata.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/1000_heartless.png b/KhTracker/CustomImages/Progression/hollow_bastion/1000_heartless.png new file mode 100644 index 00000000..2ae99706 Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/1000_heartless.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/ansem's_study.png b/KhTracker/CustomImages/Progression/hollow_bastion/ansem's_study.png new file mode 100644 index 00000000..7d2abd79 Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/ansem's_study.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/bailey.png b/KhTracker/CustomImages/Progression/hollow_bastion/bailey.png new file mode 100644 index 00000000..3d54e455 Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/bailey.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/corridors.png b/KhTracker/CustomImages/Progression/hollow_bastion/corridors.png new file mode 100644 index 00000000..8671e52d Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/corridors.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/dancers.png b/KhTracker/CustomImages/Progression/hollow_bastion/dancers.png new file mode 100644 index 00000000..e7db5df6 Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/dancers.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/demyx.png b/KhTracker/CustomImages/Progression/hollow_bastion/demyx.png new file mode 100644 index 00000000..dee8916f Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/demyx.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/demyx_and_sephiroth.png b/KhTracker/CustomImages/Progression/hollow_bastion/demyx_and_sephiroth.png new file mode 100644 index 00000000..fd233546 Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/demyx_and_sephiroth.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/demyx_story.png b/KhTracker/CustomImages/Progression/hollow_bastion/demyx_story.png new file mode 100644 index 00000000..7619b318 Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/demyx_story.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/final_fantasy.png b/KhTracker/CustomImages/Progression/hollow_bastion/final_fantasy.png new file mode 100644 index 00000000..ffb694ae Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/final_fantasy.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/first_fight.png b/KhTracker/CustomImages/Progression/hollow_bastion/first_fight.png new file mode 100644 index 00000000..d26919c7 Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/first_fight.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/second_fight.png b/KhTracker/CustomImages/Progression/hollow_bastion/second_fight.png new file mode 100644 index 00000000..04b341be Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/second_fight.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/sephiroth.png b/KhTracker/CustomImages/Progression/hollow_bastion/sephiroth.png new file mode 100644 index 00000000..879bd52a Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/sephiroth.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/steam_valve.png b/KhTracker/CustomImages/Progression/hollow_bastion/steam_valve.png new file mode 100644 index 00000000..1bafb7d3 Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/steam_valve.png differ diff --git a/KhTracker/CustomImages/Progression/hollow_bastion/transport.png b/KhTracker/CustomImages/Progression/hollow_bastion/transport.png new file mode 100644 index 00000000..0af5a659 Binary files /dev/null and b/KhTracker/CustomImages/Progression/hollow_bastion/transport.png differ diff --git a/KhTracker/CustomImages/Progression/land_of_dragons/missions.png b/KhTracker/CustomImages/Progression/land_of_dragons/missions.png new file mode 100644 index 00000000..c14a301f Binary files /dev/null and b/KhTracker/CustomImages/Progression/land_of_dragons/missions.png differ diff --git a/KhTracker/CustomImages/Progression/land_of_dragons/mountain_climb.png b/KhTracker/CustomImages/Progression/land_of_dragons/mountain_climb.png new file mode 100644 index 00000000..e5345602 Binary files /dev/null and b/KhTracker/CustomImages/Progression/land_of_dragons/mountain_climb.png differ diff --git a/KhTracker/CustomImages/Progression/land_of_dragons/shan_yu.png b/KhTracker/CustomImages/Progression/land_of_dragons/shan_yu.png new file mode 100644 index 00000000..37f392dd Binary files /dev/null and b/KhTracker/CustomImages/Progression/land_of_dragons/shan_yu.png differ diff --git a/KhTracker/CustomImages/Progression/land_of_dragons/snipers.png b/KhTracker/CustomImages/Progression/land_of_dragons/snipers.png new file mode 100644 index 00000000..deae2ff3 Binary files /dev/null and b/KhTracker/CustomImages/Progression/land_of_dragons/snipers.png differ diff --git a/KhTracker/CustomImages/Progression/land_of_dragons/storm_rider.png b/KhTracker/CustomImages/Progression/land_of_dragons/storm_rider.png new file mode 100644 index 00000000..7971ffe6 Binary files /dev/null and b/KhTracker/CustomImages/Progression/land_of_dragons/storm_rider.png differ diff --git a/KhTracker/CustomImages/Progression/land_of_dragons/summit.png b/KhTracker/CustomImages/Progression/land_of_dragons/summit.png new file mode 100644 index 00000000..1c005f7f Binary files /dev/null and b/KhTracker/CustomImages/Progression/land_of_dragons/summit.png differ diff --git a/KhTracker/CustomImages/Progression/land_of_dragons/village_cave.png b/KhTracker/CustomImages/Progression/land_of_dragons/village_cave.png new file mode 100644 index 00000000..84fbd374 Binary files /dev/null and b/KhTracker/CustomImages/Progression/land_of_dragons/village_cave.png differ diff --git a/KhTracker/CustomImages/Progression/land_of_dragons/xigbar.png b/KhTracker/CustomImages/Progression/land_of_dragons/xigbar.png new file mode 100644 index 00000000..54cbf50d Binary files /dev/null and b/KhTracker/CustomImages/Progression/land_of_dragons/xigbar.png differ diff --git a/KhTracker/CustomImages/Progression/olympus_coliseum/cerberus.png b/KhTracker/CustomImages/Progression/olympus_coliseum/cerberus.png new file mode 100644 index 00000000..c7bf09a1 Binary files /dev/null and b/KhTracker/CustomImages/Progression/olympus_coliseum/cerberus.png differ diff --git a/KhTracker/CustomImages/Progression/olympus_coliseum/demyx.png b/KhTracker/CustomImages/Progression/olympus_coliseum/demyx.png new file mode 100644 index 00000000..7619b318 Binary files /dev/null and b/KhTracker/CustomImages/Progression/olympus_coliseum/demyx.png differ diff --git a/KhTracker/CustomImages/Progression/olympus_coliseum/dusks.png b/KhTracker/CustomImages/Progression/olympus_coliseum/dusks.png new file mode 100644 index 00000000..2c79a77c Binary files /dev/null and b/KhTracker/CustomImages/Progression/olympus_coliseum/dusks.png differ diff --git a/KhTracker/CustomImages/Progression/olympus_coliseum/hades.png b/KhTracker/CustomImages/Progression/olympus_coliseum/hades.png new file mode 100644 index 00000000..49288307 Binary files /dev/null and b/KhTracker/CustomImages/Progression/olympus_coliseum/hades.png differ diff --git a/KhTracker/CustomImages/Progression/olympus_coliseum/hydra.png b/KhTracker/CustomImages/Progression/olympus_coliseum/hydra.png new file mode 100644 index 00000000..52602a94 Binary files /dev/null and b/KhTracker/CustomImages/Progression/olympus_coliseum/hydra.png differ diff --git a/KhTracker/CustomImages/Progression/olympus_coliseum/the_lock.png b/KhTracker/CustomImages/Progression/olympus_coliseum/the_lock.png new file mode 100644 index 00000000..89426994 Binary files /dev/null and b/KhTracker/CustomImages/Progression/olympus_coliseum/the_lock.png differ diff --git a/KhTracker/CustomImages/Progression/olympus_coliseum/urns.png b/KhTracker/CustomImages/Progression/olympus_coliseum/urns.png new file mode 100644 index 00000000..399d0041 Binary files /dev/null and b/KhTracker/CustomImages/Progression/olympus_coliseum/urns.png differ diff --git a/KhTracker/CustomImages/Progression/olympus_coliseum/zexion.png b/KhTracker/CustomImages/Progression/olympus_coliseum/zexion.png new file mode 100644 index 00000000..f1e68c8f Binary files /dev/null and b/KhTracker/CustomImages/Progression/olympus_coliseum/zexion.png differ diff --git a/KhTracker/CustomImages/Progression/olympus_coliseum/zexiondata.png b/KhTracker/CustomImages/Progression/olympus_coliseum/zexiondata.png new file mode 100644 index 00000000..90f4ea19 Binary files /dev/null and b/KhTracker/CustomImages/Progression/olympus_coliseum/zexiondata.png differ diff --git a/KhTracker/CustomImages/Progression/port_royal/barbossa.png b/KhTracker/CustomImages/Progression/port_royal/barbossa.png new file mode 100644 index 00000000..3d07a9d8 Binary files /dev/null and b/KhTracker/CustomImages/Progression/port_royal/barbossa.png differ diff --git a/KhTracker/CustomImages/Progression/port_royal/cursed_reaper.png b/KhTracker/CustomImages/Progression/port_royal/cursed_reaper.png new file mode 100644 index 00000000..2b8fd0d9 Binary files /dev/null and b/KhTracker/CustomImages/Progression/port_royal/cursed_reaper.png differ diff --git a/KhTracker/CustomImages/Progression/port_royal/explosives.png b/KhTracker/CustomImages/Progression/port_royal/explosives.png new file mode 100644 index 00000000..2e86afa7 Binary files /dev/null and b/KhTracker/CustomImages/Progression/port_royal/explosives.png differ diff --git a/KhTracker/CustomImages/Progression/port_royal/gamblers.png b/KhTracker/CustomImages/Progression/port_royal/gamblers.png new file mode 100644 index 00000000..07c5b0ee Binary files /dev/null and b/KhTracker/CustomImages/Progression/port_royal/gamblers.png differ diff --git a/KhTracker/CustomImages/Progression/port_royal/grim_reaper.png b/KhTracker/CustomImages/Progression/port_royal/grim_reaper.png new file mode 100644 index 00000000..7ea4de8c Binary files /dev/null and b/KhTracker/CustomImages/Progression/port_royal/grim_reaper.png differ diff --git a/KhTracker/CustomImages/Progression/port_royal/isla_de_muerta.png b/KhTracker/CustomImages/Progression/port_royal/isla_de_muerta.png new file mode 100644 index 00000000..c58e2861 Binary files /dev/null and b/KhTracker/CustomImages/Progression/port_royal/isla_de_muerta.png differ diff --git a/KhTracker/CustomImages/Progression/port_royal/luxord.png b/KhTracker/CustomImages/Progression/port_royal/luxord.png new file mode 100644 index 00000000..06f36d30 Binary files /dev/null and b/KhTracker/CustomImages/Progression/port_royal/luxord.png differ diff --git a/KhTracker/CustomImages/Progression/port_royal/medallions.png b/KhTracker/CustomImages/Progression/port_royal/medallions.png new file mode 100644 index 00000000..13ccff3c Binary files /dev/null and b/KhTracker/CustomImages/Progression/port_royal/medallions.png differ diff --git a/KhTracker/CustomImages/Progression/port_royal/town.png b/KhTracker/CustomImages/Progression/port_royal/town.png new file mode 100644 index 00000000..d7a61d12 Binary files /dev/null and b/KhTracker/CustomImages/Progression/port_royal/town.png differ diff --git a/KhTracker/CustomImages/Progression/pride_lands/groundshaker.png b/KhTracker/CustomImages/Progression/pride_lands/groundshaker.png new file mode 100644 index 00000000..84728a21 Binary files /dev/null and b/KhTracker/CustomImages/Progression/pride_lands/groundshaker.png differ diff --git a/KhTracker/CustomImages/Progression/pride_lands/hyenas.png b/KhTracker/CustomImages/Progression/pride_lands/hyenas.png new file mode 100644 index 00000000..d2c4e210 Binary files /dev/null and b/KhTracker/CustomImages/Progression/pride_lands/hyenas.png differ diff --git a/KhTracker/CustomImages/Progression/pride_lands/oasis.png b/KhTracker/CustomImages/Progression/pride_lands/oasis.png new file mode 100644 index 00000000..97b767f9 Binary files /dev/null and b/KhTracker/CustomImages/Progression/pride_lands/oasis.png differ diff --git a/KhTracker/CustomImages/Progression/pride_lands/saix.png b/KhTracker/CustomImages/Progression/pride_lands/saix.png new file mode 100644 index 00000000..d4c6f903 Binary files /dev/null and b/KhTracker/CustomImages/Progression/pride_lands/saix.png differ diff --git a/KhTracker/CustomImages/Progression/pride_lands/scar.png b/KhTracker/CustomImages/Progression/pride_lands/scar.png new file mode 100644 index 00000000..29eb69be Binary files /dev/null and b/KhTracker/CustomImages/Progression/pride_lands/scar.png differ diff --git a/KhTracker/CustomImages/Progression/pride_lands/timon_and_pumba.png b/KhTracker/CustomImages/Progression/pride_lands/timon_and_pumba.png new file mode 100644 index 00000000..35dfdd62 Binary files /dev/null and b/KhTracker/CustomImages/Progression/pride_lands/timon_and_pumba.png differ diff --git a/KhTracker/CustomImages/Progression/simulated_twilight_town/axel_story.png b/KhTracker/CustomImages/Progression/simulated_twilight_town/axel_story.png new file mode 100644 index 00000000..11cc334d Binary files /dev/null and b/KhTracker/CustomImages/Progression/simulated_twilight_town/axel_story.png differ diff --git a/KhTracker/CustomImages/Progression/simulated_twilight_town/computer_room.png b/KhTracker/CustomImages/Progression/simulated_twilight_town/computer_room.png new file mode 100644 index 00000000..a6574013 Binary files /dev/null and b/KhTracker/CustomImages/Progression/simulated_twilight_town/computer_room.png differ diff --git a/KhTracker/CustomImages/Progression/simulated_twilight_town/munny_pouch.png b/KhTracker/CustomImages/Progression/simulated_twilight_town/munny_pouch.png new file mode 100644 index 00000000..33f096a2 Binary files /dev/null and b/KhTracker/CustomImages/Progression/simulated_twilight_town/munny_pouch.png differ diff --git a/KhTracker/CustomImages/Progression/simulated_twilight_town/pod_room.png b/KhTracker/CustomImages/Progression/simulated_twilight_town/pod_room.png new file mode 100644 index 00000000..a7b2dd04 Binary files /dev/null and b/KhTracker/CustomImages/Progression/simulated_twilight_town/pod_room.png differ diff --git a/KhTracker/CustomImages/Progression/simulated_twilight_town/roxas.png b/KhTracker/CustomImages/Progression/simulated_twilight_town/roxas.png new file mode 100644 index 00000000..3ba4beff Binary files /dev/null and b/KhTracker/CustomImages/Progression/simulated_twilight_town/roxas.png differ diff --git a/KhTracker/CustomImages/Progression/simulated_twilight_town/struggle.png b/KhTracker/CustomImages/Progression/simulated_twilight_town/struggle.png new file mode 100644 index 00000000..c600af44 Binary files /dev/null and b/KhTracker/CustomImages/Progression/simulated_twilight_town/struggle.png differ diff --git a/KhTracker/CustomImages/Progression/simulated_twilight_town/twilight_thorn.png b/KhTracker/CustomImages/Progression/simulated_twilight_town/twilight_thorn.png new file mode 100644 index 00000000..25b3c692 Binary files /dev/null and b/KhTracker/CustomImages/Progression/simulated_twilight_town/twilight_thorn.png differ diff --git a/KhTracker/CustomImages/Progression/space_paranoids/dataspace.png b/KhTracker/CustomImages/Progression/space_paranoids/dataspace.png new file mode 100644 index 00000000..17e84dfd Binary files /dev/null and b/KhTracker/CustomImages/Progression/space_paranoids/dataspace.png differ diff --git a/KhTracker/CustomImages/Progression/space_paranoids/hostile_program.png b/KhTracker/CustomImages/Progression/space_paranoids/hostile_program.png new file mode 100644 index 00000000..0d522d8a Binary files /dev/null and b/KhTracker/CustomImages/Progression/space_paranoids/hostile_program.png differ diff --git a/KhTracker/CustomImages/Progression/space_paranoids/larxene.png b/KhTracker/CustomImages/Progression/space_paranoids/larxene.png new file mode 100644 index 00000000..f1e68c8f Binary files /dev/null and b/KhTracker/CustomImages/Progression/space_paranoids/larxene.png differ diff --git a/KhTracker/CustomImages/Progression/space_paranoids/larxenedata.png b/KhTracker/CustomImages/Progression/space_paranoids/larxenedata.png new file mode 100644 index 00000000..4171555e Binary files /dev/null and b/KhTracker/CustomImages/Progression/space_paranoids/larxenedata.png differ diff --git a/KhTracker/CustomImages/Progression/space_paranoids/master_control_program.png b/KhTracker/CustomImages/Progression/space_paranoids/master_control_program.png new file mode 100644 index 00000000..96e2b956 Binary files /dev/null and b/KhTracker/CustomImages/Progression/space_paranoids/master_control_program.png differ diff --git a/KhTracker/CustomImages/Progression/space_paranoids/sark.png b/KhTracker/CustomImages/Progression/space_paranoids/sark.png new file mode 100644 index 00000000..cf6fa812 Binary files /dev/null and b/KhTracker/CustomImages/Progression/space_paranoids/sark.png differ diff --git a/KhTracker/CustomImages/Progression/space_paranoids/solar_sailer.png b/KhTracker/CustomImages/Progression/space_paranoids/solar_sailer.png new file mode 100644 index 00000000..06280510 Binary files /dev/null and b/KhTracker/CustomImages/Progression/space_paranoids/solar_sailer.png differ diff --git a/KhTracker/CustomImages/Progression/the_world_that_never_was/kingdom_hearts.png b/KhTracker/CustomImages/Progression/the_world_that_never_was/kingdom_hearts.png new file mode 100644 index 00000000..1aede3d1 Binary files /dev/null and b/KhTracker/CustomImages/Progression/the_world_that_never_was/kingdom_hearts.png differ diff --git a/KhTracker/CustomImages/Progression/the_world_that_never_was/luxord.png b/KhTracker/CustomImages/Progression/the_world_that_never_was/luxord.png new file mode 100644 index 00000000..06f36d30 Binary files /dev/null and b/KhTracker/CustomImages/Progression/the_world_that_never_was/luxord.png differ diff --git a/KhTracker/CustomImages/Progression/the_world_that_never_was/roxas.png b/KhTracker/CustomImages/Progression/the_world_that_never_was/roxas.png new file mode 100644 index 00000000..3ba4beff Binary files /dev/null and b/KhTracker/CustomImages/Progression/the_world_that_never_was/roxas.png differ diff --git a/KhTracker/CustomImages/Progression/the_world_that_never_was/saix.png b/KhTracker/CustomImages/Progression/the_world_that_never_was/saix.png new file mode 100644 index 00000000..d4c6f903 Binary files /dev/null and b/KhTracker/CustomImages/Progression/the_world_that_never_was/saix.png differ diff --git a/KhTracker/CustomImages/Progression/the_world_that_never_was/xemnas.png b/KhTracker/CustomImages/Progression/the_world_that_never_was/xemnas.png new file mode 100644 index 00000000..2e1c98de Binary files /dev/null and b/KhTracker/CustomImages/Progression/the_world_that_never_was/xemnas.png differ diff --git a/KhTracker/CustomImages/Progression/the_world_that_never_was/xigbar.png b/KhTracker/CustomImages/Progression/the_world_that_never_was/xigbar.png new file mode 100644 index 00000000..54cbf50d Binary files /dev/null and b/KhTracker/CustomImages/Progression/the_world_that_never_was/xigbar.png differ diff --git a/KhTracker/CustomImages/Progression/twilight_town/axel.png b/KhTracker/CustomImages/Progression/twilight_town/axel.png new file mode 100644 index 00000000..277a0014 Binary files /dev/null and b/KhTracker/CustomImages/Progression/twilight_town/axel.png differ diff --git a/KhTracker/CustomImages/Progression/twilight_town/berserkers.png b/KhTracker/CustomImages/Progression/twilight_town/berserkers.png new file mode 100644 index 00000000..699da885 Binary files /dev/null and b/KhTracker/CustomImages/Progression/twilight_town/berserkers.png differ diff --git a/KhTracker/CustomImages/Progression/twilight_town/betwixt_and_between.png b/KhTracker/CustomImages/Progression/twilight_town/betwixt_and_between.png new file mode 100644 index 00000000..a7c4fe83 Binary files /dev/null and b/KhTracker/CustomImages/Progression/twilight_town/betwixt_and_between.png differ diff --git a/KhTracker/CustomImages/Progression/twilight_town/dusks.png b/KhTracker/CustomImages/Progression/twilight_town/dusks.png new file mode 100644 index 00000000..2c79a77c Binary files /dev/null and b/KhTracker/CustomImages/Progression/twilight_town/dusks.png differ diff --git a/KhTracker/CustomImages/Progression/twilight_town/mickey.png b/KhTracker/CustomImages/Progression/twilight_town/mickey.png new file mode 100644 index 00000000..d587d4a7 Binary files /dev/null and b/KhTracker/CustomImages/Progression/twilight_town/mickey.png differ diff --git a/KhTracker/CustomImages/Progression/twilight_town/mysterious_tower.png b/KhTracker/CustomImages/Progression/twilight_town/mysterious_tower.png new file mode 100644 index 00000000..11f3fff2 Binary files /dev/null and b/KhTracker/CustomImages/Progression/twilight_town/mysterious_tower.png differ diff --git a/KhTracker/CustomImages/System/cross.png b/KhTracker/CustomImages/System/cross.png new file mode 100644 index 00000000..854ec471 Binary files /dev/null and b/KhTracker/CustomImages/System/cross.png differ diff --git a/KhTracker/CustomImages/System/crossworld.png b/KhTracker/CustomImages/System/crossworld.png new file mode 100644 index 00000000..9e95a688 Binary files /dev/null and b/KhTracker/CustomImages/System/crossworld.png differ diff --git a/KhTracker/CustomImages/System/drive_growth/Final.png b/KhTracker/CustomImages/System/drive_growth/Final.png new file mode 100644 index 00000000..1d7d5345 Binary files /dev/null and b/KhTracker/CustomImages/System/drive_growth/Final.png differ diff --git a/KhTracker/CustomImages/System/drive_growth/Limit.png b/KhTracker/CustomImages/System/drive_growth/Limit.png new file mode 100644 index 00000000..8fd2c579 Binary files /dev/null and b/KhTracker/CustomImages/System/drive_growth/Limit.png differ diff --git a/KhTracker/CustomImages/System/drive_growth/Master.png b/KhTracker/CustomImages/System/drive_growth/Master.png new file mode 100644 index 00000000..7c9f0487 Binary files /dev/null and b/KhTracker/CustomImages/System/drive_growth/Master.png differ diff --git a/KhTracker/CustomImages/System/drive_growth/Valor.png b/KhTracker/CustomImages/System/drive_growth/Valor.png new file mode 100644 index 00000000..ee4efee0 Binary files /dev/null and b/KhTracker/CustomImages/System/drive_growth/Valor.png differ diff --git a/KhTracker/CustomImages/System/drive_growth/Wisdom.png b/KhTracker/CustomImages/System/drive_growth/Wisdom.png new file mode 100644 index 00000000..7a968a77 Binary files /dev/null and b/KhTracker/CustomImages/System/drive_growth/Wisdom.png differ diff --git a/KhTracker/CustomImages/System/drive_growth/aerial_dodge.png b/KhTracker/CustomImages/System/drive_growth/aerial_dodge.png new file mode 100644 index 00000000..eba5c162 Binary files /dev/null and b/KhTracker/CustomImages/System/drive_growth/aerial_dodge.png differ diff --git a/KhTracker/CustomImages/System/drive_growth/dodge_roll.png b/KhTracker/CustomImages/System/drive_growth/dodge_roll.png new file mode 100644 index 00000000..aa78b243 Binary files /dev/null and b/KhTracker/CustomImages/System/drive_growth/dodge_roll.png differ diff --git a/KhTracker/CustomImages/System/drive_growth/glide.png b/KhTracker/CustomImages/System/drive_growth/glide.png new file mode 100644 index 00000000..cc520dd7 Binary files /dev/null and b/KhTracker/CustomImages/System/drive_growth/glide.png differ diff --git a/KhTracker/CustomImages/System/drive_growth/high_jump.png b/KhTracker/CustomImages/System/drive_growth/high_jump.png new file mode 100644 index 00000000..8810aa8c Binary files /dev/null and b/KhTracker/CustomImages/System/drive_growth/high_jump.png differ diff --git a/KhTracker/CustomImages/System/drive_growth/quick_run.png b/KhTracker/CustomImages/System/drive_growth/quick_run.png new file mode 100644 index 00000000..be407722 Binary files /dev/null and b/KhTracker/CustomImages/System/drive_growth/quick_run.png differ diff --git a/KhTracker/CustomImages/System/stats/chest.png b/KhTracker/CustomImages/System/stats/chest.png new file mode 100644 index 00000000..b724f5fb Binary files /dev/null and b/KhTracker/CustomImages/System/stats/chest.png differ diff --git a/KhTracker/CustomImages/System/stats/deaths.png b/KhTracker/CustomImages/System/stats/deaths.png new file mode 100644 index 00000000..a9de4a9e Binary files /dev/null and b/KhTracker/CustomImages/System/stats/deaths.png differ diff --git a/KhTracker/CustomImages/System/stats/defence.png b/KhTracker/CustomImages/System/stats/defence.png new file mode 100644 index 00000000..2f5b9397 Binary files /dev/null and b/KhTracker/CustomImages/System/stats/defence.png differ diff --git a/KhTracker/CustomImages/System/stats/level.png b/KhTracker/CustomImages/System/stats/level.png new file mode 100644 index 00000000..c1442fc5 Binary files /dev/null and b/KhTracker/CustomImages/System/stats/level.png differ diff --git a/KhTracker/CustomImages/System/stats/magic.png b/KhTracker/CustomImages/System/stats/magic.png new file mode 100644 index 00000000..63c15f02 Binary files /dev/null and b/KhTracker/CustomImages/System/stats/magic.png differ diff --git a/KhTracker/CustomImages/System/stats/shield.png b/KhTracker/CustomImages/System/stats/shield.png new file mode 100644 index 00000000..6bc3a3b9 Binary files /dev/null and b/KhTracker/CustomImages/System/stats/shield.png differ diff --git a/KhTracker/CustomImages/System/stats/staff.png b/KhTracker/CustomImages/System/stats/staff.png new file mode 100644 index 00000000..d65e6157 Binary files /dev/null and b/KhTracker/CustomImages/System/stats/staff.png differ diff --git a/KhTracker/CustomImages/System/stats/strength.png b/KhTracker/CustomImages/System/stats/strength.png new file mode 100644 index 00000000..fc098f3c Binary files /dev/null and b/KhTracker/CustomImages/System/stats/strength.png differ diff --git a/KhTracker/CustomImages/System/stats/sword.png b/KhTracker/CustomImages/System/stats/sword.png new file mode 100644 index 00000000..55845be3 Binary files /dev/null and b/KhTracker/CustomImages/System/stats/sword.png differ diff --git a/KhTracker/CustomImages/Worlds/100_acre_wood.png b/KhTracker/CustomImages/Worlds/100_acre_wood.png new file mode 100644 index 00000000..5f6bea07 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/100_acre_wood.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/AG.png b/KhTracker/CustomImages/Worlds/Locks/AG.png new file mode 100644 index 00000000..3673fcfb Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/AG.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/BC.png b/KhTracker/CustomImages/Worlds/Locks/BC.png new file mode 100644 index 00000000..3a6fd1ba Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/BC.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/HB.png b/KhTracker/CustomImages/Worlds/Locks/HB.png new file mode 100644 index 00000000..2a96e994 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/HB.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/HT.png b/KhTracker/CustomImages/Worlds/Locks/HT.png new file mode 100644 index 00000000..76050d4d Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/HT.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/LD.png b/KhTracker/CustomImages/Worlds/Locks/LD.png new file mode 100644 index 00000000..80762750 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/LD.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/OC.png b/KhTracker/CustomImages/Worlds/Locks/OC.png new file mode 100644 index 00000000..665da5a4 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/OC.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/PL.png b/KhTracker/CustomImages/Worlds/Locks/PL.png new file mode 100644 index 00000000..165aea33 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/PL.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/PR.png b/KhTracker/CustomImages/Worlds/Locks/PR.png new file mode 100644 index 00000000..4e6f22ee Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/PR.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/SP.png b/KhTracker/CustomImages/Worlds/Locks/SP.png new file mode 100644 index 00000000..fbdea3b3 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/SP.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/TT2.png b/KhTracker/CustomImages/Worlds/Locks/TT2.png new file mode 100644 index 00000000..b92a369a Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/TT2.png differ diff --git a/KhTracker/CustomImages/Worlds/Locks/TT3.png b/KhTracker/CustomImages/Worlds/Locks/TT3.png new file mode 100644 index 00000000..01e54d27 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Locks/TT3.png differ diff --git a/KhTracker/CustomImages/Worlds/PuzzSynth.png b/KhTracker/CustomImages/Worlds/PuzzSynth.png new file mode 100644 index 00000000..247342f8 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/PuzzSynth.png differ diff --git a/KhTracker/CustomImages/Worlds/Puzzle.png b/KhTracker/CustomImages/Worlds/Puzzle.png new file mode 100644 index 00000000..994cf079 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Puzzle.png differ diff --git a/KhTracker/CustomImages/Worlds/Synth.png b/KhTracker/CustomImages/Worlds/Synth.png new file mode 100644 index 00000000..cc863870 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/Synth.png differ diff --git a/KhTracker/CustomImages/Worlds/agrabah.png b/KhTracker/CustomImages/Worlds/agrabah.png new file mode 100644 index 00000000..8a98787f Binary files /dev/null and b/KhTracker/CustomImages/Worlds/agrabah.png differ diff --git a/KhTracker/CustomImages/Worlds/atlantica.png b/KhTracker/CustomImages/Worlds/atlantica.png new file mode 100644 index 00000000..fef85302 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/atlantica.png differ diff --git a/KhTracker/CustomImages/Worlds/beast's_castle.png b/KhTracker/CustomImages/Worlds/beast's_castle.png new file mode 100644 index 00000000..95dc683a Binary files /dev/null and b/KhTracker/CustomImages/Worlds/beast's_castle.png differ diff --git a/KhTracker/CustomImages/Worlds/disney_castle.png b/KhTracker/CustomImages/Worlds/disney_castle.png new file mode 100644 index 00000000..c5d713d9 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/disney_castle.png differ diff --git a/KhTracker/CustomImages/Worlds/drive_form.png b/KhTracker/CustomImages/Worlds/drive_form.png new file mode 100644 index 00000000..a6c716b5 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/drive_form.png differ diff --git a/KhTracker/CustomImages/Worlds/halloween_town.png b/KhTracker/CustomImages/Worlds/halloween_town.png new file mode 100644 index 00000000..5dd95e11 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/halloween_town.png differ diff --git a/KhTracker/CustomImages/Worlds/hollow_bastion.png b/KhTracker/CustomImages/Worlds/hollow_bastion.png new file mode 100644 index 00000000..b49c4b4c Binary files /dev/null and b/KhTracker/CustomImages/Worlds/hollow_bastion.png differ diff --git a/KhTracker/CustomImages/Worlds/land_of_dragons.png b/KhTracker/CustomImages/Worlds/land_of_dragons.png new file mode 100644 index 00000000..0ba54a4d Binary files /dev/null and b/KhTracker/CustomImages/Worlds/land_of_dragons.png differ diff --git a/KhTracker/CustomImages/Worlds/level.png b/KhTracker/CustomImages/Worlds/level.png new file mode 100644 index 00000000..0fc29aca Binary files /dev/null and b/KhTracker/CustomImages/Worlds/level.png differ diff --git a/KhTracker/CustomImages/Worlds/olympus_coliseum.png b/KhTracker/CustomImages/Worlds/olympus_coliseum.png new file mode 100644 index 00000000..ef3fbc01 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/olympus_coliseum.png differ diff --git a/KhTracker/CustomImages/Worlds/port_royal.png b/KhTracker/CustomImages/Worlds/port_royal.png new file mode 100644 index 00000000..fb58ba18 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/port_royal.png differ diff --git a/KhTracker/CustomImages/Worlds/pride_land.png b/KhTracker/CustomImages/Worlds/pride_land.png new file mode 100644 index 00000000..9f9db12b Binary files /dev/null and b/KhTracker/CustomImages/Worlds/pride_land.png differ diff --git a/KhTracker/CustomImages/Worlds/replica_data.png b/KhTracker/CustomImages/Worlds/replica_data.png new file mode 100644 index 00000000..bb1e473e Binary files /dev/null and b/KhTracker/CustomImages/Worlds/replica_data.png differ diff --git a/KhTracker/CustomImages/Worlds/simulated_twilight_town.png b/KhTracker/CustomImages/Worlds/simulated_twilight_town.png new file mode 100644 index 00000000..b44bead5 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/simulated_twilight_town.png differ diff --git a/KhTracker/CustomImages/Worlds/space_paranoids.png b/KhTracker/CustomImages/Worlds/space_paranoids.png new file mode 100644 index 00000000..9d9a0627 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/space_paranoids.png differ diff --git a/KhTracker/CustomImages/Worlds/the_world_that_never_was.png b/KhTracker/CustomImages/Worlds/the_world_that_never_was.png new file mode 100644 index 00000000..3aaf1f14 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/the_world_that_never_was.png differ diff --git a/KhTracker/CustomImages/Worlds/twilight_town.png b/KhTracker/CustomImages/Worlds/twilight_town.png new file mode 100644 index 00000000..1b2b4dc0 Binary files /dev/null and b/KhTracker/CustomImages/Worlds/twilight_town.png differ diff --git a/KhTracker/CustomImages/background.png b/KhTracker/CustomImages/background.png new file mode 100644 index 00000000..43a67f55 Binary files /dev/null and b/KhTracker/CustomImages/background.png differ diff --git a/KhTracker/Data.cs b/KhTracker/Data.cs deleted file mode 100644 index f09cea57..00000000 --- a/KhTracker/Data.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Controls; -using System.Windows.Controls.Primitives; -using System.Windows.Media.Imaging; - -namespace KhTracker -{ - public class Data - { - public Mode mode = Mode.None; - public bool hintsLoaded = false; - public Button selected = null; - public bool dragDrop = true; - - public string openKHHintText = ""; - public string[] hintFileText = new string[2]; - public Codes codes = new Codes(); - - public List> reportInformation = new List>(); - public List reportLocations = new List(); - public List reportAttempts = new List() { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; - - public Dictionary> ProgressKeys = new Dictionary>(); - - public Dictionary WorldsTop = new Dictionary(); - - public Dictionary WorldsData = new Dictionary(); - - public List Reports = new List(); - public List ReportAttemptVisual = new List(); - public List TornPages = new List(); - - public List Numbers = new List(); - public List SingleNumbers = new List(); - public List BlueNumbers = new List(); - public List BlueSingleNumbers = new List(); - - public List Items = new List(); - } - - public class WorldData - { - public bool hinted; - public bool hintedHint; - public bool complete; - public int progress; - - public List checkCount = new List(); - - public Grid top; - public Button world; - public ContentControl progression; - public Image hint; - public WorldGrid worldGrid; - public Image selectedBar; - - public WorldData(Grid Top, Button World, ContentControl Progression, Image Hint, WorldGrid grid, Image SelectedBar, bool Hinted) - { - top = Top; - world = World; - progression = Progression; - hint = Hint; - worldGrid = grid; - selectedBar = SelectedBar; - hinted = Hinted; - hintedHint = false; - complete = false; - progress = 0; - } - } - - public enum Mode - { - Hints, - AltHints, - OpenKHHints, - OpenKHAltHints, - None - } -} diff --git a/KhTracker/Dictionary1.xaml b/KhTracker/Dictionary1.xaml deleted file mode 100644 index 20d7b389..00000000 --- a/KhTracker/Dictionary1.xaml +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/KhTracker/Fonts/KHData.otf b/KhTracker/Fonts/KHData.otf new file mode 100644 index 00000000..e277f790 Binary files /dev/null and b/KhTracker/Fonts/KHData.otf differ diff --git a/KhTracker/Fonts/KHGummi.otf b/KhTracker/Fonts/KHGummi.otf new file mode 100644 index 00000000..5a85e1a9 Binary files /dev/null and b/KhTracker/Fonts/KHGummi.otf differ diff --git a/KhTracker/Fonts/KHIcon.otf b/KhTracker/Fonts/KHIcon.otf new file mode 100644 index 00000000..6d87c0d2 Binary files /dev/null and b/KhTracker/Fonts/KHIcon.otf differ diff --git a/KhTracker/Fonts/KHMenu-Bold.otf b/KhTracker/Fonts/KHMenu-Bold.otf new file mode 100644 index 00000000..bbfdf5ac Binary files /dev/null and b/KhTracker/Fonts/KHMenu-Bold.otf differ diff --git a/KhTracker/Fonts/KHMenu-BoldItalic.otf b/KhTracker/Fonts/KHMenu-BoldItalic.otf new file mode 100644 index 00000000..66267c38 Binary files /dev/null and b/KhTracker/Fonts/KHMenu-BoldItalic.otf differ diff --git a/KhTracker/Fonts/KHMenu-Italic.otf b/KhTracker/Fonts/KHMenu-Italic.otf new file mode 100644 index 00000000..493f5325 Binary files /dev/null and b/KhTracker/Fonts/KHMenu-Italic.otf differ diff --git a/KhTracker/Fonts/KHMenu.otf b/KhTracker/Fonts/KHMenu.otf new file mode 100644 index 00000000..1eba3fe9 Binary files /dev/null and b/KhTracker/Fonts/KHMenu.otf differ diff --git a/KhTracker/Fonts/KHTitle.otf b/KhTracker/Fonts/KHTitle.otf new file mode 100644 index 00000000..f11d2e39 Binary files /dev/null and b/KhTracker/Fonts/KHTitle.otf differ diff --git a/KhTracker/Hotkeys/GlobalHotkey.cs b/KhTracker/Hotkeys/GlobalHotkey.cs new file mode 100644 index 00000000..a1a5c041 --- /dev/null +++ b/KhTracker/Hotkeys/GlobalHotkey.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Input; + +/* + Credits to Kettlesimulator's YouTube video for the simple solution - https://www.youtube.com/watch?v=qLxqoh1JLnM +*/ + +namespace KhTracker.Hotkeys +{ + public class GlobalHotkey + { + public ModifierKeys Modifier { get; set; } + + public Key Key { get; set; } + + public Action Callback { get; set; } + + public bool CanExecute { get; set; } + + public GlobalHotkey(ModifierKeys modifier, Key key, Action callback, bool canExecute = true) + { + Modifier = modifier; + Key = key; + Callback = callback; + CanExecute = canExecute; + } + } +} diff --git a/KhTracker/Hotkeys/HotkeysManager.cs b/KhTracker/Hotkeys/HotkeysManager.cs new file mode 100644 index 00000000..1726b255 --- /dev/null +++ b/KhTracker/Hotkeys/HotkeysManager.cs @@ -0,0 +1,114 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.InteropServices; +using System.Diagnostics; +using System.Windows.Input; +using System.Windows; + +/* + Credits to Kettlesimulator's YouTube video for the simple solution - https://www.youtube.com/watch?v=qLxqoh1JLnM +*/ + +namespace KhTracker.Hotkeys +{ + public static class HotkeysManager + { + private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); + + private static LowLevelKeyboardProc LowLevelProc = HookCallback; + + private static List Hotkeys { get; set; } + + private const int WH_KEYBOARD_LL = 13; + + private static IntPtr HookID = IntPtr.Zero; + + public static bool IsHookSetup { get; set; } + + static HotkeysManager() + { + Hotkeys = new List(); + } + + public static void SetupSystemHook() + { + if (!IsHookSetup) + { + HookID = SetHook(LowLevelProc); + IsHookSetup = true; + } + } + + public static void ShutdownSystemHook() + { + if (IsHookSetup) + { + UnhookWindowsHookEx(HookID); + IsHookSetup = false; + } + } + + private static IntPtr SetHook(LowLevelKeyboardProc proc) + { + using (Process currentProcess = Process.GetCurrentProcess()) + { + using (ProcessModule currentModule = currentProcess.MainModule) + { + return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(currentModule.ModuleName), 0); + } + } + } + + public static void AddHotkey(GlobalHotkey hotkey) + { + Hotkeys.Add(hotkey); + } + + public static void RemoveHotkey(GlobalHotkey hotkey) + { + Hotkeys.Remove(hotkey); + } + + private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) + { + if (nCode >= 0) + { + foreach (GlobalHotkey hotkey in Hotkeys) + { + try + { + if (Keyboard.Modifiers == hotkey.Modifier && Keyboard.IsKeyDown(hotkey.Key)) + { + if (hotkey.CanExecute) + { + hotkey.Callback?.Invoke(); + } + } + } + catch + { + MessageBox.Show("Error with hotkey!\nPost your hotkey in the rando discord for help."); + } + } + } + + return CallNextHookEx(HookID, nCode, wParam, lParam); + } + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr UnhookWindowsHookEx(IntPtr hhk); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr GetModuleHandle(string lpModuleName); + } +} diff --git a/KhTracker/Images/Alt/Blizzard_Orb.png b/KhTracker/Images/Alt/Blizzard_Orb.png deleted file mode 100644 index 5cefbf94..00000000 Binary files a/KhTracker/Images/Alt/Blizzard_Orb.png and /dev/null differ diff --git a/KhTracker/Images/Alt/Cure_Orb.png b/KhTracker/Images/Alt/Cure_Orb.png deleted file mode 100644 index 7fb3fb04..00000000 Binary files a/KhTracker/Images/Alt/Cure_Orb.png and /dev/null differ diff --git a/KhTracker/Images/Alt/Fire_Orb.png b/KhTracker/Images/Alt/Fire_Orb.png deleted file mode 100644 index 9e76116e..00000000 Binary files a/KhTracker/Images/Alt/Fire_Orb.png and /dev/null differ diff --git a/KhTracker/Images/Alt/Magnet_Orb.png b/KhTracker/Images/Alt/Magnet_Orb.png deleted file mode 100644 index 97deb0fd..00000000 Binary files a/KhTracker/Images/Alt/Magnet_Orb.png and /dev/null differ diff --git a/KhTracker/Images/Alt/Reflect_Orb.png b/KhTracker/Images/Alt/Reflect_Orb.png deleted file mode 100644 index 05d7163c..00000000 Binary files a/KhTracker/Images/Alt/Reflect_Orb.png and /dev/null differ diff --git a/KhTracker/Images/Alt/Thunder_Orb.png b/KhTracker/Images/Alt/Thunder_Orb.png deleted file mode 100644 index c09adc4e..00000000 Binary files a/KhTracker/Images/Alt/Thunder_Orb.png and /dev/null differ diff --git a/KhTracker/Images/Alt/chicken_little.png b/KhTracker/Images/Alt/chicken_little.png deleted file mode 100644 index 36e3fe18..00000000 Binary files a/KhTracker/Images/Alt/chicken_little.png and /dev/null differ diff --git a/KhTracker/Images/Alt/final.png b/KhTracker/Images/Alt/final.png deleted file mode 100644 index b72bdf76..00000000 Binary files a/KhTracker/Images/Alt/final.png and /dev/null differ diff --git a/KhTracker/Images/Alt/genie.png b/KhTracker/Images/Alt/genie.png deleted file mode 100644 index 2753e401..00000000 Binary files a/KhTracker/Images/Alt/genie.png and /dev/null differ diff --git a/KhTracker/Images/Alt/limit.png b/KhTracker/Images/Alt/limit.png deleted file mode 100644 index 82ead732..00000000 Binary files a/KhTracker/Images/Alt/limit.png and /dev/null differ diff --git a/KhTracker/Images/Alt/master.png b/KhTracker/Images/Alt/master.png deleted file mode 100644 index a6e54f6f..00000000 Binary files a/KhTracker/Images/Alt/master.png and /dev/null differ diff --git a/KhTracker/Images/Alt/peter_pan.png b/KhTracker/Images/Alt/peter_pan.png deleted file mode 100644 index bdfbfc59..00000000 Binary files a/KhTracker/Images/Alt/peter_pan.png and /dev/null differ diff --git a/KhTracker/Images/Alt/stitch.png b/KhTracker/Images/Alt/stitch.png deleted file mode 100644 index 6f1f131f..00000000 Binary files a/KhTracker/Images/Alt/stitch.png and /dev/null differ diff --git a/KhTracker/Images/Alt/valor.png b/KhTracker/Images/Alt/valor.png deleted file mode 100644 index 1b7b42b4..00000000 Binary files a/KhTracker/Images/Alt/valor.png and /dev/null differ diff --git a/KhTracker/Images/Alt/wisdom.png b/KhTracker/Images/Alt/wisdom.png deleted file mode 100644 index b10d440e..00000000 Binary files a/KhTracker/Images/Alt/wisdom.png and /dev/null differ diff --git a/KhTracker/Images/Bar.png b/KhTracker/Images/Bar.png deleted file mode 100644 index 89d2bd25..00000000 Binary files a/KhTracker/Images/Bar.png and /dev/null differ diff --git a/KhTracker/Images/BarBlue.png b/KhTracker/Images/BarBlue.png deleted file mode 100644 index 249a167e..00000000 Binary files a/KhTracker/Images/BarBlue.png and /dev/null differ diff --git a/KhTracker/Images/Checks/Min/Ghost/magic_blizzard.png b/KhTracker/Images/Checks/Min/Ghost/magic_blizzard.png new file mode 100644 index 00000000..64c5d076 Binary files /dev/null and b/KhTracker/Images/Checks/Min/Ghost/magic_blizzard.png differ diff --git a/KhTracker/Images/Checks/Min/Ghost/magic_cure.png b/KhTracker/Images/Checks/Min/Ghost/magic_cure.png new file mode 100644 index 00000000..fb83d59c Binary files /dev/null and b/KhTracker/Images/Checks/Min/Ghost/magic_cure.png differ diff --git a/KhTracker/Images/Checks/Min/Ghost/magic_fire.png b/KhTracker/Images/Checks/Min/Ghost/magic_fire.png new file mode 100644 index 00000000..2b481851 Binary files /dev/null and b/KhTracker/Images/Checks/Min/Ghost/magic_fire.png differ diff --git a/KhTracker/Images/Checks/Min/Ghost/magic_magnet.png b/KhTracker/Images/Checks/Min/Ghost/magic_magnet.png new file mode 100644 index 00000000..b76913d1 Binary files /dev/null and b/KhTracker/Images/Checks/Min/Ghost/magic_magnet.png differ diff --git a/KhTracker/Images/Checks/Min/Ghost/magic_reflect.png b/KhTracker/Images/Checks/Min/Ghost/magic_reflect.png new file mode 100644 index 00000000..dc41a87a Binary files /dev/null and b/KhTracker/Images/Checks/Min/Ghost/magic_reflect.png differ diff --git a/KhTracker/Images/Checks/Min/Ghost/magic_thunder.png b/KhTracker/Images/Checks/Min/Ghost/magic_thunder.png new file mode 100644 index 00000000..63147d83 Binary files /dev/null and b/KhTracker/Images/Checks/Min/Ghost/magic_thunder.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report.png b/KhTracker/Images/Checks/Min/ansem_report.png new file mode 100644 index 00000000..4dfc7844 Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report01.png b/KhTracker/Images/Checks/Min/ansem_report01.png new file mode 100644 index 00000000..bc83d5fb Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report01.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report02.png b/KhTracker/Images/Checks/Min/ansem_report02.png new file mode 100644 index 00000000..095b3abf Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report02.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report03.png b/KhTracker/Images/Checks/Min/ansem_report03.png new file mode 100644 index 00000000..dfecc727 Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report03.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report04.png b/KhTracker/Images/Checks/Min/ansem_report04.png new file mode 100644 index 00000000..60cab2af Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report04.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report05.png b/KhTracker/Images/Checks/Min/ansem_report05.png new file mode 100644 index 00000000..dfaba274 Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report05.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report06.png b/KhTracker/Images/Checks/Min/ansem_report06.png new file mode 100644 index 00000000..535d7591 Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report06.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report07.png b/KhTracker/Images/Checks/Min/ansem_report07.png new file mode 100644 index 00000000..c5765db9 Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report07.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report08.png b/KhTracker/Images/Checks/Min/ansem_report08.png new file mode 100644 index 00000000..1dc29ffc Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report08.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report09.png b/KhTracker/Images/Checks/Min/ansem_report09.png new file mode 100644 index 00000000..3411788f Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report09.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report10.png b/KhTracker/Images/Checks/Min/ansem_report10.png new file mode 100644 index 00000000..d008d766 Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report10.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report11.png b/KhTracker/Images/Checks/Min/ansem_report11.png new file mode 100644 index 00000000..80b0ee90 Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report11.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report12.png b/KhTracker/Images/Checks/Min/ansem_report12.png new file mode 100644 index 00000000..655edadb Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report12.png differ diff --git a/KhTracker/Images/Checks/Min/ansem_report13.png b/KhTracker/Images/Checks/Min/ansem_report13.png new file mode 100644 index 00000000..eb5245e0 Binary files /dev/null and b/KhTracker/Images/Checks/Min/ansem_report13.png differ diff --git a/KhTracker/Images/Checks/Min/aux_hades_cup.png b/KhTracker/Images/Checks/Min/aux_hades_cup.png new file mode 100644 index 00000000..2a2afe51 Binary files /dev/null and b/KhTracker/Images/Checks/Min/aux_hades_cup.png differ diff --git a/KhTracker/Images/Checks/Min/aux_munny_pouch.png b/KhTracker/Images/Checks/Min/aux_munny_pouch.png new file mode 100644 index 00000000..a01e60a8 Binary files /dev/null and b/KhTracker/Images/Checks/Min/aux_munny_pouch.png differ diff --git a/KhTracker/Images/Checks/Min/aux_olympus_stone.png b/KhTracker/Images/Checks/Min/aux_olympus_stone.png new file mode 100644 index 00000000..be6f2c21 Binary files /dev/null and b/KhTracker/Images/Checks/Min/aux_olympus_stone.png differ diff --git a/KhTracker/Images/Checks/Min/aux_unknowndisk.png b/KhTracker/Images/Checks/Min/aux_unknowndisk.png new file mode 100644 index 00000000..4e5ed007 Binary files /dev/null and b/KhTracker/Images/Checks/Min/aux_unknowndisk.png differ diff --git a/KhTracker/Images/Checks/Min/form_anti.png b/KhTracker/Images/Checks/Min/form_anti.png new file mode 100644 index 00000000..2dc20b59 Binary files /dev/null and b/KhTracker/Images/Checks/Min/form_anti.png differ diff --git a/KhTracker/Images/Checks/Min/form_final.png b/KhTracker/Images/Checks/Min/form_final.png new file mode 100644 index 00000000..42d94ab2 Binary files /dev/null and b/KhTracker/Images/Checks/Min/form_final.png differ diff --git a/KhTracker/Images/Checks/Min/form_limit.png b/KhTracker/Images/Checks/Min/form_limit.png new file mode 100644 index 00000000..f557b1bc Binary files /dev/null and b/KhTracker/Images/Checks/Min/form_limit.png differ diff --git a/KhTracker/Images/Checks/Min/form_master.png b/KhTracker/Images/Checks/Min/form_master.png new file mode 100644 index 00000000..48c2ae93 Binary files /dev/null and b/KhTracker/Images/Checks/Min/form_master.png differ diff --git a/KhTracker/Images/Checks/Min/form_valor.png b/KhTracker/Images/Checks/Min/form_valor.png new file mode 100644 index 00000000..069f120b Binary files /dev/null and b/KhTracker/Images/Checks/Min/form_valor.png differ diff --git a/KhTracker/Images/Checks/Min/form_wisdom.png b/KhTracker/Images/Checks/Min/form_wisdom.png new file mode 100644 index 00000000..4169374a Binary files /dev/null and b/KhTracker/Images/Checks/Min/form_wisdom.png differ diff --git a/KhTracker/Images/Checks/Min/lock_ancestorsword.png b/KhTracker/Images/Checks/Min/lock_ancestorsword.png new file mode 100644 index 00000000..e773bba8 Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_ancestorsword.png differ diff --git a/KhTracker/Images/Checks/Min/lock_battlefieldsofwar.png b/KhTracker/Images/Checks/Min/lock_battlefieldsofwar.png new file mode 100644 index 00000000..fa64ae13 Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_battlefieldsofwar.png differ diff --git a/KhTracker/Images/Checks/Min/lock_beastclaw.png b/KhTracker/Images/Checks/Min/lock_beastclaw.png new file mode 100644 index 00000000..287e2ad3 Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_beastclaw.png differ diff --git a/KhTracker/Images/Checks/Min/lock_bonefist.png b/KhTracker/Images/Checks/Min/lock_bonefist.png new file mode 100644 index 00000000..b0b755ed Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_bonefist.png differ diff --git a/KhTracker/Images/Checks/Min/lock_icecream.png b/KhTracker/Images/Checks/Min/lock_icecream.png new file mode 100644 index 00000000..fa0659b0 Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_icecream.png differ diff --git a/KhTracker/Images/Checks/Min/lock_identitydisk.png b/KhTracker/Images/Checks/Min/lock_identitydisk.png new file mode 100644 index 00000000..30a40f8b Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_identitydisk.png differ diff --git a/KhTracker/Images/Checks/Min/lock_membershipcard.png b/KhTracker/Images/Checks/Min/lock_membershipcard.png new file mode 100644 index 00000000..b52bf1bd Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_membershipcard.png differ diff --git a/KhTracker/Images/Checks/Min/lock_picture.png b/KhTracker/Images/Checks/Min/lock_picture.png new file mode 100644 index 00000000..bc1afb13 Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_picture.png differ diff --git a/KhTracker/Images/Checks/Min/lock_proudfang.png b/KhTracker/Images/Checks/Min/lock_proudfang.png new file mode 100644 index 00000000..93182a07 Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_proudfang.png differ diff --git a/KhTracker/Images/Checks/Min/lock_scimitar.png b/KhTracker/Images/Checks/Min/lock_scimitar.png new file mode 100644 index 00000000..64926886 Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_scimitar.png differ diff --git a/KhTracker/Images/Checks/Min/lock_skillcrossbones.png b/KhTracker/Images/Checks/Min/lock_skillcrossbones.png new file mode 100644 index 00000000..0f8d11ad Binary files /dev/null and b/KhTracker/Images/Checks/Min/lock_skillcrossbones.png differ diff --git a/KhTracker/Images/Checks/Min/magic_blizzard.png b/KhTracker/Images/Checks/Min/magic_blizzard.png new file mode 100644 index 00000000..e2e4584e Binary files /dev/null and b/KhTracker/Images/Checks/Min/magic_blizzard.png differ diff --git a/KhTracker/Images/Checks/Min/magic_cure.png b/KhTracker/Images/Checks/Min/magic_cure.png new file mode 100644 index 00000000..37bd6243 Binary files /dev/null and b/KhTracker/Images/Checks/Min/magic_cure.png differ diff --git a/KhTracker/Images/Checks/Min/magic_fire.png b/KhTracker/Images/Checks/Min/magic_fire.png new file mode 100644 index 00000000..dad8ef11 Binary files /dev/null and b/KhTracker/Images/Checks/Min/magic_fire.png differ diff --git a/KhTracker/Images/Checks/Min/magic_magnet.png b/KhTracker/Images/Checks/Min/magic_magnet.png new file mode 100644 index 00000000..93805fd1 Binary files /dev/null and b/KhTracker/Images/Checks/Min/magic_magnet.png differ diff --git a/KhTracker/Images/Checks/Min/magic_reflect.png b/KhTracker/Images/Checks/Min/magic_reflect.png new file mode 100644 index 00000000..abab7fdf Binary files /dev/null and b/KhTracker/Images/Checks/Min/magic_reflect.png differ diff --git a/KhTracker/Images/Checks/Min/magic_thunder.png b/KhTracker/Images/Checks/Min/magic_thunder.png new file mode 100644 index 00000000..0f07ae54 Binary files /dev/null and b/KhTracker/Images/Checks/Min/magic_thunder.png differ diff --git a/KhTracker/Images/Checks/Min/promise_charm.png b/KhTracker/Images/Checks/Min/promise_charm.png new file mode 100644 index 00000000..809e6ab5 Binary files /dev/null and b/KhTracker/Images/Checks/Min/promise_charm.png differ diff --git a/KhTracker/Images/Checks/Min/proof_connection.png b/KhTracker/Images/Checks/Min/proof_connection.png new file mode 100644 index 00000000..a8ed975d Binary files /dev/null and b/KhTracker/Images/Checks/Min/proof_connection.png differ diff --git a/KhTracker/Images/Checks/Min/proof_nonexistence.png b/KhTracker/Images/Checks/Min/proof_nonexistence.png new file mode 100644 index 00000000..2aef7206 Binary files /dev/null and b/KhTracker/Images/Checks/Min/proof_nonexistence.png differ diff --git a/KhTracker/Images/Checks/Min/proof_peace.png b/KhTracker/Images/Checks/Min/proof_peace.png new file mode 100644 index 00000000..7edc89c4 Binary files /dev/null and b/KhTracker/Images/Checks/Min/proof_peace.png differ diff --git a/KhTracker/Images/Checks/Min/summon_chicken_little.png b/KhTracker/Images/Checks/Min/summon_chicken_little.png new file mode 100644 index 00000000..b6a851f1 Binary files /dev/null and b/KhTracker/Images/Checks/Min/summon_chicken_little.png differ diff --git a/KhTracker/Images/Checks/Min/summon_genie.png b/KhTracker/Images/Checks/Min/summon_genie.png new file mode 100644 index 00000000..c5f66bec Binary files /dev/null and b/KhTracker/Images/Checks/Min/summon_genie.png differ diff --git a/KhTracker/Images/Checks/Min/summon_peter_pan.png b/KhTracker/Images/Checks/Min/summon_peter_pan.png new file mode 100644 index 00000000..c650fe55 Binary files /dev/null and b/KhTracker/Images/Checks/Min/summon_peter_pan.png differ diff --git a/KhTracker/Images/Checks/Min/summon_stitch.png b/KhTracker/Images/Checks/Min/summon_stitch.png new file mode 100644 index 00000000..88e19cce Binary files /dev/null and b/KhTracker/Images/Checks/Min/summon_stitch.png differ diff --git a/KhTracker/Images/Checks/Min/torn_pages.png b/KhTracker/Images/Checks/Min/torn_pages.png new file mode 100644 index 00000000..273331dd Binary files /dev/null and b/KhTracker/Images/Checks/Min/torn_pages.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report.png b/KhTracker/Images/Checks/Old/ansem_report.png new file mode 100644 index 00000000..bde6fd72 Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report01.png b/KhTracker/Images/Checks/Old/ansem_report01.png new file mode 100644 index 00000000..418db1ee Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report01.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report02.png b/KhTracker/Images/Checks/Old/ansem_report02.png new file mode 100644 index 00000000..6fefb753 Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report02.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report03.png b/KhTracker/Images/Checks/Old/ansem_report03.png new file mode 100644 index 00000000..8eea4e01 Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report03.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report04.png b/KhTracker/Images/Checks/Old/ansem_report04.png new file mode 100644 index 00000000..535da715 Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report04.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report05.png b/KhTracker/Images/Checks/Old/ansem_report05.png new file mode 100644 index 00000000..47748bc9 Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report05.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report06.png b/KhTracker/Images/Checks/Old/ansem_report06.png new file mode 100644 index 00000000..678a6795 Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report06.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report07.png b/KhTracker/Images/Checks/Old/ansem_report07.png new file mode 100644 index 00000000..609584de Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report07.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report08.png b/KhTracker/Images/Checks/Old/ansem_report08.png new file mode 100644 index 00000000..942f5691 Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report08.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report09.png b/KhTracker/Images/Checks/Old/ansem_report09.png new file mode 100644 index 00000000..86eefb4f Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report09.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report10.png b/KhTracker/Images/Checks/Old/ansem_report10.png new file mode 100644 index 00000000..336fe722 Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report10.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report11.png b/KhTracker/Images/Checks/Old/ansem_report11.png new file mode 100644 index 00000000..d549b02a Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report11.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report12.png b/KhTracker/Images/Checks/Old/ansem_report12.png new file mode 100644 index 00000000..9dec755a Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report12.png differ diff --git a/KhTracker/Images/Checks/Old/ansem_report13.png b/KhTracker/Images/Checks/Old/ansem_report13.png new file mode 100644 index 00000000..868a3dfc Binary files /dev/null and b/KhTracker/Images/Checks/Old/ansem_report13.png differ diff --git a/KhTracker/Images/Checks/Old/aux_hades_cup.png b/KhTracker/Images/Checks/Old/aux_hades_cup.png new file mode 100644 index 00000000..dba65e0a Binary files /dev/null and b/KhTracker/Images/Checks/Old/aux_hades_cup.png differ diff --git a/KhTracker/Images/Checks/Old/aux_munny_pouch.png b/KhTracker/Images/Checks/Old/aux_munny_pouch.png new file mode 100644 index 00000000..8d42ba7a Binary files /dev/null and b/KhTracker/Images/Checks/Old/aux_munny_pouch.png differ diff --git a/KhTracker/Images/Checks/Old/aux_olympus_stone.png b/KhTracker/Images/Checks/Old/aux_olympus_stone.png new file mode 100644 index 00000000..fe85e095 Binary files /dev/null and b/KhTracker/Images/Checks/Old/aux_olympus_stone.png differ diff --git a/KhTracker/Images/Checks/Old/aux_unknowndisk.png b/KhTracker/Images/Checks/Old/aux_unknowndisk.png new file mode 100644 index 00000000..e8a5b5d4 Binary files /dev/null and b/KhTracker/Images/Checks/Old/aux_unknowndisk.png differ diff --git a/KhTracker/Images/Checks/Old/form_anti.png b/KhTracker/Images/Checks/Old/form_anti.png new file mode 100644 index 00000000..15f2e057 Binary files /dev/null and b/KhTracker/Images/Checks/Old/form_anti.png differ diff --git a/KhTracker/Images/Checks/Old/form_final.png b/KhTracker/Images/Checks/Old/form_final.png new file mode 100644 index 00000000..72faced9 Binary files /dev/null and b/KhTracker/Images/Checks/Old/form_final.png differ diff --git a/KhTracker/Images/Checks/Old/form_limit.png b/KhTracker/Images/Checks/Old/form_limit.png new file mode 100644 index 00000000..8e75e77d Binary files /dev/null and b/KhTracker/Images/Checks/Old/form_limit.png differ diff --git a/KhTracker/Images/Checks/Old/form_master.png b/KhTracker/Images/Checks/Old/form_master.png new file mode 100644 index 00000000..e59feffa Binary files /dev/null and b/KhTracker/Images/Checks/Old/form_master.png differ diff --git a/KhTracker/Images/Checks/Old/form_valor.png b/KhTracker/Images/Checks/Old/form_valor.png new file mode 100644 index 00000000..7924eb08 Binary files /dev/null and b/KhTracker/Images/Checks/Old/form_valor.png differ diff --git a/KhTracker/Images/Checks/Old/form_wisdom.png b/KhTracker/Images/Checks/Old/form_wisdom.png new file mode 100644 index 00000000..10f1c433 Binary files /dev/null and b/KhTracker/Images/Checks/Old/form_wisdom.png differ diff --git a/KhTracker/Images/Checks/Old/lock_ancestorsword.png b/KhTracker/Images/Checks/Old/lock_ancestorsword.png new file mode 100644 index 00000000..3820c260 Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_ancestorsword.png differ diff --git a/KhTracker/Images/Checks/Old/lock_battlefieldsofwar.png b/KhTracker/Images/Checks/Old/lock_battlefieldsofwar.png new file mode 100644 index 00000000..03ce631d Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_battlefieldsofwar.png differ diff --git a/KhTracker/Images/Checks/Old/lock_beastclaw.png b/KhTracker/Images/Checks/Old/lock_beastclaw.png new file mode 100644 index 00000000..b26c3531 Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_beastclaw.png differ diff --git a/KhTracker/Images/Checks/Old/lock_bonefist.png b/KhTracker/Images/Checks/Old/lock_bonefist.png new file mode 100644 index 00000000..d7a9d0c5 Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_bonefist.png differ diff --git a/KhTracker/Images/Checks/Old/lock_icecream.png b/KhTracker/Images/Checks/Old/lock_icecream.png new file mode 100644 index 00000000..a4f6f524 Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_icecream.png differ diff --git a/KhTracker/Images/Checks/Old/lock_identitydisk.png b/KhTracker/Images/Checks/Old/lock_identitydisk.png new file mode 100644 index 00000000..464dee54 Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_identitydisk.png differ diff --git a/KhTracker/Images/Checks/Old/lock_membershipcard.png b/KhTracker/Images/Checks/Old/lock_membershipcard.png new file mode 100644 index 00000000..eb8e1f88 Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_membershipcard.png differ diff --git a/KhTracker/Images/Checks/Old/lock_picture.png b/KhTracker/Images/Checks/Old/lock_picture.png new file mode 100644 index 00000000..fe6412d6 Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_picture.png differ diff --git a/KhTracker/Images/Checks/Old/lock_proudfang.png b/KhTracker/Images/Checks/Old/lock_proudfang.png new file mode 100644 index 00000000..b913a6d0 Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_proudfang.png differ diff --git a/KhTracker/Images/Checks/Old/lock_scimitar.png b/KhTracker/Images/Checks/Old/lock_scimitar.png new file mode 100644 index 00000000..5e764cdd Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_scimitar.png differ diff --git a/KhTracker/Images/Checks/Old/lock_skillcrossbones.png b/KhTracker/Images/Checks/Old/lock_skillcrossbones.png new file mode 100644 index 00000000..a58f836d Binary files /dev/null and b/KhTracker/Images/Checks/Old/lock_skillcrossbones.png differ diff --git a/KhTracker/Images/Checks/Old/magic_blizzard.png b/KhTracker/Images/Checks/Old/magic_blizzard.png new file mode 100644 index 00000000..d77ede43 Binary files /dev/null and b/KhTracker/Images/Checks/Old/magic_blizzard.png differ diff --git a/KhTracker/Images/Checks/Old/magic_cure.png b/KhTracker/Images/Checks/Old/magic_cure.png new file mode 100644 index 00000000..7b2b0b29 Binary files /dev/null and b/KhTracker/Images/Checks/Old/magic_cure.png differ diff --git a/KhTracker/Images/Checks/Old/magic_fire.png b/KhTracker/Images/Checks/Old/magic_fire.png new file mode 100644 index 00000000..eb992309 Binary files /dev/null and b/KhTracker/Images/Checks/Old/magic_fire.png differ diff --git a/KhTracker/Images/Checks/Old/magic_magnet.png b/KhTracker/Images/Checks/Old/magic_magnet.png new file mode 100644 index 00000000..b1114a35 Binary files /dev/null and b/KhTracker/Images/Checks/Old/magic_magnet.png differ diff --git a/KhTracker/Images/Checks/Old/magic_reflect.png b/KhTracker/Images/Checks/Old/magic_reflect.png new file mode 100644 index 00000000..c6f5105a Binary files /dev/null and b/KhTracker/Images/Checks/Old/magic_reflect.png differ diff --git a/KhTracker/Images/Checks/Old/magic_thunder.png b/KhTracker/Images/Checks/Old/magic_thunder.png new file mode 100644 index 00000000..e956c46f Binary files /dev/null and b/KhTracker/Images/Checks/Old/magic_thunder.png differ diff --git a/KhTracker/Images/Checks/Old/promise_charm.png b/KhTracker/Images/Checks/Old/promise_charm.png new file mode 100644 index 00000000..00b20d25 Binary files /dev/null and b/KhTracker/Images/Checks/Old/promise_charm.png differ diff --git a/KhTracker/Images/Checks/Old/proof_connection.png b/KhTracker/Images/Checks/Old/proof_connection.png new file mode 100644 index 00000000..f8e7a263 Binary files /dev/null and b/KhTracker/Images/Checks/Old/proof_connection.png differ diff --git a/KhTracker/Images/Checks/Old/proof_nonexistence.png b/KhTracker/Images/Checks/Old/proof_nonexistence.png new file mode 100644 index 00000000..97db12b6 Binary files /dev/null and b/KhTracker/Images/Checks/Old/proof_nonexistence.png differ diff --git a/KhTracker/Images/Checks/Old/proof_peace.png b/KhTracker/Images/Checks/Old/proof_peace.png new file mode 100644 index 00000000..9e20c100 Binary files /dev/null and b/KhTracker/Images/Checks/Old/proof_peace.png differ diff --git a/KhTracker/Images/Checks/Old/summon_chicken_little.png b/KhTracker/Images/Checks/Old/summon_chicken_little.png new file mode 100644 index 00000000..7c2e41d6 Binary files /dev/null and b/KhTracker/Images/Checks/Old/summon_chicken_little.png differ diff --git a/KhTracker/Images/Checks/Old/summon_genie.png b/KhTracker/Images/Checks/Old/summon_genie.png new file mode 100644 index 00000000..3824412a Binary files /dev/null and b/KhTracker/Images/Checks/Old/summon_genie.png differ diff --git a/KhTracker/Images/Checks/Old/summon_peter_pan.png b/KhTracker/Images/Checks/Old/summon_peter_pan.png new file mode 100644 index 00000000..50c9a31c Binary files /dev/null and b/KhTracker/Images/Checks/Old/summon_peter_pan.png differ diff --git a/KhTracker/Images/Checks/Old/summon_stitch.png b/KhTracker/Images/Checks/Old/summon_stitch.png new file mode 100644 index 00000000..1dc46a41 Binary files /dev/null and b/KhTracker/Images/Checks/Old/summon_stitch.png differ diff --git a/KhTracker/Images/Checks/Old/torn_pages.png b/KhTracker/Images/Checks/Old/torn_pages.png new file mode 100644 index 00000000..4f722b5a Binary files /dev/null and b/KhTracker/Images/Checks/Old/torn_pages.png differ diff --git a/KhTracker/Images/Checks/once_more.png b/KhTracker/Images/Checks/once_more.png new file mode 100644 index 00000000..ac900a83 Binary files /dev/null and b/KhTracker/Images/Checks/once_more.png differ diff --git a/KhTracker/Images/Checks/once_more_key.png b/KhTracker/Images/Checks/once_more_key.png new file mode 100644 index 00000000..41174892 Binary files /dev/null and b/KhTracker/Images/Checks/once_more_key.png differ diff --git a/KhTracker/Images/Checks/second_chance.png b/KhTracker/Images/Checks/second_chance.png new file mode 100644 index 00000000..d94d4ccd Binary files /dev/null and b/KhTracker/Images/Checks/second_chance.png differ diff --git a/KhTracker/Images/Checks/second_chance_key.png b/KhTracker/Images/Checks/second_chance_key.png new file mode 100644 index 00000000..b7412ecf Binary files /dev/null and b/KhTracker/Images/Checks/second_chance_key.png differ diff --git a/KhTracker/Images/GrowthAbilities/aerial.png b/KhTracker/Images/GrowthAbilities/aerial.png deleted file mode 100644 index 58ca5c43..00000000 Binary files a/KhTracker/Images/GrowthAbilities/aerial.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/aerial2.png b/KhTracker/Images/GrowthAbilities/aerial2.png deleted file mode 100644 index 5958e7a8..00000000 Binary files a/KhTracker/Images/GrowthAbilities/aerial2.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/aerial3.png b/KhTracker/Images/GrowthAbilities/aerial3.png deleted file mode 100644 index 51e4d594..00000000 Binary files a/KhTracker/Images/GrowthAbilities/aerial3.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/aerial4.png b/KhTracker/Images/GrowthAbilities/aerial4.png deleted file mode 100644 index f3f830bb..00000000 Binary files a/KhTracker/Images/GrowthAbilities/aerial4.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/dodge.png b/KhTracker/Images/GrowthAbilities/dodge.png deleted file mode 100644 index e9d65c81..00000000 Binary files a/KhTracker/Images/GrowthAbilities/dodge.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/dodge2.png b/KhTracker/Images/GrowthAbilities/dodge2.png deleted file mode 100644 index f412fd8b..00000000 Binary files a/KhTracker/Images/GrowthAbilities/dodge2.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/dodge3.png b/KhTracker/Images/GrowthAbilities/dodge3.png deleted file mode 100644 index 07bde49e..00000000 Binary files a/KhTracker/Images/GrowthAbilities/dodge3.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/dodge4.png b/KhTracker/Images/GrowthAbilities/dodge4.png deleted file mode 100644 index 22f67ed8..00000000 Binary files a/KhTracker/Images/GrowthAbilities/dodge4.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/glide.png b/KhTracker/Images/GrowthAbilities/glide.png deleted file mode 100644 index e20aa9a1..00000000 Binary files a/KhTracker/Images/GrowthAbilities/glide.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/glide2.png b/KhTracker/Images/GrowthAbilities/glide2.png deleted file mode 100644 index 2737827b..00000000 Binary files a/KhTracker/Images/GrowthAbilities/glide2.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/glide3.png b/KhTracker/Images/GrowthAbilities/glide3.png deleted file mode 100644 index f5fc0ab1..00000000 Binary files a/KhTracker/Images/GrowthAbilities/glide3.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/glide4.png b/KhTracker/Images/GrowthAbilities/glide4.png deleted file mode 100644 index a9f8d3b1..00000000 Binary files a/KhTracker/Images/GrowthAbilities/glide4.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/jump.png b/KhTracker/Images/GrowthAbilities/jump.png deleted file mode 100644 index ae544302..00000000 Binary files a/KhTracker/Images/GrowthAbilities/jump.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/jump2.png b/KhTracker/Images/GrowthAbilities/jump2.png deleted file mode 100644 index 558de62d..00000000 Binary files a/KhTracker/Images/GrowthAbilities/jump2.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/jump3.png b/KhTracker/Images/GrowthAbilities/jump3.png deleted file mode 100644 index 4db4471c..00000000 Binary files a/KhTracker/Images/GrowthAbilities/jump3.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/jump4.png b/KhTracker/Images/GrowthAbilities/jump4.png deleted file mode 100644 index 51f6bae1..00000000 Binary files a/KhTracker/Images/GrowthAbilities/jump4.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/quick.png b/KhTracker/Images/GrowthAbilities/quick.png deleted file mode 100644 index 13607c4c..00000000 Binary files a/KhTracker/Images/GrowthAbilities/quick.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/quick2.png b/KhTracker/Images/GrowthAbilities/quick2.png deleted file mode 100644 index 9d9573ec..00000000 Binary files a/KhTracker/Images/GrowthAbilities/quick2.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/quick3.png b/KhTracker/Images/GrowthAbilities/quick3.png deleted file mode 100644 index 0b714be6..00000000 Binary files a/KhTracker/Images/GrowthAbilities/quick3.png and /dev/null differ diff --git a/KhTracker/Images/GrowthAbilities/quick4.png b/KhTracker/Images/GrowthAbilities/quick4.png deleted file mode 100644 index 1185e1f2..00000000 Binary files a/KhTracker/Images/GrowthAbilities/quick4.png and /dev/null differ diff --git a/KhTracker/Images/HashIcons/ability-unequip.png b/KhTracker/Images/HashIcons/ability-unequip.png new file mode 100644 index 00000000..72767db8 Binary files /dev/null and b/KhTracker/Images/HashIcons/ability-unequip.png differ diff --git a/KhTracker/Images/HashIcons/accessory.png b/KhTracker/Images/HashIcons/accessory.png new file mode 100644 index 00000000..19e1cc26 Binary files /dev/null and b/KhTracker/Images/HashIcons/accessory.png differ diff --git a/KhTracker/Images/HashIcons/ai-mode-frequent.png b/KhTracker/Images/HashIcons/ai-mode-frequent.png new file mode 100644 index 00000000..466f5a8e Binary files /dev/null and b/KhTracker/Images/HashIcons/ai-mode-frequent.png differ diff --git a/KhTracker/Images/HashIcons/ai-mode-moderate.png b/KhTracker/Images/HashIcons/ai-mode-moderate.png new file mode 100644 index 00000000..6fcc32d4 Binary files /dev/null and b/KhTracker/Images/HashIcons/ai-mode-moderate.png differ diff --git a/KhTracker/Images/HashIcons/ai-mode-rare.png b/KhTracker/Images/HashIcons/ai-mode-rare.png new file mode 100644 index 00000000..a5df6c55 Binary files /dev/null and b/KhTracker/Images/HashIcons/ai-mode-rare.png differ diff --git a/KhTracker/Images/HashIcons/ai-settings.png b/KhTracker/Images/HashIcons/ai-settings.png new file mode 100644 index 00000000..be0f1f21 Binary files /dev/null and b/KhTracker/Images/HashIcons/ai-settings.png differ diff --git a/KhTracker/Images/HashIcons/armor.png b/KhTracker/Images/HashIcons/armor.png new file mode 100644 index 00000000..bf7172ba Binary files /dev/null and b/KhTracker/Images/HashIcons/armor.png differ diff --git a/KhTracker/Images/HashIcons/button-circle.png b/KhTracker/Images/HashIcons/button-circle.png new file mode 100644 index 00000000..f2689e4d Binary files /dev/null and b/KhTracker/Images/HashIcons/button-circle.png differ diff --git a/KhTracker/Images/HashIcons/button-cross.png b/KhTracker/Images/HashIcons/button-cross.png new file mode 100644 index 00000000..8369e3ff Binary files /dev/null and b/KhTracker/Images/HashIcons/button-cross.png differ diff --git a/KhTracker/Images/HashIcons/button-l1.png b/KhTracker/Images/HashIcons/button-l1.png new file mode 100644 index 00000000..4d6b8ec8 Binary files /dev/null and b/KhTracker/Images/HashIcons/button-l1.png differ diff --git a/KhTracker/Images/HashIcons/button-l2.png b/KhTracker/Images/HashIcons/button-l2.png new file mode 100644 index 00000000..2d6a13c5 Binary files /dev/null and b/KhTracker/Images/HashIcons/button-l2.png differ diff --git a/KhTracker/Images/HashIcons/button-r1.png b/KhTracker/Images/HashIcons/button-r1.png new file mode 100644 index 00000000..1c46fd2d Binary files /dev/null and b/KhTracker/Images/HashIcons/button-r1.png differ diff --git a/KhTracker/Images/HashIcons/button-r2.png b/KhTracker/Images/HashIcons/button-r2.png new file mode 100644 index 00000000..e4225d4d Binary files /dev/null and b/KhTracker/Images/HashIcons/button-r2.png differ diff --git a/KhTracker/Images/HashIcons/button-square.png b/KhTracker/Images/HashIcons/button-square.png new file mode 100644 index 00000000..01f70d04 Binary files /dev/null and b/KhTracker/Images/HashIcons/button-square.png differ diff --git a/KhTracker/Images/HashIcons/button-triangle.png b/KhTracker/Images/HashIcons/button-triangle.png new file mode 100644 index 00000000..a3dc4077 Binary files /dev/null and b/KhTracker/Images/HashIcons/button-triangle.png differ diff --git a/KhTracker/Images/HashIcons/exclamation-mark.png b/KhTracker/Images/HashIcons/exclamation-mark.png new file mode 100644 index 00000000..e4d0cb27 Binary files /dev/null and b/KhTracker/Images/HashIcons/exclamation-mark.png differ diff --git a/KhTracker/Images/HashIcons/form.png b/KhTracker/Images/HashIcons/form.png new file mode 100644 index 00000000..fd3f5f8d Binary files /dev/null and b/KhTracker/Images/HashIcons/form.png differ diff --git a/KhTracker/Images/HashIcons/gumi-block.png b/KhTracker/Images/HashIcons/gumi-block.png new file mode 100644 index 00000000..b072de14 Binary files /dev/null and b/KhTracker/Images/HashIcons/gumi-block.png differ diff --git a/KhTracker/Images/HashIcons/gumi-blueprint.png b/KhTracker/Images/HashIcons/gumi-blueprint.png new file mode 100644 index 00000000..308652ad Binary files /dev/null and b/KhTracker/Images/HashIcons/gumi-blueprint.png differ diff --git a/KhTracker/Images/HashIcons/gumi-brush.png b/KhTracker/Images/HashIcons/gumi-brush.png new file mode 100644 index 00000000..308c2d6f Binary files /dev/null and b/KhTracker/Images/HashIcons/gumi-brush.png differ diff --git a/KhTracker/Images/HashIcons/gumi-gear.png b/KhTracker/Images/HashIcons/gumi-gear.png new file mode 100644 index 00000000..13f41a5a Binary files /dev/null and b/KhTracker/Images/HashIcons/gumi-gear.png differ diff --git a/KhTracker/Images/HashIcons/gumi-ship.png b/KhTracker/Images/HashIcons/gumi-ship.png new file mode 100644 index 00000000..2a134f88 Binary files /dev/null and b/KhTracker/Images/HashIcons/gumi-ship.png differ diff --git a/KhTracker/Images/HashIcons/item-consumable.png b/KhTracker/Images/HashIcons/item-consumable.png new file mode 100644 index 00000000..a5720c4b Binary files /dev/null and b/KhTracker/Images/HashIcons/item-consumable.png differ diff --git a/KhTracker/Images/HashIcons/item-key.png b/KhTracker/Images/HashIcons/item-key.png new file mode 100644 index 00000000..d30fb531 Binary files /dev/null and b/KhTracker/Images/HashIcons/item-key.png differ diff --git a/KhTracker/Images/HashIcons/item-tent.png b/KhTracker/Images/HashIcons/item-tent.png new file mode 100644 index 00000000..7ba4d004 Binary files /dev/null and b/KhTracker/Images/HashIcons/item-tent.png differ diff --git a/KhTracker/Images/HashIcons/magic.png b/KhTracker/Images/HashIcons/magic.png new file mode 100644 index 00000000..a2a2cc46 Binary files /dev/null and b/KhTracker/Images/HashIcons/magic.png differ diff --git a/KhTracker/Images/HashIcons/material.png b/KhTracker/Images/HashIcons/material.png new file mode 100644 index 00000000..d12f9c5d Binary files /dev/null and b/KhTracker/Images/HashIcons/material.png differ diff --git a/KhTracker/Images/HashIcons/party.png b/KhTracker/Images/HashIcons/party.png new file mode 100644 index 00000000..4b6724cb Binary files /dev/null and b/KhTracker/Images/HashIcons/party.png differ diff --git a/KhTracker/Images/HashIcons/question-mark.png b/KhTracker/Images/HashIcons/question-mark.png new file mode 100644 index 00000000..fc1c6dd9 Binary files /dev/null and b/KhTracker/Images/HashIcons/question-mark.png differ diff --git a/KhTracker/Images/HashIcons/rank-a.png b/KhTracker/Images/HashIcons/rank-a.png new file mode 100644 index 00000000..f60f4086 Binary files /dev/null and b/KhTracker/Images/HashIcons/rank-a.png differ diff --git a/KhTracker/Images/HashIcons/rank-b.png b/KhTracker/Images/HashIcons/rank-b.png new file mode 100644 index 00000000..ae897f3c Binary files /dev/null and b/KhTracker/Images/HashIcons/rank-b.png differ diff --git a/KhTracker/Images/HashIcons/rank-c.png b/KhTracker/Images/HashIcons/rank-c.png new file mode 100644 index 00000000..9f53bdf6 Binary files /dev/null and b/KhTracker/Images/HashIcons/rank-c.png differ diff --git a/KhTracker/Images/HashIcons/rank-s.png b/KhTracker/Images/HashIcons/rank-s.png new file mode 100644 index 00000000..b0cf5a2b Binary files /dev/null and b/KhTracker/Images/HashIcons/rank-s.png differ diff --git a/KhTracker/Images/HashIcons/weapon-keyblade.png b/KhTracker/Images/HashIcons/weapon-keyblade.png new file mode 100644 index 00000000..47045a14 Binary files /dev/null and b/KhTracker/Images/HashIcons/weapon-keyblade.png differ diff --git a/KhTracker/Images/HashIcons/weapon-shield.png b/KhTracker/Images/HashIcons/weapon-shield.png new file mode 100644 index 00000000..9876a71d Binary files /dev/null and b/KhTracker/Images/HashIcons/weapon-shield.png differ diff --git a/KhTracker/Images/HashIcons/weapon-staff.png b/KhTracker/Images/HashIcons/weapon-staff.png new file mode 100644 index 00000000..4655155b Binary files /dev/null and b/KhTracker/Images/HashIcons/weapon-staff.png differ diff --git a/KhTracker/Images/Numbers/0.png b/KhTracker/Images/Numbers/0.png deleted file mode 100644 index ce67cd3a..00000000 Binary files a/KhTracker/Images/Numbers/0.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/1.png b/KhTracker/Images/Numbers/1.png deleted file mode 100644 index 385f1541..00000000 Binary files a/KhTracker/Images/Numbers/1.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/10.png b/KhTracker/Images/Numbers/10.png deleted file mode 100644 index 4541b5f8..00000000 Binary files a/KhTracker/Images/Numbers/10.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/11.png b/KhTracker/Images/Numbers/11.png deleted file mode 100644 index af719097..00000000 Binary files a/KhTracker/Images/Numbers/11.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/12.png b/KhTracker/Images/Numbers/12.png deleted file mode 100644 index 2576b177..00000000 Binary files a/KhTracker/Images/Numbers/12.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/13.png b/KhTracker/Images/Numbers/13.png deleted file mode 100644 index e3133d37..00000000 Binary files a/KhTracker/Images/Numbers/13.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/14.png b/KhTracker/Images/Numbers/14.png deleted file mode 100644 index 3aecc7ea..00000000 Binary files a/KhTracker/Images/Numbers/14.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/15.png b/KhTracker/Images/Numbers/15.png deleted file mode 100644 index bb4c9b9e..00000000 Binary files a/KhTracker/Images/Numbers/15.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/16.png b/KhTracker/Images/Numbers/16.png deleted file mode 100644 index b4c139ad..00000000 Binary files a/KhTracker/Images/Numbers/16.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/17.png b/KhTracker/Images/Numbers/17.png deleted file mode 100644 index be502a7b..00000000 Binary files a/KhTracker/Images/Numbers/17.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/18.png b/KhTracker/Images/Numbers/18.png deleted file mode 100644 index c41d5400..00000000 Binary files a/KhTracker/Images/Numbers/18.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/19.png b/KhTracker/Images/Numbers/19.png deleted file mode 100644 index 7cd0885b..00000000 Binary files a/KhTracker/Images/Numbers/19.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/2.png b/KhTracker/Images/Numbers/2.png deleted file mode 100644 index 84a8639e..00000000 Binary files a/KhTracker/Images/Numbers/2.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/20.png b/KhTracker/Images/Numbers/20.png deleted file mode 100644 index 3473679d..00000000 Binary files a/KhTracker/Images/Numbers/20.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/21.png b/KhTracker/Images/Numbers/21.png deleted file mode 100644 index 4d2fea36..00000000 Binary files a/KhTracker/Images/Numbers/21.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/22.png b/KhTracker/Images/Numbers/22.png deleted file mode 100644 index 5ae99ce5..00000000 Binary files a/KhTracker/Images/Numbers/22.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/23.png b/KhTracker/Images/Numbers/23.png deleted file mode 100644 index 1a01f0e1..00000000 Binary files a/KhTracker/Images/Numbers/23.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/24.png b/KhTracker/Images/Numbers/24.png deleted file mode 100644 index c13225be..00000000 Binary files a/KhTracker/Images/Numbers/24.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/25.png b/KhTracker/Images/Numbers/25.png deleted file mode 100644 index 6446f2e5..00000000 Binary files a/KhTracker/Images/Numbers/25.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/26.png b/KhTracker/Images/Numbers/26.png deleted file mode 100644 index 4363fd39..00000000 Binary files a/KhTracker/Images/Numbers/26.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/27.png b/KhTracker/Images/Numbers/27.png deleted file mode 100644 index bf15d0e7..00000000 Binary files a/KhTracker/Images/Numbers/27.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/28.png b/KhTracker/Images/Numbers/28.png deleted file mode 100644 index 86da69b2..00000000 Binary files a/KhTracker/Images/Numbers/28.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/29.png b/KhTracker/Images/Numbers/29.png deleted file mode 100644 index e005ce88..00000000 Binary files a/KhTracker/Images/Numbers/29.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/3.png b/KhTracker/Images/Numbers/3.png deleted file mode 100644 index 666757f8..00000000 Binary files a/KhTracker/Images/Numbers/3.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/30.png b/KhTracker/Images/Numbers/30.png deleted file mode 100644 index 4c2c18af..00000000 Binary files a/KhTracker/Images/Numbers/30.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/31.png b/KhTracker/Images/Numbers/31.png deleted file mode 100644 index 9f8a1179..00000000 Binary files a/KhTracker/Images/Numbers/31.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/32.png b/KhTracker/Images/Numbers/32.png deleted file mode 100644 index e0be1c1f..00000000 Binary files a/KhTracker/Images/Numbers/32.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/33.png b/KhTracker/Images/Numbers/33.png deleted file mode 100644 index ebaa88ba..00000000 Binary files a/KhTracker/Images/Numbers/33.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/34.png b/KhTracker/Images/Numbers/34.png deleted file mode 100644 index 1ada17d3..00000000 Binary files a/KhTracker/Images/Numbers/34.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/35.png b/KhTracker/Images/Numbers/35.png deleted file mode 100644 index 8efac90c..00000000 Binary files a/KhTracker/Images/Numbers/35.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/36.png b/KhTracker/Images/Numbers/36.png deleted file mode 100644 index b74de178..00000000 Binary files a/KhTracker/Images/Numbers/36.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/37.png b/KhTracker/Images/Numbers/37.png deleted file mode 100644 index 288b3a32..00000000 Binary files a/KhTracker/Images/Numbers/37.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/38.png b/KhTracker/Images/Numbers/38.png deleted file mode 100644 index 93cc990a..00000000 Binary files a/KhTracker/Images/Numbers/38.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/39.png b/KhTracker/Images/Numbers/39.png deleted file mode 100644 index d4550429..00000000 Binary files a/KhTracker/Images/Numbers/39.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/4.png b/KhTracker/Images/Numbers/4.png deleted file mode 100644 index 8a519164..00000000 Binary files a/KhTracker/Images/Numbers/4.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/40.png b/KhTracker/Images/Numbers/40.png deleted file mode 100644 index d40d5240..00000000 Binary files a/KhTracker/Images/Numbers/40.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/41.png b/KhTracker/Images/Numbers/41.png deleted file mode 100644 index c6f64d8a..00000000 Binary files a/KhTracker/Images/Numbers/41.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/42.png b/KhTracker/Images/Numbers/42.png deleted file mode 100644 index cff522cd..00000000 Binary files a/KhTracker/Images/Numbers/42.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/43.png b/KhTracker/Images/Numbers/43.png deleted file mode 100644 index cdfc744c..00000000 Binary files a/KhTracker/Images/Numbers/43.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/44.png b/KhTracker/Images/Numbers/44.png deleted file mode 100644 index c44bff2e..00000000 Binary files a/KhTracker/Images/Numbers/44.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/45.png b/KhTracker/Images/Numbers/45.png deleted file mode 100644 index 89af6fc6..00000000 Binary files a/KhTracker/Images/Numbers/45.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/46.png b/KhTracker/Images/Numbers/46.png deleted file mode 100644 index ee754dfb..00000000 Binary files a/KhTracker/Images/Numbers/46.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/47.png b/KhTracker/Images/Numbers/47.png deleted file mode 100644 index 74c84e27..00000000 Binary files a/KhTracker/Images/Numbers/47.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/48.png b/KhTracker/Images/Numbers/48.png deleted file mode 100644 index ffc35921..00000000 Binary files a/KhTracker/Images/Numbers/48.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/49.png b/KhTracker/Images/Numbers/49.png deleted file mode 100644 index df8eb39e..00000000 Binary files a/KhTracker/Images/Numbers/49.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/5.png b/KhTracker/Images/Numbers/5.png deleted file mode 100644 index a9b059e9..00000000 Binary files a/KhTracker/Images/Numbers/5.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/50.png b/KhTracker/Images/Numbers/50.png deleted file mode 100644 index b2fdcdef..00000000 Binary files a/KhTracker/Images/Numbers/50.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/51.png b/KhTracker/Images/Numbers/51.png deleted file mode 100644 index 9521be34..00000000 Binary files a/KhTracker/Images/Numbers/51.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/52.png b/KhTracker/Images/Numbers/52.png deleted file mode 100644 index 081d3e86..00000000 Binary files a/KhTracker/Images/Numbers/52.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/53.png b/KhTracker/Images/Numbers/53.png deleted file mode 100644 index ebda9544..00000000 Binary files a/KhTracker/Images/Numbers/53.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/54.png b/KhTracker/Images/Numbers/54.png deleted file mode 100644 index 56f9daeb..00000000 Binary files a/KhTracker/Images/Numbers/54.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/55.png b/KhTracker/Images/Numbers/55.png deleted file mode 100644 index 0c3f24a9..00000000 Binary files a/KhTracker/Images/Numbers/55.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/56.png b/KhTracker/Images/Numbers/56.png deleted file mode 100644 index 4e47546e..00000000 Binary files a/KhTracker/Images/Numbers/56.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/57.png b/KhTracker/Images/Numbers/57.png deleted file mode 100644 index f45c6736..00000000 Binary files a/KhTracker/Images/Numbers/57.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/58.png b/KhTracker/Images/Numbers/58.png deleted file mode 100644 index a4b72854..00000000 Binary files a/KhTracker/Images/Numbers/58.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/59.png b/KhTracker/Images/Numbers/59.png deleted file mode 100644 index 9b065c3d..00000000 Binary files a/KhTracker/Images/Numbers/59.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/6.png b/KhTracker/Images/Numbers/6.png deleted file mode 100644 index efa10838..00000000 Binary files a/KhTracker/Images/Numbers/6.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/60.png b/KhTracker/Images/Numbers/60.png deleted file mode 100644 index 74e8b5de..00000000 Binary files a/KhTracker/Images/Numbers/60.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/61.png b/KhTracker/Images/Numbers/61.png deleted file mode 100644 index ee8f8150..00000000 Binary files a/KhTracker/Images/Numbers/61.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/62.png b/KhTracker/Images/Numbers/62.png deleted file mode 100644 index e4a5c2ec..00000000 Binary files a/KhTracker/Images/Numbers/62.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/63.png b/KhTracker/Images/Numbers/63.png deleted file mode 100644 index 2d470035..00000000 Binary files a/KhTracker/Images/Numbers/63.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/64.png b/KhTracker/Images/Numbers/64.png deleted file mode 100644 index 7ae410e0..00000000 Binary files a/KhTracker/Images/Numbers/64.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/65.png b/KhTracker/Images/Numbers/65.png deleted file mode 100644 index d4ffe628..00000000 Binary files a/KhTracker/Images/Numbers/65.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/66.png b/KhTracker/Images/Numbers/66.png deleted file mode 100644 index 97b991ff..00000000 Binary files a/KhTracker/Images/Numbers/66.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/67.png b/KhTracker/Images/Numbers/67.png deleted file mode 100644 index d2ec18c3..00000000 Binary files a/KhTracker/Images/Numbers/67.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/68.png b/KhTracker/Images/Numbers/68.png deleted file mode 100644 index 0edb2b98..00000000 Binary files a/KhTracker/Images/Numbers/68.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/69.png b/KhTracker/Images/Numbers/69.png deleted file mode 100644 index af649445..00000000 Binary files a/KhTracker/Images/Numbers/69.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/7.png b/KhTracker/Images/Numbers/7.png deleted file mode 100644 index 551aaa15..00000000 Binary files a/KhTracker/Images/Numbers/7.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/70.png b/KhTracker/Images/Numbers/70.png deleted file mode 100644 index 341d14a3..00000000 Binary files a/KhTracker/Images/Numbers/70.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/71.png b/KhTracker/Images/Numbers/71.png deleted file mode 100644 index f44ad064..00000000 Binary files a/KhTracker/Images/Numbers/71.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/72.png b/KhTracker/Images/Numbers/72.png deleted file mode 100644 index db1d6fa7..00000000 Binary files a/KhTracker/Images/Numbers/72.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/73.png b/KhTracker/Images/Numbers/73.png deleted file mode 100644 index 63dece8a..00000000 Binary files a/KhTracker/Images/Numbers/73.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/74.png b/KhTracker/Images/Numbers/74.png deleted file mode 100644 index 32a7519f..00000000 Binary files a/KhTracker/Images/Numbers/74.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/75.png b/KhTracker/Images/Numbers/75.png deleted file mode 100644 index ce9d9578..00000000 Binary files a/KhTracker/Images/Numbers/75.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/76.png b/KhTracker/Images/Numbers/76.png deleted file mode 100644 index 7f613d12..00000000 Binary files a/KhTracker/Images/Numbers/76.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/77.png b/KhTracker/Images/Numbers/77.png deleted file mode 100644 index dfc213d5..00000000 Binary files a/KhTracker/Images/Numbers/77.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/78.png b/KhTracker/Images/Numbers/78.png deleted file mode 100644 index ac492ea6..00000000 Binary files a/KhTracker/Images/Numbers/78.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/79.png b/KhTracker/Images/Numbers/79.png deleted file mode 100644 index d4ac9069..00000000 Binary files a/KhTracker/Images/Numbers/79.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/8.png b/KhTracker/Images/Numbers/8.png deleted file mode 100644 index d545b0b2..00000000 Binary files a/KhTracker/Images/Numbers/8.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/80.png b/KhTracker/Images/Numbers/80.png deleted file mode 100644 index 8332899a..00000000 Binary files a/KhTracker/Images/Numbers/80.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/81.png b/KhTracker/Images/Numbers/81.png deleted file mode 100644 index 60e58ec4..00000000 Binary files a/KhTracker/Images/Numbers/81.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/82.png b/KhTracker/Images/Numbers/82.png deleted file mode 100644 index a2452572..00000000 Binary files a/KhTracker/Images/Numbers/82.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/83.png b/KhTracker/Images/Numbers/83.png deleted file mode 100644 index 4038e4f7..00000000 Binary files a/KhTracker/Images/Numbers/83.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/84.png b/KhTracker/Images/Numbers/84.png deleted file mode 100644 index b9bd8911..00000000 Binary files a/KhTracker/Images/Numbers/84.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/85.png b/KhTracker/Images/Numbers/85.png deleted file mode 100644 index fbf2a0b3..00000000 Binary files a/KhTracker/Images/Numbers/85.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/86.png b/KhTracker/Images/Numbers/86.png deleted file mode 100644 index 396e2477..00000000 Binary files a/KhTracker/Images/Numbers/86.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/87.png b/KhTracker/Images/Numbers/87.png deleted file mode 100644 index 1eb3520a..00000000 Binary files a/KhTracker/Images/Numbers/87.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/88.png b/KhTracker/Images/Numbers/88.png deleted file mode 100644 index c7b331b2..00000000 Binary files a/KhTracker/Images/Numbers/88.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/89.png b/KhTracker/Images/Numbers/89.png deleted file mode 100644 index 5be833c3..00000000 Binary files a/KhTracker/Images/Numbers/89.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/9.png b/KhTracker/Images/Numbers/9.png deleted file mode 100644 index 554a1990..00000000 Binary files a/KhTracker/Images/Numbers/9.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/90.png b/KhTracker/Images/Numbers/90.png deleted file mode 100644 index c10050b4..00000000 Binary files a/KhTracker/Images/Numbers/90.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/91.png b/KhTracker/Images/Numbers/91.png deleted file mode 100644 index 42481b99..00000000 Binary files a/KhTracker/Images/Numbers/91.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/92.png b/KhTracker/Images/Numbers/92.png deleted file mode 100644 index b1ea2ffd..00000000 Binary files a/KhTracker/Images/Numbers/92.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/93.png b/KhTracker/Images/Numbers/93.png deleted file mode 100644 index b9b579fc..00000000 Binary files a/KhTracker/Images/Numbers/93.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/94.png b/KhTracker/Images/Numbers/94.png deleted file mode 100644 index 71892591..00000000 Binary files a/KhTracker/Images/Numbers/94.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/95.png b/KhTracker/Images/Numbers/95.png deleted file mode 100644 index 27e56cd2..00000000 Binary files a/KhTracker/Images/Numbers/95.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/96.png b/KhTracker/Images/Numbers/96.png deleted file mode 100644 index 4133ecef..00000000 Binary files a/KhTracker/Images/Numbers/96.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/97.png b/KhTracker/Images/Numbers/97.png deleted file mode 100644 index 6b6525d4..00000000 Binary files a/KhTracker/Images/Numbers/97.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/98.png b/KhTracker/Images/Numbers/98.png deleted file mode 100644 index b60df968..00000000 Binary files a/KhTracker/Images/Numbers/98.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/99.png b/KhTracker/Images/Numbers/99.png deleted file mode 100644 index 2b379cb6..00000000 Binary files a/KhTracker/Images/Numbers/99.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/QuestionMark.png b/KhTracker/Images/Numbers/QuestionMark.png deleted file mode 100644 index e7c4a271..00000000 Binary files a/KhTracker/Images/Numbers/QuestionMark.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_0.png b/KhTracker/Images/Numbers/_0.png deleted file mode 100644 index 503450ce..00000000 Binary files a/KhTracker/Images/Numbers/_0.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_1.png b/KhTracker/Images/Numbers/_1.png deleted file mode 100644 index 8e74471f..00000000 Binary files a/KhTracker/Images/Numbers/_1.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_2.png b/KhTracker/Images/Numbers/_2.png deleted file mode 100644 index 8cdb27b5..00000000 Binary files a/KhTracker/Images/Numbers/_2.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_3.png b/KhTracker/Images/Numbers/_3.png deleted file mode 100644 index 84315c28..00000000 Binary files a/KhTracker/Images/Numbers/_3.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_4.png b/KhTracker/Images/Numbers/_4.png deleted file mode 100644 index 0d055bb7..00000000 Binary files a/KhTracker/Images/Numbers/_4.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_5.png b/KhTracker/Images/Numbers/_5.png deleted file mode 100644 index 45c14a28..00000000 Binary files a/KhTracker/Images/Numbers/_5.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_6.png b/KhTracker/Images/Numbers/_6.png deleted file mode 100644 index 450e1cab..00000000 Binary files a/KhTracker/Images/Numbers/_6.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_7.png b/KhTracker/Images/Numbers/_7.png deleted file mode 100644 index ad312b61..00000000 Binary files a/KhTracker/Images/Numbers/_7.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_8.png b/KhTracker/Images/Numbers/_8.png deleted file mode 100644 index 7d1722c4..00000000 Binary files a/KhTracker/Images/Numbers/_8.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_9.png b/KhTracker/Images/Numbers/_9.png deleted file mode 100644 index bafb6c93..00000000 Binary files a/KhTracker/Images/Numbers/_9.png and /dev/null differ diff --git a/KhTracker/Images/Numbers/_QuestionMark.png b/KhTracker/Images/Numbers/_QuestionMark.png deleted file mode 100644 index 6b2b9996..00000000 Binary files a/KhTracker/Images/Numbers/_QuestionMark.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/0.png b/KhTracker/Images/NumbersBlue/0.png deleted file mode 100644 index 5a8f9e3b..00000000 Binary files a/KhTracker/Images/NumbersBlue/0.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/1.png b/KhTracker/Images/NumbersBlue/1.png deleted file mode 100644 index 6038a5b8..00000000 Binary files a/KhTracker/Images/NumbersBlue/1.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/10.png b/KhTracker/Images/NumbersBlue/10.png deleted file mode 100644 index 9f163bc8..00000000 Binary files a/KhTracker/Images/NumbersBlue/10.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/11.png b/KhTracker/Images/NumbersBlue/11.png deleted file mode 100644 index 63691da8..00000000 Binary files a/KhTracker/Images/NumbersBlue/11.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/12.png b/KhTracker/Images/NumbersBlue/12.png deleted file mode 100644 index d0bdc166..00000000 Binary files a/KhTracker/Images/NumbersBlue/12.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/13.png b/KhTracker/Images/NumbersBlue/13.png deleted file mode 100644 index 2d53e3df..00000000 Binary files a/KhTracker/Images/NumbersBlue/13.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/14.png b/KhTracker/Images/NumbersBlue/14.png deleted file mode 100644 index 95d58a93..00000000 Binary files a/KhTracker/Images/NumbersBlue/14.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/15.png b/KhTracker/Images/NumbersBlue/15.png deleted file mode 100644 index c802186d..00000000 Binary files a/KhTracker/Images/NumbersBlue/15.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/16.png b/KhTracker/Images/NumbersBlue/16.png deleted file mode 100644 index 02b647f9..00000000 Binary files a/KhTracker/Images/NumbersBlue/16.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/17.png b/KhTracker/Images/NumbersBlue/17.png deleted file mode 100644 index 3a233d09..00000000 Binary files a/KhTracker/Images/NumbersBlue/17.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/18.png b/KhTracker/Images/NumbersBlue/18.png deleted file mode 100644 index ba590003..00000000 Binary files a/KhTracker/Images/NumbersBlue/18.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/19.png b/KhTracker/Images/NumbersBlue/19.png deleted file mode 100644 index c1b06b86..00000000 Binary files a/KhTracker/Images/NumbersBlue/19.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/2.png b/KhTracker/Images/NumbersBlue/2.png deleted file mode 100644 index 4fdf331c..00000000 Binary files a/KhTracker/Images/NumbersBlue/2.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/20.png b/KhTracker/Images/NumbersBlue/20.png deleted file mode 100644 index f4e91dd4..00000000 Binary files a/KhTracker/Images/NumbersBlue/20.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/21.png b/KhTracker/Images/NumbersBlue/21.png deleted file mode 100644 index cc41e1b0..00000000 Binary files a/KhTracker/Images/NumbersBlue/21.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/22.png b/KhTracker/Images/NumbersBlue/22.png deleted file mode 100644 index 455dcf43..00000000 Binary files a/KhTracker/Images/NumbersBlue/22.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/23.png b/KhTracker/Images/NumbersBlue/23.png deleted file mode 100644 index 2771a9d5..00000000 Binary files a/KhTracker/Images/NumbersBlue/23.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/24.png b/KhTracker/Images/NumbersBlue/24.png deleted file mode 100644 index 6f55f94d..00000000 Binary files a/KhTracker/Images/NumbersBlue/24.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/25.png b/KhTracker/Images/NumbersBlue/25.png deleted file mode 100644 index 855773e5..00000000 Binary files a/KhTracker/Images/NumbersBlue/25.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/26.png b/KhTracker/Images/NumbersBlue/26.png deleted file mode 100644 index 47032964..00000000 Binary files a/KhTracker/Images/NumbersBlue/26.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/27.png b/KhTracker/Images/NumbersBlue/27.png deleted file mode 100644 index b34e21bd..00000000 Binary files a/KhTracker/Images/NumbersBlue/27.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/28.png b/KhTracker/Images/NumbersBlue/28.png deleted file mode 100644 index d74f1c61..00000000 Binary files a/KhTracker/Images/NumbersBlue/28.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/29.png b/KhTracker/Images/NumbersBlue/29.png deleted file mode 100644 index a34bbcac..00000000 Binary files a/KhTracker/Images/NumbersBlue/29.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/3.png b/KhTracker/Images/NumbersBlue/3.png deleted file mode 100644 index 682c01fc..00000000 Binary files a/KhTracker/Images/NumbersBlue/3.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/30.png b/KhTracker/Images/NumbersBlue/30.png deleted file mode 100644 index baa6a4dc..00000000 Binary files a/KhTracker/Images/NumbersBlue/30.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/31.png b/KhTracker/Images/NumbersBlue/31.png deleted file mode 100644 index 7c4bb949..00000000 Binary files a/KhTracker/Images/NumbersBlue/31.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/32.png b/KhTracker/Images/NumbersBlue/32.png deleted file mode 100644 index 93f813c4..00000000 Binary files a/KhTracker/Images/NumbersBlue/32.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/33.png b/KhTracker/Images/NumbersBlue/33.png deleted file mode 100644 index f6b4ad56..00000000 Binary files a/KhTracker/Images/NumbersBlue/33.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/34.png b/KhTracker/Images/NumbersBlue/34.png deleted file mode 100644 index ab519ea3..00000000 Binary files a/KhTracker/Images/NumbersBlue/34.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/35.png b/KhTracker/Images/NumbersBlue/35.png deleted file mode 100644 index a801f233..00000000 Binary files a/KhTracker/Images/NumbersBlue/35.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/36.png b/KhTracker/Images/NumbersBlue/36.png deleted file mode 100644 index 800647ab..00000000 Binary files a/KhTracker/Images/NumbersBlue/36.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/37.png b/KhTracker/Images/NumbersBlue/37.png deleted file mode 100644 index 5070c444..00000000 Binary files a/KhTracker/Images/NumbersBlue/37.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/38.png b/KhTracker/Images/NumbersBlue/38.png deleted file mode 100644 index 6b43ac93..00000000 Binary files a/KhTracker/Images/NumbersBlue/38.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/39.png b/KhTracker/Images/NumbersBlue/39.png deleted file mode 100644 index 38890e4f..00000000 Binary files a/KhTracker/Images/NumbersBlue/39.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/4.png b/KhTracker/Images/NumbersBlue/4.png deleted file mode 100644 index bd4062bd..00000000 Binary files a/KhTracker/Images/NumbersBlue/4.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/40.png b/KhTracker/Images/NumbersBlue/40.png deleted file mode 100644 index e200808e..00000000 Binary files a/KhTracker/Images/NumbersBlue/40.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/41.png b/KhTracker/Images/NumbersBlue/41.png deleted file mode 100644 index 670d1e46..00000000 Binary files a/KhTracker/Images/NumbersBlue/41.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/42.png b/KhTracker/Images/NumbersBlue/42.png deleted file mode 100644 index 4c414155..00000000 Binary files a/KhTracker/Images/NumbersBlue/42.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/43.png b/KhTracker/Images/NumbersBlue/43.png deleted file mode 100644 index a5d7411b..00000000 Binary files a/KhTracker/Images/NumbersBlue/43.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/44.png b/KhTracker/Images/NumbersBlue/44.png deleted file mode 100644 index 83176a44..00000000 Binary files a/KhTracker/Images/NumbersBlue/44.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/45.png b/KhTracker/Images/NumbersBlue/45.png deleted file mode 100644 index 6e7b34fe..00000000 Binary files a/KhTracker/Images/NumbersBlue/45.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/46.png b/KhTracker/Images/NumbersBlue/46.png deleted file mode 100644 index c3553d9a..00000000 Binary files a/KhTracker/Images/NumbersBlue/46.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/47.png b/KhTracker/Images/NumbersBlue/47.png deleted file mode 100644 index 43385df2..00000000 Binary files a/KhTracker/Images/NumbersBlue/47.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/48.png b/KhTracker/Images/NumbersBlue/48.png deleted file mode 100644 index 9d7f6026..00000000 Binary files a/KhTracker/Images/NumbersBlue/48.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/49.png b/KhTracker/Images/NumbersBlue/49.png deleted file mode 100644 index f1cb01b2..00000000 Binary files a/KhTracker/Images/NumbersBlue/49.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/5.png b/KhTracker/Images/NumbersBlue/5.png deleted file mode 100644 index 25889641..00000000 Binary files a/KhTracker/Images/NumbersBlue/5.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/50.png b/KhTracker/Images/NumbersBlue/50.png deleted file mode 100644 index afd3ec30..00000000 Binary files a/KhTracker/Images/NumbersBlue/50.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/51.png b/KhTracker/Images/NumbersBlue/51.png deleted file mode 100644 index 7f7c0e12..00000000 Binary files a/KhTracker/Images/NumbersBlue/51.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/52.png b/KhTracker/Images/NumbersBlue/52.png deleted file mode 100644 index 21068706..00000000 Binary files a/KhTracker/Images/NumbersBlue/52.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/53.png b/KhTracker/Images/NumbersBlue/53.png deleted file mode 100644 index d427db58..00000000 Binary files a/KhTracker/Images/NumbersBlue/53.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/54.png b/KhTracker/Images/NumbersBlue/54.png deleted file mode 100644 index be68a22f..00000000 Binary files a/KhTracker/Images/NumbersBlue/54.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/55.png b/KhTracker/Images/NumbersBlue/55.png deleted file mode 100644 index 048a8da1..00000000 Binary files a/KhTracker/Images/NumbersBlue/55.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/56.png b/KhTracker/Images/NumbersBlue/56.png deleted file mode 100644 index 15d25753..00000000 Binary files a/KhTracker/Images/NumbersBlue/56.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/57.png b/KhTracker/Images/NumbersBlue/57.png deleted file mode 100644 index 7b5a3007..00000000 Binary files a/KhTracker/Images/NumbersBlue/57.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/58.png b/KhTracker/Images/NumbersBlue/58.png deleted file mode 100644 index 0e3f15ae..00000000 Binary files a/KhTracker/Images/NumbersBlue/58.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/59.png b/KhTracker/Images/NumbersBlue/59.png deleted file mode 100644 index fab4d83e..00000000 Binary files a/KhTracker/Images/NumbersBlue/59.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/6.png b/KhTracker/Images/NumbersBlue/6.png deleted file mode 100644 index db75309a..00000000 Binary files a/KhTracker/Images/NumbersBlue/6.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/60.png b/KhTracker/Images/NumbersBlue/60.png deleted file mode 100644 index b3874912..00000000 Binary files a/KhTracker/Images/NumbersBlue/60.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/61.png b/KhTracker/Images/NumbersBlue/61.png deleted file mode 100644 index f242abee..00000000 Binary files a/KhTracker/Images/NumbersBlue/61.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/62.png b/KhTracker/Images/NumbersBlue/62.png deleted file mode 100644 index b25488a6..00000000 Binary files a/KhTracker/Images/NumbersBlue/62.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/63.png b/KhTracker/Images/NumbersBlue/63.png deleted file mode 100644 index 39ba8ae0..00000000 Binary files a/KhTracker/Images/NumbersBlue/63.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/64.png b/KhTracker/Images/NumbersBlue/64.png deleted file mode 100644 index 206dc2e4..00000000 Binary files a/KhTracker/Images/NumbersBlue/64.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/65.png b/KhTracker/Images/NumbersBlue/65.png deleted file mode 100644 index 0d1db55b..00000000 Binary files a/KhTracker/Images/NumbersBlue/65.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/66.png b/KhTracker/Images/NumbersBlue/66.png deleted file mode 100644 index 313b5bca..00000000 Binary files a/KhTracker/Images/NumbersBlue/66.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/67.png b/KhTracker/Images/NumbersBlue/67.png deleted file mode 100644 index a8c7ab7a..00000000 Binary files a/KhTracker/Images/NumbersBlue/67.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/68.png b/KhTracker/Images/NumbersBlue/68.png deleted file mode 100644 index 75fdabd1..00000000 Binary files a/KhTracker/Images/NumbersBlue/68.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/69.png b/KhTracker/Images/NumbersBlue/69.png deleted file mode 100644 index fcaf6a4a..00000000 Binary files a/KhTracker/Images/NumbersBlue/69.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/7.png b/KhTracker/Images/NumbersBlue/7.png deleted file mode 100644 index 3e19eebe..00000000 Binary files a/KhTracker/Images/NumbersBlue/7.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/70.png b/KhTracker/Images/NumbersBlue/70.png deleted file mode 100644 index 0221a7de..00000000 Binary files a/KhTracker/Images/NumbersBlue/70.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/8.png b/KhTracker/Images/NumbersBlue/8.png deleted file mode 100644 index 5e20ea91..00000000 Binary files a/KhTracker/Images/NumbersBlue/8.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/9.png b/KhTracker/Images/NumbersBlue/9.png deleted file mode 100644 index 6684c9ee..00000000 Binary files a/KhTracker/Images/NumbersBlue/9.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/QuestionMark.png b/KhTracker/Images/NumbersBlue/QuestionMark.png deleted file mode 100644 index 073de7ba..00000000 Binary files a/KhTracker/Images/NumbersBlue/QuestionMark.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_0.png b/KhTracker/Images/NumbersBlue/_0.png deleted file mode 100644 index fca06f8d..00000000 Binary files a/KhTracker/Images/NumbersBlue/_0.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_1.png b/KhTracker/Images/NumbersBlue/_1.png deleted file mode 100644 index 0c4fa3e3..00000000 Binary files a/KhTracker/Images/NumbersBlue/_1.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_2.png b/KhTracker/Images/NumbersBlue/_2.png deleted file mode 100644 index ae473c0c..00000000 Binary files a/KhTracker/Images/NumbersBlue/_2.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_3.png b/KhTracker/Images/NumbersBlue/_3.png deleted file mode 100644 index 07364c72..00000000 Binary files a/KhTracker/Images/NumbersBlue/_3.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_4.png b/KhTracker/Images/NumbersBlue/_4.png deleted file mode 100644 index e3bd9eb7..00000000 Binary files a/KhTracker/Images/NumbersBlue/_4.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_5.png b/KhTracker/Images/NumbersBlue/_5.png deleted file mode 100644 index 32cfb642..00000000 Binary files a/KhTracker/Images/NumbersBlue/_5.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_6.png b/KhTracker/Images/NumbersBlue/_6.png deleted file mode 100644 index d9cedc6b..00000000 Binary files a/KhTracker/Images/NumbersBlue/_6.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_7.png b/KhTracker/Images/NumbersBlue/_7.png deleted file mode 100644 index 9d98f831..00000000 Binary files a/KhTracker/Images/NumbersBlue/_7.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_8.png b/KhTracker/Images/NumbersBlue/_8.png deleted file mode 100644 index e8893b57..00000000 Binary files a/KhTracker/Images/NumbersBlue/_8.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_9.png b/KhTracker/Images/NumbersBlue/_9.png deleted file mode 100644 index 3596f8a4..00000000 Binary files a/KhTracker/Images/NumbersBlue/_9.png and /dev/null differ diff --git a/KhTracker/Images/NumbersBlue/_QuestionMark.png b/KhTracker/Images/NumbersBlue/_QuestionMark.png deleted file mode 100644 index f79a2b38..00000000 Binary files a/KhTracker/Images/NumbersBlue/_QuestionMark.png and /dev/null differ diff --git a/KhTracker/Images/Old/Spell_Orb.png b/KhTracker/Images/Old/Spell_Orb.png deleted file mode 100644 index 3400e082..00000000 Binary files a/KhTracker/Images/Old/Spell_Orb.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report.png b/KhTracker/Images/Old/ansem_report.png deleted file mode 100644 index 2429746a..00000000 Binary files a/KhTracker/Images/Old/ansem_report.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report1.png b/KhTracker/Images/Old/ansem_report1.png deleted file mode 100644 index 0ad8ff92..00000000 Binary files a/KhTracker/Images/Old/ansem_report1.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report10.png b/KhTracker/Images/Old/ansem_report10.png deleted file mode 100644 index 0027bfe0..00000000 Binary files a/KhTracker/Images/Old/ansem_report10.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report11.png b/KhTracker/Images/Old/ansem_report11.png deleted file mode 100644 index 01e527dd..00000000 Binary files a/KhTracker/Images/Old/ansem_report11.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report12.png b/KhTracker/Images/Old/ansem_report12.png deleted file mode 100644 index 5a50abb2..00000000 Binary files a/KhTracker/Images/Old/ansem_report12.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report13.png b/KhTracker/Images/Old/ansem_report13.png deleted file mode 100644 index fc7c48c0..00000000 Binary files a/KhTracker/Images/Old/ansem_report13.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report2.png b/KhTracker/Images/Old/ansem_report2.png deleted file mode 100644 index 1df62576..00000000 Binary files a/KhTracker/Images/Old/ansem_report2.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report3.png b/KhTracker/Images/Old/ansem_report3.png deleted file mode 100644 index 09c895c4..00000000 Binary files a/KhTracker/Images/Old/ansem_report3.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report4.png b/KhTracker/Images/Old/ansem_report4.png deleted file mode 100644 index 908a0d66..00000000 Binary files a/KhTracker/Images/Old/ansem_report4.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report5.png b/KhTracker/Images/Old/ansem_report5.png deleted file mode 100644 index 54e73287..00000000 Binary files a/KhTracker/Images/Old/ansem_report5.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report6.png b/KhTracker/Images/Old/ansem_report6.png deleted file mode 100644 index baa4167d..00000000 Binary files a/KhTracker/Images/Old/ansem_report6.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report7.png b/KhTracker/Images/Old/ansem_report7.png deleted file mode 100644 index 97d1110c..00000000 Binary files a/KhTracker/Images/Old/ansem_report7.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report8.png b/KhTracker/Images/Old/ansem_report8.png deleted file mode 100644 index c4bce1b5..00000000 Binary files a/KhTracker/Images/Old/ansem_report8.png and /dev/null differ diff --git a/KhTracker/Images/Old/ansem_report9.png b/KhTracker/Images/Old/ansem_report9.png deleted file mode 100644 index 9d996263..00000000 Binary files a/KhTracker/Images/Old/ansem_report9.png and /dev/null differ diff --git a/KhTracker/Images/Old/blizzard.png b/KhTracker/Images/Old/blizzard.png deleted file mode 100644 index 4eadcc64..00000000 Binary files a/KhTracker/Images/Old/blizzard.png and /dev/null differ diff --git a/KhTracker/Images/Old/chicken_little.png b/KhTracker/Images/Old/chicken_little.png deleted file mode 100644 index e3ffc65b..00000000 Binary files a/KhTracker/Images/Old/chicken_little.png and /dev/null differ diff --git a/KhTracker/Images/Old/cure.png b/KhTracker/Images/Old/cure.png deleted file mode 100644 index 5215a2e3..00000000 Binary files a/KhTracker/Images/Old/cure.png and /dev/null differ diff --git a/KhTracker/Images/Old/final.png b/KhTracker/Images/Old/final.png deleted file mode 100644 index 0c90f185..00000000 Binary files a/KhTracker/Images/Old/final.png and /dev/null differ diff --git a/KhTracker/Images/Old/fire.png b/KhTracker/Images/Old/fire.png deleted file mode 100644 index 335e7c01..00000000 Binary files a/KhTracker/Images/Old/fire.png and /dev/null differ diff --git a/KhTracker/Images/Old/genie.png b/KhTracker/Images/Old/genie.png deleted file mode 100644 index 6f021b32..00000000 Binary files a/KhTracker/Images/Old/genie.png and /dev/null differ diff --git a/KhTracker/Images/Old/limit.png b/KhTracker/Images/Old/limit.png deleted file mode 100644 index 9dec4bc0..00000000 Binary files a/KhTracker/Images/Old/limit.png and /dev/null differ diff --git a/KhTracker/Images/Old/magnet.png b/KhTracker/Images/Old/magnet.png deleted file mode 100644 index 21773aa5..00000000 Binary files a/KhTracker/Images/Old/magnet.png and /dev/null differ diff --git a/KhTracker/Images/Old/master.png b/KhTracker/Images/Old/master.png deleted file mode 100644 index 560bf020..00000000 Binary files a/KhTracker/Images/Old/master.png and /dev/null differ diff --git a/KhTracker/Images/Old/peter_pan.png b/KhTracker/Images/Old/peter_pan.png deleted file mode 100644 index da179db6..00000000 Binary files a/KhTracker/Images/Old/peter_pan.png and /dev/null differ diff --git a/KhTracker/Images/Old/promise_charm.png b/KhTracker/Images/Old/promise_charm.png deleted file mode 100644 index 9151506b..00000000 Binary files a/KhTracker/Images/Old/promise_charm.png and /dev/null differ diff --git a/KhTracker/Images/Old/proof_of_connection.png b/KhTracker/Images/Old/proof_of_connection.png deleted file mode 100644 index 335766e3..00000000 Binary files a/KhTracker/Images/Old/proof_of_connection.png and /dev/null differ diff --git a/KhTracker/Images/Old/proof_of_nonexistence.png b/KhTracker/Images/Old/proof_of_nonexistence.png deleted file mode 100644 index 3c85aa25..00000000 Binary files a/KhTracker/Images/Old/proof_of_nonexistence.png and /dev/null differ diff --git a/KhTracker/Images/Old/proof_of_peace.png b/KhTracker/Images/Old/proof_of_peace.png deleted file mode 100644 index a1f06650..00000000 Binary files a/KhTracker/Images/Old/proof_of_peace.png and /dev/null differ diff --git a/KhTracker/Images/Old/reflect.png b/KhTracker/Images/Old/reflect.png deleted file mode 100644 index dad84b9b..00000000 Binary files a/KhTracker/Images/Old/reflect.png and /dev/null differ diff --git a/KhTracker/Images/Old/stitch.png b/KhTracker/Images/Old/stitch.png deleted file mode 100644 index 878536fd..00000000 Binary files a/KhTracker/Images/Old/stitch.png and /dev/null differ diff --git a/KhTracker/Images/Old/thunder.png b/KhTracker/Images/Old/thunder.png deleted file mode 100644 index 87002186..00000000 Binary files a/KhTracker/Images/Old/thunder.png and /dev/null differ diff --git a/KhTracker/Images/Old/torn_page.png b/KhTracker/Images/Old/torn_page.png deleted file mode 100644 index b365f070..00000000 Binary files a/KhTracker/Images/Old/torn_page.png and /dev/null differ diff --git a/KhTracker/Images/Old/valor.png b/KhTracker/Images/Old/valor.png deleted file mode 100644 index a4a2ca2e..00000000 Binary files a/KhTracker/Images/Old/valor.png and /dev/null differ diff --git a/KhTracker/Images/Old/wisdom.png b/KhTracker/Images/Old/wisdom.png deleted file mode 100644 index 91d49151..00000000 Binary files a/KhTracker/Images/Old/wisdom.png and /dev/null differ diff --git a/KhTracker/Images/Progression/1k.png b/KhTracker/Images/Progression/1k.png deleted file mode 100644 index da056d53..00000000 Binary files a/KhTracker/Images/Progression/1k.png and /dev/null differ diff --git a/KhTracker/Images/Progression/Ariel.png b/KhTracker/Images/Progression/Ariel.png deleted file mode 100644 index 7dcc0a3b..00000000 Binary files a/KhTracker/Images/Progression/Ariel.png and /dev/null differ diff --git a/KhTracker/Images/Progression/Min/100_acre_wood/balloon_bounce.png b/KhTracker/Images/Progression/Min/100_acre_wood/balloon_bounce.png new file mode 100644 index 00000000..6c6fe145 Binary files /dev/null and b/KhTracker/Images/Progression/Min/100_acre_wood/balloon_bounce.png differ diff --git a/KhTracker/Images/Progression/Min/100_acre_wood/blustery_rescue.png b/KhTracker/Images/Progression/Min/100_acre_wood/blustery_rescue.png new file mode 100644 index 00000000..78261e74 Binary files /dev/null and b/KhTracker/Images/Progression/Min/100_acre_wood/blustery_rescue.png differ diff --git a/KhTracker/Images/Progression/Min/100_acre_wood/expotition.png b/KhTracker/Images/Progression/Min/100_acre_wood/expotition.png new file mode 100644 index 00000000..922e6726 Binary files /dev/null and b/KhTracker/Images/Progression/Min/100_acre_wood/expotition.png differ diff --git a/KhTracker/Images/Progression/Min/100_acre_wood/hunny_pot.png b/KhTracker/Images/Progression/Min/100_acre_wood/hunny_pot.png new file mode 100644 index 00000000..7af26729 Binary files /dev/null and b/KhTracker/Images/Progression/Min/100_acre_wood/hunny_pot.png differ diff --git a/KhTracker/Images/Progression/Min/100_acre_wood/hunny_slider.png b/KhTracker/Images/Progression/Min/100_acre_wood/hunny_slider.png new file mode 100644 index 00000000..993d55a0 Binary files /dev/null and b/KhTracker/Images/Progression/Min/100_acre_wood/hunny_slider.png differ diff --git a/KhTracker/Images/Progression/Min/absent.png b/KhTracker/Images/Progression/Min/absent.png new file mode 100644 index 00000000..f1e68c8f Binary files /dev/null and b/KhTracker/Images/Progression/Min/absent.png differ diff --git a/KhTracker/Images/Progression/Min/agrabah/abu.png b/KhTracker/Images/Progression/Min/agrabah/abu.png new file mode 100644 index 00000000..b19ad924 Binary files /dev/null and b/KhTracker/Images/Progression/Min/agrabah/abu.png differ diff --git a/KhTracker/Images/Progression/Min/agrabah/chasm_of_challenges.png b/KhTracker/Images/Progression/Min/agrabah/chasm_of_challenges.png new file mode 100644 index 00000000..756117ce Binary files /dev/null and b/KhTracker/Images/Progression/Min/agrabah/chasm_of_challenges.png differ diff --git a/KhTracker/Images/Progression/Min/agrabah/elemental_lords.png b/KhTracker/Images/Progression/Min/agrabah/elemental_lords.png new file mode 100644 index 00000000..b771ef8e Binary files /dev/null and b/KhTracker/Images/Progression/Min/agrabah/elemental_lords.png differ diff --git a/KhTracker/Images/Progression/Min/agrabah/jafar.png b/KhTracker/Images/Progression/Min/agrabah/jafar.png new file mode 100644 index 00000000..279af85f Binary files /dev/null and b/KhTracker/Images/Progression/Min/agrabah/jafar.png differ diff --git a/KhTracker/Images/Progression/Min/agrabah/lexaeus.png b/KhTracker/Images/Progression/Min/agrabah/lexaeus.png new file mode 100644 index 00000000..cfc201ea Binary files /dev/null and b/KhTracker/Images/Progression/Min/agrabah/lexaeus.png differ diff --git a/KhTracker/Images/Progression/Min/agrabah/magic_switches.png b/KhTracker/Images/Progression/Min/agrabah/magic_switches.png new file mode 100644 index 00000000..2c70f89c Binary files /dev/null and b/KhTracker/Images/Progression/Min/agrabah/magic_switches.png differ diff --git a/KhTracker/Images/Progression/Min/agrabah/treasure_room.png b/KhTracker/Images/Progression/Min/agrabah/treasure_room.png new file mode 100644 index 00000000..8bae23b7 Binary files /dev/null and b/KhTracker/Images/Progression/Min/agrabah/treasure_room.png differ diff --git a/KhTracker/Images/Progression/Min/atlantica/concert.png b/KhTracker/Images/Progression/Min/atlantica/concert.png new file mode 100644 index 00000000..b79606b1 Binary files /dev/null and b/KhTracker/Images/Progression/Min/atlantica/concert.png differ diff --git a/KhTracker/Images/Progression/Min/atlantica/tutorial.png b/KhTracker/Images/Progression/Min/atlantica/tutorial.png new file mode 100644 index 00000000..2188acbf Binary files /dev/null and b/KhTracker/Images/Progression/Min/atlantica/tutorial.png differ diff --git a/KhTracker/Images/Progression/Min/atlantica/ursula.png b/KhTracker/Images/Progression/Min/atlantica/ursula.png new file mode 100644 index 00000000..c41b87be Binary files /dev/null and b/KhTracker/Images/Progression/Min/atlantica/ursula.png differ diff --git a/KhTracker/Images/Progression/Min/beast's_castle/beast.png b/KhTracker/Images/Progression/Min/beast's_castle/beast.png new file mode 100644 index 00000000..0eb1d635 Binary files /dev/null and b/KhTracker/Images/Progression/Min/beast's_castle/beast.png differ diff --git a/KhTracker/Images/Progression/Min/beast's_castle/dark_thorn.png b/KhTracker/Images/Progression/Min/beast's_castle/dark_thorn.png new file mode 100644 index 00000000..e8e8f8e4 Binary files /dev/null and b/KhTracker/Images/Progression/Min/beast's_castle/dark_thorn.png differ diff --git a/KhTracker/Images/Progression/Min/beast's_castle/dragoons.png b/KhTracker/Images/Progression/Min/beast's_castle/dragoons.png new file mode 100644 index 00000000..f0b4081c Binary files /dev/null and b/KhTracker/Images/Progression/Min/beast's_castle/dragoons.png differ diff --git a/KhTracker/Images/Progression/Min/beast's_castle/thresholder.png b/KhTracker/Images/Progression/Min/beast's_castle/thresholder.png new file mode 100644 index 00000000..57d6dae3 Binary files /dev/null and b/KhTracker/Images/Progression/Min/beast's_castle/thresholder.png differ diff --git a/KhTracker/Images/Progression/Min/beast's_castle/xaldin.png b/KhTracker/Images/Progression/Min/beast's_castle/xaldin.png new file mode 100644 index 00000000..372d83a0 Binary files /dev/null and b/KhTracker/Images/Progression/Min/beast's_castle/xaldin.png differ diff --git a/KhTracker/Images/Progression/Min/beast's_castle/xaldin_story.png b/KhTracker/Images/Progression/Min/beast's_castle/xaldin_story.png new file mode 100644 index 00000000..04a20a5b Binary files /dev/null and b/KhTracker/Images/Progression/Min/beast's_castle/xaldin_story.png differ diff --git a/KhTracker/Images/Progression/Min/chest.png b/KhTracker/Images/Progression/Min/chest.png new file mode 100644 index 00000000..9f5f9c9c Binary files /dev/null and b/KhTracker/Images/Progression/Min/chest.png differ diff --git a/KhTracker/Images/Progression/Min/disney_castle/lingering_will.png b/KhTracker/Images/Progression/Min/disney_castle/lingering_will.png new file mode 100644 index 00000000..a8ae8734 Binary files /dev/null and b/KhTracker/Images/Progression/Min/disney_castle/lingering_will.png differ diff --git a/KhTracker/Images/Progression/Min/disney_castle/marluxia.png b/KhTracker/Images/Progression/Min/disney_castle/marluxia.png new file mode 100644 index 00000000..b3ad4d21 Binary files /dev/null and b/KhTracker/Images/Progression/Min/disney_castle/marluxia.png differ diff --git a/KhTracker/Images/Progression/Min/disney_castle/marluxia_and_lingering_will.png b/KhTracker/Images/Progression/Min/disney_castle/marluxia_and_lingering_will.png new file mode 100644 index 00000000..efe4dc0b Binary files /dev/null and b/KhTracker/Images/Progression/Min/disney_castle/marluxia_and_lingering_will.png differ diff --git a/KhTracker/Images/Progression/Min/disney_castle/marluxiadata_and_lingering_will.png b/KhTracker/Images/Progression/Min/disney_castle/marluxiadata_and_lingering_will.png new file mode 100644 index 00000000..3a586d2e Binary files /dev/null and b/KhTracker/Images/Progression/Min/disney_castle/marluxiadata_and_lingering_will.png differ diff --git a/KhTracker/Images/Progression/Min/disney_castle/minnie.png b/KhTracker/Images/Progression/Min/disney_castle/minnie.png new file mode 100644 index 00000000..6f99c6d1 Binary files /dev/null and b/KhTracker/Images/Progression/Min/disney_castle/minnie.png differ diff --git a/KhTracker/Images/Progression/Min/disney_castle/old_pete.png b/KhTracker/Images/Progression/Min/disney_castle/old_pete.png new file mode 100644 index 00000000..60b6ffe5 Binary files /dev/null and b/KhTracker/Images/Progression/Min/disney_castle/old_pete.png differ diff --git a/KhTracker/Images/Progression/Min/disney_castle/pete.png b/KhTracker/Images/Progression/Min/disney_castle/pete.png new file mode 100644 index 00000000..14a2fb97 Binary files /dev/null and b/KhTracker/Images/Progression/Min/disney_castle/pete.png differ diff --git a/KhTracker/Images/Progression/Min/disney_castle/steamboat_pete.png b/KhTracker/Images/Progression/Min/disney_castle/steamboat_pete.png new file mode 100644 index 00000000..bf76308d Binary files /dev/null and b/KhTracker/Images/Progression/Min/disney_castle/steamboat_pete.png differ diff --git a/KhTracker/Images/Progression/Min/disney_castle/windows_of_time.png b/KhTracker/Images/Progression/Min/disney_castle/windows_of_time.png new file mode 100644 index 00000000..c85fd646 Binary files /dev/null and b/KhTracker/Images/Progression/Min/disney_castle/windows_of_time.png differ diff --git a/KhTracker/Images/Progression/Min/drive_forms/2.png b/KhTracker/Images/Progression/Min/drive_forms/2.png new file mode 100644 index 00000000..5bdbc5b8 Binary files /dev/null and b/KhTracker/Images/Progression/Min/drive_forms/2.png differ diff --git a/KhTracker/Images/Progression/Min/drive_forms/3.png b/KhTracker/Images/Progression/Min/drive_forms/3.png new file mode 100644 index 00000000..42115d2b Binary files /dev/null and b/KhTracker/Images/Progression/Min/drive_forms/3.png differ diff --git a/KhTracker/Images/Progression/Min/drive_forms/4.png b/KhTracker/Images/Progression/Min/drive_forms/4.png new file mode 100644 index 00000000..cde4fec9 Binary files /dev/null and b/KhTracker/Images/Progression/Min/drive_forms/4.png differ diff --git a/KhTracker/Images/Progression/Min/drive_forms/5.png b/KhTracker/Images/Progression/Min/drive_forms/5.png new file mode 100644 index 00000000..d0e9932f Binary files /dev/null and b/KhTracker/Images/Progression/Min/drive_forms/5.png differ diff --git a/KhTracker/Images/Progression/Min/drive_forms/6.png b/KhTracker/Images/Progression/Min/drive_forms/6.png new file mode 100644 index 00000000..a6c3856e Binary files /dev/null and b/KhTracker/Images/Progression/Min/drive_forms/6.png differ diff --git a/KhTracker/Images/Progression/Min/drive_forms/7.png b/KhTracker/Images/Progression/Min/drive_forms/7.png new file mode 100644 index 00000000..d28c745c Binary files /dev/null and b/KhTracker/Images/Progression/Min/drive_forms/7.png differ diff --git a/KhTracker/Images/Progression/Min/halloween_town/candy_cane_lane.png b/KhTracker/Images/Progression/Min/halloween_town/candy_cane_lane.png new file mode 100644 index 00000000..ad6bbf5e Binary files /dev/null and b/KhTracker/Images/Progression/Min/halloween_town/candy_cane_lane.png differ diff --git a/KhTracker/Images/Progression/Min/halloween_town/children.png b/KhTracker/Images/Progression/Min/halloween_town/children.png new file mode 100644 index 00000000..6d33619d Binary files /dev/null and b/KhTracker/Images/Progression/Min/halloween_town/children.png differ diff --git a/KhTracker/Images/Progression/Min/halloween_town/experiment.png b/KhTracker/Images/Progression/Min/halloween_town/experiment.png new file mode 100644 index 00000000..87307f35 Binary files /dev/null and b/KhTracker/Images/Progression/Min/halloween_town/experiment.png differ diff --git a/KhTracker/Images/Progression/Min/halloween_town/oogie_boogie.png b/KhTracker/Images/Progression/Min/halloween_town/oogie_boogie.png new file mode 100644 index 00000000..e75e792e Binary files /dev/null and b/KhTracker/Images/Progression/Min/halloween_town/oogie_boogie.png differ diff --git a/KhTracker/Images/Progression/Min/halloween_town/presents.png b/KhTracker/Images/Progression/Min/halloween_town/presents.png new file mode 100644 index 00000000..3f842bb2 Binary files /dev/null and b/KhTracker/Images/Progression/Min/halloween_town/presents.png differ diff --git a/KhTracker/Images/Progression/Min/halloween_town/prison_keeper.png b/KhTracker/Images/Progression/Min/halloween_town/prison_keeper.png new file mode 100644 index 00000000..5c653e2f Binary files /dev/null and b/KhTracker/Images/Progression/Min/halloween_town/prison_keeper.png differ diff --git a/KhTracker/Images/Progression/Min/halloween_town/vexen.png b/KhTracker/Images/Progression/Min/halloween_town/vexen.png new file mode 100644 index 00000000..1e9e9563 Binary files /dev/null and b/KhTracker/Images/Progression/Min/halloween_town/vexen.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/1000_heartless.png b/KhTracker/Images/Progression/Min/hollow_bastion/1000_heartless.png new file mode 100644 index 00000000..2ae99706 Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/1000_heartless.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/ansem's_study.png b/KhTracker/Images/Progression/Min/hollow_bastion/ansem's_study.png new file mode 100644 index 00000000..7d2abd79 Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/ansem's_study.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/bailey.png b/KhTracker/Images/Progression/Min/hollow_bastion/bailey.png new file mode 100644 index 00000000..3d54e455 Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/bailey.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/corridors.png b/KhTracker/Images/Progression/Min/hollow_bastion/corridors.png new file mode 100644 index 00000000..8671e52d Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/corridors.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/dancers.png b/KhTracker/Images/Progression/Min/hollow_bastion/dancers.png new file mode 100644 index 00000000..e7db5df6 Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/dancers.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/demyx.png b/KhTracker/Images/Progression/Min/hollow_bastion/demyx.png new file mode 100644 index 00000000..dee8916f Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/demyx.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/demyx_and_sephiroth.png b/KhTracker/Images/Progression/Min/hollow_bastion/demyx_and_sephiroth.png new file mode 100644 index 00000000..38a5afe1 Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/demyx_and_sephiroth.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/demyx_story.png b/KhTracker/Images/Progression/Min/hollow_bastion/demyx_story.png new file mode 100644 index 00000000..7619b318 Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/demyx_story.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/final_fantasy.png b/KhTracker/Images/Progression/Min/hollow_bastion/final_fantasy.png new file mode 100644 index 00000000..ffb694ae Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/final_fantasy.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/first_fight.png b/KhTracker/Images/Progression/Min/hollow_bastion/first_fight.png new file mode 100644 index 00000000..d26919c7 Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/first_fight.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/second_fight.png b/KhTracker/Images/Progression/Min/hollow_bastion/second_fight.png new file mode 100644 index 00000000..581d7ef0 Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/second_fight.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/sephiroth.png b/KhTracker/Images/Progression/Min/hollow_bastion/sephiroth.png new file mode 100644 index 00000000..a73c3a0e Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/sephiroth.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/steam_valve.png b/KhTracker/Images/Progression/Min/hollow_bastion/steam_valve.png new file mode 100644 index 00000000..1bafb7d3 Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/steam_valve.png differ diff --git a/KhTracker/Images/Progression/Min/hollow_bastion/transport.png b/KhTracker/Images/Progression/Min/hollow_bastion/transport.png new file mode 100644 index 00000000..0af5a659 Binary files /dev/null and b/KhTracker/Images/Progression/Min/hollow_bastion/transport.png differ diff --git a/KhTracker/Images/Progression/Min/land_of_dragons/missions.png b/KhTracker/Images/Progression/Min/land_of_dragons/missions.png new file mode 100644 index 00000000..c14a301f Binary files /dev/null and b/KhTracker/Images/Progression/Min/land_of_dragons/missions.png differ diff --git a/KhTracker/Images/Progression/Min/land_of_dragons/mountain_climb.png b/KhTracker/Images/Progression/Min/land_of_dragons/mountain_climb.png new file mode 100644 index 00000000..e5345602 Binary files /dev/null and b/KhTracker/Images/Progression/Min/land_of_dragons/mountain_climb.png differ diff --git a/KhTracker/Images/Progression/Min/land_of_dragons/shan_yu.png b/KhTracker/Images/Progression/Min/land_of_dragons/shan_yu.png new file mode 100644 index 00000000..37f392dd Binary files /dev/null and b/KhTracker/Images/Progression/Min/land_of_dragons/shan_yu.png differ diff --git a/KhTracker/Images/Progression/Min/land_of_dragons/snipers.png b/KhTracker/Images/Progression/Min/land_of_dragons/snipers.png new file mode 100644 index 00000000..deae2ff3 Binary files /dev/null and b/KhTracker/Images/Progression/Min/land_of_dragons/snipers.png differ diff --git a/KhTracker/Images/Progression/Min/land_of_dragons/storm_rider.png b/KhTracker/Images/Progression/Min/land_of_dragons/storm_rider.png new file mode 100644 index 00000000..7971ffe6 Binary files /dev/null and b/KhTracker/Images/Progression/Min/land_of_dragons/storm_rider.png differ diff --git a/KhTracker/Images/Progression/Min/land_of_dragons/summit.png b/KhTracker/Images/Progression/Min/land_of_dragons/summit.png new file mode 100644 index 00000000..1c005f7f Binary files /dev/null and b/KhTracker/Images/Progression/Min/land_of_dragons/summit.png differ diff --git a/KhTracker/Images/Progression/Min/land_of_dragons/village_cave.png b/KhTracker/Images/Progression/Min/land_of_dragons/village_cave.png new file mode 100644 index 00000000..84fbd374 Binary files /dev/null and b/KhTracker/Images/Progression/Min/land_of_dragons/village_cave.png differ diff --git a/KhTracker/Images/Progression/Min/land_of_dragons/xigbar.png b/KhTracker/Images/Progression/Min/land_of_dragons/xigbar.png new file mode 100644 index 00000000..54cbf50d Binary files /dev/null and b/KhTracker/Images/Progression/Min/land_of_dragons/xigbar.png differ diff --git a/KhTracker/Images/Progression/Min/olympus_coliseum/cerberus.png b/KhTracker/Images/Progression/Min/olympus_coliseum/cerberus.png new file mode 100644 index 00000000..c7bf09a1 Binary files /dev/null and b/KhTracker/Images/Progression/Min/olympus_coliseum/cerberus.png differ diff --git a/KhTracker/Images/Progression/Min/olympus_coliseum/demyx.png b/KhTracker/Images/Progression/Min/olympus_coliseum/demyx.png new file mode 100644 index 00000000..7619b318 Binary files /dev/null and b/KhTracker/Images/Progression/Min/olympus_coliseum/demyx.png differ diff --git a/KhTracker/Images/Progression/Min/olympus_coliseum/dusks.png b/KhTracker/Images/Progression/Min/olympus_coliseum/dusks.png new file mode 100644 index 00000000..2c79a77c Binary files /dev/null and b/KhTracker/Images/Progression/Min/olympus_coliseum/dusks.png differ diff --git a/KhTracker/Images/Progression/Min/olympus_coliseum/hades.png b/KhTracker/Images/Progression/Min/olympus_coliseum/hades.png new file mode 100644 index 00000000..49288307 Binary files /dev/null and b/KhTracker/Images/Progression/Min/olympus_coliseum/hades.png differ diff --git a/KhTracker/Images/Progression/Min/olympus_coliseum/hydra.png b/KhTracker/Images/Progression/Min/olympus_coliseum/hydra.png new file mode 100644 index 00000000..52602a94 Binary files /dev/null and b/KhTracker/Images/Progression/Min/olympus_coliseum/hydra.png differ diff --git a/KhTracker/Images/Progression/Min/olympus_coliseum/the_lock.png b/KhTracker/Images/Progression/Min/olympus_coliseum/the_lock.png new file mode 100644 index 00000000..89426994 Binary files /dev/null and b/KhTracker/Images/Progression/Min/olympus_coliseum/the_lock.png differ diff --git a/KhTracker/Images/Progression/Min/olympus_coliseum/urns.png b/KhTracker/Images/Progression/Min/olympus_coliseum/urns.png new file mode 100644 index 00000000..399d0041 Binary files /dev/null and b/KhTracker/Images/Progression/Min/olympus_coliseum/urns.png differ diff --git a/KhTracker/Images/Progression/Min/olympus_coliseum/zexion.png b/KhTracker/Images/Progression/Min/olympus_coliseum/zexion.png new file mode 100644 index 00000000..90f4ea19 Binary files /dev/null and b/KhTracker/Images/Progression/Min/olympus_coliseum/zexion.png differ diff --git a/KhTracker/Images/Progression/Min/port_royal/barbossa.png b/KhTracker/Images/Progression/Min/port_royal/barbossa.png new file mode 100644 index 00000000..3d07a9d8 Binary files /dev/null and b/KhTracker/Images/Progression/Min/port_royal/barbossa.png differ diff --git a/KhTracker/Images/Progression/Min/port_royal/cursed_reaper.png b/KhTracker/Images/Progression/Min/port_royal/cursed_reaper.png new file mode 100644 index 00000000..2b8fd0d9 Binary files /dev/null and b/KhTracker/Images/Progression/Min/port_royal/cursed_reaper.png differ diff --git a/KhTracker/Images/Progression/Min/port_royal/explosives.png b/KhTracker/Images/Progression/Min/port_royal/explosives.png new file mode 100644 index 00000000..2e86afa7 Binary files /dev/null and b/KhTracker/Images/Progression/Min/port_royal/explosives.png differ diff --git a/KhTracker/Images/Progression/Min/port_royal/gamblers.png b/KhTracker/Images/Progression/Min/port_royal/gamblers.png new file mode 100644 index 00000000..07c5b0ee Binary files /dev/null and b/KhTracker/Images/Progression/Min/port_royal/gamblers.png differ diff --git a/KhTracker/Images/Progression/Min/port_royal/grim_reaper.png b/KhTracker/Images/Progression/Min/port_royal/grim_reaper.png new file mode 100644 index 00000000..7ea4de8c Binary files /dev/null and b/KhTracker/Images/Progression/Min/port_royal/grim_reaper.png differ diff --git a/KhTracker/Images/Progression/Min/port_royal/isla_de_muerta.png b/KhTracker/Images/Progression/Min/port_royal/isla_de_muerta.png new file mode 100644 index 00000000..c58e2861 Binary files /dev/null and b/KhTracker/Images/Progression/Min/port_royal/isla_de_muerta.png differ diff --git a/KhTracker/Images/Progression/Min/port_royal/luxord.png b/KhTracker/Images/Progression/Min/port_royal/luxord.png new file mode 100644 index 00000000..06f36d30 Binary files /dev/null and b/KhTracker/Images/Progression/Min/port_royal/luxord.png differ diff --git a/KhTracker/Images/Progression/Min/port_royal/medallions.png b/KhTracker/Images/Progression/Min/port_royal/medallions.png new file mode 100644 index 00000000..13ccff3c Binary files /dev/null and b/KhTracker/Images/Progression/Min/port_royal/medallions.png differ diff --git a/KhTracker/Images/Progression/Min/port_royal/town.png b/KhTracker/Images/Progression/Min/port_royal/town.png new file mode 100644 index 00000000..d7a61d12 Binary files /dev/null and b/KhTracker/Images/Progression/Min/port_royal/town.png differ diff --git a/KhTracker/Images/Progression/Min/pride_lands/groundshaker.png b/KhTracker/Images/Progression/Min/pride_lands/groundshaker.png new file mode 100644 index 00000000..84728a21 Binary files /dev/null and b/KhTracker/Images/Progression/Min/pride_lands/groundshaker.png differ diff --git a/KhTracker/Images/Progression/Min/pride_lands/hyenas.png b/KhTracker/Images/Progression/Min/pride_lands/hyenas.png new file mode 100644 index 00000000..d2c4e210 Binary files /dev/null and b/KhTracker/Images/Progression/Min/pride_lands/hyenas.png differ diff --git a/KhTracker/Images/Progression/Min/pride_lands/oasis.png b/KhTracker/Images/Progression/Min/pride_lands/oasis.png new file mode 100644 index 00000000..97b767f9 Binary files /dev/null and b/KhTracker/Images/Progression/Min/pride_lands/oasis.png differ diff --git a/KhTracker/Images/Progression/Min/pride_lands/saix.png b/KhTracker/Images/Progression/Min/pride_lands/saix.png new file mode 100644 index 00000000..d4c6f903 Binary files /dev/null and b/KhTracker/Images/Progression/Min/pride_lands/saix.png differ diff --git a/KhTracker/Images/Progression/Min/pride_lands/scar.png b/KhTracker/Images/Progression/Min/pride_lands/scar.png new file mode 100644 index 00000000..29eb69be Binary files /dev/null and b/KhTracker/Images/Progression/Min/pride_lands/scar.png differ diff --git a/KhTracker/Images/Progression/Min/pride_lands/timon_and_pumba.png b/KhTracker/Images/Progression/Min/pride_lands/timon_and_pumba.png new file mode 100644 index 00000000..35dfdd62 Binary files /dev/null and b/KhTracker/Images/Progression/Min/pride_lands/timon_and_pumba.png differ diff --git a/KhTracker/Images/Progression/Min/simulated_twilight_town/axel_story.png b/KhTracker/Images/Progression/Min/simulated_twilight_town/axel_story.png new file mode 100644 index 00000000..11cc334d Binary files /dev/null and b/KhTracker/Images/Progression/Min/simulated_twilight_town/axel_story.png differ diff --git a/KhTracker/Images/Progression/Min/simulated_twilight_town/computer_room.png b/KhTracker/Images/Progression/Min/simulated_twilight_town/computer_room.png new file mode 100644 index 00000000..a6574013 Binary files /dev/null and b/KhTracker/Images/Progression/Min/simulated_twilight_town/computer_room.png differ diff --git a/KhTracker/Images/Progression/Min/simulated_twilight_town/munny_pouch.png b/KhTracker/Images/Progression/Min/simulated_twilight_town/munny_pouch.png new file mode 100644 index 00000000..33f096a2 Binary files /dev/null and b/KhTracker/Images/Progression/Min/simulated_twilight_town/munny_pouch.png differ diff --git a/KhTracker/Images/Progression/Min/simulated_twilight_town/pod_room.png b/KhTracker/Images/Progression/Min/simulated_twilight_town/pod_room.png new file mode 100644 index 00000000..a7b2dd04 Binary files /dev/null and b/KhTracker/Images/Progression/Min/simulated_twilight_town/pod_room.png differ diff --git a/KhTracker/Images/Progression/Min/simulated_twilight_town/roxas.png b/KhTracker/Images/Progression/Min/simulated_twilight_town/roxas.png new file mode 100644 index 00000000..3ba4beff Binary files /dev/null and b/KhTracker/Images/Progression/Min/simulated_twilight_town/roxas.png differ diff --git a/KhTracker/Images/Progression/Min/simulated_twilight_town/struggle.png b/KhTracker/Images/Progression/Min/simulated_twilight_town/struggle.png new file mode 100644 index 00000000..c600af44 Binary files /dev/null and b/KhTracker/Images/Progression/Min/simulated_twilight_town/struggle.png differ diff --git a/KhTracker/Images/Progression/Min/simulated_twilight_town/twilight_thorn.png b/KhTracker/Images/Progression/Min/simulated_twilight_town/twilight_thorn.png new file mode 100644 index 00000000..25b3c692 Binary files /dev/null and b/KhTracker/Images/Progression/Min/simulated_twilight_town/twilight_thorn.png differ diff --git a/KhTracker/Images/Progression/Min/space_paranoids/dataspace.png b/KhTracker/Images/Progression/Min/space_paranoids/dataspace.png new file mode 100644 index 00000000..17e84dfd Binary files /dev/null and b/KhTracker/Images/Progression/Min/space_paranoids/dataspace.png differ diff --git a/KhTracker/Images/Progression/Min/space_paranoids/hostile_program.png b/KhTracker/Images/Progression/Min/space_paranoids/hostile_program.png new file mode 100644 index 00000000..0d522d8a Binary files /dev/null and b/KhTracker/Images/Progression/Min/space_paranoids/hostile_program.png differ diff --git a/KhTracker/Images/Progression/Min/space_paranoids/larxene.png b/KhTracker/Images/Progression/Min/space_paranoids/larxene.png new file mode 100644 index 00000000..4171555e Binary files /dev/null and b/KhTracker/Images/Progression/Min/space_paranoids/larxene.png differ diff --git a/KhTracker/Images/Progression/Min/space_paranoids/master_control_program.png b/KhTracker/Images/Progression/Min/space_paranoids/master_control_program.png new file mode 100644 index 00000000..96e2b956 Binary files /dev/null and b/KhTracker/Images/Progression/Min/space_paranoids/master_control_program.png differ diff --git a/KhTracker/Images/Progression/Min/space_paranoids/sark.png b/KhTracker/Images/Progression/Min/space_paranoids/sark.png new file mode 100644 index 00000000..cf6fa812 Binary files /dev/null and b/KhTracker/Images/Progression/Min/space_paranoids/sark.png differ diff --git a/KhTracker/Images/Progression/Min/space_paranoids/solar_sailer.png b/KhTracker/Images/Progression/Min/space_paranoids/solar_sailer.png new file mode 100644 index 00000000..06280510 Binary files /dev/null and b/KhTracker/Images/Progression/Min/space_paranoids/solar_sailer.png differ diff --git a/KhTracker/Images/Progression/Min/the_world_that_never_was/kingdom_hearts.png b/KhTracker/Images/Progression/Min/the_world_that_never_was/kingdom_hearts.png new file mode 100644 index 00000000..1aede3d1 Binary files /dev/null and b/KhTracker/Images/Progression/Min/the_world_that_never_was/kingdom_hearts.png differ diff --git a/KhTracker/Images/Progression/Min/the_world_that_never_was/luxord.png b/KhTracker/Images/Progression/Min/the_world_that_never_was/luxord.png new file mode 100644 index 00000000..06f36d30 Binary files /dev/null and b/KhTracker/Images/Progression/Min/the_world_that_never_was/luxord.png differ diff --git a/KhTracker/Images/Progression/Min/the_world_that_never_was/roxas.png b/KhTracker/Images/Progression/Min/the_world_that_never_was/roxas.png new file mode 100644 index 00000000..3ba4beff Binary files /dev/null and b/KhTracker/Images/Progression/Min/the_world_that_never_was/roxas.png differ diff --git a/KhTracker/Images/Progression/Min/the_world_that_never_was/saix.png b/KhTracker/Images/Progression/Min/the_world_that_never_was/saix.png new file mode 100644 index 00000000..d4c6f903 Binary files /dev/null and b/KhTracker/Images/Progression/Min/the_world_that_never_was/saix.png differ diff --git a/KhTracker/Images/Progression/Min/the_world_that_never_was/xemnas.png b/KhTracker/Images/Progression/Min/the_world_that_never_was/xemnas.png new file mode 100644 index 00000000..2e1c98de Binary files /dev/null and b/KhTracker/Images/Progression/Min/the_world_that_never_was/xemnas.png differ diff --git a/KhTracker/Images/Progression/Min/the_world_that_never_was/xigbar.png b/KhTracker/Images/Progression/Min/the_world_that_never_was/xigbar.png new file mode 100644 index 00000000..54cbf50d Binary files /dev/null and b/KhTracker/Images/Progression/Min/the_world_that_never_was/xigbar.png differ diff --git a/KhTracker/Images/Progression/Min/twilight_town/axel.png b/KhTracker/Images/Progression/Min/twilight_town/axel.png new file mode 100644 index 00000000..277a0014 Binary files /dev/null and b/KhTracker/Images/Progression/Min/twilight_town/axel.png differ diff --git a/KhTracker/Images/Progression/Min/twilight_town/berserkers.png b/KhTracker/Images/Progression/Min/twilight_town/berserkers.png new file mode 100644 index 00000000..699da885 Binary files /dev/null and b/KhTracker/Images/Progression/Min/twilight_town/berserkers.png differ diff --git a/KhTracker/Images/Progression/Min/twilight_town/betwixt_and_between.png b/KhTracker/Images/Progression/Min/twilight_town/betwixt_and_between.png new file mode 100644 index 00000000..a7c4fe83 Binary files /dev/null and b/KhTracker/Images/Progression/Min/twilight_town/betwixt_and_between.png differ diff --git a/KhTracker/Images/Progression/Min/twilight_town/dusks.png b/KhTracker/Images/Progression/Min/twilight_town/dusks.png new file mode 100644 index 00000000..2c79a77c Binary files /dev/null and b/KhTracker/Images/Progression/Min/twilight_town/dusks.png differ diff --git a/KhTracker/Images/Progression/Min/twilight_town/mickey.png b/KhTracker/Images/Progression/Min/twilight_town/mickey.png new file mode 100644 index 00000000..d587d4a7 Binary files /dev/null and b/KhTracker/Images/Progression/Min/twilight_town/mickey.png differ diff --git a/KhTracker/Images/Progression/Min/twilight_town/mysterious_tower.png b/KhTracker/Images/Progression/Min/twilight_town/mysterious_tower.png new file mode 100644 index 00000000..11f3fff2 Binary files /dev/null and b/KhTracker/Images/Progression/Min/twilight_town/mysterious_tower.png differ diff --git a/KhTracker/Images/Progression/Old/100_acre_wood/balloon_bounce.png b/KhTracker/Images/Progression/Old/100_acre_wood/balloon_bounce.png new file mode 100644 index 00000000..726be580 Binary files /dev/null and b/KhTracker/Images/Progression/Old/100_acre_wood/balloon_bounce.png differ diff --git a/KhTracker/Images/Progression/Old/100_acre_wood/blustery_rescue.png b/KhTracker/Images/Progression/Old/100_acre_wood/blustery_rescue.png new file mode 100644 index 00000000..cd2ab220 Binary files /dev/null and b/KhTracker/Images/Progression/Old/100_acre_wood/blustery_rescue.png differ diff --git a/KhTracker/Images/Progression/Old/100_acre_wood/expotition.png b/KhTracker/Images/Progression/Old/100_acre_wood/expotition.png new file mode 100644 index 00000000..efd8f2d6 Binary files /dev/null and b/KhTracker/Images/Progression/Old/100_acre_wood/expotition.png differ diff --git a/KhTracker/Images/Progression/Old/100_acre_wood/hunny_pot.png b/KhTracker/Images/Progression/Old/100_acre_wood/hunny_pot.png new file mode 100644 index 00000000..66f371f2 Binary files /dev/null and b/KhTracker/Images/Progression/Old/100_acre_wood/hunny_pot.png differ diff --git a/KhTracker/Images/Progression/Old/100_acre_wood/hunny_slider.png b/KhTracker/Images/Progression/Old/100_acre_wood/hunny_slider.png new file mode 100644 index 00000000..d61ded88 Binary files /dev/null and b/KhTracker/Images/Progression/Old/100_acre_wood/hunny_slider.png differ diff --git a/KhTracker/Images/Progression/Old/agrabah/abu.png b/KhTracker/Images/Progression/Old/agrabah/abu.png new file mode 100644 index 00000000..dcd7fd11 Binary files /dev/null and b/KhTracker/Images/Progression/Old/agrabah/abu.png differ diff --git a/KhTracker/Images/Progression/Old/agrabah/chasm_of_challenges.png b/KhTracker/Images/Progression/Old/agrabah/chasm_of_challenges.png new file mode 100644 index 00000000..fdcd0ef2 Binary files /dev/null and b/KhTracker/Images/Progression/Old/agrabah/chasm_of_challenges.png differ diff --git a/KhTracker/Images/Progression/Old/agrabah/elemental_lords.png b/KhTracker/Images/Progression/Old/agrabah/elemental_lords.png new file mode 100644 index 00000000..14cccdf8 Binary files /dev/null and b/KhTracker/Images/Progression/Old/agrabah/elemental_lords.png differ diff --git a/KhTracker/Images/Progression/Old/agrabah/jafar.png b/KhTracker/Images/Progression/Old/agrabah/jafar.png new file mode 100644 index 00000000..af549b2d Binary files /dev/null and b/KhTracker/Images/Progression/Old/agrabah/jafar.png differ diff --git a/KhTracker/Images/Progression/Old/agrabah/lexaeus.png b/KhTracker/Images/Progression/Old/agrabah/lexaeus.png new file mode 100644 index 00000000..5841a61a Binary files /dev/null and b/KhTracker/Images/Progression/Old/agrabah/lexaeus.png differ diff --git a/KhTracker/Images/Progression/Old/agrabah/magic_switches.png b/KhTracker/Images/Progression/Old/agrabah/magic_switches.png new file mode 100644 index 00000000..13297492 Binary files /dev/null and b/KhTracker/Images/Progression/Old/agrabah/magic_switches.png differ diff --git a/KhTracker/Images/Progression/Old/agrabah/treasure_room.png b/KhTracker/Images/Progression/Old/agrabah/treasure_room.png new file mode 100644 index 00000000..f5861373 Binary files /dev/null and b/KhTracker/Images/Progression/Old/agrabah/treasure_room.png differ diff --git a/KhTracker/Images/Progression/Old/atlantica/concert.png b/KhTracker/Images/Progression/Old/atlantica/concert.png new file mode 100644 index 00000000..1944917b Binary files /dev/null and b/KhTracker/Images/Progression/Old/atlantica/concert.png differ diff --git a/KhTracker/Images/Progression/Old/atlantica/tutorial.png b/KhTracker/Images/Progression/Old/atlantica/tutorial.png new file mode 100644 index 00000000..ae27c61a Binary files /dev/null and b/KhTracker/Images/Progression/Old/atlantica/tutorial.png differ diff --git a/KhTracker/Images/Progression/Old/atlantica/ursula.png b/KhTracker/Images/Progression/Old/atlantica/ursula.png new file mode 100644 index 00000000..fe703096 Binary files /dev/null and b/KhTracker/Images/Progression/Old/atlantica/ursula.png differ diff --git a/KhTracker/Images/Progression/Old/beast's_castle/beast.png b/KhTracker/Images/Progression/Old/beast's_castle/beast.png new file mode 100644 index 00000000..d54a2759 Binary files /dev/null and b/KhTracker/Images/Progression/Old/beast's_castle/beast.png differ diff --git a/KhTracker/Images/Progression/Old/beast's_castle/dark_thorn.png b/KhTracker/Images/Progression/Old/beast's_castle/dark_thorn.png new file mode 100644 index 00000000..e667dc55 Binary files /dev/null and b/KhTracker/Images/Progression/Old/beast's_castle/dark_thorn.png differ diff --git a/KhTracker/Images/Progression/Old/beast's_castle/dragoons.png b/KhTracker/Images/Progression/Old/beast's_castle/dragoons.png new file mode 100644 index 00000000..fb6bcbed Binary files /dev/null and b/KhTracker/Images/Progression/Old/beast's_castle/dragoons.png differ diff --git a/KhTracker/Images/Progression/Old/beast's_castle/thresholder.png b/KhTracker/Images/Progression/Old/beast's_castle/thresholder.png new file mode 100644 index 00000000..7e1760fa Binary files /dev/null and b/KhTracker/Images/Progression/Old/beast's_castle/thresholder.png differ diff --git a/KhTracker/Images/Progression/Old/beast's_castle/xaldin.png b/KhTracker/Images/Progression/Old/beast's_castle/xaldin.png new file mode 100644 index 00000000..1abd8b4d Binary files /dev/null and b/KhTracker/Images/Progression/Old/beast's_castle/xaldin.png differ diff --git a/KhTracker/Images/Progression/Old/beast's_castle/xaldin_story.png b/KhTracker/Images/Progression/Old/beast's_castle/xaldin_story.png new file mode 100644 index 00000000..2459910a Binary files /dev/null and b/KhTracker/Images/Progression/Old/beast's_castle/xaldin_story.png differ diff --git a/KhTracker/Images/Progression/Old/chest.png b/KhTracker/Images/Progression/Old/chest.png new file mode 100644 index 00000000..a0b08a7c Binary files /dev/null and b/KhTracker/Images/Progression/Old/chest.png differ diff --git a/KhTracker/Images/Progression/Old/disney_castle/lingering_will.png b/KhTracker/Images/Progression/Old/disney_castle/lingering_will.png new file mode 100644 index 00000000..1d27e6cb Binary files /dev/null and b/KhTracker/Images/Progression/Old/disney_castle/lingering_will.png differ diff --git a/KhTracker/Images/Progression/Old/disney_castle/marluxia.png b/KhTracker/Images/Progression/Old/disney_castle/marluxia.png new file mode 100644 index 00000000..bb0c9a82 Binary files /dev/null and b/KhTracker/Images/Progression/Old/disney_castle/marluxia.png differ diff --git a/KhTracker/Images/Progression/Old/disney_castle/marluxia_and_lingering_will.png b/KhTracker/Images/Progression/Old/disney_castle/marluxia_and_lingering_will.png new file mode 100644 index 00000000..f1ca8cd4 Binary files /dev/null and b/KhTracker/Images/Progression/Old/disney_castle/marluxia_and_lingering_will.png differ diff --git a/KhTracker/Images/Progression/Old/disney_castle/minnie.png b/KhTracker/Images/Progression/Old/disney_castle/minnie.png new file mode 100644 index 00000000..8310d1fb Binary files /dev/null and b/KhTracker/Images/Progression/Old/disney_castle/minnie.png differ diff --git a/KhTracker/Images/Progression/Old/disney_castle/old_pete.png b/KhTracker/Images/Progression/Old/disney_castle/old_pete.png new file mode 100644 index 00000000..d1f4475c Binary files /dev/null and b/KhTracker/Images/Progression/Old/disney_castle/old_pete.png differ diff --git a/KhTracker/Images/Progression/Old/disney_castle/pete.png b/KhTracker/Images/Progression/Old/disney_castle/pete.png new file mode 100644 index 00000000..171c777a Binary files /dev/null and b/KhTracker/Images/Progression/Old/disney_castle/pete.png differ diff --git a/KhTracker/Images/Progression/Old/disney_castle/steamboat_pete.png b/KhTracker/Images/Progression/Old/disney_castle/steamboat_pete.png new file mode 100644 index 00000000..77c73321 Binary files /dev/null and b/KhTracker/Images/Progression/Old/disney_castle/steamboat_pete.png differ diff --git a/KhTracker/Images/Progression/Old/disney_castle/windows_of_time.png b/KhTracker/Images/Progression/Old/disney_castle/windows_of_time.png new file mode 100644 index 00000000..f3ad9498 Binary files /dev/null and b/KhTracker/Images/Progression/Old/disney_castle/windows_of_time.png differ diff --git a/KhTracker/Images/Progression/Old/drive_forms/2.png b/KhTracker/Images/Progression/Old/drive_forms/2.png new file mode 100644 index 00000000..5bdbc5b8 Binary files /dev/null and b/KhTracker/Images/Progression/Old/drive_forms/2.png differ diff --git a/KhTracker/Images/Progression/Old/drive_forms/3.png b/KhTracker/Images/Progression/Old/drive_forms/3.png new file mode 100644 index 00000000..42115d2b Binary files /dev/null and b/KhTracker/Images/Progression/Old/drive_forms/3.png differ diff --git a/KhTracker/Images/Progression/Old/drive_forms/4.png b/KhTracker/Images/Progression/Old/drive_forms/4.png new file mode 100644 index 00000000..cde4fec9 Binary files /dev/null and b/KhTracker/Images/Progression/Old/drive_forms/4.png differ diff --git a/KhTracker/Images/Progression/Old/drive_forms/5.png b/KhTracker/Images/Progression/Old/drive_forms/5.png new file mode 100644 index 00000000..d0e9932f Binary files /dev/null and b/KhTracker/Images/Progression/Old/drive_forms/5.png differ diff --git a/KhTracker/Images/Progression/Old/drive_forms/6.png b/KhTracker/Images/Progression/Old/drive_forms/6.png new file mode 100644 index 00000000..a6c3856e Binary files /dev/null and b/KhTracker/Images/Progression/Old/drive_forms/6.png differ diff --git a/KhTracker/Images/Progression/Old/drive_forms/7.png b/KhTracker/Images/Progression/Old/drive_forms/7.png new file mode 100644 index 00000000..d28c745c Binary files /dev/null and b/KhTracker/Images/Progression/Old/drive_forms/7.png differ diff --git a/KhTracker/Images/Progression/Old/halloween_town/candy_cane_lane.png b/KhTracker/Images/Progression/Old/halloween_town/candy_cane_lane.png new file mode 100644 index 00000000..58ba3029 Binary files /dev/null and b/KhTracker/Images/Progression/Old/halloween_town/candy_cane_lane.png differ diff --git a/KhTracker/Images/Progression/Old/halloween_town/children.png b/KhTracker/Images/Progression/Old/halloween_town/children.png new file mode 100644 index 00000000..65cdd716 Binary files /dev/null and b/KhTracker/Images/Progression/Old/halloween_town/children.png differ diff --git a/KhTracker/Images/Progression/Old/halloween_town/experiment.png b/KhTracker/Images/Progression/Old/halloween_town/experiment.png new file mode 100644 index 00000000..4f4e2ff8 Binary files /dev/null and b/KhTracker/Images/Progression/Old/halloween_town/experiment.png differ diff --git a/KhTracker/Images/Progression/Old/halloween_town/oogie_boogie.png b/KhTracker/Images/Progression/Old/halloween_town/oogie_boogie.png new file mode 100644 index 00000000..26212965 Binary files /dev/null and b/KhTracker/Images/Progression/Old/halloween_town/oogie_boogie.png differ diff --git a/KhTracker/Images/Progression/Old/halloween_town/presents.png b/KhTracker/Images/Progression/Old/halloween_town/presents.png new file mode 100644 index 00000000..5276bf6f Binary files /dev/null and b/KhTracker/Images/Progression/Old/halloween_town/presents.png differ diff --git a/KhTracker/Images/Progression/Old/halloween_town/prison_keeper.png b/KhTracker/Images/Progression/Old/halloween_town/prison_keeper.png new file mode 100644 index 00000000..809b3f9f Binary files /dev/null and b/KhTracker/Images/Progression/Old/halloween_town/prison_keeper.png differ diff --git a/KhTracker/Images/Progression/Old/halloween_town/vexen.png b/KhTracker/Images/Progression/Old/halloween_town/vexen.png new file mode 100644 index 00000000..94aa5b6b Binary files /dev/null and b/KhTracker/Images/Progression/Old/halloween_town/vexen.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/1000_heartless.png b/KhTracker/Images/Progression/Old/hollow_bastion/1000_heartless.png new file mode 100644 index 00000000..ea75ea86 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/1000_heartless.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/ansem's_study.png b/KhTracker/Images/Progression/Old/hollow_bastion/ansem's_study.png new file mode 100644 index 00000000..476668c6 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/ansem's_study.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/bailey.png b/KhTracker/Images/Progression/Old/hollow_bastion/bailey.png new file mode 100644 index 00000000..6b71faf8 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/bailey.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/corridors.png b/KhTracker/Images/Progression/Old/hollow_bastion/corridors.png new file mode 100644 index 00000000..31629cd3 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/corridors.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/dancers.png b/KhTracker/Images/Progression/Old/hollow_bastion/dancers.png new file mode 100644 index 00000000..cf6e24ae Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/dancers.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/demyx.png b/KhTracker/Images/Progression/Old/hollow_bastion/demyx.png new file mode 100644 index 00000000..d5f56580 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/demyx.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/demyx_and_sephiroth.png b/KhTracker/Images/Progression/Old/hollow_bastion/demyx_and_sephiroth.png new file mode 100644 index 00000000..53ca4c84 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/demyx_and_sephiroth.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/demyx_story.png b/KhTracker/Images/Progression/Old/hollow_bastion/demyx_story.png new file mode 100644 index 00000000..2aa4fee6 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/demyx_story.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/final_fantasy.png b/KhTracker/Images/Progression/Old/hollow_bastion/final_fantasy.png new file mode 100644 index 00000000..970afe86 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/final_fantasy.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/first_fight.png b/KhTracker/Images/Progression/Old/hollow_bastion/first_fight.png new file mode 100644 index 00000000..5d57dc1f Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/first_fight.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/second_fight.png b/KhTracker/Images/Progression/Old/hollow_bastion/second_fight.png new file mode 100644 index 00000000..0ee3b392 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/second_fight.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/sephiroth.png b/KhTracker/Images/Progression/Old/hollow_bastion/sephiroth.png new file mode 100644 index 00000000..a003d090 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/sephiroth.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/steam_valve.png b/KhTracker/Images/Progression/Old/hollow_bastion/steam_valve.png new file mode 100644 index 00000000..da6dab80 Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/steam_valve.png differ diff --git a/KhTracker/Images/Progression/Old/hollow_bastion/transport.png b/KhTracker/Images/Progression/Old/hollow_bastion/transport.png new file mode 100644 index 00000000..e988443e Binary files /dev/null and b/KhTracker/Images/Progression/Old/hollow_bastion/transport.png differ diff --git a/KhTracker/Images/Progression/Old/land_of_dragons/missions.png b/KhTracker/Images/Progression/Old/land_of_dragons/missions.png new file mode 100644 index 00000000..72df0144 Binary files /dev/null and b/KhTracker/Images/Progression/Old/land_of_dragons/missions.png differ diff --git a/KhTracker/Images/Progression/Old/land_of_dragons/mountain_climb.png b/KhTracker/Images/Progression/Old/land_of_dragons/mountain_climb.png new file mode 100644 index 00000000..be3025e7 Binary files /dev/null and b/KhTracker/Images/Progression/Old/land_of_dragons/mountain_climb.png differ diff --git a/KhTracker/Images/Progression/Old/land_of_dragons/shan_yu.png b/KhTracker/Images/Progression/Old/land_of_dragons/shan_yu.png new file mode 100644 index 00000000..024ea386 Binary files /dev/null and b/KhTracker/Images/Progression/Old/land_of_dragons/shan_yu.png differ diff --git a/KhTracker/Images/Progression/Old/land_of_dragons/snipers.png b/KhTracker/Images/Progression/Old/land_of_dragons/snipers.png new file mode 100644 index 00000000..9bfb7720 Binary files /dev/null and b/KhTracker/Images/Progression/Old/land_of_dragons/snipers.png differ diff --git a/KhTracker/Images/Progression/Old/land_of_dragons/storm_rider.png b/KhTracker/Images/Progression/Old/land_of_dragons/storm_rider.png new file mode 100644 index 00000000..a84af0d7 Binary files /dev/null and b/KhTracker/Images/Progression/Old/land_of_dragons/storm_rider.png differ diff --git a/KhTracker/Images/Progression/Old/land_of_dragons/summit.png b/KhTracker/Images/Progression/Old/land_of_dragons/summit.png new file mode 100644 index 00000000..4756a6ac Binary files /dev/null and b/KhTracker/Images/Progression/Old/land_of_dragons/summit.png differ diff --git a/KhTracker/Images/Progression/Old/land_of_dragons/village_cave.png b/KhTracker/Images/Progression/Old/land_of_dragons/village_cave.png new file mode 100644 index 00000000..099c2076 Binary files /dev/null and b/KhTracker/Images/Progression/Old/land_of_dragons/village_cave.png differ diff --git a/KhTracker/Images/Progression/Old/land_of_dragons/xigbar.png b/KhTracker/Images/Progression/Old/land_of_dragons/xigbar.png new file mode 100644 index 00000000..fd374ec5 Binary files /dev/null and b/KhTracker/Images/Progression/Old/land_of_dragons/xigbar.png differ diff --git a/KhTracker/Images/Progression/Old/olympus_coliseum/cerberus.png b/KhTracker/Images/Progression/Old/olympus_coliseum/cerberus.png new file mode 100644 index 00000000..463aeaf9 Binary files /dev/null and b/KhTracker/Images/Progression/Old/olympus_coliseum/cerberus.png differ diff --git a/KhTracker/Images/Progression/Old/olympus_coliseum/demyx.png b/KhTracker/Images/Progression/Old/olympus_coliseum/demyx.png new file mode 100644 index 00000000..2aa4fee6 Binary files /dev/null and b/KhTracker/Images/Progression/Old/olympus_coliseum/demyx.png differ diff --git a/KhTracker/Images/Progression/Old/olympus_coliseum/dusks.png b/KhTracker/Images/Progression/Old/olympus_coliseum/dusks.png new file mode 100644 index 00000000..e1cedc53 Binary files /dev/null and b/KhTracker/Images/Progression/Old/olympus_coliseum/dusks.png differ diff --git a/KhTracker/Images/Progression/Old/olympus_coliseum/hades.png b/KhTracker/Images/Progression/Old/olympus_coliseum/hades.png new file mode 100644 index 00000000..8ace2305 Binary files /dev/null and b/KhTracker/Images/Progression/Old/olympus_coliseum/hades.png differ diff --git a/KhTracker/Images/Progression/Old/olympus_coliseum/hydra.png b/KhTracker/Images/Progression/Old/olympus_coliseum/hydra.png new file mode 100644 index 00000000..8d9d382b Binary files /dev/null and b/KhTracker/Images/Progression/Old/olympus_coliseum/hydra.png differ diff --git a/KhTracker/Images/Progression/Old/olympus_coliseum/the_lock.png b/KhTracker/Images/Progression/Old/olympus_coliseum/the_lock.png new file mode 100644 index 00000000..53f10ac4 Binary files /dev/null and b/KhTracker/Images/Progression/Old/olympus_coliseum/the_lock.png differ diff --git a/KhTracker/Images/Progression/Old/olympus_coliseum/urns.png b/KhTracker/Images/Progression/Old/olympus_coliseum/urns.png new file mode 100644 index 00000000..351d56c3 Binary files /dev/null and b/KhTracker/Images/Progression/Old/olympus_coliseum/urns.png differ diff --git a/KhTracker/Images/Progression/Old/olympus_coliseum/zexion.png b/KhTracker/Images/Progression/Old/olympus_coliseum/zexion.png new file mode 100644 index 00000000..570e651b Binary files /dev/null and b/KhTracker/Images/Progression/Old/olympus_coliseum/zexion.png differ diff --git a/KhTracker/Images/Progression/Old/port_royal/barbossa.png b/KhTracker/Images/Progression/Old/port_royal/barbossa.png new file mode 100644 index 00000000..17909d63 Binary files /dev/null and b/KhTracker/Images/Progression/Old/port_royal/barbossa.png differ diff --git a/KhTracker/Images/Progression/Old/port_royal/cursed_reaper.png b/KhTracker/Images/Progression/Old/port_royal/cursed_reaper.png new file mode 100644 index 00000000..5616441c Binary files /dev/null and b/KhTracker/Images/Progression/Old/port_royal/cursed_reaper.png differ diff --git a/KhTracker/Images/Progression/Old/port_royal/explosives.png b/KhTracker/Images/Progression/Old/port_royal/explosives.png new file mode 100644 index 00000000..be33fc7c Binary files /dev/null and b/KhTracker/Images/Progression/Old/port_royal/explosives.png differ diff --git a/KhTracker/Images/Progression/Old/port_royal/gamblers.png b/KhTracker/Images/Progression/Old/port_royal/gamblers.png new file mode 100644 index 00000000..45d7dc36 Binary files /dev/null and b/KhTracker/Images/Progression/Old/port_royal/gamblers.png differ diff --git a/KhTracker/Images/Progression/Old/port_royal/grim_reaper.png b/KhTracker/Images/Progression/Old/port_royal/grim_reaper.png new file mode 100644 index 00000000..6b6eb508 Binary files /dev/null and b/KhTracker/Images/Progression/Old/port_royal/grim_reaper.png differ diff --git a/KhTracker/Images/Progression/Old/port_royal/isla_de_muerta.png b/KhTracker/Images/Progression/Old/port_royal/isla_de_muerta.png new file mode 100644 index 00000000..ee6799e1 Binary files /dev/null and b/KhTracker/Images/Progression/Old/port_royal/isla_de_muerta.png differ diff --git a/KhTracker/Images/Progression/Old/port_royal/luxord.png b/KhTracker/Images/Progression/Old/port_royal/luxord.png new file mode 100644 index 00000000..e9234d8c Binary files /dev/null and b/KhTracker/Images/Progression/Old/port_royal/luxord.png differ diff --git a/KhTracker/Images/Progression/Old/port_royal/medallions.png b/KhTracker/Images/Progression/Old/port_royal/medallions.png new file mode 100644 index 00000000..8b1614cd Binary files /dev/null and b/KhTracker/Images/Progression/Old/port_royal/medallions.png differ diff --git a/KhTracker/Images/Progression/Old/port_royal/town.png b/KhTracker/Images/Progression/Old/port_royal/town.png new file mode 100644 index 00000000..70e7e52b Binary files /dev/null and b/KhTracker/Images/Progression/Old/port_royal/town.png differ diff --git a/KhTracker/Images/Progression/Old/pride_lands/groundshaker.png b/KhTracker/Images/Progression/Old/pride_lands/groundshaker.png new file mode 100644 index 00000000..82a4207d Binary files /dev/null and b/KhTracker/Images/Progression/Old/pride_lands/groundshaker.png differ diff --git a/KhTracker/Images/Progression/Old/pride_lands/hyenas.png b/KhTracker/Images/Progression/Old/pride_lands/hyenas.png new file mode 100644 index 00000000..9eee39f3 Binary files /dev/null and b/KhTracker/Images/Progression/Old/pride_lands/hyenas.png differ diff --git a/KhTracker/Images/Progression/Old/pride_lands/oasis.png b/KhTracker/Images/Progression/Old/pride_lands/oasis.png new file mode 100644 index 00000000..346c5802 Binary files /dev/null and b/KhTracker/Images/Progression/Old/pride_lands/oasis.png differ diff --git a/KhTracker/Images/Progression/Old/pride_lands/saix.png b/KhTracker/Images/Progression/Old/pride_lands/saix.png new file mode 100644 index 00000000..c4d72285 Binary files /dev/null and b/KhTracker/Images/Progression/Old/pride_lands/saix.png differ diff --git a/KhTracker/Images/Progression/Old/pride_lands/scar.png b/KhTracker/Images/Progression/Old/pride_lands/scar.png new file mode 100644 index 00000000..ddca22b6 Binary files /dev/null and b/KhTracker/Images/Progression/Old/pride_lands/scar.png differ diff --git a/KhTracker/Images/Progression/Old/pride_lands/timon_and_pumba.png b/KhTracker/Images/Progression/Old/pride_lands/timon_and_pumba.png new file mode 100644 index 00000000..cdfe67f5 Binary files /dev/null and b/KhTracker/Images/Progression/Old/pride_lands/timon_and_pumba.png differ diff --git a/KhTracker/Images/Progression/Old/simulated_twilight_town/axel_story.png b/KhTracker/Images/Progression/Old/simulated_twilight_town/axel_story.png new file mode 100644 index 00000000..d81812f2 Binary files /dev/null and b/KhTracker/Images/Progression/Old/simulated_twilight_town/axel_story.png differ diff --git a/KhTracker/Images/Progression/Old/simulated_twilight_town/computer_room.png b/KhTracker/Images/Progression/Old/simulated_twilight_town/computer_room.png new file mode 100644 index 00000000..74d903e9 Binary files /dev/null and b/KhTracker/Images/Progression/Old/simulated_twilight_town/computer_room.png differ diff --git a/KhTracker/Images/Progression/Old/simulated_twilight_town/munny_pouch.png b/KhTracker/Images/Progression/Old/simulated_twilight_town/munny_pouch.png new file mode 100644 index 00000000..b2ec3d90 Binary files /dev/null and b/KhTracker/Images/Progression/Old/simulated_twilight_town/munny_pouch.png differ diff --git a/KhTracker/Images/Progression/Old/simulated_twilight_town/pod_room.png b/KhTracker/Images/Progression/Old/simulated_twilight_town/pod_room.png new file mode 100644 index 00000000..e49c6461 Binary files /dev/null and b/KhTracker/Images/Progression/Old/simulated_twilight_town/pod_room.png differ diff --git a/KhTracker/Images/Progression/Old/simulated_twilight_town/roxas.png b/KhTracker/Images/Progression/Old/simulated_twilight_town/roxas.png new file mode 100644 index 00000000..41a0213c Binary files /dev/null and b/KhTracker/Images/Progression/Old/simulated_twilight_town/roxas.png differ diff --git a/KhTracker/Images/Progression/Old/simulated_twilight_town/struggle.png b/KhTracker/Images/Progression/Old/simulated_twilight_town/struggle.png new file mode 100644 index 00000000..b58ca684 Binary files /dev/null and b/KhTracker/Images/Progression/Old/simulated_twilight_town/struggle.png differ diff --git a/KhTracker/Images/Progression/Old/simulated_twilight_town/twilight_thorn.png b/KhTracker/Images/Progression/Old/simulated_twilight_town/twilight_thorn.png new file mode 100644 index 00000000..10f47af6 Binary files /dev/null and b/KhTracker/Images/Progression/Old/simulated_twilight_town/twilight_thorn.png differ diff --git a/KhTracker/Images/Progression/Old/space_paranoids/dataspace.png b/KhTracker/Images/Progression/Old/space_paranoids/dataspace.png new file mode 100644 index 00000000..f569f3a9 Binary files /dev/null and b/KhTracker/Images/Progression/Old/space_paranoids/dataspace.png differ diff --git a/KhTracker/Images/Progression/Old/space_paranoids/hostile_program.png b/KhTracker/Images/Progression/Old/space_paranoids/hostile_program.png new file mode 100644 index 00000000..bac0798b Binary files /dev/null and b/KhTracker/Images/Progression/Old/space_paranoids/hostile_program.png differ diff --git a/KhTracker/Images/Progression/Old/space_paranoids/larxene.png b/KhTracker/Images/Progression/Old/space_paranoids/larxene.png new file mode 100644 index 00000000..c91a02a9 Binary files /dev/null and b/KhTracker/Images/Progression/Old/space_paranoids/larxene.png differ diff --git a/KhTracker/Images/Progression/Old/space_paranoids/master_control_program.png b/KhTracker/Images/Progression/Old/space_paranoids/master_control_program.png new file mode 100644 index 00000000..64bf62d9 Binary files /dev/null and b/KhTracker/Images/Progression/Old/space_paranoids/master_control_program.png differ diff --git a/KhTracker/Images/Progression/Old/space_paranoids/sark.png b/KhTracker/Images/Progression/Old/space_paranoids/sark.png new file mode 100644 index 00000000..0c421c81 Binary files /dev/null and b/KhTracker/Images/Progression/Old/space_paranoids/sark.png differ diff --git a/KhTracker/Images/Progression/Old/space_paranoids/solar_sailer.png b/KhTracker/Images/Progression/Old/space_paranoids/solar_sailer.png new file mode 100644 index 00000000..3fc53725 Binary files /dev/null and b/KhTracker/Images/Progression/Old/space_paranoids/solar_sailer.png differ diff --git a/KhTracker/Images/Progression/Old/the_world_that_never_was/kingdom_hearts.png b/KhTracker/Images/Progression/Old/the_world_that_never_was/kingdom_hearts.png new file mode 100644 index 00000000..1aede3d1 Binary files /dev/null and b/KhTracker/Images/Progression/Old/the_world_that_never_was/kingdom_hearts.png differ diff --git a/KhTracker/Images/Progression/Old/the_world_that_never_was/luxord.png b/KhTracker/Images/Progression/Old/the_world_that_never_was/luxord.png new file mode 100644 index 00000000..014c789e Binary files /dev/null and b/KhTracker/Images/Progression/Old/the_world_that_never_was/luxord.png differ diff --git a/KhTracker/Images/Progression/Old/the_world_that_never_was/roxas.png b/KhTracker/Images/Progression/Old/the_world_that_never_was/roxas.png new file mode 100644 index 00000000..01ee4a7e Binary files /dev/null and b/KhTracker/Images/Progression/Old/the_world_that_never_was/roxas.png differ diff --git a/KhTracker/Images/Progression/Old/the_world_that_never_was/saix.png b/KhTracker/Images/Progression/Old/the_world_that_never_was/saix.png new file mode 100644 index 00000000..5c679aae Binary files /dev/null and b/KhTracker/Images/Progression/Old/the_world_that_never_was/saix.png differ diff --git a/KhTracker/Images/Progression/Old/the_world_that_never_was/xemnas.png b/KhTracker/Images/Progression/Old/the_world_that_never_was/xemnas.png new file mode 100644 index 00000000..27b40b42 Binary files /dev/null and b/KhTracker/Images/Progression/Old/the_world_that_never_was/xemnas.png differ diff --git a/KhTracker/Images/Progression/Old/the_world_that_never_was/xigbar.png b/KhTracker/Images/Progression/Old/the_world_that_never_was/xigbar.png new file mode 100644 index 00000000..7ed6f343 Binary files /dev/null and b/KhTracker/Images/Progression/Old/the_world_that_never_was/xigbar.png differ diff --git a/KhTracker/Images/Progression/Old/twilight_town/axel.png b/KhTracker/Images/Progression/Old/twilight_town/axel.png new file mode 100644 index 00000000..1d7ca7ea Binary files /dev/null and b/KhTracker/Images/Progression/Old/twilight_town/axel.png differ diff --git a/KhTracker/Images/Progression/Old/twilight_town/berserkers.png b/KhTracker/Images/Progression/Old/twilight_town/berserkers.png new file mode 100644 index 00000000..5366b36b Binary files /dev/null and b/KhTracker/Images/Progression/Old/twilight_town/berserkers.png differ diff --git a/KhTracker/Images/Progression/Old/twilight_town/betwixt.png b/KhTracker/Images/Progression/Old/twilight_town/betwixt.png new file mode 100644 index 00000000..9e20cdd5 Binary files /dev/null and b/KhTracker/Images/Progression/Old/twilight_town/betwixt.png differ diff --git a/KhTracker/Images/Progression/Old/twilight_town/betwixt_and_between.png b/KhTracker/Images/Progression/Old/twilight_town/betwixt_and_between.png new file mode 100644 index 00000000..465a170d Binary files /dev/null and b/KhTracker/Images/Progression/Old/twilight_town/betwixt_and_between.png differ diff --git a/KhTracker/Images/Progression/Old/twilight_town/dusks.png b/KhTracker/Images/Progression/Old/twilight_town/dusks.png new file mode 100644 index 00000000..e1cedc53 Binary files /dev/null and b/KhTracker/Images/Progression/Old/twilight_town/dusks.png differ diff --git a/KhTracker/Images/Progression/Old/twilight_town/mickey.png b/KhTracker/Images/Progression/Old/twilight_town/mickey.png new file mode 100644 index 00000000..588caa7e Binary files /dev/null and b/KhTracker/Images/Progression/Old/twilight_town/mickey.png differ diff --git a/KhTracker/Images/Progression/Old/twilight_town/mysterious_tower.png b/KhTracker/Images/Progression/Old/twilight_town/mysterious_tower.png new file mode 100644 index 00000000..41e7c15a Binary files /dev/null and b/KhTracker/Images/Progression/Old/twilight_town/mysterious_tower.png differ diff --git a/KhTracker/Images/Progression/Struggle.png b/KhTracker/Images/Progression/Struggle.png deleted file mode 100644 index 1809b1b3..00000000 Binary files a/KhTracker/Images/Progression/Struggle.png and /dev/null differ diff --git a/KhTracker/Images/Progression/abu.png b/KhTracker/Images/Progression/abu.png deleted file mode 100644 index 3ae909d7..00000000 Binary files a/KhTracker/Images/Progression/abu.png and /dev/null differ diff --git a/KhTracker/Images/Progression/ansem_the_wise.png b/KhTracker/Images/Progression/ansem_the_wise.png deleted file mode 100644 index 2b5c006a..00000000 Binary files a/KhTracker/Images/Progression/ansem_the_wise.png and /dev/null differ diff --git a/KhTracker/Images/Progression/assault_rider.png b/KhTracker/Images/Progression/assault_rider.png deleted file mode 100644 index 1c45a2ed..00000000 Binary files a/KhTracker/Images/Progression/assault_rider.png and /dev/null differ diff --git a/KhTracker/Images/Progression/axel.png b/KhTracker/Images/Progression/axel.png deleted file mode 100644 index d2e97852..00000000 Binary files a/KhTracker/Images/Progression/axel.png and /dev/null differ diff --git a/KhTracker/Images/Progression/barbossa.png b/KhTracker/Images/Progression/barbossa.png deleted file mode 100644 index 8955cfa5..00000000 Binary files a/KhTracker/Images/Progression/barbossa.png and /dev/null differ diff --git a/KhTracker/Images/Progression/beast.png b/KhTracker/Images/Progression/beast.png deleted file mode 100644 index ee49a813..00000000 Binary files a/KhTracker/Images/Progression/beast.png and /dev/null differ diff --git a/KhTracker/Images/Progression/bees.png b/KhTracker/Images/Progression/bees.png deleted file mode 100644 index ab0b25ea..00000000 Binary files a/KhTracker/Images/Progression/bees.png and /dev/null differ diff --git a/KhTracker/Images/Progression/berserker.png b/KhTracker/Images/Progression/berserker.png deleted file mode 100644 index 44459430..00000000 Binary files a/KhTracker/Images/Progression/berserker.png and /dev/null differ diff --git a/KhTracker/Images/Progression/blizzard_lord.png b/KhTracker/Images/Progression/blizzard_lord.png deleted file mode 100644 index 9aecade7..00000000 Binary files a/KhTracker/Images/Progression/blizzard_lord.png and /dev/null differ diff --git a/KhTracker/Images/Progression/boat_pete.png b/KhTracker/Images/Progression/boat_pete.png deleted file mode 100644 index c89e199e..00000000 Binary files a/KhTracker/Images/Progression/boat_pete.png and /dev/null differ diff --git a/KhTracker/Images/Progression/cannon_gun.png b/KhTracker/Images/Progression/cannon_gun.png deleted file mode 100644 index 11f8a10f..00000000 Binary files a/KhTracker/Images/Progression/cannon_gun.png and /dev/null differ diff --git a/KhTracker/Images/Progression/carpet.png b/KhTracker/Images/Progression/carpet.png deleted file mode 100644 index 3948e6b4..00000000 Binary files a/KhTracker/Images/Progression/carpet.png and /dev/null differ diff --git a/KhTracker/Images/Progression/cerberus.png b/KhTracker/Images/Progression/cerberus.png deleted file mode 100644 index f9f5c000..00000000 Binary files a/KhTracker/Images/Progression/cerberus.png and /dev/null differ diff --git a/KhTracker/Images/Progression/chasm_of_challenges.png b/KhTracker/Images/Progression/chasm_of_challenges.png deleted file mode 100644 index 1ef97171..00000000 Binary files a/KhTracker/Images/Progression/chasm_of_challenges.png and /dev/null differ diff --git a/KhTracker/Images/Progression/chest.png b/KhTracker/Images/Progression/chest.png deleted file mode 100644 index a35d1ff9..00000000 Binary files a/KhTracker/Images/Progression/chest.png and /dev/null differ diff --git a/KhTracker/Images/Progression/cloud.png b/KhTracker/Images/Progression/cloud.png deleted file mode 100644 index b9ad35ff..00000000 Binary files a/KhTracker/Images/Progression/cloud.png and /dev/null differ diff --git a/KhTracker/Images/Progression/computer_room.png b/KhTracker/Images/Progression/computer_room.png deleted file mode 100644 index 9c5b04e9..00000000 Binary files a/KhTracker/Images/Progression/computer_room.png and /dev/null differ diff --git a/KhTracker/Images/Progression/crimson_jazz.png b/KhTracker/Images/Progression/crimson_jazz.png deleted file mode 100644 index d86d552d..00000000 Binary files a/KhTracker/Images/Progression/crimson_jazz.png and /dev/null differ diff --git a/KhTracker/Images/Progression/dancer.png b/KhTracker/Images/Progression/dancer.png deleted file mode 100644 index 07e16d06..00000000 Binary files a/KhTracker/Images/Progression/dancer.png and /dev/null differ diff --git a/KhTracker/Images/Progression/dark_thorn.png b/KhTracker/Images/Progression/dark_thorn.png deleted file mode 100644 index 58f3d415..00000000 Binary files a/KhTracker/Images/Progression/dark_thorn.png and /dev/null differ diff --git a/KhTracker/Images/Progression/demyx.png b/KhTracker/Images/Progression/demyx.png deleted file mode 100644 index 50854014..00000000 Binary files a/KhTracker/Images/Progression/demyx.png and /dev/null differ diff --git a/KhTracker/Images/Progression/devastator.png b/KhTracker/Images/Progression/devastator.png deleted file mode 100644 index 45c0bad7..00000000 Binary files a/KhTracker/Images/Progression/devastator.png and /dev/null differ diff --git a/KhTracker/Images/Progression/dragoon.png b/KhTracker/Images/Progression/dragoon.png deleted file mode 100644 index c1849279..00000000 Binary files a/KhTracker/Images/Progression/dragoon.png and /dev/null differ diff --git a/KhTracker/Images/Progression/dusk.png b/KhTracker/Images/Progression/dusk.png deleted file mode 100644 index f73fe91f..00000000 Binary files a/KhTracker/Images/Progression/dusk.png and /dev/null differ diff --git a/KhTracker/Images/Progression/emblem.png b/KhTracker/Images/Progression/emblem.png new file mode 100644 index 00000000..1bf5c3db Binary files /dev/null and b/KhTracker/Images/Progression/emblem.png differ diff --git a/KhTracker/Images/Progression/emperor.png b/KhTracker/Images/Progression/emperor.png deleted file mode 100644 index 2f20b906..00000000 Binary files a/KhTracker/Images/Progression/emperor.png and /dev/null differ diff --git a/KhTracker/Images/Progression/experiment.png b/KhTracker/Images/Progression/experiment.png deleted file mode 100644 index 86389fd1..00000000 Binary files a/KhTracker/Images/Progression/experiment.png and /dev/null differ diff --git a/KhTracker/Images/Progression/gambler.png b/KhTracker/Images/Progression/gambler.png deleted file mode 100644 index 373ef639..00000000 Binary files a/KhTracker/Images/Progression/gambler.png and /dev/null differ diff --git a/KhTracker/Images/Progression/genie_jafar.png b/KhTracker/Images/Progression/genie_jafar.png deleted file mode 100644 index 5ee1e63f..00000000 Binary files a/KhTracker/Images/Progression/genie_jafar.png and /dev/null differ diff --git a/KhTracker/Images/Progression/grim_reaper.png b/KhTracker/Images/Progression/grim_reaper.png deleted file mode 100644 index 1dcce16e..00000000 Binary files a/KhTracker/Images/Progression/grim_reaper.png and /dev/null differ diff --git a/KhTracker/Images/Progression/groundshaker.png b/KhTracker/Images/Progression/groundshaker.png deleted file mode 100644 index 9708c4af..00000000 Binary files a/KhTracker/Images/Progression/groundshaker.png and /dev/null differ diff --git a/KhTracker/Images/Progression/hades.png b/KhTracker/Images/Progression/hades.png deleted file mode 100644 index 43dad2a7..00000000 Binary files a/KhTracker/Images/Progression/hades.png and /dev/null differ diff --git a/KhTracker/Images/Progression/hostile_program.png b/KhTracker/Images/Progression/hostile_program.png deleted file mode 100644 index 23b1ff2d..00000000 Binary files a/KhTracker/Images/Progression/hostile_program.png and /dev/null differ diff --git a/KhTracker/Images/Progression/hot_rod.png b/KhTracker/Images/Progression/hot_rod.png deleted file mode 100644 index 2517eafc..00000000 Binary files a/KhTracker/Images/Progression/hot_rod.png and /dev/null differ diff --git a/KhTracker/Images/Progression/hydra.png b/KhTracker/Images/Progression/hydra.png deleted file mode 100644 index 4d124fb5..00000000 Binary files a/KhTracker/Images/Progression/hydra.png and /dev/null differ diff --git a/KhTracker/Images/Progression/hyenas.png b/KhTracker/Images/Progression/hyenas.png deleted file mode 100644 index 615f8426..00000000 Binary files a/KhTracker/Images/Progression/hyenas.png and /dev/null differ diff --git a/KhTracker/Images/Progression/kanga.png b/KhTracker/Images/Progression/kanga.png deleted file mode 100644 index 04c3ac12..00000000 Binary files a/KhTracker/Images/Progression/kanga.png and /dev/null differ diff --git a/KhTracker/Images/Progression/luxord.png b/KhTracker/Images/Progression/luxord.png deleted file mode 100644 index 8d5fc10e..00000000 Binary files a/KhTracker/Images/Progression/luxord.png and /dev/null differ diff --git a/KhTracker/Images/Progression/marluxia.png b/KhTracker/Images/Progression/marluxia.png deleted file mode 100644 index 2a9e8f5e..00000000 Binary files a/KhTracker/Images/Progression/marluxia.png and /dev/null differ diff --git a/KhTracker/Images/Progression/master_control_program.png b/KhTracker/Images/Progression/master_control_program.png deleted file mode 100644 index 1be239e9..00000000 Binary files a/KhTracker/Images/Progression/master_control_program.png and /dev/null differ diff --git a/KhTracker/Images/Progression/merlin.png b/KhTracker/Images/Progression/merlin.png deleted file mode 100644 index e27a1464..00000000 Binary files a/KhTracker/Images/Progression/merlin.png and /dev/null differ diff --git a/KhTracker/Images/Progression/mickey.png b/KhTracker/Images/Progression/mickey.png deleted file mode 100644 index ae5ee3b9..00000000 Binary files a/KhTracker/Images/Progression/mickey.png and /dev/null differ diff --git a/KhTracker/Images/Progression/mickey_head.png b/KhTracker/Images/Progression/mickey_head.png deleted file mode 100644 index 571958e0..00000000 Binary files a/KhTracker/Images/Progression/mickey_head.png and /dev/null differ diff --git a/KhTracker/Images/Progression/minnie.png b/KhTracker/Images/Progression/minnie.png deleted file mode 100644 index 9b1f063a..00000000 Binary files a/KhTracker/Images/Progression/minnie.png and /dev/null differ diff --git a/KhTracker/Images/Progression/old_pete.png b/KhTracker/Images/Progression/old_pete.png deleted file mode 100644 index 7c87e749..00000000 Binary files a/KhTracker/Images/Progression/old_pete.png and /dev/null differ diff --git a/KhTracker/Images/Progression/oogie_boogie.png b/KhTracker/Images/Progression/oogie_boogie.png deleted file mode 100644 index 4128e3f7..00000000 Binary files a/KhTracker/Images/Progression/oogie_boogie.png and /dev/null differ diff --git a/KhTracker/Images/Progression/pete.png b/KhTracker/Images/Progression/pete.png deleted file mode 100644 index c7ba4ad6..00000000 Binary files a/KhTracker/Images/Progression/pete.png and /dev/null differ diff --git a/KhTracker/Images/Progression/pete_pete.png b/KhTracker/Images/Progression/pete_pete.png deleted file mode 100644 index 12713968..00000000 Binary files a/KhTracker/Images/Progression/pete_pete.png and /dev/null differ diff --git a/KhTracker/Images/Progression/piglet.png b/KhTracker/Images/Progression/piglet.png deleted file mode 100644 index 49c6f0a8..00000000 Binary files a/KhTracker/Images/Progression/piglet.png and /dev/null differ diff --git a/KhTracker/Images/Progression/pooh.png b/KhTracker/Images/Progression/pooh.png deleted file mode 100644 index efd6df9e..00000000 Binary files a/KhTracker/Images/Progression/pooh.png and /dev/null differ diff --git a/KhTracker/Images/Progression/presents.png b/KhTracker/Images/Progression/presents.png deleted file mode 100644 index 68c76a34..00000000 Binary files a/KhTracker/Images/Progression/presents.png and /dev/null differ diff --git a/KhTracker/Images/Progression/prison_keeper.png b/KhTracker/Images/Progression/prison_keeper.png deleted file mode 100644 index ee563a39..00000000 Binary files a/KhTracker/Images/Progression/prison_keeper.png and /dev/null differ diff --git a/KhTracker/Images/Progression/rabbit.png b/KhTracker/Images/Progression/rabbit.png deleted file mode 100644 index 75b900e9..00000000 Binary files a/KhTracker/Images/Progression/rabbit.png and /dev/null differ diff --git a/KhTracker/Images/Progression/rapid_thruster.png b/KhTracker/Images/Progression/rapid_thruster.png deleted file mode 100644 index db2e1c02..00000000 Binary files a/KhTracker/Images/Progression/rapid_thruster.png and /dev/null differ diff --git a/KhTracker/Images/Progression/roxas.png b/KhTracker/Images/Progression/roxas.png deleted file mode 100644 index 2b3b3bb3..00000000 Binary files a/KhTracker/Images/Progression/roxas.png and /dev/null differ diff --git a/KhTracker/Images/Progression/saix.png b/KhTracker/Images/Progression/saix.png deleted file mode 100644 index b5e23591..00000000 Binary files a/KhTracker/Images/Progression/saix.png and /dev/null differ diff --git a/KhTracker/Images/Progression/scar.png b/KhTracker/Images/Progression/scar.png deleted file mode 100644 index f777510c..00000000 Binary files a/KhTracker/Images/Progression/scar.png and /dev/null differ diff --git a/KhTracker/Images/Progression/screens.png b/KhTracker/Images/Progression/screens.png deleted file mode 100644 index 53200470..00000000 Binary files a/KhTracker/Images/Progression/screens.png and /dev/null differ diff --git a/KhTracker/Images/Progression/sephiroth.png b/KhTracker/Images/Progression/sephiroth.png deleted file mode 100644 index 99aca8d4..00000000 Binary files a/KhTracker/Images/Progression/sephiroth.png and /dev/null differ diff --git a/KhTracker/Images/Progression/shan_yu.png b/KhTracker/Images/Progression/shan_yu.png deleted file mode 100644 index ed9362de..00000000 Binary files a/KhTracker/Images/Progression/shan_yu.png and /dev/null differ diff --git a/KhTracker/Images/Progression/simba.png b/KhTracker/Images/Progression/simba.png deleted file mode 100644 index 0e4f5a1a..00000000 Binary files a/KhTracker/Images/Progression/simba.png and /dev/null differ diff --git a/KhTracker/Images/Progression/storm_rider.png b/KhTracker/Images/Progression/storm_rider.png deleted file mode 100644 index e31cc4fd..00000000 Binary files a/KhTracker/Images/Progression/storm_rider.png and /dev/null differ diff --git a/KhTracker/Images/Progression/thresholder.png b/KhTracker/Images/Progression/thresholder.png deleted file mode 100644 index d98f7ff2..00000000 Binary files a/KhTracker/Images/Progression/thresholder.png and /dev/null differ diff --git a/KhTracker/Images/Progression/toy_soldier.png b/KhTracker/Images/Progression/toy_soldier.png deleted file mode 100644 index 68df603b..00000000 Binary files a/KhTracker/Images/Progression/toy_soldier.png and /dev/null differ diff --git a/KhTracker/Images/Progression/treasure_room.png b/KhTracker/Images/Progression/treasure_room.png deleted file mode 100644 index 9cc08ed0..00000000 Binary files a/KhTracker/Images/Progression/treasure_room.png and /dev/null differ diff --git a/KhTracker/Images/Progression/twilight_thorn.png b/KhTracker/Images/Progression/twilight_thorn.png deleted file mode 100644 index 861c81dd..00000000 Binary files a/KhTracker/Images/Progression/twilight_thorn.png and /dev/null differ diff --git a/KhTracker/Images/Progression/ursula.png b/KhTracker/Images/Progression/ursula.png deleted file mode 100644 index 0908c8b1..00000000 Binary files a/KhTracker/Images/Progression/ursula.png and /dev/null differ diff --git a/KhTracker/Images/Progression/wardrobe.png b/KhTracker/Images/Progression/wardrobe.png deleted file mode 100644 index ddb9bea4..00000000 Binary files a/KhTracker/Images/Progression/wardrobe.png and /dev/null differ diff --git a/KhTracker/Images/Progression/xaldin.png b/KhTracker/Images/Progression/xaldin.png deleted file mode 100644 index 0283397a..00000000 Binary files a/KhTracker/Images/Progression/xaldin.png and /dev/null differ diff --git a/KhTracker/Images/Progression/xemnas.png b/KhTracker/Images/Progression/xemnas.png deleted file mode 100644 index 0261d7d0..00000000 Binary files a/KhTracker/Images/Progression/xemnas.png and /dev/null differ diff --git a/KhTracker/Images/Progression/xigbar.png b/KhTracker/Images/Progression/xigbar.png deleted file mode 100644 index 4f4c4439..00000000 Binary files a/KhTracker/Images/Progression/xigbar.png and /dev/null differ diff --git a/KhTracker/Images/Progression/yen_sid.png b/KhTracker/Images/Progression/yen_sid.png deleted file mode 100644 index 2efd8256..00000000 Binary files a/KhTracker/Images/Progression/yen_sid.png and /dev/null differ diff --git a/KhTracker/Images/Simple/100_acre_wood.png b/KhTracker/Images/Simple/100_acre_wood.png deleted file mode 100644 index 69819f16..00000000 Binary files a/KhTracker/Images/Simple/100_acre_wood.png and /dev/null differ diff --git a/KhTracker/Images/Simple/Drive_Orb_KHII.png b/KhTracker/Images/Simple/Drive_Orb_KHII.png deleted file mode 100644 index b6c3d902..00000000 Binary files a/KhTracker/Images/Simple/Drive_Orb_KHII.png and /dev/null differ diff --git a/KhTracker/Images/Simple/agrabah.png b/KhTracker/Images/Simple/agrabah.png deleted file mode 100644 index 616e7986..00000000 Binary files a/KhTracker/Images/Simple/agrabah.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report.png b/KhTracker/Images/Simple/ansem_report.png deleted file mode 100644 index a1578c79..00000000 Binary files a/KhTracker/Images/Simple/ansem_report.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report1.png b/KhTracker/Images/Simple/ansem_report1.png deleted file mode 100644 index 89ed486c..00000000 Binary files a/KhTracker/Images/Simple/ansem_report1.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report10.png b/KhTracker/Images/Simple/ansem_report10.png deleted file mode 100644 index a47bd5e3..00000000 Binary files a/KhTracker/Images/Simple/ansem_report10.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report11.png b/KhTracker/Images/Simple/ansem_report11.png deleted file mode 100644 index dca75814..00000000 Binary files a/KhTracker/Images/Simple/ansem_report11.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report12.png b/KhTracker/Images/Simple/ansem_report12.png deleted file mode 100644 index 236bac82..00000000 Binary files a/KhTracker/Images/Simple/ansem_report12.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report13.png b/KhTracker/Images/Simple/ansem_report13.png deleted file mode 100644 index 1a07b829..00000000 Binary files a/KhTracker/Images/Simple/ansem_report13.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report2.png b/KhTracker/Images/Simple/ansem_report2.png deleted file mode 100644 index 231c7403..00000000 Binary files a/KhTracker/Images/Simple/ansem_report2.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report3.png b/KhTracker/Images/Simple/ansem_report3.png deleted file mode 100644 index 880f8368..00000000 Binary files a/KhTracker/Images/Simple/ansem_report3.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report4.png b/KhTracker/Images/Simple/ansem_report4.png deleted file mode 100644 index e213ebbe..00000000 Binary files a/KhTracker/Images/Simple/ansem_report4.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report5.png b/KhTracker/Images/Simple/ansem_report5.png deleted file mode 100644 index 8660ca22..00000000 Binary files a/KhTracker/Images/Simple/ansem_report5.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report6.png b/KhTracker/Images/Simple/ansem_report6.png deleted file mode 100644 index 686c44ce..00000000 Binary files a/KhTracker/Images/Simple/ansem_report6.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report7.png b/KhTracker/Images/Simple/ansem_report7.png deleted file mode 100644 index c2438407..00000000 Binary files a/KhTracker/Images/Simple/ansem_report7.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report8.png b/KhTracker/Images/Simple/ansem_report8.png deleted file mode 100644 index c452abe1..00000000 Binary files a/KhTracker/Images/Simple/ansem_report8.png and /dev/null differ diff --git a/KhTracker/Images/Simple/ansem_report9.png b/KhTracker/Images/Simple/ansem_report9.png deleted file mode 100644 index 9b7aed82..00000000 Binary files a/KhTracker/Images/Simple/ansem_report9.png and /dev/null differ diff --git a/KhTracker/Images/Simple/atlantica.png b/KhTracker/Images/Simple/atlantica.png deleted file mode 100644 index e6fc4a88..00000000 Binary files a/KhTracker/Images/Simple/atlantica.png and /dev/null differ diff --git a/KhTracker/Images/Simple/beast's_castle.png b/KhTracker/Images/Simple/beast's_castle.png deleted file mode 100644 index 3b3f2dc4..00000000 Binary files a/KhTracker/Images/Simple/beast's_castle.png and /dev/null differ diff --git a/KhTracker/Images/Simple/blizzard.png b/KhTracker/Images/Simple/blizzard.png deleted file mode 100644 index e7e74482..00000000 Binary files a/KhTracker/Images/Simple/blizzard.png and /dev/null differ diff --git a/KhTracker/Images/Simple/cavern_of_remembrance.png b/KhTracker/Images/Simple/cavern_of_remembrance.png deleted file mode 100644 index a5a1951f..00000000 Binary files a/KhTracker/Images/Simple/cavern_of_remembrance.png and /dev/null differ diff --git a/KhTracker/Images/Simple/chicken_little.png b/KhTracker/Images/Simple/chicken_little.png deleted file mode 100644 index ddcffda3..00000000 Binary files a/KhTracker/Images/Simple/chicken_little.png and /dev/null differ diff --git a/KhTracker/Images/Simple/cure.png b/KhTracker/Images/Simple/cure.png deleted file mode 100644 index a6ae0729..00000000 Binary files a/KhTracker/Images/Simple/cure.png and /dev/null differ diff --git a/KhTracker/Images/Simple/defence.png b/KhTracker/Images/Simple/defence.png deleted file mode 100644 index fac2d6a0..00000000 Binary files a/KhTracker/Images/Simple/defence.png and /dev/null differ diff --git a/KhTracker/Images/Simple/disney_castle.png b/KhTracker/Images/Simple/disney_castle.png deleted file mode 100644 index bae7a4d7..00000000 Binary files a/KhTracker/Images/Simple/disney_castle.png and /dev/null differ diff --git a/KhTracker/Images/Simple/drive_form.png b/KhTracker/Images/Simple/drive_form.png deleted file mode 100644 index 593c8294..00000000 Binary files a/KhTracker/Images/Simple/drive_form.png and /dev/null differ diff --git a/KhTracker/Images/Simple/drive_forms.png b/KhTracker/Images/Simple/drive_forms.png deleted file mode 100644 index 35484544..00000000 Binary files a/KhTracker/Images/Simple/drive_forms.png and /dev/null differ diff --git a/KhTracker/Images/Simple/final.png b/KhTracker/Images/Simple/final.png deleted file mode 100644 index c145f27e..00000000 Binary files a/KhTracker/Images/Simple/final.png and /dev/null differ diff --git a/KhTracker/Images/Simple/fire.png b/KhTracker/Images/Simple/fire.png deleted file mode 100644 index 070e13c2..00000000 Binary files a/KhTracker/Images/Simple/fire.png and /dev/null differ diff --git a/KhTracker/Images/Simple/genie.png b/KhTracker/Images/Simple/genie.png deleted file mode 100644 index f6cc3d9d..00000000 Binary files a/KhTracker/Images/Simple/genie.png and /dev/null differ diff --git a/KhTracker/Images/Simple/halloween_town.png b/KhTracker/Images/Simple/halloween_town.png deleted file mode 100644 index a04f6bed..00000000 Binary files a/KhTracker/Images/Simple/halloween_town.png and /dev/null differ diff --git a/KhTracker/Images/Simple/hollow_bastion.png b/KhTracker/Images/Simple/hollow_bastion.png deleted file mode 100644 index 26789a22..00000000 Binary files a/KhTracker/Images/Simple/hollow_bastion.png and /dev/null differ diff --git a/KhTracker/Images/Simple/land_of_dragons.png b/KhTracker/Images/Simple/land_of_dragons.png deleted file mode 100644 index 66d0adbf..00000000 Binary files a/KhTracker/Images/Simple/land_of_dragons.png and /dev/null differ diff --git a/KhTracker/Images/Simple/level.png b/KhTracker/Images/Simple/level.png deleted file mode 100644 index f1b5d6f2..00000000 Binary files a/KhTracker/Images/Simple/level.png and /dev/null differ diff --git a/KhTracker/Images/Simple/limit.png b/KhTracker/Images/Simple/limit.png deleted file mode 100644 index 5b189dd9..00000000 Binary files a/KhTracker/Images/Simple/limit.png and /dev/null differ diff --git a/KhTracker/Images/Simple/magic.png b/KhTracker/Images/Simple/magic.png deleted file mode 100644 index e6966938..00000000 Binary files a/KhTracker/Images/Simple/magic.png and /dev/null differ diff --git a/KhTracker/Images/Simple/magnet.png b/KhTracker/Images/Simple/magnet.png deleted file mode 100644 index d092bb60..00000000 Binary files a/KhTracker/Images/Simple/magnet.png and /dev/null differ diff --git a/KhTracker/Images/Simple/master.png b/KhTracker/Images/Simple/master.png deleted file mode 100644 index bdce0f7d..00000000 Binary files a/KhTracker/Images/Simple/master.png and /dev/null differ diff --git a/KhTracker/Images/Simple/olympus_coliseum.png b/KhTracker/Images/Simple/olympus_coliseum.png deleted file mode 100644 index ea8f7350..00000000 Binary files a/KhTracker/Images/Simple/olympus_coliseum.png and /dev/null differ diff --git a/KhTracker/Images/Simple/once_more.png b/KhTracker/Images/Simple/once_more.png deleted file mode 100644 index c5c50e5b..00000000 Binary files a/KhTracker/Images/Simple/once_more.png and /dev/null differ diff --git a/KhTracker/Images/Simple/peter_pan.png b/KhTracker/Images/Simple/peter_pan.png deleted file mode 100644 index 75900c06..00000000 Binary files a/KhTracker/Images/Simple/peter_pan.png and /dev/null differ diff --git a/KhTracker/Images/Simple/port_royal.png b/KhTracker/Images/Simple/port_royal.png deleted file mode 100644 index c4bb5624..00000000 Binary files a/KhTracker/Images/Simple/port_royal.png and /dev/null differ diff --git a/KhTracker/Images/Simple/pride_land.png b/KhTracker/Images/Simple/pride_land.png deleted file mode 100644 index 44ce3893..00000000 Binary files a/KhTracker/Images/Simple/pride_land.png and /dev/null differ diff --git a/KhTracker/Images/Simple/promise_charm.png b/KhTracker/Images/Simple/promise_charm.png deleted file mode 100644 index 68084486..00000000 Binary files a/KhTracker/Images/Simple/promise_charm.png and /dev/null differ diff --git a/KhTracker/Images/Simple/proof_of_connection.png b/KhTracker/Images/Simple/proof_of_connection.png deleted file mode 100644 index eceadaad..00000000 Binary files a/KhTracker/Images/Simple/proof_of_connection.png and /dev/null differ diff --git a/KhTracker/Images/Simple/proof_of_nonexistence.png b/KhTracker/Images/Simple/proof_of_nonexistence.png deleted file mode 100644 index 50eda8ed..00000000 Binary files a/KhTracker/Images/Simple/proof_of_nonexistence.png and /dev/null differ diff --git a/KhTracker/Images/Simple/proof_of_tranquility.png b/KhTracker/Images/Simple/proof_of_tranquility.png deleted file mode 100644 index 474718a9..00000000 Binary files a/KhTracker/Images/Simple/proof_of_tranquility.png and /dev/null differ diff --git a/KhTracker/Images/Simple/reflect.png b/KhTracker/Images/Simple/reflect.png deleted file mode 100644 index b74624af..00000000 Binary files a/KhTracker/Images/Simple/reflect.png and /dev/null differ diff --git a/KhTracker/Images/Simple/replica_data.png b/KhTracker/Images/Simple/replica_data.png deleted file mode 100644 index f5a98e10..00000000 Binary files a/KhTracker/Images/Simple/replica_data.png and /dev/null differ diff --git a/KhTracker/Images/Simple/second_chance.png b/KhTracker/Images/Simple/second_chance.png deleted file mode 100644 index ef266cc7..00000000 Binary files a/KhTracker/Images/Simple/second_chance.png and /dev/null differ diff --git a/KhTracker/Images/Simple/shield.png b/KhTracker/Images/Simple/shield.png deleted file mode 100644 index 05a5028b..00000000 Binary files a/KhTracker/Images/Simple/shield.png and /dev/null differ diff --git a/KhTracker/Images/Simple/simulated_twilight_town.png b/KhTracker/Images/Simple/simulated_twilight_town.png deleted file mode 100644 index 0a17ada6..00000000 Binary files a/KhTracker/Images/Simple/simulated_twilight_town.png and /dev/null differ diff --git a/KhTracker/Images/Simple/sora's_level.png b/KhTracker/Images/Simple/sora's_level.png deleted file mode 100644 index ccf0b42a..00000000 Binary files a/KhTracker/Images/Simple/sora's_level.png and /dev/null differ diff --git a/KhTracker/Images/Simple/space_paranoids.png b/KhTracker/Images/Simple/space_paranoids.png deleted file mode 100644 index 1b96d314..00000000 Binary files a/KhTracker/Images/Simple/space_paranoids.png and /dev/null differ diff --git a/KhTracker/Images/Simple/staff.png b/KhTracker/Images/Simple/staff.png deleted file mode 100644 index 12742151..00000000 Binary files a/KhTracker/Images/Simple/staff.png and /dev/null differ diff --git a/KhTracker/Images/Simple/stitch.png b/KhTracker/Images/Simple/stitch.png deleted file mode 100644 index 862d7b9c..00000000 Binary files a/KhTracker/Images/Simple/stitch.png and /dev/null differ diff --git a/KhTracker/Images/Simple/strength.png b/KhTracker/Images/Simple/strength.png deleted file mode 100644 index 27bdafd6..00000000 Binary files a/KhTracker/Images/Simple/strength.png and /dev/null differ diff --git a/KhTracker/Images/Simple/sword.png b/KhTracker/Images/Simple/sword.png deleted file mode 100644 index f3370f4b..00000000 Binary files a/KhTracker/Images/Simple/sword.png and /dev/null differ diff --git a/KhTracker/Images/Simple/the_world_that_never_was.png b/KhTracker/Images/Simple/the_world_that_never_was.png deleted file mode 100644 index 61bdd53b..00000000 Binary files a/KhTracker/Images/Simple/the_world_that_never_was.png and /dev/null differ diff --git a/KhTracker/Images/Simple/thunder.png b/KhTracker/Images/Simple/thunder.png deleted file mode 100644 index ab97cbc3..00000000 Binary files a/KhTracker/Images/Simple/thunder.png and /dev/null differ diff --git a/KhTracker/Images/Simple/timeless_river.png b/KhTracker/Images/Simple/timeless_river.png deleted file mode 100644 index bbe11751..00000000 Binary files a/KhTracker/Images/Simple/timeless_river.png and /dev/null differ diff --git a/KhTracker/Images/Simple/twilight_town.png b/KhTracker/Images/Simple/twilight_town.png deleted file mode 100644 index 6f16a62b..00000000 Binary files a/KhTracker/Images/Simple/twilight_town.png and /dev/null differ diff --git a/KhTracker/Images/Simple/underdrome_cups.png b/KhTracker/Images/Simple/underdrome_cups.png deleted file mode 100644 index b049f625..00000000 Binary files a/KhTracker/Images/Simple/underdrome_cups.png and /dev/null differ diff --git a/KhTracker/Images/Simple/valor.png b/KhTracker/Images/Simple/valor.png deleted file mode 100644 index 2c92732d..00000000 Binary files a/KhTracker/Images/Simple/valor.png and /dev/null differ diff --git a/KhTracker/Images/Simple/wisdom.png b/KhTracker/Images/Simple/wisdom.png deleted file mode 100644 index 85c27f24..00000000 Binary files a/KhTracker/Images/Simple/wisdom.png and /dev/null differ diff --git a/KhTracker/Images/System/background/BG.png b/KhTracker/Images/System/background/BG.png new file mode 100644 index 00000000..43a67f55 Binary files /dev/null and b/KhTracker/Images/System/background/BG.png differ diff --git a/KhTracker/Images/System/background/final_mix.png b/KhTracker/Images/System/background/final_mix.png new file mode 100644 index 00000000..e7a0fb70 Binary files /dev/null and b/KhTracker/Images/System/background/final_mix.png differ diff --git a/KhTracker/Images/System/background/title_screen.png b/KhTracker/Images/System/background/title_screen.png new file mode 100644 index 00000000..1a4a9055 Binary files /dev/null and b/KhTracker/Images/System/background/title_screen.png differ diff --git a/KhTracker/Images/System/config/pc_connected.png b/KhTracker/Images/System/config/pc_connected.png new file mode 100644 index 00000000..7dc0defc Binary files /dev/null and b/KhTracker/Images/System/config/pc_connected.png differ diff --git a/KhTracker/Images/System/config/pc_detected.png b/KhTracker/Images/System/config/pc_detected.png new file mode 100644 index 00000000..83d1fd84 Binary files /dev/null and b/KhTracker/Images/System/config/pc_detected.png differ diff --git a/KhTracker/Images/System/config/pcsx2.png b/KhTracker/Images/System/config/pcsx2.png new file mode 100644 index 00000000..b9d5254e Binary files /dev/null and b/KhTracker/Images/System/config/pcsx2.png differ diff --git a/KhTracker/Images/System/config/searching.png b/KhTracker/Images/System/config/searching.png new file mode 100644 index 00000000..b1297a9c Binary files /dev/null and b/KhTracker/Images/System/config/searching.png differ diff --git a/KhTracker/Images/System/config/tracker.png b/KhTracker/Images/System/config/tracker.png new file mode 100644 index 00000000..60b822bc Binary files /dev/null and b/KhTracker/Images/System/config/tracker.png differ diff --git a/KhTracker/Images/System/cross.png b/KhTracker/Images/System/cross.png new file mode 100644 index 00000000..854ec471 Binary files /dev/null and b/KhTracker/Images/System/cross.png differ diff --git a/KhTracker/Images/System/crossworld.png b/KhTracker/Images/System/crossworld.png new file mode 100644 index 00000000..9e95a688 Binary files /dev/null and b/KhTracker/Images/System/crossworld.png differ diff --git a/KhTracker/Images/System/drive_growth/Final.png b/KhTracker/Images/System/drive_growth/Final.png new file mode 100644 index 00000000..628eec90 Binary files /dev/null and b/KhTracker/Images/System/drive_growth/Final.png differ diff --git a/KhTracker/Images/System/drive_growth/Limit.png b/KhTracker/Images/System/drive_growth/Limit.png new file mode 100644 index 00000000..6c3bb1a8 Binary files /dev/null and b/KhTracker/Images/System/drive_growth/Limit.png differ diff --git a/KhTracker/Images/System/drive_growth/Master.png b/KhTracker/Images/System/drive_growth/Master.png new file mode 100644 index 00000000..787f1df5 Binary files /dev/null and b/KhTracker/Images/System/drive_growth/Master.png differ diff --git a/KhTracker/Images/System/drive_growth/Valor.png b/KhTracker/Images/System/drive_growth/Valor.png new file mode 100644 index 00000000..26a6b1ed Binary files /dev/null and b/KhTracker/Images/System/drive_growth/Valor.png differ diff --git a/KhTracker/Images/System/drive_growth/Wisdom.png b/KhTracker/Images/System/drive_growth/Wisdom.png new file mode 100644 index 00000000..2d65f2d4 Binary files /dev/null and b/KhTracker/Images/System/drive_growth/Wisdom.png differ diff --git a/KhTracker/Images/System/drive_growth/aerial_dodge.png b/KhTracker/Images/System/drive_growth/aerial_dodge.png new file mode 100644 index 00000000..b8100040 Binary files /dev/null and b/KhTracker/Images/System/drive_growth/aerial_dodge.png differ diff --git a/KhTracker/Images/System/drive_growth/dodge_roll.png b/KhTracker/Images/System/drive_growth/dodge_roll.png new file mode 100644 index 00000000..75a39276 Binary files /dev/null and b/KhTracker/Images/System/drive_growth/dodge_roll.png differ diff --git a/KhTracker/Images/System/drive_growth/glide.png b/KhTracker/Images/System/drive_growth/glide.png new file mode 100644 index 00000000..b1a19e1c Binary files /dev/null and b/KhTracker/Images/System/drive_growth/glide.png differ diff --git a/KhTracker/Images/System/drive_growth/high_jump.png b/KhTracker/Images/System/drive_growth/high_jump.png new file mode 100644 index 00000000..23711c0d Binary files /dev/null and b/KhTracker/Images/System/drive_growth/high_jump.png differ diff --git a/KhTracker/Images/System/drive_growth/quick_run.png b/KhTracker/Images/System/drive_growth/quick_run.png new file mode 100644 index 00000000..b06ed34f Binary files /dev/null and b/KhTracker/Images/System/drive_growth/quick_run.png differ diff --git a/KhTracker/Images/System/proof_connection.png b/KhTracker/Images/System/proof_connection.png new file mode 100644 index 00000000..a6b5d2b8 Binary files /dev/null and b/KhTracker/Images/System/proof_connection.png differ diff --git a/KhTracker/Images/System/proof_nonexistence.png b/KhTracker/Images/System/proof_nonexistence.png new file mode 100644 index 00000000..c4ba0ee6 Binary files /dev/null and b/KhTracker/Images/System/proof_nonexistence.png differ diff --git a/KhTracker/Images/System/proof_peace.png b/KhTracker/Images/System/proof_peace.png new file mode 100644 index 00000000..217bd28f Binary files /dev/null and b/KhTracker/Images/System/proof_peace.png differ diff --git a/KhTracker/Images/System/question.png b/KhTracker/Images/System/question.png new file mode 100644 index 00000000..abb089f6 Binary files /dev/null and b/KhTracker/Images/System/question.png differ diff --git a/KhTracker/Images/System/settings/absent_silhouette.png b/KhTracker/Images/System/settings/absent_silhouette.png new file mode 100644 index 00000000..e0fbb6a3 Binary files /dev/null and b/KhTracker/Images/System/settings/absent_silhouette.png differ diff --git a/KhTracker/Images/System/settings/absent_silhouette_split.png b/KhTracker/Images/System/settings/absent_silhouette_split.png new file mode 100644 index 00000000..4afc717b Binary files /dev/null and b/KhTracker/Images/System/settings/absent_silhouette_split.png differ diff --git a/KhTracker/Images/System/settings/better_stt.png b/KhTracker/Images/System/settings/better_stt.png new file mode 100644 index 00000000..6e6d3a2a Binary files /dev/null and b/KhTracker/Images/System/settings/better_stt.png differ diff --git a/KhTracker/Images/System/settings/cavern_of_remembrance.png b/KhTracker/Images/System/settings/cavern_of_remembrance.png new file mode 100644 index 00000000..e7db3287 Binary files /dev/null and b/KhTracker/Images/System/settings/cavern_of_remembrance.png differ diff --git a/KhTracker/Images/System/settings/data_organization.png b/KhTracker/Images/System/settings/data_organization.png new file mode 100644 index 00000000..51c6c832 Binary files /dev/null and b/KhTracker/Images/System/settings/data_organization.png differ diff --git a/KhTracker/Images/System/settings/level_01.png b/KhTracker/Images/System/settings/level_01.png new file mode 100644 index 00000000..2c31f507 Binary files /dev/null and b/KhTracker/Images/System/settings/level_01.png differ diff --git a/KhTracker/Images/System/settings/level_50.png b/KhTracker/Images/System/settings/level_50.png new file mode 100644 index 00000000..3581c08d Binary files /dev/null and b/KhTracker/Images/System/settings/level_50.png differ diff --git a/KhTracker/Images/System/settings/level_99.png b/KhTracker/Images/System/settings/level_99.png new file mode 100644 index 00000000..39bc8e2f Binary files /dev/null and b/KhTracker/Images/System/settings/level_99.png differ diff --git a/KhTracker/Images/System/settings/lingering_will.png b/KhTracker/Images/System/settings/lingering_will.png new file mode 100644 index 00000000..a8ae8734 Binary files /dev/null and b/KhTracker/Images/System/settings/lingering_will.png differ diff --git a/KhTracker/Images/System/settings/paradox_cup.png b/KhTracker/Images/System/settings/paradox_cup.png new file mode 100644 index 00000000..9f949699 Binary files /dev/null and b/KhTracker/Images/System/settings/paradox_cup.png differ diff --git a/KhTracker/Images/System/settings/sephiroth.png b/KhTracker/Images/System/settings/sephiroth.png new file mode 100644 index 00000000..a73c3a0e Binary files /dev/null and b/KhTracker/Images/System/settings/sephiroth.png differ diff --git a/KhTracker/Images/System/settings/transport.png b/KhTracker/Images/System/settings/transport.png new file mode 100644 index 00000000..0af5a659 Binary files /dev/null and b/KhTracker/Images/System/settings/transport.png differ diff --git a/KhTracker/Images/System/settings/underdrome_cups.png b/KhTracker/Images/System/settings/underdrome_cups.png new file mode 100644 index 00000000..068400f6 Binary files /dev/null and b/KhTracker/Images/System/settings/underdrome_cups.png differ diff --git a/KhTracker/Images/System/stats/ProgPoints.png b/KhTracker/Images/System/stats/ProgPoints.png new file mode 100644 index 00000000..67d5371e Binary files /dev/null and b/KhTracker/Images/System/stats/ProgPoints.png differ diff --git a/KhTracker/Images/System/stats/ProgPoints2.png b/KhTracker/Images/System/stats/ProgPoints2.png new file mode 100644 index 00000000..0e31ae96 Binary files /dev/null and b/KhTracker/Images/System/stats/ProgPoints2.png differ diff --git a/KhTracker/Images/System/stats/chest.png b/KhTracker/Images/System/stats/chest.png new file mode 100644 index 00000000..1126a773 Binary files /dev/null and b/KhTracker/Images/System/stats/chest.png differ diff --git a/KhTracker/Images/System/stats/deaths.png b/KhTracker/Images/System/stats/deaths.png new file mode 100644 index 00000000..15a4f5b9 Binary files /dev/null and b/KhTracker/Images/System/stats/deaths.png differ diff --git a/KhTracker/Images/System/stats/defence.png b/KhTracker/Images/System/stats/defence.png new file mode 100644 index 00000000..1e6a078e Binary files /dev/null and b/KhTracker/Images/System/stats/defence.png differ diff --git a/KhTracker/Images/System/stats/level.png b/KhTracker/Images/System/stats/level.png new file mode 100644 index 00000000..d5ab4500 Binary files /dev/null and b/KhTracker/Images/System/stats/level.png differ diff --git a/KhTracker/Images/System/stats/limit.png b/KhTracker/Images/System/stats/limit.png new file mode 100644 index 00000000..030a873e Binary files /dev/null and b/KhTracker/Images/System/stats/limit.png differ diff --git a/KhTracker/Images/System/stats/magic.png b/KhTracker/Images/System/stats/magic.png new file mode 100644 index 00000000..0848945d Binary files /dev/null and b/KhTracker/Images/System/stats/magic.png differ diff --git a/KhTracker/Images/System/stats/shield.png b/KhTracker/Images/System/stats/shield.png new file mode 100644 index 00000000..6bc3a3b9 Binary files /dev/null and b/KhTracker/Images/System/stats/shield.png differ diff --git a/KhTracker/Images/System/stats/staff.png b/KhTracker/Images/System/stats/staff.png new file mode 100644 index 00000000..d65e6157 Binary files /dev/null and b/KhTracker/Images/System/stats/staff.png differ diff --git a/KhTracker/Images/System/stats/strength.png b/KhTracker/Images/System/stats/strength.png new file mode 100644 index 00000000..3d9f8ca5 Binary files /dev/null and b/KhTracker/Images/System/stats/strength.png differ diff --git a/KhTracker/Images/System/stats/sword.png b/KhTracker/Images/System/stats/sword.png new file mode 100644 index 00000000..55845be3 Binary files /dev/null and b/KhTracker/Images/System/stats/sword.png differ diff --git a/KhTracker/Images/VerticalBar.png b/KhTracker/Images/VerticalBar.png deleted file mode 100644 index 8cc6c8e4..00000000 Binary files a/KhTracker/Images/VerticalBar.png and /dev/null differ diff --git a/KhTracker/Images/VerticalBarWhite.png b/KhTracker/Images/VerticalBarWhite.png deleted file mode 100644 index 7f0a1929..00000000 Binary files a/KhTracker/Images/VerticalBarWhite.png and /dev/null differ diff --git a/KhTracker/Images/Worlds/Locks/AG.png b/KhTracker/Images/Worlds/Locks/AG.png new file mode 100644 index 00000000..3673fcfb Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/AG.png differ diff --git a/KhTracker/Images/Worlds/Locks/BC.png b/KhTracker/Images/Worlds/Locks/BC.png new file mode 100644 index 00000000..3a6fd1ba Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/BC.png differ diff --git a/KhTracker/Images/Worlds/Locks/HB.png b/KhTracker/Images/Worlds/Locks/HB.png new file mode 100644 index 00000000..2a96e994 Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/HB.png differ diff --git a/KhTracker/Images/Worlds/Locks/HT.png b/KhTracker/Images/Worlds/Locks/HT.png new file mode 100644 index 00000000..76050d4d Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/HT.png differ diff --git a/KhTracker/Images/Worlds/Locks/LD.png b/KhTracker/Images/Worlds/Locks/LD.png new file mode 100644 index 00000000..80762750 Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/LD.png differ diff --git a/KhTracker/Images/Worlds/Locks/OC.png b/KhTracker/Images/Worlds/Locks/OC.png new file mode 100644 index 00000000..665da5a4 Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/OC.png differ diff --git a/KhTracker/Images/Worlds/Locks/PL.png b/KhTracker/Images/Worlds/Locks/PL.png new file mode 100644 index 00000000..165aea33 Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/PL.png differ diff --git a/KhTracker/Images/Worlds/Locks/PR.png b/KhTracker/Images/Worlds/Locks/PR.png new file mode 100644 index 00000000..4e6f22ee Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/PR.png differ diff --git a/KhTracker/Images/Worlds/Locks/SP.png b/KhTracker/Images/Worlds/Locks/SP.png new file mode 100644 index 00000000..fbdea3b3 Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/SP.png differ diff --git a/KhTracker/Images/Worlds/Locks/TT2.png b/KhTracker/Images/Worlds/Locks/TT2.png new file mode 100644 index 00000000..b92a369a Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/TT2.png differ diff --git a/KhTracker/Images/Worlds/Locks/TT3.png b/KhTracker/Images/Worlds/Locks/TT3.png new file mode 100644 index 00000000..01e54d27 Binary files /dev/null and b/KhTracker/Images/Worlds/Locks/TT3.png differ diff --git a/KhTracker/Images/Worlds/Min/100_acre_wood.png b/KhTracker/Images/Worlds/Min/100_acre_wood.png new file mode 100644 index 00000000..5f6bea07 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/100_acre_wood.png differ diff --git a/KhTracker/Images/Worlds/Min/PuzzSynth.png b/KhTracker/Images/Worlds/Min/PuzzSynth.png new file mode 100644 index 00000000..247342f8 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/PuzzSynth.png differ diff --git a/KhTracker/Images/Worlds/Min/Puzzle.png b/KhTracker/Images/Worlds/Min/Puzzle.png new file mode 100644 index 00000000..994cf079 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/Puzzle.png differ diff --git a/KhTracker/Images/Worlds/Min/Synth.png b/KhTracker/Images/Worlds/Min/Synth.png new file mode 100644 index 00000000..cc863870 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/Synth.png differ diff --git a/KhTracker/Images/Worlds/Min/agrabah.png b/KhTracker/Images/Worlds/Min/agrabah.png new file mode 100644 index 00000000..8a98787f Binary files /dev/null and b/KhTracker/Images/Worlds/Min/agrabah.png differ diff --git a/KhTracker/Images/Worlds/Min/atlantica.png b/KhTracker/Images/Worlds/Min/atlantica.png new file mode 100644 index 00000000..fef85302 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/atlantica.png differ diff --git a/KhTracker/Images/Worlds/Min/beast's_castle.png b/KhTracker/Images/Worlds/Min/beast's_castle.png new file mode 100644 index 00000000..95dc683a Binary files /dev/null and b/KhTracker/Images/Worlds/Min/beast's_castle.png differ diff --git a/KhTracker/Images/Worlds/Min/disney_castle.png b/KhTracker/Images/Worlds/Min/disney_castle.png new file mode 100644 index 00000000..c5d713d9 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/disney_castle.png differ diff --git a/KhTracker/Images/Worlds/Min/drive_form.png b/KhTracker/Images/Worlds/Min/drive_form.png new file mode 100644 index 00000000..a6c716b5 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/drive_form.png differ diff --git a/KhTracker/Images/Worlds/Min/halloween_town.png b/KhTracker/Images/Worlds/Min/halloween_town.png new file mode 100644 index 00000000..5dd95e11 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/halloween_town.png differ diff --git a/KhTracker/Images/Worlds/Min/hollow_bastion.png b/KhTracker/Images/Worlds/Min/hollow_bastion.png new file mode 100644 index 00000000..b49c4b4c Binary files /dev/null and b/KhTracker/Images/Worlds/Min/hollow_bastion.png differ diff --git a/KhTracker/Images/Worlds/Min/land_of_dragons.png b/KhTracker/Images/Worlds/Min/land_of_dragons.png new file mode 100644 index 00000000..0ba54a4d Binary files /dev/null and b/KhTracker/Images/Worlds/Min/land_of_dragons.png differ diff --git a/KhTracker/Images/Worlds/Min/level.png b/KhTracker/Images/Worlds/Min/level.png new file mode 100644 index 00000000..0fc29aca Binary files /dev/null and b/KhTracker/Images/Worlds/Min/level.png differ diff --git a/KhTracker/Images/Worlds/Min/olympus_coliseum.png b/KhTracker/Images/Worlds/Min/olympus_coliseum.png new file mode 100644 index 00000000..ef3fbc01 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/olympus_coliseum.png differ diff --git a/KhTracker/Images/Worlds/Min/port_royal.png b/KhTracker/Images/Worlds/Min/port_royal.png new file mode 100644 index 00000000..fb58ba18 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/port_royal.png differ diff --git a/KhTracker/Images/Worlds/Min/pride_land.png b/KhTracker/Images/Worlds/Min/pride_land.png new file mode 100644 index 00000000..9f9db12b Binary files /dev/null and b/KhTracker/Images/Worlds/Min/pride_land.png differ diff --git a/KhTracker/Images/Worlds/Min/replica_data.png b/KhTracker/Images/Worlds/Min/replica_data.png new file mode 100644 index 00000000..bb1e473e Binary files /dev/null and b/KhTracker/Images/Worlds/Min/replica_data.png differ diff --git a/KhTracker/Images/Worlds/Min/simulated_twilight_town.png b/KhTracker/Images/Worlds/Min/simulated_twilight_town.png new file mode 100644 index 00000000..b44bead5 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/simulated_twilight_town.png differ diff --git a/KhTracker/Images/Worlds/Min/space_paranoids.png b/KhTracker/Images/Worlds/Min/space_paranoids.png new file mode 100644 index 00000000..9d9a0627 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/space_paranoids.png differ diff --git a/KhTracker/Images/Worlds/Min/the_world_that_never_was.png b/KhTracker/Images/Worlds/Min/the_world_that_never_was.png new file mode 100644 index 00000000..3aaf1f14 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/the_world_that_never_was.png differ diff --git a/KhTracker/Images/Worlds/Min/twilight_town.png b/KhTracker/Images/Worlds/Min/twilight_town.png new file mode 100644 index 00000000..1b2b4dc0 Binary files /dev/null and b/KhTracker/Images/Worlds/Min/twilight_town.png differ diff --git a/KhTracker/Images/Worlds/Old/100_acre_wood.png b/KhTracker/Images/Worlds/Old/100_acre_wood.png new file mode 100644 index 00000000..6414ef0b Binary files /dev/null and b/KhTracker/Images/Worlds/Old/100_acre_wood.png differ diff --git a/KhTracker/Images/Worlds/Old/PuzzSynth.png b/KhTracker/Images/Worlds/Old/PuzzSynth.png new file mode 100644 index 00000000..78228c3e Binary files /dev/null and b/KhTracker/Images/Worlds/Old/PuzzSynth.png differ diff --git a/KhTracker/Images/Worlds/Old/Puzzle.png b/KhTracker/Images/Worlds/Old/Puzzle.png new file mode 100644 index 00000000..7f44772d Binary files /dev/null and b/KhTracker/Images/Worlds/Old/Puzzle.png differ diff --git a/KhTracker/Images/Worlds/Old/Synth.png b/KhTracker/Images/Worlds/Old/Synth.png new file mode 100644 index 00000000..23f9d1c7 Binary files /dev/null and b/KhTracker/Images/Worlds/Old/Synth.png differ diff --git a/KhTracker/Images/Worlds/Old/agrabah.png b/KhTracker/Images/Worlds/Old/agrabah.png new file mode 100644 index 00000000..0bb91edd Binary files /dev/null and b/KhTracker/Images/Worlds/Old/agrabah.png differ diff --git a/KhTracker/Images/Worlds/Old/atlantica.png b/KhTracker/Images/Worlds/Old/atlantica.png new file mode 100644 index 00000000..652baffd Binary files /dev/null and b/KhTracker/Images/Worlds/Old/atlantica.png differ diff --git a/KhTracker/Images/Worlds/Old/beast's_castle.png b/KhTracker/Images/Worlds/Old/beast's_castle.png new file mode 100644 index 00000000..8b0612ed Binary files /dev/null and b/KhTracker/Images/Worlds/Old/beast's_castle.png differ diff --git a/KhTracker/Images/Worlds/Old/disney_castle.png b/KhTracker/Images/Worlds/Old/disney_castle.png new file mode 100644 index 00000000..e2eed14a Binary files /dev/null and b/KhTracker/Images/Worlds/Old/disney_castle.png differ diff --git a/KhTracker/Images/Worlds/Old/drive_form.png b/KhTracker/Images/Worlds/Old/drive_form.png new file mode 100644 index 00000000..8d950354 Binary files /dev/null and b/KhTracker/Images/Worlds/Old/drive_form.png differ diff --git a/KhTracker/Images/Worlds/Old/halloween_town.png b/KhTracker/Images/Worlds/Old/halloween_town.png new file mode 100644 index 00000000..efc9a0fc Binary files /dev/null and b/KhTracker/Images/Worlds/Old/halloween_town.png differ diff --git a/KhTracker/Images/Worlds/Old/hollow_bastion.png b/KhTracker/Images/Worlds/Old/hollow_bastion.png new file mode 100644 index 00000000..ad3fb6de Binary files /dev/null and b/KhTracker/Images/Worlds/Old/hollow_bastion.png differ diff --git a/KhTracker/Images/Worlds/Old/land_of_dragons.png b/KhTracker/Images/Worlds/Old/land_of_dragons.png new file mode 100644 index 00000000..449ddd87 Binary files /dev/null and b/KhTracker/Images/Worlds/Old/land_of_dragons.png differ diff --git a/KhTracker/Images/Worlds/Old/level.png b/KhTracker/Images/Worlds/Old/level.png new file mode 100644 index 00000000..d598f432 Binary files /dev/null and b/KhTracker/Images/Worlds/Old/level.png differ diff --git a/KhTracker/Images/Worlds/Old/olympus_coliseum.png b/KhTracker/Images/Worlds/Old/olympus_coliseum.png new file mode 100644 index 00000000..ad1558f7 Binary files /dev/null and b/KhTracker/Images/Worlds/Old/olympus_coliseum.png differ diff --git a/KhTracker/Images/Worlds/Old/port_royal.png b/KhTracker/Images/Worlds/Old/port_royal.png new file mode 100644 index 00000000..20fb290f Binary files /dev/null and b/KhTracker/Images/Worlds/Old/port_royal.png differ diff --git a/KhTracker/Images/Worlds/Old/pride_land.png b/KhTracker/Images/Worlds/Old/pride_land.png new file mode 100644 index 00000000..06aeff36 Binary files /dev/null and b/KhTracker/Images/Worlds/Old/pride_land.png differ diff --git a/KhTracker/Images/Worlds/Old/replica_data.png b/KhTracker/Images/Worlds/Old/replica_data.png new file mode 100644 index 00000000..60b1993c Binary files /dev/null and b/KhTracker/Images/Worlds/Old/replica_data.png differ diff --git a/KhTracker/Images/Worlds/Old/simulated_twilight_town.png b/KhTracker/Images/Worlds/Old/simulated_twilight_town.png new file mode 100644 index 00000000..07dc8391 Binary files /dev/null and b/KhTracker/Images/Worlds/Old/simulated_twilight_town.png differ diff --git a/KhTracker/Images/Worlds/Old/space_paranoids.png b/KhTracker/Images/Worlds/Old/space_paranoids.png new file mode 100644 index 00000000..8d40be90 Binary files /dev/null and b/KhTracker/Images/Worlds/Old/space_paranoids.png differ diff --git a/KhTracker/Images/Worlds/Old/the_world_that_never_was.png b/KhTracker/Images/Worlds/Old/the_world_that_never_was.png new file mode 100644 index 00000000..374aaf24 Binary files /dev/null and b/KhTracker/Images/Worlds/Old/the_world_that_never_was.png differ diff --git a/KhTracker/Images/Worlds/Old/twilight_town.png b/KhTracker/Images/Worlds/Old/twilight_town.png new file mode 100644 index 00000000..fd50c1c9 Binary files /dev/null and b/KhTracker/Images/Worlds/Old/twilight_town.png differ diff --git a/KhTracker/Images/Simple/ansem_report1.cur b/KhTracker/Images/ansem_report1.cur similarity index 100% rename from KhTracker/Images/Simple/ansem_report1.cur rename to KhTracker/Images/ansem_report1.cur diff --git a/KhTracker/Images/Old/hnet.com-image.ico b/KhTracker/Images/hnet.com-image.ico similarity index 100% rename from KhTracker/Images/Old/hnet.com-image.ico rename to KhTracker/Images/hnet.com-image.ico diff --git a/KhTracker/Images/shield.png b/KhTracker/Images/shield.png new file mode 100644 index 00000000..2a0edb49 Binary files /dev/null and b/KhTracker/Images/shield.png differ diff --git a/KhTracker/Images/staff.png b/KhTracker/Images/staff.png new file mode 100644 index 00000000..47c87bb9 Binary files /dev/null and b/KhTracker/Images/staff.png differ diff --git a/KhTracker/Images/sword.png b/KhTracker/Images/sword.png new file mode 100644 index 00000000..2756d27e Binary files /dev/null and b/KhTracker/Images/sword.png differ diff --git a/KhTracker/Item.xaml b/KhTracker/Item.xaml index 11551828..034e8fb2 100644 --- a/KhTracker/Item.xaml +++ b/KhTracker/Item.xaml @@ -4,13 +4,13 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:KhTracker" - mc:Ignorable="d" Content="{DynamicResource AnsemReport1}" Background="Transparent" PreviewGiveFeedback="Item_PreviewGiveFeedback"> + mc:Ignorable="d" Content="{DynamicResource Min-AnsemReport01}" Background="Transparent" PreviewGiveFeedback="Item_PreviewGiveFeedback"> - + diff --git a/KhTracker/Item.xaml.cs b/KhTracker/Item.xaml.cs index 288834e3..33e60066 100644 --- a/KhTracker/Item.xaml.cs +++ b/KhTracker/Item.xaml.cs @@ -23,12 +23,8 @@ namespace KhTracker public partial class Item : ContentControl { bool selected = false; + MainWindow MainW = (MainWindow)App.Current.MainWindow; - public delegate void TotalHandler(string world, int checks); - public delegate void FoundHandler(string item, string world, bool add); - - public event TotalHandler UpdateTotal; - public event FoundHandler UpdateFound; public Item() { InitializeComponent(); @@ -82,6 +78,26 @@ public Point GetPoint(Point offset) private ItemAdorner myAdornment; private PInPoint pointRef = new PInPoint(); + public void Item_Click(object sender, RoutedEventArgs e) + { + Data data = MainWindow.data; + if (data.selected != null && data.WorldsData[data.selected.Name].worldGrid.ReportHandler(this)) + { + data.WorldsData[data.selected.Name].worldGrid.Add_Item(this); + } + } + + public void Item_MouseUp(object sender, MouseButtonEventArgs e) + { + if (selected) + Item_Click(sender, e); + } + + public void Item_MouseDown(object sender, MouseButtonEventArgs e) + { + selected = true; + } + public void Item_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) @@ -93,38 +109,81 @@ public void Item_MouseMove(object sender, MouseEventArgs e) adLayer.Remove(myAdornment); } } - - public void Item_Click(object sender, RoutedEventArgs e) + + public void Report_Hover(object sender, RoutedEventArgs e) { Data data = MainWindow.data; - MainWindow window = ((MainWindow)Application.Current.MainWindow); - if (data.selected != null) + if (data.mode == Mode.ShanHints || data.mode == Mode.OpenKHShanHints) + return; + + if (data.UsingProgressionHints) { - if (data.WorldsData[data.selected.Name].worldGrid.Handle_Report(this, window, data)) + if(data.progressionType == "Reports" && data.mode != Mode.PointsHints) { - data.WorldsData[data.selected.Name].worldGrid.Add_Item(this, window); + return; } } - } - - public void Report_Hover(object sender, RoutedEventArgs e) - { - Data data = MainWindow.data; - MainWindow window = ((MainWindow)Application.Current.MainWindow); + int index = (int)GetValue(Grid.ColumnProperty); + var repStr1 = data.reportInformation[index].Item1; + var repStr2 = data.reportInformation[index].Item2; + var repInt = data.reportInformation[index].Item3; - window.SetHintText(Codes.GetHintTextName(data.reportInformation[index].Item1) + " has " + data.reportInformation[index].Item2 + " important checks"); + switch (data.mode) + { + case Mode.PointsHints: + MainW.SetHintText(Codes.GetHintTextName(repStr1), "has", Codes.FindShortName(Codes.GetHintTextName(repStr2)), true, false, true); + break; + case Mode.PathHints: + MainW.SetHintText(Codes.GetHintTextName(repStr1)); + break; + case Mode.SpoilerHints: + if (repStr1 == "Empty") + { + MainW.SetHintText("This report looks too faded to read..."); + } + else + { + if (repInt == -1) + { + MainW.SetHintText(Codes.GetHintTextName(repStr1), "has no Important Checks", "", true, false, false); + } + else if (repInt == -12345) + { + MainW.SetHintText(data.reportInformation[index].Item1, "", "", false, false, false); + } + else if (repInt == -999) + { + //nothing + } + else + { + MainW.SetHintText(Codes.GetHintTextName(repStr1), "has been revealed!", "", true, false, false); + } + } + break; + default: + if (repInt == -99) + { + //MainW.SetJokeText(repStr1); + } + else + { + MainW.SetHintText(Codes.GetHintTextName(repStr2), "has", repInt + " important checks", true, false, true); + } + break; + } } - public void DragDropEventFire(string item, string world, bool add) + private void Item_PreviewGiveFeedback(object sender, GiveFeedbackEventArgs e) { - UpdateFound(item, world, add); - } + GetCursorPos(ref pointRef); + Point relPos = this.PointFromScreen(pointRef.GetPoint(myAdornment.CenterOffset)); + myAdornment.Arrange(new Rect(relPos, myAdornment.DesiredSize)); - public void DragDropEventFire(string world, int value) - { - UpdateTotal(world, value); + Mouse.SetCursor(Cursors.None); + e.Handled = true; } public void Item_Return(object sender, RoutedEventArgs e) @@ -135,15 +194,34 @@ public void Item_Return(object sender, RoutedEventArgs e) public void HandleItemReturn() { Data data = MainWindow.data; - if (Parent != ((MainWindow)Application.Current.MainWindow).ItemPool) + + if (this.Name.StartsWith("Ghost_")) + { + Grid GhostRow = VisualTreeHelper.GetChild(MainW.ItemPool, 4) as Grid; //ghost grid always at this position + if (Parent != GhostRow) + { + WorldGrid parent = this.Parent as WorldGrid; + ((WorldGrid)Parent).Handle_WorldGrid(this, false); + + GhostRow.Children.Add(this); + parent.Children.Remove(this); + } + return; + } + + //int index = data.Items.IndexOf(this); + //Grid ItemRow = data.ItemsGrid[index]; + Grid ItemRow = data.Items[this.Name].Item2; + + if (Parent != ItemRow) { WorldGrid parent = this.Parent as WorldGrid; ((WorldGrid)Parent).Handle_WorldGrid(this, false); - ((MainWindow)Application.Current.MainWindow).ItemPool.Children.Add(this); + ItemRow.Children.Add(this); - ((MainWindow)Application.Current.MainWindow).DecrementCollected(); + MainW.SetCollected(false); MouseDown -= Item_Return; @@ -163,30 +241,7 @@ public void HandleItemReturn() } MouseEnter -= Report_Hover; - - UpdateFound(this.Name, parent.Name.Remove(parent.Name.Length - 4, 4), false); } } - - private void Item_PreviewGiveFeedback(object sender, GiveFeedbackEventArgs e) - { - GetCursorPos(ref pointRef); - Point relPos = this.PointFromScreen(pointRef.GetPoint(myAdornment.CenterOffset)); - myAdornment.Arrange(new Rect(relPos, myAdornment.DesiredSize)); - - Mouse.SetCursor(Cursors.None); - e.Handled = true; - } - - public void Item_MouseDown(object sender, MouseButtonEventArgs e) - { - selected = true; - } - - public void Item_MouseUp(object sender, MouseButtonEventArgs e) - { - if (selected) - Item_Click(sender, e); - } } } \ No newline at end of file diff --git a/KhTracker/ItemDictionary.xaml b/KhTracker/ItemDictionary.xaml new file mode 100644 index 00000000..14e1c20d --- /dev/null +++ b/KhTracker/ItemDictionary.xaml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/KhTracker/KhTracker.csproj b/KhTracker/KhTracker.csproj index ce0bc369..d1c8309b 100644 --- a/KhTracker/KhTracker.csproj +++ b/KhTracker/KhTracker.csproj @@ -9,7 +9,7 @@ WinExe KhTracker KhTracker - v4.6.1 + v4.8 512 {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 4 @@ -31,6 +31,7 @@ true + x64 @@ -47,13 +48,13 @@ x64 pdbonly true - bin\Release\ + bin\Release\2.0\ TRACE prompt 4 - hnet.com-image.ico + tracker.ico @@ -66,6 +67,7 @@ True + @@ -87,6 +89,9 @@ + + + @@ -95,28 +100,37 @@ - - BroadcastWindow.xaml - - - - + + + + + + + Item.xaml - + WorldGrid.xaml - + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + Designer MSBuild:Compile - + Designer MSBuild:Compile @@ -128,7 +142,7 @@ App.xaml Code - + MainWindow.xaml Code @@ -161,11 +175,21 @@ Resources.Designer.cs + + + + + + + + SettingsSingleFileGenerator Settings.Designer.cs + + @@ -182,446 +206,9 @@ false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -634,6 +221,9 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + + 1.0.1 + 4.5.4 @@ -643,45 +233,765 @@ 4.5.0 + + 1.0.2 + + + 1.0.2 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/KhTracker/MainDictionary.xaml b/KhTracker/MainDictionary.xaml new file mode 100644 index 00000000..45ab1b58 --- /dev/null +++ b/KhTracker/MainDictionary.xaml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/KhTracker/MainWindow.xaml b/KhTracker/MainWindow.xaml index c11c1d1b..a6700952 100644 --- a/KhTracker/MainWindow.xaml +++ b/KhTracker/MainWindow.xaml @@ -1,9 +1,10 @@ - + Title="KH2 Tracker 2.34" Height="880" Width="570" Background="#303030" + MinHeight="440" MinWidth="300"> - @@ -28,68 +29,132 @@ - - - - - - + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + - - + + + + - - - - - - - + + + + + - - - - + - - - + + - + + - - - - + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + - + + @@ -103,275 +168,693 @@ - + + + + + - - + + + + - + - + - - - - - + + + + - - - - + + - - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + +