§
    xQ»j»  ã                   ó~   — d Z ddlZddlmZmZmZmZmZ ddlm	Z	 e	 G d„ d¦  «        ¦   «         Z
 G d„ d¦  «        ZdS )	a  
Spatial Grid (AOI - Area of Interest) Partitioning System for FreeExile.
Efficiently manages entity locations in 2.5D space and computes visibility subsets (AOI)
to scale to hundreds of thousands of concurrent entities per zone without O(N^2) broadcast overhead.
é    N)ÚDictÚSetÚTupleÚListÚOptional)Ú	dataclassc                   ó<   — e Zd ZU eed<   eed<   eed<   dZeed<   dS )ÚEntityÚ	entity_idÚxÚyTÚ	is_activeN)Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__Úfloatr   Úbool© ó    ú2C:\Projects\FreeExile\server\world\spatial_grid.pyr
   r
      s=   € € € € € € à€N€N�NØ€H€H�HØ€H€H�HØ€IˆtÐÐÑÐÐr   r
   c            
       óª   — e Zd Zddefd„Zdededeeef         fd„Zdedd	fd
„Z	dede
e         fd„Zdedededd	fd„Zddedededee         fd„Zd	S )ÚSpatialGridç      P@Ú	cell_sizec                 ó>   — || _         i | _        i | _        i | _        d S ©N)r   ÚcellsÚentitiesÚentity_cell_map)Úselfr   s     r   Ú__init__zSpatialGrid.__init__   s%   € Ø"ˆŒØ68ˆŒ
Ø+-ˆŒØ;=ˆÔÐÐr   r   r   Úreturnc                 ó®   — t          t          j        || j        z  ¦  «        ¦  «        }t          t          j        || j        z  ¦  «        ¦  «        }||fS r   )r   ÚmathÚfloorr   )r"   r   r   Úcell_xÚcell_ys        r   Úget_cell_coordszSpatialGrid.get_cell_coords   sI   € Ý•T”Z  D¤NÑ 2Ñ3Ô3Ñ4Ô4ˆÝ•T”Z  D¤NÑ 2Ñ3Ô3Ñ4Ô4ˆØ˜ÐÐr   ÚentityNc                 ó
  — || j         |j        <   |                      |j        |j        ¦  «        }|| j        |j        <   || j        vrt          ¦   «         | j        |<   | j        |                              |j        ¦  «         d S r   )	r    r   r*   r   r   r!   r   ÚsetÚadd)r"   r+   Úcell_coordss      r   Ú
add_entityzSpatialGrid.add_entity    s{   € Ø*0ˆŒ�fÔ&Ñ'Ø×*Ò*¨6¬8°V´XÑ>Ô>ˆØ1<ˆÔ˜VÔ-Ñ.à˜dœjÐ(Ð(Ý&)¡e¤eˆDŒJ�{Ñ#ØŒ
�;Ô×#Ò# FÔ$4Ñ5Ô5Ð5Ð5Ð5r   r   c                 óú   — | j                              |d ¦  «        }|sd S | j                             |d ¦  «        }|r>|| j        v r5| j        |                              |¦  «         | j        |         s| j        |= |S r   )r    Úpopr!   r   Údiscard)r"   r   r+   r/   s       r   Úremove_entityzSpatialGrid.remove_entity)   s‹   € Ø”×"Ò" 9¨dÑ3Ô3ˆØð 	Ø�4àÔ*×.Ò.¨y¸$Ñ?Ô?ˆØð 	,˜;¨$¬*Ð4Ð4ØŒJ�{Ô#×+Ò+¨IÑ6Ô6Ð6Ø”:˜kÔ*ð ,Ø”J˜{Ð+àˆr   Únew_xÚnew_yc                 óÌ  — | j                              |j        ¦  «        }|                      ||¦  «        }||_        ||_        ||k    rš|rC|| j        v r:| j        |                              |j        ¦  «         | j        |         s| j        |= || j        vrt          ¦   «         | j        |<   | j        |          	                    |j        ¦  «         || j         |j        <   d S d S r   )
r!   Úgetr   r*   r   r   r   r3   r-   r.   )r"   r+   r5   r6   Úold_cellÚnew_cells         r   Úupdate_entity_positionz"SpatialGrid.update_entity_position6   sí   € ØÔ'×+Ò+¨FÔ,<Ñ=Ô=ˆØ×'Ò'¨¨uÑ5Ô5ˆàˆŒØˆŒà�xÒÐØð -˜H¨¬
Ð2Ð2Ø”
˜8Ô$×,Ò,¨VÔ-=Ñ>Ô>Ð>Ø”z (Ô+ð -Øœ
 8Ð,à˜tœzÐ)Ð)Ý'*¡u¤u�”
˜8Ñ$ØŒJ�xÔ ×$Ò$ VÔ%5Ñ6Ô6Ð6Ø5=ˆDÔ  Ô!1Ñ2Ð2Ð2ð  Ðr   é   Úcenter_xÚcenter_yÚradius_cellsc                 ó  — |                       ||¦  «        \  }}t          ¦   «         }t          | |dz   ¦  «        D ]L}t          | |dz   ¦  «        D ]5}||z   ||z   f}	|	| j        v r |                     | j        |	         ¦  «         Œ6ŒM|S )z¬
        Retrieves all entity IDs within the center cell and its adjacent neighboring cells.
        radius_cells = 1 queries a 3x3 block of cells (9 cells total).
        r<   )r*   r-   Úranger   Úupdate)
r"   r=   r>   r?   Úcenter_cell_xÚcenter_cell_yÚvisible_idsÚdxÚdyÚneighbor_coordss
             r   Úget_entities_in_aoizSpatialGrid.get_entities_in_aoiH   s¶   € ð
 (,×';Ò';¸HÀhÑ'OÔ'OÑ$ˆ�}Ý #¡¤ˆå˜˜ |°aÑ'7Ñ8Ô8ð 	Dð 	DˆBÝ˜\˜M¨<¸!Ñ+;Ñ<Ô<ð Dð D�Ø#0°2Ñ#5°}ÀrÑ7IÐ"J�Ø" d¤jÐ0Ð0Ø×&Ò& t¤z°/Ô'BÑCÔCÐCøðDð
 Ðr   )r   )r<   )r   r   r   r   r#   r   r   r*   r
   r0   r   r4   r;   r   rI   r   r   r   r   r      s  € € € € € ð>ð > %ð >ð >ð >ð >ð  ð  ¨5ð  °U¸3À¸8´_ð  ð  ð  ð  ð
6 ð 6¨Dð 6ð 6ð 6ð 6ð sð ¨x¸Ô/?ð ð ð ð ð>¨Vð >¸Eð >È%ð >ÐTXð >ð >ð >ð >ð$ð ¨Eð ¸Uð ÐRUð Ð^aÐbeÔ^fð ð ð ð ð ð r   r   )Ú__doc__r&   Útypingr   r   r   r   r   Údataclassesr   r
   r   r   r   r   ú<module>rM      sÆ   ððð ð €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø !Ð !Ð !Ð !Ð !Ð !ð ðð ð ð ð ñ ô ñ „ððBð Bð Bð Bð Bñ Bô Bð Bð Bð Br   