
    Iim                        S r SSKJr  SSKJr  SSKJrJrJrJ	r	J
r
JrJrJrJrJr  \" SS9 " S S	5      5       r        SS
 jrSS jrSS jrg)z*Move generation and application for Senet.    )annotations)	dataclass   )
SenetGameStateNUM_SQUARESHOUSE_HAPPINESSHOUSE_WATEREXACT_BEAROFFSAFE_SQUARESfind_rebirth_squarehas_blocking_lineis_protectedopponent_numT)frozenc                  T    \ rS rSr% S\S'   S\S'   SrS\S'   SrS\S'   S	rS
\S'   Srg	)	SenetMove   intsourcedestinationFboolis_swapis_bear_offNz
int | None
water_dest )	__name__
__module____qualname____firstlineno____annotations__r   r   r   __static_attributes__r       7c:\Users\dbart\PlayPalace11\server\games\senet\moves.pyr   r      s+    KGTK!J
!r"   r   c           
     D   / n[        U5      n[        [        5       GH~  nU R                  U   U:w  a  M  U[        ;   a)  U[        U   :X  a  UR                  [        USSS95        ML  XR-   nU[        :  a  U[        :  a  Mf  U[        :  a  Mr  [        U R                  XVU5      (       a  M  U R                  U   nXq:X  a  M  Xt:X  a  [        U R                  U5      (       d
  U[        ;   a  M  U[        :X  a3  [        U R                  5      nUR                  [        UUSUS95        GM  UR                  [        XVSS95        GM+  U[        :X  a1  [        U R                  5      nUR                  [        XVUS95        GMf  UR                  [        XVS95        GM     U$ )zAGenerate all legal moves for a player given a stick throw result.   T)r   r   r   )r   r   r   r   )r   r   r   )r   r   r   )r   r   )r   ranger   boardr
   appendr   r   r   r   r   r	   r   )	state
player_numrollmovesoppsrctargetoccupantwater_landings	            r#   generate_legal_movesr2      ss     E
z
"C[!;;sz) -}S))YcrtTU  Vo%= [  U[[#zBB;;v&!?EKK00Fl4J$ !4EKK @"$* $#0	 YctTU $ 3EKK @SW YcFGw "z Lr"   c                   [        U5      nSU R                  UR                  '   UR                  (       a  U R                  U==   S-  ss'   gUR
                  (       a1  SU R                  UR                  '   X0R                  UR                  '   UR                  b  X R                  UR                  '   gX R                  UR                  '   g)z2Apply a move to the game state (mutates in place).r   r   N)r   r'   r   r   offr   r   r   )r)   mover*   r-   s       r#   
apply_mover6   e   s    
z
"C  !EKK		*"||()D$$%#&DKK  "'1DOO$(2D$$%r"   c                2    [        [        XU5      5      S:  $ )Nr   )lenr2   )r)   r*   r+   s      r#   has_any_legal_mover9   |   s    #Et<=AAr"   N)r)   r   r*   r   r+   r   returnzlist[SenetMove])r)   r   r5   r   r*   r   r:   None)r)   r   r*   r   r+   r   r:   r   )__doc__
__future__r   dataclassesr   r)   r   r   r   r	   r
   r   r   r   r   r   r   r2   r6   r9   r   r"   r#   <module>r?      sq    0 " !   $" " "DD'*D25DDN3.Br"   