QuestDefs.cs

Static partial ProgressManager method that defines quest groups and quest definitions used by the game. It builds an array of QuestGroup objects, each with Tab, Name, and a list of QuestDef entries containing ids, display strings, stats, level targets, rewards, icons, and colors.

using Sandbox;

public static partial class ProgressManager
{
	private static QuestGroup[] GetQuestGroups()
	{
		var cc = new Color( 0.85f, 0.25f, 0.25f ); // combat
		var ec = new Color( 0.25f, 0.65f, 0.85f ); // exploration
		var lc = new Color( 0.85f, 0.75f, 0.20f ); // collection
		var sc = new Color( 0.35f, 0.80f, 0.40f ); // survival

		return new QuestGroup[]
		{
			new QuestGroup( Tab: 0, Name: "Combat", Quests: new QuestDef[]
			{
				new QuestDef
				{
					Id            = QuestId.KillEnemies,
					Name          = "Kill {0} Enemies",
					Description   = "",
					Stat          = ProgressStat.EnemyKills,
					LevelTargets  = new[] { 100, 250, 500, 1000, 2000, 3000, 4000, 5000, 10000 },
					RewardAmounts = new[] { 2, 3, 4, 5, 6, 7, 8, 9, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillMinibosses,
					Name          = "Kill {0} Minibosses",
					Description   = "Minibosses are the elite enemies with a health bar.",
					Stat          = ProgressStat.MinibossKills,
					LevelTargets  = new[] { 1, 5, 20 },
					RewardAmounts = new[] { 5, 9, 14 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillBosses,
					Name          = "Kill {0} Bosses",
					Description   = "Defeat the final boss at the end of a run.",
					Stat          = ProgressStat.BossKills,
					LevelTargets  = new[] { 1, 3 },
					RewardAmounts = new[] { 8, 16 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.DealDamage,
					Name          = "Deal {0} Damage",
					Description   = "",
					Stat          = ProgressStat.DamageDealt,
					LevelTargets  = new[] { 10000, 50000 },
					RewardAmounts = new[] { 4, 8 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.ExecuteEnemies,
					Name          = "Execute {0} Enemies",
					Description   = "Requires the Execution perk.",
					Stat          = ProgressStat.EnemiesExecuted,
					LevelTargets  = new[] { 10, 50, 200 },
					RewardAmounts = new[] { 4, 7, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillWithExplosions,
					Name          = "Kill {0} Enemies with Explosions",
					Description   = "",
					Stat          = ProgressStat.ExplosionKills,
					LevelTargets  = new[] { 50, 250, 1000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.BounceWithBullets,
					Name          = "Bounce Bullets {0} Times",
					Description   = "Requires a perk that grants bullet bounces.",
					Stat          = ProgressStat.BulletBounces,
					LevelTargets  = new[] { 500, 2000, 5000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.PierceWithBullets,
					Name          = "Pierce Bullets {0} Times",
					Description   = "Requires a perk that grants bullet piercing.",
					Stat          = ProgressStat.BulletPierces,
					LevelTargets  = new[] { 500, 2000, 5000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.TakeDamage,
					Name          = "Take {0} Damage",
					Description   = "",
					Stat          = ProgressStat.DamageTaken,
					LevelTargets  = new[] { 5000, 20000, 50000 },
					RewardAmounts = new[] { 4, 7, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.TakeSelfDamage,
					Name          = "Deal {0} Self Damage",
					Description   = "Damage you deal to yourself.",
					Stat          = ProgressStat.SelfDamageTaken,
					LevelTargets  = new[] { 500, 2000, 5000 },
					RewardAmounts = new[] { 4, 7, 11 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.BlockDamageWithArmor,
					Name          = "Block {0} Damage with Armor",
					Description   = "",
					Stat          = ProgressStat.ArmorDamageBlocked,
					LevelTargets  = new[] { 1000, 5000, 15000 },
					RewardAmounts = new[] { 4, 7, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.FreezeEnemies,
					Name          = "Freeze {0} Enemies",
					Description   = "Requires a perk or loadout that applies freeze.",
					Stat          = ProgressStat.EnemiesFrozen,
					LevelTargets  = new[] { 50, 250, 1000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.DealPoisonDamage,
					Name          = "Deal {0} Poison Damage",
					Description   = "Damage dealt by poison status counts.",
					Stat          = ProgressStat.PoisonDamageDealt,
					LevelTargets  = new[] { 1000, 5000, 20000 },
					RewardAmounts = new[] { 4, 7, 11 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.DealBuzzsawDamage,
					Name          = "Deal {0} Buzzsaw Damage",
					Description   = "Damage dealt by orbiting blade perks.",
					Stat          = ProgressStat.BuzzsawDamageDealt,
					LevelTargets  = new[] { 500, 2500, 10000 },
					RewardAmounts = new[] { 4, 7, 11 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.DealFireDamage,
					Name          = "Deal {0} Fire Damage",
					Description   = "Deal damage with fire sources.",
					Stat          = ProgressStat.FireDamageDealt,
					LevelTargets  = new[] { 1000, 5000, 20000 },
					RewardAmounts = new[] { 4, 7, 11 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillWithBoomerangs,
					Name          = "Kill {0} Enemies with Boomerangs",
					Description   = "Requires a boomerang loadout or perk.",
					Stat          = ProgressStat.BoomerangKills,
					LevelTargets  = new[] { 50, 250, 1000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.DestroyFlyingSkullsDashing,
					Name          = "Destroy {0} Flying Skulls by Dashing",
					Description   = "Dash through homing flying skulls to destroy them.",
					Stat          = ProgressStat.FlyingSkullsDashDestroyed,
					LevelTargets  = new[] { 10, 50, 200 },
					RewardAmounts = new[] { 4, 7, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.ScareEnemies,
					Name          = "Scare {0} Enemies",
					Description   = "Apply the Fear status to enemies.",
					Stat          = ProgressStat.EnemiesScared,
					LevelTargets  = new[] { 50, 250, 1000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.DealRadiationDamage,
					Name          = "Deal {0} Radiation Damage",
					Description   = "Requires the Radiation perk.",
					Stat          = ProgressStat.RadiationDamageDealt,
					LevelTargets  = new[] { 5000, 25000, 100000 },
					RewardAmounts = new[] { 4, 7, 11 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.LandCriticalHits,
					Name          = "Land {0} Critical Hits",
					Description   = "Critical hits from any source count.",
					Stat          = ProgressStat.CriticalHits,
					LevelTargets  = new[] { 250, 1000, 3000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillWithShock,
					Name          = "Kill {0} Enemies with Shock",
					Description   = "Enemies finished by shock damage count.",
					Stat          = ProgressStat.ShockKills,
					LevelTargets  = new[] { 25, 100, 400 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillEliteZombies,
					Name          = "Kill {0} Elite Zombies",
					Description   = "",
					Stat          = ProgressStat.ZombieEliteKills,
					LevelTargets  = new[] { 25, 100, 400 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillEliteChargers,
					Name          = "Kill {0} Elite Chargers",
					Description   = "",
					Stat          = ProgressStat.ChargerEliteKills,
					LevelTargets  = new[] { 25, 100, 400 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillEliteSpikers,
					Name          = "Kill {0} Elite Spikers",
					Description   = "",
					Stat          = ProgressStat.SpikerEliteKills,
					LevelTargets  = new[] { 25, 100, 400 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillEliteSpitters,
					Name          = "Kill {0} Elite Spitters",
					Description   = "",
					Stat          = ProgressStat.SpitterEliteKills,
					LevelTargets  = new[] { 25, 100, 400 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillEliteWerewolves,
					Name          = "Kill {0} Elite Werewolves",
					Description   = "",
					Stat          = ProgressStat.RunnerEliteKills,
					LevelTargets  = new[] { 25, 100, 400 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillEliteExploders,
					Name          = "Kill {0} Elite Exploders",
					Description   = "",
					Stat          = ProgressStat.ExploderEliteKills,
					LevelTargets  = new[] { 25, 100, 400 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.KillExploderMinis,
					Name          = "Kill {0} Mini Exploders",
					Description   = "",
					Stat          = ProgressStat.ExploderMiniKills,
					LevelTargets  = new[] { 50, 250, 1000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},

				new QuestDef
				{
					Id            = QuestId.GetHitByProjectiles,
					Name          = "Get Hit by {0} Projectiles",
					Description   = "Spitter projectiles, flying skulls, and tossed fireballs count.",
					Stat          = ProgressStat.ProjectileHits,
					LevelTargets  = new[] { 100, 500, 2000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = cc,
				},
			} ),

			new QuestGroup( Tab: 1, Name: "Exploration", Quests: new QuestDef[]
			{
				new QuestDef
				{
					Id            = QuestId.CompleteRuns,
					Name          = "Complete {0} Runs",
					Description   = "Counts win or loss — just finish the run.",
					Stat          = ProgressStat.TotalRuns,
					LevelTargets  = new[] { 3, 10, 25, 50 },
					RewardAmounts = new[] { 5, 8, 12, 18 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = ec,
				},

				//new QuestDef
				//{
				//	Id            = QuestId.WinRuns,
				//	Name          = "Win {0} Runs",
				//	Description   = "",
				//	Stat          = ProgressStat.RunsWon,
				//	LevelTargets  = new[] { 3, 5, 15, 20 },
				//	RewardAmounts = new[] { 100, 500 },
				//	RewardIcon    = "/textures/ui/coin.png",
				//	Color         = ec,
				//},

				new QuestDef
				{
					Id            = QuestId.DestroyBarrels,
					Name          = "Destroy {0} Barrels",
					Description   = "Normal and exploding barrels both count.",
					Stat          = ProgressStat.BarrelsDestroyed,
					LevelTargets  = new[] { 25, 100, 300 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = ec,
				},

				new QuestDef
				{
					Id            = QuestId.OpenChests,
					Name          = "Open {0} Chests",
					Description   = "",
					Stat          = ProgressStat.ChestsOpened,
					LevelTargets  = new[] { 10, 50, 150 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = ec,
				},

				new QuestDef
				{
					Id            = QuestId.OpenEvilChests,
					Name          = "Open {0} Evil Chests",
					Description   = "The dark chests that spawn hazards when opened.",
					Stat          = ProgressStat.EvilChestsOpened,
					LevelTargets  = new[] { 5, 20, 50 },
					RewardAmounts = new[] { 4, 7, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = ec,
				},

				new QuestDef
				{
					Id            = QuestId.DisturbMushrooms,
					Name          = "Disturb {0} Mushrooms",
					Description   = "Get close enough to trigger a mushroom explosion.",
					Stat          = ProgressStat.MushroomsDisturbed,
					LevelTargets  = new[] { 10, 50, 150 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = ec,
				},
			} ),

			new QuestGroup( Tab: 2, Name: "Collection", Quests: new QuestDef[]
			{
				new QuestDef
				{
					Id            = QuestId.CollectPerks,
					Name          = "Collect {0} Perks",
					Description   = "",
					Stat          = ProgressStat.PerksCollected,
					LevelTargets  = new[] { 1, 10, 50, 100 },
					RewardAmounts = new[] { 2, 4, 8, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = lc,
				},

				new QuestDef
				{
					Id            = QuestId.CollectItems,
					Name          = "Collect {0} Items",
					Description   = "Pick up health packs, rerolls, magnets, and other items.",
					Stat          = ProgressStat.ItemsCollected,
					LevelTargets  = new[] { 25, 100, 300 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = lc,
				},

				new QuestDef
				{
					Id            = QuestId.GetUniquePerks,
					Name          = "Get {0} Unique Perks",
					Description   = "The rare yellow perks.",
					Stat          = ProgressStat.UniquePerksCollected,
					LevelTargets  = new[] { 1, 10, 30 },
					RewardAmounts = new[] { 5, 9, 15 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = lc,
				},

				new QuestDef
				{
					Id            = QuestId.GetCurses,
					Name          = "Get {0} Curses",
					Description   = "",
					Stat          = ProgressStat.CursesCollected,
					LevelTargets  = new[] { 5, 25, 75 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = lc,
				},

				new QuestDef
				{
					Id            = QuestId.GetMagnets,
					Name          = "Collect {0} Magnets",
					Description   = "",
					Stat          = ProgressStat.MagnetsCollected,
					LevelTargets  = new[] { 10, 50, 150 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = lc,
				},

				new QuestDef
				{
					Id            = QuestId.RerollPerks,
					Name          = "Reroll {0} Times",
					Description   = "",
					Stat          = ProgressStat.Rerolls,
					LevelTargets  = new[] { 25, 100, 300 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = lc,
				},

				new QuestDef
				{
					Id            = QuestId.BanishPerks,
					Name          = "Banish {0} Perks",
					Description   = "",
					Stat          = ProgressStat.PerksBanished,
					LevelTargets  = new[] { 10, 50, 150 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = lc,
				},

				new QuestDef
				{
					Id            = QuestId.CollectXpCoins,
					Name          = "Collect {0} XP Coins",
					Description   = "Pick up XP coins dropped by enemies.",
					Stat          = ProgressStat.XpCoinsCollected,
					LevelTargets  = new[] { 500, 2000, 5000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = lc,
				},

				new QuestDef
				{
					Id            = QuestId.MaxOutPerks,
					Name          = "Max Out {0} Perks",
					Description   = "Upgrade a perk to its maximum level.",
					Stat          = ProgressStat.PerkMaxedOut,
					LevelTargets  = new[] { 10, 25, 50, 100 },
					RewardAmounts = new[] { 2, 4, 6, 8 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = lc,
				},

				new QuestDef
				{
					Id            = QuestId.CollectHealthPacks,
					Name          = "Collect {0} Health Packs",
					Description   = "Pick up health packs during runs.",
					Stat          = ProgressStat.HealthPacksCollected,
					LevelTargets  = new[] { 10, 50, 150 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = lc,
				},
			} ),

			new QuestGroup( Tab: 3, Name: "Survival", Quests: new QuestDef[]
			{
				new QuestDef
				{
					Id            = QuestId.StandStill,
					Name          = "Stand Still for {0} Seconds",
					Description   = "Cumulative across all runs.",
					Stat          = ProgressStat.SecondsStandingStill,
					LevelTargets  = new[] { 3600, 10800, 36000 },
					RewardAmounts = new[] { 4, 7, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = sc,
				},

				new QuestDef
				{
					Id            = QuestId.HealHp,
					Name          = "Heal {0} HP",
					Description   = "",
					Stat          = ProgressStat.HpHealed,
					LevelTargets  = new[] { 2000, 10000, 30000 },
					RewardAmounts = new[] { 4, 7, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = sc,
				},

				new QuestDef
				{
					Id            = QuestId.DieDeaths,
					Name          = "Die {0} Times",
					Description   = "Progress carries across all runs.",
					Stat          = ProgressStat.Deaths,
					LevelTargets  = new[] { 5, 20, 50 },
					RewardAmounts = new[] { 2, 5, 8 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = sc,
				},

				new QuestDef
				{
					Id            = QuestId.DodgeTimes,
					Name          = "Dodge {0} Times",
					Description   = "Requires a perk or loadout that grants dodge chance.",
					Stat          = ProgressStat.TimesDodged,
					LevelTargets  = new[] { 50, 250, 1000 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = sc,
				},

				new QuestDef
				{
					Id            = QuestId.LoseShield,
					Name          = "Lose your Shield {0} Times",
					Description   = "Requires a perk that grants shields.",
					Stat          = ProgressStat.ShieldsLost,
					LevelTargets  = new[] { 10, 50, 150 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = sc,
				},

				new QuestDef
				{
					Id            = QuestId.DashTimes,
					Name          = "Dash {0} Times",
					Description   = "",
					Stat          = ProgressStat.TimesDashed,
					LevelTargets  = new[] { 1000, 5000, 20000 },
					RewardAmounts = new[] { 4, 7, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = sc,
				},

				new QuestDef
				{
					Id            = QuestId.SurviveAfterBoss,
					Name          = "Survive {0} Seconds After the Boss Arrives",
					Description   = "Cumulative across all runs.",
					Stat          = ProgressStat.SecondsAfterBoss,
					LevelTargets  = new[] { 60, 300, 900 },
					RewardAmounts = new[] { 4, 7, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = sc,
				},

				new QuestDef
				{
					Id            = QuestId.SurviveAtOneHp,
					Name          = "Survive {0} Seconds at 1 HP",
					Description   = "Only full seconds while exactly 1 HP count.",
					Stat          = ProgressStat.SecondsAtOneHp,
					LevelTargets  = new[] { 30, 120, 300 },
					RewardAmounts = new[] { 4, 7, 12 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = sc,
				},

				new QuestDef
				{
					Id            = QuestId.ReviveTimes,
					Name          = "Revive {0} Times",
					Description   = "Come back to life during a run.",
					Stat          = ProgressStat.Revives,
					LevelTargets  = new[] { 5, 20, 50 },
					RewardAmounts = new[] { 3, 6, 10 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = sc,
				},

				new QuestDef
				{
					Id            = QuestId.HealOtherPlayers,
					Name          = "Restore {0} HP to Teammates",
					Description   = "Healing done to other players counts.",
					Stat          = ProgressStat.HpHealedOthers,
					LevelTargets  = new[] { 500, 2500, 10000 },
					RewardAmounts = new[] { 4, 7, 11 },
					RewardIcon    = "/textures/ui/coin.png",
					Color         = sc,
				},
			} ),

			new QuestGroup( Tab: 4, Name: "Achievements", Quests: new QuestDef[] { } ),
		};
	}
}