Source code for evennia.contrib.rpg.buffs.samplebuffs

import random

from .buff import BaseBuff, Mod

[docs]class Exploit(BaseBuff): key = "exploit" name = "Exploit" flavor = "You are learning your opponent's weaknesses." duration = -1 maxstacks = 20 triggers = ["hit"] stack_msg = { 1: "You begin to notice flaws in your opponent's defense.", 10: "You've begun to match the battle's rhythm.", 20: "You've found a gap in the guard!", }
[docs] def conditional(self, *args, **kwargs): if self.handler.get_by_type(Exploited): return False return True
[docs] def at_trigger(self, trigger: str, *args, **kwargs): chance = self.stacks / 20 roll = random.random() if chance > roll: self.handler.add(Exploited) self.owner.msg("An opportunity presents itself!") elif chance < roll: self.handler.add(Exploit) if self.stacks in self.stack_msg: self.owner.msg(self.stack_msg[self.stacks])
[docs]class Exploited(BaseBuff): key = "exploited" name = "Exploited" flavor = "You have sensed your target's vulnerability, and are poised to strike." duration = 30 mods = [Mod("damage", "add", 100)]
[docs] def at_post_check(self, *args, **kwargs): self.owner.msg("You ruthlessly exploit your target's weakness!") self.remove(quiet=True)
[docs] def at_remove(self, *args, **kwargs): self.owner.msg("You have waited too long; the opportunity passes.")
[docs]class Leeching(BaseBuff): key = "leeching" name = "Leeching" flavor = "Attacking this target fills you with vigor." duration = 30 triggers = ["taken_damage"]
[docs] def at_trigger(self, trigger: str, attacker=None, damage=None, *args, **kwargs): if not attacker or not damage: return attacker.msg("You have been healed for {heal} life!".format(heal=damage * 0.1))
[docs]class Poison(BaseBuff): key = "poison" name = "Poison" flavor = "A poison wracks this body with painful spasms." duration = 120 maxstacks = 5 tickrate = 5 dmg = 5 playtime = True
[docs] def at_pause(self, *args, **kwargs): self.owner.db.prelogout_location.msg_contents( "{actor} stops twitching, their flesh a deathly pallor.".format(actor=self.owner) )
[docs] def at_unpause(self, *args, **kwargs): self.owner.location.msg_contents( "{actor} begins to twitch again, their cheeks flushing red with blood.".format( actor=self.owner ) )
[docs] def at_tick(self, initial=True, *args, **kwargs): _dmg = self.dmg * self.stacks if not initial: self.owner.location.msg_contents( "Poison courses through {actor}'s body, dealing {damage} damage.".format( actor=self.owner, damage=_dmg ) )
[docs]class Sated(BaseBuff): key = "sated" name = "Sated" flavor = "You have eaten a great meal!" duration = 180 maxstacks = 3 mods = [Mod("mood", "add", 15)]
[docs]class StatBuff(BaseBuff): """Customize the stat this buff affects by feeding a list in the order [stat, mod, base, perstack] to the cache argument when added""" key = "statbuff" name = "statbuff" flavor = "This buff affects the following stats: {stats}" maxstacks = 0 refresh = True unique = False cache = {"modgen": ["foo", "add", 0, 0]}
[docs] def __init__(self, handler, buffkey, cache={}) -> None: super().__init__(handler, buffkey, cache) # Finds our "modgen" cache value, which we pass on application modgen = list(self.cache.get("modgen")) if modgen: self.mods = [Mod(*modgen)] msg = "" _msg = [mod.stat for mod in self.mods] for stat in _msg: msg += stat self.flavor = self.flavor.format(stats=msg)