using System.Collections.Generic; using Cielonos.UI; using DG.Tweening; using Lean.Pool; using SLSFramework.General; using UniRx; using AnimatorPlus; using Sirenix.OdinInspector; using UnityEngine; namespace Cielonos.MainGame.Characters { public partial class NexusCrab : Automata { protected override void Start() { base.Start(); RegisterFunctionsToAnimSc(SingleSwing, ThreeSwings_0, ThreeSwings_1, ThreeSwings_2, ClawStabBlast, ClawImpaleWave, JumpAttackBlast, BumpImpaleWave, GenerateNormalBulletSpawner, GenerateShockwaveMissileSpawner, GeneratePiercingBulletSpawner); PlayerCanvas.Instance.bossInfoUIArea.CreateInfoUnit(this); } protected override void InitializeSubmodules() { base.InitializeSubmodules(); eventSm.onGetAttacked.InsertByPriority("UI_HealthBarUpdate", new PrioritizedAction(UI_HealthBarUpdate)); eventSm.onUseEnergy.InsertByPriority("UI_EnergyBarUpdate", new PrioritizedAction(UI_EnergyBarUpdate)); } public override void Die() { PlayerCanvas.Instance.bossInfoUIArea.RemoveInfoUnit(this); base.Die(); } private void UI_HealthBarUpdate(AttackAreaBase attackArea, AttackResult attackResult) { if (attackResult.finalDamage > 0) PlayerCanvas.Instance.bossInfoUIArea[this]?.UpdateHealth(); } private void UI_EnergyBarUpdate(CharacterBase user, float energyUsed) { if(energyUsed > 0) PlayerCanvas.Instance.bossInfoUIArea[this]?.UpdateEnergy(); } private void SingleSwing() => GenerateSlash("SingleSwing"); private void ThreeSwings_0() => GenerateSlash("ThreeSwings_0"); private void ThreeSwings_1() => GenerateSlash("ThreeSwings_1"); private void ThreeSwings_2() => GenerateSlash("ThreeSwings_2"); private void ClawStabBlast() { GenerateClawStabBlast("ClawStabBlast", "ClawStabBlast", 25); feedbackSc["ImpaleWave_Stab"].Play(); } private void ClawImpaleWave() { GenerateImpaleWave("ImpaleWave"); feedbackSc["ImpaleWave_Wave"].Play(); } private void JumpAttackBlast() { GenerateJumpAttackBlast("JumpAttackBlast", "JumpAttackBlast", 40); feedbackSc["JumpAttack_Blast"].Play(); } private void BumpImpaleWave() { GenerateImpaleWave("ImpaleWave"); feedbackSc["ImpaleWave_Wave"].Play(); } private void GenerateNormalBulletSpawner() { GenerateBulletSpawner("NormalBulletSpawner"); Observable.Timer(System.TimeSpan.FromSeconds(0.3f)).Subscribe(_ => { Observable.Interval(System.TimeSpan.FromSeconds(0.2f)).Take(6).Subscribe(__ => { GenerateNormalBullet(); }); }); } private void GenerateShockwaveMissileSpawner() { GenerateBulletSpawner("SpecialBulletSpawner"); Observable.Timer(System.TimeSpan.FromSeconds(0.3f)).Subscribe(_ => { Observable.Interval(System.TimeSpan.FromSeconds(0.5f)).Take(2).Subscribe(__ => { GenerateShockwaveMissile(); }); }); } private void GeneratePiercingBulletSpawner() { GenerateBulletSpawner("SpecialBulletSpawner"); Observable.Timer(System.TimeSpan.FromSeconds(0.3f)).Subscribe(_ => { Observable.Interval(System.TimeSpan.FromSeconds(0.5f)).Take(2).Subscribe(__ => { GeneratePiercingBullet(); }); }); } private void GenerateSlash(string vfxName) { NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren(); slash.Initialize(this, null, Fraction.Player) .SetAttackSubmodule(attackData["Swing"]) .SetTimeSubmodule(1.5f) .SetHitSubmodule() .SetForceSubmodule(8f, true); slash.hitSm.AddHitSound("GeneralHit"); } private void GenerateClawStabBlast(string vfxName, string attackDataName, float force) { NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren(); slash.Initialize(this, null, Fraction.Player) .SetAttackSubmodule(attackData[attackDataName]) .SetTimeSubmodule(1.2f) .SetHitSubmodule() .SetForceSubmodule(transform.forward * force) .SetReactionSubmodule(false, false, false, true, true, false); } private void GenerateJumpAttackBlast(string vfxName, string attackDataName, float force) { NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren(); slash.Initialize(this, null, Fraction.Player) .SetAttackSubmodule(attackData[attackDataName]) .SetTimeSubmodule(1.2f) .SetHitSubmodule() .SetForceSubmodule(force, true) .SetReactionSubmodule(false, false, false, true, true, false); } private void GenerateImpaleWave(string vfxName) { NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren(); slash.Initialize(this, null, Fraction.Player) .SetAttackSubmodule(attackData["ImpaleWave"]) .SetTimeSubmodule(3f, 0.2f, 1.3f) .SetHitSubmodule() .SetForceSubmodule(transform.forward * 30f) .SetReactionSubmodule(false, false, false, true, true, false); slash.transform.DOLocalMoveZ(8f, 0.8f).From(0f).Play(); slash.transform.DOScale(1.5f, 0.8f).From(1f).Play(); } private Transform bulletSpawnerTransform; private void GenerateBulletSpawner(string vfxName) { bulletSpawnerTransform = vfxData.SpawnVFX(vfxName).transform; Observable.Timer(System.TimeSpan.FromSeconds(1.25f)).Subscribe(_ => { bulletSpawnerTransform.GetComponent().Stop(true); LeanPool.Despawn(bulletSpawnerTransform.gameObject, 0.3f); }); } private void GenerateNormalBullet() { Player player = MainGameManager.Player; if(player == null) return; bulletSpawnerTransform.forward = (player.flexibleCenterPoint.position - bulletSpawnerTransform.position).normalized; vfxData.SpawnMuzzleVFX("NormalBullet", bulletSpawnerTransform); audioSc.audioContainer.PlaySoundFX("NormalBullet_Shoot", bulletSpawnerTransform.position); Projectile projectile = vfxData.SpawnVFX("NormalBullet", bulletSpawnerTransform).GetComponentInChildren(); projectile.Initialize(this, null, false, 1, Fraction.Player) .SetAttackSubmodule(attackData["NormalBullet"]) .SetTimeSubmodule(10f) .SetHitSubmodule() .SetLinearDirectionMoveModule(bulletSpawnerTransform.forward, 20f) .SetRaycastSubmodule() .SetForceSubmodule(1f) .SetReactionSubmodule(true, false, false, true, false, false); projectile.hitSm.AddHitSound("NormalBullet_Hit"); } private void GenerateShockwaveMissile() { Player player = MainGameManager.Player; if(player == null) return; bulletSpawnerTransform.forward = (player.flexibleCenterPoint.position - bulletSpawnerTransform.position).normalized; vfxData.SpawnMuzzleVFX("ShockwaveMissile", bulletSpawnerTransform); audioSc.audioContainer.PlaySoundFX("ShockwaveMissile_Shoot", bulletSpawnerTransform.position); Projectile projectile = vfxData.SpawnVFX("ShockwaveMissile", bulletSpawnerTransform).GetComponentInChildren(); projectile.Initialize(this, null, false, 1, Fraction.Player) .SetAttackSubmodule(attackData["ShockwaveMissile"]) .SetTimeSubmodule(5f) .SetHitSubmodule() .SetTraceMoveModule(player, 20f, -2f, 60f, -10f, bulletSpawnerTransform.forward, false) .SetRaycastSubmodule(default, 0.1f, 0.2f) .SetForceSubmodule(1f) .SetReactionSubmodule(false, false, false, true, false, false); projectile.hitSm.AddHitSound("ShockwaveMissile_Hit"); } private void GeneratePiercingBullet() { Player player = MainGameManager.Player; if(player == null) return; bulletSpawnerTransform.forward = (player.flexibleCenterPoint.position - bulletSpawnerTransform.position).normalized; vfxData.SpawnMuzzleVFX("PiercingBullet", bulletSpawnerTransform); audioSc.audioContainer.PlaySoundFX("PiercingBullet_Shoot", bulletSpawnerTransform.position); Projectile projectile = vfxData.SpawnVFX("PiercingBullet", bulletSpawnerTransform).GetComponentInChildren(); projectile.Initialize(this, null, false, 1, Fraction.Player) .SetAttackSubmodule(attackData["PiercingBullet"]) .SetTimeSubmodule(10f) .SetHitSubmodule() .SetLinearDirectionMoveModule(bulletSpawnerTransform.forward, 60f) .SetRaycastSubmodule() .SetForceSubmodule(1f) .SetReactionSubmodule(false, false, true, true, false, false); projectile.hitSm.AddHitSound("PiercingBullet_Hit"); } } }