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] private AlienRaceDef alienRaceDef; public BodyTypeOffset bodyTypeOffset = new BodyTypeOffset(); public bool initiator = false; public bool controlGenitalAngle; public bool isFucking; public bool isFucked; [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(); } public bool ShouldSerializeinitiator() { return initiator; } public bool ShouldSerializecontrolGenitalAngle() { return controlGenitalAngle; } public bool ShouldSerializeisFucking() { return isFucking; } public bool ShouldSerializeisFucked() { return isFucked; } 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; } } 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); } public void ValidateData() { bodyDefTypes = bodyDefTypes.Intersect(Tags.bodyDefTypes.Concat(CustomTags.bodyDefTypes))?.ToList(); requiredGenitals = requiredGenitals.Intersect(Tags.bodyParts.Concat(CustomTags.bodyParts))?.ToList(); raceOffsets = raceOffsets.Except(raceOffsets.Where(x => x.OffsetIsZero()))?.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; } } }