diff --git a/ryujinx_build.ps1 b/ryujinx_build.ps1 index 24498c3..1d4702b 100644 --- a/ryujinx_build.ps1 +++ b/ryujinx_build.ps1 @@ -1,4 +1,5 @@ $IP=(Test-Connection -ComputerName (hostname) -Count 1 | Select -ExpandProperty IPV4Address).IPAddressToString cargo skyline build --release --features layout_arc_from_file Copy-Item target/aarch64-skyline-switch/release/libtraining_modpack.nro 'C:\Users\Jdsam\AppData\Roaming\Ryujinx\mods\contents\01006A800016E000\romfs\skyline\plugins\' -cargo skyline listen --ip=$IP \ No newline at end of file +cargo skyline listen --ip=$IP +# C:\Users\Jdsam\Documents\Games\Emulators\ryujinx-1.1.299-win_x64\publish\BLAH.exe C:\Users\Jdsam\Documents\Games\Emulators\ryujinx-1.1.299-win_x64\publish\Ryujinx.exe "C:\Users\Jdsam\Documents\Games\SmashRoms\UltimateXCI\ultimate.xci" \ No newline at end of file diff --git a/src/common/button_config.rs b/src/common/button_config.rs index 0b78d4d..82a4b0d 100644 --- a/src/common/button_config.rs +++ b/src/common/button_config.rs @@ -1,9 +1,10 @@ -use lazy_static::lazy_static; -use serde::Deserialize; -use smash::app::lua_bind::ControlModule; use std::collections::HashMap; use std::fs; + +use lazy_static::lazy_static; use log::info; +use serde::Deserialize; +use smash::app::lua_bind::ControlModule; use strum::IntoEnumIterator; use strum_macros::EnumIter; use toml; @@ -53,7 +54,7 @@ pub enum ButtonCombo { SaveState, LoadState, PrevSaveStateSlot, - NextSaveStateSlot + NextSaveStateSlot, } #[derive(Deserialize, Default)] @@ -68,7 +69,7 @@ struct BtnComboConfig { save_state: BtnList, load_state: BtnList, previous_save_state_slot: BtnList, - next_save_state_slot: BtnList + next_save_state_slot: BtnList, } #[derive(Deserialize)] @@ -210,9 +211,9 @@ fn combo_passes( .map(|hold| *BUTTON_MAPPING.get(&*hold.to_uppercase()).unwrap()) .all(|hold| ControlModule::check_button_on(module_accessor, hold)) && press - .iter() - .map(|press| *BUTTON_MAPPING.get(&*press.to_uppercase()).unwrap()) - .all(|press| ControlModule::check_button_trigger(module_accessor, press)); + .iter() + .map(|press| *BUTTON_MAPPING.get(&*press.to_uppercase()).unwrap()) + .all(|press| ControlModule::check_button_trigger(module_accessor, press)); this_combo_passes } @@ -220,7 +221,7 @@ fn combo_passes( pub fn combo_passes_exclusive( module_accessor: *mut smash::app::BattleObjectModuleAccessor, - combo: ButtonCombo + combo: ButtonCombo, ) -> bool { let other_combo_passes = ButtonCombo::iter() .filter(|other_combo| *other_combo != combo) diff --git a/src/common/consts.rs b/src/common/consts.rs index 8c33c17..08e83cd 100644 --- a/src/common/consts.rs +++ b/src/common/consts.rs @@ -1 +1,2 @@ pub use training_mod_consts::*; + diff --git a/src/common/dev_config.rs b/src/common/dev_config.rs index 3f904e5..96c091c 100644 --- a/src/common/dev_config.rs +++ b/src/common/dev_config.rs @@ -1,11 +1,12 @@ +use std::fs; + use lazy_static::lazy_static; use parking_lot::Mutex; use serde::Deserialize; use skyline::nn::hid::NpadGcState; -use crate::logging::info; -use std::fs; use toml; +use crate::logging::info; /// Hot-reloadable configs for quicker development /// @@ -29,8 +30,7 @@ use toml; /// quit_menu_text.as_textbox().set_text_string(&dev_config.quit_menu_title); /// ``` #[derive(Deserialize, Default)] -pub struct DevConfig { -} +pub struct DevConfig {} pub unsafe fn config() -> &'static DevConfig { &*DEV_CONFIG.data_ptr() @@ -48,7 +48,7 @@ impl DevConfig { let dev_config_str = fs::read_to_string(dev_path).unwrap_or_else(|_| panic!("Could not read {}", dev_path)); return toml::from_str(&dev_config_str).expect("Could not parse dev config"); } - + DevConfig::default() } } diff --git a/src/common/events.rs b/src/common/events.rs index 568af71..f0aca32 100644 --- a/src/common/events.rs +++ b/src/common/events.rs @@ -1,9 +1,10 @@ +use std::convert::TryInto; +use std::time::{SystemTime, UNIX_EPOCH}; + use once_cell::sync::OnceCell; use serde::{Deserialize, Serialize}; use skyline::libc::c_void; use skyline::nn::{account, oe, time}; -use std::convert::TryInto; -use std::time::{SystemTime, UNIX_EPOCH}; use crate::common::release::CURRENT_VERSION; @@ -183,3 +184,25 @@ fn smash_version() -> String { .into_owned() } } + +pub fn events_loop() { + loop { + std::thread::sleep(std::time::Duration::from_secs(10)); + unsafe { + while let Some(event) = EVENT_QUEUE.pop() { + let host = "https://my-project-1511972643240-default-rtdb.firebaseio.com"; + let path = format!( + "/event/{}/device/{}/{}.json", + event.event_name, event.device_id, event.event_time + ); + + let url = format!("{host}{path}"); + minreq::post(url) + .with_json(&event) + .expect("Failed to send info to firebase") + .send() + .ok(); + } + } + } +} diff --git a/src/common/menu.rs b/src/common/menu.rs index 55a91cc..9ebbc3c 100644 --- a/src/common/menu.rs +++ b/src/common/menu.rs @@ -1,16 +1,21 @@ use std::fs; + +use lazy_static::lazy_static; +use parking_lot::Mutex; +use skyline::nn::hid::{GetNpadStyleSet, NpadGcState}; +use training_mod_consts::MenuJsonStruct; + +use training_mod_tui::AppPage; + use crate::common::*; use crate::events::{Event, EVENT_QUEUE}; use crate::logging::*; -use skyline::nn::hid::{GetNpadStyleSet, NpadGcState}; -use training_mod_consts::MenuJsonStruct; - // This is a special frame counter that will tick on draw() // We'll count how long the menu has been open -pub static mut FRAME_COUNTER : u32 = 0; -const MENU_INPUT_WAIT_FRAMES : u32 = 30; -const MENU_CLOSE_WAIT_FRAMES : u32 = 60; +pub static mut FRAME_COUNTER: u32 = 0; +const MENU_INPUT_WAIT_FRAMES: u32 = 30; +const MENU_CLOSE_WAIT_FRAMES: u32 = 60; pub static mut QUICK_MENU_ACTIVE: bool = false; pub unsafe fn menu_condition(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool { @@ -33,8 +38,12 @@ pub fn load_from_file() { } } else { warn!("Previous menu found but is invalid. Deleting..."); - fs::remove_file(menu_conf_path) - .unwrap_or_else(|_| panic!("{} has invalid schema but could not be deleted!", menu_conf_path)); + fs::remove_file(menu_conf_path).unwrap_or_else(|_| { + panic!( + "{} has invalid schema but could not be deleted!", + menu_conf_path + ) + }); } } else { info!("No previous menu file found."); @@ -48,7 +57,7 @@ pub unsafe fn set_menu_from_json(message: &str) { // Includes both MENU and DEFAULTS_MENU MENU = message_json.menu; DEFAULTS_MENU = message_json.defaults_menu; - std::fs::write( + fs::write( MENU_CONF_PATH, serde_json::to_string_pretty(&message_json).unwrap(), ) @@ -57,7 +66,7 @@ pub unsafe fn set_menu_from_json(message: &str) { skyline::error::show_error( 0x70, "Could not parse the menu response!\nPlease send a screenshot of the details page to the developers.\n\0", - &format!("{message:#?}\0") + &format!("{message:#?}\0"), ); }; } @@ -227,17 +236,15 @@ pub fn handle_get_npad_state(state: *mut NpadGcState, _controller_id: *const u32 } } -use lazy_static::lazy_static; -use parking_lot::Mutex; -use training_mod_tui::AppPage; - lazy_static! { - pub static ref QUICK_MENU_APP: Mutex> = - Mutex::new(training_mod_tui::App::new( - unsafe { ui_menu(MENU) }, - unsafe { (ui_menu(DEFAULTS_MENU), serde_json::to_string(&DEFAULTS_MENU).unwrap())} + pub static ref QUICK_MENU_APP: Mutex> = Mutex::new( + training_mod_tui::App::new(unsafe { ui_menu(MENU) }, unsafe { + ( + ui_menu(DEFAULTS_MENU), + serde_json::to_string(&DEFAULTS_MENU).unwrap(), ) - ); + }) + ); } pub unsafe fn quick_menu_loop() { @@ -257,7 +264,8 @@ pub unsafe fn quick_menu_loop() { potential_controller_ids.push(0x20); if potential_controller_ids .iter() - .all(|i| GetNpadStyleSet(i as *const _).flags == 0) { + .all(|i| GetNpadStyleSet(i as *const _).flags == 0) + { QUICK_MENU_ACTIVE = false; continue; } @@ -324,4 +332,4 @@ pub unsafe fn quick_menu_loop() { } } } -} \ No newline at end of file +} diff --git a/src/common/mod.rs b/src/common/mod.rs index 8ddeb69..42b62e2 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -1,19 +1,20 @@ -pub mod button_config; -pub mod consts; -pub mod events; -pub mod menu; -pub mod raygun_printer; -pub mod release; -pub mod dev_config; - -use crate::common::consts::*; use smash::app::{self, lua_bind::*}; use smash::hash40; use smash::lib::lua_const::*; use smash::lua2cpp::L2CFighterCommon; pub use crate::common::consts::MENU; -pub static mut DEFAULTS_MENU: TrainingModpackMenu = crate::common::consts::DEFAULTS_MENU; +use crate::common::consts::*; + +pub mod button_config; +pub mod consts; +pub mod dev_config; +pub mod events; +pub mod menu; +pub mod raygun_printer; +pub mod release; + +pub static mut DEFAULTS_MENU: TrainingModpackMenu = consts::DEFAULTS_MENU; pub static mut BASE_MENU: TrainingModpackMenu = unsafe { DEFAULTS_MENU }; pub static mut FIGHTER_MANAGER_ADDR: usize = 0; pub static mut ITEM_MANAGER_ADDR: usize = 0; @@ -99,6 +100,7 @@ pub fn is_in_hitstun(module_accessor: &mut app::BattleObjectModuleAccessor) -> b // TODO: Should this be *FIGHTER_STATUS_KIND_DAMAGE..*FIGHTER_STATUS_KIND_DAMAGE_AIR ? (*FIGHTER_STATUS_KIND_DAMAGE..*FIGHTER_STATUS_KIND_DAMAGE_FALL).contains(&status_kind) } + pub fn is_in_footstool(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool { let status_kind = unsafe { StatusModule::status_kind(module_accessor) }; diff --git a/src/common/release.rs b/src/common/release.rs index c35e765..b5cdc74 100644 --- a/src/common/release.rs +++ b/src/common/release.rs @@ -1,7 +1,9 @@ -use crate::logging::*; -use skyline_web::DialogOk; use std::fs; +use skyline_web::DialogOk; + +use crate::logging::*; + pub const CURRENT_VERSION: &str = env!("CARGO_PKG_VERSION"); const VERSION_FILE_PATH: &str = "sd:/TrainingModpack/version.txt"; diff --git a/src/hazard_manager/mod.rs b/src/hazard_manager/mod.rs index 21972b2..a5643ee 100644 --- a/src/hazard_manager/mod.rs +++ b/src/hazard_manager/mod.rs @@ -1,14 +1,19 @@ #![allow(dead_code)] #![allow(unused_assignments)] #![allow(unused_variables)] -use crate::common::consts::*; -use crate::logging::*; + use skyline::error::show_error; use skyline::hook; use skyline::hooks::A64InlineHook; use skyline::text_iter::{add_get_imm, adrp_get_imm, Instruction::*, TextIter}; use smash::app::smashball::is_training_mode; +use HazardState::*; +use HookState::*; + +use crate::common::consts::*; +use crate::logging::*; + enum HazardState { Begin, Adrp1, @@ -24,9 +29,6 @@ enum HookState { Ldrsw2, } -use HazardState::*; -use HookState::*; - fn get_hazard_flag_address() -> usize { let mut state = HazardState::Begin; let mut flag_pos = 0; @@ -98,7 +100,7 @@ fn mod_handle_hazards() { } } -unsafe fn validate_hazards_addrs() -> std::result::Result<(), ()> { +unsafe fn validate_hazards_addrs() -> Result<(), ()> { HAZARD_FLAG_ADDRESS = get_hazard_flag_address() as *mut u8; LOAD_ADDRESS = get_hazard_hook_address(); diff --git a/src/hitbox_visualizer/mod.rs b/src/hitbox_visualizer/mod.rs index 4150e6e..ca6e44f 100644 --- a/src/hitbox_visualizer/mod.rs +++ b/src/hitbox_visualizer/mod.rs @@ -1,9 +1,10 @@ -use crate::common::{consts::*, *}; -use crate::logging::*; use smash::app::{self, lua_bind::*, sv_animcmd, sv_system}; use smash::lib::{lua_const::*, L2CAgent, L2CValue}; use smash::phx::{Hash40, Vector3f}; +use crate::common::{consts::*, *}; +use crate::logging::*; + pub const ID_COLORS: &[Vector3f] = &[ // used to tint the hitbox effects -- make sure that at least one component // is equal to 1.0 @@ -107,44 +108,24 @@ pub unsafe fn generate_hitbox_effects( z: 0.0, }; - if false { - // is_fighter(module_accessor) { - EffectModule::req_on_joint( - module_accessor, - Hash40::new("sys_shield"), - Hash40::new_raw(bone), - &pos, - &zeros, - size * size_mult, - &zeros, - &zeros, - true, - *EFFECT_SUB_ATTRIBUTE_NO_JOINT_SCALE as u32 - | *EFFECT_SUB_ATTRIBUTE_FOLLOW as u32 - | *EFFECT_SUB_ATTRIBUTE_CONCLUDE_STATUS as u32, - 0, - 0, - ); - } else { - EffectModule::req_follow( - module_accessor, - Hash40::new("sys_shield"), - Hash40::new_raw(bone), - &pos, - &zeros, - size * size_mult, - true, - *EFFECT_SUB_ATTRIBUTE_NO_JOINT_SCALE as u32 - | *EFFECT_SUB_ATTRIBUTE_FOLLOW as u32 - | *EFFECT_SUB_ATTRIBUTE_CONCLUDE_STATUS as u32, - 0, - 0, - 0, - 0, - true, - true, - ); - } + EffectModule::req_follow( + module_accessor, + Hash40::new("sys_shield"), + Hash40::new_raw(bone), + &pos, + &zeros, + size * size_mult, + true, + *EFFECT_SUB_ATTRIBUTE_NO_JOINT_SCALE as u32 + | *EFFECT_SUB_ATTRIBUTE_FOLLOW as u32 + | *EFFECT_SUB_ATTRIBUTE_CONCLUDE_STATUS as u32, + 0, + 0, + 0, + 0, + true, + true, + ); // set to hitbox ID color EffectModule::set_rgb_partial_last(module_accessor, color.x, color.y, color.z); diff --git a/src/lib.rs b/src/lib.rs index e442dc1..dfbaa91 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,17 +4,28 @@ #![feature(once_cell)] #![feature(c_variadic)] #![allow( - clippy::borrow_interior_mutable_const, - clippy::declare_interior_mutable_const, - clippy::not_unsafe_ptr_arg_deref, - clippy::missing_safety_doc, - clippy::wrong_self_convention, - clippy::option_map_unit_fn, - clippy::fn_null_check, - // Look into why for this one - clippy::transmute_num_to_bytes +clippy::borrow_interior_mutable_const, +clippy::declare_interior_mutable_const, +clippy::not_unsafe_ptr_arg_deref, +clippy::missing_safety_doc, +clippy::wrong_self_convention, +clippy::option_map_unit_fn, +clippy::fn_null_check, +clippy::transmute_num_to_bytes )] +use std::fs; + +use skyline::libc::mkdir; +use skyline::nro::{self, NroInfo}; + +use crate::common::*; +use crate::common::events::events_loop; +use crate::events::{Event, EVENT_QUEUE}; +use crate::logging::*; +use crate::menu::quick_menu_loop; +use crate::training::ui::notifications::notification; + pub mod common; mod hazard_manager; mod hitbox_visualizer; @@ -22,17 +33,6 @@ mod training; mod logging; -use crate::common::*; -use crate::events::{Event, EVENT_QUEUE}; - -use skyline::libc::mkdir; -use skyline::nro::{self, NroInfo}; -use std::fs; - -use crate::logging::*; -use crate::menu::quick_menu_loop; -use crate::training::ui::notifications::notification; - fn nro_main(nro: &NroInfo<'_>) { if nro.module.isLoaded { return; @@ -105,25 +105,7 @@ pub fn main() { menu::load_from_file(); button_config::load_from_file(); - std::thread::spawn(|| loop { - std::thread::sleep(std::time::Duration::from_secs(10)); - unsafe { - while let Some(event) = EVENT_QUEUE.pop() { - let host = "https://my-project-1511972643240-default-rtdb.firebaseio.com"; - let path = format!( - "/event/{}/device/{}/{}.json", - event.event_name, event.device_id, event.event_time - ); - - let url = format!("{host}{path}"); - minreq::post(url) - .with_json(&event) - .expect("Failed to send info to firebase") - .send() - .ok(); - } - } - }); + std::thread::spawn(events_loop); std::thread::spawn(|| unsafe { quick_menu_loop() }); } diff --git a/src/training/air_dodge_direction.rs b/src/training/air_dodge_direction.rs index b77b5b8..029b0e4 100644 --- a/src/training/air_dodge_direction.rs +++ b/src/training/air_dodge_direction.rs @@ -1,9 +1,11 @@ +use core::f64::consts::PI; + +use smash::app::{self, lua_bind::*}; +use smash::lib::lua_const::*; + use crate::common::consts::*; use crate::common::*; use crate::training::directional_influence::should_reverse_angle; -use core::f64::consts::PI; -use smash::app::{self, lua_bind::*}; -use smash::lib::lua_const::*; static mut STICK_DIRECTION: Direction = Direction::empty(); @@ -39,7 +41,7 @@ unsafe fn get_angle(module_accessor: &mut app::BattleObjectModuleAccessor) -> Op module_accessor, *FIGHTER_KINETIC_ENERGY_ID_DAMAGE, ) - as *mut smash::app::KineticEnergy); + as *mut app::KineticEnergy); // If we're launched left, reverse stick X if launch_speed_x < 0.0 { PI - angle diff --git a/src/training/attack_angle.rs b/src/training/attack_angle.rs index e90c49f..15d3913 100644 --- a/src/training/attack_angle.rs +++ b/src/training/attack_angle.rs @@ -1,7 +1,8 @@ -use crate::common::consts::*; -use crate::common::*; use smash::app::{self}; +use crate::common::*; +use crate::common::consts::*; + static mut DIRECTION: AttackAngle = AttackAngle::UP; pub fn roll_direction() { diff --git a/src/training/buff.rs b/src/training/buff.rs index 1700bfd..fff40ea 100644 --- a/src/training/buff.rs +++ b/src/training/buff.rs @@ -1,9 +1,10 @@ +use smash::app::{self, lua_bind::*}; +use smash::lib::lua_const::*; + use crate::common::consts::*; use crate::is_operation_cpu; use crate::training::frame_counter; use crate::training::handle_add_limit; -use smash::app::{self, lua_bind::*}; -use smash::lib::lua_const::*; static mut BUFF_DELAY_COUNTER: usize = 0; diff --git a/src/training/character_specific/items.rs b/src/training/character_specific/items.rs index 45db648..77308c7 100644 --- a/src/training/character_specific/items.rs +++ b/src/training/character_specific/items.rs @@ -1,6 +1,3 @@ -use crate::common::consts::*; -use crate::common::*; -use crate::training::mash; use smash::app; use smash::app::lua_bind::*; use smash::app::ItemKind; @@ -8,6 +5,10 @@ use smash::app::{ArticleOperationTarget, BattleObjectModuleAccessor, Item}; use smash::cpp::l2c_value::LuaConst; use smash::lib::lua_const::*; +use crate::common::consts::*; +use crate::common::*; +use crate::training::mash; + pub struct CharItem { pub fighter_kind: LuaConst, pub item_kind: Option, @@ -354,7 +355,7 @@ unsafe fn apply_single_item(player_fighter_kind: i32, item: &CharItem) { let item_ptr = ItemManager::get_active_item(item_mgr, 0); ItemModule::have_item_instance( player_module_accessor, - item_ptr as *mut smash::app::Item, + item_ptr as *mut Item, 0, false, false, @@ -512,9 +513,9 @@ static GAFT_OFFSET: usize = 0x03d40a0; #[skyline::hook(offset = GAFT_OFFSET)] pub unsafe fn handle_generate_article_for_target( - article_module_accessor: *mut app::BattleObjectModuleAccessor, + article_module_accessor: *mut BattleObjectModuleAccessor, int_1: i32, - module_accessor: *mut app::BattleObjectModuleAccessor, // this is always 0x0 normally + module_accessor: *mut BattleObjectModuleAccessor, // this is always 0x0 normally bool_1: bool, int_2: i32, ) -> u64 { diff --git a/src/training/character_specific/steve.rs b/src/training/character_specific/steve.rs index 0f12506..b21e3b0 100644 --- a/src/training/character_specific/steve.rs +++ b/src/training/character_specific/steve.rs @@ -1,4 +1,4 @@ -use serde::{Serialize, Deserialize}; +use serde::{Deserialize, Serialize}; use smash::app::{self, lua_bind::*}; use smash::lib::lua_const::*; @@ -11,7 +11,8 @@ pub struct SteveState { pub mat_gold: i32, pub mat_redstone: i32, pub mat_diamond: i32, - pub sword_mat: char, // is actually FighterPickelMaterialKind, but char is same size and works + pub sword_mat: char, + // is actually FighterPickelMaterialKind, but char is same size and works pub sword_durability: f32, pub axe_mat: char, pub axe_durability: f32, diff --git a/src/training/charge.rs b/src/training/charge.rs index a7cf2b7..0343e25 100644 --- a/src/training/charge.rs +++ b/src/training/charge.rs @@ -1,5 +1,5 @@ -use serde::{Serialize, Deserialize}; -use smash::app::{self, lua_bind::*, ArticleOperationTarget, FighterFacial, FighterUtil}; +use serde::{Deserialize, Serialize}; +use smash::app::{self, ArticleOperationTarget, FighterFacial, FighterUtil, lua_bind::*}; use smash::lib::lua_const::*; use smash::phx::{Hash40, Vector3f}; diff --git a/src/training/clatter.rs b/src/training/clatter.rs index 9c18d3a..df173c9 100644 --- a/src/training/clatter.rs +++ b/src/training/clatter.rs @@ -1,11 +1,12 @@ -use crate::common::consts::*; -use crate::common::*; -use crate::training::mash; -use smash::app::lua_bind::{ControlModule, EffectModule}; use smash::app::BattleObjectModuleAccessor; +use smash::app::lua_bind::{ControlModule, EffectModule}; use smash::lib::lua_const::*; use smash::phx::{Hash40, Vector3f}; +use crate::common::*; +use crate::common::consts::*; +use crate::training::mash; + static mut COUNTER: u32 = 0; static mut WAS_IN_CLATTER_FLAG: bool = false; static mut CLATTER_STEP: f32 = 8.0; diff --git a/src/training/combo.rs b/src/training/combo.rs index 8c1e27d..8566c34 100644 --- a/src/training/combo.rs +++ b/src/training/combo.rs @@ -1,7 +1,8 @@ use skyline::nn::ui2d::ResColor; use training_mod_consts::OnOff; -use crate::common::consts::FighterId; + use crate::common::*; +use crate::common::consts::FighterId; use crate::training::*; pub static mut FRAME_ADVANTAGE: i32 = 0; @@ -59,7 +60,7 @@ fn update_frame_advantage(new_frame_adv: i32) { x if x < 0 => ResColor { r: 200, g: 8, b: 8, a: 255 }, x if x == 0 => ResColor { r: 0, g: 0, b: 0, a: 255 }, _ => ResColor { r: 31, g: 198, b: 0, a: 255 }, - } + }, ); } } @@ -82,10 +83,10 @@ pub unsafe fn is_enable_transition_term( if !PLAYER_ACTIONABLE && ((is - && actionable_statuses!() - .iter() - .any(|actionable_transition| *actionable_transition == transition_term)) - || (CancelModule::is_enable_cancel(module_accessor))) + && actionable_statuses!() + .iter() + .any(|actionable_transition| *actionable_transition == transition_term)) + || (CancelModule::is_enable_cancel(module_accessor))) { PLAYER_ACTIVE_FRAME = frame_counter::get_frame_count(FRAME_COUNTER_INDEX); PLAYER_ACTIONABLE = true; diff --git a/src/training/crouch.rs b/src/training/crouch.rs index 54f4cac..eb41092 100644 --- a/src/training/crouch.rs +++ b/src/training/crouch.rs @@ -1,8 +1,9 @@ -use crate::common::consts::OnOff; -use crate::common::*; -use smash::app::{lua_bind::StatusModule, BattleObjectModuleAccessor}; +use smash::app::{BattleObjectModuleAccessor, lua_bind::StatusModule}; use smash::lib::lua_const::*; +use crate::common::*; +use crate::common::consts::OnOff; + pub unsafe fn mod_get_stick_y(module_accessor: &mut BattleObjectModuleAccessor) -> Option { if !is_operation_cpu(module_accessor) { return None; @@ -11,13 +12,13 @@ pub unsafe fn mod_get_stick_y(module_accessor: &mut BattleObjectModuleAccessor) if MENU.crouch == OnOff::On && [ - *FIGHTER_STATUS_KIND_WAIT, - *FIGHTER_STATUS_KIND_SQUAT, - *FIGHTER_STATUS_KIND_SQUAT_B, - *FIGHTER_STATUS_KIND_SQUAT_F, - *FIGHTER_STATUS_KIND_SQUAT_RV, - *FIGHTER_STATUS_KIND_SQUAT_WAIT, - ] + *FIGHTER_STATUS_KIND_WAIT, + *FIGHTER_STATUS_KIND_SQUAT, + *FIGHTER_STATUS_KIND_SQUAT_B, + *FIGHTER_STATUS_KIND_SQUAT_F, + *FIGHTER_STATUS_KIND_SQUAT_RV, + *FIGHTER_STATUS_KIND_SQUAT_WAIT, + ] .contains(&fighter_status_kind) { Some(-1.0) diff --git a/src/training/directional_influence.rs b/src/training/directional_influence.rs index d5e4c24..d00dea7 100644 --- a/src/training/directional_influence.rs +++ b/src/training/directional_influence.rs @@ -1,11 +1,13 @@ -use crate::common::consts::*; -use crate::common::*; use core::f64::consts::PI; + use smash::app::{self, lua_bind::*, sv_system}; -use smash::lib::lua_const::*; use smash::lib::L2CValue; +use smash::lib::lua_const::*; use smash::lua2cpp::L2CFighterCommon; +use crate::common::*; +use crate::common::consts::*; + static mut DI_CASE: Direction = Direction::empty(); pub fn roll_di_case() { diff --git a/src/training/fast_fall.rs b/src/training/fast_fall.rs index 7382a0a..db35466 100644 --- a/src/training/fast_fall.rs +++ b/src/training/fast_fall.rs @@ -1,9 +1,10 @@ -use crate::common::*; -use crate::training::frame_counter; use smash::app::{self, lua_bind::*}; use smash::lib::lua_const::*; use smash::phx::{Hash40, Vector3f}; +use crate::common::*; +use crate::training::frame_counter; + static mut FRAME_COUNTER: usize = 0; // The current fastfall delay diff --git a/src/training/full_hop.rs b/src/training/full_hop.rs index 8ec1524..9006746 100644 --- a/src/training/full_hop.rs +++ b/src/training/full_hop.rs @@ -1,7 +1,8 @@ -use crate::common::*; use smash::app::{self, lua_bind::*}; use smash::lib::lua_const::*; +use crate::common::*; + // the current full hop status static mut FULL_HOP: bool = false; diff --git a/src/training/input_delay.rs b/src/training/input_delay.rs index cca49ff..2a4fcac 100644 --- a/src/training/input_delay.rs +++ b/src/training/input_delay.rs @@ -1,8 +1,10 @@ -use crate::common::MENU; +use std::collections::VecDeque; + use lazy_static::lazy_static; use parking_lot::Mutex; use skyline::nn::hid::{GetNpadStyleSet, NpadGcState}; -use std::collections::VecDeque; + +use crate::common::MENU; lazy_static! { static ref P1_DELAYED_NPAD_STATES: Mutex> = Mutex::new(VecDeque::new()); diff --git a/src/training/input_record.rs b/src/training/input_record.rs index c5e1a5e..16a8369 100644 --- a/src/training/input_record.rs +++ b/src/training/input_record.rs @@ -1,16 +1,19 @@ -use crate::training::input_delay::p1_controller_id; use lazy_static::lazy_static; use parking_lot::Mutex; use skyline::nn::hid::NpadHandheldState; use smash::app::{lua_bind::*, BattleObjectModuleAccessor}; use smash::lib::lua_const::*; +use InputRecordState::*; + +use crate::training::input_delay::p1_controller_id; + lazy_static! { static ref P1_NPAD_STATES: Mutex<[NpadHandheldState; 90]> = Mutex::new([{ NpadHandheldState::default() }; 90]); } -pub static mut INPUT_RECORD: InputRecordState = InputRecordState::None; +pub static mut INPUT_RECORD: InputRecordState = None; pub static mut INPUT_RECORD_FRAME: usize = 0; #[derive(PartialEq)] @@ -20,8 +23,6 @@ pub enum InputRecordState { Playback, } -use InputRecordState::*; - pub unsafe fn get_command_flag_cat(module_accessor: &mut BattleObjectModuleAccessor) { let entry_id_int = WorkModule::get_int(module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID); diff --git a/src/training/ledge.rs b/src/training/ledge.rs index 208153d..be59877 100644 --- a/src/training/ledge.rs +++ b/src/training/ledge.rs @@ -1,10 +1,11 @@ -use crate::common::consts::*; -use crate::common::*; -use crate::training::frame_counter; -use crate::training::mash; use smash::app::{self, lua_bind::*}; use smash::lib::lua_const::*; +use crate::common::*; +use crate::common::consts::*; +use crate::training::frame_counter; +use crate::training::mash; + const NOT_SET: u32 = 9001; static mut LEDGE_DELAY: u32 = NOT_SET; static mut LEDGE_DELAY_COUNTER: usize = 0; diff --git a/src/training/mash.rs b/src/training/mash.rs index 44f7dad..089a997 100644 --- a/src/training/mash.rs +++ b/src/training/mash.rs @@ -1,13 +1,14 @@ -use crate::common::consts::*; +use smash::app::{self, lua_bind::*}; +use smash::lib::lua_const::*; + use crate::common::*; +use crate::common::consts::*; use crate::training::{attack_angle, save_states}; use crate::training::character_specific; use crate::training::fast_fall; use crate::training::frame_counter; use crate::training::full_hop; use crate::training::shield; -use smash::app::{self, lua_bind::*}; -use smash::lib::lua_const::*; const DISTANCE_CLOSE_THRESHOLD: f32 = 16.0; const DISTANCE_MID_THRESHOLD: f32 = 37.0; diff --git a/src/training/mod.rs b/src/training/mod.rs index e64c486..f1bcf1d 100644 --- a/src/training/mod.rs +++ b/src/training/mod.rs @@ -1,7 +1,3 @@ -use crate::common::{is_training_mode, menu, FIGHTER_MANAGER_ADDR, ITEM_MANAGER_ADDR, STAGE_MANAGER_ADDR, dev_config}; -use crate::hitbox_visualizer; -use crate::logging::*; -use crate::training::character_specific::items; use skyline::hooks::{getRegionAddress, InlineCtx, Region}; use skyline::nn::hid::*; use skyline::nn::ro::LookupSymbol; @@ -10,6 +6,13 @@ use smash::lib::lua_const::*; use smash::params::*; use smash::phx::{Hash40, Vector3f}; +use crate::common::{ + dev_config, is_training_mode, menu, FIGHTER_MANAGER_ADDR, ITEM_MANAGER_ADDR, STAGE_MANAGER_ADDR, +}; +use crate::hitbox_visualizer; +use crate::logging::*; +use crate::training::character_specific::items; + pub mod buff; pub mod charge; pub mod clatter; @@ -29,11 +32,11 @@ mod attack_angle; mod character_specific; mod fast_fall; mod full_hop; -pub(crate) mod input_delay; +pub mod input_delay; mod input_record; mod mash; mod reset; -pub(crate) mod save_states; +pub mod save_states; mod shield_tilt; #[skyline::hook(replace = WorkModule::get_param_float)] @@ -321,7 +324,9 @@ fn params_main(params_info: &ParamsInfo<'_>) { } } -static CLOUD_ADD_LIMIT_OFFSET: usize = 0x008dc140; // this function is used to add limit to Cloud's limit gauge. Hooking it here so we can call it in buff.rs +static CLOUD_ADD_LIMIT_OFFSET: usize = 0x008dc140; + +// this function is used to add limit to Cloud's limit gauge. Hooking it here so we can call it in buff.rs #[skyline::hook(offset = CLOUD_ADD_LIMIT_OFFSET)] pub unsafe fn handle_add_limit( add_limit: f32, @@ -369,8 +374,9 @@ pub unsafe fn handle_check_doyle_summon_dispatch( // Set Stale Moves to On static STALE_OFFSET: usize = 0x013e88a4; + // One instruction after stale moves toggle register is set to 0 -#[skyline::hook(offset=STALE_OFFSET, inline)] +#[skyline::hook(offset = STALE_OFFSET, inline)] unsafe fn stale_handle(ctx: &mut InlineCtx) { let x22 = ctx.registers[22].x.as_mut(); let training_structure_address = (*x22 + 0xb60) as *mut u8; @@ -379,8 +385,9 @@ unsafe fn stale_handle(ctx: &mut InlineCtx) { // Set Stale Moves to On in the menu text static STALE_MENU_OFFSET: usize = 0x013e88a0; + // One instruction after menu text register is set to off -#[skyline::hook(offset=STALE_MENU_OFFSET, inline)] +#[skyline::hook(offset = STALE_MENU_OFFSET, inline)] unsafe fn stale_menu_handle(ctx: &mut InlineCtx) { // Set the text pointer to where "mel_training_on" is located let on_text_ptr = (getRegionAddress(Region::Text) as u64) + 0x42b215e; @@ -461,7 +468,9 @@ pub unsafe fn handle_effect( ) } -static CAN_FUTTOBI_BACK_OFFSET: usize = 0x0260f950; // can_futtobi_back, checks if stage allows for star KOs +static CAN_FUTTOBI_BACK_OFFSET: usize = 0x0260f950; + +// can_futtobi_back, checks if stage allows for star KOs #[skyline::hook(offset = CAN_FUTTOBI_BACK_OFFSET)] pub unsafe fn handle_star_ko(my_long_ptr: &mut u64) -> bool { let ori = original!()(my_long_ptr); @@ -512,7 +521,7 @@ pub fn training_mods() { .as_ptr(), ); - smash::params::add_hook(params_main).unwrap(); + add_hook(params_main).unwrap(); } skyline::install_hooks!( diff --git a/src/training/reset.rs b/src/training/reset.rs index e0a1c89..deae88c 100644 --- a/src/training/reset.rs +++ b/src/training/reset.rs @@ -1,3 +1,6 @@ +use smash::app::{self, lua_bind::*}; +use smash::lib::lua_const::*; + use crate::common::*; use crate::training::frame_counter; use crate::training::ledge; @@ -5,8 +8,6 @@ use crate::training::mash; use crate::training::sdi; use crate::training::shield_tilt; use crate::training::throw; -use smash::app::{self, lua_bind::*}; -use smash::lib::lua_const::*; pub fn check_reset(module_accessor: &mut app::BattleObjectModuleAccessor) { if !is_operation_cpu(module_accessor) { diff --git a/src/training/save_states.rs b/src/training/save_states.rs index b16c4e4..751c07b 100644 --- a/src/training/save_states.rs +++ b/src/training/save_states.rs @@ -1,7 +1,21 @@ +use std::collections::HashMap; + +use log::info; +use parking_lot::Mutex; +use serde::{Deserialize, Serialize}; +use smash::app::{self, Item, lua_bind::*}; +use smash::hash40; +use smash::lib::lua_const::*; +use smash::phx::{Hash40, Vector3f}; +use training_mod_consts::{CharacterItem, SaveDamage}; + +use SaveState::*; + +use crate::{is_ptrainer, ITEM_MANAGER_ADDR}; use crate::common::button_config; +use crate::common::consts::FighterId; use crate::common::consts::get_random_float; use crate::common::consts::get_random_int; -use crate::common::consts::FighterId; use crate::common::consts::OnOff; use crate::common::consts::SaveStateMirroring; use crate::common::is_dead; @@ -12,17 +26,6 @@ use crate::training::character_specific::steve; use crate::training::charge::{self, ChargeState}; use crate::training::items::apply_item; use crate::training::reset; -use crate::{is_ptrainer, ITEM_MANAGER_ADDR}; -use SaveState::*; -use parking_lot::Mutex; -use serde::{Serialize, Deserialize}; -use smash::app::{self, lua_bind::*, Item}; -use smash::hash40; -use smash::lib::lua_const::*; -use smash::phx::{Hash40, Vector3f}; -use std::collections::HashMap; -use log::info; -use training_mod_consts::{CharacterItem, SaveDamage}; use crate::training::ui::notifications; extern "C" { @@ -98,15 +101,15 @@ pub struct SaveStateSlots { cpu: [SavedState; NUM_SAVE_STATE_SLOTS], } -const NUM_SAVE_STATE_SLOTS : usize = 5; +const NUM_SAVE_STATE_SLOTS: usize = 5; // I actually had to do it this way, a simple load-from-file in main() caused crashes. lazy_static::lazy_static! { static ref SAVE_STATE_SLOTS : Mutex = Mutex::new(load_from_file()); } -static mut SAVE_STATE_SLOT : usize = 0; +static mut SAVE_STATE_SLOT: usize = 0; pub fn load_from_file() -> SaveStateSlots { - let defaults = SaveStateSlots{ + let defaults = SaveStateSlots { player: [default_save_state!(); NUM_SAVE_STATE_SLOTS], cpu: [default_save_state!(); NUM_SAVE_STATE_SLOTS], }; @@ -291,7 +294,7 @@ pub unsafe fn save_states(module_accessor: &mut app::BattleObjectModuleAccessor) *FIGHTER_KIND_EDGE, *FIGHTER_KIND_WIIFIT, ] - .contains(&fighter_kind); + .contains(&fighter_kind); if !is_operation_cpu(module_accessor) && button_config::combo_passes_exclusive(module_accessor, button_config::ButtonCombo::PrevSaveStateSlot) { diff --git a/src/training/sdi.rs b/src/training/sdi.rs index b59e723..af0c5fe 100644 --- a/src/training/sdi.rs +++ b/src/training/sdi.rs @@ -1,10 +1,12 @@ -use crate::common::consts::*; -use crate::common::*; -use crate::training::directional_influence; use core::f64::consts::PI; + use smash::app::{self, lua_bind::*}; use smash::Vector2f; +use crate::common::*; +use crate::common::consts::*; +use crate::training::directional_influence; + static mut COUNTER: u32 = 0; static mut DIRECTION: Direction = Direction::NEUTRAL; diff --git a/src/training/shield.rs b/src/training/shield.rs index 20239c2..f48b90e 100644 --- a/src/training/shield.rs +++ b/src/training/shield.rs @@ -1,15 +1,16 @@ -use crate::common::consts::*; -use crate::common::*; -use crate::training::{frame_counter, save_states}; -use crate::training::mash; use smash::app; use smash::app::lua_bind::*; use smash::app::sv_system; use smash::hash40; -use smash::lib::lua_const::*; use smash::lib::L2CValue; +use smash::lib::lua_const::*; use smash::lua2cpp::L2CFighterCommon; +use crate::common::*; +use crate::common::consts::*; +use crate::training::{frame_counter, save_states}; +use crate::training::mash; + // How many hits to hold shield until picking an Out Of Shield option static mut MULTI_HIT_OFFSET: u32 = 0; diff --git a/src/training/shield_tilt.rs b/src/training/shield_tilt.rs index cb32099..6920bac 100644 --- a/src/training/shield_tilt.rs +++ b/src/training/shield_tilt.rs @@ -1,7 +1,8 @@ -use crate::common::consts::*; -use crate::common::*; use smash::app::{self}; +use crate::common::*; +use crate::common::consts::*; + static mut STICK_DIRECTION: Direction = Direction::OUT; pub fn roll_direction() { diff --git a/src/training/tech.rs b/src/training/tech.rs index fc1d4bb..3013788 100644 --- a/src/training/tech.rs +++ b/src/training/tech.rs @@ -1,12 +1,13 @@ -use crate::common::consts::*; -use crate::common::*; -use crate::training::{frame_counter, mash}; -use smash::app::{self, lua_bind::*, sv_system, BattleObjectModuleAccessor}; +use smash::app::{lua_bind::*, sv_system, BattleObjectModuleAccessor}; use smash::hash40; use smash::lib::lua_const::*; use smash::lib::L2CValue; use smash::lua2cpp::L2CFighterBase; +use crate::common::consts::*; +use crate::common::*; +use crate::training::{frame_counter, mash}; + static mut TECH_ROLL_DIRECTION: Direction = Direction::empty(); static mut MISS_TECH_ROLL_DIRECTION: Direction = Direction::empty(); static mut FRAME_COUNTER: usize = 0; @@ -66,7 +67,7 @@ unsafe fn mod_handle_change_status( } unsafe fn handle_grnd_tech( - module_accessor: &mut app::BattleObjectModuleAccessor, + module_accessor: &mut BattleObjectModuleAccessor, status_kind: &mut L2CValue, unk: &mut L2CValue, status_kind_int: i32, @@ -122,7 +123,7 @@ unsafe fn handle_grnd_tech( } unsafe fn handle_wall_tech( - module_accessor: &mut app::BattleObjectModuleAccessor, + module_accessor: &mut BattleObjectModuleAccessor, status_kind: &mut L2CValue, unk: &mut L2CValue, status_kind_int: i32, @@ -164,7 +165,7 @@ unsafe fn handle_wall_tech( } unsafe fn handle_ceil_tech( - module_accessor: &mut app::BattleObjectModuleAccessor, + module_accessor: &mut BattleObjectModuleAccessor, status_kind: &mut L2CValue, unk: &mut L2CValue, status_kind_int: i32, @@ -194,7 +195,7 @@ unsafe fn handle_ceil_tech( true } -pub unsafe fn get_command_flag_cat(module_accessor: &mut app::BattleObjectModuleAccessor) { +pub unsafe fn get_command_flag_cat(module_accessor: &mut BattleObjectModuleAccessor) { if !is_operation_cpu(module_accessor) || MENU.tech_state == TechFlags::empty() { return; } @@ -263,7 +264,7 @@ pub unsafe fn get_command_flag_cat(module_accessor: &mut app::BattleObjectModule } pub unsafe fn change_motion( - module_accessor: &mut app::BattleObjectModuleAccessor, + module_accessor: &mut BattleObjectModuleAccessor, motion_kind: u64, ) -> Option { if !is_operation_cpu(module_accessor) { @@ -297,9 +298,7 @@ pub unsafe fn change_motion( None } -unsafe fn get_snake_laydown_lockout_time( - module_accessor: &mut app::BattleObjectModuleAccessor, -) -> u32 { +unsafe fn get_snake_laydown_lockout_time(module_accessor: &mut BattleObjectModuleAccessor) -> u32 { let base_lockout_time: f32 = WorkModule::get_param_float( module_accessor, hash40("common"), diff --git a/src/training/throw.rs b/src/training/throw.rs index 2c3a782..6f5caff 100644 --- a/src/training/throw.rs +++ b/src/training/throw.rs @@ -1,10 +1,11 @@ -use crate::common::consts::*; -use crate::common::*; -use crate::training::frame_counter; -use crate::training::mash; use smash::app::{self, lua_bind::*}; use smash::lib::lua_const::*; +use crate::common::*; +use crate::common::consts::*; +use crate::training::frame_counter; +use crate::training::mash; + const NOT_SET: u32 = 9001; static mut THROW_DELAY: u32 = NOT_SET; static mut THROW_DELAY_COUNTER: usize = 0; diff --git a/src/training/ui/damage.rs b/src/training/ui/damage.rs index e20e60e..cccb94d 100644 --- a/src/training/ui/damage.rs +++ b/src/training/ui/damage.rs @@ -1,8 +1,9 @@ -use crate::common::{get_player_dmg_digits, is_ready_go, is_training_mode}; -use crate::consts::FighterId; use skyline::nn::ui2d::*; use smash::ui2d::SmashPane; +use crate::common::{get_player_dmg_digits, is_ready_go, is_training_mode}; +use crate::consts::FighterId; + pub unsafe fn iterate_anim_list( anim_transform_node: &mut AnimTransformNode, layout_name: Option<&str>, diff --git a/src/training/ui/display.rs b/src/training/ui/display.rs index c854587..8c8d706 100644 --- a/src/training/ui/display.rs +++ b/src/training/ui/display.rs @@ -1,7 +1,8 @@ -use crate::training::ui; use skyline::nn::ui2d::*; use smash::ui2d::{SmashPane, SmashTextBox}; +use crate::training::ui; + macro_rules! display_parent_fmt { ($x:ident) => { format!("TrModDisp{}", $x).as_str() diff --git a/src/training/ui/menu.rs b/src/training/ui/menu.rs index 988bbbb..ea359f3 100644 --- a/src/training/ui/menu.rs +++ b/src/training/ui/menu.rs @@ -1,9 +1,11 @@ -use crate::{common, common::menu::QUICK_MENU_ACTIVE}; use skyline::nn::ui2d::*; use smash::ui2d::{SmashPane, SmashTextBox}; + use training_mod_tui::{App, AppPage}; use training_mod_tui::gauge::GaugeState; +use crate::{common, common::menu::QUICK_MENU_ACTIVE}; + pub static NUM_MENU_TEXT_OPTIONS: usize = 33; pub static _NUM_MENU_TABS: usize = 3; @@ -319,35 +321,35 @@ pub unsafe fn draw(root_pane: &mut Pane) { }); [(0xE0E2, "SaveDefaults"), (0xE0E4, "ResetCurrentDefaults"), (0xE0E5, "ResetAllDefaults")].iter() .for_each(|(key, name)| { - let key_help_pane = root_pane.find_pane_by_name_recursive(name) - .unwrap(); + let key_help_pane = root_pane.find_pane_by_name_recursive(name) + .unwrap(); - let icon_pane = key_help_pane.find_pane_by_name_recursive("set_txt_icon") - .unwrap().as_textbox(); - icon_pane.set_text_string(""); - let it = icon_pane.text_buf as *mut u16; - icon_pane.text_len = 1; - *it = *key as u16; - *(it.add(1)) = 0x0; + let icon_pane = key_help_pane.find_pane_by_name_recursive("set_txt_icon") + .unwrap().as_textbox(); + icon_pane.set_text_string(""); + let it = icon_pane.text_buf as *mut u16; + icon_pane.text_len = 1; + *it = *key as u16; + *(it.add(1)) = 0x0; - // PascalCase to Title Case - let title_case = name - .chars() - .fold(vec![], |mut acc, ch| { - if ch.is_uppercase() { - acc.push(String::new()); - } - if let Some(last) = acc.last_mut() { - last.push(ch); - } - acc - }) - .into_iter() - .collect::>() - .join(" "); - key_help_pane.find_pane_by_name_recursive("set_txt_help") - .unwrap().as_textbox().set_text_string(title_case.as_str()); - }); + // PascalCase to Title Case + let title_case = name + .chars() + .fold(vec![], |mut acc, ch| { + if ch.is_uppercase() { + acc.push(String::new()); + } + if let Some(last) = acc.last_mut() { + last.push(ch); + } + acc + }) + .into_iter() + .collect::>() + .join(" "); + key_help_pane.find_pane_by_name_recursive("set_txt_help") + .unwrap().as_textbox().set_text_string(title_case.as_str()); + }); match app.page { AppPage::SUBMENU => render_submenu_page(app, root_pane), diff --git a/src/training/ui/mod.rs b/src/training/ui/mod.rs index 051231f..6049638 100644 --- a/src/training/ui/mod.rs +++ b/src/training/ui/mod.rs @@ -1,7 +1,8 @@ -use crate::common::{is_ready_go, is_training_mode}; use sarc::SarcFile; use skyline::nn::ui2d::*; -use training_mod_consts::{OnOff, MENU}; +use training_mod_consts::{MENU, OnOff}; + +use crate::common::{is_ready_go, is_training_mode}; mod damage; mod display; @@ -33,7 +34,7 @@ pub unsafe fn handle_draw(layout: *mut Layout, draw_info: u64, cmd_buffer: u64) // We'll keep some sane max size here; we shouldn't reach above 600KiB is the idea, // but we can try higher if we need to. #[cfg(feature = "layout_arc_from_file")] -static mut LAYOUT_ARC : &mut [u8; 600000] = &mut [0u8; 600000]; +static mut LAYOUT_ARC: &mut [u8; 600000] = &mut [0u8; 600000]; /// We are editing the info_training/layout.arc and replacing the original file with our /// modified version from `sd://TrainingModpack/layout.arc` or, in the case of Ryujinx for the cool @@ -82,7 +83,7 @@ unsafe fn handle_layout_arc_malloc( let decompressed_size = *ctx.registers[1].x.as_ref() as usize; let layout_arc = SarcFile::read( - std::slice::from_raw_parts(decompressed_file,decompressed_size) + std::slice::from_raw_parts(decompressed_file, decompressed_size) ).unwrap(); let training_layout = layout_arc.files.iter().find(|f| { f.name.is_some() && f.name.as_ref().unwrap() == &String::from("blyt/info_training.bflyt") @@ -92,7 +93,7 @@ unsafe fn handle_layout_arc_malloc( } let inject_arc; - let inject_arc_size : u64; + let inject_arc_size: u64; #[cfg(feature = "layout_arc_from_file")] { let inject_arc_from_file = std::fs::read("sd:/TrainingModpack/layout.arc").unwrap(); diff --git a/src/training/ui/notifications.rs b/src/training/ui/notifications.rs index cce4374..b1d0b5a 100644 --- a/src/training/ui/notifications.rs +++ b/src/training/ui/notifications.rs @@ -7,7 +7,7 @@ pub struct Notification { pub header: String, pub message: String, length: u32, - pub color: ResColor + pub color: ResColor, } impl Notification { @@ -16,7 +16,7 @@ impl Notification { header, message, length, - color + color, } } @@ -37,7 +37,7 @@ pub fn notification(header: String, message: String, len: u32) { r: 0, g: 0, b: 0, - a: 255 + a: 255, })); } }