§
    ¿jRI  ã                   ó&  — d Z ddlZddlmc mZ ddlZddlm	Z	m
Z
mZmZ ddlmZmZmZmZmZmZmZ ddlmZmZmZ ddlmZmZmZ ddlmZmZm Z   G d„ d	¦  «        Z! G d
„ d¦  «        Z" G d„ d¦  «        Z# G d„ d¦  «        Z$ G d„ d¦  «        Z%dS )a&  
Unit Test Suite for FreeExile Map Data, Server-Authoritative War-Fog,
Procedural Generation, and Anti-Bot Dynamic Obstacle Architecture.

Tests:
1. Map Biome Catalog and Tile Types (Savage Grimdark themes, no Xianxia).
2. Procedural Map Generator (BSP + Caves, 100% connectivity spawn to boss).
3. Anti-Bot Dynamic Obstacles (Destructibles, Debris, Mud pools, Spikes).
4. Real-time Obstacle Destruction and Walkable Grid Mutation.
5. Anti-Bot Path Complexity (Sinuosity ratio >= 1.25, non-linear corridors).
6. Server-Authoritative War-Fog Engine (FOV Line of Sight, Wall obstruction).
7. Anti-Maphack Entity Visibility Filtering (Hidden entities in fog never sent).
8. Fog Delta Compression (Run-Length Encoding / Bitmask efficiency).
9. Deceptive Dead-End and Ambush Pocket generation for bot trapping.
é    N)ÚListÚTupleÚDictÚAny)ÚTileTypeÚFogStateÚObstacleTypeÚTileCellÚObstacleInstanceÚMapGridDataÚPlayerVisibilityState)Ú
MAP_BIOMESÚget_biome_definitionÚlist_available_biomes)ÚWarFogEngineÚcompress_fog_rleÚdecompress_fog_rle)ÚProceduralMapEngineÚverify_path_connectivityÚcalculate_path_sinuosityc                   ó   — e Zd Zd„ Zd„ ZdS )ÚTestMapBiomeCatalogc           	      ó¶  — t          ¦   «         }t          |¦  «        }d}||k    }|sò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          t          j	        |¦  «        ¦  «        ‚d	x}x}}g d
¢}|D �]1}||v }	|	sÂt          j        d|	fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }
dd|
iz  }t          t          j	        |¦  «        ¦  «        ‚d	}	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t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}	}|j        }	d}|	|k    }|sªt          j        d|fd|	|f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}	x}}|j        }t          |¦  «        }d}||k    }|�s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        |¦  «        t          j        |¦  «        dœz  }dd |iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}x}x}}d!}|j        }||v}|sªt          j        d"|fd#||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d$œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}x}}d%}|j        }||v}|sªt          j        d"|fd&||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d$œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}x}}�Œ3d	S )'zJVerifies 5 canonical Savage Grimdark Biomes exist with correct attributes.é   ©ú==©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚbiomes©Úpy0Úpy1Úpy3Úpy6úassert %(py8)sÚpy8N)ÚSAVAGE_MANGROVE_SWAMPÚCRIMSON_BLOOD_FORESTÚBLEACHED_BONE_CANYONÚOUTCAST_MINE_SHAFTSÚCORRUPTED_FIEND_RUINS)Úin)z%(py0)s in %(py2)sÚb©r!   Úpy2úassert %(py4)sÚpy4)z0%(py2)s
{%(py2)s = %(py0)s.biome_id
} == %(py4)sÚdefn©r!   r/   r1   úassert %(py6)sr$   ç      ð?©ú>=)z:%(py2)s
{%(py2)s = %(py0)s.hazard_slow_factor
} >= %(py5)s©r!   r/   Úpy5úassert %(py7)sÚpy7é   )zV%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.obstacle_palette
})
} >= %(py8)s©r!   r"   r#   r9   r&   úassert %(py10)sÚpy10u   TiÃªn)únot in)z0%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.name
})r"   r#   r9   u   Linh Tháº¡ch)z7%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.description
})r   r   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr   Úbiome_idÚhazard_slow_factorÚobstacle_paletteÚnameÚdescription)Úselfr   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9Úexpected_biomesr-   Ú@py_assert1Ú@py_format3Ú@py_format5r2   Ú@py_assert3Ú@py_format6Ú@py_format8Ú@py_assert7Ú@py_assert6Ú@py_format11Ú@py_assert0s                       úCC:\Projects\FreeExile\tests\unit\test_war_fog_and_procedural_map.pyÚ)test_canonical_grimdark_biomes_registeredz=TestMapBiomeCatalog.test_canonical_grimdark_biomes_registered/   s!  € å&Ñ(Ô(ˆÝ�6‰{Œ{Ð ˜bÐ ˆ{˜bÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ{˜bÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �sÑ Ô Ð Õ Ô �sÑ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô �6Ñ Ô Ð Õ Ô �6Ñ Ô Ð Ð Õ Ô ˆ{Ñ Ô Õ Ô ˜bÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð ð
ð 
ð 
ˆð !ð 	:ñ 	:ˆAØ˜�;ÐÐÐÕÔÐÐÐÐ�1˜ÐÑÔÐÕÔÑÔÐÐÕÔ�1ÑÔÐÕÔ�1ÑÔÐÐÐÕÔÑÔÐÐÕÔ˜ÑÔÐÕÔ˜ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÝ'¨Ñ*Ô*ˆDØ”=Ð%�= AÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%�= AÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�4Ñ%Ô%Ð%Õ%Ô%�4Ñ%Ô%Ð%Ð%Õ%Ô%�=Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô% AÑ%Ô%Ð%Õ%Ô% AÑ%Ô%Ð%Ð%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%ØÔ*Ð1¨cÐ1Ð*¨cÒ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð*¨cÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�4Ñ1Ô1Ð1Õ1Ô1�4Ñ1Ô1Ð1Ð1Õ1Ô1Ð*Ñ1Ô1Õ1Ô1¨cÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØÔ,Ð2•3Ð,Ñ-Ô-Ð2°Ð2Ð-°Ò2Ð2Ð2Ñ2Õ2Ô2Ð2Ð2Ð2Ð2Ð-°Ð2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2•3Ñ2Ô2Ð2Õ2Ô2•3Ñ2Ô2Ð2Ð2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2�tÑ2Ô2Ð2Õ2Ô2�tÑ2Ô2Ð2Ð2Õ2Ô2Ð,Ñ2Ô2Õ2Ô2Ð-Ñ2Ô2Õ2Ô2°Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2àÐ+ $¤)Ð+�7 )Ð+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+�7 )Ð+Ñ+Ô+Õ+Ô+�7Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ $Ñ+Ô+Ð+Õ+Ô+ $Ñ+Ô+Ð+Ð+Õ+Ô+ )Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø!Ð9¨Ô)9Ð9�>Ð)9Ð9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9�>Ð)9Ð9Ñ9Ô9Õ9Ô9�>Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9¨Ñ9Ô9Ð9Õ9Ô9¨Ñ9Ô9Ð9Ð9Õ9Ô9Ð)9Ñ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ñ9ð	:ð 	:ó    c                 ó6  — t          ddt          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}}|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}}t          ddt          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}}|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}}t          ddt          j        ddd¬¦  «        }|j        }d}||k    }|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}dS )z=Verifies tile cell attributes for floors, walls, and hazards.é   r<   TF©ÚxÚyÚ	tile_typeÚwalkableÚblocks_vision©Úis)z0%(py2)s
{%(py2)s = %(py0)s.walkable
} is %(py5)sÚfloorr8   r:   r;   N)z5%(py2)s
{%(py2)s = %(py0)s.blocks_vision
} is %(py5)sé   Úwallg       @)re   rf   rg   rh   ri   Úmovement_costr   )z5%(py2)s
{%(py2)s = %(py0)s.movement_cost
} == %(py5)sÚmud)r
   r   ÚFLOORrh   rA   rB   rC   rD   rE   rF   rG   rH   ri   ÚWALLÚMUD_POOLro   )	rN   rl   rU   rQ   rX   rY   rZ   rn   rp   s	            r_   Útest_tile_cell_attributesz-TestMapBiomeCatalog.test_tile_cell_attributesD   sÃ  € å˜1 ­X¬^ÀdÐZ_Ð`Ñ`Ô`ˆØŒ~Ð% Ð%ˆ~ Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ~ Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆuÑ%Ô%Ð%Õ%Ô%ˆuÑ%Ô%Ð%Ð%Õ%Ô%ˆ~Ñ%Ô%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØÔ"Ð+ eÐ+Ð" eÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆuÑ+Ô+Ð+Õ+Ô+ˆuÑ+Ô+Ð+Ð+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+å˜!˜q­H¬MÀEÐY]Ð^Ñ^Ô^ˆØŒ}Ð% Ð%ˆ} Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ} Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆtÑ%Ô%Ð%Õ%Ô%ˆtÑ%Ô%Ð%Ð%Õ%Ô%ˆ}Ñ%Ô%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØÔ!Ð) TÐ)Ð! TÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð! TÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆtÑ)Ô)Ð)Õ)Ô)ˆtÑ)Ô)Ð)Ð)Õ)Ô)Ð!Ñ)Ô)Õ)Ô) TÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)åØ�1¥Ô 1¸DÐPUÐehð
ñ 
ô 
ˆð Ô Ð' CÐ'Ð  CÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð  CÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆsÑ'Ô'Ð'Õ'Ô'ˆsÑ'Ô'Ð'Ð'Õ'Ô'Ð Ñ'Ô'Õ'Ô' CÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ra   N)Ú__name__Ú
__module__Ú__qualname__r`   rt   © ra   r_   r   r   .   s2   € € € € € ð:ð :ð :ð*(ð (ð (ð (ð (ra   r   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚTestProceduralMapGenerationc                 óê  — t          dd¬¦  «        }|                     dd¬¦  «        }|                     dd¬¦  «        }|j        }|j        }||k    }d}||k    }|r|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        |¦  «        d
œz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}}|j        }|j        }||k    }d}||k    }|r|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        |¦  «        d
œz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}}|j        }|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	t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}|j        }|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	t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}|j        }t          |¦  «        }|j        }t          |¦  «        }||k    }|�sž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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          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}}dS )z0Same seed must produce identical dungeon layout.é0   ©ÚwidthÚheighti90  r)   ©ÚseedrI   )r   r   )zH%(py2)s
{%(py2)s = %(py0)s.width
} == %(py7)s
{%(py7)s = %(py5)s.width
}z-%(py7)s
{%(py7)s = %(py5)s.width
} == %(py9)sÚmap_aÚmap_b)r!   r/   r9   r;   Úpy9úassert %(py11)sÚpy11N)zJ%(py2)s
{%(py2)s = %(py0)s.height
} == %(py7)s
{%(py7)s = %(py5)s.height
}z.%(py7)s
{%(py7)s = %(py5)s.height
} == %(py9)sr   )zT%(py2)s
{%(py2)s = %(py0)s.spawn_point
} == %(py6)s
{%(py6)s = %(py4)s.spawn_point
}©r!   r/   r1   r$   r%   r&   )zR%(py2)s
{%(py2)s = %(py0)s.boss_point
} == %(py6)s
{%(py6)s = %(py4)s.boss_point
})z�%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.obstacles
})
} == %(py12)s
{%(py12)s = %(py7)s(%(py10)s
{%(py10)s = %(py8)s.obstacles
})
}r   )r!   r"   r#   r9   r;   r&   r?   Úpy12zassert %(py14)sÚpy14)r   Úgenerate_mapr~   rA   rB   rC   rD   rE   rF   rG   rH   r   Úspawn_pointÚ
boss_pointÚ	obstaclesr   )rN   Úenginer‚   rƒ   rU   r\   rX   Ú@py_assert8rQ   Ú@py_format10Ú@py_format12rP   rR   rS   rO   Ú@py_assert9Ú@py_assert11Ú@py_format13Ú@py_format15s                      r_   Ú'test_deterministic_generation_with_seedzCTestProceduralMapGeneration.test_deterministic_generation_with_seedU   sý  € å$¨2°bÐ9Ñ9Ô9ˆØ×#Ò#¨Ð9OÐ#ÑPÔPˆØ×#Ò#¨Ð9OÐ#ÑPÔPˆàŒ{Ð/˜eœkÐ/ˆ{˜kÒ/Ð/¨RÐ/˜k¨RÒ/Ð/Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð/ˆ{˜k¨RÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆuÑ/Ô/Ð/Õ/Ô/ˆuÑ/Ô/Ð/Ð/Õ/Ô/ˆ{Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/˜eÑ/Ô/Ð/Õ/Ô/˜eÑ/Ô/Ð/Ð/Õ/Ô/˜kÑ/Ô/Õ/Ô/¨RÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØŒ|Ð1˜uœ|Ð1ˆ|˜|Ò1Ð1¨rÐ1˜|¨rÒ1Ð1Ð1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð1ˆ|˜|¨rÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1ˆuÑ1Ô1Ð1Õ1Ô1ˆuÑ1Ô1Ð1Ð1Õ1Ô1ˆ|Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1˜uÑ1Ô1Ð1Õ1Ô1˜uÑ1Ô1Ð1Ð1Õ1Ô1˜|Ñ1Ô1Õ1Ô1¨rÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØÔ Ð5 EÔ$5Ð5Ð Ð$5Ò5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð Ð$5Ð5Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5ˆuÑ5Ô5Ð5Õ5Ô5ˆuÑ5Ô5Ð5Ð5Õ5Ô5Ð Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5 EÑ5Ô5Ð5Õ5Ô5 EÑ5Ô5Ð5Ð5Õ5Ô5Ð$5Ñ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5ØÔÐ3 5Ô#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ˆuÑ3Ô3Ð3Õ3Ô3ˆuÑ3Ô3Ð3Ð3Õ3Ô3ÐÑ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3 5Ñ3Ô3Ð3Õ3Ô3 5Ñ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Ø”?Ð;�s�?Ñ#Ô#Ð;¨5¬?Ð;¥s¨?Ñ';Ô';Ð;Ð#Ð';Ò;Ð;Ð;Ñ;Õ;Ô;Ð;Ð;Ð;Ð;Ð#Ð';Ð;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;�sÑ;Ô;Ð;Õ;Ô;�sÑ;Ô;Ð;Ð;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;�5Ñ;Ô;Ð;Õ;Ô;�5Ñ;Ô;Ð;Ð;Õ;Ô;�?Ñ;Ô;Õ;Ô;Ð#Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;¥sÑ;Ô;Ð;Õ;Ô;¥sÑ;Ô;Ð;Ð;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;¨5Ñ;Ô;Ð;Õ;Ô;¨5Ñ;Ô;Ð;Ð;Õ;Ô;¨?Ñ;Ô;Õ;Ô;Ð';Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ra   c                 ó  — t          dd¬¦  «        }dD �]ì}|                     |d¬¦  «        }t          ||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
œz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}t          |¦  «        }d}
||
k    }|sò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          t          j        |¦  «        ¦  «        ‚dx}x}}
�ŒîdS )z?Verifies 100% path connectivity from spawn point to boss arena.r|   r}   )éo   éÞ   iM  i¼  r(   r€   Trj   ©z%(py0)s is %(py3)sÚ	connected©r!   r#   úassert %(py5)sr9   Né   ©ú>©z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr   Úpathr    r%   r&   )r   rŠ   r   r‹   rŒ   rA   rB   rC   rD   rE   rF   rG   rH   r   )rN   rŽ   r�   Úmap_datar›   r¢   rO   rU   Ú@py_format4rY   rP   rQ   rR   rS   s                 r_   Ú*test_guaranteed_connectivity_spawn_to_bosszFTestProceduralMapGeneration.test_guaranteed_connectivity_spawn_to_bossa   sG  € å$¨2°bÐ9Ñ9Ô9ˆØ(ð 	!ñ 	!ˆDØ×*Ò*°Ð?UÐ*ÑVÔVˆHÝ6Ø˜(Ô.°Ô0Cñô ‰OˆI�tð !%Ð$�9 Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$�9 Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�9Ñ$Ô$Ð$Õ$Ô$�9Ñ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ý�t‘9”9Ð ˜qÐ �9˜q’=Ð Ð Ð Õ Ô Ð Ð Ð Ð �9˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô •3Ñ Ô Ð Õ Ô •3Ñ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô �tÑ Ô Ð Õ Ô �tÑ Ô Ð Ð Õ Ô �9Ñ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Ñ ð	!ð 	!ra   N)ru   rv   rw   r–   r¥   rx   ra   r_   rz   rz   T   s2   € € € € € ð
<ð 
<ð 
<ð	!ð 	!ð 	!ð 	!ð 	!ra   rz   c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestAntiBotDynamicObstaclesc                 óþ  — t          dd¬¦  «        }|                     dd¬¦  «        }|j        }t          |¦  «        }d}||k    }|�s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	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}}t          d„ |j                             ¦   «         D ¦   «         ¦  «        }	t          d„ |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	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}d}|
|u }|s—t	          j        d|fd|
|f¦  «        dt          j        ¦   «         v st	          j        |
¦  «        rt	          j	        |
¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}dS )zNVerifies that dynamic anti-bot obstacles are placed to break linear corridors.r|   r}   iÍ� r*   r€   r   rŸ   )zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.obstacles
})
} > %(py8)sr   r£   r=   r>   r?   Nc              3   ó@   K  — | ]}|j         t          j        k    V — Œd S ©N)Úobstacle_typer	   ÚBARRICADE_WOOD_BONE©Ú.0Úobss     r_   ú	<genexpr>zVTestAntiBotDynamicObstacles.test_obstacle_injection_along_corridors.<locals>.<genexpr>t   sA   è è € ð 
ð 
àð Ô¥Ô!AÒAð
ð 
ð 
ð 
ð 
ð 
ra   c              3   ój   K  — | ].}|j         t          j        t          j        t          j        fv V — Œ/d S rª   )r«   r	   ÚDEBRIS_COLLAPSEÚMUD_QUAGMIREÚBONE_CLUSTERr­   s     r_   r°   zVTestAntiBotDynamicObstacles.test_obstacle_injection_along_corridors.<locals>.<genexpr>x   sO   è è € ð  
ð  
àð Ô¥,Ô">ÅÔ@YÕ[gÔ[tÐ!uÐuð 
ð  
ð  
ð  
ð  
ð  
ra   Trj   rš   Úhas_destructiblerœ   r�   r9   Úhas_debris_or_mud)r   rŠ   r�   r   rA   rB   rC   rD   rE   rF   rG   rH   ÚanyÚvalues)rN   rŽ   r£   rO   rQ   r[   r\   rS   r]   rµ   r¶   rU   r¤   rY   s                 r_   Ú'test_obstacle_injection_along_corridorszCTestAntiBotDynamicObstacles.test_obstacle_injection_along_corridorsn   sw  € å$¨2°bÐ9Ñ9Ô9ˆØ×&Ò&¨EÐ<QÐ&ÑRÔRˆàÔ%Ð*�sÐ%Ñ&Ô&Ð*¨Ð*Ð&¨Ò*Ð*Ð*Ñ*Õ*Ô*Ð*Ð*Ð*Ð*Ð&¨Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�sÑ*Ô*Ð*Õ*Ô*�sÑ*Ô*Ð*Ð*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�8Ñ*Ô*Ð*Õ*Ô*�8Ñ*Ô*Ð*Ð*Õ*Ô*Ð%Ñ*Ô*Õ*Ô*Ð&Ñ*Ô*Õ*Ô*¨Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ýð 
ð 
àÔ)×0Ò0Ñ2Ô2ð
ñ 
ô 
ñ 
ô 
Ðõ  ð  
ð  
àÔ)×0Ò0Ñ2Ô2ð 
ñ  
ô  
ñ 
ô 
Ðð $(Ð'Ð 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ÐÑ'Ô'Ð'Õ'Ô'ÐÑ'Ô'Ð'Ð'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ø$(Ð(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(Ð Ñ(Ô(Ð(Õ(Ô(Ð Ñ(Ô(Ð(Ð(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ra   c           	      óØ  — t          dd¬¦  «        }|                     dd¬¦  «        }d}|j                             ¦   «         D ]\  }}|j        t
          j        k    r|} nŒd}||u}|s—t          j        d|fd||f¦  «        d	t          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        d
œz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}|\  }
}|j        } ||
|¦  «        }d}||u }|�s9t          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t          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}|                     ||
|d¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
œz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}d}||k    }|s—t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
œz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}|j        } ||
|¦  «        }d}||u }|�s9t          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t          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}|                     ||
|d¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
œz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}d}||k    }|s—t          j        d |fd!||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
œz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}|j        } ||
|¦  «        }d}||u }|�s9t          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t          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}dS )"zQVerifies attacking a destructible barricade reduces HP and updates walkable grid.é    r}   é*   r*   r€   N©úis not©z%(py0)s is not %(py3)sÚbarricade_coordrœ   r�   r9   Frj   ©zZ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.is_walkable
}(%(py3)s, %(py4)s)
} is %(py9)sr£   ÚbxÚby©r!   r/   r#   r1   r$   r„   r…   r†   é(   )Údamagerš   Ú	destroyedr   rŸ   ©z%(py0)s > %(py3)sÚremaining_hpéd   Tr   )z%(py0)s == %(py3)s)r   rŠ   r�   Úitemsr«   r	   r¬   rA   rB   rC   rD   rE   rF   rG   rH   Úis_walkableÚdamage_obstacle)rN   rŽ   r£   rÀ   Úcoordr¯   rO   rU   r¤   rY   rÂ   rÃ   rP   r�   r[   r�   r‘   rÇ   rÉ   s                      r_   Ú!test_attack_and_destroy_barricadez=TestAntiBotDynamicObstacles.test_attack_and_destroy_barricade   s	  € å$¨2°bÐ9Ñ9Ô9ˆØ×&Ò&¨BÐ9NÐ&ÑOÔOˆð ˆØ"Ô,×2Ò2Ñ4Ô4ð 	ð 	‰JˆE�3ØÔ ¥LÔ$DÒDÐDØ"'�Ø�ð Eð '+Ð*ˆ dÐ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*ˆ dÐ*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆÑ*Ô*Ð*Õ*Ô*ˆÑ*Ô*Ð*Ð*Õ*Ô* dÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ø ‰ˆˆBØÔ#Ð4Ð#Ð# B¨Ñ+Ô+Ð4¨uÐ4Ð+¨uÐ4Ð4Ð4Ñ4Õ4Ô4Ð4Ð4Ð4Ð4Ð+¨uÐ4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆxÑ4Ô4Ð4Õ4Ô4ˆxÑ4Ô4Ð4Ð4Õ4Ô4Ð#Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4 BÑ4Ô4Ð4Õ4Ô4 BÑ4Ô4Ð4Ð4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4¨Ñ4Ô4Ð4Õ4Ô4¨Ñ4Ô4Ð4Ð4Õ4Ô4Ð+Ñ4Ô4Õ4Ô4¨uÑ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ð #)×"8Ò"8¸À2ÀrÐRTÐ"8Ñ"UÔ"UÑˆ	�<Ø!Ð!ˆy˜EÐ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆy˜EÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆyÑ!Ô!Ð!Õ!Ô!ˆyÑ!Ô!Ð!Ð!Õ!Ô!˜EÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!ØÐˆ|˜aÒÐÐÐÕÔÐÐÐÐˆ|˜aÐÑÔÐÕÔÑÔÐÐÕÔˆ|ÑÔÐÕÔˆ|ÑÔÐÐÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ#Ð4Ð#Ð# B¨Ñ+Ô+Ð4¨uÐ4Ð+¨uÐ4Ð4Ð4Ñ4Õ4Ô4Ð4Ð4Ð4Ð4Ð+¨uÐ4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆxÑ4Ô4Ð4Õ4Ô4ˆxÑ4Ô4Ð4Ð4Õ4Ô4Ð#Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4 BÑ4Ô4Ð4Õ4Ô4 BÑ4Ô4Ð4Ð4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4¨Ñ4Ô4Ð4Õ4Ô4¨Ñ4Ô4Ð4Ð4Õ4Ô4Ð+Ñ4Ô4Õ4Ô4¨uÑ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ð #)×"8Ò"8¸À2ÀrÐRUÐ"8Ñ"VÔ"VÑˆ	�<Ø Ð ˆy˜DÐ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆy˜DÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆyÑ Ô Ð Õ Ô ˆyÑ Ô Ð Ð Õ Ô ˜DÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ø Ð ˆ|˜qÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ|˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆ|Ñ Ô Ð Õ Ô ˆ|Ñ Ô Ð Ð Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð ØÔ#Ð3Ð#Ð# B¨Ñ+Ô+Ð3¨tÐ3Ð+¨tÐ3Ð3Ð3Ñ3Õ3Ô3Ð3Ð3Ð3Ð3Ð+¨tÐ3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ˆxÑ3Ô3Ð3Õ3Ô3ˆxÑ3Ô3Ð3Ð3Õ3Ô3Ð#Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3 BÑ3Ô3Ð3Õ3Ô3 BÑ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¨tÑ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ra   c                 ó  — t          dd¬¦  «        }|                     dd¬¦  «        }t          ||j        |j        ¦  «        \  }}t          ||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
œz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}dS )zMVerifies path between spawn and boss is non-linear (sinuosity ratio >= 1.25).r|   r}   é	  r'   r€   g      ô?r6   )z%(py0)s >= %(py3)sÚ	sinuosityrœ   r�   r9   N)r   rŠ   r   r‹   rŒ   r   rA   rB   rC   rD   rE   rF   rG   rH   )
rN   rŽ   r£   Ú_r¢   rÒ   rO   rU   r¤   rY   s
             r_   Ú'test_anti_bot_sinuosity_path_complexityzCTestAntiBotDynamicObstacles.test_anti_bot_sinuosity_path_complexity›   s'  € å$¨2°bÐ9Ñ9Ô9ˆØ×&Ò&¨CÐ:QÐ&ÑRÔRˆÝ*¨8°XÔ5IÈ8ÔK^Ñ_Ô_‰ˆˆ4Ý,¨T°8Ô3GÈÔI\Ñ]Ô]ˆ	Ø Ð ˆy˜DÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆy˜DÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆyÑ Ô Ð Õ Ô ˆyÑ Ô Ð Ð Õ Ô ˜DÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð ra   c                 ó²  — t          dd¬¦  «        }|                     dd¬¦  «        }|j        }t          |¦  «        }d}||k    }|�s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	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}}dS )zLVerifies deceptive branch dead-ends are created to deter naive pathing bots.r|   r}   i+  r+   r€   r<   r6   )zU%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.dead_end_points
})
} >= %(py8)sr   r£   r=   r>   r?   N)r   rŠ   Údead_end_pointsr   rA   rB   rC   rD   rE   rF   rG   rH   )	rN   rŽ   r£   rO   rQ   r[   r\   rS   r]   s	            r_   Ú"test_deceptive_dead_ends_generatedz>TestAntiBotDynamicObstacles.test_deceptive_dead_ends_generated£   sq  € å$¨2°bÐ9Ñ9Ô9ˆØ×&Ò&¨CÐ:QÐ&ÑRÔRˆØÔ+Ð1�sÐ+Ñ,Ô,Ð1°Ð1Ð,°Ò1Ð1Ð1Ñ1Õ1Ô1Ð1Ð1Ð1Ð1Ð,°Ð1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�sÑ1Ô1Ð1Õ1Ô1�sÑ1Ô1Ð1Ð1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�8Ñ1Ô1Ð1Õ1Ô1�8Ñ1Ô1Ð1Ð1Õ1Ô1Ð+Ñ1Ô1Õ1Ô1Ð,Ñ1Ô1Õ1Ô1°Ñ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ra   N)ru   rv   rw   r¹   rÏ   rÔ   r×   rx   ra   r_   r§   r§   m   sP   € € € € € ð)ð )ð )ð"4ð 4ð 4ð8!ð !ð !ð2ð 2ð 2ð 2ð 2ra   r§   c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestServerAuthoritativeWarFogc                 óP  — t          ¦   «         }|                     ddd¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}|j        d         d         }t          j        }|j        }	||	k    }
|
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        |	¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}
x}}	dS )z7New visibility state begins with 100% unexplored tiles.Úp_testerr»   ©Ú	player_idr~   r   r   r   )z<%(py2)s
{%(py2)s = %(py0)s.explored_tiles_count
} == %(py5)sÚvisr8   r:   r;   N)z;%(py2)s
{%(py2)s = %(py0)s.visible_tiles_count
} == %(py5)sé
   )zM%(py1)s == %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.UNEXPLORED
}.value
}r   ©r"   r#   r9   r;   úassert %(py9)sr„   )r   Úcreate_player_visibilityÚexplored_tiles_countrA   rB   rC   rD   rE   rF   rG   rH   Úvisible_tiles_countÚ
fog_matrixr   Ú
UNEXPLOREDÚvalue)rN   Ú
fog_enginerÞ   rU   rQ   rX   rY   rZ   r^   r\   rO   r�   s               r_   Ú%test_initial_fog_state_all_unexploredzCTestServerAuthoritativeWarFog.test_initial_fog_state_all_unexplored«   sü  € å!‘^”^ˆ
Ø×1Ò1¸JÈbÐY[Ð1Ñ\Ô\ˆØÔ'Ð,¨1Ð,Ð'¨1Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð'¨1Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆsÑ,Ô,Ð,Õ,Ô,ˆsÑ,Ô,Ð,Ð,Õ,Ô,Ð'Ñ,Ô,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÔ&Ð+¨!Ð+Ð&¨!Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð&¨!Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆsÑ+Ô+Ð+Õ+Ô+ˆsÑ+Ô+Ð+Ð+Õ+Ô+Ð&Ñ+Ô+Õ+Ô+¨!Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØŒ~˜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ÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBra   c                 ón  ‡— t          dd¬¦  «        }|                     dd¬¦  «        }t          ¦   «         }|                     ddd¬¦  «        Š|j        \  }}|                     ‰|||d¬	¦  «         ‰j        |         |         }t          j        }|j	        }||k    }	|	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        |¦  «        dœz  }
dd|
iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}	x}}‰j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }
t!          t          j        |
¦  «        ¦  «        ‚dx}x}}‰j        }‰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t          j        |¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}ˆfd„t)          d¦  «        D ¦   «         }|j        \  }}|                     ‰|||d¬	¦  «         t-          ˆfd„|D ¦   «         ¦  «        }d}	||	k    }|s—t          j        d|fd||	f¦  «        d t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd t          j        |	¦  «        d!œz  }d"d#|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}}	dS )$zBField of view expands around player and is blocked by solid walls.r»   r}   éç  r)   r€   Úp_herorÜ   rß   )Úplayer_xÚplayer_yÚview_radiusr   )zJ%(py1)s == %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.VISIBLE
}.value
}r   rà   rá   r„   Nr   rŸ   )z:%(py2)s
{%(py2)s = %(py0)s.visible_tiles_count
} > %(py5)srÞ   r8   r:   r;   r6   )ze%(py2)s
{%(py2)s = %(py0)s.explored_tiles_count
} >= %(py6)s
{%(py6)s = %(py4)s.visible_tiles_count
}r‡   r%   r&   c                 óˆ   •— g | ]>}t          d ¦  «        D ],}‰j        |         |         t          j        j        k    ¯(||f‘Œ-Œ?S )r»   )Úrangerå   r   ÚVISIBLErç   )r®   rf   re   rÞ   s      €r_   ú
<listcomp>zXTestServerAuthoritativeWarFog.test_fov_computation_and_wall_blocking.<locals>.<listcomp>Ã   sa   ø€ ð 
ð 
ð 
àÝ˜2‘Y”Yð
ð 
ð ØŒ~˜aÔ  Ô#¥xÔ'7Ô'=Ò=Ð=ð �ˆFð >Ð=Ð=Ð=ra   c              3   ón   •K  — | ]/\  }}‰j         |         |         t          j        j        k    ¯+d V — Œ0dS )rc   N)rå   r   ÚEXPLORED_FOGGEDrç   )r®   re   rf   rÞ   s      €r_   r°   zWTestServerAuthoritativeWarFog.test_fov_computation_and_wall_blocking.<locals>.<genexpr>Í   sL   øè è € ð  
ð  
Ù�1�a°´ÀÔ1BÀ1Ô1EÍÔIaÔIgÒ1gÐ1gˆAÐ1gÐ1gÐ1gÐ1gð 
ð  
ra   rÈ   Údemoted_to_foggedrœ   r�   r9   )r   rŠ   r   râ   r‹   Úupdate_visibilityrå   r   rò   rç   rA   rB   rF   rC   rD   rE   rG   rH   rä   rã   rñ   rŒ   Úsum)rN   rŽ   r£   rè   ÚsxÚsyr^   rQ   r\   rO   rZ   r�   rU   rX   rY   rP   rR   rS   Úold_visible_cellsrÂ   rÃ   rö   r¤   rÞ   s                          @r_   Ú&test_fov_computation_and_wall_blockingzDTestServerAuthoritativeWarFog.test_fov_computation_and_wall_blocking³   só  ø€ å$¨2°bÐ9Ñ9Ô9ˆØ×&Ò&¨CÐ:PÐ&ÑQÔQˆÝ!‘^”^ˆ
Ø×1Ò1¸HÈBÐWYÐ1ÑZÔZˆàÔ%‰ˆˆBØ×$Ò$ S¨(¸RÈ"ÐZ\Ð$Ñ]Ô]Ð]ð Œ~˜bÔ! "Ô%Ð?­Ô)9Ð?Ð)9Ô)?Ð?Ð%Ð)?Ò?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Ð%Ð)?Ð?Ñ?Ô?Õ?Ô?Ð%Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?­Ñ?Ô?Ð?Õ?Ô?­Ñ?Ô?Ð?Ð?Õ?Ô?Ð)9Ñ?Ô?Õ?Ô?Ð)?Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ØÔ&Ð*¨Ð*Ð&¨Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð&¨Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆsÑ*Ô*Ð*Õ*Ô*ˆsÑ*Ô*Ð*Ð*Õ*Ô*Ð&Ñ*Ô*Õ*Ô*¨Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÔ'ÐB¨3Ô+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ˆsÑBÔBÐBÕBÔBˆsÑBÔBÐBÐBÕBÔBÐ'ÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔB¨3ÑBÔBÐBÕBÔB¨3Ñ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ð
ð 
ð 
ð 
å˜2‘Y”Yð
ñ 
ô 
Ðð Ô$‰ˆˆBØ×$Ò$ S¨(¸RÈ"ÐZ\Ð$Ñ]Ô]Ð]õ  ð  
ð  
ð  
ð  
Ø-ð 
ñ  
ô  
ñ 
ô 
Ðð $%Ð$Ð  1Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð  1Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$Ð Ñ$Ô$Ð$Õ$Ô$Ð Ñ$Ô$Ð$Ð$Õ$Ô$ 1Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ra   c                 ó–  — t          ¦   «         }|                     ddd¬¦  «        }t          j        j        |j        d         d<   t          j        j        |j        d         d<   t          j        j        |j        d         d<   ddddd	œd
dddd	œddddd	œg}|                     ||¦  «        }t          |¦  «        }d}||k    }|sò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!          t          j        |	¦  «        ¦  «        ‚dx}x}}|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 )zLServer strictly filters out entities outside player's VISIBLE field of view.Ú	p_stealthr»   rÜ   rž   é   é   Úmob_nearÚMONSTER)Úidre   rf   ÚtypeÚchest_in_fogÚCHESTÚboss_unexploredÚBOSSrc   r   r   r   Úfilteredr    r%   r&   Nr   r  ©z%(py1)s == %(py4)s©r"   r1   r4   r$   )r   râ   r   rò   rç   rå   rõ   ræ   Úfilter_visible_entitiesr   rA   rB   rC   rD   rE   rF   rG   rH   )rN   rè   rÞ   Úall_entitiesr	  rO   rP   rQ   rR   rS   r^   rX   rW   s                r_   Ú"test_anti_maphack_entity_filteringz@TestServerAuthoritativeWarFog.test_anti_maphack_entity_filteringÒ   sˆ  € å!‘^”^ˆ
Ø×1Ò1¸KÈrÐZ\Ð1Ñ]Ô]ˆõ  (Ô/Ô5ˆŒ�qÔ˜!ÑÝ!)Ô!9Ô!?ˆŒ�rÔ˜2ÑÝ!)Ô!4Ô!:ˆŒ�rÔ˜2Ñð  A¨A°yÐAÐAØ!¨°¸WÐEÐEØ$¨2°BÀÐGÐGð
ˆð ×5Ò5°c¸<ÑHÔHˆå�8‰}Œ}Ð! Ð!ˆ} Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ} Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�sÑ!Ô!Ð!Õ!Ô!�sÑ!Ô!Ð!Ð!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�8Ñ!Ô!Ð!Õ!Ô!�8Ñ!Ô!Ð!Ð!Õ!Ô!ˆ}Ñ!Ô!Õ!Ô! Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ø˜Œ{˜4Ô Ð. JÐ.Ð  JÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð  JÐ.Ñ.Ô.Õ.Ô.Ð Ñ.Ô.Õ.Ô. JÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ra   c                 ó  — d„ t          d¦  «        D ¦   «         }t          dd¦  «        D ] }t          dd¦  «        D ]}d||         |<   ŒŒ!t          dd¦  «        D ] }t          dd¦  «        D ]}d||         |<   ŒŒ!t          |¦  «        }t          |t          ¦  «        }|�sd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
dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚d}t          |dd¬¦  «        }||k    }|sÂt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }	dd|	iz  }t          t          j
        |¦  «        ¦  «        ‚d}dS )zBFog matrix can be compressed with RLE and decompressed losslessly.c                 ó   — g | ]}d gdz  ‘Œ	S )r   é   rx   ©r®   rÓ   s     r_   ró   zJTestServerAuthoritativeWarFog.test_fog_rle_compression.<locals>.<listcomp>é   s   € Ð.Ð.Ð.˜q�1�#˜‘(Ð.Ð.Ð.ra   r  é   é   r<   é   rc   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}Ú
isinstanceÚ
compressedÚstr)r!   r"   r/   r1   Nr}   r   )z%(py0)s == %(py2)sÚdecompressedÚmatrixr.   r0   r1   )rñ   r   r  r  rC   rD   rA   rE   rF   rG   rH   r   rB   )
rN   r  rf   re   r  rX   rW   r  rU   rV   s
             r_   Útest_fog_rle_compressionz6TestServerAuthoritativeWarFog.test_fog_rle_compressionç   s®  € à.Ð.¥E¨"¡I¤IÐ.Ñ.Ô.ˆÝ�q˜!‘”ð 	!ð 	!ˆAÝ˜1˜a‘[”[ð !ð !�Ø ��q”	˜!‘�ð!å�q˜"‘”ð 	!ð 	!ˆAÝ˜1˜a‘[”[ð !ð !�Ø ��q”	˜!‘�ð!õ & fÑ-Ô-ˆ
Ý˜*¥cÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�zÑ*Ô*Ð*Õ*Ô*�zÑ*Ô*Ð*Ð*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*˜*Ñ*Ô*Ð*Õ*Ô*˜*Ñ*Ô*Ð*Ð*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*¥cÑ*Ô*Ð*Õ*Ô*¥cÑ*Ô*Ð*Ð*Õ*Ô*Ð*Ñ*Ô*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ý)¨*¸BÀrÐJÑJÔJˆØ˜vÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ|˜vÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆ|Ñ%Ô%Ð%Õ%Ô%ˆ|Ñ%Ô%Ð%Ð%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%˜vÑ%Ô%Ð%Õ%Ô%˜vÑ%Ô%Ð%Ð%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%ra   c           	      ó–	  — d}d}d}t          |||¬¦  «        }d„ t          d¦  «        D ¦   «         }||k    }|sít          j        d|fd||f¦  «        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}}d}d}d}t          |||¬¦  «        }d„ t          d¦  «        D ¦   «         }||k    }|sít          j        d|fd||f¦  «        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}}d}d}d}t          |||¬¦  «        }d„ t          d¦  «        D ¦   «         }||k    }|sít          j        d|fd||f¦  «        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}}d}d}d}t          |||¬¦  «        }d„ t          d¦  «        D ¦   «         }||k    }|sít          j        d|fd||f¦  «        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}}dS )zQMalformed RLE input or dimension mismatch gracefully returns safe default matrix.Ú r  r}   c                 ó   — g | ]}d gdz  ‘Œ	S ©r   r  rx   r  s     r_   ró   z[TestServerAuthoritativeWarFog.test_fog_rle_decompression_error_handling.<locals>.<listcomp>ù   s   € Ð<WÐ<WÐ<WÈ¸a¸SÀ1¹WÐ<WÐ<WÐ<Wra   r   )zP%(py8)s
{%(py8)s = %(py0)s(%(py2)s, width=%(py4)s, height=%(py6)s)
} == %(py11)sr   ©r!   r/   r1   r$   r&   r†   úassert %(py13)sÚpy13NÚ	bad_tokenc                 ó   — g | ]}d gdz  ‘Œ	S r  rx   r  s     r_   ró   z[TestServerAuthoritativeWarFog.test_fog_rle_decompression_error_handling.<locals>.<listcomp>û   s   € ÐE`ÐE`ÐE`ÐRSÀqÀcÈAÁgÐE`ÐE`ÐE`ra   Úaxbc                 ó   — g | ]}d gdz  ‘Œ	S r  rx   r  s     r_   ró   z[TestServerAuthoritativeWarFog.test_fog_rle_decompression_error_handling.<locals>.<listcomp>ý   s   € Ð?ZÐ?ZÐ?ZÈAÀÀÀaÁÐ?ZÐ?ZÐ?Zra   Ú0x10c                 ó   — g | ]}d gdz  ‘Œ	S r  rx   r  s     r_   ró   z[TestServerAuthoritativeWarFog.test_fog_rle_decompression_error_handling.<locals>.<listcomp>ÿ   s   € Ð@[Ð@[Ð@[ÈQÀ!ÀÀqÁÐ@[Ð@[Ð@[ra   )
r   rñ   rA   rB   rC   rD   rE   rF   rG   rH   )	rN   rU   rX   rP   r[   Ú@py_assert10r’   r‘   Ú@py_format14s	            r_   Ú)test_fog_rle_decompression_error_handlingzGTestServerAuthoritativeWarFog.test_fog_rle_decompression_error_handlingö   sc  € ð #%ÐW¨AÐW°aÐWÕ! "¨A°aÐ8Ñ8Ô8ÐWÐ<WÐ<WÍeÐTUÉhÌhÐ<WÑ<WÔ<WÐWÐ8Ð<WÒWÐWÐWÐWÕWÔWÐWÐWÐWÐWÐ8Ð<WÐWÑWÔWÐWÕWÔWÑWÔWÐWÐWÕWÔWÕ!ÑWÔWÐWÕWÔWÕ!ÑWÔWÐWÐWÕWÔW "ÑWÔWÕWÔW¨AÑWÔWÕWÔW°aÑWÔWÕWÔWÐ8ÑWÔWÕWÔWÐ<WÑWÔWÐWÐWÑWÐWÐWÐWÐWÐWÑWÐWÕWÕWÔWÐWÑWÔWÑWÔWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWà"-Ð`°QÐ`¸qÐ`Õ! +°Q¸qÐAÑAÔAÐ`ÐE`ÐE`ÕW\Ð]^ÑW_ÔW_ÐE`ÑE`ÔE`Ð`ÐAÐE`Ò`Ð`Ð`Ð`Õ`Ô`Ð`Ð`Ð`Ð`ÐAÐE`Ð`Ñ`Ô`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`Õ!Ñ`Ô`Ð`Õ`Ô`Õ!Ñ`Ô`Ð`Ð`Õ`Ô` +Ñ`Ô`Õ`Ô`°QÑ`Ô`Õ`Ô`¸qÑ`Ô`Õ`Ô`ÐAÑ`Ô`Õ`Ô`ÐE`Ñ`Ô`Ð`Ð`Ñ`Ð`Ð`Ð`Ð`Ð`Ñ`Ð`Õ`Õ`Ô`Ð`Ñ`Ô`Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`à"'ÐZ¨qÐZ¸ÐZÕ! %¨q¸Ð;Ñ;Ô;ÐZÐ?ZÐ?ZÕQVÐWXÑQYÔQYÐ?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¨qÑ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à"(Ð[°Ð[¸!Ð[Õ! &°¸!Ð<Ñ<Ô<Ð[Ð@[Ð@[ÕRWÐXYÑRZÔRZÐ@[Ñ@[Ô@[Ð[Ð<Ð@[Ò[Ð[Ð[Ð[Õ[Ô[Ð[Ð[Ð[Ð[Ð<Ð@[Ð[Ñ[Ô[Ð[Õ[Ô[Ñ[Ô[Ð[Ð[Õ[Ô[Õ!Ñ[Ô[Ð[Õ[Ô[Õ!Ñ[Ô[Ð[Ð[Õ[Ô[ &Ñ[Ô[Õ[Ô[°Ñ[Ô[Õ[Ô[¸!Ñ[Ô[Õ[Ô[Ð<Ñ[Ô[Õ[Ô[Ð@[Ñ[Ô[Ð[Ð[Ñ[Ð[Ð[Ð[Ð[Ð[Ñ[Ð[Õ[Õ[Ô[Ð[Ñ[Ô[Ñ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[ra   c                 óŽ  — t          dd¬¦  «        }d„ t          d¦  «        D ¦   «         }|                     |ddddd¬¦  «         t          dd¦  «        D ]¦}||         |         }|j        }d	}||u }|st	          j        d
|fd||f¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}x}}Œ§|d         d         }|j        }d}||u }|st	          j        d
|fd||f¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}x}}|d         d         }|j        }d}||u }|st	          j        d
|fd||f¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}x}x}}dS )zP_carve_line carves clean corridor without creating accidental rectangular rooms.r  r}   c                 óF   ‡— g | ]Šˆfd „t          d¦  «        D ¦   «         ‘ŒS )c           	      óL   •— g | ] }t          |‰t          j        d d¬¦  «        ‘Œ!S )FTrd   )r
   r   rr   )r®   re   rf   s     €r_   ró   zVTestServerAuthoritativeWarFog.test_carve_line_bresenham.<locals>.<listcomp>.<listcomp>  s0   ø€ ÐpÐpÐpÐab�X˜˜Q­(¬-À%ÐW[Ð\Ñ\Ô\ÐpÐpÐpra   r  )rñ   )r®   rf   s    @r_   ró   zKTestServerAuthoritativeWarFog.test_carve_line_bresenham.<locals>.<listcomp>  sH   ø€ ð 
ð 
ð 
àð qÐpÐpÐpÕfkÐlnÑfoÔfoÐpÑpÔpð
ð 
ð 
ra   r<   rß   rc   )r~   é   Trj   )z0%(py3)s
{%(py3)s = %(py1)s.walkable
} is %(py6)s)r"   r#   r$   r%   r&   NF)	r   rñ   Ú_carve_linerh   rA   rB   rF   rG   rH   )
rN   rŽ   ÚtilesÚir^   rO   rP   rQ   rR   rS   s
             r_   Útest_carve_line_bresenhamz7TestServerAuthoritativeWarFog.test_carve_line_bresenham  sÓ  € å$¨2°bÐ9Ñ9Ô9ˆð
ð 
å˜2‘Y”Yð
ñ 
ô 
ˆð
 	×Ò˜5 ! Q¨¨B°aÐÑ8Ô8Ð8å�q˜"‘”ð 	0ð 	0ˆAØ˜”8˜A”;Ð/�;Ô'Ð/¨4Ð/Ð'¨4Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð'¨4Ð/Ñ/Ô/Õ/Ô/�;Ñ/Ô/Õ/Ô/Ð'Ñ/Ô/Õ/Ô/¨4Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/à�QŒx˜Œ|Ð-ˆ|Ô$Ð-¨Ð-Ð$¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð$¨Ð-Ñ-Ô-Õ-Ô-ˆ|Ñ-Ô-Õ-Ô-Ð$Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø�RŒy˜Œ|Ð-ˆ|Ô$Ð-¨Ð-Ð$¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð$¨Ð-Ñ-Ô-Õ-Ô-ˆ|Ñ-Ô-Õ-Ô-Ð$Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ra   N)	ru   rv   rw   ré   rü   r  r  r+  r3  rx   ra   r_   rÙ   rÙ   ª   st   € € € € € ðCð Cð Cð%ð %ð %ð>/ð /ð /ð*&ð &ð &ð	\ð 	\ð 	\ð.ð .ð .ð .ð .ra   rÙ   c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )Ú!TestGrandBossArenaAndMapExpansionc           	      ó>  — dD �]˜}t          ||¬¦  «        }|                     d|z   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}}|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}}|j        }t          |¦  «        }	d}
|	|
k    }|�s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        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}	x}}
|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}}	|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        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd |iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}}t!          ||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#œz  }d$d%|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}t          |¦  «        }d&}||k    }	|	sò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          t          j
        |¦  «        ¦  «        ‚dx}x}	}�ŒšdS )-zQVerifies procedural map engine dynamically scales for 32x32, 48x48, 64x64, 80x80.©r»   r|   é@   éP   r}   r¼   r)   r€   r   )z-%(py2)s
{%(py2)s = %(py0)s.width
} == %(py4)sr£   Údimr3   r4   r$   N)z.%(py2)s
{%(py2)s = %(py0)s.height
} == %(py4)sr  r6   )zK%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.rooms
})
} >= %(py8)sr   r=   r>   r?   r½   )z5%(py2)s
{%(py2)s = %(py0)s.boss_room
} is not %(py5)sr8   r:   r;   Trj   )zS%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.boss_room
}.is_boss_room
} is %(py7)s©r!   r/   r1   r;   rá   r„   rš   r›   rœ   r�   r9   rž   rŸ   r¡   r¢   r    r%   r&   )r   rŠ   r~   rA   rB   rC   rD   rE   rF   rG   rH   r   Úroomsr   Ú	boss_roomÚis_boss_roomr   r‹   rŒ   )rN   r:  rŽ   r£   rU   rX   rW   rR   rO   rQ   r[   r\   rS   r]   rY   rZ   rP   r�   r›   r¢   r¤   s                        r_   Ú)test_scalable_map_dimensions_optimizationzKTestGrandBossArenaAndMapExpansion.test_scalable_map_dimensions_optimization  s\  € à#ð 	!ñ 	!ˆCÝ(¨s¸3Ð?Ñ?Ô?ˆFØ×*Ò*°°S±ÐCYÐ*ÑZÔZˆHØ”>Ð(�> SÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(�> SÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�8Ñ(Ô(Ð(Õ(Ô(�8Ñ(Ô(Ð(Ð(Õ(Ô(�>Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô( SÑ(Ô(Ð(Õ(Ô( SÑ(Ô(Ð(Ð(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ø”?Ð)�? cÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)�? cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�8Ñ)Ô)Ð)Õ)Ô)�8Ñ)Ô)Ð)Ð)Õ)Ô)�?Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) cÑ)Ô)Ð)Õ)Ô) cÑ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ø”~Ð+•3�~Ñ&Ô&Ð+¨!Ð+Ð&¨!Ò+Ð+Ð+Ñ+Õ+Ô+Ð+Ð+Ð+Ð+Ð&¨!Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+•3Ñ+Ô+Ð+Õ+Ô+•3Ñ+Ô+Ð+Ð+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+�xÑ+Ô+Ð+Õ+Ô+�xÑ+Ô+Ð+Ð+Õ+Ô+�~Ñ+Ô+Õ+Ô+Ð&Ñ+Ô+Õ+Ô+¨!Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔ%Ð1¨TÐ1Ð%¨TÐ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð%¨TÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�8Ñ1Ô1Ð1Õ1Ô1�8Ñ1Ô1Ð1Ð1Õ1Ô1Ð%Ñ1Ô1Õ1Ô1¨TÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØÔ%Ð:Ð%Ô2Ð:°dÐ:Ð2°dÐ:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð2°dÐ:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:�8Ñ:Ô:Ð:Õ:Ô:�8Ñ:Ô:Ð:Ð:Õ:Ô:Ð%Ñ:Ô:Õ:Ô:Ð2Ñ:Ô:Õ:Ô:°dÑ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:å6°xÀÔAUÐW_ÔWjÑkÔk‰OˆI�tØ $Ð$�9 Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$�9 Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$�9Ñ$Ô$Ð$Õ$Ô$�9Ñ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ý�t‘9”9Ð ˜qÐ �9˜q’=Ð Ð Ð Õ Ô Ð Ð Ð Ð �9˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô •3Ñ Ô Ð Õ Ô •3Ñ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô �tÑ Ô Ð Õ Ô �tÑ Ô Ð Ð Õ Ô �9Ñ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Ñ ð	!ð 	!ra   c                 óÆ  ‡‡‡— t          dd¬¦  «        }|                     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        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}x}}|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}}g }|j        }d}
||
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        |¦  «        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}}|j        \  ŠŠ‰j        ‰         ‰         }|j        }t(          j        }
||
k    }|sÇt          j        d|fd#||
f¦  «        t          j        |¦  «        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          t          j
        |¦  «        ¦  «        ‚dx}x}x}}
t-          ˆˆˆfd'„d(D ¦   «         ¦  «        }d}||u }|s—t          j        d|fd)||f¦  «        d*t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd*t          j        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}‰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}}‰j        \  }}‰j        |         |         }|j        }t(          j        }
||
k    }|sÇt          j        d|fd-||
f¦  «        t          j        |¦  «        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          t          j
        |¦  «        ¦  «        ‚dx}x}x}}
‰j                             ||f¦  «        }d}||u}|s—t          j        d|fd||f¦  «        d.t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd.t          j        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}|j        }t8          j        }||k    }|sòt          j        d|fd/||f¦  «        d.t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd.t          j        |¦  «        d0t          j        ¦   «         v st          j        t8          ¦  «        rt          j        t8          ¦  «        nd0t          j        |¦  «        d1œz  }d2d3|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}|j        }d4}||k    }|sªt          j        d|fd5||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}}d6„ ‰j                             ¦   «         D ¦   «         }tA          |¦  «        }d7}||k    }|sòt          j        d|fd8||f¦  «        d9t          j        ¦   «         v st          j        t@          ¦  «        rt          j        t@          ¦  «        nd9d:t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd:t          j        |¦  «        t          j        |¦  «        d;œz  }d2d3|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}dS )<zVVerifies end-of-map boss room has altar, runic floor, braziers, and boss gate barrier.r|   r}   rë   r+   r€   Nr½   r¿   Úbrrœ   r�   r9   Úbossr   )z1%(py2)s
{%(py2)s = %(py0)s.room_type
} == %(py5)sr8   r:   r;   Trj   )z4%(py2)s
{%(py2)s = %(py0)s.is_boss_room
} is %(py5)sr  r6   )z)%(py4)s
{%(py4)s = %(py2)s.w
} >= %(py7)s)r/   r1   r;   z%(py9)sr„   )z-%(py13)s
{%(py13)s = %(py11)s.h
} >= %(py16)s)r†   r"  Úpy16z%(py18)sÚpy18r   zassert %(py21)sÚpy21)zQ%(py3)s
{%(py3)s = %(py1)s.tile_type
} == %(py7)s
{%(py7)s = %(py5)s.BOSS_ALTAR
}r   rà   rá   c              3   ó’   •K  — | ]A}d D ]<}|dk    s|dk    ¯‰j         ‰|z            ‰|z            j        t          j        k    V — Œ=ŒBdS )©éÿÿÿÿr   rc   r   N)r1  rg   r   ÚRUNIC_FLOOR)r®   ÚdyÚdxÚbcxÚbcyr£   s      €€€r_   r°   z\TestGrandBossArenaAndMapExpansion.test_grand_boss_room_arena_architecture.<locals>.<genexpr>2  sl   øè è € ð 
ð 
à¨:ð
ð 
à%'¸¸qº¸ÀBÈ!ÂGÀGð ŒN˜3 ™8Ô$ S¨2¡XÔ.Ô8½HÔ<PÒPØDKÀGÀGÀGÀGð
ð 
ra   rG  rš   Úrunic_found©z5%(py2)s
{%(py2)s = %(py0)s.boss_gate
} is not %(py5)sr£   ©zP%(py3)s
{%(py3)s = %(py1)s.tile_type
} == %(py7)s
{%(py7)s = %(py5)s.BOSS_GATE
}Úgate_obs)z\%(py2)s
{%(py2)s = %(py0)s.obstacle_type
} == %(py6)s
{%(py6)s = %(py4)s.BOSS_SEAL_BARRIER
}r	   r‡   r%   r&   éÈ   )z*%(py2)s
{%(py2)s = %(py0)s.hp
} == %(py5)sc                 ó<   — g | ]}|j         t          j        k    ¯|‘ŒS rx   )r«   r	   ÚBONE_BRAZIERr­   s     r_   ró   z]TestGrandBossArenaAndMapExpansion.test_grand_boss_room_arena_architecture.<locals>.<listcomp>B  s3   € ð 
ð 
ð 
ØØÔ ¥LÔ$=Ò=Ð=ð Ø=Ð=Ð=ra   r<   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr   Úbraziersr    )!r   rŠ   r=  rA   rB   rC   rD   rE   rF   rG   rH   Ú	room_typer>  ÚwÚhÚappendÚ_format_boolopÚcenterr1  rg   r   Ú
BOSS_ALTARr·   Ú	boss_gateÚ	BOSS_GATEr�   Úgetr«   r	   ÚBOSS_SEAL_BARRIERÚhpr¸   r   )rN   rŽ   rA  rO   rU   r¤   rY   rQ   rX   rZ   r\   rP   r^   Ú@py_assert12Ú@py_assert15Ú@py_assert14r�   Ú@py_format17Ú@py_format19Ú@py_format20Ú@py_format22rN  ÚgxÚgyrQ  rR   rS   rU  rL  rM  r£   s                               @@@r_   Ú'test_grand_boss_room_arena_architecturezITestGrandBossArenaAndMapExpansion.test_grand_boss_room_arena_architecture"  s  øøø€ å$¨2°bÐ9Ñ9Ô9ˆØ×&Ò&¨CÐ:QÐ&ÑRÔRˆàÔˆØÐˆr˜ˆ~ÐÐÐÕÔÐÐÐÐˆr˜ÐÑÔÐÕÔÑÔÐÐÕÔˆrÑÔÐÕÔˆrÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØŒ|Ð%˜vÐ%ˆ|˜vÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ|˜vÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆrÑ%Ô%Ð%Õ%Ô%ˆrÑ%Ô%Ð%Ð%Õ%Ô%ˆ|Ñ%Ô%Õ%Ô%˜vÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØŒÐ& $Ð&ˆ $Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ $Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆrÑ&Ô&Ð&Õ&Ô&ˆrÑ&Ô&Ð&Ð&Õ&Ô&ˆÑ&Ô&Õ&Ô& $Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø&Ð&ˆrŒtÐ&�qÐ&ˆt�qŠyÐ&Ð&Ð&Ð&Ð&˜RœTÐ& QÐ&˜T QšYÐ&Ð&Ð&Ð&Ñ&Õ&Ô&Ð&Ð&Ð&Ð&ˆt�qÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆrÑ&Ô&Ð&Õ&Ô&ˆrÑ&Ô&Ð&Ð&Õ&Ô&ˆtÑ&Ô&Õ&Ô&�qÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&×&Ò&Ð&Ñ&Ô&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&˜T QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&˜RÑ&Ô&Ð&Õ&Ô&˜RÑ&Ô&Ð&Ð&Õ&Ô&˜TÑ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&×&Ò&Ð&Ñ&Ô&Ð&Õ&Ô&Ð&Ð&Ñ&Ô&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ð ”9‰ˆˆSØŒ~˜cÔ" 3Ô'ÐHÐ'Ô1ÐHµXÔ5HÐHÐ1Ð5HÒHÐHÐHÐHÕHÔHÐHÐHÐHÐHÐ1Ð5HÐHÑHÔHÕHÔHÐ'ÑHÔHÕHÔHÐ1ÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔHµXÑHÔHÐHÕHÔHµXÑHÔHÐHÐHÕHÔHÐ5HÑ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õ ð 
ð 
ð 
ð 
ð 
ð 
à ð
ñ 
ô 
ñ 
ô 
ˆð #Ð"ˆ{˜dÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ{˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ{Ñ"Ô"Ð"Õ"Ô"ˆ{Ñ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ð Ô!Ð-¨Ð-Ð!¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð!¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆxÑ-Ô-Ð-Õ-Ô-ˆxÑ-Ô-Ð-Ð-Õ-Ô-Ð!Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÔ#‰ˆˆBØŒ~˜bÔ! "Ô%ÐEÐ%Ô/ÐEµ8Ô3EÐEÐ/Ð3EÒEÐEÐEÐEÕEÔEÐEÐEÐEÐEÐ/Ð3EÐEÑEÔEÕEÔEÐ%ÑEÔEÕEÔEÐ/ÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔEµ8ÑEÔEÐEÕEÔEµ8ÑEÔEÐEÐEÕEÔEÐ3EÑ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ØÔ%×)Ò)¨2¨r¨(Ñ3Ô3ˆØ#Ð#ˆx˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆx˜tÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆxÑ#Ô#Ð#Õ#Ô#ˆxÑ#Ô#Ð#Ð#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#ØÔ%Ð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ˆxÑGÔGÐGÕGÔGˆxÑ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ØŒ{Ð!˜cÐ!ˆ{˜cÒ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ{˜cÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆxÑ!Ô!Ð!Õ!Ô!ˆxÑ!Ô!Ð!Ð!Õ!Ô!ˆ{Ñ!Ô!Õ!Ô!˜cÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ð
ð 
Ø#Ô-×4Ò4Ñ6Ô6ð
ñ 
ô 
ˆõ �8‰}Œ}Ð! Ð!ˆ} Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ} Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�sÑ!Ô!Ð!Õ!Ô!�sÑ!Ô!Ð!Ð!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�8Ñ!Ô!Ð!Õ!Ô!�8Ñ!Ô!Ð!Ð!Õ!Ô!ˆ}Ñ!Ô!Õ!Ô! Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ra   c           	      óÈ  — t          dd¬¦  «        }|                     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}}|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        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}|j        } |||	¦  «        }
d}|
|u }|�s9t          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t          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}
x}}|                     |¦  «        }d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}|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}}|j        } |||	¦  «        }
d}|
|u }|�s9t          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t          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}
x}}dS )zOVerifies breach_boss_gate unblocks the boss seal barrier and mutates map state.r|   r}   é{   r'   r€   Nr½   rO  r£   r8   r:   r;   Frj   )z:%(py2)s
{%(py2)s = %(py0)s.boss_gate_breached
} is %(py5)srÁ   ri  rj  rÄ   r…   r†   Trš   Úbreachedrœ   r�   r9   )r   rŠ   r]  rA   rB   rC   rD   rE   rF   rG   rH   Úboss_gate_breachedrÌ   Úbreach_boss_gate)rN   rŽ   r£   rU   rQ   rX   rY   rZ   ri  rj  rP   r�   r[   r�   r‘   rn  rO   r¤   s                     r_   Útest_boss_gate_breach_mechanicz@TestGrandBossArenaAndMapExpansion.test_boss_gate_breach_mechanicH  s³  € å$¨2°bÐ9Ñ9Ô9ˆØ×&Ò&¨CÐ:QÐ&ÑRÔRˆàÔ!Ð-¨Ð-Ð!¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð!¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆxÑ-Ô-Ð-Õ-Ô-ˆxÑ-Ô-Ð-Ð-Õ-Ô-Ð!Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÔ#‰ˆˆBØÔ*Ð3¨eÐ3Ð*¨eÐ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð*¨eÐ3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ˆxÑ3Ô3Ð3Õ3Ô3ˆxÑ3Ô3Ð3Ð3Õ3Ô3Ð*Ñ3Ô3Õ3Ô3¨eÑ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ØÔ#Ð4Ð#Ð# B¨Ñ+Ô+Ð4¨uÐ4Ð+¨uÐ4Ð4Ð4Ñ4Õ4Ô4Ð4Ð4Ð4Ð4Ð+¨uÐ4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆxÑ4Ô4Ð4Õ4Ô4ˆxÑ4Ô4Ð4Ð4Õ4Ô4Ð#Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4 BÑ4Ô4Ð4Õ4Ô4 BÑ4Ô4Ð4Ð4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4¨Ñ4Ô4Ð4Õ4Ô4¨Ñ4Ô4Ð4Ð4Õ4Ô4Ð+Ñ4Ô4Õ4Ô4¨uÑ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ð ×*Ò*¨8Ñ4Ô4ˆØÐˆx˜4ÐÐÐÐÕÔÐÐÐÐˆx˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ*Ð2¨dÐ2Ð*¨dÐ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð*¨dÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆxÑ2Ô2Ð2Õ2Ô2ˆxÑ2Ô2Ð2Ð2Õ2Ô2Ð*Ñ2Ô2Õ2Ô2¨dÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ØÔ#Ð3Ð#Ð# B¨Ñ+Ô+Ð3¨tÐ3Ð+¨tÐ3Ð3Ð3Ñ3Õ3Ô3Ð3Ð3Ð3Ð3Ð+¨tÐ3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ˆxÑ3Ô3Ð3Õ3Ô3ˆxÑ3Ô3Ð3Ð3Õ3Ô3Ð#Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3 BÑ3Ô3Ð3Õ3Ô3 BÑ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¨tÑ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ra   c           
      ót  — t          dd¬¦  «        }|                     dd¬¦  «        }|j        }d}d} |||¦  «        }d}||k    }|sãt          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}x}}|j        }d}d} |||¦  «        }d}||k    }|sãt          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}x}}|j        }d}d} |||¦  «        }d}||k    }|sãt          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}x}}|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  }t          t          j
        |¦  «        ¦  «        ‚dx}}|j        \  }}|j        } |||¦  «        }d}||u }|�s9t          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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}}|j        }|j        d         }|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        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}x}}|                     ¦   «         }t!          |¦  «        }|j        }|j        }||z  }||k    }|�s�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        |¦  «        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          t          j
        |
¦  «        ¦  «        ‚dx}x}x}x}}|j        } |¦   «         }d(}||k    }|s½t          j        d)|fd*||f¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d+œz  }d,d-|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}}dS ).z:Verifies spatial chunking and boss arena bounding helpers.r8  r}   rÑ   r(   r€   r   )r   r   r   )z`%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get_chunk_coords
}(%(py4)s, %(py6)s)
} == %(py11)sr£   r   r!  r"  Né   )rc   rc   é?   )rm   rm   r½   r¿   rA  rœ   r�   r9   Trj   )z^%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.is_in_boss_room
}(%(py3)s, %(py4)s)
} is %(py9)srL  rM  rÄ   r…   r†   rc   F)z_%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.is_in_boss_room
}(%(py4)s, %(py6)s)
} is %(py11)s)zl%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == (%(py7)s
{%(py7)s = %(py5)s.w
} * %(py10)s
{%(py10)s = %(py8)s.h
})r   Úarena_cells)r!   r"   r#   r9   r;   r&   r?   rÊ   rŸ   )zQ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_walkables_count
}()
} > %(py7)sr;  rá   r„   )r   rŠ   Úget_chunk_coordsrA   rB   rC   rD   rE   rF   rG   rH   r=  r[  Úis_in_boss_roomr‹   Úget_boss_arena_cellsr   rW  rX  Úget_walkables_count)rN   rŽ   r£   rU   rX   rP   r[   r)  r’   r‘   r*  rA  rO   r¤   rY   rL  rM  r�   r�   ru  r\   r“   rQ   rZ   s                           r_   Ú+test_spatial_partitioning_and_arena_querieszMTestGrandBossArenaAndMapExpansion.test_spatial_partitioning_and_arena_queriesX  sc
  € å$¨2°bÐ9Ñ9Ô9ˆØ×&Ò&¨CÐ:PÐ&ÑQÔQˆð Ô(Ð8¨Ð8¨AÐ8Ð(Ð(¨¨AÑ.Ô.Ð8°&Ð8Ð.°&Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð.°&Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆxÑ8Ô8Ð8Õ8Ô8ˆxÑ8Ô8Ð8Ð8Õ8Ô8Ð(Ñ8Ô8Õ8Ô8¨Ñ8Ô8Õ8Ô8¨AÑ8Ô8Õ8Ô8Ð.Ñ8Ô8Õ8Ô8°&Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØÔ(Ð:¨Ð:¨RÐ:Ð(Ð(¨¨RÑ0Ô0Ð:°FÐ:Ð0°FÒ:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð0°FÐ:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆxÑ:Ô:Ð:Õ:Ô:ˆxÑ:Ô:Ð:Ð:Õ:Ô:Ð(Ñ:Ô:Õ:Ô:¨Ñ:Ô:Õ:Ô:¨RÑ:Ô:Õ:Ô:Ð0Ñ:Ô:Õ:Ô:°FÑ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ØÔ(Ð:¨Ð:¨RÐ:Ð(Ð(¨¨RÑ0Ô0Ð:°FÐ:Ð0°FÒ:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð0°FÐ:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆxÑ:Ô:Ð:Õ:Ô:ˆxÑ:Ô:Ð:Ð:Õ:Ô:Ð(Ñ:Ô:Õ:Ô:¨Ñ:Ô:Õ:Ô:¨RÑ:Ô:Õ:Ô:Ð0Ñ:Ô:Õ:Ô:°FÑ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ð ÔˆØÐˆr˜ˆ~ÐÐÐÕÔÐÐÐÐˆr˜ÐÑÔÐÕÔÑÔÐÐÕÔˆrÑÔÐÕÔˆrÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ”9‰ˆˆSØÔ'Ð9Ð'Ð'¨¨SÑ1Ô1Ð9°TÐ9Ð1°TÐ9Ð9Ð9Ñ9Õ9Ô9Ð9Ð9Ð9Ð9Ð1°TÐ9Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9ˆxÑ9Ô9Ð9Õ9Ô9ˆxÑ9Ô9Ð9Ð9Õ9Ô9Ð'Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9¨Ñ9Ô9Ð9Õ9Ô9¨Ñ9Ô9Ð9Ð9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9¨SÑ9Ô9Ð9Õ9Ô9¨SÑ9Ô9Ð9Ð9Õ9Ô9Ð1Ñ9Ô9Õ9Ô9°TÑ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ØÔ'Ðb¨Ô(<¸QÔ(?ÐbÀÔAUÐVWÔAXÐbÐ'Ð'Ð(?ÐAXÑYÔYÐbÐ]bÐbÐYÐ]bÐbÐbÐbÐbÕbÔbÐbÐbÐbÐbÐYÐ]bÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔbˆxÑbÔbÐbÕbÔbˆxÑbÔbÐbÐbÕbÔbÐ'ÑbÔbÕbÔbÐ(?ÑbÔbÕbÔbÐAXÑbÔbÕbÔbÐYÑ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à×3Ò3Ñ5Ô5ˆÝ�;ÑÔÐ. 2¤4Ð.¨"¬$Ð. 4¨$¡;Ð.Ð ;Ò.Ð.Ð.Ñ.Õ.Ô.Ð.Ð.Ð.Ð.Ð ;Ð.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.�sÑ.Ô.Ð.Õ.Ô.�sÑ.Ô.Ð.Ð.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.�;Ñ.Ô.Ð.Õ.Ô.�;Ñ.Ô.Ð.Ð.Õ.Ô.ÐÑ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. 2Ñ.Ô.Ð.Õ.Ô. 2Ñ.Ô.Ð.Ð.Õ.Ô. 4Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.¨"Ñ.Ô.Ð.Õ.Ô.¨"Ñ.Ô.Ð.Ð.Õ.Ô.¨$Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØÔ+Ð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ˆxÑ3Ô3Ð3Õ3Ô3ˆxÑ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Ð3ra   c           
      óÔ  — t          ¦   «         }|                     dddd¬¦  «        }t          dd¬¦  «        }|                     dd¬¦  «        }|j        \  }}|                     ||||¦  «         |j        } ||||¦  «        }d	}	||	u }
|
�swt          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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        |	¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}
}	|j        } ||||¦  «        }d	}	||	u }
|
�swt          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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        |	¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}
}	|j        } ||¦  «        }d}||k    }|sût          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        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}}|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        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}dS )zPVerifies WarFogEngine get_explored_ratio, is_cell_visible, and is_cell_explored.Ú	p_explorer»   é   )r~   r   rï   r}   ix  r*   r€   Trj   )zh%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.is_cell_visible
}(%(py3)s, %(py4)s, %(py5)s)
} is %(py10)srè   rÞ   rù   rú   )r!   r/   r#   r1   r9   r;   r?   zassert %(py12)srˆ   N)zi%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.is_cell_explored
}(%(py3)s, %(py4)s, %(py5)s)
} is %(py10)sg        rŸ   )zW%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_explored_ratio
}(%(py3)s)
} > %(py8)s)r!   r/   r#   r9   r&   r>   r?   r5   )ú<=)zX%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_explored_ratio
}(%(py3)s)
} <= %(py8)s)r   râ   r   rŠ   r‹   r÷   Úis_cell_visiblerA   rB   rC   rD   rE   rF   rG   rH   Úis_cell_exploredÚget_explored_ratio)rN   rè   rÞ   rŽ   r£   rù   rú   rU   r\   r’   r�   r]   r”   rQ   r[   rS   s                   r_   Ú#test_war_fog_ratio_and_cell_querieszETestGrandBossArenaAndMapExpansion.test_war_fog_ratio_and_cell_queriesm  st  € å!‘^”^ˆ
Ø×1Ò1°+ÀRÐPRÐ`aÐ1ÑbÔbˆÝ$¨2°bÐ9Ñ9Ô9ˆØ×&Ò&¨CÐ:OÐ&ÑPÔPˆàÔ%‰ˆˆBØ×$Ò$ S¨(°B¸Ñ;Ô;Ð;àÔ)Ð>Ð)Ð)¨#¨r°2Ñ6Ô6Ð>¸$Ð>Ð6¸$Ð>Ð>Ð>Ñ>Õ>Ô>Ð>Ð>Ð>Ð>Ð6¸$Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>ˆzÑ>Ô>Ð>Õ>Ô>ˆzÑ>Ô>Ð>Ð>Õ>Ô>Ð)Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>¨#Ñ>Ô>Ð>Õ>Ô>¨#Ñ>Ô>Ð>Ð>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>¨rÑ>Ô>Ð>Õ>Ô>¨rÑ>Ô>Ð>Ð>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>°2Ñ>Ô>Ð>Õ>Ô>°2Ñ>Ô>Ð>Ð>Õ>Ô>Ð6Ñ>Ô>Õ>Ô>¸$Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØÔ*Ð?Ð*Ð*¨3°°BÑ7Ô7Ð?¸4Ð?Ð7¸4Ð?Ð?Ð?Ñ?Õ?Ô?Ð?Ð?Ð?Ð?Ð7¸4Ð?Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?ˆzÑ?Ô?Ð?Õ?Ô?ˆzÑ?Ô?Ð?Ð?Õ?Ô?Ð*Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?¨3Ñ?Ô?Ð?Õ?Ô?¨3Ñ?Ô?Ð?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?°Ñ?Ô?Ð?Õ?Ô?°Ñ?Ô?Ð?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?°BÑ?Ô?Ð?Õ?Ô?°BÑ?Ô?Ð?Ð?Õ?Ô?Ð7Ñ?Ô?Õ?Ô?¸4Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ØÔ,Ð7Ð,Ð,¨SÑ1Ô1Ð7°CÐ7Ð1°CÒ7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð1°CÐ7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7ˆzÑ7Ô7Ð7Õ7Ô7ˆzÑ7Ô7Ð7Ð7Õ7Ô7Ð,Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7¨SÑ7Ô7Ð7Õ7Ô7¨SÑ7Ô7Ð7Ð7Õ7Ô7Ð1Ñ7Ô7Õ7Ô7°CÑ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ØÔ,Ð8Ð,Ð,¨SÑ1Ô1Ð8°SÐ8Ð1°SÒ8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð1°SÐ8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆzÑ8Ô8Ð8Õ8Ô8ˆzÑ8Ô8Ð8Ð8Õ8Ô8Ð,Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8¨SÑ8Ô8Ð8Õ8Ô8¨SÑ8Ô8Ð8Ð8Õ8Ô8Ð1Ñ8Ô8Õ8Ô8°SÑ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ra   c           
      ó  ‡— dD �]}dD �]x}t          ||¬¦  «        }|                     |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        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}‰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}
}	‰j        \  }}g }t          |j        |j        |j        z   ¦  «        D ]2}|                     ||j        f||j        |j        z   dz
  fg¦  «         Œ3t          |j        dz   |j        |j        z   dz
  ¦  «        D ]2}|                     |j        |f|j        |j        z   dz
  |fg¦  «         Œ3ˆfd„|D ¦   «         }t%          |¦  «        }d}||k    }	|	�s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  }t          j        dt%          |¦  «        › d|› d|› �¦  «        dz   d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}	}|d         }||f}
||
k    }|slt          j        d|fd||
f¦  «        t          j        |¦  «        t          j        |
¦  «        d œz  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}
‰j        |         |         }|j        }t,          j        }||k    }	|	sÇt          j        d|	fd#||f¦  «        t          j        |¦  «        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          t          j
        |¦  «        ¦  «        ‚dx}x}x}	}t1          ‰‰j        ‰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        |¦  «        d
œz  }t          j        d-|› d|› d.�¦  «        d/z   d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}|                     ‰¦  «        }d0}||u }|s—t          j        d*|fd+||f¦  «        d1t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd1t          j        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}t1          ‰‰j        ‰j        d(¬)¦  «        \  }}d0}||u }|s—t          j        d*|fd+||f¦  «        d2t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd2t          j        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}�Œz�Œ�dS )3zqVerifies 100% of perimeter cells around Boss Arena are solid walls except exactly 1 boss gate, preventing bypass.r7  )ée   éÊ   i/  r}   r+   r€   Nr½   r¿   rA  rœ   r�   r9   rO  r£   r8   r:   r;   rc   c                 ój   •— g | ]/\  }}‰j         |         |         j        t          j        k    ¯+||f‘Œ0S rx   )r1  rg   r   rr   )r®   ÚpxÚpyr£   s      €r_   ró   znTestGrandBossArenaAndMapExpansion.test_zero_boss_gate_bypass_and_single_perimeter_entrance.<locals>.<listcomp>Ž  sG   ø€ ð ð ð Ù!) " bØ”~ bÔ)¨"Ô-Ô7½8¼=ÒHÐHð ˜�HØHÐHÐHra   r   r   r   Ú	non_wallsr    z&Expected 1 entrance on perimeter, got z	 at seed z, dim z
>assert %(py8)sr&   r   r
  r  r4   r$   rP  r   rà   rá   r„   F)Úallow_sealed_boss_gaterj   rš   Úunbreached_connectedzBoss gate bypassed at seed ú!z
>assert %(py5)sTÚ	breach_okÚbreached_connected)r   rŠ   r=  rA   rB   rC   rD   rE   rF   rG   rH   r]  rñ   re   rW  Úextendrf   rX  r   Ú_format_assertmsgr1  rg   r   r^  r   r‹   rŒ   rp  )rN   r:  r�   rŽ   rA  rO   rU   r¤   rY   rQ   rX   rZ   ri  rj  Úperimeter_cellsre   rf   r‰  rP   rR   rS   r^   rW   r\   r�   r‹  rÓ   r�  rŽ  r£   s                                @r_   Ú8test_zero_boss_gate_bypass_and_single_perimeter_entrancezZTestGrandBossArenaAndMapExpansion.test_zero_boss_gate_bypass_and_single_perimeter_entrance|  së  ø€ à#ð $	2ñ $	2ˆCØ'ð #2ñ #2�Ý,°3¸sÐCÑCÔC�Ø!×.Ò.°DÐCZÐ.Ñ[Ô[�ØÔ'�Ø!%Ð%�r �~Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%�r Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�rÑ%Ô%Ð%Õ%Ô%�rÑ%Ô%Ð%Ð%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%ØÔ)Ð5°Ð5Ð)°Ð5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð)°Ð5Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5�xÑ5Ô5Ð5Õ5Ô5�xÑ5Ô5Ð5Ð5Õ5Ô5Ð)Ñ5Ô5Õ5Ô5°Ñ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ø!Ô+‘��Bð #%�Ý˜rœt R¤T¨B¬D¡[Ñ1Ô1ð Nð N�AØ#×*Ò*¨Q°´¨I¸¸2¼4À"Ä$¹;È¹?Ð7KÐ+LÑMÔMÐMÐMÝ˜rœt a™x¨¬°´©°q©Ñ9Ô9ð Nð N�AØ#×*Ò*¨R¬T°1¨I¸¼¸r¼t¹Àa¹ÈÐ7KÐ+LÑMÔMÐMÐMðð ð ð Ø-<ðñ ô �	õ ˜9‘~”~Ð¨Ð�~¨Ò*ÐÐÑÕÔÐÐÐÐ�~¨ÐÑÔÐÕÔÑÔÐÐÕÔ•sÑÔÐÕÔ•sÑÔÐÐÐÕÔÑÔÐÐÕÔ˜9ÑÔÐÕÔ˜9ÑÔÐÐÕÔ�~ÑÔÕÔ¨ÑÔÐÐÑÐÕÔÐ,ÕUXÐYbÑUcÔUcÐ,Ð,ÐnrÐ,Ð,Ðz}Ð,Ð,ÑÔÐÑÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØ  ”|Ð/¨¨B xÐ/�| xÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/�| xÐ/Ñ/Ô/Õ/Ô/�|Ñ/Ô/Õ/Ô/ xÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ø”~ bÔ)¨"Ô-ÐMÐ-Ô7ÐM½8Ô;MÐMÐ7Ð;MÒMÐMÐMÐMÕMÔMÐMÐMÐMÐMÐ7Ð;MÐMÑMÔMÕMÔMÐ-ÑMÔMÕMÔMÐ7ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM½8ÑMÔMÐMÕMÔM½8Ñ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õ +CØ˜hÔ2°HÔ4GÐ`eð+ñ +ô +Ñ'Ð$ að 05ÐfÐ+¨uÐ4ÐfÐfÐfÕfÔfÐfÐfÐfÐfÐ+¨uÐfÑfÔfÐfÕfÔfÑfÔfÐfÐfÕfÔfÐ+ÑfÔfÐfÕfÔfÐ+ÑfÔfÐfÐfÕfÔf¨uÑfÔfÐfÐfÑfÐfÕfÔfÐ6fÐTXÐ6fÐ6fÐ`cÐ6fÐ6fÐ6fÑfÔfÐfÑfÐfÐfÐfÑfÐfÕfÕfÔfÐfÑfÔfÑfÔfÐfÐfÐfÐfÐfð #×3Ò3°HÑ=Ô=�	Ø$(Ð(�y DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(�y DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�yÑ(Ô(Ð(Õ(Ô(�yÑ(Ô(Ð(Ð(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ý(@Ø˜hÔ2°HÔ4GÐ`eð)ñ )ô )Ñ%Ð" Að .2Ð1Ð)¨TÐ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð)¨TÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1Ð)Ñ1Ô1Ð1Õ1Ô1Ð)Ñ1Ô1Ð1Ð1Õ1Ô1¨TÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ñ1ñG#2ð$	2ð $	2ra   N)	ru   rv   rw   r?  rk  rq  rz  r‚  r’  rx   ra   r_   r5  r5    so   € € € € € ð!ð !ð !ð$"ð $"ð $"ðL4ð 4ð 4ð 4ð 4ð 4ð*9ð 9ð 9ð&2ð &2ð &2ð &2ð &2ra   r5  )&Ú__doc__ÚbuiltinsrC   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterA   ÚpytestÚtypingr   r   r   r   Úserver.world.map_data_typesr   r   r	   r
   r   r   r   Úserver.world.map_biome_catalogr   r   r   Úserver.world.war_fog_enginer   r   r   Ú"server.world.procedural_map_enginer   r   r   r   rz   r§   rÙ   r5  rx   ra   r_   ú<module>rž     s/  ððð ð  € € € € € € € € € € € € €€€€Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð ð ð#(ð #(ð #(ð #(ð #(ñ #(ô #(ð #(ðL!ð !ð !ð !ð !ñ !ô !ð !ð2:2ð :2ð :2ð :2ð :2ñ :2ô :2ð :2ðze.ð e.ð e.ð e.ð e.ñ e.ô e.ð e.ðPP2ð P2ð P2ð P2ð P2ñ P2ô P2ð P2ð P2ð P2ra   