kards-env/kards_battle/examples/sample_units.py

350 lines
9.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
示例单位定义
展示如何创建具有不同能力的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