#![allow(non_camel_case_types)]
#![allow(clippy::upper_case_acronyms)]
use anyhow::{anyhow, Result};
use strum_macros::{Display, EnumString, FromRepr, IntoStaticStr};
use super::ActionState as AS;
#[derive(
Debug,
Clone,
Copy,
Eq,
PartialEq,
PartialOrd,
Ord,
FromRepr,
Default,
EnumString,
IntoStaticStr,
Display,
Hash,
)]
#[repr(u8)]
pub enum Port {
#[default]
P1,
P2,
P3,
P4,
}
impl TryFrom<i8> for Port {
fn try_from(val: i8) -> Result<Self> {
match val {
0 => Ok(Port::P1),
1 => Ok(Port::P2),
2 => Ok(Port::P3),
3 => Ok(Port::P4),
_ => Err(anyhow!(
"Unable to convert i8 {val} into Port, expected value 0-3"
)),
}
}
type Error = anyhow::Error;
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, EnumString, Display, FromRepr, IntoStaticStr,
)]
#[repr(i8)]
pub enum Orientation {
LEFT = -1,
DOWN = 0,
RIGHT = 1,
}
impl TryFrom<f32> for Orientation {
type Error = anyhow::Error;
fn try_from(value: f32) -> std::prelude::v1::Result<Self, Self::Error> {
if value == -1.0 {
Ok(Self::LEFT)
} else if value == 0.0 {
Ok(Self::DOWN)
} else if value == 1.0 {
Ok(Self::RIGHT)
} else {
Err(anyhow!(
"Cannot construct orientation from value {value}. Expected -1.0, 0.0, or 1.0"
))
}
}
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, EnumString, Display, FromRepr, IntoStaticStr,
)]
#[repr(u8)]
pub enum LCancelState {
NOT_APPLICABLE = 0,
SUCCESS = 1,
FAILURE = 2,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, EnumString, Display, FromRepr, IntoStaticStr,
)]
#[repr(u8)]
pub enum Hurtbox {
VULNERABLE,
INVULNERABLE,
INTANGIBLE,
}
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u64)]
pub enum Flags {
None = 0,
BIT_1_1 = 1 << 0,
ABSORB_BUBBLE = 1 << 1,
BIT_1_3 = 1 << 2,
REFLECT_NO_STEAL = 1 << 3,
REFLECT_BUBBLE = 1 << 4,
BIT_1_6 = 1 << 5,
BIT_1_7 = 1 << 6,
ALLOW_INTERRUPT = 1 << 7,
SHIELDING = 1 << 8,
BIT_2_2 = 1 << 9,
SUBACTION_INVULN = 1 << 10,
FASTFALL = 1 << 11,
DEFENDER_HITLAG = 1 << 12,
HITLAG = 1 << 13,
BIT_2_7 = 1 << 14,
BIT_2_8 = 1 << 15,
BIT_3_1 = 1 << 16,
BIT_3_2 = 1 << 17,
GRAB_HOLD = 1 << 18,
BIT_3_4 = 1 << 19,
BIT_3_5 = 1 << 20,
BIT_3_6 = 1 << 21,
BIT_3_7 = 1 << 22,
GUARD_BUBBLE = 1 << 23,
BIT_4_1 = 1 << 24,
HITSTUN = 1 << 25,
HITBOX_TOUCHING_SHIELD = 1 << 26,
BIT_4_4 = 1 << 27,
BIT_4_5 = 1 << 28,
POWERSHIELD_BUBBLE = 1 << 29,
BIT_4_7 = 1 << 30,
BIT_4_8 = 1 << 31,
BIT_5_1 = 1 << 32,
CLOAKING_DEVICE = 1 << 33,
BIT_5_3 = 1 << 34,
FOLLOWER = 1 << 35,
INACTIVE = 1 << 36,
BIT_5_6 = 1 << 37,
DEAD = 1 << 38,
OFFSCREEN = 1 << 39,
Raw(u64),
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, EnumString, Display, FromRepr, IntoStaticStr,
)]
pub enum TechType {
TECH_IN_PLACE,
TECH_LEFT,
TECH_RIGHT,
GET_UP_ATTACK,
MISSED_TECH,
WALL_TECH,
MISSED_WALL_TECH,
WALL_JUMP_TECH,
CEILING_TECH,
MISSED_CEILING_TECH,
JAB_RESET,
MISSED_TECH_GET_UP,
MISSED_TECH_ROLL_LEFT,
MISSED_TECH_ROLL_RIGHT,
}
impl TechType {
pub fn from_state(state: u16, direction: i8) -> Option<Self> {
let a_state = AS::from_repr(state);
match a_state? {
AS::PASSIVE => Some(TechType::TECH_IN_PLACE),
AS::DOWN_STAND_U | AS::DOWN_STAND_D => Some(TechType::MISSED_TECH_GET_UP),
AS::PASSIVE_STAND_F => match direction > 0 {
true => Some(TechType::TECH_RIGHT),
false => Some(TechType::TECH_LEFT),
},
AS::DOWN_FOWARD_U | AS::DOWN_FOWARD_D => match direction > 0 {
true => Some(TechType::MISSED_TECH_ROLL_RIGHT),
false => Some(TechType::MISSED_TECH_ROLL_LEFT),
},
AS::PASSIVE_STAND_B => match direction > 0 {
true => Some(TechType::TECH_LEFT),
false => Some(TechType::TECH_RIGHT),
},
AS::DOWN_BACK_U | AS::DOWN_BACK_D => match direction > 0 {
true => Some(TechType::MISSED_TECH_ROLL_LEFT),
false => Some(TechType::MISSED_TECH_ROLL_RIGHT),
},
AS::DOWN_ATTACK_U | AS::DOWN_ATTACK_D => Some(TechType::GET_UP_ATTACK),
AS::DOWN_BOUND_U
| AS::DOWN_BOUND_D
| AS::DOWN_WAIT_U
| AS::DOWN_WAIT_D
| AS::DOWN_REFLECT => Some(TechType::MISSED_TECH),
AS::DOWN_DAMAGE_U | AS::DOWN_DAMAGE_D => Some(TechType::JAB_RESET),
AS::PASSIVE_WALL => Some(TechType::WALL_TECH),
AS::PASSIVE_WALL_JUMP => Some(TechType::WALL_JUMP_TECH),
AS::PASSIVE_CEIL => Some(TechType::CEILING_TECH),
AS::FLY_REFLECT_CEIL => Some(TechType::MISSED_CEILING_TECH),
AS::FLY_REFLECT_WALL => Some(TechType::MISSED_WALL_TECH),
_ => None,
}
}
}