Source code for tuxemon.technique.effects.area

# SPDX-License-Identifier: GPL-3.0
# Copyright (c) 2014-2023 William Edwards <shadowapex@gmail.com>, Benjamin Bean <superman2k5@gmail.com>
from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING, Sequence

from tuxemon import formula
from tuxemon.technique.techeffect import TechEffect, TechEffectResult

if TYPE_CHECKING:
    from tuxemon.monster import Monster
    from tuxemon.technique.technique import Technique


[docs]class AreaEffectResult(TechEffectResult): damage: int element_multiplier: float should_tackle: bool
[docs]@dataclass class AreaEffect(TechEffect): """ Apply area damage. """ name = "area"
[docs] def apply( self, tech: Technique, user: Monster, target: Monster ) -> AreaEffectResult: player = self.session.player value = float(player.game_variables["random_tech_hit"]) hit = tech.accuracy >= value if hit: tech.advance_counter_success() damage, mult = formula.simple_damage_calculate(tech, user, target) # 2 vs 2, damage both monsters if player.max_position > 1: monsters: Sequence[Monster] = [] assert tech.combat_state combat = tech.combat_state human = combat.monsters_in_play_human opponent = combat.monsters_in_play_ai if player.isplayer: monsters = opponent else: monsters = human for mon in monsters: mon.current_hp -= damage combat._damage_map[mon].add(user) else: target.current_hp -= damage else: damage = 0 mult = 1.0 return { "damage": damage, "element_multiplier": mult, "should_tackle": bool(damage), "success": bool(damage), }