
    Cգis(                       d Z ddlm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 ddlmZ ddlmZ ddlmZmZ d	Zd
Z G d dee          Z G d dee          Ze G d d                      Ze G d d                      Ze G d d                      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 e            Z dS )ut   
房间管理器 —— 内存中管理所有游戏房间
所有距离/坐标单位为像素（世界 4000×3000）
    )annotationsN)	dataclassfield)Enum)Optional)	WebSocket)DEFAULT_HERO_IDget_heroi  i  c                      e Zd ZdZdZdZdS )
RoomStatuswaitingplayingfinishedN)__name__
__module____qualname__WAITINGPLAYINGFINISHED     ;/root/workspace/TheGreatWar/server/app/game/room_manager.pyr   r      s        GGHHHr   r   c                      e Zd ZdZdZdS )TeamredblueN)r   r   r   REDBLUEr   r   r   r   r      s        CDDDr   r   c                      e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   dZded<   dZded<   dZded<   edd            Z	dS )Mirroru   水镜实体stridowner_idr   teamfloatxydir_xdir_y
created_atg      ,@durationTboolactiveFused_ereturnc                J    t          j                     | j        z
  | j        k    S N)timer*   r+   selfs    r   expiredzMirror.expired5   s    y{{T_,==r   N)r/   r,   )
r   r   r   __doc____annotations__r+   r-   r.   propertyr5   r   r   r   r    r    &   s         GGGMMMJJJHHHHHHLLLLLLHFF> > > X> > >r   r    c                      e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   dZded<   dZded<   dZded<   dZded<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   d$d"Zd#S )%
Projectileu	   投射物r!   r"   r#   r   r$   r%   r&   r'   dxdyspeeddamagemax_dist        traveledFr,   hitr   intshard_indexshard	proj_typeg      T@
hit_radiushomingbonus_magic_dmgroot_durationg      ?damage_multr/   dictc                    | j         | j        | j        j        t	          | j        d          t	          | j        d          | j        dS )N   )r"   r#   r$   r&   r'   rB   )r"   r#   r$   valueroundr&   r'   rB   r3   s    r   to_dictzProjectile.to_dictQ   sA    't}diotvq!!dfa(8(8
 
 	
r   Nr/   rL   )r   r   r   r6   r7   rA   rB   rD   rF   rG   rH   rI   rJ   rK   rQ   r   r   r   r:   r:   :   s"        OGGGMMMJJJHHHHHHIIIIIILLLMMMOOOHCKIJF O    MK
 
 
 
 
 
r   r:   c                  J    e Zd ZU dZded<   ded<   ded<   ded<   d	Zded
<   dS )DamageNumberu   飘字伤害数字r!   	target_idrC   amountr%   r&   r'   r   tickN)r   r   r   r6   r7   rW   r   r   r   rT   rT   X   sG         NNNKKKHHHHHHDMMMMMMr   rT   c                  b    e Zd ZU dZded<   ded<   ded<    ee          Zded	<   d
Zded<   dS )VisualEffectu   视觉特效事件r!   typer%   r&   r'   default_factoryrL   datar   rC   rW   N)	r   r   r   r6   r7   r   rL   r]   rW   r   r   r   rY   rY   b   s\         IIIHHHHHHt,,,D,,,,DMMMMMMr   rY   c                     e Zd ZU ded<   ded<   ded<   dZded<   eZded	<   d
Zded<   d
Zded<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded <   d
Zded!<   d
Zded"<    ee#          Zd$ed%<   d
Zded&<   dZd'ed(<   d
Zded)<   d
Zded*<   d
Zded+<   d
Zded,<   d- ZdS ).Playerr!   user_idnicknamer   r$   NzOptional[WebSocket]wshero_idr@   r%   r&   r'   Tr,   aliver   rC   hpmax_hpphysical_attackmagical_attackphysical_defensemagical_defenseg      (@r=   g      d@attack_rangegn?attack_angleg?	attack_cdfacingattack_cd_remainingr[   rL   	skill_cdsmove_lock_untilzOptional[str]	mirror_id
sw_f_until
sw_e_until
sw_r_until
root_untilc                   t          | j                  }|sd S |j        }|j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |j	        | _	        |j
        | _
        |j        | _        |j        | _        d| _        d |j        D             | _        d| _        d | _        d S )Nr@   c                    i | ]
}|j         d S )r@   )key).0sks     r   
<dictcomp>z)Player.init_from_hero.<locals>.<dictcomp>   s    <<<""&#<<<r   T)r
   rc   statsre   rf   rg   rh   ri   rj   r=   rk   rl   rm   ro   skillsrp   rd   rr   )r4   heross      r   init_from_herozPlayer.init_from_hero   s    %% 	FJd$ 0. ! 2 0W
NN#& <<<<<
r   ) r   r   r   r7   rb   r	   rc   r&   r'   rd   re   rf   rg   rh   ri   rj   r=   rk   rl   rm   rn   ro   r   rL   rp   rq   rr   rs   rt   ru   rv   r   r   r   r   r_   r_   p   s        LLLMMMJJJ"B"""""G"""" ANNNNANNNNEBKKKKFOOOO ONOELLIF!$$$$$eD111I1111 O    #I#### JJJJ    r   r_   c                  X    e Zd ZU ded<   ded<   ded<   dZded<   d	Zded
<   dZded<   dS )CapturePointrC   r"   r%   r&   r'   NzOptional[Team]ownerr@   progressg      n@radius)r   r   r   r7   r   r   r   r   r   r   r   r      s`         GGGHHHHHH E    HFr   r   c                     e Zd ZU ded<   ded<   ded<   ej        Zded<   dZded	<    ee	
          Z
ded<    eej        
          Zded<    ee
          Zded<    ee	
          Zded<    ee
          Zded<    ee
          Zded<    ee
          Zded<    ee
          Zded<    ee
          Zded<   dZded<   d%d Zd%d!Zd%d"Zd&d$ZdS )'Roomr!   room_idnamehost_idr   status   rC   max_playersr[   zdict[str, Player]playersr%   r*   zlist[CapturePoint]capture_pointszdict[str, Mirror]mirrorszlist[Projectile]projectileszlist[DamageNumber]damage_numberszlist[VisualEffect]effectslistpending_swapsdelayed_ballsNzOptional[asyncio.Task]	game_taskr/   c                *    t          | j                  S r1   )lenr   r3   s    r   player_countzRoom.player_count   s    4<   r   c                b    t          d | j                                        D                       S )Nc              3  D   K   | ]}|j         t          j        k    d V  dS rN   N)r$   r   r   rz   ps     r   	<genexpr>z!Room.red_count.<locals>.<genexpr>   s0      JJqv7I7I17I7I7I7IJJr   sumr   valuesr3   s    r   	red_countzRoom.red_count   s-    JJdl1133JJJJJJr   c                b    t          d | j                                        D                       S )Nc              3  D   K   | ]}|j         t          j        k    d V  dS r   )r$   r   r   r   s     r   r   z"Room.blue_count.<locals>.<genexpr>   s0      KKqv7J7J17J7J7J7JKKr   r   r3   s    r   
blue_countzRoom.blue_count   s-    KKdl1133KKKKKKr   rL   c           	         | j         | j        | j        | j        j        | j        |                                 d | j                                        D             dS )Nc                N    g | ]"}|j         |j        |j        j        |j        d #S ))r`   ra   r$   rc   )r`   ra   r$   rO   rc   r   s     r   
<listcomp>z Room.to_dict.<locals>.<listcomp>   sG          !y !
FL y	   r   )r   r   r   r   r   r   r   )	r   r   r   r   rO   r   r   r   r   r3   s    r   rQ   zRoom.to_dict   si    |I|k'+ --//  ,,..  
 
 	
r   )r/   rC   rR   )r   r   r   r7   r   r   r   r   r   rL   r   r2   r*   r   r   r   r   r   r   r   r   r   r   r   r   rQ   r   r   r   r   r      s        LLLIIILLL#+F++++K!&t!<!<!<G<<<<di888J8888).t)D)D)DNDDDD!&t!<!<!<G<<<<$)E$$?$?$?K????).t)D)D)DNDDDD"'%"="="=G====%555M5555%555M5555(,I,,,,! ! ! !K K K KL L L L
 
 
 
 
 
r   r   c                  L    e Zd Zd ZddZddZddZddZddZddZ	ddZ
dS )RoomManagerc                    i | _         d S r1   )roomsr3   s    r   __init__zRoomManager.__init__   s    &(


r   r   r!   r   host_nicknamer/   r   c                    t          t          j                              d d         }t          |||          }t	          ||t
          j                  |j        |<   || j        |<   |S )N   )r   r   r   r`   ra   r$   )	r!   uuiduuid4r   r_   r   r   r   r   )r4   r   r   r   r   rooms         r   create_roomzRoomManager.create_room   si    djll##BQB'G$@@@ &m$(!
 !
 !
W #
7r   r   Optional[Room]c                6    | j                             |          S r1   )r   get)r4   r   s     r   get_roomzRoomManager.get_room   s    z~~g&&&r   
list[dict]c                H    d | j                                         D             S )Nc                `    g | ]+}|j         t          j        k    |                                ,S r   )r   r   r   rQ   )rz   r   s     r   r   z*RoomManager.list_rooms.<locals>.<listcomp>   s:     
 
 
{j111 LLNN111r   )r   r   r3   s    r   
list_roomszRoomManager.list_rooms   s1    
 

))++
 
 
 	
r   r`   ra   c                x   | j                             |          }|r|j        t          j        k    rd S |                                |j        k    rd S ||j        v r|S |                                |	                                k    rt          j        nt          j        }t          |||          |j        |<   |S )Nr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r_   )r4   r   r`   ra   r   r$   s         r   	join_roomzRoomManager.join_room  s    z~~g&& 	t{j&8884$"2224dl""K>>++t/@/@@@txxdi &hT!
 !
 !
W r   r,   c                J   | j                             |          }|r	||j        vrdS |j        |= |                                dk    r*|j        r|j                                         | j         |= dS |j        |k    r&t          t          |j                            |_        dS )NFr   T)	r   r   r   r   r   cancelr   nextiter)r4   r   r`   r   s       r   
leave_roomzRoomManager.leave_room  s    z~~g&& 	wdl225L!!##~ (%%'''
7#4<7""T\ 2 233DLtr   c                    | j                             |d           }|r"|j        r|j                                         d S d S d S r1   )r   popr   r   )r4   r   r   s      r   delete_roomzRoomManager.delete_room!  sV    z~~gt,, 	$DN 	$N!!#####	$ 	$ 	$ 	$r   rc   c                    | j                             |          }|r|j        t          j        k    rdS |j                            |          }|sdS t          |          }|sdS ||_        dS )NFT)r   r   r   r   r   r   r
   rc   )r4   r   r`   rc   r   playerr   s          r   select_herozRoomManager.select_hero&  sy    z~~g&& 	t{j&8885!!'** 	5   	5 tr   N)r   r!   r   r!   r   r!   r/   r   )r   r!   r/   r   )r/   r   )r   r!   r`   r!   ra   r!   r/   r   )r   r!   r`   r!   r/   r,   )r   r!   )r   r!   r`   r!   rc   r!   r/   r,   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s        ) ) )   ' ' ' '
 
 
 
      $ $ $ $
     r   r   )!r6   
__future__r   asynciomathr2   r   dataclassesr   r   enumr   typingr   fastapir   app.game.heroesr	   r
   WORLD_WWORLD_Hr!   r   r   r    r:   rT   rY   r_   r   r   r   room_managerr   r   r   <module>r      s    # " " " " "     ( ( ( ( ( ( ( (                   5 5 5 5 5 5 5 5 
    d       3    > > > > > > > >& 
 
 
 
 
 
 
 
:                 8 8 8 8 8 8 8 8~         ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
fC C C C C C C CL {}}r   