
    Ii                          S r SSKJr  \(       a  SSKJrJr  SSKJrJrJ	r	  SSK
JrJr  SSKJrJr  SS	KJr   " S
 S5      rg)z+Mixin providing action execution for games.    )TYPE_CHECKING   )PlayerActionContext   )Action	MenuInputEditboxInput)get_option_meta
MenuOption)MenuItemEscapeBehavior)Localizationc                       \ rS rSrSr  SSSS\S\S-  SS	S
S4
S jjrS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)ActionExecutionMixin   a  Execute actions, resolve input, and dispatch handlers.

This mixin coordinates action execution for both menu selections and
keybind-triggered actions, including bot inputs and input prompts.

Expected Game attributes:
    _pending_actions: dict[str, str] mapping player_id -> action_id.
    _action_context: dict[str, ActionContext] for keybind context.
    get_user(player) -> User | None.
    find_action(player, action_id) -> Action | None.
    resolve_action(player, action) -> ResolvedAction.
    advance_turn().
Nplayerr   	action_idinput_valuecontextzActionContext | Nonereturnc                 Z   U R                  X5      nU(       d  gU R                  X5      nUR                  (       d  U R                  U5      nU(       a  UR                  (       a  UR                  UR                  5        gUR                  nU(       aF  US:w  a@  [        U[        5      (       a  UR
                  " US   40 US   D6  gUR                  U5        gUR                  b  Uc  UR                  (       a_  X R                  UR                  '   U R                  XQ5      nUR                  U R                  ;   a  U R                  UR                  	 Uc  gOU R                  XQ5        g[        XR                   S5      n	U	(       d  gSSKJn
  U=(       d    U
" 5       U R&                  UR                  '    UR                  b  Ub
  U	" XU5        OU	" X5        U R&                  R)                  UR                  S5        g! U R&                  R)                  UR                  S5        f = f)zHExecute an action for a player, optionally with input value and context.Nzaction-not-availabler   r   r   r   )find_actionresolve_actionenabledget_userdisabled_messagespeak_ldisabled_reason
isinstancetupleinput_requestis_bot_pending_actionsid_get_bot_input_request_action_inputgetattrhandler
games.baser   _action_contextpop)selfr   r   r   r   actionresolveduserreasonr*   ACs              Gc:\Users\dbart\PlayPalace11\server\game_utils\action_execution_mixin.pyexecute_action#ActionExecutionMixin.execute_action   s    !!&4 &&v6==(D**LL!8!89  &55F&,B"B%fe44 LL@fQi@  !LL0 +0C}}3<%%fii0"11&A99 5 55--fii8& ' **6: $5 	5 +2/RTVYY'
	6##/K4KY7 *   $$VYY5D  $$VYY5s   9"H (H*c                 d    SSK Jn  U R                  R                  UR                  U" 5       5      $ )zBGet the current action context for a player (for use in handlers).r   r   )r+   r   r,   getr&   )r.   r   r   s      r4   get_action_context'ActionExecutionMixin.get_action_contextb   s&     	/##''		=?CC    r/   c                    UR                   n[        U[        5      (       d  g[        XR                  S5      nU(       a  U" U5      $ UR
                  R                  S5      (       a  [        U S5      (       ay  UR
                  SS n[        [        U R                  5      U5      nU(       aD  [        U[        5      (       a/  UR                  n[        U5      (       a  U" X5      $ [        U5      $ g)zOGet menu options for an action, checking method first then MenuOption metadata.Nset_options   )r#   r!   r	   r)   r>   r&   
startswithhasattrr   typer   choicescallablelist)r.   r/   r   reqoptions_methodoption_namemetarC   s           r4   _get_menu_options_for_action1ActionExecutionMixin._get_menu_options_for_actioni   s    ""#y)) !{{D9!&)) 99''GD),D,D ))AB-K"4#5{CD
444,,G$$"400G}$r;   c                    UR                   n[        U[        5      (       aT  U R                  X5      nU(       d  gUR                  (       a%  [        XR                  S5      nU(       a  U" X$5      $ US   $ [        U[        5      (       aB  UR                  (       a%  [        XR                  S5      nU(       a  U" U5      $ UR                  $ g)z%Get automatic input for a bot player.Nr   )	r#   r!   r	   rJ   
bot_selectr)   r
   	bot_inputdefault)r.   r/   r   rF   r>   bot_select_methodbot_input_methods          r4   r'   #ActionExecutionMixin._get_bot_input   s    ""c9%%77GG~~$+D..$$G!$,V==1:\**}}#*4#E #+F33;;r;   c                 ^   U R                  U5      nU(       d  gUR                  nUR                  U R                  UR                  '   [	        U[
        5      (       Gar  U R                  X5      nU(       d)  U R                  UR                  	 UR                  S5        gSnUR                  R                  S5      (       a]  [        U S5      (       aL  UR                  SS n[        [        U R                  5      U5      nU(       a  [	        U[        5      (       a  Un/ n	U H@  n
U(       a  UR                  XR                  5      nOU
nU	R!                  [#        XS95        MB     UR$                  (       a8  U	R!                  [#        [&        R(                  " UR                  S5      SS95        UR+                  S	U	S
[,        R.                  S9  g[	        U[0        5      (       aH  [&        R(                  " UR                  UR2                  5      nUR5                  SXR6                  5        gg)z0Request input from a human player for an action.Nzno-options-availabler=   r>   r?   )textr&   cancel_cancelaction_input_menuT)multiletterescape_behavioraction_input_editbox)r   r#   r&   r%   r!   r	   rJ   r   r@   rA   r   rB   r>   r   get_localized_choicelocaleappendr   include_cancelr   r8   	show_menur   SELECT_LASTr
   promptshow_editboxrO   )r.   r/   r   r1   rF   r>   menu_option_metarH   rI   itemsoptdisplay_textra   s                r4   r(   *ActionExecutionMixin._request_action_input   s   }}V$""+199fii(c9%%77GG))&))434  $yy##F++i0H0H$iim&tDLL'9;GJtZ88'+$ E##3#H#Hkk#ZL#&LX<@A  !!X<+;+;DKK+RW`abNN#  . : :	   \**!%%dkk3::>F4fkkJ +r;   c                 $    U R                  5         g)z>End the current player's turn. Call this from action handlers.N)advance_turn)r.   s    r4   end_turnActionExecutionMixin.end_turn   s    r;    )NN)r   r   r   r   )r   N)__name__
__module____qualname____firstlineno____doc__strr5   r9   r   rE   rJ   r'   r(   rj   __static_attributes__rl   r;   r4   r   r      s    $ #'*.C6C6 C6 4Z	C6
 (C6 
C6JD6 8 PTUXPY\`P` 0V X #* 0.KF .KH .K .K`r;   r   N)rq   typingr   r+   r   r   actionsr   r	   r
   r>   r   r   server.core.users.baser   r   messages.localizationr   r   rl   r;   r4   <module>rx      s,    1  2 4 4 0 ; 0} }r;   