
    vai5                         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dS )    )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dS )BulletManageru3   子弹管理器 - 处理子弹移动和碰撞检测c                     || _         d S N)em)selfentity_managers     @/root/workspace/PVZOnline/backend/game/managers/BulletManager.py__init__zBulletManager.__init__   s         dtreturnNc                    | j         j        dd         D ]}|                     ||           |                     |          rd|_        6t          |d          r|j        rt          |d          r8|xj        |z  c_        |j        |j        k    rt          |dd          sd|_
        t          |d          r;|xj        |z  c_        |j        dk    r |j                                         d	|_        t          |d
          rG|j        d	k    r<|j        |j        z
  dz  |j        |j        z
  dz  z   dz  }||j        k    r	d|_        7|j        dk    r|                     |           Y|j        r|                     |           w|                     |           d | j         j        D             | j         _        dS )uX   
        更新所有子弹
        
        Args:
            dt: 时间增量
        NFis_sword	life_timeis_returningThit_set_clear_timerg      ?r   max_distance         ?grape_spawnerc                      g | ]}|j         	|S  )active).0bs     r   
<listcomp>z(BulletManager.update.<locals>.<listcomp>>   s    BBBB1BBBr   )r   bulletsupdate_bullet_positionis_out_of_boundsr(   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   r*   dists       r   updatezBulletManager.update   s    # #	2 #	2A''2...$$Q''   q*%% 2!* 21k** .KK2%KK{ao55gaY^>_>_5)- 1344 2))R/)),33	)))01-q.)) anq.@.@qy1,ai!/CCcI1>))$AHv(())!,,,{ 2,,Q////..q1111 CBdgoBBBr   r*   c                    xj         |z  c_         t          d          roj        rgt          d          rVt          fd| j        j        D             d          }|s	d_        dS 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_        dS 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     #|t          j        k    r"|t          j        dz  z  }|t          j        k    "|t%          | t'          ||                    z   }t          j        |          |
z  _        t          j        |          |
z  _        n<t          |d
          rs|j        k|j        }|j        }|j        z
  }|j
        z
  }t          j        ||z  ||z  z             }	|	dk    r%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     #|t          j        k    r"|t          j        dz  z  }|t          j        k    "|t%          | t'          ||                    z   }t          j        |          |
z  _        t          j        |          |
z  _        nj        rj        rj        j        dk    rj        j        j        j	        dz  z   }j        j
        j        j        dz  z   }|j        z
  }|j
        z
  }t          j        ||z  ||z  z             }	|	dk    r%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     #|t          j        k    r"|t          j        dz  z  }|t          j        k    "|t%          | t'          ||                    z   }t          j        |          |
z  _        t          j        |          |
z  _        j        r[t'          j         j                  }j        j        |z  z   _        j        j        |z  z   dj        z  |z  |z  z   _
        dS xj        j        |z  z  c_        xj
        j        |z  z  c_
        dS )ut   
        更新子弹位置
        
        Args:
            b: 子弹对象
            dt: 时间增量
        r   plant_idc              3   <   K   | ]}|j         j        k    |V  d S r   )idr@   )r)   pr*   s     r   	<genexpr>z7BulletManager.update_bullet_position.<locals>.<genexpr>M   s1      JJqtqz7I7I!7I7I7I7IJJr   NFr    r#         target_x
      r      r$   ) elapsedr/   r   nextr   plantsr(   r1   r4   wr6   hmathsqrtvxvyatan2pimaxmincossinrG   target_yhomingtargethpr:   
total_timer5   r7   gravity)r   r*   r   plantr    txtydxdyr=   speed	turn_ratecurrent_angletarget_anglediff	new_anglets    `               r   r-   z$BulletManager.update_bullet_position@   s]    	
		R		 1j!! Q	3aj Q	3WQ
5K5K Q	3JJJJTW^JJJDQQE    #1ne<<L 0;Wuw{*Wuw{*!#X!#XyBB// "99$AHF 	!$'AD!G"344F	 $
14 6 6#z"b11#m3dgXoottw{':tddgXooTWnnddgk&9ddTWnn)C
C	4<P<P,Q,QQ	x	**U2x	**U2 5*-- ;%.2LBBacBacB9RURU]33Dbyy $	!$'AD!G*; < <$%F	(,
14(>(>'+z"b'9'9+m;"dgXoottw{/BtddgXoo"TWnnddgk.AddTWnn$1C
C	SWDXDX4Y4Y$Y	#x	22U:#x	22U:X 	3!( 	3qx{Qahj1n,Bahj1n,BacBacB9RURU]++Daxx	!$'AD!G"344F	 $
14 6 6#z"b11#m3dgXoottw{':tddgXooTWnnddgk&9ddTWnn)C
C	4<P<P,Q,QQ	x	**U2x	**U2 ; 	AIq|,,A)adQh&AC)adQh&qy1)<q)@@ACCC CC14"9CCCC14"9CCCCr   c                 n    |j         t          k    p%|j         dk     p|j        t          k    p
|j        dk     S )u   检查子弹是否超出边界ii)r4   r   r6   r   )r   r*   s     r   r.   zBulletManager.is_out_of_bounds   s2    s\!UQS4ZU13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 ]q}|j        |k    rd|j        |k    rY|j        dk    rNd|_        |j        dk    r%t          |_        t"          |_        t&          |_        n|xj        t*          z  c_         nr| j	        j        D ]}|j        r|j        |j        z   |j        k    r|j        |j        t2          z   k     r|j        |j        z   |j        k    r|j        |j        t6          z   k     r}|j        |j        v r~t=          |d          r|j        |j        k    r|j        }|j        dk    rU|j         dk    rJ|j        dv rAd}| j	        !                    d	|j        t2          d
z  z   |j        t6          d
z  z   dd           |"                    |           |j        #                    |j                   |j        dk    r>| $                    ||j        t2          d
z  z   |j        t6          d
z  z   |j                   | %                    ||           | &                    |           t=          |d          o|j'        }|s%|j(        dk    r
d|_         dS |xj(        dz  c_(        dS )u   处理直线子弹碰撞r   	torchwoodTcornignore_zombie_id
acid_juice)
bucketheadfootballfootball_forwardK   particler#   acid_corrosiontyper4   r6   r8   	ignore_idr   F   N))is_passable_through_fireis_fireintr4   r   r6   r	   r
   r   r   rM   colrowry   r8   r   damager   splash_radiusr   splash_damager   zombiesr(   rN   r   rO   r   rB   r2   r/   rp   armor	add_eventtake_damageaddapply_splashapply_status_effectshandle_special_on_hitr   pierce)r   r*   crrC   zr   r   s           r   r<   z'BulletManager.handle_straight_collision   s    % 	ai 	AC&L!!AAC&L!!AA}}}}}}}}}a$ 	 	AuzzaeqjjQV{5J5J$(	6V++'7AH.EAO.EAOOHH(>>HH  #	& #	&Ax "&AC!#IOOacHn0D0DqsUVUX]^]`cdcfiqcq]q]q419$$h1011Za6HAD6P6PRZ6\))w{{qv1_'_'_!#))$.!"xz!1!"xz!1$4	+ +    f%%%	ad### ?Q&&%%axz)913!;KWXW[%\\\ ))!Q///**1--- #1j11@aj &x1}}#(AG#	& #	&r   c                    j         rۉj        j         k    rd_        d }t          d          r{j        rtt          fd| j        j        D             d           }|rL|                    j	                   |j
        }j        dk    r |                    j        j                   || j        j        D ]}j        j        z   |j        k    rj        |j        t           z   k     r~j        j        z   |j        k    rfj        |j        t&          z   k     rN|                    j	                   |j
        }j        dk    r |                    j        j                    nj        dk    rT|                     j        j        |           | j                            dj        j        j        dz   d           |                     |           d S d S d S )	NF	target_idc              3   <   K   | ]}|j         j        k    |V  d S r   )rB   r   )r)   r   r*   s     r   rD   z8BulletManager.handle_lobbed_collision.<locals>.<genexpr>   s1       S Sqqtq{?R?R?R?R?R?R S Sr   r   rz   rv   _splashrx   )r^   rK   r(   r/   r   rL   r   r   r   r   rB   slow_duration
apply_slowslow_factorr4   rN   r   r6   rO   r   r   r   r   r8   r   )r   r*   hit_zombie_idtarget_zr   s    `   r   r;   z%BulletManager.handle_lobbed_collision   s   <  	9AI55AH M q+&& `1; ` S S S SDGO S S SUYZZ `((222$,KM**H,?,?QRQ^,_,_,_ $'/  QsQSy1313x+?+?AC!#IPQPSOOXYX[^_^adl^lXlXlah///()?Q..Q_am0\0\0\ ""!!!QS!#!GGG!!&FY.	# #    &&q-88888A 	9  	955r   c                 L   | 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    rE|                    |j	                   |j
        dk    r |                    |j
        |j                   d S )Nr#   r$   r   )r   r   rB   r4   r   r6   r   r   r   r   r   r   r   )	r   r*   r4   r6   r{   r   rc   rd   r=   s	            r   r   zBulletManager.apply_splash  s     	U 	UAty  (#
"a'B#
"a'BEBEMC'Dq&&ao...?Q&&Q_am(T(T(T	U 	Ur   c                     |j         dk    r|                    |j                    |j        dk    r |                    |j        |j                   |j        dk    r"|                    |j        |j                   d S d S )Nr   )stun
apply_stunr   r   r   knockback_distapply_knockbackknockback_duration)r   r*   r   s      r   r   z"BulletManager.apply_status_effects  sy    6A::q||AF+++?QQ_am L L La!2!213CQEY!Z!Z!Z!Z!Zr   c           	      6  	 |j         dk    r^|j        dk    rId}d}t          |j        |j        |j        || dd          }|j        dz   |_        |j        dz
  |_        |j        |_        |j        r|xj        dz  c_        |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                            |           d|_        d S |j         d	k    rg d
}t          j        |           g d
	|                    	fdt%          d          D                        t          |j        dz
  |j        |j        dddd          }||_        |||_        | j        j                            |           d S d S )Nbranchr     d      r|   r#   Fgrape))r   )r   r|   )r   r   )r|   r   c                 8    g | ]}t          j                  S r'   )randomchoice)r)   _all_dirss     r   r+   z7BulletManager.handle_special_on_hit.<locals>.<listcomp>5  s#    III1v}X66IIIr   rH   r%   )r8   heightr   r4   r6   r   branch_levelr~   r   r2   copyr   r,   appendr(   r   shuffleextendrange
directionsrp   )
r   r*   r   re   rS   b1b2r   spawnerr   s
            @r   r   z#BulletManager.handle_special_on_hit  s   6Xx!||ACaeURCXFF"#.1"4HqL	Y
:-ryyA~yyY^^--
&&r***ACaeUBHEE"#.1"4HqL	Y
:-ryyA~yyY^^--
&&r***AHHHVw;;;JN:&&& :99HIIIIaIIIJJJ QS2XqsAE1aOLLG!+G(+8(GO""7+++++ r   c           	      ^   g d}|j         t          |          k     r|j        ||j                  k    r|j        r|j         t          |j                  k     rw|j        |j                  \  }}d}||z  }||z  }t	          |j        |j        |j        ||dd          }|j        |j        |_        | j	        j
                            |           |xj         dz  c_         |j         t          |          k     r|j        ||j                  k    |j         t          |          k    r	d|_        d S d S )N)r   r   r   r   g?g?r   r   grape_smallr|   F)burst_indexlenrK   r   r   r4   r6   r   rp   r   r,   r   r(   )	r   r*   burst_timesrc   rd   re   rR   rS   sbs	            r   r9   z"BulletManager.handle_grape_spawner>  s-   ,,,mc+....19AM@Z3Z3Z| 	+AL0A0A A Aam4B%Z%ZACaeRRGG%1*+*<B'&&r***MMQMM mc+....19AM@Z3Z3Z =C,,,,AHHH -,r   r   )__name__
__module____qualname____doc__r   floatr>   r   r-   boolr.   r<   r;   r   r   r   r9   r'   r   r   r   r   
   s,       ==! ! !.C .C4 .C .C .C .C`g g g4 g g g gRV# V$ V V V V6&3 6&4 6& 6& 6& 6&p!9 !9 !9FU U U U[ [ [
%, %, %, %,N    r   r   )typingr   game.configr   r   r   r   r   r	   r
   r   r   r   r   r   game.objects.bulletr   r   rP   r   r'   r   r   <module>r      s                                    ' & & & & &  F F F F F F F F F Fr   