§
    åh®j³&  ã                  ó¢   — d Z ddlmZ ddlmZmZ ddlZddlZddlm	Z	m
Z
mZmZmZmZ ddlZe G d„ d¦  «        ¦   «         Z G d„ d	¦  «        ZdS )
uÍ  AutoPOE2 - Monster Density Heatmap & Encounter Tracker (Doc 69 Â§3.4 / Stage 5).
================================================================================
Module quáº£n trá»‹ báº£n Ä‘á»“ nhiá»‡t máº­t Ä‘á»™ quÃ¡i váº­t vÃ  lá»‹ch sá»­ giao tranh trong Map:
- PhÃ¢n tÃ­ch khÃ´ng gian 2D theo cÃ¡c sector (100u x 100u) Ä‘á»ƒ theo dÃµi cÃ¡c bÃ£i quÃ¡i (Monster Packs).
- Ä�o Ä‘áº¡c sá»‘ lÆ°á»£ng quÃ¡i váº­t Ä‘Ã£ cháº¡m trÃ¡n, sá»‘ lÆ°á»£ng Ä‘Ã£ tiÃªu diá»‡t vÃ  sá»‘ bÃ£i quÃ¡i Ä‘á»™c láº­p (Pack Count).
- NgÄƒn cháº·n triá»‡t Ä‘á»ƒ hiá»‡n tÆ°á»£ng tháº©m Ä‘á»‹nh sai: Ä�Ã¡nh 1 con quÃ¡i rá»“i káº¿t luáº­n map Ä‘Ã£ dá»�n sáº¡ch.
- TÃ­ch há»£p vá»›i BossArenaDetector theo dÃµi tÃ¬nh tráº¡ng thanh mÃ¡u Boss trÃªn Ä‘á»‰nh mÃ n hÃ¬nh.

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 1: Python 3.11 Cold Path Tier 2.
- Rule 4: Module hÃ³a Ä‘á»™c láº­p tráº§n < 500 dÃ²ng.
- Rule 16: Google Docstrings chuáº©n má»±c.
- Báº¥t biáº¿n: INV-MAP-LEGITIMATE-CLEAR, INV-WASD-NO-BLIND-LMB.
é    )Úannotations)Ú	dataclassÚfieldN)ÚAnyÚDictÚListÚOptionalÚSetÚTuplec                  ó^   — 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Zded<   dS )ÚMonsterPackEncounteru@   Báº£n ghi cháº¡m trÃ¡n má»™t bÃ£i quÃ¡i váº­t trong báº£n Ä‘á»“.ÚintÚpack_idzTuple[float, float]Ú
center_posÚinitial_countÚcurrent_countÚfloatÚfirst_seen_timeÚlast_seen_timeFÚboolÚ
is_clearedN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   © ó    úMC:\Projects\AutoPOE2\src\assistant_tool\navigation\monster_density_heatmap.pyr   r      sn   € € € € € € àJÐJØ€L€L�LØ#Ð#Ð#Ñ#ØÐÐÑØÐÐÑØÐÐÑØÐÐÑØ€JÐÐÐÑÐÐr   r   c                  óž   — e Zd ZdZ	 	 	 d'd(d„Zd)d„Zd*d„Z	 d+d,d„Z	 	 d-d.d„Ze	d/d„¦   «         Z
e	d/d „¦   «         Ze	d/d!„¦   «         Zd0d1d%„Zd&S )2ÚMonsterDensityHeatmapu\   Quáº£n trá»‹ báº£n Ä‘á»“ nhiá»‡t máº­t Ä‘á»™ quÃ¡i váº­t vÃ  lá»‹ch sá»­ tuáº§n tra Stage 5.ç      Y@é   ç      T@Úsector_sizer   Úmin_pack_monstersr   Úpack_merge_radiusÚreturnÚNonec                óÆ   — || _         || _        || _        i | _        t	          ¦   «         | _        g | _        d| _        d| _        d| _	        d| _
        g | _        d| _        dS )uQ  Khá»Ÿi táº¡o Monster Density Heatmap.

        Args:
            sector_size: KÃ­ch thÆ°á»›c má»—i Ã´ khÃ´ng gian sector (PoE units).
            min_pack_monsters: Sá»‘ quÃ¡i tá»‘i thiá»ƒu Ä‘á»ƒ coi lÃ  má»™t bÃ£i quÃ¡i há»£p lá»‡.
            pack_merge_radius: BÃ¡n kÃ­nh gá»™p cÃ¡c quÃ¡i váº­t vÃ o cÃ¹ng má»™t bÃ£i (units).
        r   FN)r%   r&   r'   ÚsectorsÚsetÚvisited_sectorsÚpacksÚtotal_monsters_encounteredÚtotal_monsters_eliminatedÚlast_monster_countÚboss_detectedÚboss_health_historyÚboss_slain_optical)Úselfr%   r&   r'   s       r   Ú__init__zMonsterDensityHeatmap.__init__)   sn   € ð 'ˆÔØ!2ˆÔØ!2ˆÔà35ˆŒÝ58±U´UˆÔØ13ˆŒ
Ø/0ˆÔ'Ø./ˆÔ&Ø'(ˆÔð $)ˆÔØ02ˆÔ Ø(-ˆÔÐÐr   c                ó  — | j                              ¦   «          | j                             ¦   «          | j                             ¦   «          d| _        d| _        d| _        d| _        | j                             ¦   «          d| _	        dS )u6   Ä�áº·t láº¡i báº£n Ä‘á»“ nhiá»‡t cho phiÃªn map má»›i.r   FN)
r+   Úclearr-   r.   r/   r0   r1   r2   r3   r4   ©r5   s    r   ÚresetzMonsterDensityHeatmap.resetF   s‚   € àŒ×ÒÑÔÐØÔ×"Ò"Ñ$Ô$Ð$ØŒ
×ÒÑÔÐØ*+ˆÔ'Ø)*ˆÔ&Ø"#ˆÔØ"ˆÔØÔ ×&Ò&Ñ(Ô(Ð(Ø"'ˆÔÐÐr   ÚwxÚwyúTuple[int, int]c                ó¦   — t          t          j        || j        z  ¦  «        ¦  «        t          t          j        || j        z  ¦  «        ¦  «        fS )uA   Chuyá»ƒn Ä‘á»•i tá»�a Ä‘á»™ tháº¿ giá»›i sang tá»�a Ä‘á»™ sector.)r   ÚmathÚfloorr%   )r5   r;   r<   s      r   Úget_sector_coordz&MonsterDensityHeatmap.get_sector_coordR   sA   € å•D”J˜r DÔ$4Ñ4Ñ5Ô5Ñ6Ô6½½D¼JÀrÈDÔL\ÑG\Ñ<]Ô<]Ñ8^Ô8^Ð_Ð_r   ç        Úplayer_xÚplayer_yÚmonsters_nearÚnow_secc           	     ó   — |dk    rt          j         ¦   «         }|dk    s|dk    r0|                      ||¦  «        }| j                             |¦  «         || j        k     r| j        |z
  }| xj        |z  c_        || j        k    �r|dk    s|dk    r÷|                      ||¦  «        }| j                             |d¦  «        |z   | j        |<   d}| j	        D ]I}t          j        ||j        d         z
  ||j        d         z
  ¦  «        }	|	| j        k    r|j        s|} nŒJ|�||_        ||_        nWt#          t%          | j	        ¦  «        dz   ||f||||d¬¦  «        }
| j	                             |
¦  «         | xj        |z  c_        |dk    rg|dk    s|dk    r[| j	        D ]S}|j        sJt          j        ||j        d         z
  ||j        d         z
  ¦  «        }	|	| j        k    rd|_        d|_        ŒT|| _        dS )u‰  Ghi nháº­n dá»¯ liá»‡u vá»‹ trÃ­ ngÆ°á»�i chÆ¡i vÃ  sá»‘ lÆ°á»£ng quÃ¡i váº­t cáº­n chiáº¿n.

        Args:
            player_x: Tá»�a Ä‘á»™ X tháº¿ giá»›i cá»§a ngÆ°á»�i chÆ¡i.
            player_y: Tá»�a Ä‘á»™ Y tháº¿ giá»›i cá»§a ngÆ°á»�i chÆ¡i.
            monsters_near: Sá»‘ lÆ°á»£ng quÃ¡i váº­t sá»‘ng quanh ngÆ°á»�i chÆ¡i.
            now_sec: Timestamp hiá»‡n táº¡i (giÃ¢y).
        rB   r   Né   F)r   r   r   r   r   r   r   T)ÚtimerA   r-   Úaddr1   r0   r&   r+   Úgetr.   r?   Úhypotr   r'   r   r   r   r   ÚlenÚappendr/   )r5   rC   rD   rE   rF   Úp_secÚkilledÚmatched_packÚpÚdistÚnew_packs              r   Úrecord_telemetry_framez,MonsterDensityHeatmap.record_telemetry_frameV   sM  € ð �cŠ>ˆ>Ý”i‘k”kˆGà�sŠ?ˆ?˜h¨#šo˜oØ×)Ò)¨(°HÑ=Ô=ˆEØÔ ×$Ò$ UÑ+Ô+Ð+ð ˜4Ô2Ò2Ð2ØÔ,¨}Ñ<ˆFØÐ*Ô*¨fÑ4Ð*Ô*ð ˜DÔ2Ò2Ñ2¸ÀCº¸È8ÐWZÊ?È?à×)Ò)¨(°HÑ=Ô=ˆEØ"&¤,×"2Ò"2°5¸!Ñ"<Ô"<¸}Ñ"LˆDŒL˜Ñð <@ˆLØ”Zð ð �Ý”z (¨Q¬\¸!¬_Ñ"<¸hÈÌÐVWÌÑ>XÑYÔY�Ø˜4Ô1Ò1Ð1¸!¼,Ð1Ø#$�LØ�EøàÐ'Ø-:�Ô*Ø.5�Ô+Ð+õ 0Ý ¤
™OœO¨aÑ/Ø (¨(Ð3Ø"/Ø"/Ø$+Ø#*Ø$ðñ ô �ð ”
×!Ò! (Ñ+Ô+Ð+ØÐ/Ô/°=Ñ@Ð/Ô/ð ˜AÒÐ 8¨s¢? ?°hÀ#²o°oØ”Zð ,ð ,�Ø”|ð ,Ýœ: h°´¸a´Ñ&@À(ÈQÌ\ÐZ[Ì_ÑB\Ñ]Ô]�DØ˜tÔ5Ò5Ð5Ø*+˜œØ'+˜œøà"/ˆÔÐÐr   ç      ð?FÚboss_bar_detectedr   Úhealth_ratioÚ	is_phasedc                óú   — |r2d| _         | j                             |¦  «         |dk    r	d| _        dS dS | j         r;t	          | j        ¦  «        dk    r%t          | j        ¦  «        }|dk    rd| _        dS dS dS dS )un  Cáº­p nháº­t dá»¯ liá»‡u thá»‹ giÃ¡c vá»� thanh mÃ¡u Boss tá»« BossArenaDetector.

        Args:
            boss_bar_detected: True náº¿u camera phÃ¡t hiá»‡n thanh mÃ¡u Boss trÃªn Ä‘á»‰nh mÃ n hÃ¬nh.
            health_ratio: Tá»· lá»‡ mÃ¡u Boss cÃ²n láº¡i (0.0 .. 1.0).
            is_phased: True náº¿u Boss Ä‘ang chuyá»ƒn pha / dá»±ng khiÃªn báº¥t tá»­.
        Tg{®Gáz”?r#   g      Ð?N)r2   r3   rN   r4   rM   Úmin)r5   rW   rX   rY   Ú
min_healths        r   Úupdate_optical_boss_statusz0MonsterDensityHeatmap.update_optical_boss_status›   s­   € ð ð 	3Ø!%ˆDÔØÔ$×+Ò+¨LÑ9Ô9Ð9à˜tÒ#Ð#Ø*.�Ô'Ð'Ð'ð $Ð#ð Ô!ð 3¥c¨$Ô*BÑ&CÔ&CÀqÒ&HÐ&HÝ  Ô!9Ñ:Ô:�
Ø Ò%Ð%Ø.2�DÔ+Ð+Ð+ð3ð 3Ð&HÐ&Hà%Ð%r   c                ó*   — t          | j        ¦  «        S )u6   Tá»•ng sá»‘ bÃ£i quÃ¡i Ä‘á»™c láº­p Ä‘Ã£ cháº¡m trÃ¡n.)rM   r.   r9   s    r   Útotal_packs_countz'MonsterDensityHeatmap.total_packs_countµ   s   € õ �4”:‰ŒÐr   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )u'   Sá»‘ bÃ£i quÃ¡i Ä‘Ã£ bá»‹ dá»�n sáº¡ch.c              3  ó(   K  — | ]}|j         ¯	d V — ŒdS )rH   N)r   )Ú.0rR   s     r   ú	<genexpr>z<MonsterDensityHeatmap.cleared_packs_count.<locals>.<genexpr>½   s)   è è € Ð9Ð9˜¨A¬LÐ9�1Ð9Ð9Ð9Ð9Ð9Ð9r   )Úsumr.   r9   s    r   Úcleared_packs_countz)MonsterDensityHeatmap.cleared_packs_countº   s#   € õ Ð9Ð9˜dœjÐ9Ñ9Ô9Ñ9Ô9Ð9r   c                ó*   — t          | j        ¦  «        S )u8   Sá»‘ sector khÃ´ng gian nhÃ¢n váº­t Ä‘Ã£ tuáº§n tra qua.)rM   r-   r9   s    r   Úvisited_sector_countz*MonsterDensityHeatmap.visited_sector_count¿   s   € õ �4Ô'Ñ(Ô(Ð(r   é   Úmin_required_packsúTuple[bool, str]c           
     ó  — | j         |k     r8| j        dk    rdd| j        › d| j        › d�fS dd| j         › d|› d	| j        › d
�fS | j        }||k    r dd|› d| j         › d| j        › d| j        › d�	fS dd| j         › d|› d| j        › d�fS )u.  Tháº©m Ä‘á»‹nh tÃ­nh há»£p lá»‡ cá»§a quÃ¡ trÃ¬nh dá»�n quÃ¡i (khÃ¡ng lá»—i Ä‘Ã¡nh 1 quÃ¡i rá»“i dá»«ng).

        Args:
            min_required_packs: Sá»‘ bÃ£i quÃ¡i tá»‘i thiá»ƒu pháº£i cháº¡m trÃ¡n (máº·c Ä‘á»‹nh 4 bÃ£i).

        Returns:
            Tuple[bool, str]: (is_legit, reason)
        é   Tu   Ä�Ã£ tiÃªu diá»‡t u    quÃ¡i váº­t (>= 25 quÃ¡i qua z	 sectors)FuJ   ChÆ°a Ä‘áº¡t yÃªu cáº§u tá»‘i thiá»ƒu sá»‘ bÃ£i quÃ¡i: má»›i cháº¡m trÃ¡n ú/u    bÃ£i (Tá»•ng tiÃªu diá»‡t: u    quÃ¡i)u   Ä�Ã£ dá»�n sáº¡ch u"    bÃ£i quÃ¡i (Tá»•ng tiÃªu diá»‡t: u    quÃ¡i qua u   Ä�Ã£ giao tranh vá»›i u    bÃ£i quÃ¡i (u    bÃ£i Ä‘Ã£ dá»�n, u    quÃ¡i Ä‘Ã£ háº¡))r_   r0   rg   re   )r5   ri   Úcleareds      r   Úis_clearing_legitimatez,MonsterDensityHeatmap.is_clearing_legitimateÄ   sr  € ð Ô!Ð$6Ò6Ð6ØÔ-°Ò3Ð3àð L¨Ô)Gð  Lð  LÐgkô  hAð  Lð  Lð  Lðð ð
 ðQÐ]aÔ]sð Qð Qð  wIð Qð QØ)-Ô)GðQð Qð Qðð ð Ô*ˆØÐ(Ò(Ð(àðy Wð yð y¨tÔ/Eð yð yØ)-Ô)Gðyð yØTXÔTmðyð yð yðð ð ð] TÔ%;ð ]ð ]Øð]ð ]Ø+/Ô+Ið]ð ]ð ]ð
ð 	
r   N)r"   r#   r$   )r%   r   r&   r   r'   r   r(   r)   )r(   r)   )r;   r   r<   r   r(   r=   )rB   )
rC   r   rD   r   rE   r   rF   r   r(   r)   )rV   F)rW   r   rX   r   rY   r   r(   r)   )r(   r   )rh   )ri   r   r(   rj   )r   r   r   r   r6   r:   rA   rU   r]   Úpropertyr_   re   rg   ro   r   r   r   r!   r!   &   s(  € € € € € ØfÐfð #Ø!"Ø#'ð	.ð .ð .ð .ð .ð:
(ð 
(ð 
(ð 
(ð`ð `ð `ð `ð ðC0ð C0ð C0ð C0ð C0ðP "Øð	3ð 3ð 3ð 3ð 3ð4 ðð ð ñ „Xðð ð:ð :ð :ñ „Xð:ð ð)ð )ð )ñ „Xð)ð#
ð #
ð #
ð #
ð #
ð #
ð #
r   r!   )r   Ú
__future__r   Údataclassesr   r   r?   rI   Útypingr   r   r   r	   r
   r   ÚnumpyÚnpr   r!   r   r   r   ú<module>rv      sù   ððð ð #Ð "Ð "Ð "Ð "Ð "à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø €€€Ø €€€Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8à Ð Ð Ð ð ðð ð ð ð ñ ô ñ „ððA
ð A
ð A
ð A
ð A
ñ A
ô A
ð A
ð A
ð A
r   