105 lines
2.6 KiB
C#
105 lines
2.6 KiB
C#
|
using EntityStates;
|
||
|
using EntityStates.Merc;
|
||
|
using HG;
|
||
|
using JetBrains.Annotations;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace RoR2.Skills;
|
||
|
|
||
|
[CreateAssetMenu(menuName = "RoR2/SkillDef/MercDashSkillDef")]
|
||
|
public class MercDashSkillDef : SkillDef
|
||
|
{
|
||
|
protected class InstanceData : BaseSkillInstanceData
|
||
|
{
|
||
|
public int currentDashIndex;
|
||
|
|
||
|
public float timeoutTimer;
|
||
|
|
||
|
public bool waitingForHit;
|
||
|
|
||
|
public bool hasExtraStock;
|
||
|
}
|
||
|
|
||
|
public int maxDashes;
|
||
|
|
||
|
public float timeoutDuration;
|
||
|
|
||
|
public Sprite[] icons;
|
||
|
|
||
|
public override BaseSkillInstanceData OnAssigned([NotNull] GenericSkill skillSlot)
|
||
|
{
|
||
|
return new InstanceData();
|
||
|
}
|
||
|
|
||
|
public override void OnUnassigned([NotNull] GenericSkill skillSlot)
|
||
|
{
|
||
|
base.OnUnassigned(skillSlot);
|
||
|
}
|
||
|
|
||
|
public override void OnFixedUpdate([NotNull] GenericSkill skillSlot, float deltaTime)
|
||
|
{
|
||
|
base.OnFixedUpdate(skillSlot, deltaTime);
|
||
|
InstanceData instanceData = (InstanceData)skillSlot.skillInstanceData;
|
||
|
if (instanceData.waitingForHit && skillSlot.stateMachine.state is Assaulter2 { grantAnotherDash: not false })
|
||
|
{
|
||
|
instanceData.waitingForHit = false;
|
||
|
AddHit(skillSlot);
|
||
|
}
|
||
|
instanceData.timeoutTimer -= deltaTime;
|
||
|
if (instanceData.timeoutTimer <= 0f && instanceData.currentDashIndex != 0)
|
||
|
{
|
||
|
if (instanceData.hasExtraStock)
|
||
|
{
|
||
|
skillSlot.stock--;
|
||
|
instanceData.hasExtraStock = false;
|
||
|
}
|
||
|
instanceData.currentDashIndex = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override EntityState InstantiateNextState([NotNull] GenericSkill skillSlot)
|
||
|
{
|
||
|
EntityState entityState = base.InstantiateNextState(skillSlot);
|
||
|
if (entityState is PrepAssaulter2 prepAssaulter)
|
||
|
{
|
||
|
prepAssaulter.dashIndex = ((InstanceData)skillSlot.skillInstanceData).currentDashIndex;
|
||
|
}
|
||
|
return entityState;
|
||
|
}
|
||
|
|
||
|
public override void OnExecute([NotNull] GenericSkill skillSlot)
|
||
|
{
|
||
|
base.OnExecute(skillSlot);
|
||
|
InstanceData instanceData = (InstanceData)skillSlot.skillInstanceData;
|
||
|
if (!instanceData.hasExtraStock)
|
||
|
{
|
||
|
instanceData.currentDashIndex = 0;
|
||
|
}
|
||
|
instanceData.waitingForHit = true;
|
||
|
instanceData.hasExtraStock = false;
|
||
|
instanceData.timeoutTimer = timeoutDuration;
|
||
|
}
|
||
|
|
||
|
protected void AddHit([NotNull] GenericSkill skillSlot)
|
||
|
{
|
||
|
InstanceData instanceData = (InstanceData)skillSlot.skillInstanceData;
|
||
|
if (instanceData.currentDashIndex < maxDashes - 1)
|
||
|
{
|
||
|
instanceData.currentDashIndex++;
|
||
|
int stock = skillSlot.stock + 1;
|
||
|
skillSlot.stock = stock;
|
||
|
instanceData.hasExtraStock = true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
instanceData.currentDashIndex = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override Sprite GetCurrentIcon([NotNull] GenericSkill skillSlot)
|
||
|
{
|
||
|
int index = ((InstanceData)skillSlot.skillInstanceData)?.currentDashIndex ?? 0;
|
||
|
return ArrayUtils.GetSafe(icons, index);
|
||
|
}
|
||
|
}
|