Jobs.cs

Static job catalog for the HorizonRP gamemode. Defines the JobDefinition record and a list of jobs with salary, color, icon, player cap and admin flag, plus lookup helpers by id.

namespace HorizonRP;

/// <summary>
/// Un métier du serveur. Tout est décrit ici, côté code, et lu à l'identique par
/// le serveur et par les clients : le serveur décide, le client affiche.
/// </summary>
public sealed record JobDefinition(
	string Id,
	string Name,
	string Description,
	int Salary,
	string Color,
	string Icon,
	int MaxPlayers = 0,      // 0 = sans limite
	bool AdminOnly = false );

public static class Jobs
{
	/// <summary>Le métier qu'on reçoit en arrivant et en mourant.</summary>
	public const string DefaultId = "citoyen";

	/// <summary>
	/// Le catalogue. L'ordre est celui du menu F4. Un Id ne se change pas une fois
	/// le serveur ouvert : c'est lui qui est enregistré dans les profils.
	/// </summary>
	public static readonly IReadOnlyList<JobDefinition> All = new List<JobDefinition>
	{
		new( "citoyen", "Citoyen", "Un habitant d'Union City. Libre de faire sa vie.", 50, "#7dd3fc", "person" ),
		// Sur liste blanche (effectifs de l'UCPD, panneau web) : HorizonGame.TryChangeJob refuse les autres.
		// La paie affichée est celle d'un agent ; en jeu, c'est celle du grade, en service seulement.
		new( "policier", "Policier", "UCPD, sur liste blanche : fait respecter la loi et protège les citoyens. Service au vestiaire du commissariat.", 120, "#3b82f6", "local_police" ),
		// Les secours de l'UCFD (l'id reste « medecin », enregistré dans les profils), sur liste blanche
		// comme la police (Ems/EmsRules.cs, effectifs de la page EMS du panneau) : seuls à réanimer un
		// inconscient, en service. La paie affichée est celle d'un ambulancier ; en jeu, celle du grade.
		new( "medecin", "EMS", "UCFD EMS, sur liste blanche : secourt les blessés et réanime les inconscients avant qu'il soit trop tard. Service au vestiaire de l'hôpital.", 105, "#22c55e", "medical_services", MaxPlayers: 4 ),
		new( "mecanicien", "Mécanicien", "Répare et vend des véhicules.", 90, "#f59e0b", "build", MaxPlayers: 4 ),
		new( "cuisinier", "Cuisinier", "Nourrit Union City, une assiette à la fois.", 80, "#f97316", "restaurant", MaxPlayers: 3 ),
		new( "gangster", "Gangster", "Vit en marge de la loi. Attention à la police.", 60, "#ef4444", "masks", MaxPlayers: 8 ),
		new( "maire", "Maire", "Dirige la ville et fixe les lois.", 200, "#eab308", "account_balance", MaxPlayers: 1 ),
		new( "staff", "Staff", "Équipe de modération d'Horizon RP.", 0, "#a855f7", "shield", AdminOnly: true ),
	};

	public static JobDefinition Get( string id )
	{
		return All.FirstOrDefault( x => x.Id == id ) ?? All.First( x => x.Id == DefaultId );
	}

	public static bool Exists( string id ) => All.Any( x => x.Id == id );
}