
    D[i                     d    d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	  G d d      Z
 G d d	      Zy)
u/   
工厂模式 - 动态加载植物和僵尸类
    N)DictTypeOptional)Plant)Zombiec                       e Zd ZU dZi Zeeee   f   e	d<   e
deddfd       Ze
ddededed	edee   f
d
       Ze
defd       Zy)PlantFactoryu$   植物工厂 - 动态加载植物类_plant_classes
plant_typereturnNc                 (   || j                   v ry	 dj                  d |j                  d      D              }t        j                  d|       }t        ||      }|| j                   |<   y# t        t        f$ r}t        d| d|       d}~ww xY w)u|   
        动态注册植物类
        
        Args:
            plant_type: 植物类型名称，如 'peashooter'
        N c              3   <   K   | ]  }|j                           y wN
capitalize.0words     K/mnt/c/Users/DipsyHou/Desktop/workspace/PVZOnline/backend/game/factories.py	<genexpr>z.PlantFactory.register_plant.<locals>.<genexpr>   s      U?Tt!2?T   _zgame.objects.plants.zFailed to load plant '': )	r
   joinsplit	importlibimport_modulegetattrImportErrorAttributeError
ValueError)clsr   
class_namemoduleplant_classes         r   register_plantzPlantFactory.register_plant   s     +++
	J Uz?O?OPS?T UUJ ,,/CJ<-PQF!&*5K-8Cz*^, 	J5j\QCHII	Js   AA, ,B;BBcolrowlevelc                     || j                   vr| j                  |       | j                   j                  |      }|sy |||      }||_        |S )u   
        创建植物实例
        
        Args:
            plant_type: 植物类型
            col: 列位置
            row: 行位置
            level: 进化等级
            
        Returns:
            Plant实例或None
        N)r
   r(   getr+   )r#   r   r)   r*   r+   r&   plants          r   create_plantzPlantFactory.create_plant&   sT     S///z*((,,Z8C%    c                 H    t        | j                  j                               S )u$   获取所有已注册的植物类型)listr
   keysr#   s    r   get_available_plantsz!PlantFactory.get_available_plants?   s     C&&++-..r0   )r   )__name__
__module____qualname____doc__r
   r   strr   r   __annotations__classmethodr(   intr   r/   r2   r5    r0   r   r	   r	   
   s    .-/NDd5k)*/J J J J, c  # c RZ[`Ra  0 /T / /r0   r	   c                       e Zd ZU dZi Zeeee   f   e	d<   e
deddfd       Ze
dededee   fd       Ze
defd	       Zy)
ZombieFactoryu$   僵尸工厂 - 动态加载僵尸类_zombie_classeszombie_typer   Nc                 .   || j                   v ry	 dj                  d |j                  d      D              dz   }t        j                  d|       }t        ||      }|| j                   |<   y# t        t        f$ r}t        d| d|       d}~ww xY w)	u   
        动态注册僵尸类
        
        Args:
            zombie_type: 僵尸类型名称，如 'normal', 'buckethead'
        Nr   c              3   <   K   | ]  }|j                           y wr   r   r   s     r   r   z0ZombieFactory.register_zombie.<locals>.<genexpr>W   s      V?Ut!2?Ur   r   r   zgame.objects.zombies.zFailed to load zombie 'r   )	rA   r   r   r   r   r   r    r!   r"   )r#   rB   r$   r%   zombie_classr'   s         r   register_zombiezZombieFactory.register_zombieJ   s     #---
	L V{?P?PQT?U VVYaaJ ,,/D[M-RSF"6:6L/;C,^, 	L6{m3qcJKK	Ls   AA/ /B>BBr*   c                     || j                   vr| j                  |       | j                   j                  |      }|sy ||      S )u   
        创建僵尸实例
        
        Args:
            zombie_type: 僵尸类型
            row: 行位置
            
        Returns:
            Zombie实例或None
        N)rA   rF   r-   )r#   rB   r*   rE   s       r   create_zombiezZombieFactory.create_zombiea   sG     c111,**..{;C  r0   c                 H    t        | j                  j                               S )u$   获取所有已注册的僵尸类型)r2   rA   r3   r4   s    r   get_available_zombiesz#ZombieFactory.get_available_zombiesv   s     C'',,.//r0   )r6   r7   r8   r9   rA   r   r:   r   r   r;   r<   rF   r=   r   rH   r2   rJ   r>   r0   r   r@   r@   E   s    ./1OT#tF|+,1L# L$ L L, ! !# !(6:J ! !( 0d 0 0r0   r@   )r9   r   typingr   r   r   game.objects.plants.baser   game.objects.zombies.baser   r	   r@   r>   r0   r   <module>rN      s0     ' ' * ,8/ 8/v40 40r0   