
    Bգi                     D   d Z ddlZddlZddlZddl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 ddlmZmZmZmZmZmZmZmZmZmZmZ  ej        e          ZdZdZddd	d
dddd
dddd
gZdZ dZ!dZ"e"Z#e#dz  Z$dZ%dZ&dZ'dZ(dZ)dZ*de$z  Z+dZ,dZ-dZ.dZ/d Z0d!ed"ed#e1e2e2f         fd$Z3d%e2d"ed#e2fd&Z4d'efd(Z5d'ed)e6d*e2d+e2fd,Z7d'ed)e6d-e2fd.Z8drd0e9d1e9d2e2d#e9fd3Z:d'ed4ed5ed6e9fd7Z;d8e2d9e2d%e2d:e2d;e2d<e2d=e2d#e<fd>Z=	 dsd'ed4ed8e2d9e2d%e2d@e<fdAZ>dBe$z  Z?dCZ@dDZAdEZBdFZCdGZDdHe$z  ZE	 	 	 	 	 dtd'ed4ed8e2d9e2dJe2dKe2dLe2dMe<dNe2dOe2dPe2dQe<d#efdRZFd'ed4ed8e2d9e2dSe2dTe2fdUZG	 dud'ed)e6dVe2dWe2d#e<f
dXZH	 	 dvd'ed)e6dYe6dVe2dWe2d-e2d#e<fdZZId'ed!ed:e2d;e2d#e<f
d[ZJ	 dsd'ed4ed8e2d9e2d@e<f
d\ZKd'ed!ed#e<fd]ZLejM        d^z  ZNd_ZOg d`ZPg daZQd'edbed8e2d9e2dce2f
ddZRd'ed!ed-e2d#e<fdeZSd'efdfZTd'efdgZUd'efdhZVd'ed!efdiZWd'efdjZXd'efdkZYd'efdlZZd'ed#e	e         fdmZ[d'ed#e\fdnZ]d'edoe\fdpZ^d'efdqZ_dS )wu   
游戏逻辑 —— 占领模式 + 战斗系统（水镜 / 镜像 分离）
所有坐标/距离单位为像素（世界 4000×3000）
    N)Optional)
AttackType
DamageTypeget_hero)WORLD_WWORLD_HCapturePointDamageNumberMirrorPlayer
ProjectileRoom
RoomStatusTeamVisualEffect)i  i	  )i  i  i   iX  idxy   i  i     i  i`	  g       @g      Y@g?         @P   iP  <   i|  g      ,@g      H@g     @g      T@g      i@g     @g      4@playermirrorreturnc                 h   | j         |j         z
  }| j        |j        z
  }||j        z  ||j        z  z   }|j         d|z  |j        z  z   |z
  }|j        d|z  |j        z  z   |z
  }t	          t
          t          t          |                    t	          t          t          t          |                    fS )u   
    计算镜像位置 —— 玩家关于水镜所在直线的对称点。
    水镜直线：过 (mirror.x, mirror.y)，方向为 (mirror.dir_x, mirror.dir_y)。
    r   )
r   r   dir_xdir_ymaxBORDER_MIN_XminBORDER_MAX_XBORDER_MIN_YBORDER_MAX_Y)r   r   vxvydotcxcys          4/root/workspace/TheGreatWar/server/app/game/logic.py_clone_positionr.   =   s    
 
FH	B	FH	B
v|
b6</
/C	AGfl*	*R	/B	AGfl*	*R	/Bc,3344c,33446 6    facingc                 P    t          j        |j        |j                  }d|z  | z
  S )uD   计算镜像朝向 —— 玩家朝向关于镜面方向的对称。r   )mathatan2r!   r    )r0   r   phis      r-   _mirror_facingr5   K   s&    
*V\6<
0
0Cs7Vr/   roomc                    d t           D             | _        i | _        g | _        g | _        g | _        g | _        | j                                        D ][}|j	        t          j        k    rt          \  |_        |_        nt          \  |_        |_        |                                 d|_        \t$          j        | _        d S )Nc                 V    g | ]&}t          |d          |d         |d                   'S )r   r   r   r   )r	   .0cps     r-   
<listcomp>z#init_game_state.<locals>.<listcomp>V   s@       <>4BsGr#w777  r/           )CAPTURE_POINTScapture_pointsmirrorsprojectilesdamage_numberseffectsdelayed_ballsplayersvaluesteamr   RED	SPAWN_REDr   r   
SPAWN_BLUEinit_from_heror0   r   PLAYINGstatus)r6   r   s     r-   init_game_staterN   U   s     BP  D DLDDDLD,%%''  ;$(""!*FHfhh!+FHfh$DKKKr/   user_iddxdyc           	      6   | j                             |          }|r|j        sd S t          j                    |j        k     rd S t          j                    |j        k     rd S t          j        ||z  ||z  z             }|dk    r
||z  }||z  }t          t          t          t          |j        ||j        z  t          z  z                       |_        t          t          t          t           |j        ||j        z  t          z  z                       |_        d S )Ngư>)rE   getalivetimemove_lock_until
root_untilr2   sqrtr"   r#   r$   r%   r   speed_TICK_SCALEr&   r'   r   )r6   rO   rP   rQ   r   mags         r-   update_player_positionr\   n   s    \g&&F  y{{V+++y{{V&&&
)BGb2g%
&
&C
Tzz
c	
c	<\68b6<>OR]>]3]!^!^__FH<\68b6<>OR]>]3]!^!^__FHHHr/   anglec                 b    | j                             |          }|r|j        r||_        d S d S d S )N)rE   rS   rT   r0   )r6   rO   r]   r   s       r-   update_player_facingr_      sG    \g&&F &,    r/         ?	atk_valuedefense
multiplierc                 \    | |z  }|dd|z   z  z  }t          dt          |                    S )Nd   r   )r"   int)ra   rb   rc   rawreduceds        r-   calculate_damageri      s5    
j
 CSC'M*+Gq#g,,r/   attackertargetdmgc                 ,   |j         sd S t          d|j        |z
            |_        | j                            t          |j        ||j        |j                             |j        dk    r(d|_         d|_        t          j	                    |_
        d S d S )Nr   	target_idamountr   r   F)rT   r"   hprB   appendr
   rO   r   r   rU   _death_time)r6   rj   rk   rl   s       r-   apply_damagert      s    < Avy3''FI|.
(fh         yA~~	!Y[[ ~r/   oxoytxtyradius
half_anglec                    || z
  }||z
  }t          j        ||z  ||z  z             }	|	|k    s|	dk     rdS t          j        ||          }
|
|z
  t           j        z   dt           j        z  z  t           j        z
  }t	          |          |k    S )Nr`   Fr   )r2   rX   r3   piabs)ru   rv   r0   rw   rx   ry   rz   rP   rQ   distangle_to_targetdiffs               r-   _in_fanr      s    	bB	bB9R"WrBw&''Df}}s

ujR((Of$tw.1tw;?$'IDt99
""r/   Fis_clonec                    | j                             t          d||t          |d          t          |j        d          t          |j        d          |j        j        |d                     | j        	                                D ]}|j
        |j
        k    s|j        |j        k    s|j        s*t          ||||j        |j        |j        |j                  r-t          |j        |j        d          }t%          | |||           d S )N
fan_attack   r   )r0   ranger]   rG   clonetyper   r   datar`   )rC   rr   r   roundattack_rangeattack_anglerG   valuerE   rF   rO   rT   r   r   r   ri   physical_attackphysical_defensert   )r6   rj   ru   rv   r0   r   rk   rl   s           r-   _do_fan_attackr      s,    	L
FA&&80!4480!44M'
 

 
 
 
 
 
 ,%%'' 6 6>X---1M1MU[Ua1M2r668VX((*?A A 	6"(&*A3 C x5556 6r/   g      B@g     @@g     @g      D@g      >@g     r@gQ?r=   ndxndymax_disthomingbonus_magicroot_durdmg_multsub_ballc           	      F   t          di dt          t          j                              dd         d|j        d|j        d|d|d|d	|d
t          d|j        d|d|sdndd|rt          nt          d|d|d|	d|
}| j
                            |           |S )u-   创建一个能量球弹丸并加入房间。r   N   owner_idrG   r   r   rP   rQ   rY   damager   	proj_typeenergy_ballenergy_ball_sub
hit_radiusr   bonus_magic_dmgroot_durationdamage_mult )r   struuiduuid4rO   rG   ENERGY_BALL_SPEEDr   ENERGY_BALL_SUB_HIT_RENERGY_BALL_HIT_RrA   rr   )r6   rj   ru   rv   r   r   r   r   r   r   r   r   projs                r-   _make_energy_ballr      s)       tz||RaR  !! ]] "	 	
 3
 3   ''  (0F--5F -5K((:K v $ h HD  	D!!!Kr/   mxmyc                    ||z
  }||z
  }t          j        ||z  ||z  z             }|dk     rd\  }}}||z  }	||z  }
t          j                    }||j        k     }||j        k     }||j        k     }|rt          nt          }|}d}|r
|j        dz  }|rdnd}t          | ||||	|
||||
  
         |rtd|_        |r|dz  nd}|r|dz  nd}t          j
        |
|	          }t          d          D ]6}|d|d	z   z  z   }| j                            ||j        |||||||d
	           7|rd|_        | j                            t!          d|||j        j        |p|p|d                     dS )uI   从 (ox,oy) 向鼠标方向 (mx,my) 发射能量球，根据buff增强。r`   )r`   r=   r`   r=   gffffff?g      ?      ?   g?r   )	fire_atr   ru   rv   
main_angle
ball_ranger   	sub_bonussub_rootenergy_ball_firerG   enhancedr   N)r2   rX   rU   
sw_f_until
sw_e_until
sw_r_untilENERGY_BALL_F_RANGEENERGY_BALL_RANGEmagical_attackr   r3   r   rD   rr   rO   rC   r   rG   r   )r6   rj   ru   rv   r   r   rP   rQ   r~   r   r   nowhas_fhas_ehas_rr   r   r   r   r   r   r   i	fire_times                           r-   _do_projectile_attackr      s    
bB	bB9R"WrBw&''Dczz$B
t)C
t)C
)++C(%%E(%%E(%%E ).D$$3DJFK 4-3$ssH dHb"c3 &+xA A A  !&+48d??*/8K$&&S	ZS))
q 	 	AcQUm+I%%$$,(( &$	' 	' 	 	 	 	  "!L
m)151E3 3       r/   target_xtarget_yc                    | j                             |          }|r|j        sdS |j        dk    rdS t	          |j                  }|r|j        j        nt          j	        }|j
        |_        t          j                    dz   |_        |t          j	        k    rt          | ||j        |j        |j        d           |j        r]|j        | j        v rO| j        |j                 }t'          ||          \  }}	t)          |j        |          }
t          | |||	|
d           n.|t          j        k    rt-          | ||j        |j        ||           dS )NFr   333333?r   T)rE   rS   rT   attack_cd_remainingr   hero_idstatsattack_typer   FAN	attack_cdrU   rV   r   r   r   r0   	mirror_idr@   r.   r5   TARGETEDr   )r6   rO   r   r   r   heror   r   r+   r,   cfs              r-   process_attackr   1  sK   \g&&F  u!A%%uFN##D,0D$*((jnK!'!1F!Y[[3.Fjn$$tVVXvxQVWWWW 	D 0DL @ @\&"23F$VV44FBv66B4RdCCCC	
+	+	+dFFHfh(SSS4r/   keyc           
         | j                             |          }|r|j        sdS t          |j                  }|sdS d }|j        D ]}	|	j        |k    r|	} n|sdS |j        dk    r^|j        r |j        | j	        v rt          | |           dS |j                            |d          }
|
dk    rdS t          | |||          }|S |j        dk    rt          | |          }|S |j        dk    rG|j                            |d          }
|
dk    rdS t          | ||          }|r|j        |j        |<   |S |j        dv r|j                            |d          }
|
dk    rdS t!          j                    }d}|j        d	k    r||z   |_        n+|j        d
k    r||z   |_        n|j        dk    r
||z   |_        |j        |j        |<   | j                            t-          d|j        |j        ||j        j        d                     dS dS )NF
red_lady_fTr   
red_lady_e
red_lady_r)soul_weaver_fsoul_weaver_esoul_weaver_rr   r   r   r   sw_buff)skillrG   r   )rE   rS   rT   r   r   skillsr   r   r   r@   _destroy_mirror	skill_cds_skill_red_lady_f_skill_red_lady_e_skill_red_lady_rcooldownrU   r   r   r   rC   rr   r   r   r   rG   r   )r6   rO   r   r   r   r]   r   r   	skill_defscdsuccessr   buff_durs                 r-   process_skillr   Q  s    \g&&F  uFN##D uI[  5C<<IE   u||## 	 0DL @ @D&)))4!!#q))665#D&(HEE||###D&11||##!!#q))665#D&%88 	7$-$6FS! |JJJ!!#q))665ikk<?** #hF\_,, #hF\_,, #hF ) 2Lh&((9::
 
 
 	 	 	
 t5r/   c                    |j         r"|j         | j        v r| j        |j         = d |_         ||j        z
  }||j        z
  }t	          j        ||z  ||z  z             }|t          k     rd\  }}d}|t          k    r*|j        ||z  t          z  z   }|j        ||z  t          z  z   }t          t          t          t          |                    }t          t          t          t          |                    }||z  }||z  }| }	|}
t          t          j                              d d         }t#          ||j        |j        |||	|
t)          j                    t*          	  	        | j        |<   ||_         | j                            t1          d||||j        j        t5          |	d          t5          |
d          d                     d	S )
N)r`   r=   r`   r   )	r   r   rG   r   r   r    r!   
created_atdurationmirror_placer   )r   rG   r    r!   r   T)r   r@   r   r   r2   rX   MIRROR_MIN_DISTMIRROR_MAX_RANGEr"   r#   r$   r%   r&   r'   r   r   r   r   rO   rG   rU   MIRROR_DURATIONrC   rr   r   r   r   )r6   r   rw   rx   rP   rQ   r~   r   r   mirror_dir_xmirror_dir_yr   s               r-   r   r     s     F,<<L)*	fhB	fhB9R"WrBw&''DoBXT	$444XT	$444	\3|R00	1	1B	\3|R00	1	1B
t)C
t)C4LLDJLL!!"1"%I$[
9;; 	 	 	DL !FL
"K%<++<++	
 
	 	 	 	 	 	 4r/   c                    | j                             t          d||t          |j        j        |d                     | j                                        D ]}|j        |j        k    s|j        |j        k    s|j	        s*|j
        |z
  }|j        |z
  }t          j        ||z  ||z  z             t          k    r-t          |j        |j        d          }t#          | |||           d S )Nspin)ry   rG   r   r   g333333?)rC   rr   r   SPIN_RADIUSrG   r   rE   rF   rO   rT   r   r   r2   rX   ri   r   r   rt   )	r6   rj   ru   rv   r   rk   tdxtdyrl   s	            r-   _do_spin_damager     s   L
#X]-@8TT     
 ,%%'' 	6 	6>X---1M1MU[Ua1Mhmhm9S3Ys*++{::"(&*A3 C x555	6 	6r/   c                    |j         r|j         | j        vrdS | j        |j                  }|j        rdS d|_        t          j                    dz   |_        t          | ||j        |j        d           t          ||          \  }}t          | |||d           | j	        
                    |j        |j         t          j                    dz   d           dS )NFT      ?r   )rO   r   swap_at)r   r@   used_erU   rV   r   r   r   r.   pending_swapsrr   rO   )r6   r   r   clone_xclone_ys        r-   r   r     s     v/t|CCu\&*+F} uFM!Y[[3.FD&&(FHuEEEE&vv66GWD&'7TBBBB>%9;;$    
 4r/      g      N@)r   r   )r`   ffffff?r  ownercenter_anglec                    t           dz  }t          t          t          t                              D ]\  }\  }}|||z  z   }	t          j        |	          }
t          j        |	          }|dk    rt          nd}| j	        
                    t          t          t          j                              dd         |j        |j        ||
|z  z   |||z  z   |
|t"          t%          |j        |z            t(          |                     dS )uL   以 (ox,oy) 为起点、center_angle 为中心方向，生成 3 片碎镜。r   r   r=   Nr   )r   r   rG   r   r   rP   rQ   rY   r   r   shard_index)SHARD_SPREAD	enumeratezipSHARD_OFFSETSSHARD_DMG_MULTr2   cossinSHARD_LEAD_DISTrA   rr   r   r   r   r   rO   rG   PROJECTILE_SPEEDrf   r   PROJECTILE_RANGE)r6   r  ru   rv   r	  halfidxsimultarP   rQ   leads                r-   _spawn_shardsr    s    !D$S%G%GHH  Zb$29$Xa[[Xa[["$''s
4:<<  !$]29n29nb"u,t344%!
 !
 !
 	 	 	 	 r/   c                 0   t          j                     dz   |_        t          | ||j        |j        |           |j        rV|j        | j        v rH| j        |j                 }t          ||          \  }}t          ||          }t          | ||||           dS )Nr   T)	rU   rV   r  r   r   r   r@   r.   r5   )r6   r   r]   r   r+   r,   c_angles          r-   r   r     s    !Y[[3.F$&(E::: 5F,<<f./ 00B //dFBG4444r/   c                 $   | j                                         D ]u}|j        dk    r"t          d|j        t          z
            |_        |j        D ]>}|j        |         dk    r+t          d|j        |         t          z
            |j        |<   ?vd S )Nr   )rE   rF   r   r"   TICK_DTr   )r6   pr   s      r-   _tick_cooldownsr"  "  s    \  "" F F 1$$$'1+@7+J$K$KA!; 	F 	FC{3!###&q!+c*:W*D#E#EC 	FF Fr/   c                    t          j                     }g }| j        D ]5}||d         k     r|                    |           %| j                            |d                   }|r|j        sOt          j        t          j	         dz  t          j	        dz            }|d         |z   }t          j
        |          }t          j        |          }t          | ||d         |d         |||d         |d         |d	         |d
         dd           | j                            t          d|d         |d         |j        j        dd                     7|| _        dS )u6   处理 R 弹幕延迟小球：到期的立即生成。r   r   r  r   ru   rv   r   r   r   r   r   T)r   r   r   r   r   N)rU   rD   rr   rE   rS   rT   randomuniformr2   r|   r  r  r   rC   r   rG   r   )	r6   r   	remainingdbrj   rand_offsetr  sdxsdys	            r-   _tick_delayed_ballsr+  +  sq   
)++CI   IR   <##BzN33 	x~ 	ndgX\47Q;??|{*hqkkhqkk(tHbh|xL{OzND		
 		
 		
 		
 	L#h"T("--4@@
 
 
 	 	 	 	
 #Dr/   c                    g }| j         D ]W}|j        r|j        rqt          }d }| j                                        D ]o}|j        |j        k    s|j        |j        k    s|j	        s*|j
        |j
        z
  }|j        |j        z
  }t          j        ||z  ||z  z             }||k     r|}|}p|rt          j        |j        |j        z
  |j
        |j
        z
            }	t          j        |j        |j                  }
|	|
z
  t          j        z   dt          j        z  z  t          j        z
  }t%          t&           t)          t&          |                    }|
|z   }t          j        |          |_        t          j        |          |_        |xj
        |j        |j        z  z  c_
        |xj        |j        |j        z  z  c_        |xj        |j        z  c_        |j
        dk     s+|j
        t2          k    s|j        dk     s|j        t4          k    r|j        |j        k    rd}| j                                        D ]}|j        |j        k    s|j        |j        k    s|j	        s+|j
        |j
        z
  }|j        |j        z
  }t          j        ||z  ||z  z             |j        k     rt;          t=          |j        |j         z            |j!        d          }t%          d|j"        |z
            |_"        | j#        $                    tK          |j        ||j
        |j                             |j&        dk    rt;          t=          |j&        |j         z            |j'        d          }t%          d|j"        |z
            |_"        | j#        $                    tK          |j        ||j
        |j        dz
                       |j(        dk    r3t%          |j)        tU          j*                    |j(        z             |_)        |j"        dk    r&d|_	        d|_"        tU          j*                    |_+        d|_        d} n|s|$                    |           Y|| _         d S )Nr   r   Fr`   rn   r   T),rA   hitr   HOMING_SEARCH_RrE   rF   rO   r   rG   rT   r   r   r2   rX   r3   rQ   rP   r|   r"   HOMING_TURN_RATEr$   r  r  rY   traveledr   r   r   r   ri   rf   r   r   r   rq   rB   rr   r
   r   magical_defenser   rW   rU   rs   )r6   alive_projsr   	best_distbest_targettr   r   ddesiredcurrentr   turn	new_angle
hit_targetrk   phys_dmgmag_dmgs                     r-   _tick_projectilesr>  N  sJ   K  K% K%8 	 ; 	.'IK\((** $ $9--491D1DAG1DcDFlcDFlIcCi#)344y== !I"#K .*[]TV%;[]TV=STT*TWdg66')DG3DGDtwN,,c2BD.I.IJJ#dN	(9--(9--$'DJ&&$'DJ&&#6A::'))TVaZZ46G;K;K=DM))
l))++ $	 $	F~..&+2J2JRXR^2J(TV#C(TV#CysS3Y.//$/AA+d&6677+S2 2  69x#788	#**<$nXh&(, , ,   
 '!++.D043CCDD.5 5G !$Avy7': ; ;FI'..|"(. (fhm0 0 0   
 %))(+)49;;9K+K)M )MF% 9>>#(FL !FI)-F&!
? BB  	%t$$$"Dr/   c                     |j         }|r|| j        v r| j        |= d |_         t          |j                  }|r'|j        D ]!}|j        dk    r|j        |j        d<    d S  d S d S )Nr   f)r   r@   r   r   r   r   r   r   )r6   r   midr   sks        r-   r   r     s    

C
 sdl""LFFN##D + 	 	Bu$$(* % % 	 	r/   c                 :   d | j                                         D             }|D ]t}| j                                        D ]P}|j        |k    rCd |_        t          |j                  }|r&|j        D ]}|j        dk    r|j	        |j
        d<    nQ| j         |= ud S )Nc                 4    g | ]\  }}|j         s|j        |S r   )expiredactive)r:   rA  ms      r-   r<   z!_tick_mirrors.<locals>.<listcomp>  s*    SSSvsAS!(SsSSSr/   r   r@  )r@   itemsrE   rF   r   r   r   r   r   r   r   )r6   rE  rA  r!  r   rB  s         r-   _tick_mirrorsrI    s    SS!3!3!5!5SSSG 
 
$$&& 	" 	"A{c!!"	** ""k " "5L00/1{AK,!E 1 L
 
r/   c                    t          j                     }g }| j        D ])}||d         k    r| j                            |d                   }|r|j        s:||j        k     rF|d         }|| j        vrX| j        |         }t          ||          \  }}|j        |j	        }
}	||c|_        |_	        | j
                            t          d|j        |j	        t          |	d          t          |
d          t          |d          t          |d          |j        j        d                     |                    |           +|| _        d S )Nr   rO   r   mirror_swapr   )from_xfrom_yto_xto_yrG   r   )rU   r  rE   rS   rT   rW   r@   r.   r   r   rC   rr   r   r   rG   r   )r6   r   r&  swapr   rA  r   r  r  old_xold_ys              r-   _tick_pending_swapsrS    sk   
)++CI" # #$y/!!\%%d9o66F  V&&&{#C$,&&\#&F.vv>>GW!8VX5E!('FHfhL"(fh %eQ5??#GQ//w9J9J$k/1 1! ! !     T"""""Dr/   c                    t          j                     }| j                                        D ]}|j        st	          |d          r||j        z
  t          k    rnd|_        |j        |_        d|_	        |j
        D ]}d|j
        |<   |j        t          j        k    rt          \  |_        |_        nt"          \  |_        |_        |`d S )Nrs   Tr   )rU   rE   rF   rT   hasattrrs   RESPAWN_TIMEmax_hprq   r   r   rG   r   rH   rI   r   r   rJ   )r6   r   r!  r   s       r-   _tick_respawnrX    s    
)++C\  "" " "w 	"71m44 	"Q]"l22x()%; ) )C'(AK$$6TX%%(HAC)HACM" "r/   c                 .   | j         D ]}d}d}| j                                        D ]]}|j        s
|j        |j        z
  dz  |j        |j        z
  dz  z   dz  }||j        k    r |j        t          j	        k    r|dz  }X|dz  }^||k    r7t          t           |j        t          t          z  ||z
  z  z
            |_        n;||k    r5t          t          |j        t          t          z  ||z
  z  z             |_        |j        t           k    rt          j	        |_        |j        t          k    rt          j        |_        =t%          |j                  t          dz  k     rN|j        G|j        t          j	        k    r|j        dk    s |j        t          j        k    r|j        dk     rd |_        t'          d | j         D                       }t'          d | j         D                       }|dk    rt          j	        S |dk    rt          j        S d S )Nr   r   r   r   c              3   D   K   | ]}|j         t          j        k    d V  dS r   N)r  r   rH   r9   s     r-   	<genexpr>z(update_capture_points.<locals>.<genexpr>  s0      LL"rx487K7KA7K7K7K7KLLr/   c              3   D   K   | ]}|j         t          j        k    d V  dS r[  )r  r   BLUEr9   s     r-   r\  z(update_capture_points.<locals>.<genexpr>  s0      NN2DI8M8MQ8M8M8M8MNNr/   r   )r?   rE   rF   rT   r   r   ry   rG   r   rH   r"   CAPTURE_THRESHOLDprogressCAPTURE_SPEEDrZ   r$   r  r^  r}   sum)r6   r;   red_inblue_inr!  r~   	red_owned
blue_owneds           r-   update_capture_pointsrg    s   !    $$&& 	! 	!A7 S24ZA%rt(99cADry  6TX%%aKFFqLGG00"+P[@[_eho_o@p2pqqBKKv/}{?Z^ehn^n?o1oppBK;,,,,xBHH[---yBHH 1C 777x#TX%%"+//H	))bkAooLL 3LLLLLINN!4NNNNNJA~~xQy4r/   c                     g } j                                         D ]}|j        r|j         j        v r|j        r j        |j                 }t          ||          \  }}t          |j        |          }|                    |j	        |j
        j        t          |d          t          |d          t          |d          |j        d           d fd j                                         D             d  j        D             d  j                                        D             |d  j        D             d	} j        rd
  j        D             |d<   g  _         j        rd  j        D             |d<   g  _        |S )Nr   r   )r   rG   r   r   r0   r   
game_statec                    g | ]h}i d |j         d|j        d|j        j        dt	          |j        d          dt	          |j        d          d|j        d|j        d|j	        d	|j
        d
t	          |j        d          dt	          |j        d          dd |j                                        D             dt          j                    |j        k     dt#          |j        o|j        j        v           d|j        rm|j        j        v r_t	          t)          dj        |j                 j        t          j                    j        |j                 j        z
  z
            d          ndd|j        r%|j        j        v rj        |j                 j        nddt	          t)          d|j        t          j                    z
            d          t	          t)          d|j        t          j                    z
            d          t	          t)          d|j        t          j                    z
            d          ddt          j                    |j        k     ijS )rO   nicknamerG   r   r   r   rT   rq   rW  r   r0   r   r   r   r   c                 6    i | ]\  }}|t          |d           S )r   )r   )r:   kvs      r-   
<dictcomp>z-get_game_state.<locals>.<listcomp>.<dictcomp>8  s&    MMMAaq!MMMr/   move_locked
has_mirrormirror_remainingr   mirror_used_eTbuffs)sw_fsw_esw_rrooted)rO   rk  rG   r   r   r   r   rT   rq   rW  r   r0   r   r   rH  rU   rV   boolr   r@   r"   r   r   r  r   r   r   rW   )r:   r!  r6   s     r-   r<   z"get_game_state.<locals>.<listcomp>+  s    #
 #
 #
D C 19 AJ    U13]]	 
 U13]]    ad  !(  19  %!,,  U1#8!<<  MM9J9J9L9LMMM  ty{{Q->>  d1;#N1;$,3NOO  # {'({dl'B'B #aak!:!C!Y[[4<+D+OO"Q R RSTV V V ' *  {'({dl'B'B L-441 4 !#a	)C"D"DaHH!#a	)C"D"DaHH!#a	)C"D"DaHH 5 > $)++4?   #
 #
 #
r/   c           
          g | ][}|j         t          |j        d           t          |j        d           |j        r|j        j        ndt          |j        d           d\S )r   N)r   r   r   r  r`  )r   r   r   r   r  r   r`  r9   s     r-   r<   z"get_game_state.<locals>.<listcomp>O  sq     	
 	
 	
  e24^^24^^+-8=!"+q11 	
 	
 	
r/   c                     g | ]l}|j         |j        |j        j        t	          |j        d           t	          |j        d           t	          |j        d          t	          |j        d          dmS )r   r   )r   r   rG   r   r   r    r!   )	r   r   rG   r   r   r   r   r    r!   )r:   rG  s     r-   r<   z"get_game_state.<locals>.<listcomp>Y  sv     
 
 
 	 d
AFL13]]qsAqw**U17A5F5F 
 
 
r/   c                 "   g | ]}|j         |j        |j        j        t	          |j        d           t	          |j        d           t	          |j        d          t	          |j        d          t	          |j	        d           |j
        |j        d
S )r   r   )
r   r   rG   r   r   rP   rQ   rY   shardptype)r   r   rG   r   r   r   r   rP   rQ   rY   r  r   )r:   r!  s     r-   r<   z"get_game_state.<locals>.<listcomp>b  s     

 

 

  d
AFL13]]qsAAD!nnE!$NNqw** 

 

 

r/   )r   rE   r?   r@   clonesrA   c           	      |    g | ]9}|j         |j        t          |j        d           t          |j        d           d:S )r   rn   )ro   rp   r   r   r   )r:   r6  s     r-   r<   z"get_game_state.<locals>.<listcomp>p  sS     #
 #
 #
  +Q--eACmm5 5#
 #
 #
r/   rB   c                 |    g | ]9}|j         t          |j        d           t          |j        d           |j        d:S )r   r   )r   r   r   r   r   )r:   es     r-   r<   z"get_game_state.<locals>.<listcomp>x  sL     
 
 
 V%Q--eACmmQVTT
 
 
r/   rC   )rE   rF   r   r@   rT   r.   r5   r0   rr   rO   rG   r   r   r   r?   rA   rB   rC   )r6   r  r!  r   r+   r,   r   states   `       r-   get_game_stater    s   F\  ""  ; 	1;$,66176\!+.F$Q//FB&11BMMI2q\\2q\\A,,9     #
 #
 #
 #
D \((**E#
 #
 #
H	
 	
 )	
 	
 	

 
 \((**
 
 
 

 

 %

 

 

sD DEL  !#
 #
 (#
 #
 #

 !| 
 
\
 
 
i Lr/   messagec                 B  K   t          j        |d          }g }| j                                        D ]S\  }}|j        rG	 |j                            |           d {V  .# t          $ r |                    |           Y Ow xY wT|D ]}d | j        |         _        d S )NF)ensure_ascii)jsondumpsrE   rH  ws	send_text	Exceptionrr   )r6   r  r   disconnecteduidr   s         r-   	broadcastr    s      :gE222DL|))++ ) )V9 	))i))$////////// ) ) )##C((((()	)
  $ $#S$ $s    A""BBc                   K   t                               d| j                    	 | j        t          j        k    rt          |            t          |            t          |            t          |            t          |            t          |            t          |           }t          |           }t          | |           d {V  |r0t          j        | _        t          | d|j        d           d {V  n4t#          j        t&                     d {V  | j        t          j        k    nh# t"          j        $ r% t                               d| j                    Y n5t*          $ r)}t                               d| d           Y d }~nd }~ww xY wt          j        | _        d S # t          j        | _        w xY w)NzGame loop started for room 	game_over)r   winnerzGame loop cancelled for room zGame loop error: T)exc_info)loggerinforoom_idrM   r   rL   r"  r+  r>  rI  rS  rX  rg  r  r  FINISHEDr   asynciosleep	TICK_RATECancelledErrorr  error)r6   r  r  r  s       r-   	game_loopr    s     
KK<dl<<===*kZ///D!!!%%%d###$%%%$*400F"4((ED%((((((((( (1'$l' '          -	*********) kZ///* ! D D DBDLBBCCCCC = = =,,,t<<<<<<<<= !)j)))))s<   D	D0 /F+ 01F!F+ #	F,FF+ FF+ +F>)r`   )F)Fr=   r=   r`   F)r   r   )r   r   r   )`__doc__r  r  loggingr2   r$  rU   r   typingr   app.game.heroesr   r   r   app.game.room_managerr   r   r	   r
   r   r   r   r   r   r   r   	getLogger__name__r  rI   rJ   r>   ra  r_  r  r   rZ   rV  r#   r%   r&   r'   r   r  r  PROJECTILE_HIT_Rr   r   r   tuplefloatr.   r5   rN   r   r\   r_   rf   ri   rt   ry  r   r   r   r   r   r   r   r.  r/  r   r   r   r   r   r   r   r|   r  r  r  r  r  r   r"  r+  r>  r   rI  rS  rX  rg  dictr  r  r  r   r/   r-   <module>r     s                 < < < < < < < < < <                          
	8	$	$ 	
 3c""4d##4d##  	
l  K'    6F 6F 6uUE\7J 6 6 6 65 & U    %$ % % % %2` ` ` `E ` ` ` `$t c %         c  u  s        )t )v )v )C ) ) ) )	# 	#5 	#% 	#	# 	#*/	#=B	#GK	# 	# 	# 	#$ %*6 6 6 66"'6166!6 6 6 6< K'     K'  &++.(+(+', D F %* ', !& #	
 $) !& !& !% 2<   <; ; ;#;).;#;).; ; ; ;~ ;<   "27@D   B :;!"? ? ?s ? ?!?16??'+? ? ? ?F0D 0& 00%*0/30 0 0 0j &+6 6$ 6& 6e 6 6"6 6 6 6&D & T    . 'A+**!// V !&6;   0D &  4    $F$ F F F F #d  #  #  #  #FN#D N# N# N# N#b
$ 
 
 
 
 
    #d # # # #<" " " " "*$ $$ $ $ $ $Ve e$ e e e eX
$$ 
$ 
$ 
$ 
$ 
$*$ * * * * * *r/   