@@ -59,18 +59,6 @@ impl Addr {
5959 }
6060 }
6161}
62- async fn Attacher ( ) -> Process {
63- loop {
64- if let Some ( process) = Process :: attach ( "SniperElite.exe" ) {
65- return process;
66- }
67- else {
68- asr:: print_message ( "Waiting for game to attach..." ) ;
69- sleep ( Duration :: from_secs ( 1 ) ) . await ;
70- }
71- }
72- }
73-
7462
7563async fn main ( ) {
7664 let mut settings = Settings :: register ( ) ;
@@ -97,105 +85,107 @@ async fn main() {
9785
9886 let mut baseAddress = asr:: Address :: new ( 0 ) ;
9987 let mut addrStruct = Addr :: steam ( ) ;
100-
101- let process = Attacher ( ) . await ;
102- process. until_closes ( async {
103- if let ( Ok ( base) , Ok ( moduleSize) ) = ( process. get_module_address ( "SniperElite.exe" ) , process. get_module_size ( "SniperElite.exe" ) ) {
104- baseAddress = base;
105- if moduleSize == 3805184 {
106- addrStruct = Addr :: gog ( ) ;
107- }
108- }
109- unsafe {
110- let mut start = || {
111- cutsByte = process. read :: < u8 > ( baseAddress + addrStruct. cutsAddress ) . unwrap_or ( 0 ) ;
112-
113- if startByte == 5 && cutsByte == 0 && oldStart == 2 ||
114- levelStr == "level02a" && startByte == 5 && oldStart == 255 {
115- asr:: timer:: start ( ) ;
116- }
117- } ;
88+ loop {
89+ let process = Process :: wait_attach ( "SniperElite.exe" ) . await ;
11890
119- let levelSplit = || {
120- if levelArray != oldLevel {
121- asr:: timer:: split ( ) ;
91+ process. until_closes ( async {
92+ if let ( Ok ( base) , Ok ( moduleSize) ) = ( process. get_module_address ( "SniperElite.exe" ) , process. get_module_size ( "SniperElite.exe" ) ) {
93+ baseAddress = base;
94+ if moduleSize == 3805184 {
95+ addrStruct = Addr :: gog ( ) ;
12296 }
123- } ;
124-
125- let mut isLoading = || {
126- loadByte = process. read :: < u8 > ( baseAddress + addrStruct. loadAddress ) . unwrap_or ( 1 ) ;
127- briefingByte = process. read :: < u8 > ( baseAddress + addrStruct. briefingAddress ) . unwrap_or ( 0 ) ;
128-
129- match process. read_into_slice ( baseAddress + addrStruct. warRecordAddress , & mut warRecordArray) {
130- Ok ( _) => warRecordArray[ 0 ] ,
131- Err ( _) => return
97+ }
98+ unsafe {
99+ let mut start = || {
100+ cutsByte = process. read :: < u8 > ( baseAddress + addrStruct. cutsAddress ) . unwrap_or ( 0 ) ;
101+
102+ if startByte == 5 && cutsByte == 0 && oldStart == 2 ||
103+ levelStr == "level02a" && startByte == 5 && oldStart == 255 {
104+ asr:: timer:: start ( ) ;
105+ }
106+ } ;
107+
108+ let levelSplit = || {
109+ if levelArray != oldLevel {
110+ asr:: timer:: split ( ) ;
111+ }
132112 } ;
133- let warRecordStr: & str = str:: from_utf8 ( & warRecordArray) . unwrap_or ( "" ) . split ( '\0' ) . next ( ) . unwrap_or ( "" ) ;
134113
135- fps = process. read :: < f32 > ( baseAddress + addrStruct. fpsAddress ) . unwrap_or ( 0.0 ) ;
114+ let mut isLoading = || {
115+ loadByte = process. read :: < u8 > ( baseAddress + addrStruct. loadAddress ) . unwrap_or ( 1 ) ;
116+ briefingByte = process. read :: < u8 > ( baseAddress + addrStruct. briefingAddress ) . unwrap_or ( 0 ) ;
136117
137- if fps != oldFps {
138- if oldFps == 60.0 && warRecordStr == "\\ splash\\ oldmenu1.dds" {
139- warRecord = 1 ;
118+ match process. read_into_slice ( baseAddress + addrStruct. warRecordAddress , & mut warRecordArray) {
119+ Ok ( _) => warRecordArray[ 0 ] ,
120+ Err ( _) => return
121+ } ;
122+ let warRecordStr: & str = str:: from_utf8 ( & warRecordArray) . unwrap_or ( "" ) . split ( '\0' ) . next ( ) . unwrap_or ( "" ) ;
123+
124+ fps = process. read :: < f32 > ( baseAddress + addrStruct. fpsAddress ) . unwrap_or ( 0.0 ) ;
125+
126+ if fps != oldFps {
127+ if oldFps == 60.0 && warRecordStr == "\\ splash\\ oldmenu1.dds" {
128+ warRecord = 1 ;
129+ }
140130 }
141- }
142- if warRecordStr == "\\ splash\\ loading\\ level"
143- || warRecordStr == "\\ splash\\ frontsc2.dds" {
144- warRecord = 0 ;
145- }
131+ if warRecordStr == "\\ splash\\ loading\\ level"
132+ || warRecordStr == "\\ splash\\ frontsc2.dds" {
133+ warRecord = 0 ;
134+ }
135+
136+ if loadByte == 0 && ( briefingByte != 1 && fps < 1000.0 ) && warRecord != 1
137+ || fps > 1000.0 {
138+ asr:: timer:: pause_game_time ( ) ;
139+ }
140+ else {
141+ asr:: timer:: resume_game_time ( ) ;
142+ }
143+ } ;
146144
147- if loadByte == 0 && ( briefingByte != 1 && fps < 1000.0 ) && warRecord != 1
148- || fps > 1000.0 {
149- asr:: timer:: pause_game_time ( ) ;
150- }
151- else {
152- asr:: timer:: resume_game_time ( ) ;
153- }
154- } ;
155-
156- let lastSplit = || {
157- if levelStr == "level08d" && oldStart == 5 && startByte == 2
158- || levelStr == "level02a" && startByte == 5 && mcByte == 256 {
159- asr:: timer:: split ( ) ;
160- }
161- } ;
162-
163- let individualLvl = || {
164- if startByte == 5 && mcByte == 256 {
165- asr:: timer:: split ( ) ;
166- }
167- } ;
168- loop {
169- settings. update ( ) ;
170-
171- startByte = process. read :: < u8 > ( baseAddress + addrStruct. startAddress ) . unwrap_or ( 0 ) ;
172-
173- match process. read_into_slice ( baseAddress + addrStruct. levelAddress , & mut levelArray) {
174- Ok ( _) => levelArray[ 0 ] ,
175- Err ( _) => return
145+ let lastSplit = || {
146+ if levelStr == "level08d" && oldStart == 5 && startByte == 2
147+ || levelStr == "level02a" && startByte == 5 && mcByte == 256 {
148+ asr:: timer:: split ( ) ;
149+ }
176150 } ;
177- levelStr = str:: from_utf8 ( & levelArray) . unwrap_or ( "" ) . split ( '\0' ) . next ( ) . unwrap_or ( "" ) ;
178-
179- mcByte = process. read :: < u16 > ( baseAddress + addrStruct. mcAddress ) . unwrap_or ( 0 ) ;
180-
181- //let start_time = asr::time_util::Instant::now();
182- if settings. Full_game_run {
183- levelSplit ( ) ;
184- lastSplit ( ) ;
185- }
186- //let end_time = start_time.elapsed();
187- //asr::print_message(&alloc::format!("Tick time: {:?}", end_time));
188- if settings. Individual_level {
189- individualLvl ( ) ;
151+
152+ let individualLvl = || {
153+ if startByte == 5 && mcByte == 256 {
154+ asr:: timer:: split ( ) ;
155+ }
156+ } ;
157+ loop {
158+ settings. update ( ) ;
159+
160+ startByte = process. read :: < u8 > ( baseAddress + addrStruct. startAddress ) . unwrap_or ( 0 ) ;
161+
162+ match process. read_into_slice ( baseAddress + addrStruct. levelAddress , & mut levelArray) {
163+ Ok ( _) => levelArray[ 0 ] ,
164+ Err ( _) => return
165+ } ;
166+ levelStr = str:: from_utf8 ( & levelArray) . unwrap_or ( "" ) . split ( '\0' ) . next ( ) . unwrap_or ( "" ) ;
167+
168+ mcByte = process. read :: < u16 > ( baseAddress + addrStruct. mcAddress ) . unwrap_or ( 0 ) ;
169+
170+ //let start_time = asr::time_util::Instant::now();
171+ if settings. Full_game_run {
172+ levelSplit ( ) ;
173+ lastSplit ( ) ;
174+ }
175+ //let end_time = start_time.elapsed();
176+ //asr::print_message(&alloc::format!("Tick time: {:?}", end_time));
177+ if settings. Individual_level {
178+ individualLvl ( ) ;
179+ }
180+ start ( ) ;
181+ isLoading ( ) ;
182+
183+ oldStart = startByte;
184+ oldFps = fps;
185+ oldLevel = levelArray;
186+ sleep ( Duration :: from_nanos ( 16666667 ) ) . await ;
190187 }
191- start ( ) ;
192- isLoading ( ) ;
193-
194- oldStart = startByte;
195- oldFps = fps;
196- oldLevel = levelArray;
197- sleep ( Duration :: from_nanos ( 16666667 ) ) . await ;
198188 }
199- }
200- } ) . await ;
189+ } ) . await ;
190+ }
201191}
0 commit comments