rosu_memory_lib/reader/common/stable/
memory.rs1use std::path::PathBuf;
2
3use crate::generate_offset_getter;
4use crate::reader::common::stable::offset::COMMON_OFFSET;
5use crate::reader::common::GameState;
6use crate::reader::helpers::{read_i32, read_u32};
7use crate::reader::structs::State;
8use crate::Error;
9use rosu_mem::process::{Process, ProcessTraits};
10
11pub fn status_addr(p: &Process, state: &mut State) -> Result<i32, Error> {
12 Ok(p.read_i32(state.addresses.status - COMMON_OFFSET.status)?)
13}
14
15pub(crate) fn path_folder(p: &Process, state: &mut State) -> Result<PathBuf, Error> {
21 let settings_ptr = p.read_i32(state.addresses.settings + COMMON_OFFSET.settings_ptr)?;
22 let settings_addr = p.read_i32(settings_ptr + COMMON_OFFSET.settings_addr)?;
23 let path = p.read_string(settings_addr + COMMON_OFFSET.path)?;
24
25 if path == "Songs" {
27 if let Some(executable_dir) = &p.executable_dir {
28 let path = executable_dir.clone().join("Songs");
29
30 return Ok(path);
31 }
32 }
33
34 Ok(PathBuf::from(path))
35}
36
37pub fn menu_mods_addr(p: &Process, state: &mut State) -> Result<i32, Error> {
38 Ok(p.read_i32(state.addresses.menu_mods + COMMON_OFFSET.mods_ptr)?)
39}
40
41pub fn playtime_addr(p: &Process, state: &mut State) -> Result<i32, Error> {
42 Ok(p.read_i32(state.addresses.playtime + COMMON_OFFSET.ig_time)?)
43}
44
45pub fn is_watching_replay(p: &Process, state: &mut State) -> Result<bool, Error> {
46 Ok(
47 p.read_u8(p.read_i32(state.addresses.check_replay_addr + COMMON_OFFSET.check_replay)?)?
48 == 1,
49 )
50}
51
52pub fn is_paused(p: &Process, state: &mut State) -> Result<bool, Error> {
54 let base_some = p.read_i32(state.addresses.base + COMMON_OFFSET.pause_ptr)?;
55 let pause = p.read_i8(
56 base_some + COMMON_OFFSET.pause,
57 )?;
58 return Ok(pause == 1);
59}
60
61generate_offset_getter! {
62 game_state: GameState = read_u32(0, status_addr);
63 menu_game_mode: u32 = read_u32(0, menu_mods_addr); game_time: i32 = read_i32(0, playtime_addr);
65}
66
67pub fn check_game_state(p: &Process, state: &mut State, g_state: GameState) -> Result<bool, Error> {
69 Ok(game_state(p, state)? == g_state)
70}