Код IT
← Каталог

Python — карточная стратегия — Минимальный реестр (5 эффектов)

Фрагмент из «Python — карточная стратегия»: Минимальный реестр (5 эффектов).

python spinoffencyclopedia9-04-razrabotka-igr-praktikum-razrabotki-igr-7 embed URL статья в энциклопедии
Python main.py
EFFECT_VULNERABLE = "vulnerable"
EFFECT_WEAK = "weak"
EFFECT_STRENGTH = "strength"
EFFECT_DRAW = "draw"
EFFECT_POISON = "poison"

TARGET_ENEMY = "enemy"
TARGET_SELF = "self"
TARGET_ALL_ENEMIES = "all_enemies"


def collect_card_bonuses(card) -> list[dict]:
    """Собрать effect/effect2 и bonuses[] в единый список."""
    out = []
    if card.effect:
        out.append({"id": card.effect, "value": card.effect_value, "target": TARGET_ENEMY})
    if getattr(card, "effect2", None):
        out.append({"id": card.effect2, "value": card.effect2_value, "target": TARGET_ENEMY})
    for b in getattr(card, "bonuses", []) or []:
        out.append(b)
    return out


def apply_on_play_bonuses(combat, card, target_index, messages: list[str]):
    for bonus in collect_card_bonuses(card):
        _apply_one(combat, bonus, target_index, messages)


def _apply_one(combat, bonus: dict, target_index, messages: list[str]):
    eid = bonus.get("id") or bonus.get("effect")
    value = int(bonus.get("value", 0))
    target = bonus.get("target", TARGET_ENEMY)
    player = combat.player
    living = combat.encounter.get_living_enemies()

    if eid == EFFECT_VULNERABLE and living:
        idx = target_index if target_index is not None else 0
        living[min(idx, len(living) - 1)].vulnerable = max(
            getattr(living[min(idx, len(living) - 1)], "vulnerable", 0), value
        )
        messages.append(f"Уязвимость {value}!")
    elif eid == EFFECT_WEAK and living:
        idx = target_index if target_index is not None else 0
        living[min(idx, len(living) - 1)].weak = value
        messages.append("Слабость!")
    elif eid == EFFECT_STRENGTH:
        player.strength += value
        messages.append(f"+{value} силы")
    elif eid == EFFECT_DRAW:
        for c in player.deck.draw(value):
            player.hand.add(c)
        messages.append(f"Добор {value}")
    elif eid == EFFECT_POISON and living:
        idx = target_index if target_index is not None else 0
        enemy = living[min(idx, len(living) - 1)]
        enemy.poison = getattr(enemy, "poison", 0) + value
        messages.append(f"Яд {value}")
EFFECT_VULNERABLE = "vulnerable"
EFFECT_WEAK = "weak"
EFFECT_STRENGTH = "strength"
EFFECT_DRAW = "draw"
EFFECT_POISON = "poison"

TARGET_ENEMY = "enemy"
TARGET_SELF = "self"
TARGET_ALL_ENEMIES = "all_enemies"


def collect_card_bonuses(card) -> list[dict]:
    """Собрать effect/effect2 и bonuses[] в единый список."""
    out = []
    if card.effect:
        out.append({"id": card.effect, "value": card.effect_value, "target": TARGET_ENEMY})
    if getattr(card, "effect2", None):
        out.append({"id": card.effect2, "value": card.effect2_value, "target": TARGET_ENEMY})
    for b in getattr(card, "bonuses", []) or []:
        out.append(b)
    return out


def apply_on_play_bonuses(combat, card, target_index, messages: list[str]):
    for bonus in collect_card_bonuses(card):
        _apply_one(combat, bonus, target_index, messages)


def _apply_one(combat, bonus: dict, target_index, messages: list[str]):
    eid = bonus.get("id") or bonus.get("effect")
    value = int(bonus.get("value", 0))
    target = bonus.get("target", TARGET_ENEMY)
    player = combat.player
    living = combat.encounter.get_living_enemies()

    if eid == EFFECT_VULNERABLE and living:
        idx = target_index if target_index is not None else 0
        living[min(idx, len(living) - 1)].vulnerable = max(
            getattr(living[min(idx, len(living) - 1)], "vulnerable", 0), value
        )
        messages.append(f"Уязвимость {value}!")
    elif eid == EFFECT_WEAK and living:
        idx = target_index if target_index is not None else 0
        living[min(idx, len(living) - 1)].weak = value
        messages.append("Слабость!")
    elif eid == EFFECT_STRENGTH:
        player.strength += value
        messages.append(f"+{value} силы")
    elif eid == EFFECT_DRAW:
        for c in player.deck.draw(value):
            player.hand.add(c)
        messages.append(f"Добор {value}")
    elif eid == EFFECT_POISON and living:
        idx = target_index if target_index is not None else 0
        enemy = living[min(idx, len(living) - 1)]
        enemy.poison = getattr(enemy, "poison", 0) + value
        messages.append(f"Яд {value}")