// Made for Henry Halfhead version 1.0.12 state("HenryHalfhead") { } startup // script loaded { // Load asl-help binary and instantiate it // Will inject code into the asl in the background Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Unity"); // LevelEnum values (uint in hexcode) vars.LevelEnum_Invalid = 0; vars.LevelEnum_Lobby = 0x87321683; // lobby = co-op players joining before entering level & choosing skin-color vars.LevelEnum_Childhood = 0x2C78A3D5; vars.LevelEnum_SchoolLevel_1 = 0x7E6EFE8C; vars.LevelEnum_SchoolLevel_2 = 0xFE5CC3BF; vars.LevelEnum_Work_1 = 0xEDE9C856; vars.LevelEnum_WalkHome = 0x7B9EEF58; vars.LevelEnum_Morning = 0xBC03553F; vars.LevelEnum_Work_2 = 0xBDFDD90C; vars.LevelEnum_AtHome = 0xBFCDE83F; vars.LevelEnum_OldAge = 0xC0C16C0C; vars.LevelEnum_Credits = 0x9C365DC2; // the levels at which to split vars.SplitLevelEnums = new List(){ (uint)vars.LevelEnum_Childhood, (uint)vars.LevelEnum_SchoolLevel_1, (uint)vars.LevelEnum_SchoolLevel_2, (uint)vars.LevelEnum_Work_1, (uint)vars.LevelEnum_WalkHome, (uint)vars.LevelEnum_Morning, (uint)vars.LevelEnum_Work_2, (uint)vars.LevelEnum_AtHome, (uint)vars.LevelEnum_OldAge, (uint)vars.LevelEnum_Credits }; // settings settings.Add("childhood", true, "Childhood"); settings.Add("school1", true, "School 1"); settings.Add("school2", true, "School 2"); settings.Add("work1", true, "Work 1"); settings.Add("walkHome", true, "Walk Home"); settings.Add("morning", true, "Morning"); settings.Add("work2", true, "Work 2"); settings.Add("atHome", true, "At Home"); settings.Add("oldAge", true, "Old Age"); // setting names lookup dictionary vars.SplitSettings = new Dictionary() { {(uint)vars.LevelEnum_Childhood, "childhood"}, {(uint)vars.LevelEnum_SchoolLevel_1, "school1"}, {(uint)vars.LevelEnum_SchoolLevel_2, "school2"}, {(uint)vars.LevelEnum_Work_1, "work1"}, {(uint)vars.LevelEnum_WalkHome, "walkHome"}, {(uint)vars.LevelEnum_Morning, "morning"}, {(uint)vars.LevelEnum_Work_2, "work2"}, {(uint)vars.LevelEnum_AtHome, "atHome"}, {(uint)vars.LevelEnum_OldAge, "oldAge"}, }; // recommend to use Game-Time if (timer.CurrentTimingMethod != TimingMethod.GameTime) { var result = MessageBox.Show( "This autosplitter uses Game Time.\n" + "Removing load-times requires comparing against Game Time.\n" + "Would you like to switch to it?", "LiveSplit | Henry Halfhead", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) timer.CurrentTimingMethod = TimingMethod.GameTime; } } init // attached to game process { vars.Helper.TryLoad = (Func) (mono =>{ // get app class in Henry.dll var app = mono["Henry", "Henry.Core.Application.App"]; // level enum vars.Helper["levelEnum"] = mono.Make(app, "State", "LoadedLevelInfo", "LevelEnum"); // isLoading vars.Helper["isLoading"] = mono.Make(app, "State", "IsLoading"); // current narrator narration id var narratorSingleton = mono["Henry", "Henry.Narrator", 1]; vars.Helper["narrationId"] = mono.MakeString(narratorSingleton, "_Instance", "CurrentNarration", "GUID"); // whether narrator is narrating var narrator = mono["Henry", "Henry.Narrator"]; vars.Helper["isNarrating"] = mono.Make(narrator, "IsNarrating"); // TODO: found objects count for low-objects run // // Object-Catalogue "Dex" (how many objects you "found" in the game) // var dexManager = mono["Henry", "Henry.DexManager"]; // // total catalogue objects // vars.Helper["catalogue_totalCount"] = mono.Make(dexManager, "_instance", "TotalObjectsCount"); // // found catalogue objects // vars.Helper["catalogue_foundCount"] = mono.MakeList(dexManager, "_instance", "_discoveredDexEntries"); return true; }); } // reset and start timer if changing level to childhood level start { return current.levelEnum == vars.LevelEnum_Childhood && old.levelEnum != current.levelEnum; } reset { return current.levelEnum == vars.LevelEnum_Childhood && old.levelEnum != current.levelEnum; } split { bool noLevel = current.levelEnum == 0; bool isInLobby = current.levelEnum == vars.LevelEnum_Lobby; bool isInLevel = !noLevel && !isInLobby; bool didChangeLevel = isInLevel && current.levelEnum != old.levelEnum; if(didChangeLevel) { // split when changing to one of the defined split-levels bool isSplitLevel = false; foreach(uint splitLevelEnum in vars.SplitLevelEnums) { if(current.levelEnum == splitLevelEnum) { if(vars.SplitSettings.ContainsKey(current.levelEnum)) { string settingsName = vars.SplitSettings[current.levelEnum]; if( settings[settingsName]) return true; } else { return true; // no setting for this split -> always split } } } } else { // final ending split in the OldAge leve if(current.levelEnum == vars.LevelEnum_OldAge) { // check if the "Good night Henry" narration starts at the end of the OldAge level if(current.isNarrating && !old.isNarrating && current.narrationId == "9b305a6fd96d84e4a933f8334b9e0702") return true; } } return false; } isLoading { return current.isLoading; }