/**
 *  Mutator that replicates and diplayes on clients information about how many
 *  zeds are spawned and with what recent spawn rate.
 */
class KFZedsReportMut extends Mutator;

//  How often should we update our information?
var config float updateInterval;
//  Over what interval do we count average spawn rate?
var config float smoothingInterval;

var bool interactionAdded;

var array<float> zedSpawnTimes;

var int     repCurrentTotalZeds, repGameInfo_MaxMonsters;
var float   repCurrentSpawnRate;

replication
{
    reliable if(Role == ROLE_Authority)
        repCurrentTotalZeds, repGameInfo_MaxMonsters, repCurrentSpawnRate;
}

function PostBeginPlay()
{
    if (updateInterval <= 0) {
        updateInterval = 0.25;
    }
    if (smoothingInterval <= 0) {
        smoothingInterval = 10.0;
    }
    SetTimer(updateInterval, true);
}

function bool CheckReplacement(Actor other, out byte bSuperRelevant)
{
    if (Monster(other) != none) {
        zedSpawnTimes[zedSpawnTimes.length] = level.timeSeconds;
    }
    return true;
}

simulated function Tick(float delta)
{
    local ReportInteraction myInteraction;
    local Player            localPlayer;
    if (role == Role_AUTHORITY) return;
    if (interactionAdded)       return;
    localPlayer = level.GetLocalPlayerController().player;
    if (localPlayer == none)    return;

    myInteraction = ReportInteraction(localPlayer.interactionMaster
        .AddInteraction("KFZedsReport.ReportInteraction", localPlayer));
    if (myInteraction != none)
    {
        myInteraction.reportMutator = self;
        interactionAdded = true;
    }
}

function Timer()
{
    local int       i;
    local float     cutOffTime;
    local Monster   nextMonster;
    cutOffTime = level.timeSeconds - smoothingInterval;
    while (i < zedSpawnTimes.length)
    {
        if (zedSpawnTimes[i] < cutOffTime) {
            zedSpawnTimes.Remove(i, 1);
        }
        else {
            i += 1;
        }
    }
    //  Update replicated values
    repGameInfo_MaxMonsters = KFGameType(level.game).maxMonsters;
    repCurrentSpawnRate = zedSpawnTimes.length / smoothingInterval;
    repCurrentTotalZeds = 0;
    foreach level.DynamicActors(class'Monster', nextMonster)
    {
        if (nextMonster.health > 0) {
            repCurrentTotalZeds += 1;
        }
    }
}

defaultproperties
{
    //  Mutator description
    GroupName       = "Test mutatros"
    FriendlyName    = "Zed report mutator"
    Description     = "Mutator that provides clients with information about how many zeds (and their spawn rate) are present on the map."
    bAddToServerPackages = true
    bAlwaysRelevant = true
    RemoteRole      = ROLE_SimulatedProxy
    //  Default config values
    updateInterval      = 0.25
    smoothingInterval   = 10.0
}