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(); } } }