quick skill rework
This commit is contained in:
parent
6bacdb9181
commit
0d833f9b7d
@ -128,7 +128,7 @@ module.exports = {
|
||||
|
||||
// 'Paralyse',
|
||||
|
||||
'Strangle', // physical dot and disable
|
||||
// 'Strangle', // physical dot and disable
|
||||
|
||||
'Stun',
|
||||
'Throw',
|
||||
@ -151,10 +151,9 @@ module.exports = {
|
||||
'Heal',
|
||||
'Triage', // hot
|
||||
// 'TriageTick',
|
||||
'Throw', // no dmg stun', adds vulnerable
|
||||
'Charm',
|
||||
'Calm',
|
||||
'Rez',
|
||||
// 'Charm',
|
||||
// 'Calm',
|
||||
// 'Rez',
|
||||
|
||||
// -------------------
|
||||
// Destruction
|
||||
@ -166,17 +165,17 @@ module.exports = {
|
||||
'Drain',
|
||||
// 'DrainTick',
|
||||
'Curse',
|
||||
'Plague', // aoe dot
|
||||
'Ruin', // aoe
|
||||
// 'Plague', // aoe dot
|
||||
// 'Ruin', // aoe
|
||||
|
||||
// -----------------
|
||||
// Purity
|
||||
// -----------------
|
||||
'Empower',
|
||||
'Slay',
|
||||
// 'Slay',
|
||||
'Shield',
|
||||
'Silence',
|
||||
'Inquiry',
|
||||
// 'Inquiry',
|
||||
'Purify',
|
||||
'Purge',
|
||||
// '// Precision',
|
||||
@ -184,11 +183,11 @@ module.exports = {
|
||||
// -----------------
|
||||
// Chaos
|
||||
// -----------------
|
||||
'Banish',
|
||||
'Hex',
|
||||
'Fear',
|
||||
'Taunt',
|
||||
'Pause', // speed slow
|
||||
'Banish', // disables everything, incoming and outgoing
|
||||
'Hex', // stun but as a spell
|
||||
// 'Fear',
|
||||
// 'Taunt',
|
||||
// 'Pause', // speed slow
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
@ -9,28 +9,34 @@ broken skills
|
||||
parry
|
||||
strangle
|
||||
|
||||
|
||||
## NOW
|
||||
* pve granted stat reroll items
|
||||
|
||||
|
||||
## SOON
|
||||
* tutorial
|
||||
|
||||
* handle unserializable cryps
|
||||
|
||||
* chat
|
||||
|
||||
* notifications
|
||||
|
||||
* cryp speed
|
||||
* modifies skill base speed
|
||||
|
||||
* rejoin in progress games
|
||||
* lock account to 1 open game at a time
|
||||
|
||||
* skills
|
||||
* handle setting account better maybe?
|
||||
* calculate
|
||||
* hp increase/decrease
|
||||
* private fields for opponents
|
||||
* handle unserializable cryps
|
||||
|
||||
## LATER
|
||||
* chat
|
||||
* notifications
|
||||
* rejoin in progress games
|
||||
* lock account to 1 open game at a time
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* Items
|
||||
* pve granted stat reroll items
|
||||
* Colour scheme
|
||||
|
||||
# Db maintenance
|
||||
|
||||
@ -9,7 +9,7 @@ use failure::err_msg;
|
||||
|
||||
use account::Account;
|
||||
use rpc::{CrypSpawnParams, CrypLearnParams, CrypForgetParams};
|
||||
use skill::{Skill, Cooldown, Effect, Cast, Immunity, Disable};
|
||||
use skill::{Skill, Cooldown, Effect, Cast, Category, Immunity, Disable};
|
||||
use game::{Log};
|
||||
|
||||
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
|
||||
@ -298,23 +298,24 @@ impl Cryp {
|
||||
// Stats
|
||||
pub fn phys_dmg(&self) -> u64 {
|
||||
let phys_dmg_mods = self.effects.iter()
|
||||
.filter(|e| e.effect.category() == Category::PhysBuff)
|
||||
.filter(|e| e.effect.modifications().contains(&Stat::PhysDmg))
|
||||
.map(|cryp_effect| cryp_effect.effect)
|
||||
.collect::<Vec<Effect>>();
|
||||
// println!("{:?} phys_dmg mods : {:?}", self.name, phys_dmg_mods);
|
||||
|
||||
let modified_phys_dmg = phys_dmg_mods.iter().fold(self.phys_dmg.base, |acc, m| m.apply(acc));
|
||||
// println!("{:?} phys_dmg : {:?}", self.name, modified_phys_dmg);
|
||||
|
||||
return modified_phys_dmg;
|
||||
}
|
||||
|
||||
pub fn spell_dmg(&self) -> u64 {
|
||||
let spell_dmg_mods = self.effects.iter()
|
||||
.filter(|e| e.effect.category() == Category::SpellBuff)
|
||||
.filter(|e| e.effect.modifications().contains(&Stat::SpellDmg))
|
||||
.map(|cryp_effect| cryp_effect.effect)
|
||||
.collect::<Vec<Effect>>();
|
||||
// println!("{:?} spell_dmg mods : {:?}", self.name, spell_dmg_mods);
|
||||
|
||||
let modified_spell_dmg = spell_dmg_mods.iter().fold(self.spell_dmg.base, |acc, m| m.apply(acc));
|
||||
// println!("{:?} spell_dmg : {:?}", self.name, modified_spell_dmg);
|
||||
return modified_spell_dmg;
|
||||
}
|
||||
|
||||
@ -342,14 +343,31 @@ impl Cryp {
|
||||
}
|
||||
|
||||
pub fn deal_phys_dmg(&mut self, amount: u64) -> (u64, u64) {
|
||||
self.hp.reduce(amount);
|
||||
// println!("{:?} dealt {:?} phys dmg", self.name, amount);
|
||||
return (amount, 0);
|
||||
let phys_dmg_mods = self.effects.iter()
|
||||
.filter(|e| e.effect.category() == Category::PhysDebuff)
|
||||
.filter(|e| e.effect.modifications().contains(&Stat::PhysDmg))
|
||||
.map(|cryp_effect| cryp_effect.effect)
|
||||
.collect::<Vec<Effect>>();
|
||||
|
||||
let modified_phys_dmg = phys_dmg_mods.iter().fold(amount, |acc, m| m.apply(acc));
|
||||
|
||||
self.hp.reduce(modified_phys_dmg);
|
||||
|
||||
return (modified_phys_dmg, 0);
|
||||
}
|
||||
|
||||
pub fn deal_spell_dmg(&mut self, amount: u64) -> (u64, u64) {
|
||||
self.hp.reduce(amount);
|
||||
return (amount, 0);
|
||||
let spell_dmg_mods = self.effects.iter()
|
||||
.filter(|e| e.effect.category() == Category::SpellDebuff)
|
||||
.filter(|e| e.effect.modifications().contains(&Stat::SpellDmg))
|
||||
.map(|cryp_effect| cryp_effect.effect)
|
||||
.collect::<Vec<Effect>>();
|
||||
|
||||
let modified_spell_dmg = spell_dmg_mods.iter().fold(amount, |acc, m| m.apply(acc));
|
||||
|
||||
self.hp.reduce(modified_spell_dmg);
|
||||
|
||||
return (modified_spell_dmg, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -888,6 +888,7 @@ mod tests {
|
||||
.learn(Skill::TestStun)
|
||||
.learn(Skill::TestTouch)
|
||||
.learn(Skill::TestBlock)
|
||||
.learn(Skill::TestParry)
|
||||
.learn(Skill::TestDrain)
|
||||
.learn(Skill::Empower)
|
||||
.learn(Skill::Block)
|
||||
@ -899,6 +900,7 @@ mod tests {
|
||||
.learn(Skill::TestStun)
|
||||
.learn(Skill::TestTouch)
|
||||
.learn(Skill::TestBlock)
|
||||
.learn(Skill::TestParry)
|
||||
.learn(Skill::TestDrain)
|
||||
.learn(Skill::Empower)
|
||||
.learn(Skill::Block)
|
||||
@ -1117,7 +1119,7 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn block_test() {
|
||||
fn parry_test() {
|
||||
let mut game = create_test_game();
|
||||
|
||||
let x_team = game.teams[0].clone();
|
||||
@ -1126,7 +1128,7 @@ mod tests {
|
||||
let x_cryp = x_team.cryps[0].clone();
|
||||
let y_cryp = y_team.cryps[0].clone();
|
||||
|
||||
let _x_block_id = game.add_skill(x_team.id, x_cryp.id, None, Skill::TestBlock).unwrap();
|
||||
let _x_block_id = game.add_skill(x_team.id, x_cryp.id, None, Skill::TestParry).unwrap();
|
||||
let y_attack_id = game.add_skill(y_team.id, y_cryp.id, Some(x_team.id), Skill::TestStun).unwrap();
|
||||
|
||||
game.target_phase_start();
|
||||
|
||||
@ -106,6 +106,7 @@ pub type Cooldown = Option<u8>;
|
||||
pub enum Effect {
|
||||
// physical
|
||||
Stun,
|
||||
Parry,
|
||||
Block,
|
||||
Bleed,
|
||||
Leech,
|
||||
@ -149,7 +150,7 @@ pub enum Effect {
|
||||
impl Effect {
|
||||
pub fn immune(&self, skill: Skill) -> bool {
|
||||
match self {
|
||||
Effect::Block => match skill.category() {
|
||||
Effect::Parry => match skill.category() {
|
||||
Category::Spell => false,
|
||||
Category::Physical => true,
|
||||
_ => false,
|
||||
@ -172,6 +173,8 @@ impl Effect {
|
||||
pub fn disables_skill(&self, skill: Skill) -> bool {
|
||||
match self {
|
||||
Effect::Stun => true,
|
||||
Effect::Hex => true,
|
||||
Effect::Banish => true,
|
||||
Effect::Silence => match skill.category() {
|
||||
Category::Spell => true,
|
||||
Category::Physical => false,
|
||||
@ -195,6 +198,7 @@ impl Effect {
|
||||
match self {
|
||||
Effect::Amplify => vec![Stat::SpellDmg],
|
||||
Effect::Empower => vec![Stat::PhysDmg],
|
||||
Effect::Block => vec![Stat::PhysDmg],
|
||||
_ => vec![],
|
||||
}
|
||||
}
|
||||
@ -204,6 +208,7 @@ impl Effect {
|
||||
// and OR with base stat
|
||||
pub fn apply(&self, value: u64) -> u64 {
|
||||
match self {
|
||||
Effect::Block => value >> 1,
|
||||
Effect::Amplify => value << 1,
|
||||
Effect::Empower => value << 1,
|
||||
_ => panic!("{:?} does not have a mod effect", self),
|
||||
@ -215,6 +220,7 @@ impl Effect {
|
||||
// physical
|
||||
Effect::Stun => Category::PhysDebuff,
|
||||
Effect::Block => Category::PhysBuff,
|
||||
Effect::Parry => Category::PhysBuff,
|
||||
Effect::Bleed => Category::PhysDebuff,
|
||||
Effect::Leech => Category::PhysDebuff,
|
||||
Effect::Airborne => Category::PhysDebuff,
|
||||
@ -351,6 +357,7 @@ pub enum Skill {
|
||||
TestTouch,
|
||||
TestStun,
|
||||
TestBlock,
|
||||
TestParry,
|
||||
TestDrain,
|
||||
}
|
||||
|
||||
@ -436,6 +443,7 @@ impl Skill {
|
||||
Skill::TestStun => None,
|
||||
Skill::TestBlock => None,
|
||||
Skill::TestDrain => None,
|
||||
Skill::TestParry => None,
|
||||
}
|
||||
}
|
||||
|
||||
@ -519,6 +527,7 @@ impl Skill {
|
||||
// -----------------
|
||||
Skill::TestTouch => Category::Physical,
|
||||
Skill::TestStun => Category::Physical,
|
||||
Skill::TestParry => Category::Physical,
|
||||
Skill::TestBlock => Category::Physical,
|
||||
Skill::TestDrain => Category::Spell,
|
||||
}
|
||||
@ -614,6 +623,7 @@ impl Skill {
|
||||
Skill::TestTouch => 10,
|
||||
Skill::TestStun => 5,
|
||||
Skill::TestBlock => 10,
|
||||
Skill::TestParry => 10,
|
||||
Skill::TestDrain => 10,
|
||||
}
|
||||
}
|
||||
@ -638,8 +648,8 @@ impl Skill {
|
||||
// Nature
|
||||
// -----------------
|
||||
Skill::Block => block(cryp, target, resolution),
|
||||
Skill::Parry => parry(cryp, target, resolution),
|
||||
Skill::Evade => evade(cryp, target, resolution),
|
||||
Skill::Parry => panic!("nyi"), // avoid all dmg
|
||||
Skill::Snare => snare(cryp, target, resolution), // TODO prevent physical moves
|
||||
|
||||
Skill::Paralyse => panic!("nyi"), // no physical moves
|
||||
@ -708,6 +718,7 @@ impl Skill {
|
||||
Skill::TestTouch => Resolution { skill: Skill::TestTouch, results: vec![], disable: Disable::new() },
|
||||
Skill::TestStun => stun(cryp, target, resolution),
|
||||
Skill::TestBlock => block(cryp, target, resolution),
|
||||
Skill::TestParry => parry(cryp, target, resolution),
|
||||
Skill::TestDrain => drain(cryp, target, resolution),
|
||||
}
|
||||
}
|
||||
@ -728,6 +739,7 @@ impl Skill {
|
||||
Skill::Silence => 3,
|
||||
|
||||
Skill::TestBlock => 1,
|
||||
Skill::TestParry => 1,
|
||||
Skill::TestStun => 2,
|
||||
_ => {
|
||||
println!("{:?} does not have a duration", self);
|
||||
@ -742,6 +754,7 @@ impl Skill {
|
||||
Skill::Evasion => true,
|
||||
Skill::Parry => true,
|
||||
Skill::TestBlock => true,
|
||||
Skill::TestParry => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
@ -838,6 +851,27 @@ fn block(_cryp: &mut Cryp, target: &mut Cryp, mut resolution: Resolution) -> Res
|
||||
return resolution;
|
||||
}
|
||||
|
||||
fn parry(_cryp: &mut Cryp, target: &mut Cryp, mut resolution: Resolution) -> Resolution {
|
||||
let parry = CrypEffect { effect: Effect::Parry, duration: Skill::Parry.duration(), tick: None };
|
||||
let immunity = target.immune(Skill::Parry);
|
||||
let immune = immunity.immune;
|
||||
|
||||
let result = ResolutionResult::Effect {
|
||||
effect: parry.effect,
|
||||
duration: parry.duration,
|
||||
immunity,
|
||||
};
|
||||
|
||||
resolution.results.push(result);
|
||||
|
||||
if !immune {
|
||||
target.effects.push(parry);
|
||||
}
|
||||
|
||||
return resolution;
|
||||
}
|
||||
|
||||
|
||||
fn evade(_cryp: &mut Cryp, target: &mut Cryp, mut resolution: Resolution) -> Resolution {
|
||||
let evade = CrypEffect { effect: Effect::Evasion, duration: Skill::Evade.duration(), tick: None };
|
||||
let immunity = target.immune(Skill::Evade);
|
||||
@ -1355,42 +1389,3 @@ mod tests {
|
||||
assert!(!x.effects.iter().any(|e| e.effect == Effect::Decay));
|
||||
}
|
||||
}
|
||||
|
||||
// #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
|
||||
// pub enum Skill {
|
||||
// Stoney,
|
||||
// Evasive,
|
||||
// }
|
||||
|
||||
// impl Skill {
|
||||
// pub fn apply(&self, roll: Roll) -> Roll {
|
||||
// match self {
|
||||
// Skill::Stoney => stoney(self, roll),
|
||||
// Skill::Evasive => evasive(self, roll),
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// fn stoney(_s: &Skill, mut roll: Roll) -> Roll {
|
||||
// let effect = 0b11110000;
|
||||
// match roll.kind {
|
||||
// StatKind::Def => {
|
||||
// // println!("{:064b} | <- {:?}", effect, s);
|
||||
// roll.result = roll.result | effect;
|
||||
// roll
|
||||
// },
|
||||
// _ => roll,
|
||||
// }
|
||||
// }
|
||||
|
||||
// fn evasive(_s: &Skill, mut roll: Roll) -> Roll {
|
||||
// match roll.kind {
|
||||
// StatKind::Def => {
|
||||
// if roll.result.is_power_of_two() {
|
||||
// roll.result = u64::max_value()
|
||||
// }
|
||||
// roll
|
||||
// },
|
||||
// _ => roll,
|
||||
// }
|
||||
// }
|
||||
Loading…
x
Reference in New Issue
Block a user