effect ticks

This commit is contained in:
ntr 2018-11-09 15:17:49 +11:00
parent 2908296410
commit 567b1b7ee9
2 changed files with 54 additions and 18 deletions

View File

@ -9,7 +9,7 @@ use failure::err_msg;
use account::Account; use account::Account;
use rpc::{CrypSpawnParams}; use rpc::{CrypSpawnParams};
use skill::{Skill, Cooldown, Effect}; use skill::{Skill, Cooldown, Effect, Tick};
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub struct CrypSkill { pub struct CrypSkill {
@ -32,6 +32,14 @@ impl CrypSkill {
pub struct CrypEffect { pub struct CrypEffect {
pub effect: Effect, pub effect: Effect,
pub duration: u8, pub duration: u8,
pub tick: Option<Tick>,
}
impl CrypEffect {
pub fn tick(&self, cryp: &mut Cryp) -> &CrypEffect {
self.effect.tick(self, cryp);
self
}
} }
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
@ -211,15 +219,17 @@ impl Cryp {
} }
pub fn reduce_effect_durations(&mut self) -> &mut Cryp { pub fn reduce_effect_durations(&mut self) -> &mut Cryp {
self.effects = self.effects.clone().into_iter().filter_map(|mut s| { self.effects = self.effects.clone().into_iter().filter_map(|mut effect| {
s.duration = s.duration.saturating_sub(1);
if s.duration == 0 { effect.tick(self);
effect.duration = effect.duration.saturating_sub(1);
if effect.duration == 0 {
return None; return None;
} }
println!("reduced effect {:?}", s); println!("reduced effect {:?}", effect);
return Some(s); return Some(effect);
}).collect::<Vec<CrypEffect>>(); }).collect::<Vec<CrypEffect>>();
self self

View File

@ -30,7 +30,7 @@ impl Cast {
target_cryp_id, target_cryp_id,
target_team_id, target_team_id,
skill, skill,
resolution: Resolution { base: 0, result: None, text: String::new() }, resolution: Resolution { base: 0, result: None, text: String::new(), },
}; };
} }
@ -104,6 +104,22 @@ impl Effect {
_ => false, _ => false,
} }
} }
pub fn tick(&self, cryp_effect: &CrypEffect, target: &mut Cryp) -> &Effect {
match self {
Effect::Decay => decay_tick(target, cryp_effect),
// Effect::Triage => triage_tick(target, res),
_ => (),
}
self
}
}
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
pub struct Tick {
amount: u64
} }
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
@ -386,7 +402,7 @@ impl Skill {
// Preservation // Preservation
// ----------------- // -----------------
Skill::Heal => heal(cryp, target, &mut res), Skill::Heal => heal(cryp, target, &mut res),
Skill::Triage => panic!("nyi"), // hot Skill::Triage => triage(cryp, target, &mut res), // hot
Skill::Throw => panic!("nyi"), // no dmg stun, adds vulnerable Skill::Throw => panic!("nyi"), // no dmg stun, adds vulnerable
Skill::Charm => panic!("nyi"), Skill::Charm => panic!("nyi"),
Skill::Calm => panic!("nyi"), Skill::Calm => panic!("nyi"),
@ -397,7 +413,7 @@ impl Skill {
// ----------------- // -----------------
Skill::Blast => panic!("nyi"), Skill::Blast => panic!("nyi"),
Skill::Amplify => panic!("nyi"), Skill::Amplify => panic!("nyi"),
Skill::Decay => panic!("nyi"), // dot Skill::Decay => decay(cryp, target, &mut res), // dot
Skill::Drain => panic!("nyi"), Skill::Drain => panic!("nyi"),
Skill::Curse => panic!("nyi"), Skill::Curse => panic!("nyi"),
Skill::Plague => panic!("nyi"), // aoe dot Skill::Plague => panic!("nyi"), // aoe dot
@ -469,7 +485,7 @@ fn attack(cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) {
fn stun(cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) { fn stun(cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) {
if !target.effects.iter().any(|e| e.effect.prevents(Skill::Stun)) { if !target.effects.iter().any(|e| e.effect.prevents(Skill::Stun)) {
let stun = CrypEffect { effect: Effect::Stun, duration: Skill::Stun.duration() }; let stun = CrypEffect { effect: Effect::Stun, duration: Skill::Stun.duration(), tick: None };
target.effects.push(stun); target.effects.push(stun);
res.text = format!("{:?} -> {:?} | {:?} for {:?}T", cryp.name, target.name, stun.effect, stun.duration); res.text = format!("{:?} -> {:?} | {:?} for {:?}T", cryp.name, target.name, stun.effect, stun.duration);
} else { } else {
@ -478,7 +494,7 @@ fn stun(cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) {
} }
fn block(_cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) { fn block(_cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) {
let effect = CrypEffect { effect: Effect::Block, duration: Skill::Block.duration() }; let effect = CrypEffect { effect: Effect::Block, duration: Skill::Block.duration(), tick: None };
target.effects.push(effect); target.effects.push(effect);
res.text = format!("{:?} is {:?} for {:?}T", target.name, effect.effect, effect.duration); res.text = format!("{:?} is {:?} for {:?}T", target.name, effect.effect, effect.duration);
} }
@ -495,16 +511,26 @@ fn heal(cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) {
res.text = format!("{:?} -> {:?} | Heal for {:?} ({:?} OH)", cryp.name, target.name, healing, overhealing); res.text = format!("{:?} -> {:?} | Heal for {:?} ({:?} OH)", cryp.name, target.name, healing, overhealing);
} }
fn triage(cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) { fn triage(_cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) {
target.hp.value.saturating_add(cryp.spell_dmg.value.wrapping_div(2)), let effect = CrypEffect { effect: Effect::Triage, duration: Skill::Triage.duration(), tick: None };
let healing = new_hp.saturating_sub(target.hp.value); target.effects.push(effect);
let overhealing = target.hp.value.saturating_add(cryp.phys_dmg.value).saturating_sub(target.stamina.value); res.text = format!("{:?} is {:?} for {:?}T", target.name, effect.effect, effect.duration);
target.hp.value = new_hp;
res.text = format!("{:?} -> {:?} | Heal for {:?} ({:?} OH)", cryp.name, target.name, healing, overhealing);
} }
fn decay(cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) {
let effect = CrypEffect {
effect: Effect::Decay,
duration: Skill::Decay.duration(),
tick: Some(Tick { amount: cryp.spell_dmg.value.wrapping_div(2) })
};
target.effects.push(effect);
res.text = format!("{:?} is {:?} for {:?}T", target.name, effect.effect, effect.duration);
}
fn decay_tick(target: &mut Cryp, effect: &CrypEffect) {
let tick = effect.tick.expect("no tick for decay");
target.hp.reduce(tick.amount);
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {