HeavenStudioPlus/Assets/Scripts/LevelEditor/Commands/SpecialMarker.cs

236 lines
9.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Jukebox;
using HeavenStudio.Editor.Track;
using Newtonsoft.Json;
using UnityEditor;
using UnityEngine.Timeline;
namespace HeavenStudio.Editor.Commands
{
public class AddMarker : ICommand
{
private RiqEntity placedEntityData;
private Guid placedEventID;
private int placedTimes = 0;
private SpecialTimeline.HoveringTypes type;
public AddMarker(RiqEntity placedEntityData, Guid placedEventID, SpecialTimeline.HoveringTypes type)
{
this.placedEntityData = placedEntityData.DeepCopy();
this.placedEventID = placedEventID;
this.type = type;
}
public void Execute()
{
if (placedTimes > 0)
{
var entity = placedEntityData.DeepCopy();
entity.guid = placedEventID;
switch (type)
{
case SpecialTimeline.HoveringTypes.TempoChange:
GameManager.instance.Beatmap.TempoChanges.Add(entity);
SpecialTimeline.instance.AddTempoChange(false, entity);
break;
case SpecialTimeline.HoveringTypes.VolumeChange:
GameManager.instance.Beatmap.VolumeChanges.Add(entity);
SpecialTimeline.instance.AddVolumeChange(false, entity);
break;
case SpecialTimeline.HoveringTypes.SectionChange:
GameManager.instance.Beatmap.SectionMarkers.Add(entity);
SpecialTimeline.instance.AddChartSection(false, entity);
break;
}
GameManager.instance.SortEventsList();
}
placedTimes++;
}
public void Undo()
{
RiqEntity createdEntity = null;
switch (type)
{
case SpecialTimeline.HoveringTypes.TempoChange:
createdEntity = GameManager.instance.Beatmap.TempoChanges.Find(x => x.guid == placedEventID);
break;
case SpecialTimeline.HoveringTypes.VolumeChange:
createdEntity = GameManager.instance.Beatmap.VolumeChanges.Find(x => x.guid == placedEventID);
break;
case SpecialTimeline.HoveringTypes.SectionChange:
createdEntity = GameManager.instance.Beatmap.SectionMarkers.Find(x => x.guid == placedEventID);
break;
}
if (createdEntity != null)
{
placedEntityData = createdEntity.DeepCopy();
var marker = SpecialTimeline.instance.specialTimelineObjs[createdEntity.guid];
switch (type)
{
case SpecialTimeline.HoveringTypes.TempoChange:
GameManager.instance.Beatmap.TempoChanges.Remove(createdEntity);
break;
case SpecialTimeline.HoveringTypes.VolumeChange:
GameManager.instance.Beatmap.VolumeChanges.Remove(createdEntity);
break;
case SpecialTimeline.HoveringTypes.SectionChange:
GameManager.instance.Beatmap.SectionMarkers.Remove(createdEntity);
break;
}
SpecialTimeline.instance.specialTimelineObjs.Remove(createdEntity.guid);
GameObject.Destroy(marker.gameObject);
GameManager.instance.SortEventsList();
}
}
}
public class DeleteMarker : ICommand
{
private RiqEntity deletedEntityData;
private Guid deletedEventID;
private SpecialTimeline.HoveringTypes type;
public DeleteMarker(Guid deletedEventID, SpecialTimeline.HoveringTypes type)
{
this.deletedEventID = deletedEventID;
this.type = type;
}
public void Execute()
{
RiqEntity deletedEntity = null;
switch (type)
{
case SpecialTimeline.HoveringTypes.TempoChange:
deletedEntity = GameManager.instance.Beatmap.TempoChanges.Find(x => x.guid == deletedEventID);
break;
case SpecialTimeline.HoveringTypes.VolumeChange:
deletedEntity = GameManager.instance.Beatmap.VolumeChanges.Find(x => x.guid == deletedEventID);
break;
case SpecialTimeline.HoveringTypes.SectionChange:
deletedEntity = GameManager.instance.Beatmap.SectionMarkers.Find(x => x.guid == deletedEventID);
break;
}
if (deletedEntity != null)
{
SpecialTimelineObj marker = SpecialTimeline.instance.specialTimelineObjs[deletedEventID];
deletedEntityData = deletedEntity.DeepCopy();
deletedEntityData.guid = deletedEventID;
switch (type)
{
case SpecialTimeline.HoveringTypes.TempoChange:
GameManager.instance.Beatmap.TempoChanges.Remove(deletedEntity);
break;
case SpecialTimeline.HoveringTypes.VolumeChange:
GameManager.instance.Beatmap.VolumeChanges.Remove(deletedEntity);
break;
case SpecialTimeline.HoveringTypes.SectionChange:
GameManager.instance.Beatmap.SectionMarkers.Remove(deletedEntity);
break;
}
SpecialTimeline.instance.specialTimelineObjs.Remove(deletedEventID);
GameObject.Destroy(marker.gameObject);
GameManager.instance.SortEventsList();
}
}
public void Undo()
{
if (deletedEntityData != null)
{
switch (type)
{
case SpecialTimeline.HoveringTypes.TempoChange:
GameManager.instance.Beatmap.TempoChanges.Add(deletedEntityData);
SpecialTimeline.instance.AddTempoChange(false, deletedEntityData);
break;
case SpecialTimeline.HoveringTypes.VolumeChange:
GameManager.instance.Beatmap.VolumeChanges.Add(deletedEntityData);
SpecialTimeline.instance.AddVolumeChange(false, deletedEntityData);
break;
case SpecialTimeline.HoveringTypes.SectionChange:
GameManager.instance.Beatmap.SectionMarkers.Add(deletedEntityData);
SpecialTimeline.instance.AddChartSection(false, deletedEntityData);
break;
}
deletedEntityData = null;
GameManager.instance.SortEventsList();
}
}
}
public class MoveMarker : ICommand
{
private Guid entityId;
private double newBeat, lastBeat;
private SpecialTimeline.HoveringTypes type;
public MoveMarker(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;
}
}
}
}