
    K1j                        d Z ddlmZ ddlZddlmZmZ ddlmZ h dZ	h dZ
h dZh d	Zh d
ZddhZ ed           G d d                      ZddZddZddZdS )uc  角色-能力模型:把角色定义(roles/*.json)载入为 Role,并校验它只用引擎认识的"能力词表"。

可扩展性的落点:引擎只认下面这组原语,角色靠组合它们而成。
- 加角色 = 加一个 json(只要用的能力都在词表内);
- 加机制 = 先往词表里加一个原语、再加数据。绝不写 "if 角色==X"。
    )annotationsN)	dataclassfield)Path>   killnonecheckguardsave_poison>   potions	teammatescheck_resultguard_targetknife_target>   r   hunter_shootwolf_king_shoot>   r   elder_toughidiot_reveal>   godwolfvillagerr   goodT)frozenc                      e Zd ZU dZ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dZdS )RoleuQ   一个角色的声明式定义(纯数据;行为由引擎按这些字段分发)。stridnameteam	counts_asnight_actionintnight_orderztuple[str, ...]knowson_deathpassivefloatvote_weight persona_hintreturnboolc                    | j         dk    S )Nr   )r!   )selfs    1/root/genesis-world/src/genesis/werewolf/roles.pyacts_at_nightzRole.acts_at_night'   s     F**    N)r+   r,   )__name__
__module____qualname____doc____annotations__r*   r0    r1   r/   r   r      s         [[GGGIIIIIINNNMMMLLLL+ + + + + +r1   r   roler+   Nonec                l   g }| j         t          vr|                    d| j                     | j        t          vr|                    d| j                    | j        t          vr|                    d| j                    | j        t          vr|                    d| j                    | j	        t          vr|                    d| j	                    | j        D ]#}|t          vr|                    d|            $|r-t          d| j         dd	                    |                     d
S )u[   早失败:角色用了词表外的能力 → 立刻报错,而不是运行时静默错乱。zteam=z
counts_as=znight.action=z	on_death=zpassive=zknows:u   角色 u1    用了能力词表外的字段(需先扩词表):z, N)r   TEAMSappendr    	COUNTS_ASr!   NIGHT_ACTIONSr%   ON_DEATHr&   PASSIVESr$   KNOWS
ValueErrorr   join)r8   badks      r/   	_validaterF   +   sN   
Cyszz*=$)*=*=>>>~Y&&

3P3P3P(Q(Q(Q--szz:]$J[:]:]/^/^/^}H$$cjj1LT]1L1L&M&M&M|8##SZZ0I4<0I0I%J%J%JZ 4 4E>>3::lqll333
 om47mm]a]f]fgj]k]kmmnnno or1   ddictc                ~   |                      d          pi }t          | d         |                      d| d                   |                      dd          |                      dd          |                     dd	          t          |                     d
d                    t          |                      d          pg           |                      dd	          |                      dd	          t	          |                      dd                    |                      dd                    }t          |           |S )Nnightr   r   r   r   r    r   actionr   orderr   r$   r%   r&   r(   g      ?r*   r)   )r   r   r   r    r!   r#   r$   r%   r&   r(   r*   )getr   r"   tupler'   rF   )rG   rJ   r8   s      r/   role_from_dictrO   9   s
   EE'NN bET7vqw//UU66""aeeK.L.LYYx00c%))GUVBWBW>X>XAEE'NN(b))z6**AEE)V4L4L!%%s3344155Y[C\C\^ ^ ^D dOOOKr1   	roles_dir
str | Pathdict[str, Role]c                   t          |           } i }t          |                     d                    D ]A}t          t	          j        |                    d                              }|||j        <   B|st          |  d          |S )uF   载入一个目录下所有 *.json 角色定义 → {role_id: Role}。z*.jsonzutf-8)encodingu    下没有角色定义)	r   sortedglobrO   jsonloads	read_textr   FileNotFoundError)rP   outprs       r/   
load_rolesr^   F   s    YICINN8,,--  4:akk7k&C&CDDEEAD		 F9 D D DEEEJr1   )r8   r   r+   r9   )rG   rH   r+   r   )rP   rQ   r+   rR   )r5   
__future__r   rW   dataclassesr   r   pathlibr   r>   rA   r?   r@   r=   r;   r   rF   rO   r^   r7   r1   r/   <module>rb      s&    # " " " " "  ( ( ( ( ( ( ( (       BAAPPP666222'''		 $+ + + + + + + +&o o o o
 
 
 
	 	 	 	 	 	r1   