kards-env/kards_battle/cards/placeholder_cards.py

308 lines
11 KiB
Python
Raw Normal View History

2025-09-05 17:05:43 +08:00
"""
占位卡牌定义 - 用于测试卡牌系统
"""
from typing import List, Set
from ..core.enums import Nation, Rarity
from .card import UnitCard
from .card_loader import load_nation_cards
def create_placeholder_unit_cards() -> List[UnitCard]:
"""
创建10种占位单位卡牌用于测试
全部为召唤ger_infantry_grenadier的卡牌稀有度为4级
"""
placeholder_cards = []
# 卡牌定义:名称、费用、国家、描述
card_definitions = [
("德军掷弹兵A", 1, Nation.GERMANY, "基础德军步兵单位"),
("德军掷弹兵B", 1, Nation.GERMANY, "基础德军步兵单位"),
("德军掷弹兵C", 2, Nation.GERMANY, "经验丰富的德军步兵"),
("德军掷弹兵D", 2, Nation.GERMANY, "经验丰富的德军步兵"),
("德军精英掷弹兵A", 3, Nation.GERMANY, "精英德军步兵单位"),
("德军精英掷弹兵B", 3, Nation.GERMANY, "精英德军步兵单位"),
("德军老兵掷弹兵A", 2, Nation.GERMANY, "老兵德军步兵单位"),
("德军老兵掷弹兵B", 2, Nation.GERMANY, "老兵德军步兵单位"),
("德军突击掷弹兵", 3, Nation.GERMANY, "突击型德军步兵"),
("德军防卫掷弹兵", 1, Nation.GERMANY, "防御型德军步兵"),
]
for name, cost, nation, description in card_definitions:
card = UnitCard(
name=name,
cost=cost,
nation=nation,
rarity=Rarity.COMMON, # 4级稀有度
unit_definition_id="ger_infantry_grenadier",
description=description
)
placeholder_cards.append(card)
return placeholder_cards
def create_placeholder_allied_cards() -> List[UnitCard]:
"""
创建一些盟国占位卡牌用于测试多国卡组
"""
allied_cards = []
# 美军卡牌
usa_cards = [
("美军步兵A", 1, Nation.USA, "基础美军步兵单位"),
("美军步兵B", 2, Nation.USA, "经验丰富的美军步兵"),
("美军精英步兵", 3, Nation.USA, "精英美军步兵单位"),
]
# 英军卡牌
uk_cards = [
("英军步兵A", 1, Nation.UK, "基础英军步兵单位"),
("英军步兵B", 2, Nation.UK, "经验丰富的英军步兵"),
]
# 苏军卡牌
soviet_cards = [
("苏军步兵A", 1, Nation.SOVIET, "基础苏军步兵单位"),
("苏军步兵B", 2, Nation.SOVIET, "经验丰富的苏军步兵"),
]
# 小国卡牌(带流亡效果的)
minor_nation_cards = [
("波兰流亡步兵", 2, Nation.POLAND, "波兰流亡军步兵", {Nation.UK, Nation.SOVIET}),
("法国抵抗军", 2, Nation.FRANCE, "法国抵抗组织步兵", {Nation.UK, Nation.USA}),
("芬兰猎兵", 2, Nation.FINLAND, "芬兰精锐猎兵", {Nation.GERMANY}),
]
# 创建美军卡牌
for name, cost, nation, description in usa_cards:
card = UnitCard(
name=name,
cost=cost,
nation=nation,
rarity=Rarity.COMMON,
unit_definition_id="ger_infantry_grenadier", # 暂时都使用相同的单位定义
description=description
)
allied_cards.append(card)
# 创建英军卡牌
for name, cost, nation, description in uk_cards:
card = UnitCard(
name=name,
cost=cost,
nation=nation,
rarity=Rarity.COMMON,
unit_definition_id="ger_infantry_grenadier",
description=description
)
allied_cards.append(card)
# 创建苏军卡牌
for name, cost, nation, description in soviet_cards:
card = UnitCard(
name=name,
cost=cost,
nation=nation,
rarity=Rarity.COMMON,
unit_definition_id="ger_infantry_grenadier",
description=description
)
allied_cards.append(card)
# 创建小国卡牌(带流亡效果)
for name, cost, nation, description, exile_nations in minor_nation_cards:
card = UnitCard(
name=name,
cost=cost,
nation=nation,
rarity=Rarity.COMMON,
unit_definition_id="ger_infantry_grenadier",
exile_nations=exile_nations,
description=description
)
allied_cards.append(card)
return allied_cards
def create_test_deck_cards(major_nation: Nation, minor_nation: Nation) -> List[UnitCard]:
"""
为指定的主国和盟国创建测试卡组
优先使用YAML卡牌如果没有则使用占位卡牌
Args:
major_nation: 主国
minor_nation: 盟国
Returns:
39张卡牌的列表
"""
deck_cards = []
# 尝试从YAML加载卡牌
try:
major_cards = load_nation_cards(major_nation)
minor_cards = load_nation_cards(minor_nation)
# 如果成功加载了YAML卡牌使用YAML构建卡组
if major_cards and minor_cards:
return _build_deck_from_yaml_cards(major_cards, minor_cards)
except Exception as e:
print(f"无法从YAML加载卡牌使用占位卡牌: {e}")
pass
# 如果YAML加载失败使用原来的占位卡牌逻辑
# 为德国创建特殊的卡组
if major_nation == Nation.GERMANY:
# 创建德军卡牌模板
german_templates = [
("德军掷弹兵A", 1, "基础德军步兵单位"),
("德军掷弹兵B", 1, "基础德军步兵单位"),
("德军掷弹兵C", 2, "经验丰富的德军步兵"),
("德军掷弹兵D", 2, "经验丰富的德军步兵"),
("德军精英掷弹兵A", 3, "精英德军步兵单位"),
("德军精英掷弹兵B", 3, "精英德军步兵单位"),
("德军老兵掷弹兵A", 2, "老兵德军步兵单位"),
("德军老兵掷弹兵B", 2, "老兵德军步兵单位"),
("德军突击掷弹兵", 3, "突击型德军步兵"),
]
# 为每种卡牌添加3张共27张主国卡
for name, cost, description in german_templates:
for i in range(3):
card = UnitCard(
name=name,
cost=cost,
nation=Nation.GERMANY,
rarity=Rarity.COMMON,
unit_definition_id="ger_infantry_grenadier",
description=description
)
deck_cards.append(card)
else:
# 其他主国使用通用模板
major_templates = [
(f"{major_nation}步兵A", 1, "基础步兵单位"),
(f"{major_nation}步兵B", 2, "经验丰富的步兵"),
(f"{major_nation}精英步兵", 3, "精英步兵单位"),
]
# 每种卡牌最多4张稀有度限制创建更多种类的卡牌
extended_major_templates = [
(f"{major_nation}步兵A", 1, "基础步兵单位"),
(f"{major_nation}步兵B", 1, "基础步兵单位"),
(f"{major_nation}步兵C", 1, "基础步兵单位"),
(f"{major_nation}老兵A", 2, "经验丰富的步兵"),
(f"{major_nation}老兵B", 2, "经验丰富的步兵"),
(f"{major_nation}老兵C", 2, "经验丰富的步兵"),
(f"{major_nation}精英A", 3, "精英步兵单位"),
(f"{major_nation}精英B", 3, "精英步兵单位"),
(f"{major_nation}精英C", 3, "精英步兵单位"),
]
# 为每种卡牌创建3张共27张主国卡
for name, cost, description in extended_major_templates:
for i in range(3):
card = UnitCard(
name=name,
cost=cost,
nation=major_nation,
rarity=Rarity.COMMON,
unit_definition_id="ger_infantry_grenadier",
description=description
)
deck_cards.append(card)
# 添加盟国卡牌12张
minor_templates = [
(f"{minor_nation}支援步兵A", 1, "盟国支援步兵"),
(f"{minor_nation}支援步兵B", 1, "盟国支援步兵"),
(f"{minor_nation}支援步兵C", 2, "盟国支援步兵"),
(f"{minor_nation}支援老兵", 2, "盟国支援老兵"),
]
# 每种卡牌3张共12张盟国卡
for name, cost, description in minor_templates:
for i in range(3):
card = UnitCard(
name=name,
cost=cost,
nation=minor_nation,
rarity=Rarity.COMMON,
unit_definition_id="ger_infantry_grenadier",
description=description
)
deck_cards.append(card)
return deck_cards[:39] # 确保只返回39张卡牌
def _build_deck_from_yaml_cards(major_cards: List[UnitCard], minor_cards: List[UnitCard]) -> List[UnitCard]:
"""
从YAML加载的卡牌构建测试卡组
Args:
major_cards: 主国卡牌列表
minor_cards: 盟国卡牌列表
Returns:
39张卡牌的测试卡组
"""
deck_cards = []
# 主国卡牌27张根据稀有度限制添加
for card in major_cards:
max_copies = min(card.stats.rarity.max_copies_in_deck(), 3) # 最多3张
for _ in range(max_copies):
if len(deck_cards) < 27:
deck_cards.append(card)
# 如果主国卡不够27张重复添加普通卡牌
common_major_cards = [c for c in major_cards if c.stats.rarity == Rarity.COMMON]
while len(deck_cards) < 27 and common_major_cards:
for card in common_major_cards:
if len(deck_cards) < 27:
deck_cards.append(card)
else:
break
# 盟国卡牌12张根据稀有度限制添加
for card in minor_cards:
max_copies = min(card.stats.rarity.max_copies_in_deck(), 3) # 最多3张
for _ in range(max_copies):
if len(deck_cards) < 39:
deck_cards.append(card)
# 如果盟国卡不够12张重复添加普通卡牌
common_minor_cards = [c for c in minor_cards if c.stats.rarity == Rarity.COMMON]
while len(deck_cards) < 39 and common_minor_cards:
for card in common_minor_cards:
if len(deck_cards) < 39:
deck_cards.append(card)
else:
break
# 如果总数还不够39张补充普通卡牌
all_common_cards = [c for c in major_cards + minor_cards if c.stats.rarity == Rarity.COMMON]
while len(deck_cards) < 39 and all_common_cards:
for card in all_common_cards:
if len(deck_cards) < 39:
deck_cards.append(card)
else:
break
return deck_cards[:39]
def create_sample_order_cards() -> List:
"""创建示例指令卡牌(暂时不实现,留作接口)"""
# 后续实现指令卡牌时使用
return []
def create_sample_counter_cards() -> List:
"""创建示例反制卡牌(暂时不实现,留作接口)"""
# 后续实现反制卡牌时使用
return []