1
+ state("The Last Faith" ) { }
2
+
3
+ startup
4
+ {
5
+ Assembly.Load (File.ReadAllBytes("Components/asl-help" )).CreateInstance("Unity" );
6
+ vars.Helper.GameName = "The Last Faith" ;
7
+ vars.Helper.LoadSceneManager = true;
8
+ vars.Helper.Settings.CreateFromXml("Components/TheLastFaith.Settings.xml" );
9
+
10
+ vars.Watch = (Action<IDictionary<string, object>, IDictionary<string, object>, string>)((oldLookup, currentLookup, key) =>
11
+ {
12
+ var oldValue = oldLookup[key];
13
+ var currentValue = currentLookup[key];
14
+ if (oldValue != null && currentValue != null && !oldValue.Equals(currentValue))
15
+ vars.Log(key + ": " + oldValue + " -> " + currentValue);
16
+ });
17
+
18
+ vars.CompletedSplits = new HashSet<string>();
19
+
20
+ vars.Helper.AlertRealTime();
21
+ }
22
+
23
+ /* Todo
24
+ * - find a thing to measure the start point
25
+ * - get something for when boss fights start
26
+ * - picking up items (weapons, key items, etc)
27
+ */
28
+ init
29
+ {
30
+ vars.Helper.TryLoad = (Func<dynamic, bool>)(mono =>
31
+ {
32
+ // I don't know why this is needed. asl-help reads all offsets as 0x10 earlier than they
33
+ // actually are. (huge pain to figure out why this wasn't working)
34
+ var OFFSET = 0x10 ;
35
+ // var UIPlayerController = mono["UIPlayerController"];
36
+ // var UiManager = mono["UiManager"];
37
+ // var UIPanel = mono["UIPanel"];
38
+
39
+ // vars.Helper["hudStatus"] = UIPlayerController.Make<bool>("Instance", UIPlayerController["uiManager"] + 0x10, UiManager["currentTopHudStatus"] + 0x10);
40
+ // vars.Helper["hud"] = UIPlayerController.Make<int>("Instance", UIPlayerController["uiManager"] + 0x10, UiManager["hud"] + 0x10, UIPanel["priority"] + 0x10);
41
+ // vars.Helper["blackScreen"] = UIPlayerController.Make<int>("Instance", UIPlayerController["blackScreen"] + 0x10);
42
+ // vars.Helper["showUIPC"] = UIPlayerController.Make<bool>("Show");
43
+
44
+ // var BaseController2D = mono["BaseController2D"];
45
+ // var BaseHealth2D = mono["BaseHealth2D"];
46
+ // vars.Helper["healthActive"] = BaseController2D.Make<bool>("Instance", BaseController2D["Health"] + 0x10, BaseHealth2D["HealthPrefab"] + 0x10, 0x57);
47
+ // vars.Log("HA " + vars.Helper["healthActive"]);
48
+
49
+ var UIPlayerController = mono["UIPlayerController" ];
50
+ var DeveloperBossControllerConsole = mono["DeveloperBossControllerConsole" ];
51
+ var BossFightController = mono["BossFightController" ];
52
+ var BaseBossController = mono["BaseBossController" ];
53
+ var EnemyHealth = mono["EnemyHealth" ];
54
+
55
+ vars.Helper["boss" ] = UIPlayerController.Make<int>(
56
+ "Instance" ,
57
+ UIPlayerController["bossConsole" ] + OFFSET,
58
+ DeveloperBossControllerConsole["fightControllerScript" ] + OFFSET,
59
+ BossFightController["bossName" ] + OFFSET
60
+ );
61
+
62
+ vars.Helper["bossIsDead" ] = UIPlayerController.Make<bool>(
63
+ "Instance" ,
64
+ UIPlayerController["bossConsole" ] + OFFSET,
65
+ DeveloperBossControllerConsole["fightControllerScript" ] + OFFSET,
66
+ BossFightController["Boss" ] + OFFSET,
67
+ BaseBossController["enemyHealth" ] + OFFSET,
68
+ EnemyHealth["isDead" ] + OFFSET
69
+ );
70
+ // Other fun paths
71
+ // 0x24
72
+ // 0x40, 0x420, 0x21A // Boss, enemyHealth, isDead
73
+ // 0x40, 0x420, 0x28, 0x2c // Boss, enemyHealth, health, value
74
+ // 0x2F8 fightStarted
75
+
76
+ // (working)
77
+ var CurrentActiveCheckPoint = mono["CurrentActiveCheckPoint" ];
78
+ var CheckPoint = mono["CheckPoint" ];
79
+ var PersistentObject = mono["PersistentObject" ];
80
+ var PersistentObjectPath = mono["PersistentObjectPath" ];
81
+
82
+ vars.Helper["checkpoint" ] = CurrentActiveCheckPoint.MakeString(
83
+ "checkPoint" ,
84
+ CheckPoint["persistentObject" ] + OFFSET, // 0xC8
85
+ PersistentObject["path" ] + OFFSET, // 0x18,
86
+ PersistentObjectPath["path" ] + OFFSET // 0x10
87
+ );
88
+
89
+ vars.Helper["checkpointInMenu" ] = CurrentActiveCheckPoint.Make<bool>(
90
+ "checkPoint" ,
91
+ CheckPoint["inMenu" ] + OFFSET // 0xD0
92
+ );
93
+
94
+ return true;
95
+ });
96
+
97
+ // this function is a helper for checking splits that may or may not exist in settings,
98
+ // and if we want to do them only once
99
+ vars.CheckSplit = (Func<string, bool>)(key => {
100
+ // if the split doesn't exist, or it's off, or we've done it already
101
+ if (!settings.ContainsKey(key)
102
+ || !settings[key]
103
+ || !vars.CompletedSplits.Add (key)
104
+ ) {
105
+ return false;
106
+ }
107
+
108
+ vars.Log("Completed: " + key);
109
+ return true;
110
+ });
111
+ }
112
+
113
+ update
114
+ {
115
+ current.activeScene = vars.Helper.Scenes.Active.Name ?? current.activeScene;
116
+ current.loadingScene = vars.Helper.Scenes.Loaded[0 ].Name ?? current.loadingScene;
117
+
118
+ vars.Watch(old, current, "activeScene" );
119
+ vars.Watch(old, current, "loadingScene" );
120
+ if (old.checkpoint != current.checkpoint) {
121
+ vars.Log("checkpoint: " + old.checkpoint + " -> " + current.checkpoint);
122
+ // vars.Log("<Setting Id=\"cp_" + current.checkpoint + "\" Label=\"\" State=\"false\">");
123
+ }
124
+ vars.Watch(old, current, "checkpointInMenu" );
125
+
126
+ vars.Watch(old, current, "boss" );
127
+ vars.Watch(old, current, "bossIsDead" );
128
+
129
+ // vars.Watch(old, current, "showUIPC");
130
+ // vars.Watch(old, current, "healthActive");
131
+
132
+ // vars.Watch(old, current, "boss");
133
+ }
134
+
135
+ onStart
136
+ {
137
+ // refresh all splits when we start the run, none are yet completed
138
+ vars.CompletedSplits.Clear();
139
+
140
+ vars.Log(current.activeScene);
141
+ vars.Log(current.checkpoint);
142
+ vars.Log(current.checkpointInMenu);
143
+
144
+ vars.Log(current.boss);
145
+ vars.Log(current.bossIsDead);
146
+ // vars.Log(current.hudStatus);
147
+ // vars.Log(current.hud);
148
+ // vars.Log(current.healthActive);
149
+ }
150
+
151
+ isLoading
152
+ {
153
+ return current.loadingScene != current.activeScene;
154
+ }
155
+
156
+ split
157
+ {
158
+ if (settings["checkpoint" ]
159
+ && !old.checkpointInMenu && current.checkpointInMenu
160
+ && vars.CheckSplit(current.checkpoint)
161
+ ) {
162
+ return true;
163
+ }
164
+
165
+
166
+ if (settings["boss_death" ]
167
+ && !old.bossIsDead && current.bossIsDead
168
+ && vars.CheckSplit("boss_" + current.boss)
169
+ ) {
170
+ return true;
171
+ }
172
+ }
0 commit comments