state("Zau")
{
}

startup
{
	settings.Add("prologue", true, "Split Prologue");
	settings.Add("presunarena", true, "Split Pre Sun Arena");
	settings.Add("postsunarena", true, "Split Post Sun Arena");
	settings.Add("swampskip", true, "Split Swamp Skip");
	settings.Add("natureescape", true, "Split Nature Escape");
	settings.Add("tawasheart", true, "Split Tawas Heart");
	settings.Add("heartfight", true, "Split Heart Fight");
	settings.Add("heartdefeated", true, "Split Heart Defeated");
	settings.Add("embersprings", true, "Split Ember Springs");
	settings.Add("biggeyser", true, "Split Big Geyser");
	settings.Add("springsloadin", true, "Split Springs Load In");
	settings.Add("blockpuzzle", true, "Split Block Puzzle");
	settings.Add("drawbridge", true, "Split Drawbridge");
	settings.Add("searingsands", true, "Split Searing Sands");
	settings.Add("sunandmoon", true, "Split Sun and Moon");
	settings.Add("glide", true, "Split Glide");
	settings.Add("mountain", true, "Split Mountain");
	settings.Add("launch", true, "Split Launch");
	settings.Add("enduringrite", true, "Split Enduring Rite");
	settings.Add("mountaintop", true, "Split Mountain Top");
	settings.Add("gagorib", true, "Split Gagorib");
	settings.Add("gagoribdone", true, "Split Gagorib Done");
	settings.Add("realmofthedead", true, "Split Realm of the Dead");
	settings.Add("kalunga", true, "Split Kalunga");
}

init
{
    var trg = new SigScanTarget(3, "48 8B 0D ???????? 66 0F 5A C9 E8");
    trg.OnFound = (p, _, addr) => addr + 0x4 + p.ReadValue<int>(addr);

    var scn = new SignatureScanner(game, modules[0].BaseAddress, modules[0].ModuleMemorySize);

    var gEngine = scn.Scan(trg);
    if (gEngine == IntPtr.Zero)
        throw new Exception("Not all targets found");

    // GEngine.GameInstance.LocalPlayers[0].PlayerController.LastCheckpointCrossed.Record.RecordName
    vars.LastCheckpointRecordName = new StringWatcher(new DeepPointer(gEngine, 0xD28, 0x38, 0x0, 0x30, 0x6D8, 0x220 + 0x10, 0x0), ReadStringType.UTF16, 64);
}

onStart
{
	vars.Splits = new List<List<string>>{};

	if (settings["prologue"]) {
		vars.Splits.Add(new List<string>{"Balcony", "SanctuaryStart"}); // Prologue
	}
	if (settings["presunarena"]) {
		vars.Splits.Add(new List<string>{"HL01_CHPT02_COMBAT_ENCOUNTER_01", "HL01_CHPT0X_CE02_PRE"}); // Pre Sun Arena
	}
	if (settings["postsunarena"]) {
		vars.Splits.Add(new List<string>{"HL01_CHPT0X_CE02_POST", "HL01_CHPT0X_CE02_PRE"}); // Post Sun Arena
	}
	if (settings["swampskip"]) {
		vars.Splits.Add(new List<string>{"", "WL02_130_TrapAreaStart"}); // Swamp Skip
	}
	if (settings["natureescape"]) {
		vars.Splits.Add(new List<string>{"", "KikiChase_000_StartPt1"}); // Nature Escape
	}
	if (settings["tawasheart"]) {
		vars.Splits.Add(new List<string>{"", "WL06_PulseAbilityStatue"}); // Tawas Heart
	}
	if (settings["heartfight"]) {
		vars.Splits.Add(new List<string>{"", "KikiChase_060_HeartChamberStart"}); // Heart Fight
	}
	if (settings["heartdefeated"]) {
		vars.Splits.Add(new List<string>{"", "WL02_DebugOutOfKiki"}); // Heart Defeated
	}
	if (settings["embersprings"]) {
		vars.Splits.Add(new List<string>{"", "DL01_01_firsthotspring"}); // Ember Springs
	}
	if (settings["biggeyser"]) {
		vars.Splits.Add(new List<string>{"DL01_05", "DL01_11"}); // Big Geyser
	}
	if (settings["springsloadin"]) {
		vars.Splits.Add(new List<string>{"", "DL01_42"}); // Springs Load In
	}
	if (settings["blockpuzzle"]) {
		vars.Splits.Add(new List<string>{"", "DL01_16"}); // Block Puzzle
	}
	if (settings["drawbridge"]) {
		vars.Splits.Add(new List<string>{"", "DrawbridgeCheckpoint"}); // Drawbridge
	}
	if (settings["searingsands"]) {
		vars.Splits.Add(new List<string>{"", "DL02_00_01"}); // Searing Sands
	}
	if (settings["sunandmoon"]) {
		vars.Splits.Add(new List<string>{"", "NakshiDialogue"}); // Sun and Moon
	}
	if (settings["glide"]) {
		vars.Splits.Add(new List<string>{"", "DL02_XX_AbilityStatue"}); // Glide
	}
	if (settings["mountain"]) {
		vars.Splits.Add(new List<string>{"DL02to03_010_DL03Side", "DL03_000_Start"}); // Mountain
	}
	if (settings["launch"]) {
		vars.Splits.Add(new List<string>{"", "DL03_170_AbilityCharge"}); // Launch
	}
	if (settings["enduringrite"]) {
		vars.Splits.Add(new List<string>{"", "DL03_CombatShrine"}); // Enduring Rite
	}
	if (settings["mountaintop"]) {
		vars.Splits.Add(new List<string>{"", "DL04_Workbench_Upper"}); // Mountain Top
	}
	if (settings["gagorib"]) {
		vars.Splits.Add(new List<string>{"", "GagoribFightCheckpoint"}); // Gagorib
	}
	if (settings["gagoribdone"]) {
		vars.Splits.Add(new List<string>{"", "DL06_AfterGaga"}); // Gagorib Done
	}
	if (settings["realmofthedead"]) {
		vars.Splits.Add(new List<string>{"", "BeforeRealmOfTheDead"}); // Realm of the Dead
	}
	if (settings["kalunga"]) {
		vars.Splits.Add(new List<string>{"", "PL01_03_Fight"}); // Kalunga
	}
}

update
{
    vars.LastCheckpointRecordName.Update(game);

    if (vars.LastCheckpointRecordName.Changed)
    {
        print("Checkpoint: " + vars.LastCheckpointRecordName.Old + " -> " + vars.LastCheckpointRecordName.Current);
		print(vars.LastCheckpointRecordName.Current);
	}
}

split
{
	if (!vars.LastCheckpointRecordName.Changed) {
		return false;
	}

	for (int i = 0; i < vars.Splits.Count; i++) {
		if ((vars.Splits[i][0] == "" || vars.Splits[i][0] == vars.LastCheckpointRecordName.Old) && vars.Splits[i][1] == vars.LastCheckpointRecordName.Current) {
			return true;
		}
	}
	return false;
}