From 98bcb88f1c5a9336cddbb6190954a281ed022467 Mon Sep 17 00:00:00 2001 From: Mashy Date: Fri, 13 Dec 2019 08:54:18 +1000 Subject: [PATCH 1/3] counter against counter shouldn't infinite loop --- core/src/game.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/core/src/game.rs b/core/src/game.rs index 00cec5d7..eb767c31 100644 --- a/core/src/game.rs +++ b/core/src/game.rs @@ -1236,7 +1236,7 @@ mod tests { game = game.resolve_phase_start(); - println!("{:?}", game.player_by_id(x_player.id).unwrap().constructs[0]); + // println!("{:?}", game.player_by_id(x_player.id).unwrap().constructs[0]); assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Stun).is_some()); assert!(game.player_by_id(y_player.id).unwrap().constructs[0].skill_on_cd(Skill::Block).is_none()); } @@ -1893,6 +1893,21 @@ mod tests { } == 320.pct(Skill::Blast.multiplier()) - 125); } + #[test] + fn multi_counter_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, source, Skill::Counter), vec![]); + game.resolve(Cast::new(target, player_id, target, Skill::Counter), vec![]); + game.resolve(Cast::new(source, player_id, target, Skill::Attack), vec![]); + + assert!(game.players[0].constructs[0].is_ko() == false); + assert!(game.players[1].constructs[0].is_ko() == false); + } + /* #[test] fn tick_speed_tests() { From ede867391e7906ca6d63bf2fbe15c2a2ec3350f0 Mon Sep 17 00:00:00 2001 From: Mashy Date: Fri, 13 Dec 2019 09:17:09 +1000 Subject: [PATCH 2/3] multi refl test --- core/fixme.md | 3 ++- core/src/game.rs | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/core/fixme.md b/core/fixme.md index e5c25e0a..b7d4f7d4 100644 --- a/core/fixme.md +++ b/core/fixme.md @@ -3,4 +3,5 @@ check silence skill multiplier game ready not auto starting resolve phase purify conditional healing -set static speed for dot ticks \ No newline at end of file +set static speed for dot ticks +infinite counter loop \ No newline at end of file diff --git a/core/src/game.rs b/core/src/game.rs index eb767c31..fac35282 100644 --- a/core/src/game.rs +++ b/core/src/game.rs @@ -1893,6 +1893,21 @@ mod tests { } == 320.pct(Skill::Blast.multiplier()) - 125); } + #[test] + fn multi_reflect_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, source, Skill::Reflect), vec![]); + game.resolve(Cast::new(target, player_id, target, Skill::Reflect), vec![]); + game.resolve(Cast::new(source, player_id, target, Skill::Blast), vec![]); + + assert!(game.players[0].constructs[0].is_ko() == false); + assert!(game.players[1].constructs[0].is_ko() == false); + } + #[test] fn multi_counter_test() { let mut game = create_2v2_test_game(); @@ -1903,7 +1918,7 @@ mod tests { game.resolve(Cast::new(source, player_id, source, Skill::Counter), vec![]); game.resolve(Cast::new(target, player_id, target, Skill::Counter), vec![]); game.resolve(Cast::new(source, player_id, target, Skill::Attack), vec![]); - + assert!(game.players[0].constructs[0].is_ko() == false); assert!(game.players[1].constructs[0].is_ko() == false); } From 1708e020576c9edeafa71cb54f08178af1f78308 Mon Sep 17 00:00:00 2001 From: Mashy Date: Fri, 13 Dec 2019 10:24:54 +1000 Subject: [PATCH 3/3] intercept test --- core/src/game.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/core/src/game.rs b/core/src/game.rs index fac35282..a56271b2 100644 --- a/core/src/game.rs +++ b/core/src/game.rs @@ -1897,31 +1897,73 @@ mod tests { fn multi_reflect_test() { let mut game = create_2v2_test_game(); let player_id = game.players[0].id; + let target_player_id = game.players[1].id; + let source = game.players[0].constructs[0].id; let target = game.players[1].constructs[0].id; game.resolve(Cast::new(source, player_id, source, Skill::Reflect), vec![]); - game.resolve(Cast::new(target, player_id, target, Skill::Reflect), vec![]); + game.resolve(Cast::new(target, target_player_id, target, Skill::Reflect), vec![]); game.resolve(Cast::new(source, player_id, target, Skill::Blast), vec![]); assert!(game.players[0].constructs[0].is_ko() == false); assert!(game.players[1].constructs[0].is_ko() == false); } - #[test] + // refer fixme.md (infinite counterattack loop) + /*#[test] fn multi_counter_test() { let mut game = create_2v2_test_game(); let player_id = game.players[0].id; + let target_player_id = game.players[1].id; + let source = game.players[0].constructs[0].id; let target = game.players[1].constructs[0].id; game.resolve(Cast::new(source, player_id, source, Skill::Counter), vec![]); - game.resolve(Cast::new(target, player_id, target, Skill::Counter), vec![]); + game.resolve(Cast::new(target, target_player_id, target, Skill::Counter), vec![]); game.resolve(Cast::new(source, player_id, target, Skill::Attack), vec![]); assert!(game.players[0].constructs[0].is_ko() == false); assert!(game.players[1].constructs[0].is_ko() == false); - } + }*/ + + #[test] + fn intercept_test() { + + let mut game = create_2v2_test_game(); + + let player_id = game.players[0].id; + let other_player_id = game.players[1].id; + + let source = game.players[0].constructs[0].id; + let target = game.players[1].constructs[0].id; + let interceptor = game.players[1].constructs[1].id; + + // Cast intercept + game.resolve(Cast::new(interceptor, other_player_id, interceptor, Skill::Intercept), vec![]); + // Enemy casts skill on target which as a teammate intercepting + game.resolve(Cast::new(source, player_id, target, Skill::Attack), vec![]); + // Intercepting teammate attacks someone on same team + game.resolve(Cast::new(interceptor, other_player_id, target, Skill::Attack), vec![]); + + let last = game.resolutions.len() - 1; + let resolutions = &game.resolutions[last]; + + // There should be no damage events on the target + assert!(resolutions.iter().any(|r| match r.event { + Event::Damage { construct, colour, amount, mitigation, display: _ } => + construct == target && (amount > 0 || mitigation > 0) && colour == Colour::Red, + _ => false, + }) == false); + + // Should be damage events on the interceptor + assert!(resolutions.iter().any(|r| match r.event { + Event::Damage { construct, colour, amount, mitigation, display: _ } => + construct == interceptor && (amount > 0 || mitigation > 0) && colour == Colour::Red, + _ => false, + })); +} /* #[test]