
    G*1j                   "   d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZ ddlmZmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.m/Z/  ed          Z0g dg dg dg dg dg dg ddZ1dZ2dZ3d Z4d!Z5d"Z6d#Z7d$Z8d%Z9d&Z:d'Z;d(Z< e=d)  e>e:d*z
            D                       Z?d+Z@d,ZAd-ZBe
 G d. d/                      ZC G d0 d1          ZDdS )2u$  WorldEngine v2:时钟/调度/总线/世界状态/Actor/心智的装配与动作执行。

两种心智:
- StubMind(规则桩,零 LLM):验证运行时链路,测试默认;
- CognitiveMind(LLM):decide() 纯函数在线程池跑,**世界变更只在事件循环线程执行**
  (快照进、决策出,无共享状态竞态;每 agent 一把锁防自我并发)。

设计原则(docs/agent-runtime-v2.md §6):动作必落为持久世界状态、必有反馈;
对话被点名即接(L1 快节拍),旁人只见"在交谈"(摘要);活跃对话自动降速。
    )annotationsNdeque)	dataclassfield)Path)WorldBuilder)LocalMemoryStore)MemoryStream)
get_logger)Actor)	Attention)dynamic_bulletinstatic_common_ground)EventEventBus)CognitiveMindDecision
ThinkInputpersona_card_from_manifest)SimScheduler)SimClock)Soma)StubMind)
WorldState
seed_worldzruntime.engine)   书房	   放映室   门厅)r   	   大客厅r   )r    r      餐厅)r       二层走廊r   )u   白聿的房间r   r!   )r      暗房u   后山墓园r   )   琴房   荒废教堂r   )u	   顾长风u	   邵铭轩u	   程亦深u   唐曼u   白聿u   温言u   江离g     A@g      ,@g     @      >@g     F@g      Y@g      n@g     r@   g      2@g     @c              #  &   K   | ]}d |dz  z   V  dS g      7@      8@N .0ds     1/root/genesis-world/src/genesis/runtime/engine.py	<genexpr>r0   9   s*      DD!dQXoDDDDDD             )u	   被注视u   被人看着u   看不见的手u   操控着我们u   操纵着我们u   我们是演员u   幕布之外u   屏幕之外u   镜头之外u	   造物主u   上帝之手u   第四面墙c                      e Zd ZU dZded<   ded<   ded<    ed 	          Zd
ed<   dZded<   dZded<   e	dd            Z
dS )Sessionu[   一场会话:同地点 N 人共享同一份上下文,轮流发言,有预算有收尾(G1)。intsidstrplace	list[str]membersc                 "    t          d          S )N   maxlenr   r+   r1   r/   <lambda>zSession.<lambda>J   s    b1A1A1A r1   )default_factoryr   linesr   rounds        floatlast_treturnc           	     r    t          t          t          dt          | j                            z  d          S )N   
   )minSESSION_ROUNDS_PERmaxlenr<   selfs    r/   budgetzSession.budgetN   s.     %As4</@/@(A(AA2FFFr1   N)rH   r7   )__name__
__module____qualname____doc____annotations__r   rC   rD   rG   propertyrR   r+   r1   r/   r6   r6   C   s         eeHHHJJJ5)A)ABBBEBBBBFOOOOFG G G XG G Gr1   r6   c                     e Zd ZddddddddddZddZddZddZddZddZdd#Z	dd$Z
dd'Zedd(            Zedd)            Zdd+Zd,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;Zdd>Zdd?Zdd@Zh dAZdddCZddDZddFZddGZddHZg dIZddJZddKZddMZddNZddOZddRZ ddUZ!ddWZ"dddZZ#dd\Z$dd]Z%dd_Z&ddaZ'ddbZ(ddcZ)dddZ*ddeZ+ddiZ,ddjZ-ddlZ.ddmZ/ddnZ0ddoZ1ddrZ2dsZ3dtZ4ddvZ5ddwZ6ddxZ7dd{Z8ddd~Z9ddZ:ddZ;ddZ<ddZ=ddZ>ddZ?ddZ@ddZAddZBddZCddZDdddZEddZFddZGddZHddZIdZJddZKddZLdS )WorldEnginer&   NFr'   stub)ratetime_fn
demo_beatsseedbrainllmprologue	world_dir
str | Pathr\   rF   r^   boolr_   r7   r`   r9   rb   rH   Nonec                   t          j        t          |                    fdj                                        D             }	t          |	           _        t          | j                   d j                                        D              _        | _	        i  _
                             |          }
|
                    d          p j         _        t          |
                    d          p j                   _        t%          |
                    d          p j                   _        t          |
                    d          pdg           _        |
                    d           _        |
                    d	          pg  _        |
                    d
d           _        |
                    dd           _        |
                    d          pi                     d          pd _        t7          |
                    dt8                               _        t%          d t=           j        dz
            D                        _        dd j        dfdd j        dfdg _         |
                    d          pi }| _!        |                    dd           _"        |                    dd           _#        tI          |
                    dd                    }tK          ||rd n||!           _&        tO           j        j(         fd"           _)        tU           j&                   _+        tY          j-        |           _.        | _/        d# _0        i  _1        i  _2        tg          j4        d           _5        d$ _6        i  _7        g  _8        d  _9        d% _:        d _;        dd&l<m=}  |            _>         j)        j?        @                     j>        jA                    j        dz
  d'z  d(z   d)z   _B        d  _C        g  _D        d  _E        d$ _F         G                    |           _H        d$ _I        d* _J        d* _K        d* _L        dd lM}|N                                jO         _P        d  _Q        i  _R        t                       _S        i  _T        i  _U        t                       _V        | _W        d+ jX                                        D             }t          ||
                    d                    }jX                                        D ]}|jZ        }d,t          |d-d$          pd$v }|r| _6        | d.}||	v r|nd} j         j        j\        |<   t          | j         j&                  }|st           j                  |_^        t          |          }|d/v rt          }|d0k    rdd1lamb} |} ||t          |          |||t          t                      |2          |3          }t          |d4d           pi f                                D ]\  }}|d5d6|jg        |<   |sq jH                            d7          pi                     |          pi }|                    d8          r+|                    d9          r|d8         |d9         d:|_h        n`t          ||t                              |dg          tY          j-        |t          |          z             ||t          d;d<=                    }||_m        ||_n        t          d>?          |_p        t          d@?          |_q        |r/ j        D ]'}| j        jf        v r| j        jf        |         _r        (dA|_s        d$|_t        dA|_u        d#|_v        d |_w        |f fdB	|_x         j)        y                    ||jz                   | j7        |<   t          j|                     jR        |<   d S )CNc                b    i | ]+}|j         |j        pd |j        fd|j        D             d,S ) c                F    g | ]}|j         v j         |         j        S r+   )placesname)r-   abuilders     r/   
<listcomp>z3WorldEngine.__init__.<locals>.<dictcomp>.<listcomp>[   s/    \\\AW^H[H[*/H[H[H[r1   )description	geographyadjacent)rl   rp   rq   rr   )r-   pmrn   s     r/   
<dictcomp>z(WorldEngine.__init__.<locals>.<dictcomp>Y   s^     - - -  '>/Rbl\\\\\\\
 
 - - -r1   c                ,    i | ]}|j         |j        pd S ri   )rl   rp   )r-   rs   s     r/   rt   z(WorldEngine.__init__.<locals>.<dictcomp>_   s#    ]]]r27R^%9r]]]r1   place_causeconspicuousceremonial_venuessecret_passages   密道kill_devicekiller_itemsstart_placer   prologue_place   码头loreprologue_gatherr   	game_daysc              3  &   K   | ]}d |dz  z   V  dS r)   r+   r,   s     r/   r0   z'WorldEngine.__init__.<locals>.<genexpr>n   s*      #X#XD1t8O#X#X#X#X#X#Xr1   r2   )pieruC   拖着行李箱踏上湿滑的栈桥,仰头打量暴雨里的孤岛7   to_hallr   )halluH   在门厅里抖落雨水、彼此打量——主人却始终不见踪影<   	to_gather)seatedu4   在客厅落座,等着那位不露面的主人现身g   Ј Britual_nameu   《雾鸦》
masterminduB   当年写《雾鸦》、又被请来『补完第七幕』的编剧
start_hourg      5@g)\3@)r\   r   r]   c                D    j         j                            | g           S N)staterr   get)prQ   s    r/   rA   z&WorldEngine.__init__.<locals>.<lambda>~   s    DJ<O<S<STUWY<Z<Z r1   Fri   T)DeviceEnginer*   g      @      @g     Xc                    g | ]	}|j         
S r+   rl   )r-   cms     r/   ro   z(WorldEngine.__init__.<locals>.<listcomp>   s    @@@b"'@@@r1   u   凶手roleu	   的房间)ra   	langgraphr   )LangGraphMind)agent_id)	is_killerhomera   memorystatic_groundrelationshipsrE   
impressiontrustdossierwantevidence_place)r   r:   g     3@g       @)last_meal_h	woke_at_h   r?   rK       ec                0                         ||           S r   )
_interrupt)enrQ   s     r/   rA   z&WorldEngine.__init__.<locals>.<lambda>   s    tq!7L7L r1   )}r	   from_directoryr9   rk   valuesr   r   r   
place_descrb   
_pro_stage_load_world_configr   _PLACE_CAUSE_place_causeset_CONSPICUOUS_conspicuoustupleCEREMONIAL_VENUES_ceremonial_venues_secret_passages_kill_device_killer_items_start_place_prologue_place_prologue_gatherr7   	GAME_DAYS
_game_daysrange_night_court_h	_pro_legs_lore_ritual_name_mastermindrF   r   clockr   	occupantsbusr   schedrandomRandomrng	base_rateauto_ffsessions_session_of	itertoolscount_sidkiller_nameminds	narrativenarrator
weather_onlighthouse_fuelgenesis.runtime.devicesr   devicestapsappendon_event	ferry_etaassemblyexecutedending
world_goal
_load_actsacts_focus_place_last_shove_h_last_divert_h_last_kill_huuiduuid4hexgame_idlongterm_locks
_demo_done_lure_of_planted_meta_awakenedr^   
charactersr   rl   getattr	positionsr   blockedr   r   genesis.runtime.langgraph_mindr   r   r   r
   items	relationsagenda_seedr   HAUNTSrO   r   actor	attentionr   recent_factshearsayholderlast_speech_tlast_gesturelast_gesture_tthinkingpendingon_interruptregisterreceiveasyncioLock)rQ   rc   r\   r]   r^   r_   r`   ra   rb   rk   cfgr   r   r   r   rostergroundr   rl   r   r   r  r  MindClsr   mindotherdescr.   iidrn   s   `                             @r/   __init__zWorldEngine.__init__U   s    -c)nn==- - - - N))++- - -  ''
9dj)))]]W^EZEZE\E\]]] *,%%i00GGM22Gd6G 6 6 K$:KLL"'0C(D(D(^H^"_"_ #CGG,=$>$>$L8* M MGGM22 WW^44:GGM8<<"ww'7BB!$!6B ; ;<M N N ]R]cggk9==>>##X#XU4?UVCV=W=W#X#X#XXX `)1-d$/3S
 %2
!IIm^DD 99\3wxx377<6677
4X4UEE:_fggg
DJ02Z2Z2Z2Z[[!$*--
=&&,./1OA&&	(*
%' 888888#|D))T\2333?Q.$6<F%)#%#'OOI..	"#!zz||'/1$'EE46/1(+$@@G$6$=$=$?$?@@@%fcggfoo>>$++-- 1	/ 1	/B7D WR%<%<%BCI (#' %%%D6>>44xD)-):DJ &$
DJ77E ; #D$9 : :!$I,,, (K''LLLLLL+Gw4R88ITXL1A1C1Cd$S$S$S"(* * * %,B$F$F$L"#S#S#U#U O OKE4;?#,N,NDN5))  ]y117R<<TBBHbAuuV}} ]/?)@)@ ]45fIJZH[+\+\(dFJJthZ,H,H &dSYY.> ? ?	 $ E E EG G DJ&DN %R 0 0 0D +++DL <- < <Cdj...7;
(-4!%D "D"&D!DMDL15%L%L%L%L%LI"HdI$5666#DJt 'DKc1	/ 1	/r1   c                |   | j         rg| j        D ] }| j        | j        j        |<   d| j        |<   !|                     d           | j                            d| j	        j
        dz   d           nFt          | j                  D ]1\  }}| j                            || j	        j
        |dz  z   d           2| j        r)| j                            d| j	        j
        d	z   d
           | j        r)| j                            d| j	        j
        dz   d           | j                            d| j        d           | j                            ddd           t          | j                  D ]'\  }}| j                            d| |dz  d           (| j                            d| j	        j
        t           z   d           d S )Nr   uW   🛥 序幕——渡船把七位客人留在了暴雨中的码头,自己调头离去。__prologue__   rb      boot__demo__g     @demo__weather__i  weather	__ferry__ferry__dawn__g     }@dawn	__court__r   court__director__director)rb   r   r   r   r   r   _narrr   scheduler   sim_seconds	enumerater^   r   r   r   DIRECTOR_PERIOD_S)rQ   rl   ihs       r/   startzWorldEngine.start   s   = 	R
 * *-1-A
$T*()%%JJpqqqJ
0F0JJWWWW$TZ00 R R4
##D$**@1q5*H&QQQQ? 	YJ
DJ,BZ,OQWXXX? 	YJtz/E/LiXXX
KAAA
J(=vFFFd122 	F 	FDAqJAVWEEEE
NDJ,BEV,VXbcccccr1   aidreasonc           	       K   | j         |                    d          sd S |dk    r|                                  d S |dk    r|                                  d S |                    d          rB| j                            t          |                    d          d                              d S |dk    r|                                  d S |dk    r8| j	        
                    t          d	d
d| j        j        d                     d S |dk    r|                                  d S |dk    r|                                  d S |                    d          r|                                  d S |dk    r|                                  d S | j                            |          }||| j        j        v rd S | j        |         4 d {V  |                     |||           d {V  d d d           d {V  d S # 1 d {V swxY w Y   d S )N__r  r!  z__device__::r2   r#  r%  ambientut   天光破晓,雨声渐歇。远处隐约传来渡船的汽笛——船快到了,该把所有人聚到一处清点。globalffffff?etypecontentscopesim_tsaliencer)  __assembly____courtr  )r   
startswith	_run_demo_run_weatherr   firer7   split_ferry_arrivesr   publishr   r   r-  _director_tick_assembly_advance_night_court_prologue_tickr   r   r   deadr   _wake_locked)rQ   r3  r4  r  s       r/   on_wakezWorldEngine.on_wake   s     ;"3>>$+?+?"F*NNF-F>>-(( 	Lc#))C.."344555F+!!!F*HU ,b)19OZ]_ _ _ ` ` ` F.  !!!F.  ""$$$F>>)$$ 	F.  !!!Fz~~c""<3$*/11F;s# 	7 	7 	7 	7 	7 	7 	7 	7##Cv666666666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   G99
HHc                  K   |j         j        }|dk    rt          |t                    r||j        | j        j        k    r|                     |          }|j        dk    r|j	        r|j	        |_
        d|_        t          j        |j        |           d {V }d|_        || j        j        f|_        |j         j        }| j                            |r|j        n| j        j        d           d S d}|                    d          r@|>d |_        |j                                         }|r|                     d| d           n|j|j        | j        j        k    rT| j        j                            d	          }	|j        }
|j                                         \  }}|d
v r|                     |	|           |dk    rzt7          |dd          r<|                               r'| j                            | j        j        d           n+| j                            |j         j        j        d           d S |dk    rR|                     d| dd                    | j                            |          d d                   z              nj|dk    r|                     |
|           nL|J|dk    r!|j         r|j                                          n#| j                            |j        d           d S | j!        r1|j         j        }|!| j                            |j        d           d S t          |t                    r|j"        dk    rl| j#                                      Rd|_"        d|_        t          j        |j$        | j        %                                | j&                   d {V  d|_        d }|j        A|j        \  }}d |_        | j        j        |z
  tN          k    r| (                    |          r|}|D|                     |          }d|_        t          j        |j        |           d {V }d|_        | )                    ||           n| j        j                            d          }fd| j        *                    |          D             }|+                    | j        j,        ||           |j-        rT| j        j        |_.        | j/        0                    tc          d d|j-         d|| j        j        dd                     |j         j        }| j        j        }|L|j        dk    rA|j        |z
  td          d z  k    r+| j                            |j        td          z
  d           d S |#| j                            |j        d           d S | j#                                      d u}| j                            ||r
tf          dz  nd!z   d           d S )"NprethinkmoveTFtickz
interrupt:u   突发状况打断了你(   )。ri   )hoparrivedrV  r   zinterrupt:encounterrW  u	   你到了   。 r3   finisheddialogueg      @rE   r   c                     g | ]
}|k    |S r+   r+   r-   rm   r3  s     r/   ro   z,WorldEngine._wake_locked.<locals>.<listcomp>[      LLLq188888r1   speech   说:「   」ffffff?u   隔壁隐约有人在说话r<  r=  r:   r  r?  r@  muffledsleepg?x   )4r  current
isinstancer   untilr   r-  	_snapshotkinddestarrivingr
  r  	to_threaddecider  r   r,  rC  	interrupt	_feedbackr   r   r   payloadadvance_publish_transitr   _killer_target_herejoindescribe_finish_actioninterruptiblerb   imp_accr   reflectlabelr   PRETHINK_FRESH_S_prethink_still_valid_executer   think	sim_hourslast_speechr  r   rI  r   PRETHINK_LEAD_SDIALOGUE_TURN_S)rQ   r3  r  r4  actsnapdecnxtbrokenbeforerr  statusdetailcachedmade_atr:   r   nowin_sesss    `                 r/   rO  zWorldEngine._wake_locked  s>     j Z$.. 3?	DJ$:::~~c4008v%%#(%$'HDM $#-dk4@@@@@@@@ % #TZ%;<j(
##Cc)Utz?UW]^^^F\** 	sDLZ))++F Ns$L$L$L$LMMM_dj.D!D!DZ)--c266FkG!Z//11NFF+++%%c66:::4e44 O9Q9QRU9V9V OJ''TZ-CEZ[[[[J''TZ-?-EvNNN""s$;$;$;$;chhtzGZGZ[acfGgGghjijhjGk>l>l$lmmmm:%%##C&999_##(9#
$$&&&&
##CF;;;= 	*$C
##CF;;;FdM** 	^|s""t'7';';C'@'@'H" $'dj6F6F6H6H$-XXXXXXXXX %C|'"&,# :)G37GGGDLfLfgjlrLsLsG C{~~c400 $#-dk4@@@@@@@@ %MM#tS))))J(,,S(;;ELLLLDJ$8$8$?$?LLLIJJtz+UI>>> ^%)Z%;"  X#?c?cdN^?c?c?c-2#TZE[04>["] "] "] ^ ^ ^ j j$?sx722sy3[^I^7^7^JSY%@*MMMMM_JSY77777&**3//t;GJS7,SOa,?,?PS%TV\]]]]]r1   r:   r;   c                   ddl m} | j                            ||          }| j                            |          s || j        j                  dk    r|S g d}}|D ]3}|                    d          rd|v rd}|                    |           4|                    d| j        j         d	           |r|                    d
           |S )un   天气能见度过滤的可见描述:露天+低能见度时,尸体被雨幕/浓雾遮住,不走近看不出。r   
visibility?Fu   ⚠️u   尸体T(uH   里视线极差,几步外只剩模糊轮廓,看不清远处的动静。)uW   (地上隐约横着什么东西,可雨雾遮着看不真切——除非走近细看。))genesis.runtime.weatherr  r   rw  	is_indoorr"  rC  r   )rQ   r:   r3  r  rC   outhidden_bodylns           r/   _visible_desczWorldEngine._visible_descl  s    666666
##E3//:&& 	**TZ5G*H*HD*P*PLu[ 	 	B}}X&& 8r>>"JJrNNNN

stz)sssttt 	rJJpqqq
r1   r  
'Decision'c                ,   | j         j                            |d          }t          | j                             |                    }|j        pd                                }|j        dv r|r||vs|| j         j        v rdS |j	        r|j	        |vrdS dS )u   预想结果是否仍贴合当前世界:针对具体某人的动作(kill/lure/eavesdrop/指向性说话),
        该目标必须此刻仍与本人同处一地且活着;否则判定为基于旧状态、作废重想。ri   )killlure	eavesdropFT)
r   r   r   r   r   
action_argstripaction_kindrN  	speech_to)rQ   r3  r  r:   heretgts         r/   r~  z!WorldEngine._prethink_still_valid~  s     
$((b114:''..//~#**,,?;;;;$#"8"8u= 	S]$665tr1   r  r   r   c                "   | j         j        | j        j                            d          fd| j                                      D             g }D ]}| j                            |          }g }|r|j        j        nd }||	                    |j
                   |r |j                                      d         nd}|dk    r|	                    d           n|dk    r|	                    d           |	                    |r| d	d
                    |           dn|           | j                                      }	|	:t          fd|	j        D                       s|                     d           d }	g }
j                                        D ],}|
	                    |j                   |j        dk    r.j                            t/          d|j                             |j        dk    r=|j                             d          s j        	                    |j                   n(|j        dv rj        	                    |j                   t/          d|j        dz             }xj        |z  c_        j                            | j                                          d
|j         |           .tA          dd           }|tC                      x}_"        | #                              }|d d         D ]}|r||vr|                    d          s|                    d	          sq|$                    |           j        	                    d d|            j                            | j                                          d d| d            dj%         d|
r|
d          nd!z   }d" j        &                    |d#$          D             }d!}t          fd%| j        j'        (                                D                       rd&}g }| j)                                      }|rfd'|D             D ]}|*                    |           |D ]u}| +                    |d(                   }|d)k    rd*|d(          d+n	|d,k    rd!nd-}|	                    |d(          d.|d/          d0|d1          d2|d1          d3| 	           v|s| j)        = tY          dOi d4d5| j                                         d1d6| j-                            d!          dz   d                    |          z   .                                |z   d7|d8|
d9fd:| j        j/                            g           D             d;fd<| j        j'        (                                D             d=j        0                              d>j        1                              d?| 2                                d@|dAj%        dBtg          j                  dCtg          tA          dCg                     dD|	rtg          |	j4                  ng dEdF                    | 5                    |	                    dG|	r|	j6        ndHdI|	r|	j7        ndHdJ|dKtA          dLd          r| 8                                nd!dM| 9                              dN| :                              S )PNr   c                     g | ]
}|k    |S r+   r+   r]  s     r/   ro   z)WorldEngine._snapshot.<locals>.<listcomp>  r^  r1   fearrE         ?u   神色惊惶      ?u   神色不安r  ,)c              3  ,   K   | ]}|k    |v V  d S r   r+   )r-   mr3  raw_occupantss     r/   r0   z(WorldEngine._snapshot.<locals>.<genexpr>  s4      ']']qTUY\T\T\](:T\T\T\T\']']r1   Ffarewellr:  ?r_  u   说)feedbackactionr8  r_        ?g?
importance	_env_seenr4   u   在场u   (在z)-    ,我在u
   注意到:rb  rY  ri   c                    g | ]	}|j         
S r+   )r=  r-   r  s     r/   ro   z)WorldEngine._snapshot.<locals>.<listcomp>  s    SSS!AISSSr1   r3   )top_kc              3  L   K   | ]}|j         k    o|j        o|j         V  d S r   r:   hidden	destroyed)r-   itr:   s     r/   r0   z(WorldEngine._snapshot.<locals>.<genexpr>  s;      hhrx5 CRYCr|3Chhhhhhr1   um    (这地方有种说不出的不对劲——像是还藏着什么没被翻出来的东西,值得搜一搜。)c                f    g | ]-}|d          k    s|                     d          z
  dk    +|.S )r:   tg      @r   )r-   xnow_hr:   s     r/   ro   z)WorldEngine._snapshot.<locals>.<listcomp>  sF    ^^^AqzU':':eaeeCQVFWFW>WZ]>]>]a>]>]>]r1   by333333ӿu   (不过你一向提防u]   ,他特意把这事单告诉你——八成是想支你离群、引你入局,多半别去。)333333?ur   (不过仔细想想:他为什么单单告诉你?会不会是想支你离群?去不去、信不信,自己掂量。)u   之前私下跟你说过:hooku   ,就在r:   u7   ——这事儿你一直搁在心上,总想找机会去u	   看看。r  
time_labelr   r   eventsexitsc                D    g | ]}|t          j        d d          v|S )r   r+   )r   r  )r-   r   r  s     r/   ro   z)WorldEngine._snapshot.<locals>.<listcomp>  s5    pppAWUYU_ajlnMoMoDoDo1DoDoDor1   	inventoryc                l    g | ]0}|j         k    |j        |j        |j        rd |j         dndz   1S )r  r  ri   )r  r  rl   hint)r-   r  r3  s     r/   ro   z)WorldEngine._snapshot.<locals>.<listcomp>  sW     e e ebi3>N>NWYWc>N wBG"C.bg....D>N>N>Nr1   
soma_lines
candidatesbulletinmemoriesintentfactsr  r[  dialogue_with   、dialogue_roundsr   dialogue_budgetplanted_leadsprivate_noter   	lure_baitstage_directiver+   );r   r  r   r   r   r   r   r  rg  r   r  somasnapshotrv  r   anyr<   _leave_sessionr  drainr=  r@  shockrL   r<  rC  r  r  rz  r   observer|  r   r   r  r  addr  retriever   r   r   remove	_trust_ofr   r   r  rr   prompt_linesr  	_bulletinlistrC   _others_in_sessionrD   rR   _killer_pressure_consume_lure_bait_stage_directive)rQ   r3  r  r   r  ombitsoactr  sessr  r   impseenvisiblelinequeryr  scentr  plr  trdoubtr  r:   r  s    ``                     @@@r/   rj  zWorldEngine._snapshot  s   
$
$((h77LLLLDJ$8$8$?$?LLL	" 	N 	NE&&BD')328##tDDI&&&68A27##E**622cDczzN++++N+++TL999999uMMMM##C((C']']']']']DL']']']$]$]e444D%%'' 	\ 	\AMM!)$$$zS  	s3
';';<<<w(""19+?+?3+L+L"##AI....GGG!((333c1:+,,CLLCLLK4:#3#3#5#5 C C	 C CUWZ[[[[ t[$//<$'EE)D4>$$UC00BQBK 	< 	<D <D((1J1J(SWSbSbcfSgSg(!(()@)@)@$)@)@AAA##tz'7'7'9'9$Y$Y%$Y$YSW$Y$Y$)d $ < < <))4;)))6-IVBZZrJSSt{';';E5PQ';'R'RSSShhhhdjN^NeNeNgNghhhhh 	D DE]s## 	'^^^^^^^^  		! l l^^C411 ]_  cg  ]g  ]g  Y!D'  Y  Y  Y  Y$&#IIbb O  $$w  k  k6  k  k1W:  k  k  OP  QX  OY  k  k  di  k  kl l l l 'M#& > > >%>$(J$4$4$6$6$6>>Ce>++E266<sxx?P?PPWWYY\aaa>  i> )/> qpppdj155eR@@pppp	>
e e e e!%!1!8!8!:!:e e e e> y--e444> BFAUAUV[A\A\A\> ^^%%%> X> '+kk> t()))> y"55666> *.5T$*%%%2>  **T%<%<T3%G%GHHH> ,06DKKQ> ,06DKKQ>  (-!>" 5<D+u4U4U]..000[]#>$ --c222%>& !11#t<<<'> 	>r1   c                   
 | j                             |d          }|sdS |\  }
| j                            |          }|                                 }|o1|                    d          |k    o
|                    d          pg v }|p+t          
fdt          |dd          pg D                       }|                     ||          }|dk    rd| d	}	n|d
k    rd| d}	nd}	|rd|	 | d
 dS d|	 | d
 dS )u   被引诱者的一次性诱饵提示(命中私欲→大概率跟,但自主可拒绝)。
        若诱饵正指向目标本就想去的僻静处(顺水推舟),给强拉力——这是凶案脊柱能否推进的关键。Nri   targetr:   c              3  z   K   | ]5}|                     d           dv |                     dd          pdv V  6dS )r  tododoingr  ri   Nr  )r-   gwheres     r/   r0   z1WorldEngine._consume_lure_bait.<locals>.<genexpr>  sa        I  I$%#$55??6G#G#G !&!%%*;*;*Ar B#G#G#G#G I  Ir1   goalsr  u   你一向信得过u   ,这话听着不像有假——r  u   你本就提防u5   ,他特意来跟你咬耳朵,八成没安好心——r  u   压低声音说u   那边有你正惦记的东西、只有你俩知道——那本就是你今晚想去的地方,顺道现在就去一趟正合心意。夜里孤身赴约虽不是全无风险,但这机会你多半不想错过。)u   刚把你单独往u   引,说那儿有你想要的东西、只有你俩知道。这可能正合你心意——也可能是冲着你来的陷阱。去不去,你自己拿主意。))r   popr   r   _current_actr  r   r  )rQ   r3  r  whotmr  themedalignedr   tnoter  s             @r/   r  zWorldEngine._consume_lure_bait  s    }  d++ 	2
UZ^^C  !!W**c1We@P@P@VTV6W IC  I  I  I  I*1"gt*D*D*J I  I  I I I sC((C<<MMMMEEd]]`c```EEE 	fe es e e5 e e e fvE v3 v v% v v v 	wr1   gudictc                    	 t          |                    dd                    dz
  }n# t          t          f$ r Y dS w xY wt	          |dd          pg }t	          |dd          rd|cxk    rt          |          k     rn nt          |                    dd	                    d
k    r||         d         d}t          fd|D                       rfd j        D             } fd|D             } fd j	        j
        D             }	|p| o|	 }
|
rJd                    |          pd}                     d| d           t          |          }d|d<   d|d<   |                    |           dS )u   目标自评的世界回执校验:凶手把『杀人类目标』标 done,必须有真实死亡背书。
        否则脑中预演会进台账,下次思考把台账当事实,谎言自我固化(实测:江离幻想杀了顾长风)。indexr   r2   Nr	  r   Fr  ri   doner  )r  u   杀u   干掉u   清算u   灭口u   了结c              3      K   | ]}|v V  	d S r   r+   )r-   wr  s     r/   r0   z9WorldEngine._apply_goal_update_checked.<locals>.<genexpr>  s'      1119111111r1   c                (    g | ]}|k    |v |S r+   r+   )r-   r   r3  r  s     r/   ro   z:WorldEngine._apply_goal_update_checked.<locals>.<listcomp>  s&    IIIq!s((qDyyyyyr1   c                0    g | ]}|j         j        v|S r+   r   rN  )r-   r   rQ   s     r/   ro   z:WorldEngine._apply_goal_update_checked.<locals>.<listcomp>  s'    LLLQ1DJO3K3Kq3K3K3Kr1   c                &    g | ]}|j         v|S r+   r   r-   r.   rQ   s     r/   ro   z:WorldEngine._apply_goal_update_checked.<locals>.<listcomp>  s%     V V Vqq?U?U?U?U?Ur1   r  u   目标u   (你猛然清醒:ul   还活着,你从未真正动手——刚才那只是你脑中的预演。没有落下的幕,不算完成。)r  u   尚未真正动手note)r7   r   	TypeError
ValueErrorr   rO   r9   r  r   r   rN  rv  rq  r  apply_goal_update)rQ   r3  r  r  idxr	  
kill_wordsnamedstill_aliveorganic_kills
no_receiptr  r  s   ``          @r/   _apply_goal_update_checkedz&WorldEngine._apply_goal_update_checked   s   	bffWa(())A-CC:& 	 	 	FF	gt,,2D+u-- 	6!s2G2G2G2GSZZ2G2G2G2G2Gx,,--77:f%DPJ1111j11111 6IIIIIDJIIILLLL%LLL V V V VDJO V V V(MY-L};L
 6**[11=XCNN3 )sC )s )s )s t t tbB#*BxL!5BvJr"""""s   &, A Ac                $   t          |           dz  }|                                si S 	 t          j        |                    d                    S # t          j        t          f$ r'}t                              d|           i cY d}~S d}~ww xY w)uh   加载幕菜单 acts.json(可缺;旧世界没有这个文件 → stage_directive 留空,向前兼容)。z	acts.jsonutf-8encodingu   acts.json 加载失败:%sN	r   existsjsonloads	read_textJSONDecodeErrorOSErrorloggerwarningrc   r   r   s      r/   r   zWorldEngine._load_acts  s     OOk)xxzz 	I	:akk7k;;<<<$g. 	 	 	NN6:::IIIIII	   'A B(B
B
Bc                $   t          |           dz  }|                                si S 	 t          j        |                    d                    S # t          j        t          f$ r'}t                              d|           i cY d}~S d}~ww xY w)ui   加载世界环境配置 world.json(可缺;缺则环境语义回退内置默认,向前兼容旧世界)。z
world.jsonr*  r+  u   world.json 加载失败:%sNr-  r6  s      r/   r   zWorldEngine._load_world_config&  s     OOl*xxzz 	I	:akk7k;;<<<$g. 	 	 	NN7;;;IIIIII	r7  dict | Nonec                    | j         pi                     d          pg }|D ]+}|                    d          }|r|| j        j        vr|c S ,|D ]}|                    d          s|c S dS )u   简易幕推导(Layer 0,确定性):菜单里第一个『目标还活着』的固定幕 = 当前幕;
        固定目标都清算完则回退到机动幕。Layer 1 导演再做事件驱动的智能幕选择。	kill_actsr  N)r   r   r   rN  )rQ   r   rm   r  s       r/   r  zWorldEngine._current_act2  s     	R$$[117R 	 	AhA Qdjo-- 	 	A55?? tr1   u1   溺水——肺里呛着海水,死亡时间不久u   溺水——肺里呛着海水u   溺水后被潮水冲上岸u   高处坠落,多处骨折u   高处坠落,摔得不成样子u   从高处坠下,颈骨折断u(   黑暗中遭袭,像是触电加钝器伤u   黑暗中被钝器击中后脑u   失温与钝击,冻得发青u   暗处被钝器袭击u    窄道里被勒/击,无处可逃u-   颈上一道细勒痕——像是琴弦绞杀u-   口唇发绀、气味发苦——疑似中毒u   利器伤,失血致死u?   颈部勒痕、悬空吊起的痕迹——像是被钟绳吊死)r      船屋u   沙滩   灯塔   断崖u   露台   发电机房u   酒窖   冰窖	   储藏室r{   r$   r!      厨房r%   r  tuple[str, bool]c                "   t          fd| j        pi                     d          pg D             d          }|r8||                    d          pg v r|                    d          r
|d         dfS | j                            |d          dfS )	u   返回(客观死法描述, 是否对得上本幕仪式取景地)。在取景地=仪式死法(补拍线索成立);否则按实地推断。c              3  N   K   | ]}|                     d           k    |V   dS r  Nr  )r-   rm   r  s     r/   r0   z,WorldEngine._death_method.<locals>.<genexpr>K  s9      gg!QUUS[__`fMfMfAMfMfMfMfggr1   r;  Nr:   methodTu;   致命外伤,死亡时间不久——绝非意外,是人为F)nextr   r   r   )rQ   r  r:   r  s    `  r/   _death_methodzWorldEngine._death_methodI  s    ggggb 5 5k B B Hbgggimnn 	'5SWWW--3449J9J4x=$&& $$U,ijjlqqqr1   c                |   | j         pi                     d          pg }|sdS t          | j        j                  }t          d| j        | j        j        z
  dz            }| j	        d}n*| j
        |dk    s|dk    rd}n|d	k    rd
}n|dk    rd}nd}d |D             }|                    |          p|d         S )u_   简易处境帧推导:死亡数 + 集会/渡船 → 全员当前处境帧(Layer 0 确定性)。phasesNrE   r   r(     g      ?finalerJ   
escalationr2   first_bloodrb   c                :    i | ]}|                     d           |S )idr  )r-   r   s     r/   rt   z.WorldEngine._current_phase.<locals>.<dictcomp>a  s$    000Ata000r1   r   )r   r   rO   r   rN  rN   r   r   r-  r   r   )rQ   rK  deathsferry_hpidby_ids         r/   _current_phasezWorldEngine._current_phaseP  s    )/r&&x006B 	4TZ_%%cDNTZ-CCvMNN=$CC[$!w#~~CCq[[CCq[[CCC00000yy~~**r1   c                   | j         r| j        dS t          |dd          r|                     |          S |                                 }|r|                    d          sdS d|                    dd           d|d          S )	ud   导演层↔认知层接口:凶手收到本幕任务,幸存者收到当前处境帧(按幕替换)。Nri   r   Fframeu   【此刻·rl      】)r   r   r   _killer_stagerV  r   )rQ   r3  r  r   s       r/   r  zWorldEngine._stage_directived  s    y 	DK324e,, 	+%%c***!! 	g 	2?QUU62..??1W:???r1   >      三层走廊r   r    r"   ri   c                8                                      }d  j        pi                     d          pg D             }|r|                    d          nd}|r*d                    |                    d          pg           nd}g }                                 }r|r|                    d           n_r\ j        j                            d          } fd	 j                            |          D             }	t          |o||	v o||v          }
t          |	          d
k    rw|
ru| j        vrH|r||                    d          pg v nd}|                    d| d| d|rdndz   d| dz              n|pd}|                    d| d| d| d           nt|
r'|pd}|                    d| d| d| d| d	           nKt          |	          d
k    r8|	d         |k    r,|	d         |vr"|                    d|	d          d| d           |sd                    |          S |pd }|                    d!|                    d"d           d#|                    d$d           d%| d&           |r0|                    d'| d(|                    d)d           d*           |                    d+          r|                    d,|d+          d&           |                    d-          r|                    d.|d-          d&           d/|                    d0          pg v r0|                    d1          r|                    |d1                    |rd                    |          S |                    d2           d                    |          S )3u   凶手的本幕指令:**严格按幕**——只清算本幕目标、只在僻静取景地下手。
        R3 杀机窗口只在『与本幕目标独处、且身处僻静处』时才触发;非本幕目标或身处枢纽,一律压住。c                j    h | ]0}d |                     d          pg v |                     d          1S 	reluctantflagsr  r  r-   r  s     r/   	<setcomp>z,WorldEngine._killer_stage.<locals>.<setcomp>v  sE     ? ? ?#g(<"== UU8__===r1   r;  r  N/r:   ri   u   【蛰伏·按住手】你昨夜刚动过手,此刻最忌连续作案——今天收敛锋芒、演回那个无害的局外人,留心有没有人起了疑;可以悄悄物色、用诱饵慢慢替下一幕铺路,但**今夜先按住手,别再杀人**,等风头过了、夜再深些再说。c                <    g | ]}|k    |j         j        v|S r+   r  )r-   or3  rQ   s     r/   ro   z-WorldEngine._killer_stage.<locals>.<listcomp>  s2    fffASQVZV`VeMeMeaMeMeMer1   r2   FuB   【⚡窗口已到·正是此人此地】你和本幕该清算的 u    单独在【u%   】、四下无人,这里也够僻静u   、正是本幕的取景地uD   ——这就是你筹划十年的那一刻,这一拍直接 kill,arg=u*   。错过再聚起人来就杀不成了。u   僻静的取景地u   你和 u    此刻独处,但【u   】是人来人往的枢纽、太显眼,在这儿动手必被当场撞见、十年布局毁于一旦。**绝不在这里下手**——用他正惦记的东西做钩子,把他引去u%   那种僻静处,到那儿才了断。u6   【⚡机会·目标就在眼前】本幕该清算的 u    此刻就和你在【u\   】(周围还有别人)。**别傻站着、更别擦肩而过走开**:立刻用 lure 凑到 u:    耳边,拿TA最惦记的东西做钩子,把TA单独勾去u1   ——错过这次照面,下回未必这么巧。r   u?    此刻独处——但今晚按你的仪式,该先清算的是 u   ,不是他。沉住气、按幕一个个来,别为一时机会打乱顺序、打草惊蛇;**除非他已经当众识破了你、不灭口就要暴露**,否则这一刀先忍住。
u*   (机动:当下最危险或最落单的人)u   【本幕·第r     幕「rl   u4   」】这一幕、且只有这一幕该清算的是 rX  u<   主题取景地(僻静、对得上死法、最有仪式感):u   ;死法:rG  u+   。**务必把他引到这儿再动手。**coveru   掩护:baitu   怎么把他/她弄过去:r_  r`  reluctant_noteu  【按幕推进·这是你的执念,也是不被识破的护身符】你有一整天,不必慌:**严格按七幕顺序,一次只清算本幕这一个目标**,用他正想要的东西做钩子(命中私欲他才肯跟),把他引到主题取景地,下饵后立刻跟上、一起过去,在那僻静处只剩你俩时动手。**门厅/大客厅/走廊这类人来人往的枢纽绝不动手**(必被撞见);一时引不到取景地,就先蛰伏、改日再图,或退而找另一处僻静角落,**绝不逮谁落单就杀谁、绝不在众目睽睽下仓促下手**。只有当某人已经当众识破你、不灭口就要暴露时,才破例提前清算(且仍挑僻静处)。)r  r   r   rv  _killer_on_cooldownr   r   r   r   re   rO   r   )rQ   r3  rm   r_  
cur_targetidealrC   coolingr:   otherstgt_hereat_venuer  r  s   ``            r/   rZ  zWorldEngine._killer_stager  sZ    ? ?	R/D/D[/Q/Q/WUW ? ? ?	()3QUU8___t
23;w-2...**,, 	{7 	{LL } ~ ~ ~ ~ 	{J(,,S"55Efffff!5!5e!<!<fffFJ_:+?_JV_D_``H6{{aH 111BCNuw)=2>>HLL  "lfp  "l  "l  @E  "l  "l  "lEM$U$A$ASU"W "_hr  "_  "_  "_"_ ` ` ` ` "9%9ELL "^: "^ "^5 "^ "^qv"^ "^ "^ _ _ _ _ {5!5 jV` j jx} j jblj j16j j j k k k k V!!fQi:&=&=&)S\B\B\ zvay z zq{ z z z { { {  	$99U###KK  QaeeE2&6&6  Q  QaeeFB>O>O  Q  Q  FL  Q  Q  Q  	R  	R  	R 	iLL  hX]  h  hghglglmuwygzgz  h  h  h  i  i  i55>> 	4LL21W:22233355== 	FLLDaiDDDEEE155>>/R00QUU;K5L5L0LL+,--- 	$99U### M 	N 	N 	N yyr1   c           	        |                                  }|r|                    d          nd}t          |oO||                                 vo9|| j                            | j        j                            |d                    v           S )uj   凶手当前位置是否就有本幕该清算的目标(且非豁免对象)——用于"撞见即把握"。r  Nri   )r  r   re   _sparedr   r   r   )rQ   r3  rm   r  s       r/   ru  zWorldEngine._killer_target_here  s     *AEE(OOOdA U!4<<>>1 UTZ11$*2F2J2J3PR2S2STTTV V 	Vr1   set[str]c                R    d | j         pi                     d          pg D             S )ue   凶手下不去手的人(acts.json reluctant 标记,如白聿——那晚跪在雨里救她的人)。c                    h | ]E}d |                     d          pg v |                     d          0|                     d          FS r^  r  ra  s     r/   rb  z&WorldEngine._spared.<locals>.<setcomp>  sW     N N NA155>>#7R88QUU8__8 h888r1   r;  )r   r   rP   s    r/   rs  zWorldEngine._spared  sB    N N49?*?*?*L*L*RPR N N N 	Nr1   c                <    | j         j        | j        z
  t          k     S )u   凶手刚动过手 → 蛰伏冷却(约一夜):此间不给杀机窗口、世界也拒绝再次落刀,
        把连环作案摊成逐日一案(治『第一夜连杀三人、之后再不动手』的节拍崩塌)。)r   r  r   KILL_COOLDOWN_HrP   s    r/   rk  zWorldEngine._killer_on_cooldown  s     
$t'88OKKr1   c           
          j         dS  fd j        j        D             } fd j        D             }t	          |          t	          |          z
  }                                  fd|D             }dt          t	          |                    z   dz   |rdd	                    |           d
ndz   d| dz   }g }|D ]}| j        j        v r j                            |          }d}	t          |dd          pg D ]:}
|
                    d          dv r!|
                    d          pddd         }	 n; j        j
                            |d          }|                    d| d| d|	rd|	 dndz   dz              |r|dd                    |          z   dz   z  }|s4 fd|D             }|rdd	                    |           nd}|d| d z   S t           j        j        dz            d!z   }t          d! j        |z
  d!z             }t	          |          |d!z
  k     r|d"| d#t	          |           d$| d%| d&	z   S |d'| d(t	          |           d)| d*| d+	z   S ),u{   凶手的私有 prompt:① 世界回执(实际杀了几个,防自我叙事污染)② 逐日复仇节拍压力(七天版)。Nri   c                &    g | ]}|j         v|S r+   r  r  s     r/   ro   z0WorldEngine._killer_pressure.<locals>.<listcomp>  %    FFFqq/E/E/E/E/Er1   c                *    g | ]}|j         k    |S r+   r   r-   rm   rQ   s     r/   ro   z0WorldEngine._killer_pressure.<locals>.<listcomp>  s&    AAA10@+@+@!+@+@+@r1   c                8    g | ]}|j         j        v|v|S r+   r  r-   rm   rQ   spareds     r/   ro   z0WorldEngine._killer_pressure.<locals>.<listcomp>  s-    \\\q
/G/GAU[OO!OOOr1   u0   【世界回执·只有你知道】你已清算:u   人u   (已死:r  r  u   ——至今无人死亡u   ;复仇名单还剩 u~    人未清算。你的目标台账或记忆若与此矛盾,一律以本回执为准:没有回执的『完成』只是想象。r	  r  r  r     ?u     · u   :此刻多半在u   一带u   ,心里惦记着「ra  rX  u   
【你对他们了如指掌·只有你知道】你太清楚这些人的软肋与心事了,几乎一眼就能猜出他们此刻在想什么、会往哪儿钻——拿这点信息差去精准下饵、错峰避人、把矛头引开:
rf  u   
但切记:你掌握这些是天大的破绽,行事说话务必像个一无所知、与此无关的人,绝不能流露出你对谁的隐私、对岛上机关了如指掌。c                8    g | ]}|j         j        v|v |S r+   r  r  s     r/   ro   z0WorldEngine._killer_pressure.<locals>.<listcomp>  s,    VVVaQdjo-E-E!v+++++r1   u   ,只剩你下不去手的u(   
【复仇将竟】仇人已尽数清算u5   ——大功告成,收敛痕迹,只待天明散场。r2   u*   
【复仇的进度·落后了】已是第u   天,你才清算了u   人——慢了。只剩u   天、还有u   个仇人。今天就锁定一个落单的目标,用命中私欲的诱饵把他引去僻静的取景地,确认独处即动手,别再拖。u   
【复仇的进度】第u   天,已清算u
   人,还剩u   个仇人、u   天。按部就班:今天再清算一个,得手即收敛、演回那个无害的局外人,留意别被识破——被抓住,十年的复仇就半途而废了。)r   r   rN  r   rO   rs  r9   rv  r   r   r   r   r7   r   r  rN   r   )rQ   killsro  	remainingculpable_aliveanchorintelrm   r  topr  locsp_alivetailday	days_leftr  s   `               @r/   r  zWorldEngine._killer_pressure  s   ;"2FFFFDJOFFFAAAATZAAAKK#e**,	\\\\\V\\\Ds3u::VY^^6;[2ejj//2222A[]C C C CC
  
	{ 
	{ADJO##
q!!ACa$//52  55??&77755==.B4CE 8 *&**1c22CLL???C???ehCpCaY\CaCaCaCanpqtyyzzzz 	H _aeajajkpaqaqr GG HF  	DVVVVV6VVVHIQYEuzz(/C/CEEEWYD  D  D  D  D  D  D$*&",--14?S01455	u::a z3 z zcfglcmcm z z&/z z=Fz z z { {  Kc K KE

 K K^g K Ku~ K K K L 	Lr1   )uU   {p}方向传来一声闷响,像是有什么东西倒了——又很快没了声息。u?   隐约听见{p}那边有动静,脚步?还是风?分辨不清。uL   一阵穿堂风带来{p}方向的异响,在这死寂的夜里格外刺耳。uR   {p}那头似乎有什么东西被碰倒、又被人匆匆扶住——谁在那边?c           	     R     j         $ j        j        r j        j         j        z
  dk     rdS ddlm}  | fd j        j        	                                D                       }|sdS |
                    d          d         \  }|dk     rdS  fd j        j        D             }|p fd	 j        j        D             }|sdS | j                            t          |                             } j         j                            t           j                                     } j                            t%          d
|                    |          d j        j        d                      j        j         _        t*                              d||           dS )ud  软杠杆:有人扎堆又无事发生时,在别处制造一声『异响』,把好奇/胆大的人引开 ——
        既治『全员挤在安全屋漫游闲聊』,又顺手把人引向埋着线索的空场景(探索+给凶手腾独处窗口)。
        纯环境提示,不强制移动;聪明 agent 才会去看。集会/停电/刚出命案时不触发。N      @r   )Counterc              3  >   K   | ]\  }}|j         j        v|V  d S r   r  )r-   rm   r   rQ   s      r/   r0   z-WorldEngine._disperse_herd.<locals>.<genexpr>  s5      __daatzF^F^F^F^F^F^__r1   r2   r3   c                    g | ][j                                       s?k    "t          fd j         j                                        D                       Y\S )c              3  L   K   | ]}|j         k    o|j        o|j         V  d S r   r  )r-   r  r  s     r/   r0   z8WorldEngine._disperse_herd.<locals>.<listcomp>.<genexpr>  sV       #H #H') $&8r>#Tbi#TDT #H #H #H #H #H #Hr1   )r   r   r  r   r   r-   r  	hot_placerQ   s    @r/   ro   z.WorldEngine._disperse_herd.<locals>.<listcomp>   s     I I I""&*"6"6r":":I?AY" #H #H #H #H-1Z-=-D-D-F-F#H #H #H  H  H @O ?Nr1   c                T    g | ]$}|k    j                             |          "|%S r+   )r   r   r  s     r/   ro   z.WorldEngine._disperse_herd.<locals>.<listcomp>  sA     #X #X #X"&(Ioodj>R>RSU>V>Vo $&&5oor1   r8  )r   r9  r  r;  uD   [导演] 散羊群:%s 处扎堆 %d 人 → 在 %s 制造异响引开)r   r   power_onr   r  r   collectionsr  r   r   most_commonrr   r   	randrangerO   _DIVERT_FLAVORSr   rI  r   formatr-  r4  info)	rQ   r  crowdr   empty_with_cluepoolrl  flavorr  s	   `       @r/   _disperse_herdzWorldEngine._disperse_herd  s    M%TZ-@%J(4+>>#EEF''''''____dj&:&@&@&B&B_____ 	F((++A.	1q55FI I I I I
(; I I I  X #X #X #X #X #X
0C #X #X #X 	FDH&&s4yy112%dh&8&8T=Q9R9R&S&STY8M8M%-TZ5KVY[ [ [ 	\ 	\ 	\"j2Z\eghjnooooor1   c           
     J   
  j         . j                            d j        j        t
          z   d            j          j        s j         j        j	        v rdS  
                                                                  rdS  fd j        j	        D             }t           j        j        dz            dz   }t          |          |k    s j        j         j        z
  dk     rdS  j        
 j        j                            
d          }                                 }|r|                    d	          nd}|r$| j        j	        v s|                                 v r 
 fd
 j        D             }|r|d         nd}|sdS  fd j                            |          D             } j        j                            |          |k    rt          |          dk    r||v rdS                      | j        j                            ||                    \  }}	
|f j        |<                        |d|	 d| d                                
d| d| d            j        j         _        t2                              d||
|t          |                     dS )u2  Layer1 软导演:凶手落后逐日节拍时,主动『造一个孤立窗口』——
        把当幕目标用一念拽向僻静处、并提示凶手跟进(soft 兜底硬手:目标仍可抗拒,但拉力强)。
        治『凶手有杀心无杀机、七天杀不动』的脊柱卡死(审查 P0-1/P0-2)。Nr)  r*  c                &    g | ]}|j         v|S r+   r  r  s     r/   ro   z.WorldEngine._director_tick.<locals>.<listcomp>  r{  r1   r  r2         @r   r  c                h    g | ].}|k    |j         j        v|                                v,|/S r+   )r   rN  rs  )r-   rm   killerrQ   s     r/   ro   z.WorldEngine._director_tick.<locals>.<listcomp>%  sG    rrr!Q&[[Qdjo=U=UZ[cgcococqcqZqZqAZqZqZqr1   r   c                0    g | ]}|j         j        v|S r+   r  r~  s     r/   ro   z.WorldEngine._director_tick.<locals>.<listcomp>*  s'    TTTa1DJO;S;S;S;S;Sr1   rJ   u"   你心里那件惦记已久的事(uJ   )突然按捺不住——趁现在没人盯着,你很想立刻一个人去u   把它了结,别再拖了。u	   你察觉u   动了心思、正要独自往uS   去——这正是你等的窗口。悄悄跟过去,确认只剩你俩,就落幕。uN   [导演] 造孤立窗口:拽 %s→%s,提示凶手 %s 跟进(第%d天,已杀%d))r   r   r,  r   r-  r/  rb   r   r   rN  r  rk  r7   r  rO   r   r   r   r  rs  r   r   
_lure_hookr   whisperr4  r  )rQ   r  r  kplacer  r  culpr  venuer  r  s   `         @r/   rJ  zWorldEngine._director_tick  s    ;J
0FIZ0Z\fggg;"dm"t7G4:?7Z7ZF##%% 	FFFFFDJOFFF$*&",--1u::!58J!Jc Q QF!%))&(;;!!&)3"""t 	/4:?22f6N6NrrrrrtzrrrD $.T!WW$F 	FTTTT4://77TTT:##F++v55#d))q..VW[^^Foofdj.B.F.Fvv.V.VWWt!'fV _$ _ _;@_ _ _ 	` 	` 	`V P P Pu P P P 	Q 	Q 	Q!Z1dE63E

	< 	< 	< 	< 	<r1   r   c                   | j         j        }| j        j                            |d          }|j        rLd|_        |j                            t          dt          d| j         j        z                      d           d S |j        r!t                              d||j                   |j        |_        |j        p|j        |_        |j        |_        |j        r||_        |j        rJ|j        |_        ||_        | j                            t3          dd| |j         |||d	
                     |j        r|                     |||j                   |j        r*t;          |d          r|                    |j                   |j        r|                     ||||           |j         r| !                    |           |j"        r| #                    ||||           |j        j$        || j        j%        vrx| j&                            |          d u}| j         j        }|j                            t          dt          |rdnd|z                      |rdn|j        pdd d                    t                              d|||j        rd|j        d d          dnd|j"        rd|j"         d|j'         dnd|j        d d                    | (                    ||           d S )Nr   u   (怔怔出神)r  皙?u   怔怔出神u   [盘算] %s: %sr  u   ※皙?r<  r=  r:   r  r?  r@  apply_replan       @ffffff?u	   交谈着u   观察着四周   z[%s@%s] %s%s | %su   说「r  ra  ri   u    → r  r  (   ))r   r-  r   r   r   emptylast_thoughtr  idlerN   r7   r\   schemer4  r  thoughtr  r_  r  r  gesturer  r	  r   rI  r   goal_updater(  replanhasattrr  
_do_speechleave_dialoguer  r  
_do_actionrg  rN  r   r  _check_meta_awakening)rQ   r3  r  r  r  r:   r  gaps           r/   r  zWorldEngine._execute7  s   j$
$((h779 	 0DJOOC3sTZ_'<#=#=>>OOOF: 	<KK)3
;;;Kj/DK:: 	%!$D; 	U #D"%DHU;S;Sck;S;S).csT T T U U U? 	H++CsGGG: 	*'$77 	*cj))): 	3OOCuc222 	%$$$? 	3OOCuc222:%#TZ_*D*D &**3//t;G*/CJOOC3w(?C3'F#G#GHH+2^KK9XGXZ][]Z]8^` ` `'e58ZG1SZ_1111RCF?Z?CO??cn????XZK$	& 	& 	& 	""3,,,,,r1   c                   | j         	|| j        v rdS |j        pddz   |j        pdz   t	          fdt
          D                       sdS | j                            |           |                     d| d| j        j	        
                    |d                     t          | j                  t          k    r|                     dd           dS dS )	u}   打破第四面墙的隐藏结局:够多角色盘出『有股岛外的力量在编排这盘棋』→ 望向屏幕外的你。Nri   rY  c              3      K   | ]}|v V  	d S r   r+   )r-   r  blobs     r/   r0   z4WorldEngine._check_meta_awakening.<locals>.<genexpr>f  s'      8819888888r1   u   👁 uI   的目光似乎越过了这座岛,望向了某个看不见的地方……u   👁 窥见真相u)  他们一个接一个停下手中的事,缓缓抬起头——越过雾鸦岛的风雨,越过这场被精心编排的杀局,七双眼睛直直望向了幕布之外:那个一直在注视、一直在拨弄这盘棋的你。「原来……从头到尾,真正设局的人,坐在屏幕的那一边。」)r   r   r  r_  r  META_AWAKEN_WORDSr  r+  r   r   r   rO   META_AWAKEN_AT_set_ending)rQ   r3  r  r  s      @r/   r  z!WorldEngine._check_meta_awakeninga  s   ;"cT-@&@&@F!rS(CJ,<"=8888&788888 	F$$$

i3iii:'++C44	6 	6 	6t"##~55#`a a a a a 65r1   c                T     j         j        }|j                                        } j                                      |r| j                            |          vs| j        j        v s	| j	        vr<| 
                              v rn:                     d| d           d|_        d S                      ||           d|j         d}}j                            |           xj        dz  c_        |_         fdj        D             }|r9 j                            t-          d d	|j         dd
||d                     fd j                            |          D             }	|	rH j                            t-          dd                    j                   dd
|	|d                     j        j        k    r                     d           nO|j        v r|n                               }
|
r@ j                            |
| j                            dd          t>          z  z   d           n j                            t-          d d	|j         d||dd                      j                            |          D ]} j	                            |          }|k    ru|rs j                            |          Y|j         j!        |j         j!        j"        dk    r8 j                            || j                            dd          z   d           tG          |d          rU|j$        %                     j         &                                 d|rd |z   nd d	|j         d j         j'        d!"           d S d S )#Nu   你正要对u$   说话,才发现TA已不在这里。ri   u   :「ra  r2   c                <    g | ]}|k    |j         j        v|S r+   r  )r-   r  r3  rQ   s     r/   ro   z*WorldEngine._do_speech.<locals>.<listcomp>  s/    XXXQ!s((q
?W?Wq?W?W?Wr1   r_  r`  privater  r<  r=  r>  tor  r?  r@  c                2    g | ]}|k    |j         v|S r+   r<   )r-   rm   r3  r  s     r/   ro   z*WorldEngine._do_speech.<locals>.<listcomp>  s:     A A A#XX!4<*?*? *?*?*?r1   r8  r  u   凑在一起低声交谈g
ףp=
?r<  r=  r>  r  r?  r@  u;   话说到这份上,各自心里都有了数,人群散开了r  r  r[  r  u   隔壁隐约传来说话声rc  r  -   Z   rT  r   u   ,我   对r  r  )(r   r-  r  r  r   r   r   r   rN  r   r  rq  r  _ensure_sessionr_  rC   r   rD   rG   r<   r   rI  r   rv  rR   _dissolve_session_next_speakerr   r,  r   uniformr  r  rg  rk  r  r   r  r|  r  )rQ   r3  r  r:   r  r  r  r  r<   
bystandersr  r  r  r  s   ``           @r/   r  zWorldEngine._do_speechs  sf   j$]  ""##C(( 		<--e4444djo8M8MQS[_[eQeQe00s;;;;NN3(_r(_(_(_```')D$F++CU;;**3:***Jd###KK1KKDKXXXXX$,XXXG i  X#?]?]cj?]?]?]-67#UXcf"h "h "h i i iA A A A ATZ%9%9%%@%@ A A AJ b  Y27**T\2J2J/d/d/d-6:S[_"a "a "a b b b {dk))&&t-jkkkk$,..bbD4F4FtS4Q4Q mJ''S483C3CC3M3MP_3_-_aklllHUc;Y;Y#*;Y;Y;Y).ct+HJ J J K K K --e44 W WZ^^E**C<<B<4+;+?+?+F+F+NX-59I9NRX9X9XJ''sTX5E5Eb"5M5M/MvVVV4"" 	FK4:#3#3#5#5 k k;S52::QS k k\_\f k k k $
 4   F F F F F	F 	Fr1   r  r6   c                   | j                             |          | j                             |          }}|||u r|S ||t          |j                  t          |j                  k    r||fn||f\  }}|j        D ]/}||j        vr|j                            |           || j         |<   0|j                            |j                   | j                            |j	        d           |S |p|}	|	>t          t          | j                  |g | j        j                  }	|	| j        |	j	        <   ||fD ]/}||	j        vr$|	j                            |           |	| j         |<   0|	S )u=   把 aid 与 to 归入同一场会话(新建/加入/合并)。N)r8   r:   r<   rG   )r   r   rO   r<   r   rC   extendr   r
  r8   r6   rH  r   r   r-  )
rQ   r3  r  r:   sasbsmallbigr  r  s
             r/   r  zWorldEngine._ensure_session  s   !%%c**D,<,@,@,D,DB>bBhhI>bn%(__BJ%G%G"bbRTXJE3] * *CK''K&&q)))&) ##IU[)))Mei...JxR<tDIeR"&*"8: : :D&*DM$(#r 	+ 	+A$$##A&&&&* #r1   r  Session | Nonec                2    fd|r|j         ng D             S )Nc                     g | ]
}|k    |S r+   r+   )r-   r  r3  s     r/   ro   z2WorldEngine._others_in_session.<locals>.<listcomp>  s    FFFaQ#XXXXXr1   r  )rQ   r  r3  s     `r/   r  zWorldEngine._others_in_session  s(    FFFFD8DLLbFFFFr1   afterc                      fd|j         D             }t          |          dk     s||vrdS ||                    |          dz   t          |          z           S )Nc                0    g | ]}|j         j        v|S r+   r  )r-   r  rQ   s     r/   ro   z-WorldEngine._next_speaker.<locals>.<listcomp>  s'    EEEqATZ_,D,D,D,D,Dr1   rJ   ri   r2   )r<   rO   r  )rQ   r  r  alives   `   r/   r  zWorldEngine._next_speaker  sc    EEEEDLEEEu::>>U%//2ekk%((1,E

:;;r1   Tr  c           
        | j                             |d           }|d S ||j        v r|j                            |           t	          |j                  dk     r|                     |d           d S |rN| j                            t          d| ddt          |j                  | j
        j        d                     d S d S )NrJ   u   这场交谈散了r8  u   离开了交谈r  r  r  )r   r
  r<   r  rO   r  r   rI  r   r  r   r-  )rQ   r3  r  r  s       r/   r  zWorldEngine._leave_session  s    ##C..<F$,L$$$t|q  ""4)=>>>>> 	QHUs<S<S<S)2tDL7I7I)-)?$P P P Q Q Q Q Q	Q 	Qr1   summaryc           
        t          j                  dd          }t          j                  D ]}| j                            |d            | j                            |          }|ot          |d          r_|j        	                    | j
                                         dd                    |dd                    z   | j
        j        d           ||                     |d| d	           ňfd
| j                            j                  D             }|rjt%          j                  dk    rR| j                            t+          dd                    j                   dd|| j
        j        d                     j                                         | j                            j        d            d S )Nir   u   ,一场交谈结束。要点: / rb  r  r  r  c                &    g | ]}|j         v|S r+   r  )r-   rm   r  s     r/   ro   z1WorldEngine._dissolve_session.<locals>.<listcomp>  s%    [[[AQdlEZEZaEZEZEZr1   rJ   r8  r  u   的交谈散了r  g333333?r  )r  rC   r<   r   r
  r   r   r  r   r  r   r|  rv  r  rq  r   r   r:   rO   r   rI  r   r-  clearr   r8   )rQ   r  r  r  r  r  r  s    `     r/   r  zWorldEngine._dissolve_session  s   DJ$dl## 	2 	2A  D)))""B~'"h"7"7~	!!z''))HHH5::VZ[][^[^V_K`K``J(T " ; ; ; ~q.g...111[[[[!5!5dj!A!A[[[
 	Q#dl++q00HUuzz$,?W?W<h<h<h)2z)-)?$P P P Q Q Q 	$(D)))))r1   c                   |j         |j                                        |j        dz  c}}|dk    r;|j                                      s|                     d d d           d S d S |dk    rg|j                            dt          |d          	           | j	        
                    t          d
 d| j        j        d                     d S |dk    rt          fd| j        j                                        D             d           }|r| j                            |j                  rx|                     d|j         d|j        rd|j         dndz              | j	        
                    t          d
 d|j         d| j        j        d                     d S |                     d d           d S |dk    rt          fd| j        j                                        D             d           }|r| j                            |j                   dv rdnd}|                     d|j         d| d           | j	        
                    t          d
 d | | j        j        d!                     |                     d" d#|j         d| d$           d S |                     d% d           d S |d&k    r|                                d S |d'k    r1| j        j                            g           v r| j        j                                      pi }	|	                    d(          pd)}
t          fd*| j        pi                     d+          pg D             d           }|	                    d,          rS|rQd- d. d/|
 d0| j         d1|                    d2           d3|                    d4           d5| j         d6| j         d$}nr|r\d- d. d7|
 d8| j         d9 d:d;                    |                    d<          pg            d=|                    d(           d> d?}nd- d. d7|
 d@| j         dA	}|                     |           tA          |dB          rC|j!        "                    | j        #                                 dC| | j        j$        dDE           | j	        
                    t          d
 dF dG| j        j        d                     d S |                     dH dI           d S |dJk    r| %                    |           d S |dKk    r| &                    |           d S |dLk    rrt          fdM| j'                                        D             d           }||                     dN           d S | j(        )                                dOk     rdP                    tU          |j+                  dQd                    }|                     dR|            tA          |dB          rC|j!        "                    | j        #                                 dS| | j        j$        dOE          nd  d S  d S | j	        
                    t          dT dUdVtU          |j,                  | j        j        dWX                     |                     dY           d S |dZk    rp|j-        pd                                }|r|| j        j        c|_.        |_/        | j	        
                    t          d[ d\| d]d^| j        j        d_`                     |                     da db|d dc          d]           tA          |dB          rH|j!        "                    | j        #                                 dd| d]| j        j$        dE           d S d S d S |dek    r| 0                               d S |dfk    r| 1                               d S |dgk    rY|j2        k    r6|j        3                    dh           |j4        5                    dh           d S |                     di           d S | j        j6        }|j        7                    tq          t          |ts          |                    t          djts          dk|z                                |j:        pdl           d S )mNr   rS  u   从u   去不了「u&   」(没有这条路或地名不对)。searchu   仔细搜查这里i  )search_placer  u   在翻找搜查这里皙?r  takec              3  `   K   | ](}|j         k    |j        |j        |j        v $|V  )d S r   )r:   r  r  rl   )r-   r0  argr:   s     r/   r0   z)WorldEngine._do_action.<locals>.<genexpr>  s\       c cQ'U**18*AK*TW[\[aTaTa TaTaTaTac cr1   u	   你把『u   』收进了随身物品。r  r  ri   u   拿走了『   』r  u   这里没有可以拿走的「   」。destroyc              3  D   K   | ]}|j         k    |j        v |V  d S r   r  rl   )r-   r0  r3  r  s     r/   r0   z)WorldEngine._do_action.<locals>.<genexpr>  s<      aaQqx3SVZ[Z`S`S`qS`S`S`S`aar1   )r   r    u   投进壁炉烧成了灰u   撕得粉碎u*   。这下世上再没有这份东西了。u   把什么东西333333?u   🔥 u   把『rX  u   你身上没有「useexaminerG  u.   致命外伤,死亡时间不久——是人为c              3  N   K   | ]}|                     d           k    |V   dS rF  r  )r-   rm   r  s     r/   r0   z)WorldEngine._do_action.<locals>.<genexpr>  s>      ll!UVUZUZ[cUdUdhkUkUkAUkUkUkUkllr1   r;  scriptedu   你查验了u   的遗体(死于u   ):死法是『u   』,和u   第r  rg  rl   u\   」如出一辙——凶手在**按这套章法逐一行刑**,对它了如指掌。能照着u   这么干的,多半就是z):u   。可u   里该轮到u   的那一幕该是在「rc  r:   u   」、死法是『uL   』——这次对不上。要么凶手被打断了、临时下的手,要么u'   撞破了什么不得不提前灭口。u   。死法不在u   的章法里。r   u   ,验尸:q=
ףp?r  u   俯身查验u	   的遗体u   这里没有u   的遗体。r  r  r  c              3  D   K   | ]}|j         k    |j        v|V  d S r   )r:   r<   )r-   r  r3  r:   s     r/   r0   z)WorldEngine._do_action.<locals>.<genexpr>$  sK       G GqGu,,AI1E1E 1E1E1E1EG Gr1   u!   这里没有可偷听的交谈。r:  r  u)   你不动声色地凑近,听清了几句:u   ,我偷听到:r8  u1   凑得太近——被发现在偷听你们说话!r  g      ?r  uJ   你凑得太近,被他们发现了!对方的目光齐刷刷扫了过来。shoutr_  u   的喊声穿透风雨:「ra  r9  333333?r<  r=  r>  r  r?  r@  u   📢 u   向全堡大喊:「$   u   ,我向全堡大喊:「assembleaccusere  g      @u=   这里不是你的房间,睡不安稳——要睡先回房。r  r  u   观察着周围);r  r  r  minutesr  
start_moverq  start_dorN   r   rI  r   r   r-  rH  r   r   r   	take_itemrQ  rl   r  destroy_itemr+  _do_usebodiesr   
death_infor   r   r   rv  r  r   r  r|  r  _do_lure_do_killr   r   r   r  rC   r<   r_  r  r  _start_assembly
_cast_voter   start_sleepr  sleptr\   r  rL   r7   r  )rQ   r3  r  r:   r  rk  durr  howdirG  r  cluer  r  msgr  r  s    ` `             @r/   r  zWorldEngine._do_action  s   #.*>*>*@*@#+PRBRc36>>:((-- js$h%$h$hS$h$h$hiiiiij jXJ 4c#smmRWXXXHUc;X;X;X).cAWbeg g g h h h h hV^^ c c c c c$*"2"9"9";"; c c cdhj jB Rdj**25#66 Rs$T$T$T$TjljqXyXf\^\cXfXfXfXfwy$z{{{  X#?_?_SUSZ?_?_?_-2#TZE[fi"k "k "k l l l l l s$PS$P$P$PQQQQQYaaaaa$*"2"9"9";";aaacghhB F
''...49=T4T4T00Zhs$k$k$kC$k$k$klll  X#?[?[VY?[?[-2#TZE[fi"k "k "k l l l

B3BBbgBB#BBBEJJJJJs$D$D$D$DEEEEEU]]LLeS)))))Ydj'++E26666 Z*..s339r))]-]llllb(=(=k(J(J(Pblllnrss66*%% 
B# 
Bj3 j j j jU[ j j"&"3j j8;j jNQggV\ooj j )-(9j j UYTdj j jDD  BO3 O O O O O O"&"3O OADO O_b_g_ghkhohopwhxhxh~|~__O O UX  U\  U\  ]e  Uf  UfO ObeO O ODD B#  B  Bu  B  B  B  B_c_p  B  B  BDsD)))4** vK''4:+;+;+=+=(M(Mt(M(MtzOcpt'uuu  X#?a?aSV?a?a?a-2#TZE[fi"k "k "k l l l l l s$D3$D$D$DEEEEEV^^MM#tUC00000V^^MM#tUC00000[   G G G G GDM$8$8$:$: G G GHLN ND|s$GHHHHH""S((zz$tz"2"2233"788s$VPT$V$VWWWMTUY[cMdMdo##tz'7'7'9'9$O$O$O$O$(J$8S $ J J JjnjnjnjnJ J J   Y25/h/h/h-64;M;MUX-1Z-Cd"T "T "T U U U s$pqqqqqW__*#**1133C 	N7:DJ<R4 $"4  X#?h?h`c?h?h?h-5S-1Z-Cd"T "T "T U U U 

H3HH3ss8HHH%PPP4** NK''4:+;+;+=+=(^(^VY(^(^(^(,
(< ( N N N N N	N 	NN N Z  e,,,,,XOOC,,,,,W__	!!
&&s+++	$$$$$s$cddddd*/CJOOCCS 2 2C3sSy>>4J4JKKSZMl[lmmmmmr1   hoursc           	     >   | j         j        |dz  z   }|| j        k     r|| _        | j                            d| j        d           | j                            t          dd|ddd| j         j        d	
                     |                     d|dd           dS dS )ug   把渡船提前 hours 小时来接(如点亮灯塔求救)——世界级副作用,任何世界可用。i  r#  r$  r8  uN   对岸有了回应——远处海面亮起一点船灯!渡船提前出发,约 r  u    小时后靠岸。r9  r  r;  u.   ⛴ 求救换来回应:渡船提前出发,约 N)	r   r-  r   r   r,  r   rI  r   r+  )rQ   r  new_etas      r/   _advance_ferryzWorldEngine._advance_ferryM  s    *(54<7T^##$DNJT^WEEEHU Fin  F  F  F  Fdj&<sL L L M M M JJdddddeeeee $#r1   r  c                n
   | j         j        }| j        j                                        D ]}|j        |k    rt          fd|j                                        D             d          E	                    d          r>|j        d         k    r-| 
                    	                    dd                      dS 	                    d          r_| j        j        	                    d                   }|r|j        k    s-| 
                    	                    dd                      dS 	                    d          rt          fd	| j        j                                        D             d          }|s-| 
                    	                    dd
                      dS | j                            |j                   t          |dd          dz   |_        t!          	                    dd                    }|j        |k    }	|	r&| j                            |j        d                    	                    dd                              dt'          |j                                                dt'          |                    }
| 
                    |
|	r	                    dd          n	                    dd          z              n	                    d          r&| j                            |j        d                    	                    d          r.| j        j        	                    d                   }|d|_        | 
                    	                    dd                     	                    d          t+          d                   | j        _        	                    d          r3| j                            d         d         d         d                    	                    d          r(|                     t3          d                              	                    d          r| j                            t9          dd         	                    dd           ||t3          	                    d!d"                    	                    d          d#k    rd$nd%                     	                    d&          r|                     d&         |            dS | 
                    d'| d( d)           dS )*uY  全数据驱动的可供性(G15):设施的 verbs 声明动词→效果,引擎不含任何世界专属分支。
        效果键:requires_state/requires_held_item(前置);set_state/reveal_item/set_power/connect(状态);
        fuel_to+consume_held_match+fuel_need(燃料计数);advance_ferry_h(渡船提前);event/scope/salience/narr(广播)。c              3  *   K   | ]\  }}|v 	|V  d S r   r+   )r-   verbvr  s      r/   r0   z&WorldEngine._do_use.<locals>.<genexpr>`  s+      IIwtQTS[[[[[[IIr1   Nrequires_statefeedback_failu   现在还做不了这个。requires_held_itemu%   你手里缺了点什么,做不成。fuel_toc              3  z   K   | ]5}|j         k    r(                    d d          |j        v *|j        1|V  6dS )consume_held_matchri   N)r  r   rl   r  )r-   r0  r3  specs     r/   r0   z&WorldEngine._do_use.<locals>.<genexpr>j  sb       c c1QXQT__!%*>!C!Cqv!M!MVWVa!M !M!M!M!Mc cr1   u!   你身上没有需要的东西。_countr   r2   	fuel_needr  u   加了一点。z{count}z{need}feedback_fullri   feedback_more	set_statereveal_itemFu%   你摆弄了一下,没什么变化。	set_powerconnectadvance_ferry_heventr8  r>  r:   r@  r  r9     附近传来异样的动静)r<  r=  r>  r:   r  r?  r@  rd  narru   在u   做不了「r  )r   r-  r   
facilitiesr   r:   rH  verbsr   r   rq  r  r  rQ  r   r-  r7   set_facilityreplacer9   r  re   r  r4  r!  rF   r   rI  r   r+  )rQ   r3  r:   r  r  fr  heldneedr  fbr,  s    ` `       @r/   r  zWorldEngine._do_useX  s-    j$&--// .	 .	Aw%IIII!'--//III4PPD|xx()) fag>N9O.O.OsDHH_>[$\$\]]]_e_e_exx,-- tZ%))$/C*DEE tryC//NN3Bi(j(jkkkmsmsmsxx	"" c c c c c c
(8(?(?(A(A c c cdhj j pNN3Be(f(fgggioioio
''000"1h22Q6488K3344x4' CJ++AD$y/BBBXXj*;<<DDYPSTUT\P]P]^^ffgoqtuyqzqz{{sB4*r$((?B*G*G*GUYU]U]^moqUrUr$stttt88K(( EJ++AD${2CDDD88M** *)--d=.ABBB~$)	sDHHZ9`$a$abbbxx$$0&*4+<&=&=
#xx	"" K
""4	?1#5tIq7IJJJxx)** D##E$/@*A$B$BCCCxx   x  YW-1XXgw-G-Gu\_gj05dhhz36O6O0P0PPTPXPXY`PaPaemPmPm/L/Lsu"w "w "w x x x xx 0

4<///FFs@%@@S@@@AAAAAr1   c           	     t     j          j         j        rdS  fd j        D             }t	          |          dk     rdS  j        j        }t           j        	                                          D ]%\  }\  }} 
                    |d| d| d           & j                                          j        j         }ddi g d	 _          j                            t!          d
d|rdndz   d|d                                          dd           |D ]} j        j                            |          dk    r] j                            |          }|At)          |d          r1                     |d           |j                            d            j                            d|dz   d           dS )u   夜话(必到环节):每晚钟声把所有活人召回门厅,交换处境、半数以上投票处刑一人——固定收束节拍。Nc                0    g | ]}|j         j        v|S r+   r  r~  s     r/   ro   z,WorldEngine._night_court.<locals>.<listcomp>  s'    CCCq!4:?*B*B*B*B*Br1   rL  u3   夜话的钟声把人都召去了门厅——你引u   去u%   的局散了,等散场再找机会。u   夜话summoncallerphasevotes	attendeesr8  u	  门厅的落地挂钟一下下敲响——夜话时分,这是每晚雷打不动的规矩:所有人此刻必须放下手里的事、立刻赶回门厅,当着所有人交代自己刚才在哪、看见了什么,然后投票决定要不要处刑一个最可疑的人。ud   今晚还没出人命,主要是对齐处境、立规矩——没有铁证就别轻易处刑无辜。u4   缺席或支吾的人,会是第一个被怀疑的。r9  ffffff?r;  uK   🕯 夜话时分——钟声响起,所有人被召回门厅当面对质。r   r  Fr  rA  i  r   )r   r   rb   r   rO   r   r-  r  r   r   rq  r  r   rN  r   rI  r   r+  r   r   r  r  r  r  r   r,  )	rQ   r  r  victimlurerr  firstrm   r  s	   `        r/   rL  zWorldEngine._night_court  s   =$(?4=(?FCCCCDJCCCu::>>Fj$&*4=+>+>+@+@&A&A 	Q 	Q"FNUENN5  #PX^  #P  #Pch  #P  #P  #P  Q  Q  Q  QJO##+hZ\]]J BG S}}RT #6 6 6 	7 	7 	7 	

`bjkkk 	1 	1Az#''**h66JNN1%%=WQ%8%8=''E':::G&&x000
NC'M:FFFFFr1   c           
        | j         j        }| j        |                     |d           d S |di g d| _        | j                            t          d| dd||d                     |                     d	| d
d           | j        	                    d|dz   d           |dk    r8| j
                            |          }||j                            d           d S d S d S )Nu   对质已经在进行中了。rC  rD  r8  u[   在门厅高声召集所有人:「都到门厅来!当着所有人的面,把话说清楚!」r9  r  r     ⚖ u%    召集全员到门厅当面对质。r   rA  i  r   )r   r-  r   rq  r   rI  r   r+  r   r,  r   r   r  r  )rQ   r3  r:   r  r  s        r/   r  zWorldEngine._start_assembly  s!   j$=$NN3 @AAAF#&BUWXXY*-  (K  (K  (K%-SdT T T 	U 	U 	U 	

D#DDDhOOO
NC'M:FFFH:>>#&&D
%%h///// r1   c           
          j         j        } j        }|d S |d         dk    r fd j        D             } fd|D             }|D ]`}                     |d           d j        j        |<    j                            |          }|t          |d          rd |j	        _
        a|rC j                            t          d	d
d                    |           dd|d                     d |D             }t          |          dk     r	d  _        d S d|d<   ||d<   t!           j                                                  D ]#}|j        dk    r                     |d           $ j                            t          d	dd                    |           dd||d                     t+          |          D ]*\  }	} j                            ||dz   |	dz  z   d           +t+          |          D ]*\  }	} j                            ||dz   |	dz  z   d           + j                            d|d z   d!           d S |d         dk    r                                  d S d S )"NrF  rC  c                0    g | ]}|j         j        v|S r+   r  r-   r  rQ   s     r/   ro   z1WorldEngine._assembly_advance.<locals>.<listcomp>  '    GGG1atz.F.FQ.F.F.Fr1   c                Z    g | ]'}j         j                            |          d k    %|(S )r   )r   r   r   rQ  s     r/   ro   z1WorldEngine._assembly_advance.<locals>.<listcomp>  s6    VVVdj.B.F.Fq.I.IX.U.U!.U.U.Ur1   Fr  r   r  r8  u   钟声不容违抗——r  u*   也只得撂下手里的事赶到门厅。r9  r  r;  c                    g | ]}|S r+   r+   ra  s     r/   ro   z1WorldEngine._assembly_advance.<locals>.<listcomp>  s    ***q***r1   rL  voterH  u"   对质开始,交谈声戛然而止u   对质开始,在场的有:ue   。轮到每个人表态——用 accuse 指认你最怀疑的人(arg=名字),或 arg 留空弃权。r  r  r     r  zinterrupt:assemblyi     rA  i8  r   )r   r-  r   r   r  r   r   r   r  r  rg  r   rI  r   rv  rO   r  r   r   r:   r  r.  r   r,  _assembly_tally)
rQ   r  rm   r  
stragglersr  r  rH  r  r0  s
   `         r/   rK  zWorldEngine._assembly_advance  s   j$M9FW:!!GGGG
GGGEVVVVUVVVJ + +##A#666*2
$Q'JNN1%%=WQ%8%8=&*AGO Q  Y 0M%**U_J`J`  0M  0M  0M-5S3"P "P "P Q Q Q +*E***I9~~!! $AgJ&AkN T]113344 W W:))**41UVVVHU rUZZ	5J5J  r  r  rIS4I I I J J J
 "),, P P1
##AsRx!b&'8:NOOOO!),, T T1
##AsV|a"f'<>RSSSSJgzJJJJJwZ6!!  """"" "!r1   c           
        | j         }||d         dk    s
||d         vr|                     |d           d S |                                }||d         |<   |rd| nd}| j                            t          d| d	| d
d|| j        j        d                     t          |d                   t          |d                   k    r| 	                                 d S d S )NrF  rU  rH  uF   现在没有进行中的对质投票。想发起对质,用 assemble。rG  u
   指认了    弃权r_  u   当众rX  r   r  r  )
r   rq  r  r   rI  r   r   r-  rO   rX  )rQ   r3  r:   r  rm   words         r/   r  zWorldEngine._cast_vote  s   M9'
f,,1[>0I0INN3 hiiiF '
3(.<$F$$$HX#7N7NT7N7N7N%-S
@Vadf f f 	g 	g 	gqz??c!K.1111  """"" 21r1   r  towarddeltac                    | j                             |          }|||k    st          |d          sdS |j                            |ddd          }t          dt          d|d         |z                       |d<   dS )	ug   调整 who 对 toward 的信任(夹在 -1..1)。关系/信任会反过来影响说服与信息共享。Nr   ri   rE   r   g      r  r   )r   r   r  r   
setdefaultrN   rL   )rQ   r  r]  r^  r  rs         r/   
_adj_trustzWorldEngine._adj_trust  s~    JNN39vWQ-D-DFK""6"s+K+KLLs3'
U(:;;<<'


r1   c                    | j                             |          }|t          |d          sdS |j                            |          pi                     dd          S )Nr   rE   r   )r   r   r  r   )rQ   r  r]  r  s       r/   r  zWorldEngine._trust_of  sV    JNN39GA{3393''-2227C@@@r1   rG  c                0   i }|                                 D ]_\  }}|s|                    |g                               |           |                     ||d           |                     ||d           `|                                D ]}t          t          |                    D ]k}t          |dz   t          |                    D ]H}|                     ||         ||         d           |                     ||         ||         d           IldS )u   夜话投票改写关系网:被指认者怨恨指认者、指认者的怀疑固化;指认同一人的人之间生出同盟感。gffffffֿgɿr2   gQ?N)r   r`  r   rb  r   r   rO   )rQ   rG  	by_targetvoterr  accsr0  js           r/   _apply_court_trustzWorldEngine._apply_court_trust  s.   *,	 	- 	-HE1   B''..u555OOAue,,,OOE1e,,,,$$&& 	< 	<D3t99%% < <q1uc$ii00 < <AOODGT!Wd;;;OODGT!Wd;;;;<<	< 	<r1   c           
          j         }|d S d  _                              |d                    d |d                                         D             }i }|D ]}|                    |d          dz   ||<   t	          |d                   dz  dz   t           fd|                                D             d           }d                    d	 |d                                         D                       pd
}|T j        	                    t          dd| dd j        j        d                                          d|            d S  j                            |                                |d            j                            |d            j                            |            j                            |           | j        k    } j        	                    t          dd| d| d|rdndz   d j        j        d                                          d| d| d|rdndz              |r                     d| d                                              d S )!NrG  c                    g | ]}||S r+   r+   )r-   r  s     r/   ro   z/WorldEngine._assembly_tally.<locals>.<listcomp>  s    555q15555r1   r   r2   rH  rJ   c              3  \   K   | ]&\  }}|k    |j         v |j        j        v"|V  'd S r   )r   r   rN  )r-   r  r   r?  rQ   s      r/   r0   z.WorldEngine._assembly_tally.<locals>.<genexpr>  sK      qqTQa4iiAOOXYaeakapXpXpqXpXpXpXpqqr1   r  c              3  .   K   | ]\  }}| d |pd V  dS )u   →r[  Nr+   )r-   r  r  s      r/   r0   z.WorldEngine._assembly_tally.<locals>.<genexpr>  s8      TTAq44Q](44TTTTTTr1   u   无人表态r8  u   投票结果:uI   。没有人获得过半指认——对质无果而散,猜疑更深了。r9  r  r;  u   ⚖ 对质无果:Fr  r   rX  uX   被过半指认,众人将他制住、捆在了门厅的立柱上——直到渡船来。uI   撕开伪装,他眼里十年的恨意再藏不住——他就是凶手。u4   他嘶喊着自己冤枉,声音在门厅里回荡。r  rN  u    被过半指认处决(rU  u   正是真凶。u   ——可他不是凶手。   凶手伏法uB   (江离)被当众指认。十年的复仇,终结在黎明之前。)r   ri  r   r   rO   rH  r   rv  r   rI  r   r   r-  r+  r   r   r  r   r  r   drop
unregisterr   r  _check_ending)	rQ   rm   rG  tallyr  r  r  
was_killerr?  s	   `       @r/   rX  zWorldEngine._assembly_tally  s   M9F'
+++55AgJ--//555 " 	+ 	+AyyA*E!HH1[>""a'!+qqqqqU[[]]qqqswxxTT7AQAQASASTTTTTfXf>HU ,M6  ,M  ,M  ,M)19OZ]_ _ _ ` ` ` JJ3633444FV$$$FU333
)))
F###t//
 PF  P  Pv  P  P  Pfp  mbb  wmn$*"83	H H H 	I 	I 	I
 	

E&EEEEE^h  JLIZIZ  oL  M  	N  	N  	N 	|^-z-z-z{{{r1   c                      j         d S  fd j        D             } j        |v }dd                    |           d|rd j         dndz   }                     |sdnd	|           d S )
Nc                0    g | ]}|j         j        v|S r+   r  r~  s     r/   ro   z.WorldEngine._ferry_arrives.<locals>.<listcomp>9  rR  r1   uW   封岛第七天,渡船的汽笛刺破晨雾,靠上了码头。熬到最后的幸存者:r  rX  u   而u2   就混在他们中间,复仇未竟,无人识破。ri   u   渡船靠岸u   凶手逍遥)r   r   r   rv  r  )rQ   	survivorskiller_alivetexts   `   r/   rH  zWorldEngine._ferry_arrives6  s    ;"FGGGG
GGG	'94 Ejojtjtu~jj  E  E  Eamu])]]]]suw|OQUVVVVVr1   c                     j         d S  fd j        D             } fd|D             } fd|D             } j         j        j        v r                      d j         d           d S |sUd                     fd|D                       }|rd| d	nd
}                     d j         d|  j         d           d S d S )Nc                0    g | ]}|j         j        v|S r+   r  r~  s     r/   ro   z-WorldEngine._check_ending.<locals>.<listcomp>B  rR  r1   c                *    g | ]}|j         k    |S r+   r}  r~  s     r/   ro   z-WorldEngine._check_ending.<locals>.<listcomp>C  s&    CCC1Q$2B-B-BQ-B-B-Br1   c                @    g | ]}|                                 v|S r+   rs  r~  s     r/   ro   z-WorldEngine._check_ending.<locals>.<listcomp>D  s+    DDD!AT\\^^,C,CA,C,C,Cr1   rn  u/   已死,复仇半途而废,清算到此为止。r  c              3  H   K   | ]}|                                 v |V  d S r   r}  r~  s     r/   r0   z,WorldEngine._check_ending.<locals>.<genexpr>I  s5      $Q$Q1Q$,,..=P=PQ=P=P=P=P$Q$Qr1   u   他独独放过了rX  ri   u   复仇终焉u1   的章法走完了,该清算的人一个不剩。u_   收敛起所有痕迹,静静等着天明——没有人知道,设局的人就在他们中间。)r   r   r   r   rN  r  rv  r   )rQ   rv  	innocentsculpablespared_leftr  s   `     r/   rq  zWorldEngine._check_ending?  sH   ;"FGGGG
GGG	CCCC	CCC	DDDDyDDDtz..^0@-q-q-qrrrrr 	]**$Q$Q$Q$Q	$Q$Q$QQQK<GO88888RD^0A .\ .\tx .\*.*:.\ .\ .\ ] ] ] ] ]		] 	]r1   rk  rx  c           	     ~     j         d S  fd j        D             }|| j                                        | j        t           j        j                  t           j	                  d _          j
                            t          dd| d| d j        j        d                                          d	| d
|            t           j                                                  D ]}                     |d            j                                         t&                              d||           d S )Nc                0    g | ]}|j         j        v|S r+   r  r~  s     r/   ro   z+WorldEngine._set_ending.<locals>.<listcomp>Q  rR  r1   )rk  rx  r  rv  r  rN  r   r8  u   【终局·rY  r9  r  r;  u   🏁 终局——r7  u   终局已至u   🏁 终局:%s|%s)r   r   r   r|  r   r  r   rN  r  r   r   rI  r   r-  r+  r   r   r  pauser4  r5  )rQ   rk  rx  rv  r  s   `    r/   r  zWorldEngine._set_endingN  sZ   ;"FGGGG
GGG	#T
8H8H8J8J$-9I#DJO44$t}BUBUW W 	Y8Ud8U8Ut8U8U%-TZ5KVY[ [ [ 	\ 	\ 	\

4t44d44555--//00 	9 	9D""48888
*D$77777r1   )r   r    r!   rB  )
r=  r%   r>  u	   风暴林r   r<  u   墓园u   海滩u   温室u   花园tuple[str, str]c                x     j                             |          }t           j        j                                                   j        pi                     d          pi                     |          pi }|                    d          pd}d fd                                 }|rQ|                    d	          |k    r8|                    d
          pg D ] }|v r| j        vr |          r||fc S !t          |dd          pg D ]D}|                    d          dv r+D ](}||d         v r| j        vr |          r||fc c S )E|                    d          }	|	r|	v r|	 j        vr |	          r|	|fS  j
        D ]=}|v r7 |          r, fd j                            |          D             s||fc S >dD ]=}|v r7 |          r, fd j                            |          D             s||fc S >t          fd j
        D             d          }
|	p|
pd|fS )uK  挑诱饵:hook 文案命中目标私欲(读 acts.json dossier:母带/账本/日记/原稿…)。
        七天版:时间充裕,优先把当幕目标引到**本幕主题取景地**(僻静处,对得上死法、铺满地图),
        引不到再退到目标自己私罪点名的僻静处、dossier 物证地点,兜底无人角落。r   r   u!   你要找的那样东西的下落r   r9   rH   re   c                `    | k    p't          j                            |                     S r   )re   r   path)r   r:   rQ   s    r/   	reachablez)WorldEngine._lure_hook.<locals>.reachablel  s*    :@djooeQ&?&?!@!@@r1   r  r:   r	  Nr  r  r  r   c                0    g | ]}|j         j        v|S r+   r  rQ  s     r/   ro   z*WorldEngine._lure_hook.<locals>.<listcomp>  '    \\\11DJOC[C[QC[C[C[r1   )r   r#   rA  u	   道具间r@  r$   c                0    g | ]}|j         j        v|S r+   r  rQ  s     r/   ro   z*WorldEngine._lure_hook.<locals>.<listcomp>  r  r1   c              3  :   K   | ]}|v  |          |V  d S r   r+   )r-   r   
all_placesr  s     r/   r0   z)WorldEngine._lure_hook.<locals>.<genexpr>  s4      [[!!z//iiXYll/A////[[r1   r   )r   r9   rH   re   )r   r   r  r   rr   keysr   r  PUBLIC_PLACESr   r   r   rH  )rQ   r  r:   r  r  r  r  r   r  evfarr  r  s   ` `        @@r/   r  zWorldEngine._lure_hookc  s    Z^^F##$*-224455
b%%i006B;;FCCIrxxF#F	A 	A 	A 	A 	A 	A 	A !! 	#3778$$..ggg&&," # #
??q0B'B'ByyQR||'Bd7NNN"gt,,2 	' 	'AuuX"333# ' 'AAfI~~!43E*E*E))TU,,*E $wXX&'' 	"
""r1C'C'C		RT'Ct8O ( 	 	AJ99Q<<\\\\
(<(<Q(?(?\\\ $wS 	 	AJ99Q<<\\\\
(<(<Q(?(?\\\ $w[[[[[t6[[[]abb$S$Hd**r1   c                   || j                             |          vs|| j         j        v s	|| j        vr|                     || d           d S |                     ||          \  }|f| j        |<   | j                            |g           }t          fd|D                       sZ|
                    ||t          | j        j        d          d           t          |          dk    r|                    d           | j                            t%          d| d| d	 d
d|g|| j        j        d                     |                     |d d| d           t)          |d          rG|j                            | j                                         d| d d| j        j        d           |k    r|j                                       d S d S )Nu   不在你身边,引不动。c              3  0   K   | ]}|d          k    V  dS )r:   Nr+   )r-   r  r  s     r/   r0   z'WorldEngine._do_lure.<locals>.<genexpr>  s,      3311W:&333333r1   r2   )r:   r  r  r  rJ   r   r_  u   压低声音凑近你:「u   ……我知道,就在u0   。只有你我知道,趁现在没旁人,去?」r  r  r  u   你把话头引向u   ,向uU   抛出了诱饵。动身去那儿候着——若他咬钩,到时只有你们两人。r   u   ,我用诱饵把u   往u   引。r  r  )r   r   rN  r   rq  r  r   r   r`  r  r   roundr   r  rO   r
  r   rI  r   r-  r  r   r  r|  r  r  )rQ   r3  r  r:   r  r  r  r  s          @r/   r  zWorldEngine._do_lure  s_   --e4444$*/8Q8QU[cgcmUmUmNN36 G G GHHHFoofe44t!$ef]%%fb11333333333 	IIt3U4:K_abEcEcddeee2ww{{q			  I  IT  I  IQV  I  I  I4:;Q\_a a a 	b 	b 	b 	s H H HF H H H 	I 	I 	I4"" 	FK4:#3#3#5#5 _ _v _ _RW _ _ _ $
 4   F F FE>>J!!%((((( >r1   c                   | j         j        }t          |dd          s|                     d           d S |                                 r|                     d           d S | j                            |          vs| j        j        v r|                      d           d S fd| j                            |          D             }g }|rt| j                            |          sZddl	m
}  || j        j                  }	g g }}
|D ]6}| j                                        |	k     r|
n|                    |           7|
}|                     d	           |                     |          \  }}| j                            |||
           | j         j        | _        | j                                       | j                                       | j                                      }|d |j        _        |D ]}| j        |         }t9          |t:                    rJ|j                            | j                                           d| d d d| j         j        d          nd  | j        !                    tE          dd d dd|g|d                     |D ]7}| j        !                    tE          dd d dd|g|d                     8| j        !                    tE          ddd|d                     | #                    d  d!| d"|rd#d$$                    |           d%nd&z   |           |                     d' d(|rd)d$$                    |           d*nd+z              tJ          &                    d,|tO          |                     | j(        )                    ||-           | *                                 d S ).Nr   Fu*   你下不去手——你不是那种人。u   你昨夜刚动过手,此刻再连环下杀手必引火烧身——十年布局靠的是隐忍。今夜先蛰伏,演回那个无害的局外人,等风头过了、夜再深些再图。u   不在这里,无从下手。c                     g | ]
}|fv|S r+   r+   )r-   rm   r3  r  s     r/   ro   z(WorldEngine._do_kill.<locals>.<listcomp>  s'    VVV1qf?U?UQ?U?U?Ur1   r   r  r  )rG  r  r  r  u   亲眼目睹u	   杀害了z!!r  r  r8  u   你亲眼目睹r  u   下了杀手!!r  r  u.   暴雨/浓雾里你只看见一个人影扑向u   ,等看清时u.   已经倒下——你没认出动手的是谁!r  r  uJ   远处传来一声凄厉的惨叫,随即归于死寂——有人出事了!r9  rI  r  u   ☠ u    在u   遇害u   ,被r  u   当场撞见!u   ,无人目击。u   你对u   下了手。u   但被u
   看见了!u   四下无人,没人看见。u"   ☠ %s 在 %s 杀了 %s(目击 %d))r  )+r   r-  r   rq  rk  r   r   rN  r  r  r  r"  r   r   r   r  rI  r  r  r   r   ro  r   rp  r   r   r  rg  rh  r   r   r  r|  rI  r   r+  rv  r4  r5  rO   r   on_killrq  )rQ   r3  r  r:   r  r  	witnessesmissedr  visr  r  rG  r  r  wms    `  `           r/   r  zWorldEngine._do_kill  s   j$t[%00 	NN3 LMMMF##%% 	NN3 !y z z zF--e4444$*/8Q8QNN36 G G GHHHFVVVVV
 4 4U ; ;VVV	  	TZ11%88 	::::::*TZ/00C6E I I(//++c11vEEaHHHHIFU333--fe<<
fS8TTT J0
F###Z^^F##>#BH 	a 	aAABGQRTVcGdGdoBI!1!1!3!3ggEggsgg]cggg"j2s  D D DjnHU<lc<l<lV\<l<l<l)2s#S[^` ` ` a a a a 	W 	WAHU ,h\b  ,h  ,hqw  ,h  ,h  ,h)2s#PTV V V W W W W 	Y's%-SdT T T 	U 	U 	U 	

3&33e333fo  8H7bejj>S>S7b7b7b7b  vH  I  KP  	Q  	Q  	Qs9V999kt  >Y=gejjQZF[F[=g=g=g=g  {Y  Z  	[  	[  	[;S%QTU^Q_Q_```VUX>>>r1   rr  r  c           
     <   |                     d          rfd| j        j                                        D             }|D ]	}d|_        
|rd                    d |D                       }d                    d |D                       }|                     |d| d	|z              | j                            t          d
| d| || j
        j        d                     d S |                     |d           d S |                     |d| d           d S )Nr  c                F    g | ]}|j         k    |j        |j        |S r+   r  )r-   r0  r:   s     r/   ro   z.WorldEngine._finish_action.<locals>.<listcomp>  s7    ooo1QW=M=MRSRZ=Mcdcn=MQ=M=M=Mr1   Fr  c              3  ,   K   | ]}d |j          dV  dS )u   『r  Nr   r-   r0  s     r/   r0   z-WorldEngine._finish_action.<locals>.<genexpr>  s0      "D"D#4#4#4#4"D"D"D"D"D"Dr1   ri   c              3  H   K   | ]}|j         	d |j         d|j          V  dS )u   
  · r7  N)r  rl   r  s     r/   r0   z-WorldEngine._finish_action.<locals>.<genexpr>  s@      %[%[aTUTZ%[&A&A&A&A&A%[%[%[%[%[%[r1   u   搜查有了发现:u*   就藏在这里!(现在可以 take 拿走)r  u   在这里翻出了r  r  u4   你仔细搜了一遍,没有发现特别的东西。r  r  )r   r   r   r   r  rv  rq  r   rI  r   r   r-  )	rQ   r3  rr  r  foundr  namesdetail_hintr:   s	           @r/   rx  zWorldEngine._finish_action  sk   N++ 	/oooo
 0 7 7 9 9oooE " "!		 \

"D"De"D"D"DDD gg%[%[5%[%[%[[[s$k%$k$k$kny$yzzz  X#?`?`Y^?`?`-2#TZE[fi"k "k "k l l l l l s$Z[[[[[NN3F.....r1   )\(?r@  c           	         t          d|| j        j        ||sdnd||rdnd          }| j                            |          }|                     d|            t          |          S )u   注入世界事件:全岛或指定地点。默认 0.88(>中断阈值 0.8)——造物主之声当即打断 agent 当前动作,
        逼他们立刻重新决策、对这桩怪事做出反应,而不是等下一次自然思考才慢悠悠注意到。r8  r9  r:   r7  ri   )r<  r=  r?  r@  r>  r:   rd  u   🌐 )r   r   r-  r   rI  r+  rO   )rQ   rx  r:   r@  r   gots         r/   inject_eventzWorldEngine.inject_event  s     	4tz7M#5+M88g'U'D'DSUW W W hq!!

>4>>"""3xxr1   r"  c           	         || j         _        | j                            t	          dd| dd| j        j        d                     d S )Nr8  u   天色骤变——u   压了下来。r9  r  r;  )r   r"  r   rI  r   r   r-  )rQ   r"  s     r/   set_weatherzWorldEngine.set_weather  sf    $
Y8eW8e8e8e%-TZ5KVY[ [ [ 	\ 	\ 	\ 	\ 	\r1   c                    || _         d S r   )r   )rQ   rx  s     r/   set_world_goalzWorldEngine.set_world_goal  s    r1   c           
         || j         vs|| j        j        v rdS | j                            t          dd| d|g| j        j        d                     dS )uF   对单个 agent 塞入"一念"(灵感/冲动),立即唤醒其思考。Fr8  u   一个念头突然击中你:r  r  r  T)r   r   rN  r   rI  r   r   r-  )rQ   r3  rx  s      r/   r  zWorldEngine.whisper  ss    dj  C4:?$:$:5Y8]W[8]8]%.C5
@V(,. . . 	/ 	/ 	/ tr1   c           	        | j                             |          }|i S g }t          |dd          }|Et          |j        d          r|j                            |          ng }d |dd         D             }||t          t          |dg           pg           t          |dd          pg t          |dd          pi |j                            | j	        j
                  d	S )
uL   透视下钻(G21):记忆流/反思/目标/关系,造物主与调试共用。Nr   allc                ^    g | ]*}t          |j        d           |j        j        |j        d+S )r2   )r  rk  rx  )r  
created_atrk  valuer=  )r-   ra  s     r/   ro   z,WorldEngine.agent_detail.<locals>.<listcomp>  sF     , , ,  a00!&,PQPYZZ , , ,r1   iinsightsr	  r   )rl   r  r  r	  r   r  )r   r   r   r  storer  r  r  r  r   r  )rQ   r3  r  memsr   recordss         r/   agent_detailzWorldEngine.agent_detail  s    z~~c""<Ix../6v|U/K/KSfl&&s+++QSG, ,$STT], , ,D z2!>!>!D"EE w55;$T;==C	**4:+?@@	B B 	Br1   c                    i } j         j                                        D ].\  }}|                    |g                               |           /g }t          |                                          D ]\  }d} j                            d                   }|&t          fd|j	        D                       dk    rd} fdD             }|dhk    rd	nd}|                    | d
d
                               | |             j         j         d j         j        sdnd }	 j         j        r"dd
                     j         j                   nd}
d
                    |          d|	 |
 z   S )u>   全岛此刻的一句话全景(供说书人开全知视角)。ri   r   Nc                    g | ]}|v |	S r+   r+   )r-   r  r  s     r/   ro   z(WorldEngine.panorama.<locals>.<listcomp>  s    (M(M(MqAHHHHHr1   rJ   u   (在交谈)c                    h | ]=}j         |         j        j        r"j         |         j        j        j        d k    rdnd>S )re     睡ri   )r   r  rg  rk  r~  s     r/   rb  z'WorldEngine.panorama.<locals>.<setcomp>  s\      E  E  E{|A!4!<uAATA\AaelAlAluusu  E  E  Er1   r  u   (睡着)r7  r  ;u	   停电中u   灯火尚明u   ;死者:rX  )r   r   r   r`  r   sortedr   r   rO   r<   rv  r"  r  rN  )rQ   by_placerm   r   r  markr  states
sleep_markenvrN  r  s   `          @r/   panoramazWorldEngine.panorama  s   )+J(..00 	1 	1DAq2&&--a0000X^^--.. 	D 	DFAsD#''A//DC(M(M(M(MDL(M(M(M$N$NRS$S$S$ E  E  E  E  AD  E  E  EF'-%'8'8bJKK1BBuzz#BBjBBCCCC#bb9L&`kkR`bb;?:?R7%**TZ_55777PRxx~~ 1c 14 1 111r1   c                r   | j         j        }d}t          | j                                                  D ]\  }\  }}| j                            |d          }|t          | j                  dz
  k    r(| j	        j
                            |          | j        k    sd}|j        j        v|t          | j                  k    r| j        |         \  }}}	|dz  }
|                    d          r|j        o|dk    rt          |dd	          n|}| j	        j
                            |          |k    s|j                            |          s|dz   | j        |<   &| j                            ||j        j        j        |
z   d
           |dz   | j        |<   c|j                            |	|
z   |           | j                            ||j        j        j        d
           |dz   | j        |<   |s| j         j        dk    r|                                  d S | j                            d|dz   d           d S )NTr   r2   FrK   to_z@roomr   r   rT  gGzT5@r  rW  rb   )r   r-  r.  r   r   r   r   rO   r   r   r   r   r  rg  rC  r   r  r   r,  ri  r  hour_prologue_finale)rQ   r  
all_seatedr0  r3  r  stagerk  r  r  staggerrl  s               r/   rM  zWorldEngine._prologue_tick&  s6   j$
'
(8(8(:(:;; 	1 	1NA{TO''Q//ES0014449M9Q9QRU9V9VZ^Zo9o9o"
z!-DN++++!^E2ND#s"fGu%% 
1zb#QX..wtVX'F'F'F^a:'++C00D88
@U@UVZ@[@[8+019DOC((J''TZ-?-E-OQWXXX+019DOC((
gs333
##C);)A6JJJ',qy$$ 	FE11!!#####Jb*EEEEEr1   c           
     ,   | j         j        }d| _        g dg dg dg}| j                            d          p|}|D ]5\  }}}| j                            t          d|d||z   |                     6|                     | j                            d	d
          d           t          | j
                  D ]C\  }}| j
        |         }	d|	j        _        | j                            ||dz   |dz  z   d           Dt                              d           dS )uB   21:00 放映事件:序幕落幕,心智接管,剧情正式开始。F)ul   放映室的灯自己熄了——没有人碰开关。角落里的老式放映机咔哒咔哒转动起来。r  r   )u   银幕上是十年前第七幕的未剪素材:风声里,阮青说『风太大了,我害怕』,紧接着是那句清清楚楚的『不用替身,再来一条』——然后,坠落。rI  rW  )uy   放映结束,银幕上打出一行手写字幕:『诸位老师,《雾鸦》杀青宴,现在开始。——长夜影业』rI  2   prologue_beatsr8  r9  r;  prologue_narru`   🎬 放映机自己转了起来——十年前的真相,和一句『杀青宴现在开始』。ri   Nr   r  r  u   🎬 序幕结束,心智接管)r   r-  rb   r   r   r   rI  r   r+  r.  r   r  rg  r   r,  r4  r  )
rQ   r  default_beatsbeatsr  saldtr0  rl   r  s
             r/   r  zWorldEngine._prologue_finaleC  s|   j$ F  F  Fq q q T  T  T	
 
/00AM  	B 	BKBRHUBh),rCA A A B B B B

4:>>/  4V  W  W  Y[  	\  	\  	\ ,, 	@ 	@GAt:d#D!%DJJcBhQ&6????455555r1   c                   t          | j                                        | j        j        | j        j        t          | j        j                            }g }| j        r|	                    d| j                    ddl
m}  || j        j                  }|r|	                    |           | j        -| j        d         dk    rdnd}|	                    d	|            t          | j        j        d
z            dz   }| j        dk     r1|	                    d| d| j         d| j         d| j         d	           | j        j        r|	                    d           ||rdd                    |          z   ndz   S )u<   动态公告 + 集会/渡船快讯(全员一致的共识)。u   【世界的走向】r   )social_rhythmNrF  rC  u,   正在门厅召集全员对质,快去门厅!u   门厅的对质投票正在进行——**轮到你就立刻用 accuse 当众表态**(arg=你最怀疑的人,或留空弃权但要明说);拖着不表态会被当成心虚,别只顾观察。u   【对质】r  r2   rL  u   【封岛第rc  u   天】渡船要熬到第uQ   天清晨才来。想提前逃生:去船屋、储藏室、温室找齐3桶灯油(u2   /3),上灯塔点火向海面求救,把船召来。u   【活命的线索】每具尸体旁都钉着一页剧本残页——七幕剧本就是杀人预告。去各幕取景地(码头/餐厅/琴房/教堂/发电机房/断崖/灯塔)搜集残页,能预判下一个死的人、地点与死法,提前设防。rf  ri   )r   r   r|  r   r"  r  r  rN  r   r   genesis.runtime.bulletinr  r  r   r7   r  r   r   rv  )rQ   rx  extrar  rhythmrF  r  s          r/   r  zWorldEngine._bulletinX  s   
 0 0 2 2DJ4F $
 3VDJO5L5LN N? 	DLLBBBCCC::::::tz// 	!LL   =$FJmT[F\`hFhFhBB@  LL///000$*&",--1!##LL T T Tdo T TW[Wf T TKOK_T T T U U U:? 	qLL p q q q%?tdii....R@@r1   srcdstc                   |                      |           | j        j        }| j                            t          d| d| d|||d                     | j                            t          d| d|||dd	                     d S )
Ntransitu   离开了这里,朝u   方向去了r  r  u   走了进来r  u   附近传来脚步声rc  )r  r   r-  r   rI  r   )rQ   r3  r  r  r  s        r/   rt  zWorldEngine._publish_transits  s    C   J"Y38d8dSV8d8d8d%(1tM M M 	N 	N 	NY38L8L8L%(1sTkm m m 	n 	n 	n 	n 	nr1   r=  c           
     v    | j                             t          d|d|g| j        j        d                     d S )Nr  r  r  r  )r   rI  r   r   r-  )rQ   r3  r=  s      r/   rq  zWorldEngine._feedback{  sT    Z	#&%tz/EPSU U U 	V 	V 	V 	V 	Vr1   r   r   c                    | j                             |          }|r|j        j        nd }||j        r"| j                            ||j                   d S d S r   )r   r   r  rg  ry  r   rp  r<  )rQ   r3  r   r  r  s        r/   r   zWorldEngine._interrupt  s\    z~~c""$(2dj  d;#+;J  ag..... ;r1   c                p    | j                             | j                                        ||d           dS )uK   主线时间轴(上帝视角):带地点供前端镜头跟随高光事件。)r  rx  r:   N)r   r   r   r|  )rQ   rx  r:   s      r/   r+  zWorldEngine._narr  s6    DJ$4$4$6$6uUUVVVVVr1   c                Z    || _         | j        s| j                            |           d S d S r   )r   r   r   set_rate)rQ   r\   s     r/   set_base_ratezWorldEngine.set_base_rate  s9    | 	&J%%%%%	& 	&r1   c                     j         j        }t           j                                                  D ]+}||j        z
  t          k    r                     |d           , fd j        	                                D             }t          |          ot          d |D                       } j        }|rt           j        t                    }n! j        rt           j        t                     }t#           j         j        |z
            dk    rP j                             |           | _        t*                              d||rdn|t           k    rdnd           d	S d	S )
u\   全员入睡 → 快进;**存在活跃会话** → 降速;会话散尽立即回常规(G3)。u%   话题冷了,人群不知不觉散开c                6    g | ]\  }}|j         j        v|S r+   r  )r-   rm   r  rQ   s      r/   ro   z2WorldEngine.maybe_fast_forward.<locals>.<listcomp>  s+    NNNtq!Qdjo5M5M5M5M5Mr1   c              3  \   K   | ]'}|j         j        d uo|j         j        j        dk    V  (d S )Nre  )r  rg  rk  r  s     r/   r0   z1WorldEngine.maybe_fast_forward.<locals>.<genexpr>  sU       +\ +\PQAGO4'KAGO,@G,K+\ +\ +\ +\ +\ +\r1   g{Gz?u   ⏱ 速率 → %.0f×(%s)u   夜间快进u   对话降速u   常规N)r   r-  r  r   r   rG   SESSION_IDLE_Sr  r   r   re   r  r   rN   NIGHT_FF_RATErL   DIALOGUE_RATEabsr\   r  r   r4  r  )rQ   r  r  r  all_sleepingr  s   `     r/   maybe_fast_forwardzWorldEngine.maybe_fast_forward  s   j$--//00 	V 	VDT[ >11&&t-TUUUNNNNtz//11NNNE{{ \s +\ +\UZ+\ +\ +\ (\ (\ 	877FF] 	877Ftz'((4//J''''DLKK3V*6sfXeNeNeNNksu u u u u 0/r1   c           	        ddl m}m}  || j        j        | j        | j        j                  }|| j        j        k    rM|| j        _        ||         \  }}| j        	                    t          d|d| j        j        |                     | j                            d| j        j        | j                            dd          z   d	           d
S )uW   天气状态机:换场即世界状态变化 + 全岛广播(雷暴首雷可惊醒人)。r   )ANNOUNCEnext_weatherr8  r9  r;  r!  i  i  r"  N)r  r  r  r   r"  r   r   r  r   rI  r   r-  r   r,  r  )rQ   r  r  newrx  r  s         r/   rE  zWorldEngine._run_weather  s    BBBBBBBBl4:-txII$*$$$!$DJ ID#HUD)-)?#O O O P P P
M4:+ADHDTDTUY[_D`D`+`bklllllr1   c           	        d| j         vr| j                             d           | j                            dd           d| j        _        | j                            t          ddd| j        j	        d	                     | 
                    d
d           | j                            d| j        j	        dz   d           d S d| j         vr| j                             d           | j                            dd           d| j        _        | j                            t          ddd| j        j	        d	                     | 
                    dd           d S d S )NblackoutswitchboardsmashedFr8  u1   灯光骤灭——整座鸦堡陷入一片漆黑!r9  r  r;  u0   💥 全岛骤然停电,黑暗中人声鼎沸。r?  r  g     @r   repairrepairedTuH   灯重新亮了——有人在发电机房接好了被砸毁的电闸。r  uQ   💡 电力恢复,电闸上的破坏痕迹清晰可见——有人蓄意砸的。)r   r  r   r;  r  r   rI  r   r   r-  r+  r   r,  rP   s    r/   rD  zWorldEngine._run_demo  sy   T_,,O
+++J##M9==="'DJHU<o)19OZ^` ` ` a a aJJI>ZZZJ
DJ,BZ,OQWXXXXXT_,,O)))J##M:>>>"&DJHU  =G)19OZ]_ _ _ ` ` `JJjlz{{{{{ -,r1   u   ☠💥📢⚖🔥🗼🚪💡tuple[str, list[dict]]c                    i  j         j                                        D ]<\  }}| j         j        vr)                    |g                               |           =sdg fS  j        rt          fd          g fS i  j        dd         D ]U	                    d          }|r<t          fd j        D                       r	                    |d          d	z   |<   Vi  j                                        D ]8}t          	                    |j        d          |j                  |j        <   9d fdt                    } j        }|r;|v r7	                    |d          dk    r |           |          dz   k     r|}| _        g }                                D ]\  }}||k    rd}	t#           j        dd                   D ]:	                    d          |k    r	                    d          r
d         }	 n;|	sVt%          |          dk    rdnd}
d                    |dd                   |
z   	                    |d          d	k    rdndz   }	|                    ||	dd         t%          |          d           |                    fd           ||dd         fS )u   选焦点场景(热度:在场人数+高光事件+活跃会话+凶手独处),带迟滞;
        返回 (focus_place, ambient[非焦点一行快讯])。序幕保持原『跟人群走』行为。ri   c                .    t          |                    S r   )rO   )r   occs    r/   rA   z-WorldEngine._director_focus.<locals>.<lambda>  s    #c!f++ r1   )keyiNr:   c              3  J   K   | ]}|                     d           pdv V  dS )rx  ri   Nr  )r-   cr   s     r/   r0   z.WorldEngine._director_focus.<locals>.<genexpr>  s7      PP!f 34PPPPPPr1   r   r2   r   r9   rH   rF   c                $                        | g           }t          t          |                    }|d                     | d          z  z  }                     | d          dk    r|dz  }j        |v rt          |          dk    r|dz  }|S )Nr  r   rJ   r  g      @)r   rF   rO   r   )r   pplr1  r  
recent_hotrQ   sess_roundss      r/   heatz)WorldEngine._director_focus.<locals>.heat  s    ''!R..Cc#hhAz~~a++++Aq!$$))S3&&3s88q==SHr1   r  irx  rL  u   …r  u   正低声交谈u   各自行事r  )r:   rx  r   c                (     | d                    S )Nr:   r+   )r  r   s    r/   rA   z-WorldEngine._director_focus.<locals>.<lambda>  s    DD7$4$4#4 r1   r4   )r   r9   rH   rF   )r   r   r   rN  r`  r   rb   rN   r   r   r  _HOT_SYMBOLSr   r   r:   rD   r   reversedrO   rv  sort)rQ   r3  r   r  scandcurr8  r  r  r  r   r   r  r  r  s   `          @@@@@r/   _director_focuszWorldEngine._director_focus  sY    %'j*0022 	2 	2FC$*/))q"%%,,S111 	r6M= 	;s 5 5 5 5666::%'
$ 	; 	;AwB ;cPPPPd>OPPPPP ;!+A!6!6!:
2&(%%'' 	N 	NA#&{qw'B'BAH#M#MK  	 	 	 	 	 	 	 	 	 3D!!! 	3#::*..q"9"9Q">">44::PTPTUXPYPY\_P_C_C_D iikk 	K 	KFAsDyyDdnSTT233  55>>Q&&155==&V9DE z #C1uu"zz#bqb'**T1+//Z[]^J_J_cdJdJd5F5FjxyNNQSbS	CIIJJJJ4444555WRaR[  r1   stepc                   g }| j         j        }|                                 \  }}| j                                        D ]|\  }| j        j        v r|j        j        }|j	        
                    | j         j                  }t          |dd          }	| j                                      d u}
|
s|t          |dd          z
  t          k    rd}	t          |dd          }|t          |dd          z
  t           k    rd}|                    i dd| j        j                            d	          d
t          |dd          r|dn
|r|j        ndd|r|j        ndd|r|j        dk    r|j        nd d|	d|dt          |dd          p
|r|j        nddddt          |dd          p
|r|j        ndd|d         dk    rdn|d         dk    rdnddt-          d |d!         z
  d"          d#fd$| j        j                                        D             d%d& t          |d%d           pg D             d'd( | j                            g           D             d)d* t          |d)d           pi                                 D             d+t3          t          |d+g           pg                      ~i d,| j                                         d-| j        j        d.dd/t-          | j         j                  d0| j        d1|d2|d3t3          | j        j                  d4t3          | j                  d5| j        j        d6d7 | j        j                                         D             d8| j!        d9t3          | j"                  d:| j#        r!t3          | j#        j$        d;d                    ng d<| j%        d=d> | j&                                        D             d?| j'        ||d@S )ANr  ri   r  r   r  r	  rl   r:   r  r  r
  Fr  waitaction_descr  rS  r_  r  r  r  r4  r  moodr  r  u   惊恐r  u   不安u   平静energyr  fatiguerJ   r  c                4    g | ]}|j         k    |j        S r+   r  )r-   r0  r3  s     r/   ro   z%WorldEngine.frame.<locals>.<listcomp>  s#    [[[18WZ??af???r1   r	  c                6    g | ]}d |d          d|d          S )[r  z] r  r+   )r-   r  s     r/   ro   z%WorldEngine.frame.<locals>.<listcomp>  s1    gggQ8ak88QvY88gggr1   plantedc                H    g | ]}|d           d|d          d|d          d S )r  u   诱使其前往r:   u   （r  u   ）r+   ra  s     r/   ro   z%WorldEngine.frame.<locals>.<listcomp>  sS     A A A !  !wTTqzTTaiTTT A A Ar1   r   c                @    i | ]\  }}||d           d|d         ddS )r   u   (信任r   z+.1fr  r+   )r-   kr%  s      r/   rt   z%WorldEngine.frame.<locals>.<dictcomp>  sP     \ \ \"&!Q  AlO!N!NAgJ!N!N!N!N \ \ \r1   r  r  r"  r   r\   r   r	  agentsrN  r   r  r  c                8    i | ]\  }}||t          |          S r+   )r  )r-   r   r   s      r/   rt   z%WorldEngine.frame.<locals>.<dictcomp>  s)    MMMda1Mq$q''MMMr1   r  r   novelir   r   c                |    g | ]9}|j         t          |j                  t          |j                  d d         d:S )r  N)r:   r<   rC   )r:   r  r<   rC   ra  s     r/   ro   z%WorldEngine.frame.<locals>.<listcomp>"  sU     : : : $%7tAIQUVWV]Q^Q^_a_b_bQcdd : : :r1   rb   )focus_placer8  )(r   r-  r  r   r   r   rN  r  rg  r  r  r  r   r   r   SPEECH_TTL_SGESTURE_TTL_Sr   r   rk  r  rl  r  r   r   r  r|  r"  r\   r   r   r  r  r   r   r   parasr   r   rb   )rQ   r	  r  r  r  r8  r  r  r  r_  
in_sessionr  r3  s               @r/   rX  zWorldEngine.frame  s(   j$#3355W))++ 	 	ICdjo%%*$C	""4:#788AT="55F)--c22$>J #ot(L(L"L|"["[dNB77GWT#3T:::]JJMM $dj&:&>&>sC&H&HgdJ&F&Fz3;''jm^y^a^f^fsy 36sxxB cJch&.@.@#((d	
 &
 #,W 74<<YSAXVX " 'h(C(C(`TWH_]_ AfIOOQvYQUEUEU[c %a	l 2A66 [[[[dj.>.E.E.G.G[[[ gg74QXZ^C_C_Ceceggg  A A%)]%6%6sB%?%?A A A  \ \+24d+K+K+Qr*X*X*Z*Z\ \ \  Dz2!>!>!D"EE!    $
!!##
%.
0B
DPRT
E$*/**
,5t|
 D
 #F
 D))	
 ,6tDM7J7J	

 
+
 MMdj.?.E.E.G.GMMM
 d&
 )4T$.5I5I
 MT$--cdd34442
 dk
  : :"&-"6"6"8"8: : :
 
 '
 
 
 	
r1   )rc   rd   r\   rF   r^   re   r_   r7   r`   r9   rb   re   rH   rf   )rH   rf   )r3  r9   r4  r9   rH   rf   )r:   r9   r3  r9   rH   r;   )r3  r9   r  r  rH   re   )r3  r9   r  r   rH   r   )r3  r9   rH   r9   )r3  r9   r  r  rH   rf   )rH   r  )rH   r9  )r  r9   r:   r9   rH   rC  rv   )r3  r9   rH   re   )rH   rt  )rH   re   )rH   r9   )r3  r9   r  r   r  r   rH   rf   )r3  r9   r  r   rH   rf   )r3  r9   r:   r9   r  r   rH   rf   )r3  r9   r  r9   r:   r9   rH   r6   )r  r  r3  r9   rH   r;   )r  r6   r  r9   rH   r9   )T)r3  r9   r  re   rH   rf   )r  r6   r  r9   rH   rf   )
r3  r9   r  r   r:   r9   r  r   rH   rf   )r  rF   rH   rf   )r3  r9   r:   r9   r  r9   rH   rf   )r3  r9   r:   r9   rH   rf   )r3  r9   r:   r9   r  r9   rH   rf   )r  r9   r]  r9   r^  rF   rH   rf   )r  r9   r]  r9   rH   rF   )rG  r  rH   rf   )rk  r9   rx  r9   rH   rf   )r  r9   r:   r9   rH   r  )
r3  r9   r  r   r:   r9   r  r9   rH   rf   )r3  r9   rr  r  r  r9   rH   rf   )ri   r  )rx  r9   r:   r9   r@  rF   rH   r7   )r"  r9   rH   rf   )rx  r9   rH   rf   )r3  r9   rx  r9   rH   re   )r3  r9   rH   r  )r3  r9   r  r9   r  r9   rH   rf   )r3  r9   r=  r9   rH   rf   )r3  r9   r   r   rH   rf   )rx  r9   r:   r9   rH   rf   )r\   rF   rH   rf   )rH   r  )r	  r7   rH   r  )MrS   rT   rU   r  r2  rP  rO  r  r~  rj  r  r(  staticmethodr   r   r  r   rI  rV  r  r   rZ  ru  rs  rk  r  r  r  rJ  r  r  r  r  r  r  r  r  r  r!  r  rL  r  rK  r  rb  r  ri  rX  rH  rq  r  r  r   r  r  r  rx  r  r  r  r  r  r  rM  r  r  rt  rq  r   r+  r  r  rE  rD  r  r  rX  r+   r1   r/   rZ   rZ   T   s       ?CT$)qvEA/ A/ A/ A/ A/ A/Hd d d d($7 $7 $7 $7LW^ W^ W^ W^r   $   W> W> W> W>rw w w w8# # # #4 	 	 	 \	 	 	 	 \	    FQq  ~[-9Z  gEBNn  {Y,8Z  gVAMeY Lr r r r+ + + +(	@ 	@ 	@ 	@ KJJL7  7  7  7  7 rV V V VN N N N
L L L L
+L +L +L +LZ  Op p p p>&< &< &< &<P(- (- (- (-Ta a a a$/F /F /F /Fb   2G G G G< < < <Q Q Q Q Q* * * *(dn dn dn dnL	f 	f 	f 	f4B 4B 4B 4BnG G G G<0 0 0 0 )# )# )# )#V# # # #= = = =A A A A< < < <! ! ! !HW W W W] ] ] ]8 8 8 8  @M F&+ &+ &+ &+P) ) ) ).1 1 1 1f/ / / /$    \ \ \ \
      B B B B"2 2 2 2&F F F F:6 6 6 6*A A A A6n n n nV V V V/ / / /W W W W W& & & &
u u u u(	m 	m 	m 	m| | | |& 4L1! 1! 1! 1!f1
 1
 1
 1
 1
 1
r1   rZ   )ErV   
__future__r   r  r   r/  r   r  r   dataclassesr   r   pathlibr   genesis.manifest.builderr	   genesis.memory.local_storer
   genesis.memory.streamr   genesis.obs.logging_setupr   genesis.runtime.actorr   genesis.runtime.attentionr   r  r   r   genesis.runtime.busr   r   genesis.runtime.cognitionr   r   r   r   genesis.runtime.schedulerr   genesis.runtime.simclockr   genesis.runtime.somar   genesis.runtime.stubr   genesis.runtime.worldstater   r   r4  r  r  r  r  r  r  r  r}  r  r   rx  r/  r   r   NIGHT_COURT_HrM   r  r  r6   rZ   r+   r1   r/   <module>r2     s  	 	 # " " " " "              ( ( ( ( ( ( ( (       1 1 1 1 1 1 7 7 7 7 7 7 . . . . . . 0 0 0 0 0 0 ' ' ' ' ' ' / / / / / / K K K K K K K K / / / / / / / / e e e e e e e e e e e e 2 2 2 2 2 2 - - - - - - % % % % % % ) ) ) ) ) ) = = = = = = = =	$	%	% 322AbAbAb222>e>e>e555AoAoAo222	
 
  	 DDuuY]/C/CDDDDD   G G G G G G G G S
 S
 S
 S
 S
 S
 S
 S
 S
 S
r1   