public void SetStatusEffect(StatusEffect statusEffect) { statusEffectList.Add(statusEffect); // 침묵이나 기절상태가 될 경우 체인 해제. // FIXME : 넉백 추가할 것. (넉백은 디버프가 아니라서 다른 곳에서 적용할 듯?) if (statusEffect.IsOfType(StatusEffectType.Faint) || statusEffect.IsOfType(StatusEffectType.Silence)) { ChainList.RemoveChainsFromUnit(gameObject); } }
IEnumerator ActionAtTurn(GameObject unit) { battleData.uiManager.UpdateApBarUI(battleData, battleData.unitManager.GetAllUnits()); Debug.Log(unit.GetComponent <Unit>().GetName() + "'s turn"); battleData.selectedUnitObject = unit; battleData.moveCount = 0; // 누적 이동 수 battleData.alreadyMoved = false; // 연속 이동 불가를 위한 변수. ChainList.RemoveChainsFromUnit(battleData.selectedUnitObject); // 턴이 돌아오면 자신이 건 체인 삭제. battleData.currentState = CurrentState.FocusToUnit; battleData.uiManager.SetSelectedUnitViewerUI(battleData.selectedUnitObject); battleData.selectedUnitObject.GetComponent <Unit>().SetActive(); yield return(StartCoroutine(FocusToUnit(battleData))); battleData.uiManager.DisableSelectedUnitViewerUI(); if (battleData.selectedUnitObject != null) { battleData.selectedUnitObject.GetComponent <Unit>().SetInactive(); } }
public IEnumerator Damaged(UnitClass unitClass, float amount, float penetration, bool isDot, bool isHealth) { float actualDamage = 0.0f; int finalDamage = 0; // 최종 대미지 (정수로 표시되는) // 공격이 물리인지 마법인지 체크 // 방어력 / 저항력 중 맞는 값을 적용 (적용 단계에서 능력치 변동 효과 반영) // 대미지 증가/감소 효과 적용 // 보호막 있을 경우 대미지 삭감 // 체력 깎임 // 체인 해제 if (isHealth == true) { if (unitClass == UnitClass.Melee) { // 실제 피해 = 원래 피해 x 200/(200+방어력) actualDamage = amount * 200.0f / (200.0f + GetActualStat(Stat.Defense) * (1.0f - penetration)); Debug.Log("Actual melee damage without status effect : " + actualDamage); } else if (unitClass == UnitClass.Magic) { actualDamage = amount * 200.0f / (200.0f + GetActualStat(Stat.Resistance) * (1.0f - penetration)); Debug.Log("Actual magic damage without status effect: " + actualDamage); } else if (unitClass == UnitClass.None) { actualDamage = amount; } // sisterna_l_1의 저항력 계산 if (penetration == -1.0f) { actualDamage = amount - GetActualStat(Stat.Resistance); } // 대미지 증감 효과 적용 if (this.HasStatusEffect(StatusEffectType.DamageChange)) { actualDamage = GetActualEffect(actualDamage, StatusEffectType.DamageChange); } finalDamage = (int)actualDamage; // 보호막에 따른 대미지 삭감 if (this.HasStatusEffect(StatusEffectType.Shield)) { int shieldAmount = 0; for (int i = 0; i < statusEffectList.Count; i++) { if (statusEffectList[i].IsOfType(StatusEffectType.Shield) && statusEffectList[i].GetCooldown() == 0) { // sisterna_m_12 발동 조건 체크 if (statusEffectList[i].GetName().Equals("파장 분류")) { if (finalDamage < (int)(0.2 * maxHealth)) { continue; } else { int absorbDamage = (int)(statusEffectList[i].GetAmount(statusEffectList[i].GetLevel()) * this.GetActualStat(statusEffectList[i].GetAmountStat())); finalDamage -= absorbDamage; float[] tempArray = new float[5] { 0, 0, 0, 0, 0 }; // 강타 정의용 임시 array StatusEffect sisternaSmite = new StatusEffect("파장 분류 강타", statusEffectList[i].GetLevel(), StatusEffectType.Smite, true, false, false, false, tempArray, Stat.None, tempArray, absorbDamage, 0, 1, 0, false, "None", EffectVisualType.None, EffectMoveType.None); statusEffectList.Add(sisternaSmite); statusEffectList[i].SetToBeRemoved(true); break; } } shieldAmount = statusEffectList[i].GetRemainAmount(); if (shieldAmount > finalDamage) { statusEffectList[i].SetRemainAmount(shieldAmount - finalDamage); finalDamage = 0; Debug.Log("Remain Shield Amount : " + statusEffectList[i].GetRemainAmount()); break; } else { finalDamage -= shieldAmount; statusEffectList[i].SetToBeRemoved(true); } } } this.UpdateStatusEffect(); } if (finalDamage > -1) { currentHealth -= finalDamage; } if (currentHealth < 0) { currentHealth = 0; } damageTextObject.SetActive(true); damageTextObject.GetComponent <CustomWorldText>().text = finalDamage.ToString(); healthViewer.UpdateCurrentHealth(currentHealth, maxHealth); if (!isDot) // 도트데미지가 아니면 체인이 해제됨. { ChainList.RemoveChainsFromUnit(gameObject); } // 데미지 표시되는 시간. yield return(new WaitForSeconds(1)); damageTextObject.SetActive(false); } else { finalDamage = (int)amount; if (activityPoint >= finalDamage) { activityPoint -= finalDamage; } else { activityPoint = 0; } Debug.Log(GetName() + " loses " + finalDamage + "AP."); } }