2025-01-27 10:29:38 -05:00
|
|
|
|
using System.Collections;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Ichni.RhythmGame
|
|
|
|
|
|
{
|
|
|
|
|
|
public class EffectSubmodule : SubmoduleBase
|
|
|
|
|
|
{
|
|
|
|
|
|
public List<EffectBase> effectList;
|
2025-01-30 22:45:33 -05:00
|
|
|
|
|
|
|
|
|
|
public EffectSubmodule(BaseElement attachedElement) : base(attachedElement)
|
|
|
|
|
|
{
|
|
|
|
|
|
effectList = new List<EffectBase>();
|
|
|
|
|
|
}
|
2025-02-06 23:01:44 -05:00
|
|
|
|
|
|
|
|
|
|
public override void SaveBM()
|
|
|
|
|
|
{
|
|
|
|
|
|
matchedBM = new Beatmap.EffectSubmodule_BM(attachedElement);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public interface IHaveEffect
|
|
|
|
|
|
{
|
|
|
|
|
|
public EffectSubmodule effectSubmodule { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
namespace Beatmap
|
|
|
|
|
|
{
|
|
|
|
|
|
public class EffectSubmodule_BM : Submodule_BM
|
|
|
|
|
|
{
|
|
|
|
|
|
public List<EffectBase> effectList;
|
|
|
|
|
|
|
|
|
|
|
|
public EffectSubmodule_BM()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public EffectSubmodule_BM(BaseElement attachedElement) : base(attachedElement)
|
|
|
|
|
|
{
|
|
|
|
|
|
effectList = new List<EffectBase>();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void ExecuteBM()
|
|
|
|
|
|
{
|
|
|
|
|
|
attachedElement = GetElement(attachedElementGuid);
|
|
|
|
|
|
(attachedElement as IHaveEffect).effectSubmodule = new EffectSubmodule(attachedElement);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void DuplicateBM(BaseElement attached)
|
|
|
|
|
|
{
|
|
|
|
|
|
(attached as IHaveEffect).effectSubmodule = new EffectSubmodule(attached);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-01-27 10:29:38 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public abstract class EffectBase
|
|
|
|
|
|
{
|
2025-01-27 22:11:24 -05:00
|
|
|
|
public enum EffectState
|
|
|
|
|
|
{
|
|
|
|
|
|
Before = -1,
|
|
|
|
|
|
Middle = 0,
|
|
|
|
|
|
After = 1,
|
|
|
|
|
|
Error = 100
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 效果的持续时间,如果为0则表示瞬间效果
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public float effectTime;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 是否是瞬间效果
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool isInstantEffect => effectTime <= 0;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 效果当前的状态
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public EffectState nowEffectState;
|
|
|
|
|
|
|
|
|
|
|
|
protected EffectBase()
|
|
|
|
|
|
{
|
|
|
|
|
|
this.effectTime = 0;
|
|
|
|
|
|
this.nowEffectState = EffectState.Before;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected EffectBase(float effectTime)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.effectTime = effectTime;
|
|
|
|
|
|
this.nowEffectState = EffectState.Before;
|
|
|
|
|
|
}
|
2025-01-28 11:58:39 -05:00
|
|
|
|
|
|
|
|
|
|
public virtual void UpdateEffect()
|
|
|
|
|
|
{
|
|
|
|
|
|
EffectState state = CheckEffectState();
|
|
|
|
|
|
|
|
|
|
|
|
if (state == EffectState.Before && nowEffectState != EffectState.Before)
|
|
|
|
|
|
{
|
|
|
|
|
|
nowEffectState = EffectState.Before;
|
|
|
|
|
|
Recover();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (state == EffectState.Middle)
|
|
|
|
|
|
{
|
|
|
|
|
|
nowEffectState = EffectState.Middle;
|
|
|
|
|
|
Execute();
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (state == EffectState.After && nowEffectState != EffectState.After)
|
|
|
|
|
|
{
|
|
|
|
|
|
nowEffectState = EffectState.After;
|
|
|
|
|
|
Adjust();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public virtual EffectState CheckEffectState()
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new System.NotImplementedException();
|
|
|
|
|
|
}
|
2025-01-27 22:11:24 -05:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 在效果的持续时间内,触发这个方法
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public virtual void Execute()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 如果是非瞬间效果,在效果完成后,触发这个方法;
|
|
|
|
|
|
/// 如果是瞬间效果,则此方法即为Execute。原有的Execute方法不被调用。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public virtual void Adjust()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 如果时间轴回退到效果的触发时间之前,则触发这个方法
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public virtual void Recover()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-01-27 10:29:38 -05:00
|
|
|
|
}
|
|
|
|
|
|
}
|