Source code for maverick.players.archetypes.tilted

from typing import TYPE_CHECKING

from ...player import Player
from ...enums import ActionType
from ...playeraction import PlayerAction
from ...utils import estimate_holding_strength

if TYPE_CHECKING:  # pragma: no cover
    from ...game import Game

__all__ = ["TiltedBot"]


[docs] class TiltedBot(Player): """A bot that is emotionally compromised after losses or bad beats. Uses hand strength evaluation but interprets it irrationally. Makes emotionally- driven decisions, overvaluing hands and making revenge plays based on poor emotional reasoning rather than sound equity calculations. - **Key Traits:** Revenge plays, poor decision-making, irrational use of hand strength. - **Strengths:** None while tilted. - **Weaknesses:** Severe strategic leaks, misuses equity information. - **Common At:** All stakes, especially after big pots. """ cls_uid = "f78a8edbc4fc419099e7ac86c4f6f43c"
[docs] def decide_action( self, *, game: "Game", valid_actions: list[ActionType], min_raise_amount: int, min_bet_amount: int, **_, ) -> PlayerAction: """Make irrational, emotionally-driven decisions using hand strength poorly.""" # Evaluate hand strength but use it irrationally private_cards = self.state.holding.cards community_cards = game.state.community_cards # Get hand equity but overvalue everything on tilt if community_cards: hand_equity = estimate_holding_strength( private_cards, community_cards=community_cards, n_private=game.rules.showdown.hole_cards_required, n_simulations=100, # Tilted player doesn't think clearly n_players=len(game.state.get_players_in_hand()), ) else: hand_equity = estimate_holding_strength( private_cards, n_private=game.rules.showdown.hole_cards_required, n_simulations=50, n_players=len(game.state.get_players_in_hand()), ) # Tilted players overvalue everything - irrational thresholds tilted_mindset = hand_equity > 0.20 # Thinks anything is good enough # Often goes all-in on tilt, even with marginal equity if ( ActionType.ALL_IN in valid_actions and self.state.stack < game.state.pot * 2 and tilted_mindset ): return PlayerAction( player_uid=self.uid, action_type=ActionType.ALL_IN, amount=self.state.stack, ) # Raise aggressively without much thought if ActionType.RAISE in valid_actions: # Tilt raises are often oversized raise_amount = min(min_raise_amount * 3, self.state.stack) return PlayerAction( player_uid=self.uid, action_type=ActionType.RAISE, amount=raise_amount ) # Bet aggressively if ActionType.BET in valid_actions: bet_amount = min(min_bet_amount * 4, self.state.stack) return PlayerAction( player_uid=self.uid, action_type=ActionType.BET, amount=bet_amount ) # Call too often (chasing losses) if ActionType.CALL in valid_actions: return PlayerAction(player_uid=self.uid, action_type=ActionType.CALL) if ActionType.CHECK in valid_actions: return PlayerAction(player_uid=self.uid, action_type=ActionType.CHECK) return PlayerAction(player_uid=self.uid, action_type=ActionType.FOLD)