///<summary> Checks targetEO DestructionInfo on matching DestroyConditions, adds effect to targetEO's Effects list. </summary>
        private void CheckAndAdd(EnvironOutput effect, EnvironObject targetEO)
        {
            if (targetEO.destruction && effect.damageI)
            {
                targetEO.destruction.CheckDamageMatch(effect.damageI.ID);
            }

            targetEO.effects.Add(effect, targetEO, this);
        }
        ///<summary> Checks targetEO DestructionInfo on matching DestroyConditions, adds effect to targetEO's Effects list. </summary>
        private void CheckAndAdd(EnvironOutput effect, EnvironObject targetEO, DestroyCondition destructCondition)
        {
            if (targetEO.destruction)
            {
                targetEO.destruction.CheckTagsMatch(tags, destructCondition);
                if (effect.damageI)
                {
                    targetEO.destruction.CheckDamageMatch(effect.damageI.ID);
                }
            }

            targetEO.effects.Add(effect, targetEO, this);
        }
        ///<summary> Adds On_Stay Outputs as an Effect to the TargetEO, as well as Effects with allowTransmission. </summary>
        private void OnStay(TransferCondition stay, EnvironObject targetEO)
        {
            if (targetEO == null)
            {
                return;
            }

            foreach (EnvironOutput effect in output)
            {
                if (effect.transferCondition == stay)
                {
                    CheckAndAdd(effect, targetEO);
                }
            }

            foreach (EnvironOutput tEffect in effects.inputList)
            {
                if (tEffect.allowTransmission && tEffect.transferCondition == stay)
                {
                    CheckAndAdd(tEffect, targetEO);
                }
            }
        }
        ///<summary> Adds On_Enter Outputs as an Effect to the TargetEO, as well as Effects with allowTransmission. </summary>
        private void OnEnter(TransferCondition enterTC, DestroyCondition enterDSC, EnvironObject targetEO)
        {
            if (targetEO == null)
            {
                return;
            }

            foreach (EnvironOutput effect in output)
            {
                if (effect.transferCondition == enterTC)
                {
                    CheckAndAdd(effect, targetEO, enterDSC);
                }
            }

            foreach (EnvironOutput tEffect in effects.inputList)
            {
                if (tEffect.allowTransmission && tEffect.transferCondition == enterTC)
                {
                    CheckAndAdd(tEffect, targetEO, enterDSC);
                }
            }
        }
        ///<summary> Sets Info and variables up for use. </summary>
        public void Setup(EnvironObject targetEO, EnvironObject lastSourceEO)
        {
            if (damageI)
            {
                damageI = Instantiate(damageI);
                damageI.Setup(targetEO.resistances);
            }

            if (appearanceI)
            {
                appearanceI = Instantiate(appearanceI);
                appearanceI.Setup(targetEO.gameObject);

                if (appearanceI.hideOnResistance && targetEO.resistances)   //Turns off Appearance particles and materials if hideOnResistance has been set up
                {
                    if (targetEO.resistances.HasTypeIDMatch(ResistanceType.NULLIFY_DAMAGE, appearanceI.hideIDList.Distinct()))
                    {
                        appearanceI.TurnOff();
                    }
                }
            }

            limit.ResetTimer();
            lastSource = lastSourceEO;
            target     = targetEO;

            if (similarity == Similarity.SELECTIVE)
            {
                uniqueID = selectiveDescription;
            }
            if (similarity == Similarity.UNIQUE)
            {
                uniqueID    = GetInstanceID().ToString();
                firstSource = lastSourceEO;
            }
        }
        ///<summary> Adds On_Exit Outputs as an Effect to the TargetEO, as well as Effects with allowTransmission. Also flags Effects meeting the On_Exit TerminalCondition for removal. </summary>
        private void OnExit(TransferCondition exitTC, TerminalCondition terminalCondition, DestroyCondition exitDSC, EnvironObject targetEO)
        {
            if (targetEO == null)
            {
                return;
            }

            foreach (EnvironOutput effect in effects.inputList)
            {
                if (effect.allowTransmission && effect.transferCondition == exitTC)
                {
                    CheckAndAdd(effect, targetEO, exitDSC);
                }
            }

            foreach (EnvironOutput eOut in output)
            {
                if (eOut.transferCondition == exitTC)
                {
                    CheckAndAdd(eOut, targetEO, exitDSC);
                }

                if (eOut.endOnCondition == terminalCondition)
                {
                    targetEO.effects.FlagForRemoval(eOut);
                }
            }
        }