2021-01-07 19:47:29 +00:00
|
|
|
use crate::comp::{
|
2021-01-08 20:53:52 +00:00
|
|
|
item::{tool::ToolKind, Item, ItemKind},
|
|
|
|
skills::{
|
|
|
|
AxeSkill, BowSkill, HammerSkill, Skill, SkillGroupType, SkillSet, StaffSkill, SwordSkill,
|
|
|
|
},
|
2021-01-07 19:47:29 +00:00
|
|
|
};
|
|
|
|
use tracing::warn;
|
|
|
|
|
|
|
|
#[derive(Copy, Clone)]
|
|
|
|
pub enum SkillSetConfig {
|
|
|
|
Guard,
|
|
|
|
Villager,
|
|
|
|
Outcast,
|
|
|
|
Highwayman,
|
|
|
|
Bandit,
|
|
|
|
CultistNovice,
|
|
|
|
CultistAcolyte,
|
|
|
|
Warlord,
|
|
|
|
Warlock,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub struct SkillSetBuilder(SkillSet);
|
|
|
|
|
|
|
|
impl Default for SkillSetBuilder {
|
|
|
|
fn default() -> Self { Self(SkillSet::default()) }
|
|
|
|
}
|
|
|
|
|
|
|
|
impl SkillSetBuilder {
|
2021-01-08 20:53:52 +00:00
|
|
|
pub fn build_skillset(main_tool: &Option<Item>, config: Option<SkillSetConfig>) -> Self {
|
2021-01-07 19:47:29 +00:00
|
|
|
let mut skillset = Self::default();
|
2021-01-08 20:53:52 +00:00
|
|
|
let active_item = main_tool.as_ref().and_then(|ic| {
|
|
|
|
if let ItemKind::Tool(tool) = &ic.kind() {
|
|
|
|
Some(tool.kind)
|
|
|
|
} else {
|
|
|
|
None
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2021-01-07 19:47:29 +00:00
|
|
|
use SkillSetConfig::*;
|
|
|
|
match config {
|
2021-01-08 20:53:52 +00:00
|
|
|
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));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
_ => {},
|
|
|
|
}
|
|
|
|
},
|
|
|
|
Some(Highwayman) => {
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
_ => {},
|
|
|
|
}
|
|
|
|
},
|
|
|
|
Some(Bandit) => {
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
_ => {},
|
|
|
|
}
|
|
|
|
},
|
|
|
|
Some(CultistNovice) => {
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
_ => {},
|
|
|
|
}
|
|
|
|
},
|
|
|
|
Some(CultistAcolyte) => {
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
_ => {},
|
|
|
|
}
|
|
|
|
},
|
|
|
|
Some(Warlord) => {
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
_ => {},
|
|
|
|
}
|
|
|
|
},
|
|
|
|
Some(Warlock) => {
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
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));
|
|
|
|
},
|
|
|
|
_ => {},
|
|
|
|
}
|
2021-01-07 19:47:29 +00:00
|
|
|
},
|
|
|
|
_ => {},
|
|
|
|
}
|
2021-01-08 20:53:52 +00:00
|
|
|
|
2021-01-07 19:47:29 +00:00
|
|
|
skillset
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn with_skill(&mut self, skill: Skill) {
|
|
|
|
if let Some(skill_group) = skill.get_skill_group_type() {
|
|
|
|
self.0
|
|
|
|
.add_skill_points(skill_group, self.0.skill_point_cost(skill));
|
|
|
|
self.0.unlock_skill(skill);
|
|
|
|
if !self.0.skills.contains_key(&skill) {
|
|
|
|
warn!(
|
2021-01-08 20:53:52 +00:00
|
|
|
"Failed to add skill: {:?}. Verify that it has the appropriate skill group \
|
|
|
|
available and meets all prerequisite skills.",
|
|
|
|
skill
|
2021-01-07 19:47:29 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn with_skill_group(&mut self, skill_group: SkillGroupType) {
|
|
|
|
self.0.unlock_skill_group(skill_group);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn build(self) -> SkillSet { self.0 }
|
|
|
|
}
|