350 lines
9.3 KiB
Python
350 lines
9.3 KiB
Python
"""
|
||
示例单位定义
|
||
展示如何创建具有不同能力的KARDS单位
|
||
现在支持从YAML文件加载单位定义,与传统创建方法共存
|
||
"""
|
||
from ..units.unit import Unit
|
||
from ..units.unit_loader import load_unit, get_unit_loader
|
||
from ..core.enums import UnitType
|
||
from ..abilities.abilities import DealDamageOnDeploy, BuffAlliesStatic, SacrificeForDamage, HealOnDeath, TargetType
|
||
|
||
|
||
# ===== YAML-based Unit Creation Functions =====
|
||
# 这些函数使用YAML文件中的单位定义
|
||
|
||
def create_german_infantry() -> Unit:
|
||
"""德军步兵 - 从YAML加载"""
|
||
return load_unit("ger_infantry_grenadier")
|
||
|
||
|
||
def create_american_gi() -> Unit:
|
||
"""美军步兵 - 从YAML加载"""
|
||
return load_unit("usa_infantry_gi")
|
||
|
||
|
||
def create_german_panzer_iv() -> Unit:
|
||
"""德军四号坦克 - 从YAML加载"""
|
||
return load_unit("ger_tank_panzer_iv")
|
||
|
||
|
||
def create_american_sherman() -> Unit:
|
||
"""美军谢尔曼坦克 - 从YAML加载"""
|
||
return load_unit("usa_tank_sherman")
|
||
|
||
|
||
def create_german_88mm_flak() -> Unit:
|
||
"""德军88毫米高炮 - 从YAML加载"""
|
||
return load_unit("ger_artillery_88mm")
|
||
|
||
|
||
def create_american_howitzer() -> Unit:
|
||
"""美军榴弹炮 - 从YAML加载"""
|
||
return load_unit("usa_artillery_howitzer")
|
||
|
||
|
||
def create_german_bf109() -> Unit:
|
||
"""德军BF109战斗机 - 从YAML加载"""
|
||
return load_unit("ger_fighter_bf109")
|
||
|
||
|
||
def create_american_p51() -> Unit:
|
||
"""美军P51野马战斗机 - 从YAML加载"""
|
||
return load_unit("usa_fighter_p51")
|
||
|
||
|
||
def create_german_stuka() -> Unit:
|
||
"""德军斯图卡轰炸机 - 从YAML加载"""
|
||
return load_unit("ger_bomber_stuka")
|
||
|
||
|
||
def create_american_b17() -> Unit:
|
||
"""美军B17轰炸机 - 从YAML加载"""
|
||
return load_unit("usa_bomber_b17")
|
||
|
||
|
||
# ===== Legacy Unit Creation Functions =====
|
||
# 这些函数保持原有的硬编码创建方式,用于复杂的能力示例
|
||
|
||
def create_german_88mm_gun() -> Unit:
|
||
"""德国88毫米反坦克炮 - 火炮单位,部署时造成伤害"""
|
||
unit = Unit(
|
||
name="German 88mm Gun",
|
||
unit_type=UnitType.ARTILLERY,
|
||
attack=4,
|
||
defense=2,
|
||
operation_cost=4
|
||
)
|
||
|
||
# 部署时对敌方单位造成3点伤害
|
||
deploy_ability = DealDamageOnDeploy(3, TargetType.ENEMY_UNIT)
|
||
unit.abilities.append(deploy_ability)
|
||
|
||
return unit
|
||
|
||
|
||
def create_legacy_panzer_iv() -> Unit:
|
||
"""德国四号坦克 - 具有闪击能力(旧版本示例)"""
|
||
unit = Unit(
|
||
name="Panzer IV (Legacy)",
|
||
unit_type=UnitType.TANK,
|
||
attack=3,
|
||
defense=4,
|
||
operation_cost=3,
|
||
keywords={"BLITZ"} # 闪击:可以立即行动
|
||
)
|
||
return unit
|
||
|
||
|
||
def create_legacy_bf109_fighter() -> Unit:
|
||
"""德国BF-109战斗机 - 战斗机,具有伏击能力"""
|
||
unit = Unit(
|
||
name="Bf 109 (Legacy)",
|
||
unit_type=UnitType.FIGHTER,
|
||
attack=3,
|
||
defense=2,
|
||
operation_cost=3,
|
||
keywords={"AMBUSH"} # 伏击:首次被攻击时先造成伤害
|
||
)
|
||
return unit
|
||
|
||
|
||
def create_legacy_stuka_bomber() -> Unit:
|
||
"""德国Ju-87俯冲轰炸机 - 轰炸机,攻击时不受反击"""
|
||
unit = Unit(
|
||
name="Ju 87 Stuka (Legacy)",
|
||
unit_type=UnitType.BOMBER,
|
||
attack=4,
|
||
defense=1,
|
||
operation_cost=4
|
||
)
|
||
return unit
|
||
|
||
|
||
def create_legacy_german_infantry() -> Unit:
|
||
"""德军步兵 - 基础步兵单位(旧版本)"""
|
||
unit = Unit(
|
||
name="German Infantry (Legacy)",
|
||
unit_type=UnitType.INFANTRY,
|
||
attack=2,
|
||
defense=3,
|
||
operation_cost=2
|
||
)
|
||
return unit
|
||
|
||
|
||
def create_panther_tank() -> Unit:
|
||
"""德国豹式坦克 - 重型坦克,具有重甲"""
|
||
unit = Unit(
|
||
name="Panther Tank",
|
||
unit_type=UnitType.TANK,
|
||
attack=5,
|
||
defense=6,
|
||
operation_cost=5,
|
||
keywords={"HEAVY_ARMOR_1"} # 重甲1:受到伤害减1
|
||
)
|
||
return unit
|
||
|
||
|
||
def create_legacy_american_sherman() -> Unit:
|
||
"""美军谢尔曼坦克 - 中型坦克(旧版本)"""
|
||
unit = Unit(
|
||
name="M4 Sherman (Legacy)",
|
||
unit_type=UnitType.TANK,
|
||
attack=3,
|
||
defense=4,
|
||
operation_cost=3,
|
||
keywords={"BLITZ"}
|
||
)
|
||
return unit
|
||
|
||
|
||
def create_legacy_p51_mustang() -> Unit:
|
||
"""美军P-51野马战斗机 - 具有奋战能力"""
|
||
unit = Unit(
|
||
name="P-51 Mustang (Legacy)",
|
||
unit_type=UnitType.FIGHTER,
|
||
attack=4,
|
||
defense=2,
|
||
operation_cost=4,
|
||
keywords={"FURY"} # 奋战:每回合可攻击两次
|
||
)
|
||
return unit
|
||
|
||
|
||
def create_legacy_b17_bomber() -> Unit:
|
||
"""美军B-17轰炸机 - 重型轰炸机(旧版本)"""
|
||
unit = Unit(
|
||
name="B-17 Flying Fortress (Legacy)",
|
||
unit_type=UnitType.BOMBER,
|
||
attack=5,
|
||
defense=3,
|
||
operation_cost=5
|
||
)
|
||
return unit
|
||
|
||
|
||
def create_legacy_american_gi() -> Unit:
|
||
"""美军步兵 - 基础步兵单位(旧版本)"""
|
||
unit = Unit(
|
||
name="American GI (Legacy)",
|
||
unit_type=UnitType.INFANTRY,
|
||
attack=2,
|
||
defense=3,
|
||
operation_cost=2
|
||
)
|
||
return unit
|
||
|
||
|
||
def create_officer_unit() -> Unit:
|
||
"""军官单位 - 提供友军增益的静态能力"""
|
||
unit = Unit(
|
||
name="Field Officer",
|
||
unit_type=UnitType.INFANTRY,
|
||
attack=1,
|
||
defense=3,
|
||
operation_cost=3
|
||
)
|
||
|
||
# 静态能力:友军攻击力+1
|
||
buff_ability = BuffAlliesStatic(attack_bonus=1)
|
||
unit.abilities.append(buff_ability)
|
||
|
||
return unit
|
||
|
||
|
||
def create_kamikaze_pilot() -> Unit:
|
||
"""神风特攻队 - 可以牺牲自己造成伤害"""
|
||
unit = Unit(
|
||
name="Kamikaze Pilot",
|
||
unit_type=UnitType.FIGHTER,
|
||
attack=2,
|
||
defense=1,
|
||
operation_cost=2
|
||
)
|
||
|
||
# 激活能力:牺牲自己对敌方单位造成4点伤害
|
||
sacrifice_ability = SacrificeForDamage(4)
|
||
unit.abilities.append(sacrifice_ability)
|
||
|
||
return unit
|
||
|
||
|
||
def create_medic_unit() -> Unit:
|
||
"""医疗兵 - 死亡时治疗友军"""
|
||
unit = Unit(
|
||
name="Combat Medic",
|
||
unit_type=UnitType.INFANTRY,
|
||
attack=1,
|
||
defense=2,
|
||
operation_cost=2
|
||
)
|
||
|
||
# 死亡能力:治疗所有友军2点
|
||
heal_ability = HealOnDeath(2)
|
||
unit.abilities.append(heal_ability)
|
||
|
||
return unit
|
||
|
||
|
||
def create_elite_sniper() -> Unit:
|
||
"""精英狙击手 - 具有烟幕和动员能力"""
|
||
unit = Unit(
|
||
name="Elite Sniper",
|
||
unit_type=UnitType.INFANTRY,
|
||
attack=3,
|
||
defense=1,
|
||
operation_cost=3,
|
||
keywords={"SMOKESCREEN", "MOBILIZE"} # 烟幕:不能被攻击;动员:回合开始+1/+1
|
||
)
|
||
return unit
|
||
|
||
|
||
def create_heavy_tank() -> Unit:
|
||
"""重型坦克 - 具有守护能力"""
|
||
unit = Unit(
|
||
name="Heavy Tank",
|
||
unit_type=UnitType.TANK,
|
||
attack=4,
|
||
defense=8,
|
||
operation_cost=6,
|
||
keywords={"GUARD", "HEAVY_ARMOR_2"} # 守护:保护相邻单位;重甲2:受伤害减2
|
||
)
|
||
return unit
|
||
|
||
|
||
# 单位工厂函数
|
||
def get_sample_units() -> dict:
|
||
"""获取所有示例单位的工厂函数字典(YAML版本优先)"""
|
||
return {
|
||
# YAML-based units (新版本)
|
||
"german_infantry": create_german_infantry,
|
||
"american_gi": create_american_gi,
|
||
"german_panzer_iv": create_german_panzer_iv,
|
||
"american_sherman": create_american_sherman,
|
||
"german_88mm_flak": create_german_88mm_flak,
|
||
"american_howitzer": create_american_howitzer,
|
||
"german_bf109": create_german_bf109,
|
||
"american_p51": create_american_p51,
|
||
"german_stuka": create_german_stuka,
|
||
"american_b17": create_american_b17,
|
||
|
||
# Legacy units with abilities (保留用于能力示例)
|
||
"german_88mm_gun": create_german_88mm_gun,
|
||
"panther_tank": create_panther_tank,
|
||
"officer_unit": create_officer_unit,
|
||
"kamikaze_pilot": create_kamikaze_pilot,
|
||
"combat_medic": create_medic_unit,
|
||
"elite_sniper": create_elite_sniper,
|
||
"heavy_tank": create_heavy_tank,
|
||
}
|
||
|
||
|
||
def create_german_deck() -> list:
|
||
"""创建德军卡组(使用YAML单位)"""
|
||
return [
|
||
create_german_panzer_iv(),
|
||
create_panther_tank(),
|
||
create_german_bf109(),
|
||
create_german_stuka(),
|
||
create_german_88mm_flak(),
|
||
create_german_infantry(),
|
||
create_heavy_tank(),
|
||
create_elite_sniper()
|
||
]
|
||
|
||
|
||
def create_american_deck() -> list:
|
||
"""创建美军卡组(使用YAML单位)"""
|
||
return [
|
||
create_american_sherman(),
|
||
create_american_p51(),
|
||
create_american_b17(),
|
||
create_american_gi(),
|
||
create_officer_unit(),
|
||
create_medic_unit(),
|
||
create_kamikaze_pilot() # 假设是投诚的日军飞行员 :)
|
||
]
|
||
|
||
|
||
def get_yaml_unit_list() -> dict:
|
||
"""获取所有YAML单位的便捷函数,按国家分组"""
|
||
loader = get_unit_loader()
|
||
|
||
# 确保单位已加载
|
||
if not loader._unit_definitions:
|
||
loader.load_all_units()
|
||
|
||
result = {
|
||
"germany": [],
|
||
"usa": [],
|
||
"all_ids": loader.list_available_units()
|
||
}
|
||
|
||
for unit_id, unit_data in loader._unit_definitions.items():
|
||
nation = unit_data.get('nation', 'UNKNOWN').lower()
|
||
if nation == 'germany':
|
||
result["germany"].append(unit_id)
|
||
elif nation == 'usa':
|
||
result["usa"].append(unit_id)
|
||
|
||
return result |