
    Ii                         S r SSKJr  SSKJr  \" SS9 " S S5      5       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Heuristic bot logic for Farkle.    )annotations)	dataclassT)frozenc                  `    \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S\S	'   \SS
 j5       rSrg)	ComboEval   z5Parsed scoring action metadata for heuristic ranking.str	action_id
combo_typeintnumberbase_points	used_dicec                X    U R                   S:  a  U R                  U R                   -  $ S$ )Nr   g        )r   r   )selfs    6c:\Users\dbart\PlayPalace11\server\games\farkle\bot.pypoints_per_dieComboEval.points_per_die   s'    48NNQ4Ft$..0OCO     N)returnfloat)	__name__
__module____qualname____firstlineno____doc____annotations__propertyr   __static_attributes__r   r   r   r   r      s3    ?NOKNP Pr   r   c                   U R                  US5      nU(       d  gUR                  X5      nU R                  U5      SL nU R                  U5      SL nU Vs/ s HW  ofR                  (       d  M  UR
                  R                  R                  S5      (       d  MA  UR
                  R                  PMY     nnU(       a  [        XXt5      (       a  g[        XU5      $ U(       a  [        U5      n[        XX5      (       a  ggU(       a  ggs  snf )zDChoose a Farkle bot action using lightweight EV-inspired heuristics.turnNscore_rollbank)get_action_setresolve_actions_is_roll_enabled_is_bank_enabledenabledactionid
startswith_should_skip_lone_five_choose_best_scoring_action_next_roll_dice_count_should_bank_now)	gameplayerturn_setresolvedroll_enabledbank_enabledrascoring_actionsdice_remainings	            r   	bot_thinkr;      s    ""662H''5H((0D8L((0D8L  ('::")),,:Q:QRZ:[		x   !$NN *4II.v6D.GG's   D	.(D	D	c                B  ^^^	 U Vs/ s H  n[        U5      PM     nnU Vs/ s H	  oUc  M  UPM     nnU(       d  US   $ [        S[        TSS5      5      m[        [        U R                  SS5      5      m	SUU	U4S jjn[        XFS9nUR
                  $ s  snf s  snf )Nr      hot_dice_multiplierFc                P  > U R                   n[        S[        TR                  5      U-
  5      nUS:H  =(       a    [        TR                  5      U-   S:H  n[        U R                  5      nSnT(       a  TS:  a  US:  a  SnU(       a  SOSUUU R                  UU R                  4$ )Nr            r=   )	r   maxlencurrent_rollbanked_dice_combo_structure_bonusr   r   r   )	evusedremaining_nowwill_hot_dicestructure_bonus
multi_biascurrent_multiplierhot_moder3   s	         r   rank)_choose_best_scoring_action.<locals>.rankA   s    ||As6#6#67$>?%*TF4F4F0G$0NRS0S0?
*a/DAIJ AANN
 	
r   )key)rH   r   r   tuple)_parse_combo_actionrC   getattrbooloptionsr
   )
r2   r3   
action_idsr
   evalsrH   rP   bestrN   rO   s
    `      @@r   r/   r/   8   s    =GHZ	 +ZEH2%BR%E2!}Q0Eq IJGDLL*?GHH
 
& uD>>9 I2s   BBBc                  ^ U(       d  gTR                   nTR                  U-   nU R                  R                  n[	        U R                  SS5      nTR                  S:X  a  US:  a  XG:  a  gXV:  a  g[        U4S jU R                   5       SS9nX:  a  XX::  a  gSSS	S
SSS.n	[        U	R                  US	5      5      n
XVS-
  :  a  U
S-  n
TR                  S-   U:  a  U
S-  n
TR                  US-   :  a  U
S-  n
[	        U R                  SS5      (       a4  [        S[	        TSS5      5      nUS:  a  US::  a  U
S-  n
OUS:  a  U
S-  n
U[        [        U
5      5      :  $ )NFinitial_bank_scorer   Tc              3  H   >#    U  H  oTLd  M	  UR                   v   M     g 7fNscore.0pr3   s     r   	<genexpr>#_should_bank_now.<locals>.<genexpr>i   s     J,Q6/,   ""default   x   Z   F   2      )r@   rB         rA   r=   <   g333333?d   gffffff?g?r>   r=   rA   gffffff?ro   )
turn_scorer`   rW   target_scorerU   rC   playersr   getr   round)r2   r3   r:   r7   turn_pointstotal_if_banktargetinitial_bankbest_finishedbase_thresholds	thresholdmults    `          r   r1   r1   X   sr   ##KLL;.M\\&&F4<<)=qAL ||q\A-+2L J$,,JTUVM=#A#"rBOo))."=>I "%T	||cM)T	||mc))T	 t||2E::1gf&;Q?@19"T!	1$T!	#eI.///r   c                   ^ U(       a  [        TSS5      (       d  g[        U5      S:w  d	  US   S:w  a  g[        TR                  5      nUS::  a  gTR                  nTR                  nU R
                  R                  n[        U R
                  SS5      n[        U4S jU R                   5       SS9n	[        [        U R
                  S	S5      5      n
[        S[        TS	S5      5      nXe-   S
-   U:  a  gUS:X  a  US:  a
  US
-   U:  a  gXe-   US-
  :  nUS-   U	:  nUS:  a  U(       a  gU
(       a  US:  a  ggUS:X  a=  U(       a  gUS:X  a  US:  a  XX:  a  gU(       a  US:  a  gU
(       a  US:  a  US:  a  ggg)zJReturn True when skipping a lone 5 is a better upside play than taking it.has_taken_comboFr=   r   score_single_5_5r\   c              3  H   >#    U  H  oTLd  M	  UR                   v   M     g 7fr^   r_   ra   s     r   rd   )_should_skip_lone_five.<locals>.<genexpr>   s     G|!gagg|rf   rg   r>   rB   (   rq   ro   rA   Trp   rl   rk   )
rU   rD   rE   rs   r`   rW   rt   rC   ru   rV   )r2   r3   rX   r6   dice_to_rollrx   r`   rz   r{   
best_otherhdm_onr   	near_goalbehinds    `            r   r.   r.      s   wv/@%HH
:!z!}0BB v**+Lq##KLLE\\&&F4<<)=qALGt||GQRSJ'$,,(=uEFFq'&"7;<D Q&(zlQ&K!O+L$&2+6IRZ*$FqdaiqA:,*{/IkB&daiK"$4 r   c                F    S[        U R                  5      -
  nUS:X  a  S$ U$ )Nr@   r   )rD   rF   )r3   r:   s     r   r0   r0      s)    V//00N!#177r   c                     U S;   a  gU S;   a  gg)N>	   
full_housesix_of_kindthree_pairsfive_of_kindfour_of_kindthree_of_kindlarge_straightsmall_straightdouble_tripletsrA   >   single_1single_5r   r=   r   )r   s    r   rG   rG      s#     
 
 --r   c                Z   U R                  S5      (       d  g U R                  S5      nUS:X  a  [        U SSSS5      $ US:X  a  [        U SSSS5      $ UR                  S	5      (       a8  [        UR	                  S
5      S   5      nUS:X  a  SOUS-  n[        U SX#S5      $ UR                  S5      (       a8  [        UR	                  S
5      S   5      nUS:X  a  SOUS-  n[        U SX#S5      $ UR                  S5      (       a8  [        UR	                  S
5      S   5      nUS:X  a  SOUS-  n[        U SX#S5      $ UR                  S5      (       a8  [        UR	                  S
5      S   5      nUS:X  a  SOUS-  n[        U SX#S5      $ SSSS S!S".nX;   a  XA   u  pSn[        XS#X65      $ g )$Nr#   
single_1_1r   r=   
   
single_5_5r   rB   three_of_kind__rr   r   rp   four_of_kind_      r   ro   five_of_kind_i  r   r   six_of_kind_i   P   r   r@   )r   rr   rB   )r   r   r@   )r   ri   r@   )r      r@   )r   ri   r@   )small_straight_0large_straight_0three_pairs_0double_triplets_0full_house_0r   )r-   removeprefixr   r   split)r
   bodynptsfixedcomborI   s          r   rT   rT      s   ))!!(+D|J2q99|J1a88'((

3#$!VcROQQ??''

3#$!VcRNAA>>''

3#$!VcRNAA>>~&&

3#$!VcRM11== 7608.E } ;D1c88r   N)r   z
str | None)rX   	list[str]r   r	   )r:   r   r7   rV   r   rV   )rX   r   r6   rV   r   rV   )r   r   )r   r	   r   r   )r
   r	   r   zComboEval | None)r   
__future__r   dataclassesr   r   r;   r/   r1   r.   r0   rG   rT   r   r   r   <module>r      sV    % " ! $P P PB@)0X2j8
$%r   