diff --git a/bbreplay/replay.py b/bbreplay/replay.py index 898d4e7..e82f83f 100644 --- a/bbreplay/replay.py +++ b/bbreplay/replay.py @@ -599,6 +599,9 @@ def _process_block(self, targeting_player, target_by_idx, cmds, log_entries, boa moves = self.__get_moves(targeting_player, cmds) cmd = next(cmds) yield from self.__process_movement_list(targeting_player, moves, cmds, log_entries, board) + if board.is_prone(targeting_player): + # Something failed in the block + return else: cmd = next(cmds) yield from self._process_uncontrollable_skills(targeting_player, cmds, log_entries, board) diff --git a/dvc.lock b/dvc.lock index b5863e8..9840547 100644 --- a/dvc.lock +++ b/dvc.lock @@ -4,8 +4,8 @@ stages: cmd: python3 metrics.py -o metrics/metrics.json -p metrics/plots.json data/ deps: - path: bbreplay/ - md5: a9460689115f918a0c086ffb3e96ce24.dir - size: 238834 + md5: 87afb66e15097fe4897a33d0930b18ba.dir + size: 238913 nfiles: 14 - path: data/ md5: 8f4f4d470b87ccc84345c3d35a283af3.dir @@ -16,8 +16,8 @@ stages: size: 3310 outs: - path: metrics/metrics.json - md5: 2123e849d93cb9474390ff8d5b3933ad + md5: 342079c81c634150afff80cb416f0170 size: 5224 - path: metrics/plots.json - md5: 630e849d4c66b74092d7f0db9a2b95ff - size: 1785 + md5: 71aed121f3fb19528094d531a27d4e5c + size: 1786 diff --git a/metrics/metrics.json b/metrics/metrics.json index 4c8ca42..49af4a7 100644 --- a/metrics/metrics.json +++ b/metrics/metrics.json @@ -1,7 +1,7 @@ { "total_commands": 140177, - "total_processed": 24939, - "total_unprocessed": 115238, + "total_processed": 25249, + "total_unprocessed": 114928, "results": { "data/Replay_2021-04-05_11-35-42.db": { "commands": 42, @@ -89,9 +89,9 @@ }, "data/Replay_2020-09-06_10-13-12.db": { "commands": 6480, - "events": 588, - "processed": 2941, - "unprocessed": 3539 + "events": 622, + "processed": 3251, + "unprocessed": 3229 }, "data/Replay_2021-04-04_09-49-09.db": { "commands": 5160, diff --git a/metrics/plots.json b/metrics/plots.json index 9ff2223..0b5793e 100644 --- a/metrics/plots.json +++ b/metrics/plots.json @@ -67,7 +67,7 @@ "score": 0.4279875756089586 }, { - "score": 0.453858024691358 + "score": 0.5016975308641975 }, { "score": 0.5517241379310345 diff --git a/tests/test_replay__blitz.py b/tests/test_replay__blitz.py index 0ae251f..265fe9b 100644 --- a/tests/test_replay__blitz.py +++ b/tests/test_replay__blitz.py @@ -1561,3 +1561,75 @@ def test_blitz_with_double_frenzied_gfi(board): assert not next(events, None) assert not next(cmds, None) assert not next(log_entries, None) + +def test_bug17_failed_dodge_on_blitz(board): + home_team, away_team = board.teams + replay = Replay(home_team, away_team, [], []) + player = home_team.get_player(0) + board.set_position(Position(7, 7), player) + opponent = away_team.get_player(0) + board.set_position(Position(8, 7), opponent) + cmds = iter_([ + TargetPlayerCommand(1, 1, TeamType.HOME, 0, [TeamType.HOME.value, 0, TeamType.AWAY.value, 0, 8, 7]), + MovementCommand(1, 1, TeamType.HOME, 0, [TeamType.HOME.value, 0, 0, 0, 0, 0, 0, 0, 8, 8]), + TargetSpaceCommand(1, 1, TeamType.HOME, 0, [TeamType.HOME.value, 0, 0, 0, 0, 0, 0, 0, 8, 7]), + RerollCommand(1, 1, TeamType.HOME, 1, []) + ]) + log_entries = iter_([ + DodgeEntry(player.team.team_type, player.number, "6+", "2", ActionResult.FAILURE), + RerollEntry(TeamType.HOME), + DodgeEntry(player.team.team_type, player.number, "6+", "2", ActionResult.FAILURE), + ArmourValueRollEntry(player.team.team_type, player.number, "9+", "8", ActionResult.FAILURE), + TurnOverEntry(player.team.team_type, "Knocked Down!") + ]) + events = replay._process_block(player, opponent, cmds, log_entries, board) + + event = next(events) + assert isinstance(event, Blitz) + assert event.blitzing_player == player + assert event.blitzed_player == opponent + + event = next(events) + assert isinstance(event, Action) + assert event.player == player + assert event.action == ActionType.DODGE + assert event.result == ActionResult.FAILURE + + event = next(events) + assert isinstance(event, Reroll) + assert event.team == player.team.team_type + + event = next(events) + assert isinstance(event, Action) + assert event.player == player + assert event.action == ActionType.DODGE + assert event.result == ActionResult.FAILURE + + event = next(events) + assert isinstance(event, PlayerDown) + assert event.player == player + + event = next(events) + assert isinstance(event, ArmourRoll) + assert event.player == player + assert event.result == ActionResult.FAILURE + + event = next(events) + assert isinstance(event, FailedMovement) + assert event.player == player + assert event.source_space == Position(7, 7) + assert event.target_space == Position(8, 8) + + event = next(events) + assert isinstance(event, EndTurn) + assert event.reason == "Knocked Down!" + + event = next(events) + assert isinstance(event, StartTurn) + + assert board.is_prone(player) + assert not board.is_prone(opponent) + + assert not next(cmds, None) + assert not next(log_entries, None) + assert not next(events, None)