/// <summary> /// 配置済みショートノーツに対して新規AirHoldと新規AirUpCを配置し取り付けます。 /// </summary> public bool AttachAirHoldToAirableNote(AirableNote airable, AirHold airHold, AirUpC air) { if (airable == null || airHold == null) { Logger.Error("AirHoldを取り付けできません。引数airableまたはairHoldがnullです。", true); return(false); } if (!Contains(airable)) { Logger.Error("AirHold取り付け先のAirableノーツはすでに配置されている必要があります。", true); return(false); } if (!airable.IsAirHoldAttachable) { Logger.Error("AirHold取り付け先のAirableノーツにはすでにAirやAirHoldが取り付けられています。", true); return(false); } airable.AttachAirHold(airHold); airHoldNotes.Add(airHold); if (air == null) { Logger.Warn("引数airがnullのためAirHoldのみが取り付けられました。予期せぬデータ構造になる可能性があります。"); return(true); } if (!airable.IsAirAttached) { airable.AttachAir(air); airNotes.Add(air); } return(true); }
public void AttachAirHold(AirHold airHold) { if (airHold == null) { Logger.Error("AirableNoteへのAirHoldの紐づけに失敗しました。引数airHoldがnullです。"); return; } AirHold = airHold; airHold.GetAirable += () => this; airHoldBegin = airHold.AirHoldBegin; Debug.Assert(airHoldBegin != null); return; }
public AirableNote(Note note) : base(note) { if (note is AirableNote airable) { if (airable.Air != null) { Air = new Air(airable.Air); } if (airable.AirHold != null) { AirHold = new AirHold(airable.AirHold); } } }
/// <summary> /// AirableノーツからAirHoldを取り外します。 /// AirHoldを取り外せた場合成功(true)となります。 /// </summary> public bool DetachAirHoldFromAirableNote(AirableNote airable, out AirHold airHold) { airHold = null; if (airable == null) { Logger.Error("引数のAirableNoteがnullのため、操作を行えません。"); return(false); } if (!airable.IsAirHoldAttached) { Logger.Error("AirHold取り外し対象のAirableNoteにはAirHoldが取り付けられていませんでした。"); return(false); } airHold = airable.AirHold; airable.DetachAirHold(); airHoldNotes.Remove(airHold); return(true); }
public AirHold(AirHold ah) { ah.ForEach(x => { switch (x) { case AirHoldBegin airHoldBegin: { var note = new AirHoldBegin(airHoldBegin); Add(note); note.CheckNotePosition += CheckNotePosition; note.CheckNoteSize += CheckNoteSize; } break; case AirHoldEnd airHoldEnd: { var note = new AirHoldEnd(airHoldEnd); Add(note); note.CheckNotePosition += CheckNotePosition; note.IsPositionAvailable += IsPositionTickAvailable; } break; case AirAction airAction: { var note = new AirAction(airAction); base.Add(note); note.CheckNotePosition += CheckNotePosition; note.IsPositionAvailable += IsPositionTickAvailable; } break; default: Logger.Warn("AirHoldの要素ではないノーツです"); break; } }); }
/// <summary> /// AirableノーツからAirHoldおよびAirUpCを取り外します。 /// AirHoldを取り外せた場合成功(true)となりますが、その場合AirUpCの出力引数がnullである可能性もあります。 /// </summary> public bool DetachAirHoldFromAirableNote(AirableNote airable, out AirHold airHold, out AirUpC air) { air = null; if (!DetachAirHoldFromAirableNote(airable, out airHold)) { return(false); } if (airable.IsAirAttached) { // NOTE: 本来AirHoldは単体で配置できず、かならずAirUpCが伴うはずであるが、何らかの原因でそうではない場合のために処理を分岐する。 air = airable.Air as AirUpC; if (air != null) { airable.DetachAir(); airNotes.Remove(air); } else { // NOTE: 取り付けられていたAirがAirUpCでないときはAirを取り外さず、出力引数airもnullとなる。 Logger.Warn("取り付けられていたAirはAirUpCではありませんでした。Airを削除しません。"); } } return(true); }