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