§
    ¼�žjê  ã                   ó¶   — d Z ddl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  ej        d¦  «        Ze G d„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )	uÏ   
Bá»™ Theo DÃµi PhiÃªn ChÆ¡i & LÆ°á»£t Cháº¡y Báº£n Ä�á»“ (Live Session & Run Tracker)
Ghi nháº­n thá»�i gian hoÃ n thÃ nh (Clear Time), sá»‘ láº§n tá»­ vong, quÃ¡i tiÃªu diá»‡t vÃ  lá»‹ch sá»­ cÃ y cuá»‘c.
é    N)ÚasdictÚ	dataclass)ÚCallableÚDictÚListÚOptionalÚ
RunTrackerc                   óŒ   — 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
<   dZeed<   dZeed<   dS )ÚMapRunRecordÚrun_idÚ	area_nameÚ
area_levelÚ
start_timeç        Úend_timeÚduration_secondsr   Údeaths_countÚmonsters_killedÚIN_PROGRESSÚstatusÚpeak_dpsN)Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__ÚstrÚfloatr   r   r   r   r   r   © ó    ú6C:\Projects\AutoPOE2\src\agentic_engine\run_tracker.pyr   r      sš   € € € € € € à€K€K�KØ€N€N�NØ€O€O�OØÐÐÑØ€HˆeÐÐÑØ!Ð�eÐ!Ð!Ñ!Ø€L�#ÐÐÑØ€O�SÐÐÑØ€FˆCÐÐÑØ€HˆeÐÐÑÐÐr    r   c                   óº   — e Zd ZdZddefd„Zdeegdf         ddfd„Zdd
ede	de
e         fd„Zdd„Zddede	ddfd„Zdefd„Zdeeef         fd„Zdd„Zdd„ZdS )r	   uP   
    Quáº£n lÃ½ phiÃªn chÆ¡i thá»�i gian thá»±c vÃ  lá»‹ch sá»­ cháº¡y map.
    úcaptures/run_history.jsonÚhistory_filec                 ó‚   — || _         d | _        g | _        d| _        d| _        g | _        |                      ¦   «          d S )Né   r   )r$   Úcurrent_runÚrun_historyÚ_next_run_idÚtotal_deaths_all_timeÚ_on_run_complete_callbacksÚ_load_history)Úselfr$   s     r!   Ú__init__zRunTracker.__init__#   sJ   € Ø(ˆÔØ37ˆÔØ/1ˆÔØˆÔØ%&ˆÔ"ØPRˆÔ'Ø×ÒÑÔÐÐÐr    ÚcbNÚreturnc                 ó:   — | j                              |¦  «         d S ©N)r+   Úappend)r-   r/   s     r!   Úregister_run_complete_listenerz)RunTracker.register_run_complete_listener,   s   € ØÔ'×.Ò.¨rÑ2Ô2Ð2Ð2Ð2r    r   r   r   c           	      ó  ‡— t          j         ¦   «         }d}t          ˆfd„dD ¦   «         ¦  «        }| j        ré| j        j        dk    rÙ|| j        _        t          || j        j        z
  d¦  «        | j        _        |rd| j        _        nd| j        _        | j        }| j         	                    | j        ¦  «         |  
                    ¦   «          | j        D ]B}	  ||¦  «         Œ# t          $ r'}t                               d|› �¦  «         Y d}~Œ;d}~ww xY wd| _        |s^‰r\t          | j        ‰||d¬	¦  «        | _        | xj        dz  c_        t                               d
| j        j        › d‰› d|› d�¦  «         |S )u?   
        Xá»­ lÃ½ khi ngÆ°á»�i chÆ¡i Ä‘á»•i khu vá»±c.
        Nc              3   óD   •K  — | ]}|‰                      ¦   «         v V — Œd S r2   )Úlower)Ú.0Útr   s     €r!   ú	<genexpr>z,RunTracker.on_zone_change.<locals>.<genexpr>6   sF   øè è € ð !
ð !
àð �—’Ñ"Ô"Ð"ð!
ð !
ð !
ð !
ð !
ð !
r    )ÚhideoutÚtownÚ
encampmentÚ
settlementÚsanctumÚrelicÚshoresr   r&   Ú	COMPLETEDÚTRANSITIONEDu*   [RunTracker] Lá»—i callback run complete: )r   r   r   r   r   u,   [RunTracker] Khá»Ÿi Ä‘á»™ng LÆ°á»£t cháº¡y #z: z (Level ú))ÚtimeÚanyr'   r   r   Úroundr   r   r(   r3   Ú_save_historyr+   Ú	ExceptionÚloggerÚerrorr   r)   Úinfor   )r-   r   r   ÚnowÚcompleted_runÚis_town_or_hideoutr/   Úes    `      r!   Úon_zone_changezRunTracker.on_zone_change/   s  ø€ õ Œi‰kŒkˆØˆå ð !
ð !
ð !
ð !
àbð!
ñ !
ô !
ñ 
ô 
Ðð Ôð 	$ Ô 0Ô 7¸=Ò HÐ HØ(+ˆDÔÔ%Ý05°c¸DÔ<LÔ<WÑ6WÐYZÑ0[Ô0[ˆDÔÔ-à!ð 9Ø*5�Ô Ô'Ð'à*8�Ô Ô'à Ô,ˆMØÔ×#Ò# DÔ$4Ñ5Ô5Ð5Ø×ÒÑ Ô Ð àÔ5ð Sð S�ðSØ�B�}Ñ%Ô%Ð%Ð%øÝ ð Sð Sð SÝ—L’LÐ!QÈaÐ!QÐ!QÑRÔRÐRÐRÐRÐRÐRÐRøøøøðSøøøð  $ˆDÔð "ð 		D ið 		DÝ+ØÔ(Ø#Ø%ØØ$ð ñ  ô  ˆDÔð ÐÔ Ñ"ÐÔÝ�KŠKð  CÀtÔGWÔG^ð  Cð  CÐbkð  Cð  CÐuð  Cð  Cð  Cñ  Dô  Dð  DàÐs   ÃC'Ã'
DÃ1DÄDc                 óÌ   — | xj         dz  c_         | j        rL| j        xj        dz  c_        t                               d| j        j        › d| j        j        › d�¦  «         dS dS )uI   Ghi nháº­n sá»± kiá»‡n ngÆ°á»�i chÆ¡i tá»­ tráº­n trong run hiá»‡n táº¡i.r&   u-   [RunTracker] Ghi nháº­n tá»­ vong trong run #z (z).N)r*   r'   r   rJ   Úwarningr   r   ©r-   s    r!   Úrecord_deathzRunTracker.record_death_   s£   € àÐ"Ô" aÑ'Ð"Ô"ØÔð 	FØÔÐ)Ô)¨QÑ.Ð)Ô)Ý�NŠNð  EÈ4ÔK[ÔKbð  Eð  EÐfjÔfvô  gAð  Eð  Eð  Eñ  Fô  Fð  Fð  Fð  Fð	Fð 	Fr    r   r   Úkill_incrementc                 óz   — | j         r3|| j         j        k    r|| j         _        | j         xj        |z  c_        dS dS )uH   Cáº­p nháº­t chá»‰ sá»‘ chiáº¿n Ä‘áº¥u liÃªn tá»¥c cho run hiá»‡n táº¡i.N)r'   r   r   )r-   r   rV   s      r!   Úupdate_run_statszRunTracker.update_run_statsf   sP   € àÔð 	?Ø˜$Ô*Ô3Ò3Ð3Ø,4�Ô Ô)ØÔÐ,Ô,°Ñ>Ð,Ô,Ð,Ð,ð	?ð 	?r    c                 ó�   — | j         r>| j         j        dk    r.t          t          j        ¦   «         | j         j        z
  d¦  «        S dS )Nr   r&   r   )r'   r   rG   rE   rT   s    r!   Úget_current_run_durationz#RunTracker.get_current_run_durationm   sD   € ØÔð 	G Ô 0Ô ;¸aÒ ?Ð ?Ý�œ™œ tÔ'7Ô'BÑBÀAÑFÔFÐFØˆsr    c                 ó¤  — t          | j        ¦  «        }t          | j        t	          d„ | j        D ¦   «         ¦  «        ¦  «        }|dk    rdd|ddœS d„ | j        D ¦   «         }|s|d|ddœS t	          d„ |D ¦   «         ¦  «        t          |¦  «        z  }t          d„ |D ¦   «         ¦  «        }|t          |d¦  «        |t          |d¦  «        dœS )	u3   Tá»•ng há»£p thÃ´ng sá»‘ phiÃªn chÆ¡i hiá»‡n táº¡i.c              3   ó$   K  — | ]}|j         V — Œd S r2   )r   ©r8   Úrs     r!   r:   z1RunTracker.get_session_summary.<locals>.<genexpr>u   s$   è è € Ð:dÐ:dÈa¸1¼>Ð:dÐ:dÐ:dÐ:dÐ:dÐ:dr    r   r   )Ú
total_runsÚavg_clear_timeÚtotal_deathsÚfastest_clearc                 ó:   — g | ]}|j         d v ¯|j        dk    ¯|‘ŒS ))rB   rC   g      $@)r   r   r]   s     r!   ú
<listcomp>z2RunTracker.get_session_summary.<locals>.<listcomp>   sU   € ð  Bð  Bð  B ¸¼ÐEbÐ9bÐ9bÐghÔgyð  }Aò  hAð  hA˜!ð  hAð  hAð  hAr    c              3   ó$   K  — | ]}|j         V — Œd S r2   ©r   r]   s     r!   r:   z1RunTracker.get_session_summary.<locals>.<genexpr>‰   s%   è è € ÐBÐB¨a�qÔ)ÐBÐBÐBÐBÐBÐBr    c              3   ó$   K  — | ]}|j         V — Œd S r2   rf   r]   s     r!   r:   z1RunTracker.get_session_summary.<locals>.<genexpr>Š   s%   è è € ÐFÐF°!˜1Ô-ÐFÐFÐFÐFÐFÐFr    r&   )Úlenr(   Úmaxr*   ÚsumÚminrG   )r-   r_   ra   Úcompleted_runsÚavg_timeÚfastest_times         r!   Úget_session_summaryzRunTracker.get_session_summaryr   s#  € å˜Ô)Ñ*Ô*ˆ
Ý˜4Ô5µsÐ:dÐ:dÐSWÔScÐ:dÑ:dÔ:dÑ7dÔ7dÑeÔeˆà˜Š?ˆ?àØ"%Ø ,Ø!$ð	ð ð ð Bð  B TÔ%5ð  Bñ  Bô  Bˆàð 	à(Ø"%Ø ,Ø!$ð	ð ð õ ÐBÐB°>ÐBÑBÔBÑBÔBÅSÈÑEXÔEXÑXˆÝÐFÐF°~ÐFÑFÔFÑFÔFˆð %Ý# H¨aÑ0Ô0Ø(Ý" <°Ñ3Ô3ð	
ð 
ð 	
r    c           	      óö  — t           j                             | j        ¦  «        rÔ	 t	          | j        dd¬¦  «        5 }t          j        |¦  «        }|D ]&}| j                             t          di |¤Ž¦  «         Œ'	 d d d ¦  «         n# 1 swxY w Y   | j        r(t          d„ | j        D ¦   «         ¦  «        dz   | _        d S d S # t          $ r(}t                               d|› �¦  «         Y d }~d S d }~ww xY wd S )Nr^   úutf-8©Úencodingc              3   ó$   K  — | ]}|j         V — Œd S r2   )r   r]   s     r!   r:   z+RunTracker._load_history.<locals>.<genexpr>›   s$   è è € Ð+OÐ+O¸¨A¬HÐ+OÐ+OÐ+OÐ+OÐ+OÐ+Or    r&   u/   [RunTracker] KhÃ´ng thá»ƒ Ä‘á»�c file history: r   )ÚosÚpathÚexistsr$   ÚopenÚjsonÚloadr(   r3   r   ri   r)   rI   rJ   rK   )r-   ÚfÚdataÚitemrP   s        r!   r,   zRunTracker._load_history“   sŒ  € ÝŒ7�>Š>˜$Ô+Ñ,Ô,ð 		TðTÝ˜$Ô+¨S¸7ÐCÑCÔCð FÀqÝœ9 Q™<œ<�DØ $ð Fð F˜ØÔ(×/Ò/µÐ0DÐ0D¸tÐ0DÐ0DÑEÔEÐEÐEðFðFð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Fð Ô#ð TÝ(+Ð+OÐ+O¸dÔ>NÐ+OÑ+OÔ+OÑ(OÔ(OÐRSÑ(S�DÔ%Ð%Ð%ðTð Tøåð Tð Tð TÝ—’ÐRÈqÐRÐRÑSÔSÐSÐSÐSÐSÐSÐSÐSøøøøðTøøøð		Tð 		Ts:   ¦C ½>BÁ<C ÂBÂC ÂBÂ0C Ã
C6ÃC1Ã1C6c                 ó¤  — t          j        t           j                             | j        ¦  «        pdd¬¦  «         	 t          | j        dd¬¦  «        5 }t          j        d„ | j        dd …         D ¦   «         |d	d
¬¦  «         d d d ¦  «         d S # 1 swxY w Y   d S # t          $ r(}t                               d|› �¦  «         Y d }~d S d }~ww xY w)Nú.T)Úexist_okÚwrq   rr   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r   )r   r]   s     r!   rd   z,RunTracker._save_history.<locals>.<listcomp>£   s   € ÐFÐFÐF¨�6 !™9œ9ÐFÐFÐFr    i8ÿÿÿé   F)ÚindentÚensure_asciiu!   [RunTracker] Lá»—i lÆ°u history: )ru   Úmakedirsrv   Údirnamer$   rx   ry   Údumpr(   rI   rJ   rK   )r-   r{   rP   s      r!   rH   zRunTracker._save_historyŸ   sE  € Ý
Œ•B”G—O’O DÔ$5Ñ6Ô6Ð=¸#ÈÐMÑMÔMÐMð	BÝ�dÔ'¨°wÐ?Ñ?Ô?ð iÀ1Ý”	ÐFÐF¨dÔ.>¸t¸u¸uÔ.EÐFÑFÔFÈÐRSÐbgÐhÑhÔhÐhðið ið iñ iô ið ið ið ið ið ið ið iøøøð ið ið ið ið ið iøåð 	Bð 	Bð 	BÝ�LŠLÐ@¸QÐ@Ð@ÑAÔAÐAÐAÐAÐAÐAÐAÐAøøøøð	Bøøøs;   ¼B Á0BÂB ÂBÂB ÂBÂB Â
CÂ'C
Ã
C)r#   )r   )r0   N)r   r   )r   r   r   Ú__doc__r   r.   r   r   r4   r   r   rQ   rU   r   rX   rZ   r   ro   r,   rH   r   r    r!   r	   r	      sZ  € € € € € ðð ðð  Sð ð ð ð ð3°¸<¸.È$Ð:NÔ1Oð 3ÐTXð 3ð 3ð 3ð 3ð.ð .¨ð .¸ð .ÀXÈlÔE[ð .ð .ð .ð .ð`Fð Fð Fð Fð?ð ?¨ð ?Àcð ?ÐRVð ?ð ?ð ?ð ?ð¨%ð ð ð ð ð

 T¨#¨u¨*Ô%5ð 
ð 
ð 
ð 
ðB
Tð 
Tð 
Tð 
TðBð Bð Bð Bð Bð Br    )r‰   ry   Úloggingru   rE   Údataclassesr   r   Útypingr   r   r   r   Ú	getLoggerrJ   r   r	   r   r    r!   ú<module>rŽ      sý   ððð ð
 €€€Ø €€€Ø 	€	€	€	Ø €€€Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1à	ˆÔ	˜<Ñ	(Ô	(€ð ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ „ð
ðGBð GBð GBð GBð GBñ GBô GBð GBð GBð GBr    