§
    Ã"ÂjÕ   ã                   óŠ   — d Z ddlZddlZddlZddlmZmZmZ ddee         defd„Z	 G d„ de
¦  «        Z G d	„ d
¦  «        ZdS )a  
High-Performance Python Bridge to Native C++ SIMD Simulation Core.
Allows Python to orchestrate high-level game rules while delegating the
CPU-intensive Hot Path (100,000+ entities displacement, flat spatial hash, AOI queries)
to compiled C++ AVX2 native code.
é    N)ÚListÚTupleÚOptionalÚcustom_pathÚreturnc                 ó  — | r| S t           j                             d¦  «        }|r|S t           j                             t           j                             t           j                             t          ¦  «        dd¦  «        ¦  «        }t          j	        dk    rdg}nt          j	        dk    rddg}ndd	g}t           j                             |d
d¦  «        t           j                             |d
dd¦  «        t           j                             |d
dd¦  «        t           j                             |d
d¦  «        t           j                             |d
d¦  «        t           j                             |d
¦  «        t           j                             |dd¦  «        g}|D ]L}|D ]G}t           j                             ||¦  «        }t           j         
                    |¦  «        r|c c S ŒHŒMt           j                             |d
d|d         ¦  «        S )zÌ
    Resolves the binary path for freeexile_sim_core dynamic library.
    Checks environment overrides, unified build directories in server_cpp,
    and legacy fallback paths in server/engine_native.
    ÚFREEEXILE_SIM_CORE_DLLz..Úwin32zfreeexile_sim_core.dllÚdarwinzlibfreeexile_sim_core.dylibzfreeexile_sim_core.dylibzlibfreeexile_sim_core.sozfreeexile_sim_core.soÚ
server_cppÚbuild_ninjaÚbuildÚReleaseÚDebugÚbinÚserverÚengine_nativer   )ÚosÚenvironÚgetÚpathÚabspathÚjoinÚdirnameÚ__file__ÚsysÚplatformÚexists)r   Úenv_pathÚ	repo_rootÚ	lib_namesÚsearch_dirsÚ	directoryÚnameÚ	candidates           ú:C:\Projects\FreeExile\server\world\native_engine_bridge.pyÚresolve_sim_core_dll_pathr'      sÇ  € ð ð ØÐåŒz�~Š~Ð6Ñ7Ô7€HØð Øˆå”—’¥¤§¢­R¬W¯_ª_½XÑ-FÔ-FÈÈdÑ SÔ SÑTÔT€Iå
„|�wÒÐØ-Ð.ˆ	ˆ	Ý	Œ˜Ò	!Ð	!Ø2Ð4NÐOˆ	ˆ	à/Ð1HÐIˆ	õ 	Œ�Š�Y ¨mÑ<Ô<Ý
Œ�Š�Y ¨g°yÑAÔAÝ
Œ�Š�Y ¨g°wÑ?Ô?Ý
Œ�Š�Y ¨gÑ6Ô6Ý
Œ�Š�Y ¨eÑ4Ô4Ý
Œ�Š�Y Ñ-Ô-Ý
Œ�Š�Y ¨/Ñ:Ô:ð€Kð !ð !ð !ˆ	Øð 	!ð 	!ˆDÝœŸš Y°Ñ5Ô5ˆIÝŒw�~Š~˜iÑ(Ô(ð !Ø Ð Ð Ð Ð Ð ð!ð	!õ
 Œ7�<Š<˜	 <°À	È!ÄÑMÔMÐMó    c                   ó   — e Zd ZdZdS )ÚFatalNativeEngineInitErrorzMRaised when native C++ engine binary fails to load and strict mode is active.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r(   r&   r*   r*   7   s   € € € € € ØWÐWØ€Dr(   r*   c                   ó   — e Zd Zd(dee         dee         fd„Zd)d„Zd)d„Zd*d	e	ddfd
„Z
	 	 	 	 d+dede	de	de	de	de	de	defd„Zdede	de	ddfd„Zdededdfd„Zde	ddfd„Zd,d!e	d"e	d#ed$edee         f
d%„Zdedee	e	e	f         fd&„Zdefd'„ZdS )-ÚNativeEngineBridgeNÚdll_pathÚstrict_modec                 ó  — t          |¦  «        | _        |�|| _        nKt          j                             dd¦  «                             ¦   «                              ¦   «         dv | _        d| _        d | _	        |  
                    ¦   «          d S )NÚFREEEXILE_STRICT_NATIVEÚ >   Ú1ÚonÚyesÚtrueF)r'   r2   r3   r   r   r   ÚstripÚlowerÚ	is_loadedÚ_libÚ_load_library)Úselfr2   r3   s      r&   Ú__init__zNativeEngineBridge.__init__=   s   € Ý1°(Ñ;Ô;ˆŒØÐ"Ø*ˆDÔÐå!œzŸ~š~Ð.GÈÑLÔL×RÒRÑTÔT×ZÒZÑ\Ô\Ð`zÐzˆDÔØˆŒØ+/ˆŒ	Ø×ÒÑÔÐÐÐr(   r   c                 óê  — t           j                             | j        ¦  «        rŽ	 t	          j        | j        ¦  «        | _        |                      ¦   «          d| _        d S # t          $ rE}d| j        › d|› �}t          |¦  «         d| _        | j        rt          |¦  «        |‚Y d }~d S d }~ww xY wd| j        › d�}t          |¦  «         d| _        | j        rt          d| j        › d�¦  «        ‚d S )	NTz-[NativeEngineBridge] Warning: Failed to load z: Fz5[NativeEngineBridge] Notice: Native DLL not found at z. Running in fallback mode.z+Fatal: Native C++ engine DLL not found at 'zZ' while FREEEXILE_STRICT_NATIVE is active. Halting to prevent 50x performance degradation.)r   r   r   r2   ÚctypesÚCDLLr>   Ú_setup_function_signaturesr=   Ú	ExceptionÚprintr3   r*   )r@   ÚeÚmsgs      r&   r?   z NativeEngineBridge._load_libraryG   sK  € ÝŒ7�>Š>˜$œ-Ñ(Ô(ð 	ðÝ"œK¨¬Ñ6Ô6�”	Ø×/Ò/Ñ1Ô1Ð1Ø!%�”ð �øõ ð Að Að AØZÀdÄmÐZÐZÐWXÐZÐZ�Ý�c‘
”
�
Ø!&�”ØÔ#ð AÝ4°SÑ9Ô9¸qÐ@ðAð Að Að Að Að Aøøøøð	Aøøøð uÈ$Ì-ÐtÐtÐtˆCÝ�#‰JŒJˆJØ"ˆDŒNØÔð Ý0ðFÀ$Ä-ð Fð Fð Fñô ð ðð s   ¦9A! Á!
B0Á+:B+Â+B0c                 óþ  — | j         sd S t          j        g| j         j        _        d | j         j        _        t          j        t          j        t          j        t          j        t          j        t          j        t          j        g| j         j        _        t          j        | j         j        _        t          j        t          j        t          j        g| j         j        _        d | j         j        _        t          j        t          j	        g| j         j
        _        d | j         j
        _        t          j        g| j         j        _        d | j         j        _        t          j        t          j        t          j        t          j        t          j        ¦  «        t          j        g| j         j        _        t          j        | j         j        _        g | j         j        _        t          j        | j         j        _        t          j        t          j        t          j        ¦  «        t          j        t          j        ¦  «        t          j        t          j        ¦  «        g| j         j        _        d | j         j        _        d S ©N)r>   rC   Úc_floatÚengine_initÚargtypesÚrestypeÚc_int32Úengine_add_entityÚengine_set_velocityÚc_boolÚengine_set_evasionÚengine_step_tickÚPOINTERÚengine_query_aoiÚengine_get_entity_countÚengine_get_entity_pos©r@   s    r&   rE   z-NativeEngineBridge._setup_function_signatures_   s£  € ØŒyð 	ØˆFõ +1¬.Ð)9ˆŒ	ÔÔ&Ø(,ˆŒ	ÔÔ%õ ŒNÝŒNÝŒNÝŒNÝŒNÝŒNÝŒNð0
ˆŒ	Ô#Ô,õ /5¬nˆŒ	Ô#Ô+õ 39´.Å&Ä.ÕRXÔR`Ð1aˆŒ	Ô%Ô.Ø04ˆŒ	Ô%Ô-õ 28´ÅÄÐ0OˆŒ	Ô$Ô-Ø/3ˆŒ	Ô$Ô,õ 06¬~Ð.>ˆŒ	Ô"Ô+Ø-1ˆŒ	Ô"Ô*õ ŒNÝŒNÝŒNÝŒN�6œ>Ñ*Ô*ÝŒNð/
ˆŒ	Ô"Ô+õ .4¬^ˆŒ	Ô"Ô*ð 68ˆŒ	Ô)Ô2Ý4:´NˆŒ	Ô)Ô1õ ŒNÝŒN�6œ>Ñ*Ô*ÝŒN�6œ>Ñ*Ô*ÝŒN�6œ>Ñ*Ô*ð	4
ˆŒ	Ô'Ô0ð 37ˆŒ	Ô'Ô/Ð/Ð/r(   ç      P@Ú	cell_sizec                 ó‚   — | j         r5| j        r0| j                             t          j        |¦  «        ¦  «         d S d S d S rK   )r=   r>   rM   rC   rL   )r@   r\   s     r&   ÚinitzNativeEngineBridge.init–   sO   € ØŒ>ð 	=˜dœið 	=ØŒI×!Ò!¥&¤.°Ñ";Ô";Ñ<Ô<Ð<Ð<Ð<ð	=ð 	=ð 	=ð 	=r(   ç        ç      @ç      à?ç     @�@Ú	entity_idÚxÚyÚzÚ
move_speedÚcollision_radiusÚhpc                 ó^  — | j         r¥| j        rž| j                             t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        ¦  «        S dS )Néÿÿÿÿ)r=   r>   rQ   rC   rP   rL   )r@   rc   rd   re   rf   rg   rh   ri   s           r&   Ú
add_entityzNativeEngineBridge.add_entityš   s”   € ð Œ>ð 		˜dœið 		Ø”9×.Ò.Ý”˜yÑ)Ô)Ý”˜qÑ!Ô!Ý”˜qÑ!Ô!Ý”˜qÑ!Ô!Ý”˜zÑ*Ô*Ý”Ð/Ñ0Ô0Ý”˜rÑ"Ô"ñô ð ð ˆrr(   Ú
entity_idxÚvxÚvyc                 óÎ   — | j         r[| j        rV| j                             t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        ¦  «         d S d S d S rK   )r=   r>   rR   rC   rP   rL   )r@   rm   rn   ro   s       r&   Úset_velocityzNativeEngineBridge.set_velocity°   st   € ØŒ>ð 	˜dœið 	ØŒI×)Ò)Ý”˜zÑ*Ô*Ý”˜rÑ"Ô"Ý”˜rÑ"Ô"ñô ð ð ð ð	ð 	ð 	ð 	r(   Ú
is_evadingc                 ó¨   — | j         rH| j        rC| j                             t          j        |¦  «        t          j        |¦  «        ¦  «         d S d S d S rK   )r=   r>   rT   rC   rP   rS   )r@   rm   rr   s      r&   Úset_evasionzNativeEngineBridge.set_evasion¸   sb   € ØŒ>ð 	`˜dœið 	`ØŒI×(Ò(­¬¸
Ñ)CÔ)CÅVÄ]ÐS]ÑE^ÔE^Ñ_Ô_Ð_Ð_Ð_ð	`ð 	`ð 	`ð 	`r(   Údtc                 ó‚   — | j         r5| j        r0| j                             t          j        |¦  «        ¦  «         d S d S d S rK   )r=   r>   rU   rC   rL   )r@   ru   s     r&   Ú	step_tickzNativeEngineBridge.step_tick¼   sO   € ØŒ>ð 	;˜dœið 	;ØŒI×&Ò&¥v¤~°bÑ'9Ô'9Ñ:Ô:Ð:Ð:Ð:ð	;ð 	;ð 	;ð 	;r(   é   é   Úcenter_xÚcenter_yÚradius_cellsÚmax_resultsc           	      óR  ‡— | j         r| j        sg S t          j        |z  ¦   «         Š| j                             t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        ‰t          j        |¦  «        ¦  «        }ˆfd„t          |¦  «        D ¦   «         S )Nc                 ó    •— g | ]
}‰|         ‘ŒS r/   r/   )Ú.0ÚiÚ
out_buffers     €r&   ú
<listcomp>z0NativeEngineBridge.query_aoi.<locals>.<listcomp>Ì   s   ø€ Ð4Ð4Ð4 !�
˜1”Ð4Ð4Ð4r(   )r=   r>   rC   rP   rW   rL   Úrange)r@   rz   r{   r|   r}   Úcountr‚   s         @r&   Ú	query_aoizNativeEngineBridge.query_aoiÀ   s�   ø€ Ø”ð 	 4¤9ð 	ØˆIå”n {Ñ2Ñ5Ô5ˆ
Ø”	×*Ò*ÝŒN˜8Ñ$Ô$ÝŒN˜8Ñ$Ô$ÝŒN˜<Ñ(Ô(ØÝŒN˜;Ñ'Ô'ñ
ô 
ˆð 5Ð4Ð4Ð4¥u¨U¡|¤|Ð4Ñ4Ô4Ð4r(   c                 ó†  — | j         r| j        sdS t          j        ¦   «         }t          j        ¦   «         }t          j        ¦   «         }| j                             t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        ¦  «         |j        |j        |j        fS )N)r_   r_   r_   )r=   r>   rC   rL   rY   rP   ÚbyrefÚvalue)r@   rm   Úout_xÚout_yÚout_zs        r&   Úget_entity_posz!NativeEngineBridge.get_entity_posÎ   s¤   € Ø”ð 	# 4¤9ð 	#Ø"�?å”Ñ Ô ˆÝ”Ñ Ô ˆÝ”Ñ Ô ˆØŒ	×'Ò'ÝŒN˜:Ñ&Ô&ÝŒL˜ÑÔÝŒL˜ÑÔÝŒL˜ÑÔñ		
ô 	
ð 	
ð ”˜Uœ[¨%¬+Ð6Ð6r(   c                 óT   — | j         r | j        r| j                             ¦   «         S dS )Nr   )r=   r>   rX   rZ   s    r&   Úget_entity_countz#NativeEngineBridge.get_entity_countÝ   s.   € ØŒ>ð 	7˜dœið 	7Ø”9×4Ò4Ñ6Ô6Ð6Øˆqr(   )NN)r   N)r[   )r_   r`   ra   rb   )rx   ry   )r+   r,   r-   r   ÚstrÚboolrA   r?   rE   Úfloatr^   Úintrl   rq   rt   rw   r   r†   r   r�   r�   r/   r(   r&   r1   r1   <   s  € € € € € ðð  ¨#¤ð ÀHÈTÄNð ð ð ð ðð ð ð ð057ð 57ð 57ð 57ðn=ð =˜eð =¨tð =ð =ð =ð =ð ØØ"%Øðð àðð ðð ð	ð
 ðð ðð  ðð ðð 
ðð ð ð ð, sð °ð ¸5ð ÀTð ð ð ð ð` cð `°tð `Àð `ð `ð `ð `ð;˜Eð ; dð ;ð ;ð ;ð ;ð5ð 5 %ð 5°5ð 5Èð 5Ð^að 5ÐlpÐqtÔluð 5ð 5ð 5ð 5ð7¨ð 7°°u¸eÀUÐ7JÔ1Kð 7ð 7ð 7ð 7ð #ð ð ð ð ð ð r(   r1   rK   )r.   r   r   rC   Útypingr   r   r   r�   r'   ÚRuntimeErrorr*   r1   r/   r(   r&   ú<module>r–      sã   ððð ð 
€	€	€	Ø 
€
€
€
Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ð&Nð &N¨8°C¬=ð &NÀCð &Nð &Nð &Nð &NðR	ð 	ð 	ð 	ð 	 ñ 	ô 	ð 	ð
dð dð dð dð dñ dô dð dð dð dr(   