
    n1j                        d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 h dZ
e G d d                      Z G d	 d
          ZdS )u  结构化对局板:一个 agent 的"记忆主干"。

两层:
- 客观层 = PlayerView(引擎合法下发,信息差已兜住);
- 主观层 = 这个 agent 对其他人的判断(自报身份/我判定好狼/置信/站边),由 LLM 每轮发言顺带产出的 reads[] 累积更新。
render() 把两层拼成喂进每次决策 prompt 的"如实状态" —— 这就是"靠丰富记忆+如实状态涌现智能"在狼人杀里的落点。
    )annotations)	dataclassfield)Optional)
PlayerView>   goodwolfunknownc                  R    e Zd ZU 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 )Beliefintseat strclaimr
   judgment        float
confidencenoteN)__name__
__module____qualname____annotations__r   r   r   r        7/root/genesis-world/src/genesis/werewolf/boardmemory.pyr   r      sU         IIIEOOOOHJDNNNNNNr   r   c                  4    e Zd ZdZddZddZddZdddZdS )BoardMemoryuR   某座位 agent 维护的主观判断 + 把客观+主观渲染成 prompt 文本。r   r   returnNonec                0    || _         i | _        d| _        d S )Nr   )r   beliefsnotes)selfr   s     r   __init__zBoardMemory.__init__   s    	*,


r   c           
        |pg D ]Qt          t                    rdfd	ndfd	} |d          }||| j        k    r=| j                            t          |          t          t          |                              } |d          r%t           |d                    dd         |_         |d          }|t          v r||_
         |d	          }|I	 t          d
t          dt          |                              |_        n# t          t           f$ r Y nw xY w |d          r%t           |d                    dd         |_        SdS )u^   用一次发言产出的 reads[] 更新对各人的判断(dict 或带属性的对象皆可)。Nc                0                         | |          S Ngetkdrs     r   <lambda>z)BoardMemory.apply_reads.<locals>.<lambda>'   s    155A;; r   c                &    t          | |          S r)   getattrr,   s     r   r0   z)BoardMemory.apply_reads.<locals>.<lambda>'   s    _fghjkmn_o_o r   r   r   r      r   r   r   g      ?r      r)   )
isinstancedictr   r#   
setdefaultr   r   r   r   	JUDGMENTSr   maxminr   r   	TypeError
ValueErrorr   )r%   readsgr   bjcr/   s          @r   apply_readszBoardMemory.apply_reads$   s{   " 	- 	-A3=a3F3Fp......MoMoMoMoMoA1V99D|tty00''D		6s4yy3I3I3IJJAqzz /aajj//#2#.*AI~~
,A}#&sCU1XX,>,>#?#?ALL!:.   Dqyy -QQvYY,%	- 	-s   0DD$#D$c                p   t          t                    rdfd	ndfd	} |d          }|rt          |          dd         | _         |d          }|&|| j        k    r|                     |ddd	d
g            |d          }|(|| j        k    r|                     |dddd
g           dS dS dS )ut   每日复盘:用 LLM 压缩结果更新滚动局记 + 把最疑/最信落进结构化判断(dict 或对象皆可)。Nc                0                         | |          S r)   r*   r-   r.   outs     r   r0   z*BoardMemory.apply_digest.<locals>.<lambda><   s    swwq!}} r   c                &    t          | |          S r)   r2   rG   s     r   r0   z*BoardMemory.apply_digest.<locals>.<lambda><   s    _fgjlmop_q_q r   r$   iX  prime_suspectr	   g333333?u   今日复盘最疑)r   r   r   r   most_trustedr   u   今日复盘最信r)   )r7   r8   r   r$   r   rD   )r%   rH   r@   r$   psmts    `    r   apply_digestzBoardMemory.apply_digest:   s    1;C1F1Fr,,,,,,MqMqMqMqMq'

 	*UDSD)DJQ>bDIoorvSZnoopqqqQ~>bDIoorvSZnoopqqqqq >oor   
   vr   transcript_tailr   c           
        dj          dj         dj        dk    rdnd dg}|                    dd	                    d
 j        D                       z   j        r'dd	                    d j        D                       z   ndz              j        r|                    dj         d           | j        r|                    d| j        z              j	        rWj
        rPd                    fdj
                                        D                       }|                    d|z              g }j        Lfdj        D             }|                    d|rd	                    d |D                       ndz              j        <|                    dd                    d j        D                       pdz              j        |                    dj         d           j        S|                    dj                            d           rd!nd" d#j                            d$          rd!nd"            |r+|                    d%d                    |          z              | j        r|                    d&           t%          | j                  D ]{}| j        |         }|j        vrd'd(d)d*|j                 }	|                    d| d+|j        r
d,|j         ndz   d-|	 d|j        d.dz   |j        r
d/|j         ndz              |j        | d         }
|
r}|                    d0           |
D ]e}|                    d1          r|d1          d+nd2}|                    d3          dk    rd4nd}|                    d| d5| d6|d7                     fj        ri }j        D ]J}|                    |d8         |d9         fg                               |d:          d;|d<                     K|                    d=d                    d> |                                D                       z              d?                    |          S )@uz   对局板文本:你是谁 → 场面 → 你的私有情报 → 你对各人的判断 → 近期发言 → 历轮投票。u	   【你】u   号 · (r	   u   狼人阵营u   好人阵营)u   【存活】u   、c              3      K   | ]	}| d V  
dS    号Nr   .0ss     r   	<genexpr>z%BoardMemory.render.<locals>.<genexpr>J   s(      0L0LqA0L0L0L0L0L0Lr   u     【已出局】c              3  >   K   | ]}|d           d|d          dV  dS )r   u   号(第dayu   天)Nr   )rY   r.   s     r   r[   z%BoardMemory.render.<locals>.<genexpr>K   s<      6k6k_`!F)7Z7ZAeH7Z7Z7Z6k6k6k6k6k6kr   r   u   【警长】u   号(1.5 票)u    【你的局记(往日复盘)】z  c              3  H   K   | ]\  }}| d | |j         v rdndz   V  dS )   号=r   u   †N)alive)rY   rZ   nrP   s      r   r[   z%BoardMemory.render.<locals>.<genexpr>Q   sG      ooSWSTVW!}}}}a17llNoooooor   u[   【👻 上帝视角 · 你已出局,只能旁观(以下对活人不可见)】全场身份:Nc                *    g | ]}|j         k    |S r   r4   )rY   rZ   rP   s     r   
<listcomp>z&BoardMemory.render.<locals>.<listcomp>V   s     ;;;1qAF{{Q{{{r   u   你的狼队友:c              3      K   | ]	}| d V  
dS rV   r   rX   s     r   r[   z%BoardMemory.render.<locals>.<genexpr>W   s(      8R8RqA8R8R8R8R8R8Rr   u   (只剩你)u   你的查验史:u   ；c              3  L   K   | ]}|d           d|d         dk    rdnd V   dS )targetr_   resultr	   u   查杀u   金水Nr   )rY   rC   s     r   r[   z%BoardMemory.render.<locals>.<genexpr>Y   s_       9p 9pZ[1X;UU(v0E0EHH8UU9p 9p 9p 9p 9p 9pr   u   (还没验)u   昨夜刀型:u   号倒在刀下u   你的药:解药antidoteu   ✓u   ✗u    毒药poisonu   【你的私有情报】u   【你对各人的判断】u   好人u   狼u   存疑)r   r	   r
   rW   u    自报u
    | 我看:z.0% u   【近期公开发言/事件】r   u   法官channelu   [狼私聊][z] textr]   kindvoteru   →rf   u   【历轮投票】c              3  p   K   | ]1\  \  }}}d | d|dk    rdnd dd                     |          z   V  2dS )u   第u   天sheriffu   警选u   放逐z: rj   N)join)rY   r.   r-   v2s       r   r[   z%BoardMemory.render.<locals>.<genexpr>w   sw       :y :y\f\b]^`adfHaHHYHHHHHH388TV<<W:y :y :y :y :y :yr   
)r   	role_nameteamappendrr   r`   deadrq   r$   is_ghost	all_rolesitems	teammatescheck_resultsknife_targetpotionsr+   r#   sortedr   r   r   r   
transcript	votes_logr9   )r%   rP   rQ   linesrosterprivmatesrZ   rA   tagtailewhochbydayr/   s    `              r   renderzBoardMemory.renderG   s   sQVssAKssAFV\L\L\..bpssst^ejj0L0LAG0L0L0L&L&LLopou})EJJ6k6kdedj6k6k6k,k,kkk{} 	@ 	@ 	@9 	ALL?	???@@@: 	JLL;djHIII: 	A!+ 	AYYoooo[\[f[l[l[n[noooooFLLvy  A  A  A;";;;;;;;EKK*V[.nejj8R8RE8R8R8R.R.R.Ranoppp?&KK*ejj 9p 9p_`_n9p 9p 9p /p /p /A tAB C C C>%KKGGGGHHH9 KK  OAIMM*4M4M+X55SX  O  Ojkjsjwjw  yA  kB  kB  bMafaf  HM  O  O  P  P  P 	HLL3ejj6F6FFGGG< 	hLL6777DL)) h hLOAG##'8LLQZX[![[[17,R,?ag,?,?,?PRSC#CCCCCCDWXW]Ge|16|||ceg h h h h |_,--. 	;LL:;;; ; ;+,55==F6''''h&'eeI&6&6&&@&@]]b9"99s99ai99::::; 	zE[ d d  !E(AfI!6;;BBajCbCbUVW_U`CbCbccccLL-		 :y :yjojujujwjw:y :y :y 1y 1y y z z zyyr   N)r   r   r    r!   )r    r!   )rO   )rP   r   rQ   r   r    r   )r   r   r   __doc__r&   rD   rN   r   r   r   r   r   r      ss        \\   
- - - -,r r r r2  2  2  2  2  2  2 r   r   N)r   
__future__r   dataclassesr   r   typingr   genesis.werewolf.perceptionr   r:   r   r   r   r   r   <module>r      s     # " " " " " ( ( ( ( ( ( ( (       2 2 2 2 2 2'''	        ]  ]  ]  ]  ]  ]  ]  ]  ]  ] r   