§
    ƒžžjŸ  ã                   óH   — d Z ddlZddlmZ ddlmZmZ  G d„ d¦  «        ZdS )uÁ   
Bá»™ Ä�o LÆ°á»�ng SÃ¡t ThÆ°Æ¡ng Thá»±c Chiáº¿n (Realized Combat DPS Accumulator)
TÃ­nh toÃ¡n DPS thá»±c táº¿ dá»±a trÃªn delta HP cá»§a quÃ¡i váº­t trong cá»­a sá»• trÆ°á»£t (Sliding Window).
é    N)Údeque)ÚDictÚListc                   óŒ   — e Zd ZdZddefd„Zdd„Zdd	eee	e
f                  d
edefd„Zdede
ddfd„Zdd
edefd„Zdefd„ZdS )ÚDPSAccumulatoruÊ   
    Bá»™ Ä‘o vÃ  tÃ­ch lÅ©y DPS thá»±c chiáº¿n (Realized Combat DPS).
    Ä�o lÆ°á»�ng lÆ°á»£ng mÃ¡u quÃ¡i váº­t thá»±c sá»± bá»‹ trá»« qua cÃ¡c tick thay vÃ¬ dÃ¹ng DPS lÃ½ thuyáº¿t trÃªn tooltip.
    ç      @Úwindow_secondsc                 ó€   — || _         t          ¦   «         | _        i | _        d| _        d| _        d| _        d| _        d S ©Nr   ç        )r	   r   Údamage_eventsÚmonster_hp_cacheÚtotal_damage_dealtÚcombat_start_timeÚlast_damage_timeÚpeak_dps)Úselfr	   s     ú4C:\Projects\AutoPOE2\src\agentic_engine\dps_meter.pyÚ__init__zDPSAccumulator.__init__   sA   € Ø,ˆÔÝ$)¡G¤GˆÔØ02ˆÔØ'(ˆÔØ(+ˆÔØ'*ˆÔØ"ˆŒˆˆó    ÚreturnNc                 ó¢   — | j                              ¦   «          | j                             ¦   «          d| _        d| _        d| _        d| _        dS )uL   Ä�áº·t láº¡i bá»™ Ä‘o DPS (khi Ä‘á»•i map hoáº·c báº¯t Ä‘áº§u phiÃªn má»›i).r   r   N)r   Úclearr   r   r   r   r   )r   s    r   ÚresetzDPSAccumulator.reset   sO   € àÔ× Ò Ñ"Ô"Ð"ØÔ×#Ò#Ñ%Ô%Ð%Ø"#ˆÔØ!$ˆÔØ #ˆÔØˆŒˆˆr   r   ÚmonstersÚcurrent_timec                 óT  — |pt          j         ¦   «         }t          ¦   «         }|D ]„}|                     dd¦  «        }|                     dd¦  «        }|                     |¦  «         || j        v r.| j        |         }||k     r||z
  }	|                      ||	¦  «         || j        |<   Œ…t          | j                             ¦   «         ¦  «        }
|
D ]A}||vr;| j        |         }d|cxk     rdk     rn n|                      ||¦  «         | j        |= ŒB|                      |¦  «        S )uä   
        Cáº­p nháº­t danh sÃ¡ch quÃ¡i váº­t tá»« snapshot hiá»‡n táº¡i.
        monsters: List of dicts, e.g. [{"id": 101, "hp": 450, "max_hp": 1000}, ...]
        Tráº£ vá»� DPS tá»©c thá»�i trong cá»­a sá»• trÆ°á»£t.
        Úidr   ÚhpiÐ  )	ÚtimeÚsetÚgetÚaddr   Ú_record_damageÚlistÚkeysÚget_current_dps)r   r   r   ÚnowÚcurrent_frame_idsÚmÚm_idÚcur_hpÚprev_hpÚdamageÚ
cached_idsÚc_idÚlast_hps                r   Úupdate_monsters_snapshotz'DPSAccumulator.update_monsters_snapshot#   sW  € ð Ð)�dœi™kœkˆÝ™EœEÐàð 
	1ð 
	1ˆAØ—5’5˜˜q‘>”>ˆDØ—U’U˜4 ‘^”^ˆFØ×!Ò! $Ñ'Ô'Ð'à�tÔ,Ð,Ð,ØÔ/°Ô5�Ø˜GÒ#Ð#Ø$ vÑ-�FØ×'Ò'¨¨VÑ4Ô4Ð4Ø*0ˆDÔ! $Ñ'Ð'õ ˜$Ô/×4Ò4Ñ6Ô6Ñ7Ô7ˆ
Øð 	0ð 	0ˆDØÐ,Ð,Ð,ØÔ/°Ô5�Ø�wÐ%Ð%Ò%Ð% Ò%Ð%Ð%Ð%Ð%Ø×'Ò'¨¨WÑ5Ô5Ð5ØÔ)¨$Ð/øà×#Ò# CÑ(Ô(Ð(r   Ú	timestampr.   c                 ó    — |dk    rd S | j         dk    r|| _         || _        | xj        |z  c_        | j                             ||f¦  «         d S r   )r   r   r   r   Úappend)r   r3   r.   s      r   r$   zDPSAccumulator._record_damageC   sd   € Ø�QŠ;ˆ;ØˆFØÔ! SÒ(Ð(Ø%.ˆDÔ"Ø )ˆÔØÐÔ 6Ñ)ÐÔØÔ×!Ò! 9¨fÐ"5Ñ6Ô6Ð6Ð6Ð6r   c                 ó  — |pt          j         ¦   «         }|| j        z
  }| j        rN| j        d         d         |k     r7| j                             ¦   «          | j        r| j        d         d         |k     °7| j        sdS t	          d„ | j        D ¦   «         ¦  «        }t          d|| j        d         d         z
  ¦  «        }|t          || j        ¦  «        z  }|| j        k    r|| _        t          t          |d¦  «        ¦  «        S )u5   TÃ­nh DPS trong cá»­a sá»• trÆ°á»£t (window_seconds).r   r   c              3   ó    K  — | ]	\  }}|V — Œ
d S )N© )Ú.0Ú_Údmgs      r   ú	<genexpr>z1DPSAccumulator.get_current_dps.<locals>.<genexpr>W   s&   è è € ÐAÐA¡F A s˜CÐAÐAÐAÐAÐAÐAr   g      à?é   )
r    r	   r   ÚpopleftÚsumÚmaxÚminr   ÚfloatÚround)r   r   r(   ÚcutoffÚwindow_damageÚelapsedÚcurrent_dpss          r   r'   zDPSAccumulator.get_current_dpsL   s  € àÐ)�dœi™kœkˆØ�tÔ*Ñ*ˆàÔ ð 	) TÔ%7¸Ô%:¸1Ô%=ÀÒ%FÐ%FØÔ×&Ò&Ñ(Ô(Ð(ð Ô ð 	) TÔ%7¸Ô%:¸1Ô%=ÀÒ%FÐ%Fð Ô!ð 	Ø�3åÐAÐA¨dÔ.@ÐAÑAÔAÑAÔAˆÝ�c˜3 Ô!3°AÔ!6°qÔ!9Ñ9Ñ:Ô:ˆØ#¥c¨'°4Ô3FÑ&GÔ&GÑGˆà˜œÒ&Ð&Ø'ˆDŒMå•U˜;¨Ñ*Ô*Ñ+Ô+Ð+r   c                 ó¶   — | j         dk    s| j        dk    rdS t          d| j        | j         z
  ¦  «        }t	          t          | j        |z  d¦  «        ¦  «        S )uB   TÃ­nh DPS trung bÃ¬nh tá»« Ä‘áº§u tráº­n giao chiáº¿n tá»›i giá»�.r   r   g      ð?r=   )r   r   r@   r   rB   rC   )r   Údurations     r   Úget_average_combat_dpsz%DPSAccumulator.get_average_combat_dps`   s\   € àÔ! SÒ(Ð(¨DÔ,CÀqÒ,HÐ,HØ�3Ý�s˜DÔ1°DÔ4JÑJÑKÔKˆÝ•U˜4Ô2°XÑ=¸qÑAÔAÑBÔBÐBr   )r   )r   N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rB   r   r   r   r   ÚstrÚintr2   r$   r'   rJ   r8   r   r   r   r      s  € € € € € ðð ð
#ð # uð #ð #ð #ð #ðð ð ð ð)ð )°°d¸3À¸8´nÔ1Eð )ÐUZð )Ðejð )ð )ð )ð )ð@7¨ð 7°sð 7¸tð 7ð 7ð 7ð 7ð,ð ,¨Eð ,¸Eð ,ð ,ð ,ð ,ð(C¨ð Cð Cð Cð Cð Cð Cr   r   )rN   r    Úcollectionsr   Útypingr   r   r   r8   r   r   ú<module>rS      sŠ   ððð ð
 €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð ðZCð ZCð ZCð ZCð ZCñ ZCô ZCð ZCð ZCð ZCr   