
    wai#                     T    d dl Z d dlmZmZ d dlmZ d dlmZmZ  G d d          Z	dS )    N)DictOptional)PlantFactory)PLANT_CONFIGSget_plant_categoryc                       e Zd ZdZd ZdedefdZddedee         ddfd	Z	deddfd
Z
deddfdZddedee         ddfdZd ZdeddfdZdS )PlantManageru6   植物管理器 - 使用工厂模式动态加载植物c                 ,    || _         t          | _        d S N)emr   
plant_info)selfentity_managers     ?/root/workspace/PVZOnline/backend/game/managers/PlantManager.py__init__zPlantManager.__init__	   s     '    
plant_typereturnc                      t          |          S )u   获取植物类别)r   )r   r   s     r   _get_categoryzPlantManager._get_category   s    !*---r   Ndatausernamec                     |d         |d         c|                     dd          } j                             |          }|sdS |d         }|d         }t          j                    }|r1| j        j        v r# j        j        |         }|d         }	|d	         }
n j        j        }	 j        j        }
||
                     |d
          k     rdS |	|k    r|}|dk    rJd}|r4| j        j        v r& j        j        |                              d          }n j        j        }|sdS |}fd j        j        D             }d} 	                    |          }|dk    r t           fd|D                       }|sd}nE|dk    r t           fd|D                       }|sd}nt           fd|D                       }|sd}|rd
}|rW| j        j        v rI j        j        |                              di           }t          |                     |d
                    }t          j        ||          }|sdS ||_        |dk    rM|r9| j        j        v r+ j        j        |                              d          |_        nD j        j        |_        n2|r$| j        j        v r| j        j        |         d<   n| j        _         j        j                            |           |rN| j        j        v r@ j        j        |         dxx         |z  cc<   ||z    j        j        |         d	         |<   dS  j        xj        |z  c_        ||z    j        j        |<   dS dS dS )u   
        处理种植植物请求
        
        Args:
            data: 包含col, row, plant_type的字典
            username: 玩家用户名
        colrowr   
peashooterNcostcooldownsun	cooldownsr   mimiclast_planted_typec                 @    g | ]}|j         k    |j        k    |S  r   r   .0pcrs     r   
<listcomp>z3PlantManager.handle_place_plant.<locals>.<listcomp>A   s+    VVVQAEQJJ15TU::q:::r   Ffloatingc              3   T   K   | ]"}                     |j                  d k    V  #dS r,   Nr   typer'   r(   r   s     r   	<genexpr>z2PlantManager.handle_place_plant.<locals>.<genexpr>H   s9      "e"ePQ4#5#5af#=#=#K"e"e"e"e"e"er   Tcarrierc              3   T   K   | ]"}                     |j                  d k    V  #dS r3   Nr/   r1   s     r   r2   z2PlantManager.handle_place_plant.<locals>.<genexpr>N   s8      !c!ca$"4"4QV"<"<	"I!c!c!c!c!c!cr   c              3   T   K   | ]"}                     |j                  d k    V  #dS normalNr/   r1   s     r   r2   z2PlantManager.handle_place_plant.<locals>.<genexpr>T   s8       a aA!3!3AF!;!;x!G a a a a a ar   plant_levels)getr   timer   player_statesr   plant_cooldownsr"   plantsr   anyintr   create_plantownermimic_targetappend)r   r   r   r   infor   r   nowp_statecurrent_sunr    effective_type	last_typeexisting_plants	can_placecategoryhas_floatinghas_carrier
has_normallevellvl_map	new_plantr)   r*   s   `                     @@r   handle_place_plantzPlantManager.handle_place_plant   s    E{DK1XXlL99
"":.. 	FF|
#ikk  	0DG$999g+H5G!%.K,II'+K/I z1----F$'NW$$ 	 :DG,A A A $ 5h ? C CDW X XII $ 9I  F!* WVVVV$'.VVVOI)).99H:%%""e"e"e"eUd"e"e"eee# % $IY&&!!c!c!c!cSb!c!c!ccc" % $I ! a a a aQ` a a aaa
! % $I "I <DG,A A A"g3H=AA.RTUUGJ : :;;E(5j!QNN	  F"*	(( KH0E$E$E151Fx1P1T1TUh1i1i	..151J	..   ?H0E$E$EOY-h78KLL4>1%%i000  IDG,A A AG)(3E:::dB:::ORU]~DG)(3K@LLLGKK4'KK:=.DG+J777S N"I "Ir   c                 ~   	 |d         |d         c	|                     dd          }	fd j        j        D             }|sdS t           fd|D             d          }t           fd|D             d          }t           fd	|D             d          }|r|p|p|}n|p|p|}|rd
|_        d|_        dS dS )up   
        处理铲除植物
        
        Args:
            data: 包含col, row, is_bottom的字典
        r   r   	is_bottomFc                 @    g | ]}|j         k    |j        k    |S r$   r%   r&   s     r   r+   z.PlantManager.handle_shovel.<locals>.<listcomp>   s*    PPPqaeqjjQUaZZZZZr   Nc              3   X   K   | ]$}                     |j                  d k     |V  %dS r5   r/   r1   s     r   r2   z-PlantManager.handle_shovel.<locals>.<genexpr>   s>      \\aD4F4Fqv4N4NR[4[4[4[4[4[4[\\r   c              3   X   K   | ]$}                     |j                  d k     |V  %dS r7   r/   r1   s     r   r2   z-PlantManager.handle_shovel.<locals>.<genexpr>   s>      ``19K9KAF9S9SW_9_9_Q9_9_9_9_``r   c              3   X   K   | ]$}                     |j                  d k     |V  %dS r.   r/   r1   s     r   r2   z-PlantManager.handle_shovel.<locals>.<genexpr>   s>      ^^qT5G5G5O5OS]5]5]5]5]5]5]^^r   r   )r:   r   r>   nexthpactive)
r   r   rV   plants_at_locr3   normal_plantr,   targetr)   r*   s
   `       @@r   handle_shovelzPlantManager.handle_shovel|   s    E{DK1HH[%00	 QPPPPDGNPPP 	F \\\\=\\\^bcc```````bfgg^^^^M^^^`dee 	988FF "8W8F 	"FI!FMMM	" 	"r   c                     |d         |d         }}| j         j        D ]E}|j        |k    r8|j        |k    r-t	          |d          r|                    | j                     dS FdS )u   激活植物特殊能力r   r   activateN)r   r>   r   r   hasattrrc   )r   r   r)   r*   r(   s        r   handle_activate_plantz"PlantManager.handle_activate_plant   ss    E{DK1 	 	Auzzaeqjj1j)) (JJtw'''		 	r   c                    |                     d          }|                     d          }||dS | j        j        D ]C}t          |d          r1t	          |dd          }||k    s|||                    ||           DdS )u   
        更新所有需要鼠标位置的植物（用于养剑葫等）
        只更新属于该玩家的植物
        
        Args:
            data: 包含mouse_x, mouse_y的字典
            username: 玩家用户名
        mouse_xmouse_yNset_mouse_positionrB   )r:   r   r>   rd   getattrri   )r   r   r   rg   rh   r(   plant_owners          r   handle_mouse_positionz"PlantManager.handle_mouse_position   s     ((9%%((9%%?goF  	; 	;Aq.// ;%a$77(**{/BxGW((':::	; 	;r   c                 $   | j         j        D ]}|                    || j                    d | j         j        D             }|D ],}t          |d          r|                    | j                    -d | j         j        D             | j         _        d S )Nc                 6    g | ]}|j         d k    s|j        |S r   r\   r]   r'   r(   s     r   r+   z'PlantManager.update.<locals>.<listcomp>   s%    NNNQADAIIQXIqIIIr   on_deathc                 6    g | ]}|j         d k    |j        |S ro   rp   rq   s     r   r+   z'PlantManager.update.<locals>.<listcomp>   s%    MMMqtaxxAHx!xxxr   )r   r>   updaterd   rr   )r   dtr(   dead_plantss       r   rt   zPlantManager.update   s     	" 	"AHHR!!!! ON$'.NNN 	$ 	$Aq*%% $

47###MMTW^MMMr   new_typec                    | j                             |          }|sdS t          j        ||j        |j                  }|sdS t          |dd          |_        || j        j	        v ro| j        j	        
                    |          }|| j        j	        |<   | j                            d|j        |j        dz  z   |j        |j        dz  z   dd           dS dS )u   
        将植物转换为新类型（用于Mimic等）
        
        Args:
            old_plant: 旧植物实例
            new_type: 新植物类型
        NrB   particle   mimic_transform)r0   xykind)r   r:   r   rA   r   r   rj   rB   r   r>   index	add_eventr|   wr}   h)r   	old_plantrw   rE   rS   idxs         r   transform_plantzPlantManager.transform_plant   s     ""8,, 	F !-h	y}UU	 	F ")Wd;;	&&'.&&y11C"+DGN3 G"[9;q=0[9;q=0)	       '&r   r   )__name__
__module____qualname____doc__r   strr   r   r   rT   ra   re   rl   rt   r   r$   r   r   r	   r	      s;       @@( ( (. . . . . .iI iIt iIx} iIPT iI iI iI iIV""$ ""4 "" "" "" ""H$ 4    ; ;$ ;(3- ;SW ; ; ; ;.
N 
N 
N3 4      r   r	   )
r;   typingr   r   game.factoriesr   game.configr   r   r	   r$   r   r   <module>r      s     ! ! ! ! ! ! ! ! ' ' ' ' ' ' 9 9 9 9 9 9 9 9d d d d d d d d d dr   