§
    éÿ­jÏR  ã                   ó’  — d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	m
Z
mZmZ 	 ddlZn# e$ r 	 ddlZn# e$ r dZY nw xY wY nw xY wddlmZmZ ddlmZmZmZ dZdZd	Ze G d
„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )uŒ  
AutoPOE2 - Atlas Node Selector & Precursor Tower Orchestrator (Doc 56)
======================================================================
Tier 2 (Cold Path 1-10Hz Python Companion):
- AtlasPerceptionEngine: Nháº­n diá»‡n vÃ¹ng giao diá»‡n Atlas, Map Nodes, Bonus Stars vÃ  ThÃ¡p Dáº«n Ä�Æ°á»�ng.
- AtlasStrategyPlanner: Hoáº¡ch Ä‘á»‹nh chiáº¿n lÆ°á»£c chá»�n Node theo whitelist vÃ  náº¡p Precursor Tablet.
- AtlasNodeSelector: Ä�iá»�u phá»‘i vÃ  gá»­i lá»‡nh SELECT_ATLAS_NODE (OpCode 9) qua SPSC Ring Buffer.

TuÃ¢n thá»§ báº¥t biáº¿n kiáº¿n trÃºc:
- INV-ATLAS-01: Safe Hideout Execution (chá»‰ kÃ­ch hoáº¡t táº¡i Hideout/Town, khÃ´ng cÃ³ quÃ¡i váº­t).
- INV-ATLAS-02: Verified Node Target & Hover Confirmation (kiá»ƒm tra hover delay).
- INV-ATLAS-03: Zero Hot-Path Blocking (< 8.33ms, toÃ n bá»™ nháº­n diá»‡n cháº¡y táº¡i Tier 2).
- INV-ATLAS-04: Zero Wishful Thinking (xÃ¡c minh thá»±c nghiá»‡m).
é    N)Ú	dataclassÚfield)ÚAnyÚDictÚListÚOptionalÚTuple)ÚCoreShmBridgeÚMacroOpCode)ÚAtlasKnowledgeBaseÚAtlasNodeTypeÚAtlasNodeProfileé   é   é   c                   ó–   — e Zd ZU eed<   eed<   eed<   eed<   dZeed<   dZ	eed<   dZ
eed	<   d
Zeed<   ej        Zeed<   dZeed<   dS )Ú	AtlasNodeÚnameÚtierÚscreen_xÚscreen_yFÚbonus_completedTÚis_reachableÚ
is_citadelr   Únode_idÚ	node_typeÚis_quest_nodeN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__ÚintÚfloatr   Úboolr   r   r   r   ÚREGULAR_WAYSTONE_MAPr   r   © ó    ú>C:\Projects\AutoPOE2\src\assistant_tool\atlas_node_selector.pyr   r   (   s™   € € € € € € à
€I€I�IØ
€I€I�IØ€O€O�OØ€O€O�OØ!€O�TÐ!Ð!Ñ!Ø€L�$ÐÐÑØ€J�ÐÐÑØ€GˆSÐÐÑØ,ÔA€Iˆ}ÐAÐAÑAØ€M�4ÐÐÑÐÐr(   r   c                   óN   — e Zd ZU eed<   eed<   dZeed<   dZeed<   dZeed<   d	S )
ÚPrecursorTowerr   r   r   Úempty_socketsé   Úmax_socketsr   Útower_idN)	r   r   r    r$   r"   r,   r#   r.   r/   r'   r(   r)   r+   r+   6   sT   € € € € € € à€O€O�OØ€O€O�OØ€M�3ÐÐÑØ€K�ÐÐÑØ€HˆcÐÐÑÐÐr(   r+   c                   ó  — e Zd ZU dZeed<   dZeed<   dZeed<   dZ	e
ed<   dZe
ed	<   dZe
ed
<    ed„ ¬¦  «        Zee         ed<    ed„ ¬¦  «        Zee         ed<   dZe
ed<   dZeed<   dZeed<    ed„ ¬¦  «        Zee         ed<   dS )ÚAtlasStrategyConfigÚfarm_whitelistÚmodeé   Úmin_tieré   Úmax_tierTÚprioritize_uncompleted_bonusÚauto_engage_citadelsÚauto_engage_questsc                  ó
   — g d¢S )N)	ÚCryptÚDesertedÚFortressÚ
StrongholdÚ	MineshaftÚCreekÚMarshzSandswept MarshÚ	Riverbankr'   r'   r(   r)   ú<lambda>zAtlasStrategyConfig.<lambda>G   s   € ð ?ð ?ð ?€ r(   )Údefault_factoryÚpreferred_mapsc                  ó
   — g d¢S )N)zThe Burning MonolithzArbiter of AshzVaal PyramidzOvergrown RuinÚMazer'   r'   r(   r)   rD   zAtlasStrategyConfig.<lambda>J   s   € ð =ð =ð =€ r(   Úignored_mapsÚenable_precursor_towersr   Útablet_inventory_rowr-   Úmax_tablets_per_towerc                  ó
   — g d¢S )N)ÚDeliriumÚBreachÚRitualÚ
ExpeditionÚ	Precursorr'   r'   r(   r)   rD   zAtlasStrategyConfig.<lambda>P   s   € ð Gð Gð G€ r(   Úpreferred_tablet_typesN)r   r   r    r3   r!   r"   r5   r#   r7   r8   r%   r9   r:   r   rF   r   rI   rJ   rK   rL   rS   r'   r(   r)   r1   r1   ?   sP  € € € € € € à €Dˆ#Ð Ð Ñ Ø€HˆcÐÐÑØ€HˆcÐÐÑØ)-Ð  $Ð-Ð-Ñ-Ø!%Ð˜$Ð%Ð%Ñ%Ø#Ð˜Ð#Ð#Ñ#Ø % ð 7ð 7ð !ñ !ô !€N�D˜”Ið ð ñ ð $˜eð 5ð 5ð ñ ô €L�$�s”)ð ð ñ ð %)Ð˜TÐ(Ð(Ñ(Ø !Ð˜#Ð!Ð!Ñ!Ø!"Ð˜3Ð"Ð"Ñ"Ø(-¨ð ?ð ?ð )ñ )ô )Ð˜D œIð ð ñ ð ð r(   r1   c                   óÎ   — e Zd ZdZddedefd„Zdeded	ed
edeeef         f
d„Zddeded	ed
edef
d„Z		 	 	 ddeded	ed
ededefd„Z
deeeef                  dee         fd„ZdS )ÚAtlasPerceptionEngineu²   
    Khá»‘i nháº­n diá»‡n thá»‹ giÃ¡c giao diá»‡n Atlas (Cold Path Tier 2).
    XÃ¡c Ä‘á»‹nh viewport, phÃ¢n tÃ­ch icon Map Nodes vÃ  ThÃ¡p Dáº«n Ä�Æ°á»�ng Precursor Towers.
    ç      ž@ç     à�@Ú	ref_widthÚ
ref_heightc                 óZ   — || _         || _        d| _        d| _        d| _        d| _        d S )Ng     àu@g      ^@g     “@g     @Š@)rX   rY   Úroi_xÚroi_yÚroi_wÚroi_h)ÚselfrX   rY   s      r)   Ú__init__zAtlasPerceptionEngine.__init__[   s0   € Ø"ˆŒØ$ˆŒàˆŒ
ØˆŒ
ØˆŒ
ØˆŒ
ˆ
ˆ
r(   ÚxÚyÚscreen_wÚscreen_hÚreturnc                 ó–   — |dk    r
|| j         z  nd}|dk    r
|| j        z  nd}t          ||z  d¦  «        t          ||z  d¦  «        fS )Nr   ç      ð?r   )rX   rY   Úround)r_   ra   rb   rc   rd   ÚsxÚsys          r)   Úscale_pointz!AtlasPerceptionEngine.scale_pointd   s[   € Ø*2°Qª,¨,ˆX˜œÑ&Ð&¸CˆØ+3°aª<¨<ˆX˜œÑ'Ð'¸SˆÝ�Q˜‘V˜QÑÔ¥ q¨2¡v¨qÑ!1Ô!1Ð1Ð1r(   c                 óâ   — |                       | j        | j        ||¦  «        \  }}|                       | j        | j        ||¦  «        \  }}||cxk    o||z   k    nc o||cxk    o||z   k    nc S ©N)rk   r[   r\   r]   r^   )	r_   ra   rb   rc   rd   ÚrxÚryÚrwÚrhs	            r)   Úis_in_viewportz$AtlasPerceptionEngine.is_in_viewporti   s�   € Ø×!Ò! $¤*¨d¬j¸(ÀHÑMÔM‰ˆˆBØ×!Ò! $¤*¨d¬j¸(ÀHÑMÔM‰ˆˆBØ�aÐ"Ð"Ò"Ð"˜2 ™7Ò"Ð"Ð"Ð"Ð<¨¨qÐ);Ð);Ò);Ð);°B¸±GÒ);Ð);Ð);Ð);Ð<r(   FÚ	chat_openc                 óä   — |dk    r
|| j         z  nd}|dk    r
|| j        z  nd}|d|z  k     rdS |d|z  k    rdS |d|z  k    r|d|z  k     rdS |r|d|z  k     r|d	|z  k    rdS |d
|z  k     rdS dS )uá  
        Kiá»ƒm tra Ä‘iá»ƒm (x, y) cÃ³ bá»‹ che khuáº¥t bá»Ÿi cÃ¡c thÃ nh pháº§n giao diá»‡n cá»‘ Ä‘á»‹nh khÃ´ng (Doc 56 INV-ATLAS-02).
        - Buff bar trÃªn cÃ¹ng: y < 110 (1080p)
        - Action bar / Vitals dÆ°á»›i cÃ¹ng: y > 940 (1080p)
        - Minimap / Quest tracker bÃªn pháº£i: x > 1580 vÃ  y < 400 (1080p)
        - Chat window bÃªn trÃ¡i (náº¿u chat_open=True hoáº·c vÃ¹ng chatbox): x < 480 vÃ  y > 500 (1080p)
        - Extreme left panel: x < 300 (1080p)
        r   rg   g     €[@Tg     `�@g     °˜@g      y@ç      ~@ç     @@g     Àr@F)rX   rY   )r_   ra   rb   rc   rd   rs   ri   rj   s           r)   Úis_occludedz!AtlasPerceptionEngine.is_occludedn   s´   € ð  +3°Qª,¨,ˆX˜œÑ&Ð&¸CˆØ+3°aª<¨<ˆX˜œÑ'Ð'¸Sˆàˆu�r‰zŠ>ˆ>Ø�4Øˆu�r‰zŠ>ˆ>Ø�4Øˆv˜‰{Š?ˆ?˜q 5¨2¡:š~˜~Ø�4Øð 	˜!˜e b™jš.˜.¨Q°¸±ª^¨^Ø�4Øˆu�r‰zŠ>ˆ>Ø�4àˆur(   Ú	raw_nodesc                 óª  — g }|D �]L}|                      dd¦  «        }t          j        |¦  «        }t          |t	          |                      dd¦  «        ¦  «        t          |                      dd¦  «        ¦  «        t          |                      dd¦  «        ¦  «        t          |                      d	d
¦  «        ¦  «        t          |                      dd¦  «        ¦  «        t          |                      dd
¦  «        ¦  «        t	          |                      dd¦  «        ¦  «        |j        |j        ¬¦
  «
        }| 	                    |¦  «         �ŒN|S )u`   Chuyá»ƒn Ä‘á»•i danh sÃ¡ch node thÃ´ tá»« perception / RAM / config thÃ nh danh sÃ¡ch AtlasNode.r   zUnknown Mapr   r   ra   ç      Ž@rb   g     à€@r   Fr   Tr   r   r   )
r   r   r   r   r   r   r   r   r   r   )
Úgetr   Úclassify_noder   r#   r$   r%   r   r   Úappend)r_   rx   ÚnodesÚnr   ÚprofileÚnodes          r)   Úparse_nodes_from_metadataz/AtlasPerceptionEngine.parse_nodes_from_metadataŽ   s(  € àˆØð 	ñ 	ˆAØ—5’5˜ Ñ/Ô/ˆDÝ(Ô6°tÑ<Ô<ˆGÝØÝ˜Ÿš˜v qÑ)Ô)Ñ*Ô*Ý˜qŸušu S¨%Ñ0Ô0Ñ1Ô1Ý˜qŸušu S¨%Ñ0Ô0Ñ1Ô1Ý $ Q§U¢UÐ+<¸eÑ%DÔ%DÑ EÔ EÝ! !§%¢%¨¸Ñ"=Ô"=Ñ>Ô>Ý §¢ l°EÑ :Ô :Ñ;Ô;Ý˜AŸEšE )¨QÑ/Ô/Ñ0Ô0Ø!Ô+Ø%Ô3ðñ ô ˆDð �LŠL˜ÑÔÐÑØˆr(   N)rV   rW   )rV   rW   F)r   r   r    Ú__doc__r$   r`   r	   rk   r%   rr   rw   r   r   r!   r   r   r‚   r'   r(   r)   rU   rU   U   sZ  € € € € € ðð ð
ð  %ð ¸eð ð ð ð ð2˜Uð 2 uð 2¸ð 2Èð 2ÐSXÐY^Ð`eÐYeÔSfð 2ð 2ð 2ð 2ð
=ð = ð =¨%ð =¸5ð =ÐUZð =Ðhlð =ð =ð =ð =ð !Ø Øðð àðð ðð ð	ð
 ðð ðð 
ðð ð ð ð@°4¸¸SÀ#¸X¼Ô3Gð ÈDÐQZÌOð ð ð ð ð ð r(   rU   c                   óš   — e Zd ZdZddee         fd„Zededd fd„¦   «         Z		 	 	 	 dde
e         dee         dedededee         fd„ZdS )ÚAtlasStrategyPlanneru£   
    Khá»‘i hoáº¡ch Ä‘á»‹nh chiáº¿n lÆ°á»£c chá»�n Map Node tá»‘i Æ°u (Doc 56 Section 3.1.B).
    Lá»±a chá»�n node dá»±a trÃªn cáº¥u hÃ¬nh atlas_policy.toml.
    NÚconfigc                 ó0   — |pt          ¦   «         | _        d S rm   )r1   r†   )r_   r†   s     r)   r`   zAtlasStrategyPlanner.__init__ª   s   € ØÐ5Õ 3Ñ 5Ô 5ˆŒˆˆr(   Ú	toml_pathre   c                 ó@  — t          ¦   «         }t          j                             |¦  «        �re	 t          r=t          |d¦  «        5 }t	          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   ni }|                     di ¦  «        }|                     d|j        ¦  «        |_        t          |                     d|j
        ¦  «        ¦  «        |_
        t          |                     d|j        ¦  «        ¦  «        |_        t          |                     d|j        ¦  «        ¦  «        |_        t          |                     d|j        ¦  «        ¦  «        |_        |                     d	i ¦  «        }d
|v rt          |d
         ¦  «        |_        |                     di ¦  «        }d|v rt          |d         ¦  «        |_        |                     di ¦  «        }t          |                     d|j        ¦  «        ¦  «        |_        t          |                     d|j        ¦  «        ¦  «        |_        t          |                     d|j        ¦  «        ¦  «        |_        d|v rt          |d         ¦  «        |_        n# t,          $ r Y nw xY w | |¬¦  «        S )u"   Náº¡p cáº¥u hÃ¬nh tá»« tá»‡p TOML.ÚrbNÚstrategyr3   r5   r7   r8   r9   Ú	whitelistrF   Ú	blacklistrI   Úprecursor_towersrJ   rK   rL   rS   )r†   )r1   ÚosÚpathÚexistsÚtomllibÚopenÚloadr{   r3   r#   r5   r7   r%   r8   r9   ÚlistrF   rI   rJ   rK   rL   rS   Ú	Exception)	Úclsrˆ   ÚcfgÚfÚdatar‹   rŒ   r�   Ú	precursors	            r)   Úload_from_tomlz#AtlasStrategyPlanner.load_from_toml­   s«  € õ "Ñ#Ô#ˆÝŒ7�>Š>˜)Ñ$Ô$ñ '	ð&Ýð Ý˜i¨Ñ.Ô.ð /°!Ý&œ|¨A™œ˜ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /øð �DØŸ8š8 J°Ñ3Ô3�Ø#Ÿ<š<¨°´Ñ9Ô9�”Ý" 8§<¢<°
¸C¼LÑ#IÔ#IÑJÔJ�”Ý" 8§<¢<°
¸C¼LÑ#IÔ#IÑJÔJ�”Ý37Ø—L’LÐ!?ÀÔAaÑbÔbñ4ô 4�Ô0õ ,0Ø—L’LÐ!7¸Ô9QÑRÔRñ,ô ,�Ô(ð !ŸHšH [°"Ñ5Ô5�	Ø# yÐ0Ð0Ý)-¨iÐ8HÔ.IÑ)JÔ)J�CÔ&à ŸHšH [°"Ñ5Ô5�	Ø! YÐ.Ð.Ý'+¨I°nÔ,EÑ'FÔ'F�CÔ$à ŸHšHÐ%7¸Ñ<Ô<�	Ý.2Ø—M’MÐ";¸SÔ=XÑYÔYñ/ô /�Ô+õ ,/Ø—M’MÐ"8¸#Ô:RÑSÔSñ,ô ,�Ô(õ -0Ø—M’MÐ"9¸3Ô;TÑUÔUñ-ô -�Ô)ð ,¨yÐ8Ð8Ý15°iÐ@XÔ6YÑ1ZÔ1Z�CÔ.øøÝð ð ð Ø�ðøøøàˆs˜#ˆ‰ŒÐs6   °J ÁA(ÁJ Á(A,Á,J Á/A,Á0HJ Ê
JÊJrV   rW   FÚcandidate_nodesÚperception_enginerc   rd   rs   c                 ó  ‡ ‡‡‡‡‡‡— dt           dt          fˆˆˆˆfd„Š‰ j        j        dk    s‰ j        j        rˆfd„|D ¦   «         }|r|d         S ‰ j        j        rˆfd„|D ¦   «         }|r|d         S ˆˆ fd„|D ¦   «         }|sˆˆ fd	„|D ¦   «         }|sd
S ‰ j        j        dk    s‰ j        j        rud„ |D ¦   «         }	|	rg‰ j        j        D ]:Š|	D ]5}
‰                     ¦   «         |
j	                             ¦   «         v r|
c c S Œ6Œ;|	 
                    d„ d¬¦  «         |	d         S ‰ j        j        D ]4Šˆfd„|D ¦   «         }|r"| 
                    d„ d¬¦  «         |d         c S Œ5| 
                    d„ d¬¦  «         |d         S )u;  
        Lá»±a chá»�n Map Node tá»‘i Æ°u nháº¥t trong sá»‘ cÃ¡c á»©ng viÃªn há»£p lá»‡ (Doc 56 Section 3.1.B).
        TuÃ¢n thá»§ whitelist, min/max tier, blacklist, vÃ  chiáº¿n lÆ°á»£c bonus rush / farm whitelist.
        Lá»�c bá»� cÃ¡c Node náº±m ngoÃ i Viewport hoáº·c bá»‹ che khuáº¥t (INV-ATLAS-02).
        r   re   c                 ó¤   •— ‰€dS ‰                      | j        | j        ‰‰¦  «        sdS ‰                     | j        | j        ‰‰‰¬¦  «        rdS dS )NTF©rs   )rr   r   r   rw   )r   rs   rž   rd   rc   s    €€€€r)   Ú_is_node_visually_validzFAtlasStrategyPlanner.select_best_node.<locals>._is_node_visually_validè   sd   ø€ Ø Ð(Ø�tØ$×3Ò3°A´JÀÄ
ÈHÐV^Ñ_Ô_ð Ø�uØ ×,Ò,¨Q¬Z¸¼ÀXÈxÐclÐ,ÑmÔmð Ø�uØ�4r(   Úatlas_quest_rushc                 ój   •— g | ]/}|j         ¯	t          j        |j        ¦  «        ¯" ‰|¦  «        ¯-|‘Œ0S r'   )r   r   r   r   ©Ú.0r   r¢   s     €r)   ú
<listcomp>z9AtlasStrategyPlanner.select_best_node.<locals>.<listcomp>ó   s]   ø€ ð ð ð ØØ”>ðõ 'Ô4°Q´VÑ<Ô<ðð ,Ð+¨AÑ.Ô.ð	Øðð ð r(   r   c                 ó®   •— g | ]Q}|j         rH|j        sd |j                             ¦   «         v ¯+t	          j        |j        ¦  «        °D ‰|¦  «        ¯O|‘ŒRS )Úcitadel)r   r   r   Úlowerr   Ú!is_forbidden_for_waystone_farmingr¥   s     €r)   r§   z9AtlasStrategyPlanner.select_best_node.<locals>.<listcomp>þ   sz   ø€ ð ð ð ØØ”>ðð ”\ðð &/°!´&·,²,±.´.Ð%@Ð%@Ý*ÔLÈQÌVÑTÔTð &Aà+Ð+¨AÑ.Ô.ð &Að à%@Ð%@Ð%@r(   c                 ó  •‡— g | ]}Š‰j         rt‰j        j        ‰j        cxk    r‰j        j        k    ¯/n nKt          ˆfd „‰j        j        D ¦   «         ¦  «        °Wt          j        ‰j	        ¦  «        °p ‰‰¦  «        ¯{‰‘Œ~S )c              3   ór   •K  — | ]1}|                      ¦   «         ‰j                              ¦   «         v V — Œ2d S rm   ©rª   r   ©r¦   Úignoredr   s     €r)   ú	<genexpr>zCAtlasStrategyPlanner.select_best_node.<locals>.<listcomp>.<genexpr>  s:   øè è € ÐbÐb¸g˜Ÿš™œ¨1¬6¯<ª<©>¬>Ð9ÐbÐbÐbÐbÐbÐbr(   )
r   r†   r5   r   r7   ÚanyrI   r   r«   r   ©r¦   r   r¢   r_   s    @€€r)   r§   z9AtlasStrategyPlanner.select_best_node.<locals>.<listcomp>  sµ   øø€ ð 
ð 
ð 
ØØŒ~ð
ð ”Ô$¨¬ÐFÐFÒFÐF°$´+Ô2FÒFÐFÐFÐFÐFÝÐbÐbÐbÐbÈÌÔIaÐbÑbÔbÑbÔbð Gå&ÔHÈÌÑPÔPð Gð (Ð'¨Ñ*Ô*ð Gð àFÐFÐFr(   c                 ó¶   •‡— g | ]TŠ‰j         ¯	t          ˆfd „‰j        j        D ¦   «         ¦  «        °.t	          j        ‰j        ¦  «        °G ‰‰¦  «        ¯R‰‘ŒUS )c              3   ór   •K  — | ]1}|                      ¦   «         ‰j                              ¦   «         v V — Œ2d S rm   r®   r¯   s     €r)   r±   zCAtlasStrategyPlanner.select_best_node.<locals>.<listcomp>.<genexpr>  s:   øè è € ÐfÐfÀ'˜GŸMšM™OœO¨q¬v¯|ª|©~¬~Ð=ÐfÐfÐfÐfÐfÐfr(   )r   r²   r†   rI   r   r«   r   r³   s    @€€r)   r§   z9AtlasStrategyPlanner.select_best_node.<locals>.<listcomp>  sŠ   øø€ ð ð ð ØØ”>ðõ ÐfÐfÐfÐfÈTÌ[ÔMeÐfÑfÔfÑfÔfðõ +ÔLÈQÌVÑTÔTð	ð
 ,Ð+¨AÑ.Ô.ðØðð ð r(   NÚ
bonus_rushc                 ó    — g | ]}|j         °	|‘ŒS r'   )r   )r¦   r   s     r)   r§   z9AtlasStrategyPlanner.select_best_node.<locals>.<listcomp>  s    € ÐKÐKÐK ¸Ô9JÐK˜1ÐKÐKÐKr(   c                 ó   — | j         S rm   ©r   ©ra   s    r)   rD   z7AtlasStrategyPlanner.select_best_node.<locals>.<lambda>'  s   € ¨q¬v€ r(   T)ÚkeyÚreversec                 ón   •— g | ]1}‰                      ¦   «         |j                              ¦   «         v ¯/|‘Œ2S r'   r®   )r¦   r   Úprefs     €r)   r§   z9AtlasStrategyPlanner.select_best_node.<locals>.<listcomp>,  s5   ø€ ÐQÐQÐQ˜a°$·*²*±,´,À!Ä&Ç,Â,Á.Ä.Ð2PÐ2P˜Ð2PÐ2PÐ2Pr(   c                 ó   — | j         S rm   r¹   rº   s    r)   rD   z7AtlasStrategyPlanner.select_best_node.<locals>.<lambda>/  s   € ¨A¬F€ r(   c                 ó   — | j         S rm   r¹   rº   s    r)   rD   z7AtlasStrategyPlanner.select_best_node.<locals>.<lambda>3  s   €  q¤v€ r(   )r   r%   r†   r3   r:   r9   r8   rF   rª   r   Úsort)r_   r�   rž   rc   rd   rs   Úquest_nodesÚcitadelsÚvalid_nodesÚuncompletedr   Úmatchingr¢   r¾   s   ` ````      @@r)   Úselect_best_nodez%AtlasStrategyPlanner.select_best_nodeÛ   s¡  øøøøøøø€ ð	¥yð 	µTð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð Œ;ÔÐ1Ò1Ð1°T´[Ô5SÐ1ðð ð ð Ø*ðñ ô ˆKð ð &Ø" 1”~Ð%ð Œ;Ô+ð 		#ðð ð ð Ø*ðñ ô ˆHð ð #Ø ”{Ð"ð
ð 
ð 
ð 
ð 
Ø&ð
ñ 
ô 
ˆð ð 
	ðð ð ð ð Ø*ðñ ô ˆKð ð Ø�tð Œ;Ô˜|Ò+Ð+¨t¬{Ô/WÐ+ØKÐK kÐKÑKÔKˆKØð &à œKÔ6ð %ð %�DØ(ð %ð %˜ØŸ:š:™<œ<¨1¬6¯<ª<©>¬>Ð9Ð9Ø#$˜H˜H˜H˜H˜Hð :ð%ð × Ò Ð%5Ð%5¸tÐ ÑDÔDÐDØ" 1”~Ð%ð ”KÔ.ð 	#ð 	#ˆDØQÐQÐQÐQ ;ÐQÑQÔQˆHØð #à—’Ð"2Ð"2¸D�ÑAÔAÐAØ ”{Ð"Ð"Ð"ð#ð 	×ÒÐ-Ð-°tÐÑ<Ô<Ð<Ø˜1Œ~Ðr(   rm   )NrV   rW   F)r   r   r    rƒ   r   r1   r`   Úclassmethodr!   rœ   r   r   rU   r$   r%   rÇ   r'   r(   r)   r…   r…   ¤   sò   € € € € € ðð ð
6ð 6˜xÐ(;Ô<ð 6ð 6ð 6ð 6ð ð+ sð +Ð/Eð +ð +ð +ñ „[ð+ð` >BØ Ø ØðYð Yà˜iœðYð $Ð$9Ô:ðYð ð	Yð
 ðYð ðYð 
�)Ô	ðYð Yð Yð Yð Yð Yr(   r…   c                   ó0  — e Zd ZdZ	 	 ddee         defd„Zdded	ed
e	fd„Z
	 	 	 	 	 ddeded	ededede	d
eeef         fd„Z	 	 	 	 	 	 ddee         ded	edee         dedede	d
eeef         fd„Z	 	 	 d dee         deded
eeeef                  fd„ZdS )!ÚAtlasNodeSelectoru_   
    Bá»™ Ä‘iá»�u phá»‘i cáº¥p cao káº¿t ná»‘i Perception, Strategy vÃ  IPC Core (Doc 56).
    Núdata/maps/atlas_policy.tomlÚ
shm_bridgeÚconfig_pathc                 óx   — || _         t          ¦   «         | _        t                               |¦  «        | _        d S rm   )ÚbridgerU   Ú
perceptionr…   rœ   Úplanner)r_   rÌ   rÍ   s      r)   r`   zAtlasNodeSelector.__init__<  s1   € ð
 !ˆŒÝ/Ñ1Ô1ˆŒÝ+×:Ò:¸;ÑGÔGˆŒˆˆr(   r   Ú	area_nameÚmonster_countre   c                 óR   — |dk    rdS |                      ¦   «         }d|v pd|v pd|v S )u­   
        Kiá»ƒm tra báº¥t biáº¿n INV-ATLAS-01: Safe Hideout Execution.
        Chá»‰ cho phÃ©p tÆ°Æ¡ng tÃ¡c Atlas khi á»Ÿ Hideout / Town vÃ  khÃ´ng cÃ³ quÃ¡i váº­t.
        r   FÚhideoutÚtownÚ
encampment)rª   )r_   rÒ   rÓ   rª   s       r)   Úis_safe_to_operatez$AtlasNodeSelector.is_safe_to_operateE  sA   € ð
 ˜1ÒÐØ�5Ø—’Ñ!Ô!ˆØ˜UÐ"ÐS¨°%¨ÐS¸\ÈUÐ=RÐSr(   úShoreline Hideoutç      ¤@ç     €–@Fr�   rc   rd   rs   c                 ó:   — |                       |g|||||¬¦  «        S )uã   
        Chá»�n trá»±c tiáº¿p má»™t AtlasNode cá»¥ thá»ƒ vÃ  gá»­i lá»‡nh SELECT_ATLAS_NODE (Opcode 9) sang C++ Core.
        TuÃ¢n thá»§ INV-ATLAS-01 (Safe Hideout) vÃ  INV-ATLAS-02 (Viewport & Occlusion Fail-Closed).
        )r�   rÒ   rÓ   rc   rd   rs   )Úplan_and_execute)r_   r�   rÒ   rÓ   rc   rd   rs   s          r)   Úselect_nodezAtlasNodeSelector.select_nodeO  s5   € ð ×$Ò$Ø!˜FØØ'ØØØð %ñ 
ô 
ð 	
r(   rV   rW   r�   Úavailable_towerc                 óf  — dddddœ}|                       ||¦  «        sd|› d|› d�|d<   |S | j                             || j        |||¬	¦  «        }	|	sd
|d<   |S | j                             |	j        |	j        ||¦  «        s d|	j        › d|	j        › d|	j        › d�|d<   |S | j                             |	j        |	j        |||¬¦  «        r d|	j        › d|	j        › d|	j        › d�|d<   |S |	|d<   t          t          z  }
|rR| j        j        j        rA|j        dk    r6| j                             |j        |j        ||¦  «        r|
t          z  }
d|d<   | j        rT| j                             ¦   «         r;| j                             |	j        |	j        |
|	j        d¬¦  «        }||d<   |sd|d<   nd|d<   |S )uÔ   
        Thá»±c thi luá»“ng chá»�n Node vÃ  gá»­i lá»‡nh IPC xuá»‘ng C++ Core.
        TuÃ¢n thá»§ nghiÃªm ngáº·t INV-ATLAS-01 (Safe Hideout) vÃ  INV-ATLAS-02 (Verified Viewport & Occlusion Fail-Closed).
        FNÚ )ÚsuccessÚselected_nodeÚtower_socketedÚerroru#   Vi pháº¡m INV-ATLAS-01: Khu vá»±c 'u   ' khÃ´ng an toÃ n hoáº·c cÃ³ u    quÃ¡i váº­t.rå   )rž   rc   rd   rs   u‹   Vi pháº¡m INV-ATLAS-02: KhÃ´ng tÃ¬m tháº¥y Map Node nÃ o há»£p lá»‡ trong Viewport (hoáº·c toÃ n bá»™ bá»‹ che khuáº¥t/ngoÃ i khung nhÃ¬n).u   Vi pháº¡m INV-ATLAS-02: Node 'z' (z, u   ) náº±m ngoÃ i Atlas Viewport.r¡   u0   ) bá»‹ che khuáº¥t bá»Ÿi giao diá»‡n (Occluded).rã   r   Trä   iˆ  )r   r   Úflagsr   Ú
timeout_msrâ   u1   Lá»—i gá»­i lá»‡nh SELECT_ATLAS_NODE qua SHM IPC.)rØ   rÑ   rÇ   rÐ   rr   r   r   r   rw   ÚATLAS_FLAG_REQUIRE_HOVER_VERIFYÚ#ATLAS_FLAG_AUTO_PROCEED_TO_WAYSTONEr†   rJ   r,   Ú!ATLAS_FLAG_SOCKET_PRECURSOR_TOWERrÏ   Úis_connectedÚsend_select_atlas_noder   )r_   r�   rÒ   rÓ   rß   rc   rd   rs   ÚresultÚtarget_noderæ   Úsents               r)   rÝ   z"AtlasNodeSelector.plan_and_executee  s¥  € ð Ø!Ø#Øð	
ð 
ˆð ×&Ò& y°-Ñ@Ô@ð 	ð IÀIð  Ið  IÐlyð  Ið  Ið  IˆF�7‰OØˆMð ”l×3Ò3ØØ"œoØØØð 4ñ 
ô 
ˆð ð 	ð lˆF�7‰OØˆMð Œ×-Ò-¨kÔ.BÀKÔDXÐZbÐdlÑmÔmð 	ð a¸{Ô?Oð  að  aÐT_ÔThð  að  aÐlwô  mAð  að  að  aˆF�7‰OØˆMàŒ?×&Ò& {Ô';¸[Ô=QÐS[Ð]eÐqzÐ&Ñ{Ô{ð 	ð s¸{Ô?Oð  sð  sÐT_ÔThð  sð  sÐlwô  mAð  sð  sð  sˆF�7‰OØˆMà"-ˆˆÑõ 0Õ2UÑUˆØð 	0˜tœ|Ô2ÔJð 	0ÈÔOlÐopÒOpÐOpØŒ×-Ò-¨oÔ.FÈÔH`ÐbjÐltÑuÔuð 0ØÕ:Ñ:�Ø+/�Ð'Ñ(ð Œ;ð 	%˜4œ;×3Ò3Ñ5Ô5ð 	%Ø”;×5Ò5Ø$Ô-Ø$Ô-ØØ#Ô+Øð 6ñ ô ˆDð !%ˆF�9ÑØð VØ"U��w‘øð !%ˆF�9ÑØˆr(   Úfallback_map_namec                 óz  — d}d}d}d}	 | j         rŠ| j                              ¦   «         }|ro|j        rhd}t          |dd¦  «        }|j        r=d|j                             ¦   «         vr"d|j                             ¦   «         vr|j        }t          |dd¦  «        }n# t          $ r Y nw xY w|s0|r.d|                     ¦   «         vrd|                     ¦   «         vr|}|sd	S t          j        |¦  «        }	d
dddddddddddddœ}
|dk    r|dz  nd}|dk    r|dz  nd}d	}|                     ¦   «         }|
 	                    ¦   «         D ]L\  }\  }}||v r@t          t          ||z  ¦  «        ¦  «        t          t          ||z  ¦  «        ¦  «        f} nŒM||	j        ||d||	j        j        |	j        |	j        |dœ
S )u  
        Truy váº¥n thÃ´ng tin Node Atlas Ä‘ang sÃ¡ng / má»Ÿ / hoáº¡t Ä‘á»™ng tá»« bá»™ nhá»› RAM hoáº·c IPC Telemetry (Doc 56 / Doc 65).
        Cung cáº¥p vá»‹ trÃ­ / tÃªn map Ä‘á»ƒ há»— trá»£ Ä‘iá»�u hÆ°á»›ng chuá»™t hoáº·c kÃ©o (hold LMB) world map.
        rá   r   FTÚmonsters_alive_totalrÕ   rÖ   Ú	area_codeN)g     ”@g     �@)g     0–@g     Ð�@)g     h�@g     `ˆ@)g     L�@g     P‰@)g     ˆ“@ru   )g      ”@rv   )g     •@g     @z@)g     p’@g     `ƒ@)rz   g     €†@)g     ø‘@g     @…@)ÚdesertedÚfortressÚcreekzthe burning monolithÚmonolithzthe well of soulszheart of the wellzorigin towerzprecursor reactorzenigma chamberzcorrupted nexusÚ	riverbankzsandswept marshrÚ   rg   rÛ   )
rÒ   Úcanonical_nameró   Ú	is_onlineÚ	is_openedÚmonsters_aliver   Úaccepts_waystoner   Úsuggested_screen_pos)rÏ   Úread_telemetry_snapshotrú   ÚgetattrrÒ   rª   r–   r   r|   Úitemsr#   rh   rù   r   Úvaluerý   r   )r_   rð   rc   rd   Úactive_arearó   rü   rú   Úsnapr€   ÚKNOWN_NODE_COORDSri   rj   Úsuggested_ptÚ
lower_nameÚkÚref_xÚref_ys                     r)   Úget_active_atlas_node_from_ramz0AtlasNodeSelector.get_active_atlas_node_from_ram®  s^  € ð ˆØˆ	ØˆØˆ	ð
	ØŒ{ð ?Ø”{×:Ò:Ñ<Ô<�Øð ?˜DœNð ?Ø $�IÝ%,¨TÐ3IÈ1Ñ%MÔ%M�NØ”~ð 5¨)¸4¼>×;OÒ;OÑ;QÔ;QÐ*QÐ*QÐV\ÐdhÔdr×dxÒdxÑdzÔdzÐVzÐVzØ&*¤n˜Ý '¨¨k¸2Ñ >Ô >�IøøÝð 	ð 	ð 	ØˆDð	øøøð ð 	0Ð0ð 	0ØÐ 1× 7Ò 7Ñ 9Ô 9Ð9Ð9¸fÐL]×LcÒLcÑLeÔLeÐ>eÐ>eØ/�àð 	Ø�4å$Ô2°;Ñ?Ô?ˆð (Ø'Ø$Ø$3Ø'Ø!0Ø!0Ø+Ø!0Ø-Ø.Ø'Ø.ð
ð 
Ðð  #+¨Q¢, ,ˆX˜ÑÐ°CˆØ"*¨Q¢, ,ˆX˜ÑÐ°CˆàˆØ ×&Ò&Ñ(Ô(ˆ
Ø!2×!8Ò!8Ñ!:Ô!:ð 	ð 	ÑˆA‰~��uØ�JˆˆÝ #¥E¨%°"©*Ñ$5Ô$5Ñ 6Ô 6½½EÀ%È"Á*Ñ<MÔ<MÑ8NÔ8NÐO�Ø�ð ð
 %Ø%Ô4Ø"Ø"ØØ,Ø Ô*Ô0Ø 'Ô 8Ø$Ô2Ø$0ð
ð 
ð 	
s   ŠBB Â
B)Â(B))NrË   )r   )rÙ   r   rÚ   rÛ   F)rÙ   r   NrV   rW   F)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Ê   7  s	  € € € € € ðð ð /3Ø8ðHð Hà˜]Ô+ðHð ðHð Hð Hð HðTð T¨Cð TÀð TÈDð Tð Tð Tð Tð -ØØ Ø Øð
ð 
àð
ð ð
ð ð	
ð
 ð
ð ð
ð ð
ð 
ˆc�3ˆhŒð
ð 
ð 
ð 
ð2 -ØØ48Ø Ø ØðGð Gà˜iœðGð ðGð ð	Gð
 " .Ô1ðGð ðGð ðGð ðGð 
ˆc�3ˆhŒðGð Gð Gð GðV ,0Ø Ø ð	J
ð J
à# Cœ=ðJ
ð ðJ
ð ð	J
ð
 
�$�s˜C�x”.Ô	!ðJ
ð J
ð J
ð J
ð J
ð J
r(   rÊ   ) rƒ   Úmathr�   ÚtimeÚdataclassesr   r   Útypingr   r   r   r   r	   r’   ÚImportErrorÚtomliÚ"src.assistant_tool.core_shm_bridger
   r   Ú'src.assistant_tool.atlas_knowledge_baser   r   r   rè   rê   ré   r   r+   r1   rU   r…   rÊ   r'   r(   r)   ú<module>r     sZ  ððð ð €€€Ø 	€	€	€	Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðØ€N€N€N€NøØð ð ð ðØÐÐÐÐøØð ð ð Øˆˆˆðøøøøøðøøøð JÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gÐ gð #'Ð Ø$(Ð !Ø&*Ð #ð ð
 ð 
 ð 
 ð 
 ð 
 ñ 
 ô 
 ñ „ð
 ð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ðð*Lð Lð Lð Lð Lñ Lô Lð Lð^Pð Pð Pð Pð Pñ Pô Pð PðfA
ð A
ð A
ð A
ð A
ñ A
ô A
ð A
ð A
ð A
s-   ¦+ «A±6µA¶A ½A¿A Á AÁA