/*
 * Author: jaynus
 *
 * Master single PFH abstraction for all rounds being tracked by frag/spall
 *
 * Arguments:
 *
 *
 * Return Value:
 * None
 */
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
//PARAMS_2(_pfhArgs,_handle);

if (!GVAR(enabled)) exitWith {};

private["_gcIndex", "_iter"];
_gcIndex = [];

_iter = 0;
while { (count GVAR(objects)) > 0 &&  { _iter < (GVAR(MaxTrackPerFrame) min (count GVAR(objects))) } } do {
    private["_object", "_args"];
    if(GVAR(lastIterationIndex) >= (count GVAR(objects))) then {
        GVAR(lastIterationIndex) = 0;
    };
    _object = GVAR(objects) select GVAR(lastIterationIndex);

    if(!isNil "_object") then {
        _args = GVAR(arguments) select GVAR(lastIterationIndex);

        if(!(_args call FUNC(pfhRound))) then {
            _gcIndex pushBack GVAR(lastIterationIndex);    // Add it to the GC if it returns false
        };
    };
    _iter = _iter + 1;
    GVAR(lastIterationIndex) = GVAR(lastIterationIndex) + 1;
};

// clean up dead object references
private["_deletionCount", "_deleteIndex"];
_deletionCount = 0;
{
    TRACE_1("GC Projectile", _x);
    _deleteIndex = _x - _deletionCount;
    GVAR(objects) deleteAt _deleteIndex;
    GVAR(arguments) deleteAt _deleteIndex;

    _deletionCount = _deletionCount + 1;
} forEach _gcIndex;