
    Σ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 y)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y)
RoomStatuswaitingplayingfinishedN)__name__
__module____qualname__WAITINGPLAYINGFINISHED     S/mnt/c/Users/DipsyHou/Desktop/workspace/TheGreatWar/server/app/game/room_manager.pyr   r      s    GGHr   r   c                      e Zd ZdZdZy)TeamredblueN)r   r   r   REDBLUEr   r   r   r   r      s    CDr   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	y)Mirroru   水镜实体stridowner_idr   teamfloatxydir_xdir_y
created_atg      ,@durationTboolactiveFused_ec                ^    t        j                          | j                  z
  | j                  k\  S N)timer*   r+   selfs    r   expiredzMirror.expired5   s     yy{T__,==r   N)returnr,   )
r   r   r   __doc____annotations__r+   r-   r.   propertyr4   r   r   r   r    r    &   s^    GM
JHHLLHeFDFD> >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y!)#
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_multc                    | 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   r2   s    r   to_dictzProjectile.to_dictQ   sD    ''t}}diiootvvq!dffa(8
 	
r   Nr5   dict)r   r   r   r6   r7   rA   rB   rD   rF   rG   rH   rI   rJ   rK   rP   r   r   r   r:   r:   :   s    GM
JHHIILMOHeCKIsJFD OU M5K
r   r:   c                  H    e Zd ZU dZded<   ded<   ded<   ded<   d	Zded
<   y)DamageNumberu   飘字伤害数字r!   	target_idrC   amountr%   r&   r'   r   tickN)r   r   r   r6   r7   rW   r   r   r   rT   rT   X   s"    NKHHD#Mr   rT   c                  Z    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<   y)VisualEffectu   视觉特效事件r!   typer%   r&   r'   default_factoryrR   datar   rC   rW   N)	r   r   r   r6   r7   r   rR   r]   rW   r   r   r   rY   rY   b   s,    
IHHt,D$,D#Mr   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y).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[   rR   	skill_cdsmove_lock_untilzOptional[str]	mirror_id
sw_f_until
sw_e_until
sw_r_until
root_untilc                (   t        | j                        }|sy |j                  }|j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _        |j                  | _        |j                  | _	        |j                  | _
        |j                  | _        |j                  | _        d| _        |j                  D ci c]  }|j                  d c}| _        d| _        d | _        y c c}w )Nr@   T)r
   rc   statsre   rf   rg   rh   ri   rj   r=   rk   rl   rm   ro   skillskeyrp   rd   rr   )r3   herossks       r   init_from_herozPlayer.init_from_hero   s    %JJdd$$ 00.. ! 2 2 00WW
NNNN#& 04<""&&#+<
 =s   $D) r   r   r   r7   rb   r	   rc   r&   r'   rd   re   rf   rg   rh   ri   rj   r=   rk   rl   rm   rn   ro   r   rR   rp   rq   rr   rs   rt   ru   rv   r~   r   r   r   r_   r_   p   s   LM
J"B""GS" AuNAuNE4BKFCO OSNCcOSE5L%L%IuFE!$$D1It1 OU #I}# JJJJr   r_   c                  V    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<   y)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/    GHH E> HeFE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y)%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_taskc                ,    t        | j                        S r0   )lenr   r2   s    r   player_countzRoom.player_count   s    4<<  r   c                V    t        d | j                  j                         D              S )Nc              3  \   K   | ]$  }|j                   t        j                  k(  s!d  & ywrM   N)r$   r   r   .0ps     r   	<genexpr>z!Room.red_count.<locals>.<genexpr>   s"     J3qvv7I13   ",,sumr   valuesr2   s    r   	red_countzRoom.red_count   s     Jdll113JJJr   c                V    t        d | j                  j                         D              S )Nc              3  \   K   | ]$  }|j                   t        j                  k(  s!d  & ywr   )r$   r   r   r   s     r   r   z"Room.blue_count.<locals>.<genexpr>   s"     K3qvv7J13r   r   r2   s    r   
blue_countzRoom.blue_count   s     Kdll113KKKr   c                n   | j                   | j                  | j                  | j                  j                  | j
                  | j                         | j                  j                         D cg c];  }|j                  |j                  |j                  j                  |j                  d= c}dS c c}w )N)r`   ra   r$   rc   )r   r   r   r   r   r   r   )r   r   r   r   rN   r   r   r   r   r`   ra   r$   rc   )r3   r   s     r   rP   zRoom.to_dict   s    ||II||kk''++ --/ ,,. /A  !yy !

FFLL yy	 /
 	
s   -A B2)r5   rC   rQ   )r   r   r   r7   r   r   r   r   r   rR   r   r1   r*   r   r   r   r   r   r   r   r   r   r   r   r   rP   r   r   r   r   r      s    L
IL#++FJ+K!&t!<G<dii8J8).t)DN&D!&t!<G<$)$$?K!?).t)DN&D"'"=G=5M455M45(,I%,!KL
r   r   c                  J    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
y	)RoomManagerc                    i | _         y r0   )roomsr2   s    r   __init__zRoomManager.__init__   s	    &(
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   )r3   r   r   host_nicknamer   rooms         r   create_roomzRoomManager.create_room   sZ    djjl#BQ'G$@ &m$((!
W #

7r   c                8    | j                   j                  |      S r0   )r   get)r3   r   s     r   get_roomzRoomManager.get_room   s    zz~~g&&r   c                    | j                   j                         D cg c]/  }|j                  t        j                  k7  r|j                         1 c}S c c}w r0   )r   r   r   r   r   rP   )r3   r   s     r   
list_roomszRoomManager.list_rooms   sN     

))+
+{{j111 LLN+
 	
 
s   4Ac                   | j                   j                  |      }|r|j                  t        j                  k7  ry |j                         |j                  k\  ry ||j                  v r|S |j                         |j                         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_   )r3   r   r`   ra   r   r$   s         r   	join_roomzRoomManager.join_room  s    zz~~g&t{{j&8&88$"2"22dll"K>>+t/@@txxdii &hT!
W r   c                h   | j                   j                  |      }|r||j                  vry|j                  |= |j                         dk(  r4|j                  r|j                  j                          | j                   |= y|j                  |k(  r#t        t        |j                              |_        y)NFr   T)	r   r   r   r   r   cancelr   nextiter)r3   r   r`   r   s       r   
leave_roomzRoomManager.leave_room  s    zz~~g&wdll2LL!!#~~%%'

7#<<7"T\\ 23DLr   c                    | j                   j                  |d       }|r(|j                  r|j                  j                          y y y r0   )r   popr   r   )r3   r   r   s      r   delete_roomzRoomManager.delete_room!  s6    zz~~gt,DNNNN!!# #4r   c                    | j                   j                  |      }|r|j                  t        j                  k7  ry|j
                  j                  |      }|syt        |      }|sy||_        y)NFT)r   r   r   r   r   r   r
   rc   )r3   r   r`   rc   r   playerr{   s          r   select_herozRoomManager.select_hero&  s_    zz~~g&t{{j&8&88!!'*  r   N)r   r!   r   r!   r   r!   r5   r   )r   r!   r5   Optional[Room])r5   z
list[dict])r   r!   r`   r!   ra   r!   r5   r   )r   r!   r`   r!   r5   r,   )r   r!   )r   r!   r`   r!   rc   r!   r5   r,   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s*    )'
$
r   r   )!r6   
__future__r   asynciomathr1   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 
d 3  > > >& 
 
 
:       8 8 8~    ,
 ,
 ,
fC CL }r   