// Autosplit for Final Fantasy Adventure
// Version 1
// Written by Michy1212 from Le Retroscope

state("bgb") {}
state("bgb64") {}
state("gambatte") {}
state("gambatte_qt") {}
state("gambatte_qt_nonpsr") {}
state("gambatte_speedrun") {}
state("gambatte_speedrun_other") {}
state("emuhawk") {}

startup {
    settings.Add("event",     true, "Event");
    settings.Add("location",  true, "Location");
    settings.Add("magic",     false, "Magic spells");
    settings.Add("equipment", false, "Equipment");
    settings.Add("boss",      false, "Boss");
    settings.Add("any",       false, "Any%");

    settings.CurrentDefaultParent = "boss";
	settings.Add("cat1",         false,  "Defeat Cat 1");
    settings.Add("hydra",        false,  "Defeat Hydra");
    settings.Add("lee",          false,  "Defeat Mr. Lee");
    settings.Add("megapede",     false,  "Defeat Megapede");
    settings.Add("medusa",       false,  "Defeat Medusa");
    settings.Add("davias",       false,  "Defeat Davias");
    settings.Add("metal crab",   false,  "Defeat Metal Crab");
    settings.Add("cyclops",      false,  "Defeat Cyclops");
    settings.Add("golem",        false,  "Defeat Golem");
    settings.Add("chimera",      false,  "Defeat Chimera");
    // settings.Add("dark lord",    false,  "Defeat Dark Lord");
    settings.Add("kary",         false,  "Defeat Kary");
    settings.Add("kraken",       false,  "Defeat Kraken");
    settings.Add("iflyte",       false,  "Defeat Iflyte");
    settings.Add("lich",         false,  "Defeat Lich");
    settings.Add("mantis",       false,  "Defeat Mantis Ant");
    settings.Add("garuda",       false,  "Defeat Garuda");
    settings.Add("dragon",       false,  "Defeat Dragon");
    // settings.Add("red dragon",   false,  "Defeat Red Dragon");
    // settings.Add("dragon z",     false,  "Defeat Dragon Zombie");
    // settings.Add("julius 1",     false,  "Defeat Julius 1");
    settings.Add("julius 2",     false,  "Defeat Julius 2");

    settings.CurrentDefaultParent = "event";
	settings.Add("ketts",        true,  "Sleep at Kett's");
    settings.Add("fuji glaive",  false,  "Save Fuji at Glaive Castle");
    settings.Add("chocobot",     true,  "Get Chocobot");
    settings.Add("recover mana", true,  "Recover Mana");

    settings.CurrentDefaultParent = "location";
	settings.Add("marsh cave",         true,  "Exit Marsh Cave");
    settings.Add("ketts dungeon",      true,  "Exit Kett's Dungeon");
    settings.Add("silver mine",        false,  "Exit Silver Mine");
    settings.Add("gaia",               true,  "Exit Gaia");
    settings.Add("airship",            true,  "Exit Airship");
    settings.Add("medusa cave",        true,  "Exit Medusa cave");
    settings.Add("davias mansion",     true,  "Exit Davias' Mansion");
    settings.Add("mt rocks",           true,  "Exit Cave of Mt. Rocks");
    settings.Add("glaive castle",      false,  "Exit Glaive Castle");
    settings.Add("ice cavern",         true,  "Exit Ice Cavern");
    settings.Add("floatrocks",         true,  "Exit Cave of Floatrocks");
    settings.Add("palmy desert",       true,  "Exit Cave of Palmy Desert");
    settings.Add("dime tower",         true,  "Exit Dime Tower");
    settings.Add("temple of mana",     true,  "Exit Temple of Mana");
    settings.Add("access final fight", false,  "Access Final Fight");

    settings.CurrentDefaultParent = "magic";
	settings.Add("magic cure",    false,  "Cure");
    settings.Add("magic fire",    false,  "Fire");
    settings.Add("magic sleep",   false,  "Sleep");
    settings.Add("magic heal",    false,  "Heal");
    settings.Add("magic ice",     false,  "Ice");
    settings.Add("magic mute",    false,  "Mute");
    settings.Add("magic lit",     false,  "Lightning");
    settings.Add("magic nuke",    false,  "Nuke");

    settings.CurrentDefaultParent = "equipment";
    settings.Add("silver armor", false,  "Silver Armor");
	settings.Add("star",         false,  "Star");
    settings.Add("ice sword",    false,  "Ice sword");
    settings.Add("rusty sword",  false,  "Rusty sword");
    settings.Add("excalibur",    false,  "Excalibur");

    settings.CurrentDefaultParent = "any";
    settings.Add("axe shop",            false,  "Axe shop");
    settings.Add("zip ish",             false,  "Zip to Ish");
    settings.Add("snowmanless glaive",  false,  "Snowmanless to Glaive Castle");
    settings.Add("zip floatrocks",      false,  "Zip to Cave of Floatrocks");

    refreshRate = 0.5;

    vars.TryFindOffsets = (Func<Process, long, bool>)((proc, baseAddress) => {
        long wramOffset = 0;
        string state = proc.ProcessName.ToLower();
        if (state.Contains("gambatte")) {
            IntPtr scanOffset = vars.SigScan(proc, 0, "53 45 49 4B 45 4E 20 44 45 4E 53 45 54 53 55 00 00 00 00");
            print("[Debug] scanOffset: " + scanOffset.ToString("X8"));
            wramOffset = (long)scanOffset + 0x45ECC;
            print("[Debug] WRAM Offset trouvé : " + wramOffset.ToString("X8"));
        } else if (state == "emuhawk") {
            IntPtr scanOffset = vars.SigScan(proc, 0, "05 00 00 00 ?? 00 00 00 00 ?? ?? 00 ?? 40 ?? 00 00 ?? ?? 00 00 00 00 00 ?? 00 00 00 00 00 00 00 00 00 00 00 ?? ?? ?? 00 ?? 00 00 00 00 00 ?? 00 ?? 00 00 00 00 00 00 00 ?? ?? ?? ?? ?? ?? 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F8 00 00 00");
            print("[Debug] scanOffset: " + scanOffset.ToString("X8"));
            wramOffset = (long)scanOffset - 0x40;
            print("[Debug] WRAM Offset trouvé : " + wramOffset.ToString("X8"));
        } else if (state == "bgb") {
            IntPtr scanOffset = vars.SigScan(proc, 12, "6D 61 69 6E 6C 6F 6F 70 83 C4 F4 A1 ?? ?? ?? ??");
            print("[Debug] scanOffset: " + scanOffset.ToString("X8"));
            wramOffset = new DeepPointer(scanOffset, 0, 0, 0x34).Deref<int>(proc) + 0x108;
            wramOffset = (wramOffset + 0xFFFF) & 0xFFFF0000;
            print("[Debug] WRAM Offset trouvé : " + wramOffset.ToString("X8"));
        } else if (state == "bgb64") {
            IntPtr scanOffset = vars.SigScan(proc, 20, "48 83 EC 28 48 8B 05 ?? ?? ?? ?? 48 83 38 00 74 1A 48 8B 05 ?? ?? ?? ?? 48 8B 00 80 B8 ?? ?? ?? ?? 00 74 07");
            print("[Debug] scanOffset: " + scanOffset.ToString("X8"));
            IntPtr baseOffset = scanOffset + proc.ReadValue<int>(scanOffset) + 4;
            wramOffset = new DeepPointer(baseOffset, 0, 0x44).Deref<int>(proc) + 0x190;
            print("[Debug] WRAM Offset trouvé : " + wramOffset.ToString("X8"));
        }

        if (wramOffset != 0) {
            vars.watchers = vars.GetWatcherList((int)(wramOffset - baseAddress));
            print("[Autosplitter] WRAM Pointer: " + wramOffset.ToString("X8"));
            
            return true;
        }

        return false;
    });

    vars.SigScan = (Func<Process, int, string, IntPtr>)((proc, offset, signature) => {
        var target = new SigScanTarget(offset, signature);
        IntPtr result = IntPtr.Zero;
        foreach (var page in proc.MemoryPages(true)) {
            var scanner = new SignatureScanner(proc, page.BaseAddress, (int)page.RegionSize);
            if ((result = scanner.Scan(target)) != IntPtr.Zero) {
                break;
            }
        }

        return result;
    });

    vars.Current = (Func<string, int, bool>)((name, value) => {
        return vars.watchers[name].Current == value;
    });

    vars.previousBossHP = 0;
    vars.previousGold = 0;
    vars.GoldIncrease = false;

    vars.GetWatcherList = (Func<int, MemoryWatcherList>)((wramOffset) => {
        return new MemoryWatcherList {
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x0021)) { Name = "x_heros"},
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x0020)) { Name = "y_heros"},
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x00A6)) { Name = "x_camera"},
			new MemoryWatcher<ushort>(new DeepPointer(wramOffset +  0x13F4)) { Name = "boss_HP" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x03FE)) { Name = "id_room_1" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x0401)) { Name = "id_room_2" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x17D0)) { Name = "partner" },
            new MemoryWatcher<ushort>(new DeepPointer(wramOffset +  0x17BE)) { Name = "gold" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x1865)) { Name = "ketts sleep" },
			new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x17A2)) { Name = "start" },

            // Magic
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16AB)) { Name = "cure" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16AC)) { Name = "fire" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16AD)) { Name = "sleep" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16AE)) { Name = "heal" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16AF)) { Name = "ice" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16B0)) { Name = "mute" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16B1)) { Name = "lightning" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16B2)) { Name = "nuke" },

            // Item location
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16C5)) { Name = "item 1" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16C6)) { Name = "item 2" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16C7)) { Name = "item 3" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16C8)) { Name = "item 4" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16C9)) { Name = "item 5" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16CA)) { Name = "item 6" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16CB)) { Name = "item 7" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16CC)) { Name = "item 8" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16CD)) { Name = "item 9" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16CE)) { Name = "item 10" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16CF)) { Name = "item 11" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16D0)) { Name = "item 12" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16D1)) { Name = "item 13" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16D2)) { Name = "item 14" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16D3)) { Name = "item 15" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16D4)) { Name = "item 16" },

            // Equip location 1
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16B3)) { Name = "equip 1 1" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16B4)) { Name = "equip 1 2" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16B5)) { Name = "equip 1 3" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16B6)) { Name = "equip 1 4" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16B7)) { Name = "equip 1 5" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16B8)) { Name = "equip 1 6" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16B9)) { Name = "equip 1 7" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16BA)) { Name = "equip 1 8" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16BB)) { Name = "equip 1 9" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16BC)) { Name = "equip 1 10" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16BD)) { Name = "equip 1 11" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16BE)) { Name = "equip 1 12" },

            // Equip location 2
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16DD)) { Name = "equip 2 1" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16DE)) { Name = "equip 2 2" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16DF)) { Name = "equip 2 3" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16E0)) { Name = "equip 2 4" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16E1)) { Name = "equip 2 5" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16E2)) { Name = "equip 2 6" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16E3)) { Name = "equip 2 7" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16E4)) { Name = "equip 2 8" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16E5)) { Name = "equip 2 9" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16E6)) { Name = "equip 2 10" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16E7)) { Name = "equip 2 11" },
            new MemoryWatcher<byte>(new DeepPointer(wramOffset +  0x16E8)) { Name = "equip 2 12" },
        };
    });

    vars.GetSplitList = (Func<Dictionary<string, bool>>)(() => {
        return new Dictionary<string, bool> {
			// Boss
            { 
                "cat1", 
                (vars.watchers["boss_HP"].Current == 0xFFFF &&
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x19 && 
                vars.watchers["id_room_2"].Current == 0x47) 
            },
            { 
                "hydra", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0xC4 && 
                vars.watchers["id_room_2"].Current == 0x77) 
            },
            { 
                "lee", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0xE2 && 
                vars.watchers["id_room_2"].Current == 0x41) 
            },
            { 
                "megapede", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x29 && 
                vars.watchers["id_room_2"].Current == 0x05) 
            },
            { 
                "medusa", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0xBB && 
                vars.watchers["id_room_2"].Current == 0x30) 
            },
            { 
                "davias", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x1B && 
                vars.watchers["id_room_2"].Current == 0x15) 
            },
            { 
                "metal crab", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x7F && 
                vars.watchers["id_room_2"].Current == 0x37) 
            },
            { 
                "cyclops", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x07 && 
                vars.watchers["id_room_2"].Current == 0x44) 
            },
            { 
                "golem", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x3C && 
                vars.watchers["id_room_2"].Current == 0x01) 
            },
            { 
                "chimera", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x4A && 
                vars.watchers["id_room_2"].Current == 0x54) 
            },
            // { 
            //     "dark lord", 
            //     (vars.watchers["boss_HP"].Current == 0x0000 && 
            //     vars.previousBossHP != 0x0000 && 
            //     vars.watchers["id_room_1"].Current == 0x3B && 
            //     vars.watchers["id_room_2"].Current == 0x14) 
            // },
            { 
                "kary", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x08 && 
                vars.watchers["id_room_2"].Current == 0x43) 
            },
            { 
                "kraken", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x5F && 
                vars.watchers["id_room_2"].Current == 0x17) 
            },
            { 
                "iflyte", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x87 && 
                vars.watchers["id_room_2"].Current == 0x02) 
            },
            { 
                "lich", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x5F && 
                vars.watchers["id_room_2"].Current == 0x34) 
            },
            { 
                "mantis", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x32 && 
                vars.watchers["id_room_2"].Current == 0x60) 
            },
            { 
                "garuda", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0xFB && 
                vars.watchers["id_room_2"].Current == 0x34) 
            },
            { 
                "dragon", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x04 && 
                vars.watchers["id_room_2"].Current == 0x00) 
            },
            // { 
            //     "red dragon", 
            //     (vars.watchers["boss_HP"].Current == 0xFFFF && 
            //     vars.previousBossHP != 0xFFFF && 
            //     vars.watchers["id_room_1"].Current == 0x04 && 
            //     vars.watchers["id_room_2"].Current == 0x00) 
            // },
            // { 
            //     "dragon z", 
            //     (vars.watchers["boss_HP"].Current == 0xFFFF && 
            //     vars.previousBossHP != 0xFFFF && 
            //     vars.watchers["id_room_1"].Current == 0x04 && 
            //     vars.watchers["id_room_2"].Current == 0x00) 
            // },
            // { 
            //     "julius 1", 
            //     (vars.watchers["boss_HP"].Current == 0xFFFF && 
            //     vars.previousBossHP != 0xFFFF && 
            //     vars.watchers["id_room_1"].Current == 0x8F && 
            //     vars.watchers["id_room_2"].Current == 0x67) 
            // },
            { 
                "julius 2", 
                (vars.watchers["boss_HP"].Current == 0xFFFF && 
                vars.previousBossHP != 0xFFFF && 
                vars.watchers["id_room_1"].Current == 0x8F && 
                vars.watchers["id_room_2"].Current == 0x67) 
            },

            // Events
            { 
                "ketts", 
                (vars.watchers["ketts sleep"].Current == 0x01 && 
                vars.watchers["id_room_1"].Current == 0xB0 && 
                vars.watchers["id_room_2"].Current == 0x30) 
            },
            { 
                "fuji glaive", 
                (vars.watchers["id_room_1"].Current == 0xF3 && 
                vars.watchers["id_room_2"].Current == 0x72) 
            },
            { 
                "chocobot", 
                (vars.previousid_room_1 == 0x6A && 
                vars.previousid_room_2 == 0x01 && 
                vars.watchers["id_room_1"].Current == 0xF8 && 
                vars.watchers["id_room_2"].Current == 0x26) 
            },
            { 
                "recover mana", 
                (
                vars.watchers["id_room_1"].Current == 0x36 &&
                vars.watchers["id_room_2"].Current == 0x50 &&
                vars.watchers["boss_HP"].Current > 0xF000 &&
                vars.GoldIncrease == true)
            },


            // Locations
            { 
                "marsh cave", 
                (vars.HasItemValue(0x1F) == true && 
                vars.watchers["id_room_1"].Current == 0xF0 && 
                vars.watchers["id_room_2"].Current == 0xE8) 
            },
            { 
                "ketts dungeon", 
                (vars.watchers["sleep"].Current == 0x01 &&
                vars.watchers["partner"].Current == 0x40 &&
                vars.watchers["id_room_1"].Current == 0x99 && 
                vars.watchers["id_room_2"].Current == 0xA9) 
            },
            { 
                "silver mine", 
                (vars.watchers["partner"].Current == 0x10 && 
                vars.watchers["id_room_1"].Current == 0x57 && 
                vars.watchers["id_room_2"].Current == 0x9B) 
            },
            { 
                "gaia", 
                (vars.previousid_room_1 == 0xBF && 
                vars.previousid_room_2 == 0x05 && 
                vars.watchers["id_room_1"].Current == 0x37 && 
                vars.watchers["id_room_2"].Current == 0x8D) 
            },
            { 
                "airship", 
                (vars.watchers["id_room_1"].Current == 0xF6 && 
                vars.watchers["id_room_2"].Current == 0x53) 
            },
            { 
                "medusa cave", 
                (vars.HasItemValue(0x22) == true &&
                vars.watchers["id_room_1"].Current == 0x5A && 
                vars.watchers["id_room_2"].Current == 0x2C) 
            },
            { 
                "davias mansion", 
                (vars.watchers["partner"].Current == 0x02 && 
                vars.watchers["id_room_1"].Current == 0x93 && 
                vars.watchers["id_room_2"].Current == 0x04) 
            },
            { 
                "mt rocks", 
                (vars.watchers["lightning"].Current == 0x01 &&
                vars.watchers["id_room_1"].Current == 0xCB && 
                vars.watchers["id_room_2"].Current == 0x26) 
            },
            { 
                "glaive castle", 
                (vars.watchers["id_room_1"].Current == 0x53 && 
                vars.watchers["id_room_2"].Current == 0xFF) 
            },
            { 
                "ice cavern", 
                (vars.HasEquipValue(0x28, 0x0C) == true &&
                vars.watchers["id_room_1"].Current == 0x7F && 
                vars.watchers["id_room_2"].Current == 0xD3) 
            },
            { 
                "floatrocks", 
                (vars.HasEquipValue(0x14, 0x0E) == true &&
                vars.watchers["id_room_1"].Current == 0x07 && 
                vars.watchers["id_room_2"].Current == 0xF0) 
            },
            { 
                "palmy desert", 
                (vars.watchers["nuke"].Current == 0x01 &&
                vars.watchers["id_room_1"].Current == 0xC3 && 
                vars.watchers["id_room_2"].Current == 0x3E) 
            },
            { 
                "dime tower", 
                (vars.watchers["nuke"].Current == 0x01 &&
                vars.watchers["id_room_1"].Current == 0x76 && 
                vars.watchers["id_room_2"].Current == 0x14 &&
                vars.watchers["x_heros"].Current == 0x68 &&
                vars.watchers["y_heros"].Current == 0x50 &&
                vars.watchers["x_camera"].Current == 0xC0)
            },
            { 
                "temple of mana", 
                (vars.watchers["id_room_1"].Current == 0xF3 && 
                vars.watchers["id_room_2"].Current == 0x75) 
            },
            { 
                "access final fight", 
                (vars.watchers["id_room_1"].Current == 0x36 && 
                vars.watchers["id_room_2"].Current == 0x50) 
            },


            // Magic
            { 
                "magic cure", 
                (vars.watchers["cure"].Current == 0x01) 
            },
            { 
                "magic fire", 
                (vars.watchers["fire"].Current == 0x01) 
            },
            { 
                "magic sleep", 
                (vars.watchers["sleep"].Current == 0x01) 
            },
            { 
                "magic heal", 
                (vars.watchers["heal"].Current == 0x01) 
            },
            { 
                "magic ice", 
                (vars.watchers["ice"].Current == 0x01) 
            },
            { 
                "magic mute", 
                (vars.watchers["mute"].Current == 0x01) 
            },
            { 
                "magic lit", 
                (vars.watchers["lightning"].Current == 0x01) 
            },
            { 
                "magic nuke", 
                (vars.watchers["nuke"].Current == 0x01) 
            },

            // Equipment
            { 
                "silver armor", 
                (vars.HasEquipValue(0x0A, 0x13) == true) 
            },
            { 
                "star", 
                (vars.HasEquipValue(0x1E, 0x08) == true) 
            },
            { 
                "ice sword", 
                (vars.HasEquipValue(0x28, 0x0C) == true) 
            },
            { 
                "rusty sword", 
                (vars.HasEquipValue(0x14, 0x0E) == true) 
            },
            { 
                "excalibur", 
                (vars.HasEquipValue(0x55, 0x10) == true) 
            },

            // Any%
            { 
                "axe shop", 
                (vars.previousid_room_1 == 0x10 && 
                vars.previousid_room_2 == 0xC7 && 
                vars.watchers["id_room_1"].Current == 0xBB && 
                vars.watchers["id_room_2"].Current == 0x00) 
            },
            { 
                "zip ish", 
                (vars.previousid_room_1 == 0x72 && 
                vars.previousid_room_2 == 0x76 && 
                vars.watchers["id_room_1"].Current == 0xC6 && 
                vars.watchers["id_room_2"].Current == 0x61)
            },
            { 
                "snowmanless glaive", 
                (vars.previousid_room_1 == 0xA5 && 
                vars.previousid_room_2 == 0x37 && 
                vars.watchers["id_room_1"].Current == 0xAB && 
                vars.watchers["id_room_2"].Current == 0x30)
            },
            { 
                "zip floatrocks", 
                (vars.watchers["id_room_1"].Current == 0xC6 && 
                vars.watchers["id_room_2"].Current == 0x31)
            },
        };
    });

    vars.HasItemValue = (Func<int, bool>)((value) => {
        for (int i = 1; i <= 16; i++) {
            string itemName = "item " + i;
            if (vars.watchers[itemName].Current == value) {
                return true;
            }
        }
        return false;
    });
    
    vars.HasEquipValue = (Func<int, int, bool>)((value1, value2) => {
        for (int i = 1; i <= 12; i++) {
            string equip1 = "equip 1 " + i;
            string equip2 = "equip 2 " + i;

            // Vérification si les valeurs de location 1 et 2 correspondent aux valeurs spécifiées
            if (vars.watchers[equip1].Current == value1 && vars.watchers[equip2].Current == value2) {
                return true;
            }
        }
        return false;
    });
}

init {
    vars.pastSplits = new HashSet<string>();

    if (!vars.TryFindOffsets(game, (long)modules.First().BaseAddress)) {
        throw new Exception("[Autosplitter] Emulated memory not yet initialized.");
    } else {
        refreshRate = 200/3.0;
    }
}

update {
    int currentBossHP = vars.watchers["boss_HP"].Current;
    int currentGold = vars.watchers["gold"].Current;
    int currentFujiName = vars.watchers["start"].Current;
    int currentid_room_1 = vars.watchers["id_room_1"].Current;
    int currentid_room_2 = vars.watchers["id_room_2"].Current;
    bool HasGoldIncrease = false;
    // Vérifier si l'or a augmenté par rapport à la valeur précédente
    if (vars.previousGold < currentGold) {
        HasGoldIncrease = true;
        vars.GoldIncrease = HasGoldIncrease;
    } else {
        HasGoldIncrease = false;
        vars.GoldIncrease = HasGoldIncrease;
    }
    vars.watchers.UpdateAll(game);
    vars.previousBossHP = currentBossHP;
    vars.previousGold = currentGold;
    vars.previousFujiName = currentFujiName;
    vars.previousid_room_1 = currentid_room_1;
    vars.previousid_room_2 = currentid_room_2;

    // Ajouter un print pour vérifier la valeur de "start" et "boss_HP" à chaque mise à jour
    // byte cat1Value = vars.watchers["boss_HP"].Current;
    
    // print("[Debug] Valeur brute lue pour boss_HP : " + vars.watchers["boss_HP"].Current.ToString("X2"));
    // if (vars.watchers["boss_HP"] == null) {
    //     print("[Erreur] Le watcher boss_HP n'a pas été correctement initialisé !");
    //  }
}

start {
    return vars.watchers["start"].Current != 0x00 && vars.watchers["start"].Current != 0xFF && (vars.previousFujiName == 0x00 || vars.previousFujiName == 0xFF);
}

split {
    var splits = vars.GetSplitList();
    var toSplit = new List<string>();
    foreach (var split in splits) {
        if (settings[split.Key] && split.Value && !vars.pastSplits.Contains(split.Key)) {
            print("[Debug] Split déclenché pour: " + split.Key);  // Affiche le split qui va être effectué
            vars.pastSplits.Add(split.Key);
            print("[Debug] Ajout du split à pastSplits : " + split.Key);  // Vérifie que le split est ajouté
            toSplit.Add(split.Key);
            return true;
        }
    }
}

onReset {
    vars.pastSplits.Clear();
}

exit {
    refreshRate = 0.5;
}