
    vai                     r    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dS )
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dS )PlantFactoryu$   植物工厂 - 动态加载植物类_plant_classes
plant_typereturnNc                 @   || j         v rdS 	 d                    d |                    d          D                       }t          j        d|           }t          ||          }|| j         |<   dS # t          t          f$ r}t          d| d|           d}~ww xY w)u|   
        动态注册植物类
        
        Args:
            plant_type: 植物类型名称，如 'peashooter'
        N c              3   >   K   | ]}|                                 V  d S N
capitalize.0words     3/root/workspace/PVZOnline/backend/game/factories.py	<genexpr>z.PlantFactory.register_plant.<locals>.<genexpr>   s,       U Ut!2!2 U U U U U U    _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     +++F
	J U Uz?O?OPS?T?T U U UUUJ ,-PJ-P-PQQF!&*55K-8Cz***^, 	J 	J 	JHjHHQHHIII	Js   A#A2 2BBBr   colrowlevelc                     || j         vr|                     |           | j                             |          }|sdS  |||          }||_        |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&   sf     S///z***(,,Z88 	4C%%r   c                 N    t          | j                                                  S )u$   获取所有已注册的植物类型)listr
   keysr#   s    r   get_available_plantsz!PlantFactory.get_available_plants?   s!     C&++--...r   )r   )__name__
__module____qualname____doc__r
   r   strr   r   __annotations__classmethodr(   intr   r/   r1   r4    r   r   r	   r	   
   s         ..-/NDd5k)*///J J J J J [J,  c  # c RZ[`Ra    [0 /T / / / [/ / /r   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dS )
ZombieFactoryu$   僵尸工厂 - 动态加载僵尸类_zombie_classeszombie_typer   Nc                 F   || j         v rdS 	 d                    d |                    d          D                       dz   }t          j        d|           }t          ||          }|| j         |<   dS # t          t          f$ r}t          d| d|           d}~ww xY w)	u   
        动态注册僵尸类
        
        Args:
            zombie_type: 僵尸类型名称，如 'normal', 'buckethead'
        Nr   c              3   >   K   | ]}|                                 V  d S r   r   r   s     r   r   z0ZombieFactory.register_zombie.<locals>.<genexpr>W   s,       V Vt!2!2 V V V V V Vr   r   r   zgame.objects.zombies.zFailed to load zombie 'r   )	r@   r   r   r   r   r   r    r!   r"   )r#   rA   r$   r%   zombie_classr'   s         r   register_zombiezZombieFactory.register_zombieJ   s     #---F
	L V V{?P?PQT?U?U V V VVVYaaJ ,-R[-R-RSSF"6:66L/;C,,,^, 	L 	L 	LJ{JJqJJKKK	Ls   A&A5 5B BB r*   c                     || j         vr|                     |           | j                             |          }|sdS  ||          S )u   
        创建僵尸实例
        
        Args:
            zombie_type: 僵尸类型
            row: 行位置
            
        Returns:
            Zombie实例或None
        N)r@   rE   r-   )r#   rA   r*   rD   s       r   create_zombiezZombieFactory.create_zombiea   sY     c111,,,*..{;; 	4|C   r   c                 N    t          | j                                                  S )u$   获取所有已注册的僵尸类型)r1   r@   r2   r3   s    r   get_available_zombiesz#ZombieFactory.get_available_zombiesv   s!     C',,..///r   )r5   r6   r7   r8   r@   r   r9   r   r   r:   r;   rE   r<   r   rG   r1   rI   r=   r   r   r?   r?   E   s         ../1OT#tF|+,111L# L$ L L L [L, ! !# !(6:J ! ! ! [!( 0d 0 0 0 [0 0 0r   r?   )r8   r   typingr   r   r   game.objects.plants.baser   game.objects.zombies.baser   r	   r?   r=   r   r   <module>rM      s         ' ' ' ' ' ' ' ' ' ' * * * * * * , , , , , ,8/ 8/ 8/ 8/ 8/ 8/ 8/ 8/v40 40 40 40 40 40 40 40 40 40r   