Source code for VegansDeluxe.rebuild.Skills.Thief

from VegansDeluxe.core import AttachedAction
from VegansDeluxe.core import Enemies
from VegansDeluxe.core import Entity
from VegansDeluxe.core import ItemAction
from VegansDeluxe.core import PreActionsGameEvent, DeliveryRequestEvent, DeliveryPackageEvent
from VegansDeluxe.core import RegisterEvent, RegisterState, Next
from VegansDeluxe.core import Session
from VegansDeluxe.core import StateContext, EventContext
from VegansDeluxe.core.Actions.StateAction import DecisiveStateAction
from VegansDeluxe.core.Skills.Skill import Skill
from VegansDeluxe.core.Translator.LocalizedString import ls


[docs]class Thief(Skill): id = 'thief' name = ls("rebuild.skill.thief.name") description = ls("rebuild.skill.thief.description") def __init__(self): super().__init__() self.cooldown_turn = 0
@RegisterState(Thief) async def register(root_context: StateContext[Thief]): session: Session = root_context.session source = root_context.entity @RegisterEvent(session.id, event=PreActionsGameEvent) async def func(context: EventContext[PreActionsGameEvent]): if source.weapon and source.weapon.ranged: source.outbound_accuracy_bonus += 1
[docs]@AttachedAction(Thief) class Steal(DecisiveStateAction): id = 'steal' name = ls("rebuild.skill.thief.action.name") priority = -3 target_type = Enemies() def __init__(self, session: Session, source: Entity, skill: Thief): super().__init__(session, source, skill) self.state = skill @property def hidden(self) -> bool: return self.session.turn < self.state.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.state.cooldown_turn = self.session.turn + 3 success = False for action in action_manager.action_queue: if action.type != 'item': continue action: ItemAction if action.source != target: continue item = action.item if action.canceled: continue action.canceled = True self.session.say(ls("rebuild.skill.thief.action.text").format(target.name, item.name, source.name)) source.items.append(item) success = True if not success: self.session.say(ls("rebuild.skill.thief.action_miss").format(source.name, target.name)) await self.event_manager.publish(DeliveryRequestEvent(self.session.id, self.session.turn))