// Removing elements in iteration must be performed outside of foreach loop. Store its index and then delete it later. public void RemovePhysicalEffect(PhysicalEffectType type) { switch (type) { case PhysicalEffectType.Bleed: m_bleedEffects = 0; var indexList = new List <int>(); for (int i = 0; i < physicalEffects.Count; i++) { if (physicalEffects[i] is Bleed) { indexList.Add(i); } } foreach (var t in indexList) { Destroy(physicalEffects[t].gameObject); physicalEffects.RemoveAt(t); } break; case PhysicalEffectType.Infect: m_infectEffects = 0; var indexListI = new List <int>(); for (int i = 0; i < physicalEffects.Count; i++) { if (physicalEffects[i] is Infect) { indexListI.Add(i); } } foreach (var t in indexListI) { Destroy(physicalEffects[t].gameObject); physicalEffects.RemoveAt(t); } break; case PhysicalEffectType.Stun: if (m_stunEffects > 0) { m_stunEffects = 0; var index = 0; for (int i = 0; i < physicalEffects.Count; i++) { if (physicalEffects[i] is Stun) { index = i; } } Destroy(physicalEffects[index].gameObject); physicalEffects.RemoveAt(index); } break; case PhysicalEffectType.Buff: break; default: break; } }
IEnumerator TakeEffectRoutine(Actor attacker, bool hasMentalEffect, int mentalDMG, bool hasPhysicalEffect, PhysicalEffectType type, int pow, int dur) { while (Commander.instance.IsActing) { yield return(null); } yield return(StartCoroutine(MentalEffectRoutine(attacker, hasMentalEffect, mentalDMG))); // Should Wait for Affliction check Commander.instance.IsMentalActing = Commander.instance.turnStateMachine.IsStillMentalActing(); while (Commander.instance.IsMentalActing) { yield return(null); Commander.instance.IsMentalActing = Commander.instance.turnStateMachine.IsStillMentalActing(); } yield return(new WaitForSeconds(0.1f)); if (!hasPhysicalEffect) { m_isSubActionOver = true; yield break; } yield return(StartCoroutine(PhysicalEffectRoutine(type, pow, dur))); }
protected virtual IEnumerator PhysicalEffectRoutine(PhysicalEffectType type, int pow, int dur) { if (this.onDodge) { m_isSubActionOver = true; yield break; } // Resistance Check switch (type) { case PhysicalEffectType.Bleed: var bRoll = Random.Range(0, 1f); if (bRoll <= this.m_bleedRes) { UIManager.instance.CreateEffect("BleedResist", this, 0); isResisted = true; } else { isResisted = false; } break; case PhysicalEffectType.Infect: var iRoll = Random.Range(0, 1f); if (iRoll <= this.m_infectRes) { UIManager.instance.CreateEffect("InfectResist", this, 0); isResisted = true; } else { isResisted = false; } break; case PhysicalEffectType.Stun: var sRoll = Random.Range(0, 1f); if (sRoll <= this.m_stunRes) { UIManager.instance.CreateEffect("StunResist", this, 0); isResisted = true; } else { isResisted = false; } break; case PhysicalEffectType.Move: // If this.isActive, then that means this character is casting moving forward skill if (!this.isActive) { var mRoll = Random.Range(0, 1f); if (mRoll <= this.m_moveRes) { UIManager.instance.CreateEffect("MoveResist", this, 0); isResisted = true; } else { isResisted = false; } } break; default: break; } if (isResisted) { SoundManager.Instance.PlaySE(20); onCrit = false; m_isSubActionOver = true; isResisted = false; yield break; } Debug.Log("Actor Physical Effect Routine"); var typeNumber = (int)type; var effectObject = Instantiate(Commander.instance.physicalEffectPrefabs[typeNumber]); effectObject.transform.SetParent(this.gameObject.transform); if (this is BaseCharacter) { effectObject.transform.localPosition = effectsPositions[typeNumber]; } else { effectObject.transform.localPosition = effectsPositions[typeNumber] + enemyCorrection; } var effect = effectObject.GetComponent <PhysicalEffect>(); effect.SetEffect(pow, dur, this); yield return(new WaitForSeconds(setEffectDelay)); this.SetPhysicalEffect(effect); yield return(new WaitForSeconds(0.1f)); if (effect is Move) { // Swap Position Destroy(effectObject, 1f); physicalEffects.Remove(effect); } onCrit = false; m_isSubActionOver = true; }
public void TakeEffect(Actor attacker, bool hasMentalEffect, int mentalDMG, bool hasPhysicalEffect, PhysicalEffectType type, int pow, int dur) { m_isSubActionOver = false; StartCoroutine(TakeEffectRoutine(attacker, hasMentalEffect, mentalDMG, hasPhysicalEffect, type, pow, dur)); }