From e988cc62c1074a686bad96114808001e5b5bc2b7 Mon Sep 17 00:00:00 2001 From: ntr Date: Mon, 7 Jan 2019 14:28:46 +1100 Subject: [PATCH] fix tests, add speed to resolutions --- server/WORKLOG.md | 7 ++----- server/src/cryp.rs | 4 ++++ server/src/game.rs | 39 ++++++++++++++++++++++----------------- server/src/skill.rs | 17 ++++++++++------- 4 files changed, 38 insertions(+), 29 deletions(-) diff --git a/server/WORKLOG.md b/server/WORKLOG.md index 2e0ef676..4985ed41 100644 --- a/server/WORKLOG.md +++ b/server/WORKLOG.md @@ -10,11 +10,8 @@ strangle ## NOW -* mobs heal own team - * clean up categories - -* cryp speed - * modifies skill base speed +* add speed to log +* clean up categories ## SOON * aoe skills diff --git a/server/src/cryp.rs b/server/src/cryp.rs index 86b0521a..8a35a60d 100644 --- a/server/src/cryp.rs +++ b/server/src/cryp.rs @@ -371,6 +371,10 @@ impl Cryp { return modified_spell_dmg; } + pub fn skill_speed(&self, s: Skill) -> u64 { + self.speed().saturating_mul(s.speed() as u64) + } + pub fn speed(&self) -> u64 { let speed_mods = self.effects.iter() .filter(|e| e.effect.modifications().contains(&Stat::Speed)) diff --git a/server/src/game.rs b/server/src/game.rs index 3f24382b..0ef38a91 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -349,26 +349,26 @@ impl Game { match result { ResolutionResult::Damage { amount, category: _, immunity } => { match immunity.immune { - true => self.log.push(format!("{:} {:?} {:} immune {:?}", source.name, cast.skill, target.name, immunity.effects)), - false => self.log.push(format!("{:} {:?} {:} {:}", source.name, cast.skill, target.name, amount)), + true => self.log.push(format!("[{:}] {:} {:?} {:} immune {:?}", cast.resolution.speed, source.name, cast.skill, target.name, immunity.effects)), + false => self.log.push(format!("[{:}] {:} {:?} {:} {:}", cast.resolution.speed, source.name, cast.skill, target.name, amount)), } }, ResolutionResult::Healing { amount, overhealing, category: _, immunity } => { match immunity.immune { - true => self.log.push(format!("{:} {:?} {:} immune {:?}", source.name, cast.skill, target.name, immunity.effects)), - false => self.log.push(format!("{:} {:?} {:} {:} ({:}OH)", source.name, cast.skill, target.name, amount, overhealing)), + true => self.log.push(format!("[{:}] {:} {:?} {:} immune {:?}", cast.resolution.speed, source.name, cast.skill, target.name, immunity.effects)), + false => self.log.push(format!("[{:}] {:} {:?} {:} {:} ({:}OH)", cast.resolution.speed, source.name, cast.skill, target.name, amount, overhealing)), } }, ResolutionResult::Effect { effect, duration, immunity } => { match immunity.immune { - true => self.log.push(format!("{:} {:?} {:} immune {:?}", source.name, cast.skill, target.name, immunity.effects)), - false => self.log.push(format!("{:} {:?} {:} {:?} {:}T", source.name, cast.skill, target.name, effect, duration)), + true => self.log.push(format!("[{:}] {:} {:?} {:} immune {:?}", cast.resolution.speed, source.name, cast.skill, target.name, immunity.effects)), + false => self.log.push(format!("[{:}] {:} {:?} {:} {:?} {:}T", cast.resolution.speed, source.name, cast.skill, target.name, effect, duration)), } }, ResolutionResult::Removal { effect, immunity } => { match immunity.immune { - true => self.log.push(format!("{:} {:?} {:} immune {:?}", source.name, cast.skill, target.name, immunity.effects)), - false => self.log.push(format!("{:?} removed {:} {:?}", source.name, target.name, effect)), + true => self.log.push(format!("[{:}] {:} {:?} {:} immune {:?}", cast.resolution.speed, source.name, cast.skill, target.name, immunity.effects)), + false => self.log.push(format!("[{:}] {:?} removed {:} {:?}", cast.resolution.speed, source.name, target.name, effect)), } }, } @@ -381,7 +381,7 @@ impl Game { let mut sorted = self.stack.clone(); sorted.sort_unstable_by_key(|s| -> u64 { let caster = self.cryp_by_id(s.source_cryp_id).unwrap(); - caster.speed().saturating_mul(s.skill.speed() as u64) + caster.skill_speed(s.skill) }); self.stack = sorted; @@ -821,6 +821,7 @@ mod tests { .learn(Skill::TestParry) .learn(Skill::TestDrain) .learn(Skill::Empower) + .learn(Skill::Stun) .learn(Skill::Block) .create(); @@ -834,6 +835,7 @@ mod tests { .learn(Skill::TestParry) .learn(Skill::TestDrain) .learn(Skill::Empower) + .learn(Skill::Stun) .learn(Skill::Block) .create(); @@ -1000,6 +1002,13 @@ mod tests { let x_cryp = x_team.cryps[0].clone(); let y_cryp = y_team.cryps[0].clone(); + // should auto progress back to skill phase + assert!(game.phase == Phase::Skill); + + assert!(game.team_by_id(y_team.id).cryps[0].skill_on_cd(Skill::Block).is_none()); + assert!(game.team_by_id(y_team.id).cryps[0].skill_on_cd(Skill::Stun).is_some()); + assert!(game.team_by_id(x_team.id).cryps[0].skill_on_cd(Skill::Block).is_none()); + let _x_stun_id = game.add_skill(x_team.id, x_cryp.id, Some(y_cryp.id), Skill::TestTouch).unwrap(); game.add_skill(y_team.id, y_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); @@ -1007,21 +1016,17 @@ mod tests { // should auto progress back to skill phase assert!(game.phase == Phase::Skill); - - // after 1 turn block should be off cooldown - assert!(game.team_by_id(y_team.id).cryps[0].skill_on_cd(Skill::Block).is_none()); - assert!(game.team_by_id(y_team.id).cryps[0].skill_on_cd(Skill::Empower).is_some()); - assert!(game.team_by_id(x_team.id).cryps[0].skill_on_cd(Skill::Block).is_none()); + assert!(game.team_by_id(y_team.id).cryps[0].skill_on_cd(Skill::Stun).is_none()); // second round // now we block and it should go back on cd - let _x_block_id = game.add_skill(x_team.id, x_cryp.id, None, Skill::Block).unwrap(); + let _x_block_id = game.add_skill(x_team.id, x_cryp.id, Some(y_cryp.id), Skill::Stun).unwrap(); let _y_touch_id = game.add_skill(y_team.id, y_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); game.resolve_phase_start(); - assert!(game.team_by_id(x_team.id).cryps[0].skill_on_cd(Skill::Block).is_some()); - assert!(game.team_by_id(y_team.id).cryps[0].skill_on_cd(Skill::Empower).is_none()); + assert!(game.team_by_id(x_team.id).cryps[0].skill_on_cd(Skill::Stun).is_some()); + assert!(game.team_by_id(y_team.id).cryps[0].skill_on_cd(Skill::Block).is_none()); } #[test] diff --git a/server/src/skill.rs b/server/src/skill.rs index 87b8b69d..9bcd9246 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -76,12 +76,13 @@ pub enum ResolutionResult { pub struct Resolution { pub skill: Skill, pub disable: Disable, + pub speed: u64, pub results: Vec, } impl Resolution { fn new(skill: Skill) -> Resolution { - Resolution { skill, results: vec![], disable: Disable::new() } + Resolution { skill, results: vec![], disable: Disable::new(), speed: 0 } } } @@ -402,7 +403,7 @@ impl Skill { // Strangle - Skill::Stun => None, + Skill::Stun => Some(1), Skill::Evade => None, Skill::Evasion => None, // additional layer of dmg avoidance @@ -423,8 +424,8 @@ impl Skill { Skill::TriageTick => None, Skill::Throw => Some(1), // no dmg stun, adds vulnerable Skill::Charm => Some(1), - Skill::Calm => Some(1), - Skill::Rez => Some(4), + Skill::Calm => None, + Skill::Rez => Some(2), // ----------------- // Destruction @@ -433,7 +434,7 @@ impl Skill { Skill::Amplify => Some(1), Skill::Decay => None, // dot Skill::DecayTick => None, - Skill::Drain => Some(2), + Skill::Drain => Some(1), Skill::DrainTick => None, Skill::Curse => Some(1), Skill::Plague => Some(1), // aoe dot @@ -656,7 +657,9 @@ impl Skill { let mut rng = thread_rng(); let _base: u64 = rng.gen(); - let resolution = Resolution { skill: *self, results: vec![], disable: cryp.disabled(*self) }; + let speed = target.skill_speed(*self); + + let resolution = Resolution { skill: *self, results: vec![], disable: cryp.disabled(*self), speed }; if target.is_ko() { return resolution; @@ -739,7 +742,7 @@ impl Skill { // ----------------- // Test // ----------------- - Skill::TestTouch => Resolution { skill: Skill::TestTouch, results: vec![], disable: Disable::new() }, + Skill::TestTouch => Resolution { skill: Skill::TestTouch, results: vec![], disable: Disable::new(), speed: 0 }, Skill::TestStun => stun(cryp, target, resolution), Skill::TestBlock => block(cryp, target, resolution), Skill::TestParry => parry(cryp, target, resolution),