public override object Read(ES2Reader reader)
    {
        TrainingModifier data = new TrainingModifier();

        Read(reader, data);
        return(data);
    }
    public override void Read(ES2Reader reader, object c)
    {
        TrainingModifier data = (TrainingModifier)c;
        // Add your reader.Read calls here to read the data into the object.
        // Read the version number.
        int fileVersion = reader.Read <int>();

        // VERSION 0:
        if (fileVersion >= 0)
        {
            data.adoptionRate            = reader.Read <float>();
            data.beginMaxAngle           = reader.Read <float>();
            data.beginMaxDistance        = reader.Read <float>();
            data.beginMaxTime            = reader.Read <float>();
            data.beginMinAngle           = reader.Read <float>();
            data.beginMinDistance        = reader.Read <float>();
            data.beginMinTime            = reader.Read <float>();
            data.decayEffectOverDuration = reader.Read <bool>();
            data.duration                   = reader.Read <int>();
            data.endMaxAngle                = reader.Read <float>();
            data.endMaxDistance             = reader.Read <float>();
            data.endMaxTime                 = reader.Read <float>();
            data.endMinAngle                = reader.Read <float>();
            data.endMinDistance             = reader.Read <float>();
            data.endMinTime                 = reader.Read <float>();
            data.forward                    = reader.Read <bool>();
            data.horizontal                 = reader.Read <bool>();
            data.largeBrainPenalty          = reader.Read <float>();
            data.largeSpeciesPenalty        = reader.Read <float>();
            data.linksPerNode               = reader.Read <float>();
            data.liveForever                = reader.Read <bool>();
            data.minMultiplier              = reader.Read <float>();
            data.modifierType               = reader.Read <TrainingModifier.TrainingModifierType>();
            data.nodesPerLink               = reader.Read <float>();
            data.numRounds                  = reader.Read <int>();
            data.removeLinkChance           = reader.Read <float>();
            data.removeNodeChance           = reader.Read <float>();
            data.speciesSimilarityThreshold = reader.Read <float>();
            data.startGen                   = reader.Read <int>();
            data.vertical                   = reader.Read <bool>();

            if (fileVersion >= 1)
            {
                // new attributes
            }
        }
    }
    public override void Write(object obj, ES2Writer writer)
    {
        TrainingModifier data = (TrainingModifier)obj;

        // Add your writer.Write calls here.
        writer.Write(0); // Version 1 is current version number
        // Make sure to edit Read() function to properly handle version control!
        // VERSION 0:
        writer.Write(data.adoptionRate);
        writer.Write(data.beginMaxAngle);
        writer.Write(data.beginMaxDistance);
        writer.Write(data.beginMaxTime);
        writer.Write(data.beginMinAngle);
        writer.Write(data.beginMinDistance);
        writer.Write(data.beginMinTime);
        writer.Write(data.decayEffectOverDuration);
        writer.Write(data.duration);
        writer.Write(data.endMaxAngle);
        writer.Write(data.endMaxDistance);
        writer.Write(data.endMaxTime);
        writer.Write(data.endMinAngle);
        writer.Write(data.endMinDistance);
        writer.Write(data.endMinTime);
        writer.Write(data.forward);
        writer.Write(data.horizontal);
        writer.Write(data.largeBrainPenalty);
        writer.Write(data.largeSpeciesPenalty);
        writer.Write(data.linksPerNode);
        writer.Write(data.liveForever);
        writer.Write(data.minMultiplier);
        writer.Write(data.modifierType);
        writer.Write(data.nodesPerLink);
        writer.Write(data.numRounds);
        writer.Write(data.removeLinkChance);
        writer.Write(data.removeNodeChance);
        writer.Write(data.speciesSimilarityThreshold);
        writer.Write(data.startGen);
        writer.Write(data.vertical);
        // VERSION 1:
    }
    public void ClickAddCurrentModifier() {

        TrainingModifier newModifier = new TrainingModifier();
        newModifier.modifierType = currentModifierType;

        newModifier.startGen = trainerModuleScript.gameController.masterTrainer.PlayingCurGeneration;        
        if (trainerModuleScript.gameController.masterTrainer.loadedTrainingSave != null) {
            newModifier.startGen += trainerModuleScript.gameController.masterTrainer.loadedTrainingSave.endGeneration;
        }

        switch (currentModifierType) {
            case TrainingModifier.TrainingModifierType.LinkExplosion:
                TrainingModifierLinkExplosionUI linkExplosionSettings = currentModifierPrefabGO.GetComponent<TrainingModifierLinkExplosionUI>();
                newModifier.linksPerNode = linkExplosionSettings.sliderLinksPerNode.value;
                newModifier.nodesPerLink = linkExplosionSettings.sliderNodesPerLink.value;
                break;

            case TrainingModifier.TrainingModifierType.MutationBlast:
                TrainingModifierMutationBlastUI mutationBlastSettings = currentModifierPrefabGO.GetComponent<TrainingModifierMutationBlastUI>();
                newModifier.duration = (int)mutationBlastSettings.sliderDuration.value;
                newModifier.minMultiplier = mutationBlastSettings.sliderMinMultiplier.value;
                newModifier.liveForever = mutationBlastSettings.toggleLiveForever.isOn;
                break;

            case TrainingModifier.TrainingModifierType.BodyMutationBlast:
                TrainingModifierBodyMutationBlastUI bodyMutationBlastSettings = currentModifierPrefabGO.GetComponent<TrainingModifierBodyMutationBlastUI>();
                newModifier.duration = (int)bodyMutationBlastSettings.sliderDuration.value;
                newModifier.minMultiplier = bodyMutationBlastSettings.sliderMinMultiplier.value;
                newModifier.liveForever = bodyMutationBlastSettings.toggleLiveForever.isOn;
                break;

            case TrainingModifier.TrainingModifierType.PruneBrain:
                TrainingModifierPruneBrainUI pruneBrainSettings = currentModifierPrefabGO.GetComponent<TrainingModifierPruneBrainUI>();
                newModifier.duration = (int)pruneBrainSettings.sliderDuration.value;
                newModifier.largeBrainPenalty = pruneBrainSettings.sliderLargeBrainPenalty.value;
                newModifier.removeLinkChance = pruneBrainSettings.sliderRemoveLinkChance.value;
                newModifier.removeNodeChance = pruneBrainSettings.sliderRemoveNodeChance.value;
                newModifier.liveForever = pruneBrainSettings.toggleLiveForever.isOn;
                newModifier.decayEffectOverDuration = pruneBrainSettings.toggleDecayEffectOverDuration.isOn;
                break;

            case TrainingModifier.TrainingModifierType.TargetCone:
                TrainingModifierTargetConeUI targetConeSettings = currentModifierPrefabGO.GetComponent<TrainingModifierTargetConeUI>();
                newModifier.duration = (int)targetConeSettings.sliderDuration.value;
                newModifier.numRounds = (int)targetConeSettings.sliderNumRounds.value;
                newModifier.beginMinDistance = targetConeSettings.sliderBeginMinDistance.value;
                newModifier.beginMaxDistance = targetConeSettings.sliderBeginMaxDistance.value;
                newModifier.endMinDistance = targetConeSettings.sliderEndMinDistance.value;
                newModifier.endMaxDistance = targetConeSettings.sliderEndMaxDistance.value;
                newModifier.beginMinAngle = targetConeSettings.sliderBeginMinAngle.value;
                newModifier.beginMaxAngle = targetConeSettings.sliderBeginMaxAngle.value;
                newModifier.endMinAngle = targetConeSettings.sliderEndMinAngle.value;
                newModifier.endMaxAngle = targetConeSettings.sliderEndMaxAngle.value;
                newModifier.liveForever = targetConeSettings.toggleLiveForever.isOn;
                newModifier.horizontal = targetConeSettings.toggleHorizontal.isOn;
                newModifier.vertical = targetConeSettings.toggleVertical.isOn;
                break;

            case TrainingModifier.TrainingModifierType.TargetForward:
                TrainingModifierTargetForwardUI targetForwardSettings = currentModifierPrefabGO.GetComponent<TrainingModifierTargetForwardUI>();
                newModifier.duration = (int)targetForwardSettings.sliderDuration.value;
                newModifier.numRounds = (int)targetForwardSettings.sliderNumRounds.value;
                newModifier.beginMinDistance = targetForwardSettings.sliderBeginMinDistance.value;
                newModifier.beginMaxDistance = targetForwardSettings.sliderBeginMaxDistance.value;
                newModifier.endMinDistance = targetForwardSettings.sliderEndMinDistance.value;
                newModifier.endMaxDistance = targetForwardSettings.sliderEndMaxDistance.value;
                newModifier.liveForever = targetForwardSettings.toggleLiveForever.isOn;
                break;

            case TrainingModifier.TrainingModifierType.TargetOmni:
                TrainingModifierTargetOmniUI targetOmniSettings = currentModifierPrefabGO.GetComponent<TrainingModifierTargetOmniUI>();
                newModifier.duration = (int)targetOmniSettings.sliderDuration.value;
                newModifier.numRounds = (int)targetOmniSettings.sliderNumRounds.value;
                newModifier.beginMinDistance = targetOmniSettings.sliderBeginMinDistance.value;
                newModifier.beginMaxDistance = targetOmniSettings.sliderBeginMaxDistance.value;
                newModifier.endMinDistance = targetOmniSettings.sliderEndMinDistance.value;
                newModifier.endMaxDistance = targetOmniSettings.sliderEndMaxDistance.value;
                newModifier.liveForever = targetOmniSettings.toggleLiveForever.isOn;
                newModifier.forward = targetOmniSettings.toggleForward.isOn;
                newModifier.horizontal = targetOmniSettings.toggleHorizontal.isOn;
                newModifier.vertical = targetOmniSettings.toggleVertical.isOn;
                break;

            case TrainingModifier.TrainingModifierType.VariableTrialTimes:
                TrainingModifierVariableTrialTimesUI trialTimesSettings = currentModifierPrefabGO.GetComponent<TrainingModifierVariableTrialTimesUI>();
                newModifier.duration = (int)trialTimesSettings.sliderDuration.value;
                newModifier.beginMinTime = trialTimesSettings.sliderBeginMinTime.value;
                newModifier.beginMaxTime = trialTimesSettings.sliderBeginMaxTime.value;
                newModifier.endMinTime = trialTimesSettings.sliderEndMinTime.value;
                newModifier.endMaxTime = trialTimesSettings.sliderEndMaxTime.value;
                newModifier.liveForever = trialTimesSettings.toggleLiveForever.isOn;
                break;

            case TrainingModifier.TrainingModifierType.WideSearch:
                TrainingModifierWideSearchUI wideSearchSettings = currentModifierPrefabGO.GetComponent<TrainingModifierWideSearchUI>();
                newModifier.duration = (int)wideSearchSettings.sliderDuration.value;
                newModifier.speciesSimilarityThreshold = wideSearchSettings.sliderSimilarityThreshold.value;
                newModifier.adoptionRate = wideSearchSettings.sliderAdoptionRate.value;
                newModifier.largeSpeciesPenalty = wideSearchSettings.sliderLargeSpeciesPenalty.value;
                newModifier.liveForever = wideSearchSettings.toggleLiveForever.isOn;
                newModifier.decayEffectOverDuration = wideSearchSettings.toggleDecayEffectOverDuration.isOn;
                break;

            default:
                Debug.Log("Modifier type not found!!! SWITCH DEFAULT CASE");
                break;
        }

        trainerModuleScript.gameController.masterTrainer.trainingModifierManager.activeTrainingModifierList.Add(newModifier);
        Debug.Log("new Modifier! " + newModifier.modifierType.ToString() + newModifier.startGen.ToString() + ", #: " + trainerModuleScript.gameController.masterTrainer.trainingModifierManager.activeTrainingModifierList.Count.ToString());
    }
    public void ClickAddCurrentModifier()
    {
        TrainingModifier newModifier = new TrainingModifier();

        newModifier.modifierType = currentModifierType;

        newModifier.startGen = trainerModuleScript.gameController.masterTrainer.PlayingCurGeneration;
        if (trainerModuleScript.gameController.masterTrainer.loadedTrainingSave != null)
        {
            newModifier.startGen += trainerModuleScript.gameController.masterTrainer.loadedTrainingSave.endGeneration;
        }

        switch (currentModifierType)
        {
        case TrainingModifier.TrainingModifierType.LinkExplosion:
            TrainingModifierLinkExplosionUI linkExplosionSettings = currentModifierPrefabGO.GetComponent <TrainingModifierLinkExplosionUI>();
            newModifier.linksPerNode = linkExplosionSettings.sliderLinksPerNode.value;
            newModifier.nodesPerLink = linkExplosionSettings.sliderNodesPerLink.value;
            break;

        case TrainingModifier.TrainingModifierType.MutationBlast:
            TrainingModifierMutationBlastUI mutationBlastSettings = currentModifierPrefabGO.GetComponent <TrainingModifierMutationBlastUI>();
            newModifier.duration      = (int)mutationBlastSettings.sliderDuration.value;
            newModifier.minMultiplier = mutationBlastSettings.sliderMinMultiplier.value;
            newModifier.liveForever   = mutationBlastSettings.toggleLiveForever.isOn;
            break;

        case TrainingModifier.TrainingModifierType.BodyMutationBlast:
            TrainingModifierBodyMutationBlastUI bodyMutationBlastSettings = currentModifierPrefabGO.GetComponent <TrainingModifierBodyMutationBlastUI>();
            newModifier.duration      = (int)bodyMutationBlastSettings.sliderDuration.value;
            newModifier.minMultiplier = bodyMutationBlastSettings.sliderMinMultiplier.value;
            newModifier.liveForever   = bodyMutationBlastSettings.toggleLiveForever.isOn;
            break;

        case TrainingModifier.TrainingModifierType.PruneBrain:
            TrainingModifierPruneBrainUI pruneBrainSettings = currentModifierPrefabGO.GetComponent <TrainingModifierPruneBrainUI>();
            newModifier.duration                = (int)pruneBrainSettings.sliderDuration.value;
            newModifier.largeBrainPenalty       = pruneBrainSettings.sliderLargeBrainPenalty.value;
            newModifier.removeLinkChance        = pruneBrainSettings.sliderRemoveLinkChance.value;
            newModifier.removeNodeChance        = pruneBrainSettings.sliderRemoveNodeChance.value;
            newModifier.liveForever             = pruneBrainSettings.toggleLiveForever.isOn;
            newModifier.decayEffectOverDuration = pruneBrainSettings.toggleDecayEffectOverDuration.isOn;
            break;

        case TrainingModifier.TrainingModifierType.TargetCone:
            TrainingModifierTargetConeUI targetConeSettings = currentModifierPrefabGO.GetComponent <TrainingModifierTargetConeUI>();
            newModifier.duration         = (int)targetConeSettings.sliderDuration.value;
            newModifier.numRounds        = (int)targetConeSettings.sliderNumRounds.value;
            newModifier.beginMinDistance = targetConeSettings.sliderBeginMinDistance.value;
            newModifier.beginMaxDistance = targetConeSettings.sliderBeginMaxDistance.value;
            newModifier.endMinDistance   = targetConeSettings.sliderEndMinDistance.value;
            newModifier.endMaxDistance   = targetConeSettings.sliderEndMaxDistance.value;
            newModifier.beginMinAngle    = targetConeSettings.sliderBeginMinAngle.value;
            newModifier.beginMaxAngle    = targetConeSettings.sliderBeginMaxAngle.value;
            newModifier.endMinAngle      = targetConeSettings.sliderEndMinAngle.value;
            newModifier.endMaxAngle      = targetConeSettings.sliderEndMaxAngle.value;
            newModifier.liveForever      = targetConeSettings.toggleLiveForever.isOn;
            newModifier.horizontal       = targetConeSettings.toggleHorizontal.isOn;
            newModifier.vertical         = targetConeSettings.toggleVertical.isOn;
            break;

        case TrainingModifier.TrainingModifierType.TargetForward:
            TrainingModifierTargetForwardUI targetForwardSettings = currentModifierPrefabGO.GetComponent <TrainingModifierTargetForwardUI>();
            newModifier.duration         = (int)targetForwardSettings.sliderDuration.value;
            newModifier.numRounds        = (int)targetForwardSettings.sliderNumRounds.value;
            newModifier.beginMinDistance = targetForwardSettings.sliderBeginMinDistance.value;
            newModifier.beginMaxDistance = targetForwardSettings.sliderBeginMaxDistance.value;
            newModifier.endMinDistance   = targetForwardSettings.sliderEndMinDistance.value;
            newModifier.endMaxDistance   = targetForwardSettings.sliderEndMaxDistance.value;
            newModifier.liveForever      = targetForwardSettings.toggleLiveForever.isOn;
            break;

        case TrainingModifier.TrainingModifierType.TargetOmni:
            TrainingModifierTargetOmniUI targetOmniSettings = currentModifierPrefabGO.GetComponent <TrainingModifierTargetOmniUI>();
            newModifier.duration         = (int)targetOmniSettings.sliderDuration.value;
            newModifier.numRounds        = (int)targetOmniSettings.sliderNumRounds.value;
            newModifier.beginMinDistance = targetOmniSettings.sliderBeginMinDistance.value;
            newModifier.beginMaxDistance = targetOmniSettings.sliderBeginMaxDistance.value;
            newModifier.endMinDistance   = targetOmniSettings.sliderEndMinDistance.value;
            newModifier.endMaxDistance   = targetOmniSettings.sliderEndMaxDistance.value;
            newModifier.liveForever      = targetOmniSettings.toggleLiveForever.isOn;
            newModifier.forward          = targetOmniSettings.toggleForward.isOn;
            newModifier.horizontal       = targetOmniSettings.toggleHorizontal.isOn;
            newModifier.vertical         = targetOmniSettings.toggleVertical.isOn;
            break;

        case TrainingModifier.TrainingModifierType.VariableTrialTimes:
            TrainingModifierVariableTrialTimesUI trialTimesSettings = currentModifierPrefabGO.GetComponent <TrainingModifierVariableTrialTimesUI>();
            newModifier.duration     = (int)trialTimesSettings.sliderDuration.value;
            newModifier.beginMinTime = trialTimesSettings.sliderBeginMinTime.value;
            newModifier.beginMaxTime = trialTimesSettings.sliderBeginMaxTime.value;
            newModifier.endMinTime   = trialTimesSettings.sliderEndMinTime.value;
            newModifier.endMaxTime   = trialTimesSettings.sliderEndMaxTime.value;
            newModifier.liveForever  = trialTimesSettings.toggleLiveForever.isOn;
            break;

        case TrainingModifier.TrainingModifierType.WideSearch:
            TrainingModifierWideSearchUI wideSearchSettings = currentModifierPrefabGO.GetComponent <TrainingModifierWideSearchUI>();
            newModifier.duration = (int)wideSearchSettings.sliderDuration.value;
            newModifier.speciesSimilarityThreshold = wideSearchSettings.sliderSimilarityThreshold.value;
            newModifier.adoptionRate            = wideSearchSettings.sliderAdoptionRate.value;
            newModifier.largeSpeciesPenalty     = wideSearchSettings.sliderLargeSpeciesPenalty.value;
            newModifier.liveForever             = wideSearchSettings.toggleLiveForever.isOn;
            newModifier.decayEffectOverDuration = wideSearchSettings.toggleDecayEffectOverDuration.isOn;
            break;

        default:
            Debug.Log("Modifier type not found!!! SWITCH DEFAULT CASE");
            break;
        }

        trainerModuleScript.gameController.masterTrainer.trainingModifierManager.activeTrainingModifierList.Add(newModifier);
        Debug.Log("new Modifier! " + newModifier.modifierType.ToString() + newModifier.startGen.ToString() + ", #: " + trainerModuleScript.gameController.masterTrainer.trainingModifierManager.activeTrainingModifierList.Count.ToString());
    }
    public override object Read(ES2Reader reader)
	{
		TrainingModifier data = new TrainingModifier();
		Read(reader, data);
		return data;
	}