§
    ýh®jõ0  ã                  óT   — d Z ddlmZ ddlZddlmZmZ ddlmZ  G d„ d¦  «        Z	dS )uA  AutoPOE2 - Map Clear Evaluator (Doc 69 Â§3.4 / Stage 5 In-Map - SSoT 2026).
================================================================================
Bá»™ tháº©m Ä‘á»‹nh tiÃªu chuáº©n hoÃ n táº¥t báº£n Ä‘á»“ tá»± hÃ nh chuáº©n thÆ°Æ¡ng máº¡i (V2):
- Báº¥t biáº¿n INV-MAP-LEGITIMATE-CLEAR-V2:
  Loáº¡i bá»� triá»‡t Ä‘á»ƒ hiá»‡n tÆ°á»£ng Ä‘Ã¡nh 1 con quÃ¡i hoáº·c vÃ o vÃ¹ng váº¯ng quÃ¡i rá»“i káº¿t luáº­n map clear.
  RÃ o cháº¯n Cáº¤M THOÃ�T Sá»šM (Anti-Premature-Exit Interlock):
  Báº£n Ä‘á»“ CHá»ˆ Ä�Æ¯á»¢C CÃ”NG NHáº¬N HOÃ€N Táº¤T khi thá»�a mÃ£n Ä�á»’NG THá»œI cáº£ 3 trá»¥ cá»™t báº¯t buá»™c:
    1. Trá»¥ cá»™t 1 (Duration Gate): Thá»�i gian á»Ÿ trong map >= min_duration_sec (máº·c Ä‘á»‹nh 90s).
    2. Trá»¥ cá»™t 2 (Traverse Distance Gate): QuÃ£ng Ä‘Æ°á»�ng tuáº§n tra thá»±c táº¿ >= min_traverse_units (máº·c Ä‘á»‹nh 1200u).
    3. Trá»¥ cá»™t 3 (Objective Completion Gate): Ä�áº¡t Ã­t nháº¥t 1 trong 2 má»¥c tiÃªu:
       - Boss Slain: Map Boss Ä‘Ã£ bá»‹ tiÃªu diá»‡t.
       - Fog Coverage: Tá»· lá»‡ má»Ÿ sÆ°Æ¡ng mÃ¹ Minimap >= target_coverage (máº·c Ä‘á»‹nh 80%).

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 file < 500 dÃ²ng.
- Rule 5: 100% dá»¯ liá»‡u telemetry vÃ  quang há»�c tháº­t.
- Báº¥t biáº¿n: INV-MAP-LEGITIMATE-CLEAR-V2, INV-WASD-NO-BLIND-LMB.
é    )ÚannotationsN)ÚOptionalÚTuple)ÚMonsterDensityHeatmapc                  óZ   — e Zd ZdZ	 	 	 	 	 d'd(d„Zd)d„Z	 	 d*d+d„Z	 	 	 d,d-d!„Z	 	 d.d/d&„ZdS )0ÚMapClearEvaluatoru  Bá»™ tháº©m Ä‘á»‹nh tiÃªu chÃ­ hoÃ n táº¥t map chuáº©n thÆ°Æ¡ng máº¡i cho Stage 5 (V2 SSoT 2026).

    Báº¥t biáº¿n INV-MAP-LEGITIMATE-CLEAR-V2:
    Loáº¡i bá»� triá»‡t Ä‘á»ƒ hiá»‡n tÆ°á»£ng Ä‘Ã¡nh 1 Ä‘Ã n quÃ¡i nhá»� Ä‘áº§u map rá»“i káº¿t luáº­n map clear.
    ç     €V@çš™™™™™é?ç     À’@é   NÚmin_duration_secÚfloatÚtarget_coverageÚmin_traverse_unitsÚmin_required_packsÚintÚdensity_heatmapúOptional[MonsterDensityHeatmap]ÚreturnÚNonec                ó    — || _         || _        || _        || _        || _        d| _        d| _        d| _        d| _        d| _	        d| _
        dS )u’  Khá»Ÿi táº¡o bá»™ tháº©m Ä‘á»‹nh hoÃ n táº¥t báº£n Ä‘á»“ V2.

        Args:
            min_duration_sec: Thá»�i lÆ°á»£ng tá»‘i thiá»ƒu nhÃ¢n váº­t pháº£i á»Ÿ trong map (máº·c Ä‘á»‹nh 90s).
            target_coverage: NgÆ°á»¡ng diá»‡n tÃ­ch má»Ÿ sÆ°Æ¡ng Minimap tá»‘i thiá»ƒu (máº·c Ä‘á»‹nh 80% / 0.80).
            min_traverse_units: Tá»•ng quÃ£ng Ä‘Æ°á»�ng di chuyá»ƒn tá»‘i thiá»ƒu cá»§a nhÃ¢n váº­t (máº·c Ä‘á»‹nh 1200u).
            min_required_packs: Sá»‘ bÃ£i quÃ¡i tá»‘i thiá»ƒu pháº£i cháº¡m trÃ¡n (máº·c Ä‘á»‹nh 4 bÃ£i).
            density_heatmap: Báº£n Ä‘á»“ nhiá»‡t máº­t Ä‘á»™ quÃ¡i váº­t theo dÃµi phÃ¢n bá»‘ khÃ´ng gian vÃ  Boss.
        ç        NFr   )r   r   r   r   r   Útotal_distance_traversedÚlast_posÚlast_coverage_ratioÚ
boss_slainÚpacks_encounteredÚquiet_start_time)Úselfr   r   r   r   r   s         úIC:\Projects\AutoPOE2\src\assistant_tool\navigation\map_clear_evaluator.pyÚ__init__zMapClearEvaluator.__init__$   s`   € ð" !1ˆÔØ.ˆÔØ"4ˆÔØ"4ˆÔØ.ˆÔà/2ˆÔ%Ø7;ˆŒØ*-ˆÔ Ø %ˆŒØ&'ˆÔØ15ˆÔÐÐó    c                óž   — d| _         d| _        d| _        d| _        d| _        d| _        | j        �| j                             ¦   «          dS dS )u0   Ä�áº·t láº¡i tráº¡ng thÃ¡i cho phiÃªn map má»›i.r   NFr   )r   r   r   r   r   r   r   Úreset)r   s    r    r$   zMapClearEvaluator.resetB   s\   € à(+ˆÔ%ØˆŒØ#&ˆÔ ØˆŒØ!"ˆÔØ $ˆÔØÔÐ+ØÔ ×&Ò&Ñ(Ô(Ð(Ð(Ð(ð ,Ð+r"   ç      ð?FÚboss_bar_detectedÚboolÚhealth_ratioÚ	is_phasedc                ó¢   — | j         �4| j                              |||¬¦  «         | j         j        r	d| _        dS dS |r|dk    rd| _        dS dS dS )uv  Cáº­p nháº­t dá»¯ liá»‡u thá»‹ giÃ¡c vá»� thanh mÃ¡u Boss tá»« BossArenaDetector.

        Args:
            boss_bar_detected: True náº¿u phÃ¡t hiá»‡n thanh mÃ¡u Boss trÃªn Ä‘á»‰nh mÃ n hÃ¬nh.
            health_ratio: Tá»· lá»‡ mÃ¡u cÃ²n láº¡i cá»§a Boss (0.0 .. 1.0).
            is_phased: True náº¿u Boss Ä‘ang chuyá»ƒn pha hoáº·c miá»…n nhiá»…m sÃ¡t thÆ°Æ¡ng.
        N)r&   r(   r)   Tg{®Gáz”?)r   Úupdate_optical_boss_statusÚboss_slain_opticalr   )r   r&   r(   r)   s       r    r+   z,MapClearEvaluator.update_optical_boss_statusM   sˆ   € ð ÔÐ+ØÔ ×;Ò;Ø"3Ø)Ø#ð <ñ ô ð ð
 Ô#Ô6ð 'Ø"&�”��ð'ð 'àð 	# <°4Ò#7Ð#7Ø"ˆDŒOˆOˆOð	#ð 	#Ð#7Ð#7r"   r   Úpos_xÚpos_yÚmonsters_nearÚcoverage_ratior   Únow_secc                ób  — | j         �a|dk    s|dk    rU|| j         d         z
  }|| j         d         z
  }t          j        ||¦  «        }	d|	cxk    rdk    rn n| xj        |	z  c_        |dk    s|dk    r	||f| _         || j        k    r|| _        |rd| _        |dk    r| xj        dz  c_        d| _        n|dk    r|dk    r| j        €|| _        | j        �W| j         	                    ||||¬¦  «         | j        j
        rd| _        t          | j        | j        j        ¦  «        | _        dS dS )	u`  Cáº­p nháº­t dá»¯ liá»‡u tráº¯c viá»…n thá»�i gian thá»±c tá»« game vÃ  cáº£m biáº¿n.

        Args:
            pos_x: Tá»�a Ä‘á»™ X cá»§a ngÆ°á»�i chÆ¡i trong world coordinates.
            pos_y: Tá»�a Ä‘á»™ Y cá»§a ngÆ°á»�i chÆ¡i trong world coordinates.
            monsters_near: Sá»‘ lÆ°á»£ng quÃ¡i váº­t sá»‘ng trong bong bÃ³ng hiá»ƒn thá»‹ cá»¥c bá»™.
            coverage_ratio: Tá»· lá»‡ diá»‡n tÃ­ch sÆ°Æ¡ng mÃ¹ Ä‘Ã£ má»Ÿ (0.0 .. 1.0).
            boss_slain: True náº¿u phÃ¡t hiá»‡n tÃ­n hiá»‡u Boss báº£n Ä‘á»“ Ä‘Ã£ bá»‹ háº¡ gá»¥c.
            now_sec: Timestamp hiá»‡n táº¡i (giÃ¢y).
        Nr   r   é   g      à?g      ‰@T)Úplayer_xÚplayer_yr/   r1   )r   ÚmathÚhypotr   r   r   r   r   r   Úrecord_telemetry_framer,   ÚmaxÚtotal_packs_count)
r   r-   r.   r/   r0   r   r1   ÚdxÚdyÚdists
             r    Úupdate_telemetryz"MapClearEvaluator.update_telemetrye   s“  € ð( Œ=Ð$¨%°3ª,¨,¸%À3º,¸,Ø˜œ qÔ)Ñ)ˆBØ˜œ qÔ)Ñ)ˆBÝ”:˜b "Ñ%Ô%ˆDð �dÐ#Ð#Ò#Ð#˜eÒ#Ð#Ð#Ð#Ð#ØÐ-Ô-°Ñ5Ð-Ô-à�CŠ<ˆ<˜5 Cš<˜<Ø" E˜NˆDŒMð ˜DÔ4Ò4Ð4Ø'5ˆDÔ$ð ð 	#Ø"ˆDŒOð ˜AÒÐØÐ"Ô" aÑ'Ð"Ô"Ø$(ˆDÔ!Ð!Ø˜aÒÐ G¨c¢M MØÔ$Ð,Ø(/�Ô%ð ÔÐ+ØÔ ×7Ò7ØØØ+Øð	 8ñ ô ð ð Ô#Ô6ð 'Ø"&�”Ý%(¨Ô)?ÀÔAUÔAgÑ%hÔ%hˆDÔ"Ð"Ð"ð ,Ð+r"   Úelapsed_secÚcore_lifecycle_stateúOptional[int]úTuple[bool, str]c                ó”  — || j         k     rdS | j        | j        k     rdS | j        �'| j                             | j        ¦  «        \  }}|sdS n| j        | j        k     rdS | j        p| j        | j	        k    }|sdS d}d}|||fv }	| j        r?|	rd|› d�nd}
dd	t          |¦  «        › d
| j        d›d| j        d›d| j        dz  d›d|
› �
fS | j        | j	        k    rmd}| j        �|dk    r|| j        z
  dk    rd}|	rd|› d�nd}
dd| j        dz  d›d| j	        dz  d›dt          |¦  «        › d| j        d›d| j        d›d|› d|
› �fS dS )ub  Tháº©m Ä‘á»‹nh xem báº£n Ä‘á»“ Ä‘Ã£ thá»±c sá»± hoÃ n táº¥t hay chÆ°a (INV-MAP-LEGITIMATE-CLEAR-V2).

        RÃ o cháº¯n Cáº¤M THOÃ�T Sá»šM: Báº®T BUá»˜C THá»ŽA MÃƒN Ä�á»’NG THá»œI CÃ�C TRá»¤ Cá»˜T:
          1. Thá»�i gian á»Ÿ trong map >= min_duration_sec (>= 90s)
          2. QuÃ£ng Ä‘Æ°á»�ng tuáº§n tra thá»±c táº¿ >= min_traverse_units (>= 1200u)
          3. Tháº©m Ä‘á»‹nh bÃ£i quÃ¡i há»£p lá»‡ >= min_required_packs (>= 4 bÃ£i hoáº·c >= 25 kills)
          4. Má»¥c tiÃªu cá»‘t lÃµi: (Má»Ÿ sÆ°Æ¡ng Minimap >= target_coverage HOáº¶C Boss Slain)

        Args:
            elapsed_sec: Thá»�i gian Ä‘Ã£ trÃ´i qua ká»ƒ tá»« khi vÃ o map (giÃ¢y).
            core_lifecycle_state: Tráº¡ng thÃ¡i CharacterLifecycleState tá»« C++ Core SHM.
            now_sec: Timestamp hiá»‡n táº¡i.

        Returns:
            Tuple[bool, str]: (is_cleared, reason)
        )FÚ Né	   é   z (Core State=ú)rD   Tu$   Map Boss Ä‘Ã£ bá»‹ tiÃªu diá»‡t sau u    s (QuÃ£ng Ä‘Æ°á»�ng tuáº§n tra: z.0fzu >= u   u, SÆ°Æ¡ng má»Ÿ: éd   z.1fz%)r   g      9@u%    vÃ  khu vá»±c hoÃ n toÃ n yÃªn áº¯ngu!   Minimap Ä‘Ã£ má»Ÿ sÆ°Æ¡ng Ä‘áº¡t z% (>= z%) sau u   s (QuÃ£ng Ä‘Æ°á»�ng: Úu)r   r   r   r   Úis_clearing_legitimater   r   r   r   r   r   r   )r   r?   r@   r1   Úis_legitÚ_Úhas_objectiveÚMAP_COMPLETED_PORTAL_OUTÚIN_MAP_PORTAL_EXITÚcore_confirmedÚ	core_noteÚ
quiet_notes               r    Úevaluate_clearz MapClearEvaluator.evaluate_clear¢   s€  € ð2 ˜Ô.Ò.Ð.Ø�9ð Ô(¨4Ô+BÒBÐBØ�9ð ÔÐ+ØÔ.×EÒEÀdÔF]Ñ^Ô^‰KˆH�aØð !Ø �yð!ð Ô%¨Ô(?Ò?Ð?Ø �yð œÐ]¨DÔ,DÈÔH\Ò,\ˆØð 	Ø�9ð
 $%Ð ØÐØ-Ð2JÐL^Ð1_Ð_ˆð Œ?ð 	ØCQÐYÐ?Ð(<Ð?Ð?Ð?Ð?ÐWYˆIàðQµs¸;Ñ7GÔ7Gð Qð QØ15Ô1NÐyðQð QØY]ÔYpÐyðQð Qà!%Ô!9¸#Ñ!=ÐPðQð QàENðQð Qðð ð Ô# tÔ';Ò;Ð;ØˆJàÔ%Ð1Ø˜c’M�MØ˜tÔ4Ñ4¸Ò<Ð<àD�
àCQÐYÐ?Ð(<Ð?Ð?Ð?Ð?ÐWYˆIàðE°DÔ4LÈSÑ4PÐXð Eð EØÔ+¨CÑ/ÐPðEð EÝ<?ÀÑ<LÔ<LðEð Eà&*Ô&Cð  EðEð EàNRÔNeð  EðEð EàlvðEð Eð zCðEð Eðð ð ˆyr"   )r	   r
   r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   )r   r   )r%   F)r&   r'   r(   r   r)   r'   r   r   )r   Fr   )r-   r   r.   r   r/   r   r0   r   r   r'   r1   r   r   r   )Nr   )r?   r   r@   rA   r1   r   r   rB   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r$   r+   r>   rS   © r"   r    r   r      sÏ   € € € € € ðð ð #'Ø!%Ø$*Ø"#Ø;?ð6ð 6ð 6ð 6ð 6ð<	)ð 	)ð 	)ð 	)ð "Øð	#ð #ð #ð #ð #ð: !$Ø Øð;ið ;ið ;ið ;ið ;ið@ /3Øð	\ð \ð \ð \ð \ð \ð \r"   r   )
rW   Ú
__future__r   r6   Útypingr   r   Ú5src.assistant_tool.navigation.monster_density_heatmapr   r   rX   r"   r    ú<module>r\      s’   ððð ð( #Ð "Ð "Ð "Ð "Ð "à €€€Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à WÐ WÐ WÐ WÐ WÐ Wðað að að að añ aô að að að ar"   