use std::default::Default;
use serde::{Deserialize, Serialize};
extern crate num;
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Rem, RemAssign, Sub, SubAssign};
use std::fmt::Debug;
#[cfg(feature = "fltkform")]
use fltk::{prelude::*, *};
#[cfg(feature = "fltkform")]
use fltk_form_derive::*;
#[cfg(feature = "fltkform")]
use fltk_form::FltkForm;
use crate::random::*;
use crate::equation::Math;
pub trait Functions <T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> {
type Statistics;
fn damage(&self);
}
pub trait Builder <T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> {
fn build_basic(&self, id:T, level:T) -> Basic<T>;
fn build_normal(&self, id:T, level:T) -> Normal<T>;
fn build_advanced(&self, id:T, level:T) -> Advanced<T>;
}
pub trait BasicPremade<T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> {
fn stat(&self) -> Basic<T>;
fn set_hp(&mut self, amount:T);
fn set_mp(&mut self, amount:T);
fn set_xp(&mut self, amount:T);
fn set_hp_max(&mut self, amount:T);
fn set_mp_max(&mut self, amount:T);
fn set_xp_next(&mut self, amount:T);
fn set_gp(&mut self, amount:T);
fn id(&self) -> T {
self.stat().id
}
fn hp(&self) -> T {
self.stat().hp
}
fn mp(&self) -> T {
self.stat().mp
}
fn xp(&self) -> T {
self.stat().xp
}
fn hp_max(&self) -> T {
self.stat().hp_max
}
fn mp_max(&self) -> T {
self.stat().mp_max
}
fn xp_next(&self) -> T {
self.stat().xp_next
}
fn level(&self) -> T {
self.stat().level
}
fn speed(&self) -> T {
self.stat().level
}
fn gp(&self) -> T {
self.stat().gp
}
fn damage(&mut self, amount:T) {
let mut val = self.hp();
val -= amount;
let none = num::cast(0).unwrap();
if val < none {
val = none;
}
self.set_hp(val)
}
fn heal(&mut self, amount:T) {
let mut val = self.hp();
val += amount;
let max = self.hp_max();
if val > max {
val = max;
}
self.set_hp(val)
}
}
#[derive( Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Basic<T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> {
pub id:T,
pub xp:T,
pub hp:T,
pub mp:T,
pub xp_next:T,
pub hp_max:T,
pub mp_max:T,
pub level:T,
pub speed:T,
pub gp:T,
}
impl<T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> Basic<T> {
pub fn empty() -> Self where Self:Sized {
Basic {
id:Default::default(),
xp:Default::default(),
xp_next:Default::default(),
mp:Default::default(),
hp:Default::default(),
mp_max:Default::default(),
hp_max:Default::default(),
level:Default::default(),
speed:Default::default(),
gp:Default::default(),
}
}
#[allow(unused)]
pub fn new() -> Self {
Self::empty()
}
#[allow(unused)]
pub fn next(&self) -> T {
self.level * self.xp_next
}
#[allow(unused)]
pub fn stats_vec(&self) -> Vec<T>{
vec![
self.hp_max,
self.mp_max,
self.speed,
]
}
#[allow(unused)]
pub fn level_up(&mut self) -> bool {
if self.xp > self.next() {
let stats_vec:Vec<T> = self.stats_vec();
let mut num:T = Math::population_standard_deviation(stats_vec);
let one:T = num::cast::<u32, T>(1).unwrap();
if num < one {
num = one;
}
num *= self.level;
self.level += num;
self.mp_max += num;
self.hp_max += num;
self.speed += num;
return true;
}
false
}
}
impl<T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> Default for Basic<T> {
fn default() -> Self where Self:Sized {
Self::empty()
}
}
pub trait NormalPremade<T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> {
fn stat(&self) -> Normal<T>;
fn set_hp(&mut self, amount:T);
fn set_mp(&mut self, amount:T);
fn set_xp(&mut self, amount:T);
fn set_hp_max(&mut self, amount:T);
fn set_mp_max(&mut self, amount:T);
fn set_xp_next(&mut self, amount:T);
fn set_gp(&mut self, amount:T);
fn set_atk(&mut self, amount:T);
fn set_def(&mut self, amount:T);
fn set_m_atk(&mut self, amount:T);
fn set_m_def(&mut self, amount:T);
fn id(&self) -> T {
self.stat().id
}
fn hp(&self) -> T {
self.stat().hp
}
fn mp(&self) -> T {
self.stat().mp
}
fn xp(&self) -> T {
self.stat().xp
}
fn hp_max(&self) -> T {
self.stat().hp_max
}
fn mp_max(&self) -> T {
self.stat().mp_max
}
fn xp_next(&self) -> T {
self.stat().xp_next
}
fn level(&self) -> T {
self.stat().level
}
fn speed(&self) -> T {
self.stat().level
}
fn gp(&self) -> T {
self.stat().gp
}
fn atk(&self) -> T {
self.stat().atk
}
fn def(&self) -> T {
self.stat().def
}
fn m_atk(&self) -> T {
self.stat().m_atk
}
fn m_def(&self) -> T {
self.stat().m_def
}
fn damage(&mut self, amount:T) {
let mut val = self.hp();
val -= amount;
let none = num::cast(0).unwrap();
if val < none {
val = none;
}
self.set_hp(val)
}
fn heal(&mut self, amount:T) {
let mut val = self.hp();
val += amount;
let max = self.hp_max();
if val > max {
val = max;
}
self.set_hp(val)
}
fn attack_stable(&self, other:Normal<T>) -> T {
let hundred = num::cast(100).unwrap();
let val = self.atk();
let def = other.def + hundred;
let res = hundred / def;
val * res
}
fn attack(&self, other:Normal<T>) -> T {
let val = self.atk();
let mut res = val * val;
let def = other.def + val;
res /= def;
res
}
}
#[derive( Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Normal<T:Copy
+ Default
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> {
pub id:T,
pub xp:T,
pub hp:T,
pub mp:T,
pub xp_next:T,
pub hp_max:T,
pub mp_max:T,
pub level:T,
pub speed:T,
pub gp:T,
pub atk:T,
pub def:T,
pub m_atk:T,
pub m_def:T,
}
impl<T:Copy
+ Default
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> Normal<T> {
pub fn empty<U:Default>() -> Self {
Normal {
id:Default::default(),
xp:Default::default(),
xp_next:Default::default(),
mp:Default::default(),
hp:Default::default(),
mp_max:Default::default(),
hp_max:Default::default(),
level:Default::default(),
speed:Default::default(),
gp:Default::default(),
atk:Default::default(),
def:Default::default(),
m_atk:Default::default(),
m_def:Default::default(),
}
} #[allow(unused)]
pub fn new() -> Self {
Self::empty::<T>()
}
#[allow(unused)]
pub fn next(&self) -> T {
self.level * self.xp_next
}
#[allow(unused)]
pub fn stats_vec(&self) -> Vec<T>{
vec![
self.hp_max,
self.mp_max,
self.speed,
self.atk,
self.def,
self.m_atk,
self.m_def,
]
}
#[allow(unused)]
pub fn level_up(&mut self) -> bool {
if self.xp > self.next() {
let stats_vec:Vec<T> = self.stats_vec();
let mut num:T = Math::population_standard_deviation(stats_vec);
let one:T = num::cast::<u32, T>(1).unwrap();
if num < one {
num = one;
}
num *= self.level;
self.level += num;
self.mp_max += num;
self.hp_max += num;
self.speed += num;
self.atk += num;
self.def += num;
self.m_atk += num;
self.m_def += num;
return true;
}
false
}
}
impl<T:Copy
+ Default
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> Default for Normal<T> {
fn default() -> Self {
Self::empty::<T>()
}
}
pub trait AdvancedPremade<T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> {
fn stat(&self) -> Advanced<T>;
fn set_hp(&mut self, amount:T);
fn set_mp(&mut self, amount:T);
fn set_xp(&mut self, amount:T);
fn set_hp_max(&mut self, amount:T);
fn set_mp_max(&mut self, amount:T);
fn set_xp_next(&mut self, amount:T);
fn set_gp(&mut self, amount:T);
fn set_atk(&mut self, amount:T);
fn set_def(&mut self, amount:T);
fn set_m_atk(&mut self, amount:T);
fn set_m_def(&mut self, amount:T);
fn id(&self) -> T {
self.stat().id
}
fn hp(&self) -> T {
self.stat().hp
}
fn mp(&self) -> T {
self.stat().mp
}
fn xp(&self) -> T {
self.stat().xp
}
fn hp_max(&self) -> T {
self.stat().hp_max
}
fn mp_max(&self) -> T {
self.stat().mp_max
}
fn xp_next(&self) -> T {
self.stat().xp_next
}
fn level(&self) -> T {
self.stat().level
}
fn speed(&self) -> T {
self.stat().level
}
fn atk(&self) -> T {
self.stat().atk
}
fn def(&self) -> T {
self.stat().def
}
fn m_atk(&self) -> T {
self.stat().m_atk
}
fn m_def(&self) -> T {
self.stat().m_def
}
fn gp(&self) -> T {
self.stat().gp
}
fn agi(&self) -> T {
self.stat().agility
}
fn str(&self) -> T {
self.stat().strength
}
fn int(&self) -> T {
self.stat().intelligence
}
fn dex(&self) -> T {
self.stat().dexterity
}
fn con(&self) -> T {
self.stat().constitution
}
fn char(&self) -> T {
self.stat().charisma
}
fn wis(&self) -> T {
self.stat().wisdom
}
fn age(&self) -> T {
self.stat().age
}
fn damage(&mut self, amount:T) {
let mut val = self.hp();
val -= amount;
let none = num::cast(0).unwrap();
if val < none {
val = none;
}
self.set_hp(val)
}
fn heal(&mut self, amount:T) {
let mut val = self.hp();
val += amount;
let max = self.hp_max();
if val > max {
val = max;
}
self.set_hp(val)
}
fn attack_stable(&self, other:Advanced<T>) -> T {
let hundred = num::cast(100).unwrap();
let val = self.atk();
let def = other.def + hundred;
let res = hundred / def;
val * res
}
fn attack(&self, other:Advanced<T>) -> T {
let val = self.atk();
let mut res = val * val;
let mut def = other.def;
def += val;
res /= def;
res
}
}
#[allow(unused)]
#[derive( Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Advanced<T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> {
pub id:T,
pub xp:T,
pub hp:T,
pub mp:T,
pub xp_next:T,
pub hp_max:T,
pub mp_max:T,
pub level:T,
pub speed:T,
pub gp:T,
pub atk:T,
pub def:T,
pub m_atk:T,
pub m_def:T,
pub agility:T,
pub strength:T,
pub dexterity:T,
pub constitution:T,
pub intelligence:T,
pub charisma:T,
pub wisdom:T,
pub age:T,
}
impl<T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> Advanced<T> {
#[allow(unused)]
pub fn empty<U:Default>() -> Self {
Advanced {
id:Default::default(),
xp:Default::default(),
xp_next:Default::default(),
mp:Default::default(),
hp:Default::default(),
mp_max:Default::default(),
hp_max:Default::default(),
level:Default::default(),
speed:Default::default(),
gp:Default::default(),
atk:Default::default(),
def:Default::default(),
m_atk:Default::default(),
m_def:Default::default(),
agility:Default::default(),
strength:Default::default(),
dexterity:Default::default(),
constitution:Default::default(),
intelligence:Default::default(),
charisma:Default::default(),
wisdom:Default::default(),
age:Default::default(),
}
}
#[allow(unused)]
pub fn new<U:Default>() -> Self {
Self::empty::<U>()
}
#[allow(unused)]
pub fn next(&self) -> T {
self.level * self.xp_next
}
#[allow(unused)]
pub fn stats_vec(&self) -> Vec<T>{
vec![
self.hp_max,
self.mp_max,
self.speed,
self.atk,
self.def,
self.m_atk,
self.m_def,
self.agility,
self.strength,
self.dexterity,
self.constitution,
self.intelligence,
self.charisma,
]
}
#[allow(unused)]
pub fn level_up(&mut self) -> bool {
if self.xp > self.next() {
let stats_vec:Vec<T> = self.stats_vec();
let mut value:T = Math::population_standard_deviation(stats_vec);
self.level += value;
self.mp_max += value;
self.hp_max += value;
self.speed += value;
self.atk += value;
self.def += value;
self.m_atk += value;
self.m_def += value;
self.agility += value;
self.strength += value;
self.dexterity += value;
self.constitution += value;
self.intelligence += value;
self.charisma += value;
return true;
}
false
}
}
impl<T:Copy
+ Default
+ Debug
+ AddAssign
+ Add<Output = T>
+ Div<Output = T>
+ DivAssign
+ Mul<Output = T>
+ MulAssign
+ Neg<Output = T>
+ Rem<Output = T>
+ RemAssign
+ Sub<Output = T>
+ SubAssign
+ std::cmp::PartialOrd
+ num::NumCast> Default for Advanced<T> {
fn default() -> Self {
Self::empty::<T>()
}
}
#[derive( Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "fltkform", derive(FltkForm))]
pub struct Stats {
pub id:f64,
pub xp:f64,
pub hp:f64,
pub mp:f64,
pub xp_next:f64,
pub hp_max:f64,
pub mp_max:f64,
pub level:f64,
pub speed:f64,
pub gp:f64,
pub atk:f64,
pub def:f64,
pub m_atk:f64,
pub m_def:f64,
}
impl Random for Stats {
type Type = Stats;
fn random_type(&self) -> Self::Type {
let hp = self.random(10.0,50.0);
let atk = self.random(5.0,50.0);
let def = self.random(5.0,50.0);
let mp = self.random(10.0,50.0);
let m_atk = self.random(5.0,50.0);
let m_def = self.random(5.0,50.0);
let speed = self.random(5.0,50.0);
let gp = self.random(0.0, 30.0);
Stats {
id:self.random(0.0, 100.0),
xp:0.0,
xp_next:10.0,
level:1.0,
hp_max:hp,
hp,
mp_max:mp,
mp,
atk,
def,
m_atk,
m_def,
speed,
gp,
}
}
}
impl Stats {
#[allow(unused)]
pub fn empty() -> Self {
Stats {
id:0.0,
xp:0.0,
xp_next:0.0,
mp:0.0,
hp:0.0,
mp_max:0.0,
hp_max:0.0,
level:0.0,
speed:0.0,
gp:0.0,
atk:0.0,
def:0.0,
m_atk:0.0,
m_def:0.0,
}
}
#[allow(unused)]
pub fn new() -> Self {
Self::empty()
}
#[allow(unused)]
pub fn next(&self) -> f64 {
self.level * self.xp_next
}
#[allow(unused)]
pub fn stats_vec(&self) -> Vec<f64>{
vec![
self.hp_max,
self.mp_max,
self.speed,
self.atk,
self.def,
self.m_atk,
self.m_def,
]
}
#[allow(unused)]
pub fn level_up(&mut self) {
println!("xp:{} next:{}", self.xp, self.next());
if self.xp > self.next() {
let stats_vec:Vec<f64> = self.stats_vec();
let mut num:f64 = Math::population_standard_deviation(stats_vec);
let one = num::cast(1).unwrap();
if num < one {
num = one;
}
num *= self.level;
self.level += num;
self.mp_max += num;
self.hp_max += num;
self.speed += num;
self.atk += num;
self.def += num;
self.m_atk += num;
self.m_def += num;
}
}
}
impl Default for Stats {
fn default() -> Self {
Self::empty()
}
}
pub trait Premade {
fn stat(&self) -> Stats;
fn set_hp(&mut self, amount:f64);
fn set_mp(&mut self, amount:f64);
fn set_xp(&mut self, amount:f64);
fn set_hp_max(&mut self, amount:f64);
fn set_mp_max(&mut self, amount:f64);
fn set_xp_next(&mut self, amount:f64);
fn set_gp(&mut self, amount:f64);
fn set_atk(&mut self, amount:f64);
fn set_def(&mut self, amount:f64);
fn set_m_atk(&mut self, amount:f64);
fn set_m_def(&mut self, amount:f64);
fn set_level(&mut self, amount:f64);
fn set_speed(&mut self, amount:f64);
fn id(&self) -> f64 {
self.stat().id
}
fn hp(&self) -> f64 {
self.stat().hp
}
fn mp(&self) -> f64 {
self.stat().mp
}
fn xp(&self) -> f64 {
self.stat().xp
}
fn hp_max(&self) -> f64 {
self.stat().hp_max
}
fn mp_max(&self) -> f64 {
self.stat().mp_max
}
fn xp_next(&self) -> f64 {
self.stat().xp_next
}
fn level(&self) -> f64 {
self.stat().level
}
fn speed(&self) -> f64 {
self.stat().speed
}
fn gp(&self) -> f64 {
self.stat().gp
}
fn atk(&self) -> f64 {
self.stat().atk
}
fn def(&self) -> f64 {
self.stat().def
}
fn m_atk(&self) -> f64 {
self.stat().m_atk
}
fn m_def(&self) -> f64 {
self.stat().m_def
}
fn add_atk(&mut self, amount:f64) {
self.set_atk(self.stat().atk + amount);
}
fn add_def(&mut self, amount:f64) {
self.set_def(self.stat().def + amount);
}
fn add_m_atk(&mut self, amount:f64) {
self.set_m_atk(self.stat().m_atk + amount);
}
fn add_m_def(&mut self, amount:f64) {
self.set_m_def(self.stat().m_def + amount);
} fn add_xp(&mut self, amount:f64) {
self.set_xp(self.stat().xp + amount);
}
fn add_hp_max(&mut self, amount:f64) {
self.set_hp_max(self.stat().hp_max + amount);
}
fn add_mp_max(&mut self, amount:f64) {
self.set_mp_max( self.stat().mp_max + amount);
}
fn add_level(&mut self, amount:f64) {
self.set_level(self.stat().level + amount);
}
fn add_speed(&mut self, amount:f64) {
self.set_speed(self.stat().speed + amount);
}
fn damage(&mut self, amount:f64) {
let mut val = self.hp();
val -= amount;
let none = 0.0;
if val < none {
val = none;
}
self.set_hp(val)
}
fn heal(&mut self, amount:f64) {
let mut val = self.hp();
val += amount;
let max = self.hp_max();
if val > max {
val = max;
}
self.set_hp(val)
}
fn attack_stable(&self, other:Stats) -> f64 {
let hundred = 100.0;
let val = self.atk();
let def = other.def + hundred;
let res = hundred / def;
val * res
}
fn attack(&self, other:Stats) -> f64 {
let val = self.atk();
let mut res = val * val;
let def = other.def + val;
res /= def;
res
}
fn buy(&mut self, price:f64) -> bool {
let total = self.gp() - price;
if total <= 0.0 {
return false;
}
self.set_gp(total);
true
}
fn earn(&mut self, price:f64) {
let total = self.gp() + price;
self.set_gp(total);
} #[allow(unused)]
fn next(&self) -> f64 {
self.level() * self.xp_next()
}
fn stats_vec(&self) -> Vec<f64>{
vec![
self.hp_max(),
self.mp_max(),
self.speed(),
self.atk(),
self.def(),
self.m_atk(),
self.m_def(),
]
}
#[allow(unused)]
fn level_up(&mut self) -> bool{
if self.xp() > self.next() {
let stats_vec:Vec<f64> = self.stats_vec();
let mut num:f64 = Math::population_standard_deviation(stats_vec);
let one = 1.0;
if num < one {
num = one;
}
self.add_level(num);
self.add_mp_max(num);
self.add_hp_max(num);
self.add_speed(num);
self.add_atk(num);
self.add_def(num);
self.add_m_atk(num);
self.add_m_def(num);
return true;
}
false
}
}