Files
Cielonos/Assets/Scripts/MainGame/Characters/Automata/Enemies/NexusCrab.cs
2025-12-24 16:58:51 -05:00

244 lines
10 KiB
C#

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<AttackAreaBase, AttackResult>(UI_HealthBarUpdate));
eventSm.onUseEnergy.InsertByPriority("UI_EnergyBarUpdate", new PrioritizedAction<CharacterBase, float>(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<NormalArea>();
slash.Initialize<NormalArea>(this, null, Fraction.Player)
.SetAttackSubmodule<NormalArea>(attackData["Swing"])
.SetTimeSubmodule<NormalArea>(1.5f)
.SetHitSubmodule<NormalArea>()
.SetForceSubmodule<NormalArea>(8f, true);
slash.hitSm.AddHitSound("GeneralHit");
}
private void GenerateClawStabBlast(string vfxName, string attackDataName, float force)
{
NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren<NormalArea>();
slash.Initialize<NormalArea>(this, null, Fraction.Player)
.SetAttackSubmodule<NormalArea>(attackData[attackDataName])
.SetTimeSubmodule<NormalArea>(1.2f)
.SetHitSubmodule<NormalArea>()
.SetForceSubmodule<NormalArea>(transform.forward * force)
.SetReactionSubmodule<NormalArea>(false, false, false, true, true, false);
}
private void GenerateJumpAttackBlast(string vfxName, string attackDataName, float force)
{
NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren<NormalArea>();
slash.Initialize<NormalArea>(this, null, Fraction.Player)
.SetAttackSubmodule<NormalArea>(attackData[attackDataName])
.SetTimeSubmodule<NormalArea>(1.2f)
.SetHitSubmodule<NormalArea>()
.SetForceSubmodule<NormalArea>(force, true)
.SetReactionSubmodule<NormalArea>(false, false, false, true, true, false);
}
private void GenerateImpaleWave(string vfxName)
{
NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren<NormalArea>();
slash.Initialize<NormalArea>(this, null, Fraction.Player)
.SetAttackSubmodule<NormalArea>(attackData["ImpaleWave"])
.SetTimeSubmodule<NormalArea>(3f, 0.2f, 1.3f)
.SetHitSubmodule<NormalArea>()
.SetForceSubmodule<NormalArea>(transform.forward * 30f)
.SetReactionSubmodule<NormalArea>(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<ParticleSystem>().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>();
projectile.Initialize(this, null, false, 1, Fraction.Player)
.SetAttackSubmodule<Projectile>(attackData["NormalBullet"])
.SetTimeSubmodule<Projectile>(10f)
.SetHitSubmodule<Projectile>()
.SetLinearDirectionMoveModule<Projectile>(bulletSpawnerTransform.forward, 20f)
.SetRaycastSubmodule<Projectile>()
.SetForceSubmodule<Projectile>(1f)
.SetReactionSubmodule<Projectile>(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>();
projectile.Initialize(this, null, false, 1, Fraction.Player)
.SetAttackSubmodule<Projectile>(attackData["ShockwaveMissile"])
.SetTimeSubmodule<Projectile>(5f)
.SetHitSubmodule<Projectile>()
.SeDetachableTraceMoveModule<Projectile>(player, 20f, -2f, 60f, -10f, bulletSpawnerTransform.forward)
.SetRaycastSubmodule<Projectile>(default, 0.1f, 0.2f)
.SetForceSubmodule<Projectile>(1f)
.SetReactionSubmodule<Projectile>(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>();
projectile.Initialize(this, null, false, 1, Fraction.Player)
.SetAttackSubmodule<Projectile>(attackData["PiercingBullet"])
.SetTimeSubmodule<Projectile>(10f)
.SetHitSubmodule<Projectile>()
.SetLinearDirectionMoveModule<Projectile>(bulletSpawnerTransform.forward, 60f)
.SetRaycastSubmodule<Projectile>()
.SetForceSubmodule<Projectile>(1f)
.SetReactionSubmodule<Projectile>(false, false, true, true, false, false);
projectile.hitSm.AddHitSound("PiercingBullet_Hit");
}
}
}