using System.Collections.Generic; using Cielonos.MainGame.Buffs.Character; using Cielonos.MainGame.Characters; using SLSUtilities.General; using UnityEngine; namespace Cielonos.MainGame.Inventory.Collections { public partial class FutureWand { private bool _hasMissileSeparationMembrane; private bool _hasBlackHoleDisplacer; private bool _hasStellarRingQuickcaster; private bool _hasCubicScatterIndexer; private bool _hasFusionChargeCore; private bool _hasSigilBreakWedge; private const int StellarRingQuickcasterSpinAreaUpgradeLevel = 1; private const int FusionChargeCoreExtraFusionStack = 1; private const float SigilBreakWedgeExtraStanceDepletion = 30f; protected override void OnExtendersChanged() { CacheExtenderFlags(); } private void CacheExtenderFlags() { _hasMissileSeparationMembrane = HasExtender(); _hasBlackHoleDisplacer = HasExtender(); _hasStellarRingQuickcaster = HasExtender(); _hasCubicScatterIndexer = HasExtender(); _hasFusionChargeCore = HasExtender(); _hasSigilBreakWedge = HasExtender(); } private bool PlayStellarRingQuickcasterSpinArea() { if (!functionSm["SpinArea"].IsAvailable() || !fullBodyFuncAnimSm.CheckPlayability()) return false; RecallAllSpinAreas(); //StopSpinAreaCharge(true); RefreshPrimaryTarget(); _spinAreaUpgradeCount = StellarRingQuickcasterSpinAreaUpgradeLevel; if (PlayReleaseSpinArea()) return true; _spinAreaUpgradeCount = 0; return false; } private List GetCubicScatterIndexerTargets(int targetCount, float radius = DefaultTargetingRadius) { List targets = GetCurrentTargets(targetCount, radius); if (targets.Count <= 0 || targets.Count >= targetCount) { return targets; } List scatteredTargets = new List(targetCount); scatteredTargets.AddRange(targets); while (scatteredTargets.Count < targetCount) { targets.TryGetRandom(out Enemy randomTarget); scatteredTargets.Add(randomTarget); } return scatteredTargets; } private int GetBaseFusionStack(AttackUnit attackUnit) { return attackUnit.GetSubmodule()?.GetParameter("Buff_Fusion_Stack") ?? 0; } private int ApplyFusionChargeCore(int fusionStack, string vfxName) { if (vfxName is not ("NormalBolt" or "CubicBolt")) return fusionStack; return fusionStack + FusionChargeCoreExtraFusionStack; } private void ApplySigilBreakWedge(Fusion fusion) { if (fusion?.attachedCharacter == null) return; Attack.Context context = new Attack.Context( player, fusion.attachedCharacter, nameof(SigilBreakWedge), fusion.attachedCharacter.CenterPosition); Attack.Value value = new Attack.Value( false, 0f, SigilBreakWedgeExtraStanceDepletion, Attack.Type.Energy, breakthroughType: Breakthrough.Type.None); Attack.Result result = new Attack.Result(context, value); fusion.attachedCharacter.TakeDepletion(result); } private void ApplyBlackHoleDisplacer(NormalArea area, AttackUnit attackUnit) { area.SetAttackSubmodule(attackUnit) .SetTimeSubmodule(3f, 0.1f, 0.9f) .SetHitSubmodule(0.1f, 8) .SetLinearDirectionMoveModule(player.transform.forward, 25f, -50f, false, false, false); } private void TryGenerateMissileSeparation( Projectile sourceProjectile, string vfxName, AttackUnit attackUnit, CharacterBase hitCharacter, Vector3 hitPosition, float speed) { if (sourceProjectile.tags.Contains("Separation")) return; List nearbyEnemies = CombatManager.EnemySm.Query(25f) .From(hitPosition) .Exclude(hitCharacter as Enemy) .Candidates(); if (nearbyEnemies.Count <= 0) return; Projectile separation = vfxData .SpawnVFX(vfxName, player, hitPosition, Quaternion.identity) .GetComponentInChildren(); nearbyEnemies.TryGetRandom(out Enemy randomTarget); Vector3 separationDirection = (randomTarget.CenterPoint.position - hitPosition).normalized; separation.Initialize(player, this, false, 1, Fraction.Enemy) .SetAttackSubmodule(attackUnit) .SetTimeSubmodule(10f) .SetHitSubmodule() .SetLinearDirectionMoveModule(separationDirection, speed, 5f); separation.tags.Add("Separation"); separation.hitSm.AddCheckedObject(hitCharacter.gameObject); separation.SetRaycastSubmodule(default, 0.25f, 0.5f); } } }