§
    d9¬j6  ã                  óü   — 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 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ e G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )uI  AutoPOE2 - Multi-Map Endurance Simulation Test Harness (Rule 4 Modular Component).
===================================================================================
[MÃ” PHá»ŽNG THUáº¬T TOÃ�N HEADLESS - KHÃ”NG PHáº¢I LIVE GAME] (Rule 5 Compliance)

Domain: QA & Governance Sentinel (SÆ° Ä‘oÃ n 4) phá»‘i há»£p SÆ° Ä‘oÃ n 1, 2, 3.
ThÃ nh pháº§n há»— trá»£ kiá»ƒm thá»­ Ä‘á»™ bá»�n (Endurance Simulation Harness) cho chuá»—i 20 maps liÃªn tá»¥c:
- SÆ° Ä‘oÃ n 1: Boss Phase Transition (Invulnerable AOE, Hollow Form stance, CI Staff 0 death).
- SÆ° Ä‘oÃ n 2: Camera & Dynamic Minimap Calibrator (Zoom 1.0x-2.0x, Yaw 0-45Â°, INV-WASD-MIN-DWELL >= 300ms).
- SÆ° Ä‘oÃ n 3: Faustus Auto-Profit Taking, Waterfall Cascade, Waystone Consumption & Stash Restock.
- SÆ° Ä‘oÃ n 4: LiveRunSentinel Zero-Input Invariant Gating (100% Healthy, 0 Anomaly).
é    )Úannotations)Ú	dataclassÚfieldN)ÚAnyÚDictÚListÚOptionalÚTuple)Ú
AtlasGraph)ÚAtlasProgressionService)ÚAutoProfitTaker)ÚLiveRunSentinel)ÚMinimapCameraCalibratorc                  óÈ   — 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ed<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   dS )ÚEnduranceMapRunRecorduV   Báº£n ghi thá»‘ng kÃª chi tiáº¿t cho má»™t map trong chuá»—i kiá»ƒm thá»­ Ä‘á»™ bá»�n.ÚintÚ	map_indexÚtierÚfloatÚclear_time_secÚboolÚsurvivedÚhp_minÚes_minÚboss_phase_triggeredÚ
zoom_levelÚorientation_degÚwasd_dwell_secÚgold_lootedÚgold_tax_paidÚending_goldÚwaystones_in_inventoryÚwaystone_restockedÚnet_worth_chaosÚnet_worth_divineÚsentinel_healthyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__© ó    úAC:\Projects\AutoPOE2\tests\helpers\multi_map_endurance_harness.pyr   r      sá   € € € € € € à`Ð`Ø€N€N�NØ€I€I�IØÐÐÑØ€N€N�NØ€K€K�KØ€K€K�KØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑÐÐ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	<   ded
<   ded<   ded<   ded<   ded<   ded<   ded<   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S )ÚEnduranceSimulationReportuG   BÃ¡o cÃ¡o tá»•ng há»£p sau khi hoÃ n táº¥t chuá»—i 20 maps liÃªn tá»¥c.r   Útotal_maps_runr   Úsurvival_rate_pctÚtotal_deathsÚaverage_clear_time_secÚtotal_clear_time_secÚtotal_waystones_consumedÚtotal_waystones_restockedÚinitial_net_worth_chaosÚfinal_net_worth_chaosÚdelta_net_worth_chaosÚdelta_net_worth_divineÚtotal_gold_lootedÚtotal_gold_tax_paidÚfinal_gold_balanceÚsentinel_anomalies_detectedÚsentinel_health_pctÚboss_phases_survivedÚcamera_calibrations_performedÚarbitrage_sessions_executed)Údefault_factoryzList[EnduranceMapRunRecord]Úmap_recordsN)r'   r(   r)   r*   r+   r   ÚlistrE   r,   r-   r.   r0   r0   2   s  € € € € € € àQÐQØÐÐÑØÐÐÑØÐÐÑØ!Ð!Ð!Ñ!ØÐÐÑØ!Ð!Ð!Ñ!Ø"Ð"Ð"Ñ"Ø"Ð"Ð"Ñ"Ø Ð Ð Ñ Ø Ð Ð Ñ Ø!Ð!Ð!Ñ!ØÐÐÑØÐÐÑØÐÐÑØ$Ð$Ð$Ñ$ØÐÐÑØÐÐÑØ&Ð&Ð&Ñ&Ø$Ð$Ð$Ñ$Ø/4¨uÀTÐ/JÑ/JÔ/J€KÐJÐJÐJÑJÐJÐJr-   r0   c                  óV   — e Zd ZdZ	 	 	 	 ddd„Zdd„Zdd„Zd d„Zd!d„Zd"d„Z	d#d$d„Z
dS )%ÚMultiMapEnduranceHarnessu^   Harness chuyÃªn biá»‡t Ä‘iá»�u phá»‘i mÃ´ phá»�ng chuá»—i multi-map liÃªn tá»¥c (Rule 4 SSoL).é'  é   é   é*   Úinitial_goldr   Úinitial_waystones_in_bagÚinitial_waystones_in_stashÚrandom_seedc                ó˜  — t          j        |¦  «         d| _        d| _        d| _        d| _        d| _        d| _        d| _        || _	        || _
        || _        d| _        d| _        ddddd	d
dddddœ
| _        t          ¦   «         | _        t#          ¦   «         | _        t'          ¦   «         | _        t+          dd¬¦  «        | _        d S )Né   é¼  i�  r   é<   é2   éA   é-   é#   é   é
   éP   é   )
zOrb of TransmutationzOrb of AugmentationzOrb of AlterationúOrb of AlchemyzOrb of Scouringú	Regal OrbúExalted Orbú	Chaos Orbú
Divine OrbzMirror of KalandraÚ )Ú
target_pidÚlog_path)ÚrandomÚseedÚmax_hpÚmax_esÚmax_manaÚ
current_hpÚ
current_esÚcurrent_manar3   Úcurrent_goldÚwaystones_in_bagÚwaystones_in_stashr6   r7   Úwalletr   Úatlas_servicer   Ú
calibratorr   Úprofit_takerr   Úsentinel)ÚselfrM   rN   rO   rP   s        r.   Ú__init__z!MultiMapEnduranceHarness.__init__N   sä   € õ 	Œ�KÑ Ô Ð ð ˆŒØˆŒØˆŒØˆŒØˆŒØˆÔØˆÔð )ˆÔØ 8ˆÔØ"<ˆÔØ()ˆÔ%Ø)*ˆÔ&ð %'Ø#%Ø!#Ø Ø!ØØØØØ"#ð'
ð '
ˆŒõ 5Ñ6Ô6ˆÔÝ1Ñ3Ô3ˆŒÝ+Ñ-Ô-ˆÔÝ'°1¸rÐBÑBÔBˆŒˆˆr-   r   r   ÚreturnúTuple[bool, int, int]c                ó‚   — |dz  dk    p|dk    }|sdS t          j        dd¦  «        }d| _        | j        | _        dd|fS )	uÒ   [SÆ° Ä‘oÃ n 1] MÃ´ phá»�ng biáº¿n cá»‘ chuyá»ƒn phase Boss (Invulnerable, AOE blast).
        NhÃ¢n váº­t CI xoay Hollow Form stance, nÃ© chiÃªu, ES chá»‹u sÃ¡t thÆ°Æ¡ng nhÆ°ng khÃ´ng bao giá»� vá»� 0.
        é   r   rZ   )FrR   rS   if  i  rR   T)re   Úrandintrj   rh   rk   )ru   r   r   Úhas_boss_phaseÚmin_es_recordeds        r.   Úsimulate_boss_phase_transitionz7MultiMapEnduranceHarness.simulate_boss_phase_transitionz   sX   € ð
 $ a™-¨1Ò,Ð=°$¸"²*ˆØð 	"Ø!�>õ !œ.¨¨tÑ4Ô4ˆØˆŒØœ+ˆŒà�Q˜Ð'Ð'r-   úTuple[float, float, float]c                óì   — g d¢}||t          |¦  «        z           }|dz  dz  }| j                             ||¬¦  «         | j                             d¬¦  «        }|dk    sJ d|d	›d
�¦   «         ‚|||fS )u^   [SÆ° Ä‘oÃ n 2] MÃ´ phá»�ng hiá»‡u chuáº©n gÃ³c xoay vÃ  tá»· lá»‡ zoom camera/minimap Ä‘á»™ng.)g      ð?gffffffö?g       @g      .@g      N@)r   r   gffffffÖ?)Úraw_dwell_secg333333Ó?u)   Vi pháº¡m INV-WASD-MIN-DWELL: Dwell time z.3fz
s < 0.30s!)Úlenrr   Úset_calibrationÚadjust_dwell_time)ru   r   Úzoom_levelsÚchosen_zoomÚ
chosen_yawÚ	dwell_secs         r.   Ú'simulate_camera_and_minimap_calibrationz@MultiMapEnduranceHarness.simulate_camera_and_minimap_calibration‹   sž   € ð &�o�oˆØ! )­c°+Ñ.>Ô.>Ñ">Ô?ˆØ $Ñ&¨$Ñ.ˆ
àŒ×'Ò'°;ÐPZÐ'Ñ[Ô[Ð[Ø”O×5Ò5ÀDÐ5ÑIÔIˆ	ð ˜DÒ Ð Ð Ð"gÈiÐ"gÐ"gÐ"gÐ"gÑ Ô Ð à˜J¨	Ð1Ð1r-   r   c                ó  — | j         dk    s
J d¦   «         ‚| xj         dz  c_         | xj        dz  c_        d}| j         dk     r=| j        dk    r2| xj        dz  c_        | xj         dz  c_         | xj        dz  c_        d}|S )uU   [SÆ° Ä‘oÃ n 3] TiÃªu thá»¥ Waystone vÃ  tá»± Ä‘á»™ng tÃ¡i náº¡p tá»« Stash khi cáº§n.r   u-   Háº¿t Waystone trong tÃºi Ä‘á»“! Fail-closed.rR   Fr\   rJ   T)rn   r6   ro   r7   )ru   Ú	restockeds     r.   Úsimulate_logistics_and_restockz7MultiMapEnduranceHarness.simulate_logistics_and_restockš   s®   € àÔ$ qÒ(Ð(Ð(Ð*YÑ(Ô(Ð(ØÐÔ Ñ"ÐÔØÐ%Ô%¨Ñ*Ð%Ô%àˆ	ØÔ  1Ò$Ð$¨Ô)@ÀAÒ)EÐ)EàÐ#Ô# qÑ(Ð#Ô#ØÐ!Ô! QÑ&Ð!Ô!ØÐ*Ô*¨aÑ/Ð*Ô*ØˆIàÐr-   c                óà  — | j                              | j        | j        ¬¦  «        }d}|j        r |j        D ]t}|j        }|j        }t          d| j                             |d¦  «        |j	        z
  ¦  «        | j        |<   | j                             |d¦  «        |j
        z   | j        |<   Œu|j        }t          d| j        |z
  ¦  «        | _        | j        dk    sJ d| j        › d�¦   «         ‚|S )uU   [SÆ° Ä‘oÃ n 3] Tá»± Ä‘á»™ng chá»‘t lá»�i ngoáº¡i tá»‡ tháº·ng dÆ° trÃªn sÃ n Faustus.)Úcombined_holdingsrm   r   iˆ  u"   Vi pháº¡m quá»¹ vÃ ng dá»± trá»¯: z < 5000 Gold!)rs   Úevaluate_profit_takingrp   rm   ÚordersÚsell_currencyÚbuy_currencyÚmaxÚgetÚsell_amountÚexpected_buy_amountÚtotal_estimated_gold_tax)ru   ÚplanÚtax_paidÚorderÚsell_curÚbuy_curs         r.   Ú#simulate_faustus_auto_profit_takingz<MultiMapEnduranceHarness.simulate_faustus_auto_profit_takingª   s  € àÔ ×7Ò7Ø"œkØÔ*ð 8ñ 
ô 
ˆð
 ˆØŒ;ð 		Eàœð _ð _�Ø Ô.�ØÔ,�Ý(+¨A¨t¬{¯ª¸xÈÑ/KÔ/KÈeÔN_Ñ/_Ñ(`Ô(`�”˜HÑ%Ø'+¤{§¢°wÀÑ'BÔ'BÀUÔE^Ñ'^�”˜GÑ$Ð$àÔ4ˆHÝ # A tÔ'8¸8Ñ'CÑ DÔ DˆDÔð Ô  DÒ(Ð(Ð(Ð*oÈtÔO`Ð*oÐ*oÐ*oÑ(Ô(Ð(Øˆr-   c                ó”  — t          t          j        ¦   «         dz  ¦  «        |dz  z   }| j        | j        | j        | j        | j        | j        d|dz  z   d|dz  z   dd|dœ}| j         	                    |¦  «         | j         
                    |¬	¦  «        }| j                             ¦   «         }|j        ot          |¦  «        d
k    S )uW   [SÆ° Ä‘oÃ n 4] LiveRunSentinel giÃ¡m sÃ¡t thá»¥ Ä‘á»™ng cÃ¡c báº¥t biáº¿n kiáº¿n trÃºc.iè  i`ê  g     Àb@g      $@g     @o@ç        T)Úhprg   Úesrh   Úmanari   Úpos_xÚpos_yÚpos_zÚ	is_onlineÚtimestamp_ms)Únow_msr   )r   Útimerj   rg   rk   rh   rl   ri   rt   Úupdate_telemetryÚprocess_tickÚ
get_statusÚ
is_healthyr‚   )ru   r   Úsimulated_time_msÚ	telemetryÚ	anomaliesÚstatuss         r.   Úsimulate_sentinel_health_checkz7MultiMapEnduranceHarness.simulate_sentinel_health_checkÁ   sÒ   € å¥¤	¡¤¨dÑ 2Ñ3Ô3°yÀ5Ñ7HÑIÐð ”/Ø”kØ”/Ø”kØÔ%ØœØ˜i¨$Ñ.Ñ/Ø˜i¨$Ñ.Ñ/ØØØ-ð
ð 
ˆ	ð 	Œ×&Ò& yÑ1Ô1Ð1Ø”M×.Ò.Ð6GÐ.ÑHÔHˆ	Ø”×)Ò)Ñ+Ô+ˆàÔ Ð8¥S¨¡^¤^°qÒ%8Ð8r-   é   Ú
total_mapsr0   c           	     óÚ  — | j         j                             | j        | j        ¬¦  «        j        }g }d}d}d}d}d}d}	t          d|dz   ¦  «        D �]3}
t          d|
dz   dz  dz   ¦  «        }|                      ¦   «         }|  	                    |
¦  «        \  }}}|dz  }|  
                    |
|¦  «        \  }}}|r|dz  }d|
dz  d	z  z   }||z  }d
|dz  z   }| xj        |z  c_        ||z  }| j                             dd¦  «        dz   | j        d<   | j                             dd¦  «        dz   | j        d<   | j                             dd¦  «        dz   | j        d<   | j                             dd¦  «        dz   | j        d<   |
dv r&| j                             dd¦  «        dz   | j        d<   d|
d›�}| j                              |d| j        | j        ¬¦  «        }d}|
dz  dk    r|                      ¦   «         }||z  }|	dz  }	|                      |
¦  «        }t          d@i d|
“d|“d|“dd“d|“d|“d|“d|“d |“d!|“d"|“d#|“d$| j        “d%| j        “d&|“d'|j        “d(|j        “d)|“Ž}|                     |¦  «         �Œ5| j         j                             | j        | j        ¬¦  «        j        }||z
  }|d*z  }t)          d@i d+|“d,d-“d.d“d/t+          ||z  d¦  «        “d0t+          |d¦  «        “d1| j        “d2| j        “d3t+          |d¦  «        “d4t+          |d¦  «        “d5t+          |d¦  «        “d6t+          |d¦  «        “d7|“d8|“d9| j        “d:d“d;d-“d<|“d=|“d>|	“d?|“ŽS )AuP   Cháº¡y chuá»—i mÃ´ phá»�ng Ä‘á»™ bá»�n 20 maps liÃªn tá»¥c khÃ´ng giÃ¡n Ä‘oáº¡n.)rp   rm   rŸ   r   rR   é   r\   g      E@é   gÍÌÌÌÌÌü?iÐ  é´   r]   é   r^   r_   r`   é   )r·   é   é   ra   Úendurance_map_node_Ú02dT)Únode_idÚbonus_completedrp   rm   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   g      b@r1   r2   g      Y@r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rE   r,   )rq   Únet_worth_estimatorÚcalculate_net_worthrp   rm   Útotal_net_worth_chaosÚrangeÚminrŒ   r‰   r~   r”   Úon_map_completedr�   r²   r   rn   Úcurrent_net_worth_chaosÚcurrent_net_worth_divineÚappendr0   Úroundr6   r7   )ru   r´   Úinitial_net_worthÚrecordsÚtotal_clear_timer<   r=   rA   rB   rC   Úm_idxr   r‹   ÚzoomÚyawÚdwellÚboss_triggeredr   r   Ú
clear_timeÚ	gold_dropr¿   Ú	atlas_resr™   Úsentinel_okÚrecordÚfinal_net_worthÚdelta_chaosÚdelta_divines                                r.   Úrun_endurance_simulationz1MultiMapEnduranceHarness.run_endurance_simulationÙ   sR  € à Ô.ÔB×VÒVØ”;¨TÔ->ð Wñ 
ô 
ä
ð 	ð 02ˆØÐØÐØÐØ ÐØ()Ð%Ø&'Ð#å˜1˜j¨1™nÑ-Ô-ð H	#ñ H	#ˆEÝ�r˜E A™I¨!Ñ+¨aÑ/Ñ0Ô0ˆDð ×;Ò;Ñ=Ô=ˆIð  $×KÒKÈEÑRÔRÑˆD�#�uØ)¨QÑ.Ð)ð .2×-PÒ-PÐQVÐX\Ñ-]Ô-]Ñ*ˆN˜F FØð *Ø$¨Ñ)Ð$ð  ¨¡¨cÑ 1Ñ1ˆJØ 
Ñ*Ðð   s¡
Ñ+ˆIØÐÔ Ñ*ÐÔØ Ñ*Ðð -1¬K¯OªOÐ<LÈaÑ,PÔ,PÐSTÑ,TˆDŒKÐ(Ñ)Ø'+¤{§¢°{ÀAÑ'FÔ'FÈÑ'JˆDŒK˜Ñ$Ø)-¬¯ª¸ÈÑ)JÔ)JÈQÑ)NˆDŒK˜Ñ&Ø'+¤{§¢°{ÀAÑ'FÔ'FÈÑ'KˆDŒK˜Ñ$à˜Ð#Ð#Ø,0¬K¯OªO¸LÈ!Ñ,LÔ,LÈqÑ,P�”˜LÑ)ð 8¨EÐ7Ð7Ð7ˆGØÔ*×;Ò;ØØ $Ø”{Ø!Ô.ð	 <ñ ô ˆIð ˆHØ�q‰y˜AŠ~ˆ~Ø×CÒCÑEÔE�Ø# xÑ/Ð#Ø+¨qÑ0Ð+ð ×=Ò=¸eÑDÔDˆKå*ð ð ð Ø˜%ðà�Tðð  *˜zðð ˜ð	ð
 �vðð �vðð &4 ^ðð  ˜4ðð !$ ðð  %˜uðð &˜Iðð '˜hðð !Ô-Ð-ðð (,Ô'<Ð'<ðð $- 9ðð  !*Ô AÐ Að!ð" "+Ô!CÐ!Cð#ð$ "- ð%ˆFð( �NŠN˜6Ñ"Ô"Ð"Ñ"àÔ,Ô@×TÒTØ”;¨TÔ->ð Uñ 
ô 
ä
ð 	ð &Ð(9Ñ9ˆØ" UÑ*ˆå(ð 
ð 
ð 
Ø%˜:ð
à#˜eð
ð ˜ð
õ $)Ð)9¸JÑ)FÈÑ#JÔ#JÐ#Jð	
õ
 "'Ð'7¸Ñ!;Ô!;Ð!;ð
ð &*Ô%BÐ%Bð
ð '+Ô&DÐ&Dð
õ %*Ð*;¸QÑ$?Ô$?Ð$?ð
õ #(¨¸Ñ";Ô";Ð";ð
õ #(¨°QÑ"7Ô"7Ð"7ð
õ $)¨°qÑ#9Ô#9Ð#9ð
ð 0Ð/ð
ð !4Ð 3ð
ð  $Ô0Ð0ð
ð )*¨ð
ð  !& ð!
ð" "6Ð!5ð#
ð$ +HÐ*Gð%
ð& )DÐ(Cð'
ð(  ˜ð)
ð 	
r-   N)rI   rJ   rK   rL   )rM   r   rN   r   rO   r   rP   r   )r   r   r   r   rw   rx   )r   r   rw   r   )rw   r   )rw   r   )r   r   rw   r   )r³   )r´   r   rw   r0   )r'   r(   r)   r*   rv   r~   r‰   rŒ   r�   r²   rÛ   r,   r-   r.   rH   rH   K   sË   € € € € € ØhÐhð "Ø()Ø*,Øð*Cð *Cð *Cð *Cð *CðX(ð (ð (ð (ð"2ð 2ð 2ð 2ðð ð ð ð ð ð ð ð.9ð 9ð 9ð 9ð0t
ð t
ð t
ð t
ð t
ð t
ð t
r-   rH   )r*   Ú
__future__r   Údataclassesr   r   re   r©   Útypingr   r   r   r	   r
   Úsrc.assistant_tool.atlas.graphr   Ú,src.assistant_tool.atlas.progression_servicer   Ú6src.assistant_tool.currency_exchange.auto_profit_takerr   Ú src.assistant_tool.live_sentinelr   Ú7src.assistant_tool.navigation.minimap_camera_calibratorr   r   r0   rH   r,   r-   r.   ú<module>rä      s}  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø €€€Ø €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø PÐ PÐ PÐ PÐ PÐ PØ RÐ RÐ RÐ RÐ RÐ RØ <Ð <Ð <Ð <Ð <Ð <Ø [Ð [Ð [Ð [Ð [Ð [ð ðð ð ð ð ñ ô ñ „ðð, ðKð Kð Kð Kð Kñ Kô Kñ „ðKð0B
ð B
ð B
ð B
ð B
ñ B
ô B
ð B
ð B
ð B
r-   