§
    W¼j   ã            	       óþ   — d Z ddlZddlmZmZmZ ddlmZmZm	Z	m
Z
mZmZmZmZmZ deeef         dedeeee         f         fd	„Zdeeef         d
edee         fd„Zde	dedefd„Zdededefd„Zdededefd„ZdS )z˜
FreeExile Inventory & Storage Helper Routines.
Pure helper functions for slot search, stack merging, equipment compatibility, and container factories.
é    N)ÚDictÚOptionalÚTupleé   )	ÚInventoryItemÚEquipmentSlotÚItemTypeÚCharacterInventoryÚStashTabTypeÚStashTabÚPersonalStashÚMerchantStashTabÚPlayerStorageContainerÚslotsÚitemÚreturnc                 ó6  — |j         dk    rdS |                      ¦   «         D ]v\  }}|j        |j        k    ra|j        |j         k     rQ|j         |j        z
  }|j        |k    r|xj        |j        z  c_        d|fc S |xj        |z  c_        |j         |_        ŒwdS )zBAttempts to merge item stack into existing matching item in slots.r   )FNT)Ú	max_stackÚitemsÚitem_idÚstack_count)r   r   Ús_idxÚexistingÚspaces        ú;C:\Projects\FreeExile\server\inventory\inventory_helpers.pyÚtry_merge_stackr      s»   € ð „~˜ÒÐØˆ{à Ÿ;š;™=œ=ð :ð :‰ˆˆxØÔ˜tœ|Ò+Ð+°Ô0DÀxÔGYÒ0YÐ0YØÔ&¨Ô)=Ñ=ˆEØÔ 5Ò(Ð(ØÐ$Ô$¨Ô(8Ñ8Ð$Ô$Ø˜U�{Ð"Ð"Ð"àÐ Ô  EÑ)Ð Ô Ø'/Ô'9�Ô$øàˆ;ó    Úcapacityc                 ó:   — t          |¦  «        D ]
}|| vr|c S ŒdS )z/Finds first unused slot index in [0, capacity).N)Úrange)r   r   r   s      r   Úfind_first_empty_slotr!   )   s5   € å�x‘”ð ð ˆØ˜ÐÐØˆLˆLˆLð àˆ4r   Ú	item_typeÚ
equip_slotc                 óš  — t           j        t           j        t           j        t           j        h}t           j        t           j        t           j        t           j        t           j	        h}t           j
        t           j        t           j        h}| t          j        k    r||v S | t          j        k    r||v S | t          j        k    r||v p||v S dS )zCValidates if item type can be equipped in specified equipment slot.F)r   Ú	MAIN_HANDÚOFF_HANDÚSWAP_MAIN_HANDÚSWAP_OFF_HANDÚHELMETÚ
BODY_ARMORÚGLOVESÚBOOTSÚBELTÚAMULETÚRING_1ÚRING_2r	   ÚWEAPONÚARMORÚRELIC)r"   r#   Úweapon_slotsÚarmor_slotsÚrelic_slotss        r   Úis_equipment_compatibler7   1   s¾   € õ 	ÔÝÔÝÔ$ÝÔ#ð	€Lõ 	ÔÝÔ ÝÔÝÔÝÔð€Kõ 	ÔÝÔÝÔð€Kð •H”OÒ#Ð#Ø˜\Ð)Ð)Ø•H”NÒ"Ð"Ø˜[Ð(Ð(Ø•H”NÒ"Ð"Ø˜[Ð(ÐE¨J¸+Ð,EÐEàˆ5r   Úcountc                 óâ   — t          | j        › dt          j        ¦   «         j        dd…         › �| j        | j        | j        | j        | j	        || j
        t          | j        ¦  «        ¬¦	  «	        S )z)Creates a split copy of a stackable item.Ú_split_Né   )	Ú	item_uuidr   Únamer"   ÚrarityÚ
item_levelr   r   Úaffixes)r   r<   ÚuuidÚuuid4Úhexr   r=   r"   r>   r?   r   Úlistr@   )r   r8   s     r   Úcreate_split_itemrE   P   sl   € åØ”^ÐBÐB­D¬J©L¬LÔ,<¸R¸a¸RÔ,@ÐBÐBØ”ØŒYØ”.ØŒ{Ø”?ØØ”.Ý�T”\Ñ"Ô"ð
ñ 
ô 
ð 
r   Ú
account_idÚcharacter_idc                 óF  — t          | |di i ¬¦  «        }t          | t          ddt          j        d¬¦  «        t          ddt          j        d¬¦  «        t          d	d
t          j        d¬¦  «        dœ¬¦  «        }t          | ddi d¬¦  «        }t          | ||||¬¦  «        S )zVInstantiates clean character inventory, 3 default stash tabs, and locked merchant tab.é(   )rF   rG   r   r   Ú	equipmentÚtab_generalz	Kho Chungé0   )r   Útab_currencyu   Huyáº¿t Tháº¡ch & Tiá»�n Tá»‡Útab_equipmentu   Binh KhÃ­ & Tháº§n Cá»‘t)rK   rM   rN   )rF   ÚtabsFé   u   Háº¯c Thá»‹ NiÃªm Yáº¿t)rF   Úis_unlockedr   r   Útab_name©rF   rG   Ú	inventoryÚstashÚmerchant_stash)	r
   r   r   r   ÚGENERALÚCURRENCYÚ	EQUIPMENTr   r   rS   s        r   Ú create_default_storage_containerrZ   _   sØ   € å"Ø¨LÀ2ÈRÐ[]ðñ ô €Iõ Øå# M°;ÅÔ@TÐ_aÐbÑbÔbÝ$ ^Ð5TÕVbÔVkÐvxÐyÑyÔyÝ% oÐ7QÕS_ÔSiÐtvÐwÑwÔwð
ð 
ðñ ô €Eõ &Ø¨5¸2ÀRÐRkðñ ô €Nõ "Ø¨LØ 5¸ðñ ô ð r   )Ú__doc__rA   Útypingr   r   r   Úinventory_typesr   r   r	   r
   r   r   r   r   r   ÚintÚboolr   r!   r7   rE   ÚstrrZ   © r   r   ú<module>rb      s¨  ððð ð
 €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ðØ��]Ð"Ô#ðØ+8ðà
ˆ4�˜#”ÐÔðð ð ð ð(  c¨=Ð&8Ô!9ð ÀSð ÈXÐVYÌ]ð ð ð ð ð xð ¸]ð Ètð ð ð ð ð>˜Mð °#ð ¸-ð ð ð ð ð°ð ÀCð ÐLbð ð ð ð ð ð r   