using System.Collections.Generic; using System.Linq; using System.Xml; using System.Xml.Serialization; using UnityEngine; namespace RimWorldAnimationStudio { public class Actor { [XmlArray("defNames"), XmlArrayItem("li")] public List defNames = new List(); [XmlArray("bodyDefTypes"), XmlArrayItem("li")] public List bodyDefTypes = new List(); [XmlArray("requiredGender"), XmlArrayItem("li")] public List requiredGender = new List(); [XmlArray("requiredGenitals"), XmlArrayItem("li")] public List requiredGenitals = new List(); [XmlArray("raceOffsets"), XmlArrayItem("li")] public List raceOffsets = new List(); [XmlArray("blacklistedRaces"), XmlArrayItem("li")] public List blacklistedRaces = new List(); [XmlArray("tags"), XmlArrayItem("li")] public List tags; [XmlIgnore] public ActorGender gender; [XmlIgnore] public string raceDef; public BodyTypeOffset bodyTypeOffset = new BodyTypeOffset(); public bool initiator = false; public bool controlGenitalAngle; public bool isFucking; public bool isFucked; 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(); } public bool ShouldSerializecontrolGenitalAngle() { return controlGenitalAngle; } public bool ShouldSerializeisFucking() { return isFucking; } public bool ShouldSerializeisFucked() { return isFucked; } public void ValidateData() { defNames = defNames.Intersect(Tags.defNames.Concat(CustomTags.defNames))?.ToList(); bodyDefTypes = bodyDefTypes.Intersect(Tags.bodyDefTypes.Concat(CustomTags.bodyDefTypes))?.ToList(); requiredGenitals = requiredGenitals.Intersect(Tags.bodyParts.Concat(CustomTags.bodyParts))?.ToList(); } 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; } } }