From a32c14a78ba5b0ca8a85e89ca4e5c2895dbf1525 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 12 Feb 2021 15:32:08 -0500 Subject: [PATCH] Check for prerequisite skill in using an ability is no longer hardcoded. --- .../abilities/weapon_ability_manifest.ron | 18 +++---- common/src/comp/inventory/item/mod.rs | 3 +- common/src/comp/inventory/item/tool.rs | 8 +-- common/src/states/utils.rs | 52 ++----------------- voxygen/src/hud/hotbar.rs | 46 +++------------- voxygen/src/hud/slots.rs | 2 +- 6 files changed, 29 insertions(+), 100 deletions(-) diff --git a/assets/common/abilities/weapon_ability_manifest.ron b/assets/common/abilities/weapon_ability_manifest.ron index bf0d1dc533..66c39105f2 100644 --- a/assets/common/abilities/weapon_ability_manifest.ron +++ b/assets/common/abilities/weapon_ability_manifest.ron @@ -5,35 +5,35 @@ primary: "common.abilities.sword.triplestrike", secondary: "common.abilities.sword.dash", skills: [ - "common.abilities.sword.spin", + (Some(Sword(UnlockSpin)), "common.abilities.sword.spin"), ], ), Axe: ( primary: "common.abilities.axe.doublestrike", secondary: "common.abilities.axe.spin", skills: [ - "common.abilities.axe.leap", + (Some(Axe(UnlockLeap)), "common.abilities.axe.leap"), ], ), Hammer: ( primary: "common.abilities.hammer.singlestrike", secondary: "common.abilities.hammer.charged", skills: [ - "common.abilities.hammer.leap", + (Some(Hammer(UnlockLeap)), "common.abilities.hammer.leap"), ], ), Bow: ( primary: "common.abilities.bow.basic", secondary: "common.abilities.bow.charged", skills: [ - "common.abilities.bow.repeater", + (Some(Bow(UnlockRepeater)), "common.abilities.bow.repeater"), ], ), Staff: ( primary: "common.abilities.staff.firebomb", secondary: "common.abilities.staff.flamethrower", skills: [ - "common.abilities.staff.fireshockwave", + (Some(Staff(UnlockShockwave)), "common.abilities.staff.fireshockwave"), ], ), Sceptre: ( @@ -55,7 +55,7 @@ primary: "common.abilities.unique.stonegolemfist.basic", secondary: "common.abilities.unique.stonegolemfist.shockwave", skills: [ - "common.abilities.unique.stonegolemfist.spin", + (None, "common.abilities.unique.stonegolemfist.spin"), ], ), Unique(BeastClaws): ( @@ -72,7 +72,7 @@ primary: "common.abilities.unique.quadmedjump.leap", secondary: "common.abilities.unique.quadmedjump.doublestrike", skills: [ - "common.abilities.unique.quadmedjump.quickleap" + (None, "common.abilities.unique.quadmedjump.quickleap"), ], ), Unique(QuadMedCharge): ( @@ -99,7 +99,7 @@ primary: "common.abilities.unique.quadlowbreathe.flamethrower", secondary: "common.abilities.unique.quadlowbreathe.triplestrike", skills: [ - "common.abilities.unique.quadlowbreathe.dash", + (None, "common.abilities.unique.quadlowbreathe.dash"), ], ), Unique(QuadLowTail): ( @@ -136,7 +136,7 @@ primary: "common.abilities.debug.forwardboost", secondary: "common.abilities.debug.upboost", skills: [ - "common.abilities.debug.possess", + (None, "common.abilities.debug.possess"), ], ), Farming: ( diff --git a/common/src/comp/inventory/item/mod.rs b/common/src/comp/inventory/item/mod.rs index dfd0413a08..28c2725266 100644 --- a/common/src/comp/inventory/item/mod.rs +++ b/common/src/comp/inventory/item/mod.rs @@ -8,6 +8,7 @@ use crate::{ assets::{self, AssetExt, Error}, comp::{ inventory::{item::tool::AbilityMap, InvSlot}, + skills::Skill, Body, CharacterAbility, }, effect::Effect, @@ -187,7 +188,7 @@ impl PartialEq for ItemDef { pub struct ItemConfig { pub ability1: Option, pub ability2: Option, - pub ability3: Option, + pub ability3: Option<(Option, CharacterAbility)>, pub block_ability: Option, pub dodge_ability: Option, } diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs index e402453d9a..f7d1809bd8 100644 --- a/common/src/comp/inventory/item/tool.rs +++ b/common/src/comp/inventory/item/tool.rs @@ -3,7 +3,7 @@ use crate::{ assets::{self, Asset}, - comp::CharacterAbility, + comp::{skills::Skill, CharacterAbility}, }; use hashbrown::HashMap; use serde::{Deserialize, Serialize}; @@ -113,7 +113,7 @@ impl Tool { pub struct AbilitySet { pub primary: T, pub secondary: T, - pub skills: Vec, + pub skills: Vec<(Option, T)>, } impl AbilitySet { @@ -133,7 +133,7 @@ impl AbilitySet { AbilitySet { primary: f(self.primary), secondary: f(self.secondary), - skills: self.skills.into_iter().map(|x| f(x)).collect(), + skills: self.skills.into_iter().map(|(s, x)| (s, f(x))).collect(), } } @@ -141,7 +141,7 @@ impl AbilitySet { AbilitySet { primary: f(&self.primary), secondary: f(&self.secondary), - skills: self.skills.iter().map(|x| f(x)).collect(), + skills: self.skills.iter().map(|(s, x)| (*s, f(x))).collect(), } } } diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 0f3c8c5592..8c8ab7b223 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -1,10 +1,8 @@ use crate::{ comp::{ inventory::slot::EquipSlot, - item::{Hands, ItemKind, Tool, ToolKind}, - quadruped_low, quadruped_medium, - skills::{AxeSkill, BowSkill, HammerSkill, Skill, StaffSkill, SwordSkill}, - theropod, Body, CharacterState, LoadoutManip, StateUpdate, + item::{Hands, ItemKind, Tool}, + quadruped_low, quadruped_medium, theropod, Body, CharacterState, LoadoutManip, StateUpdate, }, consts::{FRIC_GROUND, GRAVITY}, event::{LocalEvent, ServerEvent}, @@ -497,49 +495,9 @@ pub fn handle_ability3_input(data: &JoinData, update: &mut StateUpdate) { i.item_config_expect() .ability3 .as_ref() - .and_then(|s| match tool { - // TODO: Make this so abilities aren't hardcoded to ability3 - Some(ToolKind::Sword) - if !&data - .stats - .skill_set - .has_skill(Skill::Sword(SwordSkill::UnlockSpin)) => - { - None - }, - Some(ToolKind::Axe) - if !&data - .stats - .skill_set - .has_skill(Skill::Axe(AxeSkill::UnlockLeap)) => - { - None - }, - Some(ToolKind::Hammer) - if !&data - .stats - .skill_set - .has_skill(Skill::Hammer(HammerSkill::UnlockLeap)) => - { - None - }, - Some(ToolKind::Bow) - if !&data - .stats - .skill_set - .has_skill(Skill::Bow(BowSkill::UnlockRepeater)) => - { - None - }, - Some(ToolKind::Staff) - if !&data - .stats - .skill_set - .has_skill(Skill::Staff(StaffSkill::UnlockShockwave)) => - { - None - }, - _ => Some(s), + .and_then(|(s, a)| { + s.map_or(true, |s| data.stats.skill_set.has_skill(s)) + .then_some(a) }) .map(|a| a.clone().adjusted_by_skills(&data.stats.skill_set, tool)) }) diff --git a/voxygen/src/hud/hotbar.rs b/voxygen/src/hud/hotbar.rs index a334cb9c2e..9673e759b9 100644 --- a/voxygen/src/hud/hotbar.rs +++ b/voxygen/src/hud/hotbar.rs @@ -74,44 +74,14 @@ impl State { let stats = client.state().ecs().read_storage::(); let stat = stats.get(client.entity()); let should_be_present = if let (Some(inventory), Some(stat)) = (inventory, stat) { - inventory - .equipped(EquipSlot::Mainhand) - .map(|i| i.kind()) - .filter(|kind| { - use common::comp::{ - item::{ - tool::{ToolKind, UniqueKind}, - ItemKind, - }, - skills::{self, Skill}, - }; - if let ItemKind::Tool(tool) = kind { - match tool.kind { - ToolKind::Sword => stat - .skill_set - .has_skill(Skill::Sword(skills::SwordSkill::UnlockSpin)), - ToolKind::Axe => stat - .skill_set - .has_skill(Skill::Axe(skills::AxeSkill::UnlockLeap)), - ToolKind::Hammer => stat - .skill_set - .has_skill(Skill::Hammer(skills::HammerSkill::UnlockLeap)), - ToolKind::Bow => stat - .skill_set - .has_skill(Skill::Bow(skills::BowSkill::UnlockRepeater)), - ToolKind::Staff => stat - .skill_set - .has_skill(Skill::Staff(skills::StaffSkill::UnlockShockwave)), - ToolKind::Debug - | ToolKind::Unique(UniqueKind::QuadMedQuick) - | ToolKind::Unique(UniqueKind::QuadLowBreathe) => true, - _ => false, - } - } else { - false - } - }) - .is_some() + inventory.equipped(EquipSlot::Mainhand).map_or(false, |i| { + i.item_config_expect() + .ability3 + .as_ref() + .map_or(false, |(s, _)| { + s.map_or(true, |s| stat.skill_set.has_skill(s)) + }) + }) } else { false }; diff --git a/voxygen/src/hud/slots.rs b/voxygen/src/hud/slots.rs index 305c5def4e..decfa23223 100644 --- a/voxygen/src/hud/slots.rs +++ b/voxygen/src/hud/slots.rs @@ -136,7 +136,7 @@ impl<'a> SlotKey, HotbarImageSource<'a>> for HotbarSlot { ( i, if let Some(skill) = tool.get_abilities(ability_map).skills.get(0) { - if energy.current() >= skill.get_energy_cost() { + if energy.current() >= skill.1.get_energy_cost() { Some(Color::Rgba(1.0, 1.0, 1.0, 1.0)) } else { Some(Color::Rgba(0.3, 0.3, 0.3, 0.8))