mirror of
https://github.com/jugeeya/UltimateTrainingModpack.git
synced 2024-11-24 02:44:17 +00:00
Make it more intuitive for devs to add new menu items (#709)
* Rework how we set up the menu so we only have to write the fn once * Clippy warnings
This commit is contained in:
parent
858d35142e
commit
cb6ca02f3a
5 changed files with 595 additions and 742 deletions
|
@ -139,13 +139,13 @@ fn get_release(beta: bool) -> Result<Release> {
|
|||
break;
|
||||
}
|
||||
}
|
||||
if beta && beta_release.is_some() {
|
||||
Ok(beta_release.unwrap())
|
||||
} else if !beta && stable_release.is_some() {
|
||||
Ok(stable_release.unwrap())
|
||||
if beta {
|
||||
beta_release.ok_or(anyhow!(
|
||||
"The specified beta release was not found in the GitHub JSON response!"
|
||||
))
|
||||
} else {
|
||||
Err(anyhow!(
|
||||
"The specified release was not found in the GitHub JSON response!"
|
||||
stable_release.ok_or(anyhow!(
|
||||
"The specified stable release was not found in the GitHub JSON response!"
|
||||
))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -580,8 +580,8 @@ pub unsafe fn save_states(module_accessor: &mut app::BattleObjectModuleAccessor)
|
|||
SaveDamage::RANDOM => {
|
||||
// Gen random value
|
||||
let pct: f32 = get_random_float(
|
||||
read(&MENU).save_damage_limits_player.0 as f32,
|
||||
read(&MENU).save_damage_limits_player.1 as f32,
|
||||
read(&MENU).save_damage_limits_player.LOWER as f32,
|
||||
read(&MENU).save_damage_limits_player.UPPER as f32,
|
||||
);
|
||||
set_damage(module_accessor, pct);
|
||||
}
|
||||
|
@ -599,8 +599,8 @@ pub unsafe fn save_states(module_accessor: &mut app::BattleObjectModuleAccessor)
|
|||
SaveDamage::RANDOM => {
|
||||
// Gen random value
|
||||
let pct: f32 = get_random_float(
|
||||
read(&MENU).save_damage_limits_cpu.0 as f32,
|
||||
read(&MENU).save_damage_limits_cpu.1 as f32,
|
||||
read(&MENU).save_damage_limits_cpu.UPPER as f32,
|
||||
read(&MENU).save_damage_limits_cpu.LOWER as f32,
|
||||
);
|
||||
set_damage(module_accessor, pct);
|
||||
}
|
||||
|
|
|
@ -163,6 +163,7 @@ unsafe fn handle_layout_arc_malloc(ctx: &mut skyline::hooks::InlineCtx) {
|
|||
.iter()
|
||||
.enumerate()
|
||||
.for_each(|(idx, byte)| LAYOUT_ARC[idx] = *byte);
|
||||
#[allow(static_mut_refs)]
|
||||
inject_arc = LAYOUT_ARC.as_ptr();
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,67 +1,97 @@
|
|||
use crate::TOGGLE_MAX;
|
||||
use byteflags::*;
|
||||
use core::f64::consts::PI;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[cfg(feature = "smash")]
|
||||
use smash::lib::lua_const::*;
|
||||
use training_mod_tui::{
|
||||
StatefulSlider, StatefulTable, SubMenu, SubMenuType, Toggle, NX_SUBMENU_COLUMNS,
|
||||
NX_SUBMENU_ROWS,
|
||||
};
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! impl_toggletrait {
|
||||
(
|
||||
$e:ty,
|
||||
$title:literal,
|
||||
$id:literal,
|
||||
$help_text:literal,
|
||||
$single:literal,
|
||||
$max:expr,
|
||||
) => {
|
||||
paste! {
|
||||
fn [<to_submenu_ $id>]<'a>() -> SubMenu<'a> {
|
||||
let submenu_type = if $single { SubMenuType::ToggleSingle } else { SubMenuType::ToggleMultiple };
|
||||
let value = 0;
|
||||
let max: u8 = $max;
|
||||
let toggles_vec: Vec<Toggle> = <$e>::ALL_NAMES
|
||||
.iter()
|
||||
.map(|title| Toggle { title, value, max })
|
||||
.collect();
|
||||
SubMenu {
|
||||
title: $title,
|
||||
id: $id,
|
||||
help_text: $help_text,
|
||||
submenu_type: submenu_type,
|
||||
toggles: StatefulTable::with_items(NX_SUBMENU_ROWS, NX_SUBMENU_COLUMNS, toggles_vec),
|
||||
slider: None
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
pub trait SubMenuTrait {
|
||||
fn to_submenu<'a>(
|
||||
title: &'a str,
|
||||
id: &'a str,
|
||||
help_text: &'a str,
|
||||
submenu_type: SubMenuType,
|
||||
) -> SubMenu<'a>;
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! impl_slidertrait {
|
||||
(
|
||||
$e:ty,
|
||||
$title:literal,
|
||||
$id:literal,
|
||||
$help_text:literal,
|
||||
) => {
|
||||
paste! {
|
||||
fn [<to_submenu_ $id>]<'a>() -> SubMenu<'a> {
|
||||
let slider = StatefulSlider {
|
||||
lower: 0,
|
||||
upper: 150,
|
||||
..StatefulSlider::new()
|
||||
};
|
||||
SubMenu {
|
||||
title: $title,
|
||||
id: $id,
|
||||
help_text: $help_text,
|
||||
submenu_type: SubMenuType::Slider,
|
||||
toggles: StatefulTable::with_items(NX_SUBMENU_ROWS, NX_SUBMENU_COLUMNS, Vec::new()),
|
||||
slider: Some(slider)
|
||||
macro_rules! impl_submenutrait {
|
||||
($e:ty) => {
|
||||
impl SubMenuTrait for $e {
|
||||
fn to_submenu<'a>(
|
||||
title: &'a str,
|
||||
id: &'a str,
|
||||
help_text: &'a str,
|
||||
submenu_type: SubMenuType,
|
||||
) -> SubMenu<'a> {
|
||||
match submenu_type {
|
||||
SubMenuType::ToggleSingle => {
|
||||
let value = 0;
|
||||
let max = 1;
|
||||
let toggles_vec: Vec<Toggle> = Self::ALL_NAMES
|
||||
.iter()
|
||||
.map(|title| Toggle { title, value, max })
|
||||
.collect();
|
||||
SubMenu {
|
||||
title: title,
|
||||
id: id,
|
||||
help_text: help_text,
|
||||
submenu_type: submenu_type,
|
||||
toggles: StatefulTable::with_items(
|
||||
NX_SUBMENU_ROWS,
|
||||
NX_SUBMENU_COLUMNS,
|
||||
toggles_vec,
|
||||
),
|
||||
slider: None,
|
||||
}
|
||||
}
|
||||
SubMenuType::ToggleMultiple => {
|
||||
let value = 0;
|
||||
let max = TOGGLE_MAX;
|
||||
let toggles_vec: Vec<Toggle> = Self::ALL_NAMES
|
||||
.iter()
|
||||
.map(|title| Toggle { title, value, max })
|
||||
.collect();
|
||||
SubMenu {
|
||||
title: title,
|
||||
id: id,
|
||||
help_text: help_text,
|
||||
submenu_type: submenu_type,
|
||||
toggles: StatefulTable::with_items(
|
||||
NX_SUBMENU_ROWS,
|
||||
NX_SUBMENU_COLUMNS,
|
||||
toggles_vec,
|
||||
),
|
||||
slider: None,
|
||||
}
|
||||
}
|
||||
SubMenuType::Slider => {
|
||||
let slider = StatefulSlider {
|
||||
lower: 0,
|
||||
upper: 150,
|
||||
..StatefulSlider::new()
|
||||
};
|
||||
SubMenu {
|
||||
title: title,
|
||||
id: id,
|
||||
help_text: help_text,
|
||||
submenu_type: submenu_type,
|
||||
toggles: StatefulTable::with_items(
|
||||
NX_SUBMENU_ROWS,
|
||||
NX_SUBMENU_COLUMNS,
|
||||
Vec::new(),
|
||||
),
|
||||
slider: Some(slider),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
pub fn get_random_int(_max: i32) -> i32 {
|
||||
|
@ -113,6 +143,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(Direction);
|
||||
|
||||
impl Direction {
|
||||
pub fn into_angle(self) -> Option<f64> {
|
||||
let index = self.into_index();
|
||||
|
@ -161,6 +193,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(LedgeOption);
|
||||
|
||||
impl LedgeOption {
|
||||
pub fn into_status(self) -> Option<i32> {
|
||||
#[cfg(feature = "smash")]
|
||||
|
@ -228,6 +262,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(TechFlags);
|
||||
|
||||
// Missed Tech Options
|
||||
byteflags! {
|
||||
pub struct MissTechFlags {
|
||||
|
@ -238,6 +274,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(MissTechFlags);
|
||||
|
||||
byteflags! {
|
||||
pub struct Shield {
|
||||
pub NONE = "None",
|
||||
|
@ -247,6 +285,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(Shield);
|
||||
|
||||
byteflags! {
|
||||
pub struct SaveStateMirroring {
|
||||
pub NONE = "None",
|
||||
|
@ -255,6 +295,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(SaveStateMirroring);
|
||||
|
||||
byteflags! {
|
||||
pub struct OnOff {
|
||||
pub ON = "On",
|
||||
|
@ -262,6 +304,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(OnOff);
|
||||
|
||||
impl OnOff {
|
||||
pub fn from_val(val: u32) -> Option<Self> {
|
||||
match val {
|
||||
|
@ -315,6 +359,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(Action);
|
||||
|
||||
impl Action {
|
||||
pub fn into_attack_air_kind(self) -> Option<i32> {
|
||||
#[cfg(feature = "smash")]
|
||||
|
@ -363,6 +409,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(AttackAngle);
|
||||
|
||||
byteflags! {
|
||||
pub struct Delay {
|
||||
pub D0 = "0",
|
||||
|
@ -399,6 +447,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(Delay);
|
||||
|
||||
impl Delay {
|
||||
pub fn into_delay(&self) -> u32 {
|
||||
if *self == Delay::empty() {
|
||||
|
@ -477,6 +527,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(MedDelay);
|
||||
|
||||
impl MedDelay {
|
||||
pub fn into_meddelay(&self) -> u32 {
|
||||
if *self == MedDelay::empty() {
|
||||
|
@ -555,6 +607,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(LongDelay);
|
||||
|
||||
impl LongDelay {
|
||||
pub fn into_longdelay(&self) -> u32 {
|
||||
if *self == LongDelay::empty() {
|
||||
|
@ -621,6 +675,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(BuffOption);
|
||||
|
||||
impl BuffOption {
|
||||
pub fn into_int(self) -> Option<i32> {
|
||||
#[cfg(feature = "smash")]
|
||||
|
@ -690,6 +746,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(ThrowOption);
|
||||
|
||||
impl ThrowOption {
|
||||
pub fn into_cmd(self) -> Option<i32> {
|
||||
#[cfg(feature = "smash")]
|
||||
|
@ -717,6 +775,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(BoolFlag);
|
||||
|
||||
impl BoolFlag {
|
||||
pub fn into_bool(self) -> bool {
|
||||
matches!(self, BoolFlag::TRUE)
|
||||
|
@ -732,6 +792,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(SdiFrequency);
|
||||
|
||||
impl SdiFrequency {
|
||||
pub fn into_u32(self) -> u32 {
|
||||
match self {
|
||||
|
@ -753,6 +815,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(ClatterFrequency);
|
||||
|
||||
impl ClatterFrequency {
|
||||
pub fn into_u32(self) -> u32 {
|
||||
match self {
|
||||
|
@ -787,6 +851,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(CharacterItem);
|
||||
|
||||
impl CharacterItem {
|
||||
pub fn as_idx(&self) -> usize {
|
||||
match *self {
|
||||
|
@ -834,6 +900,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(MashTrigger);
|
||||
|
||||
impl MashTrigger {
|
||||
pub const fn default() -> MashTrigger {
|
||||
// Hit, block, clatter
|
||||
|
@ -847,12 +915,21 @@ impl MashTrigger {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Serialize, Deserialize, Debug)]
|
||||
pub struct DamagePercent(pub u32, pub u32);
|
||||
byteflags! {
|
||||
pub struct DamagePercent {
|
||||
pub LOWER = "Lower",
|
||||
pub UPPER = "Upper",
|
||||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(DamagePercent);
|
||||
|
||||
impl DamagePercent {
|
||||
pub const fn default() -> DamagePercent {
|
||||
DamagePercent(0, 150)
|
||||
DamagePercent {
|
||||
LOWER: 0,
|
||||
UPPER: 150,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -864,6 +941,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(SaveDamage);
|
||||
|
||||
byteflags! {
|
||||
pub struct SaveStateSlot
|
||||
{
|
||||
|
@ -875,6 +954,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(SaveStateSlot);
|
||||
|
||||
impl SaveStateSlot {
|
||||
pub fn into_idx(&self) -> Option<usize> {
|
||||
match *self {
|
||||
|
@ -898,6 +979,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(RecordSlot);
|
||||
|
||||
impl RecordSlot {
|
||||
pub fn into_idx(&self) -> Option<usize> {
|
||||
match *self {
|
||||
|
@ -921,6 +1004,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(PlaybackSlot);
|
||||
|
||||
impl PlaybackSlot {
|
||||
pub fn into_idx(&self) -> Option<usize> {
|
||||
match *self {
|
||||
|
@ -943,6 +1028,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(HitstunPlayback);
|
||||
|
||||
byteflags! {
|
||||
pub struct RecordTrigger {
|
||||
pub COMMAND = "Button Combination",
|
||||
|
@ -950,6 +1037,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(RecordTrigger);
|
||||
|
||||
byteflags! {
|
||||
pub struct RecordingDuration {
|
||||
pub F60 = "60",
|
||||
|
@ -974,6 +1063,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(RecordingDuration);
|
||||
|
||||
impl RecordingDuration {
|
||||
pub fn into_frames(&self) -> usize {
|
||||
match *self {
|
||||
|
@ -1022,6 +1113,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(ButtonConfig);
|
||||
|
||||
byteflags! {
|
||||
pub struct UpdatePolicy {
|
||||
pub STABLE = "Stable",
|
||||
|
@ -1030,6 +1123,8 @@ byteflags! {
|
|||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(UpdatePolicy);
|
||||
|
||||
impl UpdatePolicy {
|
||||
pub const fn default() -> UpdatePolicy {
|
||||
UpdatePolicy::STABLE
|
||||
|
@ -1044,3 +1139,5 @@ byteflags! {
|
|||
pub STATUS = "Status Only",
|
||||
}
|
||||
}
|
||||
|
||||
impl_submenutrait!(InputDisplay);
|
||||
|
|
Loading…
Reference in a new issue