244 lines
10 KiB
C#
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");
|
|
}
|
|
}
|
|
} |