From b13c0e22d6afdb4e1ae8a7e280e2a03c88fe49e2 Mon Sep 17 00:00:00 2001 From: ntr Date: Tue, 26 Mar 2019 18:19:55 +1100 Subject: [PATCH] hatred wip --- server/WORKLOG.md | 2 ++ server/src/cryp.rs | 70 +++++++++++++++++++++++---------------------- server/src/game.rs | 2 +- server/src/skill.rs | 14 +++++---- 4 files changed, 48 insertions(+), 40 deletions(-) diff --git a/server/WORKLOG.md b/server/WORKLOG.md index 9653f987..d7144933 100644 --- a/server/WORKLOG.md +++ b/server/WORKLOG.md @@ -16,6 +16,7 @@ # WORK WORK ## NOW cryp vbox + update defensives in skill.rs ensure all skills impl ez @@ -27,6 +28,7 @@ siphon test make parry semi-aggressive constants change to ownership pattern +make strike *really* hit first / resolve at same time? ## SOON * Remove debuffs on KO diff --git a/server/src/cryp.rs b/server/src/cryp.rs index 55d92b8c..8c81dfbb 100644 --- a/server/src/cryp.rs +++ b/server/src/cryp.rs @@ -60,9 +60,10 @@ impl CrypSkill { } } -#[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] +#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] pub enum EffectMeta { TickAmount(u64), + AddedDamage(u64), } #[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] @@ -402,30 +403,33 @@ impl Cryp { pub fn red_damage(&self) -> u64 { let red_damage_mods = self.effects.iter() .filter(|e| e.effect.modifications().contains(&Stat::RedDamage)) - .map(|cryp_effect| cryp_effect.effect) - .collect::>(); + .map(|e| (e.effect, e.meta)) + .collect::)>>(); - let modified_red_damage = red_damage_mods.iter().fold(self.red_damage.value, |acc, m| m.apply(acc)); + let modified_red_damage = red_damage_mods.iter() + .fold(self.red_damage.value, |acc, fx| fx.0.apply(acc, fx.1)); return modified_red_damage; } pub fn blue_damage(&self) -> u64 { let blue_damage_mods = self.effects.iter() .filter(|e| e.effect.modifications().contains(&Stat::BlueDamage)) - .map(|cryp_effect| cryp_effect.effect) - .collect::>(); + .map(|e| (e.effect, e.meta)) + .collect::)>>(); - let modified_blue_damage = blue_damage_mods.iter().fold(self.blue_damage.value, |acc, m| m.apply(acc)); + let modified_blue_damage = blue_damage_mods.iter() + .fold(self.blue_damage.value, |acc, fx| fx.0.apply(acc, fx.1)); return modified_blue_damage; } pub fn green_damage(&self) -> u64 { let green_damage_mods = self.effects.iter() .filter(|e| e.effect.modifications().contains(&Stat::GreenDamage)) - .map(|cryp_effect| cryp_effect.effect) - .collect::>(); + .map(|e| (e.effect, e.meta)) + .collect::)>>(); - let modified_green_damage = green_damage_mods.iter().fold(self.green_damage.value, |acc, m| m.apply(acc)); + let modified_green_damage = green_damage_mods.iter() + .fold(self.green_damage.value, |acc, fx| fx.0.apply(acc, fx.1)); return modified_green_damage; } @@ -441,10 +445,11 @@ impl Cryp { pub fn speed(&self) -> u64 { let speed_mods = self.effects.iter() .filter(|e| e.effect.modifications().contains(&Stat::Speed)) - .map(|cryp_effect| cryp_effect.effect) - .collect::>(); + .map(|e| (e.effect, e.meta)) + .collect::)>>(); - let modified_speed = speed_mods.iter().fold(self.speed.value, |acc, m| m.apply(acc)); + let modified_speed = speed_mods.iter() + .fold(self.speed.value, |acc, fx| fx.0.apply(acc, fx.1)); return modified_speed; } @@ -487,23 +492,22 @@ impl Cryp { return events; } - let healing_mods = self.effects.iter() + let mods = self.effects.iter() .filter(|e| e.effect.modifications().contains(&Stat::GreenDamageTaken)) - .map(|cryp_effect| cryp_effect.effect) - .collect::>(); + .map(|e| (e.effect, e.meta)) + .collect::)>>(); - // println!("{:?}", healing_mods); - - let modified_green_damage = healing_mods.iter().fold(amount, |acc, m| m.apply(acc)); + let modified_damage = mods.iter() + .fold(amount, |acc, fx| fx.0.apply(acc, fx.1)); match self.affected(Effect::Invert) { false => { let current_hp = self.hp(); - self.hp.increase(modified_green_damage); + self.hp.increase(modified_damage); let new_hp = self.hp.value; let healing = new_hp - current_hp; - let overhealing = modified_green_damage - healing; + let overhealing = modified_damage - healing; events.push(Event::Healing { skill, @@ -516,7 +520,7 @@ impl Cryp { // there is no green shield (yet) let current_hp = self.hp(); - self.reduce_hp(modified_green_damage); + self.reduce_hp(modified_damage); let delta = current_hp - self.hp(); events.push(Event::Damage { @@ -542,14 +546,13 @@ impl Cryp { return events; } - let red_damage_mods = self.effects.iter() + let mods = self.effects.iter() .filter(|e| e.effect.modifications().contains(&Stat::RedDamageTaken)) - .map(|cryp_effect| cryp_effect.effect) - .collect::>(); + .map(|e| (e.effect, e.meta)) + .collect::)>>(); - // println!("{:?}", red_damage_mods); - - let modified_damage = red_damage_mods.iter().fold(amount, |acc, m| m.apply(acc)); + let modified_damage = mods.iter() + .fold(amount, |acc, fx| fx.0.apply(acc, fx.1)); match self.affected(Effect::Invert) { false => { @@ -616,14 +619,13 @@ impl Cryp { return events; } - let blue_damage_mods = self.effects.iter() + let mods = self.effects.iter() .filter(|e| e.effect.modifications().contains(&Stat::BlueDamageTaken)) - .map(|cryp_effect| cryp_effect.effect) - .collect::>(); + .map(|e| (e.effect, e.meta)) + .collect::)>>(); - // println!("{:?}", blue_damage_mods); - - let modified_damage = blue_damage_mods.iter().fold(amount, |acc, m| m.apply(acc)); + let modified_damage = mods.iter() + .fold(amount, |acc, fx| fx.0.apply(acc, fx.1)); match self.affected(Effect::Invert) { false => { diff --git a/server/src/game.rs b/server/src/game.rs index 552ed08e..2cf10158 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -9,7 +9,7 @@ use failure::err_msg; use account::Account; use rpc::{GameStateParams, GameSkillParams}; -use cryp::{Cryp}; +use cryp::{Cryp, EffectMeta}; use skill::{Skill, Effect, Cast, Resolution, Event, resolve}; use player::{Player}; use instance::{instance_game_finished, global_game_finished}; diff --git a/server/src/skill.rs b/server/src/skill.rs index edd50fea..b1389ac4 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -1,7 +1,7 @@ use rand::{thread_rng, Rng}; use uuid::Uuid; -use cryp::{Cryp, CrypEffect, Stat}; +use cryp::{Cryp, CrypEffect, EffectMeta, Stat}; use vbox::{Var}; pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutions: Vec) -> Resolutions { @@ -221,6 +221,7 @@ pub enum Effect { Empower, Taunt, + Hatred, Invert, Strangle, @@ -321,10 +322,7 @@ impl Effect { } } - // maybe increase by rng - // roll little endian bits - // and OR with base stat - pub fn apply(&self, value: u64) -> u64 { + pub fn apply(&self, value: u64, meta: Option) -> u64 { match self { Effect::Empower => value << 1, Effect::Vulnerable => value << 1, @@ -336,6 +334,11 @@ impl Effect { Effect::Haste => value << 1, Effect::Slow => value >> 1, + Effect::Hatred => value + match meta { + Some(EffectMeta::AddedDamage(d)) => d, + _ => panic!("hatred meta not damage"), + }, + _ => { println!("{:?} does not have a mod effect", self); return value; @@ -371,6 +374,7 @@ impl Effect { Effect::Banish => Category::BlueDebuff, // todo randomise Effect::Slow => Category::BlueDebuff, Effect::Haste => Category::BlueBuff, + Effect::Hatred => Category::BlueBuff, Effect::Reflect => Category::BlueBuff, Effect::Enslave => Category::BlueDebuff, Effect::Mesmerise => Category::BlueDebuff,