Source code for VegansDeluxe.rebuild.Weapons.Chain

import random

from VegansDeluxe.core import AttachedAction, Next, RegisterWeapon
from VegansDeluxe.core import DeliveryPackageEvent, DeliveryRequestEvent
from VegansDeluxe.core import Enemies, Distance
from VegansDeluxe.core import EventContext
from VegansDeluxe.core import MeleeAttack, ActionTag
from VegansDeluxe.core.Translator.LocalizedString import ls
from VegansDeluxe.core.Weapons.Weapon import MeleeWeapon
from VegansDeluxe.rebuild import KnockedWeapon


[docs]@RegisterWeapon class Chain(MeleeWeapon): id = 'chain' name = ls("rebuild.weapon.chain.name") description = ls("rebuild.weapon.chain.description") cubes = 3 accuracy_bonus = 2 energy_cost = 2 damage_bonus = 0 def __init__(self, session_id: str, entity_id: str): super().__init__(session_id, entity_id) self.cooldown_turn = 0
[docs]@AttachedAction(Chain) class ChainAttack(MeleeAttack): pass
[docs]@AttachedAction(Chain) class KnockWeapon(MeleeAttack): id = 'knock_weapon' name = ls("rebuild.weapon.chain.action.name") priority = -1 target_type = Enemies(distance=Distance.NEARBY_ONLY) @property def hidden(self) -> bool: return self.session.turn < self.weapon.cooldown_turn
[docs] async def func(self, source, target): @Next(self.session.id, event=DeliveryPackageEvent) async def delivery(context: EventContext[DeliveryPackageEvent]): action_manager = context.action_manager self.weapon.cooldown_turn = self.session.turn + 6 damage = (await self.attack(source, target)).dealt if not damage: self.session.say(ls("rebuild.weapon.chain.action_miss").format(source.name, target.name)) return source_reloading = False for action in action_manager.get_queued_entity_actions(self.session, target): if ActionTag.RELOAD in action.tags: source_reloading = True if source_reloading or random.randint(1, 100) <= 10: self.session.say(ls("rebuild.weapon.chain.action.text").format(source.name, target.name)) state = target.get_state(KnockedWeapon) state.drop_weapon(target) else: self.session.say(ls("rebuild.weapon.chain.action_miss").format(source.name, target.name)) await self.event_manager.publish(DeliveryRequestEvent(self.session.id, self.session.turn))