
    L6jQ                        d Z ddlmZ ddlmZmZ ddlmZ dZdZ	dZ
dZd	Zd
ZdZdZdZdZdZdZdZdZdZdZe G d d                      ZdS )u5  GameState:一局狼人杀的全部状态(隐藏身份在内)。

必须可**无损 JSON 序列化/反序列化** —— 既是 SQLite 存档(snapshot blob)地基,也是续局地基。
GameState 只装数据与纯逻辑助手;凡需要"角色阵营/归边"的判断都交给引擎(它持有 Role 注册表)。
    )annotations)	dataclassfield)Optionallobbydealsheriff_runsheriff_speechsheriff_votenightday_announce
day_speechday_vote	day_exileendknifepoisonexileshotexplodec                     e Zd ZU ded<   ded<   ded<    ee          Zded	<   d
Zded<   eZ	ded<   dZ
ded<    ee          Zded<    ee          Zded<    ee          Zded<    ee          Zded<   dZded<    ee          Zded<    ee          Zded<   dZded<   d
Zded<   d Zd3d!Zd4d$Zd5d%Zd6d(Zd7d8d-Zd9d/Zed:d2            ZdS );	GameStatestrboard_idintseatszdict[int, str]roles)default_factoryzdict[int, bool]aliver   dayphaseNOptional[int]sheriffz
list[dict]
transcriptdeathszdict[int, list]seer_checkszdict[int, dict]witch_potions
last_knifezdict[int, int]votes	votes_logzOptional[str]winnerseedc                D    | j         sd | j        D             | _         d S d S )Nc                    i | ]}|d S )T ).0ss     1/root/genesis-world/src/genesis/werewolf/state.py
<dictcomp>z+GameState.__post_init__.<locals>.<dictcomp>6   s    666a!T666    )r   r   selfs    r2   __post_init__zGameState.__post_init__4   s1    z 	7664:666DJJJ	7 	7r4   return	list[int]c                b    t          d | j                                        D                       S )Nc              3  $   K   | ]\  }}||V  d S Nr/   )r0   r1   as      r2   	<genexpr>z(GameState.alive_seats.<locals>.<genexpr>:   s+      <<DAq!<a<<<<<<r4   )sortedr   itemsr5   s    r2   alive_seatszGameState.alive_seats9   s-    <<DJ$4$4$6$6<<<<<<r4   seatboolc                P    t          | j                            |                    S r<   )rC   r   getr6   rB   s     r2   is_alivezGameState.is_alive<   s    DJNN4(()))r4   c                    | j         |         S r<   )r   rF   s     r2   role_ofzGameState.role_of?   s    z$r4   causeNonec                    | j                             |          sdS d| j         |<   | j                            || j        |d           dS )uN   记一笔死亡(幂等:已死不重复记)。死因入档但不对外公开。NF)rB   r    rJ   )r   rE   r%   appendr    )r6   rB   rJ   s      r2   killzGameState.killB   sQ    z~~d## 	F 
4DEJJKKKKKr4   publicetypetextchannelc           	     \    | j                             | j        | j        ||||d           dS )u   记一条事件。channel='public' 人人可见;'wolf' 仅狼队可见(私聊频道)。
        可见性由 perception 按频道裁剪 —— 私聊内容绝不进他人视野。)r    r!   rR   typerB   rQ   N)r$   rM   r    r!   )r6   rP   rQ   rB   rR   s        r2   recordzGameState.recordI   sK     	tx$*QX(-tT K  K 	L 	L 	L 	L 	Lr4   dictc                f   d }i d| j         d| j        d || j                  d || j                  d| j        d| j        d| j        d	| j        d
| j        d || j	                  d || j
                  d| j        d || j                  d| j        d| j        d| j        S )u@   JSON-able:int 键转成 str(JSON 对象键必须是字符串)。c                >    d |                                  D             S )Nc                4    i | ]\  }}t          |          |S r/   )r   r0   kvs      r2   r3   z7GameState.to_dict.<locals>.<lambda>.<locals>.<dictcomp>R   s$    888daA888r4   r@   )ds    r2   <lambda>z#GameState.to_dict.<locals>.<lambda>R   s    88aggii888 r4   r   r   r   r   r    r!   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   )r   r   r   r   r    r!   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   )r6   iks     r2   to_dictzGameState.to_dictP   s   88

'.

RR
^^
%,bbnn
 48
 %dj
 3<T\
 $/	
 ,4T[	

 22d.//

 2A""TEWBXBX
 $/
 ,3BBtzNN
 
 *24;
 AG	
 	
r4   r^   'GameState'c                   d } | di d|d         dt          |d                   d ||d                   d ||                    d                    dt          |                    dd                    d|                    dt                    d	|                    d	          d
t          |                    d
          pg           dt          |                    d          pg           d ||                    d                    d ||                    d                    d|                    d          d ||                    d                    dt          |                    d          pg           d|                    d          dt          |                    dd                    }|S )Nc                B    d | pi                                  D             S )Nc                4    i | ]\  }}t          |          |S r/   )r   rZ   s      r2   r3   z9GameState.from_dict.<locals>.<lambda>.<locals>.<dictcomp>_   s$    @@@daA@@@r4   r]   )ms    r2   r_   z%GameState.from_dict.<locals>.<lambda>_   s#    @@qwBoo.?.?@@@ r4   r   r   r   r   r    r   r!   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r/   )r   rE   LOBBYlist)clsr^   r`   gss       r2   	from_dictzGameState.from_dict]   s   @@S @ @ @z]]@*-aj///@"QwZ...@(*155>>(:(:(:@ AEE%OO$$$@ -.EE'5,A,A,A@ LM55QZK[K[K[@ AEE,//52666	@ @DAEE(OODYWY?Z?Z?Z	@
 155//000@
 AC155CYCY@Z@Z@Z@ uu\***@ 35"QUU7^^2D2D2D@ 155--3444@ 55???@ *-QUU61-=-=)>)>)>@ 	r4   )r8   r9   )rB   r   r8   rC   )rB   r   r8   r   )rB   r   rJ   r   r8   rK   )NrO   )
rP   r   rQ   r   rB   r"   rR   r   r8   rK   )r8   rV   )r^   rV   r8   rb   )__name__
__module____qualname____annotations__r   rV   r   r    rg   r!   r#   rh   r$   r%   r&   r'   r(   r)   r*   r+   r,   r7   rA   rG   rI   rN   rU   ra   classmethodrk   r/   r4   r2   r   r   !   s        MMMJJJ"U4888E8888CLLLLE!G!!!!"U4888J8888t444F4444#(5#>#>#>K>>>>%*U4%@%@%@M@@@@ $J$$$$!E$777E7777!E$777I7777 F    DMMMM7 7 7
= = = =* * * *       L L L LL L L L L
 
 
 
    [  r4   r   N)__doc__
__future__r   dataclassesr   r   typingr   rg   DEALSHERIFF_RUNSHERIFF_SPEECHSHERIFF_VOTENIGHTDAY_ANNOUNCE
DAY_SPEECHDAY_VOTE	DAY_EXILEENDCAUSE_KNIFECAUSE_POISONCAUSE_EXILE
CAUSE_SHOTCAUSE_EXPLODEr   r/   r4   r2   <module>r      s     # " " " " " ( ( ( ( ( ( ( (       	!
	 
 G G G G G G G G G Gr4   