Пример #1
0
            internal static void DisplayHSubtitle(LoadAudioBase voice)
            {
                List <HActionBase> lstProc = (List <HActionBase>)AccessTools.Field(HSceneType, "lstProc").GetValue(HSceneInstance);
                HFlag       flags          = (HFlag)Traverse.Create(HSceneInstance).Field("flags").GetValue();
                HActionBase mode           = lstProc[(int)flags.mode];
                HVoiceCtrl  voicectrl      = (HVoiceCtrl)AccessTools.Field(typeof(HActionBase), "voice").GetValue(mode);

                //At the start of the H scene, all the text was loaded. Look through the loaded stuff and find the text for the current spoken voice.
                foreach (var a in voicectrl.dicVoiceIntos)
                {
                    foreach (var b in a)
                    {
                        foreach (var c in b.Value)
                        {
                            var text = c.Value.Where(x => x.Value.pathAsset == voice.assetBundleName && x.Value.nameFile == voice.assetName).Select(x => x.Value.word).FirstOrDefault();
                            if (!text.IsNullOrEmpty())
                            {
                                if (HSceneType == typeof(HSceneProc))
                                {
                                    DisplaySubtitle(voice.gameObject, text);
                                }
                                else
                                {
                                    DisplayVRSubtitle(voice.gameObject, text);
                                }
                                return;
                            }
                        }
                    }
                }
            }
Пример #2
0
        public static void InitializeCheats()
        {
            CheatToolsWindow.OnShown = window =>
            {
                _hFlag                 = Object.FindObjectOfType <HFlag>();
                _talkScene             = Object.FindObjectOfType <TalkScene>();
                _hSprite               = Object.FindObjectOfType <HSprite>();
                _studioInstance        = Studio.Studio.Instance;
                _soundInstance         = Manager.Sound.Instance;
                _communicationInstance = Communication.Instance;
                _sceneInstance         = Scene.Instance;
                _gameMgr               = Game.Instance;

                _openInInspectorButtons = new[]
                {
                    new KeyValuePair <object, string>(_gameMgr != null && _gameMgr.HeroineList.Count > 0 ? (Func <object>)(() => _gameMgr.HeroineList.Select(x => new ReadonlyCacheEntry(x.ChaName, x))) : null, "Heroine list"),
                    new KeyValuePair <object, string>(_gameMgr, "Manager.Game.Instance"),
                    new KeyValuePair <object, string>(_sceneInstance, "Manager.Scene.Instance"),
                    new KeyValuePair <object, string>(_communicationInstance, "Manager.Communication.Instance"),
                    new KeyValuePair <object, string>(_soundInstance, "Manager.Sound.Instance"),
                    new KeyValuePair <object, string>(_hFlag, "HFlag"),
                    new KeyValuePair <object, string>(_talkScene, "TalkScene"),
                    new KeyValuePair <object, string>(_studioInstance, "Studio.Instance"),
                    new KeyValuePair <object, string>((Func <object>)EditorUtilities.GetRootGoScanner, "Root Objects")
                };
            };

            CheatToolsWindow.Cheats.Add(new CheatEntry(w => _studioInstance == null && _gameMgr != null && !_gameMgr.saveData.isOpening, DrawPlayerCheats, "Start the game to see player cheats"));
            CheatToolsWindow.Cheats.Add(new CheatEntry(w => _hFlag != null, DrawHSceneCheats, null));
            CheatToolsWindow.Cheats.Add(new CheatEntry(w => _gameMgr != null, DrawGirlCheatMenu, null));

            CheatToolsWindow.Cheats.Add(CheatEntry.CreateOpenInInspectorButtons(() => _openInInspectorButtons));

            CheatToolsWindow.Cheats.Add(new CheatEntry(w => _gameMgr != null, DrawGlobalUnlocks, null));
        }
Пример #3
0
        protected override void OnEndH(MonoBehaviour proc, HFlag hFlag, bool vr)
#endif
        {
            foreach (var heroine in _hSceneHeroines)
            {
                if (heroine.CrestType == CrestType.violove)
                {
                    var totalTime = (int)heroine.TotalRoughTime;
                    var h         = heroine.Heroine;
                    h.lewdness = Mathf.Min(100, h.lewdness + totalTime / 10);
                    h.favor    = Mathf.Min(100, h.favor + totalTime / 20);
#if KK
                    h.intimacy = Mathf.Min(100, h.intimacy + totalTime / 30);
#endif
                }

                if (heroine.NeedsRegenRestored)
                {
                    heroine.GetRegenProp().Value = false;
                }
            }

            _hFlag          = null;
            _hSceneHeroines = null;
        }
Пример #4
0
 internal void StartHScene(HFlag flags)
 {
     lastCollision   = Stopwatch.StartNew();
     timer.Elapsed  += (obj, args) => Poll(flags);
     timer.AutoReset = true;
     timer.Enabled   = true;
 }
Пример #5
0
            internal static void DisplayHSubtitle(string asset, string bundle, GameObject voiceObject)
            {
                List <HActionBase> lstProc = (List <HActionBase>)AccessTools.Field(typeof(HSceneProc), "lstProc").GetValue(HSceneInstance);
                HFlag       flags          = (HFlag)Traverse.Create(HSceneInstance).Field("flags").GetValue();
                HActionBase mode           = lstProc[(int)flags.mode];
                HVoiceCtrl  voicectrl      = (HVoiceCtrl)AccessTools.Field(typeof(HActionBase), "voice").GetValue(mode);

                //At the start of the H scene, all the text was loaded. Look through the loaded stuff and find the text for the current spoken voice.
                foreach (var a in voicectrl.dicVoiceIntos)
                {
                    foreach (var b in a)
                    {
                        foreach (var c in b.Value)
                        {
                            var text = c.Value.Where(x => x.Value.pathAsset == bundle && x.Value.nameFile == asset).Select(x => x.Value.word).FirstOrDefault();
                            if (!text.IsNullOrEmpty())
                            {
                                // try to replace name tags in subtitle ([P], etc.) before displaying
                                DisplaySubtitle(voiceObject, PrepareSubtitle(text));
                                return;
                            }
                        }
                    }
                }
            }
Пример #6
0
        protected override void OnEndH(MonoBehaviour proc, HFlag hFlag, bool vr)
        {
            InsideHScene = false;
            Destroy(proc.GetComponent <LactationController>());

            // 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 c = heroine.chaCtrl.GetComponent<PregnancyCharaController>();
                var pd = heroine.GetPregnancyData();

                var fertility = Mathf.Max(PregnancyPlugin.FertilityOverride.Value, pd.Fertility);

                var winThreshold = Mathf.RoundToInt(fertility * 100);
                var childLottery = Random.Range(1, 100);

                var wonAChild = winThreshold >= childLottery;
                PregnancyPlugin.Logger.LogDebug($"OnEndH -> lottery: heroine={heroine.parameter.fullname} winThreshold={winThreshold} won={wonAChild}");
                if (wonAChild)
                {
                    StartPregnancyDelayed(heroine, true);
                }

                ApplyToAllDatas((chara, data) =>
                {
                    if (chara == heroine && !data.IsPregnant && !data.CanAskForAfterpill)
                    {
                        data.CanAskForAfterpill = true;
                        return(true);
                    }
                    return(false);
                });
            }
        }
        protected override void OnEndH(HSceneProc proc, bool freeH)
        {
            InsideHScene = false;
            Destroy(proc.GetComponent <LactationController>());

            // Figure out if conception happened at end of h scene
            // bug Don't know which character is which
            if (proc.flags.mode == HFlag.EMode.houshi3P || proc.flags.mode == HFlag.EMode.sonyu3P)
            {
                return;
            }

            var heroine        = proc.flags.lstHeroine.First(x => x != null);
            var isDangerousDay = HFlag.GetMenstruation(heroine.MenstruationDay) == HFlag.MenstruationType.危険日;

            if (!isDangerousDay)
            {
                return;
            }

            var cameInside     = PregnancyPlugin.ConceptionEnabled.Value && proc.flags.count.sonyuInside > 0;
            var cameInsideAnal = PregnancyPlugin.AnalConceptionEnabled.Value && proc.flags.count.sonyuAnalInside > 0;

            if (cameInside || cameInsideAnal)
            {
                var controller = heroine.chaCtrl.GetComponent <PregnancyCharaController>();
                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);
                }
            }
        }
Пример #8
0
        public void ReadData()
        {
            var data = GetExtendedData();

            Data = PregnancyData.Load(data) ?? new PregnancyData();

            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.安全日);
                }
            }
        }
Пример #9
0
        private IEnumerator SceneLoadedAsync(Object proc)
        {
            var traverse = Traverse.Create(proc);

            while (_lstFemale == null || _lstFemale?.Count == 0)
            {
                _lstFemale = traverse.Field(nameof(HSceneProc.lstFemale)).GetValue <List <ChaControl> >();
                yield return(null);
            }

            object handCtrlObj = null;

            while (handCtrlObj == null)
            {
                if (_isVr)
                {
                    handCtrlObj = traverse.Field("vrHands").GetValue <object[]>().FirstOrDefault(x => x != null);
                }
                else
                {
                    handCtrlObj = traverse.Field(nameof(HSceneProc.hand)).GetValue <object>();
                }

                yield return(null);
            }

            var handCtrlType = Type.GetType(_isVr ? "VRHandCtrl, Assembly-CSharp" : "HandCtrl, Assembly-CSharp");
            var isKissMethod = AccessTools.Method(handCtrlType, nameof(HandCtrl.IsKissAction));

            _isKissActionDelegate = (Func <bool>)Delegate.CreateDelegate(typeof(Func <bool>), handCtrlObj, isKissMethod);
            _hflags = traverse.Field(nameof(HSceneProc.flags)).GetValue <HFlag>();

            ReloadConfig();
            ResetAhegao(); //Reset o****m counter on H scene entry.
            if (_hi == null)
            {
                _hi = Harmony.CreateAndPatchAll(typeof(Hooks));
                if (_isVr)
                {
                    _hi.Patch(AccessTools.Method(_hSceneType, nameof(HSceneProc.EndProc)),
                              postfix: new HarmonyMethod(typeof(Hooks), nameof(Hooks.EndProc)));
                }
            }

            enabled = true;
        }
Пример #10
0
        private void Poll(HFlag flags)
        {
            var   camera   = SteamVR_Render.Top().head;
            float distance = Vector2.Distance(camera.position, ChaControl.objHead.transform.position);

            if (distance < THRESHOLD_DISTANCE)
            {
                if (!IsKissing && flags.mode != HFlag.EMode.aibu)
                {
                    // i've no clue where the normal kissing voice is but this sounds nice too
                    flags.voice.playVoices[0] = 101;
                }
                lastCollision.Reset();
                lastCollision.Start();
                flags.click = HFlag.ClickKind.mouth;
            }
        }
        // Figure out if conception happened at end of h scene
        protected override void OnEndH(HSceneProc proc, bool freeH)
        {
            // Don't know which girl player came inside
            if (proc.flags.mode == HFlag.EMode.houshi3P || proc.flags.mode == HFlag.EMode.sonyu3P)
            {
                return;
            }

            var heroine        = proc.flags.lstHeroine.First(x => x != null);
            var isDangerousDay = HFlag.GetMenstruation(heroine.MenstruationDay) == HFlag.MenstruationType.危険日;

            if (!isDangerousDay)
            {
                return;
            }

            var cameInside     = PregnancyPlugin.ConceptionEnabled.Value && proc.flags.count.sonyuInside > 0;
            var cameInsideAnal = PregnancyPlugin.AnalConceptionEnabled.Value && proc.flags.count.sonyuAnalInside > 0;

            if (cameInside || cameInsideAnal)
            {
                var controller = heroine.chaCtrl.GetComponent <PregnancyCharaController>();
                if (controller == null)
                {
                    throw new ArgumentNullException(nameof(controller));
                }

                if (!controller.GameplayEnabled || controller.IsDuringPregnancy())
                {
                    return;
                }

                var winThreshold = Mathf.RoundToInt(controller.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);
                }
            }
        }
Пример #12
0
        protected override void OnStartH(MonoBehaviour proc, HFlag hFlag, bool vr)
#endif
        {
            _hFlag          = hFlag;
            _hSceneHeroines = hFlag.lstHeroine.Select(x => new HsceneHeroineInfo(x)).ToArray();

            foreach (var heroine in _hSceneHeroines)
            {
                if (heroine.CrestType == CrestType.regrowth)
                {
                    var prop = heroine.GetRegenProp();
                    if (prop != null && !prop.Value)
                    {
                        prop.Value = true;
                        heroine.NeedsRegenRestored = true;
                    }
                }
            }
        }
Пример #13
0
        [HarmonyWrapSafe] // Ignore crashes
        private static void OnFinishInside(HFlag __instance)
        {
            if (!IsEffectActive())
            {
                return;
            }

            var heroine    = __instance.GetLeadingHeroine();
            var controller = PregnancyPlugin.GetEffectController(heroine);

            if (controller.Data.GameplayEnabled && !controller.Data.IsPregnant && controller.Data.Fertility > 0.001f)
            {
                var isDangerousDay = HFlag.GetMenstruation(heroine.MenstruationDay) == HFlag.MenstruationType.危険日;
                if (UnityEngine.Random.RandomRangeInt(0, 100) < (isDangerousDay ? 95 : 30))
                {
                    PregnancyPlugin.Logger.LogInfo("Through the power of a pin hole, pregnancy");
                    PregnancyGameController.StartPregnancyDelayed(heroine, true);
                }
            }
        }
        public void ReadData()
        {
            var data = GetExtendedData();

            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
        }
Пример #15
0
        private static void ApplyBreathingTweaks(ChaControl _female)
        {
            if (_hFlag == null)
            {
                _hFlag = FindObjectOfType <HFlag>();
            }

            var startValue = 30;

            var attribute = _female.chaFile.parameter.attribute;

            if (attribute.bitch || attribute.choroi)
            {
                startValue += 20;
            }
            if (attribute.hitori || attribute.kireizuki || attribute.dokusyo)
            {
                startValue -= 20;
            }
            if (attribute.majime)
            {
                startValue -= 20;
            }

            var heroine = _female.GetHeroine() ?? _hFlag.GetLeadingHeroine();

            if (heroine != null)
            {
                startValue += ((int)heroine.HExperience - 2) * 10;
                if (!heroine.isGirlfriend)
                {
                    startValue -= 10;
                }
            }

            startValue = Mathf.Clamp(startValue, 20, 100);

            var calculatedVolume = startValue + _hFlag.GetOrgCount() * 20 + _hFlag.gaugeFemale / 2;

            _female.asVoice.minDistance = Mathf.Clamp(calculatedVolume / 100, 0.17f, 1f);
        }