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
## 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

View File

@ -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::<Vec<Effect>>();
.map(|e| (e.effect, e.meta))
.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;
}
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::<Vec<Effect>>();
.map(|e| (e.effect, e.meta))
.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;
}
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::<Vec<Effect>>();
.map(|e| (e.effect, e.meta))
.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;
}
@ -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::<Vec<Effect>>();
.map(|e| (e.effect, e.meta))
.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;
}
@ -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::<Vec<Effect>>();
.map(|e| (e.effect, e.meta))
.collect::<Vec<(Effect, Option<EffectMeta>)>>();
// 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::<Vec<Effect>>();
.map(|e| (e.effect, e.meta))
.collect::<Vec<(Effect, Option<EffectMeta>)>>();
// 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::<Vec<Effect>>();
.map(|e| (e.effect, e.meta))
.collect::<Vec<(Effect, Option<EffectMeta>)>>();
// 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 => {

View File

@ -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};

View File

@ -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<Resolution>) -> 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<EffectMeta>) -> 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,