using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; namespace RimWorldAnimationStudio { public class ActorCard : MonoBehaviour { public Toggle initiatorToggle; public Dropdown selectActorLayerDropdown; public Dropdown bodyTypeDropdown; public InputField bodyOffsetXField; public InputField bodyOffsetZField; public Dropdown raceDropdown; public InputField raceOffsetXField; public InputField raceOffsetZField; private Actor actor { get { return Workspace.GetCurrentActor(); } } private PawnAnimationClip clip { get { return Workspace.GetCurrentPawnAnimationClip(); } } public void Awake() { UpdateRaceDropdown(); } public void Start() { // General events EventsManager.onAnimationDefChanged.AddListener(delegate { UpdateGUI(); }); EventsManager.onActorIDChanged.AddListener(delegate { UpdateGUI(); }); EventsManager.onDefNamesChanged.AddListener(delegate { UpdateRaceDropdown(); }); // Local events initiatorToggle.onValueChanged.AddListener(delegate { actor.initiator = initiatorToggle.isOn; Workspace.RecordEvent("Change in actor sex initiator status "); }); selectActorLayerDropdown.onValueChanged.AddListener(delegate { clip.Layer = selectActorLayerDropdown.options[selectActorLayerDropdown.value].text; Workspace.RecordEvent("Change in actor render layer"); }); bodyTypeDropdown.onValueChanged.AddListener(delegate { OnDropdownChanged(); }); bodyOffsetXField.onEndEdit.AddListener(delegate { OnInputFieldChanged(); }); bodyOffsetZField.onEndEdit.AddListener(delegate { OnInputFieldChanged(); }); raceDropdown.onValueChanged.AddListener(delegate { OnDropdownChanged(); }); raceOffsetXField.onEndEdit.AddListener(delegate { OnInputFieldChanged(); }); raceOffsetZField.onEndEdit.AddListener(delegate { OnInputFieldChanged(); }); // Initialize UpdateGUI(); } public void OnInputFieldChanged() { string bodyType = bodyTypeDropdown.options[bodyTypeDropdown.value].text; bodyType = string.IsNullOrEmpty(bodyType) ? "Male" : bodyType; float.TryParse(bodyOffsetXField.text, out float x); float.TryParse(bodyOffsetZField.text, out float z); actor.BodyTypeOffset.SetOffset(bodyType, new Vector2(x, z)); float.TryParse(raceOffsetXField.text, out x); float.TryParse(raceOffsetZField.text, out z); actor.SetPawnRaceOffset(new Vector2(x, z)); Workspace.RecordEvent("Actor offset"); } public void OnDropdownChanged() { actor.bodyType = bodyTypeDropdown.options[bodyTypeDropdown.value].text; if (raceDropdown.options[raceDropdown.value].text != actor.GetPawnRaceDef().defName) { Workspace.selectedBodyPart = null; } actor.SetPawnRaceDef(raceDropdown.options[raceDropdown.value].text); Workspace.RecordEvent("Actor body type/race change"); UpdateGUI(); } public void UpdateRaceDropdown() { raceDropdown.ClearOptions(); int index = raceDropdown.value; IEnumerable optionsList = DefaultTags.defNames.Concat(CustomTags.defNames); foreach (string defName in optionsList) { raceDropdown.options.Add(new Dropdown.OptionData(defName)); } raceDropdown.value = Mathf.Clamp(index, 0, raceDropdown.options.Count - 1); } public void UpdateGUI() { initiatorToggle.isOn = actor.Initiator; string layer = clip.Layer; selectActorLayerDropdown.SetValueWithoutNotify(selectActorLayerDropdown.options.FindIndex(x => x.text == layer)); string bodyType = actor.bodyType; bodyTypeDropdown.SetValueWithoutNotify(bodyTypeDropdown.options.FindIndex(x => x.text == bodyType)); bodyOffsetXField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.BodyTypeOffset.GetOffset(bodyType).x.ToString())); bodyOffsetZField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.BodyTypeOffset.GetOffset(bodyType).z.ToString())); bodyTypeDropdown.interactable = actor.GetPawnRaceDef().isHumanoid; bodyOffsetXField.interactable = actor.GetPawnRaceDef().isHumanoid; bodyOffsetZField.interactable = actor.GetPawnRaceDef().isHumanoid; string race = actor.GetPawnRaceDef().defName; raceDropdown.SetValueWithoutNotify(raceDropdown.options.FindIndex(x => x.text == race)); raceOffsetXField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.GetPawnRaceOffset().x.ToString())); raceOffsetZField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.GetPawnRaceOffset().z.ToString())); } } }