o
    glj$                     @   sF  d dl mZ d dlmZmZmZmZmZ dZd ZdZ	dZ
dZdZdZd	Zed
ede	de
dededediZdefddZdedefddZdededeeeedB f fddZdedeeeedB f fddZdedee dedB fddZded ededB fd!d"Zdedee dB fd#d$Zdee fd%d&Zd'edefd(d)ZdS )*   )rules)
ATTRIBUTESRACESCLASSESBACKGROUNDSSKILLS                      u   选择种族u   选择职业u   选择属性生成方式u   分配属性u   选择技能熟练u   选择背景u   设定角色名returnc                   C   s
   t i dS )N)stepdata)	STEP_RACE r   r   5/home/dore/onebot/Bot_Ero/plugins/trpg_char/wizard.pystart   s   
r   statec           	      C   s  | d }| d }|t kr%dg}|dd ttdD 7 }|d d|S |tkrBd	g}|d
d ttdD 7 }|d d|S |tkrI	 dS |tkr|	d}|dkrmddd t
tjD }dtj d| dS |dkr|	dg }ddd |D }d| dS ddtttj dS |tkr|	dd}d| dg}|dd ttdD 7 }|d  d|S |tkrd!g}|d"d tt dD 7 }|d# d|S |tkrd$S d%S )&u$   生成当前步骤的提示文本。r   r   u   第1步：选择种族c                 S       g | ]\}}d | d| qS   . r   .0inamer   r   r   
<listcomp>$        zprompt.<locals>.<listcomp>r   u0   回复编号或种族名（例：3 或 精灵）
u   第2步：选择职业c                 S   r   r   r   r   r   r   r   r   *   r    u0   回复编号或职业名（例：5 或 战士）u   第3步：选择属性生成方式
  1. 标准购点法（27点）
  2. 4d6k3 掷骰法（由机器人掷出6组属性）
  3. 标准数组（15, 14, 13, 12, 10, 8）
回复 1、2 或 3methodz | c                 s   s$    | ]}| d t j|  V  qdS )=Nr   POINT_BUY_COSTr   vr   r   r   	<genexpr>:   s   " zprompt.<locals>.<genexpr>u/   第4步：分配属性（标准购点，预算 u    点）
购点表: um   
按顺序输入 力量 敏捷 体质 智力 感知 魅力 的属性值，空格分隔
例：15 14 13 12 10 8r	   rolled_scores, c                 s   s    | ]}t |V  qd S N)strr&   r   r   r   r(   C   s    u'   第4步：分配属性（掷骰结果: up   ）
按顺序输入 力量 敏捷 体质 智力 感知 魅力 对应的值，空格分隔
例：15 12 13 8 10 14u&   第4步：分配属性（标准数组 up   ）
按顺序输入 力量 敏捷 体质 智力 感知 魅力 对应的值，空格分隔
例：15 14 13 12 10 8skill_countu/   第5步：选择技能熟练（本职业可选 u    项）c                 S   r   r   r   r   r   r   r   r   R   r    uQ   回复编号或技能名，多项用空格分隔（例：3 7 或 巧手 洞悉）u   第6步：选择背景c              
   S   s2   g | ]\}\}}d | d| dd | dqS )r   r   u   （r*   u   ）)join)r   r   r   sr   r   r   r   X   s   2 u0   回复编号或背景名（例：2 或 罪犯）u>   最后一步：输入角色名（例：艾伦·风暴行者） )r   	enumerater   appendr.   
STEP_CLASSr   STEP_METHODSTEP_SCORESgetsortedr   r%   POINT_BUY_BUDGETmapr,   STANDARD_ARRAYSTEP_SKILLSr   STEP_BACKGROUNDr   items	STEP_NAME)	r   r   r   linesr"   costvaluesvalscountr   r   r   prompt   sX   










rD   replyNc                 C   s  | d }| d }|  }|dkrdS |tkr/t|tt }|s#dS ||d< d|d< t| S |tkrPt|tt }|s@d	S ||d
< t| d |d< t| S |t	kro|dvrZdS t
|}||d< |dkrkt |d< t| S |tkrt|}|s{dS |ddkrtdd |D }tdd |D rdttj dttj dddfS |tjkrd| dtj ddfS |ddkrt|t|dg krdS |ddkrt|ttjkrdS dd tt|D |d < t| S |tkrt||dd}|du rd!S ||d"< t| S |tkrBt|tt }|sd#S ||d$< |d"g }	t| D ]}
|
|	vr8|	|
 q,|	|d"< t| S |tkrgt |d%krPd&S ||d'< t!| d< t"|}d(|d)d* d+|fS d,S )-u]   处理用户回复。返回 (消息文本, 是否完成/放弃, 最终角色数据或None)。r   r   u   退出)u   已放弃角色创建TN)uB   无效的种族，请重新选择（回复「退出」可放弃）FNracer	   r-   )uB   无效的职业，请重新选择（回复「退出」可放弃）FN
class_name)123)u   请输入 1、2 或 3FNr"   r)   )u$   请输入 6 个数字，空格分隔FNr   c                 s   s    | ]
}t j|d V  qdS )c   N)r   r%   r6   r&   r   r   r   r(      s    zhandle_reply.<locals>.<genexpr>c                 s   s    | ]}|t jvV  qd S r+   r$   r&   r   r   r   r(      s    u   购点法属性值必须在 ~u    之间FNu   属性总花费 u    点，超过预算 )u6   属性值必须等于掷骰结果（可调换顺序）FNr
   )u8   属性值必须为 15 14 13 12 10 8（可调换顺序）FNc                 S   s   i | ]\}}||qS r   r   )r   attrr'   r   r   r   
<dictcomp>   s    z handle_reply.<locals>.<dictcomp>scores)u$   技能选择无效，请重新选择FNproficient_skills)u!   无效的背景，请重新选择FN
background   )u    角色名过长（最多30字）FN	char_nameu   角色创建完成！
_sheetr0   T)r0   FN)#stripr   _match_optionlistr   keys_advancer3   r   r4   int_roll_scoresr5   _parse_scoresr6   sumanyminr   r%   maxr8   r7   r:   zipr   r;   _match_skillsr<   r   r2   r>   len	STEP_DONE_build_char_data)r   rE   r   r   r   r"   rO   r@   chosenmergedr/   	char_datar   r   r   handle_replyb   s   
$






ri   c                 C   s"   | d  d7  < t | }|dd fS )Nr   r   F)rD   )r   pr   r   r   rY      s   
rY   optionsc                 C   s\   |   rt| }d|  krt|krn d S ||d  S d S |D ]
}| |kr+|  S q!d S )Nr   )isdigitrZ   rc   )rE   rk   idxoptr   r   r   rV      s   rV   	max_countc                 C   s   |  dd }tt }g }|D ]7}| r9t|}d|  kr(t|kr6n  d S |||d   q d S |tv rG||vrG|| q d S |rRt||krTd S |S )N   ， r   )	replacesplitrW   r   rX   rl   rZ   rc   r2   )rE   ro   partsnamesrf   rj   rm   r   r   r   rb      s    rb   c                 C   sj   |  dd dd }t|dkrd S z	dd |D }W n
 ty'   Y d S w tdd |D r3d S |S )	Nrp   rq   ,r   c                 S   s   g | ]}t |qS r   )rZ   )r   rj   r   r   r   r      s    z!_parse_scores.<locals>.<listcomp>c                 s   s     | ]}|d k p|dkV  qdS )r   rR   Nr   )r   r/   r   r   r   r(      s    z _parse_scores.<locals>.<genexpr>)rr   rs   rc   
ValueErrorr^   )rE   rt   rO   r   r   r   r\      s   r\   c                     sR   dd l  g } tdD ]}t fddtdD dd}| t|d d  q
| S )	Nr   r   c                    s   g | ]}  d dqS )r   r   )randint)r   _randomr   r   r      s    z _roll_scores.<locals>.<listcomp>r   T)reverser
   )r{   ranger7   r2   r]   )rO   ry   rollsr   rz   r   r[      s   r[   r   c                 C   s   ddl m} | d }tj| d  }| d | d | d d| dd|d	 |d
 |d |d |d |d | dg |d ddd}||}|d |d< |d |d< |||d< |S )Nr   )	characterrO   rG   rS   rF   rQ   r0   u   力量u   敏捷u   体质u   智力u   感知u   魅力rP   	equipmentr   )rS   rF   rG   levelrQ   	str_score	dex_score	con_score	int_score	wis_score	cha_scorerP   r   hpacr   r   rT   )r0   r   r   r   r6   finalizeformat_sheet)r   r   rO   clsrh   	finalizedr   r   r   re      s0   


re   )r0   r   r   r   r   r   r   r   r3   r4   r5   r;   r<   r>   rd   
STEP_NAMESdictr   r,   rD   tupleboolri   rY   rW   rV   rZ   rb   r\   r[   re   r   r   r   r   <module>   s6    $E T	