TowerDefenseGame/Assets/Scripts/Runtime/Characters/Player/Classes/MeleeFighterClass.cs
2025-07-01 02:07:12 -07:00

200 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 01
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;
}
}
}