§
    OAºj�K  ã                  óà  — U d Z ddlmZ ddlmZ ddlmZ ddlZddlm	Z	m
Z
mZmZmZmZ  ed¬¦  «         G d	„ d
¦  «        ¦   «         Z edd¦  «        Z edd¦  «        Z edd¦  «        Z edd¦  «        Z edd¦  «        Z G d„ dee¦  «        Z G d„ d¦  «        ZddddœZded<   dd d!d"d#œZded$<   d%d&d'd'd(d"d)œZded*<   d+d,d-d-d(d(d)œZded.<   d/d0d1d2d3d4d5œZded6<   dgd:„Zd;ej        fdhdB„Z ej        fdidD„Z!ej        fdjdE„Z"ej        fdkdH„Z#ej        fdldK„Z$ej        fdldL„Z%ej        fdmdO„Z&e G dP„ dQ¦  «        ¦   «         Z'e G dR„ dS¦  «        ¦   «         Z(	 	 	 	 dndod`„Z)	 	 dpdqdf„Z*dS )ruJ  AutoPOE2 - Dynamic Resolution Scaling Engine (Doc 63 / SSoT 2026).
======================================================================
Module chuyá»ƒn Ä‘á»•i vÃ  co giÃ£n tá»�a Ä‘á»™ mÃ n hÃ¬nh Ä‘á»™ng (Dynamic Coordinate Transform):
- Há»— trá»£ co giÃ£n tuyáº¿n tÃ­nh chÃ­nh xÃ¡c giá»¯a Single Source of Truth (1920x1080),
  1440p (2560x1440), 720p (1280x720), vÃ  cháº¿ Ä‘á»™ Windowed thá»±c táº¿ (1189x891).
- Chuáº©n hÃ³a ma tráº­n tá»�a Ä‘á»™ pixel cho cÃ¡c pháº§n tá»­ UI trá»�ng yáº¿u:
  * NÃºt TRAVERSE & khung tÆ°Æ¡ng tÃ¡c Map Device.
  * Khay cáº¯m Waystone (Map Device Socket) & khay Waystone hÃ ng 1 Atlas.
  * LÆ°á»›i hÃ²m Ä‘á»“ Stash (12x12) vÃ  tÃºi Ä‘á»“ Inventory (12x5).
  * Giao diá»‡n SÃ n Ngoáº¡i Há»‘i Faustus Currency Exchange.
- Ä�áº£m báº£o sai sá»‘ lÃ m trÃ²n tá»‘i Ä‘a <= 1 pixel trÃªn má»�i Ä‘á»™ phÃ¢n giáº£i.

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 1: Python 3.11 Cold Path Tier 2.
- Rule 4: Module hÃ³a dÃ¹ng chung táº¡i src/common/, tráº§n file < 500 dÃ²ng.
- Rule 16: Google Docstrings Ä‘áº§y Ä‘á»§.
- Báº¥t biáº¿n: INV-SCALE-IDEMPOTENT-1PX, INV-WASD-NO-BLIND-LMB.
é    )Úannotations)Ú	dataclass)ÚEnumN)ÚAnyÚDictÚListÚOptionalÚTupleÚUnionT)Úfrozenc                  ó�   — e Zd ZU dZded<   ded<   dd„Zedd	„¦   «         Zedd„¦   «         Zedd„¦   «         Z	edd„¦   «         Z
dS )Ú
ResolutionuÅ   Ä�áº·c táº£ Ä‘á»™ phÃ¢n giáº£i mÃ n hÃ¬nh hoáº·c cá»­a sá»• game.

    Attributes:
        width: Chiá»�u rá»™ng tÃ­nh báº±ng pixel (> 0).
        height: Chiá»�u cao tÃ­nh báº±ng pixel (> 0).
    ÚintÚwidthÚheightÚreturnÚNonec                óp   — | j         dk    s| j        dk    rt          d| j         › d| j        › �¦  «        ‚d S )Nr   u,   Ä�á»™ phÃ¢n giáº£i khÃ´ng há»£p lá»‡: width=z	, height=)r   r   Ú
ValueError©Úselfs    ú7C:\Projects\AutoPOE2\src\common\coordinate_transform.pyÚ__post_init__zResolution.__post_init__'   sF   € ØŒ:˜Š?ˆ?˜dœk¨QÒ.Ð.ÝÐnÈDÌJÐnÐnÐaeÔalÐnÐnÑoÔoÐoð /Ð.ó    Úfloatc                ó:   — | j         t          | j        ¦  «        z  S )u'   Tá»· lá»‡ khung hÃ¬nh (width / height).)r   r   r   r   s    r   Úaspect_ratiozResolution.aspect_ratio+   s   € ð Œz�E $¤+Ñ.Ô.Ñ.Ð.r   Úboolc                ó8   — t          | j        dz
  ¦  «        dk     S )uK   Kiá»ƒm tra xem cÃ³ xáº¥p xá»‰ tá»· lá»‡ chuáº©n 16:9 (1.777...) hay khÃ´ng.gÇqÇqü?gš™™™™™©?)Úabsr   r   s    r   Úis_standard_16_9zResolution.is_standard_16_90   s   € õ �4Ô$¨
Ñ3Ñ4Ô4°tÒ;Ð;r   c                ó   — | j         dk     S )uc   Kiá»ƒm tra xem cÃ³ pháº£i tá»· lá»‡ khung hÃ¬nh cá»­a sá»• nhá»� (< 1.60 nhÆ° 4:3, 5:4) hay khÃ´ng.gš™™™™™ù?©r   r   s    r   Úis_windowed_aspectzResolution.is_windowed_aspect5   s   € ð Ô  4Ò'Ð'r   c                ó   — | j         dk    S )uF   Kiá»ƒm tra mÃ n hÃ¬nh siÃªu rá»™ng (21:9 hoáº·c 32:9, aspect >= 2.30).gffffff@r#   r   s    r   Úis_ultrawidezResolution.is_ultrawide:   s   € ð Ô  DÒ(Ð(r   N)r   r   )r   r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   Úpropertyr   r!   r$   r&   © r   r   r   r      sÌ   € € € € € € ðð ð €J€J�JØ€K€K�Kðpð pð pð pð ð/ð /ð /ñ „Xð/ð ð<ð <ð <ñ „Xð<ð ð(ð (ð (ñ „Xð(ð ð)ð )ð )ñ „Xð)ð )ð )r   r   i€  i8  i 
  i   i   iÐ  i   ip  i¥  i{  c                  ó"   — e Zd ZdZdZdZdZdZdS )ÚScalingModeu-   Cháº¿ Ä‘á»™ co giÃ£n tá»�a Ä‘á»™ hÃ¬nh há»�c.ÚSTRETCHÚUNIFORM_FITÚCENTER_ANCHOREDÚWINDOWED_ADAPTIVEN)r'   r(   r)   r*   r0   r1   r2   r3   r-   r   r   r/   r/   H   s+   € € € € € Ø7Ð7Ø€GØ€KØ'€OØ+ÐÐÐr   r/   c                  óŽ   — e Zd ZdZeefd"d„Zej        fd#d„Zej        fd$d„Z	ej        fd%d„Z
ej        fd&d„Zej        fd#d „Zd!S )'ÚCoordinateScaleru^   Bá»™ chuyá»ƒn Ä‘á»•i tá»�a Ä‘á»™ Ä‘á»™ng giá»¯a cÃ¡c Ä‘á»™ phÃ¢n giáº£i vá»›i sai sá»‘ <= 1px.Ú
source_resr   Ú
target_resr   r   c                ó¦   — || _         || _        |j        t          |j        ¦  «        z  | _        |j        t          |j        ¦  «        z  | _        dS )uö   Khá»Ÿi táº¡o bá»™ chuyá»ƒn Ä‘á»•i.

        Args:
            source_res: Ä�á»™ phÃ¢n giáº£i gá»‘c chá»©a tá»�a Ä‘á»™ tham chiáº¿u (máº·c Ä‘á»‹nh 1080p SSoT).
            target_res: Ä�á»™ phÃ¢n giáº£i Ä‘Ã­ch cáº§n chuyá»ƒn Ä‘á»•i tá»›i.
        N)r6   r7   r   r   Úscale_xr   Úscale_y)r   r6   r7   s      r   Ú__init__zCoordinateScaler.__init__S   sJ   € ð %ˆŒØ$ˆŒØ(Ô.µ°zÔ7GÑ1HÔ1HÑHˆŒØ(Ô/µ%¸
Ô8IÑ2JÔ2JÑJˆŒˆˆr   Úxr   ÚyÚmoder/   úTuple[int, int]c                óæ  — |t           j        k    rL|| j        z  }|| j        z  }t	          t          |¦  «        ¦  «        t	          t          |¦  «        ¦  «        fS |t           j        k    s|t           j        k    r~| j        j	        rr| j
        j        dz  }| j        j        dz  }||z
  }||| j        z  z   }|| j        z  }t	          t          |¦  «        ¦  «        t	          t          |¦  «        ¦  «        fS |t           j        k    r t          | j        | j        ¦  «        }	| j        j        | j
        j        |	z  z
  dz  }
| j        j        | j
        j        |	z  z
  dz  }|
||	z  z   }|||	z  z   }t	          t          |¦  «        ¦  «        t	          t          |¦  «        ¦  «        fS t	          t          || j        z  ¦  «        ¦  «        t	          t          || j        z  ¦  «        ¦  «        fS )ur  Chuyá»ƒn Ä‘á»•i má»™t Ä‘iá»ƒm (X, Y) tá»« source_res sang target_res.

        Args:
            x: Tá»�a Ä‘á»™ X trÃªn source_res.
            y: Tá»�a Ä‘á»™ Y trÃªn source_res.
            mode: Cháº¿ Ä‘á»™ co giÃ£n (máº·c Ä‘á»‹nh STRETCH tuyáº¿n tÃ­nh).

        Returns:
            Tuple[int, int]: Tá»�a Ä‘á»™ (x_target, y_target) Ä‘Ã£ lÃ m trÃ²n chuáº©n.
        ç      à?)r/   r0   r9   r:   r   Úroundr2   r3   r7   r$   r6   r   r1   Úminr   )r   r<   r=   r>   ÚtxÚtyÚcenter_src_xÚcenter_tgt_xÚoffset_xÚsÚpad_xÚpad_ys               r   Útransform_pointz CoordinateScaler.transform_pointc   s²  € ð  •;Ô&Ò&Ð&Ø�T”\Ñ!ˆBØ�T”\Ñ!ˆBÝ•u˜R‘y”y‘>”>¥3¥u¨R¡y¤y¡>¤>Ð1Ð1à•;Ô.Ò.Ð.Ø•KÔ1Ò1Ð1°d´oÔ6XÐ1ð  œ?Ô0°3Ñ6ˆLØœ?Ô0°3Ñ6ˆLØ˜<Ñ'ˆHØ ¨D¬LÑ!8Ñ9ˆBØ�T”\Ñ!ˆBÝ•u˜R‘y”y‘>”>¥3¥u¨R¡y¤y¡>¤>Ð1Ð1à•;Ô*Ò*Ð*Ý�D”L $¤,Ñ/Ô/ˆAØ”_Ô*¨d¬oÔ.CÀaÑ.GÑHÈCÑOˆEØ”_Ô+¨t¬Ô/EÈÑ/IÑJÈcÑQˆEØ˜!˜a™%‘ˆBØ˜!˜a™%‘ˆBÝ•u˜R‘y”y‘>”>¥3¥u¨R¡y¤y¡>¤>Ð1Ð1õ •5˜˜Tœ\Ñ)Ñ*Ô*Ñ+Ô+­Sµ°q¸4¼<Ñ7GÑ1HÔ1HÑ-IÔ-IÐIÐIr   ÚwÚhúTuple[int, int, int, int]c                óÊ   — |                       |||¬¦  «        \  }}|                       ||z   ||z   |¬¦  «        \  }}	||t          d||z
  ¦  «        t          d|	|z
  ¦  «        fS )u9   Chuyá»ƒn Ä‘á»•i hÃ¬nh chá»¯ nháº­t (x, y, width, height).©r>   é   )rL   Úmax)
r   r<   r=   rM   rN   r>   Úx1Úy1Úx2Úy2s
             r   Útransform_rectzCoordinateScaler.transform_rectŽ   so   € ð ×%Ò% a¨°Ð%Ñ6Ô6‰ˆˆBØ×%Ò% a¨!¡e¨Q°©U¸Ð%Ñ>Ô>‰ˆˆBØ�2•s˜1˜b 2™g‘”­¨A¨r°B©w©¬Ð7Ð7r   rT   rU   rV   rW   c                óz   — |                       |||¬¦  «        \  }}|                       |||¬¦  «        \  }}	||||	fS )u.   Chuyá»ƒn Ä‘á»•i bounding box (x1, y1, x2, y2).rQ   ©rL   )
r   rT   rU   rV   rW   r>   Útx1Úty1Útx2Úty2s
             r   Útransform_bboxzCoordinateScaler.transform_bbox›   sO   € ð ×'Ò'¨¨B°TÐ'Ñ:Ô:‰ˆˆSØ×'Ò'¨¨B°TÐ'Ñ:Ô:‰ˆˆSØ�C˜˜cÐ!Ð!r   Úorigin_xÚorigin_yÚcell_wÚcell_hÚcolr   Úrowc                ó^   — ||dz   |z  z   }||dz   |z  z   }	|                       ||	|¬¦  «        S )uc   TÃ­nh tÃ¢m cá»§a Ã´ lÆ°á»›i (col, row) trÃªn target_res khÃ´ng bá»‹ tÃ­ch lÅ©y sai sá»‘ lÃ m trÃ²n.rA   rQ   rZ   )
r   r`   ra   rb   rc   rd   re   r>   Úcx_srcÚcy_srcs
             r   Útransform_grid_cellz$CoordinateScaler.transform_grid_cell¨   sE   € ð ˜S 3™Y¨&Ñ0Ñ0ˆØ˜S 3™Y¨&Ñ0Ñ0ˆØ×#Ò# F¨F¸Ð#Ñ>Ô>Ð>r   c                óh   — t          | j        | j        ¬¦  «        }|                     |||¬¦  «        S )u=   Biáº¿n Ä‘á»•i ngÆ°á»£c láº¡i tá»« target_res vá»� source_res.©r6   r7   rQ   )r5   r7   r6   rL   )r   r<   r=   r>   Ú
inv_scalers        r   Úinverse_transform_pointz(CoordinateScaler.inverse_transform_point·   s5   € õ &°´ÈTÌ_Ð]Ñ]Ô]ˆ
Ø×)Ò)¨!¨Q°TÐ)Ñ:Ô:Ð:r   N)r6   r   r7   r   r   r   )r<   r   r=   r   r>   r/   r   r?   )r<   r   r=   r   rM   r   rN   r   r>   r/   r   rO   )rT   r   rU   r   rV   r   rW   r   r>   r/   r   rO   )r`   r   ra   r   rb   r   rc   r   rd   r   re   r   r>   r/   r   r?   )r'   r(   r)   r*   Ú	RES_1080Pr;   r/   r0   rL   rX   r_   ri   rm   r-   r   r   r5   r5   P   së   € € € € € ØhÐhð "+Ø!*ðKð Kð Kð Kð Kð( (Ô/ð	)Jð )Jð )Jð )Jð )Jðb (Ô/ð8ð 8ð 8ð 8ð 8ð& (Ô/ð"ð "ð "ð "ð "ð* (Ô/ð?ð ?ð ?ð ?ð ?ð& (Ô/ð	;ð ;ð ;ð ;ð ;ð ;ð ;r   r5   )g     ’‰@g     ‚�@)g     ‰@g      �@)g     j‡@g     �@g     ÄŠ@g     $‚@)Útext_centerÚframe_centerÚbboxzDict[str, Any]ÚCANONICAL_TRAVERSE_1080P)g     ´ˆ@g     :�@)g      n@g     à…@g      N@é   )Úsocket_centerÚtray_row1_originÚtray_slot_stepÚtray_slot_countÚCANONICAL_WAYSTONE_1080Pg     à“@g     p‚@g     @J@é   )r`   ra   rb   rc   ÚcolsÚrowsÚCANONICAL_INVENTORY_1080Pg     €f@g     Àg@g      J@ÚCANONICAL_STASH_1080P)ç      Ž@g     à€@)g      ‰@ç     @p@)g     €‘@r   )r~   g     @…@)r~   g     `ˆ@)g     0–@g      i@)Úpanel_centerÚ
tab_i_wantÚ
tab_i_haveÚamount_inputÚsubmit_order_btnÚclose_panel_btnÚCANONICAL_FAUSTUS_1080PÚtargetú'Union[Resolution, Tuple[int, int], Any]r   c                ó„  — t          | t          ¦  «        r| S t          | t          t          f¦  «        rIt	          | ¦  «        dk    r6t          t          | d         ¦  «        t          | d         ¦  «        ¦  «        S t          | d¦  «        rZt          | j        t          ¦  «        r@t          t          | j        d         ¦  «        t          | j        d         ¦  «        ¦  «        S t          | d¦  «        rDt          | d¦  «        r4t          t          | j        ¦  «        t          | j	        ¦  «        ¦  «        S t          S )uj   Chuáº©n hÃ³a Ä‘á»‘i tÆ°á»£ng Ä‘á»™ phÃ¢n giáº£i tá»« nhiá»�u nguá»“n (Resolution, tuple, PIL Image, HWND).é   r   rR   Úsizer   r   )Ú
isinstancer   ÚtupleÚlistÚlenr   Úhasattrr‹   r   r   rn   )r‡   s    r   Úresolve_resolutionr‘      s  € å�&�*Ñ%Ô%ð ØˆÝ�&�5¥$˜-Ñ(Ô(ð :­S°©[¬[¸AÒ-=Ð-=Ý�#˜f Qœi™.œ.­#¨f°Q¬i©.¬.Ñ9Ô9Ð9Ýˆv�vÑÔð D¥:¨f¬k½5Ñ#AÔ#Að DÝ�#˜fœk¨!œnÑ-Ô-­s°6´;¸q´>Ñ/BÔ/BÑCÔCÐCÝˆv�wÑÔð A¥G¨F°HÑ$=Ô$=ð AÝ�#˜fœlÑ+Ô+­S°´Ñ-?Ô-?Ñ@Ô@Ð@åÐr   Fr7   ú"Union[Resolution, Tuple[int, int]]Úuse_frame_centerr   r>   r?   c                ó¨   — t          | ¦  «        }t          t          |¬¦  «        }|rdnd}t          |         \  }}|                     |||¬¦  «        S )uŸ  Láº¥y tá»�a Ä‘á»™ click tá»‘i Æ°u cá»§a nÃºt TRAVERSE trÃªn Ä‘á»™ phÃ¢n giáº£i Ä‘Ã­ch.

    Args:
        target_res: Ä�á»™ phÃ¢n giáº£i mÃ n hÃ¬nh Ä‘Ã­ch.
        use_frame_center: True náº¿u muá»‘n láº¥y tÃ¢m khung nÃºt, False láº¥y tÃ¢m chá»¯ TRAVERSE.
        mode: Cháº¿ Ä‘á»™ co giÃ£n (máº·c Ä‘á»‹nh STRETCH tuyáº¿n tÃ­nh).

    Returns:
        Tuple[int, int]: Tá»�a Ä‘á»™ (x, y) vá»›i sai sá»‘ <= 1px.
    rk   rp   ro   rQ   )r‘   r5   rn   rr   rL   )r7   r“   r>   ÚresÚscalerÚref_keyÚref_xÚref_ys           r   Úget_traverse_button_posrš     sZ   € õ ˜ZÑ
(Ô
(€CÝ­¸sÐCÑCÔC€FØ 0ÐCˆnˆn°m€GÝ+¨GÔ4�L€Eˆ5Ø×!Ò! %¨°TÐ!Ñ:Ô:Ð:r   rO   c                ó¤   — t          | ¦  «        }t          t          |¬¦  «        }t          d         \  }}}}|                     |||||¬¦  «        S )uX   Láº¥y bounding box (x1, y1, x2, y2) cá»§a nÃºt TRAVERSE trÃªn Ä‘á»™ phÃ¢n giáº£i Ä‘Ã­ch.rk   rq   rQ   )r‘   r5   rn   rr   r_   )r7   r>   r•   r–   Úbx1Úby1Úbx2Úby2s           r   Úget_traverse_button_bboxr    $  sU   € õ
 ˜ZÑ
(Ô
(€CÝ­¸sÐCÑCÔC€FÝ1°&Ô9Ñ€Cˆˆc�3Ø× Ò   c¨3°¸$Ð Ñ?Ô?Ð?r   c                óœ   — t          | ¦  «        }t          t          |¬¦  «        }t          d         \  }}|                     |||¬¦  «        S )u9   Láº¥y tá»�a Ä‘á»™ á»• cáº¯m Waystone trÃªn Map Device UI.rk   rt   rQ   ©r‘   r5   rn   rx   rL   )r7   r>   r•   r–   ÚsxÚsys         r   Úget_waystone_socket_posr¥   /  sL   € õ
 ˜ZÑ
(Ô
(€CÝ­¸sÐCÑCÔC€FÝ% oÔ6�F€BˆØ×!Ò! " b¨tÐ!Ñ4Ô4Ð4r   Ú
slot_indexr   c                óÆ   — t          |¦  «        }t          t          |¬¦  «        }t          d         \  }}t          d         }|| |z  z   }|                     |||¬¦  «        S )uW   Láº¥y tá»�a Ä‘á»™ Ã´ thá»© `slot_index` (0..4) trÃªn khay Waystone HÃ ng 1 cá»§a Atlas.rk   ru   rv   rQ   r¢   )	r¦   r7   r>   r•   r–   ÚoxÚoyÚstepÚslot_xs	            r   Úget_waystone_tray_slot_posr¬   :  sg   € õ ˜ZÑ
(Ô
(€CÝ­¸sÐCÑCÔC€FÝ%Ð&8Ô9�F€BˆÝ#Ð$4Ô5€DØ�: Ñ$Ñ%€FØ×!Ò! &¨"°4Ð!Ñ8Ô8Ð8r   rd   re   c           	     óò  — t          |¦  «        }t          }|j        r‘|j        dz  }|d         |z  }d|dz  z  }|j        |z
  |d         |z  z
  }	|j        dz  }
|	| |z  z   |dz  z   }|
||z  z   |dz  z   }t          t          |¦  «        ¦  «        t          t          |¦  «        ¦  «        fS t          t          |¬¦  «        }| 	                    |d	         |d
         |d         |d         | ||¬¦  «        S )u  Láº¥y tá»�a Ä‘á»™ tÃ¢m Ã´ tÃºi Ä‘á»“ Inventory (col: 0..11, row: 0..4).

    Ä�áº·c biá»‡t: Khi target_res lÃ  cháº¿ Ä‘á»™ Windowed (aspect < 1.60 nhÆ° 1189x891),
    tá»± Ä‘á»™ng Ã¡p dá»¥ng neo lá»� pháº£i (Right-anchored pouch margin) chuáº©n theo Doc 63.
    ç      ž@rb   g      b@gÑã?rz   gbX9´Èâ?rA   rk   r`   ra   rc   rQ   )
r‘   r|   r$   r   r   r   rB   r5   rn   ri   )rd   re   r7   r>   r•   ÚcfgÚscaleÚ	cell_sizeÚpouch_marginr¨   r©   ÚcxÚcyr–   s                 r   Úget_inventory_slot_posrµ   H  s  € õ ˜ZÑ
(Ô
(€CÝ
#€Cð Ôð .Ø”	˜FÑ"ˆØ˜”M EÑ)ˆ	Ø ¨Ñ 9Ñ:ˆØŒY˜Ñ%¨¨V¬°yÑ)@ÑAˆØŒZ˜%ÑˆØ�3˜‘?Ñ# y°3¡Ñ7ˆØ�3˜‘?Ñ# y°3¡Ñ7ˆÝ•5˜‘9”9‰~Œ~�s¥5¨¡9¤9™~œ~Ð-Ð-å­¸sÐCÑCÔC€FØ×%Ò%ØˆJŒ˜˜Zœ¨#¨h¬-¸¸X¼ÈÈSÐW[ð &ñ ô ð r   c           	     óÂ   — t          |¦  «        }t          }t          t          |¬¦  «        }|                     |d         |d         |d         |d         | ||¬¦  «        S )uR   Láº¥y tá»�a Ä‘á»™ tÃ¢m Ã´ hÃ²m Ä‘á»“ Stash Tab ThÆ°á»�ng (col: 0..11, row: 0..11).rk   r`   ra   rb   rc   rQ   )r‘   r}   r5   rn   ri   )rd   re   r7   r>   r•   r¯   r–   s          r   Úget_stash_slot_posr·   g  se   € õ ˜ZÑ
(Ô
(€CÝ
€CÝ­¸sÐCÑCÔC€FØ×%Ò%ØˆJŒ˜˜Zœ¨#¨h¬-¸¸X¼ÈÈSÐW[ð &ñ ô ð r   Úelement_nameÚstrc                óÔ   — t          |¦  «        }| t          vrt          d| › d�¦  «        ‚t          t          |¬¦  «        }t          |          \  }}|                     |||¬¦  «        S )uS   Láº¥y tá»�a Ä‘á»™ cÃ¡c thÃ nh pháº§n tÆ°Æ¡ng tÃ¡c trÃªn sÃ n ngoáº¡i há»‘i Faustus.u   KhÃ´ng tÃ¬m tháº¥y UI element 'z' trong CANONICAL_FAUSTUS_1080Prk   rQ   )r‘   r†   ÚKeyErrorr5   rn   rL   )r¸   r7   r>   r•   r–   r˜   r™   s          r   Úget_faustus_element_posr¼   v  sr   € õ ˜ZÑ
(Ô
(€CØÕ2Ð2Ð2ÝÐf¸ÐfÐfÐfÑgÔgÐgÝ­¸sÐCÑCÔC€FÝ*¨<Ô8�L€Eˆ5Ø×!Ò! %¨°TÐ!Ñ:Ô:Ð:r   c                  ó(   — e Zd ZU dZded<   ded<   dS )ÚScreenPointu(   Tá»�a Ä‘á»™ pixel trÃªn mÃ n hÃ¬nh game.r   r<   r=   N)r'   r(   r)   r*   r+   r-   r   r   r¾   r¾   „  s(   € € € € € € à2Ð2Ø€H€H�HØ€H€H�H€H€Hr   r¾   c                  óL   — e Zd ZU dZdZded<   dZded<   dZded<   dZded<   dS )	Ú
WasdVectoru.   Vector tráº¡ng thÃ¡i 4 phÃ­m di chuyá»ƒn WASD.Fr   ÚupÚleftÚdownÚrightN)	r'   r(   r)   r*   rÁ   r+   rÂ   rÃ   rÄ   r-   r   r   rÀ   rÀ   ‹  s\   € € € € € € à8Ð8Ø€BÐÐÐÑØ€DÐÐÐÑØ€DÐÐÐÑØ€EÐÐÐÑÐÐr   rÀ   r®   ç     à�@ç      I@Údxr   ÚdyÚdistúOptional[float]Úscreen_wÚscreen_hÚmarginúTuple[float, float]c                óô  — |dk    rd}|dk    rd}|dz  }|dz  }t          j        | | z  ||z  z   ¦  «        }|dk    r| |z  nd}	|dk    r||z  nd}
|�|n|}||	|
z
  |z  dz  z   }||	|
z   |z  dz  z
  }t          ||¦  «        }t          |||z
  ¦  «        }t          ||¦  «        }t          |||z
  ¦  «        }t          |t          ||¦  «        ¦  «        }t          |t          ||¦  «        ¦  «        }||fS )	u6  Chuáº©n hÃ³a phÃ©p chiáº¿u Isometric 2D tá»« vector delta tháº¿ giá»›i (dx, dy) sang pixel mÃ n hÃ¬nh POE2.
    Ä�á»“ng bá»™ 1:1 vá»›i common::WorldToScreenIsometric trong src/core/common/math2d.hpp.

    Há»‡ trá»¥c mÃ n hÃ¬nh Windows:
    - X tÄƒng dáº§n sang pháº£i mÃ n hÃ¬nh.
    - Y tÄƒng dáº§n xuá»‘ng dÆ°á»›i mÃ n hÃ¬nh (cy lÃ  tÃ¢m mÃ n hÃ¬nh).

    PhÃ©p chiáº¿u Isometric POE2:
    - Trá»¥c X mÃ n hÃ¬nh: targetX = cx + (ndx - ndy) * dist * 0.70710678
    - Trá»¥c Y mÃ n hÃ¬nh: targetY = cy - (ndx + ndy) * dist * 0.45000000
      (Khi nhÃ¢n váº­t tiáº¿n lÃªn phÃ­a trÆ°á»›c/báº¯c tháº¿ giá»›i: ndx + ndy > 0 -> targetY < cy, tá»©c hÆ°á»›ng lÃªn ná»­a trÃªn mÃ n hÃ¬nh).

    Args:
        dx: Ä�á»™ lá»‡ch trá»¥c X tháº¿ giá»›i (target.x - origin.x)
        dy: Ä�á»™ lá»‡ch trá»¥c Y tháº¿ giá»›i (target.y - origin.y)
        dist: Khoáº£ng cÃ¡ch chiáº¿u pixel tá»« tÃ¢m (náº¿u None sáº½ tá»± tÃ­nh báº±ng Ä‘á»™ dÃ i vector dx, dy)
        screen_w: Chiá»�u rá»™ng mÃ n hÃ¬nh tÃ­nh báº±ng pixel (máº·c Ä‘á»‹nh 1920.0)
        screen_h: Chiá»�u cao mÃ n hÃ¬nh tÃ­nh báº±ng pixel (máº·c Ä‘á»‹nh 1080.0)
        margin: Khoáº£ng cÃ¡ch an toÃ n tá»‘i thiá»ƒu tÃ­nh tá»« rÃ¬a mÃ n hÃ¬nh (máº·c Ä‘á»‹nh 50.0)

    Returns:
        Tuple[float, float]: (target_x, target_y) Ä‘Ã£ clamp an toÃ n vÃ o khung nhÃ¬n mÃ n hÃ¬nh.
    g        r®   rÅ   rA   gü©ñÒMbP?Nçß'Üež æ?gÍÌÌÌÌÌÜ?)ÚmathÚsqrtrC   rS   )rÇ   rÈ   rÉ   rË   rÌ   rÍ   r³   r´   ÚlengthÚndxÚndyÚactual_distÚtarget_xÚtarget_yÚmin_xÚmax_xÚmin_yÚmax_ys                     r   Úworld_to_screen_isometricrÝ   ”  s5  € ð> �3‚€ØˆØ�3‚€Øˆà	�C‰€BØ	�C‰€BåŒY�r˜B‘w  b¡Ñ(Ñ)Ô)€FØ! Eš>˜>ˆ2�‰;ˆ;¨s€CØ! Eš>˜>ˆ2�‰;ˆ;¨s€CàÐ*�$�$°€Kà�S˜3‘Y +Ñ-°
Ñ:Ñ:€HØ�S˜3‘Y +Ñ-°
Ñ:Ñ:€Hå�˜‰OŒO€EÝ��H˜vÑ%Ñ&Ô&€EÝ�˜‰OŒO€EÝ��H˜vÑ%Ñ&Ô&€Eå�5�#˜h¨Ñ.Ô.Ñ/Ô/€HÝ�5�#˜h¨Ñ.Ô.Ñ/Ô/€Hà�XÐÐr   ç{®Gáz„?çR¸…ëQØ?ÚdeadzoneÚ	thresholdúTuple[bool, bool, bool, bool]c                óÐ   — t          j        | | z  ||z  z   ¦  «        }|dk    s||k     rdS | |z  }||z  }d}||z
  |z  }||z   |z  }	|	|k    }
|	| k     }||k    }|| k     }|
|||fS )uÁ  PhÃ¢n Ä‘á»‹nh 8 hÆ°á»›ng phÃ­m WASD Isometric chuáº©n src/core/common/math2d.hpp.

    Args:
        dx: Ä�á»™ lá»‡ch trá»¥c X tháº¿ giá»›i
        dy: Ä�á»™ lá»‡ch trá»¥c Y tháº¿ giá»›i
        deadzone: NgÆ°á»¡ng cháº¿t tá»‘i thiá»ƒu Ä‘á»ƒ kÃ­ch hoáº¡t phÃ­m (máº·c Ä‘á»‹nh 0.01)
        threshold: NgÆ°á»¡ng kÃ­ch hoáº¡t hÆ°á»›ng phÃ­m (máº·c Ä‘á»‹nh 0.38)

    Returns:
        Tuple[bool, bool, bool, bool]: (up/W, left/A, down/S, right/D)
    g-Cëâ6?)FFFFrÐ   )rÑ   rÒ   )rÇ   rÈ   rà   rá   rÓ   rÔ   rÕ   Ú	inv_sqrt2Úscreen_xÚscreen_yrÁ   rÃ   rÄ   rÂ   s                 r   Úworld_to_wasdrç   Ï  s©   € õ" ŒY�r˜B‘w  b¡Ñ(Ñ)Ô)€FØ�ÒÐ˜6 HÒ,Ð,Ø)Ð)à
ˆv‰+€CØ
ˆv‰+€Cà€IØ�c‘	˜YÑ&€HØ�c‘	˜YÑ&€Hà	�IÒ	€BØ�y�jÒ €DØ�yÒ €EØ�y�jÒ €Dàˆt�T˜5Ð Ð r   )r‡   rˆ   r   r   )r7   r’   r“   r   r>   r/   r   r?   )r7   r’   r>   r/   r   rO   )r7   r’   r>   r/   r   r?   )r¦   r   r7   r’   r>   r/   r   r?   )
rd   r   re   r   r7   r’   r>   r/   r   r?   )r¸   r¹   r7   r’   r>   r/   r   r?   )Nr®   rÅ   rÆ   )rÇ   r   rÈ   r   rÉ   rÊ   rË   r   rÌ   r   rÍ   r   r   rÎ   )rÞ   rß   )
rÇ   r   rÈ   r   rà   r   rá   r   r   râ   )+r*   Ú
__future__r   Údataclassesr   Úenumr   rÑ   Útypingr   r   r   r	   r
   r   r   rn   Ú	RES_1440PÚRES_720PÚRES_4KÚRES_WINDOWED_DEFAULTr¹   r/   r5   rr   r+   rx   r|   r}   r†   r‘   r0   rš   r    r¥   r¬   rµ   r·   r¼   r¾   rÀ   rÝ   rç   r-   r   r   ú<module>rð      s6  ððð ð ð& #Ð "Ð "Ð "Ð "Ð "à !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø €€€Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ð €�$ÐÑÔð )ð  )ð  )ð  )ð  )ñ  )ô  )ñ Ôð )ðH ˆJ�t˜TÑ"Ô"€	ØˆJ�t˜TÑ"Ô"€	Øˆ:�d˜CÑ Ô €Ø	ˆ�D˜$Ñ	Ô	€Ø!�z $¨Ñ,Ô,Ð ð,ð ,ð ,ð ,ð ,�#�tñ ,ô ,ð ,ðo;ð o;ð o;ð o;ð o;ñ o;ô o;ð o;ðv $Ø#Ø)ð,ð ,Ð ð ð ð ñ ð %Ø&ØØð	,ð ,Ð ð ð ð ñ ð ØØØØØð-ð -Ð ð ð ð ñ ð ØØØØØð)ð )Ð ð ð ð ñ ð #Ø Ø!Ø"Ø&Ø&ð+ð +Ð ð ð ð ñ ðð ð ð ð  #Ø#Ô+ð;ð ;ð ;ð ;ð ;ð0 $Ô+ð@ð @ð @ð @ð @ð $Ô+ð5ð 5ð 5ð 5ð 5ð $Ô+ð9ð 9ð 9ð 9ð 9ð$ $Ô+ð	ð ð ð ð ðF $Ô+ð	ð ð ð ð ð$ $Ô+ð;ð ;ð ;ð ;ð ;ð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ðð !ØØØð8ð 8ð 8ð 8ð 8ð| Øð	!!ð !!ð !!ð !!ð !!ð !!ð !!r   