§
    Ùz¿j#  ã            
       óà   — U d Z ddlZddlmc mZ ddlmZ ddl	Z	ddl
Z
ddlmZ ddlmZ dddd	d
dddddœ	Zeeeeeeef         f         ed<   e
j        defd„¦   «         Z G d„ d¦  «        ZdS )a•  
Unit tests for Requirement R1: Wilderness Map Expansion in FreeExile.
Verifies that:
1. All 9 wilderness zones have their bounds doubled from original specs.
2. The initial wilderness zone (zone_tang_kiem_nhai) has bounds >= 1600.0 x 1600.0.
3. Safe Haven / Sanctuary zones (zone_boundless_sanctuary, zone_player_hideout)
   remain strictly at 800.0 x 800.0.
4. Server-authoritative movement engine (ZoneEngine.update_player_position)
   correctly permits player navigation into the expanded coordinates (e.g. x=900.0)
   and clamps/rejects movements beyond the new half-extents.
5. Central Game Design Matrix SQLite database reflects the expanded dimensions.
é    N)ÚPath©Ú
ZoneEngine)ÚZoneType)ç     @�@r   ç     @Ÿ@r   )ç     À’@r	   ç     À¢@r
   )ç     p—@r   ç     p§@r   )ç      ™@r   ç      ©@r   )ç      œ@r   ç      ¬@r   )r   r   ç     @¯@r   )ç     0¡@r   ç     0±@r   )r
   r
   ç     À²@r   )ç     ˆ£@r   ç     ˆ³@r   )	Úzone_tang_kiem_nhaiÚzone_ancient_sword_barrowÚzone_boundless_sandstormÚzone_blood_scale_ruinsÚzone_five_elements_altarÚzone_abyssal_ice_pondÚzone_infinite_blood_riftÚzone_purgatory_lava_cavernÚzone_boundless_celestial_palaceÚEXPECTED_WILDERNESS_BOUNDSÚreturnc                  ó   — t          ¦   «         S )Nr   © ó    ú>C:\Projects\FreeExile\tests\unit\test_zone_bounds_expansion.pyÚzone_enginer&   $   s   € å‰<Œ<Ðr$   c                   óŠ   — e Zd ZdZdeddfd„Zdeddfd„Zdeddfd„Zdeddfd„Zdeddfd	„Z	deddfd
„Z
dd„Zdd„Zdd„ZdS )ÚTestZoneBoundsExpansionzPValidates wilderness zone expansion across server engine, catalog, and database.r&   r!   Nc                 ó~  — |                      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	}||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}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}|j
        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}dS )zNVerifies zone_tang_kiem_nhai meets or exceeds the 1600.0 x 1600.0 requirement.r   N©úis not©z%(py0)s is not %(py3)sÚzone©Úpy0Úpy3úassert %(py5)sÚpy5r   )ú>=)z4%(py2)s
{%(py2)s = %(py0)s.bounds_width
} >= %(py5)s©r/   Úpy2r2   úassert %(py7)sÚpy7)z5%(py2)s
{%(py2)s = %(py0)s.bounds_height
} >= %(py5)sr   ©ú==©z4%(py2)s
{%(py2)s = %(py0)s.bounds_width
} == %(py5)s©z5%(py2)s
{%(py2)s = %(py0)s.bounds_height
} == %(py5)s)Úget_zoneÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚbounds_widthÚbounds_height)
Úselfr&   r-   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6Ú@py_assert4Ú@py_assert3Ú@py_format8s
             r%   Ú6test_tang_kiem_nhai_exceeds_minimum_expanded_thresholdzNTestZoneBoundsExpansion.test_tang_kiem_nhai_exceeds_minimum_expanded_threshold,   sd  € ð ×#Ò#Ð$9Ñ:Ô:ˆØÐˆt˜4ÐÐÐÐÕÔÐÐÐÐˆt˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆtÑÔÐÕÔˆtÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÔ Ð* FÐ*Ð  FÒ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð  FÐ*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆtÑ*Ô*Ð*Õ*Ô*ˆtÑ*Ô*Ð*Ð*Õ*Ô*Ð Ñ*Ô*Õ*Ô* FÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÔ!Ð+ VÐ+Ð! VÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð! VÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆtÑ+Ô+Ð+Õ+Ô+ˆtÑ+Ô+Ð+Ð+Õ+Ô+Ð!Ñ+Ô+Õ+Ô+ VÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔ Ð* FÐ*Ð  FÒ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð  FÐ*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆtÑ*Ô*Ð*Õ*Ô*ˆtÑ*Ô*Ð*Ð*Õ*Ô*Ð Ñ*Ô*Õ*Ô* FÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÔ!Ð+ VÐ+Ð! VÒ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð! VÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆtÑ+Ô+Ð+Õ+Ô+ˆtÑ+Ô+Ð+Ð+Õ+Ô+Ð!Ñ+Ô+Õ+Ô+ VÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r$   c                 óV  — t                                ¦   «         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z   d	|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}	}|j        }	t          j        }|	|k    }|sòt          j        d
|fd|	|f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        d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}}|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  }t          j	        d|› d|j        › d|› d|› d�	¦  «        dz   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  }t          j	        d|› d|j        › d|› d|› d�	¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	}�ŒdS )zIVerifies that all 9 wilderness zones have their width and height doubled.Nr*   r,   r-   r.   zZone 'z' not found in ZoneEnginez
>assert %(py5)sr2   r8   )zQ%(py2)s
{%(py2)s = %(py0)s.zone_type
} == %(py6)s
{%(py6)s = %(py4)s.OPEN_WORLD
}r   ©r/   r5   Úpy4Úpy6úassert %(py8)sÚpy8)z4%(py2)s
{%(py2)s = %(py0)s.bounds_width
} == %(py4)sÚexp_w©r/   r5   rR   z' width ú != expected z (2x ú)ú
>assert %(py6)srS   )z5%(py2)s
{%(py2)s = %(py0)s.bounds_height
} == %(py4)sÚexp_hz	' height )r    Úitemsr<   r=   r>   r?   r@   rA   rB   Ú_format_assertmsgrC   rD   Ú	zone_typer   Ú
OPEN_WORLDrE   rF   )rG   r&   Úzone_idÚbase_wÚbase_hrV   r[   r-   rH   rI   rJ   rK   Ú@py_assert5rM   Ú@py_format7Ú@py_format9Ú@py_format5s                    r%   Ú&test_all_nine_wilderness_zones_doubledz>TestZoneBoundsExpansion.test_all_nine_wilderness_zones_doubled7   sø  € õ 8R×7WÒ7WÑ7YÔ7Yð 		ñ 		Ñ3ˆGÑ3�f˜f e¨UØ×'Ò'¨Ñ0Ô0ˆDØ#ÐP�4˜tÐ#ÐPÐPÐPÕPÔPÐPÐPÐPÐP�4˜tÐPÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔP�4ÑPÔPÐPÕPÔP�4ÑPÔPÐPÐPÕPÔP˜tÑPÔPÐPÐPÑPÐPÕPÔPÐ%P¨gÐ%PÐ%PÐ%PÑPÔPÐPÑPÐPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPØ”>Ð8¥XÔ%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�4Ñ8Ô8Ð8Õ8Ô8�4Ñ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Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØÔ$ð Ð$¨Ò-ð ð ð õ ìðð ð ð Ð$¨ð ñ ô ð õ äñô ð ð õ ìð ñ ô ð õ äð ñ ô ð ð õ äð %ñ ô ð õ äñô ð ð õ ìð ).ñ ô ð õ äð ).ñ ô ð ð ð ð ñ ð õ ìð `˜Ð_Ð_¨$Ô*;Ð_Ð_È%Ð_Ð_ÐV\Ð_Ð_Ð_ñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð Ô%ð Ð%¨Ò.ð ð ð õ ìðð ð ð Ð%¨ð ñ ô ð õ äñô ð ð õ ìð ñ ô ð õ äð ñ ô ð ð õ äð &ñ ô ð õ äñô ð ð õ ìð */ñ ô ð õ äð */ñ ô ð ð ð ð ñ ð õ ìð b˜ÐaÐa¨4Ô+=ÐaÐaÈEÐaÐaÐX^ÐaÐaÐañô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ñ ð		ð 		r$   c                 ó:  — |                      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	        }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        t          ¦  «        rt          j        t          ¦  «        nd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}||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¦  «        }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	        }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        t          ¦  «        rt          j        t          ¦  «        nd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}||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 )zLEnsures sanctuary hubs and hideouts are never expanded beyond 800.0 x 800.0.Úzone_boundless_sanctuaryNr*   r,   Ú	sanctuaryr.   r1   r2   r8   )zP%(py2)s
{%(py2)s = %(py0)s.zone_type
} == %(py6)s
{%(py6)s = %(py4)s.SANCTUARY
}r   rQ   rT   rU   ç      ‰@r:   r4   r6   r7   r;   Úzone_player_hideoutÚhideout)r<   r=   r>   r?   r@   rA   rB   rC   rD   r^   r   Ú	SANCTUARYrE   rF   )rG   r&   rj   rH   rI   rJ   rK   rc   rM   rd   re   rL   rN   rm   s                 r%   Ú(test_sanctuary_zones_remain_strictly_800z@TestZoneBoundsExpansion.test_sanctuary_zones_remain_strictly_800F   s|  € ð  ×(Ò(Ð)CÑDÔDˆ	Ø $Ð$ˆy Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆy Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆyÑ$Ô$Ð$Õ$Ô$ˆyÑ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$ØÔ"Ð8¥hÔ&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ˆyÑ8Ô8Ð8Õ8Ô8ˆyÑ8Ô8Ð8Ð8Õ8Ô8Ð"Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8¥hÑ8Ô8Ð8Õ8Ô8¥hÑ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ØÔ%Ð.¨Ð.Ð%¨Ò.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð%¨Ð.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.ˆyÑ.Ô.Ð.Õ.Ô.ˆyÑ.Ô.Ð.Ð.Õ.Ô.Ð%Ñ.Ô.Õ.Ô.¨Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØÔ&Ð/¨%Ð/Ð&¨%Ò/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð&¨%Ð/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆyÑ/Ô/Ð/Õ/Ô/ˆyÑ/Ô/Ð/Ð/Õ/Ô/Ð&Ñ/Ô/Õ/Ô/¨%Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/à×&Ò&Ð'<Ñ=Ô=ˆØ"Ð"ˆw˜dÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆw˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆwÑ"Ô"Ð"Õ"Ô"ˆwÑ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØÔ Ð6¥HÔ$6Ð6Ð Ð$6Ò6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð Ð$6Ð6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6ˆwÑ6Ô6Ð6Õ6Ô6ˆwÑ6Ô6Ð6Ð6Õ6Ô6Ð Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6¥HÑ6Ô6Ð6Õ6Ô6¥HÑ6Ô6Ð6Ð6Õ6Ô6Ð$6Ñ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ØÔ#Ð, uÐ,Ð# uÒ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð# uÐ,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆwÑ,Ô,Ð,Õ,Ô,ˆwÑ,Ô,Ð,Ð,Õ,Ô,Ð#Ñ,Ô,Õ,Ô, uÑ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÔ$Ð-¨Ð-Ð$¨Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð$¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆwÑ-Ô-Ð-Õ-Ô-ˆwÑ-Ô-Ð-Ð-Õ-Ô-Ð$Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-r$   c                 ó¬  — d}|                      |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}}d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}| 
                    |¦  «        }	|	j        }d}
||
k    }|sªt          j        d|fd||
f¦  «        dt	          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}
|	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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}}|                     |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}}d}||v }|s—t          j        d|fd ||f¦  «        t          j        |¦  «        d!t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd!d"œz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )#zUTests that player movement allows coordinates in expanded half-bounds (up to 1000.0).Útest_wanderer_01r   g      Œ@T©Úis©z%(py0)s is %(py3)sÚsuccessr.   r1   r2   NÚ r8   ©z%(py0)s == %(py3)sÚerr)z)%(py2)s
{%(py2)s = %(py0)s.x
} == %(py5)sÚlocr4   r6   r7   )z)%(py2)s
{%(py2)s = %(py0)s.y
} == %(py5)sg     °�Àg     �ŠÀÚneg_okÚneg_errg     h�@g      I@FÚ	exceed_okõ$   VÆ°á»£t quÃ¡ ranh giá»›i báº£n Ä‘á»“©Úin©z%(py1)s in %(py3)sÚ
exceed_err©Úpy1r0   )Úspawn_playerÚupdate_player_positionr=   r>   r?   r@   rA   rB   rC   rD   Úget_player_locationÚxÚy)rG   r&   Ú	player_idru   rx   rH   rI   rJ   rK   ry   rL   rM   rN   rz   r{   r|   r�   Ú@py_assert0s                     r%   Ú=test_movement_engine_allows_expanded_coordinates_in_tang_kiemzUTestZoneBoundsExpansion.test_movement_engine_allows_expanded_coordinates_in_tang_kiemV   sÜ  € ð 'ˆ	Ø× Ò  Ð,AÑBÔBÐBð #×9Ò9¸)ÀUÈEÑRÔR‰ˆ�ØÐˆw˜$ˆÐÐÐÕÔÐÐÐÐˆw˜$ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆs�bŠyÐÐÐÕÔÐÐÐÐˆs�bÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�bÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐà×-Ò-¨iÑ8Ô8ˆØŒuÐ˜Ðˆu˜Š~ÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆuÑÔÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØŒuÐ˜Ðˆu˜Š~ÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆuÑÔÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐð &×<Ò<¸YÈÐPVÑWÔW‰ˆ�ØÐˆv˜ˆ~ÐÐÐÕÔÐÐÐÐˆv˜ÐÑÔÐÕÔÑÔÐÐÕÔˆvÑÔÐÕÔˆvÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆw˜"Š}ÐÐÐÕÔÐÐÐÐˆw˜"ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜"ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐð !,× BÒ BØ�v˜tñ!
ô !
Ñˆ	�:ð "Ð!ˆy˜EÐ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆy˜EÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆyÑ!Ô!Ð!Õ!Ô!ˆyÑ!Ô!Ð!Ð!Õ!Ô!˜EÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ø5ÐCÐ5¸ÐCÐCÐCÐCÕCÔCÐCÐCÐCÐCÐ5¸ÐCÑCÔCÕCÔCÐ5ÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC¸ÑCÔCÐCÕCÔC¸ÑCÔCÐCÐCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCr$   c                 óº  — d}|                      |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}}d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}|                     |dd¦  «        \  }	}
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}||
v }|s—t          j        d|fd||
f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |
¦  «        rt          j        |
¦  «        nddœz  }d	d
|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )zOVerifies that sanctuary movement boundary remains strictly at half-bound 400.0.Útest_wanderer_sanctuaryri   g     àu@Trr   rt   Úokr.   r1   r2   Nrv   r8   rw   rx   g      |@ç        FÚblockedr}   r~   r€   Ú	block_errr‚   ©
r„   r…   r=   r>   r?   r@   rA   rB   rC   rD   ©rG   r&   r‰   rŽ   rx   rH   rI   rJ   rK   r�   r‘   rŠ   s               r%   Ú2test_movement_engine_respects_sanctuary_800_boundszJTestZoneBoundsExpansion.test_movement_engine_respects_sanctuary_800_boundsr   sk  € ð .ˆ	Ø× Ò  Ð,FÑGÔGÐGð ×4Ò4°YÀÀuÑMÔM‰ˆˆCØÐˆr�TˆzÐÐÐÕÔÐÐÐÐˆr�TÐÑÔÐÕÔÑÔÐÐÕÔˆrÑÔÐÕÔˆrÑÔÐÐÕÔ�TÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆs�bŠyÐÐÐÕÔÐÐÐÐˆs�bÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�bÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐð )×?Ò?À	È5ÐRUÑVÔVÑˆ�ØÐˆw˜%ÐÐÐÐÕÔÐÐÐÐˆw˜%ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜%ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ5ÐBÐ5¸ÐBÐBÐBÐBÕBÔBÐBÐBÐBÐBÐ5¸ÐBÑBÔBÕBÔBÐ5ÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔB¸ÑBÔBÐBÕBÔB¸ÑBÔBÐBÐBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBr$   c                 óº  — d}|                      |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}}d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}|                     |dd¦  «        \  }	}
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}||
v }|s—t          j        d|fd||
f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |
¦  «        rt          j        |
¦  «        nddœz  }d
d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )zXVerifies bounds in zone_boundless_celestial_palace (5000.0 x 5000.0, half-bound 2500.0).Útest_wanderer_celestialr   r
   g     À¢ÀTrr   rt   rŽ   r.   r1   r2   Nrv   r8   rw   rx   g     P¤@r�   Fr�   r}   r~   r€   r‘   r‚   r’   r“   s               r%   Ú/test_movement_engine_in_highest_tier_wildernesszGTestZoneBoundsExpansion.test_movement_engine_in_highest_tier_wildernessƒ   sk  € ð .ˆ	Ø× Ò  Ð,MÑNÔNÐNð ×4Ò4°YÀÈÑPÔP‰ˆˆCØÐˆr�TˆzÐÐÐÕÔÐÐÐÐˆr�TÐÑÔÐÕÔÑÔÐÐÕÔˆrÑÔÐÕÔˆrÑÔÐÐÕÔ�TÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆs�bŠyÐÐÐÕÔÐÐÐÐˆs�bÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�bÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐð )×?Ò?À	È6ÐSVÑWÔWÑˆ�ØÐˆw˜%ÐÐÐÐÕÔÐÐÐÐˆw˜%ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜%ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ5ÐBÐ5¸ÐBÐBÐBÐBÕBÔBÐBÐBÐBÐBÐ5¸ÐBÑBÔBÕBÔBÐ5ÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔB¸ÑBÔBÐBÕBÔB¸ÑBÔBÐBÐBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBr$   c           
      ó  — t          d¦  «        }|j        } |¦   «         }|s t          j        d¦  «        dz   dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}t          j        t          |¦  «        ¦  «        }	 |                     ¦   «         }|                     d¦  «                             ¦   «         }d„ |D ¦   «         }|d	         }	d
}|	|k    }
|
slt          j        d|
fd|	|f¦  «        t          j        |	¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	x}
}|d         }	d
}|	|k    }
|
slt          j        d|
fd|	|f¦  «        t          j        |	¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	x}
}t"                               ¦   «         D �]�\  }\  }}}}||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}||         }	||f}|	|k    }
|
s’t          j        d|
fd|	|f¦  «        t          j        |	¦  «        t          j        |¦  «        dœz  }t          j        d|› d||         › d||f› �¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}	x}
}�Œƒ	 |                     ¦   «          dS # |                     ¦   «          w xY w)zSVerifies that data/game_design_matrix.db contains the synchronized expanded bounds.zdata/game_design_matrix.dbz game_design_matrix.db must existzC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Údb_pathrW   Nz6SELECT zone_id, bounds_width, bounds_height FROM zonesc                 óp   — i | ]3}|d          t          |d         ¦  «        t          |d         ¦  «        f“Œ4S )r   é   é   )Úfloat)Ú.0Úrows     r%   ú
<dictcomp>z^TestZoneBoundsExpansion.test_database_matrix_sync_reflects_expanded_bounds.<locals>.<dictcomp>Ÿ   s7   € ÐUÐUÐUÈ˜c !œf¥u¨S°¬V¡}¤}µe¸CÀ¼F±m´mÐ&DÐUÐUÐUr$   ri   )rk   rk   r8   )z%(py1)s == %(py4)s)rƒ   rR   zassert %(py6)srS   rl   r~   )z%(py0)s in %(py2)sr`   Úbounds_by_zone)r/   r5   zassert %(py4)srR   zDB bounds for z: rX   rZ   )r   Úexistsr=   r]   r?   r@   rA   rB   rC   rD   Úsqlite3ÚconnectÚstrÚcursorÚexecuteÚfetchallr>   r    r\   Úclose)rG   r™   rI   rM   rf   Úconnr¦   Úrowsr¡   rŠ   rH   rd   r`   Ú_rV   r[   Ú@py_format3s                    r%   Ú2test_database_matrix_sync_reflects_expanded_boundszJTestZoneBoundsExpansion.test_database_matrix_sync_reflects_expanded_bounds”   s  € åÐ3Ñ4Ô4ˆØŒ~ÐCˆ~ˆ~ÑÔÐCÐÐCÕCÔCÐ!CÑCÔCÐCÑCÐCÕCÔCÑCÔCÐCÐCÕCÔCˆwÑCÔCÐCÕCÔCˆwÑCÔCÐCÐCÕCÔCˆ~ÑCÔCÕCÔCÐÑCÔCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCåŒ�s 7™|œ|Ñ,Ô,ˆð	Ø—[’[‘]”]ˆFØ—>’>ØHñô çŠh‰jŒjð ð VÐUÐPTÐUÑUÔUˆNð "Ð"<Ô=ÐOÀÐOÐ=ÀÒOÐOÐOÐOÕOÔOÐOÐOÐOÐOÐ=ÀÐOÑOÔOÕOÔOÐ=ÑOÔOÕOÔOÀÑOÔOÐOÐOÑOÐOÐOÐOÐOÐOÑOÐOÕOÕOÔOÐOÑOÔOÑOÔOÐOÐOÐOÐOÐOÐOÐOØ!Ð"7Ô8ÐJ¸NÐJÐ8¸NÒJÐJÐJÐJÕJÔJÐJÐJÐJÐJÐ8¸NÐJÑJÔJÕJÔJÐ8ÑJÔJÕJÔJ¸NÑJÔJÐJÐJÑJÐJÐJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJõ 2L×1QÒ1QÑ1SÔ1Sð ñ Ñ-�Ñ-˜!˜Q  uØ .Ð0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0�w .Ð0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0�wÑ0Ô0Ð0Õ0Ô0�wÑ0Ô0Ð0Ð0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0 .Ñ0Ô0Ð0Õ0Ô0 .Ñ0Ô0Ð0Ð0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ø% gÔ.ð °5¸%°.ð Ð.°.Ò@ð ð ð õ ä ðð ð ð Ð.°.ð ñ ô õ äð /ñ ô õ äð 3Añ ô ð ð ñ ð õ ä ð g WÐfÐf°¸wÔ0GÐfÐfÐW\Ð^cÐVdÐfÐfñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ñ ðð �JŠJ‰LŒLˆLˆLˆLøˆD�JŠJ‰LŒLˆLˆLøøøs   Ã)K+O+ Ï+Pc                 óÄ  — t          d¦  «        }|j        } |¦   «         }|s‹ddt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}| 	                    d¬¦  «        }d}||v }|s—t	          j
        d	|fd
||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}d}||v }|s—t	          j
        d	|fd
||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}d}||v }|s—t	          j
        d	|fd
||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}d}||v }|s—t	          j
        d	|fd
||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}d}||v }|s—t	          j
        d	|fd
||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}d}||v }|s—t	          j
        d	|fd
||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}d}||v }|s—t	          j
        d	|fd
||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}d}||v }|s—t	          j
        d	|fd
||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}dS )zNVerifies that client/webapp/js/engine/collision_engine.js has expanded bounds.z+client/webapp/js/engine/collision_engine.jsúAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Úcollision_filerW   Núutf-8©ÚencodingzminWx: -22.0, maxWx: 22.0r~   r€   Úcontentr‚   r1   r2   zminWy: -17.0, maxWy: 17.0zminCamWx: -16.5, maxCamWx: 16.5zminCamWy: -12.5, maxCamWy: 12.5zminWx: -20.0, maxWx: 20.0zminCamWx: -15.0, maxCamWx: 15.0zminWx: -45.0, maxWx: 45.0zminCamWx: -40.0, maxCamWx: 40.0©r   r¢   r?   r@   r=   rA   rB   rC   rD   Ú	read_textr>   )
rG   r±   rI   rM   rf   rµ   rŠ   rH   rJ   rK   s
             r%   Ú0test_client_collision_engine_has_expanded_boundszHTestZoneBoundsExpansion.test_client_collision_engine_has_expanded_bounds®   s  € åÐKÑLÔLˆØÔ$Ð&Ð$Ð$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ~Ñ&Ô&Ð&Õ&Ô&ˆ~Ñ&Ô&Ð&Ð&Õ&Ô&Ð$Ñ&Ô&Õ&Ô&Ð&Ñ&Ô&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ø ×*Ò*°GÐ*Ñ<Ô<ˆð +Ð5Ð*¨gÐ5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð*¨gÐ5Ñ5Ô5Õ5Ô5Ð*Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5¨gÑ5Ô5Ð5Õ5Ô5¨gÑ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Ð*¨gÐ5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð*¨gÐ5Ñ5Ô5Õ5Ô5Ð*Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5¨gÑ5Ô5Ð5Õ5Ô5¨gÑ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Ø0Ð;Ð0°GÐ;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð0°GÐ;Ñ;Ô;Õ;Ô;Ð0Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;°GÑ;Ô;Ð;Õ;Ô;°GÑ;Ô;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ø0Ð;Ð0°GÐ;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð0°GÐ;Ñ;Ô;Õ;Ô;Ð0Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;°GÑ;Ô;Ð;Õ;Ô;°GÑ;Ô;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;ð +Ð5Ð*¨gÐ5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð*¨gÐ5Ñ5Ô5Õ5Ô5Ð*Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5¨gÑ5Ô5Ð5Õ5Ô5¨gÑ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Ø0Ð;Ð0°GÐ;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð0°GÐ;Ñ;Ô;Õ;Ô;Ð0Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;°GÑ;Ô;Ð;Õ;Ô;°GÑ;Ô;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;ð +Ð5Ð*¨gÐ5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð*¨gÐ5Ñ5Ô5Õ5Ô5Ð*Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5¨gÑ5Ô5Ð5Õ5Ô5¨gÑ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Ø0Ð;Ð0°GÐ;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð0°GÐ;Ñ;Ô;Õ;Ô;Ð0Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;°GÑ;Ô;Ð;Õ;Ô;°GÑ;Ô;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;r$   c                 ó   — t          d¦  «        }|j        } |¦   «         }|s‹ddt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}| 	                    d¬¦  «        }d}||v }|s—t	          j
        d	|fd
||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}d}||v }|s—t	          j
        d	|fd
||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚dx}}dS )zTVerifies that client/webapp/js/engine/world_renderer.js centers tile loop on camera.z)client/webapp/js/engine/world_renderer.jsr°   Úrenderer_filerW   Nr²   r³   zcamWx - tileRadiusr~   r€   rµ   r‚   r1   r2   zcamWy - tileRadiusr¶   )
rG   rº   rI   rM   rf   rµ   rŠ   rH   rJ   rK   s
             r%   Ú:test_client_world_renderer_centers_ambient_tiles_on_camerazRTestZoneBoundsExpansion.test_client_world_renderer_centers_ambient_tiles_on_cameraÂ   sb  € åÐHÑIÔIˆØÔ#Ð%Ð#Ð#Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆ}Ñ%Ô%Ð%Õ%Ô%ˆ}Ñ%Ô%Ð%Ð%Õ%Ô%Ð#Ñ%Ô%Õ%Ô%Ð%Ñ%Ô%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ø×)Ò)°7Ð)Ñ;Ô;ˆà#Ð.Ð# wÐ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð# wÐ.Ñ.Ô.Õ.Ô.Ð#Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. wÑ.Ô.Ð.Õ.Ô. wÑ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ø#Ð.Ð# wÐ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð# wÐ.Ñ.Ô.Õ.Ô.Ð#Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. wÑ.Ô.Ð.Õ.Ô. wÑ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.r$   )r!   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rO   rg   ro   r‹   r”   r—   r®   r¸   r»   r#   r$   r%   r(   r(   )   s@  € € € € € ØZÐZð	,Ø%ð	,à	ð	,ð 	,ð 	,ð 	,ðØ%ðà	ðð ð ð ð.Ø%ð.à	ð.ð .ð .ð .ð DØ%ðDà	ðDð Dð Dð Dð8CØ%ðCà	ðCð Cð Cð Cð"CØ%ðCà	ðCð Cð Cð Cð"ð ð ð ð4<ð <ð <ð <ð(/ð /ð /ð /ð /ð /r$   r(   )r¿   Úbuiltinsr?   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter=   Úpathlibr   r£   ÚpytestÚserver.world.zone_enginer   Úserver.world.zone_typesr   r    Údictr¥   Útupler�   Ú__annotations__Úfixturer&   r(   r#   r$   r%   ú<module>rÌ      s3  ððð ð ð € € € € € € € € € € € € Ð Ð Ð Ð Ð Ð Ø €€€Ø €€€à /Ð /Ð /Ð /Ð /Ð /Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,ð
 <Ø!AØ @Ø>Ø @Ø=Ø @Ø"BØ'GðLð LÐ ˜D  e¨E°5¸%ÀÐ,FÔ&GÐ!GÔHð ð ñ ð „ð�Zð ð ð ñ „ðð`/ð `/ð `/ð `/ð `/ñ `/ô `/ð `/ð `/ð `/r$   