
    Ii              
       \   S r SSKJrJr  SSKrSrSrSrSrSr	S	r
S
rSSSS.r\" \
\S15      r\S\S\	S\
S\S0r\ " S S5      5       rS\S\4S jrS\4S jrS&S\R(                  S-  S\\\4   4S jjrS\\   S\S\4S jrS\\   S \S!\S\S\4
S" jrS\\   S\4S# jrS$\S\S\4S% jrg)'z$Serializable state models for Senet.    )	dataclassfieldN                              )r
   r      r   zsenet-house-rebirthzsenet-house-happinesszsenet-house-waterzsenet-house-three-truthszsenet-house-re-atumc                       \ rS rSr% Sr\" S S9r\\   \	S'   \" S S9r
\\   \	S'   Sr\\	S	'   S
r\\	S'   Sr\\	S'   Sr\\	S'   Sr\\	S'   Srg)SenetGameState!   z"Serializable game state for Senet.c                      S/[         -  $ )Nr   NUM_SQUARES     7c:\Users\dbart\PlayPalace11\server\games\senet\state.py<lambda>SenetGameState.<lambda>%   s    aS;5Fr   )default_factoryboardc                  
    / SQ$ )N)r   r   r   r   r   r   r   r   r   '   s    9r   offr   current_player_numthrowing
turn_phaser   current_rollF
bonus_turnthrows_this_turnr   N)__name__
__module____qualname____firstlineno____doc__r   r   listint__annotations__r   r   r!   strr"   r#   boolr$   __static_attributes__r   r   r   r   r   !   sa    ,-FGE49G+<=Cc= J L#Jcr   r   
player_numreturnc                     SU -
  $ )Nr   r   )r0   s    r   opponent_numr3   /   s    z>r   c                  r    [        5       n [        S5       H  nUS-  S:X  a  SOSU R                  U'   M     U $ )z=Build starting state with pieces interleaved on squares 1-10.
   r   r   r   )r   ranger   )stateis     r   build_initial_stater9   3   s6    E2Y!eqjaA Lr   rngc                    ^ U =(       d    [         m[        U4S j[        S5       5       5      nUS:X  a  gUS:X  a  gUS:X  a  gUS	:X  a  g
g)zThrow 4 sticks. Returns (movement_value, grants_bonus_turn).

Each stick lands colored-side-up or black-side-up with equal probability.
c              3   H   >#    U  H  nTR                  S S5      v   M     g7f)r   r   N)randint).0_rs     r   	<genexpr>throw_sticks.<locals>.<genexpr>A   s     7hQYYq!__hs   "   r   )r   Tr   )r   Tr   )r   Fr   )r   F)rC   T)randomsumr6   )r:   
colored_upr@   s     @r   throw_sticksrG   ;   sM    
 	vA7eAh77JQ	q	q	qr   r   indexc                 p    X   nUS:X  a  gUS:  a  XS-
     U:X  a  gU[         S-
  :  a  XS-      U:X  a  gg)z<Check if the piece at index has an adjacent ally (2+ group).r   Fr   Tr   )r   rH   pieces      r   is_protectedrK   N   sK    LEzqyU19%.{Q5#3u#<r   from_idxto_idxc                 |    [        U5      nSn[        US-   U5       H  nX   U:X  a  US-  nUS:  a    gM  SnM     g)zKCheck if 3+ consecutive opponent pieces block the path between from and to.r   r   r   TF)r3   r6   )r   rL   rM   r0   oppconsecutiver8   s          r   has_blocking_linerQ   Z   sU    
z
"CK8a<(8s?1Ka   K ) r   c                     U [            S:X  a  [         $ [        [         S-
  SS5       H  nX   S:X  d  M  Us  $    [        [         S-   [        5       H  nX   S:X  d  M  Us  $    [         $ )zMFind the rebirth destination: square 15 if empty, else first empty before it.r   r   )HOUSE_REBIRTHr6   r   )r   r8   s     r   find_rebirth_squarerU   h   si    ]q =1$b"-8q=H . =1$k28q=H 3 r   r7   c                 B   ^ [        U4S jU R                   5       5      $ )z-Count pieces still on the board for a player.c              3   6   >#    U  H  oT:X  d  M
  S v   M     g7f)r   Nr   )r>   sqr0   s     r   rA   #pieces_remaining.<locals>.<genexpr>x   s     ;;R
*:qq;s   		)rE   r   )r7   r0   s    `r   pieces_remainingrZ   v   s    ;5;;;;;r   )N)r)   dataclassesr   r   rD   r   PIECES_PER_PLAYERrT   HOUSE_HAPPINESSHOUSE_WATERHOUSE_THREE_TRUTHSHOUSE_RE_ATUMEXACT_BEAROFF	frozensetSAFE_SQUARESSPECIAL_SQUARE_NAMESr   r+   r3   r9   Randomtupler.   rG   r*   rK   rQ   rU   rZ   r   r   r   <module>rg      s[   * (      A1% ,mR@A (,$2(  
 
 
S S ^ fmmd* eCI6F &	S	 	# 	$ 	T#Y # s PS X\ tCy S <N < < <r   