
    Ii                         S r SSKrSSKrSSKrSSKJr  SSKJr  \R                  " S5      r	Sr
SSKJr  SS	\\-  S-  S
\4S jjr " S S5      rg)z Tick scheduler for game updates.    N)Path)Callablezplaypalace.tick2      )get_default_config_pathpathreturnc                    U c
  [        5       n [        U 5      n U R                  5       (       d  0 $  SSKn [        U S5       nUR                  U5      nSSS5        WR                  S	0 5      $ ! [         a    SSKn NIf = f! , (       d  f       N4= f! UR                   a/  n[        SU  SU 3[        R                  S9  [        S5      UeSnAf[         a/  n[        SU  SU 3[        R                  S9  [        S5      UeSnAff = f)
z
Load server configuration from config.toml.

Args:
    path: Path to config file. If None, uses server/config.toml.

Returns:
    Dictionary with server config values.
Nr   rbz+ERROR: Failed to parse configuration file 'z': )filer   z*ERROR: Failed to read configuration file 'server)r   r   existstomllibImportErrortomliopenloadTOMLDecodeErrorprintsysstderr
SystemExitOSErrorget)r   r   fdataexcs        /c:\Users\dbart\PlayPalace11\server\core\tick.pyload_server_configr      s     |&(:D;;==	 %$<<?D  88Hb!!     "" %;D6SEJQTQ[Q[\m$ %:4&C5IPSPZPZ[m$%sR   A. B BB .A?>A?
BB B D	#*CD	*DD	c                   \    \ rS rSrSrSS\/ S4   S\S-  4S jjrSS jrSS jr	SS	 jr
S
rg)TickScheduler5   a  
Schedules game ticks at a fixed interval.

The tick callback is called synchronously within the async context.
This keeps game logic simple while allowing async network I/O.

The tick interval can be configured via config.toml [server] section
or passed directly to the constructor.
Non_ticktick_interval_msc                 ^    Xl         SU l        SU l        Uc  [        nX l        US-  U l        g)z
Initialize the tick scheduler.

Args:
    on_tick: Callback function to call on each tick.
    tick_interval_ms: Tick interval in milliseconds. If None, uses default (50ms).
FNg     @@)_on_tick_running_taskDEFAULT_TICK_INTERVAL_MSr$   tick_interval_s)selfr#   r$   s      r   __init__TickScheduler.__init__@   s8      *.
 #7 0/&8    c                 l   #    SU l         [        R                  " U R                  5       5      U l        g7f)zStart the tick scheduler.TN)r'   asynciocreate_task
_tick_loopr(   r+   s    r   startTickScheduler.startR   s%     (():;
s   24c                    #    SU l         U R                  (       a0  U R                  R                  5          U R                  I Sh  vN   gg N! [        R                   a     gf = f7f)zStop the tick scheduler.FN)r'   r(   cancelr0   CancelledErrorr3   s    r   stopTickScheduler.stopW   sV     ::JJjj    !)) s:   3A(A AA 
A(A A%"A($A%%A(c                   #    U R                   (       aM   U R                  5         [
        R                  " U R                  5      I Sh  vN   U R                   (       a  ML  gg! [         a    [        R	                  S5         N^f = f N>7f)zMain tick loop.zError in tick callbackN)r'   r&   	ExceptionLOG	exceptionr0   sleepr*   r3   s    r   r2   TickScheduler._tick_loopa   sb     mm8
 -- 4 4555 mmm  8678 6s9   B	A" #B	B	B	 B	"BB	BB	)r&   r'   r(   r$   r*   N)r	   N)__name__
__module____qualname____firstlineno____doc__r   intr,   r4   r9   r2   __static_attributes__ r.   r   r!   r!   5   s6    9T 2 9cDj 9$<

6r.   r!   rA   )rF   r0   loggingr   pathlibr   typingr   	getLoggerr=   r)   config_pathsr   strdictr   r!   rI   r.   r   <module>rQ      s\    &   
  )*   2 "S4Z$.  "$  "F66 66r.   