§
    Qv¼jÌ  ã                   ó\   — d Z ddlmZmZmZmZmZ ddlmZ ddl	m
Z
mZ  G d„ d¦  «        ZdS )	z†
FreeExile 2D Spatial Grid Engine.
Authoritative 2D placement, collision detection, and auto-defragmentation for Inventory & Stashes.
é    )ÚDictÚListÚOptionalÚTupleÚAnyé   )ÚInventoryItem)ÚGridPlacementÚItemDimensionsc                   óH  — e Zd ZdZddededdfd„Z	 dd	ed
edededee         defd„Z	de
d	ed
edededefd„Zdedee
         fd„Zdededeeeef                  fd„Zd	ed
edefd„Zd	ed
edee
         fd„Zdedee         fd„Zdeee
ef                  fd„Zdefd„ZdS )ÚSpatialInventoryGridzCManages 2D multi-cell spatial grid layout for ARPG bags and chests.é   é   ÚwidthÚheightÚreturnNc                 ó>   — || _         || _        i | _        i | _        d S ©N)r   r   Ú_gridÚ_items)Úselfr   r   s      ú@C:\Projects\FreeExile\server\inventory\spatial_inventory_grid.pyÚ__init__zSpatialInventoryGrid.__init__   s"   € ØˆŒ
ØˆŒà13ˆŒ
àFHˆŒˆˆó    ÚxÚyÚignore_uuidc                 ó  — |dk     s|dk     s|dk    s|dk    rdS ||z   | j         k    s||z   | j        k    rdS t          |||z   ¦  «        D ]@}t          |||z   ¦  «        D ]*}| j                             ||f¦  «        }|�
||k    r  dS Œ+ŒAdS )z*Validates bounding box and cell occupancy.r   FNT)r   r   Úranger   Úget)	r   r   r   r   r   r   ÚcxÚcyÚoccupied_uuids	            r   Ú	can_placezSpatialInventoryGrid.can_place   sÇ   € ð ˆqŠ5ˆ5�A˜’E�E˜U ašZ˜Z¨6°Qª;¨;Ø�5Øˆu‰9�t”zÒ!Ð! Q¨¡Z°$´+Ò%=Ð%=Ø�5å˜˜1˜u™9Ñ%Ô%ð 	!ð 	!ˆBÝ˜A˜q 6™zÑ*Ô*ð !ð !�Ø $¤
§¢°°B¨xÑ 8Ô 8�Ø Ð,°À+Ò1MÐ1MØ ˜5˜5˜5øð!ð ˆtr   Úitemc                 óª  — |                       |||||j        ¬¦  «        sdS |j        | j        v r|                      |j        ¦  «         t	          |||z   ¦  «        D ])}t	          |||z   ¦  «        D ]}|j        | j        ||f<   ŒŒ*t          ||||¬¦  «        }||f| j        |j        <   ||j        d<   ||j        d<   ||j        d<   ||j        d<   dS )	zBPlaces a multi-cell item on the grid, updating internal occupancy.)r   F)r   r   r   r   Úgrid_xÚgrid_yÚgrid_wÚgrid_hT)r$   Ú	item_uuidr   Úremove_itemr   r   r
   Úmetadata)	r   r%   r   r   r   r   r!   r"   Ú	placements	            r   Ú
place_itemzSpatialInventoryGrid.place_item+   s  € ð �~Š~˜a  E¨6¸t¼~ˆ~ÑNÔNð 	Ø�5ð Œ>˜Tœ[Ð(Ð(Ø×Ò˜Tœ^Ñ,Ô,Ð,õ ˜˜1˜u™9Ñ%Ô%ð 	6ð 	6ˆBÝ˜A˜q 6™zÑ*Ô*ð 6ð 6�Ø'+¤~�”
˜B ˜8Ñ$Ð$ð6õ " A¨°%ÀÐGÑGÔGˆ	Ø'+¨YÐ&7ˆŒ�D”NÑ#ð #$ˆŒ�hÑØ"#ˆŒ�hÑØ"'ˆŒ�hÑØ"(ˆŒ�hÑØˆtr   r+   c                 ó$  — || j         vrdS | j                              |¦  «        \  }}t          |j        |j        |j        z   ¦  «        D ]D}t          |j        |j        |j        z   ¦  «        D ]}| j                             ||fd¦  «         Œ ŒE|S )zBRemoves an item from the grid and releases all its occupied cells.N)r   Úpopr   r   r   r   r   r   )r   r+   r%   r.   r!   r"   s         r   r,   z SpatialInventoryGrid.remove_itemJ   s�   € à˜DœKÐ'Ð'Ø�4àœ+Ÿ/š/¨)Ñ4Ô4‰ˆˆiÝ˜	œ Y¤[°9´?Ñ%BÑCÔCð 	/ð 	/ˆBÝ˜IœK¨¬°yÔ7GÑ)GÑHÔHð /ð /�Ø”
—’  B˜x¨Ñ.Ô.Ð.Ð.ð/ð ˆr   c                 óº   — t          | j        |z
  dz   ¦  «        D ]?}t          | j        |z
  dz   ¦  «        D ]"}|                      ||||¦  «        r||fc c S Œ#Œ@dS )zIScans from top-to-bottom, left-to-right to find first available location.r   N)r   r   r   r$   )r   r   r   r"   r!   s        r   Úfind_first_fitz#SpatialInventoryGrid.find_first_fitV   s„   € å˜œ fÑ,¨qÑ0Ñ1Ô1ð 	"ð 	"ˆBÝ˜DœJ¨Ñ.°Ñ2Ñ3Ô3ð "ð "�Ø—>’> " b¨%°Ñ8Ô8ð "Ø˜r˜6�M�M�M�M�Mð"ð"ð ˆtr   c                 ó   — ||f| j         v S r   )r   )r   r   r   s      r   Úis_cell_occupiedz%SpatialInventoryGrid.is_cell_occupied^   s   € Ø�1ˆv˜œÐ#Ð#r   c                 óz   — | j                              ||f¦  «        }|r|| j        v r| j        |         d         S d S )Nr   )r   r    r   )r   r   r   r+   s       r   Úget_item_atz SpatialInventoryGrid.get_item_ata   sD   € Ø”J—N’N A q 6Ñ*Ô*ˆ	Øð 	-˜ d¤kÐ1Ð1Ø”;˜yÔ)¨!Ô,Ð,Øˆtr   c                 ó>   — || j         v r| j         |         d         S d S ©Nr   )r   )r   r+   s     r   Úget_item_placementz'SpatialInventoryGrid.get_item_placementg   s&   € Ø˜œÐ#Ð#Ø”;˜yÔ)¨!Ô,Ð,Øˆtr   c                 óN   — t          | j                             ¦   «         ¦  «        S r   )Úlistr   Úvalues)r   s    r   Úget_all_itemsz"SpatialInventoryGrid.get_all_itemsl   s   € Ý�D”K×&Ò&Ñ(Ô(Ñ)Ô)Ð)r   c                 óœ  — t          | j                             ¦   «         ¦  «        }|sdS t          |d„ d¬¦  «        }| j                             ¦   «          | j                             ¦   «          |D ]Y\  }}|                      |j        |j        ¦  «        }|€ dS |  	                    ||d         |d         |j        |j        ¦  «         ŒZdS )zADefragments the grid using descending area bin-packing heuristic.Tc                 ój   — | d         j         | d         j        z  | d         j        | d         j         fS r9   )r   r   )Úes    r   ú<lambda>z3SpatialInventoryGrid.auto_compact.<locals>.<lambda>x   s*   € ˜1˜Qœ4œ:¨¨!¬¬Ñ3°Q°q´T´[À!ÀAÄ$Ä*ÐM€ r   )ÚkeyÚreverseNFr   r   )
r<   r   r=   Úsortedr   Úclearr3   r   r   r/   )r   Úall_entriesÚsorted_entriesr%   Úold_pÚ
target_poss         r   Úauto_compactz!SpatialInventoryGrid.auto_compacto   sá   € å˜4œ;×-Ò-Ñ/Ô/Ñ0Ô0ˆØð 	Ø�4õ  ØØMÐMØð
ñ 
ô 
ˆð 	Œ
×ÒÑÔÐØŒ×ÒÑÔÐð *ð 	[ð 	[‰KˆD�%Ø×,Ò,¨U¬[¸%¼,ÑGÔGˆJØÐ!à�u�uØ�OŠO˜D *¨Q¤-°¸A´ÀÄÈUÌ\ÑZÔZÐZÐZàˆtr   )r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr   r   ÚstrÚboolr$   r	   r/   r,   r   r3   r5   r7   r
   r:   r   r>   rK   © r   r   r   r      s  € € € € € ØMÐMðIð I˜cð I°ð I¸Dð Ið Ið Ið Ið &*ðð àðð ðð ð	ð
 ðð ˜c”]ðð 
ðð ð ð ð*àðð ðð ð	ð
 ðð ðð 
ðð ð ð ð>
 Sð 
¨X°mÔ-Dð 
ð 
ð 
ð 
ð Cð °ð ¸À%ÈÈSÈÄ/Ô9Rð ð ð ð ð$ #ð $¨#ð $°$ð $ð $ð $ð $ð˜Sð  Sð ¨X°mÔ-Dð ð ð ð ð¨Cð °H¸]Ô4Kð ð ð ð ð
*˜t E¨-¸Ð*FÔ$GÔHð *ð *ð *ð *ð˜dð ð ð ð ð ð r   r   N)rO   Útypingr   r   r   r   r   Úinventory_typesr	   Úspatial_grid_typesr
   r   r   rS   r   r   ú<module>rW      s¡   ððð ð
 4Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø *Ð *Ð *Ð *Ð *Ð *Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ð}ð }ð }ð }ð }ñ }ô }ð }ð }ð }r   