
    0j5                        d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ  e	d          Zd	Zd
Zddddddddddddd	Ze G d d                      Z G d d          ZdS )u  DeviceEngine:剧情装置引擎——世界对事件做出反应(G13)。

设计:装置 = 「触发 → 延迟 → 世界状态变化 + 事件」的声明式规则。
- 内建钩子:凶案(胶片盒倒计时+残页钉尸旁)、灯塔点亮(渡船提前)、天亮(汽笛);
- 通用规则口子 register_rule:造物主可在运行时注入自定义装置(满足 G13 期望成品第三条);
- 装置反应是**客观世界状态**:没人在场也会发生,后来者从 describe 看到既成事实。
    )annotationsN)	dataclass)Callable)
get_logger)Eventzruntime.devicesih  x   
film_boxeszact{n}   u   餐厅us   餐厅传来一缕焦味——『第{n}幕』的胶片盒不知何时被打开,里面的胶片烧成了一撮灰。u   附近飘来一缕焦糊味uJ   🎞 『第{n}幕』的胶片烧成了灰——倒计时又走了一格。u2   钉在{victim}尸体旁的《雾鸦》剧本残页u   凶手按《雾鸦》剧本'补拍'留下的签名——比对死法与哪一幕吻合,能锁定凶手是熟悉剧本的人(编剧)uT   {victim}的尸体旁,被人用裁纸刀钉上了一页《雾鸦》的剧本残页。)namehintmessage)	countdown_facilitystate_templatemaxtotal
burn_placeburn_messageburn_mufflednarr	signaturec                  $    e Zd ZU ded<   ded<   dS )PendingFireinttokenCallable[[], None]handlerN)__name__
__module____qualname____annotations__     2/root/genesis-world/src/genesis/runtime/devices.pyr   r   &   s'         JJJr"   r   c                  H    e Zd ZddZdd
ZddZddZddZd d!dZddZ	dS )"DeviceEnginereturnNonec                p    || _         t          j        d          | _        i | _        g | _        d| _        d S )N   r   )engine	itertoolscount_tokens_pending_rulesacts_burned)selfr*   s     r#   __init__zDeviceEngine.__init__-   s6     q))02HJr"   content_keywordstrdelay_sfloatr   Callable[[Event], None]c                @    | j                             |||f           d S N)r/   append)r1   r3   r5   r   s       r#   register_rulezDeviceEngine.register_rule5   s%    OWg>?????r"   er   c                h    | j         D ])\  }}}||j        v r|                     |||fd           *dS )u9   挂在 bus.taps 上:匹配自定义规则,延迟触发。c                     ||           S r9   r!   )r<   hs     r#   <lambda>z'DeviceEngine.on_event.<locals>.<lambda>=   s    !!A$$ r"   N)r/   content_defer)r1   r<   keyworddelayr   s        r#   on_eventzDeviceEngine.on_event9   sU    '+{ 	@ 	@#GUG!)##EA#>#>#>???	@ 	@r"   r   c                    t          | j                  }t          ||          | j        |<   | j        j                            d| | j        j        j        |z   d           d S )Nz__device__:device)	nextr-   r   r.   r*   schedscheduleclocksim_seconds)r1   r5   r   r   s       r#   rB   zDeviceEngine._defer?   sp    T\""*5'::e""#8#8#8#';#4#@7#JH	V 	V 	V 	V 	Vr"   r   r   c                    | j                             |d           }|C	 |                                 d S # t          $ r t                              d|           Y d S w xY wd S )Nu   装置触发失败(token=%d))r.   popr   	Exceptionlogger	exception)r1   r   pendings      r#   firezDeviceEngine.fireE   s    -##E400H!!!!! H H H  !?GGGGGGH s   5 %AATvictimplacescriptedboolc                  	
 | j         	t          	dd           pt          | j        dz   | _                            d          }|rt          d|z
            nd fd
	
fd}	
fd}|                     t          |           |r2                    d          r|                     t          |           d S d S d S )	N_kill_devicer)   r   r   c                4    |                                S )N)nleftrT   )format)sact_nor\   rT   s    r#   r@   z&DeviceEngine.on_kill.<locals>.<lambda>U   s    6VDD r"   c                 *                        d          } | rh| j        j        v rZt                               dd                    }j                            | d                             |                     j                            t          d d                                        d          j	        j
        d	                     d
d                                                    d                              d S )Nr   r   i  r   )r[   r\   ambientr   r   g      ?r    )etyperA   rU   sim_tsaliencemuffledr   )getstate
facilitiesminset_facilityr]   buspublishr   rK   rL   _narr)facr[   r_   cfgengfmtr\   rU   s     r#   advance_countdownz/DeviceEngine.on_kill.<locals>.advance_countdownW   s   ''.//C Zsci222s++V44	&&sC0@,A,H,H1SW,H,X,XYYYGOOES-@)A)AgglE22#):OZ^335 5 5 6 6 6 IIcc#f+&&'''''r"   c                 x   ddl m}  d         }j                             | d  |d                   d|                    dd          	                     |                    d
          rGj                            t          d |d
                   j        j	        d                     d S d S )Nr   )Itemr   pinned_r   Fr   rb   )hiddenr   r   ra   g333333?)rc   rA   rU   rd   re   )
genesis.runtime.worldstateru   rh   add_itemrg   rl   rm   r   rK   rL   )ru   sigrp   rq   rr   rU   rT   s     r#   leave_signaturez-DeviceEngine.on_kill.<locals>.leave_signatureb   s    777777k"CItt$6f$6$6CK8H8H%X]),)<)< >  >  > ? ? ?wwy!! _Iss3y>?R?R,19NY\!^ !^ !^ _ _ _ _ __ _r"   r   )	r*   getattrDEFAULT_KILL_DEVICEr0   rg   r   rB   FILM_BOX_DELAY_SPIN_PAGE_DELAY_S)r1   rT   rU   rV   r   rs   r{   r_   rp   rq   rr   r\   s    ``    @@@@@r#   on_killzDeviceEngine.on_killN   sH   kc>400G4G!A%!  ).8s1efn%%%DDDDDDD		( 		( 		( 		( 		( 		( 		( 		( 		( 		(	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	$&7888 	;,, 	;KK(/:::::	; 	; 	; 	;r"   c           	     2   | j         }|j        j        dz   }||j        k     ru||_        |j                            d|j        d           |j                            t          ddd|j        j        d                     |	                    d	           d S d S )
Ni   	__ferry__ferryra   uk   对岸有了回应——远处海面上亮起一点船灯!渡船提前出发了,大约两小时后靠岸。globalg?)rc   rA   scoperd   re   uH   ⛴ 灯塔的光换来了回应:渡船提前出发,两小时后靠岸。)
r*   rK   rL   	ferry_etarI   rJ   rl   rm   r   rn   )r1   rq   new_etas      r#   on_lighthouse_litzDeviceEngine.on_lighthouse_litp   s    k)'(2S]""#CMI{CM7CCCGOOE Fci&;cK K K L L L II`aaaaa #"r"   N)r&   r'   )r3   r4   r5   r6   r   r7   r&   r'   )r<   r   r&   r'   )r5   r6   r   r   r&   r'   )r   r   r&   r'   )T)rT   r4   rU   r4   rV   rW   r&   r'   )
r   r   r   r2   r;   rE   rB   rS   r   r   r!   r"   r#   r%   r%   ,   s           @ @ @ @@ @ @ @V V V VH H H H; ; ; ; ;D
b 
b 
b 
b 
b 
br"   r%   )__doc__
__future__r   r+   dataclassesr   typingr   genesis.obs.logging_setupr   genesis.runtime.busr   rP   r~   r   r}   r   r%   r!   r"   r#   <module>r      sM    # " " " " "     ! ! ! ! ! !       0 0 0 0 0 0 % % % % % %	%	&	&   '(1W[ J1XN `su u	 	                 
Nb Nb Nb Nb Nb Nb Nb Nb Nb Nbr"   