@@ -40,10 +40,12 @@ class CelesteScanner {
40
40
print ( " Scanning for the AutoSplitterData object header " )
41
41
42
42
extendedInfo = try process. findPointer ( by: " 11efbeadde11 " )
43
+ if let info = extendedInfo {
44
+ try Mono . debugMemory ( around: info, before: 64 , after: 64 )
45
+ }
43
46
44
47
if CelesteScanner . canImmediatelyConnect ( pid: pid) {
45
48
headerInfo = CelesteScanner . lastHeader
46
- try ? debugPointers ( )
47
49
return
48
50
}
49
51
@@ -58,12 +60,10 @@ class CelesteScanner {
58
60
}
59
61
60
62
func readExtended( ) throws -> ExtendedAutoSplitterData ? {
61
- // if guard let extendedInfo = extendedInfo else {
62
- // return nil
63
- // }
64
- // let buf = try target.read(at: extendedPointer, count: )
65
- // return ExtendedAutoSplitterData(from: extendedInfo)
66
- return nil
63
+ guard let extendedInfo = extendedInfo else {
64
+ return nil
65
+ }
66
+ return try ExtendedAutoSplitterData ( from: extendedInfo)
67
67
}
68
68
69
69
func getInfo( ) throws -> AutoSplitterInfo ? {
@@ -75,50 +75,6 @@ class CelesteScanner {
75
75
return try AutoSplitterInfo ( from: try AutoSplitterData ( from: info) )
76
76
}
77
77
78
- /**
79
- Run a scan for the level strings, printing the memory of every match. Useful for figuring out the memory layout
80
- */
81
- func debugPointers( ) throws {
82
-
83
- // print("Running a pointer debug")
84
- // guard let signature = headerSignature else {
85
- // print(" There is no header signature. Please open the AUTOSPLIT save and scan for the header.")
86
- // pointer = 0
87
- // return
88
- // }
89
- //
90
- // let scanner = MemscanScanner(target: target, signature: signature, filter: filter)
91
- // while let match = try scanner.next() {
92
- // print(String(format: "Object @ %016llx", match.address))
93
- //
94
- // let vTable_ptr = try readPointer(from: match.address, offset: 0)
95
- // print(String(format: "VTable @ %016llx", vTable_ptr))
96
- //
97
- //// try debugMemoryAround(vTable_ptr, before: 0, after: 64)
98
- //
99
- // let monoClass_ptr = try readPointer(from: vTable_ptr, offset: 0)
100
- // print(String(format: "MonoClass @ %016llx", monoClass_ptr))
101
- //
102
- //// try debugMemoryAround(monoClass_ptr, before: 0, after: 64)
103
- //
104
- // let name_ptr = try readPointer(from: monoClass_ptr, offset: 8)
105
- // print(String(format: "MonoClass.name @ %016llx", name_ptr))
106
- // try debugMemoryAround(name_ptr, before: 0, after: 128)
107
- //
108
- // }
109
- }
110
-
111
- func readPointer( from address: vm_address_t , offset: vm_offset_t ) throws -> vm_address_t {
112
- let data = try target. read ( at: address + offset, count: 8 )
113
- return data. buffer. bindMemory ( to: vm_address_t. self) [ 0 ]
114
- }
115
-
116
- func debugMemoryAround( _ address: vm_address_t , before: vm_offset_t , after: vm_offset_t ) throws {
117
- let data = try target. read ( at: address - before, count: before + after)
118
- print ( " Forward: \( data. debugString ( withCursor: Int ( before) ) ) " )
119
- print ( " Reversed: \( data. debugStringReversed ( withCursor: Int ( before) ) ) " )
120
- }
121
-
122
78
static var lastHeader : HeaderInfo ? {
123
79
get {
124
80
if let data = UserDefaults . standard. value ( forKey: " lastHeader " ) as? Data ,
@@ -188,9 +144,6 @@ struct HeaderInfo: Codable {
188
144
```
189
145
*/
190
146
struct AutoSplitterData {
191
- var header : UInt64
192
- var monoSync : UInt64
193
-
194
147
var chapter : Int32
195
148
var mode : Int32
196
149
var level : RmaPointer
@@ -207,23 +160,21 @@ struct AutoSplitterData {
207
160
var fileHearts : Int32
208
161
209
162
init ( from pointer: RmaPointer ) throws {
210
- let preload = try pointer. preload ( size: 80 )
211
- header = preload. value ( at: 0 )
212
- monoSync = preload. value ( at: 8 )
213
- level = preload. value ( at: 16 )
214
- chapter = preload. value ( at: 24 )
215
- mode = preload. value ( at: 28 )
216
- timerActive = preload. value ( at: 32 )
217
- chapterStarted = preload. value ( at: 33 )
218
- chapterComplete = preload. value ( at: 34 )
219
- chapterTime = preload. value ( at: 40 )
220
- chapterStrawberries = preload. value ( at: 48 )
221
- chapterCassette = preload. value ( at: 52 )
222
- chapterHeart = preload. value ( at: 53 )
223
- fileTime = preload. value ( at: 56 )
224
- fileStrawberries = preload. value ( at: 64 )
225
- fileCassettes = preload. value ( at: 68 )
226
- fileHearts = preload. value ( at: 72 )
163
+ let body = try pointer. offset ( by: Mono . HEADER_BYTES) . preload ( size: 60 )
164
+ level = body. value ( at: 0 )
165
+ chapter = body. value ( at: 8 )
166
+ mode = body. value ( at: 12 )
167
+ timerActive = body. value ( at: 16 )
168
+ chapterStarted = body. value ( at: 17 )
169
+ chapterComplete = body. value ( at: 18 )
170
+ chapterTime = body. value ( at: 24 )
171
+ chapterStrawberries = body. value ( at: 32 )
172
+ chapterCassette = body. value ( at: 36 )
173
+ chapterHeart = body. value ( at: 37 )
174
+ fileTime = body. value ( at: 40 )
175
+ fileStrawberries = body. value ( at: 48 )
176
+ fileCassettes = body. value ( at: 52 )
177
+ fileHearts = body. value ( at: 56 )
227
178
}
228
179
}
229
180
@@ -285,7 +236,7 @@ class AutoSplitterInfo {
285
236
default :
286
237
self . mode = . Other( value: Int ( data. mode) )
287
238
}
288
- self . level = try Mono . readString ( at: data. level)
239
+ self . level = try Mono . readString ( at: data. level) ?? " "
289
240
self . timerActive = data. timerActive != 0
290
241
self . chapterStarted = data. chapterStarted != 0
291
242
self . chapterComplete = data. chapterComplete != 0
@@ -301,14 +252,26 @@ class AutoSplitterInfo {
301
252
}
302
253
303
254
struct ExtendedAutoSplitterData {
304
- var madelineX : Float = 0.0
305
- var madelineY : Float = 0.0
306
-
307
- init ( ) { }
255
+ var madelineX : Float
256
+ var madelineY : Float
257
+ var fileDeaths : Int32
258
+ var levelDeaths : Int32
259
+ var areaName : String
260
+ var areaSID : String
261
+ var levelSet : String
262
+ var completeScreenName : String
308
263
309
264
init ( from pointer: RmaPointer ) throws {
310
- madelineX = try pointer. value ( at: 0 )
311
- madelineY = try pointer. value ( at: 4 )
265
+ // offset to skip the `11deadbeef11`
266
+ let body = try pointer. offset ( by: 8 ) . preload ( size: 48 )
267
+ madelineX = body. value ( at: 0 )
268
+ madelineY = body. value ( at: 4 )
269
+ fileDeaths = body. value ( at: 8 )
270
+ levelDeaths = body. value ( at: 12 )
271
+ areaName = try Mono . readString ( at: body. value ( at: 16 ) ) ?? " "
272
+ areaSID = try Mono . readString ( at: body. value ( at: 24 ) ) ?? " "
273
+ levelSet = try Mono . readString ( at: body. value ( at: 32 ) ) ?? " "
274
+ completeScreenName = try Mono . readString ( at: body. value ( at: 40 ) ) ?? " "
312
275
}
313
276
}
314
277
0 commit comments