§
    ­ù©j1  ã                   óÐ   — d Z ddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZ  G d„ de¦  «        Ze G d„ d¦  «        ¦   «         Ze G d	„ d
¦  «        ¦   «         Z G d„ d¦  «        ZdS )u®  
AutoPOE2 - Vertical Column-Major Inventory Packer & Auto-Sort Engine (Doc 63 SSoT)
===================================================================================
Thuáº­t toÃ¡n sáº¯p xáº¿p tÃºi Ä‘á»“ vÃ  rÆ°Æ¡ng Ä‘á»“ thÃ´ng minh theo Chiá»�u Dá»�c (Column-Major Packing):
- Kháº¯c phá»¥c triá»‡t Ä‘á»ƒ hiá»‡n tÆ°á»£ng phÃ¢n máº£nh khÃ´ng gian (Fragmentation) khi xáº¿p Ä‘á»“ theo chiá»�u ngang.
- Gom toÃ n bá»™ Ä‘á»“ nhá»� 1x1 (Currency, Gems, Waystones, Charms, Rings, Amulets) dá»“n vá»� cÃ¡c cá»™t bÃªn pháº£i (Cá»™t 11 dá»“n sang 10...).
- Báº£o toÃ n trá»�n váº¹n cÃ¡c cá»™t dá»�c bÃªn trÃ¡i (Cá»™t 0..9) vá»›i chiá»�u cao nguyÃªn váº¹n (5 hÃ ng) Ä‘á»ƒ chá»©a cÃ¡c trang bá»‹ lá»›n:
  + Ã�o giÃ¡p (Body Armour: 2x3)
  + VÅ© khÃ­ 2 tay (Quarterstaff, Bow, Crossbow: 2x4 hoáº·c 2x6)
  + MÅ©, GiÃ y, GÄƒng tay, KhiÃªn (2x2)
- Cung cáº¥p káº¿ hoáº¡ch di chuyá»ƒn tá»«ng bÆ°á»›c (MovePlan) tá»‘i thiá»ƒu hÃ³a sá»‘ láº§n click chuá»™t.
é    )Ú	dataclassÚfield)ÚEnum)ÚAnyÚDictÚListÚOptionalÚSetÚTuplec                   ó"   — e Zd ZdZdZdZdZdZdS )ÚItemDimension)é   r   )r   é   )r   r   )r   é   )r   é   N)Ú__name__Ú
__module__Ú__qualname__ÚSIZE_1X1ÚSIZE_1X2ÚSIZE_2X2ÚSIZE_2X3ÚSIZE_2X4© ó    ú;C:\Projects\AutoPOE2\src\assistant_tool\inventory_sorter.pyr   r      s'   € € € € € Ø€HØ€HØ€HØ€HØ€H€H€Hr   r   c                   ób   — e Zd ZU eed<   eed<   eed<   eed<   dZeed<   dZeed<   dZe	ed	<   d
S )ÚInventoryItemSlotÚitem_idÚnameÚcolÚrowr   ÚwidthÚheightFÚ	is_lockedN)
r   r   r   ÚstrÚ__annotations__Úintr#   r$   r%   Úboolr   r   r   r   r      s`   € € € € € € à€L€L�LØ
€I€I�IØ	€H€H�HØ	€H€H�HØ€Eˆ3€N€N�NØ€FˆC€O€O�OØ€IˆtÐÐÑÐÐr   r   c                   óP   — e Zd ZU eed<   eed<   eed<   eed<   eed<   dZeed<   dS )	ÚSlotMoveActionr   Úfrom_colÚfrom_rowÚto_colÚto_rowÚ ÚdescriptionN)r   r   r   r&   r'   r(   r1   r   r   r   r+   r+   &   sO   € € € € € € à€L€L�LØ€M€M�MØ€M€M�MØ€K€K�KØ€K€K�KØ€K�ÐÐÑÐÐr   r+   c            	       ó”   — e Zd ZdZddedefd„Zdeee                  deeeeeef                  fd	„Z	d
ee
         dee         fd„ZdS )ÚVerticalInventoryPackerum   
    Bá»™ sáº¯p xáº¿p tÃºi Ä‘á»“ vÃ  rÆ°Æ¡ng Ä‘á»“ tá»‘i Æ°u hÃ³a khÃ´ng gian dá»�c cho Path of Exile 2.
    é   é   ÚcolsÚrowsc                 ó"   — || _         || _        d S ©N)r6   r7   )Úselfr6   r7   s      r   Ú__init__z VerticalInventoryPacker.__init__5   s   € ØˆŒ	ØˆŒ	ˆ	ˆ	r   Úgrid_occupancyÚreturnc                 ó¶  ‡‡‡— g }t          | j        dz
  ¦  «        D ]»Št          | j        ¦  «        D ]¤Š‰dz   | j        k    rCt          ˆˆˆfd„t          d¦  «        D ¦   «         ¦  «        s|                     ‰‰ddf¦  «         ‰dz   | j        k    rCt          ˆˆˆfd„t          d¦  «        D ¦   «         ¦  «        s|                     ‰‰ddf¦  «         Œ¥Œ¼|S )u˜   
        TÃ¬m kiáº¿m cÃ¡c khá»‘i hÃ¬nh chá»¯ nháº­t cÃ²n trá»‘ng trong lÆ°á»›i.
        Tráº£ vá»� danh sÃ¡ch: [(col, row, width, height), ...]
        r   r   c              3   ód   •K  — | ]*}t          d ¦  «        D ]}‰‰|z            ‰|z            V — ŒŒ+dS ©r   N©Úrange©Ú.0ÚdrÚdcÚcr<   Úrs      €€€r   ú	<genexpr>z@VerticalInventoryPacker.calculate_free_blocks.<locals>.<genexpr>D   óM   øè è € ÐdÐdÀ"Õ[`ÐabÑ[cÔ[cÐdÐdÐUW˜~¨a°"©fÔ5°a¸"±fÔ=ÐdÐdÐdÐdÐdÐdÐdr   r   r   c              3   ód   •K  — | ]*}t          d ¦  «        D ]}‰‰|z            ‰|z            V — ŒŒ+dS r@   rA   rC   s      €€€r   rI   z@VerticalInventoryPacker.calculate_free_blocks.<locals>.<genexpr>H   rJ   r   )rB   r6   r7   ÚanyÚappend)r:   r<   ÚblocksrG   rH   s    ` @@r   Úcalculate_free_blocksz-VerticalInventoryPacker.calculate_free_blocks9   s  øøø€ ð
 ˆå�t”y 1‘}Ñ%Ô%ð 		4ð 		4ˆAÝ˜4œ9Ñ%Ô%ð 4ð 4�à�q‘5˜DœIÒ%Ð%ÝÐdÐdÐdÐdÐdÐdÍÈaÉÌÐdÑdÔdÑdÔdð 4ØŸš q¨!¨Q° lÑ3Ô3Ð3à�q‘5˜DœIÒ%Ð%ÝÐdÐdÐdÐdÐdÐdÍÈaÉÌÐdÑdÔdÑdÔdð 4ØŸš q¨!¨Q° lÑ3Ô3Ð3øð4ð ˆr   Úitemsc                 ó  ‡ ‡‡‡‡— g }g }|D ]CŠ‰j         dk    r!‰j        dk    r|                     ‰¦  «         Œ.|                     ‰¦  «         ŒDˆ fd„t          ‰ j        ¦  «        D ¦   «         Šg }d}d}|                     d„ d¬¦  «         |D �]0Šd}t          d‰ j        ‰j         z
  dz   ¦  «        D �]	Št          d‰ j        ‰j        z
  dz   ¦  «        D ]áŠt          ˆˆˆˆfd„t          ‰j        ¦  «        D ¦   «         ¦  «        s¯t          ‰j        ¦  «        D ]*}t          ‰j         ¦  «        D ]}	d‰‰|z            ‰|	z   <   ŒŒ+‰j        ‰k    s‰j	        ‰k    rV|                     t          ‰j        ‰j        ‰j	        ‰‰d	‰j        › d
‰j         › d‰j        › d‰› d‰› d�¬¦  «        ¦  «         d} nŒâ|r n�Œ�Œ2‰ j        dz
  }
d}|D ]³Šd}|
dk    r©|s§|‰ j        k     r‹|s‰‰|         |
         sid‰|         |
<   ‰j        |
k    s‰j	        |k    rF|                     t          ‰j        ‰j        ‰j	        |
|d‰j        › d|
› d|› d�¬¦  «        ¦  «         d}|dz  }|‰ j        k     r|¯‰|sd}|
dz  }
|
dk    r|¯§Œ´|S )uÍ  
        Láº­p káº¿ hoáº¡ch di chuyá»ƒn item theo thuáº­t toÃ¡n Vertical Column-Major Packing:
        1. PhÃ¢n loáº¡i item thÃ nh 2 nhÃ³m:
           - NhÃ³m Small (1x1, 1x2): Dá»“n vÃ o cÃ¡c cá»™t ngoÃ i cÃ¹ng bÃªn pháº£i (Cá»™t 11 -> 0, hÃ ng 0 -> 4).
           - NhÃ³m Large (2x2, 2x3, 2x4): Dá»“n vÃ o cÃ¡c cá»™t bÃªn trÃ¡i (Cá»™t 0 -> 11, hÃ ng 0 -> 4).
        2. Sinh danh sÃ¡ch cÃ¡c thao tÃ¡c di chuyá»ƒn SlotMoveAction trÃ¡nh Ä‘Ã¨ lÃªn nhau.
        r   c                 óL   •— g | ] }d „ t          ‰j        ¦  «        D ¦   «         ‘Œ!S )c                 ó   — g | ]}d ‘ŒS )Fr   )rD   Ú_s     r   ú
<listcomp>zIVerticalInventoryPacker.plan_vertical_sort.<locals>.<listcomp>.<listcomp>`   s   € Ð8Ð8Ð8 !˜Ð8Ð8Ð8r   )rB   r6   )rD   rT   r:   s     €r   rU   z>VerticalInventoryPacker.plan_vertical_sort.<locals>.<listcomp>`   s2   ø€ ÐSÐSÐS¸QÐ8Ð8¥u¨T¬YÑ'7Ô'7Ð8Ñ8Ô8ÐSÐSÐSr   r   c                 ó   — | j         | j        fS r9   )r$   r#   )Úxs    r   ú<lambda>z<VerticalInventoryPacker.plan_vertical_sort.<locals>.<lambda>h   s   € ¨¬°!´'Ð':€ r   T)ÚkeyÚreverseFc              3   ón   •K  — | ]/}t          ‰j        ¦  «        D ]}‰‰|z            ‰|z            V — ŒŒ0d S r9   )rB   r#   )rD   rE   rF   rG   ÚitrH   Útarget_grids      €€€€r   rI   z=VerticalInventoryPacker.plan_vertical_sort.<locals>.<genexpr>o   sP   øè è € ÐpÐp¸rÕ`eÐfhÔfnÑ`oÔ`oÐpÐpÐZ\˜{¨1¨r©6Ô2°1°r±6Ô:ÐpÐpÐpÐpÐpÐpÐpr   u   Dá»“n item lá»›n z (rW   u   ) sang cá»™t dá»�c (z, ú))r   r,   r-   r.   r/   r1   u   Gom Ä‘á»“ 1x1 u    vá»� cá»™t pháº£i ()r#   r$   rM   rB   r7   Úsortr6   rL   r!   r"   r+   r   r    )r:   rP   Úsmall_itemsÚlarge_itemsÚactionsÚcurr_large_colÚcurr_large_rowÚplacedrE   rF   Ú	small_colÚ	small_rowÚfoundrG   r\   rH   r]   s   `            @@@@r   Úplan_vertical_sortz*VerticalInventoryPacker.plan_vertical_sortL   sŠ  øøøøø€ ð ˆØˆàð 	'ð 	'ˆBØŒx˜1Š}ˆ} ¤¨a¢ Ø×"Ò" 2Ñ&Ô&Ð&Ð&à×"Ò" 2Ñ&Ô&Ð&Ð&ð TÐSÐSÐSÅ%ÈÌ	ÑBRÔBRÐSÑSÔSˆØ(*ˆð ˆØˆð 	×ÒÐ:Ð:ÀDÐÑIÔIÐIàð 	ñ 	ˆBØˆFÝ˜1˜dœi¨"¬(Ñ2°QÑ6Ñ7Ô7ð ñ �Ý˜q $¤)¨b¬iÑ"7¸!Ñ";Ñ<Ô<ð ð �AåÐpÐpÐpÐpÐpÐpÐpÅUÈ2Ì9ÑEUÔEUÐpÑpÔpÑpÔpð å"'¨¬	Ñ"2Ô"2ð Cð C˜BÝ&+¨B¬H¡o¤oð Cð C Ø>B ¨A°©FÔ 3°A¸±FÑ ;Ð ;ðCð œ6 Qš;˜;¨"¬&°Aª+¨+Ø#ŸNšN­>Ø(*¬
Ø)+¬Ø)+¬Ø'(Ø'(Ø,~ÀÄÐ,~Ð,~È2Ì8Ð,~Ð,~ÐVXÔV_Ð,~Ð,~ÐuvÐ,~Ð,~Ðz{Ð,~Ð,~Ð,~ð,ñ ,ô ,ñ ô ð ð "&˜Ø˜ð!ð" ð Ø�Eñùð ”I ‘Mˆ	Øˆ	àð 	#ð 	#ˆBàˆEØ˜q’.�.¨�.Ø $¤)Ò+Ð+°EÐ+Ø& yÔ1°)Ô<ð %Ø<@˜ IÔ.¨yÑ9Øœ6 YÒ.Ð.°"´&¸IÒ2EÐ2EØ#ŸNšN­>Ø(*¬
Ø)+¬Ø)+¬Ø'0Ø'0Ø,s¸R¼WÐ,sÐ,sÐZcÐ,sÐ,sÐgpÐ,sÐ,sÐ,sð,ñ ,ô ,ñ ô ð ð !%˜Ø ‘N�Ið   $¤)Ò+Ð+°EÐ+ð ð #Ø !�IØ ‘N�Ið# ˜q’.�.¨�.øð& ˆr   N)r4   r5   )r   r   r   Ú__doc__r(   r;   r   r)   r   rO   r   r+   ri   r   r   r   r3   r3   0   s¾   € € € € € ðð ðð ˜Sð ¨Sð ð ð ð ð°D¸¸d¼Ô4Dð ÈÈeÐTWÐY\Ð^aÐcfÐTfÔNgÔIhð ð ð ð ð&QØÐ+Ô,ðQà	ˆnÔ	ðQð Qð Qð Qð Qð Qr   r3   N)rj   Údataclassesr   r   Úenumr   Útypingr   r   r   r	   r
   r   r   r   r+   r3   r   r   r   ú<module>rn      s9  ððð ð )Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð �Dñ ô ð ð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ððmð mð mð mð mñ mô mð mð mð mr   