using System; using System.Collections; using System.Collections.Generic; using Ichni.RhythmGame.Beatmap; namespace Ichni.RhythmGame { public partial class Track : GameElement, IHaveTransformSubmodule, IHaveTimeDurationSubmodule { public TransformSubmodule transformSubmodule { get; set; } public TimeDurationSubmodule timeDurationSubmodule { get; set; } public TrackPathSubmodule trackPathSubmodule { get; set; } public TrackTimeSubmodule trackTimeSubmodule { get; set; } public TrackRendererSubmodule trackRendererSubmodule { get; set; } public static Track GenerateElement(string elementName, Guid id, List tags, bool isFirstGenerated, GameElement parentElement) { Track track = Instantiate(GameManager.instance.basePrefabs.track, parentElement.transform).GetComponent(); track.Initialize(elementName, id, tags, isFirstGenerated, parentElement); if (parentElement is ElementFolder folder) { folder.trackList.Add(track); } return track; } public override void SetDefaultSubmodules() { transformSubmodule = new TransformSubmodule(this); timeDurationSubmodule = new TimeDurationSubmodule(this); trackPathSubmodule = new TrackPathSubmodule(this, TrackSpaceType.CatmullRom, TrackSamplingType.TimeDistributed, false, false); trackTimeSubmodule = null; trackRendererSubmodule = null; } private void Update() { if (!GameManager.instance.audioManager.isUpdating) { return; } if (timeDurationSubmodule.CheckTimeInDuration(GameManager.instance.songTime)) { (trackTimeSubmodule as TrackTimeSubmoduleMovable)?.UpdateTrackPart(); } } public override void AfterInitialize() { base.AfterInitialize(); if (trackPathSubmodule != null && trackPathSubmodule.pathNodeList.Count > 3) { trackPathSubmodule.ClosePath(); } } public override void Refresh() { base.Refresh(); trackPathSubmodule?.Refresh(); trackTimeSubmodule?.Refresh(); trackRendererSubmodule?.Refresh(); } public override void OnDelete() { if (parentElement is ElementFolder folder) folder.trackList.Remove(this); } } public partial class Track { public override void SaveBM() { matchedBM = new Track_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM); } } public partial class Track { public enum TrackSpaceType { CatmullRom = 0, BSpline = 1, Linear = 3 } public enum TrackSamplingType { TimeDistributed = 0, DistanceDistributed = 1 } } namespace Beatmap { public class Track_BM : GameElement_BM { public Track_BM() { } public Track_BM(string elementName, Guid elementGuid, List tags, GameElement_BM attachedElement) : base(elementName, elementGuid, tags, attachedElement) { } public override void ExecuteBM() { matchedElement = Track.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid)); } public override GameElement DuplicateBM(GameElement parent) { return Track.GenerateElement(elementName, Guid.NewGuid(), tags, false, parent); } } } }