
    Iiw                          S r SSKrSSKrSSKJrJr  SSKJr  SSKJ	r	  SSK
Jr  \	(       a  SSKJrJr   " S	 S
\\5      r\ " S S\5      5       r\ " S S\5      5       r\ " S S\5      5       r\ " S S5      5       r\ " S S\5      5       rg)zEAction system for games - declarative callbacks for state management.    N)	dataclassfield)Enum)TYPE_CHECKING)DataClassJSONMixin   )GamePlayerc                        \ rS rSrSrSrSrSrg)
Visibility   zVisibility state for actions.visiblehidden N)__name__
__module____qualname____firstlineno____doc__VISIBLEHIDDEN__static_attributes__r       8c:\Users\dbart\PlayPalace11\server\game_utils\actions.pyr   r      s    'GFr   r   c                   P    \ rS rSr% Sr\\S'   \\S'   Sr\S-  \S'   Sr\	\S'   S	r
g)
	MenuInput   a+  Request a menu selection before action executes.

Attributes:
    prompt: Localization key for menu title/prompt.
    options: Method name returning list[str] options.
    bot_select: Optional method name for bot auto-selection.
    include_cancel: Whether to append a cancel option (default True).
promptoptionsN
bot_selectTinclude_cancelr   )r   r   r   r   r   str__annotations__r    r!   boolr   r   r   r   r   r      s+     KL!Jd
!NDr   r   c                   F    \ rS rSr% Sr\\S'   Sr\\S'   Sr\S-  \S'   Sr	g)	EditboxInput'   zRequest text input before action executes.

Attributes:
    prompt: Localization key for prompt.
    default: Default value (static string).
    bot_input: Optional method name for bot auto-input.
r    defaultN	bot_inputr   )
r   r   r   r   r   r"   r#   r)   r*   r   r   r   r   r&   r&   '   s&     KGS IsTz r   r&   c                       \ rS rSr% Sr\\S'   \\S'   \\S'   \\S'   \\S'   Sr\S-  \S	'   Sr\S-  \S
'   Sr	\
\-  S-  \S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   Srg)Action6   a  A game action with declarative state callbacks.

Callback fields are stored as method names for serialization; methods are
resolved on the game object at runtime.

Attributes:
    id: Unique action id.
    label: Static label (fallback if no get_label).
    handler: Method name for action execution.
    is_enabled: Method name for enabled check (returns reason or None).
    is_hidden: Method name for visibility check.
    get_label: Optional method name for dynamic label.
    get_sound: Optional method name for highlight sound.
    input_request: Optional MenuInput/EditboxInput.
    show_in_actions_menu: If True, shown in actions list.
    disabled_message: Locale key spoken when activated while disabled.
idlabelhandler
is_enabled	is_hiddenN	get_label	get_soundinput_requestTshow_in_actions_menuFinclude_spectatorsr(   disabled_messageshow_disabled_labelr   )r   r   r   r   r   r"   r#   r3   r4   r5   r   r&   r6   r$   r7   r8   r9   r   r   r   r   r,   r,   6   s~    $ 	GJLON IsTz  IsTz 59M9|+d29!%$%$$c $$r   r,   c                   `    \ rS rSr% Sr\\S'   \\S'   \\S'   S\S'   \\S'   S	r	\S	-  \S
'   Sr
g	)ResolvedActionX   zbAction resolved for a specific player.

This is created at menu-build time and is not serialized.
actionr/   enabledzstr | tuple[str, dict] | Nonedisabled_reasonr   Nsoundr   )r   r   r   r   r   r,   r#   r"   r$   r@   r   r   r   r   r;   r;   X   s1    
 NJM44ME3:r   r;   c                   B   \ rS rSr% Sr\\S'   \" \S9r	\\\
4   \S'   \" \S9r\\   \S'   S\
SS	4S
 jrS\SS	4S jrS\SS	4S jrS\S\
S	-  4S jrSSSSS\
S\4S jrSSSSS\\   4S jrSSSSS\\   4S jrSSSSS\\   4S jrSSSSS\\   4S jrSS jrSrg	)	ActionSetg   zNamed group of actions for a player.

Players have an ordered list of ActionSets (e.g., "turn" before "lobby").
Action state is resolved declaratively via callbacks when building menus.
name)default_factory_actions_orderr=   returnNc                     XR                   UR                  '   UR                  U R                  ;  a&  U R                  R                  UR                  5        gg)zAdd an action to this set.N)rF   r.   rG   append)selfr=   s     r   addActionSet.adds   s=    #)fii 99DKK'KKvyy) (r   	action_idc                     XR                   ;   a  U R                   U	 XR                  ;   a  U R                  R                  U5        gg)zRemove an action from this set.N)rF   rG   removerK   rN   s     r   rP   ActionSet.removey   s9    %i(#KKy) $r   prefixc                     U R                    Vs/ s H  o"R                  U5      (       d  M  UPM     nnU H  nU R                  U5        M     gs  snf )z9Remove all actions whose ID starts with the given prefix.N)rF   
startswithrP   )rK   rS   aid	to_removes       r   remove_by_prefixActionSet.remove_by_prefix   s?    $(MMLMS^^F5KSM	LCKK  Ms
   AAc                 8    U R                   R                  U5      $ )zGet an action by ID.)rF   getrQ   s     r   
get_actionActionSet.get_action   s    }}  ++r   gamer	   playerr
   c           	      z   SnUR                   (       a\  [        XR                   S5      nU(       a?  [        R                  " U5      nSUR                  ;   a  U" X#R
                  S9nOU" U5      nSnUR                  (       ao  [        XR                  S5      nU(       aR  [        R                  " U5      nSUR                  ;   a  U" X#R
                  S9nOU" U5      nU[        R                  :H  nUR                  n	UR                  (       a/  [        XR                  S5      nU(       a  U" X#R
                  5      n	Sn
UR                  (       a\  [        XR                  S5      nU(       a?  [        R                  " U5      nSUR                  ;   a  U" X#R
                  S9n
OU" U5      n
[        UU	USL UUU
S9$ )z-Resolve a single action's state for a player.NrN   )rN   T)r=   r/   r>   r?   r   r@   )r1   getattrinspect	signature
parametersr.   r2   r   r   r/   r3   r4   r;   )rK   r^   r_   r=   r?   methodsigr   
visibilityr/   r@   s              r   resolve_actionActionSet.resolve_action   su    :>T#4#4d;F''/#..0&,Vyy&IO&,VnO T#3#3T:F''/#..0!'))!DJ!'J$
(:(:: T#3#3T:Fvyy1 T#3#3T:F''/#..0"6YY?E"6NE#t++
 	
r   c                     / nU R                    HF  nX@R                  ;  a  M  U R                  U   nU R                  XU5      nUR                  U5        MH     U$ )z)Resolve all actions' states for a player.)rG   rF   rh   rJ   )rK   r^   r_   resultrV   r=   resolveds          r   resolve_actionsActionSet.resolve_actions   sU    ;;C--']]3'F**4@HMM(#  r   c                 t    U R                  X5       Vs/ s H  o3R                  (       d  M  UPM     sn$ s  snf )zGet visible actions for the turn menu.

Visibility and enabled are independent states. Disabled actions
remain in the menu with an unavailable indicator.
)rm   r   rK   r^   r_   ras       r   get_visible_actionsActionSet.get_visible_actions   s-     "11$?N?r::?NNNs   55c                     U R                  X5       Vs/ s H5  nUR                  (       d  M  UR                  R                  (       d  M3  UPM7     sn$ s  snf )z?Get all enabled actions for the actions menu (includes hidden).)rm   r>   r=   r6   rp   s       r   get_enabled_actionsActionSet.get_enabled_actions   sM     **48
8zz  ii<< 8
 	
 
s   AA
Ac                 $    U R                  X5      $ )z*Get all actions with their resolved state.)rm   )rK   r^   r_   s      r   get_all_actionsActionSet.get_all_actions   s    ##D11r   c                 .    [         R                  " U 5      $ )zDeep copy for templates.)copydeepcopy)rK   s    r   r{   ActionSet.copy   s    }}T""r   r   )rH   rB   )r   r   r   r   r   r"   r#   r   dictrF   r,   listrG   rL   rP   rX   r\   r;   rh   rm   rr   ru   rx   r{   r   r   r   r   rB   rB   g   s1    I"'"=Hd3;=d3FDI3*& *T ** * *s t ,C ,FTM ,5
6 5
8 5
V 5
P^ 5
n	F 	H 	nAU 	O O OT.EY O
 
 
T.EY 
2F 2H 2nAU 2#r   rB   )r   r{   rb   dataclassesr   r   enumr   typingr   mashumaro.mixins.jsonr   
games.baser	   r
   r"   r   r   r&   r,   r;   rB   r   r   r   <module>r      s    K   (    4)d   "      !% ! ! % % %B    z#" z# z#r   