§
    ºÀjù'  ã                  ó  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZmZmZmZmZ ddlZddlmZmZmZmZmZ  G d„ d¦  «        Z G d„ d	¦  «        Z G d
„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )u  
Tier 3: Cross-Feature Combinations â€” Pairwise System Interleaving.
Covers Tier 3 requirements from DISPATCH.md:
- Movement + skill casting (direction alignment & casting root)
- Dodging during boss telegraph (i-frame invulnerability vs slam damage)
- Inventory full during boss loot drop (ground persistence & warning message)
- Language switch during combat dialogue (in-place atomic re-render)
- Safe haven transition during active monster leash (leash-back & healing)
- Reconnection & 30Hz reconciliation mid-combo execution
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptionalÚTuple)ÚBACKPACK_CAPACITYÚDODGE_BOOSTÚDODGE_IFRAME_DURATIONÚSAFE_RADIUS_WAYPOINTÚSimulatedCocosPlayerc                  ó*   — e Zd ZdZd
d„Zd
d„Zd
d„Zd	S )Ú TestTier3MovementAndSkillCastingz7Tier 3: Movement + Skill Casting Pairwise Interactions.Úsimulated_playerr   ÚreturnÚNonec                óî  — |                      ddd¬¦  «         |j        }d}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}}d}|rd|_        d|_
        d|_        |j        }d}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}}d S )Nç      ð?ç        çü©ñÒMb�?)Údt)ú>)z)%(py2)s
{%(py2)s = %(py0)s.vx
} > %(py5)sr   ©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7TÚattack_slash©ú==)z*%(py2)s
{%(py2)s = %(py0)s.vx
} == %(py5)s©z2%(py2)s
{%(py2)s = %(py0)s.anim_state
} == %(py5)s)Úapply_inputÚvxÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚvyÚ
anim_state)Úselfr   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8Ú
is_castings           úNC:\Projects\FreeExile\tests\e2e_cocos\test_tier3_cross_feature_combinations.pyÚ,test_t3_movement_halted_during_skill_channelzMTestTier3MovementAndSkillCasting.test_t3_movement_halted_during_skill_channel   sô  € à×$Ò$ S¨#°%Ð$Ñ8Ô8Ð8ØÔ"Ð( SÐ(Ð" SÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð" SÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ÐÑ(Ô(Ð(Õ(Ô(ÐÑ(Ô(Ð(Ð(Õ(Ô(Ð"Ñ(Ô(Õ(Ô( SÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(àˆ
Øð 	9Ø"%ÐÔØ"%ÐÔØ*8ÐÔ'ØÔ"Ð) cÐ)Ð" cÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð" cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ÐÑ)Ô)Ð)Õ)Ô)ÐÑ)Ô)Ð)Ð)Õ)Ô)Ð"Ñ)Ô)Õ)Ô) cÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ØÔ*Ð<¨nÐ<Ð*¨nÒ<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð*¨nÐ<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<ÐÑ<Ô<Ð<Õ<Ô<ÐÑ<Ô<Ð<Ð<Õ<Ô<Ð*Ñ<Ô<Õ<Ô<¨nÑ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ó    c                óÎ  — d|_         d\  }}ddlm}  |||¦  «        |_         |j         }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }	t          t          j
        |	¦  «        ¦  «        ‚d x}x}}d S )NÚE)ç      ð¿r;   r   )Úresolve_heading_binÚNr    )z/%(py2)s
{%(py2)s = %(py0)s.heading
} == %(py5)sr   r   r   r   )ÚheadingÚtests.e2e_cocos.conftestr<   r%   r&   r'   r(   r)   r*   r+   r,   )
r/   r   Úskill_target_dxÚskill_target_dyr<   r0   r1   r2   r3   r4   s
             r6   Ú2test_t3_skill_targeting_overrides_facing_directionzSTestTier3MovementAndSkillCasting.test_t3_skill_targeting_overrides_facing_direction+   s&  € à#&ÐÔ à+5Ñ(ˆ˜à@Ð@Ð@Ð@Ð@Ð@Ø#6Ð#6°ÈÑ#XÔ#XÐÔ ØÔ'Ð.¨3Ð.Ð'¨3Ò.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð'¨3Ð.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.ÐÑ.Ô.Ð.Õ.Ô.ÐÑ.Ô.Ð.Ð.Õ.Ô.Ð'Ñ.Ô.Õ.Ô.¨3Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.r8   c                ó  — |                      ¦   «          d }|j        rd}d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}}| 
                    d¦  «         |j        }| }|sxd	d
t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚d x}}|}d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}}d S )NÚskill_slash_qr    ©z%(py0)s == %(py3)sÚbuffered_skill©r   Úpy3úassert %(py5)sr   g¤p=
×£Ð?ú1assert not %(py2)s
{%(py2)s = %(py0)s.is_iframe
}r   ©r   r   Úexecuted_skill)Útrigger_dodgeÚ	is_iframer%   r&   r'   r(   r)   r*   r+   r,   Úupdate_timers)	r/   r   rF   Ú@py_assert2r0   Ú@py_format4r3   r2   rL   s	            r6   Ú.test_t3_input_buffer_skill_queued_during_dodgezOTestTier3MovementAndSkillCasting.test_t3_input_buffer_skill_queued_during_dodge5   se  € Ø×&Ò&Ñ(Ô(Ð(ØˆàÔ%ð 	-Ø,ˆNØ!0Ð0ˆ~ Ò0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0ˆ~ Ð0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0ˆ~Ñ0Ô0Ð0Õ0Ô0ˆ~Ñ0Ô0Ð0Ð0Õ0Ô0 Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0à×&Ò& tÑ,Ô,Ð,Ø#Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-Ð#Ñ-Ô-Ð-Õ-Ô-Ð#Ñ-Ô-Ð-Ð-Õ-Ô-Ð-Ñ-Ô-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ø'ˆØ!0Ð0ˆ~ Ò0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0ˆ~ Ð0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0ˆ~Ñ0Ô0Ð0Õ0Ô0ˆ~Ñ0Ô0Ð0Ð0Õ0Ô0 Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0r8   N©r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r7   rB   rR   © r8   r6   r   r      sV   € € € € € ØAÐAð=ð =ð =ð =ð/ð /ð /ð /ð1ð 1ð 1ð 1ð 1ð 1r8   r   c                  ó*   — e Zd ZdZd
d„Zd
d„Zd
d„Zd	S )Ú!TestTier3DodgeDuringBossTelegraphz-Tier 3: Dodging During Boss Attack Telegraph.r   r   r   r   c                ó  — d}|                      ¦   «          |j        }|sxddt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚d }|j        rdn|}d}||k    }|s—t	          j	        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}}|j
        }d}	||	k    }
|
sªt	          j	        d|
fd||	f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        t	          j        |	¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}
}	d S )Nç     €a@z-assert %(py2)s
{%(py2)s = %(py0)s.is_iframe
}r   rK   r   r    rE   Úapplied_damagerG   rI   r   g      Y@©z2%(py2)s
{%(py2)s = %(py0)s.current_hp
} == %(py5)sr   r   r   )rM   rN   r'   r(   r%   r)   r*   r+   r,   r&   Ú
current_hp)r/   r   Úboss_slam_damager0   Ú@py_format3r]   rP   rQ   r3   r1   r2   r4   s               r6   Ú-test_t3_dodge_iframe_negates_boss_slam_damagezOTestTier3DodgeDuringBossTelegraph.test_t3_dodge_iframe_negates_boss_slam_damageF   sa  € Ø Ðà×&Ò&Ñ(Ô(Ð(ØÔ)Ð)Ð)Ð)Ð)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ÐÑ)Ô)Ð)Õ)Ô)ÐÑ)Ô)Ð)Ð)Õ)Ô)Ð)Ñ)Ô)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)à 0Ô :ÐP˜˜Ð@PˆØ!$Ð$ˆ~ Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ~ Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆ~Ñ$Ô$Ð$Õ$Ô$ˆ~Ñ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$ØÔ*Ð3¨eÐ3Ð*¨eÒ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð*¨eÐ3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ÐÑ3Ô3Ð3Õ3Ô3ÐÑ3Ô3Ð3Ð3Õ3Ô3Ð*Ñ3Ô3Õ3Ô3¨eÑ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3r8   c                óx  — d}|                      ¦   «          |                     d¦  «         |j        }| }|sxddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚d x}}|j        rdn|}|xj
        |z  c_
        d}||k    }|s—t          j        d|fd||f¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}}|j
        }d}	|	 }
||
k    }|sªt          j        d|fd||
f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}	}
d S )Nr\   gìQ¸…ëÑ?rJ   r   rK   r   r    rE   r]   rG   rI   r   g      D@)z3%(py2)s
{%(py2)s = %(py0)s.current_hp
} == -%(py5)sr   zassert %(py8)sÚpy8)rM   rO   rN   r'   r(   r%   r)   r*   r+   r,   r_   r&   )r/   r   r`   r0   r2   rQ   r]   rP   r3   r1   Ú@py_assert6Ú@py_format7Ú@py_format9s                r6   Ú=test_t3_premature_dodge_takes_full_damage_after_iframe_expiryz_TestTier3DodgeDuringBossTelegraph.test_t3_premature_dodge_takes_full_damage_after_iframe_expiryP   s§  € ð !ÐØ×&Ò&Ñ(Ô(Ð(à×&Ò& tÑ,Ô,Ð,Ø#Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-Ð#Ñ-Ô-Ð-Õ-Ô-Ð#Ñ-Ô-Ð-Ð-Õ-Ô-Ð-Ñ-Ô-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-à 0Ô :ÐP˜˜Ð@PˆØÐ#Ô# ~Ñ5Ð#Ô#Ø!&Ð&ˆ~ Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ~ Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ~Ñ&Ô&Ð&Õ&Ô&ˆ~Ñ&Ô&Ð&Ð&Õ&Ô& Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&ØÔ*Ð3¨tÐ3¨t¨eÐ3Ð*¨eÒ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð*¨eÐ3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ÐÑ3Ô3Ð3Õ3Ô3ÐÑ3Ô3Ð3Ð3Õ3Ô3Ð*Ñ3Ô3Õ3Ô3¨tÑ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3r8   c                óè   — |                      ¦   «          dddœ}d}|dk    rd|d<   |d         }| }|s:ddt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d S )	NTÚcircle)ÚactiveÚtyper   Frk   zassert not %(py1)sÚpy1)rM   r%   r*   r+   r,   )r/   r   Ú	telegraphÚ
boss_poiseÚ@py_assert0rP   ra   s          r6   Ú0test_t3_boss_stagger_cancels_telegraph_mid_dodgezRTestTier3DodgeDuringBossTelegraph.test_t3_boss_stagger_cancels_telegraph_mid_dodge^   sž   € Ø×&Ò&Ñ(Ô(Ð(Ø#¨XÐ6Ð6ˆ	àˆ
Ø˜Š?ˆ?Ø"'ˆI�hÑØ˜XÔ&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ñ&Ô&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r8   NrS   )rT   rU   rV   rW   rb   rh   rq   rX   r8   r6   rZ   rZ   C   sV   € € € € € Ø7Ð7ð4ð 4ð 4ð 4ð4ð 4ð 4ð 4ð'ð 'ð 'ð 'ð 'ð 'r8   rZ   c                  ó*   — e Zd ZdZd
d„Zd
d„Zd
d„Zd	S )Ú(TestTier3InventoryFullDuringBossLootDropz-Tier 3: Inventory Full During Boss Loot Drop.r   r   r   r   c                óú  — t          t          ¦  «        D ]}|                     dd|› �i¦  «         Œdddœ}|                     |¦  «        \  }}|sd|d<   |d         }d}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        d	œz  }	d
d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d x}x}}d}||u }|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d S )NÚidÚitem_Úblood_reaper_scytheT)ru   Ú	on_groundrx   ©Úis©z%(py1)s is %(py4)s©rm   Úpy4úassert %(py6)sÚpy6F©z%(py0)s is %(py3)sÚsuccessrG   rI   r   )Úranger	   Úadd_to_inventoryr%   r&   r*   r+   r,   r'   r(   r)   )r/   r   ÚiÚ	boss_dropr�   Ú_rp   r2   rP   Ú@py_format5rf   r0   rQ   r3   s                 r6   Ú2test_t3_loot_remains_on_ground_when_inventory_fullz[TestTier3InventoryFullDuringBossLootDrop.test_t3_loot_remains_on_ground_when_inventory_fullk   så  € åÕ(Ñ)Ô)ð 	Cð 	CˆAØ×-Ò-¨t°[¸Q°[°[Ð.AÑBÔBÐBÐBà0¸tÐDÐDˆ	à%×6Ò6°yÑAÔA‰
ˆ�Øð 	*Ø%)ˆI�kÑ"Ø˜Ô%Ð-¨Ð-Ð%¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð%¨Ð-Ñ-Ô-Õ-Ô-Ð%Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÐˆw˜%ÐÐÐÐÕÔÐÐÐÐˆw˜%ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜%ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr8   c                óò  — t          t          ¦  «        D ]}|                     dd|› �i¦  «         Œ|                     ddi¦  «        \  }}d }|sd}d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }	t          t          j
        |	¦  «        ¦  «        ‚d x}}d S )Nru   rv   Ú
extra_dropu)   âš ï¸� TÃºi Ä‘á»“ sinh tá»“n Ä‘Ã£ Ä‘áº§y!r    rE   Úwarning_msgrG   rI   r   )r‚   r	   rƒ   r%   r&   r'   r(   r)   r*   r+   r,   )
r/   r   r„   r�   r†   r‹   rP   r0   rQ   r3   s
             r6   Ú(test_t3_warning_hud_notification_spawnedzQTestTier3InventoryFullDuringBossLootDrop.test_t3_warning_hud_notification_spawnedx   s8  € ÝÕ(Ñ)Ô)ð 	Cð 	CˆAØ×-Ò-¨t°[¸Q°[°[Ð.AÑBÔBÐBÐBØ%×6Ò6¸¸lÐ7KÑLÔL‰
ˆ�ØˆØð 	FØEˆKØIÐIˆ{ÐIÒIÐIÐIÐIÕIÔIÐIÐIÐIÐIˆ{ÐIÐIÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔIˆ{ÑIÔIÐIÕIÔIˆ{ÑIÔIÐIÐIÕIÔIÐIÑIÔIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIr8   c                ó@  — t          t          ¦  «        D ]}|                     dd|› �i¦  «         Œd |j        d<   |                     ddi¦  «        \  }}d}||u }|s—t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}}d}||k    }|s—t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}}d S )Nru   rv   é
   Úground_dropTry   r€   r�   rG   rI   r   r    rE   Úslot_idx)r‚   r	   rƒ   Ú	inventoryr%   r&   r'   r(   r)   r*   r+   r,   )	r/   r   r„   r�   r�   rP   r0   rQ   r3   s	            r6   Ú3test_t3_freeing_slot_allows_immediate_ground_pickupz\TestTier3InventoryFullDuringBossLootDrop.test_t3_freeing_slot_allows_immediate_ground_pickup�   sñ  € ÝÕ(Ñ)Ô)ð 	Cð 	CˆAØ×-Ò-¨t°[¸Q°[°[Ð.AÑBÔBÐBÐBà)-ÐÔ" 2Ñ&à,×=Ò=¸tÀ]Ð>SÑTÔTÑˆ�ØÐˆw˜$ˆÐÐÐÕÔÐÐÐÐˆw˜$ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆx˜2Š~ÐÐÐÕÔÐÐÐÐˆx˜2ÐÑÔÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔ˜2ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr8   NrS   )rT   rU   rV   rW   rˆ   rŒ   r’   rX   r8   r6   rs   rs   h   sZ   € € € € € Ø7Ð7ð ð  ð  ð  ðJð Jð Jð Jðð ð ð ð ð r8   rs   c                  ó*   — e Zd ZdZd
d„Zdd„Zd
d„Zd	S )Ú+TestTier3LanguageSwitchDuringCombatDialoguez8Tier 3: Language Switch During Active Combat & Dialogue.r   r   c                ó^  — dddddœ}ddiddidœ}d	|d
<   |d	         d         |d<   |d         }d}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}d S )NTu   Thiáº¿t TÆ°á»£ng Huyáº¿t Ä�á»“Úviu   RÃ¨n Cá»‘t Thiáº¿t)Úis_openÚspeakerÚlocaleÚtextÚforge_servicezBone Blacksmith Forge©r–   Úenr�   r™   rš   r—   ry   r{   r|   r~   r   r    )z%(py1)s == %(py4)s)r%   r&   r*   r+   r,   )r/   Údialogue_stateÚi18n_dbrp   r2   rP   r‡   rf   s           r6   Ú5test_t3_active_dialogue_modal_updates_labels_in_placezaTestTier3LanguageSwitchDuringCombatDialogue.test_t3_active_dialogue_modal_updates_labels_in_place�   sµ  € àØ7ØØ(ð	
ð 
ˆð #Ð$8Ð9Ø"Ð$;Ð<ð
ð 
ˆð
 $(ˆ�xÑ Ø!(¨¤¨Ô!?ˆ�vÑØ˜iÔ(Ð0¨DÐ0Ð(¨DÐ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð(¨DÐ0Ñ0Ô0Õ0Ô0Ð(Ñ0Ô0Õ0Ô0¨DÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ø˜fÔ%Ð@Ð)@Ð@Ð%Ð)@Ò@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð%Ð)@Ð@Ñ@Ô@Õ@Ô@Ð%Ñ@Ô@Õ@Ô@Ð)@Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r8   r   r   c                óš  — d|_         d}|j         }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}d S )	Nr   Tr    r"   r   r   r   r   )	r.   r%   r&   r'   r(   r)   r*   r+   r,   )r/   r   Úlocale_changedr0   r1   r2   r3   r4   s           r6   Ú8test_t3_language_switch_does_not_interrupt_skill_channelzdTestTier3LanguageSwitchDuringCombatDialogue.test_t3_language_switch_does_not_interrupt_skill_channel    sû   € ð '5ÐÔ#àˆàÔ*Ð<¨nÐ<Ð*¨nÒ<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð*¨nÐ<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<ÐÑ<Ô<Ð<Õ<Ô<ÐÑ<Ô<Ð<Ð<Õ<Ô<Ð*Ñ<Ô<Õ<Ô<¨nÑ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<r8   c                óÌ  — dddœ}d}||         }d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d}||         }d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d S )Nu   Báº O KÃ�CH!z	CRITICAL!rœ   r–   r    rE   Úlabel_renderedrG   rI   r   r�   )r%   r&   r'   r(   r)   r*   r+   r,   )r/   Údamage_crit_labelÚcurrent_localer¥   rP   r0   rQ   r3   s           r6   Ú>test_t3_floating_damage_text_renders_consistently_after_switchzjTestTier3LanguageSwitchDuringCombatDialogue.test_t3_floating_damage_text_renders_consistently_after_switch©   s¸  € Ø#1¸ÐEÐEÐØˆØ*¨>Ô:ˆØ!/Ð/ˆ~ Ò/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/ˆ~ Ð/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆ~Ñ/Ô/Ð/Õ/Ô/ˆ~Ñ/Ô/Ð/Ð/Õ/Ô/ Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/ØˆØ*¨>Ô:ˆØ!,Ð,ˆ~ Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,ˆ~ Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆ~Ñ,Ô,Ð,Õ,Ô,ˆ~Ñ,Ô,Ð,Ð,Õ,Ô, Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,r8   N©r   r   rS   )rT   rU   rV   rW   r    r£   r¨   rX   r8   r6   r”   r”   Œ   sZ   € € € € € ØBÐBðAð Að Að Að"=ð =ð =ð =ð-ð -ð -ð -ð -ð -r8   r”   c                  ó*   — e Zd ZdZd
d„Zdd„Zd
d„Zd	S )Ú.TestTier3SafeHavenTransitionDuringMonsterLeashz6Tier 3: Safe Haven Transition During Wilderness Leash.r   r   c                ó²  — d}d}ddddœ}t          j        |d         |d         z
  |d         |d         z
  ¦  «        }|t          k    r
d|d	<   d|d
<   |d	         }d}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}|d
         }d}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}d S )N©r   r   )g      @r   Ú
crawler_01TF)ru   ÚaggroÚ
is_leashedr   é   r¯   r°   ry   r{   r|   r~   r   ©ÚmathÚhypotr   r%   r&   r*   r+   r,   )
r/   Úwaypoint_posÚ
player_posÚmonsterÚ
dist_to_wprp   r2   rP   r‡   rf   s
             r6   Ú6test_t3_monster_leashes_when_player_enters_safe_radiuszeTestTier3SafeHavenTransitionDuringMonsterLeash.test_t3_monster_leashes_when_player_enters_safe_radius¶   sÁ  € Ø!ˆØˆ
Ø%°ÀEÐJÐJˆå”Z 
¨1¤°¸Q´Ñ ?ÀÈAÄÐQ]Ð^_ÔQ`ÑA`ÑaÔaˆ
ØÕ-Ò-Ð-Ø$ˆG�GÑØ$(ˆG�LÑ!à�wÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�|Ô$Ð,¨Ð,Ð$¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð$¨Ð,Ñ,Ô,Õ,Ô,Ð$Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,r8   r   r   c                óÆ  — d|_         |xj         |j        dz  z  c_         |j         }d}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}}d S )
Ng      I@g{®Gáz”?g      J@r    r^   r   r   r   r   )
r_   Úmax_hpr%   r&   r'   r(   r)   r*   r+   r,   )r/   r   r0   r1   r2   r3   r4   s          r6   Ú0test_t3_player_regenerates_health_in_safe_radiusz_TestTier3SafeHavenTransitionDuringMonsterLeash.test_t3_player_regenerates_health_in_safe_radiusÃ   s  € Ø&*ÐÔ#àÐ#Ô#Ð'7Ô'>ÀÑ'EÑEÐ#Ô#ØÔ*Ð2¨dÐ2Ð*¨dÒ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð*¨dÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ÐÑ2Ô2Ð2Õ2Ô2ÐÑ2Ô2Ð2Ð2Õ2Ô2Ð*Ñ2Ô2Õ2Ô2¨dÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2r8   c                ó‚  — ddddœ}d}d|d<   t          j        |d         |d         ¦  «        t          k    rd	|d
<   |d
         }d	}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}d S )Ng      !@r   T)ÚxÚyrk   r­   g      @r¾   r¿   Frk   ry   r{   r|   r~   r   r²   )r/   Ú
projectileÚwaypoint_centerrp   r2   rP   r‡   rf   s           r6   Ú;test_t3_hostile_projectile_dissipates_at_safe_zone_boundaryzjTestTier3SafeHavenTransitionDuringMonsterLeash.test_t3_hostile_projectile_dissipates_at_safe_zone_boundaryÉ   sø   € Ø S°DÐ9Ð9ˆ
Ø$ˆàˆ
�3‰ÝŒ:�j ”o z°#¤Ñ7Ô7Õ;OÒOÐOØ#(ˆJ�xÑ Ø˜(Ô#Ð, uÐ,Ð# uÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð# uÐ,Ñ,Ô,Õ,Ô,Ð#Ñ,Ô,Õ,Ô, uÑ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,r8   Nr©   rS   )rT   rU   rV   rW   r¹   r¼   rÂ   rX   r8   r6   r«   r«   ³   sV   € € € € € Ø@Ð@ð-ð -ð -ð -ð3ð 3ð 3ð 3ð-ð -ð -ð -ð -ð -r8   r«   c                  ó*   — e Zd ZdZd
d„Zd
d„Zd
d„Zd	S )Ú.TestTier3ReconnectionAndReconciliationMidComboz5Tier 3: Reconnection & 30Hz Reconciliation Mid-Combo.r   r   r   r   c                óR  — |                      ddd¦  «         |j        }|                      ddd¦  «         |j        }d}||z   }||k    }|sÕt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}}d S )Nr   r   r   r±   r    )z%(py0)s == (%(py2)s + %(py4)s)Úseq2Úseq1)r   r   r}   r   r   )
r#   Ú	input_seqr%   r&   r'   r(   r)   r*   r+   r,   )	r/   r   rÇ   rÆ   r2   Ú@py_assert5r0   r3   r4   s	            r6   Ú3test_t3_input_sequence_continuity_after_packet_dropzbTestTier3ReconnectionAndReconciliationMidCombo.test_t3_input_sequence_continuity_after_packet_dropÖ   sS  € Ø×$Ò$ S¨#¨uÑ5Ô5Ð5ØÔ)ˆà×$Ò$ S¨#¨uÑ5Ô5Ð5ØÔ)ˆØÐ�t˜a‘xÐˆt�xÒÐÐÐÕÔÐÐÐÐˆt�xÐÑÔÐÕÔÑÔÐÐÕÔˆtÑÔÐÕÔˆtÑÔÐÐÐÕÔÑÔÐÐÕÔ�tÑÔÐÕÔ�tÑÔÐÐÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐr8   c                óÊ  — d}d}d}t          ||z
  ¦  «        }d}||k     }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}}d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}}d S )Né   g      $@gÍÌÌÌÌL$@g       @)ú<)z%(py0)s < %(py3)sÚerrorrG   rI   r   r    rE   Ú
combo_step)	Úabsr%   r&   r'   r(   r)   r*   r+   r,   )
r/   r   rÏ   Úpred_xÚauth_xrÎ   rP   r0   rQ   r3   s
             r6   Ú3test_t3_small_reconciliation_preserves_active_combozbTestTier3ReconnectionAndReconciliationMidCombo.test_t3_small_reconciliation_preserves_active_comboÞ   sª  € Øˆ
ØˆØˆÝ�F˜V‘OÑ$Ô$ˆàÐˆu�sŠ{ÐÐÐÕÔÐÐÐÐˆu�sÐÑÔÐÕÔÑÔÐÐÕÔˆuÑÔÐÕÔˆuÑÔÐÐÕÔ�sÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆz˜QŠÐÐÐÕÔÐÐÐÐˆz˜QÐÑÔÐÕÔÑÔÐÐÕÔˆzÑÔÐÕÔˆzÑÔÐÐÕÔ˜QÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr8   c                ó¨  — d|_         d}||_         |j         }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}d S )	Ng     @U@g     €S@r    r^   r   r   r   r   )	r_   r%   r&   r'   r(   r)   r*   r+   r,   )r/   r   Úserver_auth_hpr0   r1   r2   r3   r4   s           r6   Ú<test_t3_authoritative_health_sync_overrides_local_predictionzkTestTier3ReconnectionAndReconciliationMidCombo.test_t3_authoritative_health_sync_overrides_local_predictionç   s  € ð '+ÐÔ#Øˆà&4ÐÔ#ØÔ*Ð2¨dÐ2Ð*¨dÒ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð*¨dÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ÐÑ2Ô2Ð2Õ2Ô2ÐÑ2Ô2Ð2Ð2Õ2Ô2Ð*Ñ2Ô2Õ2Ô2¨dÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2r8   NrS   )rT   rU   rV   rW   rÊ   rÓ   rÖ   rX   r8   r6   rÄ   rÄ   Ó   sV   € € € € € Ø?Ð?ð ð  ð  ð  ðð ð ð ð3ð 3ð 3ð 3ð 3ð 3r8   rÄ   )rW   Ú
__future__r   Úbuiltinsr'   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter%   r³   Útypingr   r   r   r   r   Úpytestr?   r	   r
   r   r   r   r   rZ   rs   r”   r«   rÄ   rX   r8   r6   ú<module>rÞ      s¾  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð%1ð %1ð %1ð %1ð %1ñ %1ô %1ð %1ðP"'ð "'ð "'ð "'ð "'ñ "'ô "'ð "'ðJ!ð !ð !ð !ð !ñ !ô !ð !ðH$-ð $-ð $-ð $-ð $-ñ $-ô $-ð $-ðN-ð -ð -ð -ð -ñ -ô -ð -ð@3ð 3ð 3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3r8   