rimworld-animation-studio/Assets/Scripts/AnimationComponents/Actor.cs

119 lines
4.6 KiB
C#
Raw Normal View History

2022-09-13 05:36:34 +00:00
using System.Collections.Generic;
2022-09-21 21:15:25 +00:00
using System.Linq;
2022-09-13 05:36:34 +00:00
using System.Xml;
using System.Xml.Serialization;
using UnityEngine;
namespace RimWorldAnimationStudio
{
public class Actor
{
[XmlArray("defNames"), XmlArrayItem("li")] public List<string> defNames = new List<string>();
[XmlArray("bodyDefTypes"), XmlArrayItem("li")] public List<string> bodyDefTypes = new List<string>();
[XmlArray("requiredGender"), XmlArrayItem("li")] public List<string> requiredGender = new List<string>();
[XmlArray("requiredGenitals"), XmlArrayItem("li")] public List<string> requiredGenitals = new List<string>();
[XmlArray("raceOffsets"), XmlArrayItem("li")] public List<AlienRaceOffset> raceOffsets = new List<AlienRaceOffset>();
[XmlArray("blacklistedRaces"), XmlArrayItem("li")] public List<string> blacklistedRaces = new List<string>();
[XmlArray("tags"), XmlArrayItem("li")] public List<string> tags;
[XmlIgnore] public ActorGender gender;
2022-09-24 07:17:40 +00:00
[XmlIgnore] private AlienRaceDef alienRaceDef;
2022-09-21 21:15:25 +00:00
2022-09-13 05:36:34 +00:00
public BodyTypeOffset bodyTypeOffset = new BodyTypeOffset();
public bool initiator = false;
2022-09-21 21:15:25 +00:00
public bool controlGenitalAngle;
public bool isFucking;
public bool isFucked;
2022-09-27 05:56:35 +00:00
[XmlIgnore] public string bodyType = "Male";
public bool ShouldSerializedefNames() { return defNames.NotNullOrEmpty(); }
public bool ShouldSerializebodyDefTypes() { return bodyDefTypes.NotNullOrEmpty(); }
public bool ShouldSerializerequiredGender() { return requiredGender.NotNullOrEmpty(); }
public bool ShouldSerializerequiredGenitals() { return requiredGenitals.NotNullOrEmpty(); }
public bool ShouldSerializeraceOffsets() { return raceOffsets.NotNullOrEmpty(); }
public bool ShouldSerializeblacklistedRaces() { return blacklistedRaces.NotNullOrEmpty(); }
public bool ShouldSerializetags() { return tags.NotNullOrEmpty(); }
2022-09-26 04:10:41 +00:00
public bool ShouldSerializeinitiator() { return initiator; }
2022-09-21 21:15:25 +00:00
public bool ShouldSerializecontrolGenitalAngle() { return controlGenitalAngle; }
public bool ShouldSerializeisFucking() { return isFucking; }
public bool ShouldSerializeisFucked() { return isFucked; }
2022-09-24 07:17:40 +00:00
public AlienRaceDef GetAlienRaceDef()
{
if (alienRaceDef == null)
{ alienRaceDef = AlienRaceDefs.GetNamed("Human"); }
return alienRaceDef;
}
public void SetAlienRaceDef(string alienRaceDefName)
{
AlienRaceDef alienRaceDef = AlienRaceDefs.GetNamed(alienRaceDefName);
if (alienRaceDef != null)
{ this.alienRaceDef = alienRaceDef; }
}
2022-09-24 19:12:18 +00:00
public Vector3 GetAlienRaceOffset()
{
if (alienRaceDef == null)
{ alienRaceDef = AlienRaceDefs.GetNamed("Human"); }
AlienRaceOffset raceOffset = raceOffsets.FirstOrDefault(x => x.defName == alienRaceDef.defName);
if (raceOffset == null)
{
raceOffset = new AlienRaceOffset(alienRaceDef.defName);
raceOffsets.Add(raceOffset);
}
return raceOffset.GetOffset();
}
public void SetAlienRaceOffset(Vector2 offset)
{
if (alienRaceDef == null)
{ return; }
AlienRaceOffset raceOffset = raceOffsets.FirstOrDefault(x => x.defName == alienRaceDef.defName);
if (raceOffset == null)
{
raceOffset = new AlienRaceOffset(alienRaceDef.defName);
raceOffsets.Add(raceOffset);
}
raceOffset.SetOffset(offset);
}
2022-09-21 21:15:25 +00:00
public void ValidateData()
{
bodyDefTypes = bodyDefTypes.Intersect(Tags.bodyDefTypes.Concat(CustomTags.bodyDefTypes))?.ToList();
requiredGenitals = requiredGenitals.Intersect(Tags.bodyParts.Concat(CustomTags.bodyParts))?.ToList();
2022-09-26 04:10:41 +00:00
raceOffsets = raceOffsets.Except(raceOffsets.Where(x => x.OffsetIsZero()))?.ToList();
2022-09-21 21:15:25 +00:00
}
public bool MakeNew()
{
if (Workspace.animationDef == null)
{ Debug.LogWarning("Cannot make new actor - there is no AnimationDef"); return false; }
Workspace.animationDef.actors.Add(this);
foreach (AnimationStage stage in Workspace.animationDef.animationStages)
{
PawnAnimationClip clip = new PawnAnimationClip();
if (clip.MakeNew())
{
stage.animationClips.Add(clip);
stage.Initialize();
}
}
return true;
}
2022-09-13 05:36:34 +00:00
}
}