화염 소용돌이

This commit is contained in:
Ino 2024-12-16 15:01:17 +09:00
parent e559dba7eb
commit a956122732
5 changed files with 157 additions and 5446 deletions

File diff suppressed because it is too large Load Diff

View File

@ -393,44 +393,19 @@ public class Actor : MyCoroutine
{
var atkData = Get_CCData(eCC.ATK_Up);
var addAtk = atkData.CCTime > 0 ? atkData.CCDmg : 0f;
double baseDmg = _pd.BaseDmg > 0 ? _pd.BaseDmg : m_Stat.Get_Stat(eStat.BaseDmg);
var dinfo = new DamageInfo();
dinfo.Beater = this;
dinfo.Beater_pd = _pd;
dinfo.Damage = (addAtk + baseDmg) * _attackrate;
dinfo.PiercingDmg = baseDmg * (m_Stat.Get_Stat(eStat.PIERCING_Multiplier) + dinfo.Get_AddValue(eAddExtraType.Add_Piercing_Multiplier_bySpiriBless));
dinfo.BaseDmg = _pd.BaseDmg > 0 ? _pd.BaseDmg : m_Stat.Get_Stat(eStat.BaseDmg);
dinfo.Damage = (addAtk + dinfo.BaseDmg) * _attackrate;
dinfo.PiercingDmg = dinfo.BaseDmg * (m_Stat.Get_Stat(eStat.PIERCING_Multiplier) + dinfo.Get_AddValue(eAddExtraType.Add_Piercing_Multiplier_bySpiriBless));
dinfo.TextColor = HUDBase.Get_TextColor(m_AttackType);
if (dic_ccData[eCC.PiercingBuff].CCTime > 0)
dinfo.PiercingDmg += baseDmg * m_Stat.Get_Stat(eStat.PiercingBuff_byAttack);
dinfo.PiercingDmg += dinfo.BaseDmg * m_Stat.Get_Stat(eStat.PiercingBuff_byAttack);
// 크리티컬 판정
dinfo.Critical = eStat.None;
if (m_AttackType == eAttackType.Magic)
{
var addcri = dinfo.Get_AddValue(eAddExtraType.AddCri_byFireBall);
dinfo.Critical = forceCri || DSUtil.RandomTrue((float)m_Stat.Get_Stat(eStat.M_CRI) + addcri) ? eStat.M_CRI : eStat.None;
if (dinfo.Critical == eStat.M_CRI)
{
dinfo.Damage += dinfo.Damage * m_Stat.Get_Stat(eStat.M_CRI_DMG_Multiplier);
dinfo.TextColor = DSUtil.Format("{0}<color=#ff00ff> ", dinfo.Critical);
}
}
else
{
var addcri = dinfo.Get_AddValue(eAddExtraType.AddCri_byTonado) + dinfo.Get_AddValue(eAddExtraType.AddCri_byFireBall);
dinfo.Critical = forceCri || DSUtil.RandomTrue((float)m_Stat.Get_Stat(eStat.CRI) + addcri) ? eStat.CRI : eStat.None;
if (dinfo.Critical == eStat.CRI)
{
var addcridmg = dinfo.Get_AddValue(eAddExtraType.AddCriDmg_byTonado);
var addcripiercingdmg = dinfo.Get_AddValue(eAddExtraType.AddCRI_Piercing_Multiplier_byTonado);
dinfo.Damage += dinfo.Damage * (m_Stat.Get_Stat(eStat.CRI_DMG_Multiplier) + addcridmg);
dinfo.TextColor = DSUtil.Format("{0}<color=#ffff00> ", dinfo.Critical);
dinfo.PiercingDmg += baseDmg * (m_Stat.Get_Stat(eStat.CRI_Piercing_Multiplier) + addcripiercingdmg);
}
}
dinfo.Cal_Cri(m_AttackType, m_Stat, forceCri); // 크리티컬 판정
return dinfo;
}
@ -439,7 +414,6 @@ public class Actor : MyCoroutine
if (IsDead() || m_bImmortal) return;
if (_dinfo.Damage < 1) _dinfo.Damage = 1d;
_dinfo.Damage.RandomizeCryptoKey();
if (Get_HP() >= Get_MaxHP() && Get_HP() <= _dinfo.Damage) // 한 방에 사망
Kill_OnePunch(_dinfo);
@ -533,7 +507,6 @@ public class Actor : MyCoroutine
// 고정 피해 계산
_dinfo.Damage += (int)_dinfo.Beater.m_Stat.Get_Stat(eStat.ATK_FIXED) + (int)atk_fixed - (int)m_Stat.Get_Stat(eStat.ATK_FIXED_DECREASE);
if (_dinfo.Damage < 1d) _dinfo.Damage = 1d;
_dinfo.Damage.RandomizeCryptoKey();
}
_dinfo.PiercingDmg -= _dinfo.PiercingDmg * m_Stat.Get_Stat(eStat.PIERCING_Block);
@ -570,7 +543,6 @@ public class Actor : MyCoroutine
{
if (IsDead()) return;
_dinfo.Damage.RandomizeCryptoKey();
m_Stat.Set_Stat(false, eStat.HP, _dinfo.Damage);
_dinfo.act_returnLastDmg?.Invoke(_dinfo.Damage);
_dinfo.act_CriAfterHit?.Invoke(_dinfo.Critical);

View File

@ -193,11 +193,6 @@ public class ProjectileBase : MonoBehaviour
Get_AwakenData(step, 1));
}
public void Set_HitChecker()
{
}
/// <summary>
/// active 스킬 실행 여부
/// </summary>
@ -326,6 +321,7 @@ public class ProjectileBase : MonoBehaviour
var hitter = other.GetComponent<Actor>();
if (m_ProjectTileData.shooter.IsEnemy() != hitter.IsEnemy())
{
m_DamageInfo.Cal_Cri(m_ProjectTileData.shooter.m_AttackType, m_ProjectTileData.shooter.Get_StatInfo());
hitter.Get_Damage(m_DamageInfo);
m_ProjectTileData.Action_OnHit?.Invoke(hitter);
Show_HitEffect(true, hitter);

View File

@ -7,7 +7,7 @@ public class Skill_Hurricane : ProjectileBase
[Header("소용돌이 유지 시간")]
public float lifeTime = 15f;
[Header("소용돌이 데미지 범위")]
public float damageArea = 5f;
public BoxCollider m_Collider;
[Header("데미지 간격")]
public float damageGap = 0.33f;
[Header("소용돌이 이동속도")]
@ -15,8 +15,9 @@ public class Skill_Hurricane : ProjectileBase
public override void Set(ProjectileData _data)
{
_data.eStartPos = eProjectileStartPos.Target;
base.Set(_data);
transform.position = _data.target.Get_position();
transform.eulerAngles = Vector3.zero;
movespeed += IsStep(1) ? Get_AwakenData(1, 1) : 0f;
_data.LifeTime = lifeTime + (IsStep(2) ? Get_AwakenData(2, 1) : 0f);
@ -25,18 +26,20 @@ public class Skill_Hurricane : ProjectileBase
IEnumerator Co_Update()
{
var step3 = IsStep(3);
if (step3) damageArea += Get_AwakenData(3, 1);
if (IsStep(3)) m_Collider.size = new Vector3(1.70440888f, 3.86459613f, 1.84529209f);
else m_Collider.size = new Vector3(1.37568462f, 3.86459613f, 1.46960735f);
while (m_ProjectTileData.LifeTime > 0f)
{
m_Collider.enabled = true;
yield return null;
yield return null;
m_Collider.enabled = false;
yield return new WaitForSeconds(damageGap);
m_ProjectTileData.LifeTime -= damageGap;
var enemies = Get_Enemies(transform, damageArea);
Attack_Enemies(enemies, step3);
}
Off();
Off(true);
}
private void Update()
@ -60,16 +63,4 @@ public class Skill_Hurricane : ProjectileBase
if (m_ProjectTileData.shooter.IsDead()) Off();
}
void Attack_Enemies(List<Actor> enemies, bool airborne)
{
for (int j = 0; j < enemies.Count; j++)
{
if (DSUtil.CheckNull(enemies[j])) continue;
if (j >= enemies.Count) break;
if (airborne) enemies[j].KnockedAirborne();
enemies[j].Get_Damage(Get_DamageInfo());
}
}
}

View File

@ -114,7 +114,10 @@ public class RandomStatTableDataBase : TableDataBase
public class DamageInfo
{
public Actor Beater;
public ObscuredDouble Damage, PiercingDmg;
ObscuredDouble _BaseDmg, _Damage, _PiercingDmg;
public double BaseDmg { get { return _BaseDmg; } set { _BaseDmg = value; _BaseDmg.RandomizeCryptoKey(); } }
public double Damage { get { return _Damage; } set { _Damage = value; _Damage.RandomizeCryptoKey(); } }
public double PiercingDmg { get { return _PiercingDmg; } set { _PiercingDmg = value; _PiercingDmg.RandomizeCryptoKey(); } }
public eCC CC;
public eStat Critical = eStat.None;
public string TextColor;
@ -155,6 +158,35 @@ public class DamageInfo
return 0f;
}
public void Cal_Cri(eAttackType attackType, ActorStatInfo statinfo, bool forceCri = false)
{
Critical = eStat.None;
if (attackType == eAttackType.Magic)
{
var addcri = Get_AddValue(eAddExtraType.AddCri_byFireBall);
Critical = forceCri || DSUtil.RandomTrue((float)statinfo.Get_Stat(eStat.M_CRI) + addcri) ? eStat.M_CRI : eStat.None;
if (Critical == eStat.M_CRI)
{
Damage += Damage * statinfo.Get_Stat(eStat.M_CRI_DMG_Multiplier);
TextColor = DSUtil.Format("{0}<color=#ff00ff> ", Critical);
}
}
else
{
var addcri = Get_AddValue(eAddExtraType.AddCri_byTonado) + Get_AddValue(eAddExtraType.AddCri_byFireBall);
Critical = forceCri || DSUtil.RandomTrue((float)statinfo.Get_Stat(eStat.CRI) + addcri) ? eStat.CRI : eStat.None;
if (Critical == eStat.CRI)
{
var addcridmg = Get_AddValue(eAddExtraType.AddCriDmg_byTonado);
var addcripiercingdmg = Get_AddValue(eAddExtraType.AddCRI_Piercing_Multiplier_byTonado);
Damage += Damage * (statinfo.Get_Stat(eStat.CRI_DMG_Multiplier) + addcridmg);
TextColor = DSUtil.Format("{0}<color=#ffff00> ", Critical);
PiercingDmg += BaseDmg * (statinfo.Get_Stat(eStat.CRI_Piercing_Multiplier) + addcripiercingdmg);
}
}
}
public void Set_Extra(eSkillExtraType extraType)
{
Beater_pd.e_SkillExtraType = extraType;