state("LiveSplit") { } startup { Assembly.Load(File.ReadAllBytes("Components/emu-help-v3")).CreateInstance("PSP"); vars.Log = (Action)(output => print("[Sonic Rivals] " + output)); // PAL Codes vars.PALSerial = vars.Helper.MakeString(9, 0x08955c44); vars.PALTimer = vars.Helper.Make(0x08a6db50); vars.PALPlayerWinFlag = vars.Helper.Make(0x08a9c3d4, 0x868); vars.PALPlayerCharacter = vars.Helper.Make(0x08a9c3d4, 0x220); vars.PALPlayerFinishTime = vars.Helper.Make(0x08a9c3d4, 0x920); vars.PALCurrentLevel = vars.Helper.Make(0x08a729b6); vars.PALDemoMode = vars.Helper.Make(0x08ac4a29); vars.PALLevelSelect = vars.Helper.Make(0x08a01c35); vars.PALTotalTime = new TimeSpan(); vars.Splits = new HashSet(); settings.Add("SR", true, "Sonic Rivals"); settings.Add("SON", true, "Sonic Level Splits", "SR"); settings.Add("SHA", true, "Shadow Level Splits", "SR"); settings.Add("KNU", true, "Knuckles Level Splits", "SR"); settings.Add("SIL", true, "Silver Level Splits", "SR"); vars.SonicLevels = new Dictionary { { "313won", "Forest Falls Zone - Act 1" }, { "314won", "Forest Falls Zone - Act 2" }, { "315won", "Forest Falls Zone - Boss" }, { "316won", "Colosseum Highway Zone - Act 1" }, { "317won", "Colosseum Highway Zone - Act 2" }, { "318won", "Colosseum Highway Zone - Boss" }, { "319won", "Sky Park Zone - Act 1" }, { "320won", "Sky Park Zone - Act 2" }, { "321won", "Crystal Mountain Zone - Act 1" }, { "322won", "Crystal Mountain Zone - Act 2" }, { "323won", "Crystal Mountain Zone - Boss" }, { "324won", "Death Yard Zone - Act 1" }, { "325won", "Death Yard Zone - Act 2" }, { "326won", "Death Yard Zone - Boss" }, { "327won", "Meteor Base Zone - Act 1" }, { "328won", "Meteor Base Zone - Act 2" }, { "329won", "Meteor Base Zone - Boss" } }; vars.ShadowLevels = new Dictionary { { "413won", "Forest Falls Zone - Act 1" }, { "414won", "Forest Falls Zone - Act 2" }, { "415won", "Forest Falls Zone - Boss" }, { "416won", "Colosseum Highway Zone - Act 1" }, { "417won", "Colosseum Highway Zone - Act 2" }, { "418won", "Colosseum Highway Zone - Boss" }, { "419won", "Sky Park Zone - Act 1" }, { "420won", "Sky Park Zone - Act 2" }, { "421won", "Crystal Mountain Zone - Act 1" }, { "422won", "Crystal Mountain Zone - Act 2" }, { "423won", "Crystal Mountain Zone - Boss" }, { "424won", "Death Yard Zone - Act 1" }, { "425won", "Death Yard Zone - Act 2" }, { "426won", "Death Yard Zone - Boss" }, { "427won", "Meteor Base Zone - Act 1" }, { "428won", "Meteor Base Zone - Act 2" }, { "429won", "Meteor Base Zone - Boss" } }; vars.KnucklesLevels = new Dictionary { { "513won", "Forest Falls Zone - Act 1" }, { "514won", "Forest Falls Zone - Act 2" }, { "515won", "Forest Falls Zone - Boss" }, { "516won", "Colosseum Highway Zone - Act 1" }, { "517won", "Colosseum Highway Zone - Act 2" }, { "518won", "Colosseum Highway Zone - Boss" }, { "519won", "Sky Park Zone - Act 1" }, { "520won", "Sky Park Zone - Act 2" }, { "521won", "Crystal Mountain Zone - Act 1" }, { "522won", "Crystal Mountain Zone - Act 2" }, { "523won", "Crystal Mountain Zone - Boss" }, { "524won", "Death Yard Zone - Act 1" }, { "525won", "Death Yard Zone - Act 2" }, { "526won", "Death Yard Zone - Boss" }, { "527won", "Meteor Base Zone - Act 1" }, { "528won", "Meteor Base Zone - Act 2" }, { "529won", "Meteor Base Zone - Boss" } }; vars.SilverLevels = new Dictionary { { "613won", "Forest Falls Zone - Act 1" }, { "614won", "Forest Falls Zone - Act 2" }, { "615won", "Forest Falls Zone - Boss" }, { "616won", "Colosseum Highway Zone - Act 1" }, { "617won", "Colosseum Highway Zone - Act 2" }, { "618won", "Colosseum Highway Zone - Boss" }, { "619won", "Sky Park Zone - Act 1" }, { "620won", "Sky Park Zone - Act 2" }, { "621won", "Crystal Mountain Zone - Act 1" }, { "622won", "Crystal Mountain Zone - Act 2" }, { "623won", "Crystal Mountain Zone - Boss" }, { "624won", "Death Yard Zone - Act 1" }, { "625won", "Death Yard Zone - Act 2" }, { "626won", "Death Yard Zone - Boss" }, { "627won", "Meteor Base Zone - Act 1" }, { "628won", "Meteor Base Zone - Act 2" }, { "629won", "Meteor Base Zone - Boss" } }; foreach (var Tag in vars.SonicLevels) { settings.Add(Tag.Key.ToString(), true, Tag.Value, "SON"); }; foreach (var Tag in vars.ShadowLevels) { settings.Add(Tag.Key.ToString(), true, Tag.Value, "SHA"); }; foreach (var Tag in vars.KnucklesLevels) { settings.Add(Tag.Key.ToString(), true, Tag.Value, "KNU"); }; foreach (var Tag in vars.SilverLevels) { settings.Add(Tag.Key.ToString(), true, Tag.Value, "SIL"); }; } update { if(vars.PALPlayerWinFlag.Current != vars.PALPlayerWinFlag.Old) { vars.Log("Win?: " + vars.PALPlayerWinFlag.Current); } if(vars.PALCurrentLevel.Current != vars.PALCurrentLevel.Old) { vars.Log("Level: " + vars.PALCurrentLevel.Current); } if(vars.PALPlayerCharacter.Current != vars.PALPlayerCharacter.Old) { vars.Log("Character: " + vars.PALPlayerCharacter.Current); } if(vars.PALPlayerFinishTime.Current != vars.PALPlayerFinishTime.Old) { vars.Log("Finish Time: " + vars.PALPlayerFinishTime.Current); } } start { return vars.PALLevelSelect.Current == 64 && vars.PALCurrentLevel.Current == 0 && vars.PALPlayerCharacter.Current == 0; } onStart { vars.PALTotalTime = TimeSpan.Zero; vars.Splits.Clear(); } isLoading { return true; } split { if(vars.PALPlayerWinFlag.Current == 1 && vars.PALPlayerFinishTime.Old == 1000000 && !vars.Splits.Contains(vars.PALPlayerCharacter.Current.ToString() + vars.PALCurrentLevel.Current.ToString() + "won")) { return settings[vars.PALPlayerCharacter.Current.ToString() + vars.PALCurrentLevel.Current.ToString() + "won"] && vars.Splits.Add(vars.PALPlayerCharacter.Current.ToString() + vars.PALCurrentLevel.Current.ToString() + "won"); } } gameTime { if(vars.PALTimer.Old > vars.PALTimer.Current) { return vars.PALTotalTime += TimeSpan.FromSeconds(vars.PALTimer.Old); } if(vars.PALPlayerWinFlag.Current == 1 && vars.PALPlayerFinishTime.Old == 1000000 && !vars.Splits.Contains(vars.PALPlayerCharacter.Current.ToString() + vars.PALCurrentLevel.Current.ToString() + "won")) { return vars.PALTotalTime + TimeSpan.FromSeconds(vars.PALTimer.Current - 0.03f); } return vars.PALTotalTime + TimeSpan.FromSeconds(vars.PALTimer.Current); } reset { return vars.PALCurrentLevel.Current == 0 && vars.PALLevelSelect.Old == 64 && vars.PALLevelSelect.Current == 0 && vars.PALPlayerCharacter.Current == 0; }