static bool DoIncludeWaveSpec(WaveSpecifics waveSpec, int includeLevel, int includeWave)
        {
            // no level filter: everything passes
            if (includeLevel == 0)
            {
                return(true);
            }

            // level filter set. only matching levels pass
            if (waveSpec.SpawnLevelNumber != (includeLevel - 1))
            {
                return(false);
            }

            if (includeWave == 0)
            {
                return(true);
            }

            return(waveSpec.SpawnWaveNumber == (includeWave - 1));
        }
 public virtual void WaveRepeat(WaveSpecifics spec)
 {
     // Please do not manipulate values in the "spec". It is for your read-only information
 }
    public static WaveSpecifics CloneWave(WaveSpecifics sourceWave)
    {
        var clone = new WaveSpecifics {
            isExpanded             = sourceWave.isExpanded,
            enableWave             = sourceWave.enableWave,
            visualizeWave          = sourceWave.visualizeWave,
            SpawnLevelNumber       = sourceWave.SpawnLevelNumber,
            SpawnWaveNumber        = sourceWave.SpawnWaveNumber,
            prefabToSpawn          = sourceWave.prefabToSpawn,
            spawnSource            = sourceWave.spawnSource,
            prefabPoolIndex        = sourceWave.prefabPoolIndex,
            prefabPoolName         = sourceWave.prefabPoolName,
            repeatWaveUntilNew     = sourceWave.repeatWaveUntilNew,
            waveCompletePercentage = sourceWave.waveCompletePercentage,

            curWaveRepeatMode       = sourceWave.curWaveRepeatMode,
            curTimedRepeatWaveMode  = sourceWave.curTimedRepeatWaveMode,
            resetOnItemLimitReached = sourceWave.resetOnItemLimitReached,
            resetOnTimeLimitReached = sourceWave.resetOnTimeLimitReached,
            repeatPassCriteria      = sourceWave.repeatPassCriteria,

            waveRepeatBonusesEnabled    = sourceWave.waveRepeatBonusesEnabled,
            waveRepeatVariableModifiers = sourceWave.waveRepeatVariableModifiers,
            waveRepeatFireEvents        = sourceWave.waveRepeatFireEvents,
            waveRepeatCustomEvents      = sourceWave.waveRepeatCustomEvents,

            positionExpanded = sourceWave.positionExpanded,
            positionXmode    = sourceWave.positionXmode,
            positionYmode    = sourceWave.positionYmode,
            positionZmode    = sourceWave.positionZmode,

            curRotationMode = sourceWave.curRotationMode,
            customRotation  = sourceWave.customRotation,

            enableLimits = sourceWave.enableLimits,

            enableRandomizations = sourceWave.enableRandomizations,
            randomXRotation      = sourceWave.randomXRotation,
            randomYRotation      = sourceWave.randomYRotation,
            randomZRotation      = sourceWave.randomZRotation,

            enableIncrements = sourceWave.enableIncrements,
            enableKeepCenter = sourceWave.enableKeepCenter,

            waveOffsetList = sourceWave.waveOffsetList,

            enablePostSpawnNudge = sourceWave.enablePostSpawnNudge,
        };

        KillerVariablesHelper.CloneKillerInt(clone.MinToSpwn, sourceWave.MinToSpwn);
        KillerVariablesHelper.CloneKillerInt(clone.MaxToSpwn, sourceWave.MaxToSpwn);
        KillerVariablesHelper.CloneKillerFloat(clone.WaveDelaySec, sourceWave.WaveDelaySec);
        KillerVariablesHelper.CloneKillerFloat(clone.TimeToSpawnEntireWave, sourceWave.TimeToSpawnEntireWave);
        KillerVariablesHelper.CloneKillerFloat(clone.repeatPauseMinimum, sourceWave.repeatPauseMinimum);
        KillerVariablesHelper.CloneKillerFloat(clone.repeatPauseMaximum, sourceWave.repeatPauseMaximum);
        KillerVariablesHelper.CloneKillerInt(clone.repeatItemInc, sourceWave.repeatItemInc);
        KillerVariablesHelper.CloneKillerInt(clone.repeatItemMinLmt, sourceWave.repeatItemMinLmt);
        KillerVariablesHelper.CloneKillerInt(clone.repeatItemLmt, sourceWave.repeatItemLmt);
        KillerVariablesHelper.CloneKillerFloat(clone.repeatTimeInc, sourceWave.repeatTimeInc);
        KillerVariablesHelper.CloneKillerFloat(clone.repeatTimeMinLmt, sourceWave.repeatTimeMinLmt);
        KillerVariablesHelper.CloneKillerFloat(clone.repeatTimeLmt, sourceWave.repeatTimeLmt);
        KillerVariablesHelper.CloneKillerInt(clone.repetitionsToDo, sourceWave.repetitionsToDo);
        KillerVariablesHelper.CloneKillerFloat(clone.customPosX, sourceWave.customPosX);
        KillerVariablesHelper.CloneKillerFloat(clone.customPosY, sourceWave.customPosY);
        KillerVariablesHelper.CloneKillerFloat(clone.customPosZ, sourceWave.customPosZ);
        KillerVariablesHelper.CloneKillerFloat(clone.doNotSpawnIfMbrCloserThan, sourceWave.doNotSpawnIfMbrCloserThan);
        KillerVariablesHelper.CloneKillerFloat(clone.doNotSpawnRandomDist, sourceWave.doNotSpawnRandomDist);
        KillerVariablesHelper.CloneKillerFloat(clone.randomDistX, sourceWave.randomDistX);
        KillerVariablesHelper.CloneKillerFloat(clone.randomDistY, sourceWave.randomDistY);
        KillerVariablesHelper.CloneKillerFloat(clone.randomDistZ, sourceWave.randomDistZ);
        KillerVariablesHelper.CloneKillerFloat(clone.randomXRotMin, sourceWave.randomXRotMin);
        KillerVariablesHelper.CloneKillerFloat(clone.randomXRotMax, sourceWave.randomXRotMax);
        KillerVariablesHelper.CloneKillerFloat(clone.randomYRotMin, sourceWave.randomYRotMin);
        KillerVariablesHelper.CloneKillerFloat(clone.randomYRotMax, sourceWave.randomYRotMax);
        KillerVariablesHelper.CloneKillerFloat(clone.randomZRotMin, sourceWave.randomZRotMin);
        KillerVariablesHelper.CloneKillerFloat(clone.randomZRotMax, sourceWave.randomZRotMax);
        KillerVariablesHelper.CloneKillerFloat(clone.incrementPositionX, sourceWave.incrementPositionX);
        KillerVariablesHelper.CloneKillerFloat(clone.incrementPositionY, sourceWave.incrementPositionY);
        KillerVariablesHelper.CloneKillerFloat(clone.incrementPositionZ, sourceWave.incrementPositionZ);
        KillerVariablesHelper.CloneKillerFloat(clone.incrementRotX, sourceWave.incrementRotX);
        KillerVariablesHelper.CloneKillerFloat(clone.incrementRotY, sourceWave.incrementRotY);
        KillerVariablesHelper.CloneKillerFloat(clone.incrementRotZ, sourceWave.incrementRotZ);
        KillerVariablesHelper.CloneKillerFloat(clone.postSpawnNudgeFwd, sourceWave.postSpawnNudgeFwd);
        KillerVariablesHelper.CloneKillerFloat(clone.postSpawnNudgeRgt, sourceWave.postSpawnNudgeRgt);
        KillerVariablesHelper.CloneKillerFloat(clone.postSpawnNudgeDwn, sourceWave.postSpawnNudgeDwn);

        return(clone);
    }
 public virtual void EliminationWaveCompleted(WaveSpecifics spec)   // called at the end of each wave, whether or not it is repeating. This is called before the Repeat delay
 // Please do not manipulate values in the "spec". It is for your read-only information
 {
 }