
    Ći5                     x    d dl 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mZ d dlmZ d dlZd dlZ G d d      Zy)    )Any)SCREEN_WIDTHSCREEN_HEIGHTZOMBIE_WZOMBIE_HCELL_WCELL_HROWSCOLSFIRE_DAMAGE_MULTIPLIERCORN_FIRE_DAMAGECORN_FIRE_SPLASH_RADIUSCORN_FIRE_SPLASH_DAMAGE)BulletNc                   |    e Zd ZdZd ZdeddfdZdededdfdZdede	fd	Z
deddfd
Zd ZddZd ZddZd Zy)BulletManageru3   子弹管理器 - 处理子弹移动和碰撞检测c                     || _         y N)em)selfentity_managers     X/mnt/c/Users/DipsyHou/Desktop/workspace/PVZOnline/backend/game/managers/BulletManager.py__init__zBulletManager.__init__   s	         dtreturnNc                    | j                   j                  dd D ]  }| j                  ||       | j                  |      rd|_        /t        |d      r|j                  rt        |d      rB|xj                  |z  c_        |j                  |j                  k\  rt        |dd      sd|_
        t        |d      rE|xj                  |z  c_        |j                  dk\  r!|j                  j                          d	|_        t        |d
      rc|j                  d	kD  rT|j                  |j                   z
  dz  |j"                  |j$                  z
  dz  z   dz  }||j                  k\  r	d|_        U|j&                  dk(  r| j)                  |       w|j*                  r| j-                  |       | j/                  |        | j                   j                  D cg c]  }|j                  s| c}| j                   _        yc c}w )uX   
        更新所有子弹
        
        Args:
            dt: 时间增量
        NFis_sword	life_timeis_returningThit_set_clear_timerg      ?r   max_distance         ?grape_spawner)r   bulletsupdate_bullet_positionis_out_of_boundsactivehasattrr   r   max_life_timegetattrr    r!   hit_setclearr"   xstart_xystart_ykindhandle_grape_spawner	is_lobbedhandle_lobbed_collisionhandle_straight_collision)r   r   bdists       r   updatezBulletManager.update   s    #A''2.$$Q'  q*%!**1k*KK2%K{{aoo5gaY^>_)- 134))R/),,3		)01-q.)annq.@qyy1,aii!/CCcI1>>)$AHvv())!,{{,,Q/..q1G $L '+ggooBo1oBBs   H.Hr8   c                    xj                   |z  c_         t        d      rj                  rt        d      rt        fd| j                  j
                  D        d      }|sd_        yt        dd      }|r|j                  |j                  dz  z   }|j                  |j                  dz  z   }|j                  z
  }|j                  z
  }t        j                  ||z  ||z  z         }	|	dk  rd_        yt        j                  j                  dz  j                  dz  z         }
d	|z  }t        j                   j                  j                        }t        j                   ||      }||z
  }|t        j"                   k  r+|t        j"                  dz  z  }|t        j"                   k  r+|t        j"                  kD  r*|t        j"                  dz  z  }|t        j"                  kD  r*|t%        | t'        ||            z   }t        j(                  |      |
z  _        t        j*                  |      |
z  _        nt        |d
      r|j,                  |j,                  }|j.                  }|j                  z
  }|j                  z
  }t        j                  ||z  ||z  z         }	|	dkD  rpt        j                  j                  dz  j                  dz  z         }
d|z  }t        j                   j                  j                        }t        j                   ||      }||z
  }|t        j"                   k  r+|t        j"                  dz  z  }|t        j"                   k  r+|t        j"                  kD  r*|t        j"                  dz  z  }|t        j"                  kD  r*|t%        | t'        ||            z   }t        j(                  |      |
z  _        t        j*                  |      |
z  _        n"j0                  rj2                  rj2                  j4                  dkD  rj2                  j                  j2                  j                  dz  z   }j2                  j                  j2                  j                  dz  z   }|j                  z
  }|j                  z
  }t        j                  ||z  ||z  z         }	|	dkD  rLt        j                  j                  dz  j                  dz  z         }
d|z  }t        j                   j                  j                        }t        j                   ||      }||z
  }|t        j"                   k  r+|t        j"                  dz  z  }|t        j"                   k  r+|t        j"                  kD  r*|t        j"                  dz  z  }|t        j"                  kD  r*|t%        | t'        ||            z   }t        j(                  |      |
z  _        t        j*                  |      |
z  _        j6                  ryt'        j                   j8                        }j:                  j                  |z  z   _        j<                  j                  |z  z   dj>                  z  |z  |z  z   _
        yxj                  j                  |z  z  c_        xj                  j                  |z  z  c_
        y)ut   
        更新子弹位置
        
        Args:
            b: 子弹对象
            dt: 时间增量
        r   plant_idc              3   V   K   | ]   }|j                   j                  k(  s| " y wr   )idr<   ).0pr8   s     r   	<genexpr>z7BulletManager.update_bullet_position.<locals>.<genexpr>M   s!     J^qttqzz7I!^   ))NFr    r#         target_x
      r      r$   ) elapsedr*   r   nextr   plantsr)   r,   r/   wr1   hmathsqrtvxvyatan2pimaxmincossinrE   target_yhomingtargethpr5   
total_timer0   r2   gravity)r   r8   r   plantr    txtydxdyr9   speed	turn_ratecurrent_angletarget_anglediff	new_anglets    `               r   r'   z$BulletManager.update_bullet_position@   s;    	
		R	 1j!ajjWQ
5KJTWW^^JDQE   #1ne<LWWuww{*WWuww{*!##X!##XyyBB/ "9$AH 		!$$'ADD!G"34F	 $

144 6#zz"b1#m3dggXottww{':tddggXoTWWnddggk&9ddTWWn)C
C	4<P,QQ	xx	*U2xx	*U2 5*-%..2LBBaccBaccB99RURU]3Dby $		!$$'ADD!G*; <$%F	(,

144(>'+zz"b'9+m;"dggXottww{/BtddggXo"TWWnddggk.AddTWWn$1C
C	SWDX4Y$Y	#xx	2U:#xx	2U:XX!((qxx{{Qahhjj1n,Bahhjj1n,BaccBaccB99RURU]+Dax		!$$'ADD!G"34F	 $

144 6#zz"b1#m3dggXottww{':tddggXoTWWnddggk&9ddTWWn)C
C	4<P,QQ	xx	*U2xx	*U2 ;;AIIq||,A))addQh&AC))addQh&qyy1)<q)@@AC CC144"9CCC144"9Cr   c                     |j                   t        kD  xs5 |j                   dk  xs$ |j                  t        kD  xs |j                  dk  S )u   检查子弹是否超出边界ii)r/   r   r1   r   )r   r8   s     r   r(   zBulletManager.is_out_of_bounds   s:    ss\!UQSS4ZU1333FU!##PU+Ur   c                    |j                   r|j                  st        |j                  t        z        }t        |j
                  t        z        }d|cxk  r	t        k  rn nd|cxk  r	t        k  rn n| j                  j                  D ]  }|j                  |k(  s|j                  |k(  s#|j                  dk(  s3d|_        |j                  dk(  r"t        |_        t"        |_        t&        |_        n|xj                   t*        z  c_         n | j                  j,                  D ][  }|j.                  s|j                  |j0                  z   |j                  kD  s8|j                  |j                  t2        z   k  sY|j
                  |j4                  z   |j
                  kD  s|j
                  |j
                  t6        z   k  s|j8                  |j:                  v rt=        |d      r|j>                  |j8                  k(  r|j                   }|j                  dk(  rg|j@                  dkD  rX|j                  dv rJd}| j                  jC                  d	|j                  t2        d
z  z   |j
                  t6        d
z  z   dd       |jE                  |       |j:                  jG                  |j8                         |j$                  dkD  rG| jI                  ||j                  t2        d
z  z   |j
                  t6        d
z  z   |j8                         | jK                  ||       | jM                  |       t=        |d      xr |jN                  }|r/|jP                  dk  r	d|_         y|xjP                  dz  c_(        ^ y)u   处理直线子弹碰撞r   	torchwoodTcornignore_zombie_id
acid_juice)
bucketheadfootballfootball_forwardK   particler#   acid_corrosiontyper/   r1   r3   	ignore_idr   F   N))is_passable_through_fireis_fireintr/   r   r1   r	   r
   r   r   rK   colrowrw   r3   r   damager   splash_radiusr   splash_damager   zombiesr)   rL   r   rM   r   r>   r-   r*   rn   armor	add_eventtake_damageaddapply_splashapply_status_effectshandle_special_on_hitr   pierce)r   r8   crr@   zr   r   s           r   r7   z'BulletManager.handle_straight_collision   s    %%aiiACC&L!AACC&L!AA}}a$AuuzaeeqjQVV{5J$(	66V+'7AH.EAO.EAOHH(>>H ( AxxACC!##IOaccHn0DqssUVUXUX]^]`]`cdcfcfiqcq]q44199$h101a6H6HADD6PRZ66\)ww{qvv1_'_!#))$.!"xz!1!"xz!1$4	+  f%		add# ??Q&%%axz)9133!;KWXW[W[%\ ))!Q/**1- #1j1@ajjxx1}#(AG !r   c                    j                   rZj                  j                   k\  r?d_        d }t        d      rj                  rt        fd| j                  j                  D        d       }|r\|j                  j                         |j                  }j                  dkD  r&|j                  j                  j                         || j                  j                  D ]  }j                  j                  z   |j                  kD  s*j                  |j                  t         z   k  sKj"                  j$                  z   |j"                  kD  srj"                  |j"                  t&        z   k  s|j                  j                         |j                  }j                  dkD  r&|j                  j                  j                          n j(                  dkD  rj| j+                  j                  j"                  |       | j                  j-                  dj                  j"                  j.                  dz   d       | j1                  |       y y y )	NF	target_idc              3   V   K   | ]   }|j                   j                  k(  s| " y wr   )r>   r   )r?   r   r8   s     r   rA   z8BulletManager.handle_lobbed_collision.<locals>.<genexpr>   s!      SOqqttq{{?ROrB   r   rx   rt   _splashrv   )r\   rI   r)   r*   r   rJ   r   r   r   r   r>   slow_duration
apply_slowslow_factorr/   rL   r   r1   rM   r   r   r   r   r3   r   )r   r8   hit_zombie_idtarget_zr   s    `   r   r6   z%BulletManager.handle_lobbed_collision   s   <<AII5AH M q+&1;; SDGGOO SUYZ((2$,KKM*H,?,?QRQ^Q^,_ $''//QssQSSy133133x+?ACC!##IPQPSPSOXYX[X[^_^a^adl^lXlahh/()??Q.Q__amm0\ * "!!!QSS!##!G!!&FFY.	#  &&q-8A 6<r   c                    | j                   j                  D ]  }|j                  |k(  r|j                  t        dz  z   |z
  }|j
                  t        dz  z   |z
  }|dz  |dz  z   dz  }||j                  k  sc|j                  |j                         |j                  dkD  s|j                  |j                  |j                          y )Nr#   r$   r   )r   r   r>   r/   r   r1   r   r   r   r   r   r   r   )	r   r8   r/   r1   ry   r   ra   rb   r9   s	            r   r   zBulletManager.apply_splash  s    Atty (##
"a'B##
"a'BEBEMC'Dq&aoo.??Q&Q__amm(T !r   c                 .   |j                   dkD  r|j                  |j                          |j                  dkD  r&|j                  |j                  |j                         |j
                  dkD  r'|j                  |j
                  |j                         y y )Nr   )stun
apply_stunr   r   r   knockback_distapply_knockbackknockback_duration)r   r8   r   s      r   r   z"BulletManager.apply_status_effects  si    66A:q||AFF+??QQ__amm La!2!213C3CQEYEY!Zr   c           	      :   |j                   dk(  r|j                  dkD  rd}d}t        |j                  |j                  |j
                  || dd      }|j                  dz   |_        |j                  dz
  |_        |j                  |_        |j                  r|xj                  dz  c_        |j                  j                         |_	        | j                  j                  j                  |       t        |j                  |j                  |j
                  ||dd      }|j                  dz   |_        |j                  dz
  |_        |j                  |_        |j                  r|xj                  dz  c_        |j                  j                         |_	        | j                  j                  j                  |       d|_        y |j                   d	k(  rg d
}t        j                   |       g d
}|j#                  t%        d      D 	cg c]  }	t        j&                  |       c}	       t        |j                  dz
  |j                  |j
                  dddd      }
||
_        |||
_        | j                  j                  j                  |
       y y c c}	w )Nbranchr     d      rz   r#   Fgrape))r   )r   rz   )r   r   )rz   r   rF   r%   )r3   heightr   r/   r1   r   branch_levelr|   r   r-   copyr   r&   appendr)   randomshuffleextendrangechoice
directionsrn   )r   r8   r   rc   rQ   b1b2r   all_dirs_spawners              r   r   z#BulletManager.handle_special_on_hit  s   66Xxx!|ACCaeeURCXF"#..1"4HHqL	YY
::ryyA~yYY^^-
&&r*ACCaeeUBHE"#..1"4HHqL	YY
::ryyA~yYY^^-
&&r*AHVVw;JNN:& :HaI1v}}X6IJ QSS2XqssAEE1aOLG!+G(+8(GGOO""7+  Js   Jc           	         g d}|j                   t        |      k  r/|j                  ||j                      k\  r|j                  r|j                   t        |j                        k  r|j                  |j                      \  }}d}||z  }||z  }t	        |j
                  |j                  |j                  ||dd      }|j                  |j                  |_        | j                  j                  j                  |       |xj                   dz  c_         |j                   t        |      k  r|j                  ||j                      k\  r|j                   t        |      k\  rd|_        y y )N)r   r   r   r   g?g?r   r   grape_smallrz   F)burst_indexlenrI   r   r   r/   r1   r   rn   r   r&   r   r)   )	r   r8   burst_timesra   rb   rc   rP   rQ   sbs	            r   r4   z"BulletManager.handle_grape_spawner>  s   ,mmc+..199AMM@Z3Z||ALL0A Aamm4B%Z%ZACCaeeRRG%%1*+*<*<B'&&r*MMQM mmc+..199AMM@Z3Z ==C,,AH -r   r   )__name__
__module____qualname____doc__r   floatr:   r   r'   boolr(   r7   r6   r   r   r   r4    r   r   r   r   
   s    =!.C .C4 .C`g g g4 gRV# V$ V6&3 6&4 6&p!9FU[
%,Nr   r   )typingr   game.configr   r   r   r   r   r	   r
   r   r   r   r   r   game.objects.bulletr   r   rN   r   r   r   r   <module>r      s3        '  F Fr   