hatred wip

This commit is contained in:
ntr 2019-03-26 18:19:55 +11:00
parent 24767b9c86
commit b13c0e22d6
4 changed files with 48 additions and 40 deletions

View File

@ -16,6 +16,7 @@
# WORK WORK # WORK WORK
## NOW ## NOW
cryp vbox cryp vbox
update defensives in skill.rs
ensure all skills impl ensure all skills impl
ez ez
@ -27,6 +28,7 @@ siphon test
make parry semi-aggressive make parry semi-aggressive
constants constants
change to ownership pattern change to ownership pattern
make strike *really* hit first / resolve at same time?
## SOON ## SOON
* Remove debuffs on KO * Remove debuffs on KO

View File

@ -60,9 +60,10 @@ impl CrypSkill {
} }
} }
#[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub enum EffectMeta { pub enum EffectMeta {
TickAmount(u64), TickAmount(u64),
AddedDamage(u64),
} }
#[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] #[derive(Debug,Clone,PartialEq,Serialize,Deserialize)]
@ -402,30 +403,33 @@ impl Cryp {
pub fn red_damage(&self) -> u64 { pub fn red_damage(&self) -> u64 {
let red_damage_mods = self.effects.iter() let red_damage_mods = self.effects.iter()
.filter(|e| e.effect.modifications().contains(&Stat::RedDamage)) .filter(|e| e.effect.modifications().contains(&Stat::RedDamage))
.map(|cryp_effect| cryp_effect.effect) .map(|e| (e.effect, e.meta))
.collect::<Vec<Effect>>(); .collect::<Vec<(Effect, Option<EffectMeta>)>>();
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; return modified_red_damage;
} }
pub fn blue_damage(&self) -> u64 { pub fn blue_damage(&self) -> u64 {
let blue_damage_mods = self.effects.iter() let blue_damage_mods = self.effects.iter()
.filter(|e| e.effect.modifications().contains(&Stat::BlueDamage)) .filter(|e| e.effect.modifications().contains(&Stat::BlueDamage))
.map(|cryp_effect| cryp_effect.effect) .map(|e| (e.effect, e.meta))
.collect::<Vec<Effect>>(); .collect::<Vec<(Effect, Option<EffectMeta>)>>();
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; return modified_blue_damage;
} }
pub fn green_damage(&self) -> u64 { pub fn green_damage(&self) -> u64 {
let green_damage_mods = self.effects.iter() let green_damage_mods = self.effects.iter()
.filter(|e| e.effect.modifications().contains(&Stat::GreenDamage)) .filter(|e| e.effect.modifications().contains(&Stat::GreenDamage))
.map(|cryp_effect| cryp_effect.effect) .map(|e| (e.effect, e.meta))
.collect::<Vec<Effect>>(); .collect::<Vec<(Effect, Option<EffectMeta>)>>();
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; return modified_green_damage;
} }
@ -441,10 +445,11 @@ impl Cryp {
pub fn speed(&self) -> u64 { pub fn speed(&self) -> u64 {
let speed_mods = self.effects.iter() let speed_mods = self.effects.iter()
.filter(|e| e.effect.modifications().contains(&Stat::Speed)) .filter(|e| e.effect.modifications().contains(&Stat::Speed))
.map(|cryp_effect| cryp_effect.effect) .map(|e| (e.effect, e.meta))
.collect::<Vec<Effect>>(); .collect::<Vec<(Effect, Option<EffectMeta>)>>();
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; return modified_speed;
} }
@ -487,23 +492,22 @@ impl Cryp {
return events; return events;
} }
let healing_mods = self.effects.iter() let mods = self.effects.iter()
.filter(|e| e.effect.modifications().contains(&Stat::GreenDamageTaken)) .filter(|e| e.effect.modifications().contains(&Stat::GreenDamageTaken))
.map(|cryp_effect| cryp_effect.effect) .map(|e| (e.effect, e.meta))
.collect::<Vec<Effect>>(); .collect::<Vec<(Effect, Option<EffectMeta>)>>();
// println!("{:?}", healing_mods); let modified_damage = mods.iter()
.fold(amount, |acc, fx| fx.0.apply(acc, fx.1));
let modified_green_damage = healing_mods.iter().fold(amount, |acc, m| m.apply(acc));
match self.affected(Effect::Invert) { match self.affected(Effect::Invert) {
false => { false => {
let current_hp = self.hp(); let current_hp = self.hp();
self.hp.increase(modified_green_damage); self.hp.increase(modified_damage);
let new_hp = self.hp.value; let new_hp = self.hp.value;
let healing = new_hp - current_hp; let healing = new_hp - current_hp;
let overhealing = modified_green_damage - healing; let overhealing = modified_damage - healing;
events.push(Event::Healing { events.push(Event::Healing {
skill, skill,
@ -516,7 +520,7 @@ impl Cryp {
// there is no green shield (yet) // there is no green shield (yet)
let current_hp = self.hp(); let current_hp = self.hp();
self.reduce_hp(modified_green_damage); self.reduce_hp(modified_damage);
let delta = current_hp - self.hp(); let delta = current_hp - self.hp();
events.push(Event::Damage { events.push(Event::Damage {
@ -542,14 +546,13 @@ impl Cryp {
return events; return events;
} }
let red_damage_mods = self.effects.iter() let mods = self.effects.iter()
.filter(|e| e.effect.modifications().contains(&Stat::RedDamageTaken)) .filter(|e| e.effect.modifications().contains(&Stat::RedDamageTaken))
.map(|cryp_effect| cryp_effect.effect) .map(|e| (e.effect, e.meta))
.collect::<Vec<Effect>>(); .collect::<Vec<(Effect, Option<EffectMeta>)>>();
// println!("{:?}", red_damage_mods); let modified_damage = mods.iter()
.fold(amount, |acc, fx| fx.0.apply(acc, fx.1));
let modified_damage = red_damage_mods.iter().fold(amount, |acc, m| m.apply(acc));
match self.affected(Effect::Invert) { match self.affected(Effect::Invert) {
false => { false => {
@ -616,14 +619,13 @@ impl Cryp {
return events; return events;
} }
let blue_damage_mods = self.effects.iter() let mods = self.effects.iter()
.filter(|e| e.effect.modifications().contains(&Stat::BlueDamageTaken)) .filter(|e| e.effect.modifications().contains(&Stat::BlueDamageTaken))
.map(|cryp_effect| cryp_effect.effect) .map(|e| (e.effect, e.meta))
.collect::<Vec<Effect>>(); .collect::<Vec<(Effect, Option<EffectMeta>)>>();
// println!("{:?}", blue_damage_mods); let modified_damage = mods.iter()
.fold(amount, |acc, fx| fx.0.apply(acc, fx.1));
let modified_damage = blue_damage_mods.iter().fold(amount, |acc, m| m.apply(acc));
match self.affected(Effect::Invert) { match self.affected(Effect::Invert) {
false => { false => {

View File

@ -9,7 +9,7 @@ use failure::err_msg;
use account::Account; use account::Account;
use rpc::{GameStateParams, GameSkillParams}; use rpc::{GameStateParams, GameSkillParams};
use cryp::{Cryp}; use cryp::{Cryp, EffectMeta};
use skill::{Skill, Effect, Cast, Resolution, Event, resolve}; use skill::{Skill, Effect, Cast, Resolution, Event, resolve};
use player::{Player}; use player::{Player};
use instance::{instance_game_finished, global_game_finished}; use instance::{instance_game_finished, global_game_finished};

View File

@ -1,7 +1,7 @@
use rand::{thread_rng, Rng}; use rand::{thread_rng, Rng};
use uuid::Uuid; use uuid::Uuid;
use cryp::{Cryp, CrypEffect, Stat}; use cryp::{Cryp, CrypEffect, EffectMeta, Stat};
use vbox::{Var}; use vbox::{Var};
pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutions: Vec<Resolution>) -> Resolutions { pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutions: Vec<Resolution>) -> Resolutions {
@ -221,6 +221,7 @@ pub enum Effect {
Empower, Empower,
Taunt, Taunt,
Hatred,
Invert, Invert,
Strangle, Strangle,
@ -321,10 +322,7 @@ impl Effect {
} }
} }
// maybe increase by rng pub fn apply(&self, value: u64, meta: Option<EffectMeta>) -> u64 {
// roll little endian bits
// and OR with base stat
pub fn apply(&self, value: u64) -> u64 {
match self { match self {
Effect::Empower => value << 1, Effect::Empower => value << 1,
Effect::Vulnerable => value << 1, Effect::Vulnerable => value << 1,
@ -336,6 +334,11 @@ impl Effect {
Effect::Haste => value << 1, Effect::Haste => value << 1,
Effect::Slow => 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); println!("{:?} does not have a mod effect", self);
return value; return value;
@ -371,6 +374,7 @@ impl Effect {
Effect::Banish => Category::BlueDebuff, // todo randomise Effect::Banish => Category::BlueDebuff, // todo randomise
Effect::Slow => Category::BlueDebuff, Effect::Slow => Category::BlueDebuff,
Effect::Haste => Category::BlueBuff, Effect::Haste => Category::BlueBuff,
Effect::Hatred => Category::BlueBuff,
Effect::Reflect => Category::BlueBuff, Effect::Reflect => Category::BlueBuff,
Effect::Enslave => Category::BlueDebuff, Effect::Enslave => Category::BlueDebuff,
Effect::Mesmerise => Category::BlueDebuff, Effect::Mesmerise => Category::BlueDebuff,