From 5e559845959e5e8b7a4c6edf4cc2b685a16c3183 Mon Sep 17 00:00:00 2001 From: Monty Marz Date: Sun, 10 Jan 2021 02:05:13 +0100 Subject: [PATCH] stats display Addressed comments. Addressed comments. --- .../voxygen/element/icons/combat_rating.png | Bin 0 -> 1778 bytes assets/voxygen/element/icons/health.png | Bin 0 -> 1623 bytes assets/voxygen/element/icons/protection.png | Bin 404 -> 1624 bytes assets/voxygen/element/icons/stamina.png | Bin 0 -> 1782 bytes assets/voxygen/i18n/en.ron | 664 --------------- .../voxygen/voxel/sprite/lianas/liana-0.vox | Bin 2308 -> 58109 bytes .../voxygen/voxel/sprite/lianas/liana-1.vox | Bin 1804 -> 57081 bytes assets/voxygen/voxel/sprite_manifest.ron | 4 +- client/src/lib.rs | 473 +---------- common/src/combat.rs | 18 +- common/src/comp/ability.rs | 79 +- common/src/comp/skills.rs | 12 +- common/src/skillset_builder.rs | 774 +++++++++--------- voxygen/src/hud/bag.rs | 144 +++- voxygen/src/hud/img_ids.rs | 6 +- voxygen/src/hud/mod.rs | 74 +- voxygen/src/hud/overhead.rs | 4 +- 17 files changed, 609 insertions(+), 1643 deletions(-) create mode 100644 assets/voxygen/element/icons/combat_rating.png create mode 100644 assets/voxygen/element/icons/health.png create mode 100644 assets/voxygen/element/icons/stamina.png delete mode 100644 assets/voxygen/i18n/en.ron diff --git a/assets/voxygen/element/icons/combat_rating.png b/assets/voxygen/element/icons/combat_rating.png new file mode 100644 index 0000000000000000000000000000000000000000..da615c4077202b3b10cd40934f8457a30ec016dc GIT binary patch literal 1778 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 delta 392 zcmcb?Glf~PGr-TCmrII^fq{Y7)59eQNZWug2OE&I`g5~rqM~>`gF>=LkS_y6l_~>6 zLo)-z&;LOBB?CjL0RzLU1faSZ3=HD=lj4uMF)%PndAc};RNQ)VYd2rB0gprA?pNxE zUEGWg+VAF`%CI$5QH`x|Z}d6AbIht)X+_H`PMl>jNI1}-FM57&=PIo=j+}z!bSEnkqggQ%U$k$h>K)@nRS)VzG6jr_xXLRZf`3;;(40&tzmqB zUgmVM|JM%5^C>N7&Tsn9y_e~SdX4rMuLrC(TW`FzjK0qL*&gVk2OSlR3=IGOGc)+{ XO$pw2>Fj)9;4*l+`njxgN@xNAEJ>Xj diff --git a/assets/voxygen/element/icons/stamina.png b/assets/voxygen/element/icons/stamina.png new file mode 100644 index 0000000000000000000000000000000000000000..fec19a83c3e918c51958aa239ebc5d6e04918174 GIT binary patch literal 1782 zcmcIlL2u(k6m|tF5VX<)mx`0|N(clKk0*9wTbr%AO_xSmm(q>2<+kIQabg;Kj6H4A z!T~s}7731ASR}L(LgLatfDl|cq5UOXxs^AGlU>lZ^g=X=$Idt3`{sMkZ@%2!dGAW& z^@d>>SNhw%J-F(5+K+CBOlD2W zWh|Q0tN^rOTwk9SlpP3V#$uS}UF*-Ef3?h%cdff#grj0pjMD9sQrtP&8L*QB7I16* zhIxG&0zoDeHK*A)ufl29n(>A(*N<(>oI%t<*V@nl&HZTC+?1s-+f9rZ#x1iGG@Z8V zkG3$>7(Mq0#d%atAEV%1hBc+PawkMNGbJA+ca%ek25ZIX5 zgdjkm>Nr<)it_5(f}tlWR;GnYWo~Ll8p}h~wLs~73t6$G&8ylbFwCCP!giWiZ)pLH zqKlzfwnSHI>j{T$!a9e(YE~i9|}2J1}qNC z@ys61Y%vxYa94nJX8MY7vlLXxav-~?gI4L$E2?1UK4p%K≺1(9mTrceI6mP{3sEKra)s-m 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 IH{*=kLxzRQoB#j- diff --git a/assets/voxygen/voxel/sprite/lianas/liana-1.vox b/assets/voxygen/voxel/sprite/lianas/liana-1.vox index 515643fa4ba64d4ae8e100f7188b111603acf436..03f125f80a0d2e8b653152333d27d4af3d960631 100644 GIT binary patch literal 57081 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 self.send_msg(ClientGeneral::ChatMsg(message)), */ - Ok(()) => { - if message.starts_with('@') { - use comp::{item::tool::ToolKind::*, skills::*}; - match message.as_str() { - "@stats" => { - let stats = self - .state - .ecs() - .read_storage::() - .get(self.entity) - .cloned() - .unwrap(); - - tracing::info!("{:?}", stats.skill_set); - }, - "@unlock sword" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Sword), - ))); - }, - "@unlock sword interrupt" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::InterruptingAttacks, - ))); - }, - "@unlock sword combo" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::TsCombo, - ))); - }, - "@unlock sword combo damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::TsDamage, - ))); - }, - "@unlock sword combo regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::TsRegen, - ))); - }, - "@unlock sword combo speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::TsSpeed, - ))); - }, - "@unlock sword dash cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DCost, - ))); - }, - "@unlock sword dash drain" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DDrain, - ))); - }, - "@unlock sword dash damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DDamage, - ))); - }, - "@unlock sword dash scaling" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DScaling, - ))); - }, - "@unlock sword dash speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DSpeed, - ))); - }, - "@unlock sword dash infinite" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::DInfinite, - ))); - }, - "@unlock sword spin unlock" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::SUnlockSpin, - ))); - }, - "@unlock sword spin damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::SDamage, - ))); - }, - "@unlock sword spin speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::SSpeed, - ))); - }, - "@unlock sword spin cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::SCost, - ))); - }, - "@unlock sword spin num" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sword( - SwordSkill::SSpins, - ))); - }, - "@unlock axe" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Axe), - ))); - }, - "@unlock axe combo" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::DsCombo, - ))); - }, - "@unlock axe combo damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::DsDamage, - ))); - }, - "@unlock axe combo speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::DsCombo, - ))); - }, - "@unlock axe combo regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::DsRegen, - ))); - }, - "@unlock axe spin infinite" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::SInfinite, - ))); - }, - "@unlock axe spin helicopter" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::SHelicopter, - ))); - }, - "@unlock axe spin damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::SDamage, - ))); - }, - "@unlock axe spin speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe(AxeSkill::SSpeed))); - }, - "@unlock axe spin cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe(AxeSkill::SCost))); - }, - "@unlock axe leap unlock" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::LUnlockLeap, - ))); - }, - "@unlock axe leap damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::LDamage, - ))); - }, - "@unlock axe leap knockback" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::LKnockback, - ))); - }, - "@unlock axe leap cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe(AxeSkill::LCost))); - }, - "@unlock axe leap distance" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Axe( - AxeSkill::LDistance, - ))); - }, - "@unlock hammer" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Hammer), - ))); - }, - "@unlock hammer combo" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::SsKnockback, - ))); - }, - "@unlock hammer combo damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::SsDamage, - ))); - }, - "@unlock hammer combo speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::SsSpeed, - ))); - }, - "@unlock hammer combo regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::SsRegen, - ))); - }, - "@unlock hammer charge knockback" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::CKnockback, - ))); - }, - "@unlock hammer charge damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::CDamage, - ))); - }, - "@unlock hammer charge drain" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::CDrain, - ))); - }, - "@unlock hammer charge speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::CSpeed, - ))); - }, - "@unlock hammer leap unlock" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LUnlockLeap, - ))); - }, - "@unlock hammer leap damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LDamage, - ))); - }, - "@unlock hammer leap cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LCost, - ))); - }, - "@unlock hammer leap distance" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LDistance, - ))); - }, - "@unlock hammer leap knockback" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LKnockback, - ))); - }, - "@unlock hammer leap range" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Hammer( - HammerSkill::LRange, - ))); - }, - "@unlock bow" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Bow), - ))); - }, - "@unlock bow proj speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::ProjSpeed, - ))); - }, - "@unlock bow basic damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::BDamage, - ))); - }, - "@unlock bow basic regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::BRegen))); - }, - "@unlock bow charged damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::CDamage, - ))); - }, - "@unlock bow charged knockback" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::CKnockback, - ))); - }, - "@unlock bow charged proj speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::CProjSpeed, - ))); - }, - "@unlock bow charged drain" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::CDrain))); - }, - "@unlock bow charged speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::CSpeed))); - }, - "@unlock bow charged move" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::CMove))); - }, - "@unlock bow repeater" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::UnlockRepeater, - ))); - }, - "@unlock bow repeater damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::RDamage, - ))); - }, - "@unlock bow repeater glide" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::RGlide))); - }, - "@unlock bow repeater arrows" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow( - BowSkill::RArrows, - ))); - }, - "@unlock bow repeater cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Bow(BowSkill::RCost))); - }, - "@unlock staff" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Staff), - ))); - }, - "@unlock staff fireball" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::BExplosion, - ))); - }, - "@unlock staff fireball damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::BDamage, - ))); - }, - "@unlock staff fireball regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::BRegen, - ))); - }, - "@unlock staff fireball radius" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::BRadius, - ))); - }, - "@unlock staff beam damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::FDamage, - ))); - }, - "@unlock staff beam range" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::FRange, - ))); - }, - "@unlock staff beam drain" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::FDrain, - ))); - }, - "@unlock staff beam velocity" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::FVelocity, - ))); - }, - "@unlock staff shockwave" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::UnlockShockwave, - ))); - }, - "@unlock staff shockwave damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::SDamage, - ))); - }, - "@unlock staff shockwave knockback" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::SKnockback, - ))); - }, - "@unlock staff shockwave range" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::SRange, - ))); - }, - "@unlock staff shockwave cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Staff( - StaffSkill::SCost, - ))); - }, - "@unlock sceptre" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::UnlockGroup( - SkillGroupType::Weapon(Sceptre), - ))); - }, - "@unlock sceptre beam heal" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BHeal, - ))); - }, - "@unlock sceptre beam damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BDamage, - ))); - }, - "@unlock sceptre beam range" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BRange, - ))); - }, - "@unlock sceptre beam lifesteal" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BLifesteal, - ))); - }, - "@unlock sceptre beam regen" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BRegen, - ))); - }, - "@unlock sceptre beam cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::BCost, - ))); - }, - "@unlock sceptre proj heal" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::PHeal, - ))); - }, - "@unlock sceptre proj damage" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::PDamage, - ))); - }, - "@unlock sceptre proj radius" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::PRadius, - ))); - }, - "@unlock sceptre proj cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::PCost, - ))); - }, - "@unlock sceptre proj speed" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Sceptre( - SceptreSkill::PProjSpeed, - ))); - }, - "@unlock health" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::General( - GeneralSkill::HealthIncrease, - ))); - }, - "@unlock energy" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::General( - GeneralSkill::EnergyIncrease, - ))); - }, - "@unlock roll melee" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Roll( - RollSkill::ImmuneMelee, - ))); - }, - "@unlock roll cost" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Roll(RollSkill::Cost))); - }, - "@unlock roll strength" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Roll( - RollSkill::Strength, - ))); - }, - "@unlock roll duration" => { - self.send_msg(ClientGeneral::UnlockSkill(Skill::Roll( - RollSkill::Duration, - ))); - }, - _ => {}, - } - } else { - self.send_msg(ClientGeneral::ChatMsg(message)) - } - }, + Ok(()) => self.send_msg(ClientGeneral::ChatMsg(message)), Err(ChatMsgValidationError::TooLong) => tracing::warn!( "Attempted to send a message that's too long (Over {} bytes)", MAX_BYTES_CHAT_MSG diff --git a/common/src/combat.rs b/common/src/combat.rs index 4b2e9edd6d..fa31aabea7 100644 --- a/common/src/combat.rs +++ b/common/src/combat.rs @@ -229,33 +229,31 @@ pub fn get_weapons(inv: &Inventory) -> (Option, Option) { ) } -pub fn get_weapon_damage(inv: &Inventory) -> f32 { - let active_power = inv.equipped(EquipSlot::Mainhand).map_or(0.0, |i| { +fn max_equipped_weapon_damage(inv: &Inventory) -> f32 { + let active_damage = inv.equipped(EquipSlot::Mainhand).map_or(0.0, |i| { if let ItemKind::Tool(tool) = &i.kind() { tool.base_power() * tool.base_speed() } else { 0.0 } }); - let second_power = inv.equipped(EquipSlot::Offhand).map_or(0.0, |i| { + let second_damage = inv.equipped(EquipSlot::Offhand).map_or(0.0, |i| { if let ItemKind::Tool(tool) = &i.kind() { tool.base_power() * tool.base_speed() } else { 0.0 } }); - active_power.max(second_power).max(0.1) + active_damage.max(second_damage) } pub fn combat_rating(inventory: &Inventory, health: &Health, body: &Body) -> f32 { let defensive_weighting = tweak!(1.0); let offensive_weighting = tweak!(1.0); - let defensive_rating = - health.maximum() as f32 / (1.0 - Damage::compute_damage_reduction(inventory)) / 100.0; - let offensive_rating = get_weapon_damage(inventory); - //let combined_rating = 2.0 / ((1.0 / offensive_rating) + (1.0 / - // defensive_rating)); let combined_rating = offensive_rating * - // defensive_rating / (offensive_rating + defensive_rating); + let defensive_rating = health.maximum() as f32 + / (1.0 - Damage::compute_damage_reduction(inventory)).max(0.00001) + / 100.0; + let offensive_rating = max_equipped_weapon_damage(inventory).max(0.1); let combined_rating = (offensive_rating * offensive_weighting + defensive_rating * defensive_weighting) / (2.0 * offensive_weighting.max(defensive_weighting)); diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs index 98052806c9..5e80eea5ab 100644 --- a/common/src/comp/ability.rs +++ b/common/src/comp/ability.rs @@ -540,14 +540,11 @@ impl CharacterAbility { } else { 0 }; - { - *max_energy_gain = (*max_energy_gain as f32 - * ((energy_level + 1) * stage_data.len() as u16 - 1) as f32 - / ((Sword(TsRegen).get_max_level().unwrap() + 1) - * stage_data.len() as u16 - - 1) as f32) - as u32; - } + *max_energy_gain = (*max_energy_gain as f32 + * ((energy_level + 1) * stage_data.len() as u16 - 1) as f32 + / ((Sword(TsRegen).get_max_level().unwrap() + 1) + * stage_data.len() as u16 + - 1) as f32) as u32; *scales_from_combo = skills .get(&Sword(TsDamage)) .copied() @@ -641,14 +638,11 @@ impl CharacterAbility { } else { 0 }; - { - *max_energy_gain = (*max_energy_gain as f32 - * ((energy_level + 1) * stage_data.len() as u16 - 1) as f32 - / ((Axe(DsRegen).get_max_level().unwrap() + 1) - * stage_data.len() as u16 - - 1) as f32) - as u32; - } + *max_energy_gain = (*max_energy_gain as f32 + * ((energy_level + 1) * stage_data.len() as u16 - 1) as f32 + / ((Axe(DsRegen).get_max_level().unwrap() + 1) + * stage_data.len() as u16 + - 1) as f32) as u32; *scales_from_combo = skills .get(&Axe(DsDamage)) .copied() @@ -736,13 +730,11 @@ impl CharacterAbility { } else { 0 }; - { - *max_energy_gain = (*max_energy_gain as f32 - * ((energy_level + 1) * stage_data.len() as u16) as f32 - / ((Hammer(SsRegen).get_max_level().unwrap() + 1) - * stage_data.len() as u16) - as f32) as u32; - } + *max_energy_gain = (*max_energy_gain as f32 + * ((energy_level + 1) * stage_data.len() as u16) as f32 + / ((Hammer(SsRegen).get_max_level().unwrap() + 1) + * stage_data.len() as u16) as f32) + as u32; *scales_from_combo = skills .get(&Hammer(SsDamage)) .copied() @@ -814,16 +806,12 @@ impl CharacterAbility { if let Some(level) = skills.get(&Bow(ProjSpeed)).copied().flatten() { *projectile_speed *= 1.5_f32.powi(level.into()); } - { - let damage_level = - skills.get(&Bow(BDamage)).copied().flatten().unwrap_or(0); - let regen_level = - skills.get(&Bow(BRegen)).copied().flatten().unwrap_or(0); - let power = 1.3_f32.powi(damage_level.into()); - let regen = 1.5_f32.powi(regen_level.into()); - *projectile = - projectile.modified_projectile(power, regen, 1_f32, 1_f32); - } + let damage_level = + skills.get(&Bow(BDamage)).copied().flatten().unwrap_or(0); + let regen_level = skills.get(&Bow(BRegen)).copied().flatten().unwrap_or(0); + let power = 1.3_f32.powi(damage_level.into()); + let regen = 1.5_f32.powi(regen_level.into()); + *projectile = projectile.modified_projectile(power, regen, 1_f32, 1_f32); }, ChargedRanged { ref mut scaled_damage, @@ -898,19 +886,16 @@ impl CharacterAbility { if !skills.contains_key(&Staff(BExplosion)) { *projectile = projectile.fireball_to_firebolt(); } - { - let damage_level = - skills.get(&Staff(BDamage)).copied().flatten().unwrap_or(0); - let regen_level = - skills.get(&Staff(BRegen)).copied().flatten().unwrap_or(0); - let range_level = - skills.get(&Staff(BRadius)).copied().flatten().unwrap_or(0); - let power = 1.2_f32.powi(damage_level.into()); - let regen = 1.2_f32.powi(regen_level.into()); - let range = 1.1_f32.powi(range_level.into()); - *projectile = - projectile.modified_projectile(power, regen, range, 1_f32); - } + let damage_level = + skills.get(&Staff(BDamage)).copied().flatten().unwrap_or(0); + let regen_level = + skills.get(&Staff(BRegen)).copied().flatten().unwrap_or(0); + let range_level = + skills.get(&Staff(BRadius)).copied().flatten().unwrap_or(0); + let power = 1.2_f32.powi(damage_level.into()); + let regen = 1.2_f32.powi(regen_level.into()); + let range = 1.1_f32.powi(range_level.into()); + *projectile = projectile.modified_projectile(power, regen, range, 1_f32); }, BasicBeam { ref mut base_dps, @@ -1058,7 +1043,7 @@ impl CharacterAbility { } } }, - _ => {}, + Some(_) => {}, } self } diff --git a/common/src/comp/skills.rs b/common/src/comp/skills.rs index 79b67dbcd7..83bf045f0d 100644 --- a/common/src/comp/skills.rs +++ b/common/src/comp/skills.rs @@ -222,8 +222,18 @@ pub enum SkillGroupType { impl SkillGroupType { /// Gets the cost in experience of earning a skill point + #[allow(clippy::many_single_char_names)] pub fn skill_point_cost(self, level: u16) -> u16 { - 10 * (35.0 * (0.08 * level as f32 - 1.5).atan() + 50.0).floor() as u16 + let exp_increment = 10.0; + let starting_exp = 150.0; + let exp_ceiling = 1000.0; + let scaling_factor = 0.1; + let a = exp_increment; + let b = (exp_ceiling - starting_exp) / ((1.0 + std::f32::consts::PI / 2.0) * exp_increment); + let c = scaling_factor; + let d = (-1.0_f32).tan(); + let e = starting_exp / exp_increment + b; + (a * (b * (c * level as f32 + d).atan() + e).floor()) as u16 } /// Gets the total amount of skill points that can be spent in a particular diff --git a/common/src/skillset_builder.rs b/common/src/skillset_builder.rs index 5db4bbe7c2..c47e87d067 100644 --- a/common/src/skillset_builder.rs +++ b/common/src/skillset_builder.rs @@ -41,64 +41,67 @@ impl SkillSetBuilder { Some(Guard) => { if let Some(ToolKind::Sword) = active_item { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); - skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); - skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); - skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); - skillset.with_skill(Skill::Sword(SwordSkill::DSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::DInfinite)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DInfinite)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); } }, Some(Outcast) => { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::SCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SCost)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); }, _ => {}, } @@ -107,57 +110,60 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::SCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CMove)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RArrows)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CMove)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RArrows)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); - skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FRange)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); }, _ => {}, } @@ -166,65 +172,68 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); - skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); - skillset.with_skill(Skill::Axe(AxeSkill::LCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LCost)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LCost)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::BRegen)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CDrain)); - skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RGlide)); - skillset.with_skill(Skill::Bow(BowSkill::RCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BRegen)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDrain)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RGlide)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RCost)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FRange)); - skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); - skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::SRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SRange)); }, _ => {}, } @@ -233,71 +242,74 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); - skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); - skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); - skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); - skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); - skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); - skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CDrain)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RDamage)); - skillset.with_skill(Skill::Bow(BowSkill::RGlide)); - skillset.with_skill(Skill::Bow(BowSkill::RArrows)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDrain)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RGlide)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RArrows)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FRange)); - skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); - skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::SRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SRange)); }, _ => {}, } @@ -306,71 +318,74 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); - skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); - skillset.with_skill(Skill::Axe(AxeSkill::LCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CDrain)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RDamage)); - skillset.with_skill(Skill::Bow(BowSkill::RGlide)); - skillset.with_skill(Skill::Bow(BowSkill::RArrows)); - skillset.with_skill(Skill::Bow(BowSkill::RCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDrain)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RGlide)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RArrows)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RCost)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FRange)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); - skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); - skillset.with_skill(Skill::Staff(StaffSkill::SRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SRange)); }, _ => {}, } @@ -379,81 +394,84 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); - skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); - skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); - skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); - skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::BRegen)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CMove)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RDamage)); - skillset.with_skill(Skill::Bow(BowSkill::RGlide)); - skillset.with_skill(Skill::Bow(BowSkill::RArrows)); - skillset.with_skill(Skill::Bow(BowSkill::RCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BRegen)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CMove)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RGlide)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RArrows)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RCost)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); - skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); - skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); - skillset.with_skill(Skill::Staff(StaffSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SCost)); }, _ => {}, } @@ -462,104 +480,107 @@ impl SkillSetBuilder { match active_item { Some(ToolKind::Sword) => { // Sword - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); - skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); - skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); - skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::DCost)); - skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); - skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); - skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); - skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); - skillset.with_skill(Skill::Sword(SwordSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Sword)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsCombo)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsRegen)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::TsSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DCost)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DDrain)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::DScaling)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SUnlockSpin)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SDamage)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SSpins)); + skillset = skillset.with_skill(Skill::Sword(SwordSkill::SCost)); }, Some(ToolKind::Axe) => { // Axe - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); - skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); - skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); - skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); - skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); - skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); - skillset.with_skill(Skill::Axe(AxeSkill::SCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); - skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); - skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); - skillset.with_skill(Skill::Axe(AxeSkill::LCost)); - skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Axe)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsCombo)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::DsRegen)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SInfinite)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SHelicopter)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SSpeed)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::SCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDamage)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LCost)); + skillset = skillset.with_skill(Skill::Axe(AxeSkill::LDistance)); }, Some(ToolKind::Hammer) => { // Hammer - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); - skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); - skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); - skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); - skillset.with_skill(Skill::Hammer(HammerSkill::LCost)); - skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); - skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); - skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Hammer)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::SsRegen)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CDrain)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LUnlockLeap)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDamage)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LCost)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LDistance)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LKnockback)); + skillset = skillset.with_skill(Skill::Hammer(HammerSkill::LRange)); }, Some(ToolKind::Bow) => { // Bow - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); - skillset.with_skill(Skill::Bow(BowSkill::BDamage)); - skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::BRegen)); - skillset.with_skill(Skill::Bow(BowSkill::CDamage)); - skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); - skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CDrain)); - skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); - skillset.with_skill(Skill::Bow(BowSkill::CMove)); - skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); - skillset.with_skill(Skill::Bow(BowSkill::RDamage)); - skillset.with_skill(Skill::Bow(BowSkill::RGlide)); - skillset.with_skill(Skill::Bow(BowSkill::RArrows)); - skillset.with_skill(Skill::Bow(BowSkill::RCost)); + skillset = skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Bow)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::ProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::BRegen)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CKnockback)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CProjSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CDrain)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CSpeed)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::CMove)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::UnlockRepeater)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RDamage)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RGlide)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RArrows)); + skillset = skillset.with_skill(Skill::Bow(BowSkill::RCost)); }, Some(ToolKind::Staff) => { // Staff - skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); - skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); - skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); - skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); - skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::FRange)); - skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); - skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); - skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); - skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); - skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); - skillset.with_skill(Skill::Staff(StaffSkill::SRange)); - skillset.with_skill(Skill::Staff(StaffSkill::SCost)); + skillset = + skillset.with_skill_group(SkillGroupType::Weapon(ToolKind::Staff)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BExplosion)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRegen)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::BRadius)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FDrain)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::FVelocity)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::UnlockShockwave)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SDamage)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SKnockback)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SRange)); + skillset = skillset.with_skill(Skill::Staff(StaffSkill::SCost)); }, _ => {}, } }, - _ => {}, + Some(Villager) | None => {}, } skillset } - pub fn with_skill(&mut self, skill: Skill) { + pub fn with_skill(mut self, skill: Skill) -> Self { if let Some(skill_group) = skill.get_skill_group_type() { self.0 .add_skill_points(skill_group, self.0.skill_point_cost(skill)); @@ -571,11 +592,18 @@ impl SkillSetBuilder { skill ); } + } else { + warn!( + "Tried to add skill: {:?} which does not have an associated skill group.", + skill + ); } + self } - pub fn with_skill_group(&mut self, skill_group: SkillGroupType) { + pub fn with_skill_group(mut self, skill_group: SkillGroupType) -> Self { self.0.unlock_skill_group(skill_group); + self } pub fn build(self) -> SkillSet { self.0 } diff --git a/voxygen/src/hud/bag.rs b/voxygen/src/hud/bag.rs index 311017dfd5..6ad564e6b0 100644 --- a/voxygen/src/hud/bag.rs +++ b/voxygen/src/hud/bag.rs @@ -3,7 +3,9 @@ use super::{ item_imgs::ItemImgs, slots::{ArmorSlot, EquipSlot, InventorySlot, SlotManager}, util::loadout_slot_text, - Show, CRITICAL_HP_COLOR, LOW_HP_COLOR, QUALITY_COMMON, TEXT_COLOR, UI_HIGHLIGHT_0, UI_MAIN, + Show, CRITICAL_HP_COLOR, LOW_HP_COLOR, QUALITY_ARTIFACT, QUALITY_COMMON, QUALITY_DEBUG, + QUALITY_EPIC, QUALITY_HIGH, QUALITY_LEGENDARY, QUALITY_LOW, QUALITY_MODERATE, TEXT_COLOR, + UI_HIGHLIGHT_0, UI_MAIN, XP_COLOR, }; use crate::{ hud::get_quality_col, @@ -16,16 +18,17 @@ use crate::{ }; use client::Client; use common::{ - combat::Damage, - comp::{item::Quality, Stats}, + combat::{combat_rating, Damage}, + comp::{item::Quality, Energy, Health, Stats}, }; use conrod_core::{ color, widget::{self, Button, Image, Rectangle, Scrollbar, Text}, - widget_ids, Color, Colorable, Labelable, Positionable, Sizeable, Widget, WidgetCommon, + widget_ids, Color, Colorable, Positionable, Sizeable, Widget, WidgetCommon, }; use crate::hud::slots::SlotKind; +use inline_tweak::*; use vek::Vec2; widget_ids! { @@ -49,22 +52,11 @@ widget_ids! { inventory_title_bg, scrollbar_bg, scrollbar_slots, - stats_button, tab_1, tab_2, tab_3, tab_4, bag_expand_btn, - // Stats - stats_alignment, - level, - exp_rectangle, - exp_progress_rectangle, - expbar, - exp, - divider, - statnames, - stats, // Armor Slots slots_bg, head_slot, @@ -87,11 +79,9 @@ widget_ids! { bag2_slot, bag3_slot, bag4_slot, - // ??? - end_ico, - fit_ico, - wp_ico, - prot_ico, + // Stats + stat_icons[], + stat_txts[], } } @@ -108,8 +98,9 @@ pub struct Bag<'a> { slot_manager: &'a mut SlotManager, _pulse: f32, localized_strings: &'a Localization, - stats: &'a Stats, + health: &'a Health, + energy: &'a Energy, show: &'a Show, } @@ -126,6 +117,8 @@ impl<'a> Bag<'a> { pulse: f32, localized_strings: &'a Localization, stats: &'a Stats, + health: &'a Health, + energy: &'a Energy, show: &'a Show, ) -> Self { Self { @@ -140,10 +133,13 @@ impl<'a> Bag<'a> { _pulse: pulse, localized_strings, stats, + energy, + health, show, } } } +const STATS: [&str; 4] = ["Health", "Stamina", "Protection", "Combat Rating"]; pub struct State { ids: Ids, @@ -422,25 +418,103 @@ impl<'a> Widget for Bag<'a> { let i18n = &self.localized_strings; let filled_slot = self.imgs.armor_slot; if !self.show.bag_inv { - let damage_reduction = (100.0 * Damage::compute_damage_reduction(inventory)) as i32; - Button::image(self.imgs.protection_ico) + // Stat icons and text + state.update(|s| { + s.ids + .stat_icons + .resize(STATS.len(), &mut ui.widget_id_generator()) + }); + state.update(|s| { + s.ids + .stat_txts + .resize(STATS.len(), &mut ui.widget_id_generator()) + }); + // Thresholds (lower) + let common = tweak!(4.3); + let moderate = tweak!(6.0); + let high = tweak!(8.0); + let epic = tweak!(10.0); + let legendary = tweak!(79.0); + let artifact = tweak!(122.0); + let debug = tweak!(200.0); + // Stats + let combat_rating = + combat_rating(inventory, self.health, &self.stats.body_type).min(999.9); + let indicator_col = match combat_rating { + x if (0.0..common).contains(&x) => QUALITY_LOW, + x if (common..moderate).contains(&x) => QUALITY_COMMON, + x if (moderate..high).contains(&x) => QUALITY_MODERATE, + x if (high..epic).contains(&x) => QUALITY_HIGH, + x if (epic..legendary).contains(&x) => QUALITY_EPIC, + x if (legendary..artifact).contains(&x) => QUALITY_LEGENDARY, + x if (artifact..debug).contains(&x) => QUALITY_ARTIFACT, + x if x >= debug => QUALITY_DEBUG, + _ => XP_COLOR, + }; + for i in STATS.iter().copied().enumerate() { + let btn = Button::image(match i.1 { + "Health" => self.imgs.health_ico, + "Stamina" => self.imgs.stamina_ico, + "Combat Rating" => self.imgs.combat_rating_ico, + "Protection" => self.imgs.protection_ico, + _ => self.imgs.nothing, + }) .w_h(20.0, 20.0) - .top_left_with_margins_on(state.ids.bg_frame, 51.0, 5.0) - .color(UI_HIGHLIGHT_0) - .label(&format!("{}%", damage_reduction)) - .label_y(conrod_core::position::Relative::Scalar(2.0)) - .label_x(conrod_core::position::Relative::Scalar(25.0)) - .label_color(TEXT_COLOR) - .label_font_size(self.fonts.cyri.scale(12)) - .label_font_id(self.fonts.cyri.conrod_id) - .with_tooltip( + .image_color(if i.1 == "Combat Rating" { + indicator_col + } else { + TEXT_COLOR + }); + let protection_txt = format!( + "{}%", + (100.0 * Damage::compute_damage_reduction(inventory)) as i32 + ); + let health_txt = format!("{}", (self.health.maximum() as f32 / 10.0) as usize); + let stamina_txt = format!("{}", (self.energy.maximum() as f32 / 10.0) as usize); + let combat_rating_txt = format!("{}", (combat_rating * 10.0) as usize); + + let btn = if i.0 == 0 { + btn.top_left_with_margins_on(state.ids.bg_frame, tweak!(55.0), tweak!(10.0)) + } else { + btn.down_from(state.ids.stat_icons[i.0 - 1], tweak!(7.0)) + }; + // TODO: Translation + let tooltip_head = match i.1 { + "Health" => "Health", + "Stamina" => "Stamina", + "Combat Rating" => "Combat Rating", + "Protection" => "Protection", + _ => "", + }; + // TODO: Translation + let tooltip_txt = match i.1 { + "Combat Rating" => "Calculated from your\nequipment and health.", + "Protection" => "Damage reduction through armor", + _ => "", + }; + btn.with_tooltip( self.tooltip_manager, - "Protection", - "Damage reduction through armor", + &tooltip_head, + &tooltip_txt, &bag_tooltip, TEXT_COLOR, ) - .set(state.ids.prot_ico, ui); + .set(state.ids.stat_icons[i.0], ui); + Text::new(match i.1 { + "Health" => &health_txt, + "Stamina" => &stamina_txt, + "Combat Rating" => &combat_rating_txt, + "Protection" => &protection_txt, + _ => "", + }) + .right_from(state.ids.stat_icons[i.0], tweak!(10.0)) + .font_id(self.fonts.cyri.conrod_id) + .font_size(self.fonts.cyri.scale(tweak!(14))) + .color(TEXT_COLOR) + .graphics_for(state.ids.stat_icons[i.0]) + .set(state.ids.stat_txts[i.0], ui); + } + // Loadout Slots // Head let (title, desc) = loadout_slot_text( inventory.equipped(EquipSlot::Armor(ArmorSlot::Head)), diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs index 20d4b1effc..4f5e06cab9 100644 --- a/voxygen/src/hud/img_ids.rs +++ b/voxygen/src/hud/img_ids.rs @@ -334,10 +334,10 @@ image_ids! { mainhand_bg: "voxygen.element.icons.mainhand", bag_bg: "voxygen.element.icons.bag", offhand_bg: "voxygen.element.icons.offhand", - willpower_ico: "voxygen.element.icons.willpower", - endurance_ico: "voxygen.element.icons.endurance", - fitness_ico: "voxygen.element.icons.fitness", + stamina_ico: "voxygen.element.icons.stamina", + health_ico: "voxygen.element.icons.health", protection_ico: "voxygen.element.icons.protection", + combat_rating_ico: "voxygen.element.icons.combat_rating", not_found: "voxygen.element.not_found", diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 993604f49b..ff19ed84ed 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -1994,40 +1994,6 @@ impl Hud { } } - // Bag contents - if self.show.bag { - if let Some(player_stats) = stats.get(client.entity()) { - match Bag::new( - client, - &self.imgs, - &self.item_imgs, - &self.fonts, - &self.rot_imgs, - tooltip_manager, - &mut self.slot_manager, - self.pulse, - i18n, - &player_stats, - &self.show, - ) - .set(self.ids.bag, ui_widgets) - { - Some(bag::Event::BagExpand) => self.show.bag_inv = !self.show.bag_inv, - Some(bag::Event::Close) => { - self.show.stats = false; - self.show.bag(false); - self.show.crafting(false); - if !self.show.social { - self.show.want_grab = true; - self.force_ungrab = false; - } else { - self.force_ungrab = true - }; - }, - None => {}, - } - } - } // Skillbar // Get player stats let ecs = client.state().ecs(); @@ -2072,6 +2038,46 @@ impl Hud { ) .set(self.ids.skillbar, ui_widgets); } + // Bag contents + if self.show.bag { + if let (Some(player_stats), Some(health), Some(energy)) = ( + stats.get(client.entity()), + healths.get(entity), + energies.get(entity), + ) { + match Bag::new( + client, + &self.imgs, + &self.item_imgs, + &self.fonts, + &self.rot_imgs, + tooltip_manager, + &mut self.slot_manager, + self.pulse, + i18n, + &player_stats, + &health, + &energy, + &self.show, + ) + .set(self.ids.bag, ui_widgets) + { + Some(bag::Event::BagExpand) => self.show.bag_inv = !self.show.bag_inv, + Some(bag::Event::Close) => { + self.show.stats = false; + self.show.bag(false); + self.show.crafting(false); + if !self.show.social { + self.show.want_grab = true; + self.force_ungrab = false; + } else { + self.force_ungrab = true + }; + }, + None => {}, + } + } + } // Buffs let ecs = client.state().ecs(); let entity = client.entity(); diff --git a/voxygen/src/hud/overhead.rs b/voxygen/src/hud/overhead.rs index 4a30687a21..54c69600e7 100644 --- a/voxygen/src/hud/overhead.rs +++ b/voxygen/src/hud/overhead.rs @@ -380,8 +380,8 @@ impl<'a> Widget for Overhead<'a> { // Thresholds (lower) let common = tweak!(4.3); let moderate = tweak!(6.0); - let high = tweak!(10.8); - let epic = tweak!(14.1); + let high = tweak!(8.0); + let epic = tweak!(10.0); let legendary = tweak!(79.0); let artifact = tweak!(122.0); let debug = tweak!(200.0);