using System; using System.Collections; using System.Collections.Generic; using Ichni.RhythmGame.Beatmap; using UnityEngine; namespace Ichni.RhythmGame { public partial class Scale : AnimationBase { public TransformSubmodule targetTransformSubmodule; public FlexibleFloat scaleX, scaleY, scaleZ; public static Scale GenerateElement(string elementName, Guid id, List tags, bool isFirstGenerated, GameElement animatedObject, FlexibleFloat scaleX, FlexibleFloat scaleY, FlexibleFloat scaleZ) { Scale scale = Instantiate(GameManager.instance.basePrefabs.emptyObject).AddComponent(); scale.Initialize(elementName, id, tags, isFirstGenerated, animatedObject); scale.animatedObject = animatedObject; scale.scaleX = scaleX; scale.scaleY = scaleY; scale.scaleZ = scaleZ; scale.animationReturnType = FlexibleReturnType.Before; scale.targetTransformSubmodule = (animatedObject as IHaveTransformSubmodule).transformSubmodule; //scale.timeDurationSubmodule.SetDuration(scaleX, scaleY, scaleZ); return scale; } public override void SetDefaultSubmodules() { timeDurationSubmodule = new TimeDurationSubmodule(this); } protected override void UpdateAnimation(float songTime) { scaleX.UpdateFlexibleFloat(songTime); scaleY.UpdateFlexibleFloat(songTime); scaleZ.UpdateFlexibleFloat(songTime); if (scaleX.returnType is FlexibleReturnType.MiddleExecuting || scaleY.returnType is FlexibleReturnType.MiddleExecuting || scaleZ.returnType is FlexibleReturnType.MiddleExecuting) { animationReturnType = FlexibleReturnType.MiddleExecuting; Vector3 currentScale = new Vector3(scaleX.value, scaleY.value, scaleZ.value); targetTransformSubmodule.scaleOffset += currentScale; targetTransformSubmodule.scaleDirtyMark = true; } else if (scaleX.isSwitchingReturnType || scaleY.isSwitchingReturnType || scaleZ.isSwitchingReturnType) { animationReturnType = FlexibleReturnType.MiddleExecuting; Vector3 currentScale = new Vector3(scaleX.value, scaleY.value, scaleZ.value); targetTransformSubmodule.scaleOffset += currentScale; targetTransformSubmodule.scaleDirtyMark = true; } else { animationReturnType = FlexibleReturnType.MiddleInterval; } } public override void ApplyTimeOffset(float offset) { base.ApplyTimeOffset(offset); scaleX.animations.ForEach(anim => anim.ApplyTimeOffset(offset)); scaleY.animations.ForEach(anim => anim.ApplyTimeOffset(offset)); scaleZ.animations.ForEach(anim => anim.ApplyTimeOffset(offset)); } } public partial class Scale { public override void SaveBM() { matchedBM = new Scale_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM, scaleX.ConvertToBM(), scaleY.ConvertToBM(), scaleZ.ConvertToBM()); } } namespace Beatmap { public class Scale_BM : GameElement_BM { public FlexibleFloat_BM scaleX, scaleY, scaleZ; public Scale_BM() { } public Scale_BM(string elementName, Guid elementGuid, List tags, GameElement_BM attachedElement, FlexibleFloat_BM scaleX, FlexibleFloat_BM scaleY, FlexibleFloat_BM scaleZ) : base(elementName, elementGuid, tags, attachedElement) { this.scaleX = scaleX; this.scaleY = scaleY; this.scaleZ = scaleZ; } public override void ExecuteBM() { matchedElement = Scale.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid), scaleX.ConvertToGameType(), scaleY.ConvertToGameType(), scaleZ.ConvertToGameType()); } } } }