§
    ÍÓ¬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mZmZ  G d„ dee¦  «        Ze G d	„ d
¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )u{  AutoPOE2 - Auto-Gem Leveling Module (Doc 67 / Doc 69 / Doc 70).
==================================================================
Tá»± Ä‘á»™ng nháº­n diá»‡n vÃ  nháº¥p thÄƒng cáº¥p ngá»�c ká»¹ nÄƒng (Skill & Support Gems) khi Ä‘áº§y kinh nghiá»‡m:
- Nháº­n diá»‡n vá»‹ trÃ­ icon dáº¥u cá»™ng (+) á»Ÿ rÃ¬a pháº£i mÃ n hÃ¬nh.
- KhÃ³a an toÃ n giao tranh (INV-GEM-LEVEL-SAFE-COMBAT):
  * Chá»‰ thÄƒng cáº¥p khi nhÃ¢n váº­t á»Ÿ ngoÃ i giao tranh (in_combat == False).
  * Cá»± ly quÃ¡i váº­t gáº§n nháº¥t pháº£i an toÃ n (> 30.0u) hoáº·c Ä‘ang á»Ÿ trong Hideout/Town.
  * Tuyá»‡t Ä‘á»‘i khÃ´ng gÃ¢y phÃ¢n tÃ¢m hoáº·c giÃ¡n Ä‘oáº¡n combat loop 120Hz cá»§a Hot Path.

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 1: Cold Path Tier 2 (Python 3.11).
- Rule 4: Module hÃ³a Ä‘á»™c láº­p, tráº§n file < 500 dÃ²ng.
- Rule 7: TÆ°Æ¡ng tÃ¡c chuá»™t tuyá»‡t Ä‘á»‘i MoveMouseSmooth + Click LMB (INV-INPUT-ABS-MOUSE).
é    )ÚannotationsN)Ú	dataclassÚfield)ÚEnum)ÚAnyÚCallableÚDictÚListÚOptionalÚTuplec                  ó*   — e Zd ZdZdZdZdZdZdZdZ	dS )	ÚGemLevelUpStatusu2   Tráº¡ng thÃ¡i quyáº¿t Ä‘á»‹nh thÄƒng cáº¥p ngá»�c.ÚSUCCESS_LEVELEDÚDEFERRED_IN_COMBATÚDEFERRED_PROXIMITYÚNO_GEMS_READYÚCOOLDOWN_ACTIVEÚUNSAFE_CLIENT_FOCUSN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   © ó    ú;C:\Projects\AutoPOE2\src\assistant_tool\gem_auto_leveler.pyr   r      s7   € € € € € Ø<Ð<Ø'€OØ-ÐØ-ÐØ#€MØ'€OØ/ÐÐÐr   r   c                  óN   — e Zd ZU dZded<   ded<   ded<   dZded	<   d
Zded<   dS )ÚGemPlusIconLocationu:   Tá»�a Ä‘á»™ mÃ n hÃ¬nh cá»§a icon thÄƒng cáº¥p ngá»�c (+).ÚintÚ
slot_indexÚfloatÚscreen_xÚscreen_yÚ ÚstrÚgem_nameTÚboolÚ
is_visibleN)r   r   r   r   Ú__annotations__r%   r'   r   r   r   r   r   "   sU   € € € € € € àDÐDØ€O€O�OØ€O€O�OØ€O€O�OØ€HÐÐÐÑØ€JÐÐÐÑÐÐr   r   c                  ó’   — 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Z	ded<   dZ
ded<   dZded<   dZded<   dZded<   dS )ÚGemLevelerConfiguF   Cáº¥u hÃ¬nh an toÃ n vÃ  tham sá»‘ hiá»ƒn thá»‹ cho Auto-Gem Leveling.g      >@r    Úmin_safe_monster_distanceiô  r   Úcooldown_msé   Úmax_gems_per_burstg     ˆ£@Úicon_base_x_1440pg     àu@Úicon_start_y_1440pg      J@Úicon_spacing_y_1440pg     L�@Úicon_base_x_1080pg     `p@Úicon_start_y_1080pg     €C@Úicon_spacing_y_1080pN)r   r   r   r   r+   r(   r,   r.   r/   r0   r1   r2   r3   r4   r   r   r   r*   r*   ,   s¹   € € € € € € àPÐPØ'+ÐÐ+Ð+Ð+Ñ+Ø€KÐÐÐÑØÐÐÐÐÑà%ÐÐ%Ð%Ð%Ñ%Ø %ÐÐ%Ð%Ð%Ñ%Ø"&ÐÐ&Ð&Ð&Ñ&à%ÐÐ%Ð%Ð%Ñ%Ø %ÐÐ%Ð%Ð%Ñ%Ø"&ÐÐ&Ð&Ð&Ñ&Ð&Ð&r   r*   c                  óf   — e Zd ZdZ	 	 	 	 d*d+d„Zd,d„Zd-d„Z	 d.d/d„Z	 	 	 	 	 d0d1d#„Z	 	 	 	 d2d3d)„Z	dS )4ÚGemAutoLeveleruI   Bá»™ Ä‘iá»�u phá»‘i tá»± Ä‘á»™ng thÄƒng cáº¥p ngá»�c ká»¹ nÄƒng an toÃ n.Né 
  é   ÚconfigúOptional[GemLevelerConfig]Úclick_callbackú(Optional[Callable[[float, float], None]]Úscreen_wr   Úscreen_hc                ó¾   — |pt          ¦   «         | _        || _        || _        || _        d| _        d| _        |dk    r|dz  nd| _        |dk    r|dz  nd| _        d S )Nr   ç      ¤@g      ð?ç     €–@)	r*   r9   r;   r=   r>   Úlast_click_time_msÚtotal_gems_leveledÚscale_xÚscale_y)Úselfr9   r;   r=   r>   s        r   Ú__init__zGemAutoLeveler.__init__?   ss   € ð Ð2Õ 0Ñ 2Ô 2ˆŒØ,ˆÔØ ˆŒØ ˆŒØ'(ˆÔØ'(ˆÔà,4°qªL¨L�x &Ñ(Ð(¸cˆŒØ,4°qªL¨L�x &Ñ(Ð(¸cˆŒˆˆr   r   ÚreturnúTuple[float, float]c                ób  — | j         dk    rC| j        dz  }| j         dz  }| j        j        |z  }| j        j        || j        j        z  z   |z  }nB| j        dz  }| j         dz  }| j        j        |z  }| j        j        || j        j        z  z   |z  }t          |d¦  «        t          |d¦  «        fS )uR   TÃ­nh toÃ¡n tá»�a Ä‘á»™ chuá»™t tuyá»‡t Ä‘á»‘i cá»§a icon dáº¥u cá»™ng slot_index.i8  g      ž@g     à�@r@   rA   é   )
r>   r=   r9   r2   r3   r4   r/   r0   r1   Úround)rF   r   ÚsxÚsyÚxÚys         r   Úget_icon_coordinatesz#GemAutoLeveler.get_icon_coordinatesP   s¸   € àŒ=˜DÒ Ð Ø” Ñ'ˆBØ” Ñ'ˆBØ”Ô-°Ñ2ˆAØ”Ô/°:ÀÄÔ@`Ñ3`ÑaÐegÑgˆAˆAà” Ñ'ˆBØ” Ñ'ˆBØ”Ô-°Ñ2ˆAØ”Ô/°:ÀÄÔ@`Ñ3`ÑaÐegÑgˆAå�Q˜‰{Œ{�E ! Q™KœKÐ'Ð'r   Únearest_monster_distancer    Ú	in_combatr&   Úis_safe_areaú"Tuple[bool, GemLevelUpStatus, str]c                óÆ   — |rdt           j        dfS |rdt           j        dfS || j        j        k    r!dt           j        d|d›d| j        j        › d�fS dt           j        d	fS )
uù   
        Kiá»ƒm tra báº¥t biáº¿n INV-GEM-LEVEL-SAFE-COMBAT:
        - Náº¿u á»Ÿ Hideout hoáº·c Town: luÃ´n an toÃ n 100%.
        - Náº¿u trong Map chiáº¿n Ä‘áº¥u: cáº¥m thÄƒng cáº¥p náº¿u Ä‘ang combat hoáº·c quÃ¡i váº­t á»Ÿ cá»± ly <= 30u.
        Tu+   An toÃ n tuyá»‡t Ä‘á»‘i trong Hideout/Town.FuK   HoÃ£n thÄƒng cáº¥p: NhÃ¢n váº­t Ä‘ang trong giao tranh (in_combat == True).u,   HoÃ£n thÄƒng cáº¥p: QuÃ¡i váº­t quÃ¡ gáº§n (z.1fzu <= zu).u/   Cá»± ly quÃ¡i váº­t an toÃ n ngoÃ i giao tranh.)r   r   r   r9   r+   r   )rF   rR   rS   rT   s       r   Úevaluate_safetyzGemAutoLeveler.evaluate_safety_   s°   € ð ð 	iØÕ)Ô9Ð;hÐhÐhàð 	àÝ Ô3Ø]ðð ð $ t¤{Ô'LÒLÐLàÝ Ô3ð MÐ?Wð  Mð  Mð  MÐbfÔbmô  cHð  Mð  Mð  Mðð ð Õ%Ô5Ð7hÐhÐhr   r   Úsimulated_countúList[GemPlusIconLocation]c                óì   — g }t          || j        j        ¦  «        }t          |¦  «        D ]G}|                      |¦  «        \  }}|                     t          |||d|dz   › �d¬¦  «        ¦  «         ŒH|S )uÁ   
        XÃ¡c Ä‘á»‹nh danh sÃ¡ch cÃ¡c icon dáº¥u cá»™ng thÄƒng cáº¥p ngá»�c Ä‘ang sáºµn sÃ ng.
        Há»— trá»£ cáº£ cháº¿ Ä‘á»™ phÃ¢n tÃ­ch quang há»�c vÃ  mÃ´ phá»�ng kiá»ƒm thá»­.
        Ú	Gem_Slot_rK   T)r   r!   r"   r%   r'   )Úminr9   r.   ÚrangerQ   Úappendr   )rF   rX   Úready_iconsÚcountÚslot_idxrO   rP   s          r   Údetect_ready_gemsz GemAutoLeveler.detect_ready_gems}   s›   € ð 24ˆÝ�O T¤[Ô%CÑDÔDˆå˜e™œð 	ð 	ˆHØ×,Ò,¨XÑ6Ô6‰DˆAˆqØ×ÒÕ2Ø#ØØØ3 X°¡\Ð3Ð3Øð ñ  ô  ñ ô ð ð ð Ðr   ç     8�@FTÚsimulated_ready_countÚnow_msúOptional[int]úDict[str, Any]c                ól  — |€#t          t          j        ¦   «         dz  ¦  «        }|| j        z
  | j        j        k     rt
          j        j        dddœS |                      |||¬¦  «        \  }}}|s|j        d|dœS |  	                    |¬¦  «        }	|	st
          j
        j        dddœS d}
g }|	D ]O}| j        r |                      |j        |j        ¦  «         |                     |j        |j        f¦  «         |
d	z  }
ŒP|| _        | xj        |
z  c_        t
          j        j        |
|| j        d
|
› d�dœS )uT   
        Thá»±c thi má»™t chu ká»³ thÄƒng cáº¥p ngá»�c ká»¹ nÄƒng an toÃ n.
        Niè  r   u.   Ä�ang trong thá»�i gian giÃ£n cÃ¡ch thao tÃ¡c.)ÚstatusÚgems_leveledÚreason)rR   rS   rT   )rX   u5   KhÃ´ng cÃ³ ngá»�c ká»¹ nÄƒng nÃ o cáº§n thÄƒng cáº¥p.rK   u   Ä�Ã£ thÄƒng cáº¥p thÃ nh cÃ´ng u    ngá»�c ká»¹ nÄƒng.)ri   rj   Úclicked_positionsÚtotal_all_timerk   )r   ÚtimerB   r9   r,   r   r   ÚvaluerW   rb   r   r;   r!   r"   r^   rC   r   )rF   rR   rS   rT   rd   re   Úis_saferi   rk   Ú
ready_gemsÚleveled_countÚclicked_coordsÚgems                r   Úprocess_leveling_cyclez%GemAutoLeveler.process_leveling_cycle”   s¢  € ð ˆ>Ý�œ™œ tÑ+Ñ,Ô,ˆFð �TÔ,Ñ,°´Ô0GÒGÐGå*Ô:Ô@Ø !ØJðð ð ð #'×"6Ò"6Ø%=ØØ%ð #7ñ #
ô #
Ñˆ�˜ð
 ð 	à œ,Ø !Ø ðð ð ð ×+Ò+Ð<QÐ+ÑRÔRˆ
Øð 	å*Ô8Ô>Ø !ØQðð ð ð ˆØˆØð 	ð 	ˆCØÔ"ð @Ø×#Ò# C¤L°#´,Ñ?Ô?Ð?Ø×!Ò! 3¤<°´Ð">Ñ?Ô?Ð?Ø˜QÑˆMˆMà"(ˆÔØÐÔ =Ñ0ÐÔõ 'Ô6Ô<Ø)Ø!/Ø"Ô5ØZ¸ÐZÐZÐZð
ð 
ð 	
r   Úis_in_combatÚmin_monster_distanceÚis_hideout_or_townÚready_slotsúOptional[List[int]]c                óŒ   — |                       ||||rt          |¦  «        nd¬¦  «        }|                     dd¦  «        |d<   |S )u<   Adapter tÆ°Æ¡ng thÃ­ch ngÆ°á»£c cho interface process_cycle.r   )rR   rS   rT   rd   rj   rr   )ru   ÚlenÚget)rF   rv   rw   rx   ry   Úress         r   Úprocess_cyclezGemAutoLeveler.process_cycleÔ   s[   € ð ×)Ò)Ø%9Ø"Ø+Ø6AÐ"H¥# kÑ"2Ô"2Ð"2Àqð	 *ñ 
ô 
ˆð  #Ÿwšw ~°qÑ9Ô9ˆˆOÑØˆ
r   )NNr7   r8   )r9   r:   r;   r<   r=   r   r>   r   )r   r   rH   rI   )rR   r    rS   r&   rT   r&   rH   rU   )r   )rX   r   rH   rY   )rc   FTr   N)rR   r    rS   r&   rT   r&   rd   r   re   rf   rH   rg   )Frc   TN)
rv   r&   rw   r    rx   r&   ry   rz   rH   rg   )
r   r   r   r   rG   rQ   rW   rb   ru   r   r   r   r   r6   r6   <   sã   € € € € € ØSÐSð .2ØCGØØðBð Bð Bð Bð Bð"(ð (ð (ð (ðið ið ið ið@  !ðð ð ð ð ð2 +0ØØ!Ø%&Ø $ð>
ð >
ð >
ð >
ð >
ðD #Ø&+Ø#'Ø+/ðð ð ð ð ð ð r   r6   )r   Ú
__future__r   rn   Údataclassesr   r   Úenumr   Útypingr   r   r	   r
   r   r   r$   r   r   r*   r6   r   r   r   ú<module>r„      sV  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ð0ð 0ð 0ð 0ð 0�s˜Dñ 0ô 0ð 0ð ðð ð ð ð ñ ô ñ „ðð ð'ð 'ð 'ð 'ð 'ñ 'ô 'ñ „ð'ðgð gð gð gð gñ gô gð gð gð gr   