effect ticks
This commit is contained in:
parent
2908296410
commit
567b1b7ee9
@ -9,7 +9,7 @@ use failure::err_msg;
|
||||
|
||||
use account::Account;
|
||||
use rpc::{CrypSpawnParams};
|
||||
use skill::{Skill, Cooldown, Effect};
|
||||
use skill::{Skill, Cooldown, Effect, Tick};
|
||||
|
||||
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
|
||||
pub struct CrypSkill {
|
||||
@ -32,6 +32,14 @@ impl CrypSkill {
|
||||
pub struct CrypEffect {
|
||||
pub effect: Effect,
|
||||
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)]
|
||||
@ -211,15 +219,17 @@ impl Cryp {
|
||||
}
|
||||
|
||||
pub fn reduce_effect_durations(&mut self) -> &mut Cryp {
|
||||
self.effects = self.effects.clone().into_iter().filter_map(|mut s| {
|
||||
s.duration = s.duration.saturating_sub(1);
|
||||
self.effects = self.effects.clone().into_iter().filter_map(|mut effect| {
|
||||
|
||||
if s.duration == 0 {
|
||||
effect.tick(self);
|
||||
effect.duration = effect.duration.saturating_sub(1);
|
||||
|
||||
if effect.duration == 0 {
|
||||
return None;
|
||||
}
|
||||
|
||||
println!("reduced effect {:?}", s);
|
||||
return Some(s);
|
||||
println!("reduced effect {:?}", effect);
|
||||
return Some(effect);
|
||||
}).collect::<Vec<CrypEffect>>();
|
||||
|
||||
self
|
||||
|
||||
@ -30,7 +30,7 @@ impl Cast {
|
||||
target_cryp_id,
|
||||
target_team_id,
|
||||
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,
|
||||
}
|
||||
}
|
||||
|
||||
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)]
|
||||
@ -386,7 +402,7 @@ impl Skill {
|
||||
// Preservation
|
||||
// -----------------
|
||||
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::Charm => panic!("nyi"),
|
||||
Skill::Calm => panic!("nyi"),
|
||||
@ -397,7 +413,7 @@ impl Skill {
|
||||
// -----------------
|
||||
Skill::Blast => panic!("nyi"),
|
||||
Skill::Amplify => panic!("nyi"),
|
||||
Skill::Decay => panic!("nyi"), // dot
|
||||
Skill::Decay => decay(cryp, target, &mut res), // dot
|
||||
Skill::Drain => panic!("nyi"),
|
||||
Skill::Curse => panic!("nyi"),
|
||||
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) {
|
||||
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);
|
||||
res.text = format!("{:?} -> {:?} | {:?} for {:?}T", cryp.name, target.name, stun.effect, stun.duration);
|
||||
} 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) {
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
fn triage(cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) {
|
||||
target.hp.value.saturating_add(cryp.spell_dmg.value.wrapping_div(2)),
|
||||
let healing = new_hp.saturating_sub(target.hp.value);
|
||||
let overhealing = target.hp.value.saturating_add(cryp.phys_dmg.value).saturating_sub(target.stamina.value);
|
||||
target.hp.value = new_hp;
|
||||
res.text = format!("{:?} -> {:?} | Heal for {:?} ({:?} OH)", cryp.name, target.name, healing, overhealing);
|
||||
fn triage(_cryp: &mut Cryp, target: &mut Cryp, res: &mut Resolution) {
|
||||
let effect = CrypEffect { effect: Effect::Triage, duration: Skill::Triage.duration(), tick: None };
|
||||
target.effects.push(effect);
|
||||
res.text = format!("{:?} is {:?} for {:?}T", target.name, effect.effect, effect.duration);
|
||||
}
|
||||
|
||||
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)]
|
||||
mod tests {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user