Skip to content

Commit 38104c1

Browse files
committed
Auto detect sos mons
1 parent b69dfc5 commit 38104c1

File tree

7 files changed

+32
-104
lines changed

7 files changed

+32
-104
lines changed

reader_core/src/gen7/draw.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
utils::{format_egg_parent, is_daycare_masuda_method},
66
};
77

8-
pub use crate::draw::{GREEN, PkxType, RED, WHITE, draw_header, draw_pkx, draw_pkx_brief, get_pp, print_pp};
8+
pub use crate::draw::{draw_header, draw_pkx, draw_pkx_brief, get_pp, print_pp, PkxType, GREEN, RED, WHITE};
99

1010
pub fn draw_rng(reader: &Gen7Reader, rng: &RngWrapper<Sfmt>) {
1111
let sfmt_state = rng.current_state();
@@ -30,19 +30,21 @@ pub fn draw_citra_info(reader: &Gen7Reader) {
3030
pnp::println!("Time offset: {}", main_rng_seed_context.time_offset_ms);
3131
}
3232

33-
pub fn draw_sos(reader: &Gen7Reader, slot: u32, correction: u32) {
33+
pub fn draw_sos(reader: &Gen7Reader, slot: u32) {
3434
pnp::println!("SOS Seed: {:08X}", reader.sos_seed());
3535
pnp::println!("SOS Chain Length: {}", reader.sos_chain());
3636
if reader.orb_active() {
3737
pnp::println!(color = GREEN, "Orb Active")
3838
} else {
3939
pnp::println!(color = RED, "Orb Not Active");
4040
}
41-
pnp::println!("Caller Slot: {}", slot);
42-
print_pp(get_pp(&reader.sos_caller_pkm(slot)));
43-
pnp::println!("");
44-
pnp::println!("Ally Data (Slot {}):", reader.ally_slot(slot, correction) + 1);
45-
draw_pkx_brief(&reader.sos_ally_pkm(slot, correction));
41+
match reader.sos_mon(slot) {
42+
Some(pkx) => {
43+
draw_pkx_brief(&pkx);
44+
print_pp(get_pp(&pkx));
45+
}
46+
None => pnp::println!(color = RED, "Invalid slot"),
47+
}
4648
}
4749

4850
pub fn draw_daycare(reader: &Gen7Reader) {

reader_core/src/gen7/frame.rs

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
use super::{
2-
draw::{PkxType, draw_citra_info, draw_daycare, draw_header, draw_pkx, draw_rng, draw_sos},
2+
draw::{draw_citra_info, draw_daycare, draw_header, draw_pkx, draw_rng, draw_sos, PkxType},
33
reader::Gen7Reader,
44
};
55
use crate::{
66
pnp,
77
rng::{RngWrapper, Sfmt},
88
utils::{
9-
ShowView,
109
help_menu::HelpMenu,
1110
menu::{Menu, MenuOption, MenuOptionValue},
1211
sub_menu::SubMenu,
13-
sub_menu_capture::SubMenuCapture,
12+
ShowView,
1413
},
1514
};
1615
use once_cell::unsync::Lazy;
@@ -54,7 +53,7 @@ struct PersistedState {
5453
help_menu: HelpMenu,
5554
wild_menu: SubMenu<1, 4>,
5655
party_menu: SubMenu<1, 6>,
57-
sos_menu: SubMenuCapture<1, 4>,
56+
sos_menu: SubMenu<1, 2>,
5857
pelago_menu: SubMenu<1, 3>,
5958
}
6059

@@ -66,21 +65,8 @@ unsafe fn get_state() -> &'static mut PersistedState {
6665
party_menu: SubMenu::default(),
6766
pelago_menu: SubMenu::default(),
6867
wild_menu: SubMenu::default(),
69-
sos_menu: SubMenuCapture::default(),
70-
help_menu: HelpMenu::new(|| {
71-
pnp::println!("SOS Controls:");
72-
pnp::println!("[X] + [Right]:");
73-
pnp::println!(" Set Caller slot to");
74-
pnp::println!(" the current ally.");
75-
pnp::println!(" Use this when you");
76-
pnp::println!(" faint the caller.");
77-
pnp::println!("");
78-
pnp::println!("[X] + [Up]/[Down]:");
79-
pnp::println!(" Manually change");
80-
pnp::println!(" the caller slot.");
81-
pnp::println!(" (Not recommended)");
82-
pnp::println!("");
83-
}),
68+
sos_menu: SubMenu::default(),
69+
help_menu: HelpMenu::default(),
8470
main_menu: Menu::new([
8571
MenuOption::new(Gen7View::Rng),
8672
MenuOption::new(Gen7View::Daycare),
@@ -125,15 +111,8 @@ fn run_frame(reader: Gen7Reader) {
125111
draw_pkx(&reader.wild_pkm((slot - 1) as u32), PkxType::Wild);
126112
}
127113
Gen7View::Sos => {
128-
let prev_caller_slot = state.sos_menu.counter_value();
129-
let prev_correction_value = state.sos_menu.captured_value();
130-
let caller_slot = state.sos_menu.update_headless(
131-
is_locked,
132-
reader.sos_chain() as u32,
133-
reader.ally_slot(prev_caller_slot as u32, prev_correction_value) as usize + 1,
134-
);
135-
let correction_value = state.sos_menu.captured_value();
136-
draw_sos(&reader, caller_slot as u32, correction_value);
114+
let slot = state.sos_menu.update_and_draw(is_locked);
115+
draw_sos(&reader, (slot - 1) as u32);
137116
}
138117
Gen7View::Box => draw_pkx(&reader.box_pkm(), PkxType::Tame),
139118
Gen7View::Citra => draw_citra_info(&reader),

reader_core/src/gen7/reader.rs

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::{game_lib, hook};
22
use crate::pnp;
3-
use core::num::{NonZeroU8, NonZeroU32};
3+
use core::num::{NonZeroU32, NonZeroU8};
44
use pkm_rs::{Pk7, PokeCrypto};
55

66
struct Gen7Addresses {
@@ -9,9 +9,9 @@ struct Gen7Addresses {
99
sfmt_state: u32,
1010
party: u32,
1111
wild: u32,
12-
sos: u32,
1312
orb_active: u32,
1413
sos_chain_length: u32,
14+
sos_battle_table: Option<u32>,
1515
// To be used in the future vvv
1616
_sos_index: u32,
1717
_ally_id: u32,
@@ -37,7 +37,7 @@ const SM_ADDRESSES: Gen7Addresses = Gen7Addresses {
3737
sfmt_state: 0x33195b88,
3838
party: 0x34195e10,
3939
wild: 0x3002f7b8,
40-
sos: 0x3002f7b8,
40+
sos_battle_table: None,
4141
_sos_index: 0x30039614,
4242
orb_active: 0x3003961c,
4343
sos_chain_length: 0x3003960d,
@@ -63,7 +63,7 @@ const USUM_ADDRESSES: Gen7Addresses = Gen7Addresses {
6363
sfmt_state: 0x330d35d8,
6464
party: 0x33f7fa44,
6565
wild: 0x3002f9a0,
66-
sos: 0x3002f9a0,
66+
sos_battle_table: Some(0x30000420),
6767
_sos_index: 0x300397F0,
6868
orb_active: 0x300397f8,
6969
sos_chain_length: 0x300397f9,
@@ -154,15 +154,21 @@ impl Gen7Reader {
154154
pub fn sos_chain(&self) -> u8 {
155155
pnp::read(self.addrs.sos_chain_length)
156156
}
157+
157158
pub fn orb_active(&self) -> bool {
158159
((pnp::read::<u8>(self.addrs.orb_active) & 0x1) > 0) as bool
159160
}
160-
pub fn ally_slot(&self, caller_slot: u32, correction: u32) -> u32 {
161-
if self.sos_chain() == 0 {
162-
0
163-
} else {
164-
((caller_slot - 1) + ((self.sos_chain() as i32 - (correction as i32 + 1)) % 3) as u32 + 1) % 4
165-
}
161+
162+
pub fn sos_mon(&self, slot: u32) -> Option<Pk7> {
163+
let table_offset = match slot {
164+
0x0 => 0x4, // Left
165+
0x1 => 0x0, // Right
166+
_ => return None,
167+
};
168+
let battle_table = self.addrs.sos_battle_table?;
169+
let pkx_container_ptr = pnp::read::<u32>(battle_table + table_offset);
170+
let pkx_container = pnp::read::<u32>(pkx_container_ptr);
171+
Some(self.read_pk7(pkx_container + 0x40))
166172
}
167173

168174
fn read_pk7(&self, offset: u32) -> Pk7 {
@@ -207,13 +213,6 @@ impl Gen7Reader {
207213
self.read_pk7((slot * 236) + self.addrs.pelago)
208214
}
209215

210-
pub fn sos_caller_pkm(&self, caller_slot: u32) -> Pk7 {
211-
self.read_pk7(((caller_slot - 1) * 484) + self.addrs.sos)
212-
}
213-
pub fn sos_ally_pkm(&self, caller_slot: u32, correction: u32) -> Pk7 {
214-
self.read_pk7((self.ally_slot(caller_slot, correction) * 484) + self.addrs.sos)
215-
}
216-
217216
pub fn is_egg_ready(&self) -> bool {
218217
pnp::read::<u8>(self.addrs.egg_ready) != 0
219218
}

reader_core/src/utils/circular_counter.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ impl<const MIN: usize, const MAX: usize> CircularCounter<MIN, MAX> {
2727

2828
self.value
2929
}
30-
pub fn set(&mut self, value: usize) -> usize {
31-
self.value = value.clamp(MIN, MAX);
32-
self.value
33-
}
3430
}
3531

3632
impl<const MIN: usize, const MAX: usize> Default for CircularCounter<MIN, MAX> {

reader_core/src/utils/help_menu.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,6 @@ fn print_view(help_view: &HelpView) {
4040
}
4141

4242
impl HelpMenu {
43-
pub fn new(specific_help: fn() -> ()) -> Self {
44-
Self {
45-
specific_help: specific_help,
46-
sub_menu: SubMenu::default(),
47-
}
48-
}
49-
5043
pub fn update_and_draw(&mut self, is_locked: bool) {
5144
let help_view = view(self.sub_menu.update_headless(is_locked));
5245
print_view(&help_view);

reader_core/src/utils/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ mod hook_gen6_seed;
99
pub mod menu;
1010
mod show_view;
1111
pub mod sub_menu;
12-
pub mod sub_menu_capture;
1312

1413
pub use circular_counter::*;
1514
pub use daycare::*;

reader_core/src/utils/sub_menu_capture.rs

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)