Esempio n. 1
0
 public void SetStatusEffect(StatusEffect statusEffect)
 {
     statusEffectList.Add(statusEffect);
     // 침묵이나 기절상태가 될 경우 체인 해제.
     // FIXME : 넉백 추가할 것. (넉백은 디버프가 아니라서 다른 곳에서 적용할 듯?)
     if (statusEffect.IsOfType(StatusEffectType.Faint) ||
         statusEffect.IsOfType(StatusEffectType.Silence))
     {
         ChainList.RemoveChainsFromUnit(gameObject);
     }
 }
Esempio n. 2
0
    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();
        }
    }
Esempio n. 3
0
    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.");
        }
    }