LiveSplit.TZA/LiveSplit.TZA/SplitLogic.cs

260 lines
7.4 KiB
C#
Executable File

using LiveSplit.Model;
using LiveSplit.TZA.Splits;
namespace LiveSplit.TZA;
internal class SplitLogic {
internal static readonly List<SplitInfo> Splits = new() {
new SplitInfo(
SplitId.StartGame,
new GameStart()
),
new SplitInfo(
SplitId.AirCutterRemora,
new KillBoss(16, 275, 1_000)
),
new SplitInfo(
SplitId.Reks,
new Cutscene("naf_b0401", CutsceneAction.Enter),
new StageChange(25)
),
new SplitInfo(
SplitId.Rats,
new Cutscene("grm_g0100", CutsceneAction.Enter),
new Cutscene("grm_g0100", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.RogueTomato,
new StageChange(78)
),
new SplitInfo(
SplitId.Sunstone,
new EnterLocationWithStage(306, 160)
),
new SplitInfo(
SplitId.Dustia,
new LevelUp(Character.Vaan, 13)
),
new SplitInfo(
SplitId.Flans,
new StageChange(265)
),
new SplitInfo(
SplitId.Firemane,
new KillBoss(265, 329),
new Cutscene("grm_d0102", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.MimicQueen,
new KillBoss(340, 69),
new Cutscene("mic_c0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.LhusuMines,
new EnterLocationWithStage(806, 680)
),
new SplitInfo(
SplitId.Judges,
new StageChange(966)
),
new SplitInfo(
SplitId.JudgeGhis,
new KillBoss(1000, 552, 1_030),
new Cutscene("rsn_a0102", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Garuda,
new KillBoss(1352, 403),
new Cutscene("rwg_a0181", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.DemonWall2,
new KillBoss(1364, 407),
new Cutscene("rwg_b0202", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Belias,
new KillBoss(1376, 415),
new Cutscene("rwg_d0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Vossler,
new KillBoss(1460, 872),
new Cutscene("rsn_z0201", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.EnterEruytVillage,
new EnterLocation(768)
),
new SplitInfo(
SplitId.LeaveEruytVillage,
new EnterLocationWithStage(751, 1790)
),
new SplitInfo(
SplitId.OsmonePlain,
new EnterLocation(712)
),
new SplitInfo(
SplitId.Jellies,
new EnterLocation(718)
),
new SplitInfo(
SplitId.Tiamat,
new KillBoss(1820, 722),
new Cutscene("hne_b0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.EnterStilshrine,
new EnterLocation(597)
),
new SplitInfo(
SplitId.Vinuskar,
new KillBoss(2057, 603),
new Cutscene("mrm_c0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Mateus,
new KillBoss(2100, 612),
new Cutscene("mrm_e0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.JudgeBergan,
new KillBoss(2290, 737),
new Cutscene("bul_a0201", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Salikawood,
new EnterLocation(483)
),
new SplitInfo(
SplitId.PhonCoastTchitaUplands,
new EnterLocation(187)
),
new SplitInfo(
SplitId.Mandragoras,
new Cutscene("rui_d0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Ahriman,
new KillBoss(new uint[] { 3150, 3200 }, 198),
new Cutscene("rui_c0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Archades,
new EnterLocation(1008)
),
new SplitInfo(
SplitId.Cid1,
new KillBoss(3440, 286, 18_247),
new Cutscene("dor_b0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Rafflesia,
new KillBoss(4160, 545),
new Cutscene("mfr_b0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Daedalus,
new KillBoss(4295, 687),
new Cutscene("gil_a0201", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Tyrant,
new KillBoss(4320, 695),
new Cutscene("gil_c0201", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Shemhazai,
new KillBoss(4370, 698),
new Cutscene("gil_d0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Hydro,
new KillBoss(5200, 522),
new Cutscene("rwf_c0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Pandaemonium,
new KillBoss(5303, 1113),
new Cutscene("rbl_c0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Slyt,
new KillBoss(5320, 1121),
new Cutscene("rbl_f0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Fenrir,
new KillBoss(5320, 1132),
new Cutscene("rbl_j0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Hashmal,
new KillBoss(5320, 670),
new Cutscene("dgl_h0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Cid2,
new Cutscene("dgl_g0103", CutsceneAction.Exit)
// new KillBoss(0, 0, 20_523) - too many boss HP bars in same stage and area
),
new SplitInfo(
SplitId.Gabranth,
new KillBoss(6600, 779),
new Cutscene("bhm_b0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.Vayne,
new KillBoss(6750, 782),
new Cutscene("bhm_c0101", CutsceneAction.Exit)
),
new SplitInfo(
SplitId.VayneNovus,
new KillBoss(new uint[] { 6850, 6900 }, 782)
),
new SplitInfo(
SplitId.TheUndying,
new TheUndying()
),
};
private HashSet<uint> Completed { get; } = new();
internal LogicResult Tick(TzaControl control, TimerPhase phase, GameMemory memory) {
// never do anything if the timer is ended
if (phase == TimerPhase.Ended) {
return LogicResult.None;
}
foreach (var info in Splits) {
if (this.Completed.Contains(info.Id)) {
continue;
}
if (!control.EnabledSplits.TryGetValue(info.Id, out var idx)) {
continue;
}
if (idx >= info.Splits.Length) {
continue;
}
var result = info.Splits[idx].Calculate(phase, memory);
if (result == LogicResult.None) {
continue;
}
this.Completed.Add(info.Id);
return result;
}
return LogicResult.None;
}
}
internal enum LogicResult {
None,
Start,
Split,
}