corruption
This commit is contained in:
parent
27c7023f61
commit
94f49651db
@ -23,7 +23,6 @@ ensure all skills impl
|
|||||||
Hatred -> damage received converted into bonus dmg
|
Hatred -> damage received converted into bonus dmg
|
||||||
|
|
||||||
on attack
|
on attack
|
||||||
Skill::Taunt -> redirect incomnig attacks to self
|
|
||||||
Skill::Toxic -> apply debuff to attackers
|
Skill::Toxic -> apply debuff to attackers
|
||||||
|
|
||||||
make parry semi-aggressive
|
make parry semi-aggressive
|
||||||
|
|||||||
@ -163,7 +163,6 @@ pub struct Cryp {
|
|||||||
pub specs: Vec<Spec>,
|
pub specs: Vec<Spec>,
|
||||||
pub colours: Colours,
|
pub colours: Colours,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub ko_logged: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Cryp {
|
impl Cryp {
|
||||||
@ -185,7 +184,6 @@ impl Cryp {
|
|||||||
specs: vec![],
|
specs: vec![],
|
||||||
colours: Colours::new(),
|
colours: Colours::new(),
|
||||||
name: String::new(),
|
name: String::new(),
|
||||||
ko_logged: false,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -492,6 +492,9 @@ impl Game {
|
|||||||
fn log_resolution(&mut self, speed: u64, skill: Skill, resolution: &Resolution) -> &mut Game {
|
fn log_resolution(&mut self, speed: u64, skill: Skill, resolution: &Resolution) -> &mut Game {
|
||||||
let Resolution { source, target, event } = resolution;
|
let Resolution { source, target, event } = resolution;
|
||||||
match event {
|
match event {
|
||||||
|
Event::Ko =>
|
||||||
|
self.log.push(format!("{:} KO!", target.name)),
|
||||||
|
|
||||||
Event::Disable { disable } =>
|
Event::Disable { disable } =>
|
||||||
self.log.push(format!("{:} {:?} {:} disabled {:?}",
|
self.log.push(format!("{:} {:?} {:} disabled {:?}",
|
||||||
source.name, skill, target.name, disable)),
|
source.name, skill, target.name, disable)),
|
||||||
@ -501,7 +504,7 @@ impl Game {
|
|||||||
speed, source.name, skill, target.name, immunity)),
|
speed, source.name, skill, target.name, immunity)),
|
||||||
|
|
||||||
Event::TargetKo =>
|
Event::TargetKo =>
|
||||||
self.log.push(format!("[{:}] {:} {:?} {:} - KO",
|
self.log.push(format!("[{:}] {:} {:?} {:} - target is KO",
|
||||||
speed, source.name, skill, target.name)),
|
speed, source.name, skill, target.name)),
|
||||||
|
|
||||||
Event::Damage { amount, mitigation, category: _ } =>
|
Event::Damage { amount, mitigation, category: _ } =>
|
||||||
|
|||||||
@ -82,6 +82,7 @@ pub enum Event {
|
|||||||
Effect { effect: Effect, duration: u8 },
|
Effect { effect: Effect, duration: u8 },
|
||||||
Removal { effect: Effect },
|
Removal { effect: Effect },
|
||||||
Evasion { skill: Skill, evasion_rating: u64 },
|
Evasion { skill: Skill, evasion_rating: u64 },
|
||||||
|
Ko,
|
||||||
|
|
||||||
Incomplete,
|
Incomplete,
|
||||||
}
|
}
|
||||||
@ -127,6 +128,11 @@ pub enum Effect {
|
|||||||
Amplify,
|
Amplify,
|
||||||
Silence,
|
Silence,
|
||||||
|
|
||||||
|
// corrupt is the buff that applies
|
||||||
|
// corruption the dmg debuff
|
||||||
|
Corrupt,
|
||||||
|
Corruption,
|
||||||
|
|
||||||
// magic immunity
|
// magic immunity
|
||||||
Shield,
|
Shield,
|
||||||
|
|
||||||
@ -261,6 +267,9 @@ impl Effect {
|
|||||||
Effect::Amplify => Category::BlueBuff,
|
Effect::Amplify => Category::BlueBuff,
|
||||||
Effect::Silence => Category::BlueDebuff,
|
Effect::Silence => Category::BlueDebuff,
|
||||||
|
|
||||||
|
Effect::Corrupt => Category::BlueBuff,
|
||||||
|
Effect::Corruption => Category::BlueDebuff,
|
||||||
|
|
||||||
// magic immunity
|
// magic immunity
|
||||||
Effect::Shield => Category::BlueBuff,
|
Effect::Shield => Category::BlueBuff,
|
||||||
Effect::Invert => Category::GreenBuff,
|
Effect::Invert => Category::GreenBuff,
|
||||||
@ -308,6 +317,9 @@ impl Effect {
|
|||||||
Effect::Amplify => 2,
|
Effect::Amplify => 2,
|
||||||
Effect::Silence => 2,
|
Effect::Silence => 2,
|
||||||
|
|
||||||
|
Effect::Corrupt => 2,
|
||||||
|
Effect::Corruption => 3,
|
||||||
|
|
||||||
Effect::Shield => 2,
|
Effect::Shield => 2,
|
||||||
|
|
||||||
Effect::Triage => 3,
|
Effect::Triage => 3,
|
||||||
@ -358,7 +370,6 @@ pub enum Skill {
|
|||||||
Slay,
|
Slay,
|
||||||
Clutch,
|
Clutch,
|
||||||
Taunt,
|
Taunt,
|
||||||
Toxic,
|
|
||||||
Invert,
|
Invert,
|
||||||
|
|
||||||
Strangle,
|
Strangle,
|
||||||
@ -390,6 +401,11 @@ pub enum Skill {
|
|||||||
SiphonTick,
|
SiphonTick,
|
||||||
Curse,
|
Curse,
|
||||||
|
|
||||||
|
Corrupt,
|
||||||
|
Corruption,
|
||||||
|
CorruptionTick,
|
||||||
|
|
||||||
|
|
||||||
// -----------------
|
// -----------------
|
||||||
// Purity
|
// Purity
|
||||||
// -----------------
|
// -----------------
|
||||||
@ -453,7 +469,10 @@ impl Skill {
|
|||||||
Skill::StrangleTick => None,
|
Skill::StrangleTick => None,
|
||||||
Skill::Clutch => Some(2),
|
Skill::Clutch => Some(2),
|
||||||
Skill::Taunt => Some(1),
|
Skill::Taunt => Some(1),
|
||||||
Skill::Toxic => Some(1),
|
|
||||||
|
Skill::Corrupt => Some(1),
|
||||||
|
Skill::Corruption => None,
|
||||||
|
Skill::CorruptionTick => None,
|
||||||
|
|
||||||
// -----------------
|
// -----------------
|
||||||
// Test
|
// Test
|
||||||
@ -530,13 +549,15 @@ impl Skill {
|
|||||||
|
|
||||||
|
|
||||||
// WRONG
|
// WRONG
|
||||||
Skill::Recharge => Category::Blue,
|
Skill::Recharge => Category::Green,
|
||||||
Skill::Reflect => Category::Blue,
|
Skill::Reflect => Category::Green,
|
||||||
Skill::Ruin => Category::Blue,
|
Skill::Ruin => Category::Blue,
|
||||||
Skill::Slay => Category::Blue,
|
Skill::Slay => Category::Red,
|
||||||
Skill::Taunt => Category::Red,
|
Skill::Taunt => Category::Red,
|
||||||
Skill::Toxic => Category::Blue,
|
|
||||||
|
|
||||||
|
Skill::Corrupt => Category::Blue,
|
||||||
|
Skill::Corruption => Category::Blue,
|
||||||
|
Skill::CorruptionTick => Category::Blue,
|
||||||
|
|
||||||
// -----------------
|
// -----------------
|
||||||
// Test
|
// Test
|
||||||
@ -554,6 +575,7 @@ impl Skill {
|
|||||||
Skill::TriageTick => true,
|
Skill::TriageTick => true,
|
||||||
Skill::DecayTick => true,
|
Skill::DecayTick => true,
|
||||||
Skill::SiphonTick => true,
|
Skill::SiphonTick => true,
|
||||||
|
Skill::CorruptionTick => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -621,20 +643,7 @@ impl Skill {
|
|||||||
// false => (),
|
// false => (),
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// if target.is_ko() && !target.ko_logged {
|
results = match self {
|
||||||
// self.log.push(format!("{:} KO", target.name));
|
|
||||||
// target.effects.clear();
|
|
||||||
// target.ko_logged = true;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if source.is_ko() && !source.ko_logged {
|
|
||||||
// self.log.push(format!("{:} KO", source.name));
|
|
||||||
// source.effects.clear();
|
|
||||||
// source.ko_logged = true;
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
match self {
|
|
||||||
Skill::Amplify => amplify(source, target, results), // increase magic damage
|
Skill::Amplify => amplify(source, target, results), // increase magic damage
|
||||||
Skill::Attack => attack(source, target, results),
|
Skill::Attack => attack(source, target, results),
|
||||||
Skill::Banish => banish(source, target, results), // TODO prevent all actions
|
Skill::Banish => banish(source, target, results), // TODO prevent all actions
|
||||||
@ -671,7 +680,10 @@ impl Skill {
|
|||||||
Skill::Ruin => ruin(source, target, results),
|
Skill::Ruin => ruin(source, target, results),
|
||||||
Skill::Slay => unimplemented!(),
|
Skill::Slay => unimplemented!(),
|
||||||
Skill::Taunt => taunt(source, target, results),
|
Skill::Taunt => taunt(source, target, results),
|
||||||
Skill::Toxic => unimplemented!(),
|
|
||||||
|
Skill::Corrupt => corrupt(source, target, results),
|
||||||
|
Skill::Corruption => panic!("corruption should not be castable"),
|
||||||
|
Skill::CorruptionTick => corruption_tick(source, target, results),
|
||||||
|
|
||||||
// -----------------
|
// -----------------
|
||||||
// Test
|
// Test
|
||||||
@ -681,7 +693,29 @@ impl Skill {
|
|||||||
Skill::TestBlock => block(source, target, results),
|
Skill::TestBlock => block(source, target, results),
|
||||||
Skill::TestParry => parry(source, target, results),
|
Skill::TestParry => parry(source, target, results),
|
||||||
Skill::TestSiphon => siphon(source, target, results),
|
Skill::TestSiphon => siphon(source, target, results),
|
||||||
|
};
|
||||||
|
|
||||||
|
// if any event dealt damage to target cryp
|
||||||
|
// hit them with corruption
|
||||||
|
results = match target.affected(Effect::Corrupt) {
|
||||||
|
true => match results.iter().any(|r|
|
||||||
|
match r.event {
|
||||||
|
Event::Damage { amount: _, mitigation: _, category: _ } => true,
|
||||||
|
_ => false,
|
||||||
|
}) {
|
||||||
|
true => corruption(target, source, results),
|
||||||
|
false => results,
|
||||||
|
},
|
||||||
|
false => results,
|
||||||
|
};
|
||||||
|
|
||||||
|
// i don't think we need to check the source being ko
|
||||||
|
if target.is_ko() {
|
||||||
|
results.push(Resolution::new(source, target).event(Event::Ko));
|
||||||
|
target.effects.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn self_targeting(&self) -> bool {
|
pub fn self_targeting(&self) -> bool {
|
||||||
@ -689,6 +723,9 @@ impl Skill {
|
|||||||
Skill::Block => true,
|
Skill::Block => true,
|
||||||
Skill::Parry => true,
|
Skill::Parry => true,
|
||||||
Skill::Clutch => true,
|
Skill::Clutch => true,
|
||||||
|
Skill::Taunt => true,
|
||||||
|
Skill::Corrupt => true,
|
||||||
|
|
||||||
Skill::TestBlock => true,
|
Skill::TestBlock => true,
|
||||||
Skill::TestParry => true,
|
Skill::TestParry => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
@ -864,6 +901,30 @@ fn decay_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions) ->
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// corrupt is the buff effect
|
||||||
|
// when attacked it runs corruption and applies a debuff
|
||||||
|
fn corrupt(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions) -> Resolutions {
|
||||||
|
let effect = CrypEffect { effect: Effect::Corrupt, duration: Effect::Corrupt.duration(), tick: None };
|
||||||
|
results.push(Resolution::new(source, target).event(target.add_effect(Skill::Corrupt, effect)));
|
||||||
|
return results;;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn corruption(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions) -> Resolutions {
|
||||||
|
let effect = CrypEffect {
|
||||||
|
effect: Effect::Corruption,
|
||||||
|
duration: Effect::Corruption.duration(),
|
||||||
|
tick: Some(Cast::new_tick(source, target, Skill::CorruptionTick)),
|
||||||
|
};
|
||||||
|
results.push(Resolution::new(source, target).event(target.add_effect(Skill::Corruption, effect)));
|
||||||
|
return corruption_tick(source, target, results);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn corruption_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions) -> Resolutions {
|
||||||
|
let amount = source.blue_damage() / 2;
|
||||||
|
results.push(Resolution::new(source, target).event(target.deal_blue_damage(Skill::CorruptionTick, amount)));
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
fn ruin(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions) -> Resolutions {
|
fn ruin(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions) -> Resolutions {
|
||||||
let effect = CrypEffect { effect: Effect::Ruin, duration: Effect::Ruin.duration(), tick: None };
|
let effect = CrypEffect { effect: Effect::Ruin, duration: Effect::Ruin.duration(), tick: None };
|
||||||
results.push(Resolution::new(source, target).event(target.add_effect(Skill::Ruin, effect)));
|
results.push(Resolution::new(source, target).event(target.add_effect(Skill::Ruin, effect)));
|
||||||
@ -1107,6 +1168,43 @@ mod tests {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn reflect_test() {
|
||||||
|
let mut x = Cryp::new()
|
||||||
|
.named(&"muji".to_string());
|
||||||
|
|
||||||
|
let mut y = Cryp::new()
|
||||||
|
.named(&"camel".to_string());
|
||||||
|
|
||||||
|
reflect(&mut y.clone(), &mut y, vec![]);
|
||||||
|
assert!(y.affected(Effect::Reflect));
|
||||||
|
|
||||||
|
let mut results = Skill::Attack.resolve(&mut x, &mut y);
|
||||||
|
|
||||||
|
assert!(x.hp() == 768);
|
||||||
|
|
||||||
|
let Resolution { source: _, target: _, event } = results.remove(0);
|
||||||
|
match event {
|
||||||
|
Event::Damage { amount, mitigation: _, category: _ } => assert_eq!(amount, 256),
|
||||||
|
_ => panic!("not damage"),
|
||||||
|
};
|
||||||
|
} #[test]
|
||||||
|
fn corrupt_test() {
|
||||||
|
let mut x = Cryp::new()
|
||||||
|
.named(&"muji".to_string());
|
||||||
|
|
||||||
|
let mut y = Cryp::new()
|
||||||
|
.named(&"camel".to_string());
|
||||||
|
|
||||||
|
corrupt(&mut y.clone(), &mut y, vec![]);
|
||||||
|
assert!(y.affected(Effect::Corrupt));
|
||||||
|
|
||||||
|
let _results = Skill::Attack.resolve(&mut x, &mut y);
|
||||||
|
|
||||||
|
assert!(x.affected(Effect::Corruption));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn triage_test() {
|
fn triage_test() {
|
||||||
let mut x = Cryp::new()
|
let mut x = Cryp::new()
|
||||||
@ -1249,7 +1347,7 @@ mod tests {
|
|||||||
// Siphon,
|
// Siphon,
|
||||||
// SiphonTick,
|
// SiphonTick,
|
||||||
// Curse,
|
// Curse,
|
||||||
// Plague, // aoe dot
|
// Corrupt, // aoe dot
|
||||||
// Ruin, // aoe
|
// Ruin, // aoe
|
||||||
|
|
||||||
// // -----------------
|
// // -----------------
|
||||||
|
|||||||
@ -89,7 +89,7 @@ pub enum Var {
|
|||||||
Clutch,
|
Clutch,
|
||||||
Taunt,
|
Taunt,
|
||||||
Throw,
|
Throw,
|
||||||
Toxic,
|
Corrupt,
|
||||||
Triage,
|
Triage,
|
||||||
|
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ impl Var {
|
|||||||
Var::Clutch => Some(Skill::Clutch),
|
Var::Clutch => Some(Skill::Clutch),
|
||||||
Var::Taunt => Some(Skill::Taunt),
|
Var::Taunt => Some(Skill::Taunt),
|
||||||
Var::Throw => Some(Skill::Throw),
|
Var::Throw => Some(Skill::Throw),
|
||||||
// Var::Toxic => Some(Skill::Toxic),
|
Var::Corrupt => Some(Skill::Corrupt),
|
||||||
Var::Triage => Some(Skill::Triage),
|
Var::Triage => Some(Skill::Triage),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
@ -275,6 +275,7 @@ impl From<Skill> for Var {
|
|||||||
Skill::Taunt => Var::Taunt,
|
Skill::Taunt => Var::Taunt,
|
||||||
Skill::Throw => Var::Throw,
|
Skill::Throw => Var::Throw,
|
||||||
Skill::Triage => Var::Triage,
|
Skill::Triage => Var::Triage,
|
||||||
|
Skill::Corrupt => Var::Corrupt,
|
||||||
|
|
||||||
Skill::TestTouch => Var::TestTouch,
|
Skill::TestTouch => Var::TestTouch,
|
||||||
Skill::TestStun => Var::TestStun,
|
Skill::TestStun => Var::TestStun,
|
||||||
@ -334,7 +335,7 @@ fn get_combos() -> Vec<Combo> {
|
|||||||
|
|
||||||
Combo { units: vec![Var::Block, Var::Red, Var::Red], var: Var::Parry },
|
Combo { units: vec![Var::Block, Var::Red, Var::Red], var: Var::Parry },
|
||||||
Combo { units: vec![Var::Block, Var::Green, Var::Green], var: Var::Reflect },
|
Combo { units: vec![Var::Block, Var::Green, Var::Green], var: Var::Reflect },
|
||||||
Combo { units: vec![Var::Block, Var::Blue, Var::Blue], var: Var::Toxic },
|
Combo { units: vec![Var::Block, Var::Blue, Var::Blue], var: Var::Corrupt },
|
||||||
Combo { units: vec![Var::Block, Var::Red, Var::Green], var: Var::Taunt },
|
Combo { units: vec![Var::Block, Var::Red, Var::Green], var: Var::Taunt },
|
||||||
Combo { units: vec![Var::Block, Var::Green, Var::Blue], var: Var::Shield },
|
Combo { units: vec![Var::Block, Var::Green, Var::Blue], var: Var::Shield },
|
||||||
Combo { units: vec![Var::Block, Var::Red, Var::Blue], var: Var::Recharge },
|
Combo { units: vec![Var::Block, Var::Red, Var::Blue], var: Var::Recharge },
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user