a
    V$c                     @   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filenumber r   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    r1   c                 C   s   | d u r| S t | S r"   )boolr/   r   r   r   bool_or_noneL   s    r3   c                 C   s   | d u r| S t | S r"   )floatr/   r   r   r   float_or_noneR   s    r5   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   r8   X   s
    r8   c                 C   s(   t | tjjjtjjjtfr | S t| S r"   )	
isinstancer   gl2gl2mesh2Mesh2gl2mesh3Mesh3tupler2   r/   r   r   r   mesha   s    rA   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
    rF   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jrE   r*   r   r   	<genexpr>       zinterpolate.<locals>.<genexpr>originr   )r:   r2   r   r   r7   r8   r9   r@   lenzipr6   getattrrM   rF   )r+   arD   rB   a_originrvr   r*   r   rG   {   s$    


rG   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rH   rI   r*   r   r   rK      rL   z%interpolate_spline.<locals>.<genexpr>r      r(            r)   )
r:   r@   rO   rN   listr4   intget_catmull_rom_valuerF   r.   )
r+   splinet_prS   t_ppt2t_pppt3inner_spline_countsectorr   r*   r   rU      s<    (2 rU   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(   rW   rY   rX      rZ   )r4   maxminrB   )r+   p_1p0p1p2r   r   r   r^      s    r^   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)rI   r   r   r   compile_all   s    
rr   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)selfru   r   r   r   __init__   s    zContext.__init__c                 C   s   t jj|| jdS )N)locals)r   pythonpy_evalru   )rv   exprr   r   r   eval  s    zContext.evalc                 C   s   t |tsdS | j|jkS NF)r:   rs   ru   rv   otherr   r   r   __eq__  s    
zContext.__eq__c                 C   s
   | |k S r"   r   r~   r   r   r   __ne__  s    zContext.__ne__N)r#   
__module____qualname__rw   r|   r   r   r   r   r   r   rs      s   rs   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   )r   
parametersro   rs   ru   blockpredict_block
properties	atl_statedonetransform_eventlast_transform_eventlast_child_transform_event	raw_childr   r   configatl_start_on_showatl_st_offsetr   
init_phasern   append)rv   ro   ru   r   r   r   r   rw     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)r   r   _handles_eventchildrv   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)r   r   r   r7   predict
predictingrv   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)superr   take_execution_stater   r   r:   ro   ru   	Exceptionr   r   r   r   r   stat	st_offset	at_offsetr   r   r7   motionnull_duplicatable
_duplicater   )rv   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)ro   r   styleru   r   r   )popru   copyr   r   ry   rz   r\   
positionalr   itemsremover   rP   r   astParameterInfor7   r   ATLTransformro   	style_argr   
take_state)rv   argskwargsr   ru   krC   r   r   r&   valuer   rS   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   rY   Nc                 s   s"   | ]}t |to|jd kV  qdS )r   N)r:   Interpolationduration)rH   	statementr   r   r   rK     s   z+ATLTransformBase.compile.<locals>.<genexpr>)ro   rp   r   r   r   ru   r   r   r   r   r   r   r   r   compiled_blockrq   all
statementsextendr7   r   r   r   )rv   rp   pold_exception_infor   interpr   r   r   rq     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)r   r   rq   hide_requestr   replaced_requestr   r   atl_multiple_eventsr   r   r   r   repeat_transform_eventsr   r   r   ro   	animationexecuter   r7   r   r   )rv   transr   r   r   eventsr   timebaseactionargr,   r   r   r   r   "  sH    



zATLTransformBase.executec                 C   s   | j | j d S r"   )ro   r   ru   r   r   r   r   predict_one_  s    zATLTransformBase.predict_onec                 C   s&   |   }|d u r|  }| j|  S r"   )r   rq   childrenvisit)rv   r   r   r   r   r   b  s    zATLTransformBase.visit)r#   r   r   r   r   EMPTY_PARAMETERSr   r   r   r   nosaverw   r   r   r   r   rq   r   r   r   __classcell__r   r   r   r   r     s   ;0I6=r   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   rw   r   rv   r   r   r   r   rw   r  s    zRawStatement.__init__c                 C   s   t dd S )NzCompile not implemented.r   rv   ctxr   r   r   rq   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   rp   rv   analysisr   r   r   mark_constant  s    zRawStatement.mark_constant)	r#   r   r   rp   rw   rq   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   rw   r   r   r   r   r   rw     s    zStatement.__init__c                 C   s   t dd S )NzNot implemented.r   rv   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 r}   r   r   r   r   r   r     s    zStatement._handles_event)r#   r   r   rw   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   rw   r   r   )rv   r   r   r   r   r   r   rw     s    zRawBlock.__init__c                    s*   t | j  fdd| jD }t| j|S )Nc                    s   g | ]}|  qS r   rq   rV   r   r   r   
<listcomp>  rL   z$RawBlock.compile.<locals>.<listcomp>)r    r   r   Block)rv   r   r   r   r   r   rq     s    
zRawBlock.compilec                 C   s   | j D ]}|| qd S r"   )r   r   rv   r   rI   r   r   r   r     s    
zRawBlock.predictc                 C   s:   t d }|d ur|| | | | jtkr6|   d S r"   )r   r   r   rp   r   compile_block)rv   r   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   rq   rs   RuntimeErrorr   r   rp   r   )rv   r   r   r   r   r   r     s    zRawBlock.compile_blockc                 C   s0   t }| jD ]}|| t||j}q
|| _d S r"   )r   r   r   ri   rp   rv   r   rp   rI   r   r   r   r     s
    

zRawBlock.mark_constant)N)r#   r   r   r   r   rw   rq   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 )NrY   )r   r   rw   r   times	enumerater:   Timer   timesort)rv   r   r   rI   sr   r   r   rw     s    
zBlock.__init__c                 C   s    | j D ]}||r dS qdS NTF)r   r   rv   r   rI   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   rY   repeatz&ATL appears to be in an infinite loop.)
r!   r   r   ri   rN   r   r   r   r]   r   )rv   r   r   r   r   indexstart
loop_startrepeatsr   child_stater   r   r,   r   tindextarget	max_pausestmtcountloop_endr   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   rH   rI   rJ   r   r   r   r     rL   zBlock.visit.<locals>.<listcomp>)r   r   r   r   r   r     s    zBlock.visitr#   r   r   rw   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	  rw   warperr   r   expressionssplines
revolutioncirclesr   r   r   r   rw     s    zRawMultipurpose.__init__c                 C   s   || _ || _|| _d S r"   )r  r   warp_function)rv   r&   r   r  r   r   r   
add_warper  s    zRawMultipurpose.add_warperc                 C   s   | j ||f d S r"   )r   r   rv   r&   exprsr   r   r   add_property  s    zRawMultipurpose.add_propertyc                 C   s   | j ||f d S r"   )r  r   )rv   r{   with_clauser   r   r   add_expression  s    zRawMultipurpose.add_expressionc                 C   s
   || _ d S r"   )r  )rv   r  r   r   r   add_revolution  s    zRawMultipurpose.add_revolutionc                 C   s
   || _ d S r"   )r  )rv   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 )NrY   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   )r|   rV   r   r   r   r     rL   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  r   r  rN   r  r|   r:   r]   r4   r   r   easydisplayabler   r   rq   r   Childr$   r   
PROPERTIESr   r   r   r  r  )rv   r   r{   withexprr   
transitionr  r   r&   r   r  r  values_withr   r  r   r   r   rq     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_exprri   r  r   r  r   r  r  rp   )rv   r   rp   r"  _namer{   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  r|   r   r:   r   ro   r   r   r  )rv   r   rI   _jr   r   r   r   #  s    

zRawMultipurpose.predict)r#   r   r   r  rw   r  r  r  r  r  r  rq   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%  rw   
expressionrv   r   r{   r   r   r   rw   :  s    zRawContainsExpr.__init__c                 C   s$   t | j || j}t| j|d S r"   )r    r   r|   r&  r  )rv   r   r   r   r   r   rq   @  s    
zRawContainsExpr.compilec                 C   s   | | j| _d S r"   )r"  r&  rp   r   r   r   r   r   E  s    zRawContainsExpr.mark_constantr#   r   r   rw   rq   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)  rw   r   )rv   r   r   r   r   r   rw   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 )Nrt   fixed)layout)r   r   r   r7   r   r   ru   r+  MultiBoxaddr  r   )rv   r   r   rI   boxr   r   r   rq   R  s    
zRawChild.compilec                 C   s0   t }| jD ]}|| t||j}q
|| _d S r"   )r   r   r   ri   rp   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  rw   r   r  )rv   r   r   r  r   r   r   rw   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)	duplicater   )r!   r   r   r   r   r   r   _uniquer   r7   r   r   r  	set_child)rv   r   r   r   r   	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#   r   r   rw   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   rw   r  r   r   r  r  r  )rv   r   r  r   r   r  r  r  r   r   r   rw     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)xposyposxanchoryanchorxaroundyaroundxanchoraroundyanchoraround	clockwiseih  counterclockwiser   r   )*r!   r   r$   getr  ro   r   r   r   r   r   r   atl_one_frameri   r7   r   TransformStater   r   r   setattr
last_anglediffr  r  automatic_polar_motionr9  r   r:  r;  r<  r4  radiusr  r   rP   r   rG   r  r4   rU   rh   )rv   r   r   r   r   r  st_or_atforce_framecompletenewts	has_angler   rC   linearr  r  revdirr  rI   
startangleendanglestartradius	endradiusrC  r&   r   oldnewr   r4  r   r   r   r     s    
$
"








 




zInterpolation.executer#   r   r   rw   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   rU  rw   r   rv   r   r   r   r   r   rw   ;  s    zRawRepeat.__init__c                 C   s.   t | j | j}|d ur"||}t| j|S r"   )r    r   r   r|   Repeat)rv   r   r   r   r   r   rq   A  s
    

zRawRepeat.compilec                 C   s   | | j| _d S r"   )r"  r   rp   r   r   r   r   r   L  s    zRawRepeat.mark_constantr(  r   r   r   r   rU  9  s   rU  c                       s$   e Zd Z fddZdd Z  ZS )rW  c                    s   t t| | || _d S r"   )r   rW  rw   r   rV  r   r   r   rw   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.executerT  r   r   r   r   rW  P  s   rW  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   rX  rw   blocks)rv   r   r   r   r   r   rw   `  s    zRawParallel.__init__c                    s   t | j fdd| jD S )Nc                    s   g | ]}|  qS r   r   rV   r   r   r   r   f  rL   z'RawParallel.compile.<locals>.<listcomp>)Parallelr   rY  r   r   r   r   rq   e  s    zRawParallel.compilec                 C   s   | j D ]}|| qd S r"   )rY  r   r   r   r   r   r   h  s    
zRawParallel.predictc                 C   s0   t }| jD ]}|| t||j}q
|| _d S r"   )r   rY  r   ri   rp   r   r   r   r   r   l  s
    

zRawParallel.mark_constantr#   r   r   rw   rq   r   r   r   r   r   r   r   rX  ^  s   rX  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	rZ  c                    s   t t| | || _d S r"   )r   rZ  rw   rY  )rv   r   rY  r   r   r   rw   x  s    zParallel.__init__c                 C   s    | j D ]}||r dS qdS r   )rY  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   rV   r   r   r   r     rL   z$Parallel.execute.<locals>.<listcomp>r   r   r   )r!   r   rY  r   r   ri   )rv   r   r   r   r   leftpausesnewstaterI   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     rL   z"Parallel.visit.<locals>.<listcomp>)rY  r   r   r   r   r     s    zParallel.visitr  r   r   r   r   rZ  v  s   #rZ  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`  rw   choices)rv   r   chancer   r   r   r   rw     s    zRawChoice.__init__c                    s&   t | j t| j fdd| jD S )Nc                    s$   g | ]\}}  || fqS r   )r|   rq   )rH   rb  r   r   r   r   r     rL   z%RawChoice.compile.<locals>.<listcomp>)r    r   Choicera  r   r   r   r   rq     s    
zRawChoice.compilec                 C   s   | j D ]\}}|| qd S r"   )ra  r   )rv   r   _irJ   r   r   r   r     s    zRawChoice.predictc                 C   s4   t }| jD ]\}}|| t||j}q
|| _d S r"   )r   ra  r   ri   rp   )rv   r   rp   _chancer   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 )	rc  c                    s   t t| | || _d S r"   )r   rc  rw   ra  )rv   r   ra  r   r   r   rw     s    zChoice.__init__c                 C   s$   | j D ]}|d |r dS qdS )NrY   TF)ra  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   ra  randomuniformr   )rv   r   r   r   r   choicetotalrb  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 )rY   r  r  r   r   r   r     rL   z Choice.visit.<locals>.<listcomp>)ra  r   r   r   r   r     s    zChoice.visitr  r   r   r   r   rc    s    rc  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   rl  rw   r   rv   r   r   r   r   r   rw     s    zRawTime.__init__c                 C   s   t | j t| j|| jS r"   )r    r   r   r|   r   r   r   r   r   rq     s    
zRawTime.compilec                 C   s   | | j| _d S r"   )r"  r   rp   r   r   r   r   r     s    zRawTime.mark_constantr(  r   r   r   r   rl    s   rl  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   rw   r   rm  r   r   r   rw     s    zTime.__init__c                 C   s   dS )N)r   NNr   r   r   r   r   r     s    zTime.executerT  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   rn  rw   handlers)rv   r   namesr   rI   r   r   r   rw     s    zRawOn.__init__c                 C   s<   t | j i }| j D ]\}}||||< qt| j|S r"   )r    r   ro  r   rq   On)rv   r   ro  r   rC   r   r   r   rq   "  s
    
zRawOn.compilec                 C   s   | j  D ]}|| q
d S r"   )ro  r   r   r   r   r   r   r   ,  s    zRawOn.predictc                 C   s4   t }| j D ]}|| t||j}q|| _d S r"   )r   ro  r   r   ri   rp   )rv   r   rp   r   r   r   r   r   0  s
    
zRawOn.mark_constantr[  r   r   r   r   rn    s   
rn  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	rq  c                    s   t t| | || _d S r"   )r   rq  rw   ro  )rv   r   ro  r   r   r   rw   <  s    zOn.__init__c                 C   s   || j v rdS dS d S r   )ro  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   _rW   r   r   r   Fr   defaultr      )
r!   r   ro  	partitionr   r   r   hide_responsereplaced_responserh   )rv   r   r   r   r   r&   r   rk  r   
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     rL   zOn.visit.<locals>.<listcomp>)ro  r   r   r   r   r   r     s    zOn.visitr  r   r   r   r   rq  :  s   Lrq  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   ry  rw   r&   rv   r   r&   r   r   r   rw     s    zRawEvent.__init__c                 C   s   t | j| jS r"   )Eventr   r&   r   r   r   r   rq     s    zRawEvent.compilec                 C   s
   t | _d S r"   )r   rp   r   r   r   r   r     s    zRawEvent.mark_constantr(  r   r   r   r   ry    s   ry  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{  rw   r&   rz  r   r   r   rw     s    zEvent.__init__c                 C   s   d| j |fd fS )Nr   )r&   r   r   r   r   r     s    zEvent.executerT  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|  rw   r{   r'  r   r   r   rw     s    zRawFunction.__init__c                 C   s   t | j t| j|| jS r"   )r    r   Functionr|   r{   r   r   r   r   rq     s    
zRawFunction.compilec                 C   s   | | j| _d S r"   )r"  r{   rp   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 )r}  c                    s   t t| | || _d S r"   )r   r}  rw   function)rv   r   r~  r   r   r   rw     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_blocksr~  r   )rv   r   r   r   r   r   frr   r   r   r     s    
zFunction.execute)r#   r   r   rw   r   r   r   r   r   r   r   r}    s   r}  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   r   :containszcontains expressionparallelrh  z1.0on,r   r~  r   passr   Twarpr
  ATLr=  r>  r  u_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)0advanceget_locationeobkeywordsimple_expressionr   rU  require
expect_eolexpect_block	parse_atlsubblock_lexerexpect_noblockr%  r)  rX  r`  wordmatchrn  rl  r|  ry  r   ro   r	  
checkpointr&   r$   revertr  eolr  r  r  
startswithr  r  errorr  r:   rY  r   ra  r   ro  updater   )l	block_locr   r   r   r   r   r{   rb  rp  r&   r   rmlast_expressionthis_expressioncpr  r   r  ll	has_blockpropknots	with_exprmergedrR  rS  r   r   r   r    sH   



















	
















r  )I
__future__r   r   r   r   r   renpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   rf  r   renpy.pyanalysisr   r   r   r    r!   r$   r'   r,   r-   objectSentinelr.   r1   r3   r5   r8   rA   r  rF   rG   rU   r^   rn   rr   rs   Objectr   r   r   r   r   r	  r%  r)  r  r   rU  rW  rX  rZ  r`  rc  rl  r   rn  rq  ry  r{  r|  r}  r  r   r   r   r   <module>   sp   8	

		(7  ]!-H  #"& (76"_