Skip to content

Commit 286fc5c

Browse files
committed
Let ASR handle reattaching
1 parent 786491f commit 286fc5c

File tree

1 file changed

+93
-103
lines changed

1 file changed

+93
-103
lines changed

src/lib.rs

Lines changed: 93 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -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

7563
async 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

Comments
 (0)