Skip to content

Commit

Permalink
Re #13: Separate leader reroll from team reroll
Browse files Browse the repository at this point in the history
By swapping from a public field to a property we can pretend we have
a count including the leader reroll, but we can internally track actual
rerolls without having to track whether to remove a leader reroll
next setup.

This resolves an issue with us regenerating rerolls every setup
rather than every half
  • Loading branch information
IBBoard committed Oct 3, 2021
1 parent 3ac5113 commit fc0b587
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 8 deletions.
24 changes: 17 additions & 7 deletions bbreplay/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def __init__(self, home_team, away_team, receiving_team):
self.__receiving_team = receiving_team
self.score = [0, 0]
self.turn_team = None
self.rerolls = [home_team.rerolls, away_team.rerolls]
self.__rerolls = [home_team.rerolls, away_team.rerolls]
self.apothecaries = [home_team.apothecaries, away_team.apothecaries]
self.__reset_board()
self.__turn = 0
Expand Down Expand Up @@ -73,6 +73,15 @@ def receiving_team(self):
def kicking_team(self):
return other_team(self.__receiving_team)

@property
def rerolls(self):
home_rerolls, away_rerolls = self.__rerolls
if self.has_leader_reroll(TeamType.HOME):
home_rerolls += 1
if self.has_leader_reroll(TeamType.AWAY):
away_rerolls += 1
return (home_rerolls, away_rerolls)

def prepare_setup(self):
crossed_half_time = (self.turn <= HALF_TIME_TURN) != (self.__last_setup_turn <= HALF_TIME_TURN)
self.__reset_board()
Expand All @@ -95,6 +104,7 @@ def prepare_setup(self):

if crossed_half_time:
self.__used_leaders.clear()
self.__rerolls = [team.rerolls for team in self.teams]

self.set_ball_position(OFF_PITCH_POSITION)

Expand All @@ -105,21 +115,21 @@ def setup_complete(self):
team_setup.append((player, player.position))
self.__setups[team.team_type.value] = team_setup
self.turn_team = self.teams[self.__receiving_team.value]
self.rerolls = [team.rerolls for team in self.teams]

if any(player.is_on_pitch() and Skills.LEADER in player.skills
and player not in self.__used_leaders
for player in self.teams[TeamType.HOME.value].get_players()):
self.add_reroll(TeamType.HOME)
self.__leader_reroll[TeamType.HOME.value] = True
else:
self.__leader_reroll[TeamType.HOME.value] = False

if any(player.is_on_pitch() and Skills.LEADER in player.skills
and player not in self.__used_leaders
for player in self.teams[TeamType.AWAY.value].get_players()):
self.add_reroll(TeamType.AWAY)
self.__leader_reroll[TeamType.AWAY.value] = True
else:
self.__leader_reroll[TeamType.AWAY.value] = False

if any(pos.y > BEFORE_HALFWAY_IDX for _, pos in self.__setups[TeamType.HOME.value]):
self.__touchdown_row = [NEAR_ENDZONE_IDX, FAR_ENDZONE_IDX]
else:
Expand Down Expand Up @@ -291,19 +301,19 @@ def use_reroll(self, team):
raise ValueError("Already used a team reroll this turn!")
if self.__leader_reroll[team.value]:
raise ValueError("Attempted to use a normal reroll when a leader reroll exists")
self.rerolls[team.value] -= 1
self.__rerolls[team.value] -= 1
self.__used_reroll = True

def use_leader_reroll(self, team, player):
self.__used_leaders.add(player)
self.__leader_reroll[team.value] = False
self.use_reroll(team)
self.__used_reroll = True

def can_reroll(self, team):
return self.rerolls[team.value] > 0 and not self.__used_reroll

def add_reroll(self, team):
self.rerolls[team.value] += 1
self.__rerolls[team.value] += 1

def has_leader_reroll(self, team):
return self.__leader_reroll[team.value]
Expand Down
3 changes: 2 additions & 1 deletion tests/test_replay__reroll.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ def test_no_reroll_with_no_options(board):
home_team, away_team = board.teams
replay = Replay(home_team, away_team, [], [])
player = home_team.get_player(0)
board.rerolls[TeamType.HOME.value] = 0
while board.can_reroll(TeamType.HOME):
board.use_reroll(TeamType.HOME)
actions, new_result = replay._process_action_reroll(None, None, player, board)

assert actions == []
Expand Down
47 changes: 47 additions & 0 deletions tests/test_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,3 +121,50 @@ def test_leader_reroll_readded_in_second_half(board):
board.setup_complete()
assert board.has_leader_reroll(TeamType.HOME)
assert board.rerolls[TeamType.HOME.value] == 4


def test_leader_reroll_readded_with_second_leader(board):
home_team, _ = board.teams
player = home_team.get_player(0)
player.skills.append(Skills.LEADER)
board.set_position(Position(1, 1), player)
extra_player = Player(2, "Player2H", 4, 4, 4, 4, 1, 0, 40000, [Skills.LEADER])
home_team.add_player(1, extra_player)
board.set_position(Position(2, 2), extra_player)
board.setup_complete()
assert board.has_leader_reroll(TeamType.HOME)
assert board.rerolls[TeamType.HOME.value] == 4
[x for x in board.kickoff()]
board.use_leader_reroll(TeamType.HOME, player)
board.touchdown(player)
[x for x in board.end_turn(TeamType.HOME, "reason")]
board.prepare_setup()
board.setup_complete()
assert board.has_leader_reroll(TeamType.HOME)
assert board.rerolls[TeamType.HOME.value] == 4


def test_rerolls_regen_at_halftime(board):
home_team, _ = board.teams
player = home_team.get_player(0)
board.setup_complete()
assert board.rerolls[TeamType.HOME.value] == 3
[x for x in board.kickoff()]
board.use_reroll(TeamType.HOME)
assert board.rerolls[TeamType.HOME.value] == 2
board.touchdown(player)
[x for x in board.end_turn(TeamType.HOME, "reason")]
board.prepare_setup()
board.setup_complete()
[x for x in board.kickoff()]
assert board.rerolls[TeamType.HOME.value] == 2
[x for x in board.end_turn(TeamType.AWAY, "reason")]
# And the other seven turns
for _ in range(7):
for team_type in [TeamType.HOME, TeamType.AWAY]:
[x for x in board.start_turn(team_type)]
[x for x in board.end_turn(team_type, "reason")]
board.halftime()
board.prepare_setup()
board.setup_complete()
assert board.rerolls[TeamType.HOME.value] == 3

0 comments on commit fc0b587

Please sign in to comment.