kards-env/kards_battle/examples/sample_units.py

350 lines
9.3 KiB
Python
Raw Normal View History

2025-09-05 17:05:43 +08:00
"""
示例单位定义
展示如何创建具有不同能力的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