
    90jj                        d 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
  e
d          Ze G d d                      Ze G d	 d
                      Z G d d          ZddZddZddZddZdS )u  WorldState:客观世界状态——唯一真理(docs/agent-runtime-v2.md §6)。

- 地点拓扑/在场者/设施/物品/尸体/电力/天气,全部持久;
- 动作改变状态后,任何人此后的感知读到的都是同一份客观事实;
- describe(place) 生成"走进房间看到的样子"(状态快照),与事件流同源不矛盾。
键一律用地点/人物**中文名**(与 viz/positions 现约定一致)。
    )annotations)defaultdictdeque)	dataclassfield)
get_loggerzruntime.worldstatec                      e Zd ZU dZded<   ded<   ded<   ded<    ee          Zded	<   d
Zded<   dZ	ded<    ee          Z
ded<   ddZdS )Facilityu^   可被改变状态的设施(电闸/船/灯塔油罐…)。state 变化即世界真理变化。stridnameplacestate)default_factoryzdict[str, str]descTboolsalient hintdict[str, dict]verbsreturnc                b    | j                             | j        | j         d| j         d          S )N())r   getr   r   )selfs    5/root/genesis-world/src/genesis/runtime/worldstate.pylinezFacility.line"   s/    y}}TZDI)E)E
)E)E)EFFF    N)r   r   )__name__
__module____qualname____doc____annotations__r   dictr   r   r   r   r    r    r   r
   r
      s         hhGGGIIIJJJJJJ 5666D6666GDNNNN"U4888E8888G G G G G Gr    r
   c                  n    e Zd ZU dZded<   ded<   dZded<   dZded<   dZd	ed
<   dZd	ed<   dZ	ded<   dS )ItemuB   可拾取/移动/销毁的物品(剧本残页/账本/灯油…)。r   r   r   r   r   holderFr   	destroyedhiddenr   N)
r!   r"   r#   r$   r%   r   r*   r+   r,   r   r'   r    r   r)   r)   &   su         LLGGGIIIEOOOOFIFDNNNNNNr    r)   c                      e Zd Zd-dZd.d	Zd/dZ e            fd0dZd1dZd2dZ	d3dZ
d4dZd5dZd6d!Zd7d"Zd8d9d)Zd:d;d+Zd,S )<
WorldStateplacesr   r   Nonec                    || _         d |                                D             | _        i | _        i | _        i | _        t          t                    | _        i | _        i | _	        d| _
        d| _        dS )uC   places: 中文名 -> {description, geography, adjacent:[中文名]}c                @    i | ]\  }}|t          |d                    S )adjacent)list).0nps      r   
<dictcomp>z'WorldState.__init__.<locals>.<dictcomp>7   s*    .a.a.a$!Qq$q}2E2E.a.a.ar    u   暴雨TN)r/   itemsr3   	positions
facilitiesr   r4   bodiesdead
death_infoweatherpower_on)r   r/   s     r   __init__zWorldState.__init__4   so    .a.aRXR^R^R`R`.a.a.a)+/1&(
,7,=,=$&	+-r    r   r   	list[str]c                h    t          fd| j                                        D                       S )Nc              3  .   K   | ]\  }}|k    |V  d S Nr'   )r5   ar7   r   s      r   	<genexpr>z'WorldState.occupants.<locals>.<genexpr>C   s+      IIDAqa5jjajjjjIIr    )sortedr:   r9   r   r   s    `r   	occupantszWorldState.occupantsB   s4    IIIIDN$8$8$:$:IIIIIIr    r   c                f    | j                             |i                               d          dk    S )N	geographyindoor)r/   r   rI   s     r   	is_indoorzWorldState.is_indoorE   s+    {ub))--k::hFFr    srcdstc                   ||k    rg S ||v rg S |di}t          |g          }|r|                                }| j                            |g           D ]}||v r||vr|||<   ||k    rf|g}||d                  |k    r3|                    ||d                             ||d                  |k    3t          t          |                    c S |                    |           |g S )u   BFS 最短路(返回不含起点的逐跳地点序列;不可达返回 [])。blocked 中的地点绕开(如密道仅凶手可走)。r   )r   popleftr3   r   appendr4   reversed)	r   rO   rP   blockedprevqcurnxthopss	            r   pathzWorldState.pathH   s   #::I'>>I #Ry3%LL 	"))++C}((b11 
" 
"'>>d?? #DIczz #u"48n33 KKT"X777 #48n33#HTNN33333HHSMMM  	" 	r    rF   bc                    || j                             |g           vr | j         |                             |           || j                             |g           vr"| j         |                             |           dS dS )uQ   运行时打通两地(如撬开/解锁青之房后,二层走廊 ⇄ 青之房)。N)r3   
setdefaultrT   )r   rF   r]   s      r   connectzWorldState.connect_   s    DM,,Q3333M!##A&&&DM,,Q3333M!##A&&&&& 43r    aidtoc                    | j                             |          }|| j                            |g           vrt                              d|||           dS || j         |<   dS )u?   逐跳移动一步(必须相邻);成功与否即客观结果。u,   %s 试图从 %s 跳到不相邻的 %s,拒绝FT)r:   r   r3   loggerwarning)r   ra   rb   rY   s       r   movezWorldState.movef   se    n  %%T]&&sB////NNI3PSUWXXX5 str    fr
   c                $    || j         |j        <   d S rE   )r;   r   )r   rg   s     r   add_facilityzWorldState.add_facilityp   s     !r    fidr   c                p    | j         |         }||_        t                              d|j        |           |S )Nu   设施[%s]状态 → %s)r;   r   rd   infor   )r   rj   r   rg   s       r   set_facilityzWorldState.set_facilitys   s3    OC -qvu===r    itr)   c                $    || j         |j        <   d S rE   )r9   r   )r   rn   s     r   add_itemzWorldState.add_itemy   s    
25r    iidbyItem | Nonec                    | j                             |          }|rB|j        s;|j        r4| j                            |          |j        k    rd|c|_        |_        |S d S )Nr   )r9   r   r+   r   r:   r*   )r   rq   rr   rn   s       r   	take_itemzWorldState.take_item|   se    Z^^C   	bl 	rx 	DN4F4Fr4J4Jbh4V4V"$bBHbiItr    c                h    | j                             |          }|rd\  |_        |_        |_        |S )N)r   r   T)r9   r   r   r*   r+   )r   rq   rn   s      r   destroy_itemzWorldState.destroy_item   s4    Z^^C   	=0<-BHbi	r    r   Fvictimmethodkillerscriptedc                    || j         |<   | j        |                             |           | j                            |d            ||||d| j        |<   d S )N)r   rz   ry   r{   )r=   r<   rT   r:   popr>   )r   rx   r   ry   rz   r{   s         r   killzWorldState.kill   s`    !	&E!!&)))64(((,1Vvck"l"lr    viewerc                   g }fd|                      |          D             }|r+|                    dd                    |          z              | j                            |g           D ]}|                    d| d           | j                                        D ]}|j        |k    rx|j        rq|j	        p7|j
        r/dd                    |j
                                                  z   nd}|                    |                                |rd	| d
ndz              | j                                        D ]L}|j        |k    r?|j        s8|j        s1|                    d|j         |j	        r
d|j	         ndz              M| j        s*|                     |          r|                    d           |S )Nc                     g | ]
}|k    |S r'   r'   )r5   rF   r   s     r   
<listcomp>z'WorldState.describe.<locals>.<listcomp>   s    BBBa6kk!kkkr    u   在场:u   、u   ⚠️ u,    的尸体倒在这里,已经没了气息。u   可/r   u   （u   ）u
   这里有:u   ——uC   四下漆黑——电还没恢复,只能靠烛火和手电照明。)rJ   rT   joinr<   r   r;   valuesr   r   r   r   keysr   r9   r,   r+   r   r@   rN   )	r   r   r   linesothersbodyrg   hrn   s	     `      r   describezWorldState.describe   s   BBBBT^^E22BBB 	9LLUZZ%7%77888KOOE2.. 	W 	WDLLU4UUUVVVV'')) 	E 	EAw%AIFUQWT(@(@ @ @RTQVVXX)BqCDDD*##%% 	_ 	_Bx5   2< 3"'33RW7\7I7I7I7IZ\]^^^} 	`!6!6 	`LL^___r    N)r/   r   r   r0   )r   r   r   rB   )r   r   r   r   )rO   r   rP   r   r   rB   )rF   r   r]   r   r   r0   )ra   r   rb   r   r   r   )rg   r
   r   r0   )rj   r   r   r   r   r
   )rn   r)   r   r0   )rq   r   rr   r   r   rs   )rq   r   r   rs   )r   r   F)rx   r   r   r   ry   r   rz   r   r{   r   r   r0   )r   )r   r   r   r   r   rB   )r!   r"   r#   rA   rJ   rN   	frozensetr\   r`   rf   ri   rm   rp   ru   rw   r~   r   r'   r    r   r.   r.   3   s?          J J J JG G G G 09y{{     .' ' ' '   " " " "            m m m m m      r    r.   ws'WorldState'datar&   r   r0   c                    |                     dg           D ]!}|                     t          di |           "|                     dg           D ]!}|                     t	          di |           "dS )u   从数据装填初始设施+物品(道具层解耦):任何世界只需提供 items.json,引擎零改动。
    JSON 键与 Facility/Item 字段一一对应(由 dump_seed 产出,保证忠实往返)。r;   r9   Nr'   )r   ri   r
   rp   r)   )r   r   rg   rn   s       r   seed_from_datar      s     XXlB'' ' '
1&&&&hhw##    
DJJ2JJ   r    c                    ddl m fd| j                                        D             fd| j                                        D             dS )um   把当前世界的设施+物品序列化为 items.json 结构(用于把代码 seed 迁成数据,或存档)。r   )asdictc                &    g | ]} |          S r'   r'   )r5   rg   r   s     r   r   zdump_seed.<locals>.<listcomp>   s!    EEE66!99EEEr    c                &    g | ]} |          S r'   r'   )r5   rn   r   s     r   r   zdump_seed.<locals>.<listcomp>   s!    ===RffRjj===r    )r;   r9   )dataclassesr   r;   r   r9   )r   r   s    @r   	dump_seedr      sl    """"""EEEEbm.B.B.D.DEEE====28??+<+<===? ? ?r    c                   ddl }ddlm}  ||           dz  }|                                r9t	          ||                    |                    d                               dS  ||           j        dk    rt          |           dS dS )uu   按世界目录装填道具层:有 items.json 走数据(解耦);否则回退到内置 seed_ravenisle(向前兼容)。r   N)Pathz
items.jsonzutf-8)encoding	ravenisle)	jsonpathlibr   existsr   loads	read_textr   seed_ravenisle)	world_dirr   r   r   r7   s        r   
seed_worldr      s    KKKY,&Axxzz r4::akk7k&C&CDDEEEtI{**r +*r    c                >   t           }|                      |ddddddddd	
                     |                      |ddddddid
                     |                      |ddddddid
                     |                      |ddddddddd
                     |                      |d d!d"d#d#d$id%
                     |                      |d&d'd(d)i d* t          d+          D             d,
                     |                      |d-d.d/d0d1d2d3d4
                     t          g d5d6          D ]6\  }\  }}|                     t          d7| d8| d9|d:d;<                     7|                     t          d=d>d?d:d@<                     |                     t          dAdBdCd:dD<                     |                     t          dEdFdGd:dH<                     |                     t          dIdJdKd:dL<                     |                     t          dMdNdOd:dP<                     |                     t          dQdRd?d:dS<                     t          g dTd6          D ]/\  }}|                     t          dU| dV|d:dW<                     0|                     t          dXdYd:dZ<                     |                     t          d[d\d]d:d^<                     |                     t          d_d`dad:db<                     t           }|                      |dcdddedfdfdgidhdidjdkdldmin                     |                      |dodpd]dqdrdsdtdudvdwdxdydzd[d{in                     |                      |d|d}d~dddiddd dxddmin                     |                      |ddddddiddd dxddmin                     |                      |dddad0dddddddxdydd_d{in                     |                      |ddddddiddd dxddmin                     ddxdd}|                     t          ddd:d<                     |                      |ddddfdfdidddi|in                     |                      |ddddfdfdidddi|in                     |                      |ddddfdfdidddi|in                     |                      |ddddfdfdidddi|in                     |                      |ddddfdfdidddi|in                     |                      |ddddfdfdidddi|in                     |                      |ddddfdfdiddddxdddƜin                     |                      |ddddfdfdidddxdydmddxddϜdМn                     |                      |ddddfdfdiddddkddmin                     |                      |ddddfdfdiddxddϜddxddϜdߜn                     |                      |ddddfdfdidddxdydmddxddϜdn                     |                      |ddddfdfdidddxddϜin                     |                      |ddddfdfdidddxddϜin                     |                      |ddddfdfdiddxddϜddxddϜdn                     |                      |ddddfdfdidddxddϜin                     |                      |ddd dfdfdidddxddϜin                     |                      |ddddfdfdidddxddϜin                     |                      |dd	d
dfdfdidddxddϜin                     d S (  Nswitchboardu	   总电闸   发电机房intactuR   整面墙的闸刀锈迹斑斑,唯独总电闸的手柄被人擦得干干净净。uO   总电闸被人砸毁了,闸刀歪斜、电线裸露——全岛因此断电。uS   总电闸缠着应急胶布勉强复位,电力恢复了,但看得出被人砸过。)r   smashedrepairedu   全岛供电的总开关:用『砸电闸』会让整座堡瞬间漆黑(黑暗里最易出事、也是制造混乱的手段);停电后用『修电闸』复电)r   boatu   码头缆桩   码头cutuS   系船桩上只剩半截缆绳,断口平整——是刀割的,船早被放走了。uu   船缆已被人割断、船被放走——这条路逃不了,只能另想办法(灯塔求救)或熬到第七天渡船skiffu   备用小艇   船屋holedu@   备用小艇翻扣在架上,船底被凿出三个整齐的洞。ug   唯一的备用小艇被凿穿、开不走——水路逃生无望,有人蓄意断了所有人的退路
light_tanku   灯塔储油罐   灯塔emptyuS   灯室完好,储油罐却被提前搬空——想点灯求救,得先找到灯油。u:   储油罐重新注了油,只差有人上去点亮塔灯。uR   塔灯已被点亮!雪亮的光柱扫过海面——大陆方向应该能看见。)r   fueledlitu   全岛唯一的求救手段:把灯油(船屋/储藏室/温室能搜到)搬来用『加油』灌满,再用『点亮』点灯,对岸就能看见来救——但灯一亮渡船提前到
knife_racku   厨房刀架u   厨房one_missingu<   刀架按尺寸排得一丝不苟——有一格是空的。uF   少了一把刀——凶器可能就出自这里,留意谁身上有刀
film_boxesu   七个胶片盒   餐厅act0c                *    i | ]}d | |rd| dndS )actu7   长桌中央一字排开七个铁皮胶片盒——前 u/    个已被打开,里面的胶片烧成了灰。uk   长桌中央一字排开七个铁皮胶片盒,标签从『第一幕』写到『第七幕』,都还封着。r'   )r5   is     r   r8   z"seed_ravenisle.<locals>.<dictcomp>   sl     Y Y Y KL 99  HI E  DQR  D  D  D  D EY Y Yr       uv   像一座倒计时:每死一个人,就有一盒『第N幕』自动烧成灰——烧到第七幕,意味着大限将至master_dooru   青之房的门u   二层走廊lockeduF   走廊正中那扇双开门紧锁着,门缝透出极淡的栀子香。uN   青之房的门敞开着——十年未动的房间暴露在所有人面前。)r   openu   锁了十年的青之房(阮青旧居,里面藏着她最后的日记):有黄铜钥匙就用『钥匙开青之房』无声打开;没钥匙也能『撬开青之房』,但动静极大、全堡可闻))p1r   )p2r   )p3u   琴房)p4   荒废教堂)p5r   )p6u   断崖)p7r      script_u   《雾鸦》剧本残页·第u   幕Tu   拼齐各幕残页就能看出凶手在按《雾鸦》逐幕『补拍』杀人,预判下一个死者、地点与死法,提前设防)r,   r   ledgeru   封口账本与七份协议u   书房u   邵铭轩的封口账本——记着每个人收的脏钱,见光七人皆完(邵最先完);邵想烧掉它,别人拿到则是要挟与指证的铁证	negativesu   《雾鸦》负片母带u   暗房uv   当年实拍的负片母带——顾长风想找到并烧进门厅壁炉销毁;它能证明那晚究竟发生了什么	callsheetu   当晚的通告单与酒水单u	   道具间up   白纸黑字记着程亦深当晚喝醉走错位——程想撕掉;别人拿到能戳穿他甩锅给死者的谎diaryu   阮青的日记u	   青之房u   阮青最后的日记——记着唐曼逼她『这一跳你就红了』的原话;唐曼想销毁,别人拿到是指证唐曼的铁证
med_recordu   真实急救记录原件u   冰窖u   白聿当年签过假医疗记录,这份真原件能揭穿被掩盖的真实死因;白聿想销毁或公开,自己也没拿定主意draftu   带真名批注的报道原稿us   温言当年收钱写黑稿的原稿、带她真名批注——温言想抢先抽走销毁,别人拿到能揭穿她)r   	   储藏室   温室fuel_u   一桶灯油u   搬去灯塔倒进储油罐(用『加油』),集齐三桶就能『点亮』塔灯向大陆求救——这是今夜唯一靠谱的逃生指望;但灯一亮渡船会提前出发
master_keyu   青之房的黄铜钥匙ub   开二层走廊那扇锁了十年的青之房双开门(到二层走廊用『钥匙开青之房』)	shoot_logu2   当年的拍摄日志(记录第七幕实拍决定)r   ua   记录第七幕实拍那晚的决定——能印证『不用替身,再来一条』是谁拍的板burnt_photou   烧剩一半的剧组合影u   阁楼u?   烧剩一半的旧合影——当年剧组人事关系的线索bellu   教堂吊钟r   idleu:   锈死多年的吊钟悬在钟楼里,钟绳垂到地面。u   敲钟uI   你拽下钟绳——沉闷的钟声滚过整座岛,惊起一片鸦群。ux   教堂的钟被人敲响了!沉闷的声音滚过全岛——岛上的老传说:鸦堡死人的夜里,钟会自己响。globalg333333?)feedbackeventscopesalience)r   soilu   温室土畦freshu@   几畦泥土新翻不久,一把雪亮的园艺剪插在土里。u7   土畦被彻底挖开,坑底的油布已经掀开了。)r   dugu   挖掘uh   你用园艺剪撬开湿土——油布下面埋着当年的摄影器材箱,里面有一本拍摄日志!u$   有人在温室挖开了那畦新土r   g      ?r   )r   r   r   r   	set_statereveal_item
gravestoneu   阮青的墓碑u   后山墓园cleanuC   唯独这块青石碑干净得反常,碑前一束白菊还没蔫。   查看u   碑文:『阮青之墓 1994-2016』。落款没有名字,只刻着半句词:『戏未杀青,人不散场』。碑前的白菊,断口很新——是登岛那天剪的。g333333?
keeper_logu   灯塔看守人日志dustyu3   值班台上压着一本受潮的看守人日志。u   日志最后一页(三年前):『又一艘私人快艇夜里靠岸,没report。船上的人上了岛,天亮才走。』之后的页码被整齐地撕掉了。camphor_chestu	   樟木箱u-   角落的樟木箱上着一把新换的锁。u+   樟木箱被撬开了,箱盖歪在一边。)r   priedu   撬开ud   锁被你撬断——箱里是叠得整齐的旧戏服,最底下压着半张烧剩的剧组合影。u!   阁楼里传来撬锁的金属声r   bar_glassesu   酒柜与七只酒杯u	   大客厅poureduP   酒柜里水晶瓶一尘不染——酒是新斟的,七只杯子,不多不少。u   检查u   你逐只端详:杯沿干净,酒色清亮——但谁有胆子喝第一口?杯底压着的杯垫,是当年杀青宴定制的那批。u.   隔壁有人在翻找东西,窸窸窣窣的。g?)r   r   r   	kill_planu   七幕『补拍』排期表u   谁、在哪取景地、第几幕动手,墨迹是新的——这是直指凶手按《雾鸦》补拍的铁证,写《雾鸦》又来补第七幕的只有江离gu_roomu   顾长风床头的分镜本u   顾长风的房间uR   床头摊开一本翻烂的分镜本,压着一沓『十周年纪录片企划』。   搜r   u   企划扉页写满『翻身之作』四个字;夹着一张当年的报道剪影,被反复摩挲——他至死不肯认那句『不用替身,再来一条』是自己喊的。	shao_roomu   邵铭轩的对账手机u   邵铭轩的房间u=   行李箱半开,一台还亮着屏的手机搁在西装上。u   锁屏跳着银行到账提醒;一张便签写着一串数字的前两位——像是某个保险柜的密码。那本封口账本就锁在书房。
cheng_roomu   程亦深枕下的镇定药u   程亦深的房间u7   床头滚着两只空酒瓶,枕头下露出半板药。u   镇定剂吃了大半,他怕得睡不着;垃圾桶里揉着撕碎的通告单复印件——记着他那晚醉态的正本,还在道具间的场记箱里。	tang_roomu   唐曼梳妆台的抽屉u   唐曼的房间uC   梳妆台上摊着给新人的合约,最下一格抽屉没关严。u   抽屉夹层里是一套小巧的撬锁工具和一张青之房的平面图——她铁了心要进那间上锁的房,拿回阮青那本日记。bai_roomu   白聿的医药箱u   白聿的房间u1   床头一只医药箱,针剂排得一丝不苟。u   镇静剂用了大半;一叠急救记录草稿被反复涂改撕扯——他签过一份假的,真正那份原件,藏在了冰窖的旧医疗箱里。wen_roomu   温言的录音笔u   温言的房间uO   桌上一支录音笔还亮着红灯,旁边摊着写满问号的采访提纲。u   提纲上列着在场每个人的旧账;她为这条十年独家什么险地都敢闯——也最怕自己那篇署了真名的黑稿原稿被人先一步抽走(在书房剪报册里)。
jiang_roomu   江离的采风笔记本u   江离的房间uF   屋里干净得不像住过人,只有一本摊开的采风笔记本。u   你翻到笔记本的夹层——一张折叠的纸滑出来:七幕『补拍』排期表,谁、在哪取景地、第几幕动手,墨迹是新的!写《雾鸦》、又被请来『补完第七幕』的,只有他一个人。u!   江离房里有人在翻东西。g?)r   r   r   r   r   hall_projectoru   门厅的旧放映机u   门厅uJ   门厅角落那台老放映机,胶片还挂在齿轮上,镜头对着墙。u   你按下开关——墙上又映出那行手写字幕:『诸位老师,《雾鸦》杀青宴,现在开始。——长夜影业』。机器被人改装成会自己启动:这场局,早布好了。uC   门厅的放映机又自己转了起来,惨白的光打在墙上。ue   放映机被人动过手脚,接了个定时启动的机关——不是闹鬼,是有人精心安排。gffffff?)r   r   r   )   重放r   screening_reelu   放映室的未剪拷贝u	   放映室u[   拷贝架上,『第七幕·未剪』那盘带子被人抽出来,搁在最显眼的地方。r   u   你穿上带子重放:收音轨里清清楚楚——狂风、阮青带哭腔的『风太大了,我害怕』,和一个男人冷冷的『不用替身,再来一条』。那是顾长风的声音。uT   放映室传出十年前的收音:风声,和一句『不用替身,再来一条』。g333333?cellar_racku   酒窖最里排的酒架u   酒窖u=   最里排的酒架透着穿堂风,像是和墙之间有缝。un   酒架后面是一道砖砌的暗墙,缝里漏出海腥味的穿堂风——这堡里的暗道,不止一条。uS   你费力挪开酒架,砖墙后果然是黑黢黢的夹道,通向地下更深处。)r   u   搬storeroom_shelfu   储藏室角落的旧木架r   uh   靠墙一排旧木架,落了厚灰——唯独最里那座,地上的灰被蹭出几道新鲜的拖痕。u   你推了推最里那座木架——它竟能整个挪开!后面是个仅容一人的黑窟窿,一股海腥味的穿堂风扑面而来。这是条暗道。架子边沿有新鲜的手印和来回的鞋印:有人一直在用它神不知鬼不觉地来去。u*   储藏室里传来挪动木架的刺啦声u   木架后藏着一条暗道,边上鞋印来回好几趟——谁知道这条道,谁就能在城堡和海边之间凭空消失再出现。)r   r   passage_tunnelu   储藏室通船屋的密道u   密道u[   这条砖砌窄道从储藏室木架后一直通到海边船屋,壁上留着新鲜鞋印。u   鞋印来回好几趟,鞋码不小、沾着海沙——谁知道这条道,就能在城堡和海边之间神不知鬼不觉地来去,做出一副不在场的样子。corridor3_photosu   三层走廊的剧照墙u   三层走廊u:   走廊墙上挂着一排《雾鸦》剧照,落满了灰。u   其中一张:阮青和一个低头记笔记的年轻男人并肩站着,身体挨得很近——那是当年的编剧江离。两人的距离,不像同事。balcony_scopeu   露台的黄铜望远镜u   露台uO   露台栏杆上锈着一架黄铜望远镜,正对着海面和远处的灯塔。u   你举镜望出去:海面死黑,没有一点船灯;灯塔也黑着。想让对岸看见这座岛,得先有人爬上灯塔把那盏灯点亮。u^   镜里只有翻涌的黑浪和熄着的灯塔——求救的唯一指望,是点亮那座塔。)r   u   瞭望forecourt_tracksu   前院泥地的拖痕u   前院u@   前院的泥地上有几道拖拽的痕迹,雨还没冲干净。uv   拖痕从大门一路拖向码头方向,半截湿透的鞋套陷在泥里——有人往海边运过沉重的东西。beach_flotsamu   沙滩退潮线的杂物u   沙滩u:   退潮线上堆着海浪卷上来的杂物,湿漉漉的。u   你翻拣杂物:一截被刀割断的船缆、一只进了水的手电——还有件硬物半埋在沙里,像是有人匆匆丢弃的东西。这片海,藏得住秘密。garden_benchu   花园深处的石凳u   花园u4   花园最深处一张石凳,凳面像是刻过字。u   凳面刻着一个字:『青』。凳边湿土里插着一束还没蔫的白菊——和后山墓园碑前那束,是同一天剪的。有人记着她。
woods_signu   断崖小径口的警示牌u	   风暴林u@   风暴林尽头通向断崖的小径口,新立着一块木牌。u   木牌写着『崖边湿滑·小心脚下』,油漆还没干透——封岛的暴雨夜,谁会专程来这僻静地方,新刷这么一块牌子?像是为了让什么'失足意外'显得更真。gzG?)r
   ri   range	enumeraterp   r)   )r   Fr   pidr   F2
SEARCH_EVTs          r   r   r      sO   AOOAAm[.(fdiMk Mk m	n n n o o o
 OOAAfnhd@f EF F F G G G OOAAg~xSCUvx x x y y y OOAAl$5xfNcKe Ke E	F F F G G G
 OOAAlNHmUNWUW W W X X X OOAAl$5x JZY Y PU  VW  PX  PXY Y YJZ FG G G H H H OOAAm%6Z`Sb Sb ST T T U U U
 % &b &b &bcdf f f f<C
D3*P!*P*P*PRW`d de e e 	f 	f 	f 	fKKX<ht rs s s t t tKK["<ht ST T T U U UKK["BKX\ MN N N O O OKKW/T cd d d e e eKK\#=xPT ab b b c c cKKW>QU PQ Q Q R R R???CC R R5
DneD PQ Q Q 	R 	R 	R 	RKK\#=d~@ @ @ A A A KK["VX`im}   @ @ @KK]$A8TX[] ] ] ^ ^ ^	BOOBBv~~v	MN&q ![ (d< < => > > ? ? ?
 OOBBv~xTI	K 	K  'Q FQXfi$)+G G HI I I J J J OOBB|%6	WX 'A $wCI I JK K K L L L
 OOBB|%<h	GH 't $wCI I JK K K L L L
 OOBBXxBMz{{  'M Cgcf$+MK K LM M M N N N
 OOBB}&={H	ef '_ $wCI I JK K K L L L LV]knooJKK["? {| | | } } }OOBBy"?AUW]	efz  $T  c  Xb  c  de e e f f f OOBB{$>@TV\	PQz  $z  I  ~H  I  JK K K L L L OOBB|%BDXZ`	JKz  $B  Q  FP  Q  RS S S T T T OOBB{$>@QSY	VWz  $w  F  {E  F  GH H H I I I OOBBz#79JF	DEz  $|  K  @J  K  LM M M N N N OOBBz#79JF	bcz  $`  o  dn  o  pq q q r r r OOBB|%?ARTZ	YZ  $CBWbf  xCD D EF F F G G G
 OOBB')@(F	]^ 'k epw  FIJ J 'N  Y`  nr  s  st tu u u v v v
 OOBB')C[RX	no  'j v  BJ  X[\ \ ]^ ^ ^ _ _ _ OOBB}&@(F	PQ 'W  bi  wz  {  {#x  DK  Y]  ^  ^_ _` ` ` a a a OOBB(*GV\	{|'[ LW^loq q $o&D: :; ;< < < = = = OOBB')FRX	no  'N  Y`  nq  r  r  st t t u u u OOBB)+E~W]	MN  'E  PW  ei  j  j  kl l l m m m OOBB(BHf	bc 'w  BI  W[  \  \ 'G  RY  gk  l  lm mn n n o o o
 OOBB)+BHf	ST  '_  jq  B  C  C  DE E E F F F OOBB(BHf	MN  $Q  \c  qt  u  u  vw w w x x x OOBB~'>&	GH  'A  LS  ae  f  f  gh h h i i i OOBB|%BKQW	ST  'k  v}  KO  P  P  QR R R S S S S Sr    N)r   r   r   r&   r   r0   )r   r   r   r&   )r   r   r   r0   )r   r.   r   r0   )r$   
__future__r   collectionsr   r   r   r   r   genesis.obs.logging_setupr   rd   r
   r)   r.   r   r   r   r   r'   r    r   <module>r
     s|    # " " " " " * * * * * * * * ( ( ( ( ( ( ( ( 0 0 0 0 0 0	(	)	) G G G G G G G G$ 	 	 	 	 	 	 	 	n n n n n n n nf       ? ? ? ?	 	 	 	_S _S _S _S _S _Sr    