A common perk called Counterattack that triggers when the player dodges. It calculates an AOE damage percentage based on perk level, adds a dodge-AOE damage percent modifier to the player stats on Refresh, and on dodge spawns a visual ring and damages nearby enemies.
using System;
using Sandbox;
[Perk( Rarity.Common, includedAtStart: false, alwaysOfferDebug: false, IncludedCategories = new[] { PerkCategory.Aoe })]
public class PerkDodgeAoe : Perk
{
private const float DAMAGE_RADIUS = 90f;
private enum Mod { DamagePercent };
static PerkDodgeAoe()
{
Register<PerkDodgeAoe>(
name: "Counterattack",
imagePath: "textures/icons/vector/dodge_aoe.png",
description: level => $"Do {(int)GetValue( level, Mod.DamagePercent, true )}% of dodged dmg\nto nearby enemies",
upgradeDescription: level => $"Do {(int)GetValue( level - 1, Mod.DamagePercent, true )}%→{(int)GetValue( level, Mod.DamagePercent, true )}% of dodged dmg\nto nearby enemies"
);
}
public override void Start()
{
base.Start();
}
public override void Refresh()
{
base.Refresh();
Player.Modify( this, PlayerStat.DodgeAoeDamagePercent, GetValue( Level, Mod.DamagePercent ), ModifierType.Add );
}
private static float GetValue( int level, Mod mod, bool isPercent = false )
{
switch ( mod )
{
case Mod.DamagePercent:
default:
return isPercent
? 30 + 30 * level
: 0.30f + 0.30f * level;
}
}
public override void OnDodged( float damage, DamageType damageType, Vector2 dir, Enemy enemySource )
{
base.OnDodged( damage, damageType, dir, enemySource );
Vector2 pos = Player.Position2D;
float dmg = damage * GetValue( Level, Mod.DamagePercent );
float radius = DAMAGE_RADIUS * Player.Stats[PlayerStat.RadiusMultiplier];
Manager.Instance.SpawnRingRpc( pos, radius, new Color( 1f, 1f, 1f, 0.2f ), lifetime: Game.Random.Float( 0.15f, 0.2f ), path: "ring_spiky_2" );
Manager.Instance.DamageNearbyEnemies( Player.Position2D, radius, dmg, force: dmg * 0.5f, DamageType.Aoe, Player );
}
}