diff --git a/.vs/RimWorld-Animation-Studio/v16/.suo b/.vs/RimWorld-Animation-Studio/v16/.suo index eb8258c5..72483081 100644 Binary files a/.vs/RimWorld-Animation-Studio/v16/.suo and b/.vs/RimWorld-Animation-Studio/v16/.suo differ diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj index 2072ee29..8d10be0f 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -63,7 +63,6 @@ - @@ -97,6 +96,7 @@ + @@ -112,6 +112,7 @@ + @@ -131,6 +132,7 @@ + C:/Program Files/Unity/Hub/Editor/2019.4.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.dll diff --git a/Assets/DecimalValidator.cs b/Assets/DecimalValidator.cs deleted file mode 100644 index 7aa9d119..00000000 --- a/Assets/DecimalValidator.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.UI; - -public class DecimalValidator : MonoBehaviour -{ - public void Start() - { - InputField inputField = GetComponent(); - - if (inputField) - { - inputField.characterValidation = InputField.CharacterValidation.Decimal; - inputField.onEndEdit.AddListener(delegate { MakeDecimal(); }); - } - } - - public void MakeDecimal() - { - InputField inputField = GetComponent(); - - if (inputField) - { inputField.text = string.Format("{0:0.00}", float.Parse(inputField.text)); } - } -} diff --git a/Assets/Resources/Prefabs/OptionToggle.prefab b/Assets/Resources/Prefabs/OptionToggle.prefab index 9743d492..8c98fefa 100644 --- a/Assets/Resources/Prefabs/OptionToggle.prefab +++ b/Assets/Resources/Prefabs/OptionToggle.prefab @@ -149,6 +149,124 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1523116857268836976 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6027415342802426294} + - component: {fileID: 6467300103242436351} + - component: {fileID: 4878850006335192594} + - component: {fileID: 2208470949959229117} + m_Layer: 5 + m_Name: DeleteButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &6027415342802426294 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1523116857268836976} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8789161981077347466} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -20, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6467300103242436351 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1523116857268836976} + m_CullTransparentMesh: 0 +--- !u!114 &4878850006335192594 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1523116857268836976} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: b0310c99dea57fb4d94c4d001d8e0ccf, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &2208470949959229117 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1523116857268836976} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4878850006335192594} + m_OnClick: + m_PersistentCalls: + m_Calls: [] --- !u!1 &5741932533636286456 GameObject: m_ObjectHideFlags: 0 @@ -258,6 +376,7 @@ RectTransform: m_Children: - {fileID: 9117359654058994387} - {fileID: 7815899355165658205} + - {fileID: 6027415342802426294} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index f5cd06d4..f4cbb151 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -503,6 +503,7 @@ GameObject: - component: {fileID: 74082977} - component: {fileID: 74082976} - component: {fileID: 74082975} + - component: {fileID: 74082978} m_Layer: 5 m_Name: CyclesNormalField m_TagString: Untagged @@ -642,6 +643,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 74082973} m_CullTransparentMesh: 0 +--- !u!114 &74082978 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 74082973} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 1 --- !u!1 &77649835 GameObject: m_ObjectHideFlags: 0 @@ -1961,6 +1975,7 @@ GameObject: - component: {fileID: 254347860} - component: {fileID: 254347859} - component: {fileID: 254347858} + - component: {fileID: 254347862} m_Layer: 5 m_Name: headBobField m_TagString: Untagged @@ -2100,6 +2115,19 @@ RectTransform: m_AnchoredPosition: {x: 150, y: -24} m_SizeDelta: {x: 56.79773, y: 30} m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &254347862 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 254347857} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 2 --- !u!1 &257242825 GameObject: m_ObjectHideFlags: 0 @@ -2397,6 +2425,84 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 276491993} m_CullTransparentMesh: 0 +--- !u!1 &278535031 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 278535032} + - component: {fileID: 278535034} + - component: {fileID: 278535033} + m_Layer: 5 + m_Name: SelectRaceText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &278535032 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 278535031} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 935483303140078260} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -121.45, y: -153} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &278535033 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 278535031} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Select race +--- !u!222 &278535034 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 278535031} + m_CullTransparentMesh: 0 --- !u!1 &284483058 GameObject: m_ObjectHideFlags: 0 @@ -3539,6 +3645,84 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &394719256 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 394719257} + - component: {fileID: 394719259} + - component: {fileID: 394719258} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &394719257 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 394719256} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1845596333} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &394719258 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 394719256} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Human +--- !u!222 &394719259 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 394719256} + m_CullTransparentMesh: 0 --- !u!1 &395375411 GameObject: m_ObjectHideFlags: 0 @@ -5314,7 +5498,7 @@ MonoBehaviour: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_SelectedColor: {r: 1, g: 0, b: 0, a: 1} m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 m_FadeDuration: 0.1 @@ -7773,6 +7957,7 @@ GameObject: - component: {fileID: 725162534} - component: {fileID: 725162533} - component: {fileID: 725162532} + - component: {fileID: 725162535} m_Layer: 5 m_Name: rotationField m_TagString: Untagged @@ -7912,6 +8097,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 725162530} m_CullTransparentMesh: 0 +--- !u!114 &725162535 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725162530} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 2 --- !u!1 &740545694 GameObject: m_ObjectHideFlags: 0 @@ -7984,9 +8182,9 @@ RectTransform: m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -17, y: 0} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 1} --- !u!114 &749354208 MonoBehaviour: @@ -8064,6 +8262,7 @@ GameObject: - component: {fileID: 760297269} - component: {fileID: 760297268} - component: {fileID: 760297267} + - component: {fileID: 760297270} m_Layer: 5 m_Name: AnimationClipTimeField m_TagString: Untagged @@ -8203,6 +8402,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 760297265} m_CullTransparentMesh: 0 +--- !u!114 &760297270 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 760297265} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 1 --- !u!1 &765752266 GameObject: m_ObjectHideFlags: 0 @@ -8789,6 +9001,7 @@ GameObject: - component: {fileID: 891720217} - component: {fileID: 891720216} - component: {fileID: 891720215} + - component: {fileID: 891720218} m_Layer: 5 m_Name: posOffsetXField m_TagString: Untagged @@ -8928,6 +9141,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 891720213} m_CullTransparentMesh: 0 +--- !u!114 &891720218 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 891720213} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 2 --- !u!1 &898059650 GameObject: m_ObjectHideFlags: 0 @@ -11587,7 +11813,7 @@ MonoBehaviour: m_TargetGraphic: {fileID: 922060210} m_HandleRect: {fileID: 922060209} m_Direction: 2 - m_Value: 1 + m_Value: 0 m_Size: 1 m_NumberOfSteps: 0 m_OnValueChanged: @@ -14723,7 +14949,7 @@ MonoBehaviour: m_HorizontalOverflow: 1 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: 1.00 + m_Text: 1.000 --- !u!222 &1410953726 CanvasRenderer: m_ObjectHideFlags: 0 @@ -15288,6 +15514,7 @@ GameObject: - component: {fileID: 1463915056} - component: {fileID: 1463915055} - component: {fileID: 1463915054} + - component: {fileID: 1463915057} m_Layer: 5 m_Name: CyclesFastField m_TagString: Untagged @@ -15427,6 +15654,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1463915052} m_CullTransparentMesh: 0 +--- !u!114 &1463915057 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1463915052} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 1 --- !u!1 &1470448626 GameObject: m_ObjectHideFlags: 0 @@ -16302,6 +16542,7 @@ GameObject: - component: {fileID: 1518099310} - component: {fileID: 1518099309} - component: {fileID: 1518099308} + - component: {fileID: 1518099311} m_Layer: 5 m_Name: posOffsetZField m_TagString: Untagged @@ -16441,6 +16682,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1518099306} m_CullTransparentMesh: 0 +--- !u!114 &1518099311 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1518099306} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 2 --- !u!1 &1525472286 GameObject: m_ObjectHideFlags: 0 @@ -17405,7 +17659,7 @@ MonoBehaviour: m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} m_CustomCaretColor: 0 m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} - m_Text: 1.00 + m_Text: 1.000 m_CaretBlinkRate: 0.85 m_CaretWidth: 1 m_ReadOnly: 0 @@ -17459,6 +17713,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} m_Name: m_EditorClassIdentifier: + valiationType: 2 --- !u!1 &1588340712 GameObject: m_ObjectHideFlags: 0 @@ -17922,6 +18177,7 @@ GameObject: - component: {fileID: 1668270820} - component: {fileID: 1668270819} - component: {fileID: 1668270818} + - component: {fileID: 1668270821} m_Layer: 5 m_Name: appendageRotationField m_TagString: Untagged @@ -18061,6 +18317,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1668270816} m_CullTransparentMesh: 0 +--- !u!114 &1668270821 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1668270816} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 2 --- !u!1 &1670013372 GameObject: m_ObjectHideFlags: 0 @@ -18229,6 +18498,7 @@ GameObject: - component: {fileID: 1676585157} - component: {fileID: 1676585156} - component: {fileID: 1676585155} + - component: {fileID: 1676585158} m_Layer: 5 m_Name: AnimationClipLengthField m_TagString: Untagged @@ -18368,6 +18638,19 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1676585153} m_CullTransparentMesh: 0 +--- !u!114 &1676585158 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1676585153} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 1 --- !u!1 &1697817321 GameObject: m_ObjectHideFlags: 0 @@ -18848,6 +19131,7 @@ GameObject: - component: {fileID: 1767445799} - component: {fileID: 1767445798} - component: {fileID: 1767445797} + - component: {fileID: 1767445801} m_Layer: 5 m_Name: headRotationField m_TagString: Untagged @@ -18987,6 +19271,19 @@ RectTransform: m_AnchoredPosition: {x: 154.61, y: -62.3} m_SizeDelta: {x: 56.79773, y: 30} m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1767445801 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1767445796} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 2 --- !u!1 &1777266407 GameObject: m_ObjectHideFlags: 0 @@ -19613,6 +19910,125 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -20, y: -20} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1845596332 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1845596333} + - component: {fileID: 1845596336} + - component: {fileID: 1845596335} + - component: {fileID: 1845596334} + m_Layer: 5 + m_Name: SelectRaceButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1845596333 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845596332} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 394719257} + m_Father: {fileID: 935483303140078260} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -45.6, y: -153} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1845596334 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845596332} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1845596335} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1845596335 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845596332} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1845596336 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845596332} + m_CullTransparentMesh: 0 --- !u!1 &1849536739 GameObject: m_ObjectHideFlags: 0 @@ -22159,6 +22575,8 @@ RectTransform: - {fileID: 4070467796814498374} - {fileID: 671921654} - {fileID: 1051936261} + - {fileID: 1845596333} + - {fileID: 278535032} m_Father: {fileID: 531246357} m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -23449,6 +23867,7 @@ GameObject: - component: {fileID: 935483304128418016} - component: {fileID: 935483304128418017} - component: {fileID: 935483304128418022} + - component: {fileID: 935483304128418021} m_Layer: 5 m_Name: BodyOffsetZField m_TagString: Untagged @@ -23456,6 +23875,19 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!114 &935483304128418021 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 935483304128418020} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 2 --- !u!114 &935483304128418022 MonoBehaviour: m_ObjectHideFlags: 0 @@ -23803,6 +24235,7 @@ GameObject: - component: {fileID: 935483304332071715} - component: {fileID: 935483304332071712} - component: {fileID: 935483304332071713} + - component: {fileID: 935483304332071720} m_Layer: 5 m_Name: BodyOffsetXField m_TagString: Untagged @@ -23810,6 +24243,19 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!114 &935483304332071720 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 935483304332071719} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f3886223a697384abc8109a51c855e2, type: 3} + m_Name: + m_EditorClassIdentifier: + valiationType: 2 --- !u!224 &935483304393168322 RectTransform: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/AnimationComponents/Actor.cs b/Assets/Scripts/AnimationComponents/Actor.cs index dff7f7ac..22844ba1 100644 --- a/Assets/Scripts/AnimationComponents/Actor.cs +++ b/Assets/Scripts/AnimationComponents/Actor.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Xml; using System.Xml.Serialization; using UnityEngine; @@ -16,11 +17,13 @@ namespace RimWorldAnimationStudio [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 controlGenitalAngle; + public bool isFucking; + public bool isFucked; public bool ShouldSerializedefNames() { return defNames.NotNullOrEmpty(); } public bool ShouldSerializebodyDefTypes() { return bodyDefTypes.NotNullOrEmpty(); } @@ -30,9 +33,16 @@ namespace RimWorldAnimationStudio public bool ShouldSerializeblacklistedRaces() { return blacklistedRaces.NotNullOrEmpty(); } public bool ShouldSerializetags() { return tags.NotNullOrEmpty(); } - public bool ShouldSerializecontrolGenitalAngle() { return controlGenitalAngle != null; } - public bool ShouldSerializeisFucking() { return isFucking != null; } - public bool ShouldSerializeisFucked() { return isFucked != null; } + 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() { diff --git a/Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs b/Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs index d4e8527d..bc0b41ce 100644 --- a/Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs +++ b/Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs @@ -17,5 +17,10 @@ namespace RimWorldAnimationStudio public abstract void BuildSimpleCurves(); public bool ShouldSerializetags() { return tags.NotNullOrEmpty(); } + + public virtual void ValidateData() + { + + } } } diff --git a/Assets/Scripts/AnimationComponents/AnimationClips/PawnAnimationClip.cs b/Assets/Scripts/AnimationComponents/AnimationClips/PawnAnimationClip.cs index 0c15f7d9..6ef04334 100644 --- a/Assets/Scripts/AnimationComponents/AnimationClips/PawnAnimationClip.cs +++ b/Assets/Scripts/AnimationComponents/AnimationClips/PawnAnimationClip.cs @@ -88,6 +88,11 @@ namespace RimWorldAnimationStudio keyframes[keyframes.Count - 1].tickDuration = 1; } + public override void ValidateData() + { + + } + public bool MakeNew() { PawnKeyframe keyframeA = new PawnKeyframe(); diff --git a/Assets/Scripts/AnimationComponents/AnimationDef.cs b/Assets/Scripts/AnimationComponents/AnimationDef.cs index 91a1aec8..31887dd2 100644 --- a/Assets/Scripts/AnimationComponents/AnimationDef.cs +++ b/Assets/Scripts/AnimationComponents/AnimationDef.cs @@ -14,9 +14,8 @@ namespace RimWorldAnimationStudio [XmlArray("sexTypes"), XmlArrayItem("li")] public List sexTypes = new List(); [XmlArray("interactionDefTypes"), XmlArrayItem("li")] public List interactionDefTypes = new List(); - [XmlArray("actors"), XmlArrayItem("li")] public List actors = new List(); + [XmlArray("actors"), XmlArrayItem("li")] public List actors = new List(); [XmlArray("animationStages"), XmlArrayItem("li")] public List animationStages = new List(); - [XmlIgnore] public int animationTimeTicks = 0; public void Initialize() @@ -30,60 +29,10 @@ namespace RimWorldAnimationStudio } } - // move to app manager - public void RunPreSaveOperations() + public void ValidateData() { - // Stage edits - for (int i = 0; i < animationStages.Count; i++) - { - AnimationStage stage = animationStages[i]; - - // Sort keyframes by atTick - foreach (PawnAnimationClip clip in stage.animationClips) - { clip.keyframes = clip.keyframes.OrderBy(x => x.atTick).ToList(); } - - // Check if looping - int stageWindowSize = animationStages[i].stageWindowSize > 0 ? animationStages[i].stageWindowSize : animationStages[i].animationClips.Select(x => x.duration).Max(); - int cycles = Mathf.CeilToInt(animationStages[i].playTimeTicks / stageWindowSize); - - stage.isLooping = cycles > 1; - } - - // Actor edits - for (int i = 0; i < actors.Count; i++) - { - Actor actor = actors[i]; - - actor.isFucking = actor.requiredGenitals.Contains("Any appendage") ? (bool?)true : null; - - if (actor.isFucking == true) - { actor.requiredGenitals.Remove("Any appendage"); } - - actor.isFucked = actor.requiredGenitals.Contains("Any orifice") ? (bool?)true : null; - - if (actor.isFucked == true) - { actor.requiredGenitals.Remove("Any orifice"); } - - actor.controlGenitalAngle = animationStages.Any(x => x.animationClips[i].keyframes.Any(y => y.genitalAngle != 0)) ? (bool?)true : null; - - //if (actor.requiredGender.Contains("Female")) actor.gender = ActorGender.Female; - //else if (actor.requiredGender.Contains("Male")) actor.gender = ActorGender.Male; - //else actor.gender = ActorGender.None; - } - - //actors.OrderBy(x => (int)x.gender); - } - - public void RunPostLoadOperations() - { - foreach (Actor actor in actors) - { - if (actor.isFucking == true) - { actor.requiredGenitals.Add("Any appendage"); } - - if (actor.isFucked == true) - { actor.requiredGenitals.Add("Any orifice"); } - } + sexTypes = interactionDefTypes.Intersect(Tags.sexTypes.Concat(CustomTags.sexTypes))?.ToList(); + interactionDefTypes = interactionDefTypes.Intersect(Tags.interactionDefTypes.Concat(CustomTags.interactionDefTypes))?.ToList(); } } } diff --git a/Assets/Scripts/AnimationComponents/AnimationStage.cs b/Assets/Scripts/AnimationComponents/AnimationStage.cs index 14d9aef9..c25676f4 100644 --- a/Assets/Scripts/AnimationComponents/AnimationStage.cs +++ b/Assets/Scripts/AnimationComponents/AnimationStage.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Xml; using System.Xml.Serialization; using UnityEngine; @@ -28,6 +29,18 @@ namespace RimWorldAnimationStudio } } + public void ValidateData() + { + // Sort keyframes by atTick + foreach (PawnAnimationClip clip in animationClips) + { clip.keyframes = clip.keyframes.OrderBy(x => x.atTick).ToList(); } + + // Check if looping + stageWindowSize = stageWindowSize > 0 ? stageWindowSize : animationClips.Select(x => x.duration).Max(); + int cycles = Mathf.CeilToInt(playTimeTicks / stageWindowSize); + isLooping = cycles > 1; + } + public bool MakeNew() { if (Workspace.animationDef == null) diff --git a/Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs b/Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs index e80a903c..90adf01f 100644 --- a/Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs +++ b/Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs @@ -14,5 +14,10 @@ namespace RimWorldAnimationStudio public bool ShouldSerializeatTick() { return atTick != null; } public bool ShouldSerializetags() { return tags.NotNullOrEmpty(); } + + public virtual void ValidateData() + { + + } } } diff --git a/Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs b/Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs index d2db5a26..fc409915 100644 --- a/Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs +++ b/Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs @@ -18,11 +18,15 @@ namespace RimWorldAnimationStudio public float genitalAngle; public bool? quiver; + [XmlIgnore] public int keyframeID; - public bool ShouldSerializegenitalAngle() { return genitalAngle != null; } + public bool ShouldSerializegenitalAngle() { return genitalAngle != 0; } public bool ShouldSerializequiver() { return quiver != null; } - [XmlIgnore] public int keyframeID; + public override void ValidateData() + { + soundEffect = Tags.soundDefs.Concat(CustomTags.soundDefs).Contains(soundEffect) ? soundEffect : null; + } public void GenerateKeyframeID() { diff --git a/Assets/Scripts/Extensions/IListExtensions.cs b/Assets/Scripts/Extensions/IListExtensions.cs index fc22b5cb..770c123a 100644 --- a/Assets/Scripts/Extensions/IListExtensions.cs +++ b/Assets/Scripts/Extensions/IListExtensions.cs @@ -15,5 +15,22 @@ public static class IListExtensions { return NullOrEmpty(list) == false; } + + public static void AddDistinct(this IList list, T item) + { + if (item == null || list.Contains(item)) + { return; } + + list.Add(item); + } + + public static void AddRangeDistinct(this IList list, IEnumerable collection) + { + if (collection == null) + { return; } + + foreach(T item in collection) + { AddDistinct(list, item); } + } } diff --git a/Assets/Scripts/GUI/ActorBody.cs b/Assets/Scripts/GUI/ActorBody.cs index 6c958444..0750555a 100644 --- a/Assets/Scripts/GUI/ActorBody.cs +++ b/Assets/Scripts/GUI/ActorBody.cs @@ -31,7 +31,7 @@ namespace RimWorldAnimationStudio else { bodyRenderer.color = Constants.ColorWhite; } - appendageRenderer.gameObject.SetActive(Workspace.animationDef.actors[actorID].requiredGenitals.Any(x => x == "Penis" || x == "Any appendage")); + appendageRenderer.gameObject.SetActive(Workspace.animationDef.actors[actorID].requiredGenitals.Any(x => x == "Penis") || Workspace.animationDef.actors[actorID].isFucking); } public void OnPointerClick(PointerEventData eventData) @@ -87,27 +87,6 @@ namespace RimWorldAnimationStudio { Workspace.actorID = actorID; Workspace.selectedBodyPart = null; - - /*foreach (ActorBody actorBody in AnimationController.Instance.actorBodies.GetComponentsInChildren()) - { - if (actorBody == this) - { continue; } - - actorBody.bodyRenderer.color = Constants.ColorWhite; - actorBody.headRenderer.color = Constants.ColorWhite; - actorBody.appendageRenderer.color = Constants.ColorWhite; - - actorBody.isSelected = false; - } - - bodyRenderer.color = Constants.ColorGreen; - headRenderer.color = Constants.ColorGreen; - appendageRenderer.color = Constants.ColorGreen; - - foreach (ActorBodyPart actorBodyPartSelected in GetComponentsInChildren()) - { actorBodyPartSelected.isSelected = false; } - - isSelected = true;*/ } } } diff --git a/Assets/Scripts/GUI/ActorBodyPart.cs b/Assets/Scripts/GUI/ActorBodyPart.cs index 0921e459..1f09434e 100644 --- a/Assets/Scripts/GUI/ActorBodyPart.cs +++ b/Assets/Scripts/GUI/ActorBodyPart.cs @@ -75,6 +75,8 @@ namespace RimWorldAnimationStudio { float angle = Vector2.SignedAngle(Vector2.up, (Vector2)mousePosition - (Vector2)transform.position); keyframe.genitalAngle = angle; + + Workspace.animationDef.actors[Workspace.actorID].controlGenitalAngle = Workspace.animationDef.animationStages.Any(x => x.animationClips[Workspace.actorID].keyframes.Any(y => y.genitalAngle != 0)); } } @@ -91,22 +93,6 @@ namespace RimWorldAnimationStudio { Workspace.actorID = parent.actorID; Workspace.selectedBodyPart = this; - - /*foreach (ActorBodyPart actorBodyPart in AnimationController.Instance.actorBodies.GetComponentsInChildren()) - { - actorBodyPart.isSelected = false; - } - - foreach (ActorBody actorBody in AnimationController.Instance.actorBodies.GetComponentsInChildren()) - { - actorBody.bodyRenderer.color = Constants.ColorWhite; - actorBody.headRenderer.color = Constants.ColorWhite; - actorBody.appendageRenderer.color = Constants.ColorWhite; - } - - bodyPartRenderer.color = Constants.ColorGreen; - - isSelected = true;*/ } } } diff --git a/Assets/Scripts/GUI/ActorKeyframeCard.cs b/Assets/Scripts/GUI/ActorKeyframeCard.cs index 64745797..5be55797 100644 --- a/Assets/Scripts/GUI/ActorKeyframeCard.cs +++ b/Assets/Scripts/GUI/ActorKeyframeCard.cs @@ -6,59 +6,26 @@ using UnityEngine.UI; namespace RimWorldAnimationStudio { - public class ActorKeyframeCard : MonoBehaviour + public class ActorKeyframeCard : Singleton { public InputField positionXField; public InputField positionZField; public InputField rotationField; public InputField headBobField; - public InputField headRotationField; + public InputField headRotationField; public InputField appendageRotationField; - private int lastTick = -1; - private bool isDirty = false; - - // Move to anim controller public void Update() { - if ((Workspace.animationDef == null || AnimationController.Instance.stageTick == lastTick) && isDirty == false) + if (Workspace.animationDef == null) { return; } - if (Workspace.actorID >= AnimationController.Instance.transform.childCount) - { return; } - - ActorBody actorBody = AnimationController.Instance.actorBodies.GetComponentsInChildren()[Workspace.actorID]; - string bodyType = actorBody.bodyType; - - PawnAnimationClip clip = Workspace.animationDef.animationStages[Workspace.stageID].animationClips[Workspace.actorID]; - float clipPercent = (float)(AnimationController.Instance.stageTick % clip.duration) / clip.duration; - - Vector3 deltaPos = new Vector3(clip.BodyOffsetX.Evaluate(clipPercent), 0, clip.BodyOffsetZ.Evaluate(clipPercent)); - deltaPos += Workspace.animationDef.actors[Workspace.actorID].bodyTypeOffset.GetOffset(bodyType); - - float bodyAngle = clip.BodyAngle.Evaluate(clipPercent); - float headAngle = clip.HeadAngle.Evaluate(clipPercent); - - if (bodyAngle < 0) bodyAngle = 360 - ((-1f * bodyAngle) % 360); - if (bodyAngle > 360) bodyAngle %= 360; - - if (headAngle < 0) headAngle = 360 - ((-1f * headAngle) % 360); - if (headAngle > 360) headAngle %= 360; - - float headBob = clip.HeadBob.Evaluate(clipPercent); - Vector3 bodyPos = new Vector3(deltaPos.x, deltaPos.z, 0); - - float appendageRotation = clip.GenitalAngle.Evaluate(clipPercent); - - positionXField.text = bodyPos.x.ToString("0.000"); - positionZField.text = bodyPos.y.ToString("0.000"); - rotationField.text = bodyAngle.ToString("0.000"); - headBobField.text = headBob.ToString("0.000"); - headRotationField.text = headAngle.ToString("0.000"); - appendageRotationField.text = appendageRotation.ToString("0.000"); - - lastTick = AnimationController.Instance.stageTick; - isDirty = false; + positionXField.interactable = AnimationController.Instance.isAnimating == false; + positionZField.interactable = AnimationController.Instance.isAnimating == false; + rotationField.interactable = AnimationController.Instance.isAnimating == false; + headBobField.interactable = AnimationController.Instance.isAnimating == false; + headRotationField.interactable = AnimationController.Instance.isAnimating == false; + appendageRotationField.interactable = AnimationController.Instance.isAnimating == false; } public void OnValueChanged() @@ -72,9 +39,8 @@ namespace RimWorldAnimationStudio keyframe.headAngle = float.Parse(headRotationField.text); keyframe.genitalAngle = float.Parse(appendageRotationField.text); + Workspace.animationDef.actors[Workspace.actorID].controlGenitalAngle = keyframe.genitalAngle != 0; Workspace.Instance.GetPawnAnimationClip(Workspace.actorID).BuildSimpleCurves(); - isDirty = true; - Workspace.Instance.RecordEvent("Actor position / orientation"); } } diff --git a/Assets/Scripts/GUI/DialogBoxes/DialogBox.cs b/Assets/Scripts/GUI/DialogBoxes/DialogBox.cs index 834ae9fd..731c9dc7 100644 --- a/Assets/Scripts/GUI/DialogBoxes/DialogBox.cs +++ b/Assets/Scripts/GUI/DialogBoxes/DialogBox.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Reflection; using UnityEngine; using UnityEngine.UI; @@ -12,6 +13,11 @@ namespace RimWorldAnimationStudio { public List cloneObjects; + public void OnEnable() + { + Initialize(); + } + public void Pop() { gameObject.SetActive(gameObject.activeSelf == false); @@ -32,5 +38,22 @@ namespace RimWorldAnimationStudio return cloneObject; } + + public void AddCustomTag(InputField field, ref List tags, ref List customTags) + { + if (field?.text == null || field.text == "") + { return; } + + if (tags.Contains(field.text) || customTags.Contains(field.text)) + { field.text = ""; return; } + + customTags.Add(field.text); + + ApplicationManager.Instance.SaveCustomArrays(); + + Initialize(true); + } + + public virtual void Initialize(bool addedNewTag = false) { } } } diff --git a/Assets/Scripts/GUI/DialogBoxes/SelectActorLayerDialog.cs b/Assets/Scripts/GUI/DialogBoxes/SelectActorLayerDialog.cs index dc4eb010..93fc1ebe 100644 --- a/Assets/Scripts/GUI/DialogBoxes/SelectActorLayerDialog.cs +++ b/Assets/Scripts/GUI/DialogBoxes/SelectActorLayerDialog.cs @@ -22,9 +22,9 @@ namespace RimWorldAnimationStudio Transform contentWindow = transform.FindDeepChild("Content"); Reset(); - for (int i = 0; i < Workspace.actorLayers.Count; i++) + for (int i = 0; i < Tags.actorLayers.Count; i++) { - string actorLayer = Workspace.actorLayers[i]; + string actorLayer = Tags.actorLayers[i]; Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform; _optionToggle.Find("Text").GetComponent().text = actorLayer; diff --git a/Assets/Scripts/GUI/DialogBoxes/SelectBodyDefTypesDialog.cs b/Assets/Scripts/GUI/DialogBoxes/SelectBodyDefTypesDialog.cs index 3c01115b..a15b96f6 100644 --- a/Assets/Scripts/GUI/DialogBoxes/SelectBodyDefTypesDialog.cs +++ b/Assets/Scripts/GUI/DialogBoxes/SelectBodyDefTypesDialog.cs @@ -10,66 +10,44 @@ namespace RimWorldAnimationStudio { public class SelectBodyDefTypesDialog : DialogBox { - public void OnEnable() + public override void Initialize(bool addedNewTag = false) { - Initialize(); - } + IEnumerable allTags = Tags.bodyDefTypes.Concat(CustomTags.interactionDefTypes); + string placeHolderText = "Enter new body def type..."; - public void AddBodyDefType(InputField field) - { - if (field?.text == null || field.text == "") - { return; } - - if (Workspace.bodyDefTypes.Contains(field.text)) - { field.text = ""; return; } - - Workspace.bodyDefTypes.Add(field.text); - - Initialize(true); - } - - public void Initialize(bool addedNewTag = false) - { Actor actor = Workspace.animationDef.actors[Workspace.actorID]; - - foreach (string bodyDefType in actor.bodyDefTypes) - { - if (Workspace.bodyDefTypes.Contains(bodyDefType) == false) - { Workspace.bodyDefTypes.Add(bodyDefType); } - } - Transform contentWindow = transform.FindDeepChild("Content"); Reset(); - for (int i = 0; i < Workspace.bodyDefTypes.Count; i++) + for (int i = 0; i < allTags.Count(); i++) { - string bodyDefType = Workspace.bodyDefTypes[i]; + string tag = allTags.ElementAt(i); Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform; - _optionToggle.Find("Text").GetComponent().text = bodyDefType; + _optionToggle.Find("Text").GetComponent().text = tag; Toggle toggleComp = _optionToggle.GetComponent(); - toggleComp.isOn = actor.bodyDefTypes.Contains(bodyDefType); - toggleComp.onValueChanged.AddListener(delegate { - - if (toggleComp.isOn && actor.bodyDefTypes.Contains(bodyDefType) == false) - { actor.bodyDefTypes.Add(bodyDefType); } + toggleComp.isOn = actor.bodyDefTypes.Contains(tag); + toggleComp.onValueChanged.AddListener(delegate + { + if (toggleComp.isOn && actor.bodyDefTypes.Contains(tag) == false) + { actor.bodyDefTypes.Add(tag); } - else if (toggleComp.isOn == false && actor.bodyDefTypes.Contains(bodyDefType)) - { actor.bodyDefTypes.Remove(bodyDefType); } + else if (toggleComp.isOn == false && actor.bodyDefTypes.Contains(tag)) + { actor.bodyDefTypes.Remove(tag); } Workspace.Instance.RecordEvent("Actor bodyDef type"); }); - if (addedNewTag && i == Workspace.sexTypes.Count - 1) + if (addedNewTag && i == allTags.Count() - 1) { toggleComp.isOn = true; } } Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform; - _optionField.Find("Placeholder").GetComponent().text = "Enter new body def type..."; + _optionField.Find("Placeholder").GetComponent().text = placeHolderText; InputField fieldComp = _optionField.GetComponent(); - fieldComp.onEndEdit.AddListener(delegate { AddBodyDefType(fieldComp); }); + fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.bodyDefTypes, ref CustomTags.bodyDefTypes); }); } public void Reset() diff --git a/Assets/Scripts/GUI/DialogBoxes/SelectBodyPartsDialog.cs b/Assets/Scripts/GUI/DialogBoxes/SelectBodyPartsDialog.cs index 590f1ebd..e69fa88a 100644 --- a/Assets/Scripts/GUI/DialogBoxes/SelectBodyPartsDialog.cs +++ b/Assets/Scripts/GUI/DialogBoxes/SelectBodyPartsDialog.cs @@ -10,69 +10,58 @@ namespace RimWorldAnimationStudio { public class SelectBodyPartsDialog : DialogBox { - public void OnEnable() + public override void Initialize(bool addedNewTag = false) { - Initialize(); - } + IEnumerable allTags = Tags.bodyParts.Concat(CustomTags.interactionDefTypes); + string placeHolderText = "Enter new body part name..."; - public void AddBodyPart(InputField field) - { - Debug.Log("Attempting to add new body part"); - - if (field?.text == null || field.text == "") - { Debug.LogWarning("Input field is null"); return; } - - if (Workspace.bodyParts.Contains(field.text)) - { Debug.LogWarning("Body part is null"); field.text = ""; return; } - - Debug.Log("Add new body part: " + field.text); - Workspace.bodyParts.Add(field.text); - - Initialize(true); - } - - public void Initialize(bool addedNewTag = false) - { Actor actor = Workspace.animationDef.actors[Workspace.actorID]; - - foreach (string bodyPart in actor.requiredGenitals) - { - if (Workspace.bodyParts.Contains(bodyPart) == false) - { Workspace.bodyParts.Add(bodyPart); } - } - Transform contentWindow = transform.FindDeepChild("Content"); Reset(); - for (int i = 0; i < Workspace.bodyParts.Count; i++) + Transform _appendageToggle = AddCloneObjectToParent(contentWindow).transform; + _appendageToggle.Find("Text").GetComponent().text = "Any appendage"; + + Toggle appendageToggleComp = _appendageToggle.GetComponent(); + appendageToggleComp.isOn = actor.isFucking; + appendageToggleComp.onValueChanged.AddListener(delegate { actor.isFucking = appendageToggleComp.isOn; Workspace.Instance.RecordEvent("Actor required body part");}); + + Transform _orificeToggle = AddCloneObjectToParent(contentWindow).transform; + _orificeToggle.Find("Text").GetComponent().text = "Any orifice"; + + Toggle orificeToggleComp = _orificeToggle.GetComponent(); + orificeToggleComp.isOn = actor.isFucked; + orificeToggleComp.onValueChanged.AddListener(delegate { actor.isFucked = orificeToggleComp.isOn; Workspace.Instance.RecordEvent("Actor required body part"); }); + + for (int i = 0; i < allTags.Count(); i++) { - string bodyPart = Workspace.bodyParts[i]; + string tag = allTags.ElementAt(i); Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform; - _optionToggle.Find("Text").GetComponent().text = bodyPart; + _optionToggle.Find("Text").GetComponent().text = tag; Toggle toggleComp = _optionToggle.GetComponent(); - toggleComp.isOn = actor.requiredGenitals.Contains(bodyPart); - toggleComp.onValueChanged.AddListener(delegate { - - if (toggleComp.isOn && actor.requiredGenitals.Contains(bodyPart) == false) - { actor.requiredGenitals.Add(bodyPart); } + toggleComp.isOn = actor.requiredGenitals.Contains(tag); + toggleComp.onValueChanged.AddListener(delegate + { + if (toggleComp.isOn && actor.requiredGenitals.Contains(tag) == false) + { actor.requiredGenitals.Add(tag); } - else if (toggleComp.isOn == false && actor.requiredGenitals.Contains(bodyPart)) - { actor.requiredGenitals.Remove(bodyPart); } + else if (toggleComp.isOn == false && actor.requiredGenitals.Contains(tag)) + { actor.requiredGenitals.Remove(tag); } Workspace.Instance.RecordEvent("Actor required body part"); }); - if (addedNewTag && i == Workspace.sexTypes.Count - 1) + if (addedNewTag && i == allTags.Count() - 1) { toggleComp.isOn = true; } } Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform; - _optionField.Find("Placeholder").GetComponent().text = "Enter new body part name..."; + _optionField.Find("Placeholder").GetComponent().text = placeHolderText; InputField fieldComp = _optionField.GetComponent(); - fieldComp.onEndEdit.AddListener(delegate { AddBodyPart(fieldComp); }); + fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.bodyParts, ref CustomTags.bodyParts); }); } public void Reset() diff --git a/Assets/Scripts/GUI/DialogBoxes/SelectDefNamesDialog.cs b/Assets/Scripts/GUI/DialogBoxes/SelectDefNamesDialog.cs index be57e12d..f3d13d4f 100644 --- a/Assets/Scripts/GUI/DialogBoxes/SelectDefNamesDialog.cs +++ b/Assets/Scripts/GUI/DialogBoxes/SelectDefNamesDialog.cs @@ -10,67 +10,44 @@ namespace RimWorldAnimationStudio { public class SelectDefNamesDialog : DialogBox { - public void OnEnable() + public override void Initialize(bool addedNewTag = false) { - Debug.Log("enabled"); - Initialize(); - } + IEnumerable allTags = Tags.defNames.Concat(CustomTags.interactionDefTypes); + string placeHolderText = "Enter new def name..."; - public void AddDefName(InputField field) - { - if (field?.text == null || field.text == "") - { return; } - - if (Workspace.defNames.Contains(field.text)) - { field.text = ""; return; } - - Workspace.defNames.Add(field.text); - - Initialize(true); - } - - public void Initialize(bool addedNewTag = false) - { Actor actor = Workspace.animationDef.actors[Workspace.actorID]; - - foreach (string defName in actor.defNames) - { - if (Workspace.defNames.Contains(defName) == false) - { Workspace.defNames.Add(defName); } - } - Transform contentWindow = transform.FindDeepChild("Content"); Reset(); - for (int i = 0; i < Workspace.defNames.Count; i++) + for (int i = 0; i < allTags.Count(); i++) { - string defName = Workspace.defNames[i]; + string tag = allTags.ElementAt(i); Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform; - _optionToggle.Find("Text").GetComponent().text = defName; + _optionToggle.Find("Text").GetComponent().text = tag; Toggle toggleComp = _optionToggle.GetComponent(); - toggleComp.isOn = actor.defNames.Contains(defName); - toggleComp.onValueChanged.AddListener(delegate { - - if (toggleComp.isOn && actor.defNames.Contains(defName) == false) - { actor.defNames.Add(defName); } + toggleComp.isOn = actor.defNames.Contains(tag); + toggleComp.onValueChanged.AddListener(delegate + { + if (toggleComp.isOn && actor.defNames.Contains(tag) == false) + { actor.defNames.Add(tag); } - else if (toggleComp.isOn == false && actor.defNames.Contains(defName)) - { actor.defNames.Remove(defName); } + else if (toggleComp.isOn == false && actor.defNames.Contains(tag)) + { actor.defNames.Remove(tag); } Workspace.Instance.RecordEvent("Actor def name"); }); - if (addedNewTag && i == Workspace.sexTypes.Count - 1) + if (addedNewTag && i == allTags.Count() - 1) { toggleComp.isOn = true; } } Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform; - _optionField.Find("Placeholder").GetComponent().text = "Enter new def name..."; + _optionField.Find("Placeholder").GetComponent().text = placeHolderText; InputField fieldComp = _optionField.GetComponent(); - fieldComp.onEndEdit.AddListener(delegate { AddDefName(fieldComp); }); + fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.defNames, ref CustomTags.defNames); }); } public void Reset() diff --git a/Assets/Scripts/GUI/DialogBoxes/SelectInteractionDefsDialog.cs b/Assets/Scripts/GUI/DialogBoxes/SelectInteractionDefsDialog.cs index 1aa74851..61e62204 100644 --- a/Assets/Scripts/GUI/DialogBoxes/SelectInteractionDefsDialog.cs +++ b/Assets/Scripts/GUI/DialogBoxes/SelectInteractionDefsDialog.cs @@ -10,66 +10,57 @@ namespace RimWorldAnimationStudio { public class SelectInteractionDefsDialog : DialogBox { - public void OnEnable() + public override void Initialize(bool addedNewTag = false) { - Initialize(); - } + IEnumerable allTags = Tags.interactionDefTypes.Concat(CustomTags.interactionDefTypes); + string placeHolderText = "Enter new interaction def type..."; - public void AddInteractionDef(InputField field) - { - if (field?.text == null || field.text == "") - { return; } - - if (Workspace.interactionDefTypes.Contains(field.text)) - { field.text = ""; return; } - - Workspace.interactionDefTypes.Add(field.text); - - Initialize(true); - } - - public void Initialize(bool addedNewTag = false) - { if (Workspace.animationDef == null) return; - foreach (string interactionDefType in Workspace.animationDef.interactionDefTypes) - { - if (Workspace.interactionDefTypes.Contains(interactionDefType) == false) - { Workspace.interactionDefTypes.Add(interactionDefType); } - } - Transform contentWindow = transform.FindDeepChild("Content"); Reset(); - for (int i = 0; i < Workspace.interactionDefTypes.Count; i++) + for (int i = 0; i < allTags.Count(); i++) { - string interactionDefType = Workspace.interactionDefTypes[i]; + string tag = allTags.ElementAt(i); Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform; - _optionToggle.Find("Text").GetComponent().text = interactionDefType; + _optionToggle.Find("Text").GetComponent().text = tag; Toggle toggleComp = _optionToggle.GetComponent(); - toggleComp.isOn = Workspace.animationDef.interactionDefTypes.Contains(interactionDefType); - toggleComp.onValueChanged.AddListener(delegate { - - if (toggleComp.isOn && Workspace.animationDef.interactionDefTypes.Contains(interactionDefType) == false) - { Workspace.animationDef.interactionDefTypes.Add(interactionDefType); } + toggleComp.isOn = Workspace.animationDef.interactionDefTypes.Contains(tag); + toggleComp.onValueChanged.AddListener(delegate + { + if (toggleComp.isOn && Workspace.animationDef.interactionDefTypes.Contains(tag) == false) + { Workspace.animationDef.interactionDefTypes.Add(tag); } - else if (toggleComp.isOn == false && Workspace.animationDef.interactionDefTypes.Contains(interactionDefType)) - { Workspace.animationDef.interactionDefTypes.Remove(interactionDefType); } + else if (toggleComp.isOn == false && Workspace.animationDef.interactionDefTypes.Contains(tag)) + { Workspace.animationDef.interactionDefTypes.Remove(tag); } Workspace.Instance.RecordEvent("Animation InteractionDef"); }); - if (addedNewTag && i == Workspace.sexTypes.Count - 1) + Button deleteButton = _optionToggle.Find("DeleteButton").GetComponent