From 2323b377531fca91c7fef9a61c9675c5b2faced7 Mon Sep 17 00:00:00 2001 From: ManlyMarco <39247311+ManlyMarco@users.noreply.github.com> Date: Thu, 14 Oct 2021 06:07:16 +0200 Subject: [PATCH 1/4] Redo preg project structure --- src/AI_Pregnancy/AI_Pregnancy.csproj | 26 +-------------- src/Core_Pregnancy/Core_Pregnancy.projitems | 32 +++++++++++++++++++ src/Core_Pregnancy/Core_Pregnancy.shproj | 13 ++++++++ .../PregnancyGui.HSceneMenstrIconOverride.cs | 0 src/KK_Pregnancy/KK_Pregnancy.csproj | 31 ++++-------------- .../LactationController.cs | 0 src/KoikatuGameplayMod.sln | 6 ++++ 7 files changed, 58 insertions(+), 50 deletions(-) create mode 100644 src/Core_Pregnancy/Core_Pregnancy.projitems create mode 100644 src/Core_Pregnancy/Core_Pregnancy.shproj rename src/{Core_Pregnancy => KK_Pregnancy}/GUI/PregnancyGui.HSceneMenstrIconOverride.cs (100%) rename src/{Core_Pregnancy => KK_Pregnancy}/LactationController.cs (100%) diff --git a/src/AI_Pregnancy/AI_Pregnancy.csproj b/src/AI_Pregnancy/AI_Pregnancy.csproj index f52cf6a..02e98fd 100644 --- a/src/AI_Pregnancy/AI_Pregnancy.csproj +++ b/src/AI_Pregnancy/AI_Pregnancy.csproj @@ -95,33 +95,9 @@ False - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/Core_Pregnancy/Core_Pregnancy.projitems b/src/Core_Pregnancy/Core_Pregnancy.projitems new file mode 100644 index 0000000..772e42d --- /dev/null +++ b/src/Core_Pregnancy/Core_Pregnancy.projitems @@ -0,0 +1,32 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + eebf32ed-c125-4597-8b3d-4e7e44a15626 + + + Core_Pregnancy + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Core_Pregnancy/Core_Pregnancy.shproj b/src/Core_Pregnancy/Core_Pregnancy.shproj new file mode 100644 index 0000000..9b27b5b --- /dev/null +++ b/src/Core_Pregnancy/Core_Pregnancy.shproj @@ -0,0 +1,13 @@ + + + + eebf32ed-c125-4597-8b3d-4e7e44a15626 + 14.0 + + + + + + + + diff --git a/src/Core_Pregnancy/GUI/PregnancyGui.HSceneMenstrIconOverride.cs b/src/KK_Pregnancy/GUI/PregnancyGui.HSceneMenstrIconOverride.cs similarity index 100% rename from src/Core_Pregnancy/GUI/PregnancyGui.HSceneMenstrIconOverride.cs rename to src/KK_Pregnancy/GUI/PregnancyGui.HSceneMenstrIconOverride.cs diff --git a/src/KK_Pregnancy/KK_Pregnancy.csproj b/src/KK_Pregnancy/KK_Pregnancy.csproj index f625aaa..7f9f909 100644 --- a/src/KK_Pregnancy/KK_Pregnancy.csproj +++ b/src/KK_Pregnancy/KK_Pregnancy.csproj @@ -82,37 +82,18 @@ False - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + diff --git a/src/Core_Pregnancy/LactationController.cs b/src/KK_Pregnancy/LactationController.cs similarity index 100% rename from src/Core_Pregnancy/LactationController.cs rename to src/KK_Pregnancy/LactationController.cs diff --git a/src/KoikatuGameplayMod.sln b/src/KoikatuGameplayMod.sln index 87fbf93..63a8d1d 100644 --- a/src/KoikatuGameplayMod.sln +++ b/src/KoikatuGameplayMod.sln @@ -41,6 +41,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KKS_GameplayMod", "KKS_Game EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Core_GameplayMod", "Core_GameplayMod\Core_GameplayMod.shproj", "{C9650F99-DF26-4D54-9826-5F77275C9D31}" EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Core_Pregnancy", "Core_Pregnancy\Core_Pregnancy.shproj", "{EEBF32ED-C125-4597-8B3D-4E7E44A15626}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution Core_Bulge\Core_Bulge.projitems*{0f6b651e-d1f9-467f-a8f3-d1006c277e51}*SharedItemsImports = 4 @@ -48,8 +50,11 @@ Global Core_Bulge\Core_Bulge.projitems*{3e03b28f-bc65-459f-89e5-70d89905d636}*SharedItemsImports = 13 Core_Bulge\Core_Bulge.projitems*{49cad984-906a-4b18-9982-e003d8668fe4}*SharedItemsImports = 4 Core_Bulge\Core_Bulge.projitems*{904b04c0-5095-40f9-915a-005f80bc2cb1}*SharedItemsImports = 4 + Core_Pregnancy\Core_Pregnancy.projitems*{930a00a6-2935-4ea0-81f0-b16d3e71b74c}*SharedItemsImports = 4 + Core_Pregnancy\Core_Pregnancy.projitems*{930a00a6-2935-4ea0-81f0-c16d3e71b74c}*SharedItemsImports = 4 Core_GameplayMod\Core_GameplayMod.projitems*{9a51cfcb-a18a-428a-843a-fe7cf2eef523}*SharedItemsImports = 4 Core_GameplayMod\Core_GameplayMod.projitems*{c9650f99-df26-4d54-9826-5f77275c9d31}*SharedItemsImports = 13 + Core_Pregnancy\Core_Pregnancy.projitems*{eebf32ed-c125-4597-8b3d-4e7e44a15626}*SharedItemsImports = 13 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -126,6 +131,7 @@ Global {0F6B651E-D1F9-467F-A8F3-D1006C277E51} = {C75FFBF1-9DCE-4BC4-9F20-F95B243ABEE3} {15A4DF23-86EA-49B4-B120-E8F123F8DAFE} = {5DECD423-5B05-4F46-AB72-7CA9CCB27E0C} {C9650F99-DF26-4D54-9826-5F77275C9D31} = {5DECD423-5B05-4F46-AB72-7CA9CCB27E0C} + {EEBF32ED-C125-4597-8B3D-4E7E44A15626} = {1C61B7E0-3603-4193-9B05-A5FF0CAFBD11} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {19B0272D-3305-4C60-8DD9-E15889B2FF54} From e9909803544cdb9a1b231a7f44d3a2c315cb4297 Mon Sep 17 00:00:00 2001 From: ManlyMarco <39247311+ManlyMarco@users.noreply.github.com> Date: Fri, 15 Oct 2021 15:47:20 +0200 Subject: [PATCH 2/4] Add KKS_Pregnancy --- ...Pregnancy.shproj => KKAI_Pregnancy.shproj} | 0 src/KKS_Pregnancy/Data/HeroineStatus.cs | 11 + .../Data/MenstruationSchedule.cs | 10 + src/KKS_Pregnancy/Data/PregnancyData.cs | 144 +++++++ src/KKS_Pregnancy/Data/PregnancyDataUtils.cs | 105 +++++ .../PregnancyGui.HSceneMenstrIconOverride.cs | 87 +++++ .../GUI/PregnancyGui.StatusIcons.cs | 361 ++++++++++++++++++ src/KKS_Pregnancy/GUI/PregnancyGui.cs | 120 ++++++ src/KKS_Pregnancy/KKS_Pregnancy.csproj | 239 ++++++++++++ src/KKS_Pregnancy/LactationController.cs | 331 ++++++++++++++++ src/KKS_Pregnancy/PregnancyBoneEffect.cs | 127 ++++++ src/KKS_Pregnancy/PregnancyCharaController.cs | 224 +++++++++++ src/KKS_Pregnancy/PregnancyGameController.cs | 156 ++++++++ src/KKS_Pregnancy/PregnancyPlugin.Hooks.cs | 155 ++++++++ src/KKS_Pregnancy/PregnancyPlugin.cs | 96 +++++ src/KKS_Pregnancy/Properties/AssemblyInfo.cs | 32 ++ src/KKS_Pregnancy/Resources/leave.png | Bin 0 -> 4228 bytes src/KKS_Pregnancy/Resources/preg_icon.xcf | Bin 0 -> 283362 bytes src/KKS_Pregnancy/Resources/pregnant.png | Bin 0 -> 4440 bytes src/KKS_Pregnancy/Resources/risky.png | Bin 0 -> 3399 bytes src/KKS_Pregnancy/Resources/safe.png | Bin 0 -> 3663 bytes src/KKS_Pregnancy/Resources/unknown.png | Bin 0 -> 3436 bytes src/KKS_Pregnancy/packages.config | 26 ++ src/KoikatuGameplayMod.sln | 9 +- 24 files changed, 2232 insertions(+), 1 deletion(-) rename src/Core_Pregnancy/{Core_Pregnancy.shproj => KKAI_Pregnancy.shproj} (100%) create mode 100644 src/KKS_Pregnancy/Data/HeroineStatus.cs create mode 100644 src/KKS_Pregnancy/Data/MenstruationSchedule.cs create mode 100644 src/KKS_Pregnancy/Data/PregnancyData.cs create mode 100644 src/KKS_Pregnancy/Data/PregnancyDataUtils.cs create mode 100644 src/KKS_Pregnancy/GUI/PregnancyGui.HSceneMenstrIconOverride.cs create mode 100644 src/KKS_Pregnancy/GUI/PregnancyGui.StatusIcons.cs create mode 100644 src/KKS_Pregnancy/GUI/PregnancyGui.cs create mode 100644 src/KKS_Pregnancy/KKS_Pregnancy.csproj create mode 100644 src/KKS_Pregnancy/LactationController.cs create mode 100644 src/KKS_Pregnancy/PregnancyBoneEffect.cs create mode 100644 src/KKS_Pregnancy/PregnancyCharaController.cs create mode 100644 src/KKS_Pregnancy/PregnancyGameController.cs create mode 100644 src/KKS_Pregnancy/PregnancyPlugin.Hooks.cs create mode 100644 src/KKS_Pregnancy/PregnancyPlugin.cs create mode 100644 src/KKS_Pregnancy/Properties/AssemblyInfo.cs create mode 100644 src/KKS_Pregnancy/Resources/leave.png create mode 100644 src/KKS_Pregnancy/Resources/preg_icon.xcf create mode 100644 src/KKS_Pregnancy/Resources/pregnant.png create mode 100644 src/KKS_Pregnancy/Resources/risky.png create mode 100644 src/KKS_Pregnancy/Resources/safe.png create mode 100644 src/KKS_Pregnancy/Resources/unknown.png create mode 100644 src/KKS_Pregnancy/packages.config diff --git a/src/Core_Pregnancy/Core_Pregnancy.shproj b/src/Core_Pregnancy/KKAI_Pregnancy.shproj similarity index 100% rename from src/Core_Pregnancy/Core_Pregnancy.shproj rename to src/Core_Pregnancy/KKAI_Pregnancy.shproj diff --git a/src/KKS_Pregnancy/Data/HeroineStatus.cs b/src/KKS_Pregnancy/Data/HeroineStatus.cs new file mode 100644 index 0000000..06aa3bb --- /dev/null +++ b/src/KKS_Pregnancy/Data/HeroineStatus.cs @@ -0,0 +1,11 @@ +namespace KK_Pregnancy +{ + public enum HeroineStatus + { + Unknown, + Safe, + Risky, + Pregnant, + OnLeave + } +} \ No newline at end of file diff --git a/src/KKS_Pregnancy/Data/MenstruationSchedule.cs b/src/KKS_Pregnancy/Data/MenstruationSchedule.cs new file mode 100644 index 0000000..992a17e --- /dev/null +++ b/src/KKS_Pregnancy/Data/MenstruationSchedule.cs @@ -0,0 +1,10 @@ +namespace KK_Pregnancy +{ + public enum MenstruationSchedule + { + Default = 0, + MostlyRisky = 1, + AlwaysSafe = 2, + AlwaysRisky = 3 + } +} \ No newline at end of file diff --git a/src/KKS_Pregnancy/Data/PregnancyData.cs b/src/KKS_Pregnancy/Data/PregnancyData.cs new file mode 100644 index 0000000..63fe99b --- /dev/null +++ b/src/KKS_Pregnancy/Data/PregnancyData.cs @@ -0,0 +1,144 @@ +using System; +using System.Reflection; +using ExtensibleSaveFormat; + +namespace KK_Pregnancy +{ + public sealed class PregnancyData + { + public static readonly float DefaultFertility = 0.3f; + + /// + /// Week at which pegnancy reaches max level and the character leaves school + /// + public static readonly int LeaveSchoolWeek = 41; + + /// + /// Week at which pegracy ends and the character returns to school + /// + public static readonly int ReturnToSchoolWeek = LeaveSchoolWeek + 7; + + #region Names of these are important, used as dictionary keys + + /// + /// The character is harder to get pregananant. + /// + public float Fertility = 0.3f; + + /// + /// Should any gameplay code be executed for this character. + /// If false the current pregancy week doesn't change and the character can't get pegnant. + /// + public bool GameplayEnabled = true; + + public MenstruationSchedule MenstruationSchedule = MenstruationSchedule.Default; + + #if AI + /// + /// The first day that menstraion started in AI + /// + public int MenstrationStartDay = -1; + #endif + + /// + /// If 0 or negative, the character is not pregant. + /// If between 0 and the character is pregant and the belly is proportionately sized. + /// If equal or above the character is on a maternal leave until . + /// + public int Week; + + /// + /// How many times the character was pergant, including the current one. + /// + public int PregnancyCount; + + public int WeeksSinceLastPregnancy; + + /// + /// Always have milk, even if not pergenant + /// + public bool AlwaysLactates; + + #endregion + + #region Save/Load + + private static readonly PregnancyData _default = new PregnancyData(); + private static readonly FieldInfo[] _serializedFields = typeof(PregnancyData).GetFields(BindingFlags.Public | BindingFlags.Instance); + + public static PregnancyData Load(PluginData data) + { + if (data?.data == null) return null; + + var result = new PregnancyData(); + foreach (var fieldInfo in _serializedFields) + { + if (data.data.TryGetValue(fieldInfo.Name, out var val)) + { + try + { + if (fieldInfo.FieldType.IsEnum) val = (int)val; + fieldInfo.SetValue(result, val); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + } + + if (result.IsPregnant) + { + result.WeeksSinceLastPregnancy = 0; + if (result.PregnancyCount == 0) result.PregnancyCount = 1; + } + + return result; + } + + public PluginData Save() + { + var result = new PluginData { version = 1 }; + foreach (var fieldInfo in _serializedFields) + { + var value = fieldInfo.GetValue(this); + // Check if any value is different than default, if not then don't save any data + var defaultValue = fieldInfo.GetValue(_default); + if (!Equals(defaultValue, value)) + result.data.Add(fieldInfo.Name, value); + } + + return result.data.Count > 0 ? result : null; + } + + #endregion + + // If week is 0 the character is not peregenent + public bool IsPregnant => Week > 0; + + public void StartPregnancy() + { + if (GameplayEnabled && !IsPregnant) + { + Week = 1; + PregnancyCount++; + WeeksSinceLastPregnancy = 0; + } + } + + #if AI + public void StartMenstration(int currentDay) + { + if (!IsPregnant) + { + MenstrationStartDay = currentDay; + } + } + + public void StopMenstration() + { + MenstrationStartDay = -1; + } + #endif + } +} \ No newline at end of file diff --git a/src/KKS_Pregnancy/Data/PregnancyDataUtils.cs b/src/KKS_Pregnancy/Data/PregnancyDataUtils.cs new file mode 100644 index 0000000..9cca14b --- /dev/null +++ b/src/KKS_Pregnancy/Data/PregnancyDataUtils.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using ExtensibleSaveFormat; +using KKAPI.MainGame; + +namespace KK_Pregnancy +{ + public static class PregnancyDataUtils + { + private static readonly int[] _earlyDetectPersonalities = { 00, 11, 12, 13, 19, 24, 31, 33 }; + private static readonly int[] _lateDetectPersonalities = { 03, 05, 08, 20, 25, 26, 37 }; + + /// ChaFile to test + ///// The girl knows about it / tested it + public static PregnancyData GetPregnancyData(this ChaFileControl c) + { + if (c == null) return null; + + var d = ExtendedSave.GetExtendedDataById(c, PregnancyPlugin.GUID); + if (d == null) return null; + + return PregnancyData.Load(d); + } + + /// Heroine to test + ///// The girl knows about it / tested it + [Obsolete] + public static PregnancyData GetPregnancyData(SaveData.Heroine heroine) => GetPregnancyData((SaveData.CharaData)heroine); + public static PregnancyData GetPregnancyData(this SaveData.CharaData chara) + { + if (chara == null) return new PregnancyData(); + + // Figure out which data to take if there are multiple + // probably not necessary? null check should be enough? + return chara.GetRelatedChaFiles() + .Select(GetPregnancyData) + .Where(x => x != null) + .OrderByDescending(x => x.PregnancyCount) + .ThenByDescending(x => x.WeeksSinceLastPregnancy) + .ThenByDescending(x => x.Week) + .ThenByDescending(x => x.MenstruationSchedule) + .ThenByDescending(x => x.GameplayEnabled) + .FirstOrDefault() ?? new PregnancyData(); + } + + [Obsolete] + public static HeroineStatus GetHeroineStatus(this SaveData.CharaData chara, PregnancyData pregData = null) => GetCharaStatus(chara, pregData); + public static HeroineStatus GetCharaStatus(this SaveData.CharaData chara, PregnancyData pregData = null) + { + if (chara is SaveData.Heroine heroine) + { + if (pregData == null) pregData = heroine.GetPregnancyData(); + + // Check if she wants to tell //todo need to ask in talk scene + if (heroine.intimacy >= 80 || + heroine.hCount >= 5 || + heroine.parameter.attribute.bitch && heroine.favor > 50 || + (heroine.isGirlfriend || heroine.favor >= 90) && + (!heroine.isVirgin || heroine.hCount >= 2 || heroine.intimacy >= 40)) + { + var pregnancyWeek = pregData.Week; + if (pregnancyWeek > 0) + { + if (pregnancyWeek >= PregnancyData.LeaveSchoolWeek) return HeroineStatus.OnLeave; + if (PregnancyPlugin.ShowPregnancyIconEarly.Value) return HeroineStatus.Pregnant; + // Different personalities notice at different times + if (_earlyDetectPersonalities.Contains(heroine.personality)) + { + if (pregnancyWeek > 1) return HeroineStatus.Pregnant; + } + else if (_lateDetectPersonalities.Contains(heroine.personality)) + { + if (pregnancyWeek > 11) return HeroineStatus.Pregnant; + } + else + { + if (pregnancyWeek > 5) return HeroineStatus.Pregnant; + } + } + + return HFlag.GetMenstruation(heroine.MenstruationDay) == HFlag.MenstruationType.安全日 + ? HeroineStatus.Safe + : HeroineStatus.Risky; + } + } + else if (chara is SaveData.Player player) + { + if (pregData == null) pregData = player.GetPregnancyData(); + return pregData.IsPregnant ? HeroineStatus.Pregnant : HeroineStatus.Safe; + } + return HeroineStatus.Unknown; + } + + internal static IEnumerable GetRelatedChaFiles(this SaveData.CharaData character) + { + var chafiles = + character is SaveData.Heroine h ? KKAPI.MainGame.GameExtensions.GetRelatedChaFiles(h) : + character is SaveData.Player p ? KKAPI.MainGame.GameExtensions.GetRelatedChaFiles(p) : + null; + return chafiles; + } + } +} \ No newline at end of file diff --git a/src/KKS_Pregnancy/GUI/PregnancyGui.HSceneMenstrIconOverride.cs b/src/KKS_Pregnancy/GUI/PregnancyGui.HSceneMenstrIconOverride.cs new file mode 100644 index 0000000..bb18f97 --- /dev/null +++ b/src/KKS_Pregnancy/GUI/PregnancyGui.HSceneMenstrIconOverride.cs @@ -0,0 +1,87 @@ +using System; +using HarmonyLib; +using KKAPI.Utilities; +using UnityEngine; +using UnityEngine.UI; + +namespace KK_Pregnancy +{ + public static partial class PregnancyGui + { + private static class HSceneMenstrIconOverride + { + private static Sprite _unknownSprite; + private static Sprite _pregSprite; + private static Sprite _safeSprite; + private static Sprite _riskySprite; + private static Sprite _leaveSprite; + + public static void Init(Harmony hi, Sprite unknownSprite, Sprite pregSprite, Sprite safeSprite, Sprite riskySprite, Sprite leaveSprite) + { + if (PregnancyPlugin.HSceneMenstrIconOverride.Value) + { + _unknownSprite = unknownSprite ? unknownSprite : throw new ArgumentNullException(nameof(unknownSprite)); + _pregSprite = pregSprite ? pregSprite : throw new ArgumentNullException(nameof(pregSprite)); + _riskySprite = riskySprite ? riskySprite : throw new ArgumentNullException(nameof(riskySprite)); + _safeSprite = safeSprite ? safeSprite : throw new ArgumentNullException(nameof(safeSprite)); + _leaveSprite = leaveSprite ? leaveSprite : throw new ArgumentNullException(nameof(leaveSprite)); + hi.PatchAll(typeof(HSceneMenstrIconOverride)); + } + } + + /// + /// Turn off the safe/risky indicator if the character didn't tell you their schedule yet + /// You have to listen for the cues instead + /// + [HarmonyPostfix] + [HarmonyPatch(typeof(HSprite), nameof(HSprite.Init))] + [HarmonyPatch(typeof(HSprite), nameof(HSprite.InitHeroine))] + private static void HideMenstrIconIfNeeded(HSprite __instance) + { + try + { + // Add the custom icons if necessary + if (__instance.categoryMenstruation.lstObj.Count == 2) + { + var original = __instance.categoryMenstruation.lstObj[0]; + void AddNewState(Sprite sprite) + { + var copy = UnityEngine.Object.Instantiate(original, original.transform.parent, false); + copy.GetComponent().sprite = sprite; + __instance.categoryMenstruation.lstObj.Add(copy); + } + AddNewState(_unknownSprite); // index 2 + AddNewState(_pregSprite); + AddNewState(_safeSprite); + AddNewState(_riskySprite); + AddNewState(_leaveSprite); + } + + var heroineStatus = __instance.GetLeadingHeroine().GetCharaStatus(); + switch (heroineStatus) + { + case HeroineStatus.Unknown: + __instance.categoryMenstruation.SetActiveToggle(2); + break; + case HeroineStatus.Pregnant: + __instance.categoryMenstruation.SetActiveToggle(3); + break; + case HeroineStatus.Safe: + __instance.categoryMenstruation.SetActiveToggle(4); + break; + case HeroineStatus.Risky: + __instance.categoryMenstruation.SetActiveToggle(5); + break; + case HeroineStatus.OnLeave: + __instance.categoryMenstruation.SetActiveToggle(6); + break; + } + } + catch (Exception ex) + { + UnityEngine.Debug.LogException(ex); + } + } + } + } +} \ No newline at end of file diff --git a/src/KKS_Pregnancy/GUI/PregnancyGui.StatusIcons.cs b/src/KKS_Pregnancy/GUI/PregnancyGui.StatusIcons.cs new file mode 100644 index 0000000..261e5e2 --- /dev/null +++ b/src/KKS_Pregnancy/GUI/PregnancyGui.StatusIcons.cs @@ -0,0 +1,361 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using ActionGame; +using HarmonyLib; +using Illusion.Extensions; +using KKAPI.MainGame; +using KKAPI.Utilities; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.UI; + +namespace KK_Pregnancy +{ + public static partial class PregnancyGui + { + private class StatusIcons : MonoBehaviour + { + private static Sprite _pregSprite; + private static Sprite _riskySprite; + private static Sprite _safeSprite; + private static Sprite _unknownSprite; + private static Sprite _leaveSprite; + + private const string ICON_NAME = "Pregnancy_Icon"; + + private static readonly List> _currentHeroine = new List>(); + + internal static void Init(Harmony hi, Sprite unknownSprite, Sprite pregSprite, Sprite safeSprite, Sprite riskySprite, Sprite leaveSprite) + { + _unknownSprite = unknownSprite ? unknownSprite : throw new ArgumentNullException(nameof(unknownSprite)); + _pregSprite = pregSprite ? pregSprite : throw new ArgumentNullException(nameof(pregSprite)); + _riskySprite = riskySprite ? riskySprite : throw new ArgumentNullException(nameof(riskySprite)); + _safeSprite = safeSprite ? safeSprite : throw new ArgumentNullException(nameof(safeSprite)); + _leaveSprite = leaveSprite ? leaveSprite : throw new ArgumentNullException(nameof(leaveSprite)); + + SceneManager.sceneLoaded += SceneManager_sceneLoaded; + SceneManager.sceneUnloaded += s => + { + if (_currentHeroine.Count > 0) + SceneManager_sceneLoaded(s, LoadSceneMode.Additive); + }; + + hi.PatchAll(typeof(StatusIcons)); + } + + /// + /// Handle class roster + /// + [HarmonyPostfix] + [HarmonyPatch(typeof(ClassRoomList), "PreviewUpdate")] + public static void ClassroomPreviewUpdateHook(ClassRoomList __instance) + { + IEnumerator ClassroomPreviewUpdateCo() + { + yield return new WaitForEndOfFrame(); + + _currentHeroine.Clear(); + SpawnGUI(); + + var entries = Traverse.Create(__instance).Property("charaPreviewList") + .GetValue>(); + + foreach (var chaEntry in entries) + { + // Need to call this every time in case characters get transferred/edited + SetHeart(chaEntry.rootObj, chaEntry.data, true); + } + } + + _pluginInstance.StartCoroutine(ClassroomPreviewUpdateCo()); + } + + /// + /// Handle character list in roaming mode + /// + private static void SceneManager_sceneLoaded(Scene scene, LoadSceneMode mode) + { + if (mode == LoadSceneMode.Single || _pluginInstance == null) + return; + + _currentHeroine.Clear(); + + var chaStatusScene = FindObjectOfType(); + if (chaStatusScene != null) + { + SpawnGUI(); + + IEnumerator CreatePregnancyIconCo() + { + yield return new WaitForEndOfFrame(); + + foreach (var chaStatusComponent in chaStatusScene.transform.GetComponentsInChildren()) + { + var chara = (SaveData.CharaData)chaStatusComponent.heroine ?? + (chaStatusComponent.name == "status_m" ? Manager.Game.Player : null); + SetHeart(chaStatusComponent.gameObject, chara, false); + } + } + + _pluginInstance.StartCoroutine(CreatePregnancyIconCo()); + } + } + + /// + /// Handle char icon for top left quick status popup during roaming mode + /// + [HarmonyPostfix] + [HarmonyPatch(typeof(ParamUI), "SetHeroine", typeof(SaveData.Heroine))] + private static void ParamUI_SetHeroine(ParamUI __instance, SaveData.Heroine _heroine) + { + var objFemaleRoot = Traverse.Create(__instance).Field("objFemaleRoot").GetValue(); + if (objFemaleRoot == null) return; + + SpawnGUI(); + + IEnumerator HeroineCanvasPreviewUpdateCo() + { + yield return new WaitForEndOfFrame(); + + _currentHeroine.Clear(); + SetQuickStatusIcon(objFemaleRoot, _heroine, -214f, -26f); + } + + _pluginInstance.StartCoroutine(HeroineCanvasPreviewUpdateCo()); + } + + private static void SpawnGUI() + { + if (!GameObject.Find("PregnancyGUI")) + new GameObject("PregnancyGUI").AddComponent(); + } + + private void OnGUI() + { + if (_currentHeroine.Count == 0) return; + + var pos = new Vector2(Input.mousePosition.x, -(Input.mousePosition.y - Screen.height)); + var heroineRect = _currentHeroine.FirstOrDefault(x => + { + if (x.Value == null) return false; + return GetOccupiedScreenRect(x).Contains(pos); + }); + var chara = heroineRect.Key; + if (chara == null) return; + + var pregData = chara.GetPregnancyData(); + + var status = chara.GetCharaStatus(pregData); + var heroine = chara as SaveData.Heroine; + + var windowHeight = status == HeroineStatus.Unknown ? 100 : status == HeroineStatus.Pregnant || status == HeroineStatus.OnLeave ? 180 : 370; + var screenRect = new Rect((int)pos.x + 30, (int)pos.y - windowHeight / 2, 180, windowHeight); + IMGUIUtils.DrawSolidBox(screenRect); + GUILayout.BeginArea(screenRect, GUI.skin.box); + { + GUILayout.BeginVertical(); + { + GUILayout.FlexibleSpace(); + + switch (status) + { + case HeroineStatus.Unknown: + GUILayout.Label("This character didn't tell you their risky day schedule yet."); + GUILayout.FlexibleSpace(); + GUILayout.Label("Become closer to learn it!"); + break; + + case HeroineStatus.OnLeave: + GUILayout.Label("This character is on a maternal leave and will not appear until it is over."); + GUILayout.FlexibleSpace(); + GUILayout.Label("Consider using a rubber next time!"); + break; + + case HeroineStatus.Pregnant: + GUILayout.Label($"This character is pregnant (on week {pregData.Week} / 40)."); + GUILayout.FlexibleSpace(); + if (pregData.GameplayEnabled) + GUILayout.Label(heroine != null ? "The character's body will slowly change, and at the end they will temporarily leave." : "The character's body will slowly change."); + + GUILayout.FlexibleSpace(); + var previousPregcount = Mathf.Max(0, pregData.PregnancyCount - 1); + GUILayout.Label($"This character was pregnant {previousPregcount} times before."); + break; + + case HeroineStatus.Safe: + case HeroineStatus.Risky: + if (heroine == null) break; + + GUILayout.Label(status == HeroineStatus.Safe + ? "This character is on a safe day, have fun!" + : "This character is on a risky day, be careful!"); + //GUILayout.Space(5); + GUILayout.FlexibleSpace(); + + var day = Singleton.Instance.nowWeek; + + GUILayout.Label("Forecast for this week:"); + GUILayout.Label($"Today ({day}): {status}"); + + for (var dayOffset = 1; dayOffset < 7; dayOffset++) + { + var adjustedDay = (Cycle.Week)((int)(day + dayOffset) % Enum.GetValues(typeof(Cycle.Week)).Length); + var adjustedSafe = HFlag.GetMenstruation((byte)((heroine.MenstruationDay + dayOffset) % HFlag.menstruations.Length)) == HFlag.MenstruationType.安全日; + GUILayout.Label($"{adjustedDay}: {(adjustedSafe ? "Safe" : "Risky")}"); + } + + + var pregnancyCount = pregData.IsPregnant ? pregData.PregnancyCount - 1 : pregData.PregnancyCount; + if (pregnancyCount > 0) + { + GUILayout.FlexibleSpace(); + GUILayout.Label($"This character was pregnant {pregnancyCount} times."); + } + + if (pregData.WeeksSinceLastPregnancy > 0) + { + GUILayout.FlexibleSpace(); + GUILayout.Label($"Last pregnancy was {pregData.WeeksSinceLastPregnancy} weeks ago."); + } + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + GUILayout.FlexibleSpace(); + } + GUILayout.EndVertical(); + } + GUILayout.EndArea(); + } + + /// + /// Enable/disable pregnancy icon + /// + private static void SetHeart(GameObject rootObj, SaveData.CharaData chara, bool classRoster) + { + var pregIconTr = rootObj.transform.Find(ICON_NAME); + + if (chara == null) + { + if (pregIconTr != null) + Destroy(pregIconTr.gameObject); + } + else + { + if (pregIconTr == null) + { + pregIconTr = new GameObject(ICON_NAME, typeof(RectTransform), typeof(CanvasRenderer), typeof(Image)).transform; + pregIconTr.SetParent(rootObj.transform, false); + var rt = pregIconTr.GetComponent(); + if (classRoster) + { + rt.anchorMax = rt.anchorMin = rt.pivot = new Vector2(0, 1); + rt.offsetMin = Vector2.zero; + rt.offsetMax = new Vector2(48, 48); + rt.localScale = Vector3.one; + rt.localPosition = new Vector3(4, -115, 0); + } + else // status screen during roaming mode + { + rt.anchorMax = rt.anchorMin = rt.pivot = new Vector2(0.5f, 0.5f); + rt.offsetMin = Vector2.zero; + rt.offsetMax = new Vector2(48, 48); + rt.localScale = Vector3.one; + rt.localPosition = new Vector3(-273, -85, 0); + } + } + + AddPregIcon(pregIconTr, chara); + } + } + + /// + /// Enable/disable pregnancy icon on quick status container + /// + /// The heroine image object + /// Is the preg icon shown + /// Offset from the character image + /// Offset from the character image + private static void SetQuickStatusIcon(GameObject characterImageObj, SaveData.Heroine heroine, float xOffset, float yOffset) + { + var existing = characterImageObj.transform.Find(ICON_NAME); + + if (heroine == null) + { + if (existing != null) + Destroy(existing.gameObject); + } + else + { + if (existing == null) + { + var newChildIcon = new GameObject(); + newChildIcon.AddComponent(); + newChildIcon.AddComponent(); + + var copy = Instantiate(newChildIcon, characterImageObj.transform); + copy.name = ICON_NAME; + copy.SetActive(true); + + var charRt = characterImageObj.GetComponent(); + var rt = copy.GetComponent(); + rt.anchoredPosition = new Vector2(charRt.anchoredPosition.x + xOffset, charRt.anchoredPosition.y + yOffset); + rt.sizeDelta = new Vector2(48, 48); + + existing = copy.transform; + } + + AddPregIcon(existing, heroine); + } + } + + private static readonly Vector3[] _worldCornersBuffer = new Vector3[4]; + + private static void AddPregIcon(Transform pregIconTransform, SaveData.CharaData chara) + { + var image = pregIconTransform.GetComponent(); + + _currentHeroine.Add(new KeyValuePair(chara, image.GetComponent())); + + var status = chara.GetCharaStatus(chara.GetPregnancyData()); + switch (status) + { + case HeroineStatus.Unknown: + image.sprite = _unknownSprite; + break; + case HeroineStatus.OnLeave: + image.sprite = _leaveSprite; + break; + case HeroineStatus.Safe: + image.sprite = _safeSprite; + break; + case HeroineStatus.Risky: + image.sprite = _riskySprite; + break; + case HeroineStatus.Pregnant: + image.sprite = _pregSprite; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + pregIconTransform.gameObject.SetActiveIfDifferent(chara is SaveData.Heroine || status == HeroineStatus.Pregnant); + } + + private static Rect GetOccupiedScreenRect(KeyValuePair x) + { + x.Value.GetWorldCorners(_worldCornersBuffer); + var screenPos = new Rect( + _worldCornersBuffer[0].x, + Screen.height - _worldCornersBuffer[2].y, + _worldCornersBuffer[2].x - _worldCornersBuffer[0].x, + _worldCornersBuffer[2].y - _worldCornersBuffer[0].y); + return screenPos; + } + } + } +} \ No newline at end of file diff --git a/src/KKS_Pregnancy/GUI/PregnancyGui.cs b/src/KKS_Pregnancy/GUI/PregnancyGui.cs new file mode 100644 index 0000000..a45c919 --- /dev/null +++ b/src/KKS_Pregnancy/GUI/PregnancyGui.cs @@ -0,0 +1,120 @@ +using HarmonyLib; +using KKAPI.Chara; +using KKAPI.Maker; +using KKAPI.Maker.UI; +using KKAPI.Studio; +using KKAPI.Studio.UI; +using KKAPI.Utilities; +using UniRx; +using UnityEngine; + +namespace KK_Pregnancy +{ + public static partial class PregnancyGui + { + private static PregnancyPlugin _pluginInstance; + + internal static void Init(Harmony hi, PregnancyPlugin instance) + { + _pluginInstance = instance; + + if (StudioAPI.InsideStudio) + { + RegisterStudioControls(); + } + else + { + MakerAPI.RegisterCustomSubCategories += MakerAPI_MakerBaseLoaded; + + Sprite LoadIcon(string resourceFileName) + { + var iconTex = new Texture2D(2, 2, TextureFormat.DXT5, false); + Object.DontDestroyOnLoad(iconTex); + iconTex.LoadImage(ResourceUtils.GetEmbeddedResource(resourceFileName)); + + var sprite = Sprite.Create(iconTex, new Rect(0f, 0f, iconTex.width, iconTex.height), + new Vector2(0.5f, 0.5f), 100f, 0u, SpriteMeshType.FullRect); + Object.DontDestroyOnLoad(sprite); + return sprite; + } + var pregSprite = LoadIcon("pregnant.png"); + var riskySprite = LoadIcon("risky.png"); + var safeSprite = LoadIcon("safe.png"); + var unknownSprite = LoadIcon("unknown.png"); + var leaveSprite = LoadIcon("leave.png"); + + StatusIcons.Init(hi, unknownSprite, pregSprite, safeSprite, riskySprite, leaveSprite); + + HSceneMenstrIconOverride.Init(hi, unknownSprite, pregSprite, safeSprite, riskySprite, leaveSprite); + } + } + + private static void RegisterStudioControls() + { + var cat = StudioAPI.GetOrCreateCurrentStateCategory(null); + cat.AddControl(new CurrentStateCategorySlider("Pregnancy", c => + { + if (c.charInfo == null) return 0; + var controller = c.charInfo.GetComponent(); + if (controller == null) return 0; + return controller.Data.Week; + }, 0, 40)) + .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers()) ctrl.Data.Week = Mathf.RoundToInt(f); }); + } + + private static void MakerAPI_MakerBaseLoaded(object sender, RegisterSubCategoriesEvent e) + { + var female = MakerAPI.GetMakerSex() != 0; + + // This category is inaccessible from class maker + var cat = new MakerCategory(MakerConstants.Parameter.Character.CategoryName, "Pregnancy"); //MakerConstants.Parameter.Character; + + e.AddSubCategory(cat); + + var hintColor = new Color(0.7f, 0.7f, 0.7f); + + var gameplayToggle = e.AddControl(new MakerToggle(cat, "Enable pregnancy progression", true, _pluginInstance)); + gameplayToggle.BindToFunctionController(controller => controller.Data.GameplayEnabled, (controller, value) => controller.Data.GameplayEnabled = value); + e.AddControl(new MakerText(female ? + "If off, the character can't get pregnant and current pregnancy will stop progressing." : + "If on, belly will progressively get bigger. No other effects.", + cat, _pluginInstance) + { TextColor = hintColor }); + + if (female) + { + var fertilityToggle = e.AddControl(new MakerSlider(cat, "Fertility", 0f, 1f, PregnancyData.DefaultFertility, _pluginInstance)); + fertilityToggle.BindToFunctionController(controller => controller.Data.Fertility, (controller, value) => controller.Data.Fertility = value); + + e.AddControl(new MakerText("How likely this character is to get pregnant.", cat, _pluginInstance) { TextColor = hintColor }); + } + + var weeksSlider = e.AddControl(new MakerSlider(cat, "Week of pregnancy", 0f, PregnancyData.LeaveSchoolWeek - 1f, 0f, _pluginInstance)); + weeksSlider.ValueToString = f => Mathf.RoundToInt(f).ToString(); + weeksSlider.StringToValue = s => int.Parse(s); + weeksSlider.BindToFunctionController(controller => controller.Data.Week, (controller, value) => controller.Data.Week = Mathf.RoundToInt(value)); + + e.AddControl(new MakerText(female ? + "If the character is pregnant when added to the game, the pregnancy will continue from this point." : + "The only way for male characters to get pregnant is to manually set this slider above 0.", + cat, _pluginInstance) + { TextColor = hintColor }); + + if (female) + { + var scheduleToggle = e.AddControl(new MakerRadioButtons(cat, _pluginInstance, "Menstruation schedule", "Default", "More risky", "Always safe", "Always risky")); + scheduleToggle.BindToFunctionController(controller => (int)controller.Data.MenstruationSchedule, (controller, value) => controller.Data.MenstruationSchedule = (MenstruationSchedule)value); + + e.AddControl(new MakerText("Changes how many risky days the character has in a cycle. Default is more safe days than risky days.", cat, _pluginInstance) { TextColor = hintColor }); + } + + if (female) + { + var lactatToggle = e.AddControl(new MakerToggle(cat, "Always lactates", _pluginInstance)); + lactatToggle.BindToFunctionController(controller => controller.Data.AlwaysLactates, (controller, value) => controller.Data.AlwaysLactates = value); + + e.AddControl(new MakerText("Makes the character always have milk, even when not pregnant.", cat, _pluginInstance) { TextColor = hintColor }); + } + } + } +} diff --git a/src/KKS_Pregnancy/KKS_Pregnancy.csproj b/src/KKS_Pregnancy/KKS_Pregnancy.csproj new file mode 100644 index 0000000..5fc9d52 --- /dev/null +++ b/src/KKS_Pregnancy/KKS_Pregnancy.csproj @@ -0,0 +1,239 @@ + + + + + Debug + AnyCPU + {736EB022-A7B9-43AA-95C3-05A84B57F7E7} + Library + Properties + KKS_Pregnancy + KKS_Pregnancy + v4.6 + 512 + true + + + + + true + embedded + false + ..\..\bin\BepInEx\plugins\ + TRACE;DEBUG;KKS + prompt + 4 + true + + + embedded + true + ..\..\bin\BepInEx\plugins\ + TRACE;KKS + prompt + 4 + true + true + + + + ..\packages\IllusionLibs.BepInEx.Harmony.2.5.4\lib\net35\0Harmony.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.Assembly-CSharp.2021.9.17\lib\net46\Assembly-CSharp.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.Assembly-CSharp-firstpass.2021.9.17\lib\net46\Assembly-CSharp-firstpass.dll + False + + + ..\packages\IllusionLibs.BepInEx.5.4.15\lib\net35\BepInEx.dll + False + + + ..\packages\ABMX.KKSABMX.4.4.5\lib\net46\KKSABMX.dll + False + + + ..\packages\IllusionModdingAPI.KKSAPI.1.27.0\lib\net46\KKSAPI.dll + False + + + ..\packages\ExtensibleSaveFormat.KoikatsuSunshine.16.8.0\lib\net46\KKS_ExtensibleSaveFormat.dll + False + + + ..\packages\IllusionLibs.BepInEx.MonoMod.21.8.5.1\lib\net35\MonoMod.RuntimeDetour.dll + False + + + ..\packages\IllusionLibs.BepInEx.MonoMod.21.8.5.1\lib\net35\MonoMod.Utils.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.CoreModule.2019.4.9\lib\net46\Sirenix.Serialization.dll + False + + + + + + + + + + + ..\packages\IllusionLibs.KoikatsuSunshine.UniRx.2021.9.17\lib\net46\UniRx.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UniTask.2021.9.17\lib\net46\UniTask.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UniTask.2021.9.17\lib\net46\UniTask.Addressables.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UniTask.2021.9.17\lib\net46\UniTask.DOTween.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UniTask.2021.9.17\lib\net46\UniTask.Linq.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UniTask.2021.9.17\lib\net46\UniTask.TextMeshPro.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.Unity.TextMeshPro.2019.4.9\lib\net46\Unity.TextMeshPro.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.CoreModule.2019.4.9\lib\net46\UnityEngine.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.AnimationModule.2019.4.9\lib\net46\UnityEngine.AnimationModule.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.AudioModule.2019.4.9\lib\net46\UnityEngine.AudioModule.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.CoreModule.2019.4.9\lib\net46\UnityEngine.CoreModule.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.ImageConversionModule.2019.4.9\lib\net46\UnityEngine.ImageConversionModule.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.IMGUIModule.2019.4.9\lib\net46\UnityEngine.IMGUIModule.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.InputLegacyModule.2019.4.9\lib\net46\UnityEngine.InputLegacyModule.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.ParticleSystemModule.2019.4.9\lib\net46\UnityEngine.ParticleSystemModule.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.PhysicsModule.2019.4.9\lib\net46\UnityEngine.PhysicsModule.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.TextRenderingModule.2019.4.9\lib\net46\UnityEngine.TextRenderingModule.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.UI.2019.4.9\lib\net46\UnityEngine.UI.dll + False + + + ..\packages\IllusionLibs.KoikatsuSunshine.UnityEngine.UIModule.2019.4.9\lib\net46\UnityEngine.UIModule.dll + False + + + ..\packages\IllusionLibs.XUnity.AutoTranslator.Plugin.Core.4.16.0\lib\net46\XUnity.AutoTranslator.Plugin.Core.dll + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/KKS_Pregnancy/LactationController.cs b/src/KKS_Pregnancy/LactationController.cs new file mode 100644 index 0000000..b076288 --- /dev/null +++ b/src/KKS_Pregnancy/LactationController.cs @@ -0,0 +1,331 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using HarmonyLib; +using Illusion.Game; +using UnityEngine; +using Random = UnityEngine.Random; +#if AI + using AIChara; +#endif + +namespace KK_Pregnancy +{ + public class LactationController : MonoBehaviour + { + private const float MinimumMilk = 0.4f; + private const float MoreMilk = 0.65f; + private readonly List _charas = new List(); + private float _orgasmDelayTimer; + private HSceneProc _proc; + private float _touchingDelayTimer; + + private void Start() + { + if (!PregnancyPlugin.LactationEnabled.Value) + { + enabled = false; + return; + } + + _proc = FindObjectOfType(); + + var lstFemale = (List)AccessTools.Field(typeof(HSceneProc), "lstFemale").GetValue(_proc); + + _charas.Add(new CharaData(lstFemale[0], _proc.particle, _proc.hand)); + if (lstFemale.Count > 1 && lstFemale[1] != null) + _charas.Add(new CharaData(lstFemale[1], _proc.particle1, _proc.hand1)); + + if (_charas.TrueForAll(x => x.MaxMilk < MinimumMilk)) + enabled = false; + } + + private void Update() + { + // figure out when to fire + var animatorStateInfo = _charas[0].ChaControl.getAnimatorStateInfo(0); + var hFlag = _proc.flags; + var orgasmloop = hFlag.mode == HFlag.EMode.aibu + ? animatorStateInfo.IsName("Orgasm_Start") + : animatorStateInfo.IsName("OLoop") || animatorStateInfo.IsName("A_OLoop"); + + if (orgasmloop) + { + _orgasmDelayTimer = Random.value / 8; //0.1f; + } + else if (_orgasmDelayTimer > 0) + { + _orgasmDelayTimer -= Time.deltaTime; + if (_orgasmDelayTimer <= 0) + OnOrgasm(); + } + else + { + if (hFlag.drag && hFlag.speedItem > hFlag.speedUpItemClac.y * 0.8f) + { + if (_touchingDelayTimer <= 0) + { + foreach (var charaData in _charas) + { + if (charaData.IsTouchingMune(true, true)) + { + charaData.FireParticles(false); + _touchingDelayTimer = 1f; + } + } + } + else + { + _touchingDelayTimer -= Time.deltaTime; + } + } + else + { + _touchingDelayTimer = 0; + } + } + + // Regenerate milk over time + foreach (var charaData in _charas) + { + if (PregnancyPlugin.LactationFillTime.Value == 0) + { + charaData.CurrentMilk = charaData.MaxMilk; + } + else + { + // Fully fill in 60 seconds * x + var change = Time.deltaTime / (60f * PregnancyPlugin.LactationFillTime.Value); + charaData.CurrentMilk = Mathf.Min(charaData.CurrentMilk + change * charaData.MaxMilk, charaData.MaxMilk); + } + } + } + + private void OnOrgasm() + { + foreach (var charaData in _charas) + charaData.FireParticles(true); + } + + private class CharaData + { + private readonly HParticleCtrl _particleCtrl; + private readonly HandCtrl _procHand; + + public readonly ChaControl ChaControl; + + // Range from 0 to 1 + public readonly float MaxMilk; + private HParticleCtrl.ParticleInfo _partHeavyL; + + private HParticleCtrl.ParticleInfo _partHeavyR; + private HParticleCtrl.ParticleInfo _partLightL; + private HParticleCtrl.ParticleInfo _partLightR; + + private int _singleTriggerCount; + + // Range from 0 to MaxMilk + public float CurrentMilk; + + public CharaData(ChaControl chaControl, HParticleCtrl particleCtrl, HandCtrl procHand) + { + ChaControl = chaControl ? chaControl : throw new ArgumentNullException(nameof(chaControl)); + _procHand = procHand ? procHand : throw new ArgumentNullException(nameof(procHand)); + _particleCtrl = particleCtrl ? particleCtrl : throw new ArgumentNullException(nameof(particleCtrl)); + + var controller = chaControl.GetComponent(); + MaxMilk = GetMilkAmount(controller); + CurrentMilk = MaxMilk; + } + + private static float GetMilkAmount(PregnancyCharaController controller) + { + if (controller == null) return 0; + if (PregnancyPlugin.LactationForceMaxCapacity.Value) return 1; + var data = controller.Data; + if (data.AlwaysLactates) return 1; + // Gradually increase + if (data.IsPregnant) return Mathf.Clamp01(data.Week / 40f); + // Gradually decrease after pregnancy finishes + if (data.PregnancyCount > 0) return 1 - Mathf.Clamp01(data.WeeksSinceLastPregnancy / (40f / PregnancyPlugin.PregnancyProgressionSpeed.Value)); + return 0; + } + + public bool IsTouchingMune(bool l, bool r) + { + for (var i = 0; i < 3; i++) + { + var useItemStickArea = _procHand.GetUseItemStickArea(i); + if (useItemStickArea == HandCtrl.AibuColliderKind.muneL && l || + useItemStickArea == HandCtrl.AibuColliderKind.muneR && r) return true; + } + + return false; + } + + public void FireParticles(bool orgasm) + { + var clothesState = ChaControl.fileStatus.clothesState; + // Only trigger when the top clothes are not present or removed + if ((!ChaControl.IsClothesStateKind(0) || clothesState[0] != 0) && + (!ChaControl.IsClothesStateKind(2) || clothesState[2] != 0)) + { + //PregnancyPlugin.Logger.LogDebug( + // $"OnOrgasm > CurrentMilk level for chara {ChaControl.chaFile.parameter.fullname}: {Mathf.RoundToInt(CurrentMilk * 100)}%"); + + InitializeParticles(); + + if (CurrentMilk >= MoreMilk) + { + if (orgasm) + OnOrgasm(true); + else + OnSingle(true); + } + else if (CurrentMilk >= MinimumMilk) + { + if (orgasm) + OnOrgasm(false); + else + OnSingle(false); + } + } + } + + private void OnSingle(bool large) + { + if (IsTouchingMune(true, false)) + { + _partLightL.particle.Simulate(0f); + _partLightL.particle.Play(); + CurrentMilk -= 0.025f; + } + + if (IsTouchingMune(false, true)) + { + _partLightR.particle.Simulate(0f); + _partLightR.particle.Play(); + CurrentMilk -= 0.025f; + } + + ChaControl.StartCoroutine(OnSingleCo()); + + if (_singleTriggerCount++ == 4) + { + var currentState = ChaControl.GetSiruFlags(ChaFileDefine.SiruParts.SiruFrontUp); + if (currentState < 1) // Only go up to the 1st level since quantity is lower + ChaControl.SetSiruFlags(ChaFileDefine.SiruParts.SiruFrontUp, (byte)(currentState + 1)); + } + } + + private IEnumerator OnSingleCo() + { + yield return new WaitForSeconds(0.3f); + //_partHeavyL.particle.Stop(); + //_partHeavyR.particle.Stop(); + _partLightL.particle.Stop(); + _partLightR.particle.Stop(); + } + + private void OnOrgasm(bool large) + { + void PlaySoundEffect(ChaControl chaControl, ChaReference.RefObjKey reference) + { + var soundEffectSetting = new Utils.Sound.Setting(Manager.Sound.Type.GameSE3D) + { + bundle = "sound/data/se/h/00/00_00.unity3d", + asset = "khse_06" + }; //todo check if it's still the same asset name + // Alternative sound effect, much longer + //assetBundleName = @"sound/data/se/h/12/12_00.unity3d"; + //assetName = "hse_siofuki"; + + var soundSource = Utils.Sound.Play(soundEffectSetting); + var chaRef = chaControl.GetReferenceInfo(reference); + if (soundSource && chaRef) + soundSource.transform.SetParent(chaRef.transform, false); + } + + PlaySoundEffect(ChaControl, ChaReference.RefObjKey.a_n_bust_f); + + var currentState = ChaControl.GetSiruFlags(ChaFileDefine.SiruParts.SiruFrontUp); + if (large) + { + _partHeavyL.particle.Simulate(0f); + _partHeavyL.particle.Play(); + _partHeavyR.particle.Simulate(0f); + _partHeavyR.particle.Play(); + + CurrentMilk -= 0.35f; + if (currentState < 2) // Has 3 states, value is max 2 + ChaControl.SetSiruFlags(ChaFileDefine.SiruParts.SiruFrontUp, (byte)(currentState + 1)); + } + else + { + _partLightL.particle.Simulate(0f); + _partLightL.particle.Play(); + _partLightR.particle.Simulate(0f); + _partLightR.particle.Play(); + + CurrentMilk -= 0.25f; + if (currentState < 1) // Only go up to the 1st level since quantity is lower + ChaControl.SetSiruFlags(ChaFileDefine.SiruParts.SiruFrontUp, (byte)(currentState + 1)); + } + } + + private void InitializeParticles() + { + // todo what happens when switching characters? + if (_partHeavyR != null) return; + + PregnancyPlugin.Logger.LogDebug("Adding particles to heroine: " + ChaControl.fileParam.fullname); + + _partHeavyR = new HParticleCtrl.ParticleInfo + { + assetPath = @"h/common/00_00.unity3d", + file = "LiquidSiru", + numParent = 1, + nameParent = "a_n_nip_R", + //pos = new Vector3(0f, 0f, 0.05f), + rot = new Vector3(-25f, 0, 0f) + }; + _partLightR = new HParticleCtrl.ParticleInfo + { + assetPath = @"h/common/00_00.unity3d", + file = "LiquidSio", + numParent = 1, + nameParent = "a_n_nip_R", + //pos = new Vector3(0, 0f, 0.05f), + rot = new Vector3(-20, 0, 0) + }; + _partHeavyL = new HParticleCtrl.ParticleInfo + { + assetPath = @"h/common/00_00.unity3d", + file = "LiquidSiru", + numParent = 1, + nameParent = "a_n_nip_L", + //pos = new Vector3(0, 0f, 0.05f), + rot = new Vector3(-25f, 0, 0f) + }; + _partLightL = new HParticleCtrl.ParticleInfo + { + assetPath = @"h/common/00_00.unity3d", + file = "LiquidSio", + numParent = 1, + nameParent = "a_n_nip_L", + //pos = new Vector3(0, 0f, 0.05f), + rot = new Vector3(-20, 0, 0) + }; + + // Load the particles + var particleDic = (Dictionary)AccessTools + .Field(typeof(HParticleCtrl), "dicParticle").GetValue(_particleCtrl); + particleDic[691] = _partHeavyR; + particleDic[692] = _partLightR; + particleDic[693] = _partHeavyL; + particleDic[694] = _partLightL; + _particleCtrl.Load(ChaControl.objBodyBone, 1); + } + } + } +} \ No newline at end of file diff --git a/src/KKS_Pregnancy/PregnancyBoneEffect.cs b/src/KKS_Pregnancy/PregnancyBoneEffect.cs new file mode 100644 index 0000000..610f116 --- /dev/null +++ b/src/KKS_Pregnancy/PregnancyBoneEffect.cs @@ -0,0 +1,127 @@ +using System.Collections.Generic; +using System.Linq; +using KKABMX.Core; +using KKAPI.Maker; +using KKAPI.Studio; +using UnityEngine; + +namespace KK_Pregnancy +{ + public class PregnancyBoneEffect : BoneEffect + { + private readonly PregnancyCharaController _controller; + + private static readonly Dictionary _bellyFullValues = new Dictionary + { + // Belly :scale :position :rotation + {"cf_s_spine01" , new BoneModifierData(new Vector3(1.62f, 1.50f, 1.90f), 1f, new Vector3( 0.00f, 0.00f , 0.05f), new Vector3( 10f, 0f, 0f))}, + {"cf_s_spine02" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.00f, 0.00f , 0.01f), new Vector3(-05f, 0f, 0f))}, + {"cf_s_waist01" , new BoneModifierData(new Vector3(1.25f, 1.55f, 1.70f), 1f, new Vector3( 0.00f, 0.02f , 0.12f), new Vector3( 15f, 0f, 0f))}, + {"cf_s_waist02" , new BoneModifierData(new Vector3(1.17f, 1.00f, 1.00f), 1f, new Vector3( 0.00f, 0.00f , 0.00f), new Vector3( 0f, 0f, 0f))}, + // Skirt + {"cf_d_sk_00_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.00f,-0.02f , 0.14f), new Vector3(-10f, 0f, 0f))}, + {"cf_d_sk_07_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3(-0.03f,-0.02f , 0.12f), new Vector3(-10f, 0f, 0f))}, + {"cf_d_sk_01_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.03f,-0.02f , 0.12f), new Vector3(-10f, 0f, 0f))}, + {"cf_d_sk_06_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3(-0.03f, 0.00f , 0.05f), new Vector3( 0f, 0f, 0f))}, + {"cf_d_sk_02_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.03f, 0.00f , 0.05f), new Vector3( 0f, 0f, 0f))}, + }; + + private static readonly Dictionary _pregnancyFullValues = new Dictionary + { + // Breasts + {"cf_d_bust01_L" , new BoneModifierData(new Vector3(1.2f , 1.2f , 1.2f) , 1f)}, + {"cf_d_bust01_R" , new BoneModifierData(new Vector3(1.2f , 1.2f , 1.2f) , 1f)}, + {"cf_d_bnip01_L" , new BoneModifierData(new Vector3(1.2f , 1.2f , 1.2f) , 1f)}, + {"cf_d_bnip01_R" , new BoneModifierData(new Vector3(1.2f , 1.2f , 1.2f) , 1f)}, + // Butt + {"cf_s_siri_L" , new BoneModifierData(new Vector3(1.1f , 1f , 1.2f) , 1f)}, + {"cf_s_siri_R" , new BoneModifierData(new Vector3(1.1f , 1f , 1.2f) , 1f)}, + // Legs + {"cf_s_thigh00_L", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_thigh00_R", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_thigh01_L", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_thigh01_R", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_thigh02_L", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_thigh02_R", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_thigh03_L", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_thigh03_R", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_leg01_L" , new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_leg01_R" , new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_leg02_L" , new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + {"cf_s_leg02_R" , new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, + }; + + private static readonly IEnumerable _affectedBoneNames = _bellyFullValues.Keys.Concat(_pregnancyFullValues.Keys).ToArray(); + + public PregnancyBoneEffect(PregnancyCharaController controller) + { + _controller = controller; + } + + public override IEnumerable GetAffectedBones(BoneController origin) + { + if (_controller.Data.IsPregnant || MakerAPI.InsideMaker || StudioAPI.InsideStudio || PregnancyGameController.InsideHScene) + return _affectedBoneNames; + + return Enumerable.Empty(); + } + + public override BoneModifierData GetEffect(string bone, BoneController origin, ChaFileDefine.CoordinateType coordinate) + { + var isPregnant = _controller.Data.IsPregnant; + if (isPregnant) + { + if (_pregnancyFullValues.TryGetValue(bone, out var mod)) + { + var prEffect = GetPregnancyEffectPercent(); + return LerpModifier(mod, prEffect); + } + } + + if (isPregnant || _controller.IsInflated) + { + if (_bellyFullValues.TryGetValue(bone, out var mod)) + { + var prEffect = GetPregnancyEffectPercent(); + var infEffect = _controller.GetInflationEffectPercent() + prEffect / 2; + + var bellySize = Mathf.Max(prEffect, infEffect); + + return LerpModifier(mod, bellySize); + } + } + + return null; + } + + private static BoneModifierData LerpModifier(BoneModifierData mod, float bellySize) + { + return new BoneModifierData( + new Vector3( + Mathf.Lerp(1f, mod.ScaleModifier.x, bellySize), + Mathf.Lerp(1f, mod.ScaleModifier.y, bellySize), + Mathf.Lerp(1f, mod.ScaleModifier.z, bellySize)), + Mathf.Lerp(1f, mod.LengthModifier, bellySize), + new Vector3( + Mathf.Lerp(0f, mod.PositionModifier.x, bellySize), + Mathf.Lerp(0f, mod.PositionModifier.y, bellySize), + Mathf.Lerp(0f, mod.PositionModifier.z, bellySize)), + new Vector3( + Mathf.Lerp(0f, mod.RotationModifier.x, bellySize), + Mathf.Lerp(0f, mod.RotationModifier.y, bellySize), + Mathf.Lerp(0f, mod.RotationModifier.z, bellySize))); + } + + /// + /// 0-1 + /// + public float GetPregnancyEffectPercent() + { + if (_controller.Data.Week > PregnancyData.LeaveSchoolWeek) return 0; + // Don't show any effect at week 1 since it begins right after winning a child lottery + // also reduce belly size in the 2nd week based on the time step to avoid huge bellies causing a large belly to appear out of nowhere very early + var progressionSpeed = Mathf.Ceil(PregnancyPlugin.PregnancyProgressionSpeed.Value / 2f); + return Mathf.Clamp01((_controller.Data.Week - progressionSpeed) / (PregnancyData.LeaveSchoolWeek - progressionSpeed)); + } + } +} \ No newline at end of file diff --git a/src/KKS_Pregnancy/PregnancyCharaController.cs b/src/KKS_Pregnancy/PregnancyCharaController.cs new file mode 100644 index 0000000..050a6a4 --- /dev/null +++ b/src/KKS_Pregnancy/PregnancyCharaController.cs @@ -0,0 +1,224 @@ +using System; +using KKABMX.Core; +using KKAPI; +using KKAPI.Chara; +using KKAPI.MainGame; +using KKAPI.Maker; +using UnityEngine; + +namespace KK_Pregnancy +{ + public class PregnancyCharaController : CharaCustomFunctionController + { + private readonly PregnancyBoneEffect _boneEffect; + public PregnancyData Data { get; private set; } + + public PregnancyCharaController() + { + Data = new PregnancyData(); + _boneEffect = new PregnancyBoneEffect(this); + } + + [Obsolete] + public float GetPregnancyEffectPercent() => _boneEffect.GetPregnancyEffectPercent(); + + public bool CanGetDangerousDays() + { + return Data.Week <= 1; + } + + public void SaveData() + { + SetExtendedData(Data.Save()); + } + + public void ReadData() + { + var data = GetExtendedData(); + Data = PregnancyData.Load(data) ?? new PregnancyData(); + + // PregnancyPlugin.Logger.LogDebug($"Preg - ReadData week {Data.Week} {ChaControl.name}"); + + if (!CanGetDangerousDays()) + { + // Force the girl to always be on the safe day, happens every day after day of conception + var heroine = ChaControl.GetHeroine(); + if (heroine != null) + HFlag.SetMenstruation(heroine, HFlag.MenstruationType.安全日); + } + } + + protected override void OnCardBeingSaved(GameMode currentGameMode) + { + SaveData(); + } + + protected override void OnReload(GameMode currentGameMode) + { + if (!GameAPI.InsideHScene) + { + _inflationChange = 0; + _inflationAmount = 0; + } + + // Parameters are false by default in class chara maker, so we need to load them the 1st time to not lose progress + // !MakerAPI.InsideAndLoaded is true when the initial card is being loaded into maker so we can use that + if (!MakerAPI.InsideAndLoaded || MakerAPI.GetCharacterLoadFlags()?.Parameters != false) + { + ReadData(); + + GetComponent().AddBoneEffect(_boneEffect); + } + } + + internal static byte[] GetMenstruationsArr(MenstruationSchedule menstruationSchedule) + { + switch (menstruationSchedule) + { + default: + return HFlag.menstruations; + case MenstruationSchedule.MostlyRisky: + return _menstruationsRisky; + case MenstruationSchedule.AlwaysSafe: + return _menstruationsAlwaysSafe; + case MenstruationSchedule.AlwaysRisky: + return _menstruationsAlwaysRisky; + } + } + + private static readonly byte[] _menstruationsRisky = { + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0 + }; + + // Always needs at least one day of different type to prevent infinite loop when trying to set that type of day + private static readonly byte[] _menstruationsAlwaysSafe = { + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + }; + + // Always needs at least one day of different type to prevent infinite loop when trying to set that type of day + private static readonly byte[] _menstruationsAlwaysRisky = { + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + }; + + #region Inflation + + private float _inflationChange; + private int _inflationAmount; + + public int InflationAmount + { + get => _inflationAmount; + set => _inflationAmount = Mathf.Clamp(value, 0, PregnancyPlugin.InflationMaxCount.Value); + } + + public bool IsInflated => InflationAmount + _inflationChange > 0.01f; + + /// + /// 0-1 + /// + public float GetInflationEffectPercent() + { + return Mathf.Clamp01((InflationAmount + _inflationChange) / PregnancyPlugin.InflationMaxCount.Value); + } + + public void AddInflation(int amount) + { + var orig = InflationAmount; + InflationAmount += amount; + var change = InflationAmount - orig; + _inflationChange -= change; + } + + public void DrainInflation(int amount) + { + var orig = InflationAmount; + InflationAmount -= amount; + var change = orig - InflationAmount; + _inflationChange += change; + } + + protected override void Update() + { + base.Update(); + + if (GameAPI.InsideHScene) + { + if (PregnancyPlugin.InflationEnable.Value) + { + float GetInflationChange() + { + //var inflationChange = Time.deltaTime / 2 + Time.deltaTime * _inflationChange / 3; + return Mathf.Max((0.1f * PregnancyPlugin.InflationSpeed.Value) * Time.deltaTime, + Mathf.Abs(Time.deltaTime * (_inflationChange * PregnancyPlugin.InflationSpeed.Value) / 4)); + } + + if (_inflationChange > 0.05f) + { + _inflationChange = Mathf.Max(0, _inflationChange - GetInflationChange()); + } + else if (_inflationChange < -0.05f) + { + _inflationChange = Mathf.Min(0, _inflationChange + GetInflationChange()); + + if (PregnancyPlugin.InflationOpenClothAtMax.Value && + InflationAmount >= PregnancyPlugin.InflationMaxCount.Value) + { + // 0 is fully on + if (ChaControl.fileStatus.clothesState[(int)ChaFileDefine.ClothesKind.top] == 0) + ChaControl.SetClothesStateNext((int)ChaFileDefine.ClothesKind.top); + } + } + } + else + { + _inflationChange = 0; + _inflationAmount = 0; + } + } + } + + #endregion + } +} \ No newline at end of file diff --git a/src/KKS_Pregnancy/PregnancyGameController.cs b/src/KKS_Pregnancy/PregnancyGameController.cs new file mode 100644 index 0000000..1aa3d81 --- /dev/null +++ b/src/KKS_Pregnancy/PregnancyGameController.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using ExtensibleSaveFormat; +using KKAPI.Chara; +using KKAPI.MainGame; +using Manager; +using UnityEngine; +using Random = UnityEngine.Random; +using ActionGame; + +namespace KK_Pregnancy +{ + public class PregnancyGameController : GameCustomFunctionController + { + private static readonly HashSet _startedPregnancies = new HashSet(); + + internal static bool InsideHScene { get; private set; } + + protected override void OnDayChange(Cycle.Week day) + { + // Use Sunday for weekly stuff because it is always triggered (all other days can get skipped) + if (day == Cycle.Week.Holiday) + { + // At start of each week increase pregnancy week counters of all pregnant characters + ApplyToAllDatas((chara, data) => AddPregnancyWeek(data)); + } + } + + protected override void OnStartH(MonoBehaviour proc, HFlag hFlag, bool vr) + { + InsideHScene = true; + proc.gameObject.AddComponent(); + } + + protected override void OnEndH(MonoBehaviour proc, HFlag hFlag, bool vr) + { + InsideHScene = false; + Destroy(proc.GetComponent()); + + // Figure out if conception happened at end of h scene + // bug Don't know which character is which + if (hFlag.mode == HFlag.EMode.houshi3P || hFlag.mode == HFlag.EMode.sonyu3P) return; + + var heroine = hFlag.lstHeroine.First(x => x != null); + var isDangerousDay = HFlag.GetMenstruation(heroine.MenstruationDay) == HFlag.MenstruationType.危険日; + if (!isDangerousDay) return; + + var cameInside = PregnancyPlugin.ConceptionEnabled.Value && hFlag.count.sonyuInside > 0; + var cameInsideAnal = PregnancyPlugin.AnalConceptionEnabled.Value && hFlag.count.sonyuAnalInside > 0; + if (cameInside || cameInsideAnal) + { + var controller = heroine.chaCtrl.GetComponent(); + if (controller == null) throw new ArgumentNullException(nameof(controller)); + + //Allow pregnancy if enabled, or overridden, and is not currently pregnant + if (!controller.Data.GameplayEnabled || controller.Data.IsPregnant) return; + + var fertility = Mathf.Max(PregnancyPlugin.FertilityOverride.Value, controller.Data.Fertility); + + var winThreshold = Mathf.RoundToInt(fertility * 100); + var childLottery = Random.Range(1, 100); + //Logger.Log(LogLevel.Debug, $"Preg - OnEndH calc pregnancy chance {childLottery} to {winThreshold}"); + var wonAChild = winThreshold >= childLottery; + if (wonAChild) + { + //Logger.Log(LogLevel.Debug, "Preg - child lottery won, pregnancy will start"); + _startedPregnancies.Add(heroine); + } + } + } + + protected override void OnGameLoad(GameSaveLoadEventArgs args) + { + _startedPregnancies.Clear(); + } + + protected override void OnGameSave(GameSaveLoadEventArgs args) + { + ProcessPendingChanges(); + } + + protected override void OnPeriodChange(Cycle.Type period) + { + ProcessPendingChanges(); + } + + private static void ProcessPendingChanges() + { + ApplyToAllDatas((chara, data) => + { + if (chara is SaveData.Heroine heroine && _startedPregnancies.Contains(heroine) && !data.IsPregnant) + { + data.StartPregnancy(); + return true; + } + return false; + }); + _startedPregnancies.Clear(); + } + + private static void ApplyToAllDatas(Func action) + { + void ApplyToDatas(SaveData.CharaData character) + { + var chafiles = character.GetRelatedChaFiles(); + if (chafiles == null) return; + foreach (var chaFile in chafiles) + { + var data = ExtendedSave.GetExtendedDataById(chaFile, PregnancyPlugin.GUID); + var pd = PregnancyData.Load(data) ?? new PregnancyData(); + if (action(character, pd)) + ExtendedSave.SetExtendedDataById(chaFile, PregnancyPlugin.GUID, pd.Save()); + } + } + + foreach (var heroine in Game.HeroineList) ApplyToDatas(heroine); + ApplyToDatas(Game.Player); + + // If controller exists then update its state so it gets any pregnancy week updates + foreach (var controller in FindObjectsOfType()) + controller.ReadData(); + } + + private static bool AddPregnancyWeek(PregnancyData pd) + { + if (pd == null || !pd.GameplayEnabled) return false; + + if (pd.IsPregnant) + { + if (pd.Week < PregnancyData.LeaveSchoolWeek) + { + // Advance through in-school at full configured speed + var weekChange = PregnancyPlugin.PregnancyProgressionSpeed.Value; + pd.Week = Mathf.Min(PregnancyData.LeaveSchoolWeek, pd.Week + weekChange); + } + else if (pd.Week < PregnancyData.ReturnToSchoolWeek) + { + // Make sure at least one week is spent out of school + var weekChange = Mathf.Min(PregnancyData.ReturnToSchoolWeek - PregnancyData.LeaveSchoolWeek - 1, PregnancyPlugin.PregnancyProgressionSpeed.Value); + pd.Week = pd.Week + weekChange; + } + + if (pd.Week >= PregnancyData.ReturnToSchoolWeek) + pd.Week = 0; + // PregnancyPlugin.Logger.LogDebug($"Preg - pregnancy week is now {pd.Week}"); + } + else if (pd.PregnancyCount > 0) + { + pd.WeeksSinceLastPregnancy++; + } + + return true; + } + } +} diff --git a/src/KKS_Pregnancy/PregnancyPlugin.Hooks.cs b/src/KKS_Pregnancy/PregnancyPlugin.Hooks.cs new file mode 100644 index 0000000..855940a --- /dev/null +++ b/src/KKS_Pregnancy/PregnancyPlugin.Hooks.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using ExtensibleSaveFormat; +using HarmonyLib; +using KKAPI.MainGame; +using Manager; +using UnityEngine; + +namespace KK_Pregnancy +{ + public partial class PregnancyPlugin + { + private static class Hooks + { + public static void InitHooks(Harmony harmonyInstance) + { + harmonyInstance.PatchAll(typeof(Hooks)); + + PatchNPCLoadAll(harmonyInstance, new HarmonyMethod(typeof(Hooks), nameof(NPCLoadAllTpl))); + } + + private static bool _lastPullProc; + + #region Custom safe day schedule + + private static SaveData.Heroine _lastHeroine; + private static byte[] _menstruationsBackup; + + + [HarmonyPostfix] + [HarmonyPatch(typeof(SaveData.Heroine), nameof(SaveData.Heroine.MenstruationDay), MethodType.Getter)] + private static void LastAccessedHeroinePatch(SaveData.Heroine __instance) + { + _lastHeroine = __instance; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(HFlag), nameof(HFlag.GetMenstruation), typeof(byte))] + private static void GetMenstruationOverridePrefix() + { + if (_lastHeroine != null) + { + // Get a schedule directly this way since the controller is not spawned in class roster + var schedule = _lastHeroine.GetRelatedChaFiles() + .Select(c => PregnancyData.Load(ExtendedSave.GetExtendedDataById(c, GUID))?.MenstruationSchedule ?? MenstruationSchedule.Default) + .FirstOrDefault(x => x != MenstruationSchedule.Default); + + _menstruationsBackup = HFlag.menstruations; + HFlag.menstruations = PregnancyCharaController.GetMenstruationsArr(schedule); + } + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(HFlag), nameof(HFlag.GetMenstruation), typeof(byte))] + private static void GetMenstruationOverridePostfix() + { + if (_menstruationsBackup != null) + { + HFlag.menstruations = _menstruationsBackup; + _menstruationsBackup = null; + } + } + + #endregion + + #region Preg leave from school + + /// + /// Needed for preventing characters from going to school when on leave after pregnancy + /// + private static void PatchNPCLoadAll(Harmony instance, HarmonyMethod transpiler) + { + var t = typeof(ActionScene).GetNestedTypes(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).Single(x => x.Name.StartsWith("c__Iterator")); + var m = t.GetMethod("MoveNext"); + instance.Patch(m, null, null, transpiler); + } + + private static IEnumerable NPCLoadAllTpl(IEnumerable instructions) + { + var target = AccessTools.Property(typeof(Game), nameof(Game.HeroineList)).GetGetMethod(); + var customFilterM = AccessTools.Method(typeof(Hooks), nameof(GetFilteredHeroines)); + foreach (var instruction in instructions) + { + yield return instruction; + + if (instruction.operand == target) + { + // Grab the return of get_HeroineList and process it + yield return new CodeInstruction(OpCodes.Call, customFilterM); + } + } + } + + #endregion Preg leave from school + + private static bool CanGetSpawned(SaveData.Heroine heroine) + { + var isOnLeave = heroine.GetRelatedChaFiles() + .Any(c => + { + var pd = PregnancyData.Load(ExtendedSave.GetExtendedDataById(heroine.charFile, GUID)); + if (pd == null) return false; + return pd.GameplayEnabled && pd.Week >= PregnancyData.LeaveSchoolWeek; + }); + return !isOnLeave; + } + + private static List GetFilteredHeroines(List originalList) + { + var filteredHeroines = originalList.Where(CanGetSpawned).ToList(); + return filteredHeroines; + } + + #region Inflation + + // todo separate anal/vag? + [HarmonyPrefix] + [HarmonyPatch(typeof(HFlag), nameof(HFlag.AddSonyuInside))] + [HarmonyPatch(typeof(HFlag), nameof(HFlag.AddSonyuAnalInside))] + [HarmonyPatch(typeof(HFlag), nameof(HFlag.AddHoushiDrink))] + public static void OnFinishInside(HFlag __instance) + { + var heroine = GetLeadHeroine(__instance); + var controller = GetEffectController(heroine); + controller.AddInflation(1); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(HFlag), nameof(HFlag.AddSonyuTare))] + [HarmonyPatch(typeof(HFlag), nameof(HFlag.AddSonyuAnalTare))] + public static void OnDrain(HFlag __instance) + { + var heroine = GetLeadHeroine(__instance); + var controller = GetEffectController(heroine); + controller.DrainInflation(Mathf.Max(3, Mathf.CeilToInt(InflationMaxCount.Value / 2.2f))); + } + + private static PregnancyCharaController GetEffectController(SaveData.Heroine heroine) + { + return heroine?.chaCtrl != null ? heroine.chaCtrl.GetComponent() : null; + } + + private static SaveData.Heroine GetLeadHeroine(HFlag hflag) + { + var id = hflag.mode == HFlag.EMode.houshi3P || hflag.mode == HFlag.EMode.sonyu3P ? hflag.nowAnimationInfo.id % 2 : 0; + return hflag.lstHeroine[id]; + } + + #endregion + } + } +} diff --git a/src/KKS_Pregnancy/PregnancyPlugin.cs b/src/KKS_Pregnancy/PregnancyPlugin.cs new file mode 100644 index 0000000..f4094ab --- /dev/null +++ b/src/KKS_Pregnancy/PregnancyPlugin.cs @@ -0,0 +1,96 @@ +using BepInEx; +using BepInEx.Configuration; +using BepInEx.Logging; +using HarmonyLib; +using KKABMX.Core; +using KKAPI; +using KKAPI.Chara; +using KKAPI.MainGame; + +namespace KK_Pregnancy +{ + [BepInPlugin(GUID, GUID, Version)] + [BepInDependency(KKABMX_Core.GUID, KKABMX_Core.Version)] + [BepInDependency(KoikatuAPI.GUID, KoikatuAPI.VersionConst)] + public partial class PregnancyPlugin : BaseUnityPlugin + { + public const string GUID = "KK_Pregnancy"; + public const string Version = "2.5.2"; + + public static ConfigEntry ConceptionEnabled { get; private set; } + public static ConfigEntry FertilityOverride { get; private set; } + public static ConfigEntry AnalConceptionEnabled { get; private set; } + public static ConfigEntry ShowPregnancyIconEarly { get; private set; } + public static ConfigEntry PregnancyProgressionSpeed { get; private set; } + public static ConfigEntry HSceneMenstrIconOverride { get; private set; } + + public static ConfigEntry InflationEnable { get; private set; } + public static ConfigEntry InflationSpeed { get; private set; } + public static ConfigEntry InflationOpenClothAtMax { get; private set; } + public static ConfigEntry InflationMaxCount { get; private set; } + + public static ConfigEntry LactationEnabled { get; private set; } + public static ConfigEntry LactationFillTime { get; private set; } + public static ConfigEntry LactationForceMaxCapacity { get; private set; } + + internal static new ManualLogSource Logger { get; private set; } + + private void Start() + { + Logger = base.Logger; + + PregnancyProgressionSpeed = Config.Bind("General", "Pregnancy progression speed", 4, + new ConfigDescription("How much faster does the in-game pregnancy progresses than the standard 40 weeks. " + + "It also reduces the time characters leave school for after birth.\n\n" + + "x1 is 40 weeks, x2 is 20 weeks, x4 is 10 weeks, x10 is 4 weeks.", + new AcceptableValueList(1, 2, 4, 10))); + + ConceptionEnabled = Config.Bind("General", "Enable conception", true, + "Allows characters to get pregnant from vaginal sex. Doesn't affect already pregnant characters."); + + FertilityOverride = Config.Bind("General", "Minimum fertility level", 0f, + new ConfigDescription("If a character has a lower fertility level than this set, this level will be used instead. \n\n" + + "0 - The value saved in the character card is used (30% by default)\n" + + "30%, 50%, 75%, 100% - If the character card's saved value is lower, it will be raised to this level in HScenes.", + new AcceptableValueList(0f, 0.3f, 0.5f, 0.75f, 1f))); + + AnalConceptionEnabled = Config.Bind("General", "Enable anal conception", false, + "Allows characters to get pregnant from anal sex. Doesn't affect already pregnant characters."); + + ShowPregnancyIconEarly = Config.Bind("General", "Show pregnancy icon early", false, + "By default pregnancy status icon in class roster is shown after a few days or weeks (the character had a chance to do the test or noticed something is wrong).\n" + + "Turning this on will always make the icon show up at the end of the current day."); + + HSceneMenstrIconOverride = Config.Bind("General", "Use custom safe/risky icons in H Scenes", true, + "Replaces the standard safe/risky indicators with custom indicators that can also show pregnancy and unknown status. " + + "If the status is unknown you will have to listen for the voice cues instead.\nChanges take effect after game restart."); + + InflationEnable = Config.Bind("Inflation", "Enable inflation", true, "Turn on the inflation effect."); + + InflationSpeed = Config.Bind("Inflation", "Inflation speed modifier", 1, + new ConfigDescription("How quickly the belly will inflate/deflate compared to normal (1x, 2x, 3x as fast).", new AcceptableValueList(1, 2, 3))); + + InflationOpenClothAtMax = Config.Bind("Inflation", "Open clothes at max inflation", true, + "If clothes are fully on, open them when inflation reaches the max value (they 'burst' open)."); + + InflationMaxCount = Config.Bind("Inflation", "Cum count until full", 8, + new ConfigDescription("How many times you have to let out inside to reach the maximum belly size.", new AcceptableValueRange(2, 15))); + + LactationEnabled = Config.Bind("Lactation", "Enable lactation", true, + "Enable the lactation effect. For the effect to work the character has to be pregnant, or the override setting has to be enabled."); + + LactationFillTime = Config.Bind("Lactation", "Time to fully refill", 5, + new ConfigDescription("How many minutes it takes to fully refill the milk. 0 is always fully refilled.", new AcceptableValueRange(0, 10))); + + LactationForceMaxCapacity = Config.Bind("Lactation", "Force max milk capacity", false, + "If enabled, all characters will lactate and have full capacity. If off, capacity depends on the pregnancy progress."); + + CharacterApi.RegisterExtraBehaviour(GUID); + GameAPI.RegisterExtraBehaviour(GUID); + + var hi = new Harmony(GUID); + Hooks.InitHooks(hi); + PregnancyGui.Init(hi, this); + } + } +} diff --git a/src/KKS_Pregnancy/Properties/AssemblyInfo.cs b/src/KKS_Pregnancy/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f252522 --- /dev/null +++ b/src/KKS_Pregnancy/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using KK_Pregnancy; + +// 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("KK_Pregnancy")] +[assembly: AssemblyDescription("Adds pregnancy to the gameplay and character creation")] +[assembly: AssemblyCompany("https://github.com/ManlyMarco/KoikatuGameplayMods")] +[assembly: AssemblyProduct("KK_Pregnancy")] +[assembly: AssemblyCopyright("Copyright © 2019")] + +// 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("930a00a6-2935-4ea0-81f0-b16d3e71b74c")] + +// 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(PregnancyPlugin.Version)] diff --git a/src/KKS_Pregnancy/Resources/leave.png b/src/KKS_Pregnancy/Resources/leave.png new file mode 100644 index 0000000000000000000000000000000000000000..5498a4a36fc1272da15cb502166231f4f6cf45ae GIT binary patch literal 4228 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

A(nsS>6$iP3^?xMpj}cEJsY? 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 z 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 q)SK+exr*?+cf&J>2v!5YZu?)bT7STS{Q7F(^8 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 eYwxv*?SBE={}_;pGSZp=0000 literal 0 HcmV?d00001 diff --git a/src/KKS_Pregnancy/Resources/risky.png b/src/KKS_Pregnancy/Resources/risky.png new file mode 100644 index 0000000000000000000000000000000000000000..8592f84b5e2f976cc2fd9aa43c16c3a0d280e493 GIT binary patch literal 3399 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 d`e0K5GEBl| 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 literal 0 HcmV?d00001 diff --git a/src/KKS_Pregnancy/Resources/unknown.png b/src/KKS_Pregnancy/Resources/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..e99268e9d41bbbb30ee2993ba67b85e9129fe908 GIT binary patch literal 3436 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 O0000 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/KoikatuGameplayMod.sln b/src/KoikatuGameplayMod.sln index 63a8d1d..f4371d3 100644 --- a/src/KoikatuGameplayMod.sln +++ b/src/KoikatuGameplayMod.sln @@ -41,7 +41,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KKS_GameplayMod", "KKS_Game EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Core_GameplayMod", "Core_GameplayMod\Core_GameplayMod.shproj", "{C9650F99-DF26-4D54-9826-5F77275C9D31}" EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Core_Pregnancy", "Core_Pregnancy\Core_Pregnancy.shproj", "{EEBF32ED-C125-4597-8B3D-4E7E44A15626}" +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "KKAI_Pregnancy", "Core_Pregnancy\KKAI_Pregnancy.shproj", "{EEBF32ED-C125-4597-8B3D-4E7E44A15626}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KKS_Pregnancy", "KKS_Pregnancy\KKS_Pregnancy.csproj", "{736EB022-A7B9-43AA-95C3-05A84B57F7E7}" EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution @@ -117,6 +119,10 @@ Global {15A4DF23-86EA-49B4-B120-E8F123F8DAFE}.Debug|Any CPU.Build.0 = Debug|Any CPU {15A4DF23-86EA-49B4-B120-E8F123F8DAFE}.Release|Any CPU.ActiveCfg = Release|Any CPU {15A4DF23-86EA-49B4-B120-E8F123F8DAFE}.Release|Any CPU.Build.0 = Release|Any CPU + {736EB022-A7B9-43AA-95C3-05A84B57F7E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {736EB022-A7B9-43AA-95C3-05A84B57F7E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {736EB022-A7B9-43AA-95C3-05A84B57F7E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {736EB022-A7B9-43AA-95C3-05A84B57F7E7}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -132,6 +138,7 @@ Global {15A4DF23-86EA-49B4-B120-E8F123F8DAFE} = {5DECD423-5B05-4F46-AB72-7CA9CCB27E0C} {C9650F99-DF26-4D54-9826-5F77275C9D31} = {5DECD423-5B05-4F46-AB72-7CA9CCB27E0C} {EEBF32ED-C125-4597-8B3D-4E7E44A15626} = {1C61B7E0-3603-4193-9B05-A5FF0CAFBD11} + {736EB022-A7B9-43AA-95C3-05A84B57F7E7} = {1C61B7E0-3603-4193-9B05-A5FF0CAFBD11} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {19B0272D-3305-4C60-8DD9-E15889B2FF54} From 48b8f372aa4252dabedac9b64cbab015c2ecc938 Mon Sep 17 00:00:00 2001 From: ManlyMarco <39247311+ManlyMarco@users.noreply.github.com> Date: Mon, 25 Oct 2021 04:15:32 +0200 Subject: [PATCH 3/4] Split AI and KK/KKS preg code --- src/AI_Pregnancy/AI_Pregnancy.csproj | 23 +- .../Data/HeroineStatus.cs | 0 .../Data/MenstruationSchedule.cs | 0 .../Data/PregnancyData.cs | 30 +- src/AI_Pregnancy/Data/PregnancyDataUtils.cs | 92 +++ .../GUI/PregnancyGui.StatusIcons.cs | 267 +++++++++ src/AI_Pregnancy/GUI/PregnancyGui.cs | 110 ++++ .../PregnancyBoneEffect.cs | 106 +--- .../PregnancyCharaController.cs | 37 +- .../PregnancyGameController.cs | 134 ----- src/AI_Pregnancy/PregnancyPlugin.Hooks.cs | 116 ++++ .../PregnancyPlugin.cs | 48 +- .../Properties/AssemblyInfo.cs | 0 .../Resources/leave.png | Bin .../Resources/preg_icon.xcf | Bin .../Resources/pregnant.png | Bin .../Resources/risky.png | Bin .../Resources/safe.png | Bin .../Resources/unknown.png | Bin src/Core_Pregnancy/Data/PregnancyDataUtils.cs | 178 ------ .../GUI/PregnancyGui.StatusIcons.cs | 528 ------------------ src/Core_Pregnancy/PregnancyPlugin.Hooks.cs | 272 --------- .../AssemblyInfo.cs | 0 .../Core_Pregnancy_KK.projitems} | 16 +- .../Core_Pregnancy_KK.shproj} | 4 +- .../Data/HeroineStatus.cs | 0 .../Data/MenstruationSchedule.cs | 0 .../Data/PregnancyData.cs | 0 .../Data/PregnancyDataUtils.cs | 2 +- .../LactationController.cs | 9 +- .../PregnancyBoneEffect.cs | 0 .../PregnancyCharaController.cs | 0 .../PregnancyGameController.cs | 14 +- .../PregnancyPlugin.Hooks.cs | 0 .../PregnancyPlugin.cs | 0 src/KKS_Pregnancy/KKS_Pregnancy.csproj | 25 +- .../GUI/PregnancyGui.StatusIcons.cs | 361 ++++++++++++ .../GUI/PregnancyGui.cs | 32 +- src/KK_Pregnancy/KK_Pregnancy.csproj | 56 +- src/KK_Pregnancy/LactationController.cs | 331 ----------- src/KK_Pregnancy/Resources/leave.png | Bin 0 -> 4228 bytes src/KK_Pregnancy/Resources/preg_icon.xcf | Bin 0 -> 283362 bytes src/KK_Pregnancy/Resources/pregnant.png | Bin 0 -> 4440 bytes src/KK_Pregnancy/Resources/risky.png | Bin 0 -> 3399 bytes src/KK_Pregnancy/Resources/safe.png | Bin 0 -> 3663 bytes src/KK_Pregnancy/Resources/unknown.png | Bin 0 -> 3436 bytes src/KK_Pregnancy/packages.config | 11 +- src/KoikatuGameplayMod.sln | 12 +- 48 files changed, 1100 insertions(+), 1714 deletions(-) rename src/{Core_Pregnancy => AI_Pregnancy}/Data/HeroineStatus.cs (100%) rename src/{Core_Pregnancy => AI_Pregnancy}/Data/MenstruationSchedule.cs (100%) rename src/{KKS_Pregnancy => AI_Pregnancy}/Data/PregnancyData.cs (88%) create mode 100644 src/AI_Pregnancy/Data/PregnancyDataUtils.cs create mode 100644 src/AI_Pregnancy/GUI/PregnancyGui.StatusIcons.cs create mode 100644 src/AI_Pregnancy/GUI/PregnancyGui.cs rename src/{Core_Pregnancy => AI_Pregnancy}/PregnancyBoneEffect.cs (51%) rename src/{Core_Pregnancy => AI_Pregnancy}/PregnancyCharaController.cs (83%) rename src/{Core_Pregnancy => AI_Pregnancy}/PregnancyGameController.cs (63%) create mode 100644 src/AI_Pregnancy/PregnancyPlugin.Hooks.cs rename src/{Core_Pregnancy => AI_Pregnancy}/PregnancyPlugin.cs (63%) rename src/{Core_Pregnancy => AI_Pregnancy}/Properties/AssemblyInfo.cs (100%) rename src/{Core_Pregnancy => AI_Pregnancy}/Resources/leave.png (100%) rename src/{Core_Pregnancy => AI_Pregnancy}/Resources/preg_icon.xcf (100%) rename src/{Core_Pregnancy => AI_Pregnancy}/Resources/pregnant.png (100%) rename src/{Core_Pregnancy => AI_Pregnancy}/Resources/risky.png (100%) rename src/{Core_Pregnancy => AI_Pregnancy}/Resources/safe.png (100%) rename src/{Core_Pregnancy => AI_Pregnancy}/Resources/unknown.png (100%) delete mode 100644 src/Core_Pregnancy/Data/PregnancyDataUtils.cs delete mode 100644 src/Core_Pregnancy/GUI/PregnancyGui.StatusIcons.cs delete mode 100644 src/Core_Pregnancy/PregnancyPlugin.Hooks.cs rename src/{KKS_Pregnancy/Properties => Core_Pregnancy_KK}/AssemblyInfo.cs (100%) rename src/{Core_Pregnancy/Core_Pregnancy.projitems => Core_Pregnancy_KK/Core_Pregnancy_KK.projitems} (58%) rename src/{Core_Pregnancy/KKAI_Pregnancy.shproj => Core_Pregnancy_KK/Core_Pregnancy_KK.shproj} (87%) rename src/{KKS_Pregnancy => Core_Pregnancy_KK}/Data/HeroineStatus.cs (100%) rename src/{KKS_Pregnancy => Core_Pregnancy_KK}/Data/MenstruationSchedule.cs (100%) rename src/{Core_Pregnancy => Core_Pregnancy_KK}/Data/PregnancyData.cs (100%) rename src/{KKS_Pregnancy => Core_Pregnancy_KK}/Data/PregnancyDataUtils.cs (98%) rename src/{KKS_Pregnancy => Core_Pregnancy_KK}/LactationController.cs (98%) rename src/{KKS_Pregnancy => Core_Pregnancy_KK}/PregnancyBoneEffect.cs (100%) rename src/{KKS_Pregnancy => Core_Pregnancy_KK}/PregnancyCharaController.cs (100%) rename src/{KKS_Pregnancy => Core_Pregnancy_KK}/PregnancyGameController.cs (94%) rename src/{KKS_Pregnancy => Core_Pregnancy_KK}/PregnancyPlugin.Hooks.cs (100%) rename src/{KKS_Pregnancy => Core_Pregnancy_KK}/PregnancyPlugin.cs (100%) create mode 100644 src/KK_Pregnancy/GUI/PregnancyGui.StatusIcons.cs rename src/{Core_Pregnancy => KK_Pregnancy}/GUI/PregnancyGui.cs (82%) delete mode 100644 src/KK_Pregnancy/LactationController.cs create mode 100644 src/KK_Pregnancy/Resources/leave.png create mode 100644 src/KK_Pregnancy/Resources/preg_icon.xcf create mode 100644 src/KK_Pregnancy/Resources/pregnant.png create mode 100644 src/KK_Pregnancy/Resources/risky.png create mode 100644 src/KK_Pregnancy/Resources/safe.png create mode 100644 src/KK_Pregnancy/Resources/unknown.png diff --git a/src/AI_Pregnancy/AI_Pregnancy.csproj b/src/AI_Pregnancy/AI_Pregnancy.csproj index 02e98fd..a691b69 100644 --- a/src/AI_Pregnancy/AI_Pregnancy.csproj +++ b/src/AI_Pregnancy/AI_Pregnancy.csproj @@ -97,7 +97,28 @@ + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/src/Core_Pregnancy/Data/HeroineStatus.cs b/src/AI_Pregnancy/Data/HeroineStatus.cs similarity index 100% rename from src/Core_Pregnancy/Data/HeroineStatus.cs rename to src/AI_Pregnancy/Data/HeroineStatus.cs diff --git a/src/Core_Pregnancy/Data/MenstruationSchedule.cs b/src/AI_Pregnancy/Data/MenstruationSchedule.cs similarity index 100% rename from src/Core_Pregnancy/Data/MenstruationSchedule.cs rename to src/AI_Pregnancy/Data/MenstruationSchedule.cs diff --git a/src/KKS_Pregnancy/Data/PregnancyData.cs b/src/AI_Pregnancy/Data/PregnancyData.cs similarity index 88% rename from src/KKS_Pregnancy/Data/PregnancyData.cs rename to src/AI_Pregnancy/Data/PregnancyData.cs index 63fe99b..6c4a846 100644 --- a/src/KKS_Pregnancy/Data/PregnancyData.cs +++ b/src/AI_Pregnancy/Data/PregnancyData.cs @@ -33,12 +33,10 @@ public sealed class PregnancyData public MenstruationSchedule MenstruationSchedule = MenstruationSchedule.Default; - #if AI - ///

- /// The first day that menstraion started in AI - /// - public int MenstrationStartDay = -1; - #endif + /// + /// The first day that menstraion started in AI + /// + public int MenstrationStartDay = -1; /// /// If 0 or negative, the character is not pregant. @@ -126,19 +124,17 @@ public void StartPregnancy() } } - #if AI - public void StartMenstration(int currentDay) + public void StartMenstration(int currentDay) + { + if (!IsPregnant) { - if (!IsPregnant) - { - MenstrationStartDay = currentDay; - } + MenstrationStartDay = currentDay; } + } - public void StopMenstration() - { - MenstrationStartDay = -1; - } - #endif + public void StopMenstration() + { + MenstrationStartDay = -1; + } } } \ No newline at end of file diff --git a/src/AI_Pregnancy/Data/PregnancyDataUtils.cs b/src/AI_Pregnancy/Data/PregnancyDataUtils.cs new file mode 100644 index 0000000..714ccdf --- /dev/null +++ b/src/AI_Pregnancy/Data/PregnancyDataUtils.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using ExtensibleSaveFormat; +using KKAPI.MainGame; +using AIChara; +using AIProject; +using AIProject.SaveData; +using AIProject.Definitions; + +namespace KK_Pregnancy +{ + public static class PregnancyDataUtils + { + private static readonly int[] _earlyDetectPersonalities = { 00, 11, 12, 13, 19, 24, 31, 33 }; + private static readonly int[] _lateDetectPersonalities = { 03, 05, 08, 20, 25, 26, 37 }; + + /// ChaFile to test + ///// The girl knows about it / tested it + public static PregnancyData GetPregnancyData(this ChaFileControl c) + { + if (c == null) return null; + + var d = ExtendedSave.GetExtendedDataById(c, PregnancyPlugin.GUID); + if (d == null) return null; + + return PregnancyData.Load(d); + } + + public static PregnancyData GetPregnancyData(this AgentData heroine) + { + if (heroine == null) return new PregnancyData(); + + // Figure out which data to take if there are multiple + // probably not necessary? null check should be enough? + return heroine.GetRelatedChaFiles() + .Select(GetPregnancyData) + .Where(x => x != null) + .OrderByDescending(x => x.PregnancyCount) + .ThenByDescending(x => x.WeeksSinceLastPregnancy) + .ThenByDescending(x => x.Week) + .ThenByDescending(x => x.GameplayEnabled) + .FirstOrDefault() ?? new PregnancyData(); + } + + public static HeroineStatus GetHeroineStatus(this AgentData heroine, PregnancyData pregData = null) + { + if (heroine == null) return HeroineStatus.Unknown; + if (pregData == null) pregData = heroine.GetPregnancyData(); + + var chaControl = heroine.GetNPC()?.ChaControl; + if (chaControl == null) return HeroineStatus.Unknown; + + // Check if she wants to tell + if (heroine.SickState.ID == AIProject.Definitions.Sickness.GoodHealthID && !heroine.IsWet && + (chaControl.fileGameInfo.phase > 2 + || heroine.StatsTable[(int)Status.Type.Mood] > 95 + || heroine.StatsTable[(int)Status.Type.Immoral] > 95 + || heroine.StatsTable[(int)Status.Type.Motivation] > 140)) + { + + var pregnancyWeek = pregData.Week; + if (pregnancyWeek > 0) + { + if (PregnancyPlugin.ShowPregnancyIconEarly.Value) return HeroineStatus.Pregnant; + // Different personalities notice at different times + if (_earlyDetectPersonalities.Contains(chaControl.fileParam.personality)) + { + if (pregnancyWeek > 1) return HeroineStatus.Pregnant; + } + else if (_lateDetectPersonalities.Contains(chaControl.fileParam.personality)) + { + if (pregnancyWeek > 11) return HeroineStatus.Pregnant; + } + else + { + if (pregnancyWeek > 5) return HeroineStatus.Pregnant; + } + } + + var pregCharCtrl = chaControl.GetComponent(); + return !pregCharCtrl.isDangerousDay + ? HeroineStatus.Safe + : HeroineStatus.Risky; + } + + return HeroineStatus.Unknown; + + } + } +} \ No newline at end of file diff --git a/src/AI_Pregnancy/GUI/PregnancyGui.StatusIcons.cs b/src/AI_Pregnancy/GUI/PregnancyGui.StatusIcons.cs new file mode 100644 index 0000000..a807fb9 --- /dev/null +++ b/src/AI_Pregnancy/GUI/PregnancyGui.StatusIcons.cs @@ -0,0 +1,267 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using AIProject; +using AIProject.UI; +using AIProject.SaveData; +using HarmonyLib; +using KKAPI.Utilities; +using UnityEngine; +using UnityEngine.UI; + +namespace KK_Pregnancy +{ + public static partial class PregnancyGui + { + private class StatusIcons : MonoBehaviour + { + private static Sprite _pregSprite; + private static Sprite _riskySprite; + private static Sprite _safeSprite; + private static Sprite _unknownSprite; + private static Sprite _leaveSprite; + + private const string ICON_NAME = "Pregnancy_Icon"; + + private static readonly List> _currentHeroine = new List>(); + + internal static void Init(Harmony hi, Sprite unknownSprite, Sprite pregSprite, Sprite safeSprite, Sprite riskySprite, Sprite leaveSprite) + { + _unknownSprite = unknownSprite ? unknownSprite : throw new ArgumentNullException(nameof(unknownSprite)); + _pregSprite = pregSprite ? pregSprite : throw new ArgumentNullException(nameof(pregSprite)); + _riskySprite = riskySprite ? riskySprite : throw new ArgumentNullException(nameof(riskySprite)); + _safeSprite = safeSprite ? safeSprite : throw new ArgumentNullException(nameof(safeSprite)); + _leaveSprite = leaveSprite ? leaveSprite : throw new ArgumentNullException(nameof(leaveSprite)); + + hi.PatchAll(typeof(StatusIcons)); + } + + /// + /// Handle char icon for status menu + /// + [HarmonyPostfix] + [HarmonyPatch(typeof(StatusUI), "RefreshAgentContent", typeof(int))] + private static void StatusUI_RefreshAgentContent(StatusUI __instance, int id) + { + + // PregnancyPlugin.Logger.LogDebug("Preg - StatusUI_RefreshAgentContent"); + var objImageRoot = Traverse.Create(__instance).Field("_cardRawImage").GetValue(); + if (objImageRoot == null) return; + + //Ignore player status tab, only want actors + if (id == 0) + { + var existingIcon = objImageRoot.transform.Find(ICON_NAME); + if (existingIcon) Destroy(existingIcon.gameObject); + return; + } + + Singleton.Instance.AgentTable.TryGetValue((id - 1), out AgentActor _heroine); + if (_heroine == null) return; + + SpawnGUI(); + + IEnumerator HeroineCanvasPreviewUpdateCo() + { + yield return new WaitForEndOfFrame(); + + _currentHeroine.Clear(); + // :right :up + SetQuickStatusIcon(objImageRoot.gameObject, _heroine.AgentData, 95f, -80f); + } + + _pluginInstance.StartCoroutine(HeroineCanvasPreviewUpdateCo()); + } + + /// + /// Clear icon if on player status menu + /// + [HarmonyPostfix] + [HarmonyPatch(typeof(StatusUI), "RefreshPlayerContent")] + private static void StatusUI_RefreshAgentContent(StatusUI __instance) + { + var objImageRoot = Traverse.Create(__instance).Field("_cardRawImage").GetValue(); + if (objImageRoot == null) return; + + var existingIcon = objImageRoot.transform.Find(ICON_NAME); + if (existingIcon) Destroy(existingIcon.gameObject); + } + + private static void SpawnGUI() + { + if (!GameObject.Find("PregnancyGUI")) + new GameObject("PregnancyGUI").AddComponent(); + } + + private void OnGUI() + { + if (_currentHeroine.Count == 0) return; + + var pos = new Vector2(Input.mousePosition.x, -(Input.mousePosition.y - Screen.height)); + var heroineRect = _currentHeroine.FirstOrDefault(x => + { + if (x.Value == null) return false; + return GetOccupiedScreenRect(x).Contains(pos); + }); + var chara = heroineRect.Key; + if (chara == null) return; + + var pregData = chara.GetPregnancyData(); + + var status = chara.GetHeroineStatus(pregData); + var heroine = chara as AgentData; + + var windowHeight = status == HeroineStatus.Unknown ? 100 : status == HeroineStatus.Pregnant || status == HeroineStatus.OnLeave ? 180 : 370; + var screenRect = new Rect((int)pos.x + 30, (int)pos.y - windowHeight / 2, 180, windowHeight); + IMGUIUtils.DrawSolidBox(screenRect); + GUILayout.BeginArea(screenRect, GUI.skin.box); + { + GUILayout.BeginVertical(); + { + GUILayout.FlexibleSpace(); + + switch (status) + { + case HeroineStatus.Unknown: + GUILayout.Label("This character didn't tell you their risky day schedule yet."); + GUILayout.FlexibleSpace(); + GUILayout.Label("Become closer to learn it!"); + break; + + case HeroineStatus.OnLeave: + GUILayout.Label("This character is on a maternal leave and will not appear until it is over."); + GUILayout.FlexibleSpace(); + GUILayout.Label("Consider using a rubber next time!"); + break; + + case HeroineStatus.Pregnant: + GUILayout.Label($"This character is pregnant (on week {pregData.Week} / 40)."); + GUILayout.FlexibleSpace(); + if (pregData.GameplayEnabled) + GUILayout.Label(heroine != null ? "The character's body will slowly change, and at the end they will temporarily leave." : "The character's body will slowly change."); + + GUILayout.FlexibleSpace(); + var previousPregcount = Mathf.Max(0, pregData.PregnancyCount - 1); + GUILayout.Label($"This character was pregnant {previousPregcount} times before."); + break; + + case HeroineStatus.Safe: + case HeroineStatus.Risky: + if (heroine == null) break; + + GUILayout.Label(status == HeroineStatus.Safe + ? "This character is on a safe day, have fun!" + : "This character is on a risky day, be careful!"); + //GUILayout.Space(5); + GUILayout.FlexibleSpace(); + + var pregnancyCount = pregData.IsPregnant ? pregData.PregnancyCount - 1 : pregData.PregnancyCount; + if (pregnancyCount > 0) + { + GUILayout.FlexibleSpace(); + GUILayout.Label($"This character was pregnant {pregnancyCount} times."); + } + + if (pregData.WeeksSinceLastPregnancy > 0) + { + GUILayout.FlexibleSpace(); + GUILayout.Label($"Last pregnancy was {pregData.WeeksSinceLastPregnancy} weeks ago."); + } + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + GUILayout.FlexibleSpace(); + } + GUILayout.EndVertical(); + } + GUILayout.EndArea(); + } + + /// + /// Enable/disable pregnancy icon on quick status container + /// + /// The heroine image object + /// Is the preg icon shown + /// Offset from the character image + /// Offset from the character image + private static void SetQuickStatusIcon(GameObject characterImageObj, AgentData heroine, float xOffset, float yOffset) + { + var existing = characterImageObj.transform.Find(ICON_NAME); + + if (heroine == null) + { + if (existing != null) + Destroy(existing.gameObject); + } + else + { + if (existing == null) + { + var newChildIcon = new GameObject(); + newChildIcon.AddComponent(); + newChildIcon.AddComponent(); + + var copy = Instantiate(newChildIcon, characterImageObj.transform); + copy.name = ICON_NAME; + copy.SetActive(true); + + var charRt = characterImageObj.GetComponent(); + var rt = copy.GetComponent(); + rt.anchoredPosition = new Vector2(charRt.anchoredPosition.x + xOffset, charRt.anchoredPosition.y + yOffset); + rt.sizeDelta = new Vector2(48, 48); + + existing = copy.transform; + } + + AddPregIcon(existing, heroine); + } + } + + private static readonly Vector3[] _worldCornersBuffer = new Vector3[4]; + + private static void AddPregIcon(Transform pregIconTransform, AgentData heroine) + { + var image = pregIconTransform.GetComponent(); + + _currentHeroine.Add(new KeyValuePair(heroine, image.GetComponent())); + + var status = heroine.GetHeroineStatus(heroine.GetPregnancyData()); + switch (status) + { + case HeroineStatus.Unknown: + image.sprite = _unknownSprite; + break; + case HeroineStatus.OnLeave: + image.sprite = _leaveSprite; + break; + case HeroineStatus.Safe: + image.sprite = _safeSprite; + break; + case HeroineStatus.Risky: + image.sprite = _riskySprite; + break; + case HeroineStatus.Pregnant: + image.sprite = _pregSprite; + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + private static Rect GetOccupiedScreenRect(KeyValuePair x) + { + x.Value.GetWorldCorners(_worldCornersBuffer); + var screenPos = new Rect( + _worldCornersBuffer[0].x, + Screen.height - _worldCornersBuffer[2].y, + _worldCornersBuffer[2].x - _worldCornersBuffer[0].x, + _worldCornersBuffer[2].y - _worldCornersBuffer[0].y); + return screenPos; + } + } + } +} \ No newline at end of file diff --git a/src/AI_Pregnancy/GUI/PregnancyGui.cs b/src/AI_Pregnancy/GUI/PregnancyGui.cs new file mode 100644 index 0000000..3bc99f4 --- /dev/null +++ b/src/AI_Pregnancy/GUI/PregnancyGui.cs @@ -0,0 +1,110 @@ +using HarmonyLib; +using KKAPI.Chara; +using KKAPI.Maker; +using KKAPI.Maker.UI; +using KKAPI.Studio; +using KKAPI.Studio.UI; +using KKAPI.Utilities; +using UniRx; +using UnityEngine; + +namespace KK_Pregnancy +{ + public static partial class PregnancyGui + { + private static PregnancyPlugin _pluginInstance; + + internal static void Init(Harmony hi, PregnancyPlugin instance) + { + _pluginInstance = instance; + + if (StudioAPI.InsideStudio) + { + RegisterStudioControls(); + } + else + { + MakerAPI.RegisterCustomSubCategories += MakerAPI_MakerBaseLoaded; + + Sprite LoadIcon(string resourceFileName) + { + var iconTex = new Texture2D(2, 2, TextureFormat.DXT5, false); + Object.DontDestroyOnLoad(iconTex); + iconTex.LoadImage(ResourceUtils.GetEmbeddedResource(resourceFileName)); + + var sprite = Sprite.Create(iconTex, new Rect(0f, 0f, iconTex.width, iconTex.height), + new Vector2(0.5f, 0.5f), 100f, 0u, SpriteMeshType.FullRect); + Object.DontDestroyOnLoad(sprite); + return sprite; + } + var pregSprite = LoadIcon("pregnant.png"); + var riskySprite = LoadIcon("risky.png"); + var safeSprite = LoadIcon("safe.png"); + var unknownSprite = LoadIcon("unknown.png"); + var leaveSprite = LoadIcon("leave.png"); + + StatusIcons.Init(hi, unknownSprite, pregSprite, safeSprite, riskySprite, leaveSprite); + } + } + + private static void RegisterStudioControls() + { + var cat = StudioAPI.GetOrCreateCurrentStateCategory(null); + cat.AddControl(new CurrentStateCategorySlider("Pregnancy", c => + { + if (c.charInfo == null) return 0; + var controller = c.charInfo.GetComponent(); + if (controller == null) return 0; + return controller.Data.Week; + }, 0, 40)) + .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers()) ctrl.Data.Week = Mathf.RoundToInt(f); }); + } + + private static void MakerAPI_MakerBaseLoaded(object sender, RegisterSubCategoriesEvent e) + { + var female = MakerAPI.GetMakerSex() != 0; + + // This category is inaccessible from class maker + var cat = new MakerCategory(MakerConstants.Body.CategoryName, "Pregnancy"); + + e.AddSubCategory(cat); + + var hintColor = new Color(0.7f, 0.7f, 0.7f); + + var gameplayToggle = e.AddControl(new MakerToggle(cat, "Enable pregnancy progression", true, _pluginInstance)); + gameplayToggle.BindToFunctionController(controller => controller.Data.GameplayEnabled, (controller, value) => controller.Data.GameplayEnabled = value); + e.AddControl(new MakerText(female ? + "If off, the character can't get pregnant and current pregnancy will stop progressing." : + "If on, belly will progressively get bigger. No other effects.", + cat, _pluginInstance) + { TextColor = hintColor }); + + if (female) + { + var fertilityToggle = e.AddControl(new MakerSlider(cat, "Fertility", 0f, 1f, PregnancyData.DefaultFertility, _pluginInstance)); + fertilityToggle.BindToFunctionController(controller => controller.Data.Fertility, (controller, value) => controller.Data.Fertility = value); + + e.AddControl(new MakerText("How likely this character is to get pregnant.", cat, _pluginInstance) { TextColor = hintColor }); + } + + var weeksSlider = e.AddControl(new MakerSlider(cat, "Week of pregnancy", 0f, PregnancyData.LeaveSchoolWeek - 1f, 0f, _pluginInstance)); + weeksSlider.ValueToString = f => Mathf.RoundToInt(f).ToString(); + weeksSlider.StringToValue = s => int.Parse(s); + weeksSlider.BindToFunctionController(controller => controller.Data.Week, (controller, value) => controller.Data.Week = Mathf.RoundToInt(value)); + + e.AddControl(new MakerText(female ? + "If the character is pregnant when added to the game, the pregnancy will continue from this point." : + "The only way for male characters to get pregnant is to manually set this slider above 0.", + cat, _pluginInstance) + { TextColor = hintColor }); + + if (female) + { + var scheduleToggle = e.AddControl(new MakerRadioButtons(cat, _pluginInstance, "Menstruation schedule", "Default", "More risky", "Always safe", "Always risky")); + scheduleToggle.BindToFunctionController(controller => (int)controller.Data.MenstruationSchedule, (controller, value) => controller.Data.MenstruationSchedule = (MenstruationSchedule)value); + + e.AddControl(new MakerText("Changes how many risky days the character has in a cycle. Default is more safe days than risky days.", cat, _pluginInstance) { TextColor = hintColor }); + } + } + } +} diff --git a/src/Core_Pregnancy/PregnancyBoneEffect.cs b/src/AI_Pregnancy/PregnancyBoneEffect.cs similarity index 51% rename from src/Core_Pregnancy/PregnancyBoneEffect.cs rename to src/AI_Pregnancy/PregnancyBoneEffect.cs index 98c72bd..bb52a4f 100644 --- a/src/Core_Pregnancy/PregnancyBoneEffect.cs +++ b/src/AI_Pregnancy/PregnancyBoneEffect.cs @@ -5,9 +5,7 @@ using KKAPI.Maker; using KKAPI.Studio; using UnityEngine; -#if AI - using AIChara; -#endif +using AIChara; namespace KK_Pregnancy { @@ -17,19 +15,6 @@ public class PregnancyBoneEffect : BoneEffect private static readonly Dictionary _bellyFullValues = new Dictionary { - #if KK - // Belly :scale :position :rotation - {"cf_s_spine01" , new BoneModifierData(new Vector3(1.62f, 1.50f, 1.90f), 1f, new Vector3( 0.00f, 0.00f , 0.05f), new Vector3( 10f, 0f, 0f))}, - {"cf_s_spine02" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.00f, 0.00f , 0.01f), new Vector3(-05f, 0f, 0f))}, - {"cf_s_waist01" , new BoneModifierData(new Vector3(1.25f, 1.55f, 1.70f), 1f, new Vector3( 0.00f, 0.02f , 0.12f), new Vector3( 15f, 0f, 0f))}, - {"cf_s_waist02" , new BoneModifierData(new Vector3(1.17f, 1.00f, 1.00f), 1f, new Vector3( 0.00f, 0.00f , 0.00f), new Vector3( 0f, 0f, 0f))}, - // Skirt - {"cf_d_sk_00_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.00f,-0.02f , 0.14f), new Vector3(-10f, 0f, 0f))}, - {"cf_d_sk_07_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3(-0.03f,-0.02f , 0.12f), new Vector3(-10f, 0f, 0f))}, - {"cf_d_sk_01_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.03f,-0.02f , 0.12f), new Vector3(-10f, 0f, 0f))}, - {"cf_d_sk_06_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3(-0.03f, 0.00f , 0.05f), new Vector3( 0f, 0f, 0f))}, - {"cf_d_sk_02_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.03f, 0.00f , 0.05f), new Vector3( 0f, 0f, 0f))}, - #elif AI // Belly {"cf_J_Spine01_s" , new BoneModifierData(new Vector3(1.30f, 1.15f, 1.90f), 1f, new Vector3( 0.00f, 0.00f , 0.50f), new Vector3( 3f, 0f, 0f))}, {"cf_J_Spine02_s" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.00f, 0.00f , 0.10f), new Vector3(-05f, 0f, 0f))}, @@ -42,34 +27,10 @@ public class PregnancyBoneEffect : BoneEffect // {"cf_J_sk_01_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.03f,-0.02f , 0.12f), new Vector3(-10f, 0f, 0f))}, // {"cf_J_sk_06_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3(-0.03f, 0.00f , 0.05f), new Vector3( 0f, 0f, 0f))}, // {"cf_J_sk_02_00" , new BoneModifierData(new Vector3(1.00f, 1.00f, 1.00f), 1f, new Vector3( 0.03f, 0.00f , 0.05f), new Vector3( 0f, 0f, 0f))}, - #endif }; private static readonly Dictionary _pregnancyFullValues = new Dictionary { - #if KK - // Breasts - {"cf_d_bust01_L" , new BoneModifierData(new Vector3(1.2f , 1.2f , 1.2f) , 1f)}, - {"cf_d_bust01_R" , new BoneModifierData(new Vector3(1.2f , 1.2f , 1.2f) , 1f)}, - {"cf_d_bnip01_L" , new BoneModifierData(new Vector3(1.2f , 1.2f , 1.2f) , 1f)}, - {"cf_d_bnip01_R" , new BoneModifierData(new Vector3(1.2f , 1.2f , 1.2f) , 1f)}, - // Butt - {"cf_s_siri_L" , new BoneModifierData(new Vector3(1.1f , 1f , 1.2f) , 1f)}, - {"cf_s_siri_R" , new BoneModifierData(new Vector3(1.1f , 1f , 1.2f) , 1f)}, - // Legs - {"cf_s_thigh00_L", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_thigh00_R", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_thigh01_L", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_thigh01_R", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_thigh02_L", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_thigh02_R", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_thigh03_L", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_thigh03_R", new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_leg01_L" , new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_leg01_R" , new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_leg02_L" , new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - {"cf_s_leg02_R" , new BoneModifierData(new Vector3(1.04f, 1f , 1.04f), 1f)}, - #elif AI // Breasts {"cf_J_Mune00_s_L" , new BoneModifierData(new Vector3(1.2f , 1.2f , 1.2f) , 1f)}, {"cf_J_Mune00_s_R" , new BoneModifierData(new Vector3(1.2f , 1.2f , 1.2f) , 1f)}, @@ -86,7 +47,6 @@ public class PregnancyBoneEffect : BoneEffect {"cf_J_LegUp03_s_L", new BoneModifierData(new Vector3(1.1f, 1f , 1.1f), 1f)}, {"cf_J_LegUp03_s_R", new BoneModifierData(new Vector3(1.1f, 1f , 1.1f), 1f)}, //TODO what is equivalent to thigh? - #endif }; private static readonly IEnumerable _affectedBoneNames = _bellyFullValues.Keys.Concat(_pregnancyFullValues.Keys).ToArray(); @@ -104,65 +64,33 @@ public override IEnumerable GetAffectedBones(BoneController origin) return Enumerable.Empty(); } - #if KK - public override BoneModifierData GetEffect(string bone, BoneController origin, ChaFileDefine.CoordinateType coordinate) + public override BoneModifierData GetEffect(string bone, BoneController origin, CoordinateType coordinate) + { + var isPregnant = _controller.Data.IsPregnant; + if (isPregnant) { - var isPregnant = _controller.Data.IsPregnant; - if (isPregnant) + if (_pregnancyFullValues.TryGetValue(bone, out var mod)) { - if (_pregnancyFullValues.TryGetValue(bone, out var mod)) - { - var prEffect = GetPregnancyEffectPercent(); - return LerpModifier(mod, prEffect); - } - } - - if (isPregnant || _controller.IsInflated) - { - if (_bellyFullValues.TryGetValue(bone, out var mod)) - { - var prEffect = GetPregnancyEffectPercent(); - var infEffect = _controller.GetInflationEffectPercent() + prEffect / 2; - - var bellySize = Mathf.Max(prEffect, infEffect); - - return LerpModifier(mod, bellySize); - } + var prEffect = GetPregnancyEffectPercent(); + return LerpModifier(mod, prEffect); } - - return null; } - #elif AI - - public override BoneModifierData GetEffect(string bone, BoneController origin, CoordinateType coordinate) + if (isPregnant || _controller.IsInflated) { - var isPregnant = _controller.Data.IsPregnant; - if (isPregnant) + if (_bellyFullValues.TryGetValue(bone, out var mod)) { - if (_pregnancyFullValues.TryGetValue(bone, out var mod)) - { - var prEffect = GetPregnancyEffectPercent(); - return LerpModifier(mod, prEffect); - } - } + var prEffect = GetPregnancyEffectPercent(); + var infEffect = _controller.GetInflationEffectPercent() + prEffect / 2; - if (isPregnant || _controller.IsInflated) - { - if (_bellyFullValues.TryGetValue(bone, out var mod)) - { - var prEffect = GetPregnancyEffectPercent(); - var infEffect = _controller.GetInflationEffectPercent() + prEffect / 2; + var bellySize = Mathf.Max(prEffect, infEffect); - var bellySize = Mathf.Max(prEffect, infEffect); - - return LerpModifier(mod, bellySize); - } + return LerpModifier(mod, bellySize); } - - return null; } - #endif + + return null; + } private static BoneModifierData LerpModifier(BoneModifierData mod, float bellySize) { diff --git a/src/Core_Pregnancy/PregnancyCharaController.cs b/src/AI_Pregnancy/PregnancyCharaController.cs similarity index 83% rename from src/Core_Pregnancy/PregnancyCharaController.cs rename to src/AI_Pregnancy/PregnancyCharaController.cs index ebb18cd..2a513c2 100644 --- a/src/Core_Pregnancy/PregnancyCharaController.cs +++ b/src/AI_Pregnancy/PregnancyCharaController.cs @@ -5,9 +5,7 @@ using KKAPI.MainGame; using KKAPI.Maker; using UnityEngine; -#if AI - using AIChara; -#endif +using AIChara; namespace KK_Pregnancy { @@ -16,10 +14,8 @@ public class PregnancyCharaController : CharaCustomFunctionController private readonly PregnancyBoneEffect _boneEffect; public PregnancyData Data { get; private set; } -#if AI - //Set by game controller by random chance each day - public bool isDangerousDay = new System.Random().Next(0, 100) <= 20; -#endif + //Set by game controller by random chance each day + public bool isDangerousDay = new System.Random().Next(0, 100) <= 20; public PregnancyCharaController() { @@ -46,16 +42,6 @@ public void ReadData() Data = PregnancyData.Load(data) ?? new PregnancyData(); // PregnancyPlugin.Logger.LogDebug($"Preg - ReadData week {Data.Week} {ChaControl.name}"); - -#if KK - if (!CanGetDangerousDays()) - { - // Force the girl to always be on the safe day, happens every day after day of conception - var heroine = ChaControl.GetHeroine(); - if (heroine != null) - HFlag.SetMenstruation(heroine, HFlag.MenstruationType.安全日); - } -#endif } protected override void OnCardBeingSaved(GameMode currentGameMode) @@ -81,23 +67,6 @@ protected override void OnReload(GameMode currentGameMode) } } -#if KK - internal static byte[] GetMenstruationsArr(MenstruationSchedule menstruationSchedule) - { - switch (menstruationSchedule) - { - default: - return HFlag.menstruations; - case MenstruationSchedule.MostlyRisky: - return _menstruationsRisky; - case MenstruationSchedule.AlwaysSafe: - return _menstruationsAlwaysSafe; - case MenstruationSchedule.AlwaysRisky: - return _menstruationsAlwaysRisky; - } - } -#endif - private static readonly byte[] _menstruationsRisky = { 0, 0, diff --git a/src/Core_Pregnancy/PregnancyGameController.cs b/src/AI_Pregnancy/PregnancyGameController.cs similarity index 63% rename from src/Core_Pregnancy/PregnancyGameController.cs rename to src/AI_Pregnancy/PregnancyGameController.cs index c9706bc..9af069f 100644 --- a/src/Core_Pregnancy/PregnancyGameController.cs +++ b/src/AI_Pregnancy/PregnancyGameController.cs @@ -1,43 +1,21 @@ using System; using System.Collections.Generic; -using System.Linq; using ExtensibleSaveFormat; using KKAPI.Chara; using KKAPI.MainGame; -using Manager; using UnityEngine; using Random = UnityEngine.Random; -#if KK -using ActionGame; -#elif AI -using AIChara; using AIProject; using AIProject.SaveData; -#endif namespace KK_Pregnancy { public class PregnancyGameController : GameCustomFunctionController { -#if KK - private static readonly HashSet _startedPregnancies = new HashSet(); -#elif AI private static readonly HashSet _startedPregnancies = new HashSet(); -#endif internal static bool InsideHScene { get; private set; } -#if KK - protected override void OnDayChange(Cycle.Week day) - { - // Use Sunday for weekly stuff because it is always triggered (all other days can get skipped) - if (day == Cycle.Week.Holiday) - { - // At start of each week increase pregnancy week counters of all pregnant characters - ApplyToAllDatas((chara, data) => AddPregnancyWeek(data)); - } - } -#elif AI protected override void OnDayChange(int day) { // 1 day = 1 week in AI @@ -97,60 +75,13 @@ private void SetCharsDangerousDay(int day) } } } -#endif -#if KK - protected override void OnStartH(BaseLoader proc, HFlag hFlag, bool vr) - { - InsideHScene = true; - proc.gameObject.AddComponent(); - } -#elif AI protected override void OnStartH(HScene proc, bool freeH) { InsideHScene = true; // proc.gameObject.AddComponent(); //Add later } -#endif - -#if KK - protected override void OnEndH(BaseLoader proc, HFlag hFlag, bool vr) - { - InsideHScene = false; - Destroy(proc.GetComponent()); - - // Figure out if conception happened at end of h scene - // bug Don't know which character is which - if (hFlag.mode == HFlag.EMode.houshi3P || hFlag.mode == HFlag.EMode.sonyu3P) return; - - var heroine = hFlag.lstHeroine.First(x => x != null); - var isDangerousDay = HFlag.GetMenstruation(heroine.MenstruationDay) == HFlag.MenstruationType.危険日; - if (!isDangerousDay) return; - - var cameInside = PregnancyPlugin.ConceptionEnabled.Value && hFlag.count.sonyuInside > 0; - var cameInsideAnal = PregnancyPlugin.AnalConceptionEnabled.Value && hFlag.count.sonyuAnalInside > 0; - if (cameInside || cameInsideAnal) - { - var controller = heroine.chaCtrl.GetComponent(); - if (controller == null) throw new ArgumentNullException(nameof(controller)); - - //Allow pregnancy if enabled, or overridden, and is not currently pregnant - if (!controller.Data.GameplayEnabled || controller.Data.IsPregnant) return; - - var fertility = Mathf.Max(PregnancyPlugin.FertilityOverride.Value, controller.Data.Fertility); - var winThreshold = Mathf.RoundToInt(fertility * 100); - var childLottery = Random.Range(1, 100); - //Logger.Log(LogLevel.Debug, $"Preg - OnEndH calc pregnancy chance {childLottery} to {winThreshold}"); - var wonAChild = winThreshold >= childLottery; - if (wonAChild) - { - //Logger.Log(LogLevel.Debug, "Preg - child lottery won, pregnancy will start"); - _startedPregnancies.Add(heroine); - } - } - } -#elif AI protected override void OnEndH(HScene proc, bool freeH) { InsideHScene = false; @@ -190,7 +121,6 @@ protected override void OnEndH(HScene proc, bool freeH) } } } -#endif protected override void OnGameLoad(GameSaveLoadEventArgs args) { @@ -202,26 +132,6 @@ protected override void OnGameSave(GameSaveLoadEventArgs args) ProcessPendingChanges(); } -#if KK - protected override void OnPeriodChange(Cycle.Type period) - { - ProcessPendingChanges(); - } - - private static void ProcessPendingChanges() - { - ApplyToAllDatas((chara, data) => - { - if (chara is SaveData.Heroine heroine && _startedPregnancies.Contains(heroine) && !data.IsPregnant) - { - data.StartPregnancy(); - return true; - } - return false; - }); - _startedPregnancies.Clear(); - } -#elif AI protected override void OnPeriodChange(AIProject.TimeZone period) { ProcessPendingChanges(); @@ -240,32 +150,7 @@ private static void ProcessPendingChanges() }); _startedPregnancies.Clear(); } -#endif - -#if KK - private static void ApplyToAllDatas(Func action) - { - void ApplyToDatas(SaveData.CharaData character) - { - var chafiles = character.GetRelatedChaFiles(); - if (chafiles == null) return; - foreach (var chaFile in chafiles) - { - var data = ExtendedSave.GetExtendedDataById(chaFile, PregnancyPlugin.GUID); - var pd = PregnancyData.Load(data) ?? new PregnancyData(); - if (action(character, pd)) - ExtendedSave.SetExtendedDataById(chaFile, PregnancyPlugin.GUID, pd.Save()); - } - } - - foreach (var heroine in Game.Instance.HeroineList) ApplyToDatas(heroine); - ApplyToDatas(Game.Instance.Player); - // If controller exists then update its state so it gets any pregnancy week updates - foreach (var controller in FindObjectsOfType()) - controller.ReadData(); - } -#elif AI private static void ApplyToAllDatas(Func action) { @@ -313,7 +198,6 @@ private static List GetHeroineList() return heroineList; } -#endif private static bool AddPregnancyWeek(PregnancyData pd) { @@ -321,23 +205,6 @@ private static bool AddPregnancyWeek(PregnancyData pd) if (pd.IsPregnant) { -#if KK - if (pd.Week < PregnancyData.LeaveSchoolWeek) - { - // Advance through in-school at full configured speed - var weekChange = PregnancyPlugin.PregnancyProgressionSpeed.Value; - pd.Week = Mathf.Min(PregnancyData.LeaveSchoolWeek, pd.Week + weekChange); - } - else if (pd.Week < PregnancyData.ReturnToSchoolWeek) - { - // Make sure at least one week is spent out of school - var weekChange = Mathf.Min(PregnancyData.ReturnToSchoolWeek - PregnancyData.LeaveSchoolWeek - 1, PregnancyPlugin.PregnancyProgressionSpeed.Value); - pd.Week = pd.Week + weekChange; - } - - if (pd.Week >= PregnancyData.ReturnToSchoolWeek) - pd.Week = 0; -#elif AI if (pd.Week < PregnancyData.LeaveSchoolWeek) { // Advance through pregnancy at full configured speed @@ -348,7 +215,6 @@ private static bool AddPregnancyWeek(PregnancyData pd) { pd.Week = 0; } -#endif // PregnancyPlugin.Logger.LogDebug($"Preg - pregnancy week is now {pd.Week}"); } else if (pd.PregnancyCount > 0) diff --git a/src/AI_Pregnancy/PregnancyPlugin.Hooks.cs b/src/AI_Pregnancy/PregnancyPlugin.Hooks.cs new file mode 100644 index 0000000..41b9420 --- /dev/null +++ b/src/AI_Pregnancy/PregnancyPlugin.Hooks.cs @@ -0,0 +1,116 @@ +using System.Collections.Generic; +using System.Linq; +using ExtensibleSaveFormat; +using HarmonyLib; +using KKAPI.MainGame; +using UnityEngine; +using AIProject; + +namespace KK_Pregnancy +{ + public partial class PregnancyPlugin + { + private static class Hooks + { + public static void InitHooks(Harmony harmonyInstance) + { + harmonyInstance.PatchAll(typeof(Hooks)); + } + + private static bool _lastPullProc; + + private static bool CanGetSpawned(AgentActor heroine) + { + var isOnLeave = heroine.GetRelatedChaFiles() + .Any(c => + { + var pd = PregnancyData.Load(ExtendedSave.GetExtendedDataById(heroine.ChaControl.chaFile, GUID)); + if (pd == null) return false; + return pd.GameplayEnabled && pd.Week >= PregnancyData.LeaveSchoolWeek; + }); + return !isOnLeave; + } + + private static List GetFilteredHeroines(List originalList) + { + var filteredHeroines = originalList.Where(CanGetSpawned).ToList(); + return filteredHeroines; + } + + #region InflationAI + + [HarmonyPrefix] + [HarmonyPatch(typeof(Sonyu), "Proc", typeof(int), typeof(HScene.AnimationListInfo))] + public static void Sonyu_Proc(Sonyu __instance) + { + //Get current user button click type + var ctrlFlag = Traverse.Create(__instance).Field("ctrlFlag").GetValue(); + DetermineInflationState(ctrlFlag); + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(Houshi), "Proc", typeof(int), typeof(HScene.AnimationListInfo))] + public static void Houshi_Proc(Houshi __instance) + { + //Get current user button click type + var ctrlFlag = Traverse.Create(__instance).Field("ctrlFlag").GetValue(); + DetermineInflationState(ctrlFlag); + } + + //When user clicks finish button, set the inflation based on the button clicked + private static void DetermineInflationState(HSceneFlagCtrl ctrlFlag) + { + //swallow clicked + if (ctrlFlag.click == HSceneFlagCtrl.ClickKind.FinishInSide + || ctrlFlag.click == HSceneFlagCtrl.ClickKind.FinishSame + || ctrlFlag.click == HSceneFlagCtrl.ClickKind.FinishDrink) + { + // PregnancyPlugin.Logger.LogDebug($"Preg - Proc {ctrlFlag.click}"); + var heroine = GetLeadHeroine(); + var controller = GetEffectController(heroine); + controller.AddInflation(1); + } + //spit clicked + else if (ctrlFlag.click == HSceneFlagCtrl.ClickKind.FinishOutSide + || ctrlFlag.click == HSceneFlagCtrl.ClickKind.FinishVomit) + { + // PregnancyPlugin.Logger.LogDebug($"Preg - Proc {ctrlFlag.click}"); + var heroine = GetLeadHeroine(); + var controller = GetEffectController(heroine); + controller.DrainInflation(Mathf.Max(3, Mathf.CeilToInt(InflationMaxCount.Value / 2.2f))); + } + } + + //pulling out + [HarmonyPrefix] + [HarmonyPatch(typeof(Sonyu), "PullProc", typeof(float), typeof(int))] + public static void Sonyu_PullProc(Sonyu __instance) + { + //Get current inserted state + var ctrlFlag = Traverse.Create(__instance).Field("ctrlFlag").GetValue(); + // PregnancyPlugin.Logger.LogDebug($"Preg - PullProc {ctrlFlag.isInsert}"); + + if (ctrlFlag.isInsert && _lastPullProc != ctrlFlag.isInsert) + { + var heroine = GetLeadHeroine(); + var controller = GetEffectController(heroine); + controller.DrainInflation(Mathf.Max(3, Mathf.CeilToInt(InflationMaxCount.Value / 2.2f))); + } + + _lastPullProc = ctrlFlag.isInsert; + } + + private static PregnancyCharaController GetEffectController(Actor heroine) + { + return heroine?.ChaControl != null ? heroine.ChaControl.GetComponent() : null; + } + + private static Actor GetLeadHeroine() + { + return Manager.HSceneManager.Instance?.females[0]; + } + + #endregion + } + } +} diff --git a/src/Core_Pregnancy/PregnancyPlugin.cs b/src/AI_Pregnancy/PregnancyPlugin.cs similarity index 63% rename from src/Core_Pregnancy/PregnancyPlugin.cs rename to src/AI_Pregnancy/PregnancyPlugin.cs index 118e914..087dec8 100644 --- a/src/Core_Pregnancy/PregnancyPlugin.cs +++ b/src/AI_Pregnancy/PregnancyPlugin.cs @@ -6,26 +6,15 @@ using KKAPI; using KKAPI.Chara; using KKAPI.MainGame; -#if AI - using AIChara; -#endif namespace KK_Pregnancy { [BepInPlugin(GUID, GUID, Version)] [BepInDependency(KKABMX_Core.GUID, "4.1")] - #if KK - [BepInDependency(KoikatuAPI.GUID, KoikatuAPI.VersionConst)] - #elif AI - [BepInDependency(KoikatuAPI.GUID, "1.12")] - #endif + [BepInDependency(KoikatuAPI.GUID, KoikatuAPI.VersionConst)] public partial class PregnancyPlugin : BaseUnityPlugin { - #if KK - public const string GUID = "KK_Pregnancy"; - #elif AI - public const string GUID = "AI_Pregnancy"; - #endif + public const string GUID = "AI_Pregnancy"; public const string Version = "2.5.2"; public static ConfigEntry ConceptionEnabled { get; private set; } @@ -40,30 +29,16 @@ public partial class PregnancyPlugin : BaseUnityPlugin public static ConfigEntry InflationOpenClothAtMax { get; private set; } public static ConfigEntry InflationMaxCount { get; private set; } - public static ConfigEntry LactationEnabled { get; private set; } - public static ConfigEntry LactationFillTime { get; private set; } - public static ConfigEntry LactationForceMaxCapacity { get; private set; } - internal static new ManualLogSource Logger { get; private set; } private void Start() { Logger = base.Logger; - #if KK - PregnancyProgressionSpeed = Config.Bind("General", "Pregnancy progression speed", 4, - new ConfigDescription("How much faster does the in-game pregnancy progresses than the standard 40 weeks. " + - "It also reduces the time characters leave school for after birth.\n\n" + - "x1 is 40 weeks, x2 is 20 weeks, x4 is 10 weeks, x10 is 4 weeks.", - new AcceptableValueList(1, 2, 4, 10))); - - #elif AI - - PregnancyProgressionSpeed = Config.Bind("General", "Pregnancy progression speed", 4, - new ConfigDescription("How much faster does the in-game pregnancy progresses than the standard 4 weeks. \n\n" + - "x1 is 4 weeks, x2 is 2 weeks, x4 is 1 week, x10 is ~4 days.", - new AcceptableValueList(1, 2, 4, 10))); - #endif + PregnancyProgressionSpeed = Config.Bind("General", "Pregnancy progression speed", 4, + new ConfigDescription("How much faster does the in-game pregnancy progresses than the standard 4 weeks. \n\n" + + "x1 is 4 weeks, x2 is 2 weeks, x4 is 1 week, x10 is ~4 days.", + new AcceptableValueList(1, 2, 4, 10))); ConceptionEnabled = Config.Bind("General", "Enable conception", true, "Allows characters to get pregnant from vaginal sex. Doesn't affect already pregnant characters."); @@ -96,17 +71,6 @@ private void Start() InflationMaxCount = Config.Bind("Inflation", "Cum count until full", 8, new ConfigDescription("How many times you have to let out inside to reach the maximum belly size.", new AcceptableValueRange(2, 15))); - #if KK - LactationEnabled = Config.Bind("Lactation", "Enable lactation", true, - "Enable the lactation effect. For the effect to work the character has to be pregnant, or the override setting has to be enabled."); - - LactationFillTime = Config.Bind("Lactation", "Time to fully refill", 5, - new ConfigDescription("How many minutes it takes to fully refill the milk. 0 is always fully refilled.", new AcceptableValueRange(0, 10))); - - LactationForceMaxCapacity = Config.Bind("Lactation", "Force max milk capacity", false, - "If enabled, all characters will lactate and have full capacity. If off, capacity depends on the pregnancy progress."); - #endif - CharacterApi.RegisterExtraBehaviour(GUID); GameAPI.RegisterExtraBehaviour(GUID); diff --git a/src/Core_Pregnancy/Properties/AssemblyInfo.cs b/src/AI_Pregnancy/Properties/AssemblyInfo.cs similarity index 100% rename from src/Core_Pregnancy/Properties/AssemblyInfo.cs rename to src/AI_Pregnancy/Properties/AssemblyInfo.cs diff --git a/src/Core_Pregnancy/Resources/leave.png b/src/AI_Pregnancy/Resources/leave.png similarity index 100% rename from src/Core_Pregnancy/Resources/leave.png rename to src/AI_Pregnancy/Resources/leave.png diff --git a/src/Core_Pregnancy/Resources/preg_icon.xcf b/src/AI_Pregnancy/Resources/preg_icon.xcf similarity index 100% rename from src/Core_Pregnancy/Resources/preg_icon.xcf rename to src/AI_Pregnancy/Resources/preg_icon.xcf diff --git a/src/Core_Pregnancy/Resources/pregnant.png b/src/AI_Pregnancy/Resources/pregnant.png similarity index 100% rename from src/Core_Pregnancy/Resources/pregnant.png rename to src/AI_Pregnancy/Resources/pregnant.png diff --git a/src/Core_Pregnancy/Resources/risky.png b/src/AI_Pregnancy/Resources/risky.png similarity index 100% rename from src/Core_Pregnancy/Resources/risky.png rename to src/AI_Pregnancy/Resources/risky.png diff --git a/src/Core_Pregnancy/Resources/safe.png b/src/AI_Pregnancy/Resources/safe.png similarity index 100% rename from src/Core_Pregnancy/Resources/safe.png rename to src/AI_Pregnancy/Resources/safe.png diff --git a/src/Core_Pregnancy/Resources/unknown.png b/src/AI_Pregnancy/Resources/unknown.png similarity index 100% rename from src/Core_Pregnancy/Resources/unknown.png rename to src/AI_Pregnancy/Resources/unknown.png diff --git a/src/Core_Pregnancy/Data/PregnancyDataUtils.cs b/src/Core_Pregnancy/Data/PregnancyDataUtils.cs deleted file mode 100644 index 94ec8ac..0000000 --- a/src/Core_Pregnancy/Data/PregnancyDataUtils.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using ExtensibleSaveFormat; -using KKAPI.MainGame; -#if AI - using AIChara; - using AIProject; - using AIProject.SaveData; - using AIProject.Definitions; -#endif - -namespace KK_Pregnancy -{ - public static class PregnancyDataUtils - { - private static readonly int[] _earlyDetectPersonalities = { 00, 11, 12, 13, 19, 24, 31, 33 }; - private static readonly int[] _lateDetectPersonalities = { 03, 05, 08, 20, 25, 26, 37 }; - - /// ChaFile to test - ///// The girl knows about it / tested it - public static PregnancyData GetPregnancyData(this ChaFileControl c) - { - if (c == null) return null; - - var d = ExtendedSave.GetExtendedDataById(c, PregnancyPlugin.GUID); - if (d == null) return null; - - return PregnancyData.Load(d); - } - - /// Heroine to test - ///// The girl knows about it / tested it - #if KK - - [Obsolete] - public static PregnancyData GetPregnancyData(SaveData.Heroine heroine) => GetPregnancyData((SaveData.CharaData)heroine); - public static PregnancyData GetPregnancyData(this SaveData.CharaData chara) - { - if (chara == null) return new PregnancyData(); - - // Figure out which data to take if there are multiple - // probably not necessary? null check should be enough? - return chara.GetRelatedChaFiles() - .Select(GetPregnancyData) - .Where(x => x != null) - .OrderByDescending(x => x.PregnancyCount) - .ThenByDescending(x => x.WeeksSinceLastPregnancy) - .ThenByDescending(x => x.Week) - .ThenByDescending(x => x.MenstruationSchedule) - .ThenByDescending(x => x.GameplayEnabled) - .FirstOrDefault() ?? new PregnancyData(); - } - - [Obsolete] - public static HeroineStatus GetHeroineStatus(this SaveData.CharaData chara, PregnancyData pregData = null) => GetCharaStatus(chara, pregData); - public static HeroineStatus GetCharaStatus(this SaveData.CharaData chara, PregnancyData pregData = null) - { - if (chara is SaveData.Heroine heroine) - { - if (pregData == null) pregData = heroine.GetPregnancyData(); - - // Check if she wants to tell - if (heroine.intimacy >= 80 || - heroine.hCount >= 5 || - heroine.parameter.attribute.bitch && heroine.favor > 50 || - (heroine.isGirlfriend || heroine.favor >= 90) && - (!heroine.isVirgin || heroine.hCount >= 2 || heroine.intimacy >= 40)) - { - var pregnancyWeek = pregData.Week; - if (pregnancyWeek > 0) - { - if (pregnancyWeek >= PregnancyData.LeaveSchoolWeek) return HeroineStatus.OnLeave; - if (PregnancyPlugin.ShowPregnancyIconEarly.Value) return HeroineStatus.Pregnant; - // Different personalities notice at different times - if (_earlyDetectPersonalities.Contains(heroine.personality)) - { - if (pregnancyWeek > 1) return HeroineStatus.Pregnant; - } - else if (_lateDetectPersonalities.Contains(heroine.personality)) - { - if (pregnancyWeek > 11) return HeroineStatus.Pregnant; - } - else - { - if (pregnancyWeek > 5) return HeroineStatus.Pregnant; - } - } - - return HFlag.GetMenstruation(heroine.MenstruationDay) == HFlag.MenstruationType.安全日 - ? HeroineStatus.Safe - : HeroineStatus.Risky; - } - } - else if (chara is SaveData.Player player) - { - if (pregData == null) pregData = player.GetPregnancyData(); - return pregData.IsPregnant ? HeroineStatus.Pregnant : HeroineStatus.Safe; - } - return HeroineStatus.Unknown; - } - - internal static IEnumerable GetRelatedChaFiles(this SaveData.CharaData character) - { - var chafiles = - character is SaveData.Heroine h ? KKAPI.MainGame.GameExtensions.GetRelatedChaFiles(h) : - character is SaveData.Player p ? KKAPI.MainGame.GameExtensions.GetRelatedChaFiles(p) : - null; - return chafiles; - } - - #elif AI - - public static PregnancyData GetPregnancyData(this AgentData heroine) - { - if (heroine == null) return new PregnancyData(); - - // Figure out which data to take if there are multiple - // probably not necessary? null check should be enough? - return heroine.GetRelatedChaFiles() - .Select(GetPregnancyData) - .Where(x => x != null) - .OrderByDescending(x => x.PregnancyCount) - .ThenByDescending(x => x.WeeksSinceLastPregnancy) - .ThenByDescending(x => x.Week) - .ThenByDescending(x => x.GameplayEnabled) - .FirstOrDefault() ?? new PregnancyData(); - } - - public static HeroineStatus GetHeroineStatus(this AgentData heroine, PregnancyData pregData = null) - { - if (heroine == null) return HeroineStatus.Unknown; - if (pregData == null) pregData = heroine.GetPregnancyData(); - - var chaControl = heroine.GetNPC()?.ChaControl; - if (chaControl == null) return HeroineStatus.Unknown; - - // Check if she wants to tell - if (heroine.SickState.ID == AIProject.Definitions.Sickness.GoodHealthID && !heroine.IsWet && - ( chaControl.fileGameInfo.phase > 2 - || heroine.StatsTable[(int)Status.Type.Mood] > 95 - || heroine.StatsTable[(int)Status.Type.Immoral] > 95 - || heroine.StatsTable[(int)Status.Type.Motivation] > 140 )) - { - - var pregnancyWeek = pregData.Week; - if (pregnancyWeek > 0) - { - if (PregnancyPlugin.ShowPregnancyIconEarly.Value) return HeroineStatus.Pregnant; - // Different personalities notice at different times - if (_earlyDetectPersonalities.Contains(chaControl.fileParam.personality)) - { - if (pregnancyWeek > 1) return HeroineStatus.Pregnant; - } - else if (_lateDetectPersonalities.Contains(chaControl.fileParam.personality)) - { - if (pregnancyWeek > 11) return HeroineStatus.Pregnant; - } - else - { - if (pregnancyWeek > 5) return HeroineStatus.Pregnant; - } - } - - var pregCharCtrl = chaControl.GetComponent(); - return !pregCharCtrl.isDangerousDay - ? HeroineStatus.Safe - : HeroineStatus.Risky; - } - - return HeroineStatus.Unknown; - - } - #endif - - } -} \ No newline at end of file diff --git a/src/Core_Pregnancy/GUI/PregnancyGui.StatusIcons.cs b/src/Core_Pregnancy/GUI/PregnancyGui.StatusIcons.cs deleted file mode 100644 index c3b62d3..0000000 --- a/src/Core_Pregnancy/GUI/PregnancyGui.StatusIcons.cs +++ /dev/null @@ -1,528 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -#if KK - using ActionGame; -#elif AI - using AIProject; - using AIProject.UI; - using AIProject.SaveData; -#endif -using HarmonyLib; -using Illusion.Extensions; -using KKAPI.MainGame; -using KKAPI.Utilities; -using UnityEngine; -using UnityEngine.SceneManagement; -using UnityEngine.UI; - -namespace KK_Pregnancy -{ - public static partial class PregnancyGui - { - private class StatusIcons : MonoBehaviour - { - private static Sprite _pregSprite; - private static Sprite _riskySprite; - private static Sprite _safeSprite; - private static Sprite _unknownSprite; - private static Sprite _leaveSprite; - - private const string ICON_NAME = "Pregnancy_Icon"; - - #if KK - private static readonly List> _currentHeroine = new List>(); - #elif AI - private static readonly List> _currentHeroine = new List>(); - #endif - - internal static void Init(Harmony hi, Sprite unknownSprite, Sprite pregSprite, Sprite safeSprite, Sprite riskySprite, Sprite leaveSprite) - { - _unknownSprite = unknownSprite ? unknownSprite : throw new ArgumentNullException(nameof(unknownSprite)); - _pregSprite = pregSprite ? pregSprite : throw new ArgumentNullException(nameof(pregSprite)); - _riskySprite = riskySprite ? riskySprite : throw new ArgumentNullException(nameof(riskySprite)); - _safeSprite = safeSprite ? safeSprite : throw new ArgumentNullException(nameof(safeSprite)); - _leaveSprite = leaveSprite ? leaveSprite : throw new ArgumentNullException(nameof(leaveSprite)); - - #if KK - SceneManager.sceneLoaded += SceneManager_sceneLoaded; - SceneManager.sceneUnloaded += s => - { - if (_currentHeroine.Count > 0) - SceneManager_sceneLoaded(s, LoadSceneMode.Additive); - }; - #endif - - hi.PatchAll(typeof(StatusIcons)); - } - - #if KK - - /// - /// Handle class roster - /// - [HarmonyPostfix] - [HarmonyPatch(typeof(ClassRoomList), "PreviewUpdate")] - public static void ClassroomPreviewUpdateHook(ClassRoomList __instance) - { - IEnumerator ClassroomPreviewUpdateCo() - { - yield return new WaitForEndOfFrame(); - - _currentHeroine.Clear(); - SpawnGUI(); - - var entries = Traverse.Create(__instance).Property("charaPreviewList") - .GetValue>(); - - foreach (var chaEntry in entries) - { - // Need to call this every time in case characters get transferred/edited - SetHeart(chaEntry.rootObj, chaEntry.data, true); - } - } - - _pluginInstance.StartCoroutine(ClassroomPreviewUpdateCo()); - } - - /// - /// Handle character list in roaming mode - /// - private static void SceneManager_sceneLoaded(Scene scene, LoadSceneMode mode) - { - if (mode == LoadSceneMode.Single || _pluginInstance == null) - return; - - _currentHeroine.Clear(); - - var chaStatusScene = FindObjectOfType(); - if (chaStatusScene != null) - { - SpawnGUI(); - - IEnumerator CreatePregnancyIconCo() - { - yield return new WaitForEndOfFrame(); - - foreach (var chaStatusComponent in chaStatusScene.transform.GetComponentsInChildren()) - { - var chara = (SaveData.CharaData)chaStatusComponent.heroine ?? - (chaStatusComponent.name == "status_m" ? Manager.Game.Instance.Player : null); - SetHeart(chaStatusComponent.gameObject, chara, false); - } - } - - _pluginInstance.StartCoroutine(CreatePregnancyIconCo()); - } - } - - /// - /// Handle char icon for top left quick status popup during roaming mode - /// - [HarmonyPostfix] - [HarmonyPatch(typeof(ParamUI), "SetHeroine", typeof(SaveData.Heroine))] - private static void ParamUI_SetHeroine(ParamUI __instance, SaveData.Heroine _heroine) - { - var objFemaleRoot = Traverse.Create(__instance).Field("objFemaleRoot").GetValue(); - if (objFemaleRoot == null) return; - - SpawnGUI(); - - IEnumerator HeroineCanvasPreviewUpdateCo() - { - yield return new WaitForEndOfFrame(); - - _currentHeroine.Clear(); - SetQuickStatusIcon(objFemaleRoot, _heroine, -214f, -26f); - } - - _pluginInstance.StartCoroutine(HeroineCanvasPreviewUpdateCo()); - } - - #elif AI - - /// - /// Handle char icon for status menu - /// - [HarmonyPostfix] - [HarmonyPatch(typeof(StatusUI), "RefreshAgentContent", typeof(int))] - private static void StatusUI_RefreshAgentContent(StatusUI __instance, int id) - { - - // PregnancyPlugin.Logger.LogDebug("Preg - StatusUI_RefreshAgentContent"); - var objImageRoot = Traverse.Create(__instance).Field("_cardRawImage").GetValue(); - if (objImageRoot == null) return; - - //Ignore player status tab, only want actors - if (id == 0) { - var existingIcon = objImageRoot.transform.Find(ICON_NAME); - if (existingIcon) Destroy(existingIcon.gameObject); - return; - } - - Singleton.Instance.AgentTable.TryGetValue((id -1), out AgentActor _heroine); - if (_heroine == null) return; - - SpawnGUI(); - - IEnumerator HeroineCanvasPreviewUpdateCo() - { - yield return new WaitForEndOfFrame(); - - _currentHeroine.Clear(); - // :right :up - SetQuickStatusIcon(objImageRoot.gameObject, _heroine.AgentData, 95f, -80f); - } - - _pluginInstance.StartCoroutine(HeroineCanvasPreviewUpdateCo()); - } - - /// - /// Clear icon if on player status menu - /// - [HarmonyPostfix] - [HarmonyPatch(typeof(StatusUI), "RefreshPlayerContent")] - private static void StatusUI_RefreshAgentContent(StatusUI __instance) - { - var objImageRoot = Traverse.Create(__instance).Field("_cardRawImage").GetValue(); - if (objImageRoot == null) return; - - var existingIcon = objImageRoot.transform.Find(ICON_NAME); - if (existingIcon) Destroy(existingIcon.gameObject); - } - - #endif - - private static void SpawnGUI() - { - if (!GameObject.Find("PregnancyGUI")) - new GameObject("PregnancyGUI").AddComponent(); - } - - private void OnGUI() - { - if (_currentHeroine.Count == 0) return; - - var pos = new Vector2(Input.mousePosition.x, -(Input.mousePosition.y - Screen.height)); - var heroineRect = _currentHeroine.FirstOrDefault(x => - { - if (x.Value == null) return false; - return GetOccupiedScreenRect(x).Contains(pos); - }); - var chara = heroineRect.Key; - if (chara == null) return; - - var pregData = chara.GetPregnancyData(); - - #if KK - var status = chara.GetCharaStatus(pregData); - var heroine = chara as SaveData.Heroine; - #elif AI - var status = chara.GetHeroineStatus(pregData); - var heroine = chara as AgentData; - #endif - - var windowHeight = status == HeroineStatus.Unknown ? 100 : status == HeroineStatus.Pregnant || status == HeroineStatus.OnLeave ? 180 : 370; - var screenRect = new Rect((int)pos.x + 30, (int)pos.y - windowHeight / 2, 180, windowHeight); - IMGUIUtils.DrawSolidBox(screenRect); - GUILayout.BeginArea(screenRect, GUI.skin.box); - { - GUILayout.BeginVertical(); - { - GUILayout.FlexibleSpace(); - - switch (status) - { - case HeroineStatus.Unknown: - GUILayout.Label("This character didn't tell you their risky day schedule yet."); - GUILayout.FlexibleSpace(); - GUILayout.Label("Become closer to learn it!"); - break; - - case HeroineStatus.OnLeave: - GUILayout.Label("This character is on a maternal leave and will not appear until it is over."); - GUILayout.FlexibleSpace(); - GUILayout.Label("Consider using a rubber next time!"); - break; - - case HeroineStatus.Pregnant: - GUILayout.Label($"This character is pregnant (on week {pregData.Week} / 40)."); - GUILayout.FlexibleSpace(); - if (pregData.GameplayEnabled) - GUILayout.Label(heroine != null ? "The character's body will slowly change, and at the end they will temporarily leave." : "The character's body will slowly change."); - - GUILayout.FlexibleSpace(); - var previousPregcount = Mathf.Max(0, pregData.PregnancyCount - 1); - GUILayout.Label($"This character was pregnant {previousPregcount} times before."); - break; - - case HeroineStatus.Safe: - case HeroineStatus.Risky: - if (heroine == null) break; - - GUILayout.Label(status == HeroineStatus.Safe - ? "This character is on a safe day, have fun!" - : "This character is on a risky day, be careful!"); - //GUILayout.Space(5); - GUILayout.FlexibleSpace(); - - #if KK - var day = Singleton.Instance.nowWeek; - - GUILayout.Label("Forecast for this week:"); - GUILayout.Label($"Today ({day}): {status}"); - - for (var dayOffset = 1; dayOffset < 7; dayOffset++) - { - var adjustedDay = (Cycle.Week)((int)(day + dayOffset) % Enum.GetValues(typeof(Cycle.Week)).Length); - var adjustedSafe = HFlag.GetMenstruation((byte)((heroine.MenstruationDay + dayOffset) % HFlag.menstruations.Length)) == HFlag.MenstruationType.安全日; - GUILayout.Label($"{adjustedDay}: {(adjustedSafe ? "Safe" : "Risky")}"); - } - #endif - - - var pregnancyCount = pregData.IsPregnant ? pregData.PregnancyCount - 1 : pregData.PregnancyCount; - if (pregnancyCount > 0) - { - GUILayout.FlexibleSpace(); - GUILayout.Label($"This character was pregnant {pregnancyCount} times."); - } - - if (pregData.WeeksSinceLastPregnancy > 0) - { - GUILayout.FlexibleSpace(); - GUILayout.Label($"Last pregnancy was {pregData.WeeksSinceLastPregnancy} weeks ago."); - } - break; - - default: - throw new ArgumentOutOfRangeException(); - } - - GUILayout.FlexibleSpace(); - } - GUILayout.EndVertical(); - } - GUILayout.EndArea(); - } - - #if KK - - /// - /// Enable/disable pregnancy icon - /// - private static void SetHeart(GameObject rootObj, SaveData.CharaData chara, bool classRoster) - { - var pregIconTr = rootObj.transform.Find(ICON_NAME); - - if (chara == null) - { - if (pregIconTr != null) - Destroy(pregIconTr.gameObject); - } - else - { - if (pregIconTr == null) - { - pregIconTr = new GameObject(ICON_NAME, typeof(RectTransform), typeof(CanvasRenderer), typeof(Image)).transform; - pregIconTr.SetParent(rootObj.transform, false); - var rt = pregIconTr.GetComponent(); - if (classRoster) - { - rt.anchorMax = rt.anchorMin = rt.pivot = new Vector2(0, 1); - rt.offsetMin = Vector2.zero; - rt.offsetMax = new Vector2(48, 48); - rt.localScale = Vector3.one; - rt.localPosition = new Vector3(4, -115, 0); - } - else // status screen during roaming mode - { - rt.anchorMax = rt.anchorMin = rt.pivot = new Vector2(0.5f, 0.5f); - rt.offsetMin = Vector2.zero; - rt.offsetMax = new Vector2(48, 48); - rt.localScale = Vector3.one; - rt.localPosition = new Vector3(-273, -85, 0); - } - } - - AddPregIcon(pregIconTr, chara); - } - } - - /// - /// Enable/disable pregnancy icon on quick status container - /// - /// The heroine image object - /// Is the preg icon shown - /// Offset from the character image - /// Offset from the character image - private static void SetQuickStatusIcon(GameObject characterImageObj, SaveData.Heroine heroine, float xOffset, float yOffset) - { - var existing = characterImageObj.transform.Find(ICON_NAME); - - if (heroine == null) - { - if (existing != null) - Destroy(existing.gameObject); - } - else - { - if (existing == null) - { - var newChildIcon = new GameObject(); - newChildIcon.AddComponent(); - newChildIcon.AddComponent(); - - var copy = Instantiate(newChildIcon, characterImageObj.transform); - copy.name = ICON_NAME; - copy.SetActive(true); - - var charRt = characterImageObj.GetComponent(); - var rt = copy.GetComponent(); - rt.anchoredPosition = new Vector2(charRt.anchoredPosition.x + xOffset, charRt.anchoredPosition.y + yOffset); - rt.sizeDelta = new Vector2(48, 48); - - existing = copy.transform; - } - - AddPregIcon(existing, heroine); - } - } - - #elif AI - - /// - /// Enable/disable pregnancy icon on quick status container - /// - /// The heroine image object - /// Is the preg icon shown - /// Offset from the character image - /// Offset from the character image - private static void SetQuickStatusIcon(GameObject characterImageObj, AgentData heroine, float xOffset, float yOffset) - { - var existing = characterImageObj.transform.Find(ICON_NAME); - - if (heroine == null) - { - if (existing != null) - Destroy(existing.gameObject); - } - else - { - if (existing == null) - { - var newChildIcon = new GameObject(); - newChildIcon.AddComponent(); - newChildIcon.AddComponent(); - - var copy = Instantiate(newChildIcon, characterImageObj.transform); - copy.name = ICON_NAME; - copy.SetActive(true); - - var charRt = characterImageObj.GetComponent(); - var rt = copy.GetComponent(); - rt.anchoredPosition = new Vector2(charRt.anchoredPosition.x + xOffset, charRt.anchoredPosition.y + yOffset); - rt.sizeDelta = new Vector2(48, 48); - - existing = copy.transform; - } - - AddPregIcon(existing, heroine); - } - } - - #endif - - private static readonly Vector3[] _worldCornersBuffer = new Vector3[4]; - - #if KK - - private static void AddPregIcon(Transform pregIconTransform, SaveData.CharaData chara) - { - var image = pregIconTransform.GetComponent(); - - _currentHeroine.Add(new KeyValuePair(chara, image.GetComponent())); - - var status = chara.GetCharaStatus(chara.GetPregnancyData()); - switch (status) - { - case HeroineStatus.Unknown: - image.sprite = _unknownSprite; - break; - case HeroineStatus.OnLeave: - image.sprite = _leaveSprite; - break; - case HeroineStatus.Safe: - image.sprite = _safeSprite; - break; - case HeroineStatus.Risky: - image.sprite = _riskySprite; - break; - case HeroineStatus.Pregnant: - image.sprite = _pregSprite; - break; - default: - throw new ArgumentOutOfRangeException(); - } - - pregIconTransform.gameObject.SetActiveIfDifferent(chara is SaveData.Heroine || status == HeroineStatus.Pregnant); - } - - private static Rect GetOccupiedScreenRect(KeyValuePair x) - { - x.Value.GetWorldCorners(_worldCornersBuffer); - var screenPos = new Rect( - _worldCornersBuffer[0].x, - Screen.height - _worldCornersBuffer[2].y, - _worldCornersBuffer[2].x - _worldCornersBuffer[0].x, - _worldCornersBuffer[2].y - _worldCornersBuffer[0].y); - return screenPos; - } - - #elif AI - - private static void AddPregIcon(Transform pregIconTransform, AgentData heroine) - { - var image = pregIconTransform.GetComponent(); - - _currentHeroine.Add(new KeyValuePair(heroine, image.GetComponent())); - - var status = heroine.GetHeroineStatus(heroine.GetPregnancyData()); - switch (status) - { - case HeroineStatus.Unknown: - image.sprite = _unknownSprite; - break; - case HeroineStatus.OnLeave: - image.sprite = _leaveSprite; - break; - case HeroineStatus.Safe: - image.sprite = _safeSprite; - break; - case HeroineStatus.Risky: - image.sprite = _riskySprite; - break; - case HeroineStatus.Pregnant: - image.sprite = _pregSprite; - break; - default: - throw new ArgumentOutOfRangeException(); - } - } - - private static Rect GetOccupiedScreenRect(KeyValuePair x) - { - x.Value.GetWorldCorners(_worldCornersBuffer); - var screenPos = new Rect( - _worldCornersBuffer[0].x, - Screen.height - _worldCornersBuffer[2].y, - _worldCornersBuffer[2].x - _worldCornersBuffer[0].x, - _worldCornersBuffer[2].y - _worldCornersBuffer[0].y); - return screenPos; - } - - #endif - } - } -} \ No newline at end of file diff --git a/src/Core_Pregnancy/PregnancyPlugin.Hooks.cs b/src/Core_Pregnancy/PregnancyPlugin.Hooks.cs deleted file mode 100644 index 1fd212e..0000000 --- a/src/Core_Pregnancy/PregnancyPlugin.Hooks.cs +++ /dev/null @@ -1,272 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Reflection.Emit; -using ExtensibleSaveFormat; -using HarmonyLib; -using KKAPI.MainGame; -using Manager; -using UnityEngine; -#if AI - using AIChara; - using AIProject; -#endif - -namespace KK_Pregnancy -{ - public partial class PregnancyPlugin - { - private static class Hooks - { - public static void InitHooks(Harmony harmonyInstance) - { - harmonyInstance.PatchAll(typeof(Hooks)); - - #if KK - PatchNPCLoadAll(harmonyInstance, new HarmonyMethod(typeof(Hooks), nameof(NPCLoadAllTpl))); - #endif - } - - private static bool _lastPullProc; - - #region Custom safe day schedule - - #if KK - private static SaveData.Heroine _lastHeroine; - private static byte[] _menstruationsBackup; - - - [HarmonyPostfix] - [HarmonyPatch(typeof(SaveData.Heroine), nameof(SaveData.Heroine.MenstruationDay), MethodType.Getter)] - private static void LastAccessedHeroinePatch(SaveData.Heroine __instance) - { - _lastHeroine = __instance; - } - - [HarmonyPrefix] - [HarmonyPatch(typeof(HFlag), nameof(HFlag.GetMenstruation), typeof(byte))] - private static void GetMenstruationOverridePrefix() - { - if (_lastHeroine != null) - { - // Get a schedule directly this way since the controller is not spawned in class roster - var schedule = _lastHeroine.GetRelatedChaFiles() - .Select(c => PregnancyData.Load(ExtendedSave.GetExtendedDataById(c, GUID))?.MenstruationSchedule ?? MenstruationSchedule.Default) - .FirstOrDefault(x => x != MenstruationSchedule.Default); - - _menstruationsBackup = HFlag.menstruations; - HFlag.menstruations = PregnancyCharaController.GetMenstruationsArr(schedule); - } - } - - [HarmonyPostfix] - [HarmonyPatch(typeof(HFlag), nameof(HFlag.GetMenstruation), typeof(byte))] - private static void GetMenstruationOverridePostfix() - { - if (_menstruationsBackup != null) - { - HFlag.menstruations = _menstruationsBackup; - _menstruationsBackup = null; - } - } - - #endif - - - #endregion - - #region Preg leave from school - - #if KK - /// - /// Needed for preventing characters from going to school when on leave after pregnancy - /// - private static void PatchNPCLoadAll(Harmony instance, HarmonyMethod transpiler) - { - var t = typeof(ActionScene).GetNestedTypes(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).Single(x => x.Name.StartsWith("c__Iterator")); - var m = t.GetMethod("MoveNext"); - instance.Patch(m, null, null, transpiler); - } - - private static IEnumerable NPCLoadAllTpl(IEnumerable instructions) - { - var target = AccessTools.Property(typeof(Game), nameof(Game.HeroineList)).GetGetMethod(); - var customFilterM = AccessTools.Method(typeof(Hooks), nameof(GetFilteredHeroines)); - foreach (var instruction in instructions) - { - yield return instruction; - - if (instruction.operand == target) - { - // Grab the return of get_HeroineList and process it - yield return new CodeInstruction(OpCodes.Call, customFilterM); - } - } - } - #endif - - #endregion Preg leave from school - - #if KK - private static bool CanGetSpawned(SaveData.Heroine heroine) - { - var isOnLeave = heroine.GetRelatedChaFiles() - .Any(c => - { - var pd = PregnancyData.Load(ExtendedSave.GetExtendedDataById(heroine.charFile, GUID)); - if (pd == null) return false; - return pd.GameplayEnabled && pd.Week >= PregnancyData.LeaveSchoolWeek; - }); - return !isOnLeave; - } - - private static List GetFilteredHeroines(List originalList) - { - var filteredHeroines = originalList.Where(CanGetSpawned).ToList(); - return filteredHeroines; - } - - #region Inflation - - // todo separate anal/vag? - [HarmonyPrefix] - [HarmonyPatch(typeof(HFlag), nameof(HFlag.AddSonyuInside))] - [HarmonyPatch(typeof(HFlag), nameof(HFlag.AddSonyuAnalInside))] - [HarmonyPatch(typeof(HFlag), nameof(HFlag.AddHoushiDrink))] - public static void OnFinishInside(HFlag __instance) - { - var heroine = GetLeadHeroine(__instance); - var controller = GetEffectController(heroine); - controller.AddInflation(1); - } - - [HarmonyPrefix] - [HarmonyPatch(typeof(HFlag), nameof(HFlag.AddSonyuTare))] - [HarmonyPatch(typeof(HFlag), nameof(HFlag.AddSonyuAnalTare))] - public static void OnDrain(HFlag __instance) - { - var heroine = GetLeadHeroine(__instance); - var controller = GetEffectController(heroine); - controller.DrainInflation(Mathf.Max(3, Mathf.CeilToInt(InflationMaxCount.Value / 2.2f))); - } - - private static PregnancyCharaController GetEffectController(SaveData.Heroine heroine) - { - return heroine?.chaCtrl != null ? heroine.chaCtrl.GetComponent() : null; - } - - private static SaveData.Heroine GetLeadHeroine(HFlag hflag) - { - var id = hflag.mode == HFlag.EMode.houshi3P || hflag.mode == HFlag.EMode.sonyu3P ? hflag.nowAnimationInfo.id % 2 : 0; - return hflag.lstHeroine[id]; - } - - #endregion - - #elif AI - - private static bool CanGetSpawned(AgentActor heroine) - { - var isOnLeave = heroine.GetRelatedChaFiles() - .Any(c => - { - var pd = PregnancyData.Load(ExtendedSave.GetExtendedDataById(heroine.ChaControl.chaFile, GUID)); - if (pd == null) return false; - return pd.GameplayEnabled && pd.Week >= PregnancyData.LeaveSchoolWeek; - }); - return !isOnLeave; - } - - private static List GetFilteredHeroines(List originalList) - { - var filteredHeroines = originalList.Where(CanGetSpawned).ToList(); - return filteredHeroines; - } - - #region InflationAI - - - - [HarmonyPrefix] - [HarmonyPatch(typeof(Sonyu), "Proc", typeof(int), typeof(HScene.AnimationListInfo))] - public static void Sonyu_Proc(Sonyu __instance) - { - //Get current user button click type - var ctrlFlag = Traverse.Create(__instance).Field("ctrlFlag").GetValue(); - DetermineInflationState(ctrlFlag); - } - - - [HarmonyPrefix] - [HarmonyPatch(typeof(Houshi), "Proc", typeof(int), typeof(HScene.AnimationListInfo))] - public static void Houshi_Proc(Houshi __instance) - { - //Get current user button click type - var ctrlFlag = Traverse.Create(__instance).Field("ctrlFlag").GetValue(); - DetermineInflationState(ctrlFlag); - } - - - //When user clicks finish button, set the inflation based on the button clicked - private static void DetermineInflationState(HSceneFlagCtrl ctrlFlag) - { - //swallow clicked - if (ctrlFlag.click == HSceneFlagCtrl.ClickKind.FinishInSide - || ctrlFlag.click == HSceneFlagCtrl.ClickKind.FinishSame - || ctrlFlag.click == HSceneFlagCtrl.ClickKind.FinishDrink ) - { - // PregnancyPlugin.Logger.LogDebug($"Preg - Proc {ctrlFlag.click}"); - var heroine = GetLeadHeroine(); - var controller = GetEffectController(heroine); - controller.AddInflation(1); - } - //spit clicked - else if (ctrlFlag.click == HSceneFlagCtrl.ClickKind.FinishOutSide - || ctrlFlag.click == HSceneFlagCtrl.ClickKind.FinishVomit) - { - // PregnancyPlugin.Logger.LogDebug($"Preg - Proc {ctrlFlag.click}"); - var heroine = GetLeadHeroine(); - var controller = GetEffectController(heroine); - controller.DrainInflation(Mathf.Max(3, Mathf.CeilToInt(InflationMaxCount.Value / 2.2f))); - } - } - - - //pulling out - [HarmonyPrefix] - [HarmonyPatch(typeof(Sonyu), "PullProc", typeof(float), typeof(int))] - public static void Sonyu_PullProc(Sonyu __instance) - { - //Get current inserted state - var ctrlFlag = Traverse.Create(__instance).Field("ctrlFlag").GetValue(); - // PregnancyPlugin.Logger.LogDebug($"Preg - PullProc {ctrlFlag.isInsert}"); - - if (ctrlFlag.isInsert && _lastPullProc != ctrlFlag.isInsert) - { - var heroine = GetLeadHeroine(); - var controller = GetEffectController(heroine); - controller.DrainInflation(Mathf.Max(3, Mathf.CeilToInt(InflationMaxCount.Value / 2.2f))); - } - - _lastPullProc = ctrlFlag.isInsert; - } - - - private static PregnancyCharaController GetEffectController(Actor heroine) - { - return heroine?.ChaControl != null ? heroine.ChaControl.GetComponent() : null; - } - - private static Actor GetLeadHeroine() - { - return Manager.HSceneManager.Instance?.females[0]; - } - - #endregion - #endif - - - } - } -} diff --git a/src/KKS_Pregnancy/Properties/AssemblyInfo.cs b/src/Core_Pregnancy_KK/AssemblyInfo.cs similarity index 100% rename from src/KKS_Pregnancy/Properties/AssemblyInfo.cs rename to src/Core_Pregnancy_KK/AssemblyInfo.cs diff --git a/src/Core_Pregnancy/Core_Pregnancy.projitems b/src/Core_Pregnancy_KK/Core_Pregnancy_KK.projitems similarity index 58% rename from src/Core_Pregnancy/Core_Pregnancy.projitems rename to src/Core_Pregnancy_KK/Core_Pregnancy_KK.projitems index 772e42d..bc8a5d4 100644 --- a/src/Core_Pregnancy/Core_Pregnancy.projitems +++ b/src/Core_Pregnancy_KK/Core_Pregnancy_KK.projitems @@ -3,30 +3,22 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) true - eebf32ed-c125-4597-8b3d-4e7e44a15626 + 3c122ef8-491b-447b-94e4-ada9d818403c - Core_Pregnancy + Core_Pregnancy_KK + - - + - - - - - - - - \ No newline at end of file diff --git a/src/Core_Pregnancy/KKAI_Pregnancy.shproj b/src/Core_Pregnancy_KK/Core_Pregnancy_KK.shproj similarity index 87% rename from src/Core_Pregnancy/KKAI_Pregnancy.shproj rename to src/Core_Pregnancy_KK/Core_Pregnancy_KK.shproj index 9b27b5b..1d330d0 100644 --- a/src/Core_Pregnancy/KKAI_Pregnancy.shproj +++ b/src/Core_Pregnancy_KK/Core_Pregnancy_KK.shproj @@ -1,13 +1,13 @@ - eebf32ed-c125-4597-8b3d-4e7e44a15626 + 3c122ef8-491b-447b-94e4-ada9d818403c 14.0 - + diff --git a/src/KKS_Pregnancy/Data/HeroineStatus.cs b/src/Core_Pregnancy_KK/Data/HeroineStatus.cs similarity index 100% rename from src/KKS_Pregnancy/Data/HeroineStatus.cs rename to src/Core_Pregnancy_KK/Data/HeroineStatus.cs diff --git a/src/KKS_Pregnancy/Data/MenstruationSchedule.cs b/src/Core_Pregnancy_KK/Data/MenstruationSchedule.cs similarity index 100% rename from src/KKS_Pregnancy/Data/MenstruationSchedule.cs rename to src/Core_Pregnancy_KK/Data/MenstruationSchedule.cs diff --git a/src/Core_Pregnancy/Data/PregnancyData.cs b/src/Core_Pregnancy_KK/Data/PregnancyData.cs similarity index 100% rename from src/Core_Pregnancy/Data/PregnancyData.cs rename to src/Core_Pregnancy_KK/Data/PregnancyData.cs diff --git a/src/KKS_Pregnancy/Data/PregnancyDataUtils.cs b/src/Core_Pregnancy_KK/Data/PregnancyDataUtils.cs similarity index 98% rename from src/KKS_Pregnancy/Data/PregnancyDataUtils.cs rename to src/Core_Pregnancy_KK/Data/PregnancyDataUtils.cs index 9cca14b..efeca0f 100644 --- a/src/KKS_Pregnancy/Data/PregnancyDataUtils.cs +++ b/src/Core_Pregnancy_KK/Data/PregnancyDataUtils.cs @@ -54,7 +54,7 @@ public static HeroineStatus GetCharaStatus(this SaveData.CharaData chara, Pregna if (pregData == null) pregData = heroine.GetPregnancyData(); // Check if she wants to tell //todo need to ask in talk scene - if (heroine.intimacy >= 80 || + if (heroine.intimacy >= 80 || //todo what is relation in kks heroine.hCount >= 5 || heroine.parameter.attribute.bitch && heroine.favor > 50 || (heroine.isGirlfriend || heroine.favor >= 90) && diff --git a/src/KKS_Pregnancy/LactationController.cs b/src/Core_Pregnancy_KK/LactationController.cs similarity index 98% rename from src/KKS_Pregnancy/LactationController.cs rename to src/Core_Pregnancy_KK/LactationController.cs index b076288..8340378 100644 --- a/src/KKS_Pregnancy/LactationController.cs +++ b/src/Core_Pregnancy_KK/LactationController.cs @@ -233,9 +233,14 @@ void PlaySoundEffect(ChaControl chaControl, ChaReference.RefObjKey reference) { var soundEffectSetting = new Utils.Sound.Setting(Manager.Sound.Type.GameSE3D) { - bundle = "sound/data/se/h/00/00_00.unity3d", +#if KK + assetBundleName = "sound/data/se/h/00/00_00.unity3d", + assetName = "khse_06" +#else + bundle = "sound/data/se/h/00/00_00.unity3d", //todo check if it's still the same asset name asset = "khse_06" - }; //todo check if it's still the same asset name +#endif + }; // Alternative sound effect, much longer //assetBundleName = @"sound/data/se/h/12/12_00.unity3d"; //assetName = "hse_siofuki"; diff --git a/src/KKS_Pregnancy/PregnancyBoneEffect.cs b/src/Core_Pregnancy_KK/PregnancyBoneEffect.cs similarity index 100% rename from src/KKS_Pregnancy/PregnancyBoneEffect.cs rename to src/Core_Pregnancy_KK/PregnancyBoneEffect.cs diff --git a/src/KKS_Pregnancy/PregnancyCharaController.cs b/src/Core_Pregnancy_KK/PregnancyCharaController.cs similarity index 100% rename from src/KKS_Pregnancy/PregnancyCharaController.cs rename to src/Core_Pregnancy_KK/PregnancyCharaController.cs diff --git a/src/KKS_Pregnancy/PregnancyGameController.cs b/src/Core_Pregnancy_KK/PregnancyGameController.cs similarity index 94% rename from src/KKS_Pregnancy/PregnancyGameController.cs rename to src/Core_Pregnancy_KK/PregnancyGameController.cs index 1aa3d81..4c80497 100644 --- a/src/KKS_Pregnancy/PregnancyGameController.cs +++ b/src/Core_Pregnancy_KK/PregnancyGameController.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using ExtensibleSaveFormat; -using KKAPI.Chara; using KKAPI.MainGame; using Manager; using UnityEngine; @@ -27,13 +26,21 @@ protected override void OnDayChange(Cycle.Week day) } } +#if KK + protected override void OnStartH(BaseLoader proc, HFlag hFlag, bool vr) +#else protected override void OnStartH(MonoBehaviour proc, HFlag hFlag, bool vr) +#endif { InsideHScene = true; proc.gameObject.AddComponent(); } +#if KK + protected override void OnEndH(BaseLoader proc, HFlag hFlag, bool vr) +#else protected override void OnEndH(MonoBehaviour proc, HFlag hFlag, bool vr) +#endif { InsideHScene = false; Destroy(proc.GetComponent()); @@ -114,8 +121,13 @@ void ApplyToDatas(SaveData.CharaData character) } } +#if KK + foreach (var heroine in Game.Instance.HeroineList) ApplyToDatas(heroine); + ApplyToDatas(Game.Instance.Player); +#else foreach (var heroine in Game.HeroineList) ApplyToDatas(heroine); ApplyToDatas(Game.Player); +#endif // If controller exists then update its state so it gets any pregnancy week updates foreach (var controller in FindObjectsOfType()) diff --git a/src/KKS_Pregnancy/PregnancyPlugin.Hooks.cs b/src/Core_Pregnancy_KK/PregnancyPlugin.Hooks.cs similarity index 100% rename from src/KKS_Pregnancy/PregnancyPlugin.Hooks.cs rename to src/Core_Pregnancy_KK/PregnancyPlugin.Hooks.cs diff --git a/src/KKS_Pregnancy/PregnancyPlugin.cs b/src/Core_Pregnancy_KK/PregnancyPlugin.cs similarity index 100% rename from src/KKS_Pregnancy/PregnancyPlugin.cs rename to src/Core_Pregnancy_KK/PregnancyPlugin.cs diff --git a/src/KKS_Pregnancy/KKS_Pregnancy.csproj b/src/KKS_Pregnancy/KKS_Pregnancy.csproj index 5fc9d52..e13fb7c 100644 --- a/src/KKS_Pregnancy/KKS_Pregnancy.csproj +++ b/src/KKS_Pregnancy/KKS_Pregnancy.csproj @@ -165,22 +165,6 @@ False - - - - - - - - - - - - - - - - @@ -192,6 +176,15 @@ + + + + + + + + + diff --git a/src/KK_Pregnancy/GUI/PregnancyGui.StatusIcons.cs b/src/KK_Pregnancy/GUI/PregnancyGui.StatusIcons.cs new file mode 100644 index 0000000..3c08582 --- /dev/null +++ b/src/KK_Pregnancy/GUI/PregnancyGui.StatusIcons.cs @@ -0,0 +1,361 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using ActionGame; +using HarmonyLib; +using Illusion.Extensions; +using KKAPI.MainGame; +using KKAPI.Utilities; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.UI; + +namespace KK_Pregnancy +{ + public static partial class PregnancyGui + { + private class StatusIcons : MonoBehaviour + { + private static Sprite _pregSprite; + private static Sprite _riskySprite; + private static Sprite _safeSprite; + private static Sprite _unknownSprite; + private static Sprite _leaveSprite; + + private const string ICON_NAME = "Pregnancy_Icon"; + + private static readonly List> _currentHeroine = new List>(); + + internal static void Init(Harmony hi, Sprite unknownSprite, Sprite pregSprite, Sprite safeSprite, Sprite riskySprite, Sprite leaveSprite) + { + _unknownSprite = unknownSprite ? unknownSprite : throw new ArgumentNullException(nameof(unknownSprite)); + _pregSprite = pregSprite ? pregSprite : throw new ArgumentNullException(nameof(pregSprite)); + _riskySprite = riskySprite ? riskySprite : throw new ArgumentNullException(nameof(riskySprite)); + _safeSprite = safeSprite ? safeSprite : throw new ArgumentNullException(nameof(safeSprite)); + _leaveSprite = leaveSprite ? leaveSprite : throw new ArgumentNullException(nameof(leaveSprite)); + + SceneManager.sceneLoaded += SceneManager_sceneLoaded; + SceneManager.sceneUnloaded += s => + { + if (_currentHeroine.Count > 0) + SceneManager_sceneLoaded(s, LoadSceneMode.Additive); + }; + + hi.PatchAll(typeof(StatusIcons)); + } + + /// + /// Handle class roster + /// + [HarmonyPostfix] + [HarmonyPatch(typeof(ClassRoomList), "PreviewUpdate")] + public static void ClassroomPreviewUpdateHook(ClassRoomList __instance) + { + IEnumerator ClassroomPreviewUpdateCo() + { + yield return new WaitForEndOfFrame(); + + _currentHeroine.Clear(); + SpawnGUI(); + + var entries = Traverse.Create(__instance).Property("charaPreviewList") + .GetValue>(); + + foreach (var chaEntry in entries) + { + // Need to call this every time in case characters get transferred/edited + SetHeart(chaEntry.rootObj, chaEntry.data, true); + } + } + + _pluginInstance.StartCoroutine(ClassroomPreviewUpdateCo()); + } + + /// + /// Handle character list in roaming mode + /// + private static void SceneManager_sceneLoaded(Scene scene, LoadSceneMode mode) + { + if (mode == LoadSceneMode.Single || _pluginInstance == null) + return; + + _currentHeroine.Clear(); + + var chaStatusScene = FindObjectOfType(); + if (chaStatusScene != null) + { + SpawnGUI(); + + IEnumerator CreatePregnancyIconCo() + { + yield return new WaitForEndOfFrame(); + + foreach (var chaStatusComponent in chaStatusScene.transform.GetComponentsInChildren()) + { + var chara = (SaveData.CharaData)chaStatusComponent.heroine ?? + (chaStatusComponent.name == "status_m" ? Manager.Game.Instance.Player : null); + SetHeart(chaStatusComponent.gameObject, chara, false); + } + } + + _pluginInstance.StartCoroutine(CreatePregnancyIconCo()); + } + } + + /// + /// Handle char icon for top left quick status popup during roaming mode + /// + [HarmonyPostfix] + [HarmonyPatch(typeof(ParamUI), "SetHeroine", typeof(SaveData.Heroine))] + private static void ParamUI_SetHeroine(ParamUI __instance, SaveData.Heroine _heroine) + { + var objFemaleRoot = Traverse.Create(__instance).Field("objFemaleRoot").GetValue(); + if (objFemaleRoot == null) return; + + SpawnGUI(); + + IEnumerator HeroineCanvasPreviewUpdateCo() + { + yield return new WaitForEndOfFrame(); + + _currentHeroine.Clear(); + SetQuickStatusIcon(objFemaleRoot, _heroine, -214f, -26f); + } + + _pluginInstance.StartCoroutine(HeroineCanvasPreviewUpdateCo()); + } + + private static void SpawnGUI() + { + if (!GameObject.Find("PregnancyGUI")) + new GameObject("PregnancyGUI").AddComponent(); + } + + private void OnGUI() + { + if (_currentHeroine.Count == 0) return; + + var pos = new Vector2(Input.mousePosition.x, -(Input.mousePosition.y - Screen.height)); + var heroineRect = _currentHeroine.FirstOrDefault(x => + { + if (x.Value == null) return false; + return GetOccupiedScreenRect(x).Contains(pos); + }); + var chara = heroineRect.Key; + if (chara == null) return; + + var pregData = chara.GetPregnancyData(); + + var status = chara.GetCharaStatus(pregData); + var heroine = chara as SaveData.Heroine; + + var windowHeight = status == HeroineStatus.Unknown ? 100 : status == HeroineStatus.Pregnant || status == HeroineStatus.OnLeave ? 180 : 370; + var screenRect = new Rect((int)pos.x + 30, (int)pos.y - windowHeight / 2, 180, windowHeight); + IMGUIUtils.DrawSolidBox(screenRect); + GUILayout.BeginArea(screenRect, GUI.skin.box); + { + GUILayout.BeginVertical(); + { + GUILayout.FlexibleSpace(); + + switch (status) + { + case HeroineStatus.Unknown: + GUILayout.Label("This character didn't tell you their risky day schedule yet."); + GUILayout.FlexibleSpace(); + GUILayout.Label("Become closer to learn it!"); + break; + + case HeroineStatus.OnLeave: + GUILayout.Label("This character is on a maternal leave and will not appear until it is over."); + GUILayout.FlexibleSpace(); + GUILayout.Label("Consider using a rubber next time!"); + break; + + case HeroineStatus.Pregnant: + GUILayout.Label($"This character is pregnant (on week {pregData.Week} / 40)."); + GUILayout.FlexibleSpace(); + if (pregData.GameplayEnabled) + GUILayout.Label(heroine != null ? "The character's body will slowly change, and at the end they will temporarily leave." : "The character's body will slowly change."); + + GUILayout.FlexibleSpace(); + var previousPregcount = Mathf.Max(0, pregData.PregnancyCount - 1); + GUILayout.Label($"This character was pregnant {previousPregcount} times before."); + break; + + case HeroineStatus.Safe: + case HeroineStatus.Risky: + if (heroine == null) break; + + GUILayout.Label(status == HeroineStatus.Safe + ? "This character is on a safe day, have fun!" + : "This character is on a risky day, be careful!"); + //GUILayout.Space(5); + GUILayout.FlexibleSpace(); + + var day = Singleton.Instance.nowWeek; + + GUILayout.Label("Forecast for this week:"); + GUILayout.Label($"Today ({day}): {status}"); + + for (var dayOffset = 1; dayOffset < 7; dayOffset++) + { + var adjustedDay = (Cycle.Week)((int)(day + dayOffset) % Enum.GetValues(typeof(Cycle.Week)).Length); + var adjustedSafe = HFlag.GetMenstruation((byte)((heroine.MenstruationDay + dayOffset) % HFlag.menstruations.Length)) == HFlag.MenstruationType.安全日; + GUILayout.Label($"{adjustedDay}: {(adjustedSafe ? "Safe" : "Risky")}"); + } + + + var pregnancyCount = pregData.IsPregnant ? pregData.PregnancyCount - 1 : pregData.PregnancyCount; + if (pregnancyCount > 0) + { + GUILayout.FlexibleSpace(); + GUILayout.Label($"This character was pregnant {pregnancyCount} times."); + } + + if (pregData.WeeksSinceLastPregnancy > 0) + { + GUILayout.FlexibleSpace(); + GUILayout.Label($"Last pregnancy was {pregData.WeeksSinceLastPregnancy} weeks ago."); + } + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + GUILayout.FlexibleSpace(); + } + GUILayout.EndVertical(); + } + GUILayout.EndArea(); + } + + /// + /// Enable/disable pregnancy icon + /// + private static void SetHeart(GameObject rootObj, SaveData.CharaData chara, bool classRoster) + { + var pregIconTr = rootObj.transform.Find(ICON_NAME); + + if (chara == null) + { + if (pregIconTr != null) + Destroy(pregIconTr.gameObject); + } + else + { + if (pregIconTr == null) + { + pregIconTr = new GameObject(ICON_NAME, typeof(RectTransform), typeof(CanvasRenderer), typeof(Image)).transform; + pregIconTr.SetParent(rootObj.transform, false); + var rt = pregIconTr.GetComponent(); + if (classRoster) + { + rt.anchorMax = rt.anchorMin = rt.pivot = new Vector2(0, 1); + rt.offsetMin = Vector2.zero; + rt.offsetMax = new Vector2(48, 48); + rt.localScale = Vector3.one; + rt.localPosition = new Vector3(4, -115, 0); + } + else // status screen during roaming mode + { + rt.anchorMax = rt.anchorMin = rt.pivot = new Vector2(0.5f, 0.5f); + rt.offsetMin = Vector2.zero; + rt.offsetMax = new Vector2(48, 48); + rt.localScale = Vector3.one; + rt.localPosition = new Vector3(-273, -85, 0); + } + } + + AddPregIcon(pregIconTr, chara); + } + } + + /// + /// Enable/disable pregnancy icon on quick status container + /// + /// The heroine image object + /// Is the preg icon shown + /// Offset from the character image + /// Offset from the character image + private static void SetQuickStatusIcon(GameObject characterImageObj, SaveData.Heroine heroine, float xOffset, float yOffset) + { + var existing = characterImageObj.transform.Find(ICON_NAME); + + if (heroine == null) + { + if (existing != null) + Destroy(existing.gameObject); + } + else + { + if (existing == null) + { + var newChildIcon = new GameObject(); + newChildIcon.AddComponent(); + newChildIcon.AddComponent(); + + var copy = Instantiate(newChildIcon, characterImageObj.transform); + copy.name = ICON_NAME; + copy.SetActive(true); + + var charRt = characterImageObj.GetComponent(); + var rt = copy.GetComponent(); + rt.anchoredPosition = new Vector2(charRt.anchoredPosition.x + xOffset, charRt.anchoredPosition.y + yOffset); + rt.sizeDelta = new Vector2(48, 48); + + existing = copy.transform; + } + + AddPregIcon(existing, heroine); + } + } + + private static readonly Vector3[] _worldCornersBuffer = new Vector3[4]; + + private static void AddPregIcon(Transform pregIconTransform, SaveData.CharaData chara) + { + var image = pregIconTransform.GetComponent(); + + _currentHeroine.Add(new KeyValuePair(chara, image.GetComponent())); + + var status = chara.GetCharaStatus(chara.GetPregnancyData()); + switch (status) + { + case HeroineStatus.Unknown: + image.sprite = _unknownSprite; + break; + case HeroineStatus.OnLeave: + image.sprite = _leaveSprite; + break; + case HeroineStatus.Safe: + image.sprite = _safeSprite; + break; + case HeroineStatus.Risky: + image.sprite = _riskySprite; + break; + case HeroineStatus.Pregnant: + image.sprite = _pregSprite; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + pregIconTransform.gameObject.SetActiveIfDifferent(chara is SaveData.Heroine || status == HeroineStatus.Pregnant); + } + + private static Rect GetOccupiedScreenRect(KeyValuePair x) + { + x.Value.GetWorldCorners(_worldCornersBuffer); + var screenPos = new Rect( + _worldCornersBuffer[0].x, + Screen.height - _worldCornersBuffer[2].y, + _worldCornersBuffer[2].x - _worldCornersBuffer[0].x, + _worldCornersBuffer[2].y - _worldCornersBuffer[0].y); + return screenPos; + } + } + } +} \ No newline at end of file diff --git a/src/Core_Pregnancy/GUI/PregnancyGui.cs b/src/KK_Pregnancy/GUI/PregnancyGui.cs similarity index 82% rename from src/Core_Pregnancy/GUI/PregnancyGui.cs rename to src/KK_Pregnancy/GUI/PregnancyGui.cs index 867d315..a45c919 100644 --- a/src/Core_Pregnancy/GUI/PregnancyGui.cs +++ b/src/KK_Pregnancy/GUI/PregnancyGui.cs @@ -7,9 +7,6 @@ using KKAPI.Utilities; using UniRx; using UnityEngine; -#if AI - using AIChara; -#endif namespace KK_Pregnancy { @@ -34,7 +31,7 @@ Sprite LoadIcon(string resourceFileName) var iconTex = new Texture2D(2, 2, TextureFormat.DXT5, false); Object.DontDestroyOnLoad(iconTex); iconTex.LoadImage(ResourceUtils.GetEmbeddedResource(resourceFileName)); - + var sprite = Sprite.Create(iconTex, new Rect(0f, 0f, iconTex.width, iconTex.height), new Vector2(0.5f, 0.5f), 100f, 0u, SpriteMeshType.FullRect); Object.DontDestroyOnLoad(sprite); @@ -47,10 +44,8 @@ Sprite LoadIcon(string resourceFileName) var leaveSprite = LoadIcon("leave.png"); StatusIcons.Init(hi, unknownSprite, pregSprite, safeSprite, riskySprite, leaveSprite); - - #if KK - HSceneMenstrIconOverride.Init(hi, unknownSprite, pregSprite, safeSprite, riskySprite, leaveSprite); - #endif + + HSceneMenstrIconOverride.Init(hi, unknownSprite, pregSprite, safeSprite, riskySprite, leaveSprite); } } @@ -72,12 +67,7 @@ private static void MakerAPI_MakerBaseLoaded(object sender, RegisterSubCategorie var female = MakerAPI.GetMakerSex() != 0; // This category is inaccessible from class maker - - #if KK - var cat = new MakerCategory(MakerConstants.Parameter.Character.CategoryName, "Pregnancy"); //MakerConstants.Parameter.Character; - #elif AI - var cat = new MakerCategory(MakerConstants.Body.CategoryName, "Pregnancy"); - #endif + var cat = new MakerCategory(MakerConstants.Parameter.Character.CategoryName, "Pregnancy"); //MakerConstants.Parameter.Character; e.AddSubCategory(cat); @@ -118,15 +108,13 @@ private static void MakerAPI_MakerBaseLoaded(object sender, RegisterSubCategorie e.AddControl(new MakerText("Changes how many risky days the character has in a cycle. Default is more safe days than risky days.", cat, _pluginInstance) { TextColor = hintColor }); } - #if KK - if (female) - { - var lactatToggle = e.AddControl(new MakerToggle(cat, "Always lactates", _pluginInstance)); - lactatToggle.BindToFunctionController(controller => controller.Data.AlwaysLactates, (controller, value) => controller.Data.AlwaysLactates = value); + if (female) + { + var lactatToggle = e.AddControl(new MakerToggle(cat, "Always lactates", _pluginInstance)); + lactatToggle.BindToFunctionController(controller => controller.Data.AlwaysLactates, (controller, value) => controller.Data.AlwaysLactates = value); - e.AddControl(new MakerText("Makes the character always have milk, even when not pregnant.", cat, _pluginInstance) { TextColor = hintColor }); - } - #endif + e.AddControl(new MakerText("Makes the character always have milk, even when not pregnant.", cat, _pluginInstance) { TextColor = hintColor }); + } } } } diff --git a/src/KK_Pregnancy/KK_Pregnancy.csproj b/src/KK_Pregnancy/KK_Pregnancy.csproj index 7f9f909..e45389e 100644 --- a/src/KK_Pregnancy/KK_Pregnancy.csproj +++ b/src/KK_Pregnancy/KK_Pregnancy.csproj @@ -36,24 +36,20 @@ true - - ..\packages\IllusionLibs.BepInEx.Harmony.2.5.1\lib\net35\0Harmony.dll + + ..\packages\IllusionLibs.BepInEx.Harmony.2.5.4\lib\net35\0Harmony.dll False - ..\packages\IllusionLibs.Koikatu.Assembly-CSharp.2019.4.27.2\lib\net35\Assembly-CSharp.dll + ..\packages\IllusionLibs.Koikatu.Assembly-CSharp.2019.4.27.4\lib\net35\Assembly-CSharp.dll False - ..\packages\IllusionLibs.Koikatu.Assembly-CSharp-firstpass.2019.4.27.2\lib\net35\Assembly-CSharp-firstpass.dll + ..\packages\IllusionLibs.Koikatu.Assembly-CSharp-firstpass.2019.4.27.4\lib\net35\Assembly-CSharp-firstpass.dll False - - ..\packages\IllusionLibs.BepInEx.5.4.12\lib\net35\BepInEx.dll - False - - - ..\packages\IllusionLibs.BepInEx.Harmony.2.5.1\lib\net35\BepInEx.Harmony.dll + + ..\packages\IllusionLibs.BepInEx.5.4.15\lib\net35\BepInEx.dll False @@ -64,8 +60,16 @@ ..\packages\ABMX.KKABMX.4.4.1\lib\net35\KKABMX.dll False - - ..\packages\IllusionModdingAPI.KKAPI.1.22.0\lib\net35\KKAPI.dll + + ..\packages\IllusionModdingAPI.KKAPI.1.27.0\lib\net35\KKAPI.dll + False + + + ..\packages\IllusionLibs.BepInEx.MonoMod.21.8.5.1\lib\net35\MonoMod.RuntimeDetour.dll + False + + + ..\packages\IllusionLibs.BepInEx.MonoMod.21.8.5.1\lib\net35\MonoMod.Utils.dll False @@ -84,32 +88,42 @@ + + + + + + + + + - + - - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + + + + - - - + + + + \ No newline at end of file diff --git a/src/KK_Pregnancy/LactationController.cs b/src/KK_Pregnancy/LactationController.cs deleted file mode 100644 index 754559f..0000000 --- a/src/KK_Pregnancy/LactationController.cs +++ /dev/null @@ -1,331 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using HarmonyLib; -using Illusion.Game; -using UnityEngine; -using Random = UnityEngine.Random; -#if AI - using AIChara; -#endif - -namespace KK_Pregnancy -{ - public class LactationController : MonoBehaviour - { - private const float MinimumMilk = 0.4f; - private const float MoreMilk = 0.65f; - private readonly List _charas = new List(); - private float _orgasmDelayTimer; - private HSceneProc _proc; - private float _touchingDelayTimer; - - private void Start() - { - if (!PregnancyPlugin.LactationEnabled.Value) - { - enabled = false; - return; - } - - _proc = FindObjectOfType(); - - var lstFemale = (List)AccessTools.Field(typeof(HSceneProc), "lstFemale").GetValue(_proc); - - _charas.Add(new CharaData(lstFemale[0], _proc.particle, _proc.hand)); - if (lstFemale.Count > 1 && lstFemale[1] != null) - _charas.Add(new CharaData(lstFemale[1], _proc.particle1, _proc.hand1)); - - if (_charas.TrueForAll(x => x.MaxMilk < MinimumMilk)) - enabled = false; - } - - private void Update() - { - // figure out when to fire - var animatorStateInfo = _charas[0].ChaControl.getAnimatorStateInfo(0); - var hFlag = _proc.flags; - var orgasmloop = hFlag.mode == HFlag.EMode.aibu - ? animatorStateInfo.IsName("Orgasm_Start") - : animatorStateInfo.IsName("OLoop") || animatorStateInfo.IsName("A_OLoop"); - - if (orgasmloop) - { - _orgasmDelayTimer = Random.value / 8; //0.1f; - } - else if (_orgasmDelayTimer > 0) - { - _orgasmDelayTimer -= Time.deltaTime; - if (_orgasmDelayTimer <= 0) - OnOrgasm(); - } - else - { - if (hFlag.drag && hFlag.speedItem > hFlag.speedUpItemClac.y * 0.8f) - { - if (_touchingDelayTimer <= 0) - { - foreach (var charaData in _charas) - { - if (charaData.IsTouchingMune(true, true)) - { - charaData.FireParticles(false); - _touchingDelayTimer = 1f; - } - } - } - else - { - _touchingDelayTimer -= Time.deltaTime; - } - } - else - { - _touchingDelayTimer = 0; - } - } - - // Regenerate milk over time - foreach (var charaData in _charas) - { - if (PregnancyPlugin.LactationFillTime.Value == 0) - { - charaData.CurrentMilk = charaData.MaxMilk; - } - else - { - // Fully fill in 60 seconds * x - var change = Time.deltaTime / (60f * PregnancyPlugin.LactationFillTime.Value); - charaData.CurrentMilk = Mathf.Min(charaData.CurrentMilk + change * charaData.MaxMilk, charaData.MaxMilk); - } - } - } - - private void OnOrgasm() - { - foreach (var charaData in _charas) - charaData.FireParticles(true); - } - - private class CharaData - { - private readonly HParticleCtrl _particleCtrl; - private readonly HandCtrl _procHand; - - public readonly ChaControl ChaControl; - - // Range from 0 to 1 - public readonly float MaxMilk; - private HParticleCtrl.ParticleInfo _partHeavyL; - - private HParticleCtrl.ParticleInfo _partHeavyR; - private HParticleCtrl.ParticleInfo _partLightL; - private HParticleCtrl.ParticleInfo _partLightR; - - private int _singleTriggerCount; - - // Range from 0 to MaxMilk - public float CurrentMilk; - - public CharaData(ChaControl chaControl, HParticleCtrl particleCtrl, HandCtrl procHand) - { - ChaControl = chaControl ? chaControl : throw new ArgumentNullException(nameof(chaControl)); - _procHand = procHand ? procHand : throw new ArgumentNullException(nameof(procHand)); - _particleCtrl = particleCtrl ? particleCtrl : throw new ArgumentNullException(nameof(particleCtrl)); - - var controller = chaControl.GetComponent(); - MaxMilk = GetMilkAmount(controller); - CurrentMilk = MaxMilk; - } - - private static float GetMilkAmount(PregnancyCharaController controller) - { - if (controller == null) return 0; - if (PregnancyPlugin.LactationForceMaxCapacity.Value) return 1; - var data = controller.Data; - if (data.AlwaysLactates) return 1; - // Gradually increase - if (data.IsPregnant) return Mathf.Clamp01(data.Week / 40f); - // Gradually decrease after pregnancy finishes - if (data.PregnancyCount > 0) return 1 - Mathf.Clamp01(data.WeeksSinceLastPregnancy / (40f / PregnancyPlugin.PregnancyProgressionSpeed.Value)); - return 0; - } - - public bool IsTouchingMune(bool l, bool r) - { - for (var i = 0; i < 3; i++) - { - var useItemStickArea = _procHand.GetUseItemStickArea(i); - if (useItemStickArea == HandCtrl.AibuColliderKind.muneL && l || - useItemStickArea == HandCtrl.AibuColliderKind.muneR && r) return true; - } - - return false; - } - - public void FireParticles(bool orgasm) - { - var clothesState = ChaControl.fileStatus.clothesState; - // Only trigger when the top clothes are not present or removed - if ((!ChaControl.IsClothesStateKind(0) || clothesState[0] != 0) && - (!ChaControl.IsClothesStateKind(2) || clothesState[2] != 0)) - { - //PregnancyPlugin.Logger.LogDebug( - // $"OnOrgasm > CurrentMilk level for chara {ChaControl.chaFile.parameter.fullname}: {Mathf.RoundToInt(CurrentMilk * 100)}%"); - - InitializeParticles(); - - if (CurrentMilk >= MoreMilk) - { - if (orgasm) - OnOrgasm(true); - else - OnSingle(true); - } - else if (CurrentMilk >= MinimumMilk) - { - if (orgasm) - OnOrgasm(false); - else - OnSingle(false); - } - } - } - - private void OnSingle(bool large) - { - if (IsTouchingMune(true, false)) - { - _partLightL.particle.Simulate(0f); - _partLightL.particle.Play(); - CurrentMilk -= 0.025f; - } - - if (IsTouchingMune(false, true)) - { - _partLightR.particle.Simulate(0f); - _partLightR.particle.Play(); - CurrentMilk -= 0.025f; - } - - ChaControl.StartCoroutine(OnSingleCo()); - - if (_singleTriggerCount++ == 4) - { - var currentState = ChaControl.GetSiruFlags(ChaFileDefine.SiruParts.SiruFrontUp); - if (currentState < 1) // Only go up to the 1st level since quantity is lower - ChaControl.SetSiruFlags(ChaFileDefine.SiruParts.SiruFrontUp, (byte)(currentState + 1)); - } - } - - private IEnumerator OnSingleCo() - { - yield return new WaitForSeconds(0.3f); - //_partHeavyL.particle.Stop(); - //_partHeavyR.particle.Stop(); - _partLightL.particle.Stop(); - _partLightR.particle.Stop(); - } - - private void OnOrgasm(bool large) - { - void PlaySoundEffect(ChaControl chaControl, ChaReference.RefObjKey reference) - { - var soundEffectSetting = new Utils.Sound.Setting(Manager.Sound.Type.GameSE3D) - { - assetBundleName = "sound/data/se/h/00/00_00.unity3d", - assetName = "khse_06" - }; - // Alternative sound effect, much longer - //assetBundleName = @"sound/data/se/h/12/12_00.unity3d"; - //assetName = "hse_siofuki"; - - var soundTr = Utils.Sound.Play(soundEffectSetting); - var chaRef = chaControl.GetReferenceInfo(reference); - if (soundTr && chaRef) - soundTr.SetParent(chaRef.transform, false); - } - - PlaySoundEffect(ChaControl, ChaReference.RefObjKey.a_n_bust_f); - - var currentState = ChaControl.GetSiruFlags(ChaFileDefine.SiruParts.SiruFrontUp); - if (large) - { - _partHeavyL.particle.Simulate(0f); - _partHeavyL.particle.Play(); - _partHeavyR.particle.Simulate(0f); - _partHeavyR.particle.Play(); - - CurrentMilk -= 0.35f; - if (currentState < 2) // Has 3 states, value is max 2 - ChaControl.SetSiruFlags(ChaFileDefine.SiruParts.SiruFrontUp, (byte)(currentState + 1)); - } - else - { - _partLightL.particle.Simulate(0f); - _partLightL.particle.Play(); - _partLightR.particle.Simulate(0f); - _partLightR.particle.Play(); - - CurrentMilk -= 0.25f; - if (currentState < 1) // Only go up to the 1st level since quantity is lower - ChaControl.SetSiruFlags(ChaFileDefine.SiruParts.SiruFrontUp, (byte)(currentState + 1)); - } - } - - private void InitializeParticles() - { - // todo what happens when switching characters? - if (_partHeavyR != null) return; - - PregnancyPlugin.Logger.LogDebug("Adding particles to heroine: " + ChaControl.fileParam.fullname); - - _partHeavyR = new HParticleCtrl.ParticleInfo - { - assetPath = @"h/common/00_00.unity3d", - file = "LiquidSiru", - numParent = 1, - nameParent = "a_n_nip_R", - //pos = new Vector3(0f, 0f, 0.05f), - rot = new Vector3(-25f, 0, 0f) - }; - _partLightR = new HParticleCtrl.ParticleInfo - { - assetPath = @"h/common/00_00.unity3d", - file = "LiquidSio", - numParent = 1, - nameParent = "a_n_nip_R", - //pos = new Vector3(0, 0f, 0.05f), - rot = new Vector3(-20, 0, 0) - }; - _partHeavyL = new HParticleCtrl.ParticleInfo - { - assetPath = @"h/common/00_00.unity3d", - file = "LiquidSiru", - numParent = 1, - nameParent = "a_n_nip_L", - //pos = new Vector3(0, 0f, 0.05f), - rot = new Vector3(-25f, 0, 0f) - }; - _partLightL = new HParticleCtrl.ParticleInfo - { - assetPath = @"h/common/00_00.unity3d", - file = "LiquidSio", - numParent = 1, - nameParent = "a_n_nip_L", - //pos = new Vector3(0, 0f, 0.05f), - rot = new Vector3(-20, 0, 0) - }; - - // Load the particles - var particleDic = (Dictionary)AccessTools - .Field(typeof(HParticleCtrl), "dicParticle").GetValue(_particleCtrl); - particleDic[691] = _partHeavyR; - particleDic[692] = _partLightR; - particleDic[693] = _partHeavyL; - particleDic[694] = _partLightL; - _particleCtrl.Load(ChaControl.objBodyBone, 1); - } - } - } -} \ No newline at end of file diff --git a/src/KK_Pregnancy/Resources/leave.png b/src/KK_Pregnancy/Resources/leave.png new file mode 100644 index 0000000000000000000000000000000000000000..5498a4a36fc1272da15cb502166231f4f6cf45ae GIT binary patch literal 4228 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

A(nsS>6$iP3^?xMpj}cEJsY? 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 z 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 q)SK+exr*?+cf&J>2v!5YZu?)bT7STS{Q7F(^8 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 eYwxv*?SBE={}_;pGSZp=0000 literal 0 HcmV?d00001 diff --git a/src/KK_Pregnancy/Resources/risky.png b/src/KK_Pregnancy/Resources/risky.png new file mode 100644 index 0000000000000000000000000000000000000000..8592f84b5e2f976cc2fd9aa43c16c3a0d280e493 GIT binary patch literal 3399 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 d`e0K5GEBl| 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 literal 0 HcmV?d00001 diff --git a/src/KK_Pregnancy/Resources/unknown.png b/src/KK_Pregnancy/Resources/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..e99268e9d41bbbb30ee2993ba67b85e9129fe908 GIT binary patch literal 3436 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 O0000 - - - - + + + + + - + \ No newline at end of file diff --git a/src/KoikatuGameplayMod.sln b/src/KoikatuGameplayMod.sln index f4371d3..4080c52 100644 --- a/src/KoikatuGameplayMod.sln +++ b/src/KoikatuGameplayMod.sln @@ -41,22 +41,22 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KKS_GameplayMod", "KKS_Game EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Core_GameplayMod", "Core_GameplayMod\Core_GameplayMod.shproj", "{C9650F99-DF26-4D54-9826-5F77275C9D31}" EndProject -Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "KKAI_Pregnancy", "Core_Pregnancy\KKAI_Pregnancy.shproj", "{EEBF32ED-C125-4597-8B3D-4E7E44A15626}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KKS_Pregnancy", "KKS_Pregnancy\KKS_Pregnancy.csproj", "{736EB022-A7B9-43AA-95C3-05A84B57F7E7}" EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Core_Pregnancy_KK", "Core_Pregnancy_KK\Core_Pregnancy_KK.shproj", "{3C122EF8-491B-447B-94E4-ADA9D818403C}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution Core_Bulge\Core_Bulge.projitems*{0f6b651e-d1f9-467f-a8f3-d1006c277e51}*SharedItemsImports = 4 Core_GameplayMod\Core_GameplayMod.projitems*{15a4df23-86ea-49b4-b120-e8f123f8dafe}*SharedItemsImports = 4 + Core_Pregnancy_KK\Core_Pregnancy_KK.projitems*{3c122ef8-491b-447b-94e4-ada9d818403c}*SharedItemsImports = 13 Core_Bulge\Core_Bulge.projitems*{3e03b28f-bc65-459f-89e5-70d89905d636}*SharedItemsImports = 13 Core_Bulge\Core_Bulge.projitems*{49cad984-906a-4b18-9982-e003d8668fe4}*SharedItemsImports = 4 + Core_Pregnancy_KK\Core_Pregnancy_KK.projitems*{736eb022-a7b9-43aa-95c3-05a84b57f7e7}*SharedItemsImports = 4 Core_Bulge\Core_Bulge.projitems*{904b04c0-5095-40f9-915a-005f80bc2cb1}*SharedItemsImports = 4 - Core_Pregnancy\Core_Pregnancy.projitems*{930a00a6-2935-4ea0-81f0-b16d3e71b74c}*SharedItemsImports = 4 - Core_Pregnancy\Core_Pregnancy.projitems*{930a00a6-2935-4ea0-81f0-c16d3e71b74c}*SharedItemsImports = 4 + Core_Pregnancy_KK\Core_Pregnancy_KK.projitems*{930a00a6-2935-4ea0-81f0-b16d3e71b74c}*SharedItemsImports = 4 Core_GameplayMod\Core_GameplayMod.projitems*{9a51cfcb-a18a-428a-843a-fe7cf2eef523}*SharedItemsImports = 4 Core_GameplayMod\Core_GameplayMod.projitems*{c9650f99-df26-4d54-9826-5f77275c9d31}*SharedItemsImports = 13 - Core_Pregnancy\Core_Pregnancy.projitems*{eebf32ed-c125-4597-8b3d-4e7e44a15626}*SharedItemsImports = 13 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -137,8 +137,8 @@ Global {0F6B651E-D1F9-467F-A8F3-D1006C277E51} = {C75FFBF1-9DCE-4BC4-9F20-F95B243ABEE3} {15A4DF23-86EA-49B4-B120-E8F123F8DAFE} = {5DECD423-5B05-4F46-AB72-7CA9CCB27E0C} {C9650F99-DF26-4D54-9826-5F77275C9D31} = {5DECD423-5B05-4F46-AB72-7CA9CCB27E0C} - {EEBF32ED-C125-4597-8B3D-4E7E44A15626} = {1C61B7E0-3603-4193-9B05-A5FF0CAFBD11} {736EB022-A7B9-43AA-95C3-05A84B57F7E7} = {1C61B7E0-3603-4193-9B05-A5FF0CAFBD11} + {3C122EF8-491B-447B-94E4-ADA9D818403C} = {1C61B7E0-3603-4193-9B05-A5FF0CAFBD11} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {19B0272D-3305-4C60-8DD9-E15889B2FF54} From 4072bad68a7aac3e4039ac15423ea488ee27bd70 Mon Sep 17 00:00:00 2001 From: ManlyMarco <39247311+ManlyMarco@users.noreply.github.com> Date: Fri, 5 Nov 2021 23:24:38 +0100 Subject: [PATCH 4/4] Final KKS fixes --- .../Data/PregnancyDataUtils.cs | 9 +- src/Core_Pregnancy_KK/LactationController.cs | 13 +- .../PregnancyPlugin.Hooks.cs | 25 +- .../GUI/PregnancyGui.StatusIcons.cs | 272 +++++------------- src/KKS_Pregnancy/KKS_Pregnancy.csproj | 6 +- 5 files changed, 98 insertions(+), 227 deletions(-) diff --git a/src/Core_Pregnancy_KK/Data/PregnancyDataUtils.cs b/src/Core_Pregnancy_KK/Data/PregnancyDataUtils.cs index efeca0f..e1fd1d0 100644 --- a/src/Core_Pregnancy_KK/Data/PregnancyDataUtils.cs +++ b/src/Core_Pregnancy_KK/Data/PregnancyDataUtils.cs @@ -54,11 +54,18 @@ public static HeroineStatus GetCharaStatus(this SaveData.CharaData chara, Pregna if (pregData == null) pregData = heroine.GetPregnancyData(); // Check if she wants to tell //todo need to ask in talk scene - if (heroine.intimacy >= 80 || //todo what is relation in kks +#if KK + if (heroine.intimacy >= 80 || heroine.hCount >= 5 || heroine.parameter.attribute.bitch && heroine.favor > 50 || (heroine.isGirlfriend || heroine.favor >= 90) && (!heroine.isVirgin || heroine.hCount >= 2 || heroine.intimacy >= 40)) +#else + if (heroine.relation >= 3 || + heroine.hCount >= 5 || + heroine.parameter.attribute.bitch && heroine.favor > 50 || + heroine.isGirlfriend && (heroine.favor >= 90 || heroine.hCount >= 2)) +#endif { var pregnancyWeek = pregData.Week; if (pregnancyWeek > 0) diff --git a/src/Core_Pregnancy_KK/LactationController.cs b/src/Core_Pregnancy_KK/LactationController.cs index 8340378..680e694 100644 --- a/src/Core_Pregnancy_KK/LactationController.cs +++ b/src/Core_Pregnancy_KK/LactationController.cs @@ -285,9 +285,14 @@ private void InitializeParticles() PregnancyPlugin.Logger.LogDebug("Adding particles to heroine: " + ChaControl.fileParam.fullname); +#if KK + const string assetFilePath = @"h/common/00_00.unity3d"; +#elif KKS + const string assetFilePath = @"h/common/01.unity3d"; +#endif _partHeavyR = new HParticleCtrl.ParticleInfo { - assetPath = @"h/common/00_00.unity3d", + assetPath = assetFilePath, file = "LiquidSiru", numParent = 1, nameParent = "a_n_nip_R", @@ -296,7 +301,7 @@ private void InitializeParticles() }; _partLightR = new HParticleCtrl.ParticleInfo { - assetPath = @"h/common/00_00.unity3d", + assetPath = assetFilePath, file = "LiquidSio", numParent = 1, nameParent = "a_n_nip_R", @@ -305,7 +310,7 @@ private void InitializeParticles() }; _partHeavyL = new HParticleCtrl.ParticleInfo { - assetPath = @"h/common/00_00.unity3d", + assetPath = assetFilePath, file = "LiquidSiru", numParent = 1, nameParent = "a_n_nip_L", @@ -314,7 +319,7 @@ private void InitializeParticles() }; _partLightL = new HParticleCtrl.ParticleInfo { - assetPath = @"h/common/00_00.unity3d", + assetPath = assetFilePath, file = "LiquidSio", numParent = 1, nameParent = "a_n_nip_L", diff --git a/src/Core_Pregnancy_KK/PregnancyPlugin.Hooks.cs b/src/Core_Pregnancy_KK/PregnancyPlugin.Hooks.cs index 855940a..c7470f9 100644 --- a/src/Core_Pregnancy_KK/PregnancyPlugin.Hooks.cs +++ b/src/Core_Pregnancy_KK/PregnancyPlugin.Hooks.cs @@ -1,11 +1,9 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Reflection; using System.Reflection.Emit; using ExtensibleSaveFormat; using HarmonyLib; -using KKAPI.MainGame; +using KKAPI.Utilities; using Manager; using UnityEngine; @@ -19,17 +17,14 @@ public static void InitHooks(Harmony harmonyInstance) { harmonyInstance.PatchAll(typeof(Hooks)); - PatchNPCLoadAll(harmonyInstance, new HarmonyMethod(typeof(Hooks), nameof(NPCLoadAllTpl))); + PatchNPCLoadAll(harmonyInstance); } - private static bool _lastPullProc; - #region Custom safe day schedule private static SaveData.Heroine _lastHeroine; private static byte[] _menstruationsBackup; - [HarmonyPostfix] [HarmonyPatch(typeof(SaveData.Heroine), nameof(SaveData.Heroine.MenstruationDay), MethodType.Getter)] private static void LastAccessedHeroinePatch(SaveData.Heroine __instance) @@ -71,17 +66,21 @@ private static void GetMenstruationOverridePostfix() ///

/// Needed for preventing characters from going to school when on leave after pregnancy /// - private static void PatchNPCLoadAll(Harmony instance, HarmonyMethod transpiler) + private static void PatchNPCLoadAll(Harmony instance) { - var t = typeof(ActionScene).GetNestedTypes(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).Single(x => x.Name.StartsWith("c__Iterator")); - var m = t.GetMethod("MoveNext"); - instance.Patch(m, null, null, transpiler); + var transpiler = new HarmonyMethod(typeof(Hooks), nameof(NPCLoadAllTpl)); + foreach (var target in typeof(ActionScene).GetMethods(AccessTools.all).Where(x => x.Name == nameof(ActionScene.NPCLoadAll))) + { + Logger.LogDebug("Patching " + target.FullDescription()); + instance.PatchMoveNext(target, null, null, transpiler); + } } private static IEnumerable NPCLoadAllTpl(IEnumerable instructions) { var target = AccessTools.Property(typeof(Game), nameof(Game.HeroineList)).GetGetMethod(); var customFilterM = AccessTools.Method(typeof(Hooks), nameof(GetFilteredHeroines)); + var count = 0; foreach (var instruction in instructions) { yield return instruction; @@ -90,8 +89,10 @@ private static IEnumerable NPCLoadAllTpl(IEnumerable> _currentHeroine = new List>(); + private static CharaData _currentHeroine; internal static void Init(Harmony hi, Sprite unknownSprite, Sprite pregSprite, Sprite safeSprite, Sprite riskySprite, Sprite leaveSprite) { @@ -35,13 +32,6 @@ internal static void Init(Harmony hi, Sprite unknownSprite, Sprite pregSprite, S _safeSprite = safeSprite ? safeSprite : throw new ArgumentNullException(nameof(safeSprite)); _leaveSprite = leaveSprite ? leaveSprite : throw new ArgumentNullException(nameof(leaveSprite)); - SceneManager.sceneLoaded += SceneManager_sceneLoaded; - SceneManager.sceneUnloaded += s => - { - if (_currentHeroine.Count > 0) - SceneManager_sceneLoaded(s, LoadSceneMode.Additive); - }; - hi.PatchAll(typeof(StatusIcons)); } @@ -49,108 +39,39 @@ internal static void Init(Harmony hi, Sprite unknownSprite, Sprite pregSprite, S /// Handle class roster ///
[HarmonyPostfix] - [HarmonyPatch(typeof(ClassRoomList), "PreviewUpdate")] - public static void ClassroomPreviewUpdateHook(ClassRoomList __instance) + [HarmonyPatch(typeof(Passport), nameof(Passport.Set))] + private static void ClassroomPreviewUpdateHook(Passport __instance, CharaData charaData) { - IEnumerator ClassroomPreviewUpdateCo() + try { - yield return new WaitForEndOfFrame(); - - _currentHeroine.Clear(); - SpawnGUI(); - - var entries = Traverse.Create(__instance).Property("charaPreviewList") - .GetValue>(); - - foreach (var chaEntry in entries) - { - // Need to call this every time in case characters get transferred/edited - SetHeart(chaEntry.rootObj, chaEntry.data, true); - } + SetHeart(__instance, charaData); } - - _pluginInstance.StartCoroutine(ClassroomPreviewUpdateCo()); - } - - /// - /// Handle character list in roaming mode - /// - private static void SceneManager_sceneLoaded(Scene scene, LoadSceneMode mode) - { - if (mode == LoadSceneMode.Single || _pluginInstance == null) - return; - - _currentHeroine.Clear(); - - var chaStatusScene = FindObjectOfType(); - if (chaStatusScene != null) + catch (Exception e) { - SpawnGUI(); - - IEnumerator CreatePregnancyIconCo() - { - yield return new WaitForEndOfFrame(); - - foreach (var chaStatusComponent in chaStatusScene.transform.GetComponentsInChildren()) - { - var chara = (SaveData.CharaData)chaStatusComponent.heroine ?? - (chaStatusComponent.name == "status_m" ? Manager.Game.Player : null); - SetHeart(chaStatusComponent.gameObject, chara, false); - } - } - - _pluginInstance.StartCoroutine(CreatePregnancyIconCo()); - } - } - - /// - /// Handle char icon for top left quick status popup during roaming mode - /// - [HarmonyPostfix] - [HarmonyPatch(typeof(ParamUI), "SetHeroine", typeof(SaveData.Heroine))] - private static void ParamUI_SetHeroine(ParamUI __instance, SaveData.Heroine _heroine) - { - var objFemaleRoot = Traverse.Create(__instance).Field("objFemaleRoot").GetValue(); - if (objFemaleRoot == null) return; - - SpawnGUI(); - - IEnumerator HeroineCanvasPreviewUpdateCo() - { - yield return new WaitForEndOfFrame(); - - _currentHeroine.Clear(); - SetQuickStatusIcon(objFemaleRoot, _heroine, -214f, -26f); + UnityEngine.Debug.LogException(e); } - - _pluginInstance.StartCoroutine(HeroineCanvasPreviewUpdateCo()); } - private static void SpawnGUI() + [HarmonyPrefix] + [HarmonyPatch(typeof(ActionScene), nameof(ActionScene.Start))] + private static void ClassRoomListStartHook(ClassRoomList __instance) { - if (!GameObject.Find("PregnancyGUI")) - new GameObject("PregnancyGUI").AddComponent(); + _currentHeroine = null; + __instance.OnGUIAsObservable().Subscribe(_ => OnGUI()); } - private void OnGUI() + private static void OnGUI() { - if (_currentHeroine.Count == 0) return; - - var pos = new Vector2(Input.mousePosition.x, -(Input.mousePosition.y - Screen.height)); - var heroineRect = _currentHeroine.FirstOrDefault(x => - { - if (x.Value == null) return false; - return GetOccupiedScreenRect(x).Contains(pos); - }); - var chara = heroineRect.Key; - if (chara == null) return; + if (_currentHeroine == null) return; + var chara = _currentHeroine; var pregData = chara.GetPregnancyData(); var status = chara.GetCharaStatus(pregData); - var heroine = chara as SaveData.Heroine; + var heroine = chara as Heroine; var windowHeight = status == HeroineStatus.Unknown ? 100 : status == HeroineStatus.Pregnant || status == HeroineStatus.OnLeave ? 180 : 370; + var pos = new Vector2(Input.mousePosition.x, -(Input.mousePosition.y - Screen.height)); var screenRect = new Rect((int)pos.x + 30, (int)pos.y - windowHeight / 2, 180, windowHeight); IMGUIUtils.DrawSolidBox(screenRect); GUILayout.BeginArea(screenRect, GUI.skin.box); @@ -235,126 +156,63 @@ private void OnGUI() /// /// Enable/disable pregnancy icon /// - private static void SetHeart(GameObject rootObj, SaveData.CharaData chara, bool classRoster) + private static void SetHeart(Passport passport, CharaData chara) { - var pregIconTr = rootObj.transform.Find(ICON_NAME); + if (passport == null) throw new ArgumentNullException(nameof(passport)); - if (chara == null) - { - if (pregIconTr != null) - Destroy(pregIconTr.gameObject); - } - else - { - if (pregIconTr == null) - { - pregIconTr = new GameObject(ICON_NAME, typeof(RectTransform), typeof(CanvasRenderer), typeof(Image)).transform; - pregIconTr.SetParent(rootObj.transform, false); - var rt = pregIconTr.GetComponent(); - if (classRoster) - { - rt.anchorMax = rt.anchorMin = rt.pivot = new Vector2(0, 1); - rt.offsetMin = Vector2.zero; - rt.offsetMax = new Vector2(48, 48); - rt.localScale = Vector3.one; - rt.localPosition = new Vector3(4, -115, 0); - } - else // status screen during roaming mode - { - rt.anchorMax = rt.anchorMin = rt.pivot = new Vector2(0.5f, 0.5f); - rt.offsetMin = Vector2.zero; - rt.offsetMax = new Vector2(48, 48); - rt.localScale = Vector3.one; - rt.localPosition = new Vector3(-273, -85, 0); - } - } + // This is needed because Atach has an image that covers our image, blocking pointer events. To fix this, change parent of our icon to the atach object + var atachTr = passport.transform.parent.Find("Atach"); - AddPregIcon(pregIconTr, chara); - } - } + var passpParentTr = passport._emptyImage.transform.parent; + var pregIconTr = (atachTr ?? passpParentTr).Find(ICON_NAME); - /// - /// Enable/disable pregnancy icon on quick status container - /// - /// The heroine image object - /// Is the preg icon shown - /// Offset from the character image - /// Offset from the character image - private static void SetQuickStatusIcon(GameObject characterImageObj, SaveData.Heroine heroine, float xOffset, float yOffset) - { - var existing = characterImageObj.transform.Find(ICON_NAME); + if (pregIconTr != null) + Destroy(pregIconTr.gameObject); - if (heroine == null) - { - if (existing != null) - Destroy(existing.gameObject); - } - else - { - if (existing == null) - { - var newChildIcon = new GameObject(); - newChildIcon.AddComponent(); - newChildIcon.AddComponent(); - - var copy = Instantiate(newChildIcon, characterImageObj.transform); - copy.name = ICON_NAME; - copy.SetActive(true); - - var charRt = characterImageObj.GetComponent(); - var rt = copy.GetComponent(); - rt.anchoredPosition = new Vector2(charRt.anchoredPosition.x + xOffset, charRt.anchoredPosition.y + yOffset); - rt.sizeDelta = new Vector2(48, 48); + if (chara == null) return; - existing = copy.transform; - } + var status = chara.GetCharaStatus(chara.GetPregnancyData()); + if (chara is Heroine || status == HeroineStatus.Pregnant) + { + pregIconTr = new GameObject(ICON_NAME, typeof(RectTransform), typeof(CanvasRenderer), typeof(Image)).transform; + pregIconTr.SetParent(passpParentTr, false); - AddPregIcon(existing, heroine); - } - } + var rt = pregIconTr.GetComponent(); + rt.anchorMax = rt.anchorMin = rt.pivot = new Vector2(0.5f, 0.5f); + rt.offsetMin = Vector2.zero; + rt.offsetMax = new Vector2(48, 48); + rt.localScale = Vector3.one; + rt.localPosition = new Vector3(27f, -163f, 0); - private static readonly Vector3[] _worldCornersBuffer = new Vector3[4]; + var image = pregIconTr.GetComponent(); - private static void AddPregIcon(Transform pregIconTransform, SaveData.CharaData chara) - { - var image = pregIconTransform.GetComponent(); + image.OnPointerEnterAsObservable().Subscribe(_ => _currentHeroine = chara); + image.OnPointerExitAsObservable().Subscribe(_ => _currentHeroine = null); - _currentHeroine.Add(new KeyValuePair(chara, image.GetComponent())); + switch (status) + { + case HeroineStatus.Unknown: + image.sprite = _unknownSprite; + break; + case HeroineStatus.OnLeave: + image.sprite = _leaveSprite; + break; + case HeroineStatus.Safe: + image.sprite = _safeSprite; + break; + case HeroineStatus.Risky: + image.sprite = _riskySprite; + break; + case HeroineStatus.Pregnant: + image.sprite = _pregSprite; + break; + default: + throw new ArgumentOutOfRangeException(); + } - var status = chara.GetCharaStatus(chara.GetPregnancyData()); - switch (status) - { - case HeroineStatus.Unknown: - image.sprite = _unknownSprite; - break; - case HeroineStatus.OnLeave: - image.sprite = _leaveSprite; - break; - case HeroineStatus.Safe: - image.sprite = _safeSprite; - break; - case HeroineStatus.Risky: - image.sprite = _riskySprite; - break; - case HeroineStatus.Pregnant: - image.sprite = _pregSprite; - break; - default: - throw new ArgumentOutOfRangeException(); + if (atachTr != null) + pregIconTr.SetParent(atachTr); } - - pregIconTransform.gameObject.SetActiveIfDifferent(chara is SaveData.Heroine || status == HeroineStatus.Pregnant); - } - - private static Rect GetOccupiedScreenRect(KeyValuePair x) - { - x.Value.GetWorldCorners(_worldCornersBuffer); - var screenPos = new Rect( - _worldCornersBuffer[0].x, - Screen.height - _worldCornersBuffer[2].y, - _worldCornersBuffer[2].x - _worldCornersBuffer[0].x, - _worldCornersBuffer[2].y - _worldCornersBuffer[0].y); - return screenPos; } } } diff --git a/src/KKS_Pregnancy/KKS_Pregnancy.csproj b/src/KKS_Pregnancy/KKS_Pregnancy.csproj index e13fb7c..f161842 100644 --- a/src/KKS_Pregnancy/KKS_Pregnancy.csproj +++ b/src/KKS_Pregnancy/KKS_Pregnancy.csproj @@ -180,9 +180,9 @@
- - - + + +