from VegansDeluxe.core import PostActionsGameEvent, PreDamagesGameEvent, PostUpdateActionsGameEvent
from VegansDeluxe.core import PreDamageGameEvent, PostDamageGameEvent
from VegansDeluxe.core import RegisterState, RegisterEvent, ActionTag
from VegansDeluxe.core import Session
from VegansDeluxe.core import State
from VegansDeluxe.core import StateContext, EventContext
from VegansDeluxe.core.Actions.EntityActions import SkipActionGameEvent
from VegansDeluxe.core.Translator.LocalizedString import ls
[docs]class Aflame(State):
id = 'aflame'
def __init__(self):
super().__init__()
self.flame = 0
self.dealer = None
self.extinguished = False
self.timer = 0
[docs] def add_flame(self, session, entity, dealer, flame):
self.timer = 2
self.extinguished = False
if self.flame == 0:
session.say(ls("rebuild.state.aflame.activate").format(entity.name))
else:
session.say(ls("rebuild.state.aflame.increase").format(entity.name))
self.flame += flame
self.dealer = dealer
@RegisterState(Aflame)
async def register(root_context: StateContext[Aflame]):
session: Session = root_context.session
source = root_context.entity
state: Aflame = root_context.state
@RegisterEvent(session.id, event=PostActionsGameEvent)
async def handle_post_actions_event(context: EventContext[PostActionsGameEvent]):
"""
Handle events after actions have been taken.
"""
skipped = False
for action in context.action_manager.get_queued_entity_actions(session, source):
if ActionTag.SKIP in action.tags:
skipped = True
break
if not skipped or not state.flame:
return
session.say(ls("rebuild.state.aflame.remove").format(source.name))
state.timer = 0
state.flame = 0
state.extinguished = False
@RegisterEvent(session.id, event=PostUpdateActionsGameEvent)
async def handle_post_updates_event(context: EventContext[PostUpdateActionsGameEvent]):
"""
Handle events after updates have been performed.
"""
if root_context.event.entity_id != source.id:
return
if state.flame:
action = context.action_manager.get_action(session, source, 'skip')
if not action:
return
action.name = ls("rebuild.state.aflame.extinguish")
@RegisterEvent(session.id, event=PreDamagesGameEvent)
async def handle_pre_damages_event(context: EventContext[PreDamagesGameEvent]):
"""
Handle events prior to damage calculation.
"""
if not state.flame:
return
if state.extinguished:
reset_state(state, session, ls("rebuild.state.aflame.disappear").format(source.name))
return
damage = await perform_fire_attack(session, source, state, context.event)
source.inbound_dmg.add(state.dealer, damage, session.turn)
source.outbound_dmg.add(state.dealer, damage, session.turn)
if state.flame > 1:
source.energy -= state.flame - 1
if state.timer <= 1:
state.extinguished = True
else:
state.timer -= 1
@RegisterEvent(session.id, event=SkipActionGameEvent)
async def handle_pre_damages_event(context: EventContext[SkipActionGameEvent]):
"""
Handle skip turn event,
"""
if context.event.entity_id != source.id:
return
if state.flame == 0:
return
state.flame = 0
state.extinguished = False
session.say(ls("rebuild.state.aflame.removing").format(source.name))
context.event.no_text = True
[docs]def reset_state(state, session, message):
"""
Reset the state to default values and output a message.
"""
state.flame = 0
state.extinguished = False
state.timer = 0
session.say(message)
[docs]class FireAttackGameEvent(PreDamageGameEvent):
pass
[docs]class PostFireAttackGameEvent(PostDamageGameEvent):
pass