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; } } } } }
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)); }
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; }
internal void StartHScene(HFlag flags) { lastCollision = Stopwatch.StartNew(); timer.Elapsed += (obj, args) => Poll(flags); timer.AutoReset = true; timer.Enabled = true; }
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; } } } } }
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); } } }
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.安全日); } } }
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; }
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); } } }
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; } } } }
[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 }
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); }