guns/GunSniper.cs

A gun item class for a sniper that assigns two perks when a run starts and provides a description string. It adds a ZoomOut perk once and a BulletAccuracy perk twice, and sends a local chat message describing the granted perks.

Reflection
public class GunSniper : Gun
{
	public const string ItemId = "gun_sniper";

	private const int AccuracyPerkLevel = 2;
	private const int ZoomOutPerkLevel = 1;

	public static string Description() => $"Start with {Perk.GetRichTextNameToken( typeof( PerkZoomOut ) )} {Perk.GetRichTextToken( nameof( PerkZoomOut ), level: ZoomOutPerkLevel )} and {Perk.GetRichTextNameToken( typeof( PerkBulletAccuracy ) )} {Perk.GetRichTextToken( nameof( PerkBulletAccuracy ), level: AccuracyPerkLevel )} Lvl {AccuracyPerkLevel}";

	public override void OnRunStart()
	{
		base.OnRunStart();

		Manager.Instance.Chat.AddLocalChatMessage( $"Got {Perk.GetRichTextNameToken( typeof( PerkZoomOut ) )} {Perk.GetRichTextToken( nameof( PerkZoomOut ), level: ZoomOutPerkLevel )} and {Perk.GetRichTextNameToken( typeof( PerkBulletAccuracy ) )} {Perk.GetRichTextToken( nameof( PerkBulletAccuracy ), level: AccuracyPerkLevel )} Lvl {AccuracyPerkLevel}", from: "" );

		for( int i = 0; i < ZoomOutPerkLevel; i++ )
			Player.AddPerk( TypeLibrary.GetType( typeof( PerkZoomOut ) ) );

		for ( int i = 0; i < AccuracyPerkLevel; i++ )
			Player.AddPerk( TypeLibrary.GetType( typeof( PerkBulletAccuracy ) ) );
	}
}