void addRawItem(IRawAffItem item) { if (item is RawAffTiming) { Timings.Add(new ArcTiming(item as RawAffTiming)); } else if (item is RawAffTap) { Taps.Add(new ArcTap(item as RawAffTap)); } else if (item is RawAffHold) { Holds.Add(new ArcHold(item as RawAffHold)); } else if (item is RawAffArc) { Arcs.Add(new ArcArc(item as RawAffArc)); } else if (item is RawAffCamera) { Cameras.Add(new ArcCamera(item as RawAffCamera)); } else if (item is RawAffSceneControl) { SceneControl.Add(new ArcSceneControl(item as RawAffSceneControl)); } }
static void writeItem(TextWriter writer, IRawAffItem item) { if (item is RawAffTiming) { var timing = item as RawAffTiming; writer.WriteLine($"timing({timing.Timing},{timing.Bpm.ToString("f2")},{timing.BeatsPerLine.ToString("f2")});"); } else if (item is RawAffTap) { var tap = item as RawAffTap; writer.WriteLine($"({tap.Timing},{tap.Track});"); } else if (item is RawAffHold) { var hold = item as RawAffHold; writer.WriteLine($"hold({hold.Timing},{hold.EndTiming},{hold.Track});"); } else if (item is RawAffArc) { var arc = item as RawAffArc; if (arc.ArcTaps.Count > 0) { arc.IsVoid = true; } writer.WriteLine($"arc({arc.Timing},{arc.EndTiming},{arc.XStart.ToString("f2")},{arc.XEnd.ToString("f2")}" + $",{ArcChart.ToLineTypeString(arc.LineType)},{arc.YStart.ToString("f2")},{arc.YEnd.ToString("f2")},{arc.Color},none,{arc.IsVoid.ToString().ToLower()})" + (arc.ArcTaps.Count > 0?$"[{string.Join(",",arc.ArcTaps.Select(e=>$"arctap({e.Timing})"))}]":"") + ";"); } else if (item is RawAffCamera) { var cam = item as RawAffCamera; writer.WriteLine($"camera({cam.Timing},{cam.MoveX.ToString("f2")},{cam.MoveY.ToString("f2")},{cam.MoveZ.ToString("f2")}," + $"{cam.RotateX.ToString("f2")},{cam.RotateY.ToString("f2")},{cam.RotateZ.ToString("f2")},{ArcChart.ToCameraTypeString(cam.CameraType)},{cam.Duration});"); } else if (item is RawAffSceneControl) { var scenecontrol = item as RawAffSceneControl; List <string> values = new List <string>(); values.Add(scenecontrol.Timing.ToString()); values.Add(scenecontrol.Type); foreach (var @param in scenecontrol.Params) { if (@param is RawAffInt) { values.Add((@param as RawAffInt).data.ToString()); } else if (@param is RawAffFloat) { values.Add((@param as RawAffFloat).data.ToString("f2")); } else if (@param is RawAffWord) { values.Add((@param as RawAffWord).data); } } writer.WriteLine($"scenecontrol({string.Join(",",values)});"); } }
void addRawItem(IRawAffItem item, ArcTimingGroup timingGroup) { if (item is RawAffTiming) { if (timingGroup == null) { Timings.Add(new ArcTiming(item as RawAffTiming)); } else { timingGroup.Timings.Add(new ArcTiming(item as RawAffTiming)); } } else if (item is RawAffTap) { Taps.Add(new ArcTap(item as RawAffTap, timingGroup)); } else if (item is RawAffHold) { Holds.Add(new ArcHold(item as RawAffHold, timingGroup)); } else if (item is RawAffArc) { Arcs.Add(new ArcArc(item as RawAffArc, timingGroup)); } else if (item is RawAffCamera) { Cameras.Add(new ArcCamera(item as RawAffCamera)); } else if (item is RawAffSceneControl) { SceneControl.Add(new ArcSceneControl(item as RawAffSceneControl, timingGroup)); } else if (item is RawAffTimingGroup) { ArcTimingGroup arcTimingGroup = new ArcTimingGroup() { Id = TimingGroups.Count + 1, Type = (item as RawAffTimingGroup).Type, }; TimingGroups.Add(arcTimingGroup); foreach (var nestedItem in (item as RawAffTimingGroup).Items) { addRawItem(nestedItem, arcTimingGroup); } } }
void GenTimingGroup(ArcaeaFileFormatParser.EventContext context) { RejectSubevents(context, "timinggroup"); LimitValuesCount(context, "timinggroup", 1); List <IRawAffNestableItem> items = new List <IRawAffNestableItem>(); TimingGroupType? timingGroupType = TimingGroupType.Normal; if (context.values().value().Length > 0) { var rawTimingGroupType = CheckValueType <RawAffWord>(context.values().value()[0], "arc", "arc 类型"); timingGroupType = ParseWord(timingGroupTypes, rawTimingGroupType.data, context.values().value()[0], "arc", "arc 类型"); } foreach (var item in context.segment().body().item()) { IRawAffEvent @event = item.@event().value; if (!(@event is IRawAffItem)) { chart.warning.Add($"第 {item.@event().Start.Line + lineOffset} 行第 {item.@event().Start.Column + 1} 列,不可作为物件使用的事件:{item.@event().GetText()},此事件将被忽略"); continue; } IRawAffItem rawItem = @event as IRawAffItem; if (!(rawItem is IRawAffNestableItem)) { chart.warning.Add($"第 {item.Start.Line + lineOffset} 行第 {item.Start.Column + 1} 列,不可在 timinggroup 中嵌套使用的物件:{item.@event().GetText()},此物件将被忽略"); nonNestableItems.Add(rawItem); continue; } items.Add(rawItem as IRawAffNestableItem); } if (timingGroupType == null) { return; } context.value = new RawAffTimingGroup() { Items = items, Type = timingGroupType.Value, }; }