§
    ½Âj¼,  ã                   ó\  — d Z ddlZddlZddlmZmZmZmZmZm	Z	 ddl
mZmZ ddlmZmZ ddlmZmZ ddlmZmZmZ ddlmZ dd	lmZmZ e G d
„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Z G d„ d¦  «        Z dS )zÀ
Server-Authoritative Game Engine Loop for FreeExile.
Coordinates the fixed 30Hz simulation pipeline across Movement Authority,
Spatial AOI Grid, Combat Engine, and Delta Snapshot generation.
é    N)ÚDictÚListÚSetÚTupleÚOptionalÚAny)Ú	dataclassÚfield)ÚSpatialGridÚEntity)ÚMovementAuthorityEngineÚPlayerCharacter)ÚCombatEngineÚCombatActorÚDamageEventResult)ÚFiveElements)ÚIsometricMathÚVector2Dc                   óB   — e Zd ZU eed<   eed<   eed<   eed<   eed<   dS )ÚClientMoveCommandÚ	entity_idÚdir_xÚdir_yÚsequenceÚtimestamp_msN©Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__Úfloat© ó    ú8C:\Projects\FreeExile\server\world\server_engine_loop.pyr   r      sB   € € € € € € à€N€N�NØ€L€L�LØ€L€L�LØ€M€M�MØÐÐÑÐÐr$   r   c                   óV   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   dS )	ÚClientSkillCommandÚattacker_idÚ	target_idÚskill_idÚ
raw_damageÚelementr   r   N)r   r   r   r    r!   r"   r   r#   r$   r%   r'   r'      s]   € € € € € € àÐÐÑØ€N€N�NØ€M€M�MØÐÐÑØÐÐÑØ€M€M�MØÐÐÑÐÐr$   r'   c                   óV   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   dS )	ÚEntitySnapshotr   ÚxÚyÚzÚhpr,   Ú
is_evadingN)r   r   r   r    r!   r"   Úboolr#   r$   r%   r.   r.   '   sT   € € € € € € à€N€N�NØ€H€H�HØ€H€H�HØ€H€H�HØ€I€I�IØ€L€L�LØÐÐÑÐÐr$   r.   c                   óL   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   dS )Ú
TickResultÚtick_numberÚtick_duration_msÚprocessed_movesÚprocessed_skillsÚentities_countÚsnapshots_generatedNr   r#   r$   r%   r6   r6   2   sZ   € € € € € € àÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑÐÐr$   r6   c                   ól  — e Zd ZU dZdZeed<   dZeed<   d'ded	e	e
         fd
„Zdej        dddddddddfdededededededede	e         de	e         de	e         de	e
         de	e
         de	e
         de	e
         defd„Zdeddfd„Zdeddfd „Zded!eddfd"„Zefd#edefd$„Zd%edee         fd&„ZdS )(ÚServerEngineLoopzµ
    Authoritative Server Game Engine Loop running at fixed 30Hz (33.33ms / tick).
    Ensures zero-trust simulation, strict anti-cheat validation, and efficient AOI broadcast.
    é   ÚTICK_RATE_HZg¡?ÚTICK_INTERVAL_SECç      P@NÚ	cell_sizeÚstat_aggregatorc                 ó.  — d| _         t          t          j        ¦   «         dz  ¦  «        | _        t	          |¬¦  «        | _        t          ¦   «         | _        t          ¦   «         | _	        || _
        g | _        g | _        g | _        i | _        i | _        d S )Nr   éè  )rC   )r7   r    ÚtimeÚcurrent_time_msr   Úspatial_gridr   Úmovement_authorityr   Úcombat_enginerD   Ú
move_queueÚskill_queueÚevasion_queueÚactive_entitiesÚentity_z_levels)ÚselfrC   rD   s      r%   Ú__init__zServerEngineLoop.__init__D   s�   € Ø !ˆÔÝ$'­¬	©¬°dÑ(:Ñ$;Ô$;ˆÔõ *5¸yÐ)IÑ)IÔ)IˆÔÝ;RÑ;TÔ;TˆÔÝ+7©>¬>ˆÔØ.=ˆÔð 46ˆŒØ57ˆÔØ46ˆÔð 35ˆÔØ13ˆÔÐÐr$   ç        g      @ç     @�@r   Ú	initial_xÚ	initial_yÚ	initial_zr,   Ú
move_speedÚmax_hpÚ	player_idÚ
account_idÚcharacter_idÚaggregated_statsÚcontext_tagsÚ
conditionsÚcontextÚreturnc                 ó–  — |}d}|}d}d}i }|}|€s| j         �l|�jt          | j         d¦  «        r$| j                              ||	p||
p|||¬¦  «        }n1t          | j         d¦  «        r| j                              ||¬¦  «        }|��t	          |d	|¦  «        }t	          |d
t	          |dd¦  «        ¦  «        }t	          |dt	          |d|¦  «        ¦  «        }t	          |dd¦  «        }t	          |dd¦  «        }t	          |di ¦  «        }t          |t          ¦  «        �rt          j        t          j        t          j	        t          j	        t          j
        t          j
        t          j        t          j        t          j        t          j        t          j        dœ}|                     ¦   «         D ]î\  }}t          |t          ¦  «        rt          |¦  «        ||<   Œ-t          |t          ¦  «        rA|                     ¦   «         |v r+t          |¦  «        |||                     ¦   «                  <   Œƒt          |t          ¦  «        rVt          t          |                     ¦   «         ¦  «        r/t          |¦  «        |t          |                     ¦   «                  <   Œït%          |||¬¦  «        }| j                             |¦  «         || j        |<   || j        |<   t/          ||||¬¦  «        }| j                             |¦  «         t5          |d|› �|||||||d|pd|› �¬¦  «        }| j                             |¦  «         |S )zKRegisters a player into all authoritative subsystems with aggregated stats.g      I@gš™™™™™©?g      ø?NÚaggregate_player_stats)rZ   r[   r\   Úactive_tagsr_   Úcalculate_stats)rZ   r`   rY   Úattack_damageÚbase_attackrX   Úmovement_speedÚcrit_chanceÚcrit_multiplierÚresistances)ÚhoaÚfireÚthuyÚcoldÚkimÚ	lightningÚmocÚchaosÚpoisonÚthoÚearth)r   r/   r0   )r   r/   r0   rX   ÚPlayer_TÚplayer_)Úactor_idÚnamer,   Ú
current_hprY   rg   ri   rj   rk   Ú	is_playerrZ   )rD   Úhasattrrc   re   ÚgetattrÚ
isinstanceÚdictr   ÚHOAÚTHUYÚKIMÚMOCÚTHOÚitemsr"   ÚstrÚlowerÚupperr   rI   Ú
add_entityrO   rP   r   rJ   Úregister_playerr   rK   Úregister_actor)rQ   r   rU   rV   rW   r,   rX   rY   rZ   r[   r\   r]   r^   r_   r`   Úresolved_hpÚresolved_attackÚresolved_move_speedÚresolved_crit_chanceÚresolved_crit_multÚresolved_resistancesÚ	stats_objÚres_dictÚelem_mappingÚkÚvÚgrid_entityÚplayer_charÚcombat_actors                                r%   r‹   z ServerEngineLoop.register_playerW   sb  € ð$ ˆØˆØ(ÐØ#ÐØ!ÐØ:<Ðà$ˆ	ØÐ Ô!5Ð!AÀiÐF[Ý�tÔ+Ð-EÑFÔFð 	gØ Ô0×GÒGØ'Ø)Ð6¨YØ!-Ð!:°Ø ,Ø)ð Hñ ô �	�	õ ˜Ô-Ð/@ÑAÔAð gØ Ô0×@Ò@È9Ð^eÐ@ÑfÔf�	àÑ Ý! )¨X°vÑ>Ô>ˆKÝ% i°Å'È)ÐUbÐdhÑBiÔBiÑjÔjˆOÝ")¨)°\Å7È9ÐVfÐhrÑCsÔCsÑ"tÔ"tÐÝ#*¨9°mÀTÑ#JÔ#JÐ Ý!(¨Ð4EÀtÑ!LÔ!LÐÝ˜y¨-¸Ñ<Ô<ˆHÝ˜(¥DÑ)Ô)ñ Qå'Ô+µ\Ô5EÝ(Ô-µ|Ô7HÝ'Ô+½,Ô:JÝ'Ô+µlÔ6FÕR^ÔRbÝ'Ô+µlÔ6Fð ð  �ð %ŸNšNÑ,Ô,ð Qð Q‘D�A�qÝ! !¥\Ñ2Ô2ð QÝ27¸±(´(Ð,¨QÑ/Ð/Ý# A¥sÑ+Ô+ð Q°·²±	´	¸\Ð0IÐ0IÝHMÈaÉÌÐ,¨\¸!¿'º'¹)¼)Ô-DÑEÐEÝ# A¥sÑ+Ô+ð Qµ½ÀaÇgÂgÁiÄiÑ0PÔ0Pð QÝHMÈaÉÌÐ,­\¸!¿'º'¹)¼)Ô-DÑEøå y°IÀÐKÑKÔKˆØÔ×$Ò$ [Ñ1Ô1Ð1Ø*5ˆÔ˜YÑ'Ø*3ˆÔ˜YÑ'å%°	¸YÈ)Ð`sÐtÑtÔtˆØÔ×/Ò/°Ñ<Ô<Ð<å"ØØ&˜9Ð&Ð&ØØ"ØØ'Ø,Ø.Ø,ØØÐ8Ð#8¨YÐ#8Ð#8ð
ñ 
ô 
ˆð 	Ô×)Ò)¨,Ñ7Ô7Ð7ØÐr$   Úcmdc                 ó:   — | j                              |¦  «         d S ©N)rL   Úappend©rQ   r›   s     r%   Úqueue_move_commandz#ServerEngineLoop.queue_move_command¬   s   € ØŒ×Ò˜sÑ#Ô#Ð#Ð#Ð#r$   c                 ó:   — | j                              |¦  «         d S r�   )rM   rž   rŸ   s     r%   Úqueue_skill_commandz$ServerEngineLoop.queue_skill_command¯   s   € ØÔ×Ò Ñ$Ô$Ð$Ð$Ð$r$   r   c                 ó>   — | j                              ||f¦  «         d S r�   )rN   rž   )rQ   r   r   s      r%   Úqueue_evasionzServerEngineLoop.queue_evasion²   s$   € ØÔ×!Ò! 9¨lÐ";Ñ<Ô<Ð<Ð<Ð<r$   Údtc           	      ó8  — t          j        ¦   «         }| xj        dz  c_        | xj        t	          |dz  ¦  «        z  c_        | j        D ] \  }}| j                             ||¦  «         Œ!| j                             ¦   «          d}| j	         
                    ¦   «         }| j	                             ¦   «          |D ]v}| j                             |j        |j        |j        |¬¦  «        \  }}	}
|rA|j        | j        v r3| j        |j                 }| j                             ||	|
¦  «         |dz  }Œwd}| j         
                    ¦   «         }| j                             ¦   «          |D ]”}| j                             |j        d¦  «        }| j                             |j        d¦  «        }t1          j        ||¦  «        r=| j                             |j        |j        |j        |j        | j        ¬¦  «        }|dz  }Œ•d}| j                             ¦   «         D ]>\  }}| j                             |j        |j         d¬¦  «        }|tC          |¦  «        z  }Œ?t          j        ¦   «         |z
  dz  }tE          | j        |||tC          | j        ¦  «        |¬	¦  «        S )
aI  
        Executes one authoritative 30Hz tick cycle across all 7 phases:
        1. Ingest evasions (i-frame trigger)
        2. Authoritative movement displacement & anti-cheat
        3. Spatial AOI grid update
        4. Combat resolution & damage calculation
        5. State snapshot packaging for AOI neighborhoods
        é   rF   r   )r   r   r   r¥   rS   )r(   Údefender_idr+   Údamage_elementÚcurrent_timestamp_ms©Úradius_cellsrT   )r7   r8   r9   r:   r;   r<   )#rG   Úperf_counterr7   rH   r    rN   rK   Útrigger_phantom_evasionÚclearrL   ÚcopyrJ   Úprocess_move_inputr   r   r   rO   rI   Úupdate_entity_positionrM   rP   Úgetr(   r)   r   Úcheck_height_overlapÚcalculate_damager+   r,   r†   Úget_entities_in_aoir/   r0   Úlenr6   )rQ   r¥   Ú
start_timer   r   r9   Úcurrent_movesÚmove_cmdÚsuccessÚnew_xÚnew_yÚentityr:   Úcurrent_skillsÚ	skill_cmdÚ
attacker_zÚtarget_zÚdamage_resultr<   Úvisible_idsr8   s                        r%   Ú	step_tickzServerEngineLoop.step_tickµ   sÝ  € õ Ô&Ñ(Ô(ˆ
ØÐÔ˜AÑÐÔØÐÔ¥ B¨¡I¡¤Ñ.ÐÔð (,Ô'9ð 	Pð 	PÑ#ˆI�|ØÔ×6Ò6°yÀ,ÑOÔOÐOÐOØÔ× Ò Ñ"Ô"Ð"ð ˆØœ×,Ò,Ñ.Ô.ˆØŒ×ÒÑÔÐà%ð 	%ð 	%ˆHØ$(Ô$;×$NÒ$NØ"Ô,Ø”nØ”nØð	 %Oñ %ô %Ñ!ˆG�U˜Eð ð %˜8Ô-°Ô1EÐEÐEØÔ-¨hÔ.@ÔA�àÔ!×8Ò8¸ÀÈÑNÔNÐNØ 1Ñ$�øð ÐØÔ)×.Ò.Ñ0Ô0ˆØÔ×ÒÑ Ô Ð à'ð 	&ð 	&ˆIàÔ-×1Ò1°)Ô2GÈÑMÔMˆJØÔ+×/Ò/°	Ô0CÀSÑIÔIˆHåÔ1°*¸hÑGÔGð &Ø $Ô 2× CÒ CØ )Ô 5Ø )Ô 3Ø(Ô3Ø#,Ô#4Ø)-Ô)=ð !Dñ !ô !�ð ! AÑ%Ð øð  ÐØ!%Ô!5×!;Ò!;Ñ!=Ô!=ð 	4ð 	4ÑˆI�vàÔ+×?Ò?ÀÄÈ&Ì(ÐabÐ?ÑcÔcˆKØ¥3 {Ñ#3Ô#3Ñ3ÐÐå Ô-Ñ/Ô/°*Ñ<ÀÑFÐåØÔ(Ø-Ø+Ø-Ý˜tÔ3Ñ4Ô4Ø 3ð
ñ 
ô 
ð 	
r$   Úobserver_idc                 ó8  — | j                              |¦  «        }|sg S | j                             |j        |j        d¬¦  «        }g }|D ]Ï}| j                              |¦  «        }| j        j                             |¦  «        }|sŒ>| j                             |d¦  «        }|r|j	        nd}	|r|j
        j        nd}
d}|r$| j        |j        z
  }d|cxk    o
|j        k    nc }|                     t!          ||j        |j        ||	|
|¬¦  «        ¦  «         ŒÐ|S )zj
        Retrieves the state snapshots of all entities visible to observer within its 9-cell AOI.
        r§   r«   rS   Fr   )r   r/   r0   r1   r2   r,   r3   )rO   r³   rI   r¶   r/   r0   rK   ÚactorsrP   r{   r,   ÚvaluerH   Úlast_evasion_timestamp_msÚevasion_iframe_duration_msrž   r.   )rQ   rÆ   ÚobserverrÄ   Ú	snapshotsr   Úentrš   r1   r2   Úelemr3   Úelapseds                r%   Úget_aoi_snapshots_for_entityz-ServerEngineLoop.get_aoi_snapshots_for_entityÿ   si  € ð Ô'×+Ò+¨KÑ8Ô8ˆØð 	ØˆIàÔ'×;Ò;¸H¼JÈÌ
ÐabÐ;ÑcÔcˆØ*,ˆ	à$ð 	ð 	ˆIØÔ&×*Ò*¨9Ñ5Ô5ˆCØÔ-Ô4×8Ò8¸ÑCÔCˆLØð ØàÔ$×(Ò(¨°CÑ8Ô8ˆAØ,8ÐA�Ô(Ð(¸cˆBØ1=ÐD�<Ô'Ô-Ð-À1ˆDð ˆJØð WØÔ.°Ô1WÑW�Ø 7ÐUÐUÒUÐU¨lÔ.UÒUÐUÐUÐU�
à×Ò�^Ø#Ø”%Ø”%ØØØØ%ðñ ô ñ ô ð ð ð Ðr$   )rB   N)r   r   r   Ú__doc__r@   r    r!   rA   r"   r   r   rR   r   rƒ   r‡   r   r‹   r   r    r'   r¢   r¤   r6   rÅ   r   r.   rÑ   r#   r$   r%   r>   r>   <   s<  € € € € € € ðð ð €L�#ÐÐÑØ)Ð�uÐ)Ð)Ñ)ð4ð 4 %ð 4ÀÈ#Äð 4ð 4ð 4ð 4ð0 Ø ,Ô 0ØØØ#'Ø$(Ø&*Ø*.Ø&*Ø$(Ø!%ðSð SàðSð ðSð ð	Sð
 ðSð ðSð ðSð ðSð ˜C”=ðSð ˜S”MðSð ˜s”mðSð # 3œ-ðSð ˜s”mðSð ˜S”MðSð ˜#”ðSð  
ð!Sð Sð Sð Sðj$Ð&7ð $¸Dð $ð $ð $ð $ð%Ð'9ð %¸dð %ð %ð %ð %ð= sð =¸#ð =À$ð =ð =ð =ð =ð %6ð H
ð H
˜Eð H
¸*ð H
ð H
ð H
ð H
ðT%¸ð %ÀÀ^Ô@Tð %ð %ð %ð %ð %ð %r$   r>   )!rÒ   rG   ÚmathÚtypingr   r   r   r   r   r   Údataclassesr	   r
   Úworld.spatial_gridr   r   Úworld.movement_authorityr   r   Úworld.combat_enginer   r   r   Úworld.martial_matrixr   Úworld.isometric_mathr   r   r   r'   r.   r6   r>   r#   r$   r%   ú<module>rÛ      sï  ððð ð €€€Ø €€€Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LØ -Ð -Ð -Ð -Ð -Ð -Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ððhð hð hð hð hñ hô hð hð hð hr$   