§
    *¿j¼  ã                  óª  — d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
mZmZmZ  G d„ dee¦  «        Z G d	„ d
ee¦  «        Z G d„ dee¦  «        Z edd¬¦  «         G d„ d¦  «        ¦   «         Z edd¬¦  «         G d„ d¦  «        ¦   «         Z ed¬¦  «         G d„ d¦  «        ¦   «         Z edd¬¦  «         G d„ d¦  «        ¦   «         ZdS )zì
FreeExile Party Engine Data Types & Transfer Objects.
Defines 6-player party models, member snapshots, allocation modes, and lifecycle enums.
Follows Engineering Standards 2026: Soft cap <= 350 lines, strict typing, memory efficiency.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚEnum)ÚAnyÚDictÚListÚOptionalc                  ó   — e Zd ZdZdZdZdZdS )ÚLootAllocationModez'3 Canonical PoE2 Loot Allocation Modes.Ú	PERMANENTÚSHORTÚFREE_FOR_ALLN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   © ó    ú1C:\Projects\FreeExile\server\party\party_types.pyr   r      s#   € € € € € Ø1Ð1Ø€IØ€EØ!€L€L€Lr   r   c                  ó   — e Zd ZdZdZdZdS )Ú	PartyRolezRole within a 6-player party.ÚLEADERÚMEMBERN)r   r   r   r   r   r   r   r   r   r   r      s   € € € € € Ø'Ð'Ø€FØ€F€F€Fr   r   c                  ó6   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdS )ÚPartyActionz"Supported party lifecycle actions.ÚCREATEÚINVITEÚACCEPTÚDECLINEÚPROMOTEÚLEAVEÚKICKÚDISBANDÚSET_LOOT_MODEN)r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r   r   r   r   r      sA   € € € € € Ø,Ð,Ø€FØ€FØ€FØ€GØ€GØ€EØ€DØ€GØ#€M€M€Mr   r   T)ÚslotsÚfrozenc                  ó  — e Zd ZU dZded<   ded<   ded<   ded<   dZd	ed
<   dZded<   dZded<   ej	        Z
ded<   dZded<   dZded<   dZded<   ed d„¦   «         Zed!d„¦   «         Zed!d„¦   «         Zed"d„¦   «         Zd#d$d„Zd%d&d„ZdS )'ÚPartyMemberStatez9Immutable snapshot of an individual party member's state.ÚstrÚ	player_idÚcharacter_nameÚintÚlevelÚzone_idÚinst_1úOptional[str]Úinstance_idç        ÚfloatÚwxÚwyr   ÚroleTÚboolÚ	is_onlineg      Y@ÚhpÚmax_hpÚreturnc                ó   — | j         S )zAlias for character_name.)r,   ©Úselfs    r   ÚnamezPartyMemberState.name7   s   € ð Ô"Ð"r   c                ó   — | j         S )zAlias for wx.)r5   r>   s    r   ÚxzPartyMemberState.x<   ó   € ð Œwˆr   c                ó   — | j         S )zAlias for wy.)r6   r>   s    r   ÚyzPartyMemberState.yA   rC   r   c                ó   — | j         dk    S )zTrue if current HP > 0.0.r3   )r:   r>   s    r   Úis_alivezPartyMemberState.is_aliveF   s   € ð Œw˜Š}Ðr   Nc                ó    — t          | j        | j        | j        |�|n| j        |�|n| j        ||| j        | j        | j        | j	        ¬¦  «        S )z:Returns a new immutable instance with updated coordinates.N©r+   r,   r.   r/   r2   r5   r6   r7   r9   r:   r;   )
r)   r+   r,   r.   r/   r2   r7   r9   r:   r;   )r?   r5   r6   r/   r2   s        r   Úwith_positionzPartyMemberState.with_positionK   s`   € åØ”nØÔ.Ø”*Ø&Ð2�G�G¸¼Ø'2Ð'>˜˜ÀDÔDTØØØ”Ø”nØŒwØ”;ð
ñ 
ô 
ð 	
r   úOptional[bool]c                ó˜   — t          | j        | j        | j        | j        | j        | j        | j        | j        |€| j	        n|||¬¦  «        S )z5Returns a new immutable instance with updated vitals.NrI   )
r)   r+   r,   r.   r/   r2   r5   r6   r7   r9   )r?   r:   r;   r9   s       r   Úwith_vitalszPartyMemberState.with_vitals[   sW   € åØ”nØÔ.Ø”*Ø”LØÔ(ØŒwØŒwØ”Ø(1Ð(9�d”n�n¸yØØð
ñ 
ô 
ð 	
r   )r<   r*   )r<   r4   )r<   r8   )NN)
r5   r4   r6   r4   r/   r1   r2   r1   r<   r)   ©N)r:   r4   r;   r4   r9   rK   r<   r)   )r   r   r   r   Ú__annotations__r2   r5   r6   r   r   r7   r9   r:   r;   Úpropertyr@   rB   rE   rG   rJ   rM   r   r   r   r)   r)   (   se  € € € € € € àCÐCØ€N€N�NØÐÐÑØ€J€J�JØ€L€L�LØ!)€KÐ)Ð)Ð)Ñ)Ø€B€O€O€O�OØ€B€O€O€O�OØÔ&€DÐ&Ð&Ð&Ñ&Ø€IÐÐÐÑØ€BÐÐÐÑØ€FÐÐÐÑàð#ð #ð #ñ „Xð#ð ðð ð ñ „Xðð ðð ð ñ „Xðð ðð ð ñ „Xðð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r   r)   c                  ód   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ddd„ZdS )ÚPartyInvitez0Represents a pending invitation to join a party.r*   Ú	invite_idÚparty_idÚ
inviter_idÚinviter_nameÚtarget_player_idr-   Úcreated_at_msÚexpires_at_msNÚcurrent_time_msúOptional[int]r<   r8   c                óf   — |�|n"t          t          j        ¦   «         dz  ¦  «        }|| j        k    S )z8Checks if the invitation has exceeded its 30-second TTL.Niè  )r-   ÚtimerY   )r?   rZ   Únows      r   Ú
is_expiredzPartyInvite.is_expiredw   s2   € à!0Ð!<ˆoˆoÅ#ÅdÄiÁkÄkÐTXÑFXÑBYÔBYˆØ�dÔ(Ò(Ð(r   rN   )rZ   r[   r<   r8   )r   r   r   r   rO   r_   r   r   r   rR   rR   l   s€   € € € € € € à:Ð:Ø€N€N�NØ€M€M�MØ€O€O�OØÐÐÑØÐÐÑØÐÐÑØÐÐÑð)ð )ð )ð )ð )ð )ð )r   rR   )r&   c                  óø   — e Zd ZU dZded<   ded<    ee¬¦  «        Zded<   ej	        Z
ded	<    ee¬¦  «        Zd
ed<   dZded<    eej        ¬¦  «        Zded<   edd„¦   «         Zej        dd„¦   «         ZdS )Ú
PartyStatezKMutable container tracking active party members, leader, and configuration.r*   rT   Ú	leader_id)Údefault_factoryzDict[str, PartyMemberState]Úmembersr   Ú	loot_modezDict[str, PartyInvite]Úpending_invitesé   r-   Úmax_membersr4   Ú
created_atr<   c                ó   — | j         S )z3Alias for loot_mode for test harness compatibility.©re   r>   s    r   Úloot_allocation_modezPartyState.loot_allocation_modeˆ   s   € ð Œ~Ðr   ÚmodeÚNonec                ó   — || _         d S rN   rk   )r?   rm   s     r   rl   zPartyState.loot_allocation_mode�   s   € àˆŒˆˆr   N)r<   r   )rm   r   r<   rn   )r   r   r   r   rO   r   Údictrd   r   r   re   rf   rh   r]   ri   rP   rl   Úsetterr   r   r   ra   ra   }   sñ   € € € € € € àUÐUØ€M€M�MØ€N€N�NØ+0¨5ÀÐ+FÑ+FÔ+F€GÐFÐFÐFÑFØ$6Ô$<€IÐ<Ð<Ð<Ñ<Ø.3¨eÀDÐ.IÑ.IÔ.I€OÐIÐIÐIÑIØ€KÐÐÐÑØ˜¨d¬iÐ8Ñ8Ô8€JÐ8Ð8Ð8Ñ8àðð ð ñ „Xðð Ô ðð ð ñ !Ô ðð ð r   ra   c                  óD   — e Zd ZU dZded<   ded<   dZded<   dZd	ed
<   dS )ÚPartyActionResultz6Standardized response from party lifecycle operations.r8   Úsuccessr*   ÚmessageNzOptional[PartyState]Úpartyr1   Ú
error_code)r   r   r   r   rO   rv   rw   r   r   r   rs   rs   ’   sL   € € € € € € à@Ð@Ø€M€M�MØ€L€L�LØ"&€EÐ&Ð&Ð&Ñ&Ø $€JÐ$Ð$Ð$Ñ$Ð$Ð$r   rs   )r   Ú
__future__r   r]   Údataclassesr   r   Úenumr   Útypingr   r   r	   r
   r*   r   r   r   r)   rR   ra   rs   r   r   r   ú<module>r|      s  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ð"ð "ð "ð "ð "˜˜dñ "ô "ð "ðð ð ð ð ��Tñ ô ð ð
$ð 
$ð 
$ð 
$ð 
$�#�tñ 
$ô 
$ð 
$ð €�˜dÐ#Ñ#Ô#ð@
ð @
ð @
ð @
ð @
ñ @
ô @
ñ $Ô#ð@
ðF €�˜dÐ#Ñ#Ô#ð)ð )ð )ð )ð )ñ )ô )ñ $Ô#ð)ð  €�ÐÑÔðð ð ð ð ñ ô ñ Ôðð( €�˜dÐ#Ñ#Ô#ð%ð %ð %ð %ð %ñ %ô %ñ $Ô#ð%ð %ð %r   