
    Iil                   0   S SK Jr  S SKJr  S SKJrJr  S SKJr  S SKrSSK	J
r
JrJr  SSKJr  S	S
KJr  S	SKJrJrJrJr  S	SKJr  S	SKJrJrJr  S	SKJrJr  S	SKJ r   SSK!J"r#  S SK$J%r%  Sr&Sr'Sr(Sr)Sr*Sr+Sr,Sr-Sr.Sr/Sr0Sr1Sr2S r3S!r4S"r5S#r6S$r7S%r8S&r9S'r:S(r;S)r<S*r=S+r>S,r?S-r@S.rAS/rBS0rCS1rDS2rES3rFS4rGS5rHS6rIS7rJS8rKS9rLS:rMS;rNS<rO/ \&P\'P\(P\)P\*P\+P\,P\-P\.P\/P\0P\1P\2P\3P\4P\5P\6P\7P\8P\9P\:P\;P\<P\=P\>P\?P\@P\AP\BP\CP\DP\EP\FP\GP\HP\IP\JP\KP\LP\MP\NP\OP7rPS=rQ\QS-  rR\RS-  rSS>rT\TrU\P V s0 s H  o \Q_M     sn rV\VR                  0 \'\R_\(\S_\5\R_\3\R_\7\R_\8\S_\:\S_\;\R_\B\R_\D\R_\E\S_\G\R_\I\R_\K\R_\L\R_\N\R_\J\S_\M\U\O\T0E5        \P V s0 s H  o S?U R                  S@SA5       3_M     sn rY\Z" \P5      r[\P V s0 s H  o SBU R                  S@SA5       3_M     sn r\\&\'\(\4\5\8\:\<\=\>\?\A\B\D\E\F\G\H\J\K\L\N\O1r]\<SC\=SD\>SE0r^SFr_SGr`SHraSIrbSJrcSKrdSLreSMrfSNrgSOrhSPriSQrjSKrkSRrlSSrmSTrnSUroSVrpSWrqSXrrSYrsSZrtS[ruS\rvS]rwS^rxS_ryS`rzSar{Sbr|Scr}Sdr~SerSfrSgrShrSirSjrSkrSlrSmrSnrS=rSorSpr\ " Sq Sr\5      5       r\ " Ss St\5      5       r\\ " Su Sv\\
5      5       5       rgs  sn f s  sn f s  sn f )w    )annotations)Callable)	dataclassfield)datetimeN   )GameGameOptionsPlayer)register_game   )ActionGuardMixin)Action	ActionSet	MenuInput
Visibility)	BotHelper)CardDeck	card_name)
GameResultPlayerResult)Localization   )	bot_think)KeybindStateraise_1raise_2raise_2_plusdraw_2draw_3draw_4draw_5draw_6draw_7scraprecycle	swap_drawredraftredraft_plusguard
guard_plusbreak_effect	break_alllockdownprecision_drawprecision_draw_plus
prime_draw	target_17	target_24	target_27salvage	aid_rivalbreak_shieldsbreak_shields_plusshared_cachehand_taxhand_tax_plusmind_taxmind_tax_plusarcane_cachehex_drawdark_bargainescape_routeexact_21_surgeround_erasedraw_silenceall_in_silenced   
   ztwentyone-modifier-label-_-ztwentyone-modifier-help-            zgame_pig/roundstart.oggzgame_cards/draw2.oggzgame_cards/small_shuffle.oggzgame_3cardpoker/turn.oggzgame_cards/draw3.oggzgame_blackjack/stand.oggzgame_pig/turn.oggzmenuclick.oggzgame_cards/play1.oggzgame_3cardpoker/bet.oggzgame_blackjack/doubledown.oggzgame_cards/play3.oggzgame_cards/play4.oggzgame_cards/draw4.oggzgame_pig/roll.oggzgame_cards/shuffle2.oggzgame_cards/shuffle3.oggzgame_cards/shuffle1.oggzgame_pig/win.oggzgame_pig/lose.oggzgame_crazyeights/draw.oggzgame_blackjack/bust1.oggzgame_blackjack/bust2.oggzgame_coup/challengefail.oggzgame_cards/discard2.oggzgame_cards/play2.oggzgame_cards/draw1.oggzgame_cards/discard1.oggzgame_3cardpoker/winbet.oggzgame_cards/discard3.oggzgame_crazyeights/fivesec.oggzgame_crazyeights/discskip.oggzgame_crazyeights/expired.oggzgame_crazyeights/pass.oggzgame_blackjack/win1.oggzgame_uno/loseround.oggzgame_blackjack/bust3.oggzgame_crazyeights/hitmark.oggzgame_pig/wingame.oggzgame_crazyeights/pileempty.ogg   (   c                  n    \ rS rSr% SrSrS\S'   SrS\S'   SrS\S'   S	r	S\S
'   Sr
S\S'   \rS\S'   Srg)TwentyOneOptions   z)Survival 21 defaults for Play Palace PvP.rH   intstarting_healthr   base_betstarting_modifiers_per_round#   draw_modifier_chance_percent
deck_countnext_round_wait_ticks N)__name__
__module____qualname____firstlineno____doc__rU   __annotations__rV   rW   rY   rZ   BETWEEN_ROUND_WAIT_TICKSr[   __static_attributes__r\       :c:\Users\dbart\PlayPalace11\server\games\twentyone\game.pyrR   rR      sD    3OSHc() #)(* #*J!939re   rR   c                      \ rS rSr% Sr\" \S9rS\S'   Sr	S\S'   \" \S9r
S	\S
'   \" \S9rS	\S'   SrS\S'   SrS\S'   SrS\S'   Srg)TwentyOnePlayer   zPlayer state for Survival 21.default_factory
list[Card]handr   rT   hp	list[str]	modifierstable_modifiersFboolstand_pendingN
int | Nonelast_drawn_card_idturn_modifier_playsr\   )r]   r^   r_   r`   ra   r   listrm   rb   rn   rp   rq   rs   ru   rv   rd   r\   re   rf   rh   rh      s[    'T2D*2BK 6Iy6!&t!<OY<M4%)
)  re   rh   c                    ^  \ rS rSr% Sr\" \S9rS\S'   \" \	S9r
S\S'   SrS	\S
'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   \SS  j5       r\SS! j5       r\SS" j5       r\SS# j5       r\SS$ j5       r\SS% j5       rSSS& jjrSS' jrSS( jrSS) jr SS* jr!SS+ jr"SS, jr#SS- jr$SU 4S. jjr%SU 4S/ jjr&SS0 jr'SS1 jr(SS2 jr)\*SS3 j5       r+SS4S5.       SS6 jjr,SS7 jr-\*SS8 j5       r.SS9 jr/SS: jr0\*SS; j5       r1SU 4S< jjr2SS= jr3SS> jr4SS? jr5SS@ jr6SSA jr7SSB jr8SSC jr9SSD jr:SSE jr;SSF jr<SU 4SG jjr=SSH jr>SSI jr?SSJ jr@SSK jrASSL jrBSSM jrC\*SSN j5       rDSSO jrESSP jrF                SSQ jrGSRSS.       SST jjrHSSU jrISSV jrJSSW jrKSSX jrL          SSY jrMSSZ jrNSS[ jrO\*          SS\ j5       rPSS] jrQ      SS^ jrR      SS_ jrS            SS` jrT\*            SSa j5       rU          SSb jrV        SSc jrW                  SSd jrXSSe jrYSSf jrZSSg jr[SSh jr\SSi jr]SSj jr^\*SSk j5       r_SSl jr`SSm jraSSn jrbSSo jrcSSp jrdSSq jre\*SSr j5       rfSSs jrgSSt jrh\*SSu j5       riSSv jrjSSw jrk      SSx jrlSSy jrmSSz jrnSS{ jroSS| jrpSS} jrqS~S.         SS jjrrSS jrsSS jrtSS jruSS jrvSS jrw        SS jrxSS jrySS.       SS jjrzSS jr{SS jr|SS jr}Sr~U =r$ )TwentyOneGame   z1Survival 21 ruleset with tactical modifier cards.rj   list[TwentyOnePlayer]playersrR   optionsNzDeck | Nonedecklobbystrphaser   rT   round_numberround_starter_indexr[   round_resolution_wait_ticksztuple[str, str] | Nonepending_round_player_idsr   r   ztuple[int, int]pending_round_totals   pending_round_target
str | Nonepending_round_outcomeFrr   )modifier_used_since_last_stand_resolutionc                    g)Nz21 (Survival Rules)r\   clss    rf   get_nameTwentyOneGame.get_name      $re   c                    g)N21r\   r   s    rf   get_name_keyTwentyOneGame.get_name_key  s    re   c                    g)N	twentyoner\   r   s    rf   get_typeTwentyOneGame.get_type  s    re   c                    g)Nzcategory-card-gamesr\   r   s    rf   get_categoryTwentyOneGame.get_category  r   re   c                    gNr   r\   r   s    rf   get_min_playersTwentyOneGame.get_min_players#      re   c                    gr   r\   r   s    rf   get_max_playersTwentyOneGame.get_max_players'  r   re   c                    [        XUS9$ )N)idnameis_bot)rh   )self	player_idr   r   s       rf   create_playerTwentyOneGame.create_player+  s    )vFFre   c                Z    U R                  U5      nU(       a  U$ U R                  S:w  a  gg )Nturnsaction-not-available)guard_turn_action_enabledr   )r   playererrors      rf   _is_turn_action_enabled%TwentyOneGame._is_turn_action_enabled.  s,    ..v6L:: )re   c                :    U R                  XR                  S:H  S9$ )Nr   )extra_condition)turn_action_visibilityr   r   r   s     rf   _is_turn_action_hidden$TwentyOneGame._is_turn_action_hidden6  s     **6::QXCX*YYre   c                    U R                  U5      nU(       a  U$ [        U[        5      (       a  UOS nU(       d  gUR                  (       d  gg )Nr   )r   
isinstancerh   rp   )r   r   r   ps       rf   _is_play_modifier_enabled'TwentyOneGame._is_play_modifier_enabled9  s@    ,,V4L 99Ft){{)re   c                    [        U[        5      (       a  UOS nU(       a  UR                  (       d  [        R                  $ U R                  U5      $ N)r   rh   rp   r   HIDDENr   )r   r   r   s      rf   _is_play_modifier_hidden&TwentyOneGame._is_play_modifier_hiddenD  s;     99Ft$$$**622re   c                J    U R                   S:w  a  gUR                  (       a  gg )Nplayingzaction-not-playingzaction-spectator)statusis_spectatorr   s     rf   _is_check_enabledTwentyOneGame._is_check_enabledJ  s     ;;)#'%re   c                    U R                   S:w  d  UR                  (       a  [        R                  $ [        R                  $ )Nr   )r   r   r   r   VISIBLEr   s     rf   _is_check_hiddenTwentyOneGame._is_check_hiddenQ  s.    ;;)#v':':$$$!!!re   c                   U R                  U5      nU(       a  UR                  OSn[        SS9nUR                  [	        S[
        R                  " US5      SSSS	95        UR                  [	        S
[
        R                  " US5      SSSS	95        UR                  [	        S[
        R                  " US5      SSS[        SSSS9S95        U$ )Nenturn)r   hitblackjack-hit_action_hitr   r   r   labelhandler
is_enabled	is_hiddenstandblackjack-stand_action_standplay_modifiertwentyone-play-change-card_action_play_modifierr   r   ztwentyone-select-change-card_options_for_play_modifier_bot_select_play_modifier)promptr}   
bot_select)r   r   r   r   r   input_request)get_userlocaler   addr   r   getr   )r   r   userr   
action_sets        rf   create_turn_action_set$TwentyOneGame.create_turn_action_setV  s    }}V$ $$F+
"&&v?%42	
 	"&&v/@A'42	
 	""&&v/KL/64'98:	
 re   c           
       > [         TU ]  U5      nU R                  U5      nU(       a  UR                  OSnUR	                  [        S[        R                  " US5      SSSS95        UR	                  [        S[        R                  " US	5      S
SSS95        UR	                  [        S[        R                  " US5      SSSS95        UR	                  [        S[        R                  " US5      SSSS95        UR	                  [        S[        R                  " US5      SSSS95        UR	                  [        S[        R                  " US5      SSSS95        U$ )Nr   check_21_statustwentyone-check-status_action_check_statusr   r   r   modifier_guidetwentyone-change-card-guide_action_modifier_guideread_21_opponent_face_uptwentyone-read-opponent-face-up_action_read_opponent_face_up_is_always_hiddenread_21_handtwentyone-read-current-hand_action_read_current_handread_21_betstwentyone-read-current-bets_action_read_current_betsread_21_active_effectstwentyone-read-active-effects_action_read_active_effects)supercreate_standard_action_setr   r   r   r   r   r   )r   r   r   r   r   	__class__s        rf   r  (TwentyOneGame.create_standard_action_set}  se   W7?
}}V$ $$$"&&v/GH..,	
 	#"&&v/LM0.,	
 	-"&&v/PQ7.-	
 	!"&&v/LM3.-	
 	!"&&v/LM3.-	
 	+"&&v/NO5.-	
 re   c                  > [         TU ]  5         U R                  S[        R                  " SS5      S/[
        R                  S9  U R                  S[        R                  " SS5      S/[
        R                  S9  U R                  S	[        R                  " SS
5      S/[
        R                  S9  U R                  S[        R                  " SS5      S/[
        R                  S9  U R                  S[        R                  " SS5      S/[
        R                  S9  U R                  S[        R                  " SS5      S/[
        R                  S9  U R                  S[        R                  " SS5      S/[
        R                  S9  U R                  S[        R                  " SS5      S/[
        R                  S9  U R                  S[        R                  " SS5      S/[
        R                  S9  g )N1r   r   r   )state2r   r   3r   r   4r   r   cr   r   or   r   rr   r   br   r   er   r   )r  setup_keybindsdefine_keybindr   r   r   ACTIVEr   r  s    rf   r  TwentyOneGame.setup_keybinds  s    !!$85'I\I\ 	 	
 	!!$(9:WI\M`M` 	 	
 	T#?@%%	 	 	
 	T#;<%%	 	 	
 	T#@A%%	 	 	
 	T#DE'(%%	 	 	
 	T#@A%%	 	 	
 	T#@A%%	 	 	
 	T#BC%&%%	 	 	
re   c                N    U R                  U5      nU(       a  UR                  $ S$ )Nr   )r   r   )r   r   r   s      rf   _player_localeTwentyOneGame._player_locale  s!    }}V$"t{{,,re   c                |    [         R                  U5      nU(       d  U$ [        R                  " X5      nXC:X  a  U$ U$ r   )MODIFIER_LABELSr   r   )r   r   modifierkeyr   s        rf   _render_modifierTwentyOneGame._render_modifier  s9    !!(+O  - <x2U2re   c                z   ^ ^ U(       d  [         R                  " TS5      $ SR                  UU 4S jU 5       5      $ )Ntwentyone-none, c              3  H   >#    U  H  nTR                  TU5      v   M     g 7fr   )r  ).0r  r   r   s     rf   	<genexpr>6TwentyOneGame._render_modifier_list.<locals>.<genexpr>  s#     [QZX..vx@@QZs   ")r   r   join)r   r   rp   s   `` rf   _render_modifier_list#TwentyOneGame._render_modifier_list  s0    ##F,<==yy[QZ[[[re   c                8    [        X5       SUR                   S3$ )Nz ())r   rank)r   cards     rf   _render_cardTwentyOneGame._render_card  s    D)*"TYYKq99re   table)excludebufferc                  U R                    Hp  nXBL a  M	  U R                  U5      nU" U5      n[        U S5      (       a  U R                  XFU5        U R	                  U5      nU(       d  M_  UR                  Xc5        Mr     g)zBBroadcast a message rendered separately for each recipient locale.record_transcript_eventN)r|   r  hasattrr3  r   speak)r   	formatterr0  r1  participantr   textr   s           rf   _broadcast_formatted"TwentyOneGame._broadcast_formatted   sr      <<K%((5FV$Dt677,,[G==-Dt

4( (re   c                z    [         R                  U5      nU(       d  g[        R                  " X5      nXC:X  a  S$ U$ )N )MODIFIER_HELP_MAPr   r   )r   r   r  r  	help_texts        rf   _modifier_helpTwentyOneGame._modifier_help  s8    ##H- $$V1	%r494re   c                    UR                  S5      u  p#nU(       aN  UR                  5       R                  5       U R                  5       R                  5       :X  a  UR                  5       $ U$ )zCDrop duplicate "<label>:" prefix so menus speak the card name once.:)	partitionstripcasefold)r   descriptionprefix	separator	remainders        rf   _menu_help_textTwentyOneGame._menu_help_text  sT     (3'<'<S'A$9002ekkm6L6L6NN??$$re   c                   [        U[        5      (       a  UOS nU(       d  / $ U R                  U5      n/ n[        UR                  SS9 Hp  u  pVU R                  X65      nU R                  X65      nU(       a,  U R                  Xx5      nUR                  U SU SU 35        MZ  UR                  U SU 35        Mr     U$ )Nr   )startrB  z - )	r   rh   r  	enumeraterp   r  r?  rJ  append)	r   r   r   r   r}   display_indexr  r   rF  s	            rf   r   (TwentyOneGame._options_for_play_modifier"  s     99FtI$$Q''0A'F#M))&;E--f?K"225F-%K=IJ-%9: (G re   c                2   [        U[        5      (       a  UOS nU(       d  g U R                  U5      nU(       d  g [        UR                  5       HD  u  pVXd:w  a  M  U R                  X65      (       d  M$  SUs=::  a  [        U5      :  a
  O    g X%   s  $   g    g Nr   )r   rh   _bot_choose_modifier_to_playrN  rp   _is_single_modifier_playablelen)r   r   r}   r   r  indexheld_modifiers          rf   r   'TwentyOneGame._bot_select_play_modifier2  s     99Ft44Q7$-akk$: E(44QFFE(CL( ~% %; re   c                p     U R                  SS5      S   n[        U5      $ ! [        [        4 a     g f = f)NrB  r   r   )splitrT   
ValueError
IndexError)option_valuerG  s     rf   _parse_modifier_option$TwentyOneGame._parse_modifier_optionC  s?    	!''Q/2Fv;J' 		s   " 55c                  > [         TU ]  X5        UR                  S:w  a  g U R                  R	                  UR                  5      UR                  :w  a  g [        U[        5      (       a  UOS nU(       d  g U R                  U[        SS9  g )Nr   A   volume)	r  _request_action_inputr   _pending_actionsr   r   rh   _play_sound_for_playerSOUND_CHANGE_MENU_OPEN)r   actionr   r   r  s       rf   re  #TwentyOneGame._request_action_inputK  sr    %f599'  $$VYY/699< 99Ft##A'=b#Ire   c                  ^ [        U[        5      (       a  UOS mT(       d  g U R                  T5      (       aA  U R                  T[        5        U R                  STR                  S9  U R                  5         g U R                  5       nU(       d8  U R                  T[        5        U R                  S5        U R                  5         g U R                  [        SS9  U R                  5         U R                  TUU4S jSS9  S	Tl        [        S
[        SU R                   R"                  5      5      n[$        R&                  " SS5      U::  a  U R)                  TSSS9  U R                  5         g )Ntwentyone-cannot-draw-cardsr   ztwentyone-deck-empty-stayP   rc  c                D   > [         R                  " U STR                  S9$ Nztwentyone-player-drawsrm  r   r   r   )r   r   s    rf   <lambda>+TwentyOneGame._action_hit.<locals>.<lambda>m  s    <+;+;0,re   Tannounce_sourcereveal_to_othersFr   rG   r   announce)r   rh   _draws_locked_forrg  SOUND_ACTION_FAILbroadcast_lr   rebuild_all_menus
_draw_card
play_sound	SOUND_HIT_clear_pending_stands_add_card_to_handrs   maxminr}   rY   randomrandint_give_random_modifiers)r   r   	action_idr,  chancer   s        @rf   r   TwentyOneGame._action_hitV  s<    99Ft!!!$$''+<=:166J""$ ''+<=89""$	"-""$ " 	 	
  QC!J!JKL>>!S!V+''1t'< re   c                j   [        U[        5      (       a  UOS nU(       d  g U R                  U[        5        U R	                  U5        SUl        U R                  SUR                  S9  U R                  5       (       a%  U R                  [        SS9  U R                  5         g U R                  5         g )NTztwentyone-player-standsrm  rb  rc  )r   rh   rg  SOUND_STAND_play_opponent_stand_soundrs   r{  r   _both_players_standingr~  SOUND_ROUND_RESOLVE_settle_round_advance_turn_after_action)r   r   r  r   s       rf   r   TwentyOneGame._action_standz  s     99Ft##A{3''*2166B&&((OO/O; '')re   c                  ^ ^	^
 [        U[        5      (       a  UOS m
T
(       d  g T R                  U5      nUc  T R                  T
[        5        g US-
  nUS:  d  U[        T
R                  5      :  a  T R                  T
[        5        g T
R                  U   m	T R                  T
T	5      (       d  T R                  T
[        5        g T
R                  R                  U5        T R                  T
5      nT R                  T
5      nU(       a  T R                  U5      OUnT R                  T	5        T R                  5         T R                  U	U
U 4S j5        T R                  T
T	5        T
=R                  S-  sl        T R!                  T
5        ST l        T R%                  5         T R&                  S:w  a  T R)                  5         g U(       a  T R+                  T
XgU5        T R)                  5         g )Nr   r   c           
       > TR                  U T5      (       aB  [        R                  " U STR                  TR	                  U T5      TR                  U T5      S9$ [        R                  " U STR                  TR	                  U T5      S9$ )Nztwentyone-player-plays-modifier)r   r  rF  z'twentyone-player-plays-modifier-no-descr   r  )r?  r   r   r   r  )r   r  r   r   s    rf   rr  5TwentyOneGame._action_play_modifier.<locals>.<lambda>  s     &&vx88   566!2268D $ 3 3FH E  "%%=66!2268D	re   Tr   )r   rh   r_  rg  rz  rV  rp   rU  pop_opponent_of_current_bet_play_modifier_soundr  r9  _resolve_modifierrv   _handle_mind_tax_breakr   _trigger_harvest_rewardsr   r|  _play_bet_change_sounds)r   r   selectedr  choice_numberchoice_indexopponentmy_bet_beforeopp_bet_beforer  r   s   `        @@rf   r   #TwentyOneGame._action_play_modifier  s    99Ft33H= ''+<=$q(!|s1;;/??''+<=;;|,00H==''+<=	%$$Q'))!,8@**84m!!(+""$!!	
$ 	q(+	"##A&9=6%%':: ""$((H^T re   c                   [        U[        5      (       a  UOS nU(       d  g U R                  U5      nU(       d  g U R                  U5      nU R	                  5       nU R                  U5      n[        R                  " US5      nUR                  (       a"  SR                  S UR                   5       5      OUn	U R                  XSR                  5      n
U R                  XSR                  5      nUR                  SSUUR                  UU	U R                  U5      U
US9	  UR                  SS5        U R!                  U5      nU(       a}  U R#                  U5      nU(       a  SR                  S U 5       5      OUn[%        S	 U 5       5      nUR                  S
SUR&                  UR                  U R                  U5      UUS9  g g )Nr   r!  c              3  L   #    U  H  n[        UR                  5      v   M     g 7fr   r   r+  r#  r,  s     rf   r$  5TwentyOneGame._action_check_status.<locals>.<genexpr>  s     @c$))nn   "$ztwentyone-check-status-responser/  )targetrn   betrm   totalrp   effectsz!twentyone-check-status-guide-hintc              3  L   #    U  H  n[        UR                  5      v   M     g 7fr   r  r  s     rf   r$  r    s     A[T#dii..[r  c              3  8   #    U  H  oR                   v   M     g 7fr   r+  r  s     rf   r$  r    s     @KDiiK   ztwentyone-check-status-opponent)r   rn   r  shown_cardsshown_total)r   rh   r   r  _current_targetr  r   r   rm   r&  r'  rp   rq   speak_lrn   _hand_totalr  _opponent_visible_cardssumr   )r   r   r  r   r   r   r  r  	none_text	hand_textmodifiers_text
table_textr  r  
shown_textr  s                   rf   r   "TwentyOneGame._action_check_status  s    99Ft}}Q$$Q'%%'" $$V-=>	DEFFDII@@@PY	33FKKH//8I8IJ
-tt""1%$ 	 
	
 	8'B$$Q'66x@KEP		A[AAV_  @K@@KLL1}};;%%h/&'   re   c                b   [        U[        5      (       a  UOS nU(       d  g U R                  U5      nU(       d  g U R                  U5      nUR	                  SS5        [
         H6  nU R                  XV5      nU R                  XV5      nUR	                  SSXxS9  M8     UR	                  SS5        g )Nz"twentyone-change-card-guide-headerr/  z!twentyone-change-card-guide-entry)r   rF  z"twentyone-change-card-guide-footer)r   rh   r   r  r  MODIFIER_HELPr  r?  )	r   r   r  r   r   r   modifier_idr   rF  s	            rf   r   $TwentyOneGame._action_modifier_guide  s     99Ft}}Q$$Q'97C(K((=D--fBKLL3W4   ) 	97Cre   c                   [        U[        5      (       a  UOS nU(       d  g U R                  U5      nU(       d  g U R                  U5      nU(       d)  U R	                  U[
        5        UR                  SS5        g U R                  U5      nU(       a  SR                  S U 5       5      O%[        R                  " U R                  U5      S5      n[        S U 5       5      nUR                  SSUR                  UUS9  g )	Nztwentyone-no-opponent-availabler/  r!  c              3  L   #    U  H  n[        UR                  5      v   M     g 7fr   r  r  s     rf   r$  >TwentyOneGame._action_read_opponent_face_up.<locals>.<genexpr>  s     =c$))nnr  r   c              3  8   #    U  H  oR                   v   M     g 7fr   r  r  s     rf   r$  r    s     <))r  z#twentyone-opponent-face-up-response)r   r  r  )r   rh   r   r  rg  rz  r  r  r&  r   r   r  r  r   )	r   r   r  r   r   r  r  r  r  s	            rf   r   +TwentyOneGame._action_read_opponent_face_up  s     99Ft}}Q$$Q'''+<=LL:GD228<  II===!!##A&  	 <<<1=="# 	 	
re   c                j   [        U[        5      (       a  UOS nU(       d  g U R                  U5      nU(       d  g UR                  (       a"  SR	                  S UR                   5       5      O%[
        R                  " U R                  U5      S5      nUR                  SSXPR                  U5      S9  g )Nr!  c              3  L   #    U  H  n[        UR                  5      v   M     g 7fr   r  r  s     rf   r$  :TwentyOneGame._action_read_current_hand.<locals>.<genexpr>)  s     8c$))nnr  r   ztwentyone-read-hand-responser/  )rm   r  )
r   rh   r   rm   r&  r   r   r  r  r  )r   r   r  r   r   r  s         rf   r   'TwentyOneGame._action_read_current_hand   s     99Ft}}Q vv II888!!##A&  	 	*G)K[K[\]K^ 	 	
re   c           	        [        U[        5      (       a  UOS nU(       d  g U R                  U5      nU(       d  g U R                  U5      nU R	                  U5      nU(       d(  U R                  U[        5        UR                  SSUS9  g U R                  U5      nUR                  SSUR                  UUR                  US9  g )Nz"twentyone-read-bet-response-singler/  )r  ztwentyone-read-bet-response)r   my_betr  opponent_bet)	r   rh   r   r  r  rg  rz  r  r   )r   r   r  r   r   r  r  r  s           rf   r   'TwentyOneGame._action_read_current_bets4  s     99Ft}}Q""1%$$Q'''+<=LL=wFLS((2)66]]% 	 	
re   c           	        [        U[        5      (       a  UOS nU(       d  g U R                  U5      nU(       d  g U R                  U5      nU R	                  XSR
                  5      nU R                  U5      nU(       d  UR                  SSUR                  US9  g U R	                  XWR
                  5      nUR                  SSUR                  UUR                  US9  g )Nztwentyone-active-effects-singler/  )r   r  ztwentyone-active-effects-both)r   
my_effectsr  opponent_effects)	r   rh   r   r  r'  rq   r  r  r   )	r   r   r  r   r   r   r  r  r  s	            rf   r  )TwentyOneGame._action_read_active_effectsL  s     99Ft}}Q$$Q'//8I8IJ
$$Q'LL17166S]   55f>V>VW+66!]]- 	 	
re   c                   SU l         SU l        SU l        SU l        SU l        SU l        U R                  5         SU l        U R                  5       nSU R                  l
        U R                  R                  U Vs/ s H  o"R                  PM     sn5        U R                  R                  5         U H  n[        U[        5      (       d  M  [!        SU R"                  R$                  5      Ul        UR(                  R+                  5         UR,                  R+                  5         UR.                  R+                  5         SUl        S Ul        SUl        M     U R7                  5         U R9                  SS9  g s  snf )	Nr   Tr   r   F
individualr   rotate_starter)r   game_activer   r   r   r[   _clear_pending_round_resolutionr   get_active_players_team_manager	team_modesetup_teamsr   reset_all_scoresr   rh   r  r}   rU   rn   rm   clearrp   rq   rs   ru   rv   _sync_hp_scores_start_round)r   activer   r   s       rf   on_startTwentyOneGame.on_startg  s:   
#$ %&",,.9>6((*'3$&&'?1'?@++-Ffo66At||;;<FIKK""$""((*#(F (,F%)*F&  	/ (@s   <E:c                  > [         TU ]  5         U R                  (       a  U R                  S:w  a  g U R                  S:X  a  U R
                  S:  aF  U =R
                  S-  sl        U R
                  S:X  a!  U R                  5         U R                  S:w  a  g U R                  S:  a  U =R                  S-  sl        U R                  S::  a  U R                  c  U R                  SS9  g U R                  S:X  a  U R                  5         g g )Nr   between_roundsr   r   Tr  r   )r  on_tickr  r   r   r   _resolve_pending_roundr[   r   r  _process_bot_turnr  s    rf   r  TwentyOneGame.on_tick  s    4;;)#;::))//!300A5033q8//1zz%55))A-**a/*))Q.43M3M3U!!!6:: ""$ !re   c          	     B  ^ ^	^
 T R                  5       n[        U5      S::  a  T R                  U(       a  US   OS 5        g U(       a   T R                  S-   [        U5      -  T l        T R                  [        U5      :  a  ST l        ST l        T =R
                  S-  sl        ST l        T R                  5         ST l        T R                  [        SS9  T R                  5         U Hq  m	T	R                  R                  5         T	R                  R                  5         ST	l        S T	l        ST	l        T R%                  T	T R&                  R(                  SS9  Ms     [+        S5       H<  nU H3  m	T R-                  5       nU(       d  M  US:  nT R/                  T	US US	9  M5     M>     T R                  [0        S
S9  T R3                  USS9  T R                  T l        T R7                  ST R
                  T R9                  5       S9  U GH  m	T R;                  T	5      m
T
(       a  T R=                  U	U U
4S j5        OT R7                  ST	R>                  S9  T RA                  T	5      nU(       d  Mh  T	R                  (       a(  URC                  SST	R                  S   RD                  S9  T
(       a  URC                  SST
RD                  S9  URC                  SST RG                  T	5      S9  T RI                  URJ                  T	RL                  5      nURC                  SSUS9  GM     T RN                  nU(       aV  SUl        T RQ                  [R        S9  T RU                  U5        T RW                  U5      (       a  T RY                  U[Z        SS9  T R]                  5         g )Nr   r   r   FF   rc  rw  r   rt  <   T)reset_indexztwentyone-round-begins)roundr  c           	     f   > [         R                  " U STR                  TR                  U T5      S9$ )Nztwentyone-player-shows-card)r   r,  )r   r   r   r-  )r   r   r   showns    rf   rr  ,TwentyOneGame._start_round.<locals>.<lambda>  s-    <#3#35%{{!..vu=	$re   ztwentyone-player-receives-cardsrm  ztwentyone-your-hidden-cardr/  r  ztwentyone-your-shown-cardztwentyone-your-total)r  ztwentyone-your-change-cardscards
turn_soundrb  )/_alive_playersrV  	_end_gamer   r   r   r[   r  r   r~  SOUND_ROUND_START_build_round_deckrm   r  rq   rs   ru   rv   r  r}   rW   ranger}  r  SOUND_ROUND_DEALset_turn_players
turn_indexr{  r  _peek_last_drawn_cardr9  r   r   r  r+  r  r'  r   rp   current_playerannounce_turn
SOUND_TURN_play_target_reminder_sound_modifiers_locked_forrg  SOUND_LOCKDOWN_ACTIVEr|  )r   r  alive
deal_roundr,  revealr   r  currentr   r  s   `        @@rf   r  TwentyOneGame._start_round  s=   ##%u:?NNu58$7(,(@(@1(DE
'RD$##s5z1'(D$
Q%&",,.9>6)"5 FKK""((*#(F (,F%)*F&''AAE (    (J(4'!^F**dV + 	   # 	(4e622$D,=,=dFZFZF\ 	 	
 F..v6E))   !B6;; W==(Dt;;LL4#[[^00 ! 
 LL3"ZZ ! 
 3WDDTDTU[D\]!%!;!;DKKIYIY!Z:G>Z; > %%*+G'*5,,W5))'22++G5JSU+V re   c                6   U R                   S:w  a  g U R                  SS9  U R                  nU(       aV  SUl        U R	                  [
        S9  U R                  U5        U R                  U5      (       a  U R                  U[        SS9  U R                  5         g )Nr   Frw  r   r  rb  rc  )r   advance_turnr  rv   r  r  r  r  rg  r  r|  )r   r
  s     rf   r  (TwentyOneGame._advance_turn_after_action  s    :: 5)%%*+G'*5,,W5))'22++G5JSU+V re   c           	        U R                  5       n[        U5      S:  a  U R                  U(       a  US   OS 5        g SU l        US   US   p2U R	                  5       nU R                  U5      nU R                  U5      nXT:  nXd:  nU R                  SUUR                  UUR                  US9  U R                  XVU5      n	UR                  UR                  4U l
        XV4U l        X@l        Xl        [        U l        [!        SU R"                  R$                  5      n
[!        [&        U
5      U l        U R)                  5         g )Nr   r   r  r   ztwentyone-round-totals)r  player1total1player2total2)r  rV  r  r   r  r  r{  r   _resolve_round_outcomer   r   r   r   r   !BETWEEN_ROUND_RESOLVE_DELAY_TICKSr   r  r}   r[   rc   r|  )r   r|   p1p2r  total_1total_2bust_1bust_2outcomeconfigured_waits              rf   r  TwentyOneGame._settle_round  s-   %%'w<!NN71:d;%
WQZB%%'""2&""2&!!$GGGG 	 	
 --gG)+%%,$6!$*!%,"+L(a!C!CD%()A?%S" re   c                J    SU l         S U l        SU l        SU l        S U l        g )Nr   r   r   )r   r   r   r   r   r   s    rf   r  -TwentyOneGame._clear_pending_round_resolution  s*    +,((,%$*!$&!%)"re   c           	     <   U R                   nU R                  nU(       a  Uc  U R                  5         g U R                  US   5      nU R                  US   5      n[	        U[
        5      (       a  [	        U[
        5      (       d  U R                  5         g U R                  nU R                  u  pgXe:  nXu:  n	US:X  a,  U R                  U5        U R                  SUR                  S9  OeUS:X  a,  U R                  U5        U R                  SUR                  S9  O3U R                  U5        U R                  U5        U R                  S5        U R                  X#XFXxU	5        U R                  X45        U(       aE  U	(       a>  U R                  S5        U R                  U[        5        U R                  U[        5        OoU(       a1  U R                  S	UR                  S9  U R                  U[        5        O7U	(       a0  U R                  S	UR                  S9  U R                  U[        5        U R                  5         U R                  5         U R!                  5       n
[#        U
5      S::  a  U R%                  U
(       a  U
S   OS 5        g U R'                  5         g )
Nr   r   p1_winsztwentyone-player-wins-roundrm  p2_winsztwentyone-round-draw-damageztwentyone-both-busted-closerztwentyone-player-busted)r   r   r  get_player_by_idr   rh   r   r   _apply_round_loss_damager{  r   _play_round_outcome_sounds$_apply_round_end_change_card_effectsrg  
SOUND_BUSTr  r  rV  r  r|  )r   
player_idsr  r  r  r  r  r  r  r  	survivorss              rf   r  $TwentyOneGame._resolve_pending_round&  s0   22
,,W_002"":a=1"":a=1"o..j_6U6U002**44!!i))"-:277K	!))"-:277K))"-))"-:;''R'SYZ11"9f;<''J7''J76rwwG''J76rwwG''J7,,.'')	y>QNN99Q<$? re   c                   U R                   n[        U[        5      (       a  UR                  (       d  g UR                  S:  a&  U=R                  S-  sl        UR                  S:  a  g UR
                  (       a%  UR
                  nS Ul        U R                  X5        g U R                  U5      nU(       d  g X!l        US;   a  [        Ul        g g )Nr   r   >   r   r   )	r  r   rh   r   bot_think_ticksbot_pending_actionexecute_actionr   BOT_DRAW_STAND_DELAY_TICKS)r   r
  r  s      rf   r  TwentyOneGame._process_bot_turnX  s    %%'?337>>""Q&##q(#&&*%%22I)-G&3NN7+	%."((&@G# )re   c                    X:  nX:  nU(       a  U(       d  gU(       a  U(       d  gU(       a.  U(       a'  [        X-
  5      n[        X-
  5      nXV:  a  gXe:  a  ggX:  a  gX:  a  gg)Nr$  r#  draw)abs)r  r  r  r  r  diff_1diff_2s          rf   r  $TwentyOneGame._resolve_round_outcomeo  si    !!&&f)*F)*F  re   c                *  ^ ^ [         TR                  ;   aJ  TR                  R                  [         5        T R                  [        SS9  T R                  UU 4S j5        g [        ST R                  T5      5      nUS::  a  T R                  STR                  S9  g [        STR                  U-
  5      Tl
        US:  a  T R                  T[        5        OT R                  T[        5        T R                  STR                  UTR                  S	9  g )
Nr  rc  c           	     n   > [         R                  " U STR                  TR                  U [        5      S9$ )Nz*twentyone-player-avoids-damage-with-effectr   effect)r   r   r   r  MODIFIER_ESCAPE_ROUTE)r   loserr   s    rf   rr  8TwentyOneGame._apply_round_loss_damage.<locals>.<lambda>  s.    |//@ ::009NO	 re   r   ztwentyone-round-loss-zero-betrm  rN   ztwentyone-player-takes-damage)r   damagern   )r=  rq   remover~  SOUND_EFFECT_EXPIREr9  r  r  r{  r   rn   rg  SOUND_DAMAGE_HEAVYSOUND_DAMAGE)r   r>  r@  s   `` rf   r&  &TwentyOneGame._apply_round_loss_damage  s     E$9$99!!(()>?OO/O;%% Q))%01Q;<UZZPq%((V+,Q;''/AB''|<+EJJvRWRZRZ 	 	
re   c                    SU l         U(       a;  U R                  U[        SS9  U R                  SUR                  UR
                  S9  O%U R                  [        SS9  U R                  S5        U R                  5         g )Nfinishedrn  rc  ztwentyone-game-win)r   rn   K   ztwentyone-game-no-winner)	r   rg  SOUND_GAME_WINr{  r   rn   r~  SOUND_GAME_NO_WINfinish_game)r   winners     rf   r  TwentyOneGame._end_game  sk    
''r'J1&++&))TOO-bO978re   c                X   US:X  a;  U(       a4  U(       a-  U R                  U[        5        U R                  U[        5        g [        XE-
  5      S:*  =(       a    U=(       d    U(       + nUS:X  aE  U R                  X((       a  [        O[        5        U R                  X8(       a  [
        O[        5        g US:X  aE  U R                  X8(       a  [        O[        5        U R                  X((       a  [
        O[        5        g U R                  U[        5        U R                  U[        5        g )Nr4  r   r#  r$  )rg  SOUND_DOUBLE_BUST_DRAWr5  SOUND_CLOSE_WINSOUND_ROUND_WINSOUND_CLOSE_LOSESOUND_ROUND_LOSESOUND_ROUND_DRAW)	r   r  r  r  r  r  r  r  close_margins	            rf   r'  (TwentyOneGame._play_round_outcome_sounds  s     fF'',BC'',BC7,-2MF<Lf7Mi''|OQ`a'',<Rbci''|OQ`a'',<Rbc##B(89##B(89re   rG   rc  c               T    U R                  U5      nU(       a  UR                  X#S9  g g )Nrc  )r   r~  )r   r   
sound_namerd  r   s        rf   rg  $TwentyOneGame._play_sound_for_player  s(     }}V$OOJO6 re   c                    U R                  5        H4  nUR                  UR                  :w  d  M  U R                  U[        SS9  M6     g Nr  rc  )r  r   rg  SOUND_OPPONENT_STANDr   r   others      rf   r  (TwentyOneGame._play_opponent_stand_sound  s<    ((*Exx699$++E3GPR+S +re   c                Z   U[         [        4;   a  U R                  [        SS9  g U[        [
        [        [        [        [        [        [        4;   a  U R                  [        SS9  g U[        [        [        [         4;   a  U R                  ["        SS9  g U[$        [&        4;   a  U R                  [(        SS9  g U[*        [,        [.        [0        [2        [4        [6        [8        [:        [<        [>        4;   a  U R                  [@        SS9  g U[B        ;   a  U RE                  U5        g U[F        [H        [J        [L        4;   a  U R                  [N        SS9  g U[P        [R        [T        [V        [X        [Z        [\        4;   a  U R                  [^        SS9  g U R                  [`        SS9  g NrH  rc  )1MODIFIER_ROUND_ERASEMODIFIER_ALL_IN_SILENCEr~  SOUND_MOD_ENDGAMEMODIFIER_BREAK_SHIELDSMODIFIER_BREAK_SHIELDS_PLUSMODIFIER_HAND_TAXMODIFIER_HAND_TAX_PLUSMODIFIER_MIND_TAXMODIFIER_MIND_TAX_PLUSr=  MODIFIER_DRAW_SILENCESOUND_MOD_ENEMYMODIFIER_RAISE_1MODIFIER_RAISE_2MODIFIER_RAISE_2_PLUSMODIFIER_EXACT_21_SURGESOUND_MOD_RAISEMODIFIER_GUARDMODIFIER_GUARD_PLUSSOUND_MOD_DEFENDMODIFIER_DRAW_2MODIFIER_DRAW_3MODIFIER_DRAW_4MODIFIER_DRAW_5MODIFIER_DRAW_6MODIFIER_DRAW_7MODIFIER_PRECISION_DRAWMODIFIER_PRECISION_DRAW_PLUSMODIFIER_PRIME_DRAWMODIFIER_HEX_DRAWMODIFIER_DARK_BARGAINSOUND_MOD_DRAWTARGET_VALUE_MODIFIERS_play_target_change_soundMODIFIER_REDRAFTMODIFIER_REDRAFT_PLUSMODIFIER_SHARED_CACHEMODIFIER_ARCANE_CACHESOUND_MOD_REFRESHMODIFIER_SCRAPMODIFIER_RECYCLEMODIFIER_SWAP_DRAWMODIFIER_BREAKMODIFIER_BREAK_PLUSMODIFIER_LOCKDOWNMODIFIER_AID_RIVALSOUND_MOD_CONTROLSOUND_PLAY_CHANGE_CARDr   r  s     rf   r  "TwentyOneGame._play_modifier_sound  s   ,.EFFOO-bO9"'""!!	
 	
 OOOBO7!#	
 
 OOOBO7(;<<OO,RO8#(!
 
 OON2O6--**84!!!	
 
 OO-bO9
 
 OO-bO9.r:re   c                    U[         :X  a  U R                  [        SS9  g U[        :X  a  U R                  [        SS9  g U[
        :X  a  U R                  [        SS9  g U R                  [        SS9  g ra  )MODIFIER_TARGET_17r~  SOUND_TARGET_17MODIFIER_TARGET_24SOUND_TARGET_24MODIFIER_TARGET_27SOUND_TARGET_27r  s     rf   r  'TwentyOneGame._play_target_change_sound  sf    ))OOOBO7))OOOBO7))OOOBO73re   c                    U R                  5       nUS:X  a  g US:X  a  U R                  U[        SS9  g US:X  a  U R                  U[        SS9  g US:X  a  U R                  U[        SS9  g g )Nr   rK   r  rc  rL   rM   )r  rg  r  r  r  )r   r   r  s      rf   r  )TwentyOneGame._play_target_reminder_sound  sy    %%'R<R<'''KR<'''KR<'''K re   c                   U R                  U5      nU R                  U5      nXS:  a  U R                  U[        SS9  OXS:  a  U R                  U[        SS9  Xd:  a  U R                  U[        SS9  g Xd:  a  U R                  U[        SS9  g g r[  )r  rg  SOUND_BET_UPSOUND_BET_DOWN)r   r   r  r  r  my_bet_afteropp_bet_afters          rf   r  %TwentyOneGame._play_bet_change_sounds,  s     ((0))(3'''R'H)''r'J)'',r'J+''.'L ,re   c                |    U R                  U5      nU R                  5       nX#:w  a  g U R                  U[        SS9  g )Nrb  rc  )r  r  rg  SOUND_NEAR_BUST)r   r   r  r  s       rf   _play_near_bust_sounds$TwentyOneGame._play_near_bust_sounds@  s=      (%%'?##FOB#Gre   c                    [        X5      $ r   )compute_bot_thinkr   s     rf   r   TwentyOneGame.bot_thinkH  s     ..re   c                N    XS-
  :  a  gU R                   (       a  X:  a  X::  a  gg)Nr   r   r   rs   )r  r  	opp_totalr  s       rf   _bot_choose_hit_or_stand&TwentyOneGame._bot_choose_hit_or_standK  s)     A:!!e&7EOre   c                   U R                  U5      nU(       d  g U R                  U5      nU(       d  US   $ U R                  5       nU R                  U5      nU R	                  X5      nU R                  XXVU5      nU R                  XXVU5      nU R                  XXx5      n	S n
SnU H$  nU R                  UUUUUUUU	S9nX:  d  M   UnUn
M&     U
$ )Nr           )likely_losingconfident_winningneeds_new_cards)	_playable_modifiersr  r  r  _bot_estimate_opponent_total_bot_is_likely_losing_bot_is_confident_winning_bot_needs_new_change_cards_bot_modifier_score)r   r   playabler  r  r  estimated_opp_totalr  r  r  best_modifier
best_scorer  scores                 rf   rT  *TwentyOneGame._bot_choose_modifier_to_playX  s	   ++F3$$V,A;%%'  ("??Q22e&
 !::e&
 ::m
 %)
 H,,+"3 / - 	E !"
 ( ! re   c                    U R                  U5      n[        [        S U 5       5      5      nUR                  (       d  U$ X@R	                  X5      -   $ )Nc              3  8   #    U  H  oR                   v   M     g 7fr   r  r  s     rf   r$  =TwentyOneGame._bot_estimate_opponent_total.<locals>.<genexpr>  s     !F))r  )r  floatr  rm   _bot_expected_hidden_rank)r   r   r  visible_cardsvisible_totals        rf   r  *TwentyOneGame._bot_estimate_opponent_total  sJ     44X>c!F!FFG}}  ==fOOOre   c                >   [        SS5       Vs0 s H#  o3[        SU R                  R                  5      _M%     nnUR                   H;  nUR                  UR                  S5      S:  d  M%  XER                  ==   S-  ss'   M=     U R                  U5       H;  nUR                  UR                  S5      S:  d  M%  XER                  ==   S-  ss'   M=     [        UR                  5       5      nUS::  a  g[        S UR                  5        5       5      nXv-  $ s  snf )Nr      r         @c              3  .   #    U  H  u  pX-  v   M     g 7fr   r\   )r#  r+  counts      rf   r$  :TwentyOneGame._bot_expected_hidden_rank.<locals>.<genexpr>  s     F~t|~s   )r  r  r}   rZ   rm   r   r+  r  r  valuesitems)r   r   r  r+  countsr,  	remainingweighteds           rf   r  'TwentyOneGame._bot_expected_hidden_rank  s     EJ!RLQLDAt||6677LQKKDzz$))Q'!+yy!Q&!   00:Dzz$))Q'!+yy!Q&! ; (	>Fv||~FF## Rs   *Dc                    X5:  a  gUR                   (       a  XC:  a  gUS-   U:  a  gUR                  UR                  :*  =(       a    X5S-
  :  $ )NT      ?r   rs   rn   )r   r   r  r  r  r  s         rf   r  #TwentyOneGame._bot_is_likely_losing  sM     >!!&9&A3;,,yyHKK'>EQJ,>>re   c                    X$:  a  gUR                   (       a  X#:  $ X$S-
  :  a	  X#S-   :  a  gU R                  UR                  :  =(       a    X#S-   :  $ )NFr   Tr   r  )r   r  r  r  r  s        rf   r  'TwentyOneGame._bot_is_confident_winning  sU     >!!//QJ5!,C#Cyy8;;&K5!4K+KKre   c                   ^ ^^ U Vs/ s H  oU[         [        4;  d  M  UPM     nnU(       d  g[        U5      S:X  a  U(       a  gU(       a  [        UUU 4S jU 5       5      (       d  ggs  snf )NTr   c              3  F   >#    U  H  nTR                  TUTS 9v   M     g7f))r  N)_bot_has_immediate_round_impact)r#  mr  r   r   s     rf   r$  <TwentyOneGame._bot_needs_new_change_cards.<locals>.<genexpr>  s+      %
  00N_0` s   !F)r  r  rV  any)r   r   r  r  r  r  non_redrafts   ``  `  rf   r  )TwentyOneGame._bot_needs_new_change_cards  sg     #+a(Q8HJ_7`.`q(a{q ] %
 %
 "
 "
  bs
   A+A+c                  U/ [         P[        P[        P[        P[        P[
        P[        P[        P[        P[        P[        P[        P[        P[        P[        P[        P[         P["        P[$        P[&        P[(        P[*        P[,        P[.        P[0        P[2        P[4        P[6        P[8        P[:        P[<        P[>        P[@        P7;   a  gU[B        [D        [F        4;   a  U$ g)NTF)$r{  r|  r}  ru  rv  rw  rx  ry  rz  rr  rs  r  r  r  r  r  r  r  re  rf  r  rg  rh  ri  rj  r  r~  r  r=  rp  rb  rk  rc  rm  rn  ro  )r   r   r  r  s       rf   r  -TwentyOneGame._bot_has_immediate_round_impact  s|     "
#"
("
  "
 	"

 "
 "
 "
 "
 "
 "
  "
 "
 "
 "
  "
  !"
" #"
$ %"
& #'"
( ()"
* "+"
, -"
. #/"
0 1"
2 #3"
4 "5"
6 7"
8 "9"
: ";"
< $="
> !?"
@ "A"
B $C"
 "
F (*:<QRR$$re   c                  XT-
  n	U R                  U5      n
U R                  U5      nU[        :X  a  U(       a  S$ S$ U[        :X  a  U(       a  S$ S$ U[        :X  a  U(       a  S$ S$ U[        :X  a  U(       a  S$ S$ U[
        :X  a  U(       a  S$ S$ U[        :X  a  U(       a  S$ S$ U[        :X  a  U(       a  S$ S$ U[        :X  a
  U	S	:  a  S$ S$ U[        :X  a  U	S	:  a  g
U(       a  S$ S$ U[        :X  a
  U	S	:  a  S$ S$ U[        [        [        [        [        [         4;   a8  [#        UR%                  S5      S   5      nU	S	::  a  gX:  a  gX:X  a  SOSnSU-   $ U[&        :X  a	  XE:  a  S$ S$ U[(        :X  a  XES-   :  a  S$ S$ U[*        :X  a  U(       a  US:  a  S$ S$ U[,        :X  a!  U
(       a  U(       a  SU
R.                  S-  -   $ gU[0        :X  a  U(       a  XE:  a  ggU[2        :X  a1  U(       a)  U
(       a"  U
R.                  UR.                  :  a  U(       a  ggU[4        :X  a  U(       a  UR6                  (       a  S$ S$ U[8        :X  a  U(       a  UR6                  (       a  S$ S$ U[:        :X  a5  U(       a  UR<                  (       a  gU(       a  UR<                  (       a  S$ S$ U[>        :X  a  U(       a  S$ S$ U[@        :X  a  U(       a  S$ S$ U[B        :X  a  U(       a  S$ S$ U[D        :X  a  U(       a  S$ S$ U[F        :X  a  U(       a  S$ S$ U[H        :X  a  U(       a  S$ S$ U[J        :X  a  U(       a  S$ S$ U[L        :X  a  U(       a  S$ S$ U[N        :X  a  gU[P        :X  a  U(       a  S$ S$ U[R        :X  a  U(       a  S$ S$ U[T        :X  a
  US:X  a  S$ S$ U[V        :X  a  U(       a  S$ S$ U[X        :X  a  U(       a  S$ S$ U[Z        :X  a  U(       a  S$ S$ U[\        :X  a  U(       a  S$ S$ U[^        :X  a  gg)Ng      @g       g       @g      "@g      g      $@r  g      r   g      !@g      @rI   r   g      g      r  r  r   g      #@rK   g      @g      4@g       g      @g      @g       @g      r   g      "g      4)0r   r  r  rr  rs  rm  rn  ro  r{  r|  r}  ru  rv  rw  rx  ry  rz  rT   r[  r  r  r  r  r+  r  r  r  rq   r  r  rp   re  rf  r  rg  rh  ri  rj  r  r~  r  r=  rp  rb  rk  rc  MODIFIER_SALVAGEr  )r   r   r  r  r  r  r  r  r  gapopponent_lastown_lastr+  	closenesss                 rf   r  !TwentyOneGame._bot_modifier_score  s    n228<--f5'')33t3,,)33t3~%'31T1**(42d2''+355''+355,,+355..'3+t+33Qw+355**'3+t+
 
 x~~c*1-.Daxz#{I?")).32d2))1*,36$6))+3EE~%m004788''EN))Mm.@.@8==.PUb~%'H,D,D3N$N**'H,D,D3N$N((!3!3+0B0B3LL--+35522+355,,'31T1((+355--+355(('31T1--'31T1,,)33t3((,,+355,,'31T1..2+3/4/++'31T1,,+355..+355'''31T1))re   c                  ^ ^^ T R                  T5      mT(       d  g U[        :X  a$  T R                  TU5        T R                  TSSS9  g U[        :X  a$  T R                  TU5        T R                  TSSS9  g U[
        :X  ag  T R                  TU5        T R                  T5      nU(       a+  T R                  U5        T R                  STR                  S9  T R                  TSSS9  g U[        :X  aD  T R                  TSS9nUS:  a  T R                  S	TR                  US
9  T R                  TU5        g U[        :X  aD  T R                  TSS9nUS:  a  T R                  S	TR                  US
9  T R                  TU5        g U[        :X  a#  T R                  TSSS9  T R                  TSSS9  g U[        [        [         ["        [$        [&        4;   a  T R)                  T5      (       a1  T R+                  T[,        5        T R                  STR                  S9  g [/        UR1                  S5      S   5      nT R3                  U5      nU(       a  T R5                  TUU4S jSS9  STl        g T R+                  T[,        5        T R                  SUS9  g U[8        :X  a  T R                  T5      nU(       aB  T R+                  T[:        5        T R                  U5        T R                  STR                  S9  g T R+                  T[,        5        T R                  S5        g U[<        :X  a  T R                  T5      nU(       aB  T R+                  T[:        5        T R                  U5        T R                  STR                  S9  g T R+                  T[,        5        T R                  S5        g U[>        :X  Ga>  T RA                  T5      nT RA                  T5      nU(       a  U(       d(  T R+                  T[,        5        T R                  S5        g T R                  T5      n	T R                  T5      n
U	(       a  U
(       d(  T R+                  T[,        5        T R                  S5        g TRB                  RE                  U
5        U
RF                  Tl$        TRB                  RE                  U	5        U	RF                  Tl$        STl        STl        T R+                  T[:        5        T R                  S5        g U[J        :X  a#  T RM                  TSSS9  T R                  TSSS9  g U[N        :X  a#  T RM                  TSSS9  T R                  TSSS9  g U[P        :X  a$  T R                  TU5        T R                  TSSS9  g U[R        :X  a  T RM                  TSSS9  T R)                  T5      (       a1  T R+                  T[,        5        T R                  STR                  S9  g T RU                  5       nU(       a  T R5                  TUUU 4S jSS9  STl        g T R+                  T[,        5        T R                  ST RW                  S[R        5      S9  g U[X        :X  a  T R                  TU5        [[        TR\                  5      S-  nT RM                  TUSS9  T R)                  T5      (       a1  T R+                  T[,        5        T R                  STR                  S9  g T R_                  T5      nU(       a  T R5                  TUUU 4S jSS9  STl        g T R+                  T[,        5        T R                  ST RW                  S[X        5      S9  g U[`        :X  a0  S T l1        ST l2        T Rg                  5         T R                  S!5        g U[h        ;   a;  T R                  TU5        U[j        ;   a  T R                  S"T Rm                  5       S#9  g U[n        :X  a  T Rq                  T5      nU(       a`  T R+                  T[:        5        U[r        :X  a  T Ru                  [v        S$S%9  T R                  S&TR                  T RW                  SU5      S'9  g T R+                  T[,        5        T R                  S(5        g U[x        :X  a  TRz                  (       a  [[        TRz                  5      n[r        TRz                  ;   nTRz                  R}                  5         T R+                  T[:        5        U(       a  T Ru                  [v        S$S%9  T R                  S)TR                  US
9  g T R+                  T[,        5        T R                  S*5        g U[r        :X  al  TRz                  (       a4  TRz                  R}                  5         T R                  S+TR                  S9  T R                  TU5        T Ru                  [~        S,S%9  g U[        :X  a  T R)                  T5      (       a1  T R+                  T[,        5        T R                  STR                  S9  g T R_                  T5      nU(       a  T R5                  TUU4S- jSS9  STl        g T R+                  T[,        5        T R                  S.5        g U[        :X  a  T R                  TU5        T R)                  T5      (       a1  T R+                  T[,        5        T R                  STR                  S9  g T R_                  T5      nU(       a  T R5                  TUU4S/ jSS9  STl        g T R+                  T[,        5        T R                  S05        g U[        :X  a  T R)                  T5      (       a1  T R+                  T[,        5        T R                  STR                  S9  g T R_                  T5      nU(       a  T R5                  TUU4S1 jSS9  STl        T R                  TSSS9  g U[j        ;   a1  T R                  TU5        T R                  S"T Rm                  5       S#9  g U[        :X  a  T R                  TU5        g U[        :X  a  T R)                  T5      (       a1  T R+                  T[,        5        T R                  STR                  S9  g T R_                  T5      nU(       a  T R5                  TUU4S2 jSS9  STl        g T R+                  T[,        5        T R                  S35        g g )4Nr   Trw  ztwentyone-last-face-up-returnedrm  r   )limitr   ztwentyone-remove-defend-effects)r   r  r   rl  rI   c                D   > [         R                  " U STR                  S9$ rp  rq  r   r   s    rf   rr  1TwentyOneGame._resolve_modifier.<locals>.<lambda>  s    <3C3C 84re   rt  Fztwentyone-no-rank-cardr  ztwentyone-no-face-up-removeztwentyone-own-face-up-returnedztwentyone-no-face-up-returnz twentyone-exchange-needs-face-upztwentyone-exchange-failedztwentyone-exchange-resolvesannounce_sound   c           	     n   > [         R                  " U STR                  TR                  U [        5      S9$ Nztwentyone-player-draws-fromr  )r   r   r   r  r~  )r   r  r   s    rf   rr  r    s.    <3C3C5'}}!%!6!6v?P!Q	4re   z twentyone-modifier-found-no-cardr   r  c           	     n   > [         R                  " U STR                  TR                  U [        5      S9$ r  )r   r   r   r  r  )r   r   r   s    rf   rr  r  +  s.    <3C3C5%{{!%!6!6v?T!U	4re   r  ztwentyone-round-erasedztwentyone-target-changed)r  r  rc  z twentyone-player-destroys-effectr;  ztwentyone-no-effect-destroyz%twentyone-player-destroys-all-effectsztwentyone-no-effects-destroyztwentyone-player-clears-effectsrH  c                D   > [         R                  " U STR                  S9$ Nz twentyone-player-precision-drawsrm  rq  r  s    rf   rr  r  }      <3C3C:%{{4re   ztwentyone-precision-draw-nonec                D   > [         R                  " U STR                  S9$ r  rq  r  s    rf   rr  r    r  re   z"twentyone-precision-draw-plus-nonec                D   > [         R                  " U STR                  S9$ )Nztwentyone-player-prime-drawsrm  rq  r  s    rf   rr  r    s    <3C3C6%{{4re   c                D   > [         R                  " U STR                  S9$ )Nz%twentyone-player-draws-from-aid-rivalrm  rq  )r   r  s    rf   rr  r    s    <3C3C?'}}4re   ztwentyone-aid-rival-none)Er  rm  _place_table_effectr  rn  ro  _extract_last_drawn_card_return_card_to_top_of_deckr{  r   re  _remove_guard_effectsrf  r  ru  rv  rw  rx  ry  rz  ry  rg  rz  rT   r[  _draw_specific_rankr  rs   r  SOUND_CONTROL_SUCCESSr  r  r   rm   rO  r   ru   r  _discard_random_modifiersr  r  r~  _draw_highest_cardr  r  rV  rp   _draw_best_possible_cardrb  r   r[   r  TABLE_EFFECT_MODIFIERSr  r  r  _pop_last_table_effectr  r~  SOUND_LOCKDOWN_ENDr  rq   r  SOUND_LOCKDOWN_APPLYr{  r|  r}  r  r  )r   r   r  removedremoved_countr+  r,  player_recentopponent_recentfirstseconddiscard_countr  had_lockdownr  s   ``            @rf   r  TwentyOneGame._resolve_modifierx  sj   $$V,''$$VX6''D'A''$$VX6''D'A,,$$VX633H=G009  !B8== Y''D'A-- 66vQ6GMq   5fkkQ^ !  $$VX622 66vQ6GMq   5fkkQ^ !  $$VX6,,''D'A''!d'C
 
 %%f--++F4EF  !>v{{ Sx~~c*1-.D++D1D&&% &* '  (-$  ++F4EF  !9 E~%33H=G++F4IJ009  !B8== Y  ++F4EF  !>?''33F;G++F4IJ009  !A&++ V  ++F4EF  !>?)) 66v>M"88BO ++F4EF  !CD11&9E228<F++F4EF  !<=KKv&(.		F%MM  '*/((H'#(F %*H"''0EF:;''**61T*J''D'A,,**61T*J''D'A,,$$VX6''D'A((**61T*J%%h//++F4EF  !>x}} U**,D&&% &* ' 
 */&  ++F4EF  6!2249JK !  ,,$$VX6 0 01Q6M**6=QU*V%%f--++F4EF  !>v{{ S008D&&% &* ' 
 (-$  ++F4EF  6!2249NO !  ++)DJ)*D&00256--$$VX611  !;DDXDXDZ [~%11(;G++F4IJ//OO$6rOB  6!;;00w? !   ++F4EF  !>?**''H4450H4L4LL((..0++F4IJOO$6rOB  ;!;; !   ++F4EF  !?@((''((..0  !B6;; W$$VX6OO0O<..%%f--++F4EF  !>v{{ S008D&&%
 &* ' 	 (-$  ++F4EF  !@A33$$VX6%%f--++F4EF  !>v{{ S008D&&%
 &* ' 	 (-$  ++F4EF  !EF**%%f--++F4EF  !>v{{ S008D&&%
 &* ' 	 (-$''D'A--$$VX67@T@T@VW''$$VX6))%%h//++F4EF  !>x}} U00:D&&%
 &* ' 	 */&++F4EF  !;<) *re   c                    U R                  5        Vs/ s H.  n[        U[        5      (       d  M  UR                  S:  d  M,  UPM0     sn$ s  snf rS  )r  r   rh   rn   )r   r   s     rf   r  TwentyOneGame._alive_players  s?    224d4a
1o8V[\[_[_bc[c4ddds   AAAc                n    U R                  5        H!  nUR                  UR                  :w  d  M  Us  $    g r   )r  r   r]  s      rf   r  TwentyOneGame._opponent_of  s/    ((*Exx699$ + re   c                f    U R                  5       n[        U5      S:  a  g[        S U 5       5      $ )Nr   Fc              3  8   #    U  H  oR                   v   M     g 7fr   r  r#  r   s     rf   r$  7TwentyOneGame._both_players_standing.<locals>.<genexpr>       4Gq??Gr  )r  rV  all)r   r|   s     rf   r  $TwentyOneGame._both_players_standing  s0    %%'w<!4G444re   c                t    U R                  5       n[        S U 5       5      (       d  g U H
  nSUl        M     g )Nc              3  8   #    U  H  oR                   v   M     g 7fr   r  r  s     rf   r$  6TwentyOneGame._clear_pending_stands.<locals>.<genexpr>  r  r  F)r  r  rs   )r   r|   r   s      rf   r  #TwentyOneGame._clear_pending_stands  s5    %%'4G444A#AO re   c                :    [        S UR                   5       5      $ )Nc              3  8   #    U  H  oR                   v   M     g 7fr   r  r  s     rf   r$  ,TwentyOneGame._hand_total.<locals>.<genexpr>  s     599r  )r  rm   r   s     rf   r  TwentyOneGame._hand_total  s    5555re   c                V    [        U R                  5      S::  a  / $ U R                  SS  $ Nr   )rV  rm   rm  s    rf   r  %TwentyOneGame._opponent_visible_cards  s(    v{{q I{{12re   c                    U R                  5        H6  n[        UR                  5       H  nU[        ;   d  M  [        U   s  s  $    M8     g)Nr   )r  reversedrq   r  r   r   r  s      rf   r  TwentyOneGame._current_target  sC    ))+F$V%;%;<551(;; = , re   c                   [        SU R                  R                  5      nU R                  U5      nU(       d  U$ SnUR                   H  nU[
        :X  a  US-  nM  U[        :X  a  US-  nM%  U[        :X  a  US-  nM6  U[        :X  a  US-  nMG  U[        :X  a  US-  nMX  U[        :X  a  US-  nMi  U[        :X  a  U[        UR                  5      S-  -  nM  U[        :X  a  U[        UR                  5      -  nM  U[        :X  a  US-  nM  U[         :X  d  M  U R#                  U5      S:X  d  M  US-  nM     SnSnUR                   H6  nU[$        :X  a  US-  nM  U[&        :X  a  US-  nM%  U[(        :X  d  M1  US-  nM8     SnU R+                  5        H'  n	XR                  R-                  [.        5      S-  -  nM)     [        SX$-   U-
  U-   U-   5      $ )	Nr   r   r   rN   r   rH   r   rG   )r  r}   rV   r  rq   rm  rn  ro  r|  re  rf  rg  rV  rp   rh  r  rp  r  rr  rs  r  r  r  rc  )
r   r   baser  increaser  	reductionself_penaltyglobal_pressurer7  s
             rf   r  TwentyOneGame._current_bet  s   1dll++,$$V,K 00H++A--A22A99A33A88A..C 0 01Q6633C 0 01122B449I9I(9SWY9YB) 1, 	..H>)Q	00Q	22! / ..0K::@@AXY\___O 1 1do	1L@?RSSre   c                Z    U R                  U5      nU(       d  g[        UR                  ;   $ NF)r  r  rq   r   r   r  s      rf   r  #TwentyOneGame._modifiers_locked_for)  s)    $$V, H$<$<<<re   c                v    UR                    Vs/ s H  nU R                  X5      (       d  M  UPM     sn$ s  snf r   )rp   rU  r+  s      rf   r  !TwentyOneGame._playable_modifiers/  s=     #,,
,00B ,
 	
 
s   66c                   U R                  U5      (       a  gU[        ;  a  gU[        :X  a7  U R                  U5      S:  =(       a    [	        UR
                  5      [        :  $ U[        :X  a7  U R                  U5      S:  =(       a    [	        UR
                  5      [        :  $ U[        :X  a  [	        UR                  5      S:  a  gU[        ;   a@  U[        ;   a  [        U   U R                  5       :g  $ [	        UR
                  5      [        :  $ U R                  U5      nU(       d  gU[        :X  a  U R                  U5      S L$ U[         :X  a  U R                  U5      S L$ U["        :X  a-  U R                  U5      S L=(       a    U R                  U5      S L$ U[$        :X  a  ['        UR
                  5      $ U[(        :X  a  ['        UR
                  5      $ U[*        :X  a  [	        UR                  5      S:  $ g)NFr   r   T)r  MODIFIER_POOLre  _count_defense_effectsrV  rq   TABLE_EFFECT_LIMITrf  r  rp   r  r  r  r  r  r   r  r  r  rr   r  r~  )r   r   r  r  s       rf   rU  *TwentyOneGame._is_single_modifier_playable6  s   %%f--=(--++F3q8 E../2DD 22++F3q8 E../2DD ,,V5E5E1F1J--11-h74;O;O;QQQv--.1CCC$$V,~%--h7tCC''--f5TAA))**62$> E..x8D ~%0011**0011((v''(A--re   c                (  ^ ^^ U[         ;   aD  T R                  5        H0  nUR                   Vs/ s H  oD[         ;  d  M  UPM     snUl        M2     TR                  R                  U5        [	        TR                  5      [
        :  a  TR                  R                  S5      mT R                  [        SS9  T[        :X  a  T R                  [        SS9  T R                  UUU 4S j5        [	        TR                  5      [
        :  a  M  g g s  snf )Nr   r  rc  c           	     f   > [         R                  " U STR                  TR                  U T5      S9$ )Nztwentyone-player-effect-expiresr;  )r   r   r   r  )r   r   r
  r   s    rf   rr  3TwentyOneGame._place_table_effect.<locals>.<lambda>s  s-    |//5!;;00A	 re   )r  r  rq   rO  rV  r=  r  r~  rB  r  r  r9  )r   r   r  r   tr
  s   ``   @rf   r  !TwentyOneGame._place_table_effecte  s    --((* 00%0!=S4SA0%! +
 	%%h/&((),>>,,003GOO/O;++ 22>%% &((),>>%s   D Dc                Z    U R                   (       d  g U R                   R                  5       $ r   )rq   r  rm  s    rf   r  $TwentyOneGame._pop_last_table_effect{  s#    %%%%))++re   c                    U R                  U5      nU(       d  g[        UR                  ;   =(       d    [        UR                  ;   $ r5  )r  rk  rq   rc  r6  s      rf   ry  TwentyOneGame._draws_locked_for  s?    $$V,!X%=%== C&(*B*BB	
re   c                   Sn/ nUR                    H0  nU[        [        4;   a  X2:  a  US-  nM  UR                  U5        M2     XAl         U$ )Nr   r   )rq   rr  rs  rO  )r   r   r  r
  retainedr<  s         rf   r   #TwentyOneGame._remove_guard_effects  sS     ,,F.*=>>7?1OOF#	 -
 "*re   c                :    [        S U R                   5       5      $ )Nc              3  J   #    U  H  nU[         [        4;   d  M  S v   M     g7f)r   N)rr  rs  )r#  r<  s     rf   r$  7TwentyOneGame._count_defense_effects.<locals>.<genexpr>  s'      
0.*=>> A0s   #	#)r  rq   rm  s    rf   r<  $TwentyOneGame._count_defense_effects  s"     
 00
 
 	
re   c                  ^  T R                   (       a  T R                   R                  5       (       a  g [        [        [	        T R                   R
                  5      5      U 4S jS9nT R                   R
                  R                  U5      $ )Nc                J   > TR                   R                  U    R                  $ r   r~   r  r+  rW  r   s    rf   rr  2TwentyOneGame._draw_highest_card.<locals>.<lambda>  s    499??5;Q;V;Vre   r  )r~   is_emptyr  r  rV  r  r  )r   highest_indexs   ` rf   r   TwentyOneGame._draw_highest_card  s\    yyDII..00#diioo&'-V
 yy""=11re   c                  ^ ^ T R                  U5      mT(       d  g UR                  S:  a]  [        TR                  ;   aI  TR                  R	                  [        5        T R                  [        SS9  T R                  UU 4S j5        UR                  S:  a_  [        TR                  ;   aJ  TR                  R	                  [        5        T R                  [        SS9  T R                  UU 4S j5        g g g )Nr   r  rc  c           	     n   > [         R                  " U STR                  TR                  U [        5      S9$ Nztwentyone-player-effect-breaksr;  r   r   r   r  ri  r   ownerr   s    rf   rr  6TwentyOneGame._handle_mind_tax_break.<locals>.<lambda>  s.    |//4 ::009JK	 re   r   c           	     n   > [         R                  " U STR                  TR                  U [        5      S9$ rZ  r   r   r   r  rj  r\  s    rf   rr  r^    s.    |//4 ::009OP	 re   )	r  rv   ri  rq   rA  r~  rB  r9  rj  )r   actorr]  s   ` @rf   r  $TwentyOneGame._handle_mind_tax_break  s    !!%($$).?5CXCX.X!!(():;OO/O;%% $$).DH]H].]!!(()?@OO/O;%% /^)re   c                  ^ ^^ X4X!44 H  u  nm[         UR                  ;   aP  TR                  (       a?  [        TR                  5      mT R	                  TTSS9  T R                  UU U4S j5        Mj  [        UR                  ;   d  M  TR                  (       d  M  [        TR                  5      S-  mTS:  d  M  T R	                  TTSS9  T R                  UU U4S j5        M     g )NTr  c           
     p   > [         R                  " U STR                  TTR                  U [        5      S9$ )Nz*twentyone-player-discards-all-change-cardsr   r  r<  r`  r   r  r   r  s    rf   rr  DTwentyOneGame._apply_round_end_change_card_effects.<locals>.<lambda>  s1    <#3#3D%{{##44V=ST$re   r   r   c           
     p   > [         R                  " U STR                  TTR                  U [        5      S9$ )Nz&twentyone-player-discards-change-cardsre  r[  rf  s    rf   rr  rg    s1    |'7'7"D#);;"'#'#8#8AR#S(re   )rj  rq   rp   rV  r  r9  ri  )r   r  r  r]  r  r  s   `   @@rf   r(  2TwentyOneGame._apply_round_end_change_card_effects  s      "h1ME6%)>)>>6CSCSF,,-..vuT.R))  E$9$99f>N>N>NF,,-2192265QU2V--' 2re   c                    U R                  5        H*  n[        UR                  ;   d  M  U R                  USSS9  M,     g )Nr   Trw  )r  r  rq   r  r   s     rf   r  &TwentyOneGame._trigger_harvest_rewards  s8    ))+F6#9#99++FA+E ,re   c           
     <   / nU R                   S-  n[        SU R                  R                  5      n[	        U5       H4  n[	        SS5       H!  nUR                  [        X%SS95        US-  nM#     M6     [        US9U l        U R                  R                  5         g )Ni  r   r  r   )r   r+  suitr  )
r   r  r}   rZ   r  rO  r   r   r~   shuffle)r   r  card_idrZ   rI   r+  s         rf   r  TwentyOneGame._build_round_deck  s    ##d*DLL334
z"AaTWa@A1 % # u%			re   c                    U R                   (       d  g U R                   R                  5       (       a  g U R                   R                  5       $ r   )r~   rU  draw_oner   s    rf   r}  TwentyOneGame._draw_card  s5    yy99yy!!##re   c                &   U R                   (       d  g U R                   R                  5       (       a  g [        U R                   R                  5       H<  u  p#UR                  U:X  d  M  U R                   R                  R                  U5      s  $    g r   )r~   rU  rN  r  r+  r  )r   r+  rW  r,  s       rf   r  !TwentyOneGame._draw_specific_rank  se    yy99$TYY__5KEyyD yy**511 6 re   c                p  ^  T R                   (       d  g T R                   (       a  T R                   R                  5       (       a  g T R                  5       nT R                  U5      nSnSn[	        T R                   R
                  5       H'  u  pgUR                  nX8-   n	X::  d  M  X:  d  M#  UnUnM)     US:  a%  T R                   R
                  R                  U5      $ [        [        [        T R                   R
                  5      5      U 4S jS9n
T R                   R
                  R                  U
5      $ )Nr   c                J   > TR                   R                  U    R                  $ r   rQ  rR  s    rf   rr  8TwentyOneGame._draw_best_possible_card.<locals>.<lambda>	  s    diiooe499re   rT  )r~   rU  r  r  rN  r  r+  r  r  r  rV  )r   r   r  r
  
best_index
best_valuerW  r,  value	projectedlowest_indexs   `          rf   r  &TwentyOneGame._draw_best_possible_card	  s    yyyyDII..00%%'""6*

$TYY__5KEIIEI"u'9"
"
 6 ?99??&&z22#diioo&'9
 yy""<00re   T)rv  c               P  ^ ^^ UR                   R                  T5        U(       a  TR                  OS Ul        T(       ag  U(       a  T R	                  UUU 4S j5        O6T R                  USTR                  S9  T R                  SUR                  US9  T R                  U5        g g )Nc                d   > [        T5      (       a  T" U 5      OT STR                  U T5       S3$ )N .)callabler-  )r   ru  r,  r   s    rf   rr  1TwentyOneGame._add_card_to_hand.<locals>.<lambda>+	  s8    6>6O6O?62Udeef,,VT:;1>re   z-twentyone-player-receives-hidden-card-privater  z%twentyone-player-receives-hidden-cardr   r0  )
rm   rO  r   ru   r9  _speak_private_lr+  r{  r   r  )r   r   r,  ru  rv  s   ` `` rf   r  TwentyOneGame._add_card_to_hand	  s     	4 /?DGGT!)) %%C & 
   ;!;;" ! 
 ''/' re   c                    [        U S5      (       a  U R                  XS5        U R                  U5      nU(       a  UR                  US5        g g )Nr3  r/  )r4  r3  r   r5  )r   r   r8  r   s       rf   _speak_privateTwentyOneGame._speak_private=	  sD    4233((w?}}V$JJtW% re   c                r    U R                  U[        R                  " U R                  U5      U40 UD65        g r   )r  r   r   r  )r   r   
message_idkwargss       rf   r  TwentyOneGame._speak_private_lD	  s3    L$$T%8%8%@*WPVW	
re   c                ~    U R                   (       d  [        U/S9U l         g U R                   R                  U/5        g )Nr  )r~   r   add_top)r   r,  s     rf   r  )TwentyOneGame._return_card_to_top_of_deckI	  s.    yyD6*DI		4&!re   c                    UR                   c  g UR                   H!  nUR                  UR                   :X  d  M  Us  $    g r   )ru   rm   r   )r   r   r,  s      rf   r   #TwentyOneGame._peek_last_drawn_cardO	  s;    $$,KKDww&333   re   c                    U R                  U5      nU(       d  g [        UR                  5       HE  u  p4UR                  UR                  :X  d  M!  UR                  R	                  U5      nS Ul        Us  $    g r   )r   rN  rm   r   r  ru   )r   r   r,  rW  	hand_cardr
  s         rf   r  &TwentyOneGame._extract_last_drawn_cardW	  sb    ))&1 )&++ 6E||tww& ++//%0,0)	 !7
 re   c          
     d   [        [        SU5      5       H  nU R                  5       nUR                  R	                  U5        U(       d  M7  U R                  U[        SS9  U R                  USU R                  U R                  U5      U5      S9  U R                  SUR                  US9  M     g )Nr   r  rc  ztwentyone-you-gain-change-card)r,  z"twentyone-player-gains-change-cardr  )r  r  _draw_weighted_modifierrp   rO  rg  SOUND_GAIN_CHANGE_CARDr  r  r  r{  r   )r   r   r  rx  rI   r  s         rf   r  $TwentyOneGame._give_random_modifiersb	  s     s1e}%A335H##H-x++F4JSU+V%%4..t/B/B6/JHU & 
   8!;;" !  &re   c                    [          Vs/ s H  n[        U   PM     nn[        R                  " [         USS9S   $ s  snf )Nr   )weightskr   )r;  MODIFIER_DRAW_WEIGHTSr  choices)r   r  r  s      rf   r  %TwentyOneGame._draw_weighted_modifieru	  s:    CPQ=x(2=Q~~mWB1EE Rs   ;r  c               :   [        [        [        SU5      [        UR                  5      5      5       He  n[
        R                  " [        UR                  5      5      nUR                  R                  U5        U(       d  MP  U R                  U[        SS9  Mg     g )Nr   r  rc  )
r  r  r  rV  rp   r  	randranger  rg  SOUND_LOSE_CHANGE_CARD)r   r   r  r  rI   rW  s         rf   r  'TwentyOneGame._discard_random_modifiersy	  sw     s3q%=#f.>.>*?@AA$$S)9)9%:;E  '~++F4JSU+V	 Bre   c                @   U R                   R                   H
  nSUl        M     U R                   Hj  n[	        U[
        5      (       a  UR                  (       a  M+  U R                   R                  UR                  5      nU(       d  MY  UR                  Ul        Ml     g rS  )
r  teamstotal_scorer|   r   rh   r   get_teamr   rn   )r   teamr   s      rf   r  TwentyOneGame._sync_hp_scores	  sq    &&,,D D -llFfo66&:M:M%%..v{{;Dt#)99  #re   c                   U R                    Vs/ s H/  n[        U[        5      (       d  M  UR                  (       a  M-  UPM1     nn[	        US S S9nU Vs0 s H  oR
                  UR                  _M     nn[        U R                  5       [        R                  " 5       R                  5       U R                  U Vs/ s H8  n[        UR                  UR
                  UR                  [!        USS5      S9PM:     snU(       a  UR
                  OS U(       a  UR                  OSUU R"                  S.S9$ s  snf s  snf s  snf )	Nc                    U R                   $ r   )rn   )r   s    rf   rr  1TwentyOneGame.build_game_result.<locals>.<lambda>	  s    ADDre   )r  defaultis_virtual_botF)r   player_namer   r  r   )winner_name	winner_hpfinal_hprounds_played)	game_type	timestampduration_ticksplayer_resultscustom_data)r|   r   rh   r   r  r   rn   r   r   r   now	isoformatsound_scheduler_tickr   r   r   getattrr   )r   r   r|   rL  r  s        rf   build_game_resultTwentyOneGame.build_game_result	  s
   "lldljO.L1UVUcUc1ldW.$?*12'QFFADDL'2mmolln..044 ! !A dd !88#*1.>#F	 ! /5v{{$*0VYYa$!%!2!2	
 	
	 e2s   D8D8D8 D=>?Ec           	        [         R                  " US5      /nUR                  R                  S0 5      n[        UR	                  5       S SS9n[        US5       H"  u  nu  pxUR                  U SU SU S	35        M$     U$ )
Nzgame-final-scoresr  c                    U S   $ r'  r\   )items    rf   rr  1TwentyOneGame.format_end_screen.<locals>.<lambda>	  s    d1gre   T)r  reverser   z. z: z HP)r   r   r  sortedr  rN  rO  )	r   resultr   linesr  	sorted_hprW  r   rn   s	            rf   format_end_screenTwentyOneGame.format_end_screen	  s    !!&*=>?%%))*b98>>+1EtT	!*9a!8E:DLLE7"TF"RD45 "9re   )r~   r  r   r[   r   r   r   r   r   r   r   r   r   r  )returnr   )r  rT   )F)r   r   r   r   r   rr   r  rh   )r   r   r  r   )r   r   r  r   )r   rh   r  r   )r   r   r  r   )r  None)r   r   r  r   )r   r   r  r   r  r   )r   r   rp   ro   r  r   )r   r   r,  r   r  r   )r6  zCallable[[str], str]r0  zPlayer | Noner1  r   r  r  )r   r   rF  r   r  r   )r   r   r  ro   )r   r   r}   ro   r  r   )r^  r   r  rt   )ri  r   r   r   r  r  )r   r   r  r   r  r  )r   r   r  r   r  r   r  r  )r  rr   r  r  )r  rT   r  rT   r  rT   r  r   )r>  rh   r  r  )rL  TwentyOnePlayer | Noner  r  )r  r   r  rh   r  rh   r  rT   r  rT   r  rr   r  rr   r  r  )r   rh   rX  r   rd  rT   r  r  )r   rh   r  r  )r  r   r  r  )
r   rh   r  rh   r  rT   r  rT   r  r  )r   rh   r  r   )
r  rh   r  rT   r  r  r  rT   r  r   )r   rh   r  rh   r  r  )r   rh   r  rh   r  rT   r  r  r  rT   r  rr   )
r   rh   r  ro   r  rr   r  rr   r  rr   )r   rh   r  r   r  rr   r  rr   )r   rh   r  rh   r  r   r  rT   r  rT   r  rr   r  rr   r  rr   r  r  )r   rh   r  r   r  r  )r  r{   )r   rh   r  r  )r  rr   )r   rh   r  rT   )r   rh   r  rl   )r   rh   r  rr   )r   rh   r  ro   )r   rh   r  r   r  rr   )r   rh   r  rT   r  rT   )r  Card | None)ra  rh   r  r  )r  rh   r  rh   r  r  )r+  rT   r  r  )r   rh   r  r  )
r   rh   r,  r   ru  z!str | Callable[[str], str] | Nonerv  rr   r  r  )r   rh   r8  r   r  r  )r   rh   r  r   r  r  )r,  r   r  r  )r   rh   r  rT   rx  rr   r  r  )r   rh   r  rT   r  rr   r  r  )r  r   )r  r   r   r   r  ro   )r]   r^   r_   r`   ra   r   rw   r|   rb   rR   r}   r~   r   r   r   r[   r   r   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r'  staticmethodr-  r9  r?  rJ  r   r   r_  re  r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r&  r  r'  rg  r  r  r  r  r  r  r   r  rT  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rU  r  r  ry  r   r<  r  r  r(  r  r  r}  r  r  r  r  r  r  r   r  r  r  r  r  r  r  rd   __classcell__)r  s   @rf   ry   ry      s    <%*4%@G"@ %6F GGGD+E3L#  !"3"'((7;4;,2/2 "#"(,:,6;-t;% %     % %    GZ	3"
%N:x1
f-3\
 : : "&)') 	)
 ) 
)&5   "  	J"!H*"6!p*XD$
>
(
0
60:%*T!l! !D*0!dA.  *
6:: : 	:
 : : : : 
:8 JM7%7367CF7	7T
@;D
4LMM "M 	M
 M 
M(H/ 
!

 
 	

 

 
&PP%P1@P	P$%$1@$	$"?? "? 	?
 #? ? 
?  LL!L L #	L
 L 
L L  	
   
&-- -
  - 
-^zz "z 	z
 z z z  z z 
zx\=|
e5$6  
+TZ=
-^, , ,

	 
 
2:!'6	@F
	$	1@ "&00 0
 ;0 0 
0>&

"	%.1@D	&F  %WW W
 W 
W-
4 re   ry   )
__future__r   collections.abcr   dataclassesr   r   r   r  r.  r	   r
   r   registryr   game_utils.action_guard_mixinr   game_utils.actionsr   r   r   r   game_utils.bot_helperr   game_utils.cardsr   r   r   game_utils.game_resultr   r   messages.localizationr   botr   r  server.core.ui.keybindsr   rm  rn  ro  ru  rv  rw  rx  ry  rz  r  r  r  r  r  rr  rs  r  r  r  r{  r|  r}  r  r  r  r  r  re  rf  r  rg  rh  ri  rj  r  r~  r  r=  rp  rb  rk  rc  r;  DEFAULT_MODIFIER_DRAW_WEIGHTENHANCED_MODIFIER_DRAW_WEIGHT$DOUBLE_ENHANCED_MODIFIER_DRAW_WEIGHTENDGAME_MODIFIER_DRAW_WEIGHT$TRIPLE_ENHANCED_MODIFIER_DRAW_WEIGHTr  updatereplacer  tupler  r=  r  r  r=  r  r  r  r  r  r  r\  rh  r  rq  rt  r  r  rl  rd  r  r  r  r  rQ  rS  rT  r)  rD  rz  rB  r  r  r  r  r  r  r	  r  r  rP  rR  rO  rC  rI  rJ  rc   r  r1  rR   rh   ry   r  s   0rf   <module>r     s   " $ (   , , $ = J J . 5 5 > 1 / 0   &     & " !  * 4 "          ( 2 &  (  ( &  & & * $ & * +++ + 	+
 + + + + + + + + + + +  !+" #+$ %+& '+( )+* !++, -+. /+0 1+2 3+4 5+6 7+8 9+:  ;+< =+> ?+@ A+B C+D E+F G+H I+J K+L M+N O+P Q+R S+T U+Z  #  < A 'D'I $! 'C $
 Q^^P]H#??P]^    7C 	: 	<	
 	: 	? 	%&J 	: 	$%B 	8 	 D 	 = 	8 	< 	 !>  	<!" 	C#$ 	B!='2 XeWd8)(*:*:3*D)EFFWd m$VcVc(()9)9#s)C(DEEVc 
  / 6    - ) 4 '
"	(* ( / +2 '* (* %++- $& . '
)1 / . / 2 +*06 6 0 ++ 3 3 '4  $& !  :{ : : 	!f 	! 	! n"$d n"  n"[ _2s   *J	J5J