LADXHD/InGame/SaveLoad/AnimatorSaveLoad.cs
2023-12-14 17:21:22 -05:00

139 lines
5.4 KiB
C#

using System;
using System.IO;
using Microsoft.Xna.Framework;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.SaveLoad
{
public class AnimatorSaveLoad
{
public static void SaveAnimator(string path, Animator animator)
{
var pathTemp = path + ".temp";
var writer = new StreamWriter(pathTemp);
var saveString = animator.SpritePath;
// animation version
writer.WriteLine("1");
writer.WriteLine(saveString);
for (var i = 0; i < animator.Animations.Count; i++)
{
saveString = animator.Animations[i].Id + ";";
saveString += animator.Animations[i].NextAnimation + ";";
saveString += animator.Animations[i].LoopCount + ";";
saveString += animator.Animations[i].Offset.X + ";";
saveString += animator.Animations[i].Offset.Y + ";";
saveString += animator.Animations[i].Frames.Length;
// write frames
for (var j = 0; j < animator.Animations[i].Frames.Length; j++)
{
saveString += ";" +
animator.Animations[i].Frames[j].FrameTime + ";" +
animator.Animations[i].Frames[j].SourceRectangle.X + ";" +
animator.Animations[i].Frames[j].SourceRectangle.Y + ";" +
animator.Animations[i].Frames[j].SourceRectangle.Width + ";" +
animator.Animations[i].Frames[j].SourceRectangle.Height + ";" +
animator.Animations[i].Frames[j].Offset.X + ";" +
animator.Animations[i].Frames[j].Offset.Y + ";" +
animator.Animations[i].Frames[j].CollisionRectangle.X + ";" +
animator.Animations[i].Frames[j].CollisionRectangle.Y + ";" +
animator.Animations[i].Frames[j].CollisionRectangle.Width + ";" +
animator.Animations[i].Frames[j].CollisionRectangle.Height + ";" +
animator.Animations[i].Frames[j].MirroredV + ";" +
animator.Animations[i].Frames[j].MirroredH;
}
writer.WriteLine(saveString);
}
writer.Close();
File.Delete(path);
File.Move(pathTemp, path);
}
public static Animator LoadAnimator(string animatorId)
{
// TODO_End: preload all the animations
return LoadAnimatorFile(Values.PathAnimationFolder + animatorId + ".ani");
}
public static Animator LoadAnimatorFile(string filePath)
{
if (!File.Exists(filePath))
return null;
var reader = new StreamReader(filePath);
var animator = new Animator();
var version = reader.ReadLine();
animator.SpritePath = reader.ReadLine();
animator.SprTexture = Resources.GetTexture(animator.SpritePath);
// load the animations
while (!reader.EndOfStream)
{
var strLine = reader.ReadLine();
if (strLine == null)
continue;
var strSplit = strLine.Split(';');
if (strSplit.Length < 16)
continue;
var pos = 0;
var animationId = strSplit[pos].ToLower();
var animation = new Animation(animationId);
animation.NextAnimation = strSplit[pos += 1].ToLower();
animation.LoopCount = Convert.ToInt32(strSplit[pos += 1]);
animation.Offset.X = Convert.ToInt32(strSplit[pos += 1]);
animation.Offset.Y = Convert.ToInt32(strSplit[pos += 1]);
var frames = Convert.ToInt32(strSplit[pos += 1]);
animation.Frames = new Frame[frames];
animator.AddAnimation(animation);
for (var i = 0; i < frames; i++)
{
animator.SetFrameAt(animationId, i, new Frame()
{
FrameTime = Convert.ToInt32(strSplit[pos += 1]),
SourceRectangle = new Rectangle(
Convert.ToInt32(strSplit[pos += 1]), Convert.ToInt32(strSplit[pos += 1]),
Convert.ToInt32(strSplit[pos += 1]), Convert.ToInt32(strSplit[pos += 1])),
Offset = new Point(Convert.ToInt32(strSplit[pos += 1]), Convert.ToInt32(strSplit[pos += 1])),
CollisionRectangle = new Rectangle(
Convert.ToInt32(strSplit[pos += 1]), Convert.ToInt32(strSplit[pos += 1]),
Convert.ToInt32(strSplit[pos += 1]), Convert.ToInt32(strSplit[pos += 1])),
MirroredV = Convert.ToBoolean(strSplit[pos += 1]),
MirroredH = Convert.ToBoolean(strSplit[pos += 1])
});
}
}
reader.Close();
return animator;
}
}
}