From ba3eb95ef3224a710ca86b719b8f03537b38c0e8 Mon Sep 17 00:00:00 2001 From: fu-majime Date: Wed, 17 Apr 2024 16:36:59 +0900 Subject: [PATCH] Insert / Delete Space --- Assets/Scripts/LevelEditor/Commands/Space.cs | 166 ++---------------- .../Scripts/LevelEditor/Timeline/Timeline.cs | 66 +++++-- 2 files changed, 68 insertions(+), 164 deletions(-) diff --git a/Assets/Scripts/LevelEditor/Commands/Space.cs b/Assets/Scripts/LevelEditor/Commands/Space.cs index f3466c5c7..9761aa350 100644 --- a/Assets/Scripts/LevelEditor/Commands/Space.cs +++ b/Assets/Scripts/LevelEditor/Commands/Space.cs @@ -15,176 +15,42 @@ namespace HeavenStudio.Editor.Commands public class MoveEntity : ICommand { private readonly List entityIDs = new(); - private EntityMove newMove; - private EntityMove lastMove; + private List newMoveBeat; + private List lastMoveBeat; - private struct EntityMove - { - public List beat; - public List layer; - - public EntityMove(List beat, List layer) - { - this.beat = beat; - this.layer = layer; - } - } - - public MoveEntity(List originalEntities, List newBeat, List newLayer) + public MoveEntity(List originalEntities, List newBeat) { entityIDs = originalEntities.Select(c => c.guid).ToList(); - newMove = new EntityMove(newBeat, newLayer); + newMoveBeat = newBeat; } public void Execute() { - lastMove = new EntityMove(); - lastMove.beat = new(); - lastMove.layer = new(); + lastMoveBeat = new(); + var beatmap = GameManager.instance.Beatmap; + var entities = new[] { beatmap.Entities, beatmap.TempoChanges, beatmap.VolumeChanges, beatmap.SectionMarkers } + .SelectMany(list => list); for (var i = 0; i < entityIDs.Count; i++) { - var entity = GameManager.instance.Beatmap.Entities.Find(c => c.guid == entityIDs[i]); + var movedEntity = entities.FirstOrDefault(c => c.guid == entityIDs[i]); - lastMove.beat.Add(entity.beat); - lastMove.layer.Add((int)entity["track"]); - - entity.beat = newMove.beat[i]; - entity["track"] = newMove.layer[i]; - - if (TimelineBlockManager.Instance.EntityMarkers.ContainsKey(entity.guid)) - TimelineBlockManager.Instance.EntityMarkers[entity.guid].SetColor((int)entity["track"]); + lastMoveBeat.Add(movedEntity.beat); + movedEntity.beat = newMoveBeat[i]; } } public void Undo() { - for (var i = 0; i < entityIDs.Count; i++) - { - var entity = GameManager.instance.Beatmap.Entities.Find(c => c.guid == entityIDs[i]); - - entity.beat = lastMove.beat[i]; - entity["track"] = lastMove.layer[i]; - - if (TimelineBlockManager.Instance.EntityMarkers.ContainsKey(entity.guid)) - TimelineBlockManager.Instance.EntityMarkers[entity.guid].SetColor((int)entity["track"]); - } - } - } - - public class InsertSpace : ICommand - { - private Guid entityId; - private double newBeat, lastBeat; - private SpecialTimeline.HoveringTypes type; - - public InsertSpace(Guid entityId, double newBeat, SpecialTimeline.HoveringTypes type) - { - this.entityId = entityId; - this.newBeat = newBeat; - this.type = type; - } - - public void Execute() - { - RiqEntity movedEntity = null; - switch (type) - { - case SpecialTimeline.HoveringTypes.TempoChange: - movedEntity = GameManager.instance.Beatmap.TempoChanges.Find(x => x.guid == entityId); - break; - case SpecialTimeline.HoveringTypes.VolumeChange: - movedEntity = GameManager.instance.Beatmap.VolumeChanges.Find(x => x.guid == entityId); - break; - case SpecialTimeline.HoveringTypes.SectionChange: - movedEntity = GameManager.instance.Beatmap.SectionMarkers.Find(x => x.guid == entityId); - break; - } - if (movedEntity != null) - { - lastBeat = movedEntity.beat; - movedEntity.beat = newBeat; - } - } - - public void Undo() - { - RiqEntity movedEntity = null; - switch (type) - { - case SpecialTimeline.HoveringTypes.TempoChange: - movedEntity = GameManager.instance.Beatmap.TempoChanges.Find(x => x.guid == entityId); - break; - case SpecialTimeline.HoveringTypes.VolumeChange: - movedEntity = GameManager.instance.Beatmap.VolumeChanges.Find(x => x.guid == entityId); - break; - case SpecialTimeline.HoveringTypes.SectionChange: - movedEntity = GameManager.instance.Beatmap.SectionMarkers.Find(x => x.guid == entityId); - break; - } - if (movedEntity != null) - { - movedEntity.beat = lastBeat; - } - } - } - - public class DeleteSpace : ICommand - { - private readonly List entityIDs = new(); - private EntityMove newMove; - private EntityMove lastMove; - - private struct EntityMove - { - public List beat; - public List layer; - - public EntityMove(List beat, List layer) - { - this.beat = beat; - this.layer = layer; - } - } - - public DeleteSpace(List originalEntities, List newBeat, List newLayer) - { - entityIDs = originalEntities.Select(c => c.guid).ToList(); - newMove = new EntityMove(newBeat, newLayer); - } - - public void Execute() - { - lastMove = new EntityMove(); - lastMove.beat = new(); - lastMove.layer = new(); + var beatmap = GameManager.instance.Beatmap; + var entities = new[] { beatmap.Entities, beatmap.TempoChanges, beatmap.VolumeChanges, beatmap.SectionMarkers } + .SelectMany(list => list); for (var i = 0; i < entityIDs.Count; i++) { - var entity = GameManager.instance.Beatmap.Entities.Find(c => c.guid == entityIDs[i]); + var movedEntity = entities.FirstOrDefault(c => c.guid == entityIDs[i]); - lastMove.beat.Add(entity.beat); - lastMove.layer.Add((int)entity["track"]); - - entity.beat = newMove.beat[i]; - entity["track"] = newMove.layer[i]; - - if (TimelineBlockManager.Instance.EntityMarkers.ContainsKey(entity.guid)) - TimelineBlockManager.Instance.EntityMarkers[entity.guid].SetColor((int)entity["track"]); - } - } - - public void Undo() - { - for (var i = 0; i < entityIDs.Count; i++) - { - var entity = GameManager.instance.Beatmap.Entities.Find(c => c.guid == entityIDs[i]); - - entity.beat = lastMove.beat[i]; - entity["track"] = lastMove.layer[i]; - - if (TimelineBlockManager.Instance.EntityMarkers.ContainsKey(entity.guid)) - TimelineBlockManager.Instance.EntityMarkers[entity.guid].SetColor((int)entity["track"]); + movedEntity.beat = lastMoveBeat[i]; } } } diff --git a/Assets/Scripts/LevelEditor/Timeline/Timeline.cs b/Assets/Scripts/LevelEditor/Timeline/Timeline.cs index 3af97d883..aa2a8d6e0 100644 --- a/Assets/Scripts/LevelEditor/Timeline/Timeline.cs +++ b/Assets/Scripts/LevelEditor/Timeline/Timeline.cs @@ -937,26 +937,64 @@ namespace HeavenStudio.Editor.Track public void InsertSpace() { - Debug.Log($"{snapInterval} {PlaybackBeat}"); - - // List newBeats = new(); - // List lastLayers = new(); - // foreach (var marker in Selections.instance.eventsSelected) - // { - // var entity = marker.entity; + List originalEntities = new(); + List newBeats = new(); - // lastBeats.Add(marker.entity.beat); - // lastLayers.Add((int)marker.entity["track"]); + var beatmap = GameManager.instance.Beatmap; + var specialEntities = new[] { beatmap.TempoChanges, beatmap.VolumeChanges, beatmap.SectionMarkers } + .SelectMany(list => list); - // entity.beat = marker.lastBeat; - // entity["track"] = marker.lastLayer; - // } - // CommandManager.Instance.AddCommand(new Commands.MoveEntity(Selections.instance.eventsSelected.Select(c => c.entity).ToList(), lastBeats, lastLayers)); + foreach (var entity in beatmap.Entities) + { + var entityBeat = entity.beat; + if (entityBeat >= PlaybackBeat) + { + originalEntities.Add(entity); + newBeats.Add(entityBeat + snapInterval); + } + } + foreach (var entity in specialEntities) + { + var entityBeat = entity.beat; + if (entityBeat >= PlaybackBeat && entityBeat > 0) + { + originalEntities.Add(entity); + newBeats.Add(entityBeat + snapInterval); + } + } + + if (originalEntities.Count > 0) CommandManager.Instance.AddCommand(new Commands.MoveEntity(originalEntities, newBeats)); } public void DeleteSpace() { - Debug.Log($"{snapInterval} {PlaybackBeat}"); + List originalEntities = new(); + List newBeats = new(); + + var beatmap = GameManager.instance.Beatmap; + var specialEntities = new[] { beatmap.TempoChanges, beatmap.VolumeChanges, beatmap.SectionMarkers } + .SelectMany(list => list); + + foreach (var entity in beatmap.Entities) + { + var entityBeat = entity.beat; + if (entityBeat - snapInterval >= PlaybackBeat) + { + originalEntities.Add(entity); + newBeats.Add(entityBeat - snapInterval); + } + } + foreach (var entity in specialEntities) + { + var entityBeat = entity.beat; + if (entityBeat - snapInterval >= PlaybackBeat && entityBeat > 0) + { + originalEntities.Add(entity); + newBeats.Add(entityBeat - snapInterval); + } + } + + if (originalEntities.Count > 0) CommandManager.Instance.AddCommand(new Commands.MoveEntity(originalEntities, newBeats)); } public float SnapToLayer(float y)