
    Ii                       S r SSKJr  SSKJr  SSKrSSKJr  SSKJ	r	  SSK
JrJr  \(       a  S	S
KJrJr  SS jrSS jrSS jr                SS jr                S S jr            S!S jr          S"S jr            S#S jr          S$S jr          S$S jr            S%S jr        S&S jrS'S jr          S$S jr          S$S jrS(S jrS)S jr g)*z
Bot AI for Texas Hold'em.

Lightweight strategy based on preflop hand strength, position, stack size,
and postflop hand category.
    )annotations)TYPE_CHECKINGN   )	best_hand)order_after_button)compute_pot_limit_capsclamp_total_to_cap   )
HoldemGameHoldemPlayerc           	        U R                   U:w  d  U R                  (       d  g U R                  R                  UR                  5      nU R                  R	                  5       nUR
                  [        SU R                  =(       d    S5      -  n[        X5      n[        XU5      n[        R                  " SS5      n[        U R                  5      S:  a  [        U5      n[        XX4XVU5      $ S n	[        UR                   5      [        U R                  5      -   S:  a$  [#        UR                   U R                  -   5      u  p[%        XX4XVU5      $ )Nr
   g333333?g333333?r      )current_playerbettingamount_to_callid	can_raisechipsmaxcurrent_big_blind_position_index_can_raise_amountrandomuniformlen	community_preflop_strength_decide_preflophandr   _decide_postflop)gameplayerto_callr   stack_bbpositioncan_raise_amountvariancestrengthscore_s              6c:\Users\dbart\PlayPalace11\server\games\holdem\bot.py	bot_thinkr,      s   f$DLLll))&))4G&&(I||c!T%;%;%@qAAHt,H(w?~~dC(H
4>>Q$V,yHPX
 	
 E
6;;#dnn--2V[[4>>9:	X     c           	        U R                  5        Vs/ s H4  n[        U[        U5      5      (       d  M  UR                  (       a  M2  UPM6     nnU Vs/ s H  o"R                  PM     nn[        X@R                  R                  U5      5      nU(       a  UR                  U;  a  gUR                  UR                  5      $ s  snf s  snf )Nr   )	get_active_players
isinstancetypefoldedr   r   table_stateget_button_idindex)r!   r"   pactive
active_idsorders         r+   r   r   .   s    002c2AjDL6QaZ[ZbZba2Fc &'1$$J'z+;+;+I+I*+UVEFIIU*;;vyy!! d's   CCCCc                    [        U R                  5      S:  a  g[        U R                   Vs/ s H  n[        UR                  5      PM     snSS9nU R                  S   R
                  U R                  S   R
                  :H  nUS   US   :H  nUu  pVXV-
  nUS:  =(       a    US:  nU(       a  US:  a  gUS	:X  a  US
:  d  U(       a  US:  a  gU(       a  U(       d  US:X  a  gUS	:X  a  US:  a  gU(       a  gU(       a  US:  a  ggs  snf )N   r   T)reverser
   
               	   r   )r   r   sorted_rank_valueranksuit)	r"   crankssuitedpairhighlowgapbroadways	            r+   r   r   7   s    
6;;!=AK'=tLE[[^  FKKN$7$77F8uQxDID
*Crz'cRiH

sbydtqy8saxrzcRi$"*' >s   Dc                    US:  nUS:*  nUS:  n	US:X  a  [        XXSU	5      $ U S:  a  [        XXS5      $ U S:X  a  [        XXyU5      $ U S:X  a  [        XXy5      $ [	        XXy5      $ )Nr;      ?r   r   r
   )_decide_preflop_when_free_decide_preflop_strong_decide_preflop_medium_decide_preflop_small_decide_preflop_weak)
r(   r#   r   r$   r%   r&   r'   late_positionshort_stacklooses
             r+   r   r   P   s     MMb.KtOE!|(>NZ_``1}%g:JUU1}%g{[[1}$WMM=HHr-   c                    US:  nUS:  nUS:X  a  [        XXSU5      $ U (       a  U S   S:  a  [        X%U5      $ U (       a  U S   S:  a  [        XU5      $ U (       a  U S   S:  a  [        XXx5      $ [	        XXx5      $ )Nr;   rQ   r   r?   r
   )_decide_postflop_when_free_decide_postflop_strong_decide_postflop_medium_decide_postflop_weak_decide_postflop_air)	r)   r#   r   r$   r%   r&   r'   rW   rY   s	            r+   r    r    g   s     MMtOE!|)%<LX]^^qQ&yHMMqQ&w%@@qQ$WMM=HHr-   c                    U(       a!  U(       a  U S:  d  U S:  a  U(       a  US:  a  gU(       a(  U(       a!  U(       a  [         R                   " 5       S:  a  gg)Nr;   r
      raise333333?callr   )r(   r   r&   r$   rY   s        r+   rR   rR   }   s>     	]x1}M/FMMOd4Jr-   c                >    U(       a  U(       a  US:  a	  XS-  ::  a  gg)N   r;   rb   rd    )r#   r   r&   r$   s       r+   rS   rS      s      %(a-GRS|<Sr-   c                D    XU(       d  U(       a  SOS-  ::  d  U(       a  gg)Ng      ?      ?rd   foldrh   )r#   r$   rW   rY   rX   s        r+   rT   rT      s     ]ecEEr-   c                J    U [        SX(       d  U(       a  SOS-  5      ::  a  ggNr
   gffffff?g?rd   rk   r   r#   r$   rW   rY   s       r+   rU   rU      $     #aMUSLMMr-   c                J    U [        SX(       d  U(       a  SOS-  5      ::  a  gg)Nr
   g333333?rc   rd   rk   rn   ro   s       r+   rV   rV      s$     #aMUSMNNr-   c                    U (       a  U S   S:  a  U(       a  U(       a  US:  a  gU(       a(  U(       a!  U(       a  [         R                   " 5       S:  a  gg)Nr   r;   ra   rb   g?rd   re   )r)   r   r&   r$   rY   s        r+   r[   r[      s;     qQ91AhRSm/FMMOc4Ir-   c                2    U (       a  U(       a  US:  a  S$ S$ )Nra   rb   rd   rh   )r   r&   r$   s      r+   r\   r\      s    
  $4Q7RFRr-   c                <    U [        SX(       a  SOS-  5      ::  a  gg)Nr
   g      @r;   rd   rk   rn   )r#   r$   rY   s      r+   r]   r]      s     #aESq9::r-   c                J    U [        SX(       d  U(       a  SOS-  5      ::  a  gg)Nr
   g?rj   rd   rk   rn   ro   s       r+   r^   r^      rp   r-   c                J    U [        SX(       d  U(       a  SOS-  5      ::  a  ggrm   rn   ro   s       r+   r_   r_      rp   r-   c                    U S:X  a  S$ U $ )Nr
   r@   rh   )rE   s    r+   rD   rD      s    2$$r-   c                (   U R                   (       d  g[        U R                   R                  S5      nUR                  U-
  U:  a  g[	        U R
                  R                  5       X R                  R                  5      n[        X#-   U5      nXR-
  U:  $ )NFr
   )
r   r   last_raise_sizer   r   pot_manager	total_potoptions
raise_moder	   )r!   r"   r#   	min_raisecapstotals         r+   r   r      sw    <<DLL00!4I||g	)!$"2"2"<"<">I`I`aDw2D9E?i''r-   )r!   'HoldemGame'r"   'HoldemPlayer'returnz
str | None)r!   r   r"   r   r   int)r"   r   r   r   )r(   r   r#   r   r   boolr$   floatr%   r   r&   r   r'   r   r   str)r)   "tuple[int, tuple[int, ...]] | Noner#   r   r   r   r$   r   r%   r   r&   r   r'   r   r   r   )r(   r   r   r   r&   r   r$   r   rY   r   r   r   )
r#   r   r   r   r&   r   r$   r   r   r   )r#   r   r$   r   rW   r   rY   r   rX   r   r   r   )
r#   r   r$   r   rW   r   rY   r   r   r   )r)   r   r   r   r&   r   r$   r   rY   r   r   r   )r   r   r&   r   r$   r   r   r   )r#   r   r$   r   rY   r   r   r   )rE   r   r   r   )r!   r   r"   r   r#   r   r   r   )!__doc__
__future__r   typingr   r   game_utils.poker_evaluatorr   game_utils.poker_stater   game_utils.poker_actionsr   r	   r!   r   r   r,   r   r   r   r    rR   rS   rT   rU   rV   r[   r\   r]   r^   r_   rD   r   rh   r-   r+   <module>r      s   #    3 8 R.2"2III I 	I
 I I I 	I.I-II I 	I
 I I I 	I,  	
  	&  	
 				 	 		
 	 		  	
 	  	
 	-  	
  	SSS S 		S  	
 	  	
 	%(r-   