using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.RhythmGame
{
///
/// 包含效果的次级模块
///
public partial class EffectSubmodule : SubmoduleBase
{
public Dictionary> effectCollection;
public EffectSubmodule(GameElement attachedGameElement, EffectSubmodulePreset preset = EffectSubmodulePreset.Default)
: base(attachedGameElement)
{
effectCollection = new Dictionary>();
if (preset == EffectSubmodulePreset.Default) //对于默认的效果次级模块,只有Default效果集合
{
effectCollection.Add("Default", new List());
}
else if (preset == EffectSubmodulePreset.Note) //对于Note的效果次级模块,在Note的不同状态下有独立的效果集合
{
effectCollection.Add("Generate", new List());
effectCollection.Add("GeneralJudge", new List());
effectCollection.Add("Holding", new List()); //仅用于Hold
effectCollection.Add("Perfect", new List());
effectCollection.Add("Good", new List());
effectCollection.Add("Bad", new List());
effectCollection.Add("Miss", new List());
}
}
public EffectSubmodule(GameElement attachedGameElement, Dictionary> effectList_BM) : base(attachedGameElement)
{
effectCollection = new Dictionary>();
foreach (var effect in effectList_BM)
{
List effectList = new List();
foreach (var effectBM in effect.Value)
{
effectList.Add(effectBM.ConvertToGameType());
}
effectCollection.Add(effect.Key, effectList);
}
}
public override void SaveBM()
{
matchedBM = new EffectSubmodule_BM(attachedGameElement);
}
}
public partial class EffectSubmodule
{
public enum EffectSubmodulePreset
{
Default,
Note,
}
}
public interface IHaveEffectSubmodule
{
public EffectSubmodule effectSubmodule { get; set; }
}
namespace Beatmap
{
public class EffectSubmodule_BM : Submodule_BM
{
public Dictionary> effectCollection;
public EffectSubmodule_BM()
{
}
public EffectSubmodule_BM(GameElement attachedElement) : base(attachedElement)
{
effectCollection = new Dictionary>();
IHaveEffectSubmodule element = attachedElement as IHaveEffectSubmodule;
foreach (var effect in element.effectSubmodule.effectCollection)
{
List effectList = new List();
foreach (var effectBase in effect.Value)
{
effectList.Add(effectBase.ConvertToBM());
}
effectCollection.Add(effect.Key, effectList);
}
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
(attachedElement as IHaveEffectSubmodule).effectSubmodule = new EffectSubmodule(attachedElement, effectCollection);
attachedElement.submoduleList.Add((attachedElement as IHaveEffectSubmodule).effectSubmodule);
}
public override void DuplicateBM(GameElement attached)
{
(attached as IHaveEffectSubmodule).effectSubmodule = new EffectSubmodule(attached, effectCollection);
attached.submoduleList.Add((attached as IHaveEffectSubmodule).effectSubmodule);
}
}
}
public abstract class EffectBase
{
public enum EffectState
{
Before = -1,
Middle = 0,
After = 1,
Error = 100
}
///
/// 效果的持续时间,如果为0则表示瞬间效果
///
public float effectTime;
///
/// 是否是瞬间效果
///
public bool isInstantEffect => effectTime <= 0;
///
/// 效果当前的状态
///
public EffectState nowEffectState;
protected EffectBase()
{
this.effectTime = 0;
this.nowEffectState = EffectState.Before;
}
protected EffectBase(float effectTime)
{
this.effectTime = effectTime;
this.nowEffectState = EffectState.Before;
}
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();
}
///
/// 在效果的持续时间内,触发这个方法
///
public virtual void Execute()
{
}
///
/// 如果是非瞬间效果,在效果完成后,触发这个方法;
/// 如果是瞬间效果,则此方法即为Execute。原有的Execute方法不被调用。
///
public virtual void Adjust()
{
}
///
/// 如果时间轴回退到效果的触发时间之前,则触发这个方法
///
public virtual void Recover()
{
}
///
/// 转换为存档类
///
///
public abstract EffectBase_BM ConvertToBM();
}
namespace Beatmap
{
public abstract class EffectBase_BM
{
public float effectTime;
public EffectBase_BM()
{
}
public EffectBase_BM(float effectTime)
{
this.effectTime = effectTime;
}
///
/// 转换为游戏类
///
///
public abstract EffectBase ConvertToGameType();
}
}
}