
    i#                     L    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	y)    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y)PlantManageru6   植物管理器 - 使用工厂模式动态加载植物c                 (    || _         t        | _        y N)emr   
plant_info)selfentity_managers     W/mnt/c/Users/DipsyHou/Desktop/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   }}|j                  dd      } j                  j                  |      }|sy|d   }|d   }t        j                         }	|r<| j                  j                  v r$ j                  j                  |   }
|
d   }|
d	   }n, j                  j
                  } j                  j                  }|	|j                  |d
      k  ry||k\  r
|}|dk(  r`d}|rA| j                  j                  v r) j                  j                  |   j                  d      }n j                  j                  }|sy|} j                  j                  D cg c]$  }|j                  |k(  s|j                  |k(  s#|& }}d} j                  |      }|dk(  rt         fd|D              }|s9d}n6|dk(  rt         fd|D              }|sd}nt         fd|D              }|sd}|rd
}|r\| j                  j                  v rD j                  j                  |   j                  di       }t        |j                  |d
            }t        j                  ||||      }|sy||_        |dk(  rd|rF| j                  j                  v r. j                  j                  |   j                  d      |_        nd j                  j                  |_        nH|r5| j                  j                  v r| j                  j                  |   d<   n| j                  _         j                  j                  j%                  |       |r_| j                  j                  v rG j                  j                  |   dxx   |z  cc<   |	|z    j                  j                  |   d	   |<   y j                  xj
                  |z  c_        |	|z    j                  j                  |<   yyyc c}w )u   
        处理种植植物请求
        
        Args:
            data: 包含col, row, plant_type的字典
            username: 玩家用户名
        colrowr   
peashooterNcostcooldownsun	cooldownsr   mimiclast_planted_typeFfloatingc              3   Z   K   | ]"  }j                  |j                        d k(   $ ywr#   Nr   type.0pr   s     r   	<genexpr>z2PlantManager.handle_place_plant.<locals>.<genexpr>H   s)     "eUdPQ4#5#5aff#=#KUd   (+Tcarrierc              3   Z   K   | ]"  }j                  |j                        d k(   $ ywr-   Nr&   r(   s     r   r+   z2PlantManager.handle_place_plant.<locals>.<genexpr>N   s(     !cSba$"4"4QVV"<	"ISbr,   c              3   Z   K   | ]"  }j                  |j                        d k(   $ ywnormalNr&   r(   s     r   r+   z2PlantManager.handle_place_plant.<locals>.<genexpr>T   s(      aQ`A!3!3AFF!;x!GQ`r,   plant_levels)getr   timer   player_statesr   plant_cooldownsr"   plantsr   r   r   anyintr   create_plantownermimic_targetappend)r   r   r   crr   infor   r   nowp_statecurrent_sunr    effective_type	last_typer*   existing_plants	can_placecategoryhas_floatinghas_carrier
has_normallevellvl_map	new_plants   `                        r   handle_place_plantzPlantManager.handle_place_plant   s    E{DK1XXlL9
"":.F|
#iik DGG$9$99gg++H5G!%.K,I''++K//I z1--$'NW$ 	DGG,A,A A $ 5 5h ? C CDW XI $ 9 9I !* +/''..V.QAEEQJ155TU:q.OVI)).9H:%""eUd"ee# $IY&!!cSb!cc" $I ! aQ` aa
! $IDGG,A,A A"gg33H=AA.RTUGJ :;E(55j!QN	 "*	(H0E0E$E151F1Fx1P1T1TUh1i	.151J1J	.  H0E0E$EOY--h78KL4>1%%i0 DGG,A,A AGG))(3E:dB:ORU]~DGG))(3K@LGGKK4'K:=.DGG++J7E O   Ws   O+4O+O+c                     |d   |d   }}|j                  dd      } j                  j                  D cg c]$  }|j                  |k(  s|j                  |k(  s#|& }}|syt         fd|D        d      }t         fd|D        d      }t         fd|D        d      }	|r|xs |xs |	}
n
|xs |xs |	}
|
rd	|
_        d|
_        yyc c}w )
up   
        处理铲除植物
        
        Args:
            data: 包含col, row, is_bottom的字典
        r   r   	is_bottomFNc              3   `   K   | ]%  }j                  |j                        d k(  s"| ' ywr/   r&   r(   s     r   r+   z-PlantManager.handle_shovel.<locals>.<genexpr>   s)     \=aD4F4Fqvv4NR[4[=   #..c              3   `   K   | ]%  }j                  |j                        d k(  s"| ' ywr1   r&   r(   s     r   r+   z-PlantManager.handle_shovel.<locals>.<genexpr>   s)     `19K9KAFF9SW_9_QrT   c              3   `   K   | ]%  }j                  |j                        d k(  s"| ' ywr%   r&   r(   s     r   r+   z-PlantManager.handle_shovel.<locals>.<genexpr>   s)     ^MqT5G5G5OS]5]MrT   r   )r4   r   r8   r   r   nexthpactive)r   r   r?   r@   rR   r*   plants_at_locr-   normal_plantr#   targets   `          r   handle_shovelzPlantManager.handle_shovel|   s     E{DK1HH[%0	 %)GGNNPNqaeeqjQUUaZNP \=\^bc``bfg^M^`de88F "8W8FFI!FM + Qs   CCCc                     |d   |d   }}| j                   j                  D ]J  }|j                  |k(  s|j                  |k(  s#t	        |d      r|j                  | j                           y y)u   激活植物特殊能力r   r   activateN)r   r8   r   r   hasattrr_   )r   r   r?   r@   r*   s        r   handle_activate_plantz"PlantManager.handle_activate_plant   sW    E{DK1Auuzaeeqj1j)JJtww'	  r   c                     |j                  d      }|j                  d      }||y| j                  j                  D ]9  }t        |d      st	        |dd      }||k(  s|%|(|j                  ||       ; y)u   
        更新所有需要鼠标位置的植物（用于养剑葫等）
        只更新属于该玩家的植物
        
        Args:
            data: 包含mouse_x, mouse_y的字典
            username: 玩家用户名
        mouse_xmouse_yNset_mouse_positionr<   )r4   r   r8   r`   getattrre   )r   r   r   rc   rd   r*   plant_owners          r   handle_mouse_positionz"PlantManager.handle_mouse_position   s{     ((9%((9%?go Aq./%a$7(*{/BxGW((':  r   c                    | j                   j                  D ]  }|j                  || j                            | j                   j                  D cg c]   }|j                  dk  s|j                  r|" }}|D ]*  }t        |d      s|j                  | j                          , | j                   j                  D cg c]!  }|j                  dkD  s|j                  s |# c}| j                   _        y c c}w c c}w )Nr   on_death)r   r8   updaterX   rY   r`   rj   )r   dtr*   dead_plantss       r   rk   zPlantManager.update   s    AHHR!   #'''..N.QADDAIQXXq.NAq*%

477#  &*WW^^M^qttaxAHH!^M O
 Ns    C71C7>C<C< C<new_typec                    | j                   j                  |      }|syt        j                  ||j                  |j
                        }|syt        |dd      |_        || j                  j                  v r| j                  j                  j                  |      }|| j                  j                  |<   | j                  j                  d|j                  |j                  dz  z   |j                  |j                  dz  z   dd       yy)u   
        将植物转换为新类型（用于Mimic等）
        
        Args:
            old_plant: 旧植物实例
            new_type: 新植物类型
        Nr<   particle   mimic_transform)r'   xykind)r   r4   r   r;   r   r   rf   r<   r   r8   index	add_eventrs   wrt   h)r   	old_plantrn   rA   rO   idxs         r   transform_plantzPlantManager.transform_plant   s     ""8, !--h	y}}U	 ")Wd;	&''..&&y1C"+DGGNN3 GG"[[9;;q=0[[9;;q=0)	  'r   r   )__name__
__module____qualname____doc__r   strr   r   r   rP   r]   ra   rh   rk   r|    r   r   r	   r	      s    @(. . .iIt iIx} iIPT iIV""$ ""4 ""H$ 4 ;$ ;(3- ;SW ;.
N3 4 r   r	   )
r5   typingr   r   game.factoriesr   game.configr   r   r	   r   r   r   <module>r      s     ! ' 9d dr   