Files
Hasebe/Assets/Code/OfficeGame/BattleMode/Actions/BattleActionStugger.cs
T
2026-11-11 01:11:41 +03:00

96 lines
3.6 KiB
C#

using System.Linq;
using Code.Game.Entities;
using Code.Infrastructure.Utils;
using Code.OfficeGame.BattleMode.Actions.Deciders;
using Code.OfficeGame.BattleMode.Timeline;
using UnityEngine;
namespace Code.OfficeGame.BattleMode.Actions
{
public class BattleActionStugger : BattleAction
{
private int EntryStateHash => Animator.StringToHash("WalkBlend");
private int StuggerStateHash => Animator.StringToHash("Stugger");
private BattleActionParameters _actionParameters;
public BattleActionStugger(MultipleConfig<BattleActionParameters> actionData)
{
_actionParameters = actionData.Configs.SingleOrDefault(x => x.ActionType == ActionType);
}
public override BattleActionType ActionType => BattleActionType.Stugger;
public override DeciderType DeciderType => DeciderType.AsIs;
public override BattleActionData MountAndGetFrames(EntityProperties entity, BattleActionDecisionResult result)
{
return new StuggerActionData
{
TotalFrames = _actionParameters.TotalFrames,
TransitionFrames = _actionParameters.TransitionFrames,
Finished = false
};
}
public override void Finish(EntityProperties entity, BattleActionData actionData, BattleActionDecisionResult result)
{
entity.KinematicCharacterMotor.BaseVelocity = Vector3.zero;
entity.MovementController.Freeze = true;
}
public override void Tick(
float tickDelta,
EntityProperties entity,
BattleActionDecisionResult battleActionDecisionResult,
BattleActionData battleActionData)
{
if (battleActionData is not StuggerActionData stuggerActionData)
{
Debug.Log($"WrongData {battleActionData.GetType()}");
battleActionData.Finished = true;
return;
}
if (stuggerActionData.CurrentFrame == 0)
{
if (stuggerActionData.TotalFrames <= 0)
stuggerActionData.TotalFrames = _actionParameters.TotalFrames;
if (stuggerActionData.TransitionFrames <= 0)
stuggerActionData.TransitionFrames = _actionParameters.TransitionFrames;
var transitionTime = stuggerActionData.TransitionFrames * BattleTimeline.TickDelta;
entity.SyncRootMotionToMotor();
entity.animator.applyRootMotion = false;
entity.animator.CrossFadeInFixedTime(StuggerStateHash, transitionTime);
}
if (stuggerActionData.KnockbackDistance > 0f
&& stuggerActionData.KnockbackSpeed > 0f
&& stuggerActionData.KnockbackDirection.sqrMagnitude > 0.0001f)
{
float stepDistance = Mathf.Min(
stuggerActionData.KnockbackSpeed * tickDelta,
stuggerActionData.KnockbackDistance);
stuggerActionData.KnockbackDistance -= stepDistance;
Vector3 step = stuggerActionData.KnockbackDirection * stepDistance;
entity.KinematicCharacterMotor.MoveCharacter(
entity.KinematicCharacterMotor.TransientPosition + step);
}
stuggerActionData.CurrentFrame++;
if (stuggerActionData.CurrentFrame >= stuggerActionData.TotalFrames)
{
entity.SyncRootMotionToMotor();
entity.animator.Play(EntryStateHash, 0, 0f);
entity.animator.Update(0f);
battleActionData.Finished = true;
}
}
}
}