a
    F^i                     @   s  d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlZd dlZd dlmZmZmZ dd Zdd Zi Zd	d
 Zedd Zedd Zej dZ!dd Z"dd Z#dd Z$dd Z%dd Z&i Z'dd Z(dd Z)dd Z*d d! Z+g a,d"d# Z-G d$d% d%eZ.G d&d' d'ejj/Z0G d(d) d)eZ1G d*d+ d+ejj/Z2G d,d- d-e1Z3G d.d/ d/e2Z4G d0d1 d1e1Z5G d2d3 d3e1Z6G d4d5 d5e1Z7G d6d7 d7e2Z8G d8d9 d9e2Z9G d:d; d;e1Z:G d<d= d=e2Z;G d>d? d?e1Z<G d@dA dAe2Z=G dBdC dCe1Z>G dDdE dEe2Z?G dFdG dGe1Z@G dHdI dIe2ZAG dJdK dKe1ZBG dLdM dMe2ZCG dNdO dOe1ZDG dPdQ dQe2ZEG dRdS dSe1ZFG dTdU dUe2ZGdVdW ZHdS )X    )divisionabsolute_importwith_statementprint_functionunicode_literals)PY2
basestringbchrbordchropenpystrrangeroundstrtobytesunicodeN)Analysis	NOT_CONSTGLOBAL_CONSTc                 C   s   | \}}d||f t j_d S )NzCompiling ATL code at %s:%drenpygameexception_infolocfileZnumber r   MC:\Program Files (x86)\Steam\steamapps\common\Selene ~Apoptosis~\renpy\atl.py	compiling   s    r   c                 C   s   | \}}d||f t j_d S )NzExecuting ATL code at %s:%dr   r   r   r   r   	executing%   s    r    c                 C   s   | j }| t|< | S N)__name__warpers)fnamer   r   r   
atl_warper/   s    r&   c                 C   s   | dk rdS dS d S )N      ?        r   tr   r   r   pause8   s    r+   c                 C   s   dS )Nr'   r   r)   r   r   r   instant@   s    r,   positionc                 C   s   | S r!   r   xr   r   r   
any_objectH   s    r0   c                 C   s   | d u r| S t | S r!   )boolr.   r   r   r   bool_or_noneL   s    r2   c                 C   s   | d u r| S t | S r!   )floatr.   r   r   r   float_or_noneR   s    r4   c                 C   s*   | d u rd S t | r| S tjj| S d S r!   )callabler   displaymatrixMatrixr.   r   r   r   r7   X   s
    r7   c                 C   s(   t | tjjjtjjjtfr | S t| S r!   )	
isinstancer   gl2Zgl2mesh2ZMesh2Zgl2mesh3ZMesh3tupler1   r.   r   r   r   mesha   s    r<   c                 C   s.   |t u r"| du rdS t|| S n|| S dS )zL
    Corrects the type of v to match ty. b is used to inform the match.
    N)r-   type)vbtyr   r   r   correct_typem   s
    rA   c                    s   |du st |tttjjjfr0 dkr*|S |S nt |tr|du rPdgt| }t |tsh|ft| }t fddt	|||D S t
|rt|dd}|| }||_|S |du rd}t| ||   ||S dS )z-
    Linearly interpolate the arguments.
    Nr'   c                 3   s"   | ]\}}}t  |||V  qd S r!   )interpolate).0ijr@   r)   r   r   	<genexpr>       zinterpolate.<locals>.<genexpr>originr   )r9   r1   r   r   r6   r7   r8   r;   lenzipr5   getattrrH   rA   )r*   ar?   r=   Za_originrvr   r)   r   rB   {   s$    


rB   c           
         s   t |d tr(t fddt| D S |d d u r<|d S t|dkrld  }||d   |d   }nt|dkrd  d }d  d   } d }||d  ||d   ||d   }n,t|d	kr@d  d }d  d  d  }d d  d   } d }||d  ||d   ||d   ||d   }n d
ksT dkrl| d
krddnd }n|d |d gt|dd  |d |d g }tt|d }t d|  d }	 d|  |  t g||	d |	d  R  }t||d t	S )Nc                 3   s   | ]}t  |V  qd S r!   )interpolate_splinerC   rD   r)   r   r   rF      rG   z%interpolate_spline.<locals>.<genexpr>r      r'            r(   )
r9   r;   rJ   rI   listr3   intget_catmull_rom_valuerA   r-   )
r*   ZsplineZt_prM   Zt_ppt2Zt_pppZt3Zinner_spline_countZsectorr   r)   r   rO      s<    (2 rO   c                 C   s   t tdtd| } t|| d|  |  d  | | |  d|  d  d |  | dd|   |  d  |  | d |  |  |  d S )zf
    Very basic Catmull-Rom calculation with no alpha or handling
    of multi-dimensional points
    r(   r'   rQ   rS   rR      rT   )r3   maxminr=   )r*   Zp_1Zp0Zp1Zp2r   r   r   rX      s    rX   c                  C   s&   t D ]} | jjtkr|   qg a dS )zv
    Called after the init phase is finished and transforms are compiled,
    to compile all constant transforms.
    N)compile_queueatlconstantr   compile)rD   r   r   r   compile_all   s    
ra   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Contextc                 C   s
   || _ d S r!   context)selfrd   r   r   r   __init__   s    zContext.__init__c                 C   s   t jj|| jdS )N)locals)r   pythonpy_evalrd   )re   exprr   r   r   eval  s    zContext.evalc                 C   s   t |tsdS | j|jkS NF)r9   rb   rd   re   otherr   r   r   __eq__  s    
zContext.__eq__c                 C   s
   | |k S r!   r   rm   r   r   r   __ne__  s    zContext.__ne__N)r"   
__module____qualname__rf   rk   ro   rp   r   r   r   r   rb      s   rb   c                       sv   e Zd ZejjZdZdZdZ	dgZ
dd Zdd Zdd	 Z fd
dZdd Zdd Zdd Zdd Zdd Z  ZS )ATLTransformBaseNr   parent_transformc                 C   s   |d u rt j}|| _|| _t|| _d | _d | _d | _d | _d| _	d | _
d | _d | _d | _d | _tjjrpd | _nd| _tj jrt|  d S )NFr   )rs   
parametersr^   rb   rd   blockpredict_block
properties	atl_statedonetransform_eventlast_transform_eventlast_child_transform_event	raw_childrt   r   configatl_start_on_showatl_st_offsetr   
init_phaser]   append)re   r^   rd   ru   r   r   r   rf     s(    
zATLTransformBase.__init__c                 C   sJ   |dkr| j d u rdS | jd ur0| j|r0dS | jd u r>dS | j|S )NreplacedTF)ry   rv   _handles_eventchildre   eventr   r   r   r   Z  s    
zATLTransformBase._handles_eventc                 C   s*   | j r| j S | jr"tjjjr"| jS dS dS )z4
        Returns the compiled block to use.
        N)rv   rw   r   r6   predict
predictingre   r   r   r   	get_blockg  s
    zATLTransformBase.get_blockc                    s  t t| | d| _d| _| |u r(dS t|ts6dS |j| jurFdS z|j| jksZW dS W n tyn   Y n0 |j	| _	|j
| _
|j| _|j| _|j| _|j| _|j| _|j| _|j| _|j| _|j| _| jtjjju r|jr|jjr|jd| _n|j| _|j| _dS )zy
        Updates self to begin executing from the same point as t. This
        requires that t.atl is self.atl.
        N)superrs   take_execution_stater   ry   r9   r^   rd   	Exceptionrz   rv   r{   r|   r}   statZ	st_offsetZ	at_offsetr   r   r6   motionnull_duplicatable
_duplicater~   )re   r*   	__class__r   r   r   s  s<    

z%ATLTransformBase.take_execution_statec                 O   s  | dd }| jj }| jjD ] \}}|d ur tj|||< q t| jj}t|}d }|sl|rl| d}|r|r| d}	| d}
|	|v rt	d|	 |	dks|	dkr|
}|
||	< ql|rt	d|
 D ]`\}}|dkr|}||v r|| |||< q||v r|||< q|dkr"|}qt	d| q|d u r@| j}t|dd	rX||}tjg |d d }tjjj| j|| j|||d
}| |_||  |S )N_argsr   zOParameter %r is used as both a positional and keyword argument to a transition.r   
old_widgetz+Too many arguments passed to ATL transform.z+Parameter %r is not known by ATL Transform.r   F)r^   r   stylerd   ru   r   )poprd   copyru   r   rh   ri   rV   
positionalr   itemsremover   rK   r   astParameterInfor6   r   ATLTransformr^   Z	style_argrt   
take_state)re   argskwargsr   rd   kr>   r   r   r%   valueru   rM   r   r   r   __call__  s^    










	
zATLTransformBase.__call__c                 C   s8  | j jtk}|sL| jjD ]2}|| jjvrtd| j jd | j jd |f q|r~| jr~| jj	r~| jj	| _	| jj
| _
d| _| j	S tjj}|r| j jdur| j j}n| j | j}tdd |jD rg | _
|jD ]}| j
|j
 q|stjjjr|| _n|| _	d| _|tj_|r4| jr4| j	| j_	| j
| j_
d| _|S )zc
        Compiles the ATL code into a block. As necessary, updates the
        properties.
        zOCannot compile ATL Transform at %s:%d, as it's missing positional parameter %s.r   rS   Nc                 s   s"   | ]}t |to|jd kV  qdS )r   N)r9   Interpolationduration)rC   Z	statementr   r   r   rF     s   z+ATLTransformBase.compile.<locals>.<genexpr>)r^   r_   r   ru   r   rd   r   r   rt   rv   rx   r   r   r   compiled_blockr`   all
statementsextendr6   r   r   rw   )re   r_   pold_exception_inforv   Zinterpr   r   r   r`     sF    









zATLTransformBase.compilec                 C   s`  | j r
d S |  }|d u r"|  }g }|jr2d| _|jr>d| _tjjrf| j| j	krf|
| j | j| _	| jd ur| jj| jkr| jj| _| jjd ur| jj| _| j| j	kr|
| j | j| _	| jtjjv rd | _d | _	tjj}| jd u s|| j dk r|| _| jjr|}n
|| j }|||| j|\}}	}
|tj_|dkrVtjjjsV|	| _nd| _ |
S )Nhider   r   continueT)rz   r   r`   hide_requestr{   replaced_requestr   r   atl_multiple_eventsr|   r   r   r}   repeat_transform_eventsr   r   r   r^   	animationexecutery   r6   r   r   )re   transr   r   rv   eventsr   Ztimebaseactionargr+   r   r   r   r   "  sH    



zATLTransformBase.executec                 C   s   | j | j d S r!   )r^   r   rd   r   r   r   r   predict_one_  s    zATLTransformBase.predict_onec                 C   s&   |   }|d u r|  }| j|  S r!   )r   r`   childrenvisit)re   rv   r   r   r   r   b  s    zATLTransformBase.visit)r"   rq   rr   r   r   EMPTY_PARAMETERSru   rt   r   rw   nosaverf   r   r   r   r   r`   r   r   r   __classcell__r   r   r   r   rs     s   ;0I6=rs   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
RawStatementNc                    s   t t|   || _d S r!   )r   r   rf   r   re   r   r   r   r   rf   r  s    zRawStatement.__init__c                 C   s   t dd S )NzCompile not implemented.r   re   ctxr   r   r   r`   x  s    zRawStatement.compilec                 C   s   d S r!   r   r   r   r   r   r   |  s    zRawStatement.predictc                 C   s
   t | _dS )z
        Sets self.constant to GLOBAL_CONST if all expressions used in
        this statement and its children are constant.
        `analysis`
            A pyanalysis.Analysis object containing the analysis of this ATL.
        N)r   r_   re   analysisr   r   r   mark_constant  s    zRawStatement.mark_constant)	r"   rq   rr   r_   rf   r`   r   r   r   r   r   r   r   r   n  s
   r   c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )		Statementc                    s   t t|   || _d S r!   )r   r   rf   r   r   r   r   r   rf     s    zStatement.__init__c                 C   s   t dd S )NzNot implemented.r   re   r   r   stater   r   r   r   r     s    zStatement.executec                 C   s   g S r!   r   r   r   r   r   r     s    zStatement.visitc                 C   s   dS rl   r   r   r   r   r   r     s    zStatement._handles_event)r"   rq   rr   rf   r   r   r   r   r   r   r   r   r     s   r   c                       sN   e Zd ZdZdZ fddZdd Zdd Zdd	d
Zdd Z	dd Z
  ZS )RawBlockFNc                    s    t t| | || _|| _d S r!   )r   r   rf   r   r   )re   r   r   r   r   r   r   rf     s    zRawBlock.__init__c                    s*   t | j  fdd| jD }t| j|S )Nc                    s   g | ]}|  qS r   r`   rP   r   r   r   
<listcomp>  rG   z$RawBlock.compile.<locals>.<listcomp>)r   r   r   Block)re   r   r   r   r   r   r`     s    
zRawBlock.compilec                 C   s   | j D ]}|| qd S r!   )r   r   re   r   rD   r   r   r   r     s    
zRawBlock.predictc                 C   s:   t d }|d ur|| | | | jtkr6|   d S r!   )r   ru   r   r_   r   compile_block)re   ru   r   r   r   r   analyze  s    


zRawBlock.analyzec                 C   s^   t jj}z| ti }W n0 ty4   tdY n tyJ   t| _Y n0 || _	|t j_d S )Nz+This transform refers to itself in a cycle.)
r   r   r   r`   rb   RuntimeErrorr   r   r_   r   )re   r   rv   r   r   r   r     s    zRawBlock.compile_blockc                 C   s0   t }| jD ]}|| t||j}q
|| _d S r!   )r   r   r   r\   r_   re   r   r_   rD   r   r   r   r     s
    

zRawBlock.mark_constant)N)r"   rq   rr   r   r   rf   r`   r   r   r   r   r   r   r   r   r   r     s   	
r   c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	r   c                    s\   t t| | || _g | _t|D ](\}}t|tr$| j|j	|d f q$| j
  d S )NrS   )r   r   rf   r   times	enumerater9   Timer   timesort)re   r   r   rD   sr   r   r   rf     s    
zBlock.__init__c                 C   s    | j D ]}||r dS qdS NTF)r   r   re   r   rD   r   r   r   r     s    

zBlock._handles_eventc                 C   s4  t | j |d ur$|\}}}}}	}
n&dddd| jd d  d f\}}}}}	}
d}d }d }|dkr0|	r|	d \}}t||}|| }n|}d}|t| jkrd|| d fS | j| }|||| |
|\}}}|dkr
|d u r|}d|||||	|ft||  }}}qq|dkr|||fS |dkr>|d7 }|| }d }
q|dkr|\}}|| }|| }|d u rz|dkrztd|rt|| | }nd}|d ur|| |kr|| }||| 7 }d|| d fS ||7 }|||  }|}d}d }
q|	r&|	d \}}||kr&|		d |}|}d }
qV|||fS d S )	Nr   r      nextr   rS   repeatz&ATL appears to be in an infinite loop.)
r    r   r   r\   rI   r   r   r   rW   r   )re   r   r   r   r   indexstartZ
loop_startrepeatsr   Zchild_stater   r   r+   r   ZtindextargetZ	max_pausestmtcountZloop_endr   Znew_repeatsr   r   r   r     sr    
&




"





zBlock.executec                 C   s   dd | j D S )Nc                 S   s   g | ]}|  D ]}|qqS r   r   rC   rD   rE   r   r   r   r     rG   zBlock.visit.<locals>.<listcomp>)r   r   r   r   r   r     s    zBlock.visitr"   rq   rr   rf   r   r   r   r   r   r   r   r   r     s   hr   c                       sh   e Zd ZdZ f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  ZS )RawMultipurposeNc                    s>   t t| | d | _d | _g | _g | _g | _d | _d| _	d S )N0)
r   r   rf   warperr   rx   expressionssplines
revolutioncirclesr   r   r   r   rf     s    zRawMultipurpose.__init__c                 C   s   || _ || _|| _d S r!   )r   r   warp_function)re   r%   r   r   r   r   r   
add_warper  s    zRawMultipurpose.add_warperc                 C   s   | j ||f d S r!   )rx   r   re   r%   exprsr   r   r   add_property  s    zRawMultipurpose.add_propertyc                 C   s   | j ||f d S r!   )r   r   )re   rj   Zwith_clauser   r   r   add_expression  s    zRawMultipurpose.add_expressionc                 C   s
   || _ d S r!   )r   )re   r   r   r   r   add_revolution  s    zRawMultipurpose.add_revolutionc                 C   s
   || _ d S r!   )r   )re   r   r   r   r   add_circles  s    zRawMultipurpose.add_circlesc                 C   s   | j ||f d S r!   )r   r   r   r   r   r   
add_spline  s    zRawMultipurpose.add_splinec              	      sJ  t | j | jd u r| jd u r| js| jst| jdkr| jd \}} |}|r` |}nd }t	|t
tfrt| jd|g d dg S tj|}t	|tr|jd u r|  | S t| j||S t | j | jr | j}n | jpd}|tvrtd| g }| jD ]8\}}|tvr,td|  |}	|||	f qg }
| jD ]@\}}|tvrptd|  fdd|D }|
||f qR| jD ]~\}}z |}	W n  ty   td	| Y n0 t	|	tstd
| |	  |	jd u r
td| ||	j q | j} | j}t| j|||| j||
S )NrS   r   r+   r,   z$ATL Warper %s is unknown at runtime.z&ATL Property %s is unknown at runtime.c                    s   g | ]}  |qS r   )rk   rP   r   r   r   r     rG   z+RawMultipurpose.compile.<locals>.<listcomp>z4Could not evaluate expression %r when compiling ATL.zYExpression %r is not an ATL transform, and so cannot be included in an ATL interpolation.zDATL transform %r is too complicated to be included in interpolation.)r   r   r   r   rx   r   rI   r   rk   r9   rW   r3   r   r   easydisplayablers   r   r`   r   Childr#   r   
PROPERTIESr   r   r   r   r   )re   r   rj   withexprr   
transitionr   rx   r%   r   r   r   valuesZ_withr   r   r   r   r   r`     sl    








zRawMultipurpose.compilec                 C   s   t }|j}t||| j}t||| j}t||| j}| jD ]\}}t|||}q@| jD ] \}}|D ]}t|||}qjq^| jD ]$\}}t|||}t|||}q|| _	d S r!   )
r   is_constant_exprr\   r   r   r   rx   r   r   r_   )re   r   r_   r  _namerj   r   r   r   r   r   r     s    zRawMultipurpose.mark_constantc              	   C   s~   | j D ]r\}}z||}W n ty2   Y qY n0 t|trP|j|  d S ztj| W q tyv   Y qY q0 qd S r!   )	r   rk   r   r9   rs   r^   r   r   r   )re   r   rD   Z_jr   r   r   r   #  s    

zRawMultipurpose.predict)r"   rq   rr   r   rf   r   r   r   r   r   r   r`   r   r   r   r   r   r   r   r     s   Tr   c                       s,   e Zd Z fddZdd Zdd Z  ZS )RawContainsExprc                    s   t t| | || _d S r!   )r   r  rf   
expressionre   r   rj   r   r   r   rf   :  s    zRawContainsExpr.__init__c                 C   s$   t | j || j}t| j|d S r!   )r   r   rk   r  r   )re   r   r   r   r   r   r`   @  s    
zRawContainsExpr.compilec                 C   s   | | j| _d S r!   )r  r  r_   r   r   r   r   r   E  s    zRawContainsExpr.mark_constantr"   rq   rr   rf   r`   r   r   r   r   r   r   r  8  s   r  c                       s,   e Zd Z fddZdd Zdd Z  ZS )RawChildc                    s   t t| | |g| _d S r!   )r   r	  rf   r   )re   r   r   r   r   r   rf   L  s    zRawChild.__init__c                 C   s\   g }| j D ]}|tjjj||jd q
tjjjdd}|D ]}|	| q>t
| j|d S )Nrc   fixed)layout)r   r   r   r6   r   r   rd   r  ZMultiBoxaddr   r   )re   r   r   rD   boxr   r   r   r`   R  s    
zRawChild.compilec                 C   s0   t }| jD ]}|| t||j}q
|| _d S r!   )r   r   r   r\   r_   r   r   r   r   r   `  s
    

zRawChild.mark_constantr  r   r   r   r   r	  J  s   r	  c                       s,   e Zd Z fddZdd Zdd Z  ZS )r   c                    s    t t| | || _|| _d S r!   )r   r   rf   r   r  )re   r   r   r  r   r   r   rf   n  s    zChild.__init__c                 C   s   t | j |j}| j}|jr2| j|j}|  |d urj|tj	j
jurj| jd urj| j||d}|  n|}|j|dd | j|_d|d fS )N)r   
new_widgetF)Z	duplicater   )r    r   r~   r   r   r   r   Z_uniquer   r6   r   r   r  Z	set_child)re   r   r   r   r   Z	old_childr   r   r   r   r   u  s    
 
zChild.executec                 C   s   | j gS r!   )r   r   r   r   r   r     s    zChild.visit)r"   rq   rr   rf   r   r   r   r   r   r   r   r   l  s   r   c                       s$   e Zd Z fddZdd Z  ZS )r   c                    s8   t t| | || _|| _|| _|| _|| _|| _d S r!   )	r   r   rf   r   r   rx   r   r   r   )re   r   r   r   rx   r   r   r   r   r   r   rf     s    zInterpolation.__init__c                 C   s  t | j t| j| j}|jjr*|j}n|j}|d u rZ| jdkrZ| j	dkrZt
jjrZd}nd}| j	rvtd|| j	 }nd}|dk rd}n|dkrd}||}|d u rt
jj }	|	|j d}
| jD ]&\}}t|	|| |dkr||	_d}
q|j|	}d }g }| j}| j}|s&|
rt
jjr|	jd urdD ]}||d  q6|d ur|	j|j_|	j|j_|	j|j_|	j|j_|jj}|	j}|jj }|	j }|d	kr||k r|d
8 }||d
 8 }n(|dkr||kr|d
7 }||d
 7 }||||f}n&|jjp|jj}||	j|jj |	j f}| j!D ]&\}}|"|t#|j|g| f q$|||f}| jD ]"\}}||vr\t|j|| q\n
|\}}}|$ D ].\}\}}t%|||t&| }t|j|| q|d ur
|\}}}}t%|||t'}||j_||j_t%|||t'|j_ |D ]"\}}t(||}t|j|| q|| j	krT|sTd|| j	 d fS | js| js| j!sd|t)d| j	| fS d|dfS d S )Nr+   r   TFr'   r(   angle)ZxposZyposZxanchorZyanchorxaroundyaroundxanchoraroundyanchoraround	clockwiseih  counterclockwiser   r   )*r    r   r#   getr   r^   r   r   r   r   r   r   atl_one_framer\   r6   r   ZTransformStater   r   rx   setattr
last_angleZdiffr   r   automatic_polar_motionr  r   r  r  r  r  radiusr   r   rK   r   rB   r   r3   rO   r[   )re   r   r   r   r   r   Zst_or_atZforce_framecompleteZnewtsZ	has_angler   r>   Zlinearr   r   Zrevdirr   rD   Z
startangleZendangleZstartradiusZ	endradiusr  r%   r  oldnewr   r  r   r   r   r     s    
$
"








 




zInterpolation.executer"   rq   rr   rf   r   r   r   r   r   r   r     s   r   c                       s,   e Zd Z fddZdd Zdd Z  ZS )	RawRepeatc                    s   t t| | || _d S r!   )r   r   rf   r   re   r   r   r   r   r   rf   ;  s    zRawRepeat.__init__c                 C   s.   t | j | j}|d ur"||}t| j|S r!   )r   r   r   rk   Repeat)re   r   r   r   r   r   r`   A  s
    

zRawRepeat.compilec                 C   s   | | j| _d S r!   )r  r   r_   r   r   r   r   r   L  s    zRawRepeat.mark_constantr  r   r   r   r   r   9  s   r   c                       s$   e Zd Z fddZdd Z  ZS )r"  c                    s   t t| | || _d S r!   )r   r"  rf   r   r!  r   r   r   rf   R  s    zRepeat.__init__c                 C   s   d| j |fdfS )Nr   r   )r   r   r   r   r   r   X  s    zRepeat.executer  r   r   r   r   r"  P  s   r"  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	RawParallelc                    s   t t| | |g| _d S r!   )r   r#  rf   blocks)re   r   rv   r   r   r   rf   `  s    zRawParallel.__init__c                    s   t | j fdd| jD S )Nc                    s   g | ]}|  qS r   r   rP   r   r   r   r   f  rG   z'RawParallel.compile.<locals>.<listcomp>)Parallelr   r$  r   r   r   r   r`   e  s    zRawParallel.compilec                 C   s   | j D ]}|| qd S r!   )r$  r   r   r   r   r   r   h  s    
zRawParallel.predictc                 C   s0   t }| jD ]}|| t||j}q
|| _d S r!   )r   r$  r   r\   r_   r   r   r   r   r   l  s
    

zRawParallel.mark_constantr"   rq   rr   rf   r`   r   r   r   r   r   r   r   r#  ^  s   r#  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	r%  c                    s   t t| | || _d S r!   )r   r%  rf   r$  )re   r   r$  r   r   r   rf   x  s    zParallel.__init__c                 C   s    | j D ]}||r dS qdS r   )r$  r   r   r   r   r   r   |  s    

zParallel._handles_eventc                 C   s   t | j |d u r"dd | jD }g }g }g }|D ]r\}}	||||	|\}
}}|d urb|| |
dkrz|||f q2|
dkr|| q2|
dkr2|
||f  S q2|rd|t|fS dt|d fS d S )Nc                 S   s   g | ]}|d fqS r!   r   rP   r   r   r   r     rG   z$Parallel.execute.<locals>.<listcomp>r   r   r   )r    r   r$  r   r   r\   )re   r   r   r   r   leftZpausesZnewstaterD   Zistater   r   r+   r   r   r   r     s&    

zParallel.executec                 C   s   dd | j D S )Nc                 S   s   g | ]}|  D ]}|qqS r   r   r   r   r   r   r     rG   z"Parallel.visit.<locals>.<listcomp>)r$  r   r   r   r   r     s    zParallel.visitr   r   r   r   r   r%  v  s   #r%  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )		RawChoicec                    s    t t| | ||fg| _d S r!   )r   r(  rf   choices)re   r   chancerv   r   r   r   rf     s    zRawChoice.__init__c                    s&   t | j t| j fdd| jD S )Nc                    s$   g | ]\}}  || fqS r   )rk   r`   )rC   r*  rv   r   r   r   r     rG   z%RawChoice.compile.<locals>.<listcomp>)r   r   Choicer)  r   r   r   r   r`     s    
zRawChoice.compilec                 C   s   | j D ]\}}|| qd S r!   )r)  r   )re   r   _irE   r   r   r   r     s    zRawChoice.predictc                 C   s4   t }| jD ]\}}|| t||j}q
|| _d S r!   )r   r)  r   r\   r_   )re   r   r_   Z_chancerv   r   r   r   r     s
    
zRawChoice.mark_constantr&  r   r   r   r   r(    s   r(  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	r+  c                    s   t t| | || _d S r!   )r   r+  rf   r)  )re   r   r)  r   r   r   rf     s    zChoice.__init__c                 C   s$   | j D ]}|d |r dS qdS )NrS   TF)r)  r   r   r   r   r   r     s    
zChoice._handles_eventc                 C   s   t | j d }|d u rhd}| jD ]\}}||7 }q td|}| jD ]\}}||k rX qb||8 }qDd }	n|\}}	||||	|\}
}}|
dkrd||f|fS |
|d fS d S )Nr   r   )r    r   r)  randomuniformr   )re   r   r   r   r   choicetotalr*  ncstater   r   r+   r   r   r   r     s"    


zChoice.executec                 C   s   dd | j D S )Nc                 S   s"   g | ]}|d    D ]}|qqS )rS   r   r   r   r   r   r     rG   z Choice.visit.<locals>.<listcomp>)r)  r   r   r   r   r     s    zChoice.visitr   r   r   r   r   r+    s    r+  c                       s,   e Zd Z fddZdd Zdd Z  ZS )RawTimec                    s   t t| | || _d S r!   )r   r3  rf   r   re   r   r   r   r   r   rf     s    zRawTime.__init__c                 C   s   t | j t| j|| jS r!   )r   r   r   rk   r   r   r   r   r   r`     s    
zRawTime.compilec                 C   s   | | j| _d S r!   )r  r   r_   r   r   r   r   r     s    zRawTime.mark_constantr  r   r   r   r   r3    s   r3  c                       s$   e Zd Z fddZdd Z  ZS )r   c                    s   t t| | || _d S r!   )r   r   rf   r   r4  r   r   r   rf     s    zTime.__init__c                 C   s   dS )N)r   NNr   r   r   r   r   r     s    zTime.executer  r   r   r   r   r     s   r   c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	RawOnc                    s.   t t| | i | _|D ]}|| j|< qd S r!   )r   r5  rf   handlers)re   r   namesrv   rD   r   r   r   rf     s    zRawOn.__init__c                 C   s<   t | j i }| j D ]\}}||||< qt| j|S r!   )r   r   r6  r   r`   On)re   r   r6  r   r>   r   r   r   r`   "  s
    
zRawOn.compilec                 C   s   | j  D ]}|| q
d S r!   )r6  r  r   r   r   r   r   r   ,  s    zRawOn.predictc                 C   s4   t }| j D ]}|| t||j}q|| _d S r!   )r   r6  r  r   r\   r_   )re   r   r_   rv   r   r   r   r   0  s
    
zRawOn.mark_constantr&  r   r   r   r   r5    s   
r5  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	r8  c                    s   t t| | || _d S r!   )r   r8  rf   r6  )re   r   r6  r   r   r   rf   <  s    zOn.__init__c                 C   s   || j v rdS dS d S r   )r6  r   r   r   r   r   A  s    
zOn._handles_eventc                 C   s  t | j |d u r$d|d   }}}n
|\}}}|D ]V}|rV|| jv rFqV|dd }q6|s\q2|dkrj|jpv|dkov|j}	|	s2|}|}d }q2|| jvrd|||fd fS | j| ||| ||\}
}}|
dkr|dks|dkrd|_d|_d|||f|fS |
dkr:|d	ks |dks |dkr&d }nd	}|| }d }qq|
d
kr|\}}|| jv rnt	|| |d }d }qd
||fd fS qd S )Nr   _rQ   r   r   r   Fr   defaultr      )
r    r   r6  	partitionr   r   r   Zhide_responseZreplaced_responser[   )re   r   r   r   r   r%   r   r2  r   Z
lock_eventr   r   r+   r   r   r   r   G  sL    



 
z
On.executec                 C   s   dd | j  D S )Nc                 S   s   g | ]}|  D ]}|qqS r   r   r   r   r   r   r     rG   zOn.visit.<locals>.<listcomp>)r6  r  r   r   r   r   r     s    zOn.visitr   r   r   r   r   r8  :  s   Lr8  c                       s,   e Zd Z fddZdd Zdd Z  ZS )RawEventc                    s   t t| | || _d S r!   )r   r=  rf   r%   re   r   r%   r   r   r   rf     s    zRawEvent.__init__c                 C   s   t | j| jS r!   )Eventr   r%   r   r   r   r   r`     s    zRawEvent.compilec                 C   s
   t | _d S r!   )r   r_   r   r   r   r   r     s    zRawEvent.mark_constantr  r   r   r   r   r=    s   r=  c                       s$   e Zd Z fddZdd Z  ZS )r?  c                    s   t t| | || _d S r!   )r   r?  rf   r%   r>  r   r   r   rf     s    zEvent.__init__c                 C   s   d| j |fd fS )Nr   )r%   r   r   r   r   r     s    zEvent.executer  r   r   r   r   r?    s   r?  c                       s,   e Zd Z fddZdd Zdd Z  ZS )RawFunctionc                    s   t t| | || _d S r!   )r   r@  rf   rj   r  r   r   r   rf     s    zRawFunction.__init__c                 C   s   t | j t| j|| jS r!   )r   r   Functionrk   rj   r   r   r   r   r`     s    
zRawFunction.compilec                 C   s   | | j| _d S r!   )r  rj   r_   r   r   r   r   r     s    zRawFunction.mark_constantr  r   r   r   r   r@    s   r@  c                       s,   e Zd Z fddZdd Zdd Z  ZS )rA  c                    s   t t| | || _d S r!   )r   rA  rf   function)re   r   rB  r   r   r   rf     s    zFunction.__init__c                 C   s   dS )NTr   r   r   r   r   r     s    zFunction._handles_eventc                 C   sl   |p
t jj}| ||r|nd|j}|sD|d urDd}| |||j}|d urVdd|fS d|r`dn|d fS d S )Nr   Tr   r   )r   r   atl_function_always_blocksrB  r   )re   r   r   r   r   rv   frr   r   r   r     s    
zFunction.execute)r"   rq   rr   rf   r   r   r   r   r   r   r   rA    s   rA  c                 C   s  |    |  }g }d}| js|  }| drN|  }|t|| n6| dr| d |   | 	d t
|  }|| n| dr|  }|r| d |t|| n8| d |   | 	d t
|  }|t|| n| drD| d |   | 	d t
|  }|t|| n@| dr|  }|sbd	}| d |   | 	d t
|  }|t||| n| d
r(| | jg}	| dr|  }
|
d u rܐq|	|
 q| d |   | 	d
 t
|  }|t||	| n\| dr^| | j}| d |t|| n&| dr| | j}| d |t|| n| dr| | j}
| d |t||
 n| dr| d |d  n| dr| d d}nxtj|}d}d}|  }|  }|tv rL| | j}d }n>|dkrtd }| | j}| | j}n| | d }d }d}|||| | }d}|d ur|s|dr|  |	d d}|  }|   |d |r| r|   |d |}d}|dr&q|dr@| d q|drZ| d q|dr| | j}|!| q| }| }|t"v s|r|#dr||j}g }|dr|||j q|r|| |$|| n|%|| q|| | }|s(qj|r8|&d d}|drV||j}nd }|'|| q|sz| d || |  r|    q| dd qg }d }|D ]}t(|trt(|tr|j)*|j) qnt(|trt(|tr|j+*|j+ qnjt(|tr:t(|tr:|j,*|j, qn>t(|trft(|trf|j-.|j- qn|d u rx|}q|| |}qt/|||S )NFr   rv   :containszcontains expressionZparallelr/  z1.0on,r   rB  r   passr   Twarpr   ZATLr  r  r   Zu_ZknotzwATL statement contains two expressions in a row; is one of them a misspelled property? If not, separate them with pass.withzcomma or end of line)0ZadvanceZget_locationZeobkeywordZsimple_expressionr   r   ZrequireZ
expect_eolZexpect_block	parse_atlZsubblock_lexerZexpect_noblockr  r	  r#  r(  Zwordmatchr5  r3  r@  r=  r   r^   r   
checkpointr%   r#   revertr   Zeolr   r   r   
startswithr   r   errorr   r9   r$  r   r)  r   r6  updater   )lZ	block_locr   r   r   r   rv   rj   r*  r7  r%   r   ZrmZlast_expressionZthis_expressionZcpr   r   r   llZ	has_blockZpropZknotsZ	with_exprZmergedr  r  r   r   r   rM    sH   



















	
















rM  )I
__future__r   r   r   r   r   renpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   r-  r   renpy.pyanalysisr   r   r   r   r    r#   r&   r+   r,   objectSentinelr-   r0   r2   r4   r7   r<   r   rA   rB   rO   rX   r]   ra   rb   Objectrs   r   r   r   r   r   r  r	  r   r   r   r"  r#  r%  r(  r+  r3  r   r5  r8  r=  r?  r@  rA  rM  r   r   r   r   <module>   sp   8	

		(7  ]!-H  #"& (76"_