use core::range::RangeInclusive;
use super::database::{ Result, DBError };
use time::UtcDateTime;
type CharaId = i32;
#[derive(Debug, Clone, PartialEq)]
pub struct CharacterCard {
pub id: i32,
pub card_id: i32,
pub chara_id: CharaId,
pub name: String,
pub default_rarity: i32,
pub rarity: i32,
pub skill_set: i32,
pub speed_talent: i32,
pub speed: i32,
pub max_speed: i32,
pub stamina_talent: i32,
pub stamina: i32,
pub max_stamina: i32,
pub power_talent: i32,
pub power: i32,
pub max_power: i32,
pub guts_talent: i32,
pub guts: i32,
pub max_guts: i32,
pub wis_talent: i32,
pub wis: i32,
pub max_wis: i32,
pub default_running_style: RunningStyle,
pub turf_grade: StatGradeRating,
pub dirt_grade: StatGradeRating,
pub sprint_grade: StatGradeRating,
pub mile_grade: StatGradeRating,
pub medium_grade: StatGradeRating,
pub long_grade: StatGradeRating
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum StatGradeRating {
G,
F,
E,
D,
C,
B,
A,
S
}
impl TryFrom<i32> for StatGradeRating {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
1 => Ok(StatGradeRating::G),
2 => Ok(StatGradeRating::F),
3 => Ok(StatGradeRating::E),
4 => Ok(StatGradeRating::D),
5 => Ok(StatGradeRating::C),
6 => Ok(StatGradeRating::B),
7 => Ok(StatGradeRating::A),
8 => Ok(StatGradeRating::S),
_ => Err(DBError::DataTypeError)
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum RunningStyle {
FrontRunner,
PaceChaser,
LateSurger,
EndCloser
}
impl TryFrom<i32> for RunningStyle {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
1 => Ok(RunningStyle::FrontRunner),
2 => Ok(RunningStyle::PaceChaser),
3 => Ok(RunningStyle::LateSurger),
4 => Ok(RunningStyle::EndCloser),
_ => Err(DBError::DataTypeError)
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct SupportCard {
pub id: i32,
pub chara_id: i32,
pub name: String,
pub rarity: SupportCardRarity,
pub card_type: SupportCardType,
pub timestamp: UtcDateTime
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SupportCardRarity {
R(i32),
SR(i32),
SSR(i32)
}
impl TryFrom<i32> for SupportCardRarity {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
1 => Ok(Self::R(value)),
2 => Ok(Self::SR(value)),
3 => Ok(Self::SSR(value)),
_ => Err(DBError::DataTypeError)
}
}
}
impl From<SupportCardRarity> for i32 {
fn from(value: SupportCardRarity) -> Self {
match value {
SupportCardRarity::R(num) => num,
SupportCardRarity::SR(num) => num,
SupportCardRarity::SSR(num) => num
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SupportCardType {
Pal(i32),
Speed(i32),
Power(i32),
Guts(i32),
Stamina(i32),
Wits(i32)
}
impl TryFrom<i32> for SupportCardType {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
0 => Ok(Self::Pal(value)),
101 => Ok(Self::Speed(value)),
102 => Ok(Self::Power(value)),
103 => Ok(Self::Guts(value)),
105 => Ok(Self::Stamina(value)),
106 => Ok(Self::Wits(value)),
_ => Err(DBError::DataTypeError)
}
}
}
impl From<SupportCardType> for i32 {
fn from(value: SupportCardType) -> Self {
match value {
SupportCardType::Pal(num) => num,
SupportCardType::Speed(num) => num,
SupportCardType::Power(num) => num,
SupportCardType::Guts(num) => num,
SupportCardType::Stamina(num) => num,
SupportCardType::Wits(num) => num
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Factor {
pub id: i32,
pub name: String,
pub desc: String,
pub rarity: i32,
pub grade: FactorGrade,
pub factor_type: FactorType
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum FactorGrade {
Normal,
Unique
}
impl TryFrom<i32> for FactorGrade {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
1 => Ok(Self::Normal),
2 => Ok(Self::Unique),
_ => Err(DBError::DataTypeError)
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum FactorType {
Blue,
Pink,
Green,
Skill,
Race,
Scenario,
CarnivalBonus
}
impl TryFrom<i32> for FactorType {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
1 => Ok(Self::Blue),
2 => Ok(Self::Pink),
3 => Ok(Self::Green),
4 => Ok(Self::Skill),
5 => Ok(Self::Race),
6 => Ok(Self::Scenario),
7 => Ok(Self::CarnivalBonus),
_ => Err(DBError::DataTypeError)
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct FactorInitialSuccession {
pub factor_type: FactorType,
pub rarity_range: RangeInclusive<i32>,
pub add_point: i32
}
#[derive(Debug, Clone, PartialEq)]
pub struct Skill {
pub id: i32,
pub category: SkillCategory,
pub name: String,
pub desc: String,
pub grade_val: i32,
pub tag_id: String,
pub skill_conditions: (SkillCondition,Option<SkillCondition>),
pub icon_id: i32,
pub is_general_skill: bool
}
#[derive(Debug, Clone, PartialEq)]
pub struct SkillCondition {
pub precondition: String,
pub condition: String,
pub ability_targets: Vec<SkillAbilityTarget>
}
#[derive(Debug, Clone, PartialEq)]
pub struct SkillAbilityTarget {
pub ability_type: Option<AbilityType>,
pub target_type: Option<TargetType>,
pub target_value: Option<TargetValue>
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum AbilityType {
Speed(i32),
Stamina(i32),
Power(i32),
Guts(i32),
Wits(i32),
Unique(i32),
FoV(i32),
HP(i32),
AlwaysActive(i32),
RushCooldown(i32),
VelocityDecr(i32),
VelocityIncr(i32),
Navigation(i32),
Acceleration(i32),
RacingCarnival(i32)
}
impl TryFrom<i32> for AbilityType {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
1 => Ok(AbilityType::Speed(value)),
2 => Ok(AbilityType::Stamina(value)),
3 => Ok(AbilityType::Power(value)),
4 => Ok(AbilityType::Guts(value)),
5 => Ok(AbilityType::Wits(value)),
6 => Ok(AbilityType::Unique(value)),
8 => Ok(AbilityType::FoV(value)),
9 => Ok(AbilityType::HP(value)),
10 => Ok(AbilityType::AlwaysActive(value)),
13 => Ok(AbilityType::RushCooldown(value)),
21 => Ok(AbilityType::VelocityDecr(value)),
27 => Ok(AbilityType::VelocityIncr(value)),
28 => Ok(AbilityType::Navigation(value)),
31 => Ok(AbilityType::Acceleration(value)),
502 => Ok(AbilityType::RacingCarnival(value)),
_ => Err(DBError::DataTypeError)
}
}
}
impl From<AbilityType> for i32 {
fn from(value: AbilityType) -> Self {
match value {
AbilityType::Speed(val) => val,
AbilityType::Stamina(val) => val,
AbilityType::Power(val) => val,
AbilityType::Guts(val) => val,
AbilityType::Wits(val) => val,
AbilityType::Unique(val) => val,
AbilityType::FoV(val) => val,
AbilityType::HP(val) => val,
AbilityType::AlwaysActive(val) => val,
AbilityType::RushCooldown(val) => val,
AbilityType::VelocityDecr(val) => val,
AbilityType::VelocityIncr(val) => val,
AbilityType::Navigation(val) => val,
AbilityType::Acceleration(val) => val,
AbilityType::RacingCarnival(val) => val
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TargetType {
PC(i32),
FocusActiveRunners(i32),
RunnersAheadPC(i32),
RunnersBehindPC(i32),
RunnersInPCProx(i32),
PCInRear(i32),
PCInFront(i32),
RushedActiveRunners(i32),
HeroCharacter(i32)
}
impl TryFrom<i32> for TargetType {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
1 => Ok(TargetType::PC(value)),
4 => Ok(TargetType::FocusActiveRunners(value)),
9 => Ok(TargetType::RunnersAheadPC(value)),
10 => Ok(TargetType::RunnersBehindPC(value)),
18 => Ok(TargetType::RunnersInPCProx(value)),
19 => Ok(TargetType::PCInRear(value)),
20 => Ok(TargetType::PCInFront(value)),
21 => Ok(TargetType::RushedActiveRunners(value)),
22 => Ok(TargetType::HeroCharacter(value)),
_ => Err(DBError::DataTypeError)
}
}
}
impl From<TargetType> for i32 {
fn from(value: TargetType) -> Self {
match value {
TargetType::PC(val) => val,
TargetType::FocusActiveRunners(val) => val,
TargetType::RunnersAheadPC(val) => val,
TargetType::RunnersBehindPC(val) => val,
TargetType::RunnersInPCProx(val) => val,
TargetType::PCInRear(val) => val,
TargetType::PCInFront(val) => val,
TargetType::RushedActiveRunners(val) => val,
TargetType::HeroCharacter(val) => val,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TargetValue {
HeroCharacter(CharaId),
PC(i32),
FrontRunners(i32),
PaceChasers(i32),
LateSurgers(i32),
EndClosers(i32),
FromPCOrigin(i32),
RunnersAheadPC(i32),
RunnersBehindPC(i32),
RunnersInPCProx(i32)
}
impl TryFrom<i32> for TargetValue {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
0 => Ok(TargetValue::PC(value)),
1 => Ok(TargetValue::FrontRunners(value)),
2 => Ok(TargetValue::PaceChasers(value)),
3 => Ok(TargetValue::LateSurgers(value)),
4 => Ok(TargetValue::EndClosers(value)),
5 => Ok(TargetValue::FromPCOrigin(value)),
9 => Ok(TargetValue::RunnersAheadPC(value)),
10 => Ok(TargetValue::RunnersBehindPC(value)),
18 => Ok(TargetValue::RunnersInPCProx(value)),
1000..2000 => Ok(TargetValue::HeroCharacter(value)),
_ => Err(DBError::DataTypeError)
}
}
}
impl From<TargetValue> for i32 {
fn from(value: TargetValue) -> Self {
match value {
TargetValue::PC(val) => val,
TargetValue::FrontRunners(val) => val,
TargetValue::PaceChasers(val) => val,
TargetValue::LateSurgers(val) => val,
TargetValue::EndClosers(val) => val,
TargetValue::FromPCOrigin(val) => val,
TargetValue::RunnersAheadPC(val) => val,
TargetValue::RunnersBehindPC(val) => val,
TargetValue::RunnersInPCProx(val) => val,
TargetValue::HeroCharacter(val) => val
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SkillRarity {
White,
Gold,
Level(i32)
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SkillCategory {
PassiveCond(SkillRarity),
EarlyRace(SkillRarity),
MidRace(SkillRarity),
LateRace(SkillRarity),
RaceCond(SkillRarity),
Unique(SkillRarity),
RacingCarnival(SkillRarity)
}
impl SkillCategory {
pub fn into_cat(category: i32, rarity: i32) -> Result<Self> {
match category {
0 => match rarity {
1 => Ok(SkillCategory::PassiveCond(SkillRarity::White)),
2 => Ok(SkillCategory::PassiveCond(SkillRarity::Gold)),
_ => Err(DBError::DataTypeError)
},
1 => match rarity {
1 => Ok(SkillCategory::EarlyRace(SkillRarity::White)),
2 => Ok(SkillCategory::EarlyRace(SkillRarity::Gold)),
_ => Err(DBError::DataTypeError)
},
2 => match rarity {
1 => Ok(SkillCategory::MidRace(SkillRarity::White)),
2 => Ok(SkillCategory::MidRace(SkillRarity::Gold)),
_ => Err(DBError::DataTypeError)
},
3 => match rarity {
1 => Ok(SkillCategory::LateRace(SkillRarity::White)),
2 => Ok(SkillCategory::LateRace(SkillRarity::Gold)),
_ => Err(DBError::DataTypeError)
},
4 => match rarity {
1 => Ok(SkillCategory::RaceCond(SkillRarity::White)),
2 => Ok(SkillCategory::RaceCond(SkillRarity::Gold)),
_ => Err(DBError::DataTypeError)
},
5 => Ok(SkillCategory::Unique(SkillRarity::Level(rarity))),
101 => match rarity {
1 => Ok(SkillCategory::RacingCarnival(SkillRarity::White)),
2 => Ok(SkillCategory::RacingCarnival(SkillRarity::Gold)),
_ => Err(DBError::DataTypeError)
},
_ => Err(DBError::DataTypeError)
}
}
pub fn get_rarity(self) -> SkillRarity {
match self {
SkillCategory::PassiveCond(rarity) => rarity,
SkillCategory::EarlyRace(rarity) => rarity,
SkillCategory::MidRace(rarity) => rarity,
SkillCategory::LateRace(rarity) => rarity,
SkillCategory::RaceCond(rarity) => rarity,
SkillCategory::Unique(level) => level,
SkillCategory::RacingCarnival(rarity) => rarity
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Race {
pub program_id: i32,
pub race_inst_id: i32,
pub race_id: i32,
pub race_name: String,
pub track_name: String,
pub race_grade: RaceGrade,
pub race_dist: RaceDistance,
pub track_ground: RaceGround,
pub month: i32,
pub half: i32
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum RaceGrade {
G1,
G2,
G3,
OP,
PreOP,
Maiden,
Debut
}
impl TryFrom<i32> for RaceGrade {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
100 => Ok(RaceGrade::G1),
200 => Ok(RaceGrade::G2),
300 => Ok(RaceGrade::G3),
400 => Ok(RaceGrade::OP),
700 => Ok(RaceGrade::PreOP),
800 => Ok(RaceGrade::Maiden),
900 => Ok(RaceGrade::Debut),
_ => Err(DBError::DataTypeError)
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum RaceDistance {
Sprint(i32),
Mile(i32),
Med(i32),
Long(i32)
}
impl TryFrom<i32> for RaceDistance {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
1000..=1400 => Ok(RaceDistance::Sprint(value)),
1500..=1800 => Ok(RaceDistance::Mile(value)),
1900..=2400 => Ok(RaceDistance::Med(value)),
2500..=3600 => Ok(RaceDistance::Long(value)),
_ => Err(DBError::DataTypeError)
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum RaceGround {
Turf,
Dirt
}
impl TryFrom<i32> for RaceGround {
type Error = DBError;
fn try_from(value: i32) -> Result<Self> {
match value {
1 => Ok(RaceGround::Turf),
2 => Ok(RaceGround::Dirt),
_ => Err(DBError::DataTypeError)
}
}
}