//Aethermancer Demo Autosplitter V1.0 15/02/2025
//Timed via Load Remover - Please compare to Game Time
//Credit to:
//TheDementedSalad - Created the splitter
//Joey - Testing

state("Aethermancer")
{}

startup
{
	timer.CurrentTimingMethod = TimingMethod.GameTime;
	Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Unity");
    vars.Helper.GameName = "Aethermancer";
	vars.Helper.Settings.CreateFromXml("Components/Aethermancer.Settings.xml");
	vars.Helper.LoadSceneManager = true;
	
	vars.completedSplits = new HashSet<string>();
}

init
{
	vars.Helper.TryLoad = (Func<dynamic, bool>)(mono => {
		vars.Helper["currentState"] = mono.Make<byte>("GameController", "Instance", "GameState", "CurrentState");
		vars.Helper["Area"] = mono.Make<byte>("ExplorationController", "Instance", "CurrentArea");
		vars.Helper["Bubble"] = mono.Make<byte>("ExplorationController", "Instance", "CurrentBubble");
		vars.Helper["IntroSkip"] = mono.Make<bool>("TutorialIntroScript", "Instance", "IntroCutscene", "IntroHasBeenSkipped");
		vars.Helper["isPaused"] = mono.Make<bool>("GameController", "Instance", "TimeScaleManager", "isPaused");
		vars.Helper["useLoadScreen"] = mono.Make<byte>("GameController", "Instance", "SceneLoader", "useLoadingScreen");
		
		vars.Helper["enemyType"] = mono.Make<byte>("CombatController", "Instance", "CurrentEncounter", "EncounterType");
		vars.Helper["enemiesDead"] = mono.Make<byte>("CombatController", "Instance", "DeadEnemies", 0x18);
		vars.Helper["combatState"] = mono.Make<byte>("CombatController", "Instance", "State", "State", "CurrentState", 0x40); 
		
		//vars.Helper["LeftTalk"] = mono.Make<bool>("UIController", "Instance", "DialogueDisplay", "LeftCharacterDisplay", "isTalking");
		//vars.Helper["RightTalk"] = mono.Make<bool>("UIController", "Instance", "DialogueDisplay", "RightCharacterDisplay", "isTalking");
		//vars.Helper["RightTalkNorm"] = mono.Make<bool>("UIController", "Instance", "DialogueDisplay", "RightCharacterDisplay", "isNormalDialogue");
		
		/*
		vars.Helper["FinishedEncounters"] = mono.Make<byte>("GameController", "Instance", "GameState", "FinishedEncounterCount");
		vars.Helper["enemyType"] = mono.Make<byte>("CombatController", "Instance", "CurrentEncounter", "EncounterType");
		vars.Helper["Defeated"] = mono.Make<bool>("ExplorationController", "Instance", "lastMonsterGroup", "EncounterDefeated");
		vars.Helper["Combats"] = mono.Make<byte>("ExplorationController", "Instance", "TotalCombatsFoughtThisRun");
		vars.Helper["CombatData"] = mono.Make<byte>("GameController", "Instance", "SceneLoader", "CurrentSceneType");
		vars.Helper["CombatData2"] = mono.Make<byte>("GameController", "Instance", "SceneLoader", "transitionType");
		*/
		
        return true;
    });
}

onStart
{
	vars.completedSplits.Clear();
}
start
{
	return current.Area == 0 && old.Area == 4 && current.Bubble == 255 || current.Area == 4 && current.Bubble == 255 && current.IntroSkip && !old.IntroSkip && !current.isPaused;
}

update
{
	current.activeScene = vars.Helper.Scenes.Active.Name == null ? current.activeScene : vars.Helper.Scenes.Active.Name;			//creates a function that tracks the games active Scene name

    //if(current.activeScene != old.activeScene) vars.Log("active: Old: \"" + old.activeScene + "\", Current: \"" + current.activeScene + "\"");			//Prints when a new scene becomes active
}

split
{
	string setting = "";
	
	if(current.Bubble != old.Bubble || current.Area != old.Area){
		setting = "Level_" + current.Area + "_" + current.Bubble;
	}

	if(current.Area == 2 && current.Bubble == 3 && current.combatState == 5 && old.combatState != 5 && current.enemyType == 2  && current.enemiesDead == 1)
	{
		return true;
	}
	
	// Debug. Comment out before release.
	if (!string.IsNullOrEmpty(setting))
	vars.Log(setting);
		
	if (settings.ContainsKey(setting) && settings[setting] && vars.completedSplits.Add(setting)){
		return true;
	}
}

isLoading
{
	return current.currentState == 1 || current.currentState == 3 || current.currentState == 7 ||  current.isPaused && current.currentState == 2 || current.activeScene == "MainMenuScene";
}

reset
{
	return current.activeScene != "MainMenuScene" && old.activeScene == "MainMenuScene";
}