From 757badf4f66259677c58573c4673da21eecb8f0d Mon Sep 17 00:00:00 2001 From: AbstractConcept Date: Thu, 27 Oct 2022 00:56:04 -0500 Subject: [PATCH] Code refactor --- .vs/RimWorld-Animation-Studio/v16/.suo | Bin 717312 -> 733696 bytes Assembly-CSharp.csproj | 59 +- Assembly-CSharp.csproj.user | 6 + Assets/Resources/Prefabs/StageCard.prefab | 3 + Assets/Scenes/MainScene.unity | 530 +++++++++++------- .../AnimationClips.meta => 1_To_update.meta} | 2 +- Assets/Scripts/AnimationComponents/Actor.cs | 202 ++++--- .../Scripts/AnimationComponents/Actor.cs.meta | 2 +- .../Scripts/AnimationComponents/ActorAddon.cs | 51 +- .../AnimationComponents/ActorAddon.cs.meta | 2 +- .../AnimationComponents/AddonKeyFrame.cs | 49 ++ .../{KeyFrames => }/AddonKeyFrame.cs.meta | 2 +- .../AnimationClips/AnimationClip.cs | 20 - .../AnimationClips/PawnAnimationClip.cs | 230 -------- .../AnimationClips/ThingAnimationClip.cs | 53 -- .../AnimationComponents/AnimationDef.cs | 161 +++++- .../AnimationComponents/AnimationDef.cs.meta | 2 +- .../AnimationComponents/AnimationStage.cs | 146 +++-- .../AnimationStage.cs.meta | 2 +- .../AnimationComponents/BodyTypeOffset.cs | 6 +- .../BodyTypeOffset.cs.meta | 2 +- .../Scripts/AnimationComponents/Defs.cs.meta | 11 - .../KeyFrames/AddonKeyFrame.cs | 21 - .../AnimationComponents/KeyFrames/Keyframe.cs | 19 - .../KeyFrames/Keyframe.cs.meta | 11 - .../KeyFrames/PawnKeyframe.cs | 85 --- .../KeyFrames/ThingKeyFrame.cs | 13 - .../KeyFrames/ThingKeyFrame.cs.meta | 11 - .../AnimationComponents/PawnAnimationClip.cs | 390 +++++++++++++ .../PawnAnimationClip.cs.meta | 2 +- .../AnimationComponents/PawnKeyframe.cs | 177 ++++++ .../{KeyFrames => }/PawnKeyframe.cs.meta | 2 +- .../{AlienRaceDef.cs => PawnRaceDef.cs} | 9 +- ...mationClip.cs.meta => PawnRaceDef.cs.meta} | 2 +- .../{AlienRaceOffset.cs => PawnRaceOffset.cs} | 10 +- ...RaceDef.cs.meta => PawnRaceOffset.cs.meta} | 2 +- .../{Math/Constants.meta => Data.meta} | 0 Assets/Scripts/Data/Constants.cs | 41 ++ .../Constants => Data}/Constants.cs.meta | 0 .../Constants.cs => Data/DefaultTags.cs} | 87 +-- .../DefaultTags.cs.meta} | 2 +- .../Scripts/{Math/Constants => Data}/Enums.cs | 0 .../{Math/Constants => Data}/Enums.cs.meta | 0 .../KeyFrames.meta => DefParents.meta} | 2 +- .../Defs.cs => DefParents/AnimationDefs.cs} | 9 +- .../AnimationDefs.cs.meta} | 2 +- Assets/Scripts/DefParents/PawnRaceDefs.cs | 53 ++ .../Scripts/DefParents/PawnRaceDefs.cs.meta | 11 + Assets/Scripts/GUI/ActorCard.cs | 135 ----- Assets/Scripts/GUI/Actors.meta | 8 + Assets/Scripts/GUI/{ => Actors}/ActorBody.cs | 27 +- .../GUI/{ => Actors}/ActorBody.cs.meta | 0 .../Scripts/GUI/{ => Actors}/ActorBodyPart.cs | 43 +- .../GUI/{ => Actors}/ActorBodyPart.cs.meta | 0 Assets/Scripts/GUI/AddSoundDefButton.cs | 4 +- Assets/Scripts/GUI/AnimationDefCard.cs | 39 -- Assets/Scripts/GUI/AnimationTimeline.cs | 26 +- Assets/Scripts/GUI/Cards.meta | 8 + .../Scripts/GUI/{ => Cards}/ActorAddonCard.cs | 20 +- .../GUI/{ => Cards}/ActorAddonCard.cs.meta | 0 Assets/Scripts/GUI/Cards/ActorCard.cs | 124 ++++ .../Scripts/GUI/{ => Cards}/ActorCard.cs.meta | 0 .../GUI/{ => Cards}/ActorKeyframeCard.cs | 54 +- .../GUI/{ => Cards}/ActorKeyframeCard.cs.meta | 0 Assets/Scripts/GUI/Cards/AnimationDefCard.cs | 39 ++ .../GUI/{ => Cards}/AnimationDefCard.cs.meta | 0 Assets/Scripts/GUI/Cards/StageCard.cs | 63 +++ .../Scripts/GUI/{ => Cards}/StageCard.cs.meta | 0 Assets/Scripts/GUI/DialogBoxes/DialogBox.cs | 4 +- .../GUI/DialogBoxes/RaceSettingsDialog.cs | 50 +- .../DialogBoxes/SelectActorAddonsDialog.cs | 82 +-- .../GUI/DialogBoxes/SelectActorLayerDialog.cs | 12 +- .../GUI/DialogBoxes/SelectAnimationDialog.cs | 4 +- .../DialogBoxes/SelectBodyDefTypesDialog.cs | 18 +- .../GUI/DialogBoxes/SelectBodyPartsDialog.cs | 26 +- .../GUI/DialogBoxes/SelectDefNamesDialog.cs | 18 +- .../SelectInteractionDefsDialog.cs | 16 +- .../GUI/DialogBoxes/SelectSexTypesDialog.cs | 16 +- .../GUI/DialogBoxes/SelectSoundDefDialog.cs | 12 +- Assets/Scripts/GUI/KeyframeSlider.cs | 40 +- Assets/Scripts/GUI/QuiverToggle.cs | 10 +- Assets/Scripts/GUI/SelectActorLayerButton.cs | 4 +- Assets/Scripts/GUI/SelectRaceDropdown.cs | 70 --- Assets/Scripts/GUI/SelectRaceDropdown.cs.meta | 11 - Assets/Scripts/GUI/SelfContained.meta | 8 + .../{ => SelfContained}/ActorManipulator.cs | 0 .../ActorManipulator.cs.meta | 0 .../SelfContained}/ButtonWithKeyCode.cs | 0 .../SelfContained}/ButtonWithKeyCode.cs.meta | 0 .../SelfContained}/Chaser.cs | 0 .../SelfContained}/Chaser.cs.meta | 0 .../RequiresAnimationDef.cs | 0 .../RequiresAnimationDef.cs.meta | 0 .../GUI/{ => SelfContained}/SnapToKeyframe.cs | 0 .../SnapToKeyframe.cs.meta | 0 Assets/Scripts/GUI/SexProps.meta | 8 + Assets/Scripts/{ => GUI/SexProps}/SexProp.cs | 0 .../{ => GUI/SexProps}/SexProp.cs.meta | 0 .../{ => GUI/SexProps}/SexPropManager.cs | 0 .../{ => GUI/SexProps}/SexPropManager.cs.meta | 0 Assets/Scripts/GUI/StageCard.cs | 74 --- Assets/Scripts/GUI/Tooltips.meta | 8 + Assets/Scripts/GUI/{ => Tooltips}/Tooltip.cs | 16 +- .../GUI/{ => Tooltips}/Tooltip.cs.meta | 0 Assets/Scripts/GUI/Tooltips/TooltipMessage.cs | 8 + .../GUI/Tooltips/TooltipMessage.cs.meta | 11 + .../Graphics/MultiDirectionalGraphic.cs | 11 +- ...DirectionalGraphic.cs => SingleGraphic.cs} | 2 +- ...lGraphic.cs.meta => SingleGraphic.cs.meta} | 0 .../Scripts/Managers/AnimationController.cs | 422 +++----------- Assets/Scripts/Managers/ApplicationManager.cs | 83 +-- Assets/Scripts/Managers/CameraController.cs | 1 - Assets/Scripts/Managers/InputManager.cs | 73 ++- Assets/Scripts/Managers/StageCardManager.cs | 102 +--- Assets/Scripts/Math/SimpleCurve.cs | 3 - Assets/Scripts/Strings/NumberValidator.cs | 4 +- Assets/Scripts/Utilities/PawnUtility.cs | 24 +- Assets/Scripts/Utilities/XmlUtility.cs | 7 - Assets/Scripts/Workspace/EventsManager.cs | 54 ++ .../Scripts/Workspace/EventsManager.cs.meta | 11 + Assets/Scripts/Workspace/Workspace.cs | 212 ++++--- .../{alienRaceDefs.xml => pawnRaceDefs.xml} | 16 +- ...aceDefs.xml.meta => pawnRaceDefs.xml.meta} | 0 Library/ArtifactDB | Bin 16777216 -> 33554432 bytes .../00/0027cb53ba0c6636a5ec422fbac2ed82 | Bin 0 -> 9128 bytes .../00/007439c1bc1172189b36c574649143f6 | Bin 70888 -> 0 bytes .../02929ea28525337dbd3bdb47f5b6e2f6} | Bin 7028 -> 7032 bytes .../03/03cd127bb37f089a0d02d1dbb56f8835 | Bin 0 -> 6428 bytes .../05/0563423c0f13a59f61e8d2e2a6f9b726 | Bin 0 -> 10644 bytes .../07/0748742ea3e7399c39e7c04a449cc9ea | Bin 13660 -> 0 bytes .../07/07759b5885c7ba2965b1c78855c39a6d | Bin 61384 -> 0 bytes .../07/07fde1c2452eb27afe21fbcd8504fc91 | Bin 0 -> 9560 bytes .../08/085178422e4479afa28168cfe7de0e16 | Bin 0 -> 9616 bytes .../09/09163e07c804eb423732510b9c4625d0 | Bin 71040 -> 0 bytes .../09/0945095b3383d66693e03c05dc4f9b38 | Bin 0 -> 6448 bytes .../0a/0a7a267cc2187e45cfe384a5ff637220 | Bin 0 -> 21332 bytes .../0a/0aa61e84826458ecf6c215c142206b81 | Bin 0 -> 10008 bytes .../0b/0b79a9e031cf5bc692f8a990331ff48e | Bin 0 -> 5600 bytes .../0c/0c7accbfac2bf14bb7674f01e728f3a7 | Bin 0 -> 9384 bytes .../0c/0c8739cd590d104e54c127427a4b6a27 | Bin 0 -> 9568 bytes .../0caea0aa396b9c2fb62d0b9bb3b9746f} | Bin 9956 -> 9892 bytes .../0d/0d9dfff24b95e15d868f3a0ef90ef73a | Bin 0 -> 6136 bytes .../0d/0df543ee31ea4d33fc0c82c39a05f492 | Bin 0 -> 5636 bytes .../0e/0eb0d27abb139b6df3003cb5722cbddd | Bin 0 -> 10660 bytes .../0fbe343ca3f63321bf4deed28ff2a4cf} | Bin 14304 -> 22660 bytes .../10/1006dedec0dabeb067eb21dbeae5733a | Bin 0 -> 6352 bytes .../10/103a0f67c6be2793e121afdca2b2da6d | Bin 0 -> 9700 bytes .../11/11095d5db6184bfa9d4cf6c0a29f157a | Bin 0 -> 5656 bytes .../11f1012eebfd255d2639036a14e6d3d5} | Bin 7168 -> 7172 bytes .../12/12f6e021441992b46119b4a6878c30fc | Bin 70896 -> 0 bytes .../14/145724648a9cb7efbde664b50eba358d | Bin 0 -> 16900 bytes .../14/145ce871ab454abf5837e901ebbf3020 | Bin 0 -> 7484 bytes .../14c27a6d7c174792cec69fa566d6bc12} | Bin 6016 -> 6004 bytes .../15/1517227d00eadaa5756415410c751df2 | Bin 59072 -> 0 bytes .../16/1610538f1ce9097e63824d7c77e72906 | Bin 0 -> 9596 bytes .../16/165252f1e3bbe8c80b2a34eb9a7787f1 | Bin 11432 -> 0 bytes .../1665c7a61d34721be3cf93e4bc0615e4} | Bin 6656 -> 6564 bytes .../17/172bd09cb4eb14a72a4e04018a1a1350 | Bin 0 -> 10720 bytes .../18/18186149759d96c1dd0f5a47b5b4e27f | Bin 71048 -> 0 bytes .../1942f54c56360f47634f12a235c14465} | Bin 6260 -> 5736 bytes .../1a/1ac20c411cb110ba8fb14ffc1058b038 | Bin 0 -> 21320 bytes .../1b4f294883743cbe7f5b02f55c12f96d} | Bin 6420 -> 6384 bytes .../1b652115067e855db7af3c3d82fd9607} | Bin 5928 -> 5916 bytes .../1b/1b729f6b5e33991c6dc5ca5dfa27b7b3 | Bin 0 -> 8008 bytes .../1c/1c099f8e1f15bc25e91e26115c414c42 | Bin 0 -> 40897 bytes .../1ec68812be6e36775194872be25b7b5a} | Bin 5024 -> 5016 bytes .../1e/1ef2e193f4edb2e4212736bdb6804bda | Bin 24449 -> 0 bytes .../1f/1fa6ae3a08e5107e3a2865472b3fab7a | Bin 37128 -> 0 bytes .../20/201678d8d4f1b000710ff9f8a30f02e1 | Bin 81944 -> 0 bytes .../20/20946a2fa7004b2e5216c07df5199e71 | Bin 0 -> 7412 bytes .../21/2140bb0c0348df9a1c1d45da87e0305c | Bin 11656 -> 0 bytes .../21/21cb9b5eaa671c7edc94a0f606f91209 | Bin 0 -> 9700 bytes .../21/21fdfc14e5c3de632c9982c847b72c32 | Bin 0 -> 14956 bytes .../22/22d5dbe2db56cd404c1fd147e4ba3f12 | Bin 10176 -> 0 bytes .../23/23294a863aab6747c6fad3eefb7f000b | Bin 24449 -> 0 bytes .../23/238ef6b5a1f482350c0a355d26d34084 | Bin 70888 -> 0 bytes .../23/23b27c713996371464db6cd3cc02ff1a | Bin 0 -> 6380 bytes .../25/256c52d749dadf8352e2e09b785e1f12 | Bin 0 -> 22660 bytes .../26f9770f9fa7b627b27327aa12e44985} | Bin 8668 -> 8560 bytes .../27/27fd1308f5bcdcb4454e4de5ca9aab5e | Bin 0 -> 4668 bytes .../2a/2a0e5f19864095808f285a37bc4e42f4 | Bin 83272 -> 0 bytes .../2a/2adc991e49d9653e44066261c307c512 | Bin 83120 -> 0 bytes .../2b/2b1c6b262342113f86ff91b2b5650578 | Bin 0 -> 6352 bytes .../2b29fd2b532cd9602f059a742337098f} | Bin 6512 -> 6508 bytes .../2b/2b4995803d77205ea0104d4a22d185b4 | Bin 0 -> 13588 bytes .../2b/2b829e6616aa147a90ccc045d05abe80 | Bin 0 -> 4221 bytes .../2ba69c8d389ccc4ef81f8fa31f491673} | Bin 6424 -> 7424 bytes .../2b/2bc4d31367cf8a031fd2483c6e8f6a09 | Bin 0 -> 7436 bytes .../2b/2bd230c30861d7479bd96f53d619b87a | Bin 70888 -> 0 bytes .../2bf4b9f935244d32b758a6f8b9f6ce51} | Bin 14092 -> 14292 bytes .../2c/2c507939b34445a07ed25c677279da80 | Bin 9372 -> 0 bytes .../2c/2cb25682b62b7bce5eac10d3a59d341f | Bin 70896 -> 0 bytes .../2d/2d7353852b5a979624feea6c4d57eee9 | Bin 0 -> 10460 bytes .../2e/2e33b4cace114a8c0b5f8e42a74f4fb5 | Bin 83120 -> 0 bytes .../2f/2f246422b49daadd3c439e1619a16a07 | Bin 70888 -> 0 bytes .../2f/2fbe9afd0d54861bffa94927205bb7be | Bin 0 -> 10508 bytes .../30/306227541e60b541fe2af74062e6bfba | Bin 71728 -> 0 bytes .../30/3089c93cb4438df0f6a125d0ec8c3930 | Bin 70896 -> 0 bytes .../31/317bb1f7e53dfbeb4edfba8e386d4a28 | Bin 37092 -> 0 bytes .../31d2f0b77d3a470410e1cf13e5a42652} | Bin 38232 -> 26164 bytes .../32/3202a47d4c727056e86c64c1af38f676 | Bin 0 -> 5512 bytes .../32/3220dc4e27f98703355baf9dd3a1d948 | Bin 0 -> 4229 bytes .../32/32b4e1bff2d46b48dea189f66d9bcc8d | Bin 0 -> 5804 bytes .../33/3333ffdbf1a9cf3e6a30728b2f9a7b93 | Bin 11544 -> 0 bytes .../3354b778f99cc1e753c7117fe7244bb1} | Bin 6672 -> 7692 bytes .../34/3464a108a1d4a27702c302ebd3ce13f0 | Bin 81928 -> 0 bytes .../34/34d0473e47a4313b79cd131ada10e103 | Bin 18740 -> 0 bytes .../34/34e3ca2ed7327dfa2daf4570a8e8d7cd | Bin 70888 -> 0 bytes .../35/354cd528d320379d400740db4994e7c0 | Bin 0 -> 6348 bytes .../35/35f8dfa65dcdd8b4f8b0b1cc8a8b317d | Bin 0 -> 10508 bytes .../37/3701c210834b6971a7087f91aa61fc74 | Bin 0 -> 6348 bytes .../37/37cc0af7c17ac95fb1a082a991c75dba | Bin 0 -> 7040 bytes .../38/38f747d653db8eef1519541af3cd2306 | Bin 0 -> 13600 bytes .../39/3945df6553d325c4244495284a037cff | Bin 71040 -> 0 bytes .../3c/3c2185cda4bc8e34513a79c7239da708 | Bin 11644 -> 0 bytes .../3c/3cb350167bc6778641447bfecf056fe5 | Bin 0 -> 4229 bytes .../3d/3dfa0447a511bb78b21c897223b3574c | Bin 10212 -> 0 bytes .../3e/3e715903507779c4c9b362a13b271b75 | Bin 24449 -> 0 bytes .../3e/3ee67d544fcb265af9b8322b49eee6f5 | Bin 0 -> 10392 bytes .../3f/3fb374e907869433bb625132faa3125d | Bin 0 -> 4604 bytes .../42/428665fab54b4a4aeae9ce8136c82721 | Bin 24449 -> 0 bytes .../43/4381b540e305370cf65cb993e88f1fbe | Bin 0 -> 10664 bytes .../4389224c9121275fe5f6c6295f218d50} | Bin 5124 -> 5184 bytes .../43/43f4e73939807de737856af3208400d6 | Bin 70896 -> 0 bytes .../43fa1e043613b79f6d57b6fb49703d02} | Bin 5116 -> 5696 bytes .../44/441d9e5b832c96d7db244e17903b328a | Bin 0 -> 7424 bytes .../46/46282d47b52cf52fe3ca58568191742e | Bin 81944 -> 0 bytes .../46/46c5f8e4ab224251bc91ffa54e4456ae | Bin 83120 -> 0 bytes .../47/47ba53d3383497a390865af0eb1af9bd | Bin 81944 -> 0 bytes .../47/47c235df45a8bd2628593334c5b6c764 | Bin 0 -> 6328 bytes .../4834450e10905ffcc5d9dff278327a77} | Bin 7008 -> 7012 bytes .../48/489a9a7c06f87b88abb6a024635b717b | Bin 0 -> 9540 bytes .../48/48c7b7aa24c56aac448a9bdff51f5dbe | Bin 0 -> 6348 bytes .../48/48cfc50748451f913b40d23e2a5b2c03 | Bin 0 -> 10460 bytes .../49/49752198e6b7a90a062b94c1e0addc50 | Bin 0 -> 21472 bytes .../49/49a1ba3c7fd0f533689b16db5e74d505 | Bin 0 -> 10680 bytes .../49/49dab48fc87b6dae0b9d6bc96623bd16 | Bin 70888 -> 0 bytes .../4a/4a14f9a83fadbe66de22e4715dbc3e93 | Bin 0 -> 11532 bytes .../4a/4a4db4458aaec17587d66bb6f8dfe432 | Bin 0 -> 21320 bytes .../4b/4bb105f27ea150c1fbac8418cd1666bd | Bin 0 -> 9276 bytes .../4c/4c42494b1073f162e3a83012875f5380 | Bin 0 -> 14280 bytes .../4d/4d3cf0869edfd372a316aa0c8af4644f | Bin 0 -> 7708 bytes .../4d/4d3eab6d7f33ffe3f27de7fc51d314b0 | Bin 70896 -> 0 bytes .../4d/4d9568a8f737105ddf2957da48f52918 | Bin 0 -> 7420 bytes .../4d/4def6f7d7280b762a99ef74cbeb19480 | Bin 0 -> 21320 bytes .../4e/4e037fe46697280cde9c905749385e72 | Bin 0 -> 11528 bytes .../4e/4e7094c7475d0794da16d0b520d10d69 | Bin 0 -> 22660 bytes .../4f8625ec9d380264fdf0da332a89861f} | Bin 9312 -> 9484 bytes .../4f/4fb8b2ce902dac82421731ab17fa9b69 | Bin 0 -> 5716 bytes .../50/509c74cc852f1622c1af6d5502a1a7d6 | Bin 70896 -> 0 bytes .../50/50a64145390f825ee8b2b9fbc3c69335 | Bin 0 -> 11232 bytes .../50/50bdb3ba0f2272b9330bad100d377959 | Bin 0 -> 13540 bytes .../50/50fbb6c84abebeeb3486f64c70150ba1 | Bin 0 -> 6092 bytes .../52/527a1a2cf424b9436e0e5d607073bf00 | Bin 0 -> 10460 bytes .../52/52bee7fb99a02ae816d7871db07aee7f | Bin 0 -> 10508 bytes .../53/53453697071c831c8feb7d4ec4cf7506 | Bin 0 -> 10948 bytes .../544d473366fd868a4f2303f95c7f014b} | Bin 6460 -> 6608 bytes .../54/54fb9c154b14bb6ab8160daf9798e5a5 | Bin 70896 -> 0 bytes .../556a916afd2dc8c1887cad4556bc08c9} | Bin 12624 -> 9472 bytes .../55/55ea23367855499bc59f3527e033f960 | Bin 0 -> 9760 bytes .../57/572b149842bb1e9d787fba352b25debb | Bin 0 -> 10776 bytes .../57/572f1d3af72ed4fdbc7d59eeed86fa28 | Bin 0 -> 6376 bytes .../57/57ce40e10426474a4001db3a5353430f | Bin 70896 -> 0 bytes .../5a170bf5b5437b30ee8864b786ae1b9e} | Bin 14172 -> 14280 bytes .../5a73eba595fc7798a349f35671da608b} | Bin 11836 -> 11736 bytes .../5a/5aa32d398b3136c869645d63e6243d3d | Bin 0 -> 7444 bytes .../5a/5aef00813218e09d1273dfa569de6c10 | Bin 0 -> 10644 bytes .../5b/5b11106f5eb5e6bdd289d637c6a5bcbf | Bin 0 -> 6208 bytes .../5b/5b68c6c0aad55e9ebe9c091bfa4539ba | Bin 0 -> 11528 bytes .../5b/5bac16382394256d60f8402e2b02535a | Bin 0 -> 5580 bytes .../5d/5d033e5afe52a48677ec266ca5d73030 | Bin 0 -> 9640 bytes .../5d/5d0e5d403c2e67015b420909e7188e98 | Bin 9364 -> 0 bytes .../5d1489e74deecc1b0b55462cf2d44def} | Bin 14744 -> 16752 bytes .../5d/5dc5f455cd7ee55ecde39001b15730fa | Bin 0 -> 10648 bytes .../5e/5e49d71c63825f88570f64f44591d643 | Bin 70896 -> 0 bytes .../5e/5ea692c7ad5a0c7771e31bd8cebfc8a6 | Bin 0 -> 6956 bytes .../5f/5fc9a8f198e4b38855a11acea7fec3fd | Bin 24449 -> 0 bytes .../5f/5ffd31c0154a7b62e637379c7a71c731 | Bin 70896 -> 0 bytes .../61ad12422139404ecdfac6c418dd83ea} | Bin 7012 -> 7016 bytes .../62/62670d16584eaf8da416a67f89d588fd | Bin 70896 -> 0 bytes .../62/62dd0f7b6ddaa9efd4249151ec13e012 | Bin 0 -> 7040 bytes .../62/62e9829ac854568ac023ca65235dbea2 | Bin 70888 -> 0 bytes .../64/645ec641eb63366e71f719d7bff48f61 | Bin 70896 -> 0 bytes .../64/64697b496786afe0059007cb4898a9bd | Bin 0 -> 8308 bytes .../64/64ecb5ea5c65bdca7f3477d50981ab92 | Bin 0 -> 11480 bytes .../65/65a888c7eb1c5687f8a6a94939e2b74e | Bin 0 -> 9532 bytes .../66/66792f144378fe08b0eb094904042a24 | Bin 14816 -> 0 bytes .../66b122f5842cca4183f0d5009caa1327} | Bin 8364 -> 8312 bytes .../67/67a0c5c6d31f9e4a28206e8d2ffbf789 | Bin 70896 -> 0 bytes .../68/6879708621a481f1efd32b3e7b61bf68 | Bin 0 -> 9500 bytes .../68/689f0ba0da7411eb10df0621b3977044 | Bin 11484 -> 0 bytes .../68/68c813c178d2ddc76a01ce507dcd02ae | Bin 0 -> 6576 bytes .../69/6935658458265a5596fa72c8da2cd200 | Bin 70896 -> 0 bytes .../6a/6a26c28d5b35d17373c08b6e6bc7b84d | Bin 0 -> 10656 bytes .../6b/6ba4a0123019ea78b4955d23470fa45c | Bin 70896 -> 0 bytes .../6c/6c20487eecd860f1cd129ee25839ce9f | Bin 83120 -> 0 bytes .../6c/6c2eb9e49a060cf65016e177b8dfae5e | Bin 14128 -> 0 bytes .../6c8ab9f9385afa6596271629ee64135b} | Bin 35356 -> 35764 bytes .../6d/6d8e7e960088816160bfd15026b0bdf6 | Bin 0 -> 7380 bytes .../6d/6de038949875bdeaa0d03f1019727ce3 | Bin 0 -> 21852 bytes .../70089d61d61b845ca72a0bed296381d8} | Bin 14228 -> 22596 bytes .../71/711797a9958a7aa2867d2253558753c0 | Bin 0 -> 4229 bytes .../71/713958508c0bd9ae305238513e8d9452 | Bin 0 -> 9672 bytes .../71/71ce12d3d04605d3e8856e64e6799f74 | Bin 0 -> 5660 bytes .../72/728c3f2716acc6ffdfb2966f837f63e3 | Bin 12708 -> 0 bytes .../72/72e623ddfb6b80840fc3b958bfd2d3c4 | Bin 13624 -> 0 bytes .../7328e5296da8dde51da9225fe5b732e7} | Bin 8920 -> 8808 bytes .../73/73d31515f573ad9a53fcdf67b533dd9e | Bin 10176 -> 0 bytes .../73/73e6ecb7f857bb651aa94d50872a57a4 | Bin 0 -> 19164 bytes .../7667c29695279c6429a107ff74deb70f} | Bin 83280 -> 83608 bytes .../76ec0bdfbb9fc484d5b7a73bdf3d6f32} | Bin 7980 -> 7628 bytes .../78/78b386bb929d104bbad91e0a70e31056 | Bin 0 -> 10652 bytes .../79/7903532e0815ca4c99f98b372089ab47 | Bin 0 -> 9080 bytes .../79/796c3bb3a7dae077404194e6a3dcb1e7 | Bin 0 -> 19856 bytes .../79/797bbd44a3b54805ecc9c8be27feeb43 | Bin 70896 -> 0 bytes .../7a/7a05378324fe17afaebfbeedeee2d718 | Bin 70888 -> 0 bytes .../7b/7b17e3eef79f654f9765230b0178b57e | Bin 0 -> 6348 bytes .../7b/7b56847e86c390aa91020218689cadbb | Bin 24449 -> 0 bytes .../7d0cbdb2f8380249ed43a777613f0668} | Bin 7008 -> 6996 bytes .../7d396e589a880d83df9e46d9f1bea41a} | Bin 5484 -> 5492 bytes .../7d/7dd9c29e2b5696e0667459c5e2ffacf4 | Bin 0 -> 10460 bytes .../7d/7de6aa5ee9c46ac5169855002736eda1 | Bin 70896 -> 0 bytes .../7e/7e7b7d792bcda7207a4aeffe5cc08acb | Bin 70896 -> 0 bytes .../7e/7e98bc772facf817f54e614a1877f48d | Bin 0 -> 7432 bytes .../7f/7f3f40b1bc398f380b75fa03b58537e7 | Bin 0 -> 7628 bytes .../7f/7f9e219f61afdd285073fda21bbf1ffd | Bin 0 -> 8832 bytes .../7fb942dc05fd31f8867195f38fed26ed} | Bin 14220 -> 14240 bytes .../7f/7fd09df623a5b2e26e42b58a896bb5ca | Bin 0 -> 21320 bytes .../8077836a8f0f5d082208169cd6d30ea9} | Bin 8056 -> 7408 bytes .../80/807fdff4b6454b5088ef1e7c1c759e4e | Bin 0 -> 6536 bytes .../82/8250c0acb1763ce7b46211e9f799fa36 | Bin 0 -> 7724 bytes .../83341329e090768ab0d2cb352e7105d5} | Bin 37744 -> 26124 bytes .../83/83682fd8c69ed1ad7dddbd346416fed7 | Bin 71040 -> 0 bytes .../8382d1c0a68040e99022bfbabfcc4660} | Bin 12636 -> 9452 bytes .../84/84d53ed6f63721723ac2dcada6a05241 | Bin 0 -> 8332 bytes .../85/85086532bd20bb41d0f7e279c7647de1 | Bin 83128 -> 0 bytes .../855e940f175eb1bc0847a7b81413604c} | Bin 9664 -> 9736 bytes .../85/858b519f42847f1f0375aad5c12ff9e5 | Bin 0 -> 11048 bytes .../86/866b2b753892fb1c0d62c6a1c320231c | Bin 11320 -> 0 bytes .../87/87071a3b2c3bf68967b1cad0a23d477a | Bin 81952 -> 0 bytes .../87/871f2fdf5df540e08928ce4c41f9ea10 | Bin 0 -> 6336 bytes .../87/87beec1f712d5a52df2b3921dd2b459f | Bin 0 -> 6344 bytes .../89/8952a4c0cdf7d699ed4aaa787aba91aa | Bin 37036 -> 0 bytes .../8b/8bd38283b5751d17c0e06b6fcec2b5f0 | Bin 0 -> 5724 bytes .../8c/8c3a3221cc51c4c7a5557afdbceebe03 | Bin 70896 -> 0 bytes .../8d/8d3c9533c34a9c54aed977fa715f0ca1 | Bin 24449 -> 0 bytes .../8d/8d5a0cdbf83cb4323fc8e3cb17088229 | Bin 70896 -> 0 bytes .../8f2aa58ac657a377390393e03940c13c} | Bin 5600 -> 5400 bytes .../91/91fd51bd0cbfe6d667bb263879c4dc1b | Bin 0 -> 5568 bytes .../93/93105f762dbb794bc691ebb09bee2a96 | Bin 0 -> 9116 bytes .../95/95fe971bcb6a53b48108d1a957ef9ca2 | Bin 0 -> 7896 bytes .../96/96752b5c656e98662e018f49c18bfde8 | Bin 0 -> 5720 bytes .../96/96ba97662c71a19f363f2c21e678a9d4 | Bin 0 -> 5580 bytes .../98/9852411e3fbb7047ba65594236477c53 | Bin 83120 -> 0 bytes .../98/989c4831a028a58c74ec4095ab278a7d | Bin 9580 -> 0 bytes .../98/98b1a912eb1743299a38ec33315c1efe | Bin 0 -> 7424 bytes .../99/99002924e8668972c17697fb65a198a8 | Bin 0 -> 8180 bytes .../99/99232e726b70fac26a01638e3751b75f | Bin 0 -> 11528 bytes .../9991dcdb93b7af9c923288d50af3a59f} | Bin 5440 -> 5432 bytes .../9a/9a334141cfd60831acefc4fdb4304413 | Bin 0 -> 10676 bytes .../9b/9b334a30a0daf9230c22d1d0c9b9fe75 | Bin 70888 -> 0 bytes .../9c/9cf2c35388c04882f45ccc868efb9cae | Bin 0 -> 7632 bytes .../9c/9cfaec6557b346d20760977d79eca6b6 | Bin 70896 -> 0 bytes .../9d/9d00d5c6aaff5507bce324a443ddc060 | Bin 70888 -> 0 bytes .../9d/9d14ccae7be661c8f6bd7724fc9b8e07 | Bin 0 -> 4684 bytes .../9f/9f7715740a09ec2ec340f1d13fcb6568 | Bin 71040 -> 0 bytes .../a0/a0414dd4526497ce4e72ecfb85c3893a | Bin 0 -> 13592 bytes .../a0/a0c704042d112c29a4680f55638b916c | Bin 0 -> 9532 bytes .../a2/a29a1c5ad3a1492db0e92931bc473be0 | Bin 83120 -> 0 bytes .../a3/a364fe207323ad7a9d181d54d0a2f7b4 | Bin 71728 -> 0 bytes .../a3/a390bcc848a6ef4084f4e142ea250729 | Bin 83120 -> 0 bytes .../a3/a3cc52ebd56775c3b917f11c126a43f0 | Bin 71696 -> 0 bytes .../a3/a3d2263fdc6bd818d706afebc9d5a460 | Bin 0 -> 10508 bytes .../a4/a43260d53832b94e5f9411615f6366d6 | Bin 0 -> 4233 bytes .../a4/a4d4b8d00b0663192741f2506e22dab8 | Bin 37124 -> 0 bytes .../a5/a55878bb270f9e97eb2c34845e75bacb | Bin 70896 -> 0 bytes .../a6/a64fb49bee27b5bec60eb322d8449e8c | Bin 70896 -> 0 bytes .../a9/a929d521d0780880c964fd0d3de905f2 | Bin 0 -> 9612 bytes .../aa/aa623a236ab5fb59a1e22cd594dd1909 | Bin 83272 -> 0 bytes .../aa8f8df0cfe247e9a168c4fa63b7f919} | Bin 6804 -> 6816 bytes .../ab/ab3ed0ac05de3443ab38665f5770609b | Bin 0 -> 19856 bytes .../ac/ac82a6ba0046506fc9a6c5d9b795ca02 | Bin 0 -> 4225 bytes .../ad0aeb1e6112c7a332316bee4eb09ad7} | Bin 6444 -> 6572 bytes .../ad/add16aa1419ea8f0d89bf0d4d1e16d09 | Bin 0 -> 9552 bytes .../ae/ae5ce04d6c18d23f396e95d1592db174 | Bin 0 -> 5516 bytes .../ae/ae5d2dd88fbb253b7b893d9c0b714f31 | Bin 0 -> 9532 bytes .../af/af1ba00bcd3b54e607fb4fd6ba862fce | Bin 0 -> 7376 bytes .../af/afcff917c72f5e956a6893f48ed45c70 | Bin 0 -> 9436 bytes .../afe2d43cc0ee4f9ecb47fbcad4723941} | Bin 13908 -> 13648 bytes .../af/affd87ee43153b480adbd51224c99b9e | Bin 70896 -> 0 bytes .../b0/b017c56197d00a8f72cd19af788b3c40 | Bin 0 -> 9660 bytes .../b1/b1308fa5c3c5d3266db3e4cf0ffba231 | Bin 0 -> 7136 bytes .../b1/b1432999163c7d84aeec0b39136f85bf | Bin 0 -> 6364 bytes .../b146b1cbdb4c0a1f9fff54cdbc612210} | Bin 6656 -> 6140 bytes .../b1/b1e2361ab9906f719638ba0256aa0c99 | Bin 0 -> 16792 bytes .../b2/b28b812b1c4b059bdbe08ec197b67b1b | Bin 0 -> 11052 bytes .../b2/b2c496b15b6ffe3a2c5448ceb13aed65 | Bin 0 -> 5568 bytes .../b2/b2fcf8ea80aaa62e61ed8b36aeb85abf | Bin 70896 -> 0 bytes .../b3/b394e9767a670cf98ba09779162b6238 | Bin 0 -> 11076 bytes .../b5/b5e0653e9ea362ba6dc081175324623e | Bin 11432 -> 0 bytes .../b7/b77440d8fcf94ceb192fcffdc4102f8b | Bin 0 -> 9344 bytes .../b8/b820743a82a8c4432c923cca1aafb015 | Bin 0 -> 10072 bytes .../b8/b8b2e544b66f1f34620683c9611395d1 | Bin 70896 -> 0 bytes .../b9/b94a3704d3024491e7d98315f8f18cd9 | Bin 0 -> 4225 bytes .../bb/bb030bdaa908d1b7bfb7d49e63a3831a | Bin 0 -> 5576 bytes .../bb489ecbb333b263ea941f2011fcadbe} | Bin 37536 -> 26172 bytes .../bc/bc0a65a48825f10ab3c8eab043fa806f | Bin 10212 -> 0 bytes .../bd/bdbb2c03378096c53dec52a21a548fbe | Bin 0 -> 6956 bytes .../be/be57eb14e880d756f0c0d011aecbe977 | Bin 0 -> 9724 bytes .../bf/bf7c4c76693fb5bdfd8bef94ac466d07 | Bin 0 -> 9764 bytes .../bf/bff4416a5a09215658f09b6edcd5720e | Bin 0 -> 5128 bytes .../c0/c03f3fae2a47035edcee9042b5203b1e | Bin 70896 -> 0 bytes .../c110dc4be031b32f3037d3a7c41cc7dc} | Bin 14140 -> 14224 bytes .../c1/c1a3da2aa8fc2e084110a6af34d2645a | Bin 0 -> 21320 bytes .../c4/c40f5793a552d8a65b8833ba597338a1 | Bin 0 -> 10460 bytes .../c4/c4c1b87a3fbe1e2a441b5ba5807ee9b8 | Bin 70896 -> 0 bytes .../c5/c57e535a33c36c46bf019fcdfd9e30a5 | Bin 0 -> 8380 bytes .../c5/c5b28b430030d0671caabe4e9db1fbf3 | Bin 0 -> 10668 bytes .../c5f59f1f46b9a2c562523ca6d29b2eb9} | Bin 8664 -> 9100 bytes .../c687b46beb1a509c370d11b06ce592ea} | Bin 5084 -> 4748 bytes .../c6/c69596567f57175612e6d7f76f1d45af | Bin 12016 -> 0 bytes .../c8/c8336f7c53b079e8615c9516fc033793 | Bin 0 -> 10932 bytes .../c9/c94a32ed64707926fa063e72beece614 | Bin 0 -> 5628 bytes .../ca/cadc59064821e1592a31ef67cada519b | Bin 0 -> 7436 bytes .../cb/cb0649f447b58081e0cd8769ff19af26 | Bin 71728 -> 0 bytes .../cb/cbd9476f193bf8973465ab57a26ca989 | Bin 0 -> 6348 bytes .../cb/cbed062b40950f4709ad52cb87144c19 | Bin 70896 -> 0 bytes .../cc/cc854ac7ea2ec46a4122044356da2290 | Bin 83120 -> 0 bytes .../cd/cd12484328d9bf16c018135af8dd8ddf | Bin 16364 -> 0 bytes .../cd/cd5958ec4f02ec9f51ecf15b259d2c08 | Bin 37972 -> 0 bytes .../ce/ce0c654189d3e9fd55210fdc4a28b518 | Bin 0 -> 4444 bytes .../ce/ce617c072ee2193c4ba761bfdd0fb1f8 | Bin 0 -> 21320 bytes .../cf/cfe0a33440d005e85b4e7d998a6658dc | Bin 10104 -> 0 bytes .../d0/d01a5e9df6e9045fec6f69d88b353b33 | Bin 24449 -> 0 bytes .../d1727569dd26ab01e3a8e7a1f9260061} | Bin 7164 -> 7372 bytes .../d1/d1b02ca39be02c9294339eba51dbe8f4 | Bin 0 -> 8360 bytes .../d1f76d79465c4b5e5d74ec5624a59a43} | Bin 4992 -> 4984 bytes .../d2/d2baa37ba1ab8c93de7bec2440f80cef | Bin 0 -> 6348 bytes .../d2/d2c4a5e1ce8fc2e53072a8f0a8019fc8 | Bin 0 -> 6340 bytes .../d3623fb86eedfc54a6f1257509fd2896} | Bin 9624 -> 9732 bytes .../d3/d38a9d39b79496290718dea9a0c1bf15 | Bin 0 -> 4225 bytes .../d3/d3990cf2587501d58191c61ec24b19b6 | Bin 0 -> 21320 bytes .../d4/d406396756b3a2932c8dda608f0f6642 | Bin 0 -> 8372 bytes .../d4/d435474bf7ea3beb0cc797cebe2f50c1 | Bin 0 -> 7412 bytes .../d4/d46e114a8b9c64c74cd0baf664afdd3e | Bin 0 -> 22660 bytes .../d5/d58a07a5ab2dde5d6c6456bad4f43dc7 | Bin 70888 -> 0 bytes .../d5/d5906573171e7841d0a1b2509045d613 | Bin 6408 -> 0 bytes .../d5/d5a0df90f8d286981f73582a11ccb623 | Bin 0 -> 7628 bytes .../d5/d5f1190f1cb486c486648a8b7f3b0e2a | Bin 70896 -> 0 bytes .../d6/d6acb5fcd5c9e550ecde1f5d05f8b0da | Bin 0 -> 5648 bytes .../d6/d6b71fc5cb90d76975a493a4c9f59faf | Bin 0 -> 4225 bytes .../d7/d75a6a4488699b3a51d3714df39b89c7 | Bin 0 -> 11536 bytes .../d8/d87a56dff6cc27dbd0352e2a8c2b2565 | Bin 70896 -> 0 bytes .../d9/d93f50d6dde2152fdc829462e3623ba7 | Bin 0 -> 20308 bytes .../d9/d94daf156578cf0701de33d01ede4b5b | Bin 0 -> 11544 bytes .../d9/d9e6fdc7a95155f79e48a01f4fd09537 | Bin 83120 -> 0 bytes .../da/da57504f2a65b1f61ff9bca559a74a8a | Bin 10324 -> 0 bytes .../db/db10582607133da7270333b93de60f18 | Bin 0 -> 21320 bytes .../db/db2fce779bd34d4f419fb8644b2b3be1 | Bin 59064 -> 0 bytes .../db/dbf3ec5c8bf66a6c0438cb5b5d3c85ce | Bin 0 -> 21836 bytes .../dc/dc506c67ae472164513f5127212f7f7b | Bin 0 -> 10052 bytes .../dd/dd2536bd7028e9252b92769a3519fb07 | Bin 81944 -> 0 bytes .../dd/dd7a0ae85f5306ba339e21264b49b390 | Bin 0 -> 10412 bytes .../de/dedc0ce59033c1e8670a06ebdcc7f2c9 | Bin 0 -> 8976 bytes .../de/dee5d8c16ed5173fb1aac990c044d722 | Bin 0 -> 7036 bytes .../de/dee7cd0898a0892111d380873ef8d4cf | Bin 13096 -> 0 bytes .../df/df62c5cafc466e1f5d29d8ba8289ea72 | Bin 0 -> 9492 bytes .../e0/e0bc66e3ebd27fb97c759869bc6ff734 | Bin 0 -> 11284 bytes .../e1/e16e1969806c8e9634376ed271357bcc | Bin 0 -> 9528 bytes .../e1/e18486a04459b45946c40b16d6cd3d72 | Bin 11320 -> 0 bytes .../e1/e198e996a6fa3ef6c5711a5284e52231 | Bin 83128 -> 0 bytes .../e2/e27b9d57d16e78e0b63768071500ce3f | Bin 0 -> 5580 bytes .../e2d26d37cd98b8e9ce6cdb353ce6d890} | Bin 5104 -> 5040 bytes .../e3/e3203d097566fea19053f34630072234 | Bin 24449 -> 0 bytes .../e5/e5598049826c40a5570434e577010234 | Bin 0 -> 7484 bytes .../e6/e65b63bd859feb972865e312d6dd0ed2 | Bin 70888 -> 0 bytes .../e6/e6a257a74390414a129a1c26b1135693 | Bin 13660 -> 0 bytes .../e8/e83dd598546df7ce239803e536f5c76d | Bin 0 -> 5820 bytes .../ea/ea3ed601f91b78eb316591eace1e6aae | Bin 81928 -> 0 bytes .../ea/eadf674d8304672684a075b7abe0f02e | Bin 0 -> 7744 bytes .../eb/eb18b08141a3fb172e51b1e9591f4807 | Bin 9768 -> 0 bytes .../ebc9ab77e62825d36455ae8ec36ca946} | Bin 9620 -> 9596 bytes .../ec/ec50bcc35a91fc9a31bec0def28920c7 | Bin 0 -> 10644 bytes .../ec/ec6220116f9b8f31c62665a26ec7a87d | Bin 70888 -> 0 bytes .../ed/edb5a8e9a94473944ab29c1dc9384f43 | Bin 0 -> 8936 bytes .../ed/edd2a71b758d6a6babeab68f11fa61f1 | Bin 0 -> 11044 bytes .../ef/ef38c0bea9b14c430f958a9dc162721d | Bin 0 -> 5580 bytes .../ef628c714be4e202be07b343637c67e8} | Bin 37744 -> 26220 bytes .../f0/f0228e3dc6ba4e90f31cf18624d23e16 | Bin 0 -> 5572 bytes .../f0/f0688377ae7e4ae7483f99781f77ff33 | Bin 0 -> 9780 bytes .../f1/f1be858a040a150b2a49c0097d05b18d | Bin 0 -> 9768 bytes .../f4/f4268701f066ae522b1b055141da92bf | Bin 11796 -> 0 bytes .../f4/f475ac3f65ce6bfe8584f1e4c43530f2 | Bin 0 -> 9552 bytes .../f4/f491cad27321440202cd41037cb2f353 | Bin 0 -> 6336 bytes .../f5/f5c59ece433609069faf73449b02a39f | Bin 13668 -> 0 bytes .../f8/f82f4ddcd6ef4d5f8298aab5a44f1c58 | Bin 24449 -> 0 bytes .../f8/f8987e98573bc217ff561f38186b9748 | Bin 70896 -> 0 bytes .../f8/f8e16b27805937ed9fe182c934fb79b6 | Bin 81928 -> 0 bytes .../f8ec7967dabceb5e92e02ebcf379b495} | Bin 7964 -> 7952 bytes .../fa/fa9ec1807e6926658b6507e482fa5140 | Bin 0 -> 10672 bytes .../fb/fb31d73d3016c043452d2a96521c725f | Bin 0 -> 5776 bytes .../fb7c13e3d4fe5d05e98cd62bf05187fe} | Bin 11836 -> 11856 bytes .../fc/fc86869fc8a871f9c7be3e054cba0a2b | Bin 0 -> 10508 bytes .../fd3c4a5b6e99ea6bab5819a2747dd654} | Bin 6428 -> 6428 bytes .../fe/fe4090e70de39710a39ce06d180fed44 | Bin 37124 -> 0 bytes .../ff/ffda3c1f6abf175c7c73dfe7ec7cde25 | Bin 0 -> 9620 bytes Library/CurrentLayout-default.dwlt | 56 +- Library/CurrentMaximizeLayout.dwlt | 52 +- Library/InspectorExpandedItems.asset | Bin 6744 -> 6744 bytes .../Assembly-CSharp-Editor.dll | Bin 6144 -> 6144 bytes Library/ScriptAssemblies/Assembly-CSharp.dll | Bin 162816 -> 171008 bytes Library/ScriptAssemblies/Assembly-CSharp.pdb | Bin 78904 -> 83204 bytes Library/SourceAssetDB | Bin 4194304 -> 4194304 bytes .../Hierarchy/8cbfdc-378b361fe27c31b458.json | 2 +- .../SceneView/352ee9-mainStage.json | 2 +- ...embly-CSharp.csprojAssemblyReference.cache | Bin 17953 -> 17953 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 31881 -> 31880 bytes 517 files changed, 2534 insertions(+), 2221 deletions(-) create mode 100644 Assembly-CSharp.csproj.user rename Assets/Scripts/{AnimationComponents/AnimationClips.meta => 1_To_update.meta} (77%) create mode 100644 Assets/Scripts/AnimationComponents/AddonKeyFrame.cs rename Assets/Scripts/AnimationComponents/{KeyFrames => }/AddonKeyFrame.cs.meta (83%) delete mode 100644 Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs delete mode 100644 Assets/Scripts/AnimationComponents/AnimationClips/PawnAnimationClip.cs delete mode 100644 Assets/Scripts/AnimationComponents/AnimationClips/ThingAnimationClip.cs delete mode 100644 Assets/Scripts/AnimationComponents/Defs.cs.meta delete mode 100644 Assets/Scripts/AnimationComponents/KeyFrames/AddonKeyFrame.cs delete mode 100644 Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs delete mode 100644 Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs.meta delete mode 100644 Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs delete mode 100644 Assets/Scripts/AnimationComponents/KeyFrames/ThingKeyFrame.cs delete mode 100644 Assets/Scripts/AnimationComponents/KeyFrames/ThingKeyFrame.cs.meta create mode 100644 Assets/Scripts/AnimationComponents/PawnAnimationClip.cs rename Assets/Scripts/AnimationComponents/{AnimationClips => }/PawnAnimationClip.cs.meta (83%) create mode 100644 Assets/Scripts/AnimationComponents/PawnKeyframe.cs rename Assets/Scripts/AnimationComponents/{KeyFrames => }/PawnKeyframe.cs.meta (83%) rename Assets/Scripts/AnimationComponents/{AlienRaceDef.cs => PawnRaceDef.cs} (97%) rename Assets/Scripts/AnimationComponents/{AnimationClips/ThingAnimationClip.cs.meta => PawnRaceDef.cs.meta} (83%) rename Assets/Scripts/AnimationComponents/{AlienRaceOffset.cs => PawnRaceOffset.cs} (85%) rename Assets/Scripts/AnimationComponents/{AlienRaceDef.cs.meta => PawnRaceOffset.cs.meta} (83%) rename Assets/Scripts/{Math/Constants.meta => Data.meta} (100%) create mode 100644 Assets/Scripts/Data/Constants.cs rename Assets/Scripts/{Math/Constants => Data}/Constants.cs.meta (100%) rename Assets/Scripts/{Math/Constants/Constants.cs => Data/DefaultTags.cs} (58%) rename Assets/Scripts/{AnimationComponents/AnimationClips/AnimationClip.cs.meta => Data/DefaultTags.cs.meta} (83%) rename Assets/Scripts/{Math/Constants => Data}/Enums.cs (100%) rename Assets/Scripts/{Math/Constants => Data}/Enums.cs.meta (100%) rename Assets/Scripts/{AnimationComponents/KeyFrames.meta => DefParents.meta} (77%) rename Assets/Scripts/{AnimationComponents/Defs.cs => DefParents/AnimationDefs.cs} (63%) rename Assets/Scripts/{AnimationComponents/AlienRaceOffset.cs.meta => DefParents/AnimationDefs.cs.meta} (83%) create mode 100644 Assets/Scripts/DefParents/PawnRaceDefs.cs create mode 100644 Assets/Scripts/DefParents/PawnRaceDefs.cs.meta delete mode 100644 Assets/Scripts/GUI/ActorCard.cs create mode 100644 Assets/Scripts/GUI/Actors.meta rename Assets/Scripts/GUI/{ => Actors}/ActorBody.cs (67%) rename Assets/Scripts/GUI/{ => Actors}/ActorBody.cs.meta (100%) rename Assets/Scripts/GUI/{ => Actors}/ActorBodyPart.cs (78%) rename Assets/Scripts/GUI/{ => Actors}/ActorBodyPart.cs.meta (100%) delete mode 100644 Assets/Scripts/GUI/AnimationDefCard.cs create mode 100644 Assets/Scripts/GUI/Cards.meta rename Assets/Scripts/GUI/{ => Cards}/ActorAddonCard.cs (61%) rename Assets/Scripts/GUI/{ => Cards}/ActorAddonCard.cs.meta (100%) create mode 100644 Assets/Scripts/GUI/Cards/ActorCard.cs rename Assets/Scripts/GUI/{ => Cards}/ActorCard.cs.meta (100%) rename Assets/Scripts/GUI/{ => Cards}/ActorKeyframeCard.cs (56%) rename Assets/Scripts/GUI/{ => Cards}/ActorKeyframeCard.cs.meta (100%) create mode 100644 Assets/Scripts/GUI/Cards/AnimationDefCard.cs rename Assets/Scripts/GUI/{ => Cards}/AnimationDefCard.cs.meta (100%) create mode 100644 Assets/Scripts/GUI/Cards/StageCard.cs rename Assets/Scripts/GUI/{ => Cards}/StageCard.cs.meta (100%) delete mode 100644 Assets/Scripts/GUI/SelectRaceDropdown.cs delete mode 100644 Assets/Scripts/GUI/SelectRaceDropdown.cs.meta create mode 100644 Assets/Scripts/GUI/SelfContained.meta rename Assets/Scripts/GUI/{ => SelfContained}/ActorManipulator.cs (100%) rename Assets/Scripts/GUI/{ => SelfContained}/ActorManipulator.cs.meta (100%) rename Assets/Scripts/{AnimationComponents => GUI/SelfContained}/ButtonWithKeyCode.cs (100%) rename Assets/Scripts/{AnimationComponents => GUI/SelfContained}/ButtonWithKeyCode.cs.meta (100%) rename Assets/Scripts/{AnimationComponents => GUI/SelfContained}/Chaser.cs (100%) rename Assets/Scripts/{AnimationComponents => GUI/SelfContained}/Chaser.cs.meta (100%) rename Assets/Scripts/GUI/{ => SelfContained}/RequiresAnimationDef.cs (100%) rename Assets/Scripts/GUI/{ => SelfContained}/RequiresAnimationDef.cs.meta (100%) rename Assets/Scripts/GUI/{ => SelfContained}/SnapToKeyframe.cs (100%) rename Assets/Scripts/GUI/{ => SelfContained}/SnapToKeyframe.cs.meta (100%) create mode 100644 Assets/Scripts/GUI/SexProps.meta rename Assets/Scripts/{ => GUI/SexProps}/SexProp.cs (100%) rename Assets/Scripts/{ => GUI/SexProps}/SexProp.cs.meta (100%) rename Assets/Scripts/{ => GUI/SexProps}/SexPropManager.cs (100%) rename Assets/Scripts/{ => GUI/SexProps}/SexPropManager.cs.meta (100%) delete mode 100644 Assets/Scripts/GUI/StageCard.cs create mode 100644 Assets/Scripts/GUI/Tooltips.meta rename Assets/Scripts/GUI/{ => Tooltips}/Tooltip.cs (83%) rename Assets/Scripts/GUI/{ => Tooltips}/Tooltip.cs.meta (100%) create mode 100644 Assets/Scripts/GUI/Tooltips/TooltipMessage.cs create mode 100644 Assets/Scripts/GUI/Tooltips/TooltipMessage.cs.meta rename Assets/Scripts/Graphics/{DirectionalGraphic.cs => SingleGraphic.cs} (97%) rename Assets/Scripts/Graphics/{DirectionalGraphic.cs.meta => SingleGraphic.cs.meta} (100%) create mode 100644 Assets/Scripts/Workspace/EventsManager.cs create mode 100644 Assets/Scripts/Workspace/EventsManager.cs.meta rename Assets/StreamingAssets/{alienRaceDefs.xml => pawnRaceDefs.xml} (97%) rename Assets/StreamingAssets/{alienRaceDefs.xml.meta => pawnRaceDefs.xml.meta} (100%) create mode 100644 Library/Artifacts/00/0027cb53ba0c6636a5ec422fbac2ed82 delete mode 100644 Library/Artifacts/00/007439c1bc1172189b36c574649143f6 rename Library/Artifacts/{61/61249c654bddfecef29bb076f88401d8 => 02/02929ea28525337dbd3bdb47f5b6e2f6} (87%) create mode 100644 Library/Artifacts/03/03cd127bb37f089a0d02d1dbb56f8835 create mode 100644 Library/Artifacts/05/0563423c0f13a59f61e8d2e2a6f9b726 delete mode 100644 Library/Artifacts/07/0748742ea3e7399c39e7c04a449cc9ea delete mode 100644 Library/Artifacts/07/07759b5885c7ba2965b1c78855c39a6d create mode 100644 Library/Artifacts/07/07fde1c2452eb27afe21fbcd8504fc91 create mode 100644 Library/Artifacts/08/085178422e4479afa28168cfe7de0e16 delete mode 100644 Library/Artifacts/09/09163e07c804eb423732510b9c4625d0 create mode 100644 Library/Artifacts/09/0945095b3383d66693e03c05dc4f9b38 create mode 100644 Library/Artifacts/0a/0a7a267cc2187e45cfe384a5ff637220 create mode 100644 Library/Artifacts/0a/0aa61e84826458ecf6c215c142206b81 create mode 100644 Library/Artifacts/0b/0b79a9e031cf5bc692f8a990331ff48e create mode 100644 Library/Artifacts/0c/0c7accbfac2bf14bb7674f01e728f3a7 create mode 100644 Library/Artifacts/0c/0c8739cd590d104e54c127427a4b6a27 rename Library/Artifacts/{ad/ad4dec64255e3e80220b8f480a5724a2 => 0c/0caea0aa396b9c2fb62d0b9bb3b9746f} (77%) create mode 100644 Library/Artifacts/0d/0d9dfff24b95e15d868f3a0ef90ef73a create mode 100644 Library/Artifacts/0d/0df543ee31ea4d33fc0c82c39a05f492 create mode 100644 Library/Artifacts/0e/0eb0d27abb139b6df3003cb5722cbddd rename Library/Artifacts/{54/5417f9737b1e7bac137cde2b2ddaa758 => 0f/0fbe343ca3f63321bf4deed28ff2a4cf} (59%) create mode 100644 Library/Artifacts/10/1006dedec0dabeb067eb21dbeae5733a create mode 100644 Library/Artifacts/10/103a0f67c6be2793e121afdca2b2da6d create mode 100644 Library/Artifacts/11/11095d5db6184bfa9d4cf6c0a29f157a rename Library/Artifacts/{25/251f363b1a65dec7213bb85595fdf57b => 11/11f1012eebfd255d2639036a14e6d3d5} (88%) delete mode 100644 Library/Artifacts/12/12f6e021441992b46119b4a6878c30fc create mode 100644 Library/Artifacts/14/145724648a9cb7efbde664b50eba358d create mode 100644 Library/Artifacts/14/145ce871ab454abf5837e901ebbf3020 rename Library/Artifacts/{34/34cabd8ce1e13c76c7db940cdd0d801d => 14/14c27a6d7c174792cec69fa566d6bc12} (95%) delete mode 100644 Library/Artifacts/15/1517227d00eadaa5756415410c751df2 create mode 100644 Library/Artifacts/16/1610538f1ce9097e63824d7c77e72906 delete mode 100644 Library/Artifacts/16/165252f1e3bbe8c80b2a34eb9a7787f1 rename Library/Artifacts/{6d/6d4e47194abdc9061236c0cb1582644d => 16/1665c7a61d34721be3cf93e4bc0615e4} (83%) create mode 100644 Library/Artifacts/17/172bd09cb4eb14a72a4e04018a1a1350 delete mode 100644 Library/Artifacts/18/18186149759d96c1dd0f5a47b5b4e27f rename Library/Artifacts/{04/0480c11b9f8e6ddf4bb2d9fd119d31e6 => 19/1942f54c56360f47634f12a235c14465} (84%) create mode 100644 Library/Artifacts/1a/1ac20c411cb110ba8fb14ffc1058b038 rename Library/Artifacts/{91/91b12928d24c668757442087f03e7a95 => 1b/1b4f294883743cbe7f5b02f55c12f96d} (88%) rename Library/Artifacts/{3e/3ed300da66827ee897ac193688262620 => 1b/1b652115067e855db7af3c3d82fd9607} (88%) create mode 100644 Library/Artifacts/1b/1b729f6b5e33991c6dc5ca5dfa27b7b3 create mode 100644 Library/Artifacts/1c/1c099f8e1f15bc25e91e26115c414c42 rename Library/Artifacts/{b1/b19437f454d81ec6855f69e6d5727687 => 1e/1ec68812be6e36775194872be25b7b5a} (90%) delete mode 100644 Library/Artifacts/1e/1ef2e193f4edb2e4212736bdb6804bda delete mode 100644 Library/Artifacts/1f/1fa6ae3a08e5107e3a2865472b3fab7a delete mode 100644 Library/Artifacts/20/201678d8d4f1b000710ff9f8a30f02e1 create mode 100644 Library/Artifacts/20/20946a2fa7004b2e5216c07df5199e71 delete mode 100644 Library/Artifacts/21/2140bb0c0348df9a1c1d45da87e0305c create mode 100644 Library/Artifacts/21/21cb9b5eaa671c7edc94a0f606f91209 create mode 100644 Library/Artifacts/21/21fdfc14e5c3de632c9982c847b72c32 delete mode 100644 Library/Artifacts/22/22d5dbe2db56cd404c1fd147e4ba3f12 delete mode 100644 Library/Artifacts/23/23294a863aab6747c6fad3eefb7f000b delete mode 100644 Library/Artifacts/23/238ef6b5a1f482350c0a355d26d34084 create mode 100644 Library/Artifacts/23/23b27c713996371464db6cd3cc02ff1a create mode 100644 Library/Artifacts/25/256c52d749dadf8352e2e09b785e1f12 rename Library/Artifacts/{fd/fd15a736aa0ed83f0d6d2fea375d7eb7 => 26/26f9770f9fa7b627b27327aa12e44985} (75%) create mode 100644 Library/Artifacts/27/27fd1308f5bcdcb4454e4de5ca9aab5e delete mode 100644 Library/Artifacts/2a/2a0e5f19864095808f285a37bc4e42f4 delete mode 100644 Library/Artifacts/2a/2adc991e49d9653e44066261c307c512 create mode 100644 Library/Artifacts/2b/2b1c6b262342113f86ff91b2b5650578 rename Library/Artifacts/{86/866ab7a975982bb806d0a65261b26df6 => 2b/2b29fd2b532cd9602f059a742337098f} (94%) create mode 100644 Library/Artifacts/2b/2b4995803d77205ea0104d4a22d185b4 create mode 100644 Library/Artifacts/2b/2b829e6616aa147a90ccc045d05abe80 rename Library/Artifacts/{ba/bae51267a73b5594008330a4623fa461 => 2b/2ba69c8d389ccc4ef81f8fa31f491673} (81%) create mode 100644 Library/Artifacts/2b/2bc4d31367cf8a031fd2483c6e8f6a09 delete mode 100644 Library/Artifacts/2b/2bd230c30861d7479bd96f53d619b87a rename Library/Artifacts/{2d/2dc75fcf2d6f70f584b02a052aa27239 => 2b/2bf4b9f935244d32b758a6f8b9f6ce51} (95%) delete mode 100644 Library/Artifacts/2c/2c507939b34445a07ed25c677279da80 delete mode 100644 Library/Artifacts/2c/2cb25682b62b7bce5eac10d3a59d341f create mode 100644 Library/Artifacts/2d/2d7353852b5a979624feea6c4d57eee9 delete mode 100644 Library/Artifacts/2e/2e33b4cace114a8c0b5f8e42a74f4fb5 delete mode 100644 Library/Artifacts/2f/2f246422b49daadd3c439e1619a16a07 create mode 100644 Library/Artifacts/2f/2fbe9afd0d54861bffa94927205bb7be delete mode 100644 Library/Artifacts/30/306227541e60b541fe2af74062e6bfba delete mode 100644 Library/Artifacts/30/3089c93cb4438df0f6a125d0ec8c3930 delete mode 100644 Library/Artifacts/31/317bb1f7e53dfbeb4edfba8e386d4a28 rename Library/Artifacts/{64/648eeba691966e8f8cc12d7f9aa17637 => 31/31d2f0b77d3a470410e1cf13e5a42652} (52%) create mode 100644 Library/Artifacts/32/3202a47d4c727056e86c64c1af38f676 create mode 100644 Library/Artifacts/32/3220dc4e27f98703355baf9dd3a1d948 create mode 100644 Library/Artifacts/32/32b4e1bff2d46b48dea189f66d9bcc8d delete mode 100644 Library/Artifacts/33/3333ffdbf1a9cf3e6a30728b2f9a7b93 rename Library/Artifacts/{03/0383ef74c4ecb1cf2d336342ef7a28c1 => 33/3354b778f99cc1e753c7117fe7244bb1} (55%) delete mode 100644 Library/Artifacts/34/3464a108a1d4a27702c302ebd3ce13f0 delete mode 100644 Library/Artifacts/34/34d0473e47a4313b79cd131ada10e103 delete mode 100644 Library/Artifacts/34/34e3ca2ed7327dfa2daf4570a8e8d7cd create mode 100644 Library/Artifacts/35/354cd528d320379d400740db4994e7c0 create mode 100644 Library/Artifacts/35/35f8dfa65dcdd8b4f8b0b1cc8a8b317d create mode 100644 Library/Artifacts/37/3701c210834b6971a7087f91aa61fc74 create mode 100644 Library/Artifacts/37/37cc0af7c17ac95fb1a082a991c75dba create mode 100644 Library/Artifacts/38/38f747d653db8eef1519541af3cd2306 delete mode 100644 Library/Artifacts/39/3945df6553d325c4244495284a037cff delete mode 100644 Library/Artifacts/3c/3c2185cda4bc8e34513a79c7239da708 create mode 100644 Library/Artifacts/3c/3cb350167bc6778641447bfecf056fe5 delete mode 100644 Library/Artifacts/3d/3dfa0447a511bb78b21c897223b3574c delete mode 100644 Library/Artifacts/3e/3e715903507779c4c9b362a13b271b75 create mode 100644 Library/Artifacts/3e/3ee67d544fcb265af9b8322b49eee6f5 create mode 100644 Library/Artifacts/3f/3fb374e907869433bb625132faa3125d delete mode 100644 Library/Artifacts/42/428665fab54b4a4aeae9ce8136c82721 create mode 100644 Library/Artifacts/43/4381b540e305370cf65cb993e88f1fbe rename Library/Artifacts/{a1/a1fdea590daf5768e389f0bfffb75b73 => 43/4389224c9121275fe5f6c6295f218d50} (94%) delete mode 100644 Library/Artifacts/43/43f4e73939807de737856af3208400d6 rename Library/Artifacts/{fb/fbf021b55b47bf5d02fa143a5c49558f => 43/43fa1e043613b79f6d57b6fb49703d02} (83%) create mode 100644 Library/Artifacts/44/441d9e5b832c96d7db244e17903b328a delete mode 100644 Library/Artifacts/46/46282d47b52cf52fe3ca58568191742e delete mode 100644 Library/Artifacts/46/46c5f8e4ab224251bc91ffa54e4456ae delete mode 100644 Library/Artifacts/47/47ba53d3383497a390865af0eb1af9bd create mode 100644 Library/Artifacts/47/47c235df45a8bd2628593334c5b6c764 rename Library/Artifacts/{c3/c3d679444b027880cfbc4d70f57e0c39 => 48/4834450e10905ffcc5d9dff278327a77} (87%) create mode 100644 Library/Artifacts/48/489a9a7c06f87b88abb6a024635b717b create mode 100644 Library/Artifacts/48/48c7b7aa24c56aac448a9bdff51f5dbe create mode 100644 Library/Artifacts/48/48cfc50748451f913b40d23e2a5b2c03 create mode 100644 Library/Artifacts/49/49752198e6b7a90a062b94c1e0addc50 create mode 100644 Library/Artifacts/49/49a1ba3c7fd0f533689b16db5e74d505 delete mode 100644 Library/Artifacts/49/49dab48fc87b6dae0b9d6bc96623bd16 create mode 100644 Library/Artifacts/4a/4a14f9a83fadbe66de22e4715dbc3e93 create mode 100644 Library/Artifacts/4a/4a4db4458aaec17587d66bb6f8dfe432 create mode 100644 Library/Artifacts/4b/4bb105f27ea150c1fbac8418cd1666bd create mode 100644 Library/Artifacts/4c/4c42494b1073f162e3a83012875f5380 create mode 100644 Library/Artifacts/4d/4d3cf0869edfd372a316aa0c8af4644f delete mode 100644 Library/Artifacts/4d/4d3eab6d7f33ffe3f27de7fc51d314b0 create mode 100644 Library/Artifacts/4d/4d9568a8f737105ddf2957da48f52918 create mode 100644 Library/Artifacts/4d/4def6f7d7280b762a99ef74cbeb19480 create mode 100644 Library/Artifacts/4e/4e037fe46697280cde9c905749385e72 create mode 100644 Library/Artifacts/4e/4e7094c7475d0794da16d0b520d10d69 rename Library/Artifacts/{3b/3bc4fdd5437deb6f1cb7351e9d64237d => 4f/4f8625ec9d380264fdf0da332a89861f} (89%) create mode 100644 Library/Artifacts/4f/4fb8b2ce902dac82421731ab17fa9b69 delete mode 100644 Library/Artifacts/50/509c74cc852f1622c1af6d5502a1a7d6 create mode 100644 Library/Artifacts/50/50a64145390f825ee8b2b9fbc3c69335 create mode 100644 Library/Artifacts/50/50bdb3ba0f2272b9330bad100d377959 create mode 100644 Library/Artifacts/50/50fbb6c84abebeeb3486f64c70150ba1 create mode 100644 Library/Artifacts/52/527a1a2cf424b9436e0e5d607073bf00 create mode 100644 Library/Artifacts/52/52bee7fb99a02ae816d7871db07aee7f create mode 100644 Library/Artifacts/53/53453697071c831c8feb7d4ec4cf7506 rename Library/Artifacts/{4f/4f8cdb5f1d2733965235f97a7c12ecc4 => 54/544d473366fd868a4f2303f95c7f014b} (64%) delete mode 100644 Library/Artifacts/54/54fb9c154b14bb6ab8160daf9798e5a5 rename Library/Artifacts/{c3/c33d92794f3e66a2d81be0783286f4bf => 55/556a916afd2dc8c1887cad4556bc08c9} (64%) create mode 100644 Library/Artifacts/55/55ea23367855499bc59f3527e033f960 create mode 100644 Library/Artifacts/57/572b149842bb1e9d787fba352b25debb create mode 100644 Library/Artifacts/57/572f1d3af72ed4fdbc7d59eeed86fa28 delete mode 100644 Library/Artifacts/57/57ce40e10426474a4001db3a5353430f rename Library/Artifacts/{64/649a1d50b0a779ef57dbfeab640077f2 => 5a/5a170bf5b5437b30ee8864b786ae1b9e} (94%) rename Library/Artifacts/{8f/8fe06ed9336218857b3ef1cb0712a55e => 5a/5a73eba595fc7798a349f35671da608b} (84%) create mode 100644 Library/Artifacts/5a/5aa32d398b3136c869645d63e6243d3d create mode 100644 Library/Artifacts/5a/5aef00813218e09d1273dfa569de6c10 create mode 100644 Library/Artifacts/5b/5b11106f5eb5e6bdd289d637c6a5bcbf create mode 100644 Library/Artifacts/5b/5b68c6c0aad55e9ebe9c091bfa4539ba create mode 100644 Library/Artifacts/5b/5bac16382394256d60f8402e2b02535a create mode 100644 Library/Artifacts/5d/5d033e5afe52a48677ec266ca5d73030 delete mode 100644 Library/Artifacts/5d/5d0e5d403c2e67015b420909e7188e98 rename Library/Artifacts/{a3/a3d1ebcc0e9b17f72f21297a7f098f88 => 5d/5d1489e74deecc1b0b55462cf2d44def} (58%) create mode 100644 Library/Artifacts/5d/5dc5f455cd7ee55ecde39001b15730fa delete mode 100644 Library/Artifacts/5e/5e49d71c63825f88570f64f44591d643 create mode 100644 Library/Artifacts/5e/5ea692c7ad5a0c7771e31bd8cebfc8a6 delete mode 100644 Library/Artifacts/5f/5fc9a8f198e4b38855a11acea7fec3fd delete mode 100644 Library/Artifacts/5f/5ffd31c0154a7b62e637379c7a71c731 rename Library/Artifacts/{7a/7aac19e441b97b4fa240297074764ae2 => 61/61ad12422139404ecdfac6c418dd83ea} (89%) delete mode 100644 Library/Artifacts/62/62670d16584eaf8da416a67f89d588fd create mode 100644 Library/Artifacts/62/62dd0f7b6ddaa9efd4249151ec13e012 delete mode 100644 Library/Artifacts/62/62e9829ac854568ac023ca65235dbea2 delete mode 100644 Library/Artifacts/64/645ec641eb63366e71f719d7bff48f61 create mode 100644 Library/Artifacts/64/64697b496786afe0059007cb4898a9bd create mode 100644 Library/Artifacts/64/64ecb5ea5c65bdca7f3477d50981ab92 create mode 100644 Library/Artifacts/65/65a888c7eb1c5687f8a6a94939e2b74e delete mode 100644 Library/Artifacts/66/66792f144378fe08b0eb094904042a24 rename Library/Artifacts/{91/911c8b98310a20efe3c833014e9ac0dd => 66/66b122f5842cca4183f0d5009caa1327} (84%) delete mode 100644 Library/Artifacts/67/67a0c5c6d31f9e4a28206e8d2ffbf789 create mode 100644 Library/Artifacts/68/6879708621a481f1efd32b3e7b61bf68 delete mode 100644 Library/Artifacts/68/689f0ba0da7411eb10df0621b3977044 create mode 100644 Library/Artifacts/68/68c813c178d2ddc76a01ce507dcd02ae delete mode 100644 Library/Artifacts/69/6935658458265a5596fa72c8da2cd200 create mode 100644 Library/Artifacts/6a/6a26c28d5b35d17373c08b6e6bc7b84d delete mode 100644 Library/Artifacts/6b/6ba4a0123019ea78b4955d23470fa45c delete mode 100644 Library/Artifacts/6c/6c20487eecd860f1cd129ee25839ce9f delete mode 100644 Library/Artifacts/6c/6c2eb9e49a060cf65016e177b8dfae5e rename Library/Artifacts/{19/19783616a7e6d343e4170ecc33ac3dd3 => 6c/6c8ab9f9385afa6596271629ee64135b} (94%) create mode 100644 Library/Artifacts/6d/6d8e7e960088816160bfd15026b0bdf6 create mode 100644 Library/Artifacts/6d/6de038949875bdeaa0d03f1019727ce3 rename Library/Artifacts/{99/9987e1bd39f992a460d09f2a4ee0d000 => 70/70089d61d61b845ca72a0bed296381d8} (58%) create mode 100644 Library/Artifacts/71/711797a9958a7aa2867d2253558753c0 create mode 100644 Library/Artifacts/71/713958508c0bd9ae305238513e8d9452 create mode 100644 Library/Artifacts/71/71ce12d3d04605d3e8856e64e6799f74 delete mode 100644 Library/Artifacts/72/728c3f2716acc6ffdfb2966f837f63e3 delete mode 100644 Library/Artifacts/72/72e623ddfb6b80840fc3b958bfd2d3c4 rename Library/Artifacts/{da/daa912491dcca9f79662da90a3fa009f => 73/7328e5296da8dde51da9225fe5b732e7} (85%) delete mode 100644 Library/Artifacts/73/73d31515f573ad9a53fcdf67b533dd9e create mode 100644 Library/Artifacts/73/73e6ecb7f857bb651aa94d50872a57a4 rename Library/Artifacts/{05/056f846ef06f910df64f569d61df78fc => 76/7667c29695279c6429a107ff74deb70f} (96%) rename Library/Artifacts/{d1/d1282be4075b6021dabc7fcde4cfb0cf => 76/76ec0bdfbb9fc484d5b7a73bdf3d6f32} (70%) create mode 100644 Library/Artifacts/78/78b386bb929d104bbad91e0a70e31056 create mode 100644 Library/Artifacts/79/7903532e0815ca4c99f98b372089ab47 create mode 100644 Library/Artifacts/79/796c3bb3a7dae077404194e6a3dcb1e7 delete mode 100644 Library/Artifacts/79/797bbd44a3b54805ecc9c8be27feeb43 delete mode 100644 Library/Artifacts/7a/7a05378324fe17afaebfbeedeee2d718 create mode 100644 Library/Artifacts/7b/7b17e3eef79f654f9765230b0178b57e delete mode 100644 Library/Artifacts/7b/7b56847e86c390aa91020218689cadbb rename Library/Artifacts/{7f/7fe9bb417bad4320311b29a71d467136 => 7d/7d0cbdb2f8380249ed43a777613f0668} (88%) rename Library/Artifacts/{11/11bd44d7fd1713220dd66033b9b93180 => 7d/7d396e589a880d83df9e46d9f1bea41a} (93%) create mode 100644 Library/Artifacts/7d/7dd9c29e2b5696e0667459c5e2ffacf4 delete mode 100644 Library/Artifacts/7d/7de6aa5ee9c46ac5169855002736eda1 delete mode 100644 Library/Artifacts/7e/7e7b7d792bcda7207a4aeffe5cc08acb create mode 100644 Library/Artifacts/7e/7e98bc772facf817f54e614a1877f48d create mode 100644 Library/Artifacts/7f/7f3f40b1bc398f380b75fa03b58537e7 create mode 100644 Library/Artifacts/7f/7f9e219f61afdd285073fda21bbf1ffd rename Library/Artifacts/{05/05307fbc5822acb9b28b69af0acf8076 => 7f/7fb942dc05fd31f8867195f38fed26ed} (97%) create mode 100644 Library/Artifacts/7f/7fd09df623a5b2e26e42b58a896bb5ca rename Library/Artifacts/{37/377b8f16f43e4da065a18baf8e5e11e6 => 80/8077836a8f0f5d082208169cd6d30ea9} (68%) create mode 100644 Library/Artifacts/80/807fdff4b6454b5088ef1e7c1c759e4e create mode 100644 Library/Artifacts/82/8250c0acb1763ce7b46211e9f799fa36 rename Library/Artifacts/{3e/3e7e54c3fa696aa39780ac521aec7e74 => 83/83341329e090768ab0d2cb352e7105d5} (53%) delete mode 100644 Library/Artifacts/83/83682fd8c69ed1ad7dddbd346416fed7 rename Library/Artifacts/{60/60d78794d2a38864094cd52ee3458b43 => 83/8382d1c0a68040e99022bfbabfcc4660} (64%) create mode 100644 Library/Artifacts/84/84d53ed6f63721723ac2dcada6a05241 delete mode 100644 Library/Artifacts/85/85086532bd20bb41d0f7e279c7647de1 rename Library/Artifacts/{1c/1c867c9aed7c70fced14d37518e573e6 => 85/855e940f175eb1bc0847a7b81413604c} (96%) create mode 100644 Library/Artifacts/85/858b519f42847f1f0375aad5c12ff9e5 delete mode 100644 Library/Artifacts/86/866b2b753892fb1c0d62c6a1c320231c delete mode 100644 Library/Artifacts/87/87071a3b2c3bf68967b1cad0a23d477a create mode 100644 Library/Artifacts/87/871f2fdf5df540e08928ce4c41f9ea10 create mode 100644 Library/Artifacts/87/87beec1f712d5a52df2b3921dd2b459f delete mode 100644 Library/Artifacts/89/8952a4c0cdf7d699ed4aaa787aba91aa create mode 100644 Library/Artifacts/8b/8bd38283b5751d17c0e06b6fcec2b5f0 delete mode 100644 Library/Artifacts/8c/8c3a3221cc51c4c7a5557afdbceebe03 delete mode 100644 Library/Artifacts/8d/8d3c9533c34a9c54aed977fa715f0ca1 delete mode 100644 Library/Artifacts/8d/8d5a0cdbf83cb4323fc8e3cb17088229 rename Library/Artifacts/{84/84e75cbc1d1701da9852d8904fc274d6 => 8f/8f2aa58ac657a377390393e03940c13c} (92%) create mode 100644 Library/Artifacts/91/91fd51bd0cbfe6d667bb263879c4dc1b create mode 100644 Library/Artifacts/93/93105f762dbb794bc691ebb09bee2a96 create mode 100644 Library/Artifacts/95/95fe971bcb6a53b48108d1a957ef9ca2 create mode 100644 Library/Artifacts/96/96752b5c656e98662e018f49c18bfde8 create mode 100644 Library/Artifacts/96/96ba97662c71a19f363f2c21e678a9d4 delete mode 100644 Library/Artifacts/98/9852411e3fbb7047ba65594236477c53 delete mode 100644 Library/Artifacts/98/989c4831a028a58c74ec4095ab278a7d create mode 100644 Library/Artifacts/98/98b1a912eb1743299a38ec33315c1efe create mode 100644 Library/Artifacts/99/99002924e8668972c17697fb65a198a8 create mode 100644 Library/Artifacts/99/99232e726b70fac26a01638e3751b75f rename Library/Artifacts/{27/2750b62777cd0fd429efa6c77a07e502 => 99/9991dcdb93b7af9c923288d50af3a59f} (89%) create mode 100644 Library/Artifacts/9a/9a334141cfd60831acefc4fdb4304413 delete mode 100644 Library/Artifacts/9b/9b334a30a0daf9230c22d1d0c9b9fe75 create mode 100644 Library/Artifacts/9c/9cf2c35388c04882f45ccc868efb9cae delete mode 100644 Library/Artifacts/9c/9cfaec6557b346d20760977d79eca6b6 delete mode 100644 Library/Artifacts/9d/9d00d5c6aaff5507bce324a443ddc060 create mode 100644 Library/Artifacts/9d/9d14ccae7be661c8f6bd7724fc9b8e07 delete mode 100644 Library/Artifacts/9f/9f7715740a09ec2ec340f1d13fcb6568 create mode 100644 Library/Artifacts/a0/a0414dd4526497ce4e72ecfb85c3893a create mode 100644 Library/Artifacts/a0/a0c704042d112c29a4680f55638b916c delete mode 100644 Library/Artifacts/a2/a29a1c5ad3a1492db0e92931bc473be0 delete mode 100644 Library/Artifacts/a3/a364fe207323ad7a9d181d54d0a2f7b4 delete mode 100644 Library/Artifacts/a3/a390bcc848a6ef4084f4e142ea250729 delete mode 100644 Library/Artifacts/a3/a3cc52ebd56775c3b917f11c126a43f0 create mode 100644 Library/Artifacts/a3/a3d2263fdc6bd818d706afebc9d5a460 create mode 100644 Library/Artifacts/a4/a43260d53832b94e5f9411615f6366d6 delete mode 100644 Library/Artifacts/a4/a4d4b8d00b0663192741f2506e22dab8 delete mode 100644 Library/Artifacts/a5/a55878bb270f9e97eb2c34845e75bacb delete mode 100644 Library/Artifacts/a6/a64fb49bee27b5bec60eb322d8449e8c create mode 100644 Library/Artifacts/a9/a929d521d0780880c964fd0d3de905f2 delete mode 100644 Library/Artifacts/aa/aa623a236ab5fb59a1e22cd594dd1909 rename Library/Artifacts/{5c/5c016124793ce6128eacf0517d5b6513 => aa/aa8f8df0cfe247e9a168c4fa63b7f919} (95%) create mode 100644 Library/Artifacts/ab/ab3ed0ac05de3443ab38665f5770609b create mode 100644 Library/Artifacts/ac/ac82a6ba0046506fc9a6c5d9b795ca02 rename Library/Artifacts/{04/041cc9147949fd781fe62f6893854579 => ad/ad0aeb1e6112c7a332316bee4eb09ad7} (66%) create mode 100644 Library/Artifacts/ad/add16aa1419ea8f0d89bf0d4d1e16d09 create mode 100644 Library/Artifacts/ae/ae5ce04d6c18d23f396e95d1592db174 create mode 100644 Library/Artifacts/ae/ae5d2dd88fbb253b7b893d9c0b714f31 create mode 100644 Library/Artifacts/af/af1ba00bcd3b54e607fb4fd6ba862fce create mode 100644 Library/Artifacts/af/afcff917c72f5e956a6893f48ed45c70 rename Library/Artifacts/{39/39ddf99a80c84b6cbfaf328ae54826e6 => af/afe2d43cc0ee4f9ecb47fbcad4723941} (78%) delete mode 100644 Library/Artifacts/af/affd87ee43153b480adbd51224c99b9e create mode 100644 Library/Artifacts/b0/b017c56197d00a8f72cd19af788b3c40 create mode 100644 Library/Artifacts/b1/b1308fa5c3c5d3266db3e4cf0ffba231 create mode 100644 Library/Artifacts/b1/b1432999163c7d84aeec0b39136f85bf rename Library/Artifacts/{14/142e9577f9166a331e47f6b76c592ad6 => b1/b146b1cbdb4c0a1f9fff54cdbc612210} (78%) create mode 100644 Library/Artifacts/b1/b1e2361ab9906f719638ba0256aa0c99 create mode 100644 Library/Artifacts/b2/b28b812b1c4b059bdbe08ec197b67b1b create mode 100644 Library/Artifacts/b2/b2c496b15b6ffe3a2c5448ceb13aed65 delete mode 100644 Library/Artifacts/b2/b2fcf8ea80aaa62e61ed8b36aeb85abf create mode 100644 Library/Artifacts/b3/b394e9767a670cf98ba09779162b6238 delete mode 100644 Library/Artifacts/b5/b5e0653e9ea362ba6dc081175324623e create mode 100644 Library/Artifacts/b7/b77440d8fcf94ceb192fcffdc4102f8b create mode 100644 Library/Artifacts/b8/b820743a82a8c4432c923cca1aafb015 delete mode 100644 Library/Artifacts/b8/b8b2e544b66f1f34620683c9611395d1 create mode 100644 Library/Artifacts/b9/b94a3704d3024491e7d98315f8f18cd9 create mode 100644 Library/Artifacts/bb/bb030bdaa908d1b7bfb7d49e63a3831a rename Library/Artifacts/{0f/0f3f52c20b6979795855440501048706 => bb/bb489ecbb333b263ea941f2011fcadbe} (51%) delete mode 100644 Library/Artifacts/bc/bc0a65a48825f10ab3c8eab043fa806f create mode 100644 Library/Artifacts/bd/bdbb2c03378096c53dec52a21a548fbe create mode 100644 Library/Artifacts/be/be57eb14e880d756f0c0d011aecbe977 create mode 100644 Library/Artifacts/bf/bf7c4c76693fb5bdfd8bef94ac466d07 create mode 100644 Library/Artifacts/bf/bff4416a5a09215658f09b6edcd5720e delete mode 100644 Library/Artifacts/c0/c03f3fae2a47035edcee9042b5203b1e rename Library/Artifacts/{0c/0c11e5b34166c7fd2d087e6c9d25c239 => c1/c110dc4be031b32f3037d3a7c41cc7dc} (96%) create mode 100644 Library/Artifacts/c1/c1a3da2aa8fc2e084110a6af34d2645a create mode 100644 Library/Artifacts/c4/c40f5793a552d8a65b8833ba597338a1 delete mode 100644 Library/Artifacts/c4/c4c1b87a3fbe1e2a441b5ba5807ee9b8 create mode 100644 Library/Artifacts/c5/c57e535a33c36c46bf019fcdfd9e30a5 create mode 100644 Library/Artifacts/c5/c5b28b430030d0671caabe4e9db1fbf3 rename Library/Artifacts/{28/28b729754523f05c1d8a0989d427ef43 => c5/c5f59f1f46b9a2c562523ca6d29b2eb9} (51%) rename Library/Artifacts/{49/49adc52b68ea9f166696c2da8f1dce71 => c6/c687b46beb1a509c370d11b06ce592ea} (84%) delete mode 100644 Library/Artifacts/c6/c69596567f57175612e6d7f76f1d45af create mode 100644 Library/Artifacts/c8/c8336f7c53b079e8615c9516fc033793 create mode 100644 Library/Artifacts/c9/c94a32ed64707926fa063e72beece614 create mode 100644 Library/Artifacts/ca/cadc59064821e1592a31ef67cada519b delete mode 100644 Library/Artifacts/cb/cb0649f447b58081e0cd8769ff19af26 create mode 100644 Library/Artifacts/cb/cbd9476f193bf8973465ab57a26ca989 delete mode 100644 Library/Artifacts/cb/cbed062b40950f4709ad52cb87144c19 delete mode 100644 Library/Artifacts/cc/cc854ac7ea2ec46a4122044356da2290 delete mode 100644 Library/Artifacts/cd/cd12484328d9bf16c018135af8dd8ddf delete mode 100644 Library/Artifacts/cd/cd5958ec4f02ec9f51ecf15b259d2c08 create mode 100644 Library/Artifacts/ce/ce0c654189d3e9fd55210fdc4a28b518 create mode 100644 Library/Artifacts/ce/ce617c072ee2193c4ba761bfdd0fb1f8 delete mode 100644 Library/Artifacts/cf/cfe0a33440d005e85b4e7d998a6658dc delete mode 100644 Library/Artifacts/d0/d01a5e9df6e9045fec6f69d88b353b33 rename Library/Artifacts/{cd/cdf420b73db4d451b2b8c3881e65778c => d1/d1727569dd26ab01e3a8e7a1f9260061} (90%) create mode 100644 Library/Artifacts/d1/d1b02ca39be02c9294339eba51dbe8f4 rename Library/Artifacts/{83/83dcbe0910a0602462d1b7d1e0bf6479 => d1/d1f76d79465c4b5e5d74ec5624a59a43} (92%) create mode 100644 Library/Artifacts/d2/d2baa37ba1ab8c93de7bec2440f80cef create mode 100644 Library/Artifacts/d2/d2c4a5e1ce8fc2e53072a8f0a8019fc8 rename Library/Artifacts/{f0/f00649a60299fe6a7e225755cfbfe4dd => d3/d3623fb86eedfc54a6f1257509fd2896} (94%) create mode 100644 Library/Artifacts/d3/d38a9d39b79496290718dea9a0c1bf15 create mode 100644 Library/Artifacts/d3/d3990cf2587501d58191c61ec24b19b6 create mode 100644 Library/Artifacts/d4/d406396756b3a2932c8dda608f0f6642 create mode 100644 Library/Artifacts/d4/d435474bf7ea3beb0cc797cebe2f50c1 create mode 100644 Library/Artifacts/d4/d46e114a8b9c64c74cd0baf664afdd3e delete mode 100644 Library/Artifacts/d5/d58a07a5ab2dde5d6c6456bad4f43dc7 delete mode 100644 Library/Artifacts/d5/d5906573171e7841d0a1b2509045d613 create mode 100644 Library/Artifacts/d5/d5a0df90f8d286981f73582a11ccb623 delete mode 100644 Library/Artifacts/d5/d5f1190f1cb486c486648a8b7f3b0e2a create mode 100644 Library/Artifacts/d6/d6acb5fcd5c9e550ecde1f5d05f8b0da create mode 100644 Library/Artifacts/d6/d6b71fc5cb90d76975a493a4c9f59faf create mode 100644 Library/Artifacts/d7/d75a6a4488699b3a51d3714df39b89c7 delete mode 100644 Library/Artifacts/d8/d87a56dff6cc27dbd0352e2a8c2b2565 create mode 100644 Library/Artifacts/d9/d93f50d6dde2152fdc829462e3623ba7 create mode 100644 Library/Artifacts/d9/d94daf156578cf0701de33d01ede4b5b delete mode 100644 Library/Artifacts/d9/d9e6fdc7a95155f79e48a01f4fd09537 delete mode 100644 Library/Artifacts/da/da57504f2a65b1f61ff9bca559a74a8a create mode 100644 Library/Artifacts/db/db10582607133da7270333b93de60f18 delete mode 100644 Library/Artifacts/db/db2fce779bd34d4f419fb8644b2b3be1 create mode 100644 Library/Artifacts/db/dbf3ec5c8bf66a6c0438cb5b5d3c85ce create mode 100644 Library/Artifacts/dc/dc506c67ae472164513f5127212f7f7b delete mode 100644 Library/Artifacts/dd/dd2536bd7028e9252b92769a3519fb07 create mode 100644 Library/Artifacts/dd/dd7a0ae85f5306ba339e21264b49b390 create mode 100644 Library/Artifacts/de/dedc0ce59033c1e8670a06ebdcc7f2c9 create mode 100644 Library/Artifacts/de/dee5d8c16ed5173fb1aac990c044d722 delete mode 100644 Library/Artifacts/de/dee7cd0898a0892111d380873ef8d4cf create mode 100644 Library/Artifacts/df/df62c5cafc466e1f5d29d8ba8289ea72 create mode 100644 Library/Artifacts/e0/e0bc66e3ebd27fb97c759869bc6ff734 create mode 100644 Library/Artifacts/e1/e16e1969806c8e9634376ed271357bcc delete mode 100644 Library/Artifacts/e1/e18486a04459b45946c40b16d6cd3d72 delete mode 100644 Library/Artifacts/e1/e198e996a6fa3ef6c5711a5284e52231 create mode 100644 Library/Artifacts/e2/e27b9d57d16e78e0b63768071500ce3f rename Library/Artifacts/{70/704ff1829b76882fa0d6959f0009d870 => e2/e2d26d37cd98b8e9ce6cdb353ce6d890} (87%) delete mode 100644 Library/Artifacts/e3/e3203d097566fea19053f34630072234 create mode 100644 Library/Artifacts/e5/e5598049826c40a5570434e577010234 delete mode 100644 Library/Artifacts/e6/e65b63bd859feb972865e312d6dd0ed2 delete mode 100644 Library/Artifacts/e6/e6a257a74390414a129a1c26b1135693 create mode 100644 Library/Artifacts/e8/e83dd598546df7ce239803e536f5c76d delete mode 100644 Library/Artifacts/ea/ea3ed601f91b78eb316591eace1e6aae create mode 100644 Library/Artifacts/ea/eadf674d8304672684a075b7abe0f02e delete mode 100644 Library/Artifacts/eb/eb18b08141a3fb172e51b1e9591f4807 rename Library/Artifacts/{a7/a721134ca424020693658ac01f9b2e0b => eb/ebc9ab77e62825d36455ae8ec36ca946} (78%) create mode 100644 Library/Artifacts/ec/ec50bcc35a91fc9a31bec0def28920c7 delete mode 100644 Library/Artifacts/ec/ec6220116f9b8f31c62665a26ec7a87d create mode 100644 Library/Artifacts/ed/edb5a8e9a94473944ab29c1dc9384f43 create mode 100644 Library/Artifacts/ed/edd2a71b758d6a6babeab68f11fa61f1 create mode 100644 Library/Artifacts/ef/ef38c0bea9b14c430f958a9dc162721d rename Library/Artifacts/{27/27857a4d882164a7e9234bbd647622b8 => ef/ef628c714be4e202be07b343637c67e8} (53%) create mode 100644 Library/Artifacts/f0/f0228e3dc6ba4e90f31cf18624d23e16 create mode 100644 Library/Artifacts/f0/f0688377ae7e4ae7483f99781f77ff33 create mode 100644 Library/Artifacts/f1/f1be858a040a150b2a49c0097d05b18d delete mode 100644 Library/Artifacts/f4/f4268701f066ae522b1b055141da92bf create mode 100644 Library/Artifacts/f4/f475ac3f65ce6bfe8584f1e4c43530f2 create mode 100644 Library/Artifacts/f4/f491cad27321440202cd41037cb2f353 delete mode 100644 Library/Artifacts/f5/f5c59ece433609069faf73449b02a39f delete mode 100644 Library/Artifacts/f8/f82f4ddcd6ef4d5f8298aab5a44f1c58 delete mode 100644 Library/Artifacts/f8/f8987e98573bc217ff561f38186b9748 delete mode 100644 Library/Artifacts/f8/f8e16b27805937ed9fe182c934fb79b6 rename Library/Artifacts/{25/25805a6391ad6e67acf3c5c7a0a75e19 => f8/f8ec7967dabceb5e92e02ebcf379b495} (84%) create mode 100644 Library/Artifacts/fa/fa9ec1807e6926658b6507e482fa5140 create mode 100644 Library/Artifacts/fb/fb31d73d3016c043452d2a96521c725f rename Library/Artifacts/{93/9323b0fd974d6fd3b9bba2b689130b10 => fb/fb7c13e3d4fe5d05e98cd62bf05187fe} (83%) create mode 100644 Library/Artifacts/fc/fc86869fc8a871f9c7be3e054cba0a2b rename Library/Artifacts/{bb/bbb17d0996be86e222367470c41ea93f => fd/fd3c4a5b6e99ea6bab5819a2747dd654} (98%) delete mode 100644 Library/Artifacts/fe/fe4090e70de39710a39ce06d180fed44 create mode 100644 Library/Artifacts/ff/ffda3c1f6abf175c7c73dfe7ec7cde25 diff --git a/.vs/RimWorld-Animation-Studio/v16/.suo b/.vs/RimWorld-Animation-Studio/v16/.suo index 9f4e74d2aed57102b455e8db290b0312666a70dd..4407ca6cccff8e031dcc979cdce96683ac369c70 100644 GIT binary patch delta 24605 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 Ba~%Kx delta 18927 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 BXkP#T diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj index a77c91d6..df8f7e6f 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -67,34 +67,32 @@ - - - - - + - - - - - - - + + + + + + + + + - - - - - - + + - + + + + + @@ -112,14 +110,18 @@ - - - - - - + + + + + + + + + + @@ -127,17 +129,14 @@ - - - - + @@ -146,7 +145,7 @@ - + diff --git a/Assembly-CSharp.csproj.user b/Assembly-CSharp.csproj.user new file mode 100644 index 00000000..c10e84ba --- /dev/null +++ b/Assembly-CSharp.csproj.user @@ -0,0 +1,6 @@ + + + + ProjectFiles + + \ No newline at end of file diff --git a/Assets/Resources/Prefabs/StageCard.prefab b/Assets/Resources/Prefabs/StageCard.prefab index 29cd9b08..ebaafd48 100644 --- a/Assets/Resources/Prefabs/StageCard.prefab +++ b/Assets/Resources/Prefabs/StageCard.prefab @@ -647,6 +647,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 20b2be62d5fdc4b4992cede005ec2aee, type: 3} m_Name: m_EditorClassIdentifier: + stageName: {fileID: 1575336727571200468} + stageNameField: {fileID: 8975510041719035916} + banner: {fileID: 8402660926707036654} --- !u!1 &5467517697077698744 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/MainScene.unity b/Assets/Scenes/MainScene.unity index 0f405934..d98b2448 100644 --- a/Assets/Scenes/MainScene.unity +++ b/Assets/Scenes/MainScene.unity @@ -155,14 +155,14 @@ RectTransform: - {fileID: 1882610407} - {fileID: 1128954052} - {fileID: 1124030520} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 12 + m_Father: {fileID: 1216651060} + m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 10, y: -370} + m_AnchoredPosition: {x: 10, y: -150} m_SizeDelta: {x: 120, y: 30} - m_Pivot: {x: 0, y: 0.5} + m_Pivot: {x: 0, y: 1} --- !u!114 &11575767 MonoBehaviour: m_ObjectHideFlags: 0 @@ -170,11 +170,14 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 11575765} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 0ba5b69d448f9434ca7d74d4022f3dcd, type: 3} m_Name: m_EditorClassIdentifier: + dropdown: {fileID: 0} + label: {fileID: 0} + hashcode: -1 --- !u!114 &11575768 MonoBehaviour: m_ObjectHideFlags: 0 @@ -225,18 +228,7 @@ MonoBehaviour: m_Options: [] m_OnValueChanged: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 11575767} - m_MethodName: UpdateActorRace - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] m_AlphaFadeSpeed: 0.15 --- !u!114 &11575769 MonoBehaviour: @@ -718,14 +710,14 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 935483303140078260} - m_RootOrder: 1 + m_Father: {fileID: 657181759} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 1, y: -150} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 30} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0.5, y: 1} --- !u!114 &47347462 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1095,6 +1087,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &70380477 GameObject: m_ObjectHideFlags: 0 @@ -1443,6 +1437,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &82705930 GameObject: m_ObjectHideFlags: 0 @@ -4305,18 +4301,7 @@ MonoBehaviour: m_CharacterLimit: 0 m_OnEndEdit: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2130812670} - m_MethodName: UpdateAnimationDef - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] m_OnValueChanged: m_PersistentCalls: m_Calls: [] @@ -5911,6 +5896,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &365075582 GameObject: m_ObjectHideFlags: 0 @@ -6314,14 +6301,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 316478197} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 14 + m_Father: {fileID: 1216651060} + m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -95, y: -370} + m_AnchoredPosition: {x: -97, y: -150} m_SizeDelta: {x: 60, y: 30} - m_Pivot: {x: 1, y: 0.5} + m_Pivot: {x: 1, y: 1} --- !u!114 &375594582 MonoBehaviour: m_ObjectHideFlags: 0 @@ -6388,7 +6375,7 @@ MonoBehaviour: m_OnEndEdit: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 3804747680621674853} + - m_Target: {fileID: 0} m_MethodName: OnValueChanged m_Mode: 1 m_Arguments: @@ -7140,6 +7127,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!114 &418498614 MonoBehaviour: m_ObjectHideFlags: 0 @@ -7378,6 +7367,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &429161116 GameObject: m_ObjectHideFlags: 0 @@ -9647,14 +9638,13 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: isAnimating: 0 - stageTick: 1 stageTimelineSlider: {fileID: 1289465655} stageLoopDropdown: {fileID: 429161118} cyclesNormalField: {fileID: 74082975} cyclesFastField: {fileID: 1463915054} animationClipTimeField: {fileID: 760297267} animationClipLengthField: {fileID: 1676585155} - actorCard: {fileID: 3804747680621674853} + actorCard: {fileID: 0} animationTimelines: {fileID: 1100016168} actorBodies: {fileID: 1828035561} stretchKeyframesToggle: {fileID: 462332576} @@ -10389,7 +10379,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 84.99498} + m_AnchoredPosition: {x: 0, y: 84.999985} m_SizeDelta: {x: 0, y: 5} m_Pivot: {x: 0, y: 1} --- !u!114 &542629604 @@ -11389,6 +11379,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &591894604 GameObject: m_ObjectHideFlags: 0 @@ -12798,6 +12790,44 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 28} m_Pivot: {x: 0.5, y: 1} +--- !u!1 &657181758 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 657181759} + m_Layer: 5 + m_Name: ActorControls + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &657181759 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657181758} + 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: 47347461} + - {fileID: 899286715} + - {fileID: 1136677497} + m_Father: {fileID: 935483303140078260} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 310, y: 65.97644} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &658284331 GameObject: m_ObjectHideFlags: 0 @@ -13145,6 +13175,8 @@ MonoBehaviour: delay: 0.3 offset: {x: -5, y: -15} flipX: 1 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!114 &681903175 MonoBehaviour: m_ObjectHideFlags: 0 @@ -13846,6 +13878,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &721371349 GameObject: m_ObjectHideFlags: 0 @@ -13903,6 +13937,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!114 &721371352 MonoBehaviour: m_ObjectHideFlags: 0 @@ -14319,6 +14355,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &728306590 GameObject: m_ObjectHideFlags: 0 @@ -14967,6 +15005,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &782222915 GameObject: m_ObjectHideFlags: 0 @@ -15671,6 +15711,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &841981644 GameObject: m_ObjectHideFlags: 0 @@ -16027,6 +16069,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &859476423 GameObject: m_ObjectHideFlags: 0 @@ -16239,6 +16283,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!114 &865383681 MonoBehaviour: m_ObjectHideFlags: 0 @@ -17020,12 +17066,12 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 395375412} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 2 + m_Father: {fileID: 657181759} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 11, y: -165} + m_AnchoredPosition: {x: 10, y: -30} m_SizeDelta: {x: 145, y: 30} m_Pivot: {x: 0, y: 1} --- !u!114 &899286716 @@ -17071,7 +17117,7 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 531246358} + - m_Target: {fileID: 1335076905} m_MethodName: AddActor m_Mode: 1 m_Arguments: @@ -17601,8 +17647,8 @@ RectTransform: m_Father: {fileID: 971413406} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.13577896} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.99997056} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} @@ -18174,6 +18220,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &971413405 GameObject: m_ObjectHideFlags: 0 @@ -18642,14 +18690,14 @@ RectTransform: - {fileID: 1151323893} - {fileID: 225041961} - {fileID: 593007063} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 9 + m_Father: {fileID: 1216651060} + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -9, y: -275} + m_AnchoredPosition: {x: -10, y: -60} m_SizeDelta: {x: 120, y: 30} - m_Pivot: {x: 1, y: 0.5} + m_Pivot: {x: 1, y: 1} --- !u!114 &1001419736 MonoBehaviour: m_ObjectHideFlags: 0 @@ -18710,18 +18758,7 @@ MonoBehaviour: m_Image: {fileID: 0} m_OnValueChanged: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 3804747680621674853} - m_MethodName: OnActorLayerChange - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] m_AlphaFadeSpeed: 0.15 --- !u!114 &1001419737 MonoBehaviour: @@ -18789,14 +18826,14 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 935483303140078260} - m_RootOrder: 11 + m_Father: {fileID: 1216651060} + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -340} + m_AnchoredPosition: {x: 0, y: -120} m_SizeDelta: {x: 0, y: 30} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0.5, y: 1} --- !u!114 &1012383902 MonoBehaviour: m_ObjectHideFlags: 0 @@ -20396,12 +20433,12 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1321044693} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 3 + m_Father: {fileID: 657181759} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -9, y: -165} + m_AnchoredPosition: {x: -10, y: -30} m_SizeDelta: {x: 145, y: 30} m_Pivot: {x: 1, y: 1} --- !u!114 &1136677498 @@ -20447,7 +20484,7 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 531246358} + - m_Target: {fileID: 1335076905} m_MethodName: RemoveActor m_Mode: 1 m_Arguments: @@ -20937,6 +20974,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &1151323892 GameObject: m_ObjectHideFlags: 0 @@ -21261,8 +21300,8 @@ MonoBehaviour: m_TargetGraphic: {fileID: 922060210} m_HandleRect: {fileID: 922060209} m_Direction: 2 - m_Value: 1 - m_Size: 0.86422104 + m_Value: 0 + m_Size: 0.99997056 m_NumberOfSteps: 0 m_OnValueChanged: m_PersistentCalls: @@ -21886,14 +21925,14 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 935483303140078260} - m_RootOrder: 4 + m_Father: {fileID: 1216651060} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 1, y: -215} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 30} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0.5, y: 1} --- !u!114 &1169056256 MonoBehaviour: m_ObjectHideFlags: 0 @@ -22212,14 +22251,14 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 935483303140078260} - m_RootOrder: 13 + m_Father: {fileID: 1216651060} + m_RootOrder: 9 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -150, y: -370} + m_AnchoredPosition: {x: -152, y: -150} m_SizeDelta: {x: 19.951263, y: 30} - m_Pivot: {x: 1, y: 0.5} + m_Pivot: {x: 1, y: 1} --- !u!114 &1179892062 MonoBehaviour: m_ObjectHideFlags: 0 @@ -22353,6 +22392,7 @@ GameObject: - component: {fileID: 1185311444} - component: {fileID: 1185311443} - component: {fileID: 1185311447} + - component: {fileID: 1185311448} m_Layer: 5 m_Name: TooltipMessage m_TagString: Untagged @@ -22477,6 +22517,18 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 10000 m_TargetDisplay: 0 +--- !u!114 &1185311448 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1185311441} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ec8ec1002bf0dda4aa55bfb75b152066, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1190554010 GameObject: m_ObjectHideFlags: 0 @@ -22700,6 +22752,81 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1208864190} m_CullTransparentMesh: 0 +--- !u!1 &1216651059 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1216651060} + - component: {fileID: 1216651061} + m_Layer: 5 + m_Name: ActorCard + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1216651060 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1216651059} + 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: 1169056255} + - {fileID: 4300837137793644386} + - {fileID: 4070467796814498374} + - {fileID: 6085830301866471447} + - {fileID: 1470937577} + - {fileID: 1001419735} + - {fileID: 935483303288600285} + - {fileID: 1012383901} + - {fileID: 11575766} + - {fileID: 1179892061} + - {fileID: 375594581} + - {fileID: 2081541321} + - {fileID: 1293104866} + - {fileID: 935483304393195702} + - {fileID: 935483303887120943} + - {fileID: 935483302917639724} + - {fileID: 935483304332071718} + - {fileID: 935483303345155101} + - {fileID: 935483304128418023} + m_Father: {fileID: 935483303140078260} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 310, y: 275.7104} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1216651061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1216651059} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9731614c7527b624492dd33f9b006fcb, type: 3} + m_Name: + m_EditorClassIdentifier: + initiatorToggle: {fileID: 935483303288600284} + selectActorLayerDropdown: {fileID: 1001419736} + bodyTypeDropdown: {fileID: 935483303887120942} + bodyOffsetXField: {fileID: 935483304332071713} + bodyOffsetZField: {fileID: 935483304128418022} + raceDropdown: {fileID: 11575768} + raceOffsetXField: {fileID: 375594583} + raceOffsetZField: {fileID: 1293104868} --- !u!1 &1224297432 GameObject: m_ObjectHideFlags: 0 @@ -23294,6 +23421,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &1231435416 GameObject: m_ObjectHideFlags: 0 @@ -24191,14 +24320,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1475781912} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 16 + m_Father: {fileID: 1216651060} + m_RootOrder: 12 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -10, y: -370} + m_AnchoredPosition: {x: -12, y: -150} m_SizeDelta: {x: 58.349854, y: 30} - m_Pivot: {x: 1, y: 0.5} + m_Pivot: {x: 1, y: 1} --- !u!114 &1293104867 MonoBehaviour: m_ObjectHideFlags: 0 @@ -24265,7 +24394,7 @@ MonoBehaviour: m_OnEndEdit: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 3804747680621674853} + - m_Target: {fileID: 0} m_MethodName: OnValueChanged m_Mode: 1 m_Arguments: @@ -25091,7 +25220,6 @@ GameObject: - component: {fileID: 1335076902} - component: {fileID: 1335076901} - component: {fileID: 1335076900} - - component: {fileID: 1335076904} - component: {fileID: 1335076905} m_Layer: 5 m_Name: Workspace @@ -25184,20 +25312,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} ---- !u!114 &1335076904 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1335076899} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: bf0f782b7c407bf4896b633d509f5568, type: 3} - m_Name: - m_EditorClassIdentifier: - workspaceHistory: [] - maxHistoryDepth: 100 --- !u!114 &1335076905 MonoBehaviour: m_ObjectHideFlags: 0 @@ -26417,6 +26531,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!114 &1385913472 MonoBehaviour: m_ObjectHideFlags: 0 @@ -26754,18 +26870,7 @@ MonoBehaviour: m_CharacterLimit: 0 m_OnEndEdit: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2130812670} - m_MethodName: UpdateAnimationDef - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 + m_Calls: [] m_OnValueChanged: m_PersistentCalls: m_Calls: [] @@ -28472,18 +28577,18 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1470937576} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + 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: 8 + m_Father: {fileID: 1216651060} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -142, y: -275.5} + m_AnchoredPosition: {x: -141, y: -63} m_SizeDelta: {x: 24, y: 24} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0.5, y: 1} --- !u!114 &1470937578 MonoBehaviour: m_ObjectHideFlags: 0 @@ -28538,6 +28643,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &1471661200 GameObject: m_ObjectHideFlags: 0 @@ -28777,6 +28884,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &1475489072 GameObject: m_ObjectHideFlags: 0 @@ -30630,6 +30739,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0ba5b69d448f9434ca7d74d4022f3dcd, type: 3} m_Name: m_EditorClassIdentifier: + dropdown: {fileID: 0} + label: {fileID: 0} + hashcode: -1 --- !u!114 &1567848591 MonoBehaviour: m_ObjectHideFlags: 0 @@ -30991,6 +31103,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!224 &1588340713 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 5546566853072149881, guid: 3d766602dcd74d14cb57739e80baea2d, @@ -32430,6 +32544,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!1 &1688913595 GameObject: m_ObjectHideFlags: 0 @@ -35808,6 +35924,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!114 &1885877281 MonoBehaviour: m_ObjectHideFlags: 0 @@ -36578,6 +36696,8 @@ MonoBehaviour: delay: 0.3 offset: {x: 5, y: -15} flipX: 0 + tooltip: {fileID: 0} + tooltipText: {fileID: 0} --- !u!114 &1901778600 MonoBehaviour: m_ObjectHideFlags: 0 @@ -38810,14 +38930,14 @@ RectTransform: 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_Father: {fileID: 1216651060} + m_RootOrder: 11 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -65, y: -370} + m_AnchoredPosition: {x: -67, y: -150} m_SizeDelta: {x: 17.537262, y: 30} - m_Pivot: {x: 1, y: 0.5} + m_Pivot: {x: 1, y: 1} --- !u!114 &2081541322 MonoBehaviour: m_ObjectHideFlags: 0 @@ -39559,9 +39679,9 @@ RectTransform: m_Father: {fileID: 935483303140078260} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -69.7} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 310, y: 133.99207} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2130812670 @@ -40086,14 +40206,14 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 935483303140078260} - m_RootOrder: 19 + m_Father: {fileID: 1216651060} + m_RootOrder: 15 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -150, y: -435} + m_AnchoredPosition: {x: -152.35016, y: -215} m_SizeDelta: {x: 19.951263, y: 30} - m_Pivot: {x: 1, y: 0.5} + m_Pivot: {x: 1, y: 1} --- !u!1 &935483302917639725 GameObject: m_ObjectHideFlags: 0 @@ -40287,28 +40407,8 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 2130812669} - - {fileID: 47347461} - - {fileID: 899286715} - - {fileID: 1136677497} - - {fileID: 1169056255} - - {fileID: 4300837137793644386} - - {fileID: 4070467796814498374} - - {fileID: 6085830301866471447} - - {fileID: 1470937577} - - {fileID: 1001419735} - - {fileID: 935483303288600285} - - {fileID: 1012383901} - - {fileID: 11575766} - - {fileID: 1179892061} - - {fileID: 375594581} - - {fileID: 2081541321} - - {fileID: 1293104866} - - {fileID: 935483304393195702} - - {fileID: 935483303887120943} - - {fileID: 935483302917639724} - - {fileID: 935483304332071718} - - {fileID: 935483303345155101} - - {fileID: 935483304128418023} + - {fileID: 657181759} + - {fileID: 1216651060} m_Father: {fileID: 531246357} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -40328,14 +40428,14 @@ GameObject: - component: {fileID: 935483303140078260} - component: {fileID: 935483303140078262} - component: {fileID: 935483303140078263} - - component: {fileID: 3804747680621674853} + - component: {fileID: 935483303140078264} m_Layer: 5 m_Name: AnimDefAndActorCard m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!222 &935483303140078262 CanvasRenderer: m_ObjectHideFlags: 0 @@ -40373,6 +40473,31 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!114 &935483303140078264 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 935483303140078261} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 --- !u!1 &935483303288600274 GameObject: m_ObjectHideFlags: 0 @@ -40436,7 +40561,7 @@ MonoBehaviour: onValueChanged: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 3804747680621674853} + - m_Target: {fileID: 0} m_MethodName: OnValueChanged m_Mode: 1 m_Arguments: @@ -40461,14 +40586,14 @@ RectTransform: m_Children: - {fileID: 935483304659652922} - {fileID: 935483304589176913} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 10 + m_Father: {fileID: 1216651060} + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: -69, y: -305} + m_AnchoredPosition: {x: -69, y: -95.5} m_SizeDelta: {x: 150, y: 20} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0.5, y: 1} --- !u!222 &935483303314225216 CanvasRenderer: m_ObjectHideFlags: 0 @@ -40609,14 +40734,14 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 935483303140078260} - m_RootOrder: 21 + m_Father: {fileID: 1216651060} + m_RootOrder: 17 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -65, y: -435} + m_AnchoredPosition: {x: -67.35016, y: -215} m_SizeDelta: {x: 17.537262, y: 30} - m_Pivot: {x: 1, y: 0.5} + m_Pivot: {x: 1, y: 1} --- !u!222 &935483303345155103 CanvasRenderer: m_ObjectHideFlags: 0 @@ -40923,7 +41048,7 @@ MonoBehaviour: m_OnValueChanged: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 3804747680621674853} + - m_Target: {fileID: 0} m_MethodName: OnBodyTypeChanged m_Mode: 1 m_Arguments: @@ -40949,14 +41074,14 @@ RectTransform: - {fileID: 935483303916118577} - {fileID: 935483304684194972} - {fileID: 935483303425689024} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 18 + m_Father: {fileID: 1216651060} + m_RootOrder: 14 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 10, y: -435} + m_AnchoredPosition: {x: 10, y: -215} m_SizeDelta: {x: 120, y: 30} - m_Pivot: {x: 0, y: 0.5} + m_Pivot: {x: 0, y: 1} --- !u!114 &935483303909693488 MonoBehaviour: m_ObjectHideFlags: 0 @@ -41282,7 +41407,7 @@ MonoBehaviour: m_OnEndEdit: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 3804747680621674853} + - m_Target: {fileID: 0} m_MethodName: OnValueChanged m_Mode: 1 m_Arguments: @@ -41316,14 +41441,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 935483302828269144} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 22 + m_Father: {fileID: 1216651060} + m_RootOrder: 18 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -8.3498535, y: -435} + m_AnchoredPosition: {x: -10.7, y: -215} m_SizeDelta: {x: 60, y: 30} - m_Pivot: {x: 1, y: 0.5} + m_Pivot: {x: 1, y: 1} --- !u!1 &935483304221730466 GameObject: m_ObjectHideFlags: 0 @@ -41442,7 +41567,7 @@ MonoBehaviour: m_OnEndEdit: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 3804747680621674853} + - m_Target: {fileID: 0} m_MethodName: OnValueChanged m_Mode: 1 m_Arguments: @@ -41484,14 +41609,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 935483304430676515} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 20 + m_Father: {fileID: 1216651060} + m_RootOrder: 16 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -94, y: -435} + m_AnchoredPosition: {x: -96.35016, y: -215} m_SizeDelta: {x: 60, y: 30} - m_Pivot: {x: 1, y: 0.5} + m_Pivot: {x: 1, y: 1} --- !u!1 &935483304332071719 GameObject: m_ObjectHideFlags: 0 @@ -41651,14 +41776,14 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 935483303140078260} - m_RootOrder: 17 + m_Father: {fileID: 1216651060} + m_RootOrder: 13 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 1.7409973, y: -405} + m_AnchoredPosition: {x: 0, y: -185} m_SizeDelta: {x: 0, y: 30} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0.5, y: 1} --- !u!1 &935483304393195703 GameObject: m_ObjectHideFlags: 0 @@ -42558,25 +42683,6 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!114 &3804747680621674853 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 935483303140078261} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9731614c7527b624492dd33f9b006fcb, type: 3} - m_Name: - m_EditorClassIdentifier: - bodyTypeDropdown: {fileID: 935483303887120942} - bodyOffsetXField: {fileID: 935483304332071713} - bodyOffsetZField: {fileID: 935483304128418022} - raceOffsetXField: {fileID: 375594583} - raceOffsetZField: {fileID: 1293104868} - initiatorToggle: {fileID: 935483303288600284} - selectActorLayerDropdown: {fileID: 1001419736} --- !u!224 &4070467796814498374 RectTransform: m_ObjectHideFlags: 0 @@ -42589,14 +42695,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 5155145354840193887} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 6 + m_Father: {fileID: 1216651060} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -9, y: -245} + m_AnchoredPosition: {x: -9, y: -30} m_SizeDelta: {x: 145, y: 30} - m_Pivot: {x: 1, y: 0.5} + m_Pivot: {x: 1, y: 1} --- !u!222 &4220699018471944123 CanvasRenderer: m_ObjectHideFlags: 0 @@ -42636,14 +42742,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1453461556519350520} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 5 + m_Father: {fileID: 1216651060} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 11, y: -245} + m_AnchoredPosition: {x: 10, y: -30} m_SizeDelta: {x: 145, y: 30} - m_Pivot: {x: 0, y: 0.5} + m_Pivot: {x: 0, y: 1} --- !u!1 &4446261852394827046 GameObject: m_ObjectHideFlags: 0 @@ -42918,14 +43024,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 7357923201829463118} - m_Father: {fileID: 935483303140078260} - m_RootOrder: 7 + m_Father: {fileID: 1216651060} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 11, y: -275} + m_AnchoredPosition: {x: 10, y: -60} m_SizeDelta: {x: 145, y: 30} - m_Pivot: {x: 0, y: 0.5} + m_Pivot: {x: 0, y: 1} --- !u!222 &6164565606941102640 CanvasRenderer: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/AnimationComponents/AnimationClips.meta b/Assets/Scripts/1_To_update.meta similarity index 77% rename from Assets/Scripts/AnimationComponents/AnimationClips.meta rename to Assets/Scripts/1_To_update.meta index c8f155f2..b2a4c8e9 100644 --- a/Assets/Scripts/AnimationComponents/AnimationClips.meta +++ b/Assets/Scripts/1_To_update.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 20033872660014f4295d8ac40800a707 +guid: ff71352a02fb53440a35dbeabb9ebc87 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Scripts/AnimationComponents/Actor.cs b/Assets/Scripts/AnimationComponents/Actor.cs index cd4eaaf6..af479d7c 100644 --- a/Assets/Scripts/AnimationComponents/Actor.cs +++ b/Assets/Scripts/AnimationComponents/Actor.cs @@ -8,80 +8,143 @@ namespace RimWorldAnimationStudio { public class Actor { - [XmlArray("defNames"), XmlArrayItem("li")] public List defNames = new List(); - [XmlArray("bodyDefTypes"), XmlArrayItem("li")] public List bodyDefTypes = new List(); - [XmlArray("requiredGender"), XmlArrayItem("li")] public List requiredGender = new List(); - [XmlArray("requiredGenitals"), XmlArrayItem("li")] public List requiredGenitals = new List(); - [XmlArray("raceOffsets"), XmlArrayItem("li")] public List raceOffsets = new List(); - [XmlArray("blacklistedRaces"), XmlArrayItem("li")] public List blacklistedRaces = new List(); + // Data to/from animationDef + [XmlArray("defNames"), XmlArrayItem("li")] public List defNames; + [XmlArray("bodyDefTypes"), XmlArrayItem("li")] public List bodyDefTypes; + [XmlArray("requiredGenitals"), XmlArrayItem("li")] public List requiredGenitals; + [XmlArray("raceOffsets"), XmlArrayItem("li")] public List raceOffsets; [XmlArray("tags"), XmlArrayItem("li")] public List tags; + public BodyTypeOffset bodyTypeOffset; + public bool? initiator = false; + public bool? controlGenitalAngle; + public bool? isFucking; + public bool? isFucked; - [XmlIgnore] public ActorGender gender; - [XmlIgnore] private AlienRaceDef alienRaceDef; - - public BodyTypeOffset bodyTypeOffset = new BodyTypeOffset(); - public bool initiator = false; - public bool controlGenitalAngle; - public bool isFucking; - public bool isFucked; - - [XmlIgnore] public string bodyType = "Male"; - + // Data serialization control public bool ShouldSerializedefNames() { return defNames.NotNullOrEmpty(); } public bool ShouldSerializebodyDefTypes() { return bodyDefTypes.NotNullOrEmpty(); } - public bool ShouldSerializerequiredGender() { return requiredGender.NotNullOrEmpty(); } public bool ShouldSerializerequiredGenitals() { return requiredGenitals.NotNullOrEmpty(); } public bool ShouldSerializeraceOffsets() { return raceOffsets.NotNullOrEmpty(); } - public bool ShouldSerializeblacklistedRaces() { return blacklistedRaces.NotNullOrEmpty(); } public bool ShouldSerializetags() { return tags.NotNullOrEmpty(); } - public bool ShouldSerializeinitiator() { return initiator; } - public bool ShouldSerializecontrolGenitalAngle() { return controlGenitalAngle; } - public bool ShouldSerializeisFucking() { return isFucking; } - public bool ShouldSerializeisFucked() { return isFucked; } + public bool ShouldSerializebodyTypeOffset() { return bodyTypeOffset?.AllOffsetsEmpty() == false; } + public bool ShouldSerializeinitiator() { return initiator == true; } + public bool ShouldSerializecontrolGenitalAngle() { return controlGenitalAngle == true; } + public bool ShouldSerializeisFucking() { return isFucking == true; } + public bool ShouldSerializeisFucked() { return isFucked == true; } - public AlienRaceDef GetAlienRaceDef() - { - if (alienRaceDef == null) - { alienRaceDef = AlienRaceDefs.GetNamed("Human"); } - - return alienRaceDef; + // Data helper functions + [XmlIgnore] public List DefNames + { + get { return defNames.NullOrEmpty() ? defNames = new List() : defNames; } + set { defNames = value.NotNullOrEmpty() ? value : null; EventsManager.OnActorChanged(this); } } - public void SetAlienRaceDef(string alienRaceDefName) - { - AlienRaceDef alienRaceDef = AlienRaceDefs.GetNamed(alienRaceDefName); - - if (alienRaceDef != null) - { this.alienRaceDef = alienRaceDef; } + [XmlIgnore] public List BodyDefTypes + { + get { return bodyDefTypes.NullOrEmpty() ? bodyDefTypes = new List() : bodyDefTypes; } + set { bodyDefTypes = value.NotNullOrEmpty() ? value : null; EventsManager.OnActorChanged(this); } } - public Vector3 GetAlienRaceOffset() - { - if (alienRaceDef == null) - { alienRaceDef = AlienRaceDefs.GetNamed("Human"); } + [XmlIgnore] public List RequiredGenitals + { + get { return requiredGenitals.NullOrEmpty() ? requiredGenitals = new List() : requiredGenitals; } + set { requiredGenitals = value.NotNullOrEmpty() ? value : null; EventsManager.OnActorChanged(this); } + } - AlienRaceOffset raceOffset = raceOffsets.FirstOrDefault(x => x.defName == alienRaceDef.defName); + [XmlIgnore] public List RaceOffsets { + get { return raceOffsets.NullOrEmpty() ? raceOffsets = new List() : raceOffsets; } + set { raceOffsets = value.NotNullOrEmpty() ? value : null; EventsManager.OnActorChanged(this); } + } + + [XmlIgnore] public List Tags + { + get { return tags.NullOrEmpty() ? tags = new List() : tags; } + set { tags = value.NotNullOrEmpty() ? value : null; EventsManager.OnActorChanged(this); } + } + + [XmlIgnore] public BodyTypeOffset BodyTypeOffset + { + get { return bodyTypeOffset == null ? bodyTypeOffset = new BodyTypeOffset() : bodyTypeOffset; } + set { bodyTypeOffset = value; EventsManager.OnActorChanged(this); } + } + + [XmlIgnore] public bool Initiator + { + get { return initiator == true; } + set { if (value) { initiator = true; } else initiator = null; EventsManager.OnActorChanged(this); } + } + + [XmlIgnore] public bool ControlGenitalAngle + { + get { return controlGenitalAngle == true; } + set { if (value) { controlGenitalAngle = true; } else controlGenitalAngle = null; EventsManager.OnActorChanged(this); } + } + + [XmlIgnore] public bool IsFucking + { + get { return isFucking == true; } + set { if (value) { isFucking = true; } else isFucking = null; EventsManager.OnActorChanged(this); } + } + + [XmlIgnore] public bool IsFucked + { + get { return isFucked == true; } + set { if (value) { isFucked = true; } else isFucked = null; EventsManager.OnActorChanged(this); } + } + + // Local data + [XmlIgnore] public string bodyType = "Male"; + [XmlIgnore] private PawnRaceDef pawnRaceDef; + + // Methods + public PawnRaceDef GetPawnRaceDef() + { + if (pawnRaceDef == null) + { pawnRaceDef = PawnRaceDefs.GetNamed("Human"); } + + return pawnRaceDef; + } + + public void SetPawnRaceDef(string pawnRaceDefName) + { + PawnRaceDef pawnRaceDef = PawnRaceDefs.GetNamed(pawnRaceDefName); + + if (pawnRaceDef != null) + { + this.pawnRaceDef = pawnRaceDef; + EventsManager.OnActorChanged(this); + } + } + + public Vector3 GetPawnRaceOffset() + { + if (pawnRaceDef == null) + { pawnRaceDef = PawnRaceDefs.GetNamed("Human"); } + + PawnRaceOffset raceOffset = RaceOffsets.FirstOrDefault(x => x.defName == pawnRaceDef.defName); if (raceOffset == null) { - raceOffset = new AlienRaceOffset(alienRaceDef.defName); - raceOffsets.Add(raceOffset); + raceOffset = new PawnRaceOffset(pawnRaceDef.defName); + RaceOffsets.Add(raceOffset); } return raceOffset.GetOffset(); } - public void SetAlienRaceOffset(Vector2 offset) + public void SetPawnRaceOffset(Vector2 offset) { - if (alienRaceDef == null) + if (pawnRaceDef == null) { return; } - AlienRaceOffset raceOffset = raceOffsets.FirstOrDefault(x => x.defName == alienRaceDef.defName); + PawnRaceOffset raceOffset = RaceOffsets.FirstOrDefault(x => x.defName == pawnRaceDef.defName); if (raceOffset == null) { - raceOffset = new AlienRaceOffset(alienRaceDef.defName); - raceOffsets.Add(raceOffset); + raceOffset = new PawnRaceOffset(pawnRaceDef.defName); + RaceOffsets.Add(raceOffset); + + EventsManager.OnActorChanged(this); } raceOffset.SetOffset(offset); @@ -89,46 +152,25 @@ namespace RimWorldAnimationStudio public Vector3 GetFinalTransformOffset() { - Vector3 offset = GetAlienRaceOffset() + (GetAlienRaceDef().isHumanoid ? bodyTypeOffset.GetOffset(bodyType) : new Vector3()); + Vector3 offset = GetPawnRaceOffset() + (GetPawnRaceDef().isHumanoid ? BodyTypeOffset.GetOffset(bodyType) : new Vector3()); return new Vector3(offset.x, offset.z, offset.y); } - public void ValidateData() - { - bodyDefTypes = bodyDefTypes.Intersect(Tags.bodyDefTypes.Concat(CustomTags.bodyDefTypes))?.ToList(); - requiredGenitals = requiredGenitals.Intersect(Tags.bodyParts.Concat(CustomTags.bodyParts))?.ToList(); - raceOffsets = raceOffsets.Except(raceOffsets.Where(x => x.OffsetIsZero()))?.ToList(); - } - - public bool MakeNew() - { - if (Workspace.animationDef == null) - { Debug.LogWarning("Cannot make new actor - there is no AnimationDef"); return false; } - - Workspace.animationDef.actors.Add(this); - Workspace.actorID = Workspace.animationDef.actors.Count - 1; - - foreach (AnimationStage stage in Workspace.animationDef.animationStages) - { - PawnAnimationClip clip = new PawnAnimationClip(); - - if (clip.MakeNew()) - { - stage.animationClips.Add(clip); - stage.Initialize(); - stage.OnPostLoad(); - } - } - - return true; - } - public int GetActorID() { if (Workspace.animationDef == null) return -1; - - return Workspace.animationDef.actors.IndexOf(this); + return Workspace.animationDef.Actors.IndexOf(this); } + + // Pre-save / post-load + public void OnPreSave() + { + BodyDefTypes = BodyDefTypes.Intersect(DefaultTags.bodyDefTypes.Concat(CustomTags.bodyDefTypes))?.ToList(); + RequiredGenitals = RequiredGenitals.Intersect(DefaultTags.bodyParts.Concat(CustomTags.bodyParts))?.ToList(); + RaceOffsets = RaceOffsets.Except(RaceOffsets.Where(x => x.OffsetIsZero()))?.ToList(); + } + + public void OnPostLoad() { } } } diff --git a/Assets/Scripts/AnimationComponents/Actor.cs.meta b/Assets/Scripts/AnimationComponents/Actor.cs.meta index 4848df55..8aac977c 100644 --- a/Assets/Scripts/AnimationComponents/Actor.cs.meta +++ b/Assets/Scripts/AnimationComponents/Actor.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ca7cd67490c5773499bff5c06907bdf7 +guid: 63a9fd7a0256e9849bc2bc07403528e8 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/AnimationComponents/ActorAddon.cs b/Assets/Scripts/AnimationComponents/ActorAddon.cs index 9d3103b7..94a4189a 100644 --- a/Assets/Scripts/AnimationComponents/ActorAddon.cs +++ b/Assets/Scripts/AnimationComponents/ActorAddon.cs @@ -4,28 +4,69 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; +using UnityEngine; namespace RimWorldAnimationStudio { public class ActorAddon { + // Data to/from animationDef public string addonName; - public int anchoringActor; + public int? anchoringActor; public string anchorName; public string layer = "Pawn"; - public float scale; - public bool render; + public float? scale; + public bool? render; + // Data helper functions + [XmlIgnore] public string AddonName + { + get { return addonName; } + set { addonName = value; } + } + + [XmlIgnore] public int AnchoringActor + { + get { return anchoringActor.HasValue ? anchoringActor.Value : 0; } + set { anchoringActor = value; EventsManager.OnActorAddonChanged(this); } + } + + [XmlIgnore] public string AnchorName + { + get { return anchorName; } + set { anchorName = value; EventsManager.OnActorAddonChanged(this); } + } + + [XmlIgnore] public string Layer + { + get { return layer; } + set { layer = value; EventsManager.OnActorAddonChanged(this); } + } + + [XmlIgnore] public float Scale + { + get { return scale.HasValue ? scale.Value : 0f; } + set { scale = value; EventsManager.OnActorAddonChanged(this); } + } + + [XmlIgnore] public bool Render + { + get { return render == true; } + set { render = value; EventsManager.OnActorAddonChanged(this); } + } + + // Simple curves [XmlIgnore] public SimpleCurve PosX = new SimpleCurve(); [XmlIgnore] public SimpleCurve PosZ = new SimpleCurve(); [XmlIgnore] public SimpleCurve Rotation = new SimpleCurve(); + // Constructors public ActorAddon() { } public ActorAddon(string addonName, float scale = 1f) { - this.addonName = addonName; - this.scale = scale; + this.AddonName = addonName; + this.Scale = scale; } } } diff --git a/Assets/Scripts/AnimationComponents/ActorAddon.cs.meta b/Assets/Scripts/AnimationComponents/ActorAddon.cs.meta index 4d517736..5eda85a2 100644 --- a/Assets/Scripts/AnimationComponents/ActorAddon.cs.meta +++ b/Assets/Scripts/AnimationComponents/ActorAddon.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f4d87003a570d5241affe4170ae91045 +guid: 3759e796f4f62b044b9a652e746d79a1 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/AnimationComponents/AddonKeyFrame.cs b/Assets/Scripts/AnimationComponents/AddonKeyFrame.cs new file mode 100644 index 00000000..0a0f2fa0 --- /dev/null +++ b/Assets/Scripts/AnimationComponents/AddonKeyFrame.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +using System.Xml; +using System.Xml.Serialization; +using UnityEngine; + +namespace RimWorldAnimationStudio +{ + public class AddonKeyframe + { + // Data to/from animationDef + public string addonName; + public float? posX; + public float? posZ; + public float? rotation; + + // Data helper functions + [XmlIgnore] public string AddonName + { + get { return addonName; } + set { addonName = value; } + } + + [XmlIgnore] public float PosX + { + get { return posX.HasValue ? posX.Value : 0f; } + set { posX = value; EventsManager.OnAddonKeyframeChanged(this); } + } + + [XmlIgnore] public float PosZ + { + get { return posZ.HasValue ? posZ.Value : 0f; } + set { posZ = value; EventsManager.OnAddonKeyframeChanged(this); } + } + + [XmlIgnore] public float Rotation + { + get { return rotation.HasValue ? rotation.Value : 0f; } + set { rotation = value; EventsManager.OnAddonKeyframeChanged(this); } + } + + // Constructors + public AddonKeyframe() { } + + public AddonKeyframe(string addonName) + { + this.AddonName = addonName; + } + } +} diff --git a/Assets/Scripts/AnimationComponents/KeyFrames/AddonKeyFrame.cs.meta b/Assets/Scripts/AnimationComponents/AddonKeyFrame.cs.meta similarity index 83% rename from Assets/Scripts/AnimationComponents/KeyFrames/AddonKeyFrame.cs.meta rename to Assets/Scripts/AnimationComponents/AddonKeyFrame.cs.meta index 2c365526..ad200690 100644 --- a/Assets/Scripts/AnimationComponents/KeyFrames/AddonKeyFrame.cs.meta +++ b/Assets/Scripts/AnimationComponents/AddonKeyFrame.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 60509e7cd8e74e6419c5c93304440a17 +guid: 339d47b209f50f545a84a8e8c7948ae1 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs b/Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs deleted file mode 100644 index 9f26d4fb..00000000 --- a/Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Collections.Generic; -using System.Xml; -using System.Xml.Serialization; - -namespace RimWorldAnimationStudio -{ - public abstract class AnimationClip - { - public string layer = "Pawn"; - public List tags; - - public virtual int duration { get { return 0; } } - - 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 deleted file mode 100644 index 69229d55..00000000 --- a/Assets/Scripts/AnimationComponents/AnimationClips/PawnAnimationClip.cs +++ /dev/null @@ -1,230 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml; -using System.Xml.Serialization; -using UnityEngine; - -namespace RimWorldAnimationStudio -{ - public class PawnAnimationClip : AnimationClip - { - [XmlArray("addons"), XmlArrayItem("li")] public List _addons = new List(); - [XmlIgnore] public List addons = new List(); - - [XmlAttribute("Class")] public string className = "Rimworld_Animations.PawnAnimationClip"; - [XmlArray("keyframes"), XmlArrayItem("li")] public List keyframes = new List(); - - [XmlIgnore] public Dictionary quiver = new Dictionary(); - [XmlIgnore] public SimpleCurve GenitalAngle = new SimpleCurve(); - [XmlIgnore] public SimpleCurve BodyAngle = new SimpleCurve(); - [XmlIgnore] public SimpleCurve HeadAngle = new SimpleCurve(); - [XmlIgnore] public SimpleCurve HeadBob = new SimpleCurve(); - [XmlIgnore] public SimpleCurve BodyOffsetX = new SimpleCurve(); - [XmlIgnore] public SimpleCurve BodyOffsetZ = new SimpleCurve(); - [XmlIgnore] public SimpleCurve HeadFacing = new SimpleCurve(); - [XmlIgnore] public SimpleCurve BodyFacing = new SimpleCurve(); - - public override int duration { get { return keyframes.Max(x => x.atTick.Value); } } - - public override void BuildSimpleCurves() - { - BodyAngle.Clear(); - HeadAngle.Clear(); - BodyOffsetX.Clear(); - BodyOffsetZ.Clear(); - HeadFacing.Clear(); - BodyFacing.Clear(); - HeadBob.Clear(); - GenitalAngle.Clear(); - - foreach (ActorAddon addon in addons) - { - addon.PosX.Clear(); - addon.PosZ.Clear(); - addon.Rotation.Clear(); - } - - int keyframePosition = 0; - int duration = 0; - - keyframes[keyframes.Count - 1].tickDuration = 1; - - foreach (PawnKeyframe frame in keyframes) - { duration += frame.tickDuration; } - - for (int i = 0; i < keyframes.Count; i++) - { - PawnKeyframe keyframe = keyframes[i]; - - if (keyframe.atTick.HasValue) - { - if (keyframe.HasValidKeyframeID() == false) - { keyframe.GenerateKeyframeID(Workspace.animationDef.animationStages[Workspace.stageID].animationClips.IndexOf(this)); } - - BodyAngle.Add((float)keyframe.atTick / (float)duration, keyframe.bodyAngle, true); - HeadAngle.Add((float)keyframe.atTick / (float)duration, keyframe.headAngle, true); - BodyOffsetX.Add((float)keyframe.atTick / (float)duration, keyframe.bodyOffsetX, true); - BodyOffsetZ.Add((float)keyframe.atTick / (float)duration, keyframe.bodyOffsetZ, true); - HeadFacing.Add((float)keyframe.atTick / (float)duration, keyframe.headFacing, true); - BodyFacing.Add((float)keyframe.atTick / (float)duration, keyframe.bodyFacing, true); - HeadBob.Add((float)keyframe.atTick / (float)duration, keyframe.headBob, true); - GenitalAngle.Add((float)keyframe.atTick / (float)duration, keyframe.genitalAngle, true); - - foreach (ActorAddon addon in addons) - { - if (keyframe.addonKeyframes.Any(x => x.addonName == addon.addonName) == false) - { keyframe.addonKeyframes.Add(new AddonKeyframe(addon.addonName)); } - - addon.PosX.Add((float)keyframe.atTick / (float)duration, keyframe.GetAddonKeyframe(addon.addonName).posX, true); - addon.PosZ.Add((float)keyframe.atTick / (float)duration, keyframe.GetAddonKeyframe(addon.addonName).posZ, true); - addon.Rotation.Add((float)keyframe.atTick / (float)duration, keyframe.GetAddonKeyframe(addon.addonName).rotation, true); - } - - if (i + 1 < keyframes.Count) - { keyframes[i].tickDuration = keyframes[i + 1].atTick.Value - keyframes[i].atTick.Value; } - } - - else - { - BodyAngle.Add((float)keyframePosition / (float)duration, keyframe.bodyAngle, true); - HeadAngle.Add((float)keyframePosition / (float)duration, keyframe.headAngle, true); - BodyOffsetX.Add((float)keyframePosition / (float)duration, keyframe.bodyOffsetX, true); - BodyOffsetZ.Add((float)keyframePosition / (float)duration, keyframe.bodyOffsetZ, true); - HeadFacing.Add((float)keyframePosition / (float)duration, keyframe.headFacing, true); - BodyFacing.Add((float)keyframePosition / (float)duration, keyframe.bodyFacing, true); - HeadBob.Add((float)keyframePosition / (float)duration, keyframe.headBob, true); - GenitalAngle.Add((float)keyframePosition / (float)duration, keyframe.genitalAngle, true); - - foreach (ActorAddon addon in addons) - { - if (keyframe.addonKeyframes.Any(x => x.addonName == addon.addonName) == false) - { keyframe.addonKeyframes.Add(new AddonKeyframe(addon.addonName)); } - - addon.PosX.Add((float)keyframePosition / (float)duration, keyframe.GetAddonKeyframe(addon.addonName).posX, true); - addon.PosZ.Add((float)keyframePosition / (float)duration, keyframe.GetAddonKeyframe(addon.addonName).posZ, true); - addon.Rotation.Add((float)keyframePosition / (float)duration, keyframe.GetAddonKeyframe(addon.addonName).rotation, true); - } - - if (keyframe.tickDuration != 1 && keyframe.quiver.HasValue) - { - quiver.Add(keyframePosition, true); - quiver.Add(keyframePosition + keyframe.tickDuration - 1, false); - } - - keyframe.atTick = keyframePosition + Constants.minTick; - keyframePosition += keyframe.tickDuration; - } - } - } - - public void AddActorAddon(string addonName, float scale = 1f) - { - if (addons.Any(x => x.addonName == addonName) == false) - { - addons.Add(new ActorAddon(addonName, scale)); - } - - foreach (PawnKeyframe keyframe in keyframes) - { - if (keyframe.addonKeyframes.Any(x => x.addonName == addonName) == false) - { keyframe.addonKeyframes.Add(new AddonKeyframe(addonName)); } - } - } - - public void ShowOrHideActorAddon(string addonName, bool flag) - { - ActorAddon addon = GetActorAddon(addonName); - - if (addon != null) - { addon.render = flag; } - } - - public bool IsActorAddonVisible(string addonName) - { - ActorAddon addon = GetActorAddon(addonName); - - if (addon != null) - { return addon.render; } - - return false; - } - - public ActorAddon GetActorAddon(string addonName) - { - return addons.FirstOrDefault(x => x.addonName == addonName); - } - - public override void ValidateData() - { - _addons.Clear(); - - foreach (ActorAddon addon in addons) - { - Debug.Log(addon.anchorName); - - if (addon.render) - { - _addons.Add(addon); - } - } - } - - public int GetOwningActorID() - { - if (Workspace.animationDef == null) return -1; - - return Workspace.animationDef.animationStages[Workspace.stageID].animationClips.IndexOf(this); - } - - public bool MakeNew(int actorID = -1) - { - PawnKeyframe lastkeyframe = null; - - if (actorID >= 0) - { lastkeyframe = Workspace.animationDef.animationStages[Workspace.stageID].animationClips[actorID]?.keyframes?.Last(); } - - if (lastkeyframe != null) - { - PawnKeyframe keyframeA = lastkeyframe.Copy(); - keyframeA.atTick = null; - keyframeA.tickDuration = Constants.defaultAnimationClipLength - 1; - keyframeA.GenerateKeyframeID(actorID); - keyframes.Add(keyframeA); - - PawnKeyframe keyframeB = lastkeyframe.Copy(); - keyframeB.atTick = null; - keyframeB.tickDuration = 1; - keyframeB.GenerateKeyframeID(actorID); - keyframes.Add(keyframeB); - } - - else - { - PawnKeyframe keyframeA = new PawnKeyframe(); - keyframeA.tickDuration = Constants.defaultAnimationClipLength - 1; - keyframes.Add(keyframeA); - - PawnKeyframe keyframeB = new PawnKeyframe(); - keyframes.Add(keyframeB); - } - - BuildSimpleCurves(); - return true; - } - - public void OnPostLoad() - { - addons = _addons.Copy(); - - foreach (PawnKeyframe keyframe in keyframes) - { - keyframe.OnPostLoad(); - } - - AddActorAddon("left hand", 0.667f); - AddActorAddon("right hand", 0.667f); - AddActorAddon("dildo"); - } - } -} diff --git a/Assets/Scripts/AnimationComponents/AnimationClips/ThingAnimationClip.cs b/Assets/Scripts/AnimationComponents/AnimationClips/ThingAnimationClip.cs deleted file mode 100644 index 486c8be8..00000000 --- a/Assets/Scripts/AnimationComponents/AnimationClips/ThingAnimationClip.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Xml; -using System.Xml.Serialization; - -namespace RimWorldAnimationStudio -{ - public class ThingAnimationClip : AnimationClip - { - [XmlAttribute("Class")] public string className = "Rimworld_Animations.ThingAnimationClip"; - [XmlArray("keyframes"), XmlArrayItem("li")] public List keyframes = new List(); - - [XmlIgnore] public SimpleCurve PositionX = new SimpleCurve(); - [XmlIgnore] public SimpleCurve PositionZ = new SimpleCurve(); - [XmlIgnore] public SimpleCurve Rotation = new SimpleCurve(); - - public override int duration { get { return keyframes.Max(x => x.atTick.Value); } } - - public override void BuildSimpleCurves() - { - int duration = 0; - - //getting the length of the whole clip - foreach (ThingKeyframe frame in keyframes) - { - duration += frame.tickDuration; - } - - //guarantees loops don't get cut off mid-anim - //this.duration = duration; - - int keyframePosition = 0; - foreach (ThingKeyframe frame in keyframes) - { - if (frame.atTick.HasValue) - { - PositionX.Add((float)frame.atTick / (float)duration, frame.positionX, true); - PositionZ.Add((float)frame.atTick / (float)duration, frame.positionZ, true); - Rotation.Add((float)frame.atTick / (float)duration, frame.rotation, true); - } - - else - { - PositionX.Add((float)keyframePosition / (float)duration, frame.positionX, true); - PositionZ.Add((float)keyframePosition / (float)duration, frame.positionZ, true); - Rotation.Add((float)keyframePosition / (float)duration, frame.rotation, true); - - keyframePosition += frame.tickDuration; - } - } - } - } -} diff --git a/Assets/Scripts/AnimationComponents/AnimationDef.cs b/Assets/Scripts/AnimationComponents/AnimationDef.cs index fa44c7c5..8ecd4677 100644 --- a/Assets/Scripts/AnimationComponents/AnimationDef.cs +++ b/Assets/Scripts/AnimationComponents/AnimationDef.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Xml; using System.Xml.Serialization; @@ -8,33 +9,163 @@ namespace RimWorldAnimationStudio { public class AnimationDef { - public string defName = "Undefined"; - public string label = "Undefined"; + // Data to/from animationDef + public string defName; + public string label; public bool sounds = true; + [XmlArray("sexTypes"), XmlArrayItem("li")] public List sexTypes; + [XmlArray("interactionDefTypes"), XmlArrayItem("li")] public List interactionDefTypes; + [XmlArray("actors"), XmlArrayItem("li")] public List actors; + [XmlArray("animationStages"), XmlArrayItem("li")] public List animationStages; - [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("animationStages"), XmlArrayItem("li")] public List animationStages = new List(); - - [XmlIgnore] public int animationTimeTicks { get { return animationStages.Sum(x => x.playTimeTicks); } } - [XmlIgnore] public int animationTimeTicksQuick { get { return animationStages.Sum(x => x.playTimeTicksQuick); } } - + // Data serialization control public bool ShouldSerializesexTypes() { return sexTypes.NotNullOrEmpty(); } public bool ShouldSerializeinteractionDefTypes() { return interactionDefTypes.NotNullOrEmpty(); } public bool ShouldSerializeactors() { return actors.NotNullOrEmpty(); } public bool ShouldSerializeanimationStages() { return animationStages.NotNullOrEmpty(); } + // Data helper functions + [XmlIgnore] public string DefName + { + get { return defName != null && defName != "" ? defName : "newAnimation"; } + set { defName = value; EventsManager.OnAnimationDefChanged(); } + } + + [XmlIgnore] public string Label + { + get { return label != null && label != "" ? label : "newAnimation"; } + set { label = value; EventsManager.OnAnimationDefChanged(); } + } + + [XmlIgnore] public List SexTypes + { + get { return sexTypes.NullOrEmpty() ? sexTypes = new List() : sexTypes; } + set { sexTypes = value.NotNullOrEmpty() ? value : null; EventsManager.OnAnimationDefChanged(); } + } + + [XmlIgnore] public List InteractionDefTypes + { + get { return interactionDefTypes.NullOrEmpty() ? interactionDefTypes = new List() : interactionDefTypes; } + set { interactionDefTypes = value.NotNullOrEmpty() ? value : null; EventsManager.OnAnimationDefChanged(); } + } + + [XmlIgnore] public List Actors + { + get { return actors.NullOrEmpty() ? actors = new List() : actors; } + set { actors = value.NotNullOrEmpty() ? value : null; EventsManager.OnAnimationDefChanged(); } + } + + [XmlIgnore] public List AnimationStages + { + get { if (animationStages.NullOrEmpty()){ animationStages = new List(); } return animationStages; } + set { animationStages = value.NotNullOrEmpty() ? value : null; EventsManager.OnAnimationDefChanged(); } + } + + // Local data + [XmlIgnore] public int animationTimeTicks { get { return AnimationStages.Sum(x => x.PlayTimeTicks); } } + [XmlIgnore] public int animationTimeTicksQuick { get { return AnimationStages.Sum(x => x.PlayTimeTicksQuick); } } + + // Methods public void Initialize() { - foreach (AnimationStage stage in animationStages) + foreach (AnimationStage stage in AnimationStages) { stage.Initialize(); } } - public void ValidateData() + public void AddActor() { - sexTypes = sexTypes.Intersect(Tags.sexTypes.Concat(CustomTags.sexTypes))?.ToList(); - interactionDefTypes = interactionDefTypes.Intersect(Tags.interactionDefTypes.Concat(CustomTags.interactionDefTypes))?.ToList(); + if (Workspace.animationDef.Actors.Count >= 8) + { + Debug.LogWarning("Cannot add actor - the animation can only contain a maximum of eight actors."); + return; + } + + Actor actor = new Actor(); + Actors.Add(actor); + + Workspace.ActorID = Workspace.animationDef.Actors.Count - 1; + + foreach (AnimationStage stage in Workspace.animationDef.AnimationStages) + { stage.AddAnimationClip(Workspace.ActorID); } + + EventsManager.OnActorCountChanged(); + Workspace.RecordEvent("Actor addition"); } + + public void RemoveActor() + { + if (Workspace.animationDef.Actors.Count == 1) + { + Debug.LogWarning("Cannot delete actor - the animation must contain at least one actor."); + return; + } + + foreach (AnimationStage stage in Workspace.animationDef.AnimationStages) + { stage.AnimationClips.RemoveAt(Workspace.ActorID); } + + Workspace.animationDef.Actors.RemoveAt(Workspace.ActorID); + Workspace.ActorID--; + + EventsManager.OnActorCountChanged(); + Workspace.RecordEvent("Actor deletion"); + } + + public void AddAnimationStage() + { + AnimationStage stage = new AnimationStage(); + AnimationStages.Add(stage); + + foreach (Actor actor in Workspace.animationDef.Actors) + { stage.AddAnimationClip(actor.GetActorID()); } + + Initialize(); + + Workspace.RecordEvent("Stage addition"); + } + + public void CloneAnimationStage() + { + AnimationStage stage = Workspace.GetCurrentAnimationStage().Copy(); + stage.StageName += " (Clone)"; + stage.Initialize(); + + Workspace.animationDef.AnimationStages.Insert(Workspace.StageID + 1, stage); + Workspace.RecordEvent("Stage clone"); + } + + public void MoveAnimationStage(int startIndex, int delta) + { + if (startIndex + delta < 0 || startIndex + delta >= AnimationStages.Count) return; + + AnimationStage stage = AnimationStages[startIndex]; + AnimationStages[startIndex] = Workspace.animationDef.AnimationStages[startIndex + delta]; + AnimationStages[startIndex + delta] = stage; + + Workspace.StageID = startIndex + delta; + Workspace.RecordEvent("Stage move"); + } + + public void RemoveAnimationStage() + { + if (Workspace.animationDef.AnimationStages.Count == 1) + { + Debug.LogWarning("Cannot delete animation stage - the animation must contain at least one animation stage."); + return; + } + + AnimationStages.RemoveAt(Workspace.StageID); + + Workspace.StageID--; + Workspace.RecordEvent("Stage deletion"); + } + + // Pre-save / post-load + public void OnPreSave() + { + SexTypes = SexTypes.Intersect(DefaultTags.sexTypes.Concat(CustomTags.sexTypes))?.ToList(); + InteractionDefTypes = InteractionDefTypes.Intersect(DefaultTags.interactionDefTypes.Concat(CustomTags.interactionDefTypes))?.ToList(); + } + + public void OnPostLoad() { } } } diff --git a/Assets/Scripts/AnimationComponents/AnimationDef.cs.meta b/Assets/Scripts/AnimationComponents/AnimationDef.cs.meta index 8c99f55f..a45270f7 100644 --- a/Assets/Scripts/AnimationComponents/AnimationDef.cs.meta +++ b/Assets/Scripts/AnimationComponents/AnimationDef.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9cca833a1987a2749aa6e4d640d32266 +guid: 37ec1f5f150928e42bda942fe97046b9 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/AnimationComponents/AnimationStage.cs b/Assets/Scripts/AnimationComponents/AnimationStage.cs index 4a26b21f..3b966185 100644 --- a/Assets/Scripts/AnimationComponents/AnimationStage.cs +++ b/Assets/Scripts/AnimationComponents/AnimationStage.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Xml; using System.Xml.Serialization; @@ -8,68 +9,145 @@ namespace RimWorldAnimationStudio { public class AnimationStage { - public string stageName = "NewStage"; - public int stageIndex = 0; - public int playTimeTicks = 0; - public int playTimeTicksQuick = 0; - public bool isLooping = false; + // Data to/from animationDef + [SerializeField] private string stageName; + [SerializeField] private int? playTimeTicks; + [SerializeField] private int? playTimeTicksQuick; + [SerializeField] private bool? isLooping; + [SerializeField, XmlArray("animationClips"), XmlArrayItem("li")] public List animationClips; - [XmlArray("animationClips"), XmlArrayItem("li")] public List animationClips = new List(); + // Data serialization control + public bool ShouldSerializeanimationClips() { return animationClips.NotNullOrEmpty(); } + + // Data helper functions + [XmlIgnore] public string StageName + { + get { return stageName != null && stageName != "" ? stageName : "NewStage"; } + set { stageName = value; EventsManager.OnAnimationStageChanged(this); } + } + + [XmlIgnore] public int PlayTimeTicks + { + get { return playTimeTicks.HasValue ? playTimeTicks.Value : 0; } + set { playTimeTicks = value; EventsManager.OnAnimationStageChanged(this); } + } + + [XmlIgnore] public int PlayTimeTicksQuick + { + get { return playTimeTicksQuick.HasValue ? playTimeTicksQuick.Value : 0; } + set { playTimeTicksQuick = value; EventsManager.OnAnimationStageChanged(this); } + } + + [XmlIgnore] public bool IsLooping + { + get { return isLooping == true; } + set { isLooping = value; EventsManager.OnAnimationStageChanged(this); } + } + + [XmlIgnore] public List AnimationClips + { + get { return animationClips.NullOrEmpty() ? animationClips = new List() : animationClips; } + set { animationClips = value.NotNullOrEmpty() ? value : null; EventsManager.OnAnimationStageChanged(this); } + } + + // Local data [XmlIgnore] public int stageWindowSize = -1; + // Methods public void Initialize() { - foreach (PawnAnimationClip clip in animationClips) + foreach (PawnAnimationClip clip in AnimationClips) { clip.BuildSimpleCurves(); - // Select playTimeTicks as longest playtime of all the animations - if (clip.duration > playTimeTicks) - { playTimeTicks = clip.duration; } + if (clip.duration > PlayTimeTicks) + { PlayTimeTicks = clip.duration; } } - } - public void ValidateData() - { - // Sort keyframes by atTick - foreach (PawnAnimationClip clip in animationClips) - { clip.keyframes = clip.keyframes.OrderBy(x => x.atTick).ToList(); } + PlayTimeTicksQuick = PlayTimeTicks; } public int GetStageID() { if (Workspace.animationDef == null) return -1; - return Workspace.animationDef.animationStages.IndexOf(this); + return Workspace.animationDef.AnimationStages.IndexOf(this); } - public bool MakeNew() + public void StretchStageWindow(int newStageWindowSize) { - if (Workspace.animationDef == null) - { Debug.LogWarning("Cannot make new animation stage - there is no AnimationDef"); return false; } + float scale = (float)newStageWindowSize / Workspace.StageWindowSize; - Workspace.animationDef.animationStages.Add(this); - - foreach (Actor actor in Workspace.animationDef.actors) + foreach (PawnAnimationClip clip in Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips) { - PawnAnimationClip clip = new PawnAnimationClip(); + foreach (PawnKeyframe keyframe in clip.Keyframes) + { + keyframe.TickDuration = Mathf.RoundToInt(keyframe.TickDuration * scale); + keyframe.atTick = null; + } - if (clip.MakeNew(actor.GetActorID())) - { animationClips.Add(clip); } + clip.BuildSimpleCurves(); + } + } + + public void ResizeStageWindow(int newStageWindowSize) + { + Workspace.GetCurrentAnimationStage().stageWindowSize = newStageWindowSize; + Workspace.GetCurrentAnimationStage().PlayTimeTicks = newStageWindowSize * Workspace.stageLoopsNormal; + Workspace.GetCurrentAnimationStage().PlayTimeTicksQuick = newStageWindowSize * Workspace.stageLoopsQuick; + } + + public void AddAnimationClip(int actorID = -1) + { + PawnAnimationClip clip = new PawnAnimationClip(); + PawnKeyframe lastkeyframe = null; + + if (actorID >= 0) + { lastkeyframe = Workspace.GetPawnAnimationClip(actorID)?.Keyframes?.Last(); } + + if (lastkeyframe != null) + { + PawnKeyframe keyframeA = lastkeyframe.Copy(); + keyframeA.atTick = null; + keyframeA.TickDuration = Constants.defaultAnimationClipLength - 1; + keyframeA.GenerateKeyframeID(actorID); + + clip.Keyframes.Add(keyframeA); + + PawnKeyframe keyframeB = lastkeyframe.Copy(); + keyframeB.atTick = null; + keyframeB.TickDuration = 1; + keyframeB.GenerateKeyframeID(actorID); + + clip.Keyframes.Add(keyframeB); } - Initialize(); - playTimeTicksQuick = playTimeTicks; + else + { + PawnKeyframe keyframeA = new PawnKeyframe(); + keyframeA.TickDuration = Constants.defaultAnimationClipLength - 1; - return true; + clip.Keyframes.Add(keyframeA); + + PawnKeyframe keyframeB = new PawnKeyframe(); + + clip.Keyframes.Add(keyframeB); + } + + clip.BuildSimpleCurves(); + } + + // Pre-save / post-load + public void OnPreSave() + { + foreach (PawnAnimationClip clip in AnimationClips) + { clip.Keyframes = clip.Keyframes.OrderBy(x => x.atTick).ToList(); } } public void OnPostLoad() { - foreach (PawnAnimationClip clip in animationClips) - { - clip.OnPostLoad(); - } + foreach (PawnAnimationClip clip in AnimationClips) + { clip.OnPostLoad(); } } } } diff --git a/Assets/Scripts/AnimationComponents/AnimationStage.cs.meta b/Assets/Scripts/AnimationComponents/AnimationStage.cs.meta index d46dd410..49ce46f5 100644 --- a/Assets/Scripts/AnimationComponents/AnimationStage.cs.meta +++ b/Assets/Scripts/AnimationComponents/AnimationStage.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4d62c568c0ad7ea4ba7ddd3b9aa6d0e9 +guid: 9270822a570a06f41afa00e169af500c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/AnimationComponents/BodyTypeOffset.cs b/Assets/Scripts/AnimationComponents/BodyTypeOffset.cs index fd4a85ee..63b99162 100644 --- a/Assets/Scripts/AnimationComponents/BodyTypeOffset.cs +++ b/Assets/Scripts/AnimationComponents/BodyTypeOffset.cs @@ -1,6 +1,5 @@ using System.Reflection; using UnityEngine; -//using Microsoft.Toolkit.Uwp.UI; namespace RimWorldAnimationStudio { @@ -12,6 +11,11 @@ namespace RimWorldAnimationStudio public string Hulk; public string Fat; + public bool AllOffsetsEmpty() + { + return string.IsNullOrEmpty(Male) && string.IsNullOrEmpty(Female) && string.IsNullOrEmpty(Thin) && string.IsNullOrEmpty(Hulk) && string.IsNullOrEmpty(Fat); + } + public void SetOffset(string bodyType, Vector2 bodyOffset) { FieldInfo bodyTypeOffsetInfo = typeof(BodyTypeOffset).GetField(bodyType); diff --git a/Assets/Scripts/AnimationComponents/BodyTypeOffset.cs.meta b/Assets/Scripts/AnimationComponents/BodyTypeOffset.cs.meta index 2d9148a4..1b883413 100644 --- a/Assets/Scripts/AnimationComponents/BodyTypeOffset.cs.meta +++ b/Assets/Scripts/AnimationComponents/BodyTypeOffset.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6db04cc11995126429fb12578d6620d7 +guid: 1dfd90f8aa6d0e04086e2b4983d42ab6 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/AnimationComponents/Defs.cs.meta b/Assets/Scripts/AnimationComponents/Defs.cs.meta deleted file mode 100644 index 9839c338..00000000 --- a/Assets/Scripts/AnimationComponents/Defs.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 92804390faa29b945818e67cf808b49c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/AnimationComponents/KeyFrames/AddonKeyFrame.cs b/Assets/Scripts/AnimationComponents/KeyFrames/AddonKeyFrame.cs deleted file mode 100644 index 7f695fd1..00000000 --- a/Assets/Scripts/AnimationComponents/KeyFrames/AddonKeyFrame.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using System.Xml; -using System.Xml.Serialization; - -namespace RimWorldAnimationStudio -{ - public class AddonKeyframe - { - public string addonName; - public float posX; - public float posZ; - public float rotation; - - public AddonKeyframe() { } - - public AddonKeyframe(string addonName) - { - this.addonName = addonName; - } - } -} diff --git a/Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs b/Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs deleted file mode 100644 index a9a01908..00000000 --- a/Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using System.Xml; -using System.Xml.Serialization; - -namespace RimWorldAnimationStudio -{ - public class Keyframe - { - [XmlIgnore] public int? atTick; - - public int tickDuration = 1; - public string soundEffect; - public List tags = new List(); - - public bool ShouldSerializetags() { return tags.NotNullOrEmpty(); } - - public virtual void ValidateData() { } - } -} diff --git a/Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs.meta b/Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs.meta deleted file mode 100644 index 905dbc98..00000000 --- a/Assets/Scripts/AnimationComponents/KeyFrames/Keyframe.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c909440fcfe86c14c9e363377896367c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs b/Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs deleted file mode 100644 index 25bd15d7..00000000 --- a/Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml; -using System.Xml.Serialization; -using UnityEngine; -using UnityEngine.UI; - -namespace RimWorldAnimationStudio -{ - public class PawnKeyframe : Keyframe - { - public float bodyAngle; - public float headAngle; - public float headBob; - public float bodyOffsetX; - public float bodyOffsetZ; - public float headFacing = 2; - public float bodyFacing = 2; - - public float genitalAngle; - public bool? quiver; - - [XmlArray("addonKeyframes"), XmlArrayItem("li")] public List _addonKeyframes = new List(); - - [XmlIgnore] public List addonKeyframes = new List(); - [XmlIgnore] public int keyframeID; - [XmlIgnore] public int actorID = -1; - - public bool ShouldSerializegenitalAngle() { return genitalAngle != 0; } - public bool ShouldSerializequiver() { return quiver != null; } - - public override void ValidateData() - { - soundEffect = Tags.soundDefs.Concat(CustomTags.soundDefs).Contains(soundEffect) ? soundEffect : null; - - _addonKeyframes.Clear(); - - foreach (AddonKeyframe addonKeyframe in addonKeyframes) - { - ActorAddon addon = Workspace.Instance.GetAnimationClipThatOwnsKeyframe(keyframeID, out int clipID).GetActorAddon(addonKeyframe.addonName); - - if (addon.render) - { _addonKeyframes.Add(addonKeyframe.Copy()); } - } - } - - public void OnPostLoad() - { - addonKeyframes.Clear(); - - foreach (AddonKeyframe addonKeyframe in _addonKeyframes) - { - addonKeyframes.Add(addonKeyframe.Copy()); - } - } - - public void GenerateKeyframeID(int actorID) - { - this.actorID = actorID; - int _keyframeID = UnityEngine.Random.Range(100000, 1000000); - - if (Workspace.animationDef.animationStages.Any(x => x.animationClips.Any(y => y.keyframes.Any(z => z.keyframeID == _keyframeID)))) - { - GenerateKeyframeID(actorID); - return; - } - - keyframeID = _keyframeID; - } - - public bool HasValidKeyframeID() - { return keyframeID >= 100000 && keyframeID < 1000000; } - - public KeyframeSlider GetKeyframeSlider() - { - return Selectable.allSelectablesArray.FirstOrDefault(x => x.GetComponent()?.keyframeID == keyframeID)?.GetComponent< KeyframeSlider>(); - } - - public AddonKeyframe GetAddonKeyframe(string addonName) - { - return addonKeyframes.FirstOrDefault(x => x.addonName == addonName); - } - } -} diff --git a/Assets/Scripts/AnimationComponents/KeyFrames/ThingKeyFrame.cs b/Assets/Scripts/AnimationComponents/KeyFrames/ThingKeyFrame.cs deleted file mode 100644 index 98d0ea7f..00000000 --- a/Assets/Scripts/AnimationComponents/KeyFrames/ThingKeyFrame.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; -using System.Xml; -using System.Xml.Serialization; - -namespace RimWorldAnimationStudio -{ - public class ThingKeyframe : Keyframe - { - public float positionX; - public float positionZ; - public float rotation; - } -} diff --git a/Assets/Scripts/AnimationComponents/KeyFrames/ThingKeyFrame.cs.meta b/Assets/Scripts/AnimationComponents/KeyFrames/ThingKeyFrame.cs.meta deleted file mode 100644 index 57266d86..00000000 --- a/Assets/Scripts/AnimationComponents/KeyFrames/ThingKeyFrame.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 48d6c7ac273c73b498a8bf4c33fda2fc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs b/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs new file mode 100644 index 00000000..629dee64 --- /dev/null +++ b/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs @@ -0,0 +1,390 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml; +using System.Xml.Serialization; +using UnityEngine; + +namespace RimWorldAnimationStudio +{ + public class PawnAnimationClip + { + // Data to/from animationDef + public string layer = "Pawn"; + [XmlArray("addons"), XmlArrayItem("li")] public List addons; + [XmlAttribute("Class")] public string className = "Rimworld_Animations.PawnAnimationClip"; + [XmlArray("keyframes"), XmlArrayItem("li")] public List keyframes; + [XmlArray("tags"), XmlArrayItem("li")] public List tags; + + // Data serialization control + public bool ShouldSerializeaddons() { return addons.Where(x => x.Render)?.Any() == true; } + public bool ShouldSerializekeyframes() { return keyframes.NotNullOrEmpty(); } + public bool ShouldSerializetags() { return tags.NotNullOrEmpty(); } + + // Data helper functions + [XmlIgnore] public string Layer + { + get { return layer; } + set { layer = value; EventsManager.OnPawnAnimationClipChanged(this); } + } + + [XmlIgnore] public List Addons + { + get { return addons.NullOrEmpty() ? addons = new List() : addons; } + set { addons = value.NotNullOrEmpty() ? value : null; EventsManager.OnPawnAnimationClipChanged(this); } + } + + [XmlIgnore] public List Keyframes + { + get { return keyframes.NullOrEmpty() ? keyframes = new List() : keyframes; } + set { keyframes = value.NotNullOrEmpty() ? value : null; EventsManager.OnPawnAnimationClipChanged(this); } + } + + [XmlIgnore] + public List Tags + { + get { return tags.NullOrEmpty() ? tags = new List() : tags; } + set { tags = value.NotNullOrEmpty() ? value : null; EventsManager.OnPawnAnimationClipChanged(this); } + } + + // Local data + [XmlIgnore] public int duration { get { return Keyframes.Max(x => x.atTick.Value); } } + + [XmlIgnore] public SimpleCurve GenitalAngle = new SimpleCurve(); + [XmlIgnore] public SimpleCurve BodyAngle = new SimpleCurve(); + [XmlIgnore] public SimpleCurve HeadAngle = new SimpleCurve(); + [XmlIgnore] public SimpleCurve HeadBob = new SimpleCurve(); + [XmlIgnore] public SimpleCurve BodyOffsetX = new SimpleCurve(); + [XmlIgnore] public SimpleCurve BodyOffsetZ = new SimpleCurve(); + [XmlIgnore] public SimpleCurve HeadFacing = new SimpleCurve(); + [XmlIgnore] public SimpleCurve BodyFacing = new SimpleCurve(); + + // Methods + public void BuildSimpleCurves() + { + // Clear simple curve data + BodyAngle.Clear(); + HeadAngle.Clear(); + BodyOffsetX.Clear(); + BodyOffsetZ.Clear(); + HeadFacing.Clear(); + BodyFacing.Clear(); + HeadBob.Clear(); + GenitalAngle.Clear(); + + foreach (ActorAddon addon in Addons) + { + addon.PosX.Clear(); + addon.PosZ.Clear(); + addon.Rotation.Clear(); + } + + // Start + int keyframePosition = 0; + int duration = 0; + + Keyframes[Keyframes.Count - 1].TickDuration = 1; + + foreach (PawnKeyframe frame in Keyframes) + { duration += frame.TickDuration; } + + for (int i = 0; i < Keyframes.Count; i++) + { + PawnKeyframe keyframe = Keyframes[i]; + + if (keyframe.atTick.HasValue) + { + if (keyframe.HasValidKeyframeID() == false) + { keyframe.GenerateKeyframeID(Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips.IndexOf(this)); } + + BodyAngle.Add((float)keyframe.atTick / (float)duration, keyframe.BodyAngle, true); + HeadAngle.Add((float)keyframe.atTick / (float)duration, keyframe.HeadAngle, true); + BodyOffsetX.Add((float)keyframe.atTick / (float)duration, keyframe.BodyOffsetX, true); + BodyOffsetZ.Add((float)keyframe.atTick / (float)duration, keyframe.BodyOffsetZ, true); + HeadFacing.Add((float)keyframe.atTick / (float)duration, keyframe.HeadFacing, true); + BodyFacing.Add((float)keyframe.atTick / (float)duration, keyframe.BodyFacing, true); + HeadBob.Add((float)keyframe.atTick / (float)duration, keyframe.HeadBob, true); + GenitalAngle.Add((float)keyframe.atTick / (float)duration, keyframe.GenitalAngle, true); + + foreach (ActorAddon addon in Addons) + { + if (keyframe.AddonKeyframes.Any(x => x.AddonName == addon.AddonName) == false) + { keyframe.AddonKeyframes.Add(new AddonKeyframe(addon.AddonName)); } + + addon.PosX.Add((float)keyframe.atTick / (float)duration, keyframe.GetAddonKeyframe(addon.AddonName).PosX, true); + addon.PosZ.Add((float)keyframe.atTick / (float)duration, keyframe.GetAddonKeyframe(addon.AddonName).PosZ, true); + addon.Rotation.Add((float)keyframe.atTick / (float)duration, keyframe.GetAddonKeyframe(addon.AddonName).Rotation, true); + } + + if (i + 1 < Keyframes.Count) + { Keyframes[i].TickDuration = Keyframes[i + 1].atTick.Value - Keyframes[i].atTick.Value; } + } + + else + { + BodyAngle.Add((float)keyframePosition / (float)duration, keyframe.BodyAngle, true); + HeadAngle.Add((float)keyframePosition / (float)duration, keyframe.HeadAngle, true); + BodyOffsetX.Add((float)keyframePosition / (float)duration, keyframe.BodyOffsetX, true); + BodyOffsetZ.Add((float)keyframePosition / (float)duration, keyframe.BodyOffsetZ, true); + HeadFacing.Add((float)keyframePosition / (float)duration, keyframe.HeadFacing, true); + BodyFacing.Add((float)keyframePosition / (float)duration, keyframe.BodyFacing, true); + HeadBob.Add((float)keyframePosition / (float)duration, keyframe.HeadBob, true); + GenitalAngle.Add((float)keyframePosition / (float)duration, keyframe.GenitalAngle, true); + + foreach (ActorAddon addon in Addons) + { + if (keyframe.AddonKeyframes.Any(x => x.AddonName == addon.AddonName) == false) + { keyframe.AddonKeyframes.Add(new AddonKeyframe(addon.AddonName)); } + + addon.PosX.Add((float)keyframePosition / (float)duration, keyframe.GetAddonKeyframe(addon.AddonName).PosX, true); + addon.PosZ.Add((float)keyframePosition / (float)duration, keyframe.GetAddonKeyframe(addon.AddonName).PosZ, true); + addon.Rotation.Add((float)keyframePosition / (float)duration, keyframe.GetAddonKeyframe(addon.AddonName).Rotation, true); + } + + keyframe.atTick = keyframePosition + Constants.minTick; + keyframePosition += keyframe.TickDuration; + } + } + } + + public void AddActorAddon(string addonName, float scale = 1f) + { + if (Addons.Any(x => x.AddonName == addonName) == false) + { + Addons.Add(new ActorAddon(addonName, scale)); + } + + foreach (PawnKeyframe keyframe in Keyframes) + { + if (keyframe.AddonKeyframes.Any(x => x.AddonName == addonName) == false) + { keyframe.AddonKeyframes.Add(new AddonKeyframe(addonName)); } + } + } + + public void ShowOrHideActorAddon(string addonName, bool flag) + { + ActorAddon addon = GetActorAddon(addonName); + + if (addon != null) + { addon.Render = flag; } + } + + public bool IsActorAddonVisible(string addonName) + { + ActorAddon addon = GetActorAddon(addonName); + + if (addon != null) + { return addon.Render; } + + return false; + } + + public ActorAddon GetActorAddon(string addonName) + { + return Addons.FirstOrDefault(x => x.AddonName == addonName); + } + + public int GetOwningActorID() + { + if (Workspace.animationDef == null) return -1; + + return Workspace.GetCurrentAnimationStage().AnimationClips.IndexOf(this); + } + + public void AddPawnKeyframe() + { + PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); + List keyframes = clip?.Keyframes; + + if (clip == null || keyframes == null) + { Debug.LogWarning("Cannot add pawn keyframe - the AnimationDef is invalid"); return; } + + if (keyframes.FirstOrDefault(x => x.atTick == Workspace.StageTick) != null) + { Debug.LogWarning("Cannot add pawn keyframe - a keyframe already exists at this tick"); return; } + + float clipPercent = (float)(Workspace.StageTick % clip.duration) / clip.duration; + + PawnKeyframe keyframe = new PawnKeyframe(); + keyframe.BodyAngle = clip.BodyAngle.Evaluate(clipPercent); + keyframe.HeadAngle = clip.HeadAngle.Evaluate(clipPercent); + keyframe.HeadBob = clip.HeadBob.Evaluate(clipPercent); + keyframe.BodyOffsetX = clip.BodyOffsetX.Evaluate(clipPercent); + keyframe.BodyOffsetZ = clip.BodyOffsetZ.Evaluate(clipPercent); + keyframe.HeadFacing = (int)clip.HeadFacing.Evaluate(clipPercent); + keyframe.BodyFacing = (int)clip.BodyFacing.Evaluate(clipPercent); + keyframe.GenitalAngle = clip.GenitalAngle.Evaluate(clipPercent); + + keyframe.atTick = Workspace.StageTick; + + PawnKeyframe nextKeyframe = keyframes.FirstOrDefault(x => x.atTick > Workspace.StageTick); + + if (nextKeyframe != null) + { keyframes.Insert(keyframes.IndexOf(nextKeyframe), keyframe); } + + else + { keyframes.Add(keyframe); } + + clip.BuildSimpleCurves(); + + Workspace.RecordEvent("Keyframe addition"); + } + + public void ClonePawnKeyframe() + { + List keyframesToClone = Workspace.GetPawnKeyframesByID(Workspace.keyframeID); + + foreach (PawnKeyframe keyframe in keyframesToClone) + { + PawnAnimationClip clip = Workspace.GetAnimationClipThatOwnsKeyframe(keyframe.keyframeID, out int clipID); + + if (clip == null) + { Debug.LogWarning("Cannot clone pawn keyframe - no clip owns this keyframe"); continue; } + + if (clip.Keyframes.FirstOrDefault(x => x.atTick == Workspace.StageTick) != null) + { Debug.LogWarning("Cannot clone pawn keyframe - a keyframe already exists at this tick"); return; } + + PawnKeyframe cloneFrame = keyframe.Copy(); + cloneFrame.GenerateKeyframeID(clipID); + cloneFrame.atTick = Workspace.StageTick; + + PawnKeyframe nextKeyframe = clip.Keyframes.FirstOrDefault(x => x.atTick > Workspace.StageTick); + + if (nextKeyframe != null) + { clip.Keyframes.Insert(clip.Keyframes.IndexOf(nextKeyframe), cloneFrame); } + + else + { clip.Keyframes.Add(cloneFrame); } + + clip.BuildSimpleCurves(); + } + + Workspace.RecordEvent("Keyframe clone"); + } + + public void CopyPawnKeyframes() + { + Workspace.copiedKeyframes.Clear(); + + List keyframesToClone = Workspace.GetPawnKeyframesByID(Workspace.keyframeID); + + foreach (PawnKeyframe keyframe in keyframesToClone) + { Workspace.copiedKeyframes.Add(keyframe.Copy()); } + } + + public void PastePawnKeyframes() + { + int originalWindowSize = Workspace.StageWindowSize; + + List actorsInvolved = Workspace.copiedKeyframes.Select(x => x.actorID)?.ToList(); + actorsInvolved = actorsInvolved?.Distinct()?.ToList(); + + if (actorsInvolved.NullOrEmpty()) { Debug.Log("Cannot paste keyframes - there were no copied keyframes to paste"); return; } + if (actorsInvolved.Count > 1 && actorsInvolved.Contains(Workspace.ActorID) == false) { Debug.Log("Cannot paste keyframes - keyframes copied across multiple timelines can only be pasted back into these source timelines"); return; } + + int earliestTick = actorsInvolved.Count == 1 ? Workspace.GetEarliestAtTickInCopiedKeyframes(actorsInvolved[0]) : Workspace.GetEarliestAtTickInCopiedKeyframes(Workspace.ActorID); + if (earliestTick < 1) { Debug.Log("Unknown error occured during keyframe paste operation"); return; } + + foreach (PawnKeyframe copiedKeyframe in Workspace.copiedKeyframes) + { + int tickToPasteAt = Workspace.StageTick + (copiedKeyframe.atTick.Value - earliestTick); + + if (tickToPasteAt < 1) continue; + if (tickToPasteAt > Workspace.StageWindowSize) + { + if (Workspace.stretchKeyframes) + { Workspace.GetCurrentAnimationStage().ResizeStageWindow(tickToPasteAt); } + + else continue; + } + + int targetActorID = actorsInvolved.Count == 1 ? Workspace.ActorID : copiedKeyframe.actorID; + + if (Workspace.DoesPawnKeyframeExistAtTick(Workspace.StageID, targetActorID, tickToPasteAt)) + { + PawnKeyframe oldKeyframe = Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips[targetActorID].Keyframes.First(x => x.atTick == tickToPasteAt); + RemovePawnKeyframe(targetActorID, oldKeyframe.keyframeID, true); + } + + PawnKeyframe clonedKeyframe = copiedKeyframe.Copy(); + clonedKeyframe.GenerateKeyframeID(targetActorID); + clonedKeyframe.atTick = tickToPasteAt; + + PawnAnimationClip clip = Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips[targetActorID]; + PawnKeyframe nextKeyframe = clip.Keyframes.FirstOrDefault(x => x.atTick > tickToPasteAt); + + if (nextKeyframe != null) + { clip.Keyframes.Insert(clip.Keyframes.IndexOf(nextKeyframe), clonedKeyframe); } + + else + { clip.Keyframes.Add(clonedKeyframe); } + + clip.BuildSimpleCurves(); + } + + if (originalWindowSize != Workspace.StageWindowSize) + { + Workspace.GetCurrentAnimationStage().StretchStageWindow(originalWindowSize); + Workspace.GetCurrentAnimationStage().ResizeStageWindow(originalWindowSize); + } + + Workspace.RecordEvent("Keyframe pasted"); + } + + public void RemovePawnKeyframe() + { + foreach (int keyframeID in Workspace.keyframeID) + { + if (Workspace.GetAnimationClipThatOwnsKeyframe(keyframeID, out int clipID) != null) + { RemovePawnKeyframe(clipID, keyframeID); } + } + } + + public void RemovePawnKeyframe(int actorID, int keyframeID, bool force = false) + { + PawnKeyframe keyframe = Workspace.GetPawnKeyframe(actorID, keyframeID); + PawnAnimationClip clip = Workspace.animationDef.AnimationStages[Workspace.StageID].AnimationClips[actorID]; + + if (keyframe == null || clip == null) return; + + if (keyframe.atTick == Constants.minTick && force == false) + { Debug.LogWarning("Cannot delete key frame - the first key frame of an animation clip cannot be deleted"); return; } + + if (clip.Keyframes.Count <= 2 && force == false) + { Debug.LogWarning("Cannot delete key frame - an animation clip must have two or more keyframes"); return; } + + clip.Keyframes.Remove(keyframe); + clip.BuildSimpleCurves(); + + Workspace.RecordEvent("Keyframe deletion"); + } + + public float GetStageTickPercentage() + { + return (float)(Workspace.StageTick % duration) / duration; + } + + // Pre-save / post-load + public void OnPreSave() + { + foreach (ActorAddon addon in Addons) + { + if (addon.Render) + { addons.Add(addon); } + } + } + + public void OnPostLoad() + { + Addons = addons.Copy(); + + foreach (PawnKeyframe keyframe in Keyframes) + { + keyframe.OnPostLoad(); + } + + AddActorAddon("left hand", 0.667f); + AddActorAddon("right hand", 0.667f); + AddActorAddon("dildo"); + } + } +} diff --git a/Assets/Scripts/AnimationComponents/AnimationClips/PawnAnimationClip.cs.meta b/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs.meta similarity index 83% rename from Assets/Scripts/AnimationComponents/AnimationClips/PawnAnimationClip.cs.meta rename to Assets/Scripts/AnimationComponents/PawnAnimationClip.cs.meta index c587e583..cdd63f55 100644 --- a/Assets/Scripts/AnimationComponents/AnimationClips/PawnAnimationClip.cs.meta +++ b/Assets/Scripts/AnimationComponents/PawnAnimationClip.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b7f2dc95148378445919ef3ed8705c5d +guid: bd5a477338567fb4cbb26b913a52ca65 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/AnimationComponents/PawnKeyframe.cs b/Assets/Scripts/AnimationComponents/PawnKeyframe.cs new file mode 100644 index 00000000..67775372 --- /dev/null +++ b/Assets/Scripts/AnimationComponents/PawnKeyframe.cs @@ -0,0 +1,177 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml; +using System.Xml.Serialization; +using UnityEngine; +using UnityEngine.UI; + +namespace RimWorldAnimationStudio +{ + public class PawnKeyframe + { + // Data to/from animationDef + public float? bodyAngle; + public float? headAngle; + public float? headBob; + public float? bodyOffsetX; + public float? bodyOffsetZ; + public int? headFacing; + public int? bodyFacing; + public float? genitalAngle; + public bool? quiver; + public int? tickDuration; + public string soundEffect; + public List tags; + [XmlArray("addonKeyframes"), XmlArrayItem("li")] public List addonKeyframes; + + // Data serialization control + public bool ShouldSerializebodyAngle() { return bodyAngle.HasValue && bodyAngle.Value != 0f; } + public bool ShouldSerializeheadAngle() { return headAngle.HasValue && headAngle.Value != 0f; } + public bool ShouldSerializeheadBob() { return headBob.HasValue && headBob.Value != 0f; } + public bool ShouldSerializebodyOffsetX() { return bodyOffsetX.HasValue && bodyOffsetX.Value != 0f; } + public bool ShouldSerializebodyOffsetZ() { return bodyOffsetZ.HasValue && bodyOffsetZ.Value != 0f; } + public bool ShouldSerializegenitalAngle() { return genitalAngle.HasValue && genitalAngle.Value != 0f; } + public bool ShouldSerializequiver() { return quiver == true; } + public bool ShouldSerializetags() { return tags.NotNullOrEmpty(); } + public bool ShouldSerializeaddonKeyframes() { return addonKeyframes.NotNullOrEmpty(); } + + // Data helper functions + [XmlIgnore] public float BodyAngle + { + get { return bodyAngle.HasValue ? bodyAngle.Value : 0f; } + set { bodyAngle = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public float HeadAngle + { + get { return headAngle.HasValue ? headAngle.Value : (float)(headAngle = 0f); } + set { headAngle = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public float HeadBob + { + get { return headBob.HasValue ? headBob.Value : (float)(headBob = 0f); } + set { headBob = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public float BodyOffsetX + { + get { return bodyOffsetX.HasValue ? bodyOffsetX.Value : (float)(bodyOffsetX = 0f); } + set { bodyOffsetX = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public float BodyOffsetZ + { + get { return bodyOffsetZ.HasValue ? bodyOffsetZ.Value : (float)(bodyOffsetZ = 0f); } + set { bodyOffsetZ = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public int HeadFacing + { + get { return headFacing.HasValue ? headFacing.Value : (int)(headFacing = 2); } + set { headFacing = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public int BodyFacing + { + get { return bodyFacing.HasValue ? bodyFacing.Value : (int)(bodyFacing = 2); } + set { bodyFacing = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public float GenitalAngle + { + get { return genitalAngle.HasValue ? genitalAngle.Value : (float)(genitalAngle = 0f); } + set { genitalAngle = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public bool Quiver + { + get { return quiver == true; } + set { quiver = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public int TickDuration + { + get { return tickDuration.HasValue ? tickDuration.Value : (int)(tickDuration = 0); } + set { tickDuration = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public string SoundEffect + { + get { return soundEffect; } + set { soundEffect = value; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public List Tags + { + get { return tags.NullOrEmpty() ? tags = new List() : tags; } + set { tags = value.NotNullOrEmpty() ? value : null; EventsManager.OnPawnKeyframeChanged(this); } + } + + [XmlIgnore] public List AddonKeyframes + { + get { return addonKeyframes.NullOrEmpty() ? addonKeyframes = new List() : addonKeyframes; } + set { addonKeyframes = value.NotNullOrEmpty()? value : null; EventsManager.OnPawnKeyframeChanged(this); } + } + + // Local data + [XmlIgnore] public int keyframeID; + [XmlIgnore] public int actorID = -1; + [XmlIgnore] public int? atTick; + + // Methods + public void GenerateKeyframeID(int actorID) + { + this.actorID = actorID; + int _keyframeID = UnityEngine.Random.Range(100000, 1000000); + + if (Workspace.animationDef.AnimationStages.Any(x => x.AnimationClips.Any(y => y.Keyframes.Any(z => z.keyframeID == _keyframeID)))) + { + GenerateKeyframeID(actorID); + return; + } + + keyframeID = _keyframeID; + } + + public bool HasValidKeyframeID() + { return keyframeID >= 100000 && keyframeID < 1000000; } + + public KeyframeSlider GetKeyframeSlider() + { + return Selectable.allSelectablesArray.FirstOrDefault(x => x.GetComponent()?.keyframeID == keyframeID)?.GetComponent< KeyframeSlider>(); + } + + public AddonKeyframe GetAddonKeyframe(string addonName) + { + return AddonKeyframes.FirstOrDefault(x => x.AddonName == addonName); + } + + // Pre-save / post-load + public void OnPreSave() + { + SoundEffect = DefaultTags.soundDefs.Concat(CustomTags.soundDefs).Contains(SoundEffect) ? SoundEffect : null; + + addonKeyframes.Clear(); + + foreach (AddonKeyframe addonKeyframe in AddonKeyframes) + { + ActorAddon addon = Workspace.GetAnimationClipThatOwnsKeyframe(keyframeID, out int clipID).GetActorAddon(addonKeyframe.AddonName); + + if (addon.Render) + { addonKeyframes.Add(addonKeyframe.Copy()); } + } + } + + public void OnPostLoad() + { + AddonKeyframes.Clear(); + + foreach (AddonKeyframe addonKeyframe in addonKeyframes) + { + AddonKeyframes.Add(addonKeyframe.Copy()); + } + } + } +} diff --git a/Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs.meta b/Assets/Scripts/AnimationComponents/PawnKeyframe.cs.meta similarity index 83% rename from Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs.meta rename to Assets/Scripts/AnimationComponents/PawnKeyframe.cs.meta index 1b4d03bb..7b554405 100644 --- a/Assets/Scripts/AnimationComponents/KeyFrames/PawnKeyframe.cs.meta +++ b/Assets/Scripts/AnimationComponents/PawnKeyframe.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: fe4a7d5f472a25945bac2d1892a4e2fa +guid: c8ced38490f6b174984453dc3336a543 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/AnimationComponents/AlienRaceDef.cs b/Assets/Scripts/AnimationComponents/PawnRaceDef.cs similarity index 97% rename from Assets/Scripts/AnimationComponents/AlienRaceDef.cs rename to Assets/Scripts/AnimationComponents/PawnRaceDef.cs index 4030d92a..2a25bf3b 100644 --- a/Assets/Scripts/AnimationComponents/AlienRaceDef.cs +++ b/Assets/Scripts/AnimationComponents/PawnRaceDef.cs @@ -9,8 +9,9 @@ using UnityEngine; namespace RimWorldAnimationStudio { [Serializable] - public class AlienRaceDef + public class PawnRaceDef { + // Local data public string defName; public bool isHumanoid = true; public float scale = 1f; @@ -18,13 +19,15 @@ namespace RimWorldAnimationStudio public List bodyTypeGraphics = new List(); public MultiDirectionalGraphic headGraphics = new MultiDirectionalGraphic(); - public AlienRaceDef() { } + // Constructors + public PawnRaceDef() { } - public AlienRaceDef(string defName) + public PawnRaceDef(string defName) { this.defName = defName; } + // Methods public Sprite GetHeadGraphic(CardinalDirection facing) { if (HasValidHeadGraphicPath(facing) == false) diff --git a/Assets/Scripts/AnimationComponents/AnimationClips/ThingAnimationClip.cs.meta b/Assets/Scripts/AnimationComponents/PawnRaceDef.cs.meta similarity index 83% rename from Assets/Scripts/AnimationComponents/AnimationClips/ThingAnimationClip.cs.meta rename to Assets/Scripts/AnimationComponents/PawnRaceDef.cs.meta index b12b97bf..047067d0 100644 --- a/Assets/Scripts/AnimationComponents/AnimationClips/ThingAnimationClip.cs.meta +++ b/Assets/Scripts/AnimationComponents/PawnRaceDef.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c4a44c0d3b9937c48b2ae8501126227e +guid: 187aef38ea296184b93265071536969c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/AnimationComponents/AlienRaceOffset.cs b/Assets/Scripts/AnimationComponents/PawnRaceOffset.cs similarity index 85% rename from Assets/Scripts/AnimationComponents/AlienRaceOffset.cs rename to Assets/Scripts/AnimationComponents/PawnRaceOffset.cs index 7b1e2356..8e9c84be 100644 --- a/Assets/Scripts/AnimationComponents/AlienRaceOffset.cs +++ b/Assets/Scripts/AnimationComponents/PawnRaceOffset.cs @@ -5,21 +5,25 @@ using UnityEngine; namespace RimWorldAnimationStudio { [Serializable] - public class AlienRaceOffset + public class PawnRaceOffset { + // Local data public string defName = "Human"; public string offset = "(0, 0)"; + // SHoulda serialize public bool ShouldSerializedefName() { return OffsetIsZero() == false; } public bool ShouldSerializeoffset() { return OffsetIsZero() == false; } - public AlienRaceOffset() { } + // Constructors + public PawnRaceOffset() { } - public AlienRaceOffset(string defName) + public PawnRaceOffset(string defName) { this.defName = defName; } + // Methods public void SetOffset(Vector2 raceOffset) { offset = "(" + raceOffset.x + ", " + raceOffset.y + ")"; diff --git a/Assets/Scripts/AnimationComponents/AlienRaceDef.cs.meta b/Assets/Scripts/AnimationComponents/PawnRaceOffset.cs.meta similarity index 83% rename from Assets/Scripts/AnimationComponents/AlienRaceDef.cs.meta rename to Assets/Scripts/AnimationComponents/PawnRaceOffset.cs.meta index 9c11ddbe..b2fea88a 100644 --- a/Assets/Scripts/AnimationComponents/AlienRaceDef.cs.meta +++ b/Assets/Scripts/AnimationComponents/PawnRaceOffset.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5b8a2db320a85494c882518c143b73f7 +guid: 24eafaf092974414ca90bfd4a8d2e4ba MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/Math/Constants.meta b/Assets/Scripts/Data.meta similarity index 100% rename from Assets/Scripts/Math/Constants.meta rename to Assets/Scripts/Data.meta diff --git a/Assets/Scripts/Data/Constants.cs b/Assets/Scripts/Data/Constants.cs new file mode 100644 index 00000000..1a24cdb0 --- /dev/null +++ b/Assets/Scripts/Data/Constants.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using System.Linq; +using System.Xml.Serialization; +using UnityEngine; + +namespace RimWorldAnimationStudio +{ + public static class Constants + { + // Project data + public static string currentVersion = "0.0.0"; + public static string projectHome = "https://gitgud.io/AbstractConcept/rimworld-animation-studio"; + public static string projectWiki = "https://gitgud.io/AbstractConcept/rimworld-animation-studio/-/wikis/home"; + + // Actions + public static float actionRepeatSpeed = 0.250f; + + // Animation defaults + public static int defaultAnimationClipLength = 600; + public static int minTick = 1; + public static int minAnimationClipLength = 5; + public static int maxAnimationClipLength = 9999; + + // Colors used + public static Color ColorWhite = new Color(1f, 1f, 1f); + public static Color ColorGreen = new Color(0f, 1f, 0f); + public static Color ColorGoldYellow = new Color(1f, 0.85f, 0f); + public static Color ColorDarkGold = new Color(0.75f, 0.64f, 0f); + public static Color ColorLightGrey = new Color(0.9f, 0.9f, 0.9f); + public static Color ColorMidGrey = new Color(0.75f, 0.75f, 0.75f); + public static Color ColorGrey = new Color(0.5f, 0.5f, 0.5f); + public static Color ColorDarkGrey = new Color(0.2f, 0.2f, 0.2f); + public static Color ColorPink = new Color(1.0f, 0.5f, 0.5f); + public static Color ColorOrange = new Color(1.0f, 0.7f, 0.0f); + public static Color ColorRichOrange = new Color(1.0f, 0.4f, 0.1f); + public static Color ColorCyan = new Color(0.0f, 1.0f, 1.0f); + public static Color ColorPurple = new Color(0.85f, 0.0f, 1.0f); + public static Color ColorGhost = new Color(0.5f, 0f, 0f, 0.5f); + public static Color ColorRed = new Color(0.9f, 0f, 0f); + } +} diff --git a/Assets/Scripts/Math/Constants/Constants.cs.meta b/Assets/Scripts/Data/Constants.cs.meta similarity index 100% rename from Assets/Scripts/Math/Constants/Constants.cs.meta rename to Assets/Scripts/Data/Constants.cs.meta diff --git a/Assets/Scripts/Math/Constants/Constants.cs b/Assets/Scripts/Data/DefaultTags.cs similarity index 58% rename from Assets/Scripts/Math/Constants/Constants.cs rename to Assets/Scripts/Data/DefaultTags.cs index c8e2e005..fc85e6be 100644 --- a/Assets/Scripts/Math/Constants/Constants.cs +++ b/Assets/Scripts/Data/DefaultTags.cs @@ -1,43 +1,15 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Text; +using System.Threading.Tasks; using System.Xml.Serialization; -using UnityEngine; namespace RimWorldAnimationStudio { - public static class Constants + public static class DefaultTags { - public static string currentVersion = "0.0.0"; - public static string projectHome = "https://gitgud.io/AbstractConcept/rimworld-animation-studio"; - public static string projectWiki = "https://gitgud.io/AbstractConcept/rimworld-animation-studio/-/wikis/home"; - - public static float actionRepeatSpeed = 0.250f; - - public static int defaultAnimationClipLength = 600; - public static int minTick = 1; - public static int minAnimationClipLength = 5; - public static int maxAnimationClipLength = 9999; - - public static Color ColorWhite = new Color(1f, 1f, 1f); - public static Color ColorGreen = new Color(0f, 1f, 0f); - public static Color ColorGoldYellow = new Color(1f, 0.85f, 0f); - public static Color ColorDarkGold = new Color(0.75f, 0.64f, 0f); - public static Color ColorLightGrey = new Color(0.9f, 0.9f, 0.9f); - public static Color ColorMidGrey = new Color(0.75f, 0.75f, 0.75f); - public static Color ColorGrey = new Color(0.5f, 0.5f, 0.5f); - public static Color ColorDarkGrey = new Color(0.2f, 0.2f, 0.2f); - public static Color ColorPink = new Color(1.0f, 0.5f, 0.5f); - public static Color ColorOrange = new Color(1.0f, 0.7f, 0.0f); - public static Color ColorRichOrange = new Color(1.0f, 0.4f, 0.1f); - public static Color ColorCyan = new Color(0.0f, 1.0f, 1.0f); - public static Color ColorPurple = new Color(0.85f, 0.0f, 1.0f); - public static Color ColorGhost = new Color(0.5f, 0f, 0f, 0.5f); - public static Color ColorRed = new Color(0.9f, 0f, 0f); - } - - public static class Tags - { - public static List defNames = new List() { "Human", "Wolf_Timber", "Horse"}; + public static List defNames = new List() { "Human", "Wolf_Timber", "Horse" }; public static List bodyParts = new List() { "Penis", "Vagina", "Anus", "Breasts", "Mouth" }; public static List bodyDefTypes = new List() { "Human", "Bird", "BeetleLike", "BeetleLikeWithClaw", "MechanicalCentipede", "MechanicalTermite", "Lancer", "Pikeman", "Monkey", "QuadrupedAnimalWithClawsTailAndJowl", "QuadrupedAnimalWithHooves", "QuadrupedAnimalWithHoovesAndHorn", "QuadrupedAnimalWithHoovesAndHump", "QuadrupedAnimalWithHoovesAndTusks", "QuadrupedAnimalWithHoovesTusksAndTrunk", "QuadrupedAnimalWithPaws", "QuadrupedAnimalWithPawsAndTail", "Scyther", "Snake", "TurtleLike" }; public static List sexTypes = new List() { "None", "Vaginal", "Anal", "Oral", "Masturbation", "DoublePenetration", "Boobjob", "Handjob", "Footjob", "Fingering", "Scissoring", "MutualMasturbation", "Fisting", "MechImplant", "Rimming", "Fellatio", "Cunnilingus", "Sixtynine" }; @@ -65,53 +37,8 @@ namespace RimWorldAnimationStudio [XmlArray("bodyParts"), XmlArrayItem("li")] public List bodyParts = new List(); [XmlArray("bodyDefTypes"), XmlArrayItem("li")] public List bodyDefTypes = new List(); [XmlArray("sexTypes"), XmlArrayItem("li")] public List sexTypes = new List(); - [XmlArray("interactionDefTypes"), XmlArrayItem("li")] public List interactionDefTypes = new List(); + [XmlArray("interactionDefTypes"), XmlArrayItem("li")] public List interactionDefTypes = new List(); [XmlArray("soundDefs"), XmlArrayItem("li")] public List soundDefs = new List(); [XmlArray("bodyTypes"), XmlArrayItem("li")] public static List bodyTypes = new List(); } - - public static class AlienRaceDefs - { - public static List allDefs = new List(); - - public static AlienRaceDef GetNamed(string alienRaceDef) - { - return allDefs.FirstOrDefault(x => x.defName == alienRaceDef); - } - - public static void AddDef(AlienRaceDef alienRaceDef) - { - if (allDefs.Any(x => x.defName == alienRaceDef.defName)) return; - - allDefs.Add(alienRaceDef); - } - - public static void OnLoad() - { - List allTags = Tags.bodyTypes.Concat(CustomTags.bodyTypes).ToList(); - allTags.Add("None"); - - List facings = new List() { CardinalDirection.North, CardinalDirection.East, CardinalDirection.South }; - string path; - - foreach (AlienRaceDef alienRaceDef in allDefs) - { - foreach (CardinalDirection facing in facings) - { - foreach (string bodyType in allTags) - { - path = alienRaceDef.GetBodyTypeGraphicPath(facing, bodyType); - - if (path != null && path != "") - { alienRaceDef.SetBodyTypeGraphicPath(path, facing, bodyType); } - } - - path = alienRaceDef.GetHeadGraphicPath(facing); - - if (path != null && path != "") - { alienRaceDef.SetHeadGraphicPath(path, facing); } - } - } - } - } } diff --git a/Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs.meta b/Assets/Scripts/Data/DefaultTags.cs.meta similarity index 83% rename from Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs.meta rename to Assets/Scripts/Data/DefaultTags.cs.meta index 11fd14d8..e5b4d31d 100644 --- a/Assets/Scripts/AnimationComponents/AnimationClips/AnimationClip.cs.meta +++ b/Assets/Scripts/Data/DefaultTags.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: aeb406e171f70f14f88980439239ca59 +guid: d2a4f1a7ea83f0544a350664fba7fc49 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/Math/Constants/Enums.cs b/Assets/Scripts/Data/Enums.cs similarity index 100% rename from Assets/Scripts/Math/Constants/Enums.cs rename to Assets/Scripts/Data/Enums.cs diff --git a/Assets/Scripts/Math/Constants/Enums.cs.meta b/Assets/Scripts/Data/Enums.cs.meta similarity index 100% rename from Assets/Scripts/Math/Constants/Enums.cs.meta rename to Assets/Scripts/Data/Enums.cs.meta diff --git a/Assets/Scripts/AnimationComponents/KeyFrames.meta b/Assets/Scripts/DefParents.meta similarity index 77% rename from Assets/Scripts/AnimationComponents/KeyFrames.meta rename to Assets/Scripts/DefParents.meta index b611c385..00fcefdf 100644 --- a/Assets/Scripts/AnimationComponents/KeyFrames.meta +++ b/Assets/Scripts/DefParents.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d3f1c8d8d1b51a147b17f5510eebb2cf +guid: c9a9e093aedeac24687d421f33a98e94 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Scripts/AnimationComponents/Defs.cs b/Assets/Scripts/DefParents/AnimationDefs.cs similarity index 63% rename from Assets/Scripts/AnimationComponents/Defs.cs rename to Assets/Scripts/DefParents/AnimationDefs.cs index 9290f8b8..11fc56a3 100644 --- a/Assets/Scripts/AnimationComponents/Defs.cs +++ b/Assets/Scripts/DefParents/AnimationDefs.cs @@ -1,11 +1,14 @@ -using System.Collections.Generic; -using System.Xml; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; using System.Xml.Serialization; namespace RimWorldAnimationStudio { [XmlRoot("Defs", IsNullable = false)] - public class Defs + public class AnimationDefs { [XmlElement("Rimworld_Animations.AnimationDef")] public List animationDefs = new List(); diff --git a/Assets/Scripts/AnimationComponents/AlienRaceOffset.cs.meta b/Assets/Scripts/DefParents/AnimationDefs.cs.meta similarity index 83% rename from Assets/Scripts/AnimationComponents/AlienRaceOffset.cs.meta rename to Assets/Scripts/DefParents/AnimationDefs.cs.meta index 4bc87d8a..d44cb738 100644 --- a/Assets/Scripts/AnimationComponents/AlienRaceOffset.cs.meta +++ b/Assets/Scripts/DefParents/AnimationDefs.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a3449cf2dd7e0444bbc5a7b654cf10c5 +guid: 6e65e28553800cf489ca2b0bc7e37408 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/DefParents/PawnRaceDefs.cs b/Assets/Scripts/DefParents/PawnRaceDefs.cs new file mode 100644 index 00000000..674ca3b7 --- /dev/null +++ b/Assets/Scripts/DefParents/PawnRaceDefs.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RimWorldAnimationStudio +{ + public static class PawnRaceDefs + { + public static List allDefs = new List(); + + public static PawnRaceDef GetNamed(string pawnRaceDef) + { + return allDefs.FirstOrDefault(x => x.defName == pawnRaceDef); + } + + public static void AddDef(PawnRaceDef pawnRaceDef) + { + if (allDefs.Any(x => x.defName == pawnRaceDef.defName)) return; + + allDefs.Add(pawnRaceDef); + } + + public static void OnLoad() + { + List allTags = DefaultTags.bodyTypes.Concat(CustomTags.bodyTypes).ToList(); + allTags.Add("None"); + + List facings = new List() { CardinalDirection.North, CardinalDirection.East, CardinalDirection.South }; + string path; + + foreach (PawnRaceDef pawnRaceDef in allDefs) + { + foreach (CardinalDirection facing in facings) + { + foreach (string bodyType in allTags) + { + path = pawnRaceDef.GetBodyTypeGraphicPath(facing, bodyType); + + if (string.IsNullOrEmpty(path) == false) + { pawnRaceDef.SetBodyTypeGraphicPath(path, facing, bodyType); } + } + + path = pawnRaceDef.GetHeadGraphicPath(facing); + + if (string.IsNullOrEmpty(path) == false) + { pawnRaceDef.SetHeadGraphicPath(path, facing); } + } + } + } + } +} diff --git a/Assets/Scripts/DefParents/PawnRaceDefs.cs.meta b/Assets/Scripts/DefParents/PawnRaceDefs.cs.meta new file mode 100644 index 00000000..43eeef9f --- /dev/null +++ b/Assets/Scripts/DefParents/PawnRaceDefs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 53e7f97b4bb5a3441884e4795d7e9391 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/ActorCard.cs b/Assets/Scripts/GUI/ActorCard.cs deleted file mode 100644 index e8d428f2..00000000 --- a/Assets/Scripts/GUI/ActorCard.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; -using UnityEngine.UI; - -namespace RimWorldAnimationStudio -{ - public class ActorCard : MonoBehaviour - { - //public Dropdown genderDropdown; - public Dropdown bodyTypeDropdown; - public InputField bodyOffsetXField; - public InputField bodyOffsetZField; - public InputField raceOffsetXField; - public InputField raceOffsetZField; - public Toggle initiatorToggle; - public Dropdown selectActorLayerDropdown; - - public void Initialize() - { - Actor actor = Workspace.animationDef.actors[Workspace.actorID]; - string bodyType = bodyTypeDropdown.options[bodyTypeDropdown.value].text; - bodyType = bodyType == null || bodyType == "" ? "Male" : bodyType; - - initiatorToggle.isOn = actor.initiator; - bodyOffsetXField.text = actor.bodyTypeOffset.GetOffset(bodyType).x.ToString(); - bodyOffsetZField.text = actor.bodyTypeOffset.GetOffset(bodyType).z.ToString(); - } - - public void OnBodyTypeChanged() - { - if (Workspace.animationDef == null) return; - - Actor actor = Workspace.animationDef.actors[Workspace.actorID]; - - string bodyType = bodyTypeDropdown.options[bodyTypeDropdown.value].text; - bodyType = bodyType == null || bodyType == "" ? "Male" : bodyType; - - Workspace.animationDef.actors[Workspace.actorID].bodyType = bodyType; - - bodyOffsetXField.text = actor.bodyTypeOffset.GetOffset(bodyType).x.ToString(); - bodyOffsetZField.text = actor.bodyTypeOffset.GetOffset(bodyType).z.ToString(); - } - - public void OnValueChanged() - { - if (Workspace.animationDef == null) return; - - Actor actor = Workspace.animationDef.actors[Workspace.actorID]; - - string bodyType = bodyTypeDropdown.options[bodyTypeDropdown.value].text; - bodyType = bodyType == null || bodyType == "" ? "Male" : bodyType; - - float.TryParse(bodyOffsetXField.text, out float x); - float.TryParse(bodyOffsetZField.text, out float z); - actor.bodyTypeOffset.SetOffset(bodyType, new Vector2(x, z)); - - actor.initiator = initiatorToggle.isOn; - - //switch (genderDropdown.value) - //{ - // case 0: actor.requiredGender = new List() { "Female" }; break; - // case 2: actor.requiredGender = new List() { "Male" }; break; - // default: actor.requiredGender = null; break; - //} - - float.TryParse(raceOffsetXField.text, out x); - float.TryParse(raceOffsetZField.text, out z); - actor.SetAlienRaceOffset(new Vector2(x, z)); - - Workspace.Instance.RecordEvent("Actor body offset data"); - } - - public void OnActorLayerChange() - { - PawnAnimationClip clip = Workspace.Instance.GetCurrentPawnAnimationClip(); - - if (clip == null) return; - clip.layer = selectActorLayerDropdown.captionText.text; - - Workspace.Instance.RecordEvent("Actor render layer " + clip.layer); - } - - public void Update() - { - if (Workspace.animationDef == null) return; - - if (Workspace.actorID >= AnimationController.Instance.actorBodies.GetComponentsInChildren().Count()) - { Debug.Log("Waiting for actors to initialize..."); return; } - - Actor actor = Workspace.animationDef.actors[Workspace.actorID]; - ActorBody actorBody = AnimationController.Instance.actorBodies.GetComponentsInChildren()[Workspace.actorID]; - PawnAnimationClip clip = Workspace.Instance.GetCurrentPawnAnimationClip(); - - string bodyType = actor.bodyType; - bodyType = bodyType == null || bodyType == "" ? "Male" : bodyType; - - bodyTypeDropdown.value = bodyTypeDropdown.options.IndexOf(bodyTypeDropdown.options.First(x => x.text == bodyType)); - - if (bodyOffsetXField.isFocused == false) - { bodyOffsetXField.text = actor.bodyTypeOffset.GetOffset(bodyType).x.ToString(); } - - if (bodyOffsetZField.isFocused == false) - { bodyOffsetZField.text = actor.bodyTypeOffset.GetOffset(bodyType).z.ToString(); } - - bodyTypeDropdown.interactable = actor.GetAlienRaceDef().isHumanoid; - bodyOffsetXField.interactable = actor.GetAlienRaceDef().isHumanoid; - bodyOffsetZField.interactable = actor.GetAlienRaceDef().isHumanoid; - - if (raceOffsetXField.isFocused == false) - { raceOffsetXField.text = actor.GetAlienRaceOffset().x.ToString(); } - - if (raceOffsetZField.isFocused == false) - { raceOffsetZField.text = actor.GetAlienRaceOffset().z.ToString(); } - - initiatorToggle.isOn = actor.initiator; - - //if (actor.requiredGender.NotNullOrEmpty() && actor.requiredGender.Contains("Female")) - //{ genderDropdown.SetValueWithoutNotify(0); } - - //else if (actor.requiredGender.NotNullOrEmpty() && actor.requiredGender.Contains("Male")) - //{ genderDropdown.SetValueWithoutNotify(2); } - - //else - //{ genderDropdown.SetValueWithoutNotify(1); } - - for (int i = 0; i < selectActorLayerDropdown.options.Count; i++) - { - if (selectActorLayerDropdown.options[i].text == clip.layer) - { selectActorLayerDropdown.SetValueWithoutNotify(i); } - } - } - } -} diff --git a/Assets/Scripts/GUI/Actors.meta b/Assets/Scripts/GUI/Actors.meta new file mode 100644 index 00000000..a01a24d0 --- /dev/null +++ b/Assets/Scripts/GUI/Actors.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f3c96477ef8cc42468ea6a39764a2e81 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/ActorBody.cs b/Assets/Scripts/GUI/Actors/ActorBody.cs similarity index 67% rename from Assets/Scripts/GUI/ActorBody.cs rename to Assets/Scripts/GUI/Actors/ActorBody.cs index 50c45693..1eb6558e 100644 --- a/Assets/Scripts/GUI/ActorBody.cs +++ b/Assets/Scripts/GUI/Actors/ActorBody.cs @@ -26,20 +26,17 @@ namespace RimWorldAnimationStudio public void Update() { - if (Workspace.actorID == actorID && Workspace.selectedBodyPart == null) + if (Workspace.ActorID == actorID && Workspace.selectedBodyPart == null) { bodyRenderer.color = Constants.ColorGreen; } else { bodyRenderer.color = Constants.ColorWhite; } - foreach (ActorAddon addon in Workspace.animationDef.animationStages[Workspace.stageID].animationClips[actorID].addons) + foreach (ActorAddon addon in Workspace.GetCurrentAnimationStage().AnimationClips[actorID].Addons) { - ActorBodyPart bodyPart = GetComponentsInChildren(true).FirstOrDefault(x => x.addonName == addon.addonName); - bodyPart?.gameObject?.SetActive(addon.render); + ActorBodyPart bodyPart = GetComponentsInChildren(true).FirstOrDefault(x => x.addonName == addon.AddonName); + bodyPart?.gameObject?.SetActive(addon.Render); } - - //headRenderer.gameObject.SetActive(Workspace.animationDef.actors[actorID].GetAlienRaceDef().isHumanoid); - //appendageRenderer.gameObject.SetActive(Workspace.animationDef.actors[actorID].requiredGenitals.Any(x => x == "Penis") || Workspace.animationDef.actors[actorID].isFucking); } public void OnPointerClick(PointerEventData eventData) @@ -54,7 +51,7 @@ namespace RimWorldAnimationStudio { Activate(); - PawnKeyframe keyframe = Workspace.Instance.GetCurrentPawnKeyframe(true); + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); if (keyframe == null) { Debug.LogWarning("Cannot alter actor - no keyframe data available"); return; } @@ -66,14 +63,14 @@ namespace RimWorldAnimationStudio if (Workspace.actorManipulationMode == ActorManipulationMode.Pan) { - keyframe.bodyOffsetX = mousePosition.x - delta.x - Workspace.animationDef.actors[actorID].GetFinalTransformOffset().x; - keyframe.bodyOffsetZ = mousePosition.y - delta.y - Workspace.animationDef.actors[actorID].GetFinalTransformOffset().y; + keyframe.BodyOffsetX = mousePosition.x - delta.x - Workspace.animationDef.Actors[actorID].GetFinalTransformOffset().x; + keyframe.BodyOffsetZ = mousePosition.y - delta.y - Workspace.animationDef.Actors[actorID].GetFinalTransformOffset().y; } else if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) { float angle = -Vector2.SignedAngle(Vector2.down, (Vector2)mousePosition - (Vector2)transform.position); - keyframe.bodyAngle = angle; + keyframe.BodyAngle = angle; } else if (Workspace.actorManipulationMode == ActorManipulationMode.Face) @@ -82,22 +79,22 @@ namespace RimWorldAnimationStudio int facing = -Mathf.RoundToInt(angle / 90f ); facing = facing < 0 ? facing + 4 : facing; - keyframe.bodyFacing = facing; + keyframe.BodyFacing = facing; } - PawnAnimationClip clip = Workspace.Instance.GetPawnAnimationClip(actorID); + PawnAnimationClip clip = Workspace.GetPawnAnimationClip(actorID); clip.BuildSimpleCurves(); } public void OnEndDrag(PointerEventData eventData) { - Workspace.Instance.RecordEvent("Actor position / orientation"); + Workspace.RecordEvent("Actor position / orientation"); delta = Vector3.zero; } public void Activate() { - Workspace.actorID = actorID; + Workspace.ActorID = actorID; Workspace.selectedBodyPart = null; } } diff --git a/Assets/Scripts/GUI/ActorBody.cs.meta b/Assets/Scripts/GUI/Actors/ActorBody.cs.meta similarity index 100% rename from Assets/Scripts/GUI/ActorBody.cs.meta rename to Assets/Scripts/GUI/Actors/ActorBody.cs.meta diff --git a/Assets/Scripts/GUI/ActorBodyPart.cs b/Assets/Scripts/GUI/Actors/ActorBodyPart.cs similarity index 78% rename from Assets/Scripts/GUI/ActorBodyPart.cs rename to Assets/Scripts/GUI/Actors/ActorBodyPart.cs index 78ebb299..11b57d55 100644 --- a/Assets/Scripts/GUI/ActorBodyPart.cs +++ b/Assets/Scripts/GUI/Actors/ActorBodyPart.cs @@ -16,9 +16,14 @@ namespace RimWorldAnimationStudio private Vector3 delta = new Vector3(); + public void Start() + { + //Workspace.onActorChanged.AddListener(delegate { }); + } + public void Update() { - if ((Workspace.actorID == parent.actorID && Workspace.selectedBodyPart == null) || Workspace.selectedBodyPart == this) + if ((Workspace.ActorID == parent.actorID && Workspace.selectedBodyPart == null) || Workspace.selectedBodyPart == this) { bodyPartRenderer.color = Constants.ColorGreen; } else @@ -37,7 +42,7 @@ namespace RimWorldAnimationStudio { Activate(); - PawnKeyframe keyframe = Workspace.Instance.GetCurrentPawnKeyframe(true); + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); if (keyframe == null) { Debug.LogWarning("Cannot alter actor - no keyframe data available"); return; } @@ -50,19 +55,19 @@ namespace RimWorldAnimationStudio if (addonName != null && addonName != "") { AddonKeyframe addonKeyframe = keyframe.GetAddonKeyframe(addonName); - ActorAddon addon = Workspace.Instance.GetCurrentPawnAnimationClip().GetActorAddon(addonName); + ActorAddon addon = Workspace.GetCurrentPawnAnimationClip().GetActorAddon(addonName); if (Workspace.actorManipulationMode == ActorManipulationMode.Pan) { Vector3 anchor; - ActorBody anchoringActorBody = AnimationController.Instance.actorBodies.GetComponentsInChildren()?.FirstOrDefault(x => x.actorID == addon.anchoringActor); + ActorBody anchoringActorBody = AnimationController.Instance.actorBodies.GetComponentsInChildren()?.FirstOrDefault(x => x.actorID == addon.AnchoringActor); Vector3 bodyPos = new Vector3(anchoringActorBody.transform.position.x, anchoringActorBody.transform.position.y, 0); - AlienRaceDef alienRaceDef = Workspace.animationDef.actors[addon.anchoringActor].GetAlienRaceDef(); - Actor anchoringActor = Workspace.animationDef.actors[addon.anchoringActor]; - int bodyFacing = (int)Workspace.animationDef.animationStages[Workspace.stageID].animationClips[addon.anchoringActor].BodyFacing.Evaluate((float)AnimationController.Instance.stageTick / Workspace.StageWindowSize); + PawnRaceDef pawnRaceDef = Workspace.animationDef.Actors[addon.AnchoringActor].GetPawnRaceDef(); + Actor anchoringActor = Workspace.animationDef.Actors[addon.AnchoringActor]; + int bodyFacing = (int)Workspace.GetCurrentAnimationStage().AnimationClips[addon.AnchoringActor].BodyFacing.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize); - switch (addon.anchorName) + switch (addon.AnchorName) { case "torso": anchor = bodyPos; break; case "head": anchor = new Vector3(anchoringActorBody.transform.Find("ActorHead").position.x, anchoringActorBody.transform.Find("ActorHead").position.y, 0); break; @@ -74,8 +79,8 @@ namespace RimWorldAnimationStudio transform.position = new Vector3(mousePosition.x, mousePosition.y, 0f); - addonKeyframe.posX = transform.position.x - anchor.x; - addonKeyframe.posZ = transform.position.y - anchor.y; + addonKeyframe.PosX = transform.position.x - anchor.x; + addonKeyframe.PosZ = transform.position.y - anchor.y; ActorKeyframeCard.Instance.transform.GetComponentsInChildren()?.FirstOrDefault(x => x.addonName == addonName)?.OnKeyframeValueChanged(); } @@ -83,7 +88,7 @@ namespace RimWorldAnimationStudio else if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) { float angle = -Vector2.SignedAngle(Vector2.down, (Vector2)mousePosition - (Vector2)transform.position); - addonKeyframe.rotation = angle; + addonKeyframe.Rotation = angle; } else if (Workspace.actorManipulationMode == ActorManipulationMode.Face) @@ -106,13 +111,13 @@ namespace RimWorldAnimationStudio Vector3 localPosB = transform.localPosition; transform.localPosition = localPosA; - keyframe.headBob += localPosB.y - localPosA.y; + keyframe.HeadBob += localPosB.y - localPosA.y; } else if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) { float angle = -Vector2.SignedAngle(Vector2.down, (Vector2)mousePosition - (Vector2)transform.position); - keyframe.headAngle = angle; + keyframe.HeadAngle = angle; } else if (Workspace.actorManipulationMode == ActorManipulationMode.Face) @@ -121,7 +126,7 @@ namespace RimWorldAnimationStudio int facing = -Mathf.RoundToInt(angle / 90f); facing = facing < 0 ? facing + 4 : facing; - keyframe.headFacing = facing; + keyframe.HeadFacing = facing; } } @@ -130,25 +135,25 @@ namespace RimWorldAnimationStudio if (Workspace.actorManipulationMode == ActorManipulationMode.Rotate) { float angle = -Vector2.SignedAngle(Vector2.up, (Vector2)mousePosition - (Vector2)transform.position); - keyframe.genitalAngle = angle; + keyframe.GenitalAngle = angle; - Workspace.animationDef.actors[Workspace.actorID].controlGenitalAngle = Workspace.animationDef.animationStages.Any(x => x.animationClips[Workspace.actorID].keyframes.Any(y => y.genitalAngle != 0)); + Workspace.GetCurrentActor().ControlGenitalAngle = Workspace.animationDef.AnimationStages.Any(x => x.AnimationClips[Workspace.ActorID].Keyframes.Any(y => y.GenitalAngle != 0)); } } - PawnAnimationClip clip = Workspace.Instance.GetPawnAnimationClip(parent.actorID); + PawnAnimationClip clip = Workspace.GetPawnAnimationClip(parent.actorID); clip.BuildSimpleCurves(); } public void OnEndDrag(PointerEventData eventData) { - Workspace.Instance.RecordEvent("Actor position / orientation"); + Workspace.RecordEvent("Actor position / orientation"); delta = Vector3.zero; } public void Activate() { - Workspace.actorID = parent.actorID; + Workspace.ActorID = parent.actorID; Workspace.selectedBodyPart = this; } } diff --git a/Assets/Scripts/GUI/ActorBodyPart.cs.meta b/Assets/Scripts/GUI/Actors/ActorBodyPart.cs.meta similarity index 100% rename from Assets/Scripts/GUI/ActorBodyPart.cs.meta rename to Assets/Scripts/GUI/Actors/ActorBodyPart.cs.meta diff --git a/Assets/Scripts/GUI/AddSoundDefButton.cs b/Assets/Scripts/GUI/AddSoundDefButton.cs index cb263f42..8911a2cb 100644 --- a/Assets/Scripts/GUI/AddSoundDefButton.cs +++ b/Assets/Scripts/GUI/AddSoundDefButton.cs @@ -16,10 +16,10 @@ namespace RimWorldAnimationStudio void Update() { - PawnKeyframe keyframe = Workspace.Instance.GetCurrentOrPreviousKeyframe(Workspace.actorID); + PawnKeyframe keyframe = Workspace.GetCurrentOrPreviousKeyframe(Workspace.ActorID); if (keyframe != null) - { text.text = keyframe.soundEffect == null || keyframe.soundEffect == "" ? "None" : keyframe.soundEffect; } + { text.text = keyframe.SoundEffect == null || keyframe.SoundEffect == "" ? "None" : keyframe.SoundEffect; } else { text.text = "None"; } diff --git a/Assets/Scripts/GUI/AnimationDefCard.cs b/Assets/Scripts/GUI/AnimationDefCard.cs deleted file mode 100644 index 018a2adb..00000000 --- a/Assets/Scripts/GUI/AnimationDefCard.cs +++ /dev/null @@ -1,39 +0,0 @@ -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 AnimationDefCard : MonoBehaviour - { - public InputField defNameField; - public InputField labelField; - //public Toggle playSoundsToggle; - - public void Update() - { - if (Workspace.animationDef == null) return; - - if (defNameField.isFocused == false) - { defNameField.text = Workspace.animationDef.defName; } - - if (labelField.isFocused == false) - { labelField.text = Workspace.animationDef.label; } - - //playSoundsToggle.isOn = Workspace.animationDef.sounds; - } - - public void UpdateAnimationDef() - { - Workspace.animationDef.defName = defNameField.text; - Workspace.animationDef.label = labelField.text; - //Workspace.animationDef.sounds = playSoundsToggle.isOn; - - Workspace.Instance.MakeHistoricRecord("AnimationDef update"); - } - } -} diff --git a/Assets/Scripts/GUI/AnimationTimeline.cs b/Assets/Scripts/GUI/AnimationTimeline.cs index 815244e4..b5724802 100644 --- a/Assets/Scripts/GUI/AnimationTimeline.cs +++ b/Assets/Scripts/GUI/AnimationTimeline.cs @@ -21,13 +21,13 @@ namespace RimWorldAnimationStudio anchorTransform = transform.parent; this.actorID = actorID; - PawnAnimationClip clip = Workspace.Instance.GetPawnAnimationClip(actorID); + PawnAnimationClip clip = Workspace.GetPawnAnimationClip(actorID); clip.BuildSimpleCurves(); foreach (KeyframeSlider slider in GetComponentsInChildren()) { RemovePawnKeyFrame(slider.keyframeID);} - foreach (PawnKeyframe keyframe in clip.keyframes) + foreach (PawnKeyframe keyframe in clip.Keyframes) { AddPawnKeyFrame(keyframe.keyframeID); } /*int keyframeCount = clip.keyframes.Count; @@ -66,7 +66,7 @@ namespace RimWorldAnimationStudio public void Update() { - if (Workspace.actorID == actorID) + if (Workspace.ActorID == actorID) { GetComponent().color = Constants.ColorGoldYellow; } else @@ -91,27 +91,27 @@ namespace RimWorldAnimationStudio public bool MoveAnimationTimeline(int startIndex, int delta) { - if (startIndex + delta < 0 || startIndex + delta >= Workspace.animationDef.animationStages[Workspace.stageID].animationClips.Count) + if (startIndex + delta < 0 || startIndex + delta >= Workspace.GetCurrentAnimationStage().AnimationClips.Count) { Debug.Log("Cannot move animation timeline - movement would exceed bounds"); return false; } - Actor actor = Workspace.animationDef.actors[startIndex]; - Workspace.animationDef.actors[startIndex] = Workspace.animationDef.actors[startIndex + delta]; - Workspace.animationDef.actors[startIndex + delta] = actor; + Actor actor = Workspace.animationDef.Actors[startIndex]; + Workspace.animationDef.Actors[startIndex] = Workspace.animationDef.Actors[startIndex + delta]; + Workspace.animationDef.Actors[startIndex + delta] = actor; - PawnAnimationClip clip = Workspace.Instance.GetPawnAnimationClip(startIndex); - Workspace.animationDef.animationStages[Workspace.stageID].animationClips[startIndex] = Workspace.animationDef.animationStages[Workspace.stageID].animationClips[startIndex + delta]; - Workspace.animationDef.animationStages[Workspace.stageID].animationClips[startIndex + delta] = clip; + PawnAnimationClip clip = Workspace.GetPawnAnimationClip(startIndex); + Workspace.GetCurrentAnimationStage().AnimationClips[startIndex] = Workspace.GetCurrentAnimationStage().AnimationClips[startIndex + delta]; + Workspace.GetCurrentAnimationStage().AnimationClips[startIndex + delta] = clip; - Workspace.actorID = startIndex + delta; + Workspace.ActorID = startIndex + delta; - Workspace.Instance.RecordEvent("Timeline move"); + Workspace.RecordEvent("Timeline move"); return true; } public void OnPointerClick(PointerEventData eventData) { - Workspace.actorID = actorID; + Workspace.ActorID = actorID; Workspace.keyframeID.Clear(); } } diff --git a/Assets/Scripts/GUI/Cards.meta b/Assets/Scripts/GUI/Cards.meta new file mode 100644 index 00000000..ea5d142e --- /dev/null +++ b/Assets/Scripts/GUI/Cards.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c026d569e32726d4eb8821db713d0aac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/ActorAddonCard.cs b/Assets/Scripts/GUI/Cards/ActorAddonCard.cs similarity index 61% rename from Assets/Scripts/GUI/ActorAddonCard.cs rename to Assets/Scripts/GUI/Cards/ActorAddonCard.cs index 86de0c02..84110297 100644 --- a/Assets/Scripts/GUI/ActorAddonCard.cs +++ b/Assets/Scripts/GUI/Cards/ActorAddonCard.cs @@ -27,25 +27,25 @@ namespace RimWorldAnimationStudio public void OnFieldValueChanged() { if (Workspace.animationDef == null) return; - PawnAnimationClip clip = Workspace.Instance.GetCurrentPawnAnimationClip(); - PawnKeyframe keyframe = Workspace.Instance.GetCurrentPawnKeyframe(true); + PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); - keyframe.GetAddonKeyframe(addonName).posX = float.Parse(xOffsetField.text); - keyframe.GetAddonKeyframe(addonName).posZ = float.Parse(zOffsetField.text); - keyframe.GetAddonKeyframe(addonName).rotation = float.Parse(rotationField.text); + keyframe.GetAddonKeyframe(addonName).PosX = float.Parse(xOffsetField.text); + keyframe.GetAddonKeyframe(addonName).PosZ = float.Parse(zOffsetField.text); + keyframe.GetAddonKeyframe(addonName).Rotation = float.Parse(rotationField.text); clip.BuildSimpleCurves(); - Workspace.Instance.RecordEvent("Actor addon position / orientation"); + Workspace.RecordEvent("Actor addon position / orientation"); } public void OnKeyframeValueChanged() { if (Workspace.animationDef == null) return; - PawnAnimationClip clip = Workspace.Instance.GetCurrentPawnAnimationClip(); + PawnAnimationClip clip = Workspace.GetCurrentPawnAnimationClip(); - xOffsetField.SetTextWithoutNotify(clip.GetActorAddon(addonName).PosX.Evaluate((float)AnimationController.Instance.stageTick / Workspace.StageWindowSize).ToString()); - zOffsetField.SetTextWithoutNotify(clip.GetActorAddon(addonName).PosZ.Evaluate((float)AnimationController.Instance.stageTick / Workspace.StageWindowSize).ToString()); - rotationField.SetTextWithoutNotify(clip.GetActorAddon(addonName).Rotation.Evaluate((float)AnimationController.Instance.stageTick / Workspace.StageWindowSize).ToString()); + xOffsetField.SetTextWithoutNotify(clip.GetActorAddon(addonName).PosX.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize).ToString()); + zOffsetField.SetTextWithoutNotify(clip.GetActorAddon(addonName).PosZ.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize).ToString()); + rotationField.SetTextWithoutNotify(clip.GetActorAddon(addonName).Rotation.Evaluate((float)Workspace.StageTick / Workspace.StageWindowSize).ToString()); } } } diff --git a/Assets/Scripts/GUI/ActorAddonCard.cs.meta b/Assets/Scripts/GUI/Cards/ActorAddonCard.cs.meta similarity index 100% rename from Assets/Scripts/GUI/ActorAddonCard.cs.meta rename to Assets/Scripts/GUI/Cards/ActorAddonCard.cs.meta diff --git a/Assets/Scripts/GUI/Cards/ActorCard.cs b/Assets/Scripts/GUI/Cards/ActorCard.cs new file mode 100644 index 00000000..211b9219 --- /dev/null +++ b/Assets/Scripts/GUI/Cards/ActorCard.cs @@ -0,0 +1,124 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.UI; + +namespace RimWorldAnimationStudio +{ + public class ActorCard : MonoBehaviour + { + public Toggle initiatorToggle; + public Dropdown selectActorLayerDropdown; + public Dropdown bodyTypeDropdown; + public InputField bodyOffsetXField; + public InputField bodyOffsetZField; + public Dropdown raceDropdown; + public InputField raceOffsetXField; + public InputField raceOffsetZField; + + private Actor actor { get { return Workspace.GetCurrentActor(); } } + private PawnAnimationClip clip { get { return Workspace.GetCurrentPawnAnimationClip(); } } + + public void Awake() + { + UpdateRaceDropdown(); + } + + public void Start() + { + // General events + EventsManager.onAnimationDefChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onActorIDChanged.AddListener(delegate { UpdateGUI(); }); + EventsManager.onDefNamesChanged.AddListener(delegate { UpdateRaceDropdown(); }); + + // Local events + initiatorToggle.onValueChanged.AddListener(delegate { + actor.initiator = initiatorToggle.isOn; + Workspace.RecordEvent("Change in actor sex initiator status "); + }); + + selectActorLayerDropdown.onValueChanged.AddListener(delegate { + clip.Layer = selectActorLayerDropdown.options[selectActorLayerDropdown.value].text; + Workspace.RecordEvent("Change in actor render layer"); + }); + + bodyTypeDropdown.onValueChanged.AddListener(delegate { OnDropdownChanged(); }); + bodyOffsetXField.onEndEdit.AddListener(delegate { OnInputFieldChanged(); }); + bodyOffsetZField.onEndEdit.AddListener(delegate { OnInputFieldChanged(); }); + + raceDropdown.onValueChanged.AddListener(delegate { OnDropdownChanged(); }); + raceOffsetXField.onEndEdit.AddListener(delegate { OnInputFieldChanged(); }); + raceOffsetZField.onEndEdit.AddListener(delegate { OnInputFieldChanged(); }); + + // Initialize + UpdateGUI(); + } + + public void OnInputFieldChanged() + { + string bodyType = bodyTypeDropdown.options[bodyTypeDropdown.value].text; + bodyType = string.IsNullOrEmpty(bodyType) ? "Male" : bodyType; + + float.TryParse(bodyOffsetXField.text, out float x); + float.TryParse(bodyOffsetZField.text, out float z); + actor.BodyTypeOffset.SetOffset(bodyType, new Vector2(x, z)); + + float.TryParse(raceOffsetXField.text, out x); + float.TryParse(raceOffsetZField.text, out z); + actor.SetPawnRaceOffset(new Vector2(x, z)); + + Workspace.RecordEvent("Actor offset"); + } + + public void OnDropdownChanged() + { + actor.bodyType = bodyTypeDropdown.options[bodyTypeDropdown.value].text; + + if (raceDropdown.options[raceDropdown.value].text != actor.GetPawnRaceDef().defName) + { Workspace.selectedBodyPart = null; } + + actor.SetPawnRaceDef(raceDropdown.options[raceDropdown.value].text); + + Workspace.RecordEvent("Actor body type/race change"); + + UpdateGUI(); + } + + public void UpdateRaceDropdown() + { + raceDropdown.ClearOptions(); + int index = raceDropdown.value; + + IEnumerable optionsList = DefaultTags.defNames.Concat(CustomTags.defNames); + foreach (string defName in optionsList) + { raceDropdown.options.Add(new Dropdown.OptionData(defName)); } + + raceDropdown.value = Mathf.Clamp(index, 0, raceDropdown.options.Count - 1); + } + + public void UpdateGUI() + { + initiatorToggle.isOn = actor.Initiator; + + string layer = clip.Layer; + selectActorLayerDropdown.SetValueWithoutNotify(selectActorLayerDropdown.options.FindIndex(x => x.text == layer)); + + string bodyType = actor.bodyType; + bodyTypeDropdown.SetValueWithoutNotify(bodyTypeDropdown.options.FindIndex(x => x.text == bodyType)); + + bodyOffsetXField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.BodyTypeOffset.GetOffset(bodyType).x.ToString())); + bodyOffsetZField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.BodyTypeOffset.GetOffset(bodyType).z.ToString())); + + bodyTypeDropdown.interactable = actor.GetPawnRaceDef().isHumanoid; + bodyOffsetXField.interactable = actor.GetPawnRaceDef().isHumanoid; + bodyOffsetZField.interactable = actor.GetPawnRaceDef().isHumanoid; + + string race = actor.GetPawnRaceDef().defName; + raceDropdown.SetValueWithoutNotify(raceDropdown.options.FindIndex(x => x.text == race)); + + raceOffsetXField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.GetPawnRaceOffset().x.ToString())); + raceOffsetZField.SetTextWithoutNotify(string.Format("{0:0.000}", actor.GetPawnRaceOffset().z.ToString())); + } + } +} diff --git a/Assets/Scripts/GUI/ActorCard.cs.meta b/Assets/Scripts/GUI/Cards/ActorCard.cs.meta similarity index 100% rename from Assets/Scripts/GUI/ActorCard.cs.meta rename to Assets/Scripts/GUI/Cards/ActorCard.cs.meta diff --git a/Assets/Scripts/GUI/ActorKeyframeCard.cs b/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs similarity index 56% rename from Assets/Scripts/GUI/ActorKeyframeCard.cs rename to Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs index ca3f3c08..98ff43f3 100644 --- a/Assets/Scripts/GUI/ActorKeyframeCard.cs +++ b/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs @@ -30,18 +30,18 @@ namespace RimWorldAnimationStudio public void OnValueChanged() { - PawnKeyframe keyframe = Workspace.Instance.GetCurrentPawnKeyframe(true); + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); - keyframe.bodyOffsetX = float.Parse(positionXField.text); - keyframe.bodyOffsetZ = float.Parse(positionZField.text); - keyframe.bodyAngle = float.Parse(rotationField.text); - keyframe.headBob = float.Parse(headBobField.text); - keyframe.headAngle = float.Parse(headRotationField.text); - keyframe.genitalAngle = float.Parse(appendageRotationField.text); + keyframe.BodyOffsetX = float.Parse(positionXField.text); + keyframe.BodyOffsetZ = float.Parse(positionZField.text); + keyframe.BodyAngle = float.Parse(rotationField.text); + keyframe.HeadBob = float.Parse(headBobField.text); + 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(); - Workspace.Instance.RecordEvent("Actor position / orientation"); + Workspace.animationDef.Actors[Workspace.ActorID].ControlGenitalAngle = keyframe.GenitalAngle != 0; + Workspace.GetPawnAnimationClip(Workspace.ActorID).BuildSimpleCurves(); + Workspace.RecordEvent("Actor position / orientation"); } public void AdjustActor(Vector2 deltaOffset) @@ -59,50 +59,50 @@ namespace RimWorldAnimationStudio public void MoveActor(Vector2 deltaOffset) { - PawnKeyframe keyframe = Workspace.Instance.GetCurrentPawnKeyframe(true); + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); if (Workspace.selectedBodyPart == null) { - keyframe.bodyOffsetX += deltaOffset.x; - keyframe.bodyOffsetZ += deltaOffset.y; + keyframe.BodyOffsetX += deltaOffset.x; + keyframe.BodyOffsetZ += deltaOffset.y; } else if (Workspace.selectedBodyPart.isHead) - { keyframe.headBob += deltaOffset.y; } + { keyframe.HeadBob += deltaOffset.y; } - Workspace.Instance.GetCurrentPawnAnimationClip().BuildSimpleCurves(); - Workspace.Instance.RecordEvent("Actor position / orientation"); + Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); + Workspace.RecordEvent("Actor position / orientation"); } public void RotateActor(float deltaAngle) { - PawnKeyframe keyframe = Workspace.Instance.GetCurrentPawnKeyframe(true); + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); if (Workspace.selectedBodyPart == null) - { keyframe.bodyAngle += deltaAngle; } + { keyframe.BodyAngle += deltaAngle; } else if (Workspace.selectedBodyPart.isHead) - { keyframe.headAngle += deltaAngle; } + { keyframe.HeadAngle += deltaAngle; } else - { keyframe.genitalAngle -= deltaAngle; } + { keyframe.GenitalAngle -= deltaAngle; } - Workspace.Instance.GetCurrentPawnAnimationClip().BuildSimpleCurves(); - Workspace.Instance.RecordEvent("Actor position / orientation"); + Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); + Workspace.RecordEvent("Actor position / orientation"); } public void FaceActor(int facing) { - PawnKeyframe keyframe = Workspace.Instance.GetCurrentPawnKeyframe(true); + PawnKeyframe keyframe = Workspace.GetCurrentPawnKeyframe(true); if (Workspace.selectedBodyPart == null) - { keyframe.bodyFacing = facing; } + { keyframe.BodyFacing = facing; } else if (Workspace.selectedBodyPart.isHead) - { keyframe.headFacing = facing; } + { keyframe.HeadFacing = facing; } - Workspace.Instance.GetCurrentPawnAnimationClip().BuildSimpleCurves(); - Workspace.Instance.RecordEvent("Actor position / orientation"); + Workspace.GetCurrentPawnAnimationClip().BuildSimpleCurves(); + Workspace.RecordEvent("Actor position / orientation"); } } } \ No newline at end of file diff --git a/Assets/Scripts/GUI/ActorKeyframeCard.cs.meta b/Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs.meta similarity index 100% rename from Assets/Scripts/GUI/ActorKeyframeCard.cs.meta rename to Assets/Scripts/GUI/Cards/ActorKeyframeCard.cs.meta diff --git a/Assets/Scripts/GUI/Cards/AnimationDefCard.cs b/Assets/Scripts/GUI/Cards/AnimationDefCard.cs new file mode 100644 index 00000000..015eb7b0 --- /dev/null +++ b/Assets/Scripts/GUI/Cards/AnimationDefCard.cs @@ -0,0 +1,39 @@ +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 AnimationDefCard : MonoBehaviour + { + public InputField defNameField; + public InputField labelField; + + public void Start() + { + EventsManager.onAnimationDefChanged.AddListener(delegate { UpdateInputFields(); }); + + defNameField.onEndEdit.AddListener(delegate { + Workspace.animationDef.DefName = defNameField.text; + Workspace.MakeHistoricRecord("AnimationDef update"); + }); + + labelField.onEndEdit.AddListener(delegate { + Workspace.animationDef.Label = labelField.text; + Workspace.MakeHistoricRecord("AnimationDef update"); + }); + + UpdateInputFields(); + } + + public void UpdateInputFields() + { + defNameField.SetTextWithoutNotify(Workspace.animationDef.DefName); + labelField.SetTextWithoutNotify(Workspace.animationDef.Label); + } + } +} diff --git a/Assets/Scripts/GUI/AnimationDefCard.cs.meta b/Assets/Scripts/GUI/Cards/AnimationDefCard.cs.meta similarity index 100% rename from Assets/Scripts/GUI/AnimationDefCard.cs.meta rename to Assets/Scripts/GUI/Cards/AnimationDefCard.cs.meta diff --git a/Assets/Scripts/GUI/Cards/StageCard.cs b/Assets/Scripts/GUI/Cards/StageCard.cs new file mode 100644 index 00000000..10bfe5d2 --- /dev/null +++ b/Assets/Scripts/GUI/Cards/StageCard.cs @@ -0,0 +1,63 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.EventSystems; + +namespace RimWorldAnimationStudio +{ + public class StageCard : MonoBehaviour, IPointerClickHandler + { + public Text stageName; + public InputField stageNameField; + public Image banner; + + public void OnNameChange() + { + stageName.text = stageNameField.text; + stageNameField.gameObject.SetActive(false); + + Workspace.GetCurrentAnimationStage().StageName = stageName.text; + Workspace.RecordEvent("Stage renamed"); + } + + public void OnMoveStage(int delta) + { + int siblingCount = transform.parent.childCount; + int index = Mathf.Clamp(transform.GetSiblingIndex() + delta, 0, siblingCount - 1); + + transform.SetSiblingIndex(index); + } + + public void Initialize(string stageName) + { + this.stageName.text = stageName; + } + + public void Update() + { + if (Workspace.StageID == transform.GetSiblingIndex()) + { banner.gameObject.SetActive(true); } + + else + { + banner.gameObject.SetActive(false); + stageNameField.gameObject.SetActive(false); + } + } + + public void OnPointerClick(PointerEventData eventData) + { + if (eventData.clickCount >= 2) + { + stageNameField.text = stageName.text; + stageNameField.gameObject.SetActive(true); + } + + if (Workspace.StageID != transform.GetSiblingIndex()) + { Workspace.RecordEvent("Stage selected"); } + + Workspace.StageID = transform.GetSiblingIndex(); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/GUI/StageCard.cs.meta b/Assets/Scripts/GUI/Cards/StageCard.cs.meta similarity index 100% rename from Assets/Scripts/GUI/StageCard.cs.meta rename to Assets/Scripts/GUI/Cards/StageCard.cs.meta diff --git a/Assets/Scripts/GUI/DialogBoxes/DialogBox.cs b/Assets/Scripts/GUI/DialogBoxes/DialogBox.cs index d627854c..b5afa00b 100644 --- a/Assets/Scripts/GUI/DialogBoxes/DialogBox.cs +++ b/Assets/Scripts/GUI/DialogBoxes/DialogBox.cs @@ -67,9 +67,9 @@ namespace RimWorldAnimationStudio if (field?.text == null || field.text == "") { return; } - AlienRaceDefs.AddDef(new AlienRaceDef(field.text)); + PawnRaceDefs.AddDef(new PawnRaceDef(field.text)); - ApplicationManager.Instance.SaveAlienRaceDefs(); + ApplicationManager.Instance.SavePawnRaceDefs(); Initialize(true); } diff --git a/Assets/Scripts/GUI/DialogBoxes/RaceSettingsDialog.cs b/Assets/Scripts/GUI/DialogBoxes/RaceSettingsDialog.cs index d1e50e8d..2c62131b 100644 --- a/Assets/Scripts/GUI/DialogBoxes/RaceSettingsDialog.cs +++ b/Assets/Scripts/GUI/DialogBoxes/RaceSettingsDialog.cs @@ -21,21 +21,21 @@ namespace RimWorldAnimationStudio { Reset(); - AlienRaceDef alienRaceDef = GetCurrentRaceDef(); - if (alienRaceDef == null) return; + PawnRaceDef pawnRaceDef = GetCurrentRaceDef(); + if (pawnRaceDef == null) return; - isHumanoidToggle.SetIsOnWithoutNotify(alienRaceDef.isHumanoid); + isHumanoidToggle.SetIsOnWithoutNotify(pawnRaceDef.isHumanoid); Text bodyGraphicsTitle = AddCloneObjectToParent(raceSettingsWindow, 2).GetComponent(); bodyGraphicsTitle.text = "Body graphic filepaths"; - List allTags = alienRaceDef.isHumanoid ? Tags.bodyTypes : new List() { "None" }; + List allTags = pawnRaceDef.isHumanoid ? DefaultTags.bodyTypes : new List() { "None" }; foreach (string bodyType in allTags) { string _bodyType = bodyType; - if (alienRaceDef.isHumanoid) + if (pawnRaceDef.isHumanoid) { Text bodyTypeTitle = AddCloneObjectToParent(raceSettingsWindow, 2).GetComponent(); bodyTypeTitle.text = bodyType; @@ -49,15 +49,15 @@ namespace RimWorldAnimationStudio filepath.GetComponent().text = facing.ToString(); filepath.transform.Find("FilepathButton").GetComponent