o
    /Ioj                     @   s   d dl Z dZdZdd Zdd Zdd	 Zd
d Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd d! ZdS )"    Nd   i'  c                    sb   | t krtdt  | dk rtd tkrtdt  dk r&td fddt| D S )Nu   骰子数量不能超过   u   骰子数量必须大于0u   骰子面数不能超过u   骰子面数必须大于0c                    s   g | ]}t d  qS )r   )randomrandint).0_sides 3/home/dore/onebot/Bot_Ero/plugins/trpg_dice/dice.py
<listcomp>   s    zroll.<locals>.<listcomp>)	_MAX_DICE
ValueError
_MAX_SIDESrange)countr	   r
   r   r   roll   s   r   c                 C   sd   d dd |D }t|}|  d| }| dkr'|d| d| d| d	fS |d| d| d	fS )
N + c                 s   s    | ]}t |V  qd S )N)str)r   vr
   r
   r   	<genexpr>       z_dice_detail.<locals>.<genexpr>dr   [=z, ])joinsum)r   r	   valuesstotallabelr
   r
   r   _dice_detail   s   r"   c                 C   s   t | ||\}}||dS )Nvaluedetail)r"   )r   r	   r   r    r%   r
   r
   r   
_eval_dice   s   
r&   c                 C   >   t d| }t d| }t||}d| d| d}||dS Nr   {z | z }r#   )r   r   max)r	   abbestr%   r
   r
   r   _eval_advantage"   
   

r.   c                 C   r'   r(   )r   r   min)r	   r+   r,   worstr%   r
   r
   r   _eval_disadvantage*   r/   r2   c           	      C   s  | st dd}|d d|d  dfS t| }|stdt|dkrs|d d dkrs|d d d	krs|d d }|dk sA|d
krEtdg }t|D ]}tt|d\}}|| qKtdd |D }d	dd |D }||fS t|d\}}|d |d fS )Nr   r   r   [1d100=r   u   无效表达式   NUM#
   u"   多轮掷骰次数应在1~10之间   c                 s       | ]}|d  V  qdS )r$   Nr
   r   rr
   r
   r   r   D   r   zparse.<locals>.<genexpr> c                 s   r9   )r%   Nr
   r:   r
   r
   r   r   E   r   r$   r%   )
r   	_tokenizer   lenr   
_parse_addlistappendr   r   )	exprr;   tokensr   resultsr   r    r%   resultr
   r
   r   parse2   s&   
,rF   c                 C   s\  g }d}|t | k r| | }|dkr|d7 }q| rI|}|t | k r9| |  r9|d7 }|t | k r9| |  s)|dt| || f |}q|dv rY|||f |d7 }q|dkrw|d t | k rw| |d  dkrw|d |d7 }q|d	v r|| |f |d7 }q| d
|r|d |d7 }q| d|r|d |d7 }q	 |S |S )Nr   r<   r   r5   z+-*/()#%*)**rH   r8   dDbBpP   优势)rJ   rJ      劣势)rK   rK   )r>   isdigitrA   intlower
startswith)r   rC   icjr
   r
   r   r=   L   sJ   (


r=   c                 C   s   t | |\}}|t| k rl| | }|d dkr9t | |d \}}|d }|d }|| |d  d|d  d}n-|d dkrat | |d \}}|d }|d }|| |d  d	|d  d}n	 ||fS |t| k s||fS )
Nr   +r   r$   r%   r   r#   -z - )
_parse_mulr>   rC   poslefttrightlvrvr
   r
   r   r?   s   s"   ""r?   c                 C   s   t | |\}}|t| k rx| | }|d dkr;t | |d \}}|d }|d }|| d|d  d|d  dd	}n7|d d
krmt | |d \}}|d }|d }|dkrZtd|| d|d  d|d  dd	}n	 ||fS |t| k s||fS )Nr   rG   r   r$   (r%   z) * ()r#   /u   除数不能为0z) / ()_parse_unaryr>   r   rV   r
   r
   r   rU      s&   &&rU   c                 C   s   |t | kr
td| | }|d dkrt| |d S |d dkr<t| |d \}}|d }| d|d  d	d
|fS t| |S )N   表达式不完整r   rS   r   rT   r$   z-(r%   r^   r#   )r>   r   _parse_atom)rC   rW   rY   rZ   r\   r
   r
   r   r`      s   
r`   c                 C   s  |t | kr
td| | }|d dkr:|d t | k r+| |d  d dkr+t| |S |d t|d d|d fS |d dkrkt| |d \}}|t | ksW| | d dkr[td	d|d
  d|d
< ||d fS |d dkrtdd}|d d|d  dd|d fS |d dkrt| |S |d dkrtd|d dkrtd|d dkrtd|d fS |d dkrtd|d fS td| )Nra   r   r5   r   r   r#   r]   r^   u   缺少 )r%   %r   r3   r   r,   u9   奖励骰 b 为 COC 规则，当前游戏规则为 DND 5Epu9   惩罚骰 p 为 COC 规则，当前游戏规则为 DND 5ErJ      rK   u   意外的标记: )	r>   r   _parse_dice_explicitr   r?   r   _parse_dice_implicitr.   r2   )rC   rW   rY   rE   r;   r
   r
   r   rb      s6   $

"
rb   c                 C   s0   | | d }|d7 }t | |\}}t||| |S )Nr   r8   _parse_sides_parse_dice_result)rC   rW   r   r	   r
   r
   r   rf      s   rf   c                 C   s$   |d7 }t | |\}}td|| |S )Nr   rh   rC   rW   r	   r
   r
   r   rg      s   rg   c                 C   s`   |t | kr
td| | d dkr| | d }||d fS | | d dkr,d|d fS td)Nu   骰子表达式需要面数r   r5   r   rc   r   )r>   r   rk   r
   r
   r   ri      s   ri   c                 C   sr   |t |k r|| d dkrt||d fS |t |k r,|| d dkr,t||d fS t| |}t| |||fS )Nr   rJ   r   rK   )r>   r.   r2   r   r&   )r   r	   rC   rW   r   r
   r
   r   rj      s   
rj   )r   r   r   r   r"   r&   r.   r2   rF   r=   r?   rU   r`   rb   rf   rg   ri   rj   r
   r
   r
   r   <module>   s$    	'(