from VegansDeluxe.core import RegisterState, RegisterEvent
from VegansDeluxe.core import StateContext, EventContext
from VegansDeluxe.core import Entity
from VegansDeluxe.core import PostAttackGameEvent, PostDamageGameEvent
from VegansDeluxe.core import Session
from VegansDeluxe.core import State
from VegansDeluxe.core import percentage_chance
from VegansDeluxe.core.Translator.LocalizedString import ls
[docs]class Armor(State):
id = 'armor'
def __init__(self):
super().__init__()
self.armor = []
[docs] def negate_damage(self, session: Session, source: Entity, message: PostAttackGameEvent):
if not message.damage:
return
armor = min(message.damage, self.roll_armor())
if not armor:
return
session.say(ls("state_armor_effect").format(source.name, armor))
message.damage -= armor
[docs] def add(self, value: int, chance=100):
self.armor.append((value, chance))
[docs] def remove(self, armor):
if armor in self.armor:
self.armor.remove(armor)
[docs] def roll_armor(self):
result = 0
for armor, chance in self.armor:
for _ in range(armor):
if percentage_chance(chance):
result += 1
return result
@RegisterState(Armor)
def register(root_context: StateContext[Armor]):
session: Session = root_context.session
source = root_context.entity
state = root_context.state
@RegisterEvent(session.id, event=PostDamageGameEvent)
def func(context: EventContext[PostDamageGameEvent]):
if context.event.target == source:
state.negate_damage(session, source, context.event)