200 lines
4.8 KiB
C#
200 lines
4.8 KiB
C#
using JetBrains.Annotations;
|
||
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using UnityEngine;
|
||
|
||
public class MeleeFighterClass : ClassBase {
|
||
public MeleeFighterClass(Player player) : base(player) { }
|
||
private readonly int BladeVortex = Animator.StringToHash("BladeVortex");
|
||
private float BladeVortexSpeed = 0.4f;
|
||
private float ComboResetTime;
|
||
private float LastComboTime;
|
||
private bool ChargingAnAttack;
|
||
private float ChargeValue;
|
||
private bool AllowBladeVortex;
|
||
private int ChargeTick;
|
||
|
||
|
||
private AttackState CurrentState;
|
||
private enum AttackState {
|
||
None,
|
||
PhaseCleave,
|
||
DrainEdge,
|
||
Shockwave,
|
||
BladeVortex,
|
||
BasicAttack1,
|
||
BasicAttack2,
|
||
BasicAttack3,
|
||
ChargeSurgeA,
|
||
ChargeSurgeB,
|
||
KineticSurgeA,
|
||
KineticSurgeB,
|
||
}
|
||
|
||
|
||
override public void Tick() {
|
||
float timeElapsed = Time.time - LastComboTime;
|
||
|
||
switch (CurrentState) {
|
||
case AttackState.None:
|
||
return;
|
||
|
||
case AttackState.BasicAttack1:
|
||
AllowBladeVortex = timeElapsed <= 0.1f;
|
||
break;
|
||
|
||
|
||
case AttackState.ChargeSurgeA:
|
||
ChargingAnAttack = Input.GetMouseButton(0);
|
||
HandleCharging(timeElapsed);
|
||
if (!ChargingAnAttack) ChangeState(AttackState.KineticSurgeA);
|
||
break;
|
||
|
||
|
||
case AttackState.ChargeSurgeB:
|
||
ChargingAnAttack = Input.GetMouseButton(1);
|
||
HandleCharging(timeElapsed);
|
||
if (!ChargingAnAttack) ChangeState(AttackState.KineticSurgeB);
|
||
break;
|
||
}
|
||
|
||
if (!ChargingAnAttack && timeElapsed > ComboResetTime) {
|
||
Player.MoveSpeed = PlayerOriginalSpeed;
|
||
ChangeState(AttackState.None);
|
||
Player.SkillInUse = false;
|
||
}
|
||
}
|
||
|
||
private void HandleCharging(float timeElapsed){
|
||
ChargeValue = timeElapsed * 60;
|
||
if (ChargeValue > 100) ChargeValue = 100;
|
||
if (ChargeTick++ > 10) {
|
||
ChargeTick = 0;
|
||
TextPopUp.SpawnFloatingText($"Charging {ChargeValue:0.0}", GetChargeColor(), 3);
|
||
}
|
||
}
|
||
|
||
private Color GetChargeColor() {
|
||
ChargeValue = Mathf.Clamp01(ChargeValue / 100f); // Normalize to 0–1
|
||
|
||
if (ChargeValue < 0.5f) {
|
||
return Color.Lerp(Color.red, Color.yellow, ChargeValue / 0.5f);
|
||
} else {
|
||
return Color.Lerp(Color.yellow, Color.green, (ChargeValue - 0.5f) / 0.5f);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
override public void HandleLMB() {
|
||
Player.SkillInUse = true;
|
||
|
||
switch (CurrentState) {
|
||
case AttackState.None:
|
||
PlayerOriginalSpeed = Player.MoveSpeed;
|
||
|
||
if ((Time.time - Player.DashTime) <= 0.1f)
|
||
ChangeState(AttackState.PhaseCleave, 1.5f);
|
||
else if (Player.IsJumping)
|
||
ChangeState(AttackState.Shockwave, 0, 1.5f);
|
||
else
|
||
ChangeState(AttackState.BasicAttack1);
|
||
|
||
break;
|
||
|
||
|
||
case AttackState.BasicAttack1:
|
||
ChangeState(AttackState.BasicAttack2);
|
||
break;
|
||
|
||
|
||
case AttackState.BasicAttack2:
|
||
ChangeState(AttackState.BasicAttack3);
|
||
break;
|
||
|
||
|
||
case AttackState.BasicAttack3:
|
||
ChangeState(AttackState.ChargeSurgeA);
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
override public void HandleRMB() {
|
||
Player.SkillInUse = true;
|
||
|
||
switch (CurrentState) {
|
||
case AttackState.None:
|
||
PlayerOriginalSpeed = Player.MoveSpeed;
|
||
|
||
if (Player.IsDashing)
|
||
ChangeState(AttackState.None);
|
||
else if (Player.IsJumping)
|
||
ChangeState(AttackState.None);
|
||
else
|
||
ChangeState(AttackState.DrainEdge);
|
||
break;
|
||
|
||
|
||
case AttackState.BasicAttack1:
|
||
if (!AllowBladeVortex) return;
|
||
ChangeState(AttackState.BladeVortex, 0.4f, 1.5f);
|
||
break;
|
||
|
||
|
||
case AttackState.BasicAttack3:
|
||
ChangeState(AttackState.ChargeSurgeB);
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
private void ChangeState(AttackState state, float decreasedSpeed = 0.2f, float resetTime = 0.3f) {
|
||
if (state != AttackState.None)
|
||
TextPopUp.SpawnFloatingText(state.ToString(), Color.red, 3);
|
||
CurrentState = state;
|
||
ComboResetTime = resetTime;
|
||
LastComboTime = Time.time;
|
||
Player.MoveSpeed = (state == AttackState.None) ? PlayerOriginalSpeed : PlayerOriginalSpeed * decreasedSpeed;
|
||
Debug.Log(CurrentState.ToString());
|
||
|
||
switch (CurrentState) {
|
||
case AttackState.None:
|
||
if (Player.IsDashing) {
|
||
} else if (Player.IsJumping) {
|
||
} else {
|
||
}
|
||
break;
|
||
|
||
case AttackState.Shockwave:
|
||
break;
|
||
|
||
case AttackState.BladeVortex:
|
||
Animator.CrossFade(BladeVortex, 0);
|
||
break;
|
||
|
||
case AttackState.BasicAttack1:
|
||
break;
|
||
|
||
case AttackState.BasicAttack2:
|
||
break;
|
||
|
||
case AttackState.BasicAttack3:
|
||
break;
|
||
|
||
case AttackState.KineticSurgeA:
|
||
Debug.Log($"Charged Value: {ChargeValue}");
|
||
break;
|
||
|
||
case AttackState.KineticSurgeB:
|
||
Debug.Log($"Charged Value: {ChargeValue}");
|
||
break;
|
||
}
|
||
}
|
||
}
|