
    =*j5	                    L    d Z ddlmZ ddlZddlmZ g dZ G d d          ZdS )uL  SimClock:连续模拟时钟(真实时间 × 倍率),v2 世界的唯一时间源。

- 默认 30×(1 真实秒 = 30 模拟秒,一夜 10 模拟小时 ≈ 20 真实分钟);
- 倍率运行时可调(造物主加速 / 活跃对话自动降速),调整时保持模拟时刻连续;
- 可注入 time_fn 以便测试确定性(手动拨表)。
    )annotationsN)Callable))   u   凌晨)	   u   清晨)   u   上午)   u   正午)   u   下午)   u   夜晚)   u   深夜c                      e Zd ZddddddZedd            Zedd            Zedd            Zedd            ZddZ	ddZ
ddZddZddZdS ) SimClockg      >@g      5@N)rate
start_hourtime_fnr   floatr   r   Callable[[], float] | NonereturnNonec                   |pt           j        | _        || _        |                                 | _        |dz  | _        d| _        d S )N      @F)time	monotonic_time_fnr   _anchor_real_anchor_sim_paused)selfr   r   r   s       3/root/genesis-world/src/genesis/runtime/simclock.py__init__zSimClock.__init__   s?    14>	 MMOO%.    c                v    | j         r| j        S | j        |                                 | j        z
  | j        z  z   S N)r   r   r   r   r   r   s    r   sim_secondszSimClock.sim_seconds   s:    < 	$##4==??T5F#F$)"SSSr    c                    | j         dz  S )Nr   r$   r#   s    r   	sim_hourszSimClock.sim_hours    s    &((r    intc                6    t          | j        dz            dz   S )NQ    )r(   r$   r#   s    r   dayzSimClock.day$   s    4#u,--11r    c                    | j         dz  dz  S )Nr*   r   r&   r#   s    r   hourzSimClock.hour(   s     5(F22r    strc           	         | j         t          fdt          D                       }d| j         dt	                    ddt	          dz  dz            dd| S )	Nc              3  .   K   | ]\  }}|k     |V  d S r"    ).0limitnamehs      r   	<genexpr>z!SimClock.label.<locals>.<genexpr>.   s+      DD{ud!e))d))))DDr    u   第u   天 02d:r+   <    )r.   next_PERIODSr,   r(   )r   periodr6   s     @r   labelzSimClock.label,   sp    IDDDDhDDDDDPTXPP3q66PPPQUbL0A0APPPPPPr    c                z    | j         | _        |                                 | _        t	          d|          | _        dS )uP   变速:先把当前模拟时刻定格为新锚点,保证时间连续不跳变。g?N)r$   r   r   r   maxr   )r   r   s     r   set_ratezSimClock.set_rate2   s0    + MMOOTNN			r    c                ^    | j         | _        |                                 | _        d| _        d S )NT)r$   r   r   r   r   r#   s    r   pausezSimClock.pause8   s(    + MMOOr    c                F    |                                  | _        d| _        d S )NF)r   r   r   r#   s    r   resumezSimClock.resume=   s     MMOOr    sim_atc                B    t          d|| j        z
  | j        z            S )uL   距离模拟时刻 sim_at 还需等待的真实秒数(供调度器睡眠)。g        )rA   r$   r   )r   rG   s     r   real_seconds_untilzSimClock.real_seconds_untilA   s!    3$"22di?@@@r    )r   r   r   r   r   r   r   r   )r   r   )r   r(   )r   r/   )r   r   r   r   )r   r   )rG   r   r   r   )__name__
__module____qualname__r   propertyr$   r'   r,   r.   r?   rB   rD   rF   rI   r2   r    r   r   r      s,       (,$7;      T T T XT
 ) ) ) X) 2 2 2 X2 3 3 3 X3Q Q Q Q# # # #   
   A A A A A Ar    r   )__doc__
__future__r   r   typingr   r=   r   r2   r    r   <module>rQ      s     # " " " " "       yyy3A 3A 3A 3A 3A 3A 3A 3A 3A 3Ar    