kards-env/kards_battle/cards/placeholder_cards.py

308 lines
11 KiB
Python
Raw 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.

"""
占位卡牌定义 - 用于测试卡牌系统
"""
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 []