diff --git a/1.3/Assemblies/Rimworld-Animations.dll b/1.3/Assemblies/Rimworld-Animations.dll index 835583c..8125458 100644 Binary files a/1.3/Assemblies/Rimworld-Animations.dll and b/1.3/Assemblies/Rimworld-Animations.dll differ diff --git a/1.3/Source/Animations/Clips/BaseAnimationClip.cs b/1.3/Source/Animations/Clips/BaseAnimationClip.cs index 1aaf03f..9963cd5 100644 --- a/1.3/Source/Animations/Clips/BaseAnimationClip.cs +++ b/1.3/Source/Animations/Clips/BaseAnimationClip.cs @@ -9,6 +9,7 @@ using Verse; namespace Rimworld_Animations { public abstract class BaseAnimationClip { + public Dictionary SoundEffects = new Dictionary(); public List types; //types of participants public int duration; public abstract void buildSimpleCurves(); diff --git a/1.3/Source/Animations/Clips/PawnAnimationClip.cs b/1.3/Source/Animations/Clips/PawnAnimationClip.cs index 746c3f4..e9d2489 100644 --- a/1.3/Source/Animations/Clips/PawnAnimationClip.cs +++ b/1.3/Source/Animations/Clips/PawnAnimationClip.cs @@ -12,7 +12,6 @@ namespace Rimworld_Animations { public List keyframes; public AltitudeLayer layer = AltitudeLayer.Pawn; - public Dictionary SoundEffects = new Dictionary(); public Dictionary quiver = new Dictionary(); public SimpleCurve GenitalAngle = new SimpleCurve(); public SimpleCurve BodyAngle = new SimpleCurve(); diff --git a/1.3/Source/Animations/Clips/ThingAnimationClip.cs b/1.3/Source/Animations/Clips/ThingAnimationClip.cs index 80ff19e..26f4d4c 100644 --- a/1.3/Source/Animations/Clips/ThingAnimationClip.cs +++ b/1.3/Source/Animations/Clips/ThingAnimationClip.cs @@ -3,14 +3,72 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Verse; +using RimWorld; namespace Rimworld_Animations { public class ThingAnimationClip : BaseAnimationClip { public List keyframes; - public override void buildSimpleCurves() { + public SimpleCurve PositionX = new SimpleCurve(); + public SimpleCurve PositionZ = new SimpleCurve(); + public SimpleCurve Rotation = new SimpleCurve(); + + 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) + { + if (frame.positionX.HasValue) + PositionX.Add((float)frame.atTick / (float)duration, frame.positionX.Value, true); + + if (frame.positionZ.HasValue) + PositionZ.Add((float)frame.atTick / (float)duration, frame.positionZ.Value, true); + + if (frame.rotation.HasValue) + Rotation.Add((float)frame.atTick / (float)duration, frame.rotation.Value, true); + + if (frame.soundEffect != null) + { + SoundEffects.Add((int)frame.atTick, frame.soundEffect); + } + + + } + else + { + if (frame.positionX.HasValue) + PositionX.Add((float)keyframePosition / (float)duration, frame.positionX.Value, true); + + if (frame.positionZ.HasValue) + PositionZ.Add((float)keyframePosition / (float)duration, frame.positionZ.Value, true); + + if (frame.rotation.HasValue) + Rotation.Add((float)keyframePosition / (float)duration, frame.rotation.Value, true); + + if (frame.soundEffect != null) + { + SoundEffects.Add(keyframePosition, frame.soundEffect); + } + keyframePosition += frame.tickDuration; + + } + + } } } } diff --git a/1.3/Source/Animations/Keyframes/Keyframe.cs b/1.3/Source/Animations/Keyframes/Keyframe.cs index 8b49841..b34eb44 100644 --- a/1.3/Source/Animations/Keyframes/Keyframe.cs +++ b/1.3/Source/Animations/Keyframes/Keyframe.cs @@ -8,7 +8,7 @@ namespace Rimworld_Animations { public abstract class Keyframe { public int tickDuration = 1; - - + public float? atTick; + public string soundEffect; } } diff --git a/1.3/Source/Animations/Keyframes/PawnKeyframe.cs b/1.3/Source/Animations/Keyframes/PawnKeyframe.cs index 685009e..e710981 100644 --- a/1.3/Source/Animations/Keyframes/PawnKeyframe.cs +++ b/1.3/Source/Animations/Keyframes/PawnKeyframe.cs @@ -22,9 +22,7 @@ namespace Rimworld_Animations { public int? bodyFacing; public int? headFacing; - public string soundEffect; public bool? quiver; - public float? atTick; } } diff --git a/1.3/Source/Animations/Keyframes/ThingKeyframe.cs b/1.3/Source/Animations/Keyframes/ThingKeyframe.cs index 9d35a96..6604f5e 100644 --- a/1.3/Source/Animations/Keyframes/ThingKeyframe.cs +++ b/1.3/Source/Animations/Keyframes/ThingKeyframe.cs @@ -7,5 +7,12 @@ using System.Threading.Tasks; namespace Rimworld_Animations { public class ThingKeyframe : Keyframe { + + public float? positionX; + public float? positionZ; + public float? rotation; + + + } } diff --git a/1.3/Source/Comps/CompProperties_BodyAnimator.cs b/1.3/Source/Comps/CompProperties_BodyAnimator.cs index dd991c1..bfcde83 100644 --- a/1.3/Source/Comps/CompProperties_BodyAnimator.cs +++ b/1.3/Source/Comps/CompProperties_BodyAnimator.cs @@ -7,9 +7,10 @@ using Verse; using RimWorld; namespace Rimworld_Animations { - class CompProperties_BodyAnimator : CompProperties + public class CompProperties_BodyAnimator : CompProperties { - public CompProperties_BodyAnimator() { + public CompProperties_BodyAnimator() + { base.compClass = typeof(CompBodyAnimator); } diff --git a/1.3/Source/Comps/CompProperties_ThingAnimator.cs b/1.3/Source/Comps/CompProperties_ThingAnimator.cs index f9b76bd..34c67b1 100644 --- a/1.3/Source/Comps/CompProperties_ThingAnimator.cs +++ b/1.3/Source/Comps/CompProperties_ThingAnimator.cs @@ -3,9 +3,15 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Verse; namespace Rimworld_Animations { - class CompProperties_ThingAnimator + public class CompProperties_ThingAnimator : CompProperties { + + public CompProperties_ThingAnimator() + { + base.compClass = typeof(CompThingAnimator); + } } } diff --git a/1.3/Source/Comps/CompThingAnimator.cs b/1.3/Source/Comps/CompThingAnimator.cs index bb3c944..967e3b6 100644 --- a/1.3/Source/Comps/CompThingAnimator.cs +++ b/1.3/Source/Comps/CompThingAnimator.cs @@ -1,11 +1,190 @@ -using System; +using rjw; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using UnityEngine; +using Verse; namespace Rimworld_Animations { - class CompThingAnimator + public class CompThingAnimator : ThingComp { + Vector3 anchor; + + Pawn pawn; + + public bool isAnimating = false; + + int animTicks = 0, stageTicks = 0, clipTicks = 0, curStage = 0; + float rotation = 0; + float clipPercent = 0; + + public Vector3 deltaPos; + + AnimationDef anim; + private ThingAnimationClip clip => (ThingAnimationClip)stage.animationClips[1]; + private AnimationStage stage + { + get + { + return anim.animationStages[curStage]; + } + + } + + public void StartAnimation(AnimationDef anim, Pawn pawn) + { + isAnimating = true; + + this.anim = anim; + this.pawn = pawn; + + animTicks = 0; + stageTicks = 0; + clipTicks = 0; + + curStage = 0; + clipPercent = 0; + + tickAnim(); + + } + + public void setAnchor(IntVec3 position) + { + anchor = position.ToVector3(); + } + + public override void CompTick() + { + base.CompTick(); + + if(isAnimating) + { + if (pawn.Dead || pawn?.jobs?.curDriver == null || (pawn?.jobs?.curDriver != null && !(pawn?.jobs?.curDriver is rjw.JobDriver_Sex))) + { + isAnimating = false; + } + else + { + tickAnim(); + } + } + + + } + + public void tickAnim() + { + if (!isAnimating) return; + animTicks++; + + if (animTicks < anim.animationTimeTicks) + { + tickStage(); + } + else + { + if (LoopNeverending()) + { + ResetOnLoop(); + } + else + { + isAnimating = false; + } + + + } + + } + + public void tickStage() + { + if (stage == null) + { + isAnimating = false; + return; + } + + stageTicks++; + + if (stageTicks >= stage.playTimeTicks) + { + + curStage++; + + stageTicks = 0; + clipTicks = 0; + clipPercent = 0; + } + + if (curStage >= anim.animationStages.Count) + { + if (LoopNeverending()) + { + ResetOnLoop(); + } + else + { + isAnimating = false; + } + + } + else + { + tickClip(); + } + } + + public void tickClip() + { + clipTicks++; + + if (clipPercent >= 1 && stage.isLooping) + { + clipTicks = 1;//warning: don't set to zero or else calculations go wrong + } + clipPercent = (float)clipTicks / (float)clip.duration; + + calculateDrawValues(); + } + + private void calculateDrawValues() + { + + //shift up and right 0.5f to align center + deltaPos = new Vector3(clip.PositionX.Evaluate(clipPercent) + 0.5f/* todo * (mirror ? -1 : 1) */, AltitudeLayer.Item.AltitudeFor(), clip.PositionZ.Evaluate(clipPercent) + 0.5f); + Log.Message("Clip percent: " + clipPercent + " deltaPos: " + deltaPos); + rotation = clip.Rotation.Evaluate(clipPercent); + } + + public void AnimateThing(Thing thing) + { + thing.Graphic.Draw(deltaPos + anchor, Rot4.North, thing, rotation); + } + + public bool LoopNeverending() + { + if (pawn?.jobs?.curDriver != null && + (pawn.jobs.curDriver is JobDriver_Sex) && (pawn.jobs.curDriver as JobDriver_Sex).neverendingsex) + { + return true; + } + + return false; + } + + public void ResetOnLoop() + { + curStage = 1; + animTicks = 0; + stageTicks = 0; + clipTicks = 0; + + tickAnim(); + } + } } diff --git a/1.3/Source/Patches/RimworldPatches/HarmonyPatch_Thing.cs b/1.3/Source/Patches/RimworldPatches/HarmonyPatch_Thing.cs new file mode 100644 index 0000000..9477abf --- /dev/null +++ b/1.3/Source/Patches/RimworldPatches/HarmonyPatch_Thing.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using HarmonyLib; +using RimWorld; +using Verse; + +namespace Rimworld_Animations +{ + [HarmonyPatch(typeof(Thing), "DrawAt")] + public static class HarmonyPatch_Thing + { + + public static bool Prefix(Thing __instance) + { + CompThingAnimator thingAnimator = __instance.TryGetComp(); + if (thingAnimator != null && thingAnimator.isAnimating) + { + thingAnimator.AnimateThing(__instance); + return false; + + } + + return true; + + } + + } +} diff --git a/LoadFolders.xml b/LoadFolders.xml index 1ed37eb..b9b9fa8 100644 --- a/LoadFolders.xml +++ b/LoadFolders.xml @@ -13,6 +13,8 @@
  • /
  • 1.3
  • Patch_HatsDisplaySelection/1.2
  • +
  • Patch_SexToysMasturbation
  • +
  • Patch_SexToysMasturbation/1.3
  • diff --git a/Patch_SexToysMasturbation/1.3/Assemblies/Patch_SexToysMasturbation.dll b/Patch_SexToysMasturbation/1.3/Assemblies/Patch_SexToysMasturbation.dll new file mode 100644 index 0000000..490d03d Binary files /dev/null and b/Patch_SexToysMasturbation/1.3/Assemblies/Patch_SexToysMasturbation.dll differ diff --git a/Patch_SexToysMasturbation/1.3/Defs/AnimationDefs/Animations_Dildo.xml b/Patch_SexToysMasturbation/1.3/Defs/AnimationDefs/Animations_Dildo.xml new file mode 100644 index 0000000..be91a8b --- /dev/null +++ b/Patch_SexToysMasturbation/1.3/Defs/AnimationDefs/Animations_Dildo.xml @@ -0,0 +1,137 @@ + + + + Masturbation_DildoVaginal + + vagina + true + +
  • Masturbation
  • +
    + +
  • + +
  • Human
  • + + true + +
    + + +
  • + Masturbating + true + 800 + 0 + +
  • + LayingPawn + +
  • + + 40 + 73.01611 + 40.0739746 + 0 + 0.054543376 + 0.112624526 + 0 + 3 + 3 +
  • +
  • + + Slimy + 30 + 76.4867554 + 50.3887634 + 0 + 0.0506898165 + 0.08564949 + 0 + 3 + 3 +
  • +
  • + + 30 + 78.22131 + 58.0072327 + 0 + 0.039129138 + 0.07794231 + 0 + 3 + 3 +
  • +
  • + + 30 + 76.4867554 + 50.3887634 + 0 + 0.0506898165 + 0.08564949 + 0 + 3 + 3 +
  • +
  • + + 1 + 73.01611 + 40.0739746 + 0 + 0.054543376 + 0.112624526 + 0 + 3 + 3 +
  • + + +
  • + +
  • + + 40 + -0.359264076 + -0.00901746 + 114.011215 +
  • +
  • + + 30 + -0.2783391 + -0.0514066666 + 81.16443 +
  • +
  • + + 30 + -0.1704393 + -0.0668209046 + 72.8611145 +
  • +
  • + + 30 + -0.2783391 + -0.0514066666 + 81.16443 +
  • +
  • + + 1 + -0.359264076 + -0.00901746 + 114.011215 +
  • + + + + + +
    +
    +
    \ No newline at end of file diff --git a/Patch_SexToysMasturbation/Patch_SexToysMasturbation.csproj b/Patch_SexToysMasturbation/Patch_SexToysMasturbation.csproj new file mode 100644 index 0000000..fc6cbf9 --- /dev/null +++ b/Patch_SexToysMasturbation/Patch_SexToysMasturbation.csproj @@ -0,0 +1,87 @@ + + + + + Debug + AnyCPU + {87763712-0536-4D5F-9EAA-520F15D4F84E} + Library + Properties + Patch_SexToysMasturbation + Patch_SexToysMasturbation + v4.7.2 + 512 + true + + + false + none + false + 1.3\Assemblies\ + DEBUG;TRACE + prompt + 4 + Auto + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\..\..\workshop\content\294100\1127530465\1.3\Assemblies\0Harmony.dll + False + + + ..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll + False + + + False + ..\1.3\Assemblies\Rimworld-Animations.dll + False + + + ..\..\rjw\1.3\Assemblies\RJW.dll + False + + + ..\..\rjw-toys-and-masturbation\Assemblies\RJW-ToysAndMasturbation.dll + False + + + + + + + + + + + ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.dll + False + + + ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll + False + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Patch_SexToysMasturbation/Properties/AssemblyInfo.cs b/Patch_SexToysMasturbation/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..55c921a --- /dev/null +++ b/Patch_SexToysMasturbation/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Patch_SexToysMasturbation")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Patch_SexToysMasturbation")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("87763712-0536-4d5f-9eaa-520f15d4f84e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Patch_SexToysMasturbation/Source/Defs/SexToyAnimationDef.cs b/Patch_SexToysMasturbation/Source/Defs/SexToyAnimationDef.cs new file mode 100644 index 0000000..a572d5e --- /dev/null +++ b/Patch_SexToysMasturbation/Source/Defs/SexToyAnimationDef.cs @@ -0,0 +1,16 @@ +using Rimworld_Animations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Patch_SexToysMasturbation +{ + public class SexToyAnimationDef : AnimationDef + { + + public String requiredBodyPart = null; + + } +} diff --git a/Patch_SexToysMasturbation/Source/Harmony/Harmony_PatchAll.cs b/Patch_SexToysMasturbation/Source/Harmony/Harmony_PatchAll.cs new file mode 100644 index 0000000..b48ece7 --- /dev/null +++ b/Patch_SexToysMasturbation/Source/Harmony/Harmony_PatchAll.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using HarmonyLib; +using System.Reflection; + +namespace Patch_SexToysMasturbation +{ + + [StaticConstructorOnStartup] + public static class Harmony_PatchAll { + + static Harmony_PatchAll() { + + Harmony val = new Harmony("animtoyspatch"); + val.PatchAll(Assembly.GetExecutingAssembly()); + + } + } +} diff --git a/Patch_SexToysMasturbation/Source/Patches/HarmonyPatch_JobDriver_SexBaseInitiator.cs b/Patch_SexToysMasturbation/Source/Patches/HarmonyPatch_JobDriver_SexBaseInitiator.cs new file mode 100644 index 0000000..279ea01 --- /dev/null +++ b/Patch_SexToysMasturbation/Source/Patches/HarmonyPatch_JobDriver_SexBaseInitiator.cs @@ -0,0 +1,66 @@ +using HarmonyLib; +using Rimworld_Animations; +using rjw; +using RJW_ToysAndMasturbation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Patch_SexToysMasturbation +{ + [HarmonyPatch(typeof(JobDriver_SexBaseInitiator), "Start")] + public class HarmonyPatch_JobDriver_SexBaseInitiator + { + + public static void Postfix(ref JobDriver_SexBaseInitiator __instance) + { + + if(__instance is JobDriver_MasturbateWithToy masturbateJobDriver) + { + Log.Message("Rerolling animations..."); + Pawn pawn = masturbateJobDriver.pawn; + Thing sexToy = masturbateJobDriver.dildo; + + RerollAnimationsForSexToy(pawn, sexToy); + } + + + } + + public static void RerollAnimationsForSexToy(Pawn pawn, Thing thing) + { + CompSexToy sextoy = thing.TryGetComp(); + + SexToyAnimationDef anim = AnimSexToyUtility.tryFindAnimation(sextoy, pawn); + + + + if (anim != null) + { + Log.Message("Playing anim " + anim.defName); + + pawn.TryGetComp().setAnchor(pawn.Position); + thing.TryGetComp().setAnchor(pawn.Position); + + pawn.TryGetComp().StartAnimation(anim, new List { pawn }, 0); + thing.TryGetComp().StartAnimation(anim, pawn); + + (pawn.jobs.curDriver as JobDriver_Sex).ticks_left = anim.animationTimeTicks; + (pawn.jobs.curDriver as JobDriver_Sex).sex_ticks = anim.animationTimeTicks; + (pawn.jobs.curDriver as JobDriver_Sex).duration = anim.animationTimeTicks; + } + else + { + Log.Message("No animation found"); + } + + + } + + } + + +} diff --git a/Patch_SexToysMasturbation/Source/Utilities/AnimSexToyUtility.cs b/Patch_SexToysMasturbation/Source/Utilities/AnimSexToyUtility.cs new file mode 100644 index 0000000..5ab05b1 --- /dev/null +++ b/Patch_SexToysMasturbation/Source/Utilities/AnimSexToyUtility.cs @@ -0,0 +1,47 @@ +using rjw; +using RJW_ToysAndMasturbation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Patch_SexToysMasturbation +{ + public class AnimSexToyUtility + { + + public static SexToyAnimationDef tryFindAnimation(CompSexToy sexToy, Pawn pawn) + { + + IEnumerable options = DefDatabase.AllDefs.Where((SexToyAnimationDef x) => + { + + if(!sexToy.Props.requiredBodyParts.Contains(x.requiredBodyPart)) + { + return false; + } + + if(x.requiredBodyPart == "vagina" && !Genital_Helper.has_vagina(pawn)) + { + return false; + } + + return true; + + }); + + if(options != null && options.Any()) + { + return options.RandomElement(); + } + else + { + return null; + } + + } + + } +} diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj index 196c846..1c066ce 100644 --- a/Rimworld-Animations.csproj +++ b/Rimworld-Animations.csproj @@ -65,6 +65,7 @@ + diff --git a/Rimworld-Animations.sln b/Rimworld-Animations.sln index 707d4cc..ca55d6f 100644 --- a/Rimworld-Animations.sln +++ b/Rimworld-Animations.sln @@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rimworld-Animations", "Rimw EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Patch_HatsDisplaySelection", "Patch_HatsDisplaySelection\Patch_HatsDisplaySelection.csproj", "{BA766964-1716-422D-A09E-29426F8EB9D5}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Patch_SexToysMasturbation", "Patch_SexToysMasturbation\Patch_SexToysMasturbation.csproj", "{87763712-0536-4D5F-9EAA-520F15D4F84E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -20,6 +22,10 @@ Global {BA766964-1716-422D-A09E-29426F8EB9D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BA766964-1716-422D-A09E-29426F8EB9D5}.Release|Any CPU.ActiveCfg = Release|Any CPU {BA766964-1716-422D-A09E-29426F8EB9D5}.Release|Any CPU.Build.0 = Release|Any CPU + {87763712-0536-4D5F-9EAA-520F15D4F84E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87763712-0536-4D5F-9EAA-520F15D4F84E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87763712-0536-4D5F-9EAA-520F15D4F84E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87763712-0536-4D5F-9EAA-520F15D4F84E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE