
    /2j0                        d 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 h dZddZe G d d                      ZddZddZdS )uw  信息差过滤器:view(state, seat, roles) → PlayerView。

这一座位**合法能知道的一切**,通用地由 role.knows 决定 —— 不写 "if 预言家"。
铁律:他人身份、死因(刀/毒/枪/放逐)、私密夜间行为,绝不出现在他人视野里。
PlayerView 是喂给 AI 脑(及真人 UI)的唯一信息源 —— 信息差在这里一次性兜住。
    )annotations)	dataclassfield)Optional)Role)	GameState>   endshotexilejudgespeechsheriffannouncesheriff_speechedictteamstrreturnboolc                t    |                      dd          }|dk    r| d         t          v S |dk    r|dk    S dS )uk   频道可见性:public 看类型白名单;wolf 频道仅狼可见;其余一律不可见(私聊不外泄)。channelpublictypewolfF)getPUBLIC_EVENT_TYPES)r   r   chs      6/root/genesis-world/src/genesis/werewolf/perception.py_event_visibler       sF    	
y(	#	#B	X~~y...	V||v~5    c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   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Z	ded<   dZ
ded<   dS )
PlayerViewintseatr   role_id	role_namer   dayphasez	list[int]alivez
list[dict]deadzOptional[int]r   
transcript	votes_logNzOptional[list[int]]	teammateszOptional[list[dict]]check_resultsknife_targetzOptional[dict]potionsguard_targetFr   is_ghost	all_roles)__name__
__module____qualname____annotations__r.   r/   r0   r1   r2   r3   r4    r!   r   r#   r#      s          IIILLLNNNIIIHHHJJJ%)I))))*.M...."&L&&&&"G"""""&L&&&&H $I$$$$$$r!   r#   stater   r%   r$   roler   rolesdict[str, Role]c                B    t          ||j        |j        |j         j         j                                         d  j        D              j        t           j
                  t           j                  d fdt           j                  D                       S )u   死亡玩家 = 上帝视角:全场身份揭晓 + 全量 transcript(含狼私聊)+ 死因可见。
    纯只读 —— "不能干扰对局"由引擎保证(死亡座位不在 alive_seats,永不被叫去发言/投票/行动)。c                X    g | ]'}|d          |d         |                     d          d(S )r%   r(   cause)r%   r(   r@   )r   .0ds     r   
<listcomp>z_ghost_view.<locals>.<listcomp>>   s5    bbbPQqy5AEE'NNKKbbbr!   Tc                R    i | ]#}|                     |                   j        $S r9   )role_ofnamerB   sr<   r:   s     r   
<dictcomp>z_ghost_view.<locals>.<dictcomp>C   s/    PPPq1eEMM!,,-2PPPr!   )r%   r&   r'   r   r(   r)   r*   r+   r   r,   r-   r3   r4   )r#   idrG   r   r(   r)   alive_seatsdeathsr   listr,   r-   sortedr<   )r:   r%   r;   r<   s   `  `r   _ghost_viewrP   8   s     47didiIU[0A0A0C0CbbUZUabbb())u''PPPPPF5;<O<OPPP	 	 	 	r!   c                                          |                                        |          st           |          S t          |j        j        j         j         j         	                                d  j
        D              j        fd j        D             t           j                            }j        D ]}|dk    r fd j        D             |_        "|dk    r.t           j                            |g                     |_        V|dk    r j        |_        i|dk    r.t/           j                            |i                     |_        |d	k    r j        |_        |S )
Nc                0    g | ]}|d          |d         dS )r%   r(   )r%   r(   r9   rA   s     r   rD   zview.<locals>.<listcomp>N   s(    IIIqqy522IIIr!   c                >    g | ]}t          |j                  |S r9   )r    r   )rB   r   r;   s     r   rD   zview.<locals>.<listcomp>P   s*    PPP!>!TY3O3OPAPPPr!   )r%   r&   r'   r   r(   r)   r*   r+   r   r,   r-   r.   c                \    g | ](}                     |                   j        d k    &|)S )r   )rF   r   rH   s     r   rD   zview.<locals>.<listcomp>U   s8    ]]]!eEMM!<L<L6M6RV\6\6\A6\6\6\r!   check_resultr0   r1   r2   )rF   is_aliverP   r#   rK   rG   r   r(   r)   rL   rM   r   r,   rN   r-   knowsr<   r.   seer_checksr   r/   
last_knifer0   r   witch_potionsr1   r2   )r:   r%   r<   pvgrantr;   s   ` `  @r   viewr]   G   s   t$$%D>>$ 55$e444	47didiIU[0A0A0C0CIIELIIIPPPPu/PPPu''
 
 
B  
/ 
/K]]]]]u{]]]BLLn$$#E$5$9$9$$C$CDDBn$$#.BOOie155dB??@@BJJn$$#.BOIr!   N)r   r   r   r   r   r   )
r:   r   r%   r$   r;   r   r<   r=   r   r#   )r:   r   r%   r$   r<   r=   r   r#   )__doc__
__future__r   dataclassesr   r   typingr   genesis.werewolf.rolesr   genesis.werewolf.stater   r   r    r#   rP   r]   r9   r!   r   <module>rd      s     # " " " " " ( ( ( ( ( ( ( (       ' ' ' ' ' ' , , , , , , jii     % % % % % % % %0        r!   