guns/GunSniper.cs

A Gun subclass for a sniper item that sets up default perks when a run starts. It defines item id and perk levels, exposes a Description string, announces the perks to local chat, and adds the PerkZoomOut and PerkBulletAccuracy perks to the player on run start.

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 ) ) );
	}
}