
    У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j4                  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.Z8dod/e9d0e9d1e2d#e9fd2Z:d'ed3ed4ed5e9fd6Z;d7e2d8e2d%e2d9e2d:e2d;e2d<e2d#e<fd=Z=	 dpd'ed3ed7e2d8e2d%e2d>e<fd?Z>d@e$z  Z?dAZ@dBZAdCZBdDZCdEZDdFe$z  ZE	 	 	 	 	 dqd'ed3ed7e2d8e2dGe2dHe2dIe2dJe<dKe2dLe2dMe2dNe<d#efdOZFd'ed3ed7e2d8e2dPe2dQe2fdRZG	 drd'ed)e6dSe2dTe2d#e<f
dUZH	 	 dsd'ed)e6dVe6dSe2dTe2d-e2d#e<fdWZId'ed!ed9e2d:e2d#e<f
dXZJ	 dpd'ed3ed7e2d8e2d>e<f
dYZKd'ed!ed#e<fdZZLej                  d[z  ZNd\ZOg d]ZPg d^ZQd'ed_ed7e2d8e2d`e2f
daZRd'ed!ed-e2d#e<fdbZSd'efdcZTd'efddZUd'efdeZVd'ed!efdfZWd'efdgZXd'efdhZYd'efdiZZd'ed#e	e   fdjZ[d'ed#e\fdkZ]d'edle\fdmZ^d'efdnZ_y)tu   
游戏逻辑 —— 占领模式 + 战斗系统（水镜 / 镜像 分离）
所有坐标/距离单位为像素（世界 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                    | 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          L/mnt/c/Users/DipsyHou/Desktop/workspace/TheGreatWar/server/app/game/logic.py_clone_positionr.   =   s    
 
FHH	B	FHH	B
v||
b6<</
/C	AGfll*	*R	/B	AGfll*	*R	/Bc,34c,346 6    facingc                 f    t        j                  |j                  |j                        }d|z  | z
  S )uD   计算镜像朝向 —— 玩家朝向关于镜面方向的对称。r   )mathatan2r!   r    )r0   r   phis      r-   _mirror_facingr5   K   s)    
**V\\6<<
0Cs7Vr/   roomc           	         t         D cg c]  }t        |d   |d   |d          c}| _        i | _        g | _        g | _        g | _        g | _        | j                  j                         D ]]  }|j                  t        j                  k(  rt        \  |_        |_        nt         \  |_        |_        |j#                          d|_        _ t&        j(                  | _        y c c}w )Nr   r   r   r           )CAPTURE_POINTSr	   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   cpr   s      r-   init_game_staterJ   U   s    BPBPB4BsGr#w7.D DLDDDLD,,%%';;$(("!*FHfh!+FHfh ( $$DK#s   C"user_iddxdyc           	      J   | j                   j                  |      }|r|j                  sy t        j                         |j                  k  ry t        j                         |j
                  k  ry t        j                  ||z  ||z  z         }|dkD  r
||z  }||z  }t        t        t        t        |j                  ||j                  z  t        z  z               |_        t        t        t        t         |j"                  ||j                  z  t        z  z               |_        y )Ngư>)r@   getalivetimemove_lock_until
root_untilr2   sqrtr"   r#   r$   r%   r   speed_TICK_SCALEr&   r'   r   )r6   rK   rL   rM   r   mags         r-   update_player_positionrX   n   s    \\g&Fyy{V+++yy{V&&&
))BGb2g%
&C
Tz
c	
c	<\688b6<<>OR]>]3]!^_FH<\688b6<<>OR]>]3]!^_FHr/   anglec                 h    | j                   j                  |      }|r|j                  r||_        y y y )N)r@   rO   rP   r0   )r6   rK   rY   r   s       r-   update_player_facingr[      s-    \\g&F&,, vr/   	atk_valuedefense
multiplierc                 L    | |z  }|dd|z   z  z  }t        dt        |            S )Nd   r   )r"   int)r\   r]   r^   rawreduceds        r-   calculate_damagerd      s0    
j
 CSC'M*+Gq#g,r/   attackertargetdmgc                 T   |j                   sy t        d|j                  |z
        |_        | j                  j	                  t        |j                  ||j                  |j                               |j                  dk  r(d|_         d|_        t        j                         |_
        y y )Nr   	target_idamountr   r   F)rP   r"   hpr=   appendr
   rK   r   r   rQ   _death_time)r6   re   rf   rg   s       r-   apply_damagero      s    <<Avyy3'FI|..
((fhh   yyA~	!YY[ r/   oxoytxtyradius
half_anglec                 &   || z
  }||z
  }t        j                  ||z  ||z  z         }	|	|kD  s|	dk  ryt        j                  ||      }
|
|z
  t         j                  z   dt         j                  z  z  t         j                  z
  }t	        |      |k  S )N      ?Fr   )r2   rT   r3   piabs)rp   rq   r0   rr   rs   rt   ru   rL   rM   distangle_to_targetdiffs               r-   _in_fanr}      s    	bB	bB99R"WrBw&'Df}s
jjR(Of$tww.1tww;?$''IDt9
""r/   is_clonec                 z   | j                   j                  t        d||t        |d      t        |j                  d      t        |j
                  d      |j                  j                  |d             | j                  j                         D ]  }|j                  |j                  k(  s%|j                  |j                  k(  s|j                  sBt        ||||j                  |j                  |j                  |j
                        s|t        |j                   |j"                  d      }t%        | |||        y )N
fan_attack   r   )r0   rangerY   rB   clonetyper   r   datarw   )r>   rm   r   roundattack_rangeattack_anglerB   valuer@   rA   rK   rP   r}   r   r   rd   physical_attackphysical_defensero   )r6   re   rp   rq   r0   r~   rf   rg   s           r-   _do_fan_attackr      s    	LL
FA&800!4800!4MM''

 
 ,,%%'>>X---1MU[UaUa2r6688VXX(((*?*?A"((&*A*A3C x5 (r/   g      B@g     @@g     @g      D@g      >@g     r@gQ?ndxndymax_disthomingbonus_magicroot_durdmg_multsub_ballc           	      N   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                  j                  |       |S )u-   创建一个能量球弹丸并加入房间。r   N   owner_idrB   r   r   rL   rM   rU   damager   	proj_typeenergy_ballenergy_ball_sub
hit_radiusr   bonus_magic_dmgroot_durationdamage_mult )r   struuiduuid4rK   rB   ENERGY_BALL_SPEEDr   ENERGY_BALL_SUB_HIT_RENERGY_BALL_HIT_Rr<   rm   )r6   re   rp   rq   r   r   r   r   r   r   r   r   projs                r-   _make_energy_ballr      s      tzz|Ra !! ]] 	 	
 
    ''  (0-5F -5(:K  $  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        | ||||	|
||||
       |ryd|_        |r|dz  nd}|r|dz  nd}t        j                  |
|	      }t        d      D ]<  }|d|d	z   z  z   }| j                  j                  ||j                  |||||||d
	       > |rd|_        | j                  j                  t!        d|||j"                  j$                  |xs |xs |d             y)uI   从 (ox,oy) 向鼠标方向 (mx,my) 发射能量球，根据buff增强。rw   )rw   r8   rw   r8   gffffff?g      ?      ?   g?r   )	fire_atr   rp   rq   
main_angle
ball_ranger   	sub_bonussub_rootenergy_ball_firerB   enhancedr   N)r2   rT   rQ   
sw_f_until
sw_e_until
sw_r_untilENERGY_BALL_F_RANGEENERGY_BALL_RANGEmagical_attackr   r3   r   r?   rm   rK   r>   r   rB   r   )r6   re   rp   rq   r   r   rL   rM   rz   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99R"WrBw&'Dcz$B
t)C
t)C
))+C(%%%E(%%%E(%%%E ).$3DJFK--3sH dHb"c3 &+xA !&+8d?*/K$&S	ZZS)
qAcQUm+I%%$$,,(( &$	' 	  !LL
mm))151E3 r/   target_xtarget_yc                 &   | j                   j                  |      }|r|j                  sy|j                  dkD  ryt	        |j
                        }|r|j                  j                  nt        j                  }|j                  |_        t        j                         dz   |_        |t        j                  k(  rt        | ||j                  |j                  |j                   d       |j"                  rg|j"                  | j$                  v rO| j$                  |j"                     }t'        ||      \  }}	t)        |j                   |      }
t        | |||	|
d       y|t        j*                  k(  r$t-        | ||j                  |j                  ||       y)NFr   333333?r~   T)r@   rO   rP   attack_cd_remainingr   hero_idstatsattack_typer   FAN	attack_cdrQ   rR   r   r   r   r0   	mirror_idr;   r.   r5   TARGETEDr   )r6   rK   r   r   r   heror   r   r+   r,   cfs              r-   process_attackr   1  s6   \\g&F!!A%FNN#D,0$**((jnnK!'!1!1F!YY[3.Fjnn$tVVXXvxxQVW 0 0DLL @\\&"2"23F$VV4FBv6B4RdC
  

++	+dFFHHfhh(Sr/   keyc           
         | j                   j                  |      }|r|j                  syt        |j                        }|syd }|j
                  D ]  }	|	j                  |k(  s|	} n |sy|j                  dk(  rc|j                  r%|j                  | j                  v rt        | |       y|j                  j                  |d      }
|
dkD  ryt        | |||      }|S |j                  dk(  rt        | |      }|S |j                  dk(  rL|j                  j                  |d      }
|
dkD  ryt        | ||      }|r|j                  |j                  |<   |S |j                  dv r|j                  j                  |d      }
|
dkD  ryt!        j                          }d}|j                  d	k(  r||z   |_        n3|j                  d
k(  r||z   |_        n|j                  dk(  r
||z   |_        |j                  |j                  |<   | j(                  j+                  t-        d|j.                  |j0                  ||j2                  j4                  d             yy)NF
red_lady_fTr   
red_lady_e
red_lady_r)soul_weaver_fsoul_weaver_esoul_weaver_rr   r   r   r   sw_buff)skillrB   r   )r@   rO   rP   r   r   skillsr   r   r   r;   _destroy_mirror	skill_cds_skill_red_lady_f_skill_red_lady_e_skill_red_lady_rcooldownrQ   r   r   r   r>   rm   r   r   r   rB   r   )r6   rK   r   r   r   rY   r   r   	skill_defscdsuccessr   buff_durs                 r-   process_skillr   Q  s)    \\g&FFNN#DI[[55C<I  |||# 0 0DLL @D&)!!#q)6#D&(HE|||##D&1|||#!!#q)6#D&%8$-$6$6FS! ||JJ!!#q)6iik<<?* #hF\\_, #hF\\_, #hF ) 2 2Lhh&(((9(9:
 	
 r/   c                    |j                   r6|j                   | j                  v r| j                  |j                   = d |_         ||j                  z
  }||j                  z
  }t	        j
                  ||z  ||z  z         }|t        k  rd\  }}d}|t        kD  r2|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,                  j/                  t1        d||||j&                  j2                  t5        |	d      t5        |
d      d             y	)
N)rw   r8   rw   r   )	r   r   rB   r   r   r    r!   
created_atdurationmirror_placer   )r   rB   r    r!   r   T)r   r;   r   r   r2   rT   MIRROR_MIN_DISTMIRROR_MAX_RANGEr"   r#   r$   r%   r&   r'   r   r   r   r   rK   rB   rQ   MIRROR_DURATIONr>   rm   r   r   r   )r6   r   rr   rs   rL   rM   rz   r   r   mirror_dir_xmirror_dir_yr   s               r-   r   r     s   F,,<LL))*	fhhB	fhhB99R"WrBw&'DoBXXT	$444XXT	$444	\3|R0	1B	\3|R0	1B
t)C
t)C4LLDJJL!"1%I$[[
99; 	DLL !FLL
"KK%%<+<+	
	 	 r/   c                 .   | j                   j                  t        d||t        |j                  j
                  |d             | j                  j                         D ]  }|j                  |j                  k(  s%|j                  |j                  k(  s|j                  sB|j                  |z
  }|j                  |z
  }t        j                  ||z  ||z  z         t        k  st        |j                  |j                   d      }t#        | |||        y )Nspin)rt   rB   r   r   g333333?)r>   rm   r   SPIN_RADIUSrB   r   r@   rA   rK   rP   r   r   r2   rT   rd   r   r   ro   )	r6   re   rp   rq   r~   rf   tdxtdyrg   s	            r-   _do_spin_damager     s    LL
#X]]-@-@8T 
 ,,%%'>>X---1MU[UaUahhmhhm99S3Ys*+{:"((&*A*A3C x5 (r/   c                    |j                   r|j                   | j                  vry| j                  |j                      }|j                  ryd|_        t        j                         dz   |_        t        | ||j                  |j                  d       t        ||      \  }}t        | |||d       | j                  j                  |j                  |j                   t        j                         dz   d       y)NFT      ?r   )rK   r   swap_at)r   r;   used_erQ   rR   r   r   r   r.   pending_swapsrm   rK   )r6   r   r   clone_xclone_ys        r-   r   r     s    v//t||C\\&**+F}}FM!YY[3.FD&&((FHHuE&vv6GWD&'7TB>>%%99;$ 
 r/      g      N@)r   r   )rw   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                  j                  t        t        t        j                               dd |j                  |j                   ||
|z  z   |||z  z   |
|t"        t%        |j&                  |z        t(        |              y)uL   以 (ox,oy) 为起点、center_angle 为中心方向，生成 3 片碎镜。r   r   r8   Nr   )r   r   rB   r   r   rL   rM   rU   r   r   shard_index)SHARD_SPREAD	enumeratezipSHARD_OFFSETSSHARD_DMG_MULTr2   cossinSHARD_LEAD_DISTr<   rm   r   r   r   r   rK   rB   PROJECTILE_SPEEDra   r   PROJECTILE_RANGE)r6   r  rp   rq   r  halfidxsimultarL   rM   leads                r-   _spawn_shardsr    s     !D$S%GHZb$29$XXa[XXa["$'s
4::< !$]]29n29nb"u,,t34%!
 	 Ir/   c                 P   t        j                          dz   |_        t        | ||j                  |j                  |       |j
                  r[|j
                  | j                  v rC| j                  |j
                     }t        ||      \  }}t        ||      }t        | ||||       y)Nr   T)	rQ   rR   r  r   r   r   r;   r.   r5   )r6   r   rY   r   r+   r,   c_angles          r-   r   r     s    !YY[3.F$&((E:F,,<f../ 0B /dFBG4r/   c                 F   | j                   j                         D ]  }|j                  dkD  r"t        d|j                  t        z
        |_        |j
                  D ]B  }|j
                  |   dkD  st        d|j
                  |   t        z
        |j
                  |<   D  y )Nr   )r@   rA   r   r"   TICK_DTr   )r6   pr   s      r-   _tick_cooldownsr  "  s    \\  "  1$$'1+@+@7+J$KA!;;C{{3!##&q!++c*:W*D#EC   #r/   c                    t        j                          }g }| j                  D ]#  }||d   k  r|j                  |       | j                  j	                  |d         }|r|j
                  sKt        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                  j                  t        d|d   |d   |j                  j                   dd             & || _        y)u6   处理 R 弹幕延迟小球：到期的立即生成。r   r   r  r   rp   rq   r   r   r   r   r   T)r   r   r   r   r   N)rQ   r?   rm   r@   rO   rP   randomuniformr2   rx   r  r  r   r>   r   rB   r   )	r6   r   	remainingdbre   rand_offsetr  sdxsdys	            r-   _tick_delayed_ballsr'  +  s6   
))+CI  IR <<##BzN3x~~nndggX\477Q;?|{*hhqkhhqk(tHbh|xL{OzND		
 	L#h"T("----4@
 	/ !8 #Dr/   c                 
   g }| j                   D ]^  }|j                  r|j                  rt        }d }| j                  j                         D ]  }|j                  |j                  k(  s%|j                  |j                  k(  s|j                  sB|j                  |j                  z
  }|j                  |j                  z
  }t        j                  ||z  ||z  z         }||k  s|}|} |rt        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j0                  |j.                  z  c_        |j                  dk  s5|j                  t2        kD  s"|j                  dk  s|j                  t4        kD  r|j0                  |j6                  k\  rd}| j                  j                         D ]p  }|j                  |j                  k(  s%|j                  |j                  k(  s|j                  sC|j                  |j                  z
  }|j                  |j                  z
  }t        j                  ||z  ||z  z         |j8                  k  st;        t=        |j>                  |j@                  z        |jB                  d      }t%        d|jD                  |z
        |_"        | jF                  jI                  tK        |j                  ||j                  |j                               |jL                  dkD  rt;        t=        |jL                  |j@                  z        |jN                  d      }t%        d|jD                  |z
        |_"        | jF                  jI                  tK        |j                  ||j                  |j                  dz
               |jP                  dkD  r:t%        |jR                  tU        jT                         |jP                  z         |_)        |jD                  dk  r'd|_	        d|_"        tU        jT                         |_+        d|_        d} n |rN|jI                  |       a || _         y )Nr   r   Frw   ri   r   T),r<   hitr   HOMING_SEARCH_Rr@   rA   rK   r   rB   rP   r   r   r2   rT   r3   rM   rL   rx   r"   HOMING_TURN_RATEr$   r  r  rU   traveledr   r   r   r   rd   ra   r   r   r   rl   r=   rm   r
   r   magical_defenser   rS   rQ   rn   )r6   alive_projsr   	best_distbest_targettr   r   ddesiredcurrentr|   turn	new_angle
hit_targetrf   phys_dmgmag_dmgs                     r-   _tick_projectilesr:  N  s   K  88 ;;'IK\\((*99-4991DAGGccDFFlccDFFlIIcCi#)34y= !I"#K + **[]]TVV%;[]]TVV=ST**TWWdgg6')DGG3DGGDtwwN,,c2BD.IJ#dN	((9-((9-$''DJJ&&$''DJJ&&#66A:')TVVaZ466G;K==DMM)
ll))+F~~.&++2JRXR^R^((TVV#C((TVV#CyysS3Y./$//A+d&6&667++S2  699x#78	##**<$nnXhh&((, 
 ''!+.D0043C3CCD..5G !$Avyy7': ;FI''..|"(.. ((fhhm0 
 %%)(+))499;9K9K+K)MF% 99>#(FL !FI)-F&!
I ,L t$W !X #Dr/   c                 
   |j                   }|r|| j                  v r| j                  |= d |_         t        |j                        }|r<|j                  D ],  }|j
                  dk(  s|j                  |j                  d<    y  y y Nr   f)r   r;   r   r   r   r   r   r   )r6   r   midr   sks        r-   r   r     sv    


C
sdll"LLFFNN#D++Buu$(*  %  r/   c                    | j                   j                         D cg c]   \  }}|j                  s|j                  r|" }}}|D ]  }| j                  j                         D ]l  }|j                  |k(  sd |_        t        |j                        }|s2|j                  D ],  }|j                  dk(  s|j                  |j                  d<    l n | j                   |=  y c c}}w r<  )r;   itemsexpiredactiver@   rA   r   r   r   r   r   r   r   )r6   r>  mrB  r  r   r?  s          r-   _tick_mirrorsrE    s    !%!3!3!5S!5vsA!((s!5GS$$&A{{c!"		*"kk55L0/1{{AKK,! * ' LL  Ts
    C$C$c                    t        j                          }g }| j                  D ]3  }||d   k\  r| j                  j                  |d         }|r|j                  s:||j
                  k  rJ|d   }|| j                  vr^| j                  |   }t        ||      \  }}|j                  |j                  }
}	||c|_        |_	        | j                  j                  t        d|j                  |j                  t        |	d      t        |
d      t        |d      t        |d      |j                  j                  d             #|j                  |       6 || _        y )Nr   rK   r   mirror_swapr   )from_xfrom_yto_xto_yrB   r   )rQ   r   r@   rO   rP   rS   r;   r.   r   r   r>   rm   r   r   rB   r   )r6   r   r"  swapr   r>  r   r   r   old_xold_ys              r-   _tick_pending_swapsrO    s5   
))+CI""$y/!\\%%d9o6FV&&&{#C$,,&\\#&F.vv>GW!88VXX5E!('FHfhLL"((fhh %eQ5?#GQ/w9J$kk//1!  T"/ #0 #Dr/   c                    t        j                          }| j                  j                         D ]  }|j                  rt	        |d      s||j
                  z
  t        k\  s4d|_        |j                  |_        d|_	        |j                  D ]  }d|j                  |<    |j                  t        j                  k(  rt        \  |_        |_        nt"        \  |_        |_        |` y )Nrn   Tr   )rQ   r@   rA   rP   hasattrrn   RESPAWN_TIMEmax_hprl   r   r   rB   r   rC   rD   r   r   rE   )r6   r   r  r   s       r-   _tick_respawnrT    s    
))+C\\  "ww71m4Q]]"l2xx()%;;C'(AKK$ '66TXX%(HAC)HACM #r/   c                    | j                   D ]   }d}d}| j                  j                         D ]  }|j                  s|j                  |j                  z
  dz  |j
                  |j
                  z
  dz  z   dz  }||j                  k  s\|j                  t        j                  k(  r|dz  }|dz  } ||kD  r5t        t         |j                  t        t        z  ||z
  z  z
        |_        n8||kD  r3t        t        |j                  t        t        z  ||z
  z  z         |_        |j                  t         k  rt        j                  |_        E|j                  t        k\  rt        j"                  |_        ot%        |j                        t        dz  k  s|j                   |j                   t        j                  k(  r|j                  dkD  s0|j                   t        j"                  k(  s|j                  dk  sd |_         t'        d | j                   D              }t'        d | j                   D              }|dk(  rt        j                  S |dk(  rt        j"                  S y )Nr   r   r   r   c              3   \   K   | ]$  }|j                   t        j                  k(  s!d  & ywr   N)r  r   rC   .0rI   s     r-   	<genexpr>z(update_capture_points.<locals>.<genexpr>  s"     L 3"rxx4887KA 3   ",,c              3   \   K   | ]$  }|j                   t        j                  k(  s!d  & ywrW  )r  r   BLUErX  s     r-   rZ  z(update_capture_points.<locals>.<genexpr>  s"     N!42DII8MQ!4r[  r   )r:   r@   rA   rP   r   r   rt   rB   r   rC   r"   CAPTURE_THRESHOLDprogressCAPTURE_SPEEDrV   r$   r  r]  ry   sum)r6   rI   red_inblue_inr  rz   	red_owned
blue_owneds           r-   update_capture_pointsrf    s   !!$$&A77SS244ZA%rtt(99cADryy 66TXX%aKFqLG ' G00"++P[@[_eho_o@p2pqBKv/}{?Z^ehn^n?o1opBK;;,,,xxBH[[--yyBH 1C 77xx#TXX%"++/HH		)bkkAo7 ": L 3 3LLIN!4!4NNJA~xxQyyr/   c                    g }| j                   j                         D ]  }|j                  s|j                  | j                  v s)|j                  s6| j                  |j                     }t        ||      \  }}t        |j                  |      }|j                  |j                  |j                  j                  t        |d      t        |d      t        |d      |j                  d        d| j                   j                         D cg c]  }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|j(                  j+                         D ci c]  \  }}|t        |d       c}}dt-        j,                         |j.                  k  dt1        |j                  xr |j                  | j                  v       d|j                  r|j                  | j                  v rpt        t3        d| j                  |j                     j4                  t-        j,                         | j                  |j                     j6                  z
  z
        d      ndd|j                  r;|j                  | j                  v r#| j                  |j                     j8                  nddt        t3        d|j:                  t-        j,                         z
        d      t        t3        d|j<                  t-        j,                         z
        d      t        t3        d|j>                  t-        j,                         z
        d      ddt-        j,                         |j@                  k  i c}}}| jB                  D 	cg c]r  }	|	jD                  t        |	j                  d      t        |	j                   d      |	jF                  r|	jF                  j                  nd t        |	jH                  d      dt c}	| j                  j                         D 
cg c]  }
|
jD                  |
jJ                  |
j                  j                  t        |
j                  d      t        |
j                   d      t        |
jL                  d      t        |
jN                  d      d c}
|| jP                  D cg c]  }|jD                  |jJ                  |j                  j                  t        |j                  d      t        |j                   d      t        |jR                  d      t        |jT                  d      t        |jV                  d      |jX                  |jZ                  d
 c}d}| j\                  re| j\                  D cg c]E  }|j^                  |j`                  t        |j                  d      t        |j                   d      d G c}|d!<   g | _.        | jb                  re| jb                  D cg c]E  }|jd                  t        |j                  d      t        |j                   d      |jf                  d"G c}|d#<   g | _1        |S c c}}w c c}}}w c c}	w c c}
w c c}w c c}w c c}w )$Nr   r   )r   rB   r   r   r0   r   
game_staterK   nicknamerB   r   r   rP   rl   rS  r   r0   r   r   r   move_locked
has_mirrormirror_remainingr   mirror_used_eTbuffs)sw_fsw_esw_rrooted)r   r   r   r  r_  r   )r   r   rB   r   r   r    r!   )
r   r   rB   r   r   rL   rM   rU   shardptype)r   r@   r:   r;   clonesr<   ri   r=   r   r>   )4r@   rA   r   r;   rP   r.   r5   r0   rm   rK   rB   r   r   r   ri  r   r   rl   rS  r   r   rA  rQ   rR   boolr"   r   r   r   r   r   r   rS   r:   r   r  r_  r   r    r!   r<   rL   rM   rU   r  r   r=   rj   rk   r>   r   r   )r6   ru  r  r   r+   r,   r   kvrI   rD  stater2  es                 r-   get_game_stater{    s   F\\  ";;1;;$,,6177\\!++.F$Q/FB&1BMMII2q\2q\A,99  # F \\((*E#
D +C 199 AJJ    U133]	 
 U133]    add  !((  199  %!,  U1#8#8!<  9J9J9LM9LAaq!n9LM  tyy{Q->->>  d1;;#N1;;$,,3NO  # {{q{{dll'B #aakk!:!C!C!YY[4<<+D+O+OO"Q RSTV ' *  {{q{{dll'B LL-441 4 !#a		)C"DaH!#a		)C"DaH!#a		)C"DaH5 > $))+4? B +E#
X ))	
 * ee244^244^+-88!"++q1 *	
  \\((*
 +	 dd

AFFLL133]qssAqww*U177A5F
 +
  %%

 & dd

AFFLL133]qssAADD!nE!$$Nqww* &

sDEL  ((#
 ) ++Q-eACCm5(#

 !|| \\
! VV%Q-eACCmQVVT!
i LM N#
H	



#

s=   C&[/
6[)G>[/
A7[62B	[;
B4\ A
\A
\
)[/
messagec                 ^  K   t        j                  |d      }g }| j                  j                         D ]6  \  }}|j                  s	 |j                  j                  |       d {    8 |D ]  }d | j                  |   _         y 7 "# t        $ r |j                  |       Y sw xY ww)NF)ensure_ascii)jsondumpsr@   rA  ws	send_text	Exceptionrm   )r6   r|  r   disconnecteduidr   s         r-   	broadcastr    s     ::gE2DL||))+V99)ii))$/// , #S  0 )##C()s<   AB-
B(B)B-B-BB*'B-)B**B-c                   K   t         j                  d| j                          	 | j                  t        j
                  k(  rt        |        t        |        t        |        t        |        t        |        t        |        t        |       }t        |       }t        | |       d {    |r7t        j                  | _        t        | d|j                   d       d {    n?t#        j$                  t&               d {    | j                  t        j
                  k(  rt        j                  | _        y 7 7 \7 <# t"        j(                  $ r% t         j                  d| j                          Y St*        $ r$}t         j-                  d| d       Y d }~zd }~ww xY w# t        j                  | _        w xY w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_idrH   r   rG   r  r'  r:  rE  rO  rT  rf  r{  r  FINISHEDr   asynciosleep	TICK_RATECancelledErrorr  error)r6   r  ry  rz  s       r-   	game_loopr    sh    
KK-dll^<=*kkZ///D!%d#$%$*40F"4(ED%((((11'$ll'    --	***) kkZ///4 !))! ) +!! D3DLL>BC =(,t<<= !))s}   #GBE *D=+7E "D?#!E E!E 'G=E ?E E 5F&8F) :F&F!F) !F&&F) )G  G)rw   )F)Fr8   r8   rw   F)r   r   )r   r   r   )`__doc__r  r  loggingr2   r   rQ   r   typingr   app.game.heroesr   r   r   app.game.room_managerr   r   r	   r
   r   r   r   r   r   r   r   	getLogger__name__r  rD   rE   r9   r`  r^  r  r  rV   rR  r#   r%   r&   r'   r   r  r  PROJECTILE_HIT_Rr   r   r   tuplefloatr.   r5   rJ   r   rX   r[   ra   rd   ro   rv  r}   r   r   r   r   r   r   r*  r+  r   r   r   r   r   r   r   rx   r  r  r  r  r  r   r  r'  r:  r   rE  rO  rT  rf  dictr{  r  r  r   r/   r-   <module>r     s'           < <    
		8	$ 	
 3c"4d#4d#  	
l  K'    6F 6F 6uUE\7J 65 & U %$ %2` ` ` `E `$t c %    c  u  s  )t )v )v )C )	# 	#5 	#% 	#	# 	#*/	#=B	#GK	#$ %*6 6 66"'6166!6< K'     K'  &++.(+(+',D F %* ', !& #	
 $) !& !& !% 2<<; ; ;#;).;#;).;~ ;<  "27@DB :;!"? ?s ? ?!?16??'+?F0D 0& 00%*0/30j &+6$ 6& 6e 6 6"6&D & T . ''A+! V !&6;0D &  4 $F$ F #d  #FN#D N#b
$ 
 
 #d #<" "*$ $$ $Ve e$ eX
$$ 
$ 
$*$ *r/   