using System; using System.Collections.Generic; using ChocDino.UIFX; using Cielonos.MainGame.Buffs.Character; using Cielonos.MainGame.Characters; using Cielonos.MainGame.Effects.Feedback; using Cielonos.MainGame.UI; using SLSUtilities.Feedback; using SLSUtilities.General; using SLSUtilities.FunctionalAnimation; using SLSUtilities.WwiseAssistance; using UnityEngine; namespace Cielonos.MainGame.Inventory.Collections { public partial class Polychrome { private NormalArea CreateBaseSlash(string vfxName, AttackUnit attackUnit, float timeDuration = 1f, float hitActiveDuration = 0.04f) { NormalArea slash = vfxData.SpawnVFX(vfxName, player).GetComponentInChildren(); slash.Initialize(player, this, Fraction.Enemy) .SetAttackSubmodule(attackUnit) .SetTimeSubmodule(timeDuration, hitActiveDuration) .SetHitSubmodule(); slash.attackSm.breakthroughAction = (enemy, hitPosition) => { AudioManager.Post(AK.EVENTS.DISRUPT, hitPosition); }; return slash; } private NormalArea GenerateNormalSlash(string vfxName, AttackUnit attackUnit, string hitFeedback) { NormalArea slash = CreateBaseSlash(vfxName, attackUnit, 1f, 0.02f); slash.SetImpulseSubmodule().WithRepulsion(2f); slash.hitSm.AddHitSound(AK.EVENTS.POLYCHROME_LIGHTATTACKHIT) .AddHitEvent((enemy, hitPosition) => { var positionShakeAction = feedbackSc.GetFeedbackData(hitFeedback).Action("Camera"); float magnitude = hitFeedback == "SingleNormalHit" ? 0.12f : 0.06f; positionShakeAction.amplitude = vfxData.Get(vfxName).slashScreenPosition.normalized * magnitude; feedbackSc.PlayFeedback(hitFeedback); }); return slash; } private NormalArea GenerateHeavySlash(string vfxName, AttackUnit attackUnit) { NormalArea slash; if (!HasExtender()) { slash = CreateBaseSlash(vfxName, attackUnit, 1f, 0.04f); } else // 如果有Photon Dissociator,重攻击拆分为五段,每段伤害为原来的30%,时间和判定也相应调整 { AttackUnit modifiedUnit = attackUnit.Clone(); modifiedUnit.startDamage *= 0.5f; slash = vfxData.SpawnVFX(vfxName, player).GetComponentInChildren(); slash.Initialize(player, this, Fraction.Enemy) .SetAttackSubmodule(modifiedUnit) .SetTimeSubmodule(1f, 0.04f, 0.4f) .SetHitSubmodule(0.1f, 3); slash.attackSm.breakthroughAction = (enemy, hitPosition) => { AudioManager.Post(AK.EVENTS.DISRUPT, hitPosition); }; } slash.SetImpulseSubmodule(1f).WithRepulsion(5f); slash.hitSm.AddHitSound(AK.EVENTS.POLYCHROME_HEAVYATTACKLHIT) .AddHitEvent((enemy, hitPosition) => { var positionShakeAction = feedbackSc.GetFeedbackData("HeavyHit").Action("Camera"); positionShakeAction.amplitude = vfxData.Get(vfxName).slashScreenPosition.normalized * 0.18f; feedbackSc.PlayFeedback("HeavyHit"); }); return slash; } private NormalArea GenerateDisruptionSlash(string vfxName, AttackUnit attackUnit) { NormalArea slash = CreateBaseSlash(vfxName, attackUnit, 1f, 0.04f); slash.SetImpulseSubmodule().WithRepulsion(5f); slash.attackSm.breakthroughAction = (enemy, hitPosition) => { feedbackSc.PlayFeedback("Breakthrough"); AudioManager.Post(AK.EVENTS.DISRUPT, hitPosition); }; slash.hitSm.AddHitSound(AK.EVENTS.POLYCHROME_HEAVYATTACKLHIT) .AddHitEvent((enemy, hitPosition) => { var positionShakeAction = feedbackSc.GetFeedbackData("HeavyHit").Action("Camera"); positionShakeAction.amplitude = vfxData.Get(vfxName).slashScreenPosition.normalized * 0.18f; feedbackSc.PlayFeedback("HeavyHit"); }); return slash; } private NormalArea GenerateUltimateSlash(string vfxName, AttackUnit attackUnit) { NormalArea slash = CreateBaseSlash(vfxName, attackUnit, 1f, 0.04f); slash.SetImpulseSubmodule(1f).WithRepulsion(5f); slash.hitSm.AddHitSound(AK.EVENTS.POLYCHROME_HEAVYATTACKLHIT) .AddHitEvent((enemy, hitPosition) => { var positionShakeAction = feedbackSc.GetFeedbackData("HeavyHit").Action("Camera"); positionShakeAction.amplitude = vfxData.Get(vfxName).slashScreenPosition.normalized * 0.18f; feedbackSc.PlayFeedback("HeavyHit"); feedbackSc.PlayFeedback("Breakthrough"); }); return slash; } } }