§
    Ã½jnT  ã                   óª  — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZmZmZ ddlZej                             ej                             ej                             e¦  «        d¦  «        ¦  «        Zee	j        vre	j                             de¦  «         ddlmZ ddlmZmZ ddlmZm Z  dd	l!m"Z"m#Z# dd
l$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ej.        defd„¦   «         Z/ej.        defd„¦   «         Z0ej.        dee"e#e#f         fd„¦   «         Z1 G d„ d¦  «        Z2 G d„ d¦  «        Z3 G d„ d¦  «        Z4 G d„ d¦  «        Z5dS )a4  
Comprehensive E2E Test Suite for FreeExile PoE2 Spatial Zoning & Encounter Systems.
Enforces 4-Tier Testing Methodology:
- Tier 1: Feature Coverage (>=5 test cases per feature area)
- Tier 2: Boundary & Corner Cases
- Tier 3: Cross-Feature Combinations
- Tier 4: Real-World End-to-End Application Scenarios
é    N)ÚPath)ÚDictÚListÚTuplez../../server©Ú
ZoneEngine)ÚZoneTypeÚZoneDefinition)ÚHideoutEngineÚ	AstralMap)ÚCombatEngineÚCombatActor)ÚFiveElements)ÚMonsterAIStateÚMonsterRuntimeStateÚMonsterGenus)ÚMonsterAIEngine)ÚMonsterProceduralEngineÚreturnc                  ó   — t          ¦   «         S ©Nr   © ó    úCC:\Projects\FreeExile\tests\e2e\test_poe2_zone_and_encounter_e2e.pyÚzone_enginer      s   € å‰<Œ<Ðr   c                  ó   — t          ¦   «         S r   )r   r   r   r   Úhideout_enginer   #   s   € å‰?Œ?Ðr   c                  óò   — t          ¦   «         } t          ddt          j        d¬¦  «        }t          ddt          j        dd¬¦  «        }|                      |¦  «         |                      |¦  «         | ||fS )	Né   u   QuÃ¡i Tinh Anhg     @U@)Úactor_idÚnameÚelementÚbase_attacké   u   LÆ°u Ä�Ã y Giáº£ç     @�@)r    r!   r"   Ú
current_hpÚmax_hp)r   r   r   ÚHOAÚKIMÚregister_actor)ÚengineÚattackerÚdefenders      r   Úcombat_setupr.   '   sy   € å‰^Œ^€FÝ AÐ,<ÅlÔFVÐdhÐiÑiÔi€HÝ AÐ,>ÍÔHXÐekÐtzÐ{Ñ{Ô{€HØ
×Ò˜(Ñ#Ô#Ð#Ø
×Ò˜(Ñ#Ô#Ð#Ø�8˜XÐ%Ð%r   c                   óª  — e Zd ZdZdeddfd„Zdeddfd„Zdeddfd„Zdeddfd„Zd)d	„Z	deddfd
„Z
deddfd„Zdeddfd„Zd)d„Zd)d„Zdeddfd„Zdeddfd„Zdeddfd„Zdeddfd„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d„Zd)d „Z d)d!„Z!d)d"„Z"d#e#ddfd$„Z$d#e#ddfd%„Z%d#e#ddfd&„Z&d#e#ddfd'„Z'd#e#ddfd(„Z(dS )*ÚTestTier1FeatureCoveragezQTier 1: Feature Coverage (>=5 test cases per feature area from ORIGINAL_REQUEST).r   r   Nc                 óò  — |j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}d	S )
z+Sanctuary hub rejects hostile mob spawning.Úzone_boundless_sanctuaryF©Úis©z`%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.can_spawn_hostile_monsters
}(%(py4)s)
} is %(py9)sr   ©Úpy0Úpy2Úpy4Úpy6Úpy9úassert %(py11)sÚpy11N©	Úcan_spawn_hostile_monstersÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation©	Úselfr   Ú@py_assert1Ú@py_assert3Ú@py_assert5Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12s	            r   Ú*test_safe_haven_sanctuary_hostile_rejectedzCTestTier1FeatureCoverage.test_safe_haven_sanctuary_hostile_rejected3   s/  € àÔ5ÐZÐ6PÐZÐ5Ð5Ð6PÑQÔQÐZÐUZÐZÐQÐUZÐZÐZÐZÐZÕZÔZÐZÐZÐZÐZÐQÐUZÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZˆ{ÑZÔZÐZÕZÔZˆ{ÑZÔZÐZÐZÕZÔZÐ5ÑZÔZÕZÔZÐ6PÑZÔZÕZÔZÐQÑZÔZÕZÔZÐUZÑZÔZÐZÐZÑZÐZÐZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZr   c                 óò  — |j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}d	S )
z,Player hideout rejects hostile mob spawning.Úzone_player_hideoutFr3   r5   r   r6   r<   r=   Nr>   rH   s	            r   Ú(test_safe_haven_hideout_hostile_rejectedzATestTier1FeatureCoverage.test_safe_haven_hideout_hostile_rejected6   s/  € àÔ5ÐUÐ6KÐUÐ5Ð5Ð6KÑLÔLÐUÐPUÐUÐLÐPUÐUÐUÐUÐUÕUÔUÐUÐUÐUÐUÐLÐPUÐUÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUˆ{ÑUÔUÐUÕUÔUˆ{ÑUÔUÐUÐUÕUÔUÐ5ÑUÔUÕUÔUÐ6KÑUÔUÕUÔUÐLÑUÔUÕUÔUÐPUÑUÔUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUr   c                 óà  — |                      dd¬¦  «        \  }}g }d}||u }|}|rg }d}	|	|v }
|
}|
sd}||v }|}|}|�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  }|                     |¦  «         |�rLt          j        d|
fd|	|f¦  «        t          j        |	¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         |
s‹t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	x}
x}}dS )z8validate_monster_spawn rejects hostile mob in sanctuary.r2   F©Úis_dummyõ   An ToÃ nÚ	Sanctuaryr3   ©z%(py2)s is %(py5)sÚallowed©r8   Úpy5ú%(py7)sÚpy7©Úin©z%(py12)s in %(py14)sÚreason©Úpy12Úpy14ú%(py16)sÚpy16©z%(py19)s in %(py21)s©Úpy19Úpy21ú%(py23)sÚpy23r   ú%(py26)sÚpy26r   úassert %(py29)sÚpy29N©Úvalidate_monster_spawnr@   rA   rB   rC   rD   rE   ÚappendÚ_format_booloprF   rG   ©rI   r   r[   rc   rJ   Ú@py_assert4rK   Ú@py_assert0Ú@py_assert10Ú@py_assert11Ú@py_assert13Ú@py_assert9Ú@py_assert18Ú@py_assert20Ú@py_format6Ú@py_format8Ú@py_format15Ú@py_format17Ú@py_format22Ú@py_format24Ú@py_format25Ú@py_format27Ú@py_format28Ú@py_format30s                           r   Ú2test_safe_haven_sanctuary_validate_rejects_hostilezKTestTier1FeatureCoverage.test_safe_haven_sanctuary_validate_rejects_hostile9   s)  € à%×<Ò<Ð=WÐbgÐ<ÑhÔh‰ˆ�ØSÐS˜%ÐSˆw˜%ÐÐSÐSÐSÐSÐSÐSÐS ZÐS Z°6Ð%9ÐSÐSÐSÐSÐS¸[ÐS¸[ÈFÐ=RÐSÐSÐSÐSÐSÐSÑSÕSÔSÐSÐSÐSÐSˆw˜%ÐSÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔSˆwÑSÔSÐSÕSÔSˆwÑSÔSÐSÐSÕSÔS˜%ÑSÔSÐSÐSÑSÐSÐSÐSÐSÐSÑSÐSÐS×SÒSÐSÑSÔSÐSÐSÑSÕSÔSÐSÐSÐSÐS Z°6ÐSÑSÔSÕSÔS ZÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔS°6ÑSÔSÐSÕSÔS°6ÑSÔSÐSÐSÐSÐSÑSÐSÐSÐSÐSÐSÑSÐSÐS×SÒSÐSÑSÔSÐSÐSÐSÕSÔSÐSÐSÐSÐS¸[ÈFÐSÑSÔSÕSÔS¸[ÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔSÈFÑSÔSÐSÕSÔSÈFÑSÔSÐSÐSÐSÐSÑSÐSÐSÐSÐSÐSÑSÐSÐS×SÒSÐSÑSÔSÐSÕSÔSÐSÐSÑSÔSÐSÑSÐSÐSÐSÐSÐSÑSÐSÐS×SÒSÐSÑSÔSÐSÕSÔSÐSÐSÑSÔSÐSÑSÐSÐSÐSÐSÐSÑSÐSÕSÕSÔSÐSÑSÔSÑSÔSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSr   c                 óà  — |                      dd¬¦  «        \  }}g }d}||u }|}|rg }d}	|	|v }
|
}|
sd}||v }|}|}|�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  }|                     |¦  «         |�rLt          j        d|
fd|	|f¦  «        t          j        |	¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         |
s‹t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	x}
x}}dS )z6validate_monster_spawn rejects hostile mob in hideout.rS   FrV   rX   ÚHideoutr3   rZ   r[   r\   r^   r_   r`   rb   rc   rd   rg   rh   ri   rj   rm   rn   r   ro   rp   r   rq   rr   Nrs   rw   s                           r   Ú0test_safe_haven_hideout_validate_rejects_hostilezITestTier1FeatureCoverage.test_safe_haven_hideout_validate_rejects_hostile=   s)  € à%×<Ò<Ð=RÐ]bÐ<ÑcÔc‰ˆ�ØQÐQ˜%ÐQˆw˜%ÐÐQÐQÐQÐQÐQÐQÐQ ZÐQ Z°6Ð%9ÐQÐQÐQÐQÐQ¸YÐQ¸YÈ&Ð=PÐQÐQÐQÐQÐQÐQÑQÕQÔQÐQÐQÐQÐQˆw˜%ÐQÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQˆwÑQÔQÐQÕQÔQˆwÑQÔQÐQÐQÕQÔQ˜%ÑQÔQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÐQ×QÒQÐQÑQÔQÐQÐQÑQÕQÔQÐQÐQÐQÐQ Z°6ÐQÑQÔQÕQÔQ ZÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQ°6ÑQÔQÐQÕQÔQ°6ÑQÔQÐQÐQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÐQ×QÒQÐQÑQÔQÐQÐQÐQÕQÔQÐQÐQÐQÐQ¸YÈ&ÐQÑQÔQÕQÔQ¸YÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQÈ&ÑQÔQÐQÕQÔQÈ&ÑQÔQÐQÐQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÐQ×QÒQÐQÑQÔQÐQÕQÔQÐQÐQÑQÔQÐQÑQÐQÐQÐQÐQÐQÑQÐQÐQ×QÒQÐQÑQÔQÐQÕQÔQÐQÐQÑQÔQÐQÑQÐQÐQÐQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQr   c                 óB  — t          d¦  «                             d¬¦  «        }g }d}||v}|}|rd}||v}|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd	œz  }d
d|iz  }	|                     |	¦  «         |r‹t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }
dd|
iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )zPClient monster_system.js must not spawn hostile hounds/skeletons in safe havens.ú)client/webapp/js/engine/monster_system.jsúutf-8©ÚencodingÚhellhound_sanctuaryÚskeleton_sanctuary)únot in)z%(py3)s not in %(py5)sÚcontent©Úpy3r]   r^   r_   )z%(py10)s not in %(py12)s©Úpy10re   ú%(py14)srf   r   úassert %(py17)sÚpy17N©r   Ú	read_textr@   rA   rE   rB   rC   rD   ru   rv   rF   rG   )rI   r–   rJ   Ú@py_assert2rx   ry   r}   r{   r€   r�   Ú@py_format13r‚   Ú@py_format16Ú@py_format18s                 r   Ú)test_safe_haven_client_js_no_hostile_mobszBTestTier1FeatureCoverage.test_safe_haven_client_js_no_hostile_mobsA   s  € åÐBÑCÔC×MÒMÐW^ÐMÑ_Ô_ˆØ[Ð[Ð$Ð[Ð$¨GÐ3Ð[Ð[Ð[Ð[Ð[Ð8LÐ[Ð8LÐT[Ð8[Ð[Ð[Ð[Ð[Ñ[Õ[Ô[Ð[Ð[Ð[Ð[Ð$¨GÐ[Ñ[Ô[Õ[Ô[Ð$Ñ[Ô[Ð[Õ[Ô[Ñ[Ô[Ð[Ð[Õ[Ô[¨GÑ[Ô[Ð[Õ[Ô[¨GÑ[Ô[Ð[Ð[Ð[Ð[Ñ[Ð[Ð[Ð[Ð[Ð[Ñ[Ð[Ð[×[Ò[Ð[Ñ[Ô[Ð[Ð[Ð[Õ[Ô[Ð[Ð[Ð[Ð[Ð8LÐT[Ð[Ñ[Ô[Õ[Ô[Ð8LÑ[Ô[Ð[Õ[Ô[Ñ[Ô[Ð[Ð[Õ[Ô[ÐT[Ñ[Ô[Ð[Õ[Ô[ÐT[Ñ[Ô[Ð[Ð[Ð[Ð[Ñ[Ð[Ð[Ð[Ð[Ð[Ñ[Ð[Ð[×[Ò[Ð[Ñ[Ô[Ð[Õ[Ô[Ð[Ð[Ñ[Ô[Ð[Ñ[Ð[Ð[Ð[Ð[Ð[Ñ[Ð[Õ[Õ[Ô[Ð[Ñ[Ô[Ñ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[r   c                 ó4  — |                      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 )z'Target Dummy is permitted in sanctuary.r2   TrV   r   r3   ©z%(py1)s is %(py4)s©Úpy1r9   úassert %(py6)sr:   N©rt   r@   rA   rE   rF   rG   ©rI   r   ry   rK   r    Ú@py_format5Ú@py_format7s          r   Útest_dummy_allowed_in_sanctuaryz8TestTier1FeatureCoverage.test_dummy_allowed_in_sanctuaryG   sË   € à×1Ò1Ð2LÐW[Ð1Ñ\Ô\Ð]^Ô_ÐgÐcgÐgÐ_ÐcgÐgÐgÐgÐgÕgÔgÐgÐgÐgÐgÐ_ÐcgÐgÑgÔgÕgÔgÐ_ÑgÔgÕgÔgÐcgÑgÔgÐgÐgÑgÐgÐgÐgÐgÐgÑgÐgÕgÕgÔgÐgÑgÔgÑgÔgÐgÐgÐgÐgÐgÐgÐgÐgÐgr   c                 ó4  — |                      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 )z%Target Dummy is permitted in hideout.rS   TrV   r   r3   r¦   r§   r©   r:   Nrª   r«   s          r   Útest_dummy_allowed_in_hideoutz6TestTier1FeatureCoverage.test_dummy_allowed_in_hideoutJ   óË   € à×1Ò1Ð2GÐRVÐ1ÑWÔWÐXYÔZÐbÐ^bÐbÐZÐ^bÐbÐbÐbÐbÕbÔbÐbÐbÐbÐbÐZÐ^bÐbÑbÔbÕbÔbÐZÑbÔbÕbÔbÐ^bÑbÔbÐbÐbÑbÐbÐbÐbÐbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbÐbÐbÐbÐbr   c                 ó4  — |                      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 )z(Target Dummy is permitted in wilderness.Úzone_tang_kiem_nhaiTrV   r   r3   r¦   r§   r©   r:   Nrª   r«   s          r   Ú test_dummy_allowed_in_wildernessz9TestTier1FeatureCoverage.test_dummy_allowed_in_wildernessM   r±   r   c                 óz  — t          d¦  «                             d¬¦  «        }g }d}||v }|}|rd}||v }|}|rd}||v }	|	}|�sæt          j        d|fd||f¦  «        t          j        |¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	d
œz  }
dd|
iz  }|                     |¦  «         |�rt          j        d|fd||f¦  «        t          j        |¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	dœz  }dd|iz  }|                     |¦  «         |r‹t          j        d|	fd||f¦  «        t          j        |¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	dœz  }dd|iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}	dS )zQClient monster_system.js configures dummy with isDummy: true and isNeutral: true.r�   r�   r‘   Údummy_primal_shrinezisDummy: truezisNeutral: truer`   ©z%(py3)s in %(py5)sr–   r—   r^   r_   ©z%(py10)s in %(py12)sr™   r›   rf   )z%(py17)s in %(py19)s)r�   rk   ú%(py21)srl   r   úassert %(py24)sÚpy24Nrž   )rI   r–   rJ   r    rx   ry   r}   r{   Ú@py_assert16r~   r€   r�   r¡   r‚   Ú@py_format20r„   Ú@py_format23r†   s                     r   Ú"test_dummy_configured_in_client_jsz;TestTier1FeatureCoverage.test_dummy_configured_in_client_jsP   sÝ  € åÐBÑCÔC×MÒMÐW^ÐMÑ_Ô_ˆØoÐoÐ$ÐoÐ$¨Ð/ÐoÐoÐoÐoÐo°OÐo°OÀwÐ4NÐoÐoÐoÐoÐoÐSdÐoÐSdÐhoÐSoÐoÐoÐoÐoÑoÕoÔoÐoÐoÐoÐoÐ$¨ÐoÑoÔoÕoÔoÐ$ÑoÔoÐoÕoÔoÑoÔoÐoÐoÕoÔo¨ÑoÔoÐoÕoÔo¨ÑoÔoÐoÐoÐoÐoÑoÐoÐoÐoÐoÐoÑoÐoÐo×oÒoÐoÑoÔoÐoÐoÑoÕoÔoÐoÐoÐoÐo°OÀwÐoÑoÔoÕoÔo°OÑoÔoÐoÕoÔoÑoÔoÐoÐoÕoÔoÀwÑoÔoÐoÕoÔoÀwÑoÔoÐoÐoÐoÐoÑoÐoÐoÐoÐoÐoÑoÐoÐo×oÒoÐoÑoÔoÐoÐoÐoÕoÔoÐoÐoÐoÐoÐSdÐhoÐoÑoÔoÕoÔoÐSdÑoÔoÐoÕoÔoÑoÔoÐoÐoÕoÔoÐhoÑoÔoÐoÕoÔoÐhoÑoÔoÐoÐoÐoÐoÑoÐoÐoÐoÐoÐoÑoÐoÐo×oÒoÐoÑoÔoÐoÕoÔoÐoÐoÑoÔoÐoÑoÐoÐoÐoÐoÐoÑoÐoÕoÕoÔoÐoÑoÔoÑoÔoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐor   c           
      ó€  — d}d}t          |¦  «        }|j        }d} ||¬¦  «        }||v }|�s t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}x}x}x}x}}dS )zEClient monster_system.js skips movement and attacks for target dummy.zif (m.isDummy) continue;r�   r�   r‘   r`   ©zy%(py1)s in %(py13)s
{%(py13)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}.read_text
}(encoding=%(py11)s)
}r   ©r¨   r˜   r]   r_   r;   r=   Úpy13úassert %(py15)sÚpy15N©
r   rŸ   r@   rA   rE   rB   rC   rD   rF   rG   ©
rI   ry   rx   Ú@py_assert6rM   rz   Ú@py_assert12r    Ú@py_format14r¢   s
             r   Ú"test_dummy_stationary_in_client_jsz;TestTier1FeatureCoverage.test_dummy_stationary_in_client_jsT   sp  € à)ÐzÐ2]Ðz­TÐ2]Ñ-^Ô-^ÐzÐ-^Ô-hÐzÐryÐzÐ-hÐ-hÐryÐ-zÑ-zÔ-zÐzÐ)Ð-zÐzÐzÐzÑzÕzÔzÐzÐzÐzÐzÐ)Ð-zÐzÑzÔzÕzÔzÐ)ÑzÔzÐzÕzÔzÑzÔzÐzÐzÕzÔz­TÑzÔzÐzÕzÔz­TÑzÔzÐzÐzÕzÔzÐ2]ÑzÔzÕzÔzÐ-^ÑzÔzÕzÔzÐ-hÑzÔzÕzÔzÐryÑzÔzÕzÔzÐ-zÑzÔzÐzÐzÑzÐzÐzÐzÐzÐzÑzÐzÕzÕzÔzÐzÑzÔzÑzÔzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzÐzr   c                 óò  — |j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}d	S )
z/Bone Strand wilderness map allows hostile mobs.r³   Tr3   r5   r   r6   r<   r=   Nr>   rH   s	            r   Ú*test_wilderness_bone_strand_allows_hostilezCTestTier1FeatureCoverage.test_wilderness_bone_strand_allows_hostileY   s/  € àÔ5ÐTÐ6KÐTÐ5Ð5Ð6KÑLÔLÐTÐPTÐTÐLÐPTÐTÐTÐTÐTÕTÔTÐTÐTÐTÐTÐLÐPTÐTÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔTˆ{ÑTÔTÐTÕTÔTˆ{ÑTÔTÐTÐTÕTÔTÐ5ÑTÔTÕTÔTÐ6KÑTÔTÕTÔTÐLÑTÔTÕTÔTÐPTÑTÔTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTr   c                 óò  — |j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}d	S )
z0Rotten Swamp wilderness map allows hostile mobs.Úzone_ancient_sword_barrowTr3   r5   r   r6   r<   r=   Nr>   rH   s	            r   Ú+test_wilderness_rotten_swamp_allows_hostilezDTestTier1FeatureCoverage.test_wilderness_rotten_swamp_allows_hostile]   s/  € àÔ5ÐZÐ6QÐZÐ5Ð5Ð6QÑRÔRÐZÐVZÐZÐRÐVZÐZÐZÐZÐZÕZÔZÐZÐZÐZÐZÐRÐVZÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZˆ{ÑZÔZÐZÕZÔZˆ{ÑZÔZÐZÐZÕZÔZÐ5ÑZÔZÕZÔZÐ6QÑZÔZÕZÔZÐRÑZÔZÕZÔZÐVZÑZÔZÐZÐZÑZÐZÐZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZr   c                 óò  — |j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}d	S )
z/Bone Wastes wilderness map allows hostile mobs.Úzone_boundless_sandstormTr3   r5   r   r6   r<   r=   Nr>   rH   s	            r   Ú*test_wilderness_bone_wastes_allows_hostilezCTestTier1FeatureCoverage.test_wilderness_bone_wastes_allows_hostilea   s/  € àÔ5ÐYÐ6PÐYÐ5Ð5Ð6PÑQÔQÐYÐUYÐYÐQÐUYÐYÐYÐYÐYÕYÔYÐYÐYÐYÐYÐQÐUYÐYÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYˆ{ÑYÔYÐYÕYÔYˆ{ÑYÔYÐYÐYÕYÔYÐ5ÑYÔYÕYÔYÐ6PÑYÔYÕYÔYÐQÑYÔYÕYÔYÐUYÑYÔYÐYÐYÑYÐYÐYÐYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYr   c                 ó4  — |                      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 )z<validate_monster_spawn permits hostile spawns in outer maps.r³   FrV   r   Tr3   r¦   r§   r©   r:   Nrª   r«   s          r   Ú-test_wilderness_validate_spawn_allows_hostilezFTestTier1FeatureCoverage.test_wilderness_validate_spawn_allows_hostilee   sË   € à×1Ò1Ð2GÐRWÐ1ÑXÔXÐYZÔ[ÐcÐ_cÐcÐ[Ð_cÐcÐcÐcÐcÕcÔcÐcÐcÐcÐcÐ[Ð_cÐcÑcÔcÕcÔcÐ[ÑcÔcÕcÔcÐ_cÑcÔcÐcÐcÑcÐcÐcÐcÐcÐcÑcÐcÕcÕcÔcÐcÑcÔcÑcÔcÐcÐcÐcÐcÐcÐcÐcÐcÐcr   c                 ó   — t          ¦   «                              dd¬¦  «        }g }|j        }d}||k    }|}|r%|j        }d}||k    }	|	}|	r|j        }
|
t
          v }|}|�sYt          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  }|                     |¦  «         |�rxt          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  }|                     |¦  «         |	rØt          j        d|fd|
t
          f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	x}x}
}dS )zAProcedural monster generation generates valid wilderness enemies.é*   é   ©Útarget_levelr   ©ú>)z-%(py4)s
{%(py4)s = %(py2)s.max_hp
} > %(py7)sÚm©r8   r9   r_   ú%(py9)sr;   )z6%(py13)s
{%(py13)s = %(py11)s.base_damage
} > %(py16)s©r=   rÃ   rh   ú%(py18)sÚpy18r`   )z1%(py22)s
{%(py22)s = %(py20)s.genus
} in %(py24)sr   )Úpy20Úpy22r»   ro   rp   rq   rr   N)r   Úgenerate_monsterr'   Úbase_damageÚgenusr   r@   rA   rB   rC   rD   rE   ru   rv   rF   rG   )rI   rÝ   rJ   rK   rÈ   rL   ry   rÉ   Ú@py_assert15Ú@py_assert14Ú@py_assert21Ú@py_assert23r�   rO   rƒ   Ú@py_format19r†   r‡   rˆ   r‰   s                       r   Ú-test_wilderness_procedural_monster_attributeszFTestTier1FeatureCoverage.test_wilderness_procedural_monster_attributesi   s@  € å#Ñ%Ô%×6Ò6°rÈÐ6ÑKÔKˆØMÐMˆqŒxÐM˜!ÐMˆx˜!Š|ÐMÐMÐMÐMÐM ¤ÐM°ÐM °Ò 1ÐMÐMÐMÐMÐM°a´gÐM°gÅÐ6MÐMÐMÐMÐMÑMÕMÔMÐMÐMÐMÐMˆx˜!ÐMÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔMˆqÑMÔMÐMÕMÔMˆqÑMÔMÐMÐMÕMÔMˆxÑMÔMÕMÔM˜!ÑMÔMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÐM×MÒMÐMÑMÔMÐMÐMÑMÕMÔMÐMÐMÐMÐM °ÐMÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM ÑMÔMÐMÕMÔM ÑMÔMÐMÐMÕMÔM ÑMÔMÕMÔM°ÑMÔMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÐM×MÒMÐMÑMÔMÐMÐMÐMÕMÔMÐMÐMÐMÐM°gÅÐMÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM°aÑMÔMÐMÕMÔM°aÑMÔMÐMÐMÕMÔM°gÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔMÅÑMÔMÐMÕMÔMÅÑMÔMÐMÐMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÐM×MÒMÐMÑMÔMÐMÕMÔMÐMÐMÑMÔMÐMÑMÐMÐMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMr   c           
      ó  — |\  }}}t          t          j        ¦   «         dz  ¦  «        }|j        }|j        } |||¬¦  «        }d}	||	u }
|
�sLt	          j        d|
fd||	f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        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}x}
}	|j        }||k    }|sÕt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nddœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}dS )u=   Triggering Huyá»…n áº¢nh Bá»™ records last evasion timestamp.éè  )r    Útimestamp_msTr3   )z›%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.trigger_phantom_evasion
}(actor_id=%(py5)s
{%(py5)s = %(py3)s.actor_id
}, timestamp_ms=%(py6)s)
} is %(py11)sr+   ÚdefnÚnow_ms)r7   r8   r˜   r]   r:   Úpy8r=   zassert %(py13)srÃ   N©ú==)zA%(py2)s
{%(py2)s = %(py0)s.last_evasion_timestamp_ms
} == %(py4)s©r7   r8   r9   r©   r:   )ÚintÚtimeÚtrigger_phantom_evasionr    r@   rA   rB   rC   rD   rE   rF   rG   Úlast_evasion_timestamp_ms)rI   r.   r+   Ú_rñ   rò   rJ   rx   rN   rz   r}   rP   rÊ   rK   r¬   r­   s                   r   Ú$test_dodge_trigger_records_timestampz=TestTier1FeatureCoverage.test_dodge_trigger_records_timestampo   sÏ  € à&‰ˆ��4Ý•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆØÔ-Ðb°t´}ÐbÐ-Ð-°}ÐSYÐZÑZÔZÐbÐ^bÐbÐZÐ^bÐbÐbÐbÑbÕbÔbÐbÐbÐbÐbÐZÐ^bÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔbˆvÑbÔbÐbÕbÔbˆvÑbÔbÐbÐbÕbÔbÐ-ÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔb°tÑbÔbÐbÕbÔb°tÑbÔbÐbÐbÕbÔb°}ÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔbÐSYÑbÔbÐbÕbÔbÐSYÑbÔbÐbÐbÕbÔbÐZÑbÔbÕbÔbÐ^bÑbÔbÐbÐbÑbÐbÐbÐbÐbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbØÔ-Ð7Ð-°Ò7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð-°Ð7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7ˆtÑ7Ô7Ð7Õ7Ô7ˆtÑ7Ô7Ð7Ð7Õ7Ô7Ð-Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7°Ñ7Ô7Ð7Õ7Ô7°Ñ7Ô7Ð7Ð7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7r   c                 óR  — |\  }}}t          t          j        ¦   «         dz  ¦  «        }|                     |j        |¦  «         |                     |j        |j        dt
          j        |¦  «        }g }|j        }d}	||	u }
|
}|
r|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  }|                     |¦  «         |
rž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          j        |d¦  «        i z  }dd|iz  }t#          t          j        |¦  «        ¦  «        ‚dx}x}x}x}
x}	x}x}}dS )z-Attack landing at t+0ms is completely evaded.rï   ç      Y@Tç        r3   ©z1%(py4)s
{%(py4)s = %(py2)s.is_evaded
} is %(py7)sÚresrÞ   rß   r;   rô   ©z8%(py13)s
{%(py13)s = %(py11)s.final_damage
} == %(py16)srà   rá   râ   r   úassert %(py21)srl   N©r÷   rø   rù   r    Úcalculate_damager   r(   Ú	is_evadedÚfinal_damager@   rA   rB   rC   rD   rE   ru   rv   rF   rG   ©rI   r.   r+   Úatkrñ   rò   r  rJ   rK   rÈ   rL   ry   rÉ   rè   ré   r�   rO   rƒ   rì   r½   r„   s                        r   Ú#test_dodge_iframe_active_at_zero_msz<TestTier1FeatureCoverage.test_dodge_iframe_active_at_zero_msv   sƒ  € à(Ñˆ��TÝ•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆØ×&Ò& t¤}°fÑ=Ô=Ð=Ø×%Ò% c¤l°D´MÀ5Í,ÔJZÐ\bÑcÔcˆØ@Ð@ˆsŒ}Ð@ Ð@ˆ} Ð$Ð@Ð@Ð@Ð@Ð@¨Ô)9Ð@¸SÐ@Ð)9¸SÒ)@Ð@Ð@Ð@Ð@Ñ@Õ@Ô@Ð@Ð@Ð@Ð@ˆ} Ð@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@ˆsÑ@Ô@Ð@Õ@Ô@ˆsÑ@Ô@Ð@Ð@Õ@Ô@ˆ}Ñ@Ô@Õ@Ô@ Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@×@Ò@Ð@Ñ@Ô@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð)9¸SÐ@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@¨Ñ@Ô@Ð@Õ@Ô@¨Ñ@Ô@Ð@Ð@Õ@Ô@Ð)9Ñ@Ô@Õ@Ô@¸SÑ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@×@Ò@Ð@Ñ@Ô@Ð@Õ@Ô@Ð@Ð@Ñ@Ô@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r   c                 óX  — |\  }}}t          t          j        ¦   «         dz  ¦  «        }|                     |j        |¦  «         |                     |j        |j        dt
          j        |dz   ¦  «        }g }|j        }d}	||	u }
|
}|
r|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  }|                     |¦  «         |
rž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          j        |d¦  «        i z  }dd|iz  }t#          t          j        |¦  «        ¦  «        ‚dx}x}x}x}
x}	x}x}}dS )z/Attack landing at t+100ms is completely evaded.rï   rþ   éd   Trÿ   r3   r   r  rÞ   rß   r;   rô   r  rà   rá   râ   r   r  rl   Nr  r  s                        r   Ú&test_dodge_iframe_active_at_hundred_msz?TestTier1FeatureCoverage.test_dodge_iframe_active_at_hundred_ms~   ó‰  € à(Ñˆ��TÝ•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆØ×&Ò& t¤}°fÑ=Ô=Ð=Ø×%Ò% c¤l°D´MÀ5Í,ÔJZÐ\bÐehÑ\hÑiÔiˆØ@Ð@ˆsŒ}Ð@ Ð@ˆ} Ð$Ð@Ð@Ð@Ð@Ð@¨Ô)9Ð@¸SÐ@Ð)9¸SÒ)@Ð@Ð@Ð@Ð@Ñ@Õ@Ô@Ð@Ð@Ð@Ð@ˆ} Ð@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@ˆsÑ@Ô@Ð@Õ@Ô@ˆsÑ@Ô@Ð@Ð@Õ@Ô@ˆ}Ñ@Ô@Õ@Ô@ Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@×@Ò@Ð@Ñ@Ô@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð)9¸SÐ@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@¨Ñ@Ô@Ð@Õ@Ô@¨Ñ@Ô@Ð@Ð@Õ@Ô@Ð)9Ñ@Ô@Õ@Ô@¸SÑ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@×@Ò@Ð@Ñ@Ô@Ð@Õ@Ô@Ð@Ð@Ñ@Ô@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r   c                 óX  — |\  }}}t          t          j        ¦   «         dz  ¦  «        }|                     |j        |¦  «         |                     |j        |j        dt
          j        |dz   ¦  «        }g }|j        }d}	||	u }
|
}|
r|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  }|                     |¦  «         |
rž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          j        |d¦  «        i z  }dd|iz  }t#          t          j        |¦  «        ¦  «        ‚dx}x}x}x}
x}	x}x}}dS )z:Attack landing at t+249ms (inside 250ms window) is evaded.rï   rþ   éù   Trÿ   r3   r   r  rÞ   rß   r;   rô   r  rà   rá   râ   r   r  rl   Nr  r  s                        r   Ú*test_dodge_iframe_active_at_boundary_249mszCTestTier1FeatureCoverage.test_dodge_iframe_active_at_boundary_249ms†   r  r   c                 óB  — t          d¦  «                             d¬¦  «        }g }d}||v }|}|rd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd	œz  }d
d|iz  }	|                     |	¦  «         |r‹t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }
dd|
iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )z7Client combat_skills.js activates 0.25s i-frame window.ú(client/webapp/js/engine/combat_skills.jsr�   r‘   zplayer.isIFrame = true;zplayer.iFrameTimer = 0.25;r`   r·   Úcr—   r^   r_   r¸   r™   r›   rf   r   rœ   r�   Nrž   ©rI   r  rJ   r    rx   ry   r}   r{   r€   r�   r¡   r‚   r¢   r£   s                 r   Ú'test_dodge_client_js_sets_iframe_windowz@TestTier1FeatureCoverage.test_dodge_client_js_sets_iframe_windowŽ   s  € åÐ;Ñ<Ô<×FÒFÐPWÐFÑXÔXˆØSÐSÐ(ÐSÐ(¨AÐ-ÐSÐSÐSÐSÐSÐ2NÐSÐ2NÐRSÐ2SÐSÐSÐSÐSÑSÕSÔSÐSÐSÐSÐSÐ(¨AÐSÑSÔSÕSÔSÐ(ÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔS¨AÑSÔSÐSÕSÔS¨AÑSÔSÐSÐSÐSÐSÑSÐSÐSÐSÐSÐSÑSÐSÐS×SÒSÐSÑSÔSÐSÐSÐSÕSÔSÐSÐSÐSÐSÐ2NÐRSÐSÑSÔSÕSÔSÐ2NÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔSÐRSÑSÔSÐSÕSÔSÐRSÑSÔSÐSÐSÐSÐSÑSÐSÐSÐSÐSÐSÑSÐSÐS×SÒSÐSÑSÔSÐSÕSÔSÐSÐSÑSÔSÐSÑSÐSÐSÐSÐSÐSÑSÐSÕSÕSÔSÐSÑSÔSÑSÔSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSr   c                 óB  — t          d¦  «                             d¬¦  «        }g }d}||v }|}|rd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd	œz  }d
d|iz  }	|                     |	¦  «         |r‹t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }
dd|
iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )z<Monsters in monster_system.js initialize poise and maxPoise.r�   r�   r‘   zpoise: config.poise || 100zmaxPoise: config.poise || 100r`   r·   r  r—   r^   r_   r¸   r™   r›   rf   r   rœ   r�   Nrž   r  s                 r   Ú!test_poise_initialized_on_monsterz:TestTier1FeatureCoverage.test_poise_initialized_on_monster”   s  € åÐ<Ñ=Ô=×GÒGÐQXÐGÑYÔYˆØYÐYÐ+ÐYÐ+¨qÐ0ÐYÐYÐYÐYÐYÐ5TÐYÐ5TÐXYÐ5YÐYÐYÐYÐYÑYÕYÔYÐYÐYÐYÐYÐ+¨qÐYÑYÔYÕYÔYÐ+ÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔY¨qÑYÔYÐYÕYÔY¨qÑYÔYÐYÐYÐYÐYÑYÐYÐYÐYÐYÐYÑYÐYÐY×YÒYÐYÑYÔYÐYÐYÐYÕYÔYÐYÐYÐYÐYÐ5TÐXYÐYÑYÔYÕYÔYÐ5TÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYÐXYÑYÔYÐYÕYÔYÐXYÑYÔYÐYÐYÐYÐYÑYÐYÐYÐYÐYÐYÑYÐYÐY×YÒYÐYÑYÔYÐYÕYÔYÐYÐYÑYÔYÐYÑYÐYÐYÐYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYr   c                 óB  — t          d¦  «                             d¬¦  «        }g }d}||v }|}|rd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd	œz  }d
d|iz  }	|                     |	¦  «         |r‹t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }
dd|
iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )z2Monster AI loop pauses during active staggerTimer.r�   r�   r‘   zif (m.staggerTimer > 0)z+continue; // Stunned during stagger window!r`   r·   r  r—   r^   r_   r¸   r™   r›   rf   r   rœ   r�   Nrž   r  s                 r   Ú%test_stagger_state_stun_skips_actionsz>TestTier1FeatureCoverage.test_stagger_state_stun_skips_actions™   s  € åÐ<Ñ=Ô=×GÒGÐQXÐGÑYÔYˆØdÐdÐ(ÐdÐ(¨AÐ-ÐdÐdÐdÐdÐdÐ2_ÐdÐ2_ÐcdÐ2dÐdÐdÐdÐdÑdÕdÔdÐdÐdÐdÐdÐ(¨AÐdÑdÔdÕdÔdÐ(ÑdÔdÐdÕdÔdÑdÔdÐdÐdÕdÔd¨AÑdÔdÐdÕdÔd¨AÑdÔdÐdÐdÐdÐdÑdÐdÐdÐdÐdÐdÑdÐdÐd×dÒdÐdÑdÔdÐdÐdÐdÕdÔdÐdÐdÐdÐdÐ2_ÐcdÐdÑdÔdÕdÔdÐ2_ÑdÔdÐdÕdÔdÑdÔdÐdÐdÕdÔdÐcdÑdÔdÐdÕdÔdÐcdÑdÔdÐdÐdÐdÐdÑdÐdÐdÐdÐdÐdÑdÐdÐd×dÒdÐdÑdÔdÐdÕdÔdÐdÐdÑdÔdÐdÑdÐdÐdÐdÐdÐdÑdÐdÕdÕdÔdÐdÑdÔdÑdÔdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdr   c                 óB  — t          d¦  «                             d¬¦  «        }g }d}||v }|}|rd}||v }|}|�sXt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd	œz  }d
d|iz  }	|                     |	¦  «         |r‹t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }
dd|
iz  }|                     |¦  «         t          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )z1Boss stagger sets 4.0s timer in combat_skills.js.r  r�   r‘   zb.staggerTimer = 4.0;zb.poise = 0;r`   r·   r  r—   r^   r_   r¸   r™   r›   rf   r   rœ   r�   Nrž   r  s                 r   Ú&test_boss_stagger_four_second_durationz?TestTier1FeatureCoverage.test_boss_stagger_four_second_durationž   s  € åÐ;Ñ<Ô<×FÒFÐPWÐFÑXÔXˆØCÐCÐ&ÐCÐ&¨!Ð+ÐCÐCÐCÐCÐC°ÐC°À!Ð0CÐCÐCÐCÐCÑCÕCÔCÐCÐCÐCÐCÐ&¨!ÐCÑCÔCÕCÔCÐ&ÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC¨!ÑCÔCÐCÕCÔC¨!ÑCÔCÐCÐCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÐCÐCÕCÔCÐCÐCÐCÐC°À!ÐCÑCÔCÕCÔC°ÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔCÀ!ÑCÔCÐCÕCÔCÀ!ÑCÔCÐCÐCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÕCÔCÐCÐCÑCÔCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCr   c                 ó`  — |\  }}}|                      |j        |j        dt          j        d¦  «        }g }|j        }d}||k    }	|	}
|	r|j        }|j        }||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  }|                     |¦  «         |	rÜt          j        d
|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}x}x}	x}x}x}}dS )zBStaggered combat state integrates cleanly with damage calculation.ç      I@rï   r   rÛ   )z3%(py4)s
{%(py4)s = %(py2)s.final_damage
} > %(py7)sr  rÞ   rß   r;   )ú<)zS%(py13)s
{%(py13)s = %(py11)s.current_hp
} < %(py17)s
{%(py17)s = %(py15)s.max_hp
}rñ   ©r=   rÃ   rÅ   r�   ú%(py19)srk   úassert %(py22)srä   N)r  r    r   r(   r  r&   r'   r@   rA   rB   rC   rD   rE   ru   rv   rF   rG   )rI   r.   r+   r	  rñ   r  rJ   rK   rÈ   rL   ry   rÉ   r¼   ré   r�   rO   r£   r½   Ú@py_format21r¾   s                       r   Ú(test_stagger_combat_actor_evasion_intactzATestTier1FeatureCoverage.test_stagger_combat_actor_evasion_intact£   s�  € à(Ñˆ��TØ×%Ò% c¤l°D´MÀ4ÍÔIYÐ[_Ñ`Ô`ˆØEÐEˆsÔÐE !ÐEÐ !Ò#ÐEÐEÐEÐEÐE¨¬ÐE¸$¼+ÐE¨¸+Ò(EÐEÐEÐEÐEÑEÕEÔEÐEÐEÐEÐEÐ !ÐEÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔEˆsÑEÔEÐEÕEÔEˆsÑEÔEÐEÐEÕEÔEÐÑEÔEÕEÔE !ÑEÔEÐEÐEÑEÐEÐEÐEÐEÐEÑEÐEÐE×EÒEÐEÑEÔEÐEÐEÐEÕEÔEÐEÐEÐEÐE¨¸+ÐEÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔE¨ÑEÔEÐEÕEÔE¨ÑEÔEÐEÐEÕEÔE¨ÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔE¸$ÑEÔEÐEÕEÔE¸$ÑEÔEÐEÐEÕEÔE¸+ÑEÔEÐEÐEÑEÐEÐEÐEÐEÐEÑEÐEÐE×EÒEÐEÑEÔEÐEÕEÔEÐEÐEÑEÔEÐEÑEÐEÐEÐEÐEÐEÑEÐEÕEÕEÔEÐEÑEÔEÑEÔEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEr   c                 óÔ  — d}t          |¦  «        }|j        } |¦   «         }|s»ddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}}dS )zBVerifies telegraph_renderer.js exists for warning cones & circles.z-client/webapp/js/engine/telegraph_renderer.jsú_assert %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}.exists
}()
}r   ©r7   r8   r9   r:   ró   N©	r   ÚexistsrB   rC   r@   rD   rE   rF   rG   ©rI   rJ   rK   rL   rN   Ú@py_format9s         r   Ú'test_telegraph_renderer_module_baselinez@TestTier1FeatureCoverage.test_telegraph_renderer_module_baseline©   sò   € àCÐM�tÐCÑDÔDÐMÐDÔKÐMÐKÐKÑMÔMÐMÐMÐMÐMÐMÕMÔMÑMÔMÐMÐMÕMÔM�tÑMÔMÐMÕMÔM�tÑMÔMÐMÐMÕMÔMÐCÑMÔMÕMÔMÐDÑMÔMÕMÔMÐKÑMÔMÕMÔMÐMÑMÔMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMÐMr   c                 óÞ  — t          ¦   «         t          ¦   «                              dd¬¦  «        }}t          |dddd|j        ¬¦  «        }|                     |dd¬¦  «        }g }|j        }t          j        }||k    }|}	|r|j	        }
d}|
|k    }|}	|	�sÆt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |rž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          j        |d¦  «        i z  }dd|iz  }t%          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}x}
x}}dS )z:Monster enters PURSUIT when player is inside aggro radius.é
   rÙ   rÿ   ©ÚmonsterÚ	current_xÚ	current_yÚspawn_xÚspawn_yr&   )g      @rÿ   çL7‰A`å ?©Ú
player_posÚdtÚMOVE_TOWARDSrô   )zM%(py4)s
{%(py4)s = %(py2)s.ai_state
} == %(py8)s
{%(py8)s = %(py6)s.PURSUIT
}Ústr   ©r8   r9   r:   ró   ú%(py10)srš   ©z7%(py14)s
{%(py14)s = %(py12)s.action_type
} == %(py17)sÚact©re   rf   r�   r!  rk   r   r"  rä   N)r   r   rå   r   r'   ÚupdateÚai_stater   ÚPURSUITÚaction_typer@   rA   rB   rC   rD   rE   ru   rv   rF   rG   ©rI   ÚairÝ   r:  r>  rJ   rK   rN   rL   ry   r|   r¼   rè   r+  Ú@py_format11r£   r½   r#  r¾   s                      r   Útest_ai_pursuit_within_aggroz5TestTier1FeatureCoverage.test_ai_pursuit_within_aggro®   sÁ  € åÑ!Ô!Õ#:Ñ#<Ô#<×#MÒ#MÈbÐ_aÐ#MÑ#bÔ#bˆAˆÝ ¨°cÀSÐRUÐ_bÐopÔowÐxÑxÔxˆØ�iŠi˜ z°eˆiÑ<Ô<ˆØZÐZˆrŒ{ÐZ�nÔ4ÐZˆ{Ð4Ò4ÐZÐZÐZÐZÐZ¸¼ÐZÈNÐZ¸ÈNÒ9ZÐZÐZÐZÐZÑZÕZÔZÐZÐZÐZÐZˆ{Ð4ÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZˆrÑZÔZÐZÕZÔZˆrÑZÔZÐZÐZÕZÔZˆ{ÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ�nÑZÔZÐZÕZÔZ�nÑZÔZÐZÐZÕZÔZÐ4ÑZÔZÐZÐZÑZÐZÐZÐZÐZÐZÑZÐZÐZ×ZÒZÐZÑZÔZÐZÐZÐZÕZÔZÐZÐZÐZÐZ¸ÈNÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ¸ÑZÔZÐZÕZÔZ¸ÑZÔZÐZÐZÕZÔZ¸ÑZÔZÕZÔZÈNÑZÔZÐZÐZÑZÐZÐZÐZÐZÐZÑZÐZÐZ×ZÒZÐZÑZÔZÐZÕZÔZÐZÐZÑZÔZÐZÑZÐZÐZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZÐZr   c                 óÞ  — t          ¦   «         t          ¦   «                              dd¬¦  «        }}t          |dddd|j        ¬¦  «        }|                     |dd¬¦  «        }g }|j        }t          j        }||k    }|}	|r|j	        }
d}|
|k    }|}	|	�sÆt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |rž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          j        |d¦  «        i z  }dd|iz  }t%          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}x}
x}}dS )z8Monster enters ATTACK when player is within melee range.r.  rÙ   rÿ   r/  )gš™™™™™é?rÿ   r5  r6  ÚATTACKrô   )zL%(py4)s
{%(py4)s = %(py2)s.ai_state
} == %(py8)s
{%(py8)s = %(py6)s.ATTACK
}r:  r   r;  r<  rš   r=  r>  r?  r!  rk   r   r"  rä   N)r   r   rå   r   r'   r@  rA  r   rI  rC  r@   rA   rB   rC   rD   rE   ru   rv   rF   rG   rD  s                      r   Útest_ai_attack_within_meleez4TestTier1FeatureCoverage.test_ai_attack_within_meleeµ   sÁ  € åÑ!Ô!Õ#:Ñ#<Ô#<×#MÒ#MÈbÐ_aÐ#MÑ#bÔ#bˆAˆÝ ¨°cÀSÐRUÐ_bÐopÔowÐxÑxÔxˆØ�iŠi˜ z°eˆiÑ<Ô<ˆØSÐSˆrŒ{ÐS�nÔ3ÐSˆ{Ð3Ò3ÐSÐSÐSÐSÐS¸¼ÐSÈ8ÐS¸È8Ò8SÐSÐSÐSÐSÑSÕSÔSÐSÐSÐSÐSˆ{Ð3ÐSÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔSˆrÑSÔSÐSÕSÔSˆrÑSÔSÐSÐSÕSÔSˆ{ÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔS�nÑSÔSÐSÕSÔS�nÑSÔSÐSÐSÕSÔSÐ3ÑSÔSÐSÐSÑSÐSÐSÐSÐSÐSÑSÐSÐS×SÒSÐSÑSÔSÐSÐSÐSÕSÔSÐSÐSÐSÐS¸È8ÐSÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔS¸ÑSÔSÐSÕSÔS¸ÑSÔSÐSÐSÕSÔS¸ÑSÔSÕSÔSÈ8ÑSÔSÐSÐSÑSÐSÐSÐSÐSÐSÑSÐSÐS×SÒSÐSÑSÔSÐSÕSÔSÐSÐSÑSÔSÐSÑSÐSÐSÐSÐSÐSÑSÐSÕSÕSÔSÐSÑSÔSÑSÔSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSr   c                 óÞ  — t          ¦   «         t          ¦   «                              dd¬¦  «        }}t          |dddd|j        ¬¦  «        }|                     |dd¬¦  «        }g }|j        }t          j        }||k    }|}	|r|j	        }
d	}|
|k    }|}	|	�sÆt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |rž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          j        |d¦  «        i z  }dd|iz  }t%          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}x}
x}}dS )z<Monster enters LEASH_RETURN when pulled beyond leash radius.r.  rÙ   ç      T@rÿ   r/  ©g     @T@rL  r5  r6  ÚRETURN_TO_SPAWNrô   ©zR%(py4)s
{%(py4)s = %(py2)s.ai_state
} == %(py8)s
{%(py8)s = %(py6)s.LEASH_RETURN
}r:  r   r;  r<  rš   r=  r>  r?  r!  rk   r   r"  rä   N)r   r   rå   r   r'   r@  rA  r   ÚLEASH_RETURNrC  r@   rA   rB   rC   rD   rE   ru   rv   rF   rG   rD  s                      r   Ú%test_ai_leash_triggered_beyond_radiusz>TestTier1FeatureCoverage.test_ai_leash_triggered_beyond_radius¼   sÅ  € åÑ!Ô!Õ#:Ñ#<Ô#<×#MÒ#MÈbÐ_aÐ#MÑ#bÔ#bˆAˆÝ ¨°dÀdÐTWÐadÐqrÔqyÐzÑzÔzˆØ�iŠi˜ |¸ˆiÑ>Ô>ˆØbÐbˆrŒ{Ðb�nÔ9Ðbˆ{Ð9Ò9ÐbÐbÐbÐbÐb¸c¼oÐbÐQbÐb¸oÐQbÒ>bÐbÐbÐbÐbÑbÕbÔbÐbÐbÐbÐbˆ{Ð9ÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔbˆrÑbÔbÐbÕbÔbˆrÑbÔbÐbÐbÕbÔbˆ{ÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔb�nÑbÔbÐbÕbÔb�nÑbÔbÐbÐbÕbÔbÐ9ÑbÔbÐbÐbÑbÐbÐbÐbÐbÐbÑbÐbÐb×bÒbÐbÑbÔbÐbÐbÐbÕbÔbÐbÐbÐbÐb¸oÐQbÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔb¸cÑbÔbÐbÕbÔb¸cÑbÔbÐbÐbÕbÔb¸oÑbÔbÕbÔbÐQbÑbÔbÐbÐbÑbÐbÐbÐbÐbÐbÑbÐbÐb×bÒbÐbÑbÔbÐbÕbÔbÐbÐbÑbÔbÐbÑbÐbÐbÐbÐbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbr   c                 óJ  — t          ¦   «         t          ¦   «                              dd¬¦  «        }}t          |dddd|j        ¬¦  «        }|                     |dd¬¦  «         |j        }d	}||u }|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 )z1Monster becomes invulnerable during LEASH_RETURN.r.  rÙ   rL  rÿ   r/  rM  r5  r6  Tr3   )z7%(py2)s
{%(py2)s = %(py0)s.is_invulnerable
} is %(py5)sr:  )r7   r8   r]   zassert %(py7)sr_   N)r   r   rå   r   r'   r@  Úis_invulnerabler@   rA   rB   rC   rD   rE   rF   rG   )	rI   rE  rÝ   r:  rJ   rx   rK   r€   r�   s	            r   Ú+test_ai_leash_return_grants_invulnerabilityzDTestTier1FeatureCoverage.test_ai_leash_return_grants_invulnerabilityÃ   sK  € åÑ!Ô!Õ#:Ñ#<Ô#<×#MÒ#MÈbÐ_aÐ#MÑ#bÔ#bˆAˆÝ ¨°dÀdÐTWÐadÐqrÔqyÐzÑzÔzˆØ
�	Š	�" °%ˆ	Ñ8Ô8Ð8ØÔ!Ð) TÐ)Ð! TÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð! TÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆrÑ)Ô)Ð)Õ)Ô)ˆrÑ)Ô)Ð)Ð)Õ)Ô)Ð!Ñ)Ô)Õ)Ô) TÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)r   c                 óx  — t          ¦   «         t          ¦   «                              dd¬¦  «        }}t          |dddd|j        dz  ¬¦  «        }|j        }|                     |dd¬	¦  «         |j        }||k    }|sÕt          j        d
|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}t          j        }|j        }	|	|z
  }
|j        }d}||z  }d} ||
||¬¦  «        }|�s›ddt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        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        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœ
z  }t          t          j        |¦  «        ¦  «        ‚dx}x}	x}
x}x}x}x}}dS )z3Monster regenerates 30% HP/sec during LEASH_RETURN.r.  rÙ   r  rÿ   gš™™™™™É?r/  )g     €I@r  g      ð?r6  rÛ   )z1%(py2)s
{%(py2)s = %(py0)s.current_hp
} > %(py4)sr:  Ú
initial_hprö   r©   r:   Ng333333Ó?g{®Gáz„?)Úrel_tolz½assert %(py17)s
{%(py17)s = %(py2)s
{%(py2)s = %(py0)s.isclose
}((%(py5)s
{%(py5)s = %(py3)s.current_hp
} - %(py6)s), (%(py10)s
{%(py10)s = %(py8)s.max_hp
} * %(py12)s), rel_tol=%(py15)s)
}ÚmathrÝ   )
r7   r8   r˜   r]   r:   ró   rš   re   rÅ   r�   )r   r   rå   r   r'   r&   r@  r@   rA   rB   rC   rD   rE   rF   rG   rX  Úisclose)rI   rE  rÝ   r:  rV  rJ   rK   r¬   r­   rx   rN   r}   r{   r|   ré   r¼   r£   s                    r   Ú'test_ai_leash_return_regenerates_healthz@TestTier1FeatureCoverage.test_ai_leash_return_regenerates_healthÊ   sh  € åÑ!Ô!Õ#:Ñ#<Ô#<×#MÒ#MÈbÐ_aÐ#MÑ#bÔ#bˆAˆÝ ¨°dÀdÐTWÐadÐqrÔqyÐ|Ñqð  Añ  Aô  AˆØ”]ˆ
Ø
�	Š	�" °#ˆ	Ñ6Ô6Ð6ØŒ}Ð)ˆ}˜zÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ}˜zÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆrÑ)Ô)Ð)Õ)Ô)ˆrÑ)Ô)Ð)Ð)Õ)Ô)ˆ}Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)˜zÑ)Ô)Ð)Õ)Ô)˜zÑ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)ÝŒ|ÐV˜BœMÐV˜M¨JÑ6ÐV¸¼ÐVÀ4ÐV¸À4¹ÐVÐQUÐVˆ|ˆ|Ð6¸ÐQUÐVÑVÔVÐVÐVÑVÐVÐVÕVÔVÑVÔVÐVÐVÕVÔV�tÑVÔVÐVÕVÔV�tÑVÔVÐVÐVÕVÔVˆ|ÑVÔVÐVÕVÔVÑVÔVÐVÐVÕVÔV˜BÑVÔVÐVÕVÔV˜BÑVÔVÐVÐVÕVÔV˜MÑVÔVÐVÕVÔVÑVÔVÐVÐVÕVÔV¨JÑVÔVÐVÕVÔV¨JÑVÔVÐVÐVÐVÕVÔVÑVÔVÐVÐVÕVÔV¸ÑVÔVÐVÕVÔV¸ÑVÔVÐVÐVÕVÔV¸ÑVÔVÕVÔVÀ4ÑVÔVÕVÔVÐQUÑVÔVÕVÔVÐVÑVÔVÐVÐVÑVÐVÕVÕVÔVÐVÑVÔVÑVÔVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVr   r   c           	      ó,  — |                      dt          dddd¦  «        ¦  «        \  }}}g }d}||u }|}|rt          |¦  «        }	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  }| 	                    |¦  «         |ræt          j        d|fd|	|
f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}	x}}
dS )z9Astral Map Device opens exactly 6 portals for Tier 1 map.Úp1Úm1ÚT1r   r³   Té   r3   rZ   Úokr\   r^   r_   rô   ©z4%(py12)s
{%(py12)s = %(py9)s(%(py10)s)
} == %(py15)sÚlenÚportals©r;   rš   re   rÅ   ú%(py17)sr�   r   úassert %(py20)srã   N©Úactivate_map_devicer   rb  r@   rA   rB   rC   rD   rE   ru   rv   rF   rG   ©rI   r   r`  rû   rc  rJ   rx   rK   ry   r{   ré   r|   r€   r�   r¢   r£   rì   r#  s                     r   Ú(test_map_device_activates_six_portals_t1zATestTier1FeatureCoverage.test_map_device_activates_six_portals_t1Ô   sn  € à'×;Ò;¸DÅ)ÈDÐRVÐXYÐ[pÑBqÔBqÑrÔr‰ˆˆAˆwØ/Ð/�TÐ/ˆr�TˆzÐ/Ð/Ð/Ð/Ð/�c '™lœlÐ/¨aÐ/˜l¨aÒ/Ð/Ð/Ð/Ð/Ñ/Õ/Ô/Ð/Ð/Ð/Ð/ˆr�TÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆrÑ/Ô/Ð/Õ/Ô/ˆrÑ/Ô/Ð/Ð/Õ/Ô/�TÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/×/Ò/Ð/Ñ/Ô/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/˜l¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/�cÑ/Ô/Ð/Õ/Ô/�cÑ/Ô/Ð/Ð/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ 'Ñ/Ô/Ð/Õ/Ô/ 'Ñ/Ô/Ð/Ð/Õ/Ô/˜lÑ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/×/Ò/Ð/Ñ/Ô/Ð/Õ/Ô/Ð/Ð/Ñ/Ô/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/r   c           	      ó,  — |                      dt          dddd¦  «        ¦  «        \  }}}g }d}||u }|}|rt          |¦  «        }	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  }| 	                    |¦  «         |ræt          j        d|fd|	|
f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}	x}}
dS )z:Astral Map Device opens exactly 6 portals for Tier 16 map.r\  Úm16ÚT16é   Úzone_blood_scale_ruinsTr_  r3   rZ   r`  r\   r^   r_   rô   ra  rb  rc  rd  re  r�   r   rf  rã   Nrg  ri  s                     r   Ú)test_map_device_activates_six_portals_t16zBTestTier1FeatureCoverage.test_map_device_activates_six_portals_t16Ù   sn  € à'×;Ò;¸DÅ)ÈEÐSXÐZ\Ð^vÑBwÔBwÑxÔx‰ˆˆAˆwØ/Ð/�TÐ/ˆr�TˆzÐ/Ð/Ð/Ð/Ð/�c '™lœlÐ/¨aÐ/˜l¨aÒ/Ð/Ð/Ð/Ð/Ñ/Õ/Ô/Ð/Ð/Ð/Ð/ˆr�TÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆrÑ/Ô/Ð/Õ/Ô/ˆrÑ/Ô/Ð/Ð/Õ/Ô/�TÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/×/Ò/Ð/Ñ/Ô/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/˜l¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/�cÑ/Ô/Ð/Õ/Ô/�cÑ/Ô/Ð/Ð/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ 'Ñ/Ô/Ð/Õ/Ô/ 'Ñ/Ô/Ð/Ð/Õ/Ô/˜lÑ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/×/Ò/Ð/Ñ/Ô/Ð/Õ/Ô/Ð/Ð/Ñ/Ô/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/r   c           	      ó<  — |                      dt          dddd¦  «        ¦  «         |                     d¦  «        \  }}}g }d}||u }|}|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  }| 	                    |¦  «         |r`t          j        d|fd|	|
f¦  «        t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}	x}}
dS )z>Entering map portal consumes exactly 1 portal charge (6 -> 5).r\  Úm5ÚT5é   rÏ   TÚportals_remainingr3   rZ   r`  r\   r^   r_   rô   ©z%(py10)s == %(py13)s©rš   rÃ   ú%(py15)srÅ   r   úassert %(py18)srâ   N)rh  r   Úenter_map_portalr@   rA   rB   rC   rD   rE   ru   rv   rF   rG   )rI   r   r`  rû   r  rJ   rx   rK   ry   r}   rÉ   r{   r€   r�   rÊ   r¢   rƒ   rì   s                     r   Ú"test_map_portal_single_consumptionz;TestTier1FeatureCoverage.test_map_portal_single_consumptionÞ   s  € à×*Ò*¨4µ¸4ÀÀqÐJeÑ1fÔ1fÑgÔgÐgØ#×4Ò4°TÑ:Ô:‰
ˆˆAˆsØ;Ð;�TÐ;ˆr�TˆzÐ;Ð;Ð;Ð;Ð;˜cÐ"5Ô6Ð;¸!Ð;Ð6¸!Ò;Ð;Ð;Ð;Ð;Ñ;Õ;Ô;Ð;Ð;Ð;Ð;ˆr�TÐ;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;ˆrÑ;Ô;Ð;Õ;Ô;ˆrÑ;Ô;Ð;Ð;Õ;Ô;�TÑ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;×;Ò;Ð;Ñ;Ô;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð6¸!Ð;Ñ;Ô;Õ;Ô;Ð6Ñ;Ô;Õ;Ô;¸!Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;×;Ò;Ð;Ñ;Ô;Ð;Õ;Ô;Ð;Ð;Ñ;Ô;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;r   c           	      óÚ  — |                      dt          dddd¦  «        ¦  «         t          d¦  «        D ]}|                     d¦  «         Œ|                     d¦  «        d         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 )z2Entering map portal 6 times depletes charges to 0.r\  rr  rs  rt  rÏ   r_  Ú
map_deviceru  r   rô   )z%(py1)s == %(py4)sr§   r©   r:   N)
rh  r   Úrangerz  Úget_hideout_summaryr@   rA   rE   rF   rG   )rI   r   rû   ry   rK   r    r¬   r­   s           r   Ú&test_map_portal_full_depletion_to_zeroz?TestTier1FeatureCoverage.test_map_portal_full_depletion_to_zeroä   s  € à×*Ò*¨4µ¸4ÀÀqÐJeÑ1fÔ1fÑgÔgÐgÝ�q‘”ð 	2ð 	2ˆAØ×+Ò+¨DÑ1Ô1Ð1Ð1Ø×1Ò1°$Ñ7Ô7¸ÔEÐFYÔZÐ_Ð^_Ð_ÐZÐ^_Ò_Ð_Ð_Ð_Õ_Ô_Ð_Ð_Ð_Ð_ÐZÐ^_Ð_Ñ_Ô_Õ_Ô_ÐZÑ_Ô_Õ_Ô_Ð^_Ñ_Ô_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_r   c           	      óx  — |                      dt          dddd¦  «        ¦  «         t          d¦  «        D ]}|                     d¦  «         Œ|                     d¦  «        \  }}}g }d}||u }|}|rg }	d}
|
|v }|}|sd	}||v }|}|}|�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  }| 
                    |¦  «         |�rLt	          j        d|fd|
|f¦  «        t	          j	        |
¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nddœz  }dd|iz  }|	 
                    |¦  «         |s‹t	          j        d|fd||f¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nddœz  }dd|iz  }|	 
                    |¦  «         t	          j        |	d¦  «        i z  }dd|iz  }| 
                    |¦  «         t	          j        |d¦  «        i z  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}x}x}x}x}	x}
x}x}}d S )!z@Further portal entry attempts after 6 consumptions are rejected.r\  rr  rs  rt  rÏ   r_  Fz0/6u   háº¿t lÆ°á»£tr3   rZ   r`  r\   r^   r_   r`   rb   Úmsgrd   rg   rh   ri   rj   rm   rn   r   ro   rp   r   rq   rr   N)rh  r   r~  rz  r@   rA   rB   rC   rD   rE   ru   rv   rF   rG   )rI   r   rû   r`  r‚  rJ   rx   rK   ry   rz   r{   r|   r}   r~   r   r€   r�   r‚   rƒ   r„   r…   r†   r‡   rˆ   r‰   s                            r   Útest_map_device_sealed_at_zeroz7TestTier1FeatureCoverage.test_map_device_sealed_at_zeroë   ss  € à×*Ò*¨4µ¸4ÀÀqÐJeÑ1fÔ1fÑgÔgÐgÝ�q‘”ð 	2ð 	2ˆAØ×+Ò+¨DÑ1Ô1Ð1Ð1Ø#×4Ò4°TÑ:Ô:‰
ˆˆC�ØGÐG�UÐGˆr�Uˆ{ÐGÐGÐGÐGÐGÐGÐG ÐG ¨ ÐGÐGÐGÐGÐG°ÐG°À3Ð0FÐGÐGÐGÐGÐGÐGÑGÕGÔGÐGÐGÐGÐGˆr�UÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔGˆrÑGÔGÐGÕGÔGˆrÑGÔGÐGÐGÕGÔG�UÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÐGÑGÕGÔGÐGÐGÐGÐG ¨ÐGÑGÔGÕGÔG ÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔG¨ÑGÔGÐGÕGÔG¨ÑGÔGÐGÐGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÐGÐGÕGÔGÐGÐGÐGÐG°À3ÐGÑGÔGÕGÔG°ÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔGÀ3ÑGÔGÐGÕGÔGÀ3ÑGÔGÐGÐGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÕGÔGÐGÐGÑGÔGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÕGÔGÐGÐGÑGÔGÐGÑGÐGÐGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGr   ©r   N))Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rQ   rT   rŠ   r�   r¤   r®   r°   r´   r¿   rË   rÍ   rÐ   rÓ   rÕ   rí   rü   r
  r  r  r  r  r  r  r$  r,  rG  rJ  rQ  rT  rZ  r   rj  rp  r{  r€  rƒ  r   r   r   r0   r0   0   sV  € € € € € Ø[Ð[ð[Àjð [ÐUYð [ð [ð [ð [ðVÀJð VÐSWð Vð Vð Vð VðTÈjð TÐ]að Tð Tð Tð TðRÈJð RÐ[_ð Rð Rð Rð Rð\ð \ð \ð \ðh¸:ð hÈ$ð hð hð hð hðc¸ð cÈð cð cð cð cðc¸Jð cÈ4ð cð cð cð cðpð pð pð pð{ð {ð {ð {ð
UÀjð UÐUYð Uð Uð Uð Uð[Àzð [ÐVZð [ð [ð [ð [ðZÀjð ZÐUYð Zð Zð Zð ZðdÈð dÐX\ð dð dð dð dðNð Nð Nð Nð8ð 8ð 8ð 8ðAð Að Að AðAð Að Að AðAð Að Að AðTð Tð Tð TðZð Zð Zð Zð
eð eð eð eð
Dð Dð Dð Dð
Fð Fð Fð FðNð Nð Nð Nð
[ð [ð [ð [ðTð Tð Tð Tðcð cð cð cð*ð *ð *ð *ðWð Wð Wð Wð0À}ð 0ÐY]ð 0ð 0ð 0ð 0ð
0Èð 0ÐZ^ð 0ð 0ð 0ð 0ð
<Àð <ÐSWð <ð <ð <ð <ð`À]ð `ÐW[ð `ð `ð `ð `ðH¸]ð HÈtð Hð Hð Hð Hð Hð Hr   r0   c                   óœ   — e Zd ZdZdeddfd„Zdd„Zdd„Zej	         
                    dg d	¢¦  «        d
ededdfd„¦   «         Zdeddfd„ZdS )ÚTestTier2BoundaryAndCornerCasesz Tier 2: Boundary & Corner Cases.r   r   Nc                 óÞ  — |j         }d} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}|j         }d
} ||¦  «        }d}||u }|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}}d	S )z9Empty or unknown zone IDs reject hostile spawning safely.Ú Fr3   r5   r   r6   r<   r=   NÚnonexistent_zone_999r>   rH   s	            r   Ú-test_boundary_empty_and_unknown_zone_rejectedzMTestTier2BoundaryAndCornerCases.test_boundary_empty_and_unknown_zone_rejectedö   sO  € àÔ5ÐB°bÐBÐ5Ð5°bÑ9Ô9ÐB¸UÐBÐ9¸UÐBÐBÐBÐBÕBÔBÐBÐBÐBÐBÐ9¸UÐBÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBˆ{ÑBÔBÐBÕBÔBˆ{ÑBÔBÐBÐBÕBÔBÐ5ÑBÔBÕBÔB°bÑBÔBÕBÔBÐ9ÑBÔBÕBÔB¸UÑBÔBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBØÔ5ÐVÐ6LÐVÐ5Ð5Ð6LÑMÔMÐVÐQVÐVÐMÐQVÐVÐVÐVÐVÕVÔVÐVÐVÐVÐVÐMÐQVÐVÑVÔVÐVÕVÔVÑVÔVÐVÐVÕVÔVˆ{ÑVÔVÐVÕVÔVˆ{ÑVÔVÐVÐVÕVÔVÐ5ÑVÔVÕVÔVÐ6LÑVÔVÕVÔVÐMÑVÔVÕVÔVÐQVÑVÔVÐVÐVÑVÐVÐVÐVÐVÐVÑVÐVÕVÕVÔVÐVÑVÔVÑVÔVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVÐVr   c                 óä  — t          ¦   «         t          ¦   «                              dd¬¦  «        }}t          |ddddd¬¦  «        }|                     |dd¬	¦  «         g }|j        }t          j        }||k    }|}|r4t          j	        }	|j
        }
 |	|
¦  «        }| }|}|r|j        }d
}||u }|}|�s£t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |�rzddt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |	¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        dœz  }|                     |¦  «         |rž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          j        |d¦  «        i z  }dd|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	x}
x}x}x}x}}dS )zLMonsters dragged to extreme coordinates (5000m) handle leash return cleanly.rt  rÙ   ç     ˆ³@rÿ   rþ   r/  )g     ‰³@r�  r5  r6  Trô   rO  r:  r   r;  r<  rš   zknot %(py19)s
{%(py19)s = %(py14)s
{%(py14)s = %(py12)s.isnan
}(%(py17)s
{%(py17)s = %(py15)s.current_x
})
}rX  )re   rf   rÅ   r�   rk   r3   )z;%(py24)s
{%(py24)s = %(py22)s.is_invulnerable
} is %(py27)s)rä   r»   Úpy27z%(py29)srr   r   zassert %(py32)sÚpy32N)r   r   rå   r   r@  rA  r   rP  rX  Úisnanr1  rS  r@   rA   rB   rC   rD   rE   ru   rv   rF   rG   )rI   rE  rÝ   r:  rJ   rK   rN   rL   ry   r|   r¼   r~   r   rë   Ú@py_assert26Ú@py_assert25r+  rF  r#  rˆ   r‰   Ú@py_format31Ú@py_format33s                          r   Ú7test_boundary_max_distance_leash_handles_extreme_coordszWTestTier2BoundaryAndCornerCases.test_boundary_max_distance_leash_handles_extreme_coordsû   sÞ  € åÑ!Ô!Õ#:Ñ#<Ô#<×#MÒ#MÈaÐ^_Ð#MÑ#`Ô#`ˆAˆÝ ¨°fÈÐX[ÐehÐuzÐ{Ñ{Ô{ˆØ
�	Š	�"Ð!1°eˆ	Ñ<Ô<Ð<ØyÐyˆrŒ{Ðy�nÔ9Ðyˆ{Ð9Ò9ÐyÐyÐyÐyÐyÅ$Ä*ÐyÈRÌ\ÐyÀ*À*È\ÑBZÔBZÐyÐBZÐ>ZÐyÐ>ZÐyÐ>ZÐyÐ_aÔ_qÐyÐuyÐyÐ_qÐuyÐ_yÐyÐyÐyÐyÑyÕyÔyÐyÐyÐyÐyˆ{Ð9ÐyÑyÔyÐyÕyÔyÑyÔyÐyÐyÕyÔyˆrÑyÔyÐyÕyÔyˆrÑyÔyÐyÐyÕyÔyˆ{ÑyÔyÐyÕyÔyÑyÔyÐyÐyÕyÔy�nÑyÔyÐyÕyÔy�nÑyÔyÐyÐyÕyÔyÐ9ÑyÔyÐyÐyÑyÐyÐyÐyÐyÐyÑyÐyÐy×yÒyÐyÑyÔyÐyÐyÑyÐyÐyÕyÔyÑyÔyÐyÐyÕyÔyÅ$ÑyÔyÐyÕyÔyÅ$ÑyÔyÐyÐyÕyÔyÀ*ÑyÔyÐyÕyÔyÑyÔyÐyÐyÕyÔyÈRÑyÔyÐyÕyÔyÈRÑyÔyÐyÐyÕyÔyÈ\ÑyÔyÕyÔyÐBZÑyÔyÐyÐyÑyÐyÐy×yÒyÐyÑyÔyÐyÐ>ZÐyÕyÔyÐyÐyÐyÐyÐ_qÐuyÐyÑyÔyÐyÕyÔyÑyÔyÐyÐyÕyÔyÐ_aÑyÔyÐyÕyÔyÐ_aÑyÔyÐyÐyÕyÔyÐ_qÑyÔyÕyÔyÐuyÑyÔyÐyÐyÑyÐyÐyÐyÐyÐyÑyÐyÐy×yÒyÐyÑyÔyÐyÕyÔyÐyÐyÑyÔyÐyÑyÐyÐyÐyÐyÐyÑyÐyÕyÕyÔyÐyÑyÔyÑyÔyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyr   c                 ó  — |\  }}}d}|                      |j        |¦  «         |                     |j        |j        dt          j        |dz   ¦  «        }g }|j        }d}	||	u }
|
}|
r|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  }|                     |¦  «         |
rž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          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}
x}	x}x}}dS )z>Attack landing at t+251ms (beyond 250ms window) is NOT evaded.i'  rþ   éû   Frÿ   r3   r   r  rÞ   rß   r;   rÛ   )z7%(py13)s
{%(py13)s = %(py11)s.final_damage
} > %(py16)srà   rá   râ   r   r  rl   N)rù   r    r  r   r(   r  r  r@   rA   rB   rC   rD   rE   ru   rv   rF   rG   r  s                        r   Ú%test_boundary_iframe_expired_at_251mszETestTier2BoundaryAndCornerCases.test_boundary_iframe_expired_at_251ms  sv  € à(Ñˆ��TØˆØ×&Ò& t¤}°fÑ=Ô=Ð=Ø×%Ò% c¤l°D´MÀ5Í,ÔJZÐ\bÐehÑ\hÑiÔiˆØ@Ð@ˆsŒ}Ð@ Ð@ˆ} Ð%Ð@Ð@Ð@Ð@Ð@¨#Ô*:Ð@¸SÐ@Ð*:¸SÒ*@Ð@Ð@Ð@Ð@Ñ@Õ@Ô@Ð@Ð@Ð@Ð@ˆ} Ð@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@ˆsÑ@Ô@Ð@Õ@Ô@ˆsÑ@Ô@Ð@Ð@Õ@Ô@ˆ}Ñ@Ô@Õ@Ô@ Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@×@Ò@Ð@Ñ@Ô@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð*:¸SÐ@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@¨#Ñ@Ô@Ð@Õ@Ô@¨#Ñ@Ô@Ð@Ð@Õ@Ô@Ð*:Ñ@Ô@Õ@Ô@¸SÑ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@×@Ò@Ð@Ñ@Ô@Ð@Õ@Ô@Ð@Ð@Ñ@Ô@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r   Úinvalid_tier)r   éÿÿÿÿé   éc   r   c           	      ód  — |                      dt          dd|d¦  «        ¦  «        \  }}}g }d}||u }|}	|r#t          |¦  «        }
d}|
|k    }|}	|rd}||v }|}	|	�sAt          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  }| 	                    |¦  «         |�rst          j        d|fd|
|f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }| 	                    |¦  «         |r‹t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }| 	                    |¦  «         t          j
        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}
x}x}x}}dS )z<Map tiers <1 or >16 must be rejected with informative error.r\  ÚbÚBr³   Fr   z	Tier 1-16r3   rZ   r`  r\   r^   r_   rô   ra  rb  rc  rd  re  r�   r`   )z%(py20)s in %(py22)sr‚  )rã   rä   z%(py24)sr»   zassert %(py27)sr‘  Nrg  )rI   r   rœ  r`  r‚  rc  rJ   rx   rK   ry   r{   ré   r|   Ú@py_assert19rê   r€   r�   r¢   r£   r¾   r†   Ú@py_format26rˆ   s                          r   Ú(test_boundary_invalid_map_tiers_rejectedzHTestTier2BoundaryAndCornerCases.test_boundary_invalid_map_tiers_rejected
  s8  € ð *×=Ò=¸dÅIÈcÐSVÐXdÐf{ÑD|ÔD|Ñ}Ô}ÑˆˆC�ØGÐG�UÐGˆr�Uˆ{ÐGÐGÐGÐGÐG�s 7™|œ|ÐG¨qÐG˜|¨qÒ0ÐGÐGÐGÐGÐG°[ÐG°[ÀCÐ5GÐGÐGÐGÐGÑGÕGÔGÐGÐGÐGÐGˆr�UÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔGˆrÑGÔGÐGÕGÔGˆrÑGÔGÐGÐGÕGÔG�UÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÐGÑGÕGÔGÐGÐGÐGÐG˜|¨qÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔG�sÑGÔGÐGÕGÔG�sÑGÔGÐGÐGÐGÕGÔGÑGÔGÐGÐGÕGÔG 7ÑGÔGÐGÕGÔG 7ÑGÔGÐGÐGÕGÔG˜|ÑGÔGÕGÔG¨qÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÐGÐGÕGÔGÐGÐGÐGÐG°[ÀCÐGÑGÔGÕGÔG°[ÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔGÀCÑGÔGÐGÕGÔGÀCÑGÔGÐGÐGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÕGÔGÐGÐGÑGÔGÐGÑGÐGÐGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGr   c                 óŽ  — |                      d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d¦  «        \  }}g }	d}
||
u }|}|rd}||v }|}|�sXt          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  }|	 
                    |¦  «         |r‹t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|	 
                    |¦  «         t          j        |	d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	x}x}
x}}dS )zAPlayer movement within zone half-extents succeeds; outside fails.Úp_mover2   rÿ   g     àu@r   Tr3   r¦   r§   r©   r:   Ng      |@Fu   VÆ°á»£t quÃ¡ ranh giá»›irZ   Úok_outr\   r^   r_   r`   r¸   r‚  r™   r›   rf   rœ   r�   )Úspawn_playerÚupdate_player_positionr@   rA   rE   rF   rG   rB   rC   rD   ru   rv   )rI   r   ry   rK   r    r¬   r­   r¨  r‚  rJ   rx   r}   r{   r€   r�   r¡   r‚   r¢   r£   s                      r   Ú-test_boundary_player_movement_bounds_clampingzMTestTier2BoundaryAndCornerCases.test_boundary_player_movement_bounds_clamping  sâ  € à× Ò  Ð+EÀsÈCÑPÔPÐPØ×1Ò1°(¸EÀ5ÑIÔIÈ!ÔLÐTÐPTÐTÐLÐPTÐTÐTÐTÐTÕTÔTÐTÐTÐTÐTÐLÐPTÐTÑTÔTÕTÔTÐLÑTÔTÕTÔTÐPTÑTÔTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÐTÐTØ!×8Ò8¸À5È#ÑNÔN‰ˆ�ØDÐD˜ÐDˆv˜ˆÐDÐDÐDÐDÐDÐ#=ÐDÐ#=ÀÐ#DÐDÐDÐDÐDÑDÕDÔDÐDÐDÐDÐDˆv˜ÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔDˆvÑDÔDÐDÕDÔDˆvÑDÔDÐDÐDÕDÔD˜ÑDÔDÐDÐDÑDÐDÐDÐDÐDÐDÑDÐDÐD×DÒDÐDÑDÔDÐDÐDÐDÕDÔDÐDÐDÐDÐDÐ#=ÀÐDÑDÔDÕDÔDÐ#=ÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔDÀÑDÔDÐDÕDÔDÀÑDÔDÐDÐDÐDÐDÑDÐDÐDÐDÐDÐDÑDÐDÐD×DÒDÐDÑDÔDÐDÕDÔDÐDÐDÑDÔDÐDÑDÐDÐDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDr   r„  )r…  r†  r‡  rˆ  r   rŽ  r˜  r›  ÚpytestÚmarkÚparametrizer   r÷   r¥  r«  r   r   r   rŠ  rŠ  ô   só   € € € € € Ø*Ð*ðWÈð WÐX\ð Wð Wð Wð Wð
zð zð zð zðAð Að Að Að „[×Ò˜^¨_¨_¨_Ñ=Ô=ðHÀ}ð HÐdgð HÐlpð Hð Hð Hñ >Ô=ðHð
EÈð EÐX\ð Eð Eð Eð Eð Eð Er   rŠ  c                   ó:   — e Zd ZdZdeddfd„Zd	d„Zd	d„Zd	d„ZdS )
Ú!TestTier3CrossFeatureCombinationsz#Tier 3: Cross-Feature Combinations.r   r   Nc           	      óä  — d}|                      |ddd¦  «         |                     |dd¬¦  «        \  }}}g }d}||u }|}	|r
d}
||
k    }|}	|	�sXt          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  }|                     |¦  «         |r‹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          j	        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}}
|j        } ||¦  «        }|j        }d}||k    }|�st          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}dS )zWPlayer transitions through portal from Sanctuary to Wilderness, updating spatial state.Úcross_playerr2   rÿ   Úportal_sanctuary_to_tang_kiemrt  ©Úplayer_levelTr³   r3   rZ   r`  r\   r^   r_   rô   )z%(py9)s == %(py12)sÚtarget_zone)r;   re   r›   rf   r   rœ   r�   N)zw%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_player_location
}(%(py3)s)
}.zone_id
} == %(py10)sr   Úp_id©r7   r8   r˜   r]   r_   rš   úassert %(py12)sre   )r©  Útraverse_portalr@   rA   rB   rC   rD   rE   ru   rv   rF   rG   Úget_player_locationÚzone_id)rI   r   r·  r`  r¶  rû   rJ   rx   rK   ry   r{   rz   r€   r�   r¡   r‚   r¢   r£   rÈ   r}   rM   rF  s                         r   Ú5test_portal_traversal_crosses_sanctuary_to_wildernesszWTestTier3CrossFeatureCombinations.test_portal_traversal_crosses_sanctuary_to_wilderness  s“  € àˆØ× Ò  Ð'AÀ3ÈÑLÔLÐLØ(×8Ò8¸Ð?^ÐmnÐ8ÑoÔoÑˆˆK˜ØBÐB�TÐBˆr�TˆzÐBÐBÐBÐBÐBÐ-BÐB˜kÐ-BÒBÐBÐBÐBÐBÑBÕBÔBÐBÐBÐBÐBˆr�TÐBÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBˆrÑBÔBÐBÕBÔBˆrÑBÔBÐBÐBÕBÔB�TÑBÔBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÐB×BÒBÐBÑBÔBÐBÐBÐBÕBÔBÐBÐBÐBÐB˜kÐ-BÐBÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔB˜kÑBÔBÐBÕBÔB˜kÑBÔBÐBÐBÕBÔBÐ-BÑBÔBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÐB×BÒBÐBÑBÔBÐBÕBÔBÐBÐBÑBÔBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBØÔ.ÐUÐ.Ð.¨tÑ4Ô4ÐUÐ4Ô<ÐUÐ@UÐUÐ<Ð@UÒUÐUÐUÑUÕUÔUÐUÐUÐUÐUÐ<Ð@UÐUÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUˆ{ÑUÔUÐUÕUÔUˆ{ÑUÔUÐUÐUÕUÔUÐ.ÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔU¨tÑUÔUÐUÕUÔU¨tÑUÔUÐUÐUÕUÔUÐ4ÑUÔUÕUÔUÐ<ÑUÔUÕUÔUÐ@UÑUÔUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUr   c                 óœ  — |\  }}}d}|                      |j        |¦  «         |                     |j        |j        dt          j        |dz   ¦  «        }g }|j        }d}	||	u }
|
}|
r|j        }|j        }||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  }|                     |¦  «         |
rÜt          j	        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}x}x}
x}	x}x}}dS )zPPlayer executing dodge roll during incoming monster attack avoids lethal damage.iPÃ  g     @o@éx   Tr3   r   r  rÞ   rß   r;   rô   )zT%(py13)s
{%(py13)s = %(py11)s.current_hp
} == %(py17)s
{%(py17)s = %(py15)s.max_hp
}rñ   r   r!  rk   r   r"  rä   N)rù   r    r  r   r(   r  r&   r'   r@   rA   rB   rC   rD   rE   ru   rv   rF   rG   )rI   r.   r+   r	  rñ   rò   r  rJ   rK   rÈ   rL   ry   rÉ   r¼   ré   r�   rO   r£   r½   r#  r¾   s                        r   Ú'test_dodge_during_monster_attack_windupzITestTier3CrossFeatureCombinations.test_dodge_during_monster_attack_windup!  s®  € à(Ñˆ��TØˆØ×&Ò& t¤}°fÑ=Ô=Ð=Ø×%Ò% c¤l°D´MÀ5Í,ÔJZÐ\bÐehÑ\hÑiÔiˆØGÐGˆsŒ}ÐG ÐGˆ} Ð$ÐGÐGÐGÐGÐG¨¬ÐG¸D¼KÐG¨¸KÒ)GÐGÐGÐGÐGÑGÕGÔGÐGÐGÐGÐGˆ} ÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔGˆsÑGÔGÐGÕGÔGˆsÑGÔGÐGÐGÕGÔGˆ}ÑGÔGÕGÔG ÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÐGÐGÕGÔGÐGÐGÐGÐG¨¸KÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔG¨ÑGÔGÐGÕGÔG¨ÑGÔGÐGÐGÕGÔG¨ÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔG¸DÑGÔGÐGÕGÔG¸DÑGÔGÐGÐGÕGÔG¸KÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÕGÔGÐGÐGÑGÔGÐGÑGÐGÐGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGr   c           	      óà  — t          ¦   «         t          ¦   «                              dd¬¦  «        }}t          |dddd|j        dz  ¬¦  «        }|                     |dd	¬
¦  «         g }|j        }t          j        }||k    }|}|r|j	        }	d}
|	|
u }|}|�sÆt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |rž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          j        |d¦  «        i z  }dd|iz  }t%          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	x}}
dS )zFMonster in LEASH_RETURN state possesses authoritative invulnerability.éM   é   rÙ   ç      ^@rÿ   g      à?r/  )g     @^@rÄ  r5  r6  Trô   rO  r:  r   r;  r<  rš   r3   )z;%(py14)s
{%(py14)s = %(py12)s.is_invulnerable
} is %(py17)sr?  r!  rk   r   r"  rä   N)r   r   rå   r   r'   r@  rA  r   rP  rS  r@   rA   rB   rC   rD   rE   ru   rv   rF   rG   )rI   rE  rÝ   r:  rJ   rK   rN   rL   ry   r|   r¼   rè   r+  rF  r£   r½   r#  r¾   s                     r   Ú(test_leash_invulnerability_blocks_damagezJTestTier3CrossFeatureCombinations.test_leash_invulnerability_blocks_damage)  sá  € åÑ!Ô!Õ#:Ñ#<Ô#<×#MÒ#MÈbÐ_aÐ#MÑ#bÔ#bˆAˆÝ ¨°eÀuÐVYÐcfÐstÔs{ð  Bñ  tBð  Cñ  Cô  CˆØ
�	Š	�" °Eˆ	Ñ:Ô:Ð:ØXÐXˆrŒ{ÐX�nÔ9ÐXˆ{Ð9Ò9ÐXÐXÐXÐXÐX¸bÔ>PÐXÐTXÐXÐ>PÐTXÐ>XÐXÐXÐXÐXÑXÕXÔXÐXÐXÐXÐXˆ{Ð9ÐXÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔXˆrÑXÔXÐXÕXÔXˆrÑXÔXÐXÐXÕXÔXˆ{ÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔX�nÑXÔXÐXÕXÔX�nÑXÔXÐXÐXÕXÔXÐ9ÑXÔXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÐX×XÒXÐXÑXÔXÐXÐXÐXÕXÔXÐXÐXÐXÐXÐ>PÐTXÐXÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔX¸bÑXÔXÐXÕXÔX¸bÑXÔXÐXÐXÕXÔXÐ>PÑXÔXÕXÔXÐTXÑXÔXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÐX×XÒXÐXÑXÔXÐXÕXÔXÐXÐXÑXÔXÐXÑXÐXÐXÐXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXr   c           
      ó€  — d}d}t          |¦  «        }|j        }d} ||¬¦  «        }||v }|�s t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}x}x}x}x}}dS )zGStaggered monster timer prevents attack generation in AI state machine.zif (m.staggerTimer > 0) {r�   r�   r‘   r`   rÁ   r   rÂ   rÄ   rÅ   NrÆ   rÇ   s
             r   Ú+test_staggered_monster_cannot_damage_playerzMTestTier3CrossFeatureCombinations.test_staggered_monster_cannot_damage_player0  sp  € à*Ð{Ð3^Ð{­dÐ3^Ñ._Ô._Ð{Ð._Ô.iÐ{ÐszÐ{Ð.iÐ.iÐszÐ.{Ñ.{Ô.{Ð{Ð*Ð.{Ð{Ð{Ð{Ñ{Õ{Ô{Ð{Ð{Ð{Ð{Ð*Ð.{Ð{Ñ{Ô{Õ{Ô{Ð*Ñ{Ô{Ð{Õ{Ô{Ñ{Ô{Ð{Ð{Õ{Ô{­dÑ{Ô{Ð{Õ{Ô{­dÑ{Ô{Ð{Ð{Õ{Ô{Ð3^Ñ{Ô{Õ{Ô{Ð._Ñ{Ô{Õ{Ô{Ð.iÑ{Ô{Õ{Ô{ÐszÑ{Ô{Õ{Ô{Ð.{Ñ{Ô{Ð{Ð{Ñ{Ð{Ð{Ð{Ð{Ð{Ñ{Ð{Õ{Õ{Ô{Ð{Ñ{Ô{Ñ{Ô{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{Ð{r   r„  )	r…  r†  r‡  rˆ  r   r½  rÀ  rÅ  rÇ  r   r   r   r°  r°    sŽ   € € € € € Ø-Ð-ðVÐQ[ð VÐ`dð Vð Vð Vð VðHð Hð Hð HðYð Yð Yð Yð|ð |ð |ð |ð |ð |r   r°  c                   ó>   — e Zd ZdZdededdfd„Zdeddfd„Zd	d„ZdS )
ÚTestTier4RealWorldScenariosz)Tier 4: Real-World Application Scenarios.r   r   r   Nc           	      óJ  — d}|                      |ddd¦  «        }|j        }|j        } ||¦  «        }d}||u }	|	�st          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d	œz  }
d
d|
iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}	}|                     |j        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}}|                     |j        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¬¦  «        \  }}}g }d}||u }|}|r|j        } ||¦  «        }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  }|                     |¦  «         |rït          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd |iz  }|                     |¦  «         t          j        |d¦  «        i z  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}t          ¦   «         }t!          d#d$t"          j        d%d%d&¬'¦  «        }t!          d(d)t"          j        d*d*d+¬'¦  «        } |                     |¦  «         |                     | ¦  «         d,}!|                     | j        |!¦  «         |                     |j        | j        |j        |j        |!d-z   ¦  «        }"g }|"j        }d}||u }#|#}|#r| 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        |¦  «        d0œz  }d1d2|iz  }&|                     |&¦  «         |#ržt          j        d3|%fd4|$|f¦  «        d5t          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        nd5t          j        |$¦  «        t          j        |¦  «        d6œz  }'d7d8|'iz  }(|                     |(¦  «         t          j        |d¦  «        i z  }d9d:|iz  })t          t          j
        |)¦  «        ¦  «        ‚dx}x}x}x}#x}x}$x}%}|                     | j        |j        | j        | j        |!d;z   ¦  «        }*g }|*j        }d}||u }#|#}|#r|*j        }$d+}d<}+||+z  },|$|,k    }%|%}|�s‘t          j        d|#fd.||f¦  «        d=t          j        ¦   «         v st          j        |*¦  «        rt          j        |*¦  «        nd=t          j        |¦  «        t          j        |¦  «        d0œz  }d1d2|iz  }&|                     |&¦  «         |#r±t          j        d>|%fd?|$|,f¦  «        d=t          j        ¦   «         v st          j        |*¦  «        rt          j        |*¦  «        nd=t          j        |$¦  «        t          j        |¦  «        t          j        |+¦  «        d@œz  }dAd:|iz  })|                     |)¦  «         t          j        |d¦  «        i z  }dBdC|iz  }-t          t          j
        |-¦  «        ¦  «        ‚dx}x}x}x}#x}x}$x}%x}x}+},t;          dDdEdFdG¦  «        }.|                     ||.¦  «        \  }/}}0g }d}|/|u }|}|rt?          |0¦  «        }1dH}%|1|%k    }|}|�s³t          j        d|fd|/|f¦  «        dIt          j        ¦   «         v st          j        |/¦  «        rt          j        |/¦  «        ndIt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |ræt          j        d3|fdJ|1|%f¦  «        dKt          j        ¦   «         v st          j        t>          ¦  «        rt          j        t>          ¦  «        ndKdLt          j        ¦   «         v st          j        |0¦  «        rt          j        |0¦  «        ndLt          j        |1¦  «        t          j        |%¦  «        dMœz  }2dNdO|2iz  }|                     |¦  «         t          j        |d¦  «        i z  }(dPdQ|(iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}1x}}%|                      |¦  «        \  }3}}4g }d}|3|u }|}|r|4dR         }dS}$||$k    }1|1}|�s-t          j        d|fd|3|f¦  «        dTt          j        ¦   «         v st          j        |3¦  «        rt          j        |3¦  «        ndTt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |r`t          j        d3|1fdU||$f¦  «        t          j        |¦  «        t          j        |$¦  «        dVœz  }5dWdX|5iz  }2|                     |2¦  «         t          j        |d¦  «        i z  }'dYd8|'iz  }(t          t          j
        |(¦  «        ¦  «        ‚dx}x}x}x}x}x}1}$dS )ZzhComplete E2E simulation: Sanctuary -> Wilderness -> Combat -> Dodge -> Victory -> Hideout -> Map Device.Úhero_e2e_journeyr2   rÿ   Fr3   )z~%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.can_spawn_hostile_monsters
}(%(py5)s
{%(py5)s = %(py3)s.zone_id
})
} is %(py10)sr   Úlocr¸  r¹  re   NrV   r   r¦   r§   r©   r:   Tr³  r.  r´  rZ   r`  r\   r^   r_   )zf%(py14)s
{%(py14)s = %(py11)s
{%(py11)s = %(py9)s.can_spawn_hostile_monsters
}(%(py12)s)
} is %(py17)sÚw_zone)r;   r=   re   rf   r�   r!  rk   r"  rä   ée   u   Cuá»“ng Khuyá»ƒng     Àr@g     €Q@)r&   r'   r#   éf   ÚHeror%   g     Àb@i † é2   r   Úevaded_strikerÞ   rß   r;   rô   )z6%(py13)s
{%(py13)s = %(py11)s.current_hp
} == %(py16)sÚherorà   rá   râ   r  rl   i,  g333333ó?Úcounter_strike)ú>=)zE%(py13)s
{%(py13)s = %(py11)s.final_damage
} >= (%(py16)s * %(py18)s))r=   rÃ   rh   râ   r¹   rº   r»   Úmap_endgame_t14u   Pháº¿ TÃ­ch Xáº» Thá»‹té   ro  r_  Úok_devra  rb  rc  rd  re  r�   rf  rã   ru  rt  Úok_enterrv  rw  rx  rÅ   ry  )!r©  r?   r¼  r@   rA   rB   rC   rD   rE   rF   rG   rt   rº  ru   rv   r   r   r   r(   ÚTHUYr*   rù   r    r  r#   r"   r  r&   r  r   rh  rb  rz  )6rI   r   r   Ú	player_idrÌ  rJ   rx   rÈ   r}   rM   rF  r¡   ry   rK   r    r¬   r­   r`  rÍ  rû   rz   r|   r¼   rè   r€   r�   r£   r½   r#  r¾   ÚcombatÚmobrÓ  rò   rÒ  rL   rÉ   ré   rO   rƒ   rì   r„   rÔ  Ú@py_assert17r£  r†   Ú
astral_maprØ  rc  r{   r¢   rÙ  r  rÊ   s6                                                         r   Ú&test_e2e_full_player_journey_lifecyclezBTestTier4RealWorldScenarios.test_e2e_full_player_journey_lifecycle6  s2  € à&ˆ	à×&Ò& yÐ2LÈcÐSVÑWÔWˆØÔ5ÐK°c´kÐKÐ5Ð5°kÑBÔBÐKÀeÐKÐBÀeÐKÐKÐKÑKÕKÔKÐKÐKÐKÐKÐBÀeÐKÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔKˆ{ÑKÔKÐKÕKÔKˆ{ÑKÔKÐKÐKÕKÔKÐ5ÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK°cÑKÔKÐKÕKÔK°cÑKÔKÐKÐKÕKÔK°kÑKÔKÕKÔKÐBÑKÔKÕKÔKÀeÑKÔKÐKÐKÑKÐKÐKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKØ×1Ò1°#´+ÈÐ1ÑNÔNÈqÔQÐZÐUZÐZÐQÐUZÐZÐZÐZÐZÕZÔZÐZÐZÐZÐZÐQÐUZÐZÑZÔZÕZÔZÐQÑZÔZÕZÔZÐUZÑZÔZÐZÐZÑZÐZÐZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZÐZØ×1Ò1°#´+ÈÐ1ÑMÔMÈaÔPÐXÐTXÐXÐPÐTXÐXÐXÐXÐXÕXÔXÐXÐXÐXÐXÐPÐTXÐXÑXÔXÕXÔXÐPÑXÔXÕXÔXÐTXÑXÔXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXà#×3Ò3°IÐ?^ÐmoÐ3ÑpÔp‰ˆˆF�AØTÐT�TÐTˆr�TˆzÐTÐTÐTÐTÐT˜kÔDÐTÐDÐDÀVÑLÔLÐTÐPTÐTÐLÐPTÐTÐTÐTÐTÐTÑTÕTÔTÐTÐTÐTÐTˆr�TÐTÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔTˆrÑTÔTÐTÕTÔTˆrÑTÔTÐTÐTÕTÔT�TÑTÔTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÐT×TÒTÐTÑTÔTÐTÐTÐTÕTÔTÐTÐTÐTÐTÐLÐPTÐTÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔT˜kÑTÔTÐTÕTÔT˜kÑTÔTÐTÐTÕTÔTÐDÑTÔTÐTÕTÔTÑTÔTÐTÐTÕTÔTÀVÑTÔTÐTÕTÔTÀVÑTÔTÐTÐTÕTÔTÐLÑTÔTÕTÔTÐPTÑTÔTÐTÐTÑTÐTÐTÐTÐTÐTÑTÐTÐT×TÒTÐTÑTÔTÐTÕTÔTÐTÐTÑTÔTÐTÑTÐTÐTÐTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTå‘”ˆÝ˜#Ð1µ<Ô3CÐPUÐ^cÐquÐvÑvÔvˆÝ˜3 ­Ô(9ÀfÐU[ÐinÐoÑoÔoˆØ×Ò˜cÑ"Ô"Ð"Ø×Ò˜dÑ#Ô#Ð#ØˆØ×&Ò& t¤}°fÑ=Ô=Ð=Ø×/Ò/°´¸d¼mÈSÌ_Ð^aÔ^iÐkqÐtvÑkvÑwÔwˆØLÐLˆ}Ô&ÐL¨$ÐLÐ&¨$Ð.ÐLÐLÐLÐLÐL°4´?ÐLÀfÐL°?ÀfÒ3LÐLÐLÐLÐLÑLÕLÔLÐLÐLÐLÐLÐ&¨$ÐLÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔLˆ}ÑLÔLÐLÕLÔLˆ}ÑLÔLÐLÐLÕLÔLÐ&ÑLÔLÕLÔL¨$ÑLÔLÐLÐLÑLÐLÐLÐLÐLÐLÑLÐLÐL×LÒLÐLÑLÔLÐLÐLÐLÕLÔLÐLÐLÐLÐL°?ÀfÐLÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔL°4ÑLÔLÐLÕLÔL°4ÑLÔLÐLÐLÕLÔL°?ÑLÔLÕLÔLÀfÑLÔLÐLÐLÑLÐLÐLÐLÐLÐLÑLÐLÐL×LÒLÐLÑLÔLÐLÕLÔLÐLÐLÑLÔLÐLÑLÐLÐLÐLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLØ×0Ò0°´ÀÄÈdÔN^Ð`dÔ`lÐntÐwzÑnzÑ{Ô{ˆØ_Ð_ˆ~Ô'Ð_¨5Ð_Ð'¨5Ð0Ð_Ð_Ð_Ð_Ð_°^Ô5PÐ_ÐTYÐ_Ð\_Ð_ÐTYÐ\_ÑT_Ð_Ð5PÐT_Ò5_Ð_Ð_Ð_Ð_Ñ_Õ_Ô_Ð_Ð_Ð_Ð_Ð'¨5Ð_Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_ˆ~Ñ_Ô_Ð_Õ_Ô_ˆ~Ñ_Ô_Ð_Ð_Õ_Ô_Ð'Ñ_Ô_Õ_Ô_¨5Ñ_Ô_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_×_Ò_Ð_Ñ_Ô_Ð_Ð_Ð_Õ_Ô_Ð_Ð_Ð_Ð_Ð5PÐT_Ð_Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_°^Ñ_Ô_Ð_Õ_Ô_°^Ñ_Ô_Ð_Ð_Õ_Ô_Ð5PÑ_Ô_Õ_Ô_ÐTYÑ_Ô_Õ_Ô_Ð\_Ñ_Ô_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_×_Ò_Ð_Ñ_Ô_Ð_Õ_Ô_Ð_Ð_Ñ_Ô_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_åÐ0Ð2KÈRÐQiÑjÔjˆ
Ø+×?Ò?À	È:ÑVÔVÑˆ��7Ø3Ð3˜Ð3ˆv˜ˆ~Ð3Ð3Ð3Ð3Ð3¥# g¡,¤,Ð3°!Ð3 ,°!Ò"3Ð3Ð3Ð3Ð3Ñ3Õ3Ô3Ð3Ð3Ð3Ð3ˆv˜Ð3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ˆvÑ3Ô3Ð3Õ3Ô3ˆvÑ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Ð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Ð3Õ3Ô3 gÑ3Ô3Ð3Õ3Ô3 gÑ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Ô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Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ø)×:Ò:¸9ÑEÔEÑˆ�!�SØAÐA˜4ÐAˆx˜4ÐÐAÐAÐAÐAÐA CÐ(;Ô$<ÐAÀÐAÐ$<ÀÒ$AÐAÐAÐAÐAÑAÕAÔAÐAÐAÐAÐAˆx˜4ÐAÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔAˆxÑAÔAÐAÕAÔAˆxÑAÔAÐAÐAÕAÔA˜4ÑAÔAÐAÐAÑAÐAÐAÐAÐAÐAÑAÐAÐA×AÒAÐAÑAÔAÐAÐAÐAÕAÔAÐAÐAÐAÐAÐ$<ÀÐAÑAÔAÕAÔAÐ$<ÑAÔAÕAÔAÀÑAÔAÐAÐAÑAÐAÐAÐAÐAÐAÑAÐAÐA×AÒAÐAÑAÔAÐAÕAÔAÐAÐAÑAÔAÐAÑAÐAÐAÐAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAr   c                 ó  — |                      d¦  «        }g }d}||u}|}|r|j        }t          j        }||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  }| 
                    |¦  «         |ræt	          j        d	|	fd
||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }| 
                    |¦  «         t	          j        |d¦  «        i z  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	}dS )zJVerifies zone_player_hideout is registered in ZoneEngine without KeyError.rS   N)úis not)z%(py2)s is not %(py5)sÚzoner\   r^   r_   rô   )zU%(py11)s
{%(py11)s = %(py9)s.zone_type
} == %(py15)s
{%(py15)s = %(py13)s.SANCTUARY
}r	   )r;   r=   rÃ   rÅ   re  r�   r   rf  rã   )Úget_zoneÚ	zone_typer	   Ú	SANCTUARYr@   rA   rB   rC   rD   rE   ru   rv   rF   rG   )rI   r   rã  rJ   rx   rK   ry   rz   ré   rÉ   r€   r�   r¢   r£   rì   r#  s                   r   Ú0test_e2e_canonical_hideout_registration_baselinezLTestTier4RealWorldScenarios.test_e2e_canonical_hideout_registration_baselineT  sY  € à×#Ò#Ð$9Ñ:Ô:ˆØHÐH˜4ÐHˆt˜4ÐÐHÐHÐHÐHÐH D¤NÐHµhÔ6HÐH NÐ6HÒ$HÐHÐHÐHÐHÑHÕHÔHÐHÐHÐHÐHˆt˜4ÐHÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔHˆtÑHÔHÐHÕHÔHˆtÑHÔHÐHÐHÕHÔH˜4ÑHÔHÐHÐHÑHÐHÐHÐHÐHÐHÑHÐHÐH×HÒHÐHÑHÔHÐHÐHÐHÕHÔHÐHÐHÐHÐH NÐ6HÐHÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔH DÑHÔHÐHÕHÔH DÑHÔHÐHÐHÕHÔH NÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔHµhÑHÔHÐHÕHÔHµhÑHÔHÐHÐHÕHÔHÐ6HÑHÔHÐHÐHÑHÐHÐHÐHÐHÐHÑHÐHÐH×HÒHÐHÑHÔHÐHÕHÔHÐHÐHÑHÔHÐHÑHÐHÐHÐHÐHÐHÑHÐHÕHÕHÔHÐHÑHÔHÑHÔHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHr   c                 óÔ  — d}t          |¦  «        }|j        } |¦   «         }|s»ddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}}dS )zFVerifies target_dummy_telemetry.js exists for combo and DPS telemetry.z1client/webapp/js/engine/target_dummy_telemetry.jsr&  r   r'  Nr(  r*  s         r   Ú$test_dummy_telemetry_module_baselinez@TestTier4RealWorldScenarios.test_dummy_telemetry_module_baselineY  sò   € àGÐQ�tÐGÑHÔHÐQÐHÔOÐQÐOÐOÑQÔQÐQÐQÐQÐQÐQÕQÔQÑQÔQÐQÐQÕQÔQ�tÑQÔQÐQÕQÔQ�tÑQÔQÐQÐQÕQÔQÐGÑQÔQÕQÔQÐHÑQÔQÕQÔQÐOÑQÔQÕQÔQÐQÑQÔQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQr   r„  )	r…  r†  r‡  rˆ  r   r   rà  rç  ré  r   r   r   rÉ  rÉ  4  s�   € € € € € Ø3Ð3ðBÀ*ð BÐ^kð BÐptð Bð Bð Bð Bð<IÈJð IÐ[_ð Ið Ið Ið Ið
Rð Rð Rð Rð Rð Rr   rÉ  )6rˆ  ÚbuiltinsrB   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter@   rX  ÚosÚsysrø   Úpathlibr   Útypingr   r   r   r¬  ÚpathÚabspathÚjoinÚdirnameÚ__file__Ú
SERVER_DIRÚinsertÚserver.world.zone_enginer   Úserver.world.zone_typesr	   r
   Úserver.world.hideout_enginer   r   Úserver.world.combat_enginer   r   Úserver.world.martial_matrixr   Úserver.world.monster_typesr   r   r   Úserver.world.monster_ai_enginer   Ú&server.world.monster_procedural_enginer   Úfixturer   r   r.   r0   rŠ  r°  rÉ  r   r   r   ú<module>r     så  ððð ð € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø €€€àŒW�_Š_˜RœWŸ\š\¨"¬'¯/ª/¸(Ñ*CÔ*CÀ^ÑTÔTÑUÔU€
Ø�S”XÐÐØ„H‡O‚O�A�zÑ"Ô"Ð"à /Ð /Ð /Ð /Ð /Ð /Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XØ :Ð :Ð :Ð :Ð :Ð :Ø JÐ JÐ JÐ JÐ JÐ Jà„ð�Zð ð ð ñ „ðð „ð˜ð ð ð ñ „ðð „ð&�e˜L¨+°{ÐBÔCð &ð &ð &ñ „ð&ðAHð AHð AHð AHð AHñ AHô AHð AHðH!Eð !Eð !Eð !Eð !Eñ !Eô !Eð !EðF|ð |ð |ð |ð |ñ |ô |ð |ð:'Rð 'Rð 'Rð 'Rð 'Rñ 'Rô 'Rð 'Rð 'Rð 'Rr   