§
    ¹ÀjG  ã                  ó6  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlmZ ddlmZmZmZmZmZ ddlZ ee¦  «                             ¦   «         j        j        j        Z ee¦  «        ej        vr$ej                             d ee¦  «        ¦  «         edz  Z ee¦  «        ej        vr$ej                             d ee¦  «        ¦  «         edz  Z ee¦  «        ej        vr$ej                             d ee¦  «        ¦  «         ddlmZm Z m!Z!m"Z"m#Z#m$Z$ d	Z%d
Z&dZ'dZ(dZ)dZ*dZ+dZ,g d¢Z-g d¢Z.g d¢Z/ddddddddddddd d!d"œZ0	 	 	 dEdFd0„Z1	 	 dGdHd3„Z2dId7„Z3dJd<„Z4dKd?„Z5 G d@„ dA¦  «        Z6ej7        dLdB„¦   «         Z8ej7        dMdD„¦   «         Z9dS )NzÔ
Shared Fixtures and Mock Models for FreeExile Cocos Creator 3.x E2E Test Suite.
Provides authoritative geometric math, protobuf framing, simulated state entities,
and game design matrix constants for Tiers 1-4.
é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚOptionalÚTupleÚserverÚproto)Úauth_pb2Ú
combat_pb2Úmap_zone_pb2Únetwork_pb2Únpc_pb2Ú
portal_pb2g      P@g      @@g      @g      ü?ç      Ð?g       @g{®Gáz”?é(   )Úchar_sword_masterÚchar_sword_maidenÚchar_feral_berserkerÚchar_wild_archerÚchar_glacial_lancerÚchar_shadow_assassin)u   Ä�á»™c CÃ´ Báº¡iu   Huyáº¿t VÃ´ áº¢nhu   Cá»‘ Dáº¡ Lyu   Phong TiÃªu Dáº¡u   Máº¡c Váº¥n ThiÃªnu   LÃ´i Cuá»“ngu   Diá»‡p Tá»‘ TÃ¢mu   ThÆ°Æ¡ng VÃ´ Ä�á»‹chu   HÃ n BÄƒng Tháº§nu   LÃ£nh Nguyá»‡tu   Dáº¡ Kháº¯cu   SÃ¡t Cá»‘t Ma)	ÚviÚenÚzhÚjaÚkoÚthÚdeÚruÚesé   é   é   é   é   é    é!   é"   é0   é1   é2   é3   é@   éA   )ÚPINGÚPONGÚPLAYER_MOVEÚ
WORLD_SYNCÚENTITY_SNAPSHOTÚ
CAST_SKILLÚPHANTOM_EVASIONÚCOMBAT_DAMAGEÚENTER_ZONE_REQÚENTER_ZONE_RESPÚWAYPOINT_TELEPORT_REQÚWAYPOINT_TELEPORT_RESPÚINTERACT_NPC_REQÚINTERACT_NPC_RESPç        ç      ð?ÚwxÚfloatÚwyÚwzÚcxÚcyÚvxÚvyÚzoomÚreturnúTuple[float, float]c                óˆ   — | |z
  }||z
  }	||	z
  t           dz  z  |z  |z   }
||	z   t          dz  z  |z  |z   |dz  |z  z
  }|
|fS )zOProjects 3D world coordinates to 2.5D isometric screen coordinates (2:1 ratio).ç       @g      8@©ÚTILE_WÚTILE_H)rA   rC   rD   rE   rF   rG   rH   rI   Úrel_xÚrel_yÚsxÚsys               ú1C:\Projects\FreeExile\tests\e2e_cocos\conftest.pyÚworld_to_isorV   \   se   € ð �‰G€EØ�‰G€EØ
�%‰-�F S™LÑ	)¨DÑ	0°2Ñ	5€BØ
�%‰-�F S™LÑ	)¨DÑ	0°2Ñ	5¸¸d¹ÀTÑ9IÑ	J€BØˆrˆ6€Mó    rS   rT   c                ó®   — | |z
  |z  }||z
  |z  }|t           dz  z  |t          dz  z  z   dz  }	|t          dz  z  |t           dz  z  z
  dz  }
|	|z   |
|z   fS )zRUnprojects 2D screen coordinates back to continuous 2.5D ground world coordinates.rM   rN   )rS   rT   rE   rF   rG   rH   rI   Úscreen_xÚscreen_yrQ   rR   s              rU   Úiso_to_worldr[   i   su   € ð �R‘˜4Ñ€HØ�R‘˜4Ñ€HØ�& 3™,Ñ'¨H½À¹Ñ,EÑFÈ#ÑM€EØ�& 3™,Ñ'¨H½À¹Ñ,EÑFÈ#ÑM€EØ�2‰:�u˜r‘zÐ!Ð!rW   ÚdxÚdyÚstrc                ó0  — t          | ¦  «        dk     rt          |¦  «        dk     rdS | |z
  dz  }| |z   dz  }t          j        ||¦  «        }t          j        |¦  «        dz   dz  }g d¢}|D ]'\  }\  }}	||cxk    r|	k     sn |dk    r
|dk    r|c S Œ(dS )zDCalculates isometric 8-directional heading bin from movement vector.g�íµ ÷Æ°>ÚSg      à?r   ç     €v@)	)ÚE)ç     u@ra   )rb   )r?   ç     €6@)ÚSE)rd   ç     àP@)r`   )rf   ç      \@)ÚSW)rg   ç     °c@)ÚW)ri   ç     Pi@)ÚNW)rk   ç     ðn@)ÚN)rm   ç     Hr@)ÚNE)ro   rc   rc   )ÚabsÚmathÚatan2Údegrees)
r\   r]   Úscreen_dir_xÚscreen_dir_yÚ
target_radÚdegÚbinsÚnameÚlowÚhighs
             rU   Úresolve_heading_binr}   v   sÒ   € å
ˆ2�w„w�‚~€~�#˜b™'œ' Dš.˜.ØˆsØ˜‘G˜s‘?€LØ˜‘G˜tÑ#€LÝ”˜L¨,Ñ7Ô7€JÝŒ<˜
Ñ#Ô# eÑ+¨uÑ
4€Cðð ð €Dð "ð ð Ñˆ‰kˆs�DØ�#ÐÐÒÐ˜ÒÐÐÐ ¨¢ °#¸²,°,ØˆKˆKˆKøØˆ3rW   ÚopcodeÚintÚpayloadÚbytesc                ó2   — t          j        d| ¦  «        |z   S )z?Encodes a binary WebSocket frame with 2-byte big-endian opcode.ú>H)ÚstructÚpack)r~   r€   s     rU   Úencode_opcode_framer†   Œ   s   € åŒ;�t˜VÑ$Ô$ wÑ.Ð.rW   ÚframeúTuple[int, bytes]c                ó¤   — t          | ¦  «        dk     rt          d¦  «        ‚t          j        d| dd…         ¦  «        d         }|| dd…         fS )z?Decodes a binary WebSocket frame into (opcode, protobuf_bytes).r$   z"Frame length underflow (< 2 bytes)rƒ   Nr   )ÚlenÚ
ValueErrorr„   Úunpack)r‡   r~   s     rU   Údecode_opcode_framer�   ‘   sQ   € å
ˆ5�z„z�A‚~€~ÝÐ=Ñ>Ô>Ð>ÝŒ]˜4  r¨ r¤Ñ+Ô+¨AÔ.€FØ�5˜˜˜”9ÐÐrW   c                  ó<   — e Zd ZdZddd	„Zdd„Zdd„Zdd„Zdd„ZdS )ÚSimulatedCocosPlayerz@Simulates Cocos Creator 3.x client player entity and kinematics.r#   r?   Ú	entity_idr   ÚxrB   Úyc                óø   — || _         || _        || _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d gt          z  | _        d| _        d S )	Nr?   r`   Úidler   Fg      Y@g      I@Úzone_boundless_sanctuary)r�   rA   rC   rG   rH   ÚheadingÚ
anim_stateÚ	input_seqÚ	is_iframeÚiframe_timerÚ
current_hpÚmax_hpÚcurrent_manaÚmax_manaÚBACKPACK_CAPACITYÚ	inventoryÚzone_id)Úselfr�   r‘   r’   s       rU   Ú__init__zSimulatedCocosPlayer.__init__œ   s€   € Ø"ˆŒØˆŒØˆŒØˆŒØˆŒØˆŒØ ˆŒØˆŒØˆŒØˆÔØˆŒØˆŒØ ˆÔØˆŒØ:>¸ÕBSÑ9SˆŒØ1ˆŒˆˆrW   ÚmxÚmyÚdtrJ   ÚNonec                óŽ  — t          j        ||¦  «        }|dk    rd| _        d| _        d| _        dS | xj        dz  c_        t          | j        rt          ndz  }||z  }||z  }||z  | _        ||z  | _        | xj	        | j        |z  z  c_	        | xj
        | j        |z  z  c_
        t          ||¦  «        | _        d| _        dS )zCApplies digital or touch input with frame 0 zero-residual momentum.gš™™™™™©?r?   r”   Nr#   r@   Úrun)rr   ÚhypotrG   rH   r—   r˜   ÚPLAYER_SPEEDr™   ÚDODGE_BOOSTrA   rC   r}   r–   )r¢   r¤   r¥   r¦   ÚmagÚspeedÚnorm_xÚnorm_ys           rU   Úapply_inputz SimulatedCocosPlayer.apply_input®   sË   € åŒj˜˜RÑ Ô ˆØ�$Š;ˆ;àˆDŒGØˆDŒGØ$ˆDŒOØˆFàˆŒ˜!ÑˆŒÝ¨t¬~Ð F¥ À3ÑGˆØ�c‘ˆØ�c‘ˆØ˜5‘.ˆŒØ˜5‘.ˆŒØˆŒ�4”7˜R‘<ÑˆŒØˆŒ�4”7˜R‘<ÑˆŒÝ*¨6°6Ñ:Ô:ˆŒØˆŒˆˆrW   Úboolc                ó:   — d| _         t          | _        d| _        dS )z*Triggers 0.25s Phantom Evasion dodge roll.TÚdodge)r™   ÚDODGE_IFRAME_DURATIONrš   r—   )r¢   s    rU   Útrigger_dodgez"SimulatedCocosPlayer.trigger_dodgeÃ   s   € àˆŒÝ1ˆÔØ!ˆŒØˆtrW   c                ó–   — | j         r=| xj        |z  c_        | j        dk    r$d| _         d| _        | j        dk    rd| _        dS dS dS dS )z&Advances iframe and hitstop cooldowns.r?   Fr´   r”   N)r™   rš   r—   )r¢   r¦   s     rU   Úupdate_timersz"SimulatedCocosPlayer.update_timersÊ   sm   € àŒ>ð 	-ØÐÔ Ñ#ÐÔØÔ  CÒ'Ð'Ø!&�”Ø$'�Ô!Ø”? gÒ-Ð-Ø&,�D”O�O�Oð	-ð 	-à'Ð'ð .Ð-rW   ÚitemúDict[str, Any]úTuple[bool, Optional[int]]c                ón   — t          t          ¦  «        D ]}| j        |         €|| j        |<   d|fc S Œ dS )z:Inserts item into first free slot in the 40-slot backpack.NT)FN)ÚrangerŸ   r    )r¢   r¹   Úidxs      rU   Úadd_to_inventoryz%SimulatedCocosPlayer.add_to_inventoryÔ   sO   € åÕ*Ñ+Ô+ð 	!ð 	!ˆCØŒ~˜cÔ"Ð*Ø&*�”˜sÑ#Ø˜S�yÐ Ð Ð ð +ð ˆ{rW   N)r#   r?   r?   )r�   r   r‘   rB   r’   rB   )r¤   rB   r¥   rB   r¦   rB   rJ   r§   )rJ   r²   )r¦   rB   rJ   r§   )r¹   rº   rJ   r»   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r£   r±   r¶   r¸   r¿   © rW   rU   r�   r�   ™   sƒ   € € € € € ØJÐJð2ð 2ð 2ð 2ð 2ð$ ð  ð  ð  ð*ð ð ð ð-ð -ð -ð -ðð ð ð ð ð rW   r�   c                 ó&   — t          ddd¬¦  «        S )Née   r?   )r�   r‘   r’   )r�   rÄ   rW   rU   Úsimulated_playerrÇ   Ý   s   € å¨#°¸Ð<Ñ<Ô<Ð<rW   úmap_zone_pb2.ZoneInfoPayloadc                 ó  — t          j        ¦   «         } d| _        d| _        t           j        j        | _        d| _        d| _        | j	         
                    ¦   «         }d|_        d|_        d|_        d|_        d|_        | S )Nr•   u   Doanh Tráº¡i Báº¿n LÆ°u Ä�Ã yg      ‰@Úwp_sanctuary_centralu   Bia Cá»• Báº¿n LÆ°u Ä�Ã yr?   T)r   ÚZoneInfoPayloadr¡   rz   ÚZoneTypeÚZONE_TYPE_SANCTUARYÚ	zone_typeÚbounds_widthÚbounds_heightÚ	waypointsÚaddÚwaypoint_idr‘   r’   Úis_unlocked)ÚzoneÚwps     rU   Úsanctuary_zone_datar×   â   sv   € åÔ'Ñ)Ô)€DØ-€D„LØ/€D„IÝ!Ô*Ô>€D„NØ€DÔØ€DÔØ	Œ×	Ò	Ñ	Ô	€BØ+€B„NØ)€B„GØ€B„DØ€B„DØ€B„NØ€KrW   )r?   r?   r?   r?   r?   r@   )rA   rB   rC   rB   rD   rB   rE   rB   rF   rB   rG   rB   rH   rB   rI   rB   rJ   rK   )r?   r?   r?   r?   r@   )rS   rB   rT   rB   rE   rB   rF   rB   rG   rB   rH   rB   rI   rB   rJ   rK   )r\   rB   r]   rB   rJ   r^   )r~   r   r€   r�   rJ   r�   )r‡   r�   rJ   rˆ   )rJ   r�   )rJ   rÈ   ):rÃ   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arrr   r„   ÚsysÚpathlibr   Útypingr   r   r   r   r	   ÚpytestÚ__file__ÚresolveÚparentÚPROJECT_ROOTr^   ÚpathÚinsertÚSERVER_PATHÚ
PROTO_PATHÚserver.protor   r   r   r   r   r   rO   rP   r«   r¬   rµ   ÚSAFE_RADIUS_WAYPOINTÚHEALING_RATE_PER_SECrŸ   ÚCANONICAL_CLASSESÚCANONICAL_MARTIAL_NAMESÚSUPPORTED_LOCALESÚOPCODESrV   r[   r}   r†   r�   r�   ÚfixturerÇ   r×   rÄ   rW   rU   ú<module>ró      s_  ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à €€€ð ˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5Ô<€Ø€3€|ÑÔ˜CœHÐ$Ð$Ø„H‡O‚O�A�s�s˜<Ñ(Ô(Ñ)Ô)Ð)Ø˜XÑ%€Ø€3€{ÑÔ˜3œ8Ð#Ð#Ø„H‡O‚O�A�s�s˜;Ñ'Ô'Ñ(Ô(Ð(Ø˜7Ñ"€
Ø€3€z�?„?˜#œ(Ð"Ð"Ø„H‡O‚O�A�s�s˜:‘”Ñ'Ô'Ð'ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 
€Ø	€Ø€Ø€ØÐ ØÐ ØÐ ØÐ ðð ð Ð ðð ð Ð ð KÐJÐJÐ ð ØØØØØØØØØØ#Ø$ØØðð €ð& '*Ø!$Ø47ð
ð 
ð 
ð 
ð 
ð "%Ø47ð
"ð 
"ð 
"ð 
"ð 
"ðð ð ð ð,/ð /ð /ð /ð
ð ð ð ðAð Að Að Að Añ Aô Að AðH „ð=ð =ð =ñ „ð=ð „ðð ð ñ „ðð ð rW   