diff --git a/src/ship/shops/mod.rs b/src/ship/shops/mod.rs index e8753d1..bfff30d 100644 --- a/src/ship/shops/mod.rs +++ b/src/ship/shops/mod.rs @@ -1,3 +1,7 @@ pub mod weapon; pub mod tool; pub mod armor; + +pub trait ShopItem { + fn price(&self) -> usize; +} diff --git a/src/ship/shops/weapon.rs b/src/ship/shops/weapon.rs index f2aead2..f108e12 100644 --- a/src/ship/shops/weapon.rs +++ b/src/ship/shops/weapon.rs @@ -9,6 +9,8 @@ use rand::seq::{SliceRandom, IteratorRandom}; use crate::entity::character::SectionID; use crate::ship::room::Difficulty; use crate::entity::item::weapon::{WeaponType, WeaponSpecial, Attribute, WeaponAttribute}; +use crate::ship::shops::ShopItem; +use crate::ship::item_stats::WEAPON_STATS; const TIER1_SPECIAL: [WeaponSpecial; 8] = [WeaponSpecial::Draw, WeaponSpecial::Heart, WeaponSpecial::Ice, WeaponSpecial::Bind, @@ -26,6 +28,80 @@ pub struct ShopWeapon { } +fn special_stars(special: &WeaponSpecial) -> usize { + match special { + WeaponSpecial::Draw => 1, + WeaponSpecial::Drain => 2, + WeaponSpecial::Fill => 3, + WeaponSpecial::Gush => 4, + WeaponSpecial::Heart => 1, + WeaponSpecial::Mind => 2, + WeaponSpecial::Soul => 3, + WeaponSpecial::Geist => 4, + WeaponSpecial::Masters => 2, + WeaponSpecial::Lords => 3, + WeaponSpecial::Kings => 4, + WeaponSpecial::Charge => 2, + WeaponSpecial::Spirit => 3, + WeaponSpecial::Berserk => 4, + WeaponSpecial::Ice => 1, + WeaponSpecial::Frost => 2, + WeaponSpecial::Freeze => 3, + WeaponSpecial::Blizzard => 4, + WeaponSpecial::Bind => 1, + WeaponSpecial::Hold => 2, + WeaponSpecial::Seize => 3, + WeaponSpecial::Arrest => 4, + WeaponSpecial::Heat => 1, + WeaponSpecial::Fire => 2, + WeaponSpecial::Flame => 3, + WeaponSpecial::Burning => 4, + WeaponSpecial::Shock => 1, + WeaponSpecial::Thunder => 2, + WeaponSpecial::Storm => 3, + WeaponSpecial::Tempest => 4, + WeaponSpecial::Dim => 1, + WeaponSpecial::Shadow => 2, + WeaponSpecial::Dark => 3, + WeaponSpecial::Hell => 4, + WeaponSpecial::Panic => 1, + WeaponSpecial::Riot => 2, + WeaponSpecial::Havoc => 3, + WeaponSpecial::Chaos => 4, + WeaponSpecial::Devils => 3, + WeaponSpecial::Demons => 4, + } + +} + +impl ShopItem for ShopWeapon { + fn price(&self) -> usize { + WEAPON_STATS.get(&self.weapon) + .map(|weapon_stat| { + let mut price = weapon_stat.atp_max as f32; + price += self.grind as f32; + price = (price * (price * 3.0)) / weapon_stat.shop_multiplier; + + let percent = self.attributes.iter() + .fold(0.0, |acc, attr| { + acc + attr.map(|a| a.value).unwrap_or(0) as f32 + }); + + price = price + ((price / 300.0) * percent); + + let special = self.special.map(|special| { + special_stars(&special) as f32 + }).unwrap_or(0.0); + + price += special * special * 1000.0; + + price as usize + }) + .unwrap_or(0xFFFF) + } +} + + #[derive(Debug, Deserialize)] struct WeaponTableTierEntry { weapon: WeaponType,