using System.Collections.Generic; using System.Xml; using System.Xml.Serialization; namespace RimWorldAnimationStudio { public class ThingAnimationClip : AnimationClip { [XmlAttribute("Class")] public string className = "Rimworld_Animations.PawnAnimationClip"; [XmlArray("keyframes"), XmlArrayItem("li")] public List keyframes = new List(); public string layer = "Pawn"; [XmlIgnore] public SimpleCurve PositionX = new SimpleCurve(); [XmlIgnore] public SimpleCurve PositionZ = new SimpleCurve(); [XmlIgnore] public SimpleCurve Rotation = new SimpleCurve(); public override void BuildSimpleCurves() { int duration = 0; //getting the length of the whole clip foreach (ThingKeyframe frame in keyframes) { duration += frame.tickDuration; } //guarantees loops don't get cut off mid-anim this.duration = duration; int keyframePosition = 0; foreach (ThingKeyframe frame in keyframes) { if (frame.atTick.HasValue) { if (frame.positionX.HasValue) PositionX.Add((float)frame.atTick / (float)duration, frame.positionX.Value, true); if (frame.positionZ.HasValue) PositionZ.Add((float)frame.atTick / (float)duration, frame.positionZ.Value, true); if (frame.rotation.HasValue) Rotation.Add((float)frame.atTick / (float)duration, frame.rotation.Value, true); if (frame.soundEffect != null) { SoundEffects.Add((int)frame.atTick, frame.soundEffect); } } else { if (frame.positionX.HasValue) PositionX.Add((float)keyframePosition / (float)duration, frame.positionX.Value, true); if (frame.positionZ.HasValue) PositionZ.Add((float)keyframePosition / (float)duration, frame.positionZ.Value, true); if (frame.rotation.HasValue) Rotation.Add((float)keyframePosition / (float)duration, frame.rotation.Value, true); if (frame.soundEffect != null) { SoundEffects.Add(keyframePosition, frame.soundEffect); } keyframePosition += frame.tickDuration; } } } } }