§
    °U®jw4  ã                  óÄ   — d Z ddlmZ ddl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 G d„ d¦  «        ZdS )u5  AutoPOE2 - Atlas Passive Tree Planner & Max Profit Blueprint (Doc 65 / Doc 70).
================================================================================
Thiáº¿t káº¿ bá»™ hoáº¡ch Ä‘á»‹nh phÃ¢n bá»• CÃ¢y Ná»™i Táº¡i Atlas (Atlas Passive Tree Planner - 115+ Points):
- Tá»‘i Ä‘a hÃ³a lá»£i nhuáº­n tiá»�n tá»‡ (Currency Maximization) vÃ  duy trÃ¬ tÃ i nguyÃªn báº£n Ä‘á»“ (Map Sustain).
- PhÃ¢n ká»³ 3 giai Ä‘oáº¡n thÄƒng tiáº¿n:
  * Giai Ä‘oáº¡n 1 (Early Tier 1-5): Map Sustain & Tá»· lá»‡ rÆ¡i Waystone cáº¥p cao hÆ¡n (Points 1 - 35).
  * Giai Ä‘oáº¡n 2 (Mid Tier 6-10): Pack Size, QuÃ¡i váº­t Tinh anh (Rare Monsters) vÃ  TÃ­ch lÅ©y Quá»¹ VÃ ng (Points 36 - 75).
  * Giai Ä‘oáº¡n 3 (Endgame Tier 11-16): Tá»‘i Ä‘a hÃ³a Divine/Mirror qua League Mechanics (Breach, Delirium, Ritual, Expedition) (Points 76 - 115+).
- Thuáº­t toÃ¡n phÃ¢n bá»• tá»± Ä‘á»™ng (Auto Allocation Order) tuÃ¢n thá»§ Ä‘á»“ thá»‹ phá»¥ thuá»™c DAG (Prerequisites).

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.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚEnum)ÚAnyÚDictÚListÚOptionalÚSetÚTuplec                  ó   — e Zd ZdZdZdZdZdS )Ú	TreePhaseu?   3 giai Ä‘oáº¡n phÃ¢n ká»³ thÄƒng tiáº¿n CÃ¢y Ná»™i Táº¡i Atlas.ÚPHASE_1_EARLY_SUSTAINÚPHASE_2_MID_QUANTITY_GOLDÚPHASE_3_ENDGAME_MAX_PROFITN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   © ó    úCC:\Projects\AutoPOE2\src\assistant_tool\atlas\atlas_tree_planner.pyr   r      s(   € € € € € ØIÐIØ3ÐØ ;ÐØ!=ÐÐÐr   r   c                  ó€   — 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
<    ee¬¦  «        Zded<   dZded<   dS )ÚAtlasPassiveNodeuL   Ä�á»‰nh cá»§a CÃ¢y Ná»™i Táº¡i Atlas biá»ƒu diá»…n má»™t Ä‘iá»ƒm ká»¹ nÄƒng.ÚstrÚnode_idÚnamer   ÚphaseÚintÚpriority_orderÚcategoryÚstat_description)Údefault_factoryz	List[str]ÚprerequisitesFÚboolÚ	allocatedN)	r   r   r   r   Ú__annotations__r   Úlistr$   r&   r   r   r   r   r       s†   € € € € € € àVÐVØ€L€L�LØ€I€I�IØÐÐÑØÐÐÑØ€M€M�MØÐÐÑØ$˜u°TÐ:Ñ:Ô:€MÐ:Ð:Ð:Ñ:Ø€IÐÐÐÑÐÐr   r   c                  ó†   — e Zd ZdZddd„Zdd
„Zed d„¦   «         Zed d„¦   «         Zd!d"d„Z	d#d„Z
d$d„Zd%d„Zd#d„Zd&d„ZdS )'ÚAtlasTreePlannerue   Bá»™ hoáº¡ch Ä‘á»‹nh vÃ  phÃ¢n bá»• CÃ¢y Ná»™i Táº¡i Atlas tá»± Ä‘á»™ng tá»‘i Æ°u hÃ³a lá»£i nhuáº­n.úconfig/atlas_monk_ci_tree.tomlÚ	toml_pathúOptional[str]c                óÂ   — i | _         g | _        d}|r4t          j                             |¦  «        r|                      |¦  «        }|s|                      ¦   «          d S d S )NF)Ú_nodesÚ_allocation_sequenceÚosÚpathÚexistsÚ_load_from_tomlÚ_build_canonical_blueprint_115)Úselfr,   Úloadeds      r   Ú__init__zAtlasTreePlanner.__init__0   sp   € Ø35ˆŒØ/1ˆÔ!ØˆØð 	5�œŸš¨	Ñ2Ô2ð 	5Ø×)Ò)¨)Ñ4Ô4ˆFØð 	2Ø×/Ò/Ñ1Ô1Ð1Ð1Ð1ð	2ð 	2r   r2   r   Úreturnr%   c                óz  — 	 t          |d¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |                     dg ¦  «        }|sdS | j                             ¦   «          | j                             ¦   «          |D ]�}|d         }t          ||d         t          |d         ¦  «        t          |d         ¦  «        |d	         |d
         t          |                     dg ¦  «        ¦  «        ¬¦  «        }|| j        |<   | j                             |¦  «         ŒždS # t          $ r Y dS w xY w)un   Náº¡p danh má»¥c 115 Ä‘á»‰nh cÃ¢y ná»™i táº¡i Atlas tá»« file cáº¥u hÃ¬nh TOML Ä‘á»™c láº­p (Doc 65 / Doc 70).ÚrbNÚnodesFr   r   r   r    r!   r"   r$   ©r   r   r   r    r!   r"   r$   T)ÚopenÚtomllibÚloadÚgetr/   Úclearr0   r   r   r   r(   ÚappendÚ	Exception)r6   r2   ÚfÚdataÚ
nodes_dataÚrawÚnidÚnodes           r   r4   z AtlasTreePlanner._load_from_toml9   s�  € ð	Ý�d˜DÑ!Ô!ð ' QÝ”| A‘”�ð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'àŸš '¨2Ñ.Ô.ˆJØð Ø�uØŒK×ÒÑÔÐØÔ%×+Ò+Ñ-Ô-Ð-Ø!ð 6ð 6�Ø˜)”n�Ý'ØØ˜VœÝ# C¨¤LÑ1Ô1Ý#& sÐ+;Ô'<Ñ#=Ô#=Ø  œ_Ø%(Ð);Ô%<Ý"& s§w¢w¨ÀÑ'CÔ'CÑ"DÔ"Dðñ ô �ð $(�”˜CÑ ØÔ)×0Ò0°Ñ5Ô5Ð5Ð5Ø�4øÝð 	ð 	ð 	Ø�5�5ð	øøøs3   ‚D, ’3§D, ³7·D, º7»D, ÁCD, Ä,
D:Ä9D:r   c                ó*   — t          | j        ¦  «        S ©N)Úlenr/   ©r6   s    r   Útotal_nodeszAtlasTreePlanner.total_nodesT   s   € å�4”;ÑÔÐr   c                ób   — t          d„ | j                             ¦   «         D ¦   «         ¦  «        S )Nc              3  ó(   K  — | ]}|j         ¯	d V — ŒdS )é   N©r&   ©Ú.0Úns     r   ú	<genexpr>z3AtlasTreePlanner.allocated_count.<locals>.<genexpr>Z   s)   è è € ÐBÐB˜°a´kÐB�1ÐBÐBÐBÐBÐBÐBr   )Úsumr/   ÚvaluesrN   s    r   Úallocated_countz AtlasTreePlanner.allocated_countX   s-   € åÐBÐB˜dœk×0Ò0Ñ2Ô2ÐBÑBÔBÑBÔBÐBr   NÚpointsúOptional[int]r   c                óx   — |€| j         n|}|dk    rt          j        S |dk    rt          j        S t          j        S )uQ   XÃ¡c Ä‘á»‹nh giai Ä‘oáº¡n thÄƒng tiáº¿n dá»±a trÃªn sá»‘ Ä‘iá»ƒm Ä‘Ã£ tÃ­ch lÅ©y.Né#   éK   )rZ   r   r   r   r   )r6   r[   Úptss      r   Úget_current_phasez"AtlasTreePlanner.get_current_phase\   s@   € à&, nˆdÔ"Ð"¸&ˆØ�"Š9ˆ9ÝÔ2Ð2Ø�BŠYˆYÝÔ6Ð6åÔ7Ð7r   ÚNonec                ól  — ddddg fdddddgfdd	dddgfd
ddddgfddddd
gfdddddgfg}d}t          dd¦  «        D ]-}d|› �}d|› d�}|                     |d|› �d||gf¦  «         |}Œ.t          |d¬¦  «        D ]M\  }\  }}}}}	t          ||t          j        ||||	¬¦  «        | j        |<   | j                             |¦  «         ŒNdddd|gfdd dd!dgfd"d#dd!dgfd$d%dd&d"gfd'd(d)d*d$gfd+d,d)d*d'gfd-d.d)d/d+gfg}
d-}t          d0d1¦  «        D ]>}d2|› �}|d3z  d4k    rd)nd}|d)k    rd5nd6}|
                     |d7|› �|||gf¦  «         |}Œ?t          |
d¬¦  «        D ]M\  }\  }}}}}	t          ||t          j        ||||	¬¦  «        | j        |<   | j                             |¦  «         ŒNd8d9d:d;|gfd<d=d>d?d8gfd@dAd>dBd<gfdCdDdEdFd@gfdGdHdEdIdCgfdJdKdLdMdGgfdNdOdLdPdJgfdQdRd:dSdNgfdTdUd:dVdQgfdWdXdYdZdTgfg
}dW}t          d[d\¦  «        D ]L}d]|› �}g d^¢}||t          |¦  «        z           }d_|› d`|› d�}|                     |da|› �|||gf¦  «         |}ŒMt          |d1¬¦  «        D ]M\  }\  }}}}}	t          ||t          j
        ||||	¬¦  «        | j        |<   | j                             |¦  «         ŒNdbS )cug   XÃ¢y dá»±ng lá»™ trÃ¬nh 115 Ä‘iá»ƒm ná»™i táº¡i chuáº©n má»±c tá»‘i Ä‘a hÃ³a lá»£i nhuáº­n tiá»�n tá»‡.Úsustain_rootzAtlas Gateway RootÚSustainu2   Ä�iá»ƒm gá»‘c khá»Ÿi Ä‘áº§u cÃ¢y ná»™i táº¡i AtlasÚsustain_waystone_1zShaping the Valleys Iz/+10% Chance for Waystones to drop 1 Tier higherÚsustain_waystone_2zShaping the Valleys IIÚsustain_adjacent_1zFrontier Scout Iz/+15% Chance to drop connected adjacent WaystoneÚsustain_adjacent_2zFrontier Scout IIÚsustain_notable_1zCartographer's Masteryz4Monsters drop +1 additional Waystone of current Tieré   é$   Úsustain_node_z1+3% Waystone Drop Quantity and Map Quality (Rank ú)zEndless Cartography rR   )Ústartr=   Úpack_connectorzVast Legions GatewayÚPackSizeu*   Má»Ÿ rá»™ng nhÃ¡nh máº­t Ä‘á»™ quÃ¡i váº­tÚpack_size_1zSwarming Hordes Iz+4% Monster Pack Size in MapsÚpack_size_2zSwarming Hordes IIÚrare_quant_1zNemesis Infusion Iz+15% More Rare Monsters in MapsÚgold_find_1zKalguuran Taxes IÚGoldz#+25% Gold Dropped by Slain MonstersÚgold_find_2zKalguuran Taxes IIÚgold_notablezFaustus' Favorz/Halves Gold Tax fee on Currency Exchange Marketé+   éL   Úmid_density_node_é   r   z&+2% Pack Size and +15% Gold Multiplierz +3% Magic/Rare Monster Pack SizezWealth & Density Úendgame_gatewayzOuter Rim NexusÚ
Expeditionu+   Cá»­a ngÃµ League Mechanics tá»‘i thÆ°á»£ngÚbreach_1zFlash of the RealmÚBreachz-+30% Breach Open/Close Speed & +20% SplintersÚbreach_2zClassified Portalsz7Breaches have +25% chance to contain an Additional BossÚ
delirium_1zUnending NightmareÚDeliriumz'Delirium Fog does not dissipate in mapsÚ
delirium_2zParanoia Manifestz*+40% Cluster Jewels & Simulacrum SplintersÚritual_1zOminous AltarsÚRitualz'Rerolling Favors costs 30% less TributeÚritual_2zBlood Tributez5Deferred items reappear 50% faster with high discountÚexpedition_1zDannig's Logbooksz +40% Increased Logbook Drop RateÚexpedition_2zAncient Kalguur Secretsz(Excavated Chests have +50% Item QuantityÚpinnacle_apexzGaze of the ArbiterÚPinnaclez(+100% Currency Drops from Citadel BosseséV   ét   Úapex_profit_node_)r€   rƒ   r†   r~   zApex z9 Multiplier: +5% Chance to duplicate High Currency (Tier zEndgame Fortune N)ÚrangerC   Ú	enumerater   r   r   r/   r0   r   rM   r   )r6   Úp1_specsÚprevÚirI   ÚdescÚidxr   ÚcatÚprereqsÚp2_specsÚp3_specsÚcat_lists                r   r5   z/AtlasTreePlanner._build_canonical_blueprint_115f   s*  € ð Ð1°9Ð>rÐtvÐwØ!Ð#:¸IÐGxð  |Jð  {Kð  LØ!Ð#;¸YÐHyð  }Qð  |Rð  SØ!Ð#5°yÐBsð  wKð  vLð  MØ!Ð#6¸	ÐCtð  xLð  wMð  NØ Ð":¸IÐG}ð  AUð  @Vð  Wð
ˆð #ˆÝ�q˜"‘”ð 	ð 	ˆAØ% !Ð%Ð%ˆCØKÀqÐKÐKÐKˆDØ�OŠO˜SÐ"<¸Ð"<Ð"<¸iÈÐPTÈvÐVÑWÔWÐWØˆDˆDå4=¸hÈaÐ4PÑ4PÔ4Pð 
	2ð 
	2Ñ0ˆCÑ0�#�t˜S $¨Ý/ØØÝÔ5Ø"ØØ!%Ø%ð ñ  ô  ˆDŒK˜Ñð Ô%×,Ò,¨SÑ1Ô1Ð1Ð1ð Ð5°zÐCoÐrvÐqwÐxØÐ/°Ð=\Ð_oÐ^pÐqØÐ0°*Ð>]Ð`mÐ_nÐoØÐ1°:Ð?`ÐcpÐbqÐrØÐ/°Ð9^ÐaoÐ`pÐqØÐ0°&Ð:_ÐboÐapÐqØÐ-¨vÐ7hÐkxÐjyÐzð
ˆð ˆÝ�r˜2‘”ð 	ð 	ˆAØ) aÐ)Ð)ˆCØ ™E QšJ˜J�&�&¨JˆCØ?BÀfº}¸}Ð;Ð;ÐRtˆDØ�OŠO˜SÐ"9°aÐ"9Ð"9¸3ÀÀtÀfÐMÑNÔNÐNØˆDˆDå4=¸hÈbÐ4QÑ4QÔ4Qð 
	2ð 
	2Ñ0ˆCÑ0�#�t˜S $¨Ý/ØØÝÔ9Ø"ØØ!%Ø%ð ñ  ô  ˆDŒK˜Ñð Ô%×,Ò,¨SÑ1Ô1Ð1Ð1ð Ð 1°<ÐAnÐquÐpvÐwØÐ-¨xÐ9hÐk|Ðj}Ð~ØÐ-¨xÐ9rÐuð  uAð  BØÐ/°Ð=fÐisÐhtÐuØÐ.°
Ð<hÐkwÐjxÐyØÐ)¨8Ð5^ÐamÐ`nÐoØ˜¨(Ð4kÐnxÐmyÐzØÐ0°,Ð@bÐeoÐdpÐqØÐ6¸ÐFpð  tBð  sCð  DØÐ3°ZÐAkÐn|Ðm}Ð~ð
ˆð ˆÝ�r˜3‘”ð 	ð 	ˆAØ) aÐ)Ð)ˆCØEÐEÐEˆHØ˜1�s 8™}œ}Ñ,Ô-ˆCØ]˜3Ð]Ð]ÐYZÐ]Ð]Ð]ˆDØ�OŠO˜SÐ"8°QÐ"8Ð"8¸#¸tÀdÀVÐLÑMÔMÐMØˆDˆDå4=¸hÈbÐ4QÑ4QÔ4Qð 
	2ð 
	2Ñ0ˆCÑ0�#�t˜S $¨Ý/ØØÝÔ:Ø"ØØ!%Ø%ð ñ  ô  ˆDŒK˜Ñð Ô%×,Ò,¨SÑ1Ô1Ð1Ð1ð
	2ð 
	2r   úOptional[AtlasPassiveNode]c                óž   ‡ — ‰ j         D ]C}‰ j        |         }|j        s-t          ˆ fd„|j        D ¦   «         ¦  «        }|rd|_        |c S ŒDdS )u|   
        PhÃ¢n bá»• tá»± Ä‘á»™ng Ä‘iá»ƒm tiáº¿p theo theo Ä‘Ãºng thá»© tá»± DAG (Prerequisites) vÃ  priority_order.
        c              3  óN   •K  — | ]}|‰j         v ¯‰j         |         j        V — Œ d S rL   )r/   r&   )rU   Úp_idr6   s     €r   rW   z7AtlasTreePlanner.allocate_next_point.<locals>.<genexpr>Ö   s<   øè è € Ð!tÐ!tÀ$Ð`dÐhlÔhsÐ`sÐ`s $¤+¨dÔ"3Ô"=Ð`sÐ`sÐ`sÐ`sÐ!tÐ!tr   TN)r0   r/   r&   Úallr$   )r6   rI   rJ   Úprereqs_mets   `   r   Úallocate_next_pointz$AtlasTreePlanner.allocate_next_pointÎ   sp   ø€ ð Ô,ð 	 ð 	 ˆCØ”;˜sÔ#ˆDØ”>ð  å!Ð!tÐ!tÐ!tÐ!tÈ$ÔJ\Ð!tÑ!tÔ!tÑtÔt�Øð  Ø%)�D”NØ�K�K�KøØˆtr   Úpoints_to_spendúList[AtlasPassiveNode]c                óˆ   — g }t          |¦  «        D ]/}|                      ¦   «         }|s n|                     |¦  «         Œ0|S )uA   PhÃ¢n bá»• má»™t Ä‘á»£t nhiá»�u Ä‘iá»ƒm ná»™i táº¡i liÃªn tiáº¿p.)r�   r¡   rC   )r6   r¢   Úallocated_nodesÚ_rJ   s        r   Úallocate_batchzAtlasTreePlanner.allocate_batchÜ   sY   € à24ˆÝ�Ñ'Ô'ð 	)ð 	)ˆAØ×+Ò+Ñ-Ô-ˆDØð Ø�Ø×"Ò" 4Ñ(Ô(Ð(Ð(ØÐr   c                óL   — | j                              ¦   «         D ]	}d|_        Œ
dS )u9   Ä�áº·t láº¡i toÃ n bá»™ tráº¡ng thÃ¡i phÃ¢n bá»• Ä‘iá»ƒm.FN)r/   rY   r&   )r6   rV   s     r   Ú
reset_treezAtlasTreePlanner.reset_treeæ   s2   € à”×#Ò#Ñ%Ô%ð 	 ð 	 ˆAØˆAŒKˆKð	 ð 	 r   úDict[str, Any]c           	     óì  — d„ | j                              ¦   «         D ¦   «         }t          |¦  «        }t          j        j        dt          j        j        dt          j        j        di}i }|D ]B}||j        j        xx         dz  cc<   | 	                    |j
        d¦  «        dz   ||j
        <   ŒC||                      |¦  «        j        t          |t          d| j        ¦  «        z  dz  d¦  «        ||dœS )uE   TÃ­nh toÃ¡n tá»•ng há»£p cÃ¡c chá»‰ sá»‘ ná»™i táº¡i Ä‘Ã£ phÃ¢n bá»•.c                ó    — g | ]}|j         ¯	|‘ŒS r   rS   rT   s     r   ú
<listcomp>z3AtlasTreePlanner.get_tree_stats.<locals>.<listcomp>í   s   € ÐJÐJÐJ ¸a¼kÐJ˜1ÐJÐJÐJr   r   rR   g      Y@)Útotal_allocated_pointsÚcurrent_phaseÚcompletion_pctÚphase_distributionÚcategory_distribution)r/   rY   rM   r   r   Úvaluer   r   r   rA   r!   ra   ÚroundÚmaxrO   )r6   r¥   Ú	total_ptsÚphase_countsÚcategory_countsrV   s         r   Úget_tree_statszAtlasTreePlanner.get_tree_statsë   s  € àJÐJ d¤k×&8Ò&8Ñ&:Ô&:ÐJÑJÔJˆÝ˜Ñ(Ô(ˆ	õ Ô+Ô1°1ÝÔ/Ô5°qÝÔ0Ô6¸ð
ˆð
 +-ˆà ð 	Qð 	QˆAØ˜œœÐ'Ð'Ô'¨1Ñ,Ð'Ð'Ñ'Ø*9×*=Ò*=¸a¼jÈ!Ñ*LÔ*LÈqÑ*PˆO˜AœJÑ'Ð'ð '0Ø!×3Ò3°IÑ>Ô>ÔDÝ# Yµ°Q¸Ô8HÑ1IÔ1IÑ%IÈUÑ$RÐTUÑVÔVØ".Ø%4ð
ð 
ð 	
r   )r+   )r,   r-   )r2   r   r9   r%   )r9   r   rL   )r[   r\   r9   r   )r9   rb   )r9   r›   )r¢   r   r9   r£   )r9   rª   )r   r   r   r   r8   r4   ÚpropertyrO   rZ   ra   r5   r¡   r§   r©   r¹   r   r   r   r*   r*   -   s  € € € € € ØoÐoð2ð 2ð 2ð 2ð 2ðð ð ð ð6 ð ð  ð  ñ „Xð ð ðCð Cð Cñ „XðCð8ð 8ð 8ð 8ð 8ðf2ð f2ð f2ð f2ðPð ð ð ðð ð ð ð ð  ð  ð  ð

ð 
ð 
ð 
ð 
ð 
r   r*   )r   Ú
__future__r   r1   r?   Údataclassesr   r   Úenumr   Útypingr   r   r	   r
   r   r   r   r   r   r*   r   r   r   ú<module>r¿      s+  ððð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ð>ð >ð >ð >ð >��Tñ >ô >ð >ð ð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ „ð	ðT
ð T
ð T
ð T
ð T
ñ T
ô T
ð T
ð T
ð T
r   