invert test

This commit is contained in:
ntr 2019-12-10 16:51:31 +10:00
parent 194373d0a6
commit 47b92a5b80
2 changed files with 69 additions and 28 deletions

View File

@ -482,8 +482,6 @@ impl Construct {
}
// Stats
// fixme put everything through this fn
pub fn stat(&self, stat: Stat) -> usize {
match stat {
Stat::RedLife => self.red_life.value,
@ -548,7 +546,7 @@ impl Construct {
if self.is_ko() { return events; }
let construct = self.id;
let modified_power = self.modified_amount(amount, Stat::RedDamageReceived);
let modified_amount = self.modified_amount(amount, Stat::RedDamageReceived);
match self.affected(Effect::Invert) {
false => {
@ -556,8 +554,8 @@ impl Construct {
// eg 50 red_life 25 damage -> 0 remainder 25 mitigation
// 50 red_life 100 damage -> 50 remainder 50 mitigation
// 50 red_life 5 damage -> 0 remainder 5 mitigation
let remainder = modified_power.saturating_sub(self.red_life.value);
let mitigation = modified_power.saturating_sub(remainder);
let remainder = modified_amount.saturating_sub(self.red_life.value);
let mitigation = modified_amount.saturating_sub(remainder);
// reduce red_life by mitigation amount
self.red_life.reduce(mitigation);
@ -591,16 +589,18 @@ impl Construct {
// 100 red healing
// 50 red overhealing
let current_green_life = self.stat(Stat::GreenLife);
self.green_life.increase(modified_power);
self.green_life.increase(modified_amount);
let new_green_life = self.green_life.value;
let green_healing = new_green_life - current_green_life;
let recharge = modified_power - green_healing;
let recharge = modified_amount - green_healing;
let current_red_life = self.red_life.value;
self.red_life.increase(recharge);
let red_healing = self.red_life.value - current_red_life;
let overhealing = recharge - red_healing;
println!("{:?} {:?} {:?} {:?}", recharge, green_healing, red_healing, self.red_life);
if green_healing > 0 {
events.push(
Event::Healing {
@ -618,7 +618,7 @@ impl Construct {
construct,
amount: recharge,
overhealing,
colour: Colour::Blue
colour: Colour::Red
}
);
}
@ -634,12 +634,12 @@ impl Construct {
if self.is_ko() { return events; }
let construct = self.id;
let modified_power = self.modified_amount(amount, Stat::BlueDamageReceived);
let modified_amount = self.modified_amount(amount, Stat::BlueDamageReceived);
match self.affected(Effect::Invert) {
false => {
let remainder = modified_power.saturating_sub(self.blue_life.value);
let mitigation = modified_power.saturating_sub(remainder);
let remainder = modified_amount.saturating_sub(self.blue_life.value);
let mitigation = modified_amount.saturating_sub(remainder);
// reduce blue_life by mitigation amount
self.blue_life.reduce(mitigation);
@ -665,11 +665,11 @@ impl Construct {
},
true => {
let current_green_life = self.stat(Stat::GreenLife);
self.green_life.increase(modified_power);
self.green_life.increase(modified_amount);
let new_green_life = self.green_life.value;
let green_healing = new_green_life - current_green_life;
let recharge = modified_power - green_healing;
let recharge = modified_amount - green_healing;
let current_blue_life = self.blue_life.value;
self.blue_life.increase(recharge);
let blue_healing = self.blue_life.value - current_blue_life;
@ -719,16 +719,16 @@ impl Construct {
.map(|e| (e.effect, e.meta))
.collect::<Vec<(Effect, Option<EffectMeta>)>>();
let modified_power = mods.iter()
let modified_amount = mods.iter()
.fold(amount, |acc, fx| fx.0.apply(acc, fx.1));
match self.affected(Effect::Invert) {
false => {
let current_red_life = self.stat(Stat::RedLife);
self.red_life.increase(modified_power);
self.red_life.increase(modified_amount);
let new_red_life = self.red_life.value;
let healing = new_red_life - current_red_life;
let overhealing = modified_power - healing;
let overhealing = modified_amount - healing;
if healing != 0 {
events.push(Event::Healing { construct: self.id, amount: healing, overhealing, colour: Colour::Red });
@ -736,8 +736,8 @@ impl Construct {
},
true => {
// Recharge takes a red and blue amount so check for them
let red_remainder = modified_power.saturating_sub(self.red_life.value);
let red_mitigation = modified_power.saturating_sub(red_remainder);
let red_remainder = modified_amount.saturating_sub(self.red_life.value);
let red_mitigation = modified_amount.saturating_sub(red_remainder);
// reduce red_life by mitigation amount
self.red_life.reduce(red_mitigation);
@ -769,17 +769,17 @@ impl Construct {
.map(|e| (e.effect, e.meta))
.collect::<Vec<(Effect, Option<EffectMeta>)>>();
let modified_power = mods.iter()
let modified_amount = mods.iter()
.fold(amount, |acc, fx| fx.0.apply(acc, fx.1));
match self.affected(Effect::Invert) {
false => {
let current_green_life = self.stat(Stat::GreenLife);
self.green_life.increase(modified_power);
self.green_life.increase(modified_amount);
let new_green_life = self.green_life.value;
let healing = new_green_life - current_green_life;
let overhealing = modified_power - healing;
let overhealing = modified_amount - healing;
events.push(Event::Healing {
construct: self.id,
@ -791,7 +791,7 @@ impl Construct {
true => {
// there is no green shield (yet)
let current_green_life = self.stat(Stat::GreenLife);
self.reduce_green_life(modified_power);
self.reduce_green_life(modified_amount);
let delta = current_green_life - self.stat(Stat::GreenLife);
events.push(Event::Damage {
@ -820,16 +820,16 @@ impl Construct {
.map(|e| (e.effect, e.meta))
.collect::<Vec<(Effect, Option<EffectMeta>)>>();
let modified_power = mods.iter()
let modified_amount = mods.iter()
.fold(amount, |acc, fx| fx.0.apply(acc, fx.1));
match self.affected(Effect::Invert) {
false => {
let current_blue_life = self.stat(Stat::BlueLife);
self.blue_life.increase(modified_power);
self.blue_life.increase(modified_amount);
let new_blue_life = self.blue_life.value;
let healing = new_blue_life - current_blue_life;
let overhealing = modified_power - healing;
let overhealing = modified_amount - healing;
if healing != 0 {
events.push(Event::Healing { construct: self.id, amount: healing, overhealing, colour: Colour::Red });
@ -837,8 +837,8 @@ impl Construct {
},
true => {
// Recharge takes a red and blue amount so check for them
let blue_remainder = modified_power.saturating_sub(self.blue_life.value);
let blue_mitigation = modified_power.saturating_sub(blue_remainder);
let blue_remainder = modified_amount.saturating_sub(self.blue_life.value);
let blue_mitigation = modified_amount.saturating_sub(blue_remainder);
// reduce blue_life by mitigation amount
self.blue_life.reduce(blue_mitigation);

View File

@ -1660,6 +1660,47 @@ mod tests {
let target = game.players[1].constructs[0].id;
game.resolve(Cast::new(source, player_id, target, Skill::Slay));
println!("{:#?}", game.resolutions);
let last = game.resolutions.len() - 1;
let resolutions = &game.resolutions[last];
assert!(resolutions.iter().any(|r| match r.event {
Event::Damage { construct, colour, amount, mitigation: _, display: _ } =>
construct == target && amount > 0 && colour == Colour::Red,
_ => false,
}));
assert!(resolutions.iter().any(|r| match r.event {
Event::Damage { construct, colour, amount, mitigation: _, display: _ } =>
construct == target && amount > 0 && colour == Colour::Red,
_ => false,
}));
}
#[test]
fn invert_test() {
let mut game = create_2v2_test_game();
let player_id = game.players[0].id;
let source = game.players[0].constructs[0].id;
let target = game.players[1].constructs[0].id;
game.resolve(Cast::new(source, player_id, target, Skill::Strike));
game.resolve(Cast::new(source, player_id, target, Skill::Invert));
game.resolve(Cast::new(source, player_id, target, Skill::Strike));
let last = game.resolutions.len() - 1;
let resolutions = &game.resolutions[last];
assert!(resolutions.iter().any(|r| match r.event {
Event::Healing { construct, colour, amount, overhealing: _ } =>
construct == target && amount > 0 && colour == Colour::Green,
_ => false,
}));
assert!(resolutions.iter().any(|r| match r.event {
Event::Healing { construct, colour, amount, overhealing: _ } =>
construct == target && amount > 0 && colour == Colour::Red,
_ => false,
}));
}
}