Remove and save custom tags

This commit is contained in:
AbstractConcept 2022-09-21 16:15:25 -05:00
parent e36ef6a368
commit 2f3f807911
264 changed files with 1118 additions and 498 deletions

View File

@ -63,7 +63,6 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Assets\DecimalValidator.cs" />
<Compile Include="Assets\Scripts\AdvancedPolygonCollider\AdvancedPolygonCollider.cs" />
<Compile Include="Assets\Scripts\AdvancedPolygonCollider\AdvancedPolygonColliderUtilities.cs" />
<Compile Include="Assets\Scripts\AnimationComponents\Actor.cs" />
@ -97,6 +96,7 @@
<Compile Include="Assets\Scripts\GUI\DialogBoxes\SelectBodyPartsDialog.cs" />
<Compile Include="Assets\Scripts\GUI\DialogBoxes\SelectDefNamesDialog.cs" />
<Compile Include="Assets\Scripts\GUI\DialogBoxes\SelectInteractionDefsDialog.cs" />
<Compile Include="Assets\Scripts\GUI\DialogBoxes\SelectRaceDialog.cs" />
<Compile Include="Assets\Scripts\GUI\DialogBoxes\SelectSexTypesDialog.cs" />
<Compile Include="Assets\Scripts\GUI\DialogBoxes\SelectSoundDefDialog.cs" />
<Compile Include="Assets\Scripts\GUI\KeyframeSlider.cs" />
@ -112,6 +112,7 @@
<Compile Include="Assets\Scripts\Math\CurvePoint.cs" />
<Compile Include="Assets\Scripts\Math\GenMath.cs" />
<Compile Include="Assets\Scripts\Math\SimpleCurve.cs" />
<Compile Include="Assets\Scripts\NumberValidator.cs" />
<Compile Include="Assets\Scripts\RequiresAnimationDef.cs" />
<Compile Include="Assets\Scripts\Singleton.cs" />
<Compile Include="Assets\Scripts\StandaloneFileBrowser\IStandaloneFileBrowser.cs" />
@ -131,6 +132,7 @@
<Compile Include="Assets\Scripts\Workspace\HistoricRecord.cs" />
<Compile Include="Assets\Scripts\Workspace\Workspace.cs" />
<None Include="Assets\StreamingAssets\AnimationDefs\newAnimationDef.xml" />
<None Include="Assets\StreamingAssets\customTags.xml" />
<Reference Include="UnityEngine">
<HintPath>C:/Program Files/Unity/Hub/Editor/2019.4.20f1/Editor/Data/Managed/UnityEngine/UnityEngine.dll</HintPath>
</Reference>

View File

@ -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<InputField>();
if (inputField)
{
inputField.characterValidation = InputField.CharacterValidation.Decimal;
inputField.onEndEdit.AddListener(delegate { MakeDecimal(); });
}
}
public void MakeDecimal()
{
InputField inputField = GetComponent<InputField>();
if (inputField)
{ inputField.text = string.Format("{0:0.00}", float.Parse(inputField.text)); }
}
}

View File

@ -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}

View File

@ -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

View File

@ -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<string> 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()
{

View File

@ -17,5 +17,10 @@ namespace RimWorldAnimationStudio
public abstract void BuildSimpleCurves();
public bool ShouldSerializetags() { return tags.NotNullOrEmpty(); }
public virtual void ValidateData()
{
}
}
}

View File

@ -88,6 +88,11 @@ namespace RimWorldAnimationStudio
keyframes[keyframes.Count - 1].tickDuration = 1;
}
public override void ValidateData()
{
}
public bool MakeNew()
{
PawnKeyframe keyframeA = new PawnKeyframe();

View File

@ -14,9 +14,8 @@ namespace RimWorldAnimationStudio
[XmlArray("sexTypes"), XmlArrayItem("li")] public List<string> sexTypes = new List<string>();
[XmlArray("interactionDefTypes"), XmlArrayItem("li")] public List<string> interactionDefTypes = new List<string>();
[XmlArray("actors"), XmlArrayItem("li")] public List<Actor> actors = new List<Actor>();
[XmlArray("actors"), XmlArrayItem("li")] public List<Actor> actors = new List<Actor>();
[XmlArray("animationStages"), XmlArrayItem("li")] public List<AnimationStage> animationStages = new List<AnimationStage>();
[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();
}
}
}

View File

@ -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)

View File

@ -14,5 +14,10 @@ namespace RimWorldAnimationStudio
public bool ShouldSerializeatTick() { return atTick != null; }
public bool ShouldSerializetags() { return tags.NotNullOrEmpty(); }
public virtual void ValidateData()
{
}
}
}

View File

@ -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()
{

View File

@ -15,5 +15,22 @@ public static class IListExtensions
{
return NullOrEmpty<T>(list) == false;
}
public static void AddDistinct<T>(this IList<T> list, T item)
{
if (item == null || list.Contains(item))
{ return; }
list.Add(item);
}
public static void AddRangeDistinct<T>(this IList<T> list, IEnumerable<T> collection)
{
if (collection == null)
{ return; }
foreach(T item in collection)
{ AddDistinct(list, item); }
}
}

View File

@ -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<ActorBody>())
{
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<ActorBodyPart>())
{ actorBodyPartSelected.isSelected = false; }
isSelected = true;*/
}
}
}

View File

@ -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>())
{
actorBodyPart.isSelected = false;
}
foreach (ActorBody actorBody in AnimationController.Instance.actorBodies.GetComponentsInChildren<ActorBody>())
{
actorBody.bodyRenderer.color = Constants.ColorWhite;
actorBody.headRenderer.color = Constants.ColorWhite;
actorBody.appendageRenderer.color = Constants.ColorWhite;
}
bodyPartRenderer.color = Constants.ColorGreen;
isSelected = true;*/
}
}
}

View File

@ -6,59 +6,26 @@ using UnityEngine.UI;
namespace RimWorldAnimationStudio
{
public class ActorKeyframeCard : MonoBehaviour
public class ActorKeyframeCard : Singleton<ActorKeyframeCard>
{
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<ActorBody>()[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");
}
}

View File

@ -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<GameObject> 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<string> tags, ref List<string> 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) { }
}
}

View File

@ -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>().text = actorLayer;

View File

@ -10,66 +10,44 @@ namespace RimWorldAnimationStudio
{
public class SelectBodyDefTypesDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Initialize();
}
IEnumerable<string> 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>().text = bodyDefType;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
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>().text = "Enter new body def type...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddBodyDefType(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.bodyDefTypes, ref CustomTags.bodyDefTypes); });
}
public void Reset()

View File

@ -10,69 +10,58 @@ namespace RimWorldAnimationStudio
{
public class SelectBodyPartsDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Initialize();
}
IEnumerable<string> 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>().text = "Any appendage";
Toggle appendageToggleComp = _appendageToggle.GetComponent<Toggle>();
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>().text = "Any orifice";
Toggle orificeToggleComp = _orificeToggle.GetComponent<Toggle>();
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>().text = bodyPart;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
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>().text = "Enter new body part name...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddBodyPart(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.bodyParts, ref CustomTags.bodyParts); });
}
public void Reset()

View File

@ -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<string> 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>().text = defName;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
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>().text = "Enter new def name...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddDefName(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.defNames, ref CustomTags.defNames); });
}
public void Reset()

View File

@ -10,66 +10,57 @@ namespace RimWorldAnimationStudio
{
public class SelectInteractionDefsDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Initialize();
}
IEnumerable<string> 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>().text = interactionDefType;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
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<Button>();
if (deleteButton != null && CustomTags.interactionDefTypes.Contains(tag))
{
deleteButton.gameObject.SetActive(true);
deleteButton.onClick.AddListener(delegate
{
CustomTags.interactionDefTypes.Remove(tag);
ApplicationManager.Instance.SaveCustomArrays();
Initialize();
});
}
if (addedNewTag && i == allTags.Count() - 1)
{ toggleComp.isOn = true; }
}
Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform;
_optionField.Find("Placeholder").GetComponent<Text>().text = "Enter new interaction def type...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddInteractionDef(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.interactionDefTypes, ref CustomTags.interactionDefTypes); });
}
public void Reset()

View File

@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
namespace RimWorldAnimationStudio
{
public class SelectRaceDialog : DialogBox
{
public override void Initialize(bool addedNewTag = false)
{
IEnumerable<string> allTags = Tags.defNames.Concat(CustomTags.interactionDefTypes);
string placeHolderText = "Enter new def name...";
Actor actor = Workspace.animationDef.actors[Workspace.actorID];
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < allTags.Count(); i++)
{
string tag = allTags.ElementAt(i);
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
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(tag))
{ actor.defNames.Remove(tag); }
Workspace.Instance.RecordEvent("Actor def name");
});
if (addedNewTag && i == allTags.Count() - 1)
{ toggleComp.isOn = true; }
}
Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform;
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.defNames, ref CustomTags.defNames); });
}
public void Reset()
{
Transform contentWindow = transform.FindDeepChild("Content");
RemoveCloneObjectsFromParent(contentWindow);
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 983d00d4d240d6c4780e903708f27c06
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -10,66 +10,45 @@ namespace RimWorldAnimationStudio
{
public class SelectSexTypesDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Initialize();
}
IEnumerable<string> allTags = Tags.sexTypes.Concat(CustomTags.interactionDefTypes);
string placeHolderText = "Enter new sex type...";
public void AddSexType(InputField field)
{
if (field?.text == null || field.text == "")
{ return; }
if (Workspace.sexTypes.Contains(field.text))
{ field.text = ""; return; }
Workspace.sexTypes.Add(field.text);
Initialize(true);
}
public void Initialize(bool addedNewTag = false)
{
if (Workspace.animationDef == null) return;
foreach (string sexType in Workspace.animationDef.sexTypes)
{
if (Workspace.sexTypes.Contains(sexType) == false)
{ Workspace.sexTypes.Add(sexType); }
}
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < Workspace.sexTypes.Count; i++)
for (int i = 0; i < allTags.Count(); i++)
{
string sexType = Workspace.sexTypes[i];
string tag = allTags.ElementAt(i);
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = sexType;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
toggleComp.isOn = Workspace.animationDef.sexTypes.Contains(sexType);
toggleComp.onValueChanged.AddListener(delegate {
if (toggleComp.isOn && Workspace.animationDef.sexTypes.Contains(sexType) == false)
{ Workspace.animationDef.sexTypes.Add(sexType); }
toggleComp.isOn = Workspace.animationDef.sexTypes.Contains(tag);
toggleComp.onValueChanged.AddListener(delegate
{
if (toggleComp.isOn && Workspace.animationDef.sexTypes.Contains(tag) == false)
{ Workspace.animationDef.sexTypes.Add(tag); }
else if (toggleComp.isOn == false && Workspace.animationDef.sexTypes.Contains(sexType))
{ Workspace.animationDef.sexTypes.Remove(sexType); }
else if (toggleComp.isOn == false && Workspace.animationDef.sexTypes.Contains(tag))
{ Workspace.animationDef.sexTypes.Remove(tag); }
Workspace.Instance.RecordEvent("Animation sex 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>().text = "Enter new sex type...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddSexType(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.sexTypes, ref CustomTags.sexTypes); });
}
public void Reset()

View File

@ -10,73 +10,46 @@ namespace RimWorldAnimationStudio
{
public class SelectSoundDefDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Initialize();
}
IEnumerable<string> allTags = Tags.soundDefs.Concat(CustomTags.interactionDefTypes);
string placeHolderText = "Enter new sound def...";
public void AddSoundDef(InputField field)
{
if (field?.text == null || field.text == "")
{ return; }
if (Workspace.soundDefs.Contains(field.text))
{ field.text = ""; return; }
Workspace.soundDefs.Add(field.text);
Initialize(true);
}
public void Initialize(bool addedNewTag = false)
{
if (Workspace.animationDef == null) return;
foreach (AnimationStage stage in Workspace.animationDef.animationStages)
{
foreach (PawnAnimationClip clip in stage.animationClips)
{
foreach (string soundDef in clip.keyframes.Select(x => x.soundEffect))
{
if (Workspace.soundDefs.Contains(soundDef) == false && soundDef != "")
{ Workspace.soundDefs.Add(soundDef); }
}
}
}
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < Workspace.soundDefs.Count; i++)
for (int i = 0; i < allTags.Count(); i++)
{
string soundDef = Workspace.soundDefs[i];
string tag = allTags.ElementAt(i);
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = soundDef;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
toggleComp.isOn = Workspace.animationDef.sexTypes.Contains(soundDef);
toggleComp.onValueChanged.AddListener(delegate {
toggleComp.isOn = Workspace.Instance.GetCurrentPawnKeyframe()?.soundEffect == tag;
toggleComp.onValueChanged.AddListener(delegate
{
PawnKeyframe keyframe = Workspace.Instance.GetCurrentPawnKeyframe();
if (keyframe != null)
{ keyframe.soundEffect = soundDef; }
{ keyframe.soundEffect = tag; }
Workspace.Instance.RecordEvent("Keyframe sound effect");
});
toggleComp.group = contentWindow.GetComponent<ToggleGroup>();
if (addedNewTag && i == Workspace.soundDefs.Count - 1)
if (addedNewTag && i == allTags.Count() - 1)
{ toggleComp.isOn = true; }
}
Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform;
_optionField.Find("Placeholder").GetComponent<Text>().text = "Enter new sound def...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddSoundDef(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.soundDefs, ref CustomTags.soundDefs); });
}
public void Reset()

View File

@ -155,6 +155,7 @@ namespace RimWorldAnimationStudio
Vector3 headPos = new Vector3(headBob.x, headBob.z, 0);
Vector3 appendagePos = PawnUtility.AppendageOffsetAt(bodyType, bodyFacing);
float appendageRotation = clip.GenitalAngle.Evaluate(clipPercent);
actorBody.transform.position = bodyPos;
actorBody.transform.eulerAngles = new Vector3(0, 0, bodyAngle);
@ -163,7 +164,7 @@ namespace RimWorldAnimationStudio
actorBody.headRenderer.transform.eulerAngles = new Vector3(0, 0, headAngle);
actorBody.appendageRenderer.transform.localPosition = new Vector3(appendagePos.x, appendagePos.z, 0f);
actorBody.appendageRenderer.transform.eulerAngles = new Vector3(0,0,clip.GenitalAngle.Evaluate(clipPercent));
actorBody.appendageRenderer.transform.eulerAngles = new Vector3(0, 0, appendageRotation);
actorBody.bodyRenderer.sprite = Resources.Load<Sprite>("Textures/Humanlike/Bodies/" + bodyType + bodyFacing);
actorBody.headRenderer.sprite = Resources.Load<Sprite>("Textures/Humanlike/Heads/Head" + headFacing);
@ -172,6 +173,15 @@ namespace RimWorldAnimationStudio
actorBody.bodyRenderer.sortingLayerName = clip.layer;
actorBody.headRenderer.sortingLayerName = clip.layer;
actorBody.headRenderer.sortingOrder = bodyFacing == 0 ? -1 : 1;
actorBody.appendageRenderer.sortingLayerName = clip.layer;
// ActorKeyframeCard update
if (ActorKeyframeCard.Instance.positionXField.isFocused == false) { ActorKeyframeCard.Instance.positionXField.text = bodyPos.x.ToString("0.000"); }
if (ActorKeyframeCard.Instance.positionZField.isFocused == false) { ActorKeyframeCard.Instance.positionZField.text = bodyPos.y.ToString("0.000"); }
if (ActorKeyframeCard.Instance.rotationField.isFocused == false) { ActorKeyframeCard.Instance.rotationField.text = bodyAngle.ToString("0.000"); }
if (ActorKeyframeCard.Instance.headBobField.isFocused == false) { ActorKeyframeCard.Instance.headBobField.text = headBob.ToString("0.000"); }
if (ActorKeyframeCard.Instance.headRotationField.isFocused == false) { ActorKeyframeCard.Instance.headRotationField.text = headAngle.ToString("0.000"); }
if (ActorKeyframeCard.Instance.appendageRotationField.isFocused == false) { ActorKeyframeCard.Instance.appendageRotationField.text = appendageRotation.ToString("0.000"); }
}
}

View File

@ -15,6 +15,11 @@ namespace RimWorldAnimationStudio
public DialogBox exitDialog;
public SelectAnimationDialog selectAnimationDialog;
public void Start()
{
LoadCustomArrays();
}
public void TryToCloseApplication()
{
exitDialog.Pop();
@ -47,7 +52,9 @@ namespace RimWorldAnimationStudio
public void LoadAnimation(AnimationDef animationDef)
{
animationDef.RunPostLoadOperations();
UpdateCustomArrays(animationDef);
RunPostLoadOperations(animationDef);
Debug.Log("Loaded AnimationDef: " + animationDef.defName);
Workspace.animationDef = animationDef;
@ -67,6 +74,11 @@ namespace RimWorldAnimationStudio
}
}
public void RunPostLoadOperations(AnimationDef animationDef)
{
}
public void TrySaveAnimation()
{
if (Workspace.animationDef == null)
@ -82,10 +94,10 @@ namespace RimWorldAnimationStudio
public void SaveAnimation(string path)
{
Debug.Log("Saving AnimationDef: " + Workspace.animationDef.defName);
AnimationDef animationDef = Workspace.animationDef.Copy();
animationDef.RunPreSaveOperations();
RunPreSaveOperations(animationDef);
Debug.Log("Saving AnimationDef: " + Workspace.animationDef.defName);
Defs defs = new Defs();
defs.animationDefs.Add(animationDef);
@ -93,6 +105,22 @@ namespace RimWorldAnimationStudio
XmlUtility.WriteXML(defs, path);
}
public void RunPreSaveOperations(AnimationDef animationDef)
{
foreach (AnimationStage stage in animationDef.animationStages)
{
stage.ValidateData();
foreach (PawnAnimationClip clip in stage.animationClips)
{
clip.ValidateData();
foreach (PawnKeyframe keyframe in clip.keyframes)
{ keyframe.ValidateData(); }
}
}
}
public void NewAnimation()
{
var path = Path.Combine(Application.streamingAssetsPath, "AnimationDefs/newAnimationDef.xml");
@ -104,5 +132,50 @@ namespace RimWorldAnimationStudio
LoadAnimation(defs.animationDefs[0]);
}
public void SaveCustomArrays()
{
var path = Path.Combine(Application.streamingAssetsPath, "customTags.xml");
CustomTagsHelper helper = new CustomTagsHelper();
helper.defNames = CustomTags.defNames;
helper.bodyParts = CustomTags.bodyParts;
helper.bodyDefTypes = CustomTags.bodyDefTypes;
helper.sexTypes = CustomTags.sexTypes;
helper.interactionDefTypes = CustomTags.interactionDefTypes;
helper.soundDefs = CustomTags.soundDefs;
XmlUtility.WriteXML(helper, path);
}
public void LoadCustomArrays()
{
var path = Path.Combine(Application.streamingAssetsPath, "customTags.xml");
if (File.Exists(path) == false)
{ SaveCustomArrays(); return; }
CustomTagsHelper helper = XmlUtility.ReadXML<CustomTagsHelper>(path);
CustomTags.defNames = helper.defNames;
CustomTags.bodyParts = helper.bodyParts;
CustomTags.bodyDefTypes = helper.bodyDefTypes;
CustomTags.sexTypes = helper.sexTypes;
CustomTags.interactionDefTypes = helper.interactionDefTypes;
CustomTags.soundDefs = helper.soundDefs;
}
public void UpdateCustomArrays(AnimationDef animationDef)
{
CustomTags.defNames.AddRangeDistinct(animationDef.actors.SelectMany(x => x.defNames).Except(Tags.defNames));
CustomTags.bodyParts.AddRangeDistinct(animationDef.actors.SelectMany(x => x.requiredGenitals).Except(Tags.bodyParts));
CustomTags.bodyDefTypes.AddRangeDistinct(animationDef.actors.SelectMany(x => x.bodyDefTypes).Except(Tags.bodyDefTypes));
CustomTags.sexTypes.AddRangeDistinct(animationDef.sexTypes.Except(Tags.sexTypes));
CustomTags.interactionDefTypes.AddRangeDistinct(animationDef.interactionDefTypes.Except(Tags.interactionDefTypes));
CustomTags.soundDefs.AddRangeDistinct(animationDef.animationStages.SelectMany(x => x.animationClips.SelectMany(y => y.keyframes.Select(z => z.soundEffect))).Except(Tags.soundDefs));
SaveCustomArrays();
}
}
}

View File

@ -1,4 +1,6 @@
using UnityEngine;
using System.Collections.Generic;
using System.Xml.Serialization;
using UnityEngine;
namespace RimWorldAnimationStudio
{
@ -21,4 +23,36 @@ namespace RimWorldAnimationStudio
public static Color ColorGhost = new Color(0.5f, 0.5f, 0.5f, 0.5f);
public static Color ColorRed = new Color(0.9f, 0f, 0f);
}
public static class Tags
{
public static List<string> defNames = new List<string>() { "Human" };
public static List<string> bodyParts = new List<string>() { "Penis", "Vagina", "Anus", "Breasts", "Mouth" };
public static List<string> bodyDefTypes = new List<string>() { "Human", "Bird", "BeetleLike", "BeetleLikeWithClaw", "MechanicalCentipede", "MechanicalTermite", "Lancer", "Pikeman", "Monkey", "QuadrupedAnimalWithClawsTailAndJowl", "QuadrupedAnimalWithHooves", "QuadrupedAnimalWithHoovesAndHorn", "QuadrupedAnimalWithHoovesAndHump", "QuadrupedAnimalWithHoovesAndTusks", "QuadrupedAnimalWithHoovesTusksAndTrunk", "QuadrupedAnimalWithPaws", "QuadrupedAnimalWithPawsAndTail", "Scyther", "Snake", "TurtleLike" };
public static List<string> sexTypes = new List<string>() { "None", "Vaginal", "Anal", "Oral", "Masturbation", "DoublePenetration", "Boobjob", "Handjob", "Footjob", "Fingering", "Scissoring", "MutualMasturbation", "Fisting", "MechImplant", "Rimming", "Fellatio", "Cunnilingus", "Sixtynine" };
public static List<string> interactionDefTypes = new List<string>();
public static List<string> soundDefs = new List<string>() { "None", "Sex", "Fuck", "Slimy", "Suck", "Cum" };
public static List<string> actorLayers = new List<string>() { "Building", "BuildingOnTop", "MoteBelowThings", "Item", "ItemImportant", "LayingPawn", "PawnRope", "Projectile", "Pawn", "PawnUnused", "PawnState" };
}
public static class CustomTags
{
public static List<string> defNames = new List<string>();
public static List<string> bodyParts = new List<string>();
public static List<string> bodyDefTypes = new List<string>();
public static List<string> sexTypes = new List<string>();
public static List<string> interactionDefTypes = new List<string>();
public static List<string> soundDefs = new List<string>();
}
[XmlRoot("CustomTagsHelper", IsNullable = false)]
public class CustomTagsHelper
{
[XmlArray("defNames"), XmlArrayItem("li")] public List<string> defNames = new List<string>();
[XmlArray("bodyParts"), XmlArrayItem("li")] public List<string> bodyParts = new List<string>();
[XmlArray("bodyDefTypes"), XmlArrayItem("li")] public List<string> bodyDefTypes = new List<string>();
[XmlArray("sexTypes"), XmlArrayItem("li")] public List<string> sexTypes = new List<string>();
[XmlArray("interactionDefTypes"), XmlArrayItem("li")] public List<string> interactionDefTypes = new List<string>();
[XmlArray("soundDefs"), XmlArrayItem("li")] public List<string> soundDefs = new List<string>();
}
}

View File

@ -0,0 +1,30 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class NumberValidator : MonoBehaviour
{
public InputField.CharacterValidation valiationType = InputField.CharacterValidation.Decimal;
public void Start()
{
InputField inputField = GetComponent<InputField>();
if (inputField)
{
inputField.characterValidation = valiationType;
if (valiationType == InputField.CharacterValidation.Decimal)
{ inputField.onEndEdit.AddListener(delegate { MakeDecimal(); }); }
}
}
public void MakeDecimal()
{
InputField inputField = GetComponent<InputField>();
if (inputField)
{ inputField.text = string.Format("{0:0.000}", float.Parse(inputField.text)); }
}
}

View File

@ -20,17 +20,17 @@ namespace RimWorldAnimationStudio
}
}
public static void WriteXML(Defs defs, string path)
public static void WriteXML<T>(T obj, string path)
{
if (defs == null || path == null || path == "")
if (obj == null || path == null || path == "")
{ return; }
XmlSerializer writer = new XmlSerializer(typeof(Defs));
XmlSerializer writer = new XmlSerializer(typeof(T));
XmlSerializerNamespaces nameSpaces = new XmlSerializerNamespaces();
nameSpaces.Add("", "");
FileStream file = File.Create(path);
writer.Serialize(file, defs, nameSpaces);
writer.Serialize(file, obj, nameSpaces);
file.Close();
}
}

View File

@ -14,14 +14,6 @@ namespace RimWorldAnimationStudio
public static int keyframeID = 0;
public static List<string> defNames = new List<string>() { "Human" };
public static List<string> bodyParts = new List<string>() { "Any appendage", "Any orifice", "Penis", "Vagina", "Anus", "Breasts", "Mouth" };
public static List<string> bodyDefTypes = new List<string>() { "Human", "Bird", "BeetleLike", "BeetleLikeWithClaw", "MechanicalCentipede", "MechanicalTermite", "Lancer", "Pikeman", "Monkey", "QuadrupedAnimalWithClawsTailAndJowl", "QuadrupedAnimalWithHooves", "QuadrupedAnimalWithHoovesAndHorn", "QuadrupedAnimalWithHoovesAndHump", "QuadrupedAnimalWithHoovesAndTusks", "QuadrupedAnimalWithHoovesTusksAndTrunk", "QuadrupedAnimalWithPaws", "QuadrupedAnimalWithPawsAndTail", "Scyther", "Snake", "TurtleLike" };
public static List<string> sexTypes = new List<string>() { "None", "Vaginal", "Anal", "Oral", "Masturbation", "DoublePenetration", "Boobjob", "Handjob", "Footjob", "Fingering", "Scissoring", "MutualMasturbation", "Fisting", "MechImplant", "Rimming", "Fellatio", "Cunnilingus", "Sixtynine" };
public static List<string> interactionDefTypes = new List<string>();
public static List<string> soundDefs = new List<string>() { "None", "Sex", "Fuck", "Slimy", "Suck", "Cum" };
public static List<string> actorLayers = new List<string>() { "Building", "BuildingOnTop", "MoteBelowThings", "Item", "ItemImportant", "LayingPawn", "PawnRope", "Projectile", "Pawn", "PawnUnused", "PawnState" };
[SerializeField] private List<HistoricRecord> workspaceHistory = new List<HistoricRecord>();
[SerializeField] private int historyIndex = 0;
[SerializeField] private int maxHistoryDepth = 100;

View File

@ -0,0 +1,14 @@
<?xml version="1.0"?>
<CustomTagsHelper>
<defNames />
<bodyParts />
<bodyDefTypes />
<sexTypes />
<interactionDefTypes>
<li>AnalSex</li>
<li>VaginalSex</li>
<li>VaginalSexF</li>
<li>VaginalRapeF</li>
</interactionDefTypes>
<soundDefs />
</CustomTagsHelper>

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: e968673039badf84793171c61dce04ce
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More