GameLogic/crowd/CrowdConfig.cs
using System.Collections.Generic;
using Sandbox;

[GameResource( "Crowd Ruleset Config", "crowd", "Table de configuration des réactions, scores et sons de la foule.", Icon = "theater_comedy" )]
public sealed class CrowdConfig : GameResource
{
    [Property, Group( "Règles d'Anti-Spam (Répétition)" )]
    [Description( "Taille de l'historique d'actions analysé pour détecter le spam." )]
    public int RepetitionHistorySize { get; set; } = 8;

    [Property, Group( "Règles d'Anti-Spam (Répétition)" )]
    [Description( "Nombre d'occurrences identiques dans l'historique avant de déclencher la huée." )]
    public int MaxRepetitionThreshold { get; set; } = 3;

    [Property, Group( "Règles d'Anti-Spam (Répétition)" )]
    public float RepetitionAuraPenalty { get; set; } = -8f;

    [Property, Group( "Règles d'Anti-Spam (Répétition)" )]
    public SoundEvent CrowdRepetitionBooSound { get; set; }

    [Property, Group( "Actions de Combat" )]
    public List<CrowdActionDefinition> Actions { get; set; } = new();

    public CrowdActionDefinition GetDefinition( CrowdAction action )
    {
        for ( int i = 0; i < Actions.Count; i++ )
        {
            if ( Actions[i].Action == action )
                return Actions[i];
        }
        return null;
    }
}

public sealed class CrowdActionDefinition
{
    [Property] public CrowdAction Action { get; set; }
    [Property] public float AuraDelta { get; set; } = 5f;

    [Property, Group( "Affichage Feed" )] public bool ShowInFeed { get; set; } = true;
    [Property, Group( "Affichage Feed" )] public string Title { get; set; } = "ACTION";
    [Property, Group( "Affichage Feed" )] public string ModifierText { get; set; } = "+";
    [Property, Group( "Affichage Feed" )] public Color DisplayColor { get; set; } = Color.White;

    [Property, Group( "Audio Foule" )]
    [Description( "Son joué par la foule (hurlement de joie, stupeur, etc.)" )]
    public SoundEvent CrowdSound { get; set; }

    [Property, Group( "Répétition" )]
    [Description( "Si vrai, cette action est prise en compte dans l'algorithme anti-spam." )]
    public bool TrackForRepetition { get; set; } = true;
}