A Perk class for a game, named Pain Packer. When the player is hit it temporarily increases next-shot damage by applying a multiplicative modifier to ShotDamageMult until the player shoots, and it updates a small display/highlight.
using System;
using Sandbox;
[Perk( Rarity.Epic, locked: true, alwaysOfferDebug: false )]
public class PerkHurtNextShotDamage : Perk
{
private enum Mod { DamageMult, RechargeTime };
private bool _isActive;
static PerkHurtNextShotDamage()
{
Register<PerkHurtNextShotDamage>(
name: "Pain Packer",
imagePath: "textures/icons/vector/next_shot_damage.png",
description: level => $"+{(int)GetValue( level, Mod.DamageMult, true )}% dmg for your\nnext shot when you take dmg\n(doesn't stack)",
upgradeDescription: level => $"+{(int)GetValue( level - 1, Mod.DamageMult, true )}%→{(int)GetValue( level, Mod.DamageMult, true )}% dmg for your\nnext shot when you take dmg\n(doesn't stack)"
);
}
public override void Start()
{
base.Start();
ShouldUpdate = true;
HighlightColor = new Color( 0.6f, 0.6f, 1f );
HighlightDuration = 0.2f;
HighlightOpacity = 1.5f;
}
public override void Refresh()
{
base.Refresh();
}
private static float GetValue( int level, Mod mod, bool isPercent = false )
{
switch ( mod )
{
case Mod.DamageMult:
default:
return isPercent
? 10f + 30f * level
: 1f + (0.10f + 0.30f * level);
}
}
public override void OnHit( float amount, DamageType damageType, bool isSelfInflicted, Vector2 dir, float force, Enemy enemySource, EnemyType enemyType, float previousHealth )
{
base.OnHit( amount, damageType, isSelfInflicted, dir, force, enemySource, enemyType, previousHealth );
//if ( damageType == DamageType.Self )
// return;
if ( !_isActive )
Highlight();
Player.Modify( this, PlayerStat.ShotDamageMult, 2f, ModifierType.Mult );
_isActive = true;
//Player.Stats[PlayerStat.NextShotDamageMult] = GetValue( Level, Mod.DamageMult );
DisplayText = $"+{GetValue( Level, Mod.DamageMult, true )}%";
}
public override void OnShoot()
{
base.OnShoot();
DisplayText = " ";
Player.StopModifying( this, PlayerStat.ShotDamageMult );
_isActive = false;
}
}