support extra options from hanab.liv

This commit is contained in:
Maximilian Keßler 2023-05-14 16:44:23 +02:00
parent 4a036801c4
commit fb713fcf9e
Signed by: max
GPG key ID: BCC5A619923C0BA5
2 changed files with 27 additions and 10 deletions

View file

@ -10,10 +10,19 @@ class HanabLiveInstance(hanabi.HanabiInstance):
self, self,
deck: List[hanabi.DeckCard], deck: List[hanabi.DeckCard],
num_players: int, num_players: int,
variant_id: int variant_id: int,
one_extra_card: bool = False,
one_less_card: bool = False,
*args, **kwargs
): ):
assert(2 <= num_players <= 6) assert 2 <= num_players <= 6
super().__init__(deck, num_players) hand_size = constants.HAND_SIZES[num_players]
if one_less_card:
hand_size -= 1
if one_extra_card:
hand_size += 1
super().__init__(deck, num_players, hand_size=hand_size, *args, **kwargs)
self.variant_id = variant_id self.variant_id = variant_id
self.variant = Variant.from_db(self.variant_id) self.variant = Variant.from_db(self.variant_id)

View file

@ -80,7 +80,7 @@ class Action:
return self.type == other.type and self.target == other.target and self.value == other.value return self.type == other.type and self.target == other.target and self.value == other.value
class HanabiInstance(): class HanabiInstance:
def __init__( def __init__(
self, self,
deck: List[DeckCard], deck: List[DeckCard],
@ -91,6 +91,8 @@ class HanabiInstance():
num_strikes: Optional[int] = None, # number of strikes that leads to game loss num_strikes: Optional[int] = None, # number of strikes that leads to game loss
clue_starved: bool = False, # if true, discarding and playing fives only gives back half a clue clue_starved: bool = False, # if true, discarding and playing fives only gives back half a clue
fives_give_clue: bool = True, # if false, then playing a five will not change the clue count fives_give_clue: bool = True, # if false, then playing a five will not change the clue count
deck_plays: bool = False,
all_or_nothing: bool = False
): ):
# defining properties # defining properties
self.deck = deck self.deck = deck
@ -99,6 +101,8 @@ class HanabiInstance():
self.num_strikes = num_strikes or constants.NUM_STRIKES self.num_strikes = num_strikes or constants.NUM_STRIKES
self.clue_starved = clue_starved self.clue_starved = clue_starved
self.fives_give_clue = fives_give_clue self.fives_give_clue = fives_give_clue
self.deck_plays = deck_plays,
self.all_or_nothing = all_or_nothing
# normalize deck indices # normalize deck indices
for (idx, card) in enumerate(self.deck): for (idx, card) in enumerate(self.deck):
@ -138,7 +142,7 @@ class HanabiInstance():
return 0.5 if self.clue_starved else 1 return 0.5 if self.clue_starved else 1
class GameState(): class GameState:
def __init__(self, instance: HanabiInstance): def __init__(self, instance: HanabiInstance):
# will not be modified # will not be modified
self.instance = instance self.instance = instance
@ -178,7 +182,7 @@ class GameState():
self.strikes += 1 self.strikes += 1
self.trash.append(self.instance.deck[card_idx]) self.trash.append(self.instance.deck[card_idx])
self.actions.append(Action(ActionType.Play, target=card_idx)) self.actions.append(Action(ActionType.Play, target=card_idx))
self._replace(card_idx) self._replace(card_idx, allow_not_present=self.instance.deck_plays and (card_idx == self.deck_size - 1))
self._make_turn() self._make_turn()
if all(s == 5 for s in self.stacks) or self.strikes >= self.instance.num_strikes: if all(s == 5 for s in self.stacks) or self.strikes >= self.instance.num_strikes:
self.over = True self.over = True
@ -281,10 +285,14 @@ class GameState():
self.over = True self.over = True
# replaces the specified card (has to be in current player's hand) with the next card of the deck (if nonempty) # replaces the specified card (has to be in current player's hand) with the next card of the deck (if nonempty)
def _replace(self, card_idx): def _replace(self, card_idx, allow_not_present: bool = False):
try:
idx_in_hand = next((i for (i, card) in enumerate(self.cur_hand) if card.deck_index == card_idx), None) idx_in_hand = next((i for (i, card) in enumerate(self.cur_hand) if card.deck_index == card_idx), None)
except StopIteration:
assert (idx_in_hand is not None) if not allow_not_present:
raise
self.progress += 1
return
for i in range(idx_in_hand, self.instance.hand_size - 1): for i in range(idx_in_hand, self.instance.hand_size - 1):
self.cur_hand[i] = self.cur_hand[i + 1] self.cur_hand[i] = self.cur_hand[i + 1]