mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Check for prerequisite skill in using an ability is no longer hardcoded.
This commit is contained in:
@ -5,35 +5,35 @@
|
|||||||
primary: "common.abilities.sword.triplestrike",
|
primary: "common.abilities.sword.triplestrike",
|
||||||
secondary: "common.abilities.sword.dash",
|
secondary: "common.abilities.sword.dash",
|
||||||
skills: [
|
skills: [
|
||||||
"common.abilities.sword.spin",
|
(Some(Sword(UnlockSpin)), "common.abilities.sword.spin"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Axe: (
|
Axe: (
|
||||||
primary: "common.abilities.axe.doublestrike",
|
primary: "common.abilities.axe.doublestrike",
|
||||||
secondary: "common.abilities.axe.spin",
|
secondary: "common.abilities.axe.spin",
|
||||||
skills: [
|
skills: [
|
||||||
"common.abilities.axe.leap",
|
(Some(Axe(UnlockLeap)), "common.abilities.axe.leap"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Hammer: (
|
Hammer: (
|
||||||
primary: "common.abilities.hammer.singlestrike",
|
primary: "common.abilities.hammer.singlestrike",
|
||||||
secondary: "common.abilities.hammer.charged",
|
secondary: "common.abilities.hammer.charged",
|
||||||
skills: [
|
skills: [
|
||||||
"common.abilities.hammer.leap",
|
(Some(Hammer(UnlockLeap)), "common.abilities.hammer.leap"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Bow: (
|
Bow: (
|
||||||
primary: "common.abilities.bow.basic",
|
primary: "common.abilities.bow.basic",
|
||||||
secondary: "common.abilities.bow.charged",
|
secondary: "common.abilities.bow.charged",
|
||||||
skills: [
|
skills: [
|
||||||
"common.abilities.bow.repeater",
|
(Some(Bow(UnlockRepeater)), "common.abilities.bow.repeater"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Staff: (
|
Staff: (
|
||||||
primary: "common.abilities.staff.firebomb",
|
primary: "common.abilities.staff.firebomb",
|
||||||
secondary: "common.abilities.staff.flamethrower",
|
secondary: "common.abilities.staff.flamethrower",
|
||||||
skills: [
|
skills: [
|
||||||
"common.abilities.staff.fireshockwave",
|
(Some(Staff(UnlockShockwave)), "common.abilities.staff.fireshockwave"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Sceptre: (
|
Sceptre: (
|
||||||
@ -55,7 +55,7 @@
|
|||||||
primary: "common.abilities.unique.stonegolemfist.basic",
|
primary: "common.abilities.unique.stonegolemfist.basic",
|
||||||
secondary: "common.abilities.unique.stonegolemfist.shockwave",
|
secondary: "common.abilities.unique.stonegolemfist.shockwave",
|
||||||
skills: [
|
skills: [
|
||||||
"common.abilities.unique.stonegolemfist.spin",
|
(None, "common.abilities.unique.stonegolemfist.spin"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Unique(BeastClaws): (
|
Unique(BeastClaws): (
|
||||||
@ -72,7 +72,7 @@
|
|||||||
primary: "common.abilities.unique.quadmedjump.leap",
|
primary: "common.abilities.unique.quadmedjump.leap",
|
||||||
secondary: "common.abilities.unique.quadmedjump.doublestrike",
|
secondary: "common.abilities.unique.quadmedjump.doublestrike",
|
||||||
skills: [
|
skills: [
|
||||||
"common.abilities.unique.quadmedjump.quickleap"
|
(None, "common.abilities.unique.quadmedjump.quickleap"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Unique(QuadMedCharge): (
|
Unique(QuadMedCharge): (
|
||||||
@ -99,7 +99,7 @@
|
|||||||
primary: "common.abilities.unique.quadlowbreathe.flamethrower",
|
primary: "common.abilities.unique.quadlowbreathe.flamethrower",
|
||||||
secondary: "common.abilities.unique.quadlowbreathe.triplestrike",
|
secondary: "common.abilities.unique.quadlowbreathe.triplestrike",
|
||||||
skills: [
|
skills: [
|
||||||
"common.abilities.unique.quadlowbreathe.dash",
|
(None, "common.abilities.unique.quadlowbreathe.dash"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Unique(QuadLowTail): (
|
Unique(QuadLowTail): (
|
||||||
@ -136,7 +136,7 @@
|
|||||||
primary: "common.abilities.debug.forwardboost",
|
primary: "common.abilities.debug.forwardboost",
|
||||||
secondary: "common.abilities.debug.upboost",
|
secondary: "common.abilities.debug.upboost",
|
||||||
skills: [
|
skills: [
|
||||||
"common.abilities.debug.possess",
|
(None, "common.abilities.debug.possess"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Farming: (
|
Farming: (
|
||||||
|
@ -8,6 +8,7 @@ use crate::{
|
|||||||
assets::{self, AssetExt, Error},
|
assets::{self, AssetExt, Error},
|
||||||
comp::{
|
comp::{
|
||||||
inventory::{item::tool::AbilityMap, InvSlot},
|
inventory::{item::tool::AbilityMap, InvSlot},
|
||||||
|
skills::Skill,
|
||||||
Body, CharacterAbility,
|
Body, CharacterAbility,
|
||||||
},
|
},
|
||||||
effect::Effect,
|
effect::Effect,
|
||||||
@ -187,7 +188,7 @@ impl PartialEq for ItemDef {
|
|||||||
pub struct ItemConfig {
|
pub struct ItemConfig {
|
||||||
pub ability1: Option<CharacterAbility>,
|
pub ability1: Option<CharacterAbility>,
|
||||||
pub ability2: Option<CharacterAbility>,
|
pub ability2: Option<CharacterAbility>,
|
||||||
pub ability3: Option<CharacterAbility>,
|
pub ability3: Option<(Option<Skill>, CharacterAbility)>,
|
||||||
pub block_ability: Option<CharacterAbility>,
|
pub block_ability: Option<CharacterAbility>,
|
||||||
pub dodge_ability: Option<CharacterAbility>,
|
pub dodge_ability: Option<CharacterAbility>,
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
assets::{self, Asset},
|
assets::{self, Asset},
|
||||||
comp::CharacterAbility,
|
comp::{skills::Skill, CharacterAbility},
|
||||||
};
|
};
|
||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -113,7 +113,7 @@ impl Tool {
|
|||||||
pub struct AbilitySet<T> {
|
pub struct AbilitySet<T> {
|
||||||
pub primary: T,
|
pub primary: T,
|
||||||
pub secondary: T,
|
pub secondary: T,
|
||||||
pub skills: Vec<T>,
|
pub skills: Vec<(Option<Skill>, T)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AbilitySet<CharacterAbility> {
|
impl AbilitySet<CharacterAbility> {
|
||||||
@ -133,7 +133,7 @@ impl<T> AbilitySet<T> {
|
|||||||
AbilitySet {
|
AbilitySet {
|
||||||
primary: f(self.primary),
|
primary: f(self.primary),
|
||||||
secondary: f(self.secondary),
|
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<T> AbilitySet<T> {
|
|||||||
AbilitySet {
|
AbilitySet {
|
||||||
primary: f(&self.primary),
|
primary: f(&self.primary),
|
||||||
secondary: f(&self.secondary),
|
secondary: f(&self.secondary),
|
||||||
skills: self.skills.iter().map(|x| f(x)).collect(),
|
skills: self.skills.iter().map(|(s, x)| (*s, f(x))).collect(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
comp::{
|
comp::{
|
||||||
inventory::slot::EquipSlot,
|
inventory::slot::EquipSlot,
|
||||||
item::{Hands, ItemKind, Tool, ToolKind},
|
item::{Hands, ItemKind, Tool},
|
||||||
quadruped_low, quadruped_medium,
|
quadruped_low, quadruped_medium, theropod, Body, CharacterState, LoadoutManip, StateUpdate,
|
||||||
skills::{AxeSkill, BowSkill, HammerSkill, Skill, StaffSkill, SwordSkill},
|
|
||||||
theropod, Body, CharacterState, LoadoutManip, StateUpdate,
|
|
||||||
},
|
},
|
||||||
consts::{FRIC_GROUND, GRAVITY},
|
consts::{FRIC_GROUND, GRAVITY},
|
||||||
event::{LocalEvent, ServerEvent},
|
event::{LocalEvent, ServerEvent},
|
||||||
@ -497,49 +495,9 @@ pub fn handle_ability3_input(data: &JoinData, update: &mut StateUpdate) {
|
|||||||
i.item_config_expect()
|
i.item_config_expect()
|
||||||
.ability3
|
.ability3
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|s| match tool {
|
.and_then(|(s, a)| {
|
||||||
// TODO: Make this so abilities aren't hardcoded to ability3
|
s.map_or(true, |s| data.stats.skill_set.has_skill(s))
|
||||||
Some(ToolKind::Sword)
|
.then_some(a)
|
||||||
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),
|
|
||||||
})
|
})
|
||||||
.map(|a| a.clone().adjusted_by_skills(&data.stats.skill_set, tool))
|
.map(|a| a.clone().adjusted_by_skills(&data.stats.skill_set, tool))
|
||||||
})
|
})
|
||||||
|
@ -74,44 +74,14 @@ impl State {
|
|||||||
let stats = client.state().ecs().read_storage::<common::comp::Stats>();
|
let stats = client.state().ecs().read_storage::<common::comp::Stats>();
|
||||||
let stat = stats.get(client.entity());
|
let stat = stats.get(client.entity());
|
||||||
let should_be_present = if let (Some(inventory), Some(stat)) = (inventory, stat) {
|
let should_be_present = if let (Some(inventory), Some(stat)) = (inventory, stat) {
|
||||||
inventory
|
inventory.equipped(EquipSlot::Mainhand).map_or(false, |i| {
|
||||||
.equipped(EquipSlot::Mainhand)
|
i.item_config_expect()
|
||||||
.map(|i| i.kind())
|
.ability3
|
||||||
.filter(|kind| {
|
.as_ref()
|
||||||
use common::comp::{
|
.map_or(false, |(s, _)| {
|
||||||
item::{
|
s.map_or(true, |s| stat.skill_set.has_skill(s))
|
||||||
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()
|
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
};
|
};
|
||||||
|
@ -136,7 +136,7 @@ impl<'a> SlotKey<HotbarSource<'a>, HotbarImageSource<'a>> for HotbarSlot {
|
|||||||
(
|
(
|
||||||
i,
|
i,
|
||||||
if let Some(skill) = tool.get_abilities(ability_map).skills.get(0) {
|
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))
|
Some(Color::Rgba(1.0, 1.0, 1.0, 1.0))
|
||||||
} else {
|
} else {
|
||||||
Some(Color::Rgba(0.3, 0.3, 0.3, 0.8))
|
Some(Color::Rgba(0.3, 0.3, 0.3, 0.8))
|
||||||
|
Reference in New Issue
Block a user