public void Enter(Heroine player) { rbPlayer = player.rb; //rbPlayer.transform.localScale *= 0.5f; player.UpdateObject("Ducky_Melt");//Sneaking suspicion this is terrible }
private static void ApplyStatChangeVars(Heroine heroine, PregnancyData preg, Dictionary <string, ValData> vars) { if (vars.TryGetVarValue("PillUsed", out bool used) && used) { PregnancyGameController.ForceStopPregnancyDelayed(heroine); var freePill = _personalityHasPills.TryGetValue(heroine.personality, out var val) && val; if (!freePill) { StoreApi.SetItemAmountBought(AfterpillStoreId, Mathf.Clamp(StoreApi.GetItemAmountBought(AfterpillStoreId) - 1, 0, 99)); } } if (vars.TryGetVarValue <int>("FavorChange", out var favor)) { heroine.favor = Mathf.Clamp(heroine.favor + favor, 0, 150); } if (vars.TryGetVarValue <int>("LewdChange", out var lewd)) { heroine.lewdness = Mathf.Clamp(heroine.lewdness + lewd, 0, 100); } if (vars.TryGetVarValue <int>("MoneyChange", out var money)) { Manager.Game.saveData.player.koikatsuPoint += money; } }
public static void InitialGame_2() { Heroine h = new Heroine(0, 400, 100, 100, "唐妮"); //Boss Monster boss = FactoryM.createMonster(1500, 270, "Boss"); Goods fire = FactoryGoods.createGoods(750, 620, "Fire"); Goods blood = FactoryGoods.createGoods(900, 600, "Blood"); Goods blood1 = FactoryGoods.createGoods(750, 530, "Blood"); Goods gold = FactoryGoods.createGoods(760, 460, "Gold"); Goods gold_1 = FactoryGoods.createGoods(200, 320, "Gold"); Goods gold_2 = FactoryGoods.createGoods(230, 320, "Gold"); Goods gold_3 = FactoryGoods.createGoods(260, 320, "Gold"); Goods gold_4 = FactoryGoods.createGoods(290, 320, "Gold"); Goods Door = FactoryGoods.createGoods(2750, 270, "Door"); Goods torch = FactoryGoods.createGoods(150, 270, "Torch"); Goods torch1 = FactoryGoods.createGoods(500, 270, "Torch"); Goods foods = FactoryGoods.createGoods(500, 320, "Foods"); //UI Life life_UI = new Life(50, 10, 20, 20); Listing list_UI = new Listing(600, 30); BossLife bossLife = new BossLife(700, 20, 20, 20); Hero_GetGoods gold_list = new Hero_GetGoods(); //记录窗体信息 //加载背景图片 //BackGround backGround = new BackGround(0, 0, 20); SingleObject.GetSingle().AddGameObject(new BackGround(0, 0, 20)); //SingleObject.GetSingle().AddGameObject(backGround); SingleObject.GetSingle().BG.BGImage = Properties.Resources.Caverns; SingleObject.GetSingle().BG.BGunder = Properties.Resources.Caverns1; //rec = new Rectangle(form.Location, form.Size); SingleObject.GetSingle().BG.SetCamera(rec); //加载测试游戏对象 SingleObject.GetSingle().BG.TP = h; //加入物品 SingleObject.GetSingle().BG.ListMonster.Add(boss); SingleObject.GetSingle().BG.ListGoods.Add(fire); SingleObject.GetSingle().BG.ListGoods.Add(blood); SingleObject.GetSingle().BG.ListGoods.Add(blood1); SingleObject.GetSingle().BG.ListGoods.Add(gold); SingleObject.GetSingle().BG.ListGoods.Add(gold_1); SingleObject.GetSingle().BG.ListGoods.Add(gold_2); SingleObject.GetSingle().BG.ListGoods.Add(gold_3); SingleObject.GetSingle().BG.ListGoods.Add(gold_4); SingleObject.GetSingle().BG.ListGoods.Add(torch); SingleObject.GetSingle().BG.ListGoods.Add(torch1); SingleObject.GetSingle().BG.ListGoods.Add(Door); SingleObject.GetSingle().BG.ListGoods.Add(foods); //加载UI界面 SingleObject.GetSingle().AddGameObject(life_UI); SingleObject.GetSingle().AddGameObject(list_UI); SingleObject.GetSingle().AddGameObject(bossLife); //创建金币集对象 SingleObject.GetSingle().BG.GoldList = gold_list; }
private static void DrawGirlCheatMenu(CheatToolsWindow cheatToolsWindow) { GUILayout.Label("Character status editor"); if (!Singleton <LobbySceneManager> .IsInstance()) { var visibleGirls = _gameMgr.heroineList; for (var i = 0; i < visibleGirls.Count; i++) { var girl = visibleGirls[i]; if (GUILayout.Button($"Select #{i} - {GetHeroineName(girl)}")) { _currentVisibleGirl = girl; } } GUILayout.Space(6); } if (_currentVisibleGirl != null) { DrawSingleGirlCheats(_currentVisibleGirl, cheatToolsWindow); } else { GUILayout.Label("Select a character to edit their stats"); } }
public static List <Heroine> LoadHeroines(string assetBundlePath) { var heroines = new Dictionary <int, TextAsset>(); foreach (var assetBundleName in GetAssetBundleNameListFromPath(assetBundlePath)) { foreach (var assetName in GetAssetNamesFromBundle(assetBundleName).Where(a => a.EndsWith(".bytes"))) { var textAsset = ManualLoadAsset <TextAsset>(assetBundleName, assetName, null); if (textAsset == null) { continue; } if (int.TryParse(textAsset.name.Replace("c", string.Empty), out var id)) { heroines[id] = textAsset; } } } return(heroines.Select(h => { var heroine = new Heroine(false); Game.LoadFromTextAsset(h.Key, heroine, h.Value); return heroine; }).ToList()); }
public async UnaryResult <Nil> ReportResult(Guid jobId, Heroine heroine, IReadOnlyList <int> selectionIds) { var workerId = await this.WorkerInitializeAsync().ConfigureAwait(false); await this.RetryWhenLocked(() => { this.RunInImmediateTransaction(conn => { var job = conn.FindWithQuery <WorkerJob>( "SELECT Choices, SearchResultId FROM WorkerJob WHERE Id = ?", jobId); if (job.SearchResultId.HasValue) { // すでに結果報告済み Utils.Log.WriteMessage($"報告が重複しています (Worker: {workerId})"); return; } var jobChoices = ModelUtils.ParseChoices(job.Choices); // 実際に選択したものは、 job.Choices + ずっと上 var choices = jobChoices.Concat( Enumerable.Repeat(ChoiceAction.SelectUpper, selectionIds.Count - jobChoices.Length)); var searchResult = new SearchResult() { Selections = ModelUtils.ToSelectionsString(selectionIds), Choices = ModelUtils.ToChoicesString(choices), Heroine = heroine, Timestamp = DateTimeOffset.Now, }; conn.Insert(searchResult); conn.Execute( "UPDATE WorkerJob SET WorkerId = ?, SearchResultId = ? WHERE Id = ?", workerId, searchResult.Id, jobId); // このレポートで発見された未探索のジョブを作成 for (var i = jobChoices.Length; i < selectionIds.Count; i++) { // 未探索の下を選ぶ var newChoices = choices.Take(i).Append(ChoiceAction.SelectLower); var newJob = new WorkerJob() { Id = Guid.NewGuid(), Choices = ModelUtils.ToChoicesString(newChoices), EnqueuedAt = DateTimeOffset.Now, }; conn.Insert(newJob); } }); }).ConfigureAwait(false); return(Nil.Default); }
public void Execute(Heroine player) { if (rbPlayer.velocity.magnitude <= 0.01f) {//Exiting this state player.heroineState = new StandingStateHeroine(); player.heroineState.Enter(player); } }
public string GetProbability(int selectionId, ChoiceAction choice, Heroine heroine) { var p = this.RouteProbabilities .GetValueOrDefault((selectionId, choice)) ?.GetValueOrDefault(heroine); return($"{p:F1} %"); }
private static void RunIntroEvent(Heroine heroine, PregnancyData preg, bool isPillEvent) { var loadedEvt = GetEvent(heroine, preg, isPillEvent); if (loadedEvt == null) { PregnancyPlugin.Logger.LogError("Unexpected null GetEvent result"); return; } // Init needed first since the custom event starts empty var evt = EventApi.CreateNewEvent(setPlayerParam: true); heroine.SetADVParam(evt); var freePill = _personalityHasPills.TryGetValue(heroine.personality, out var val) && val; evt.Add(Program.Transfer.VAR("bool", "PillForFree", freePill.ToString(CultureInfo.InvariantCulture))); evt.Add(Program.Transfer.VAR("bool", "PlayerHasPill", (StoreApi.GetItemAmountBought(AfterpillStoreId) >= 1).ToString(CultureInfo.InvariantCulture))); // Give favor by default, gets overriden if the event specifies any other value evt.Add(Program.Transfer.VAR("int", "FavorChange", "30")); evt.AddRange(loadedEvt); var scene = TalkScene.instance; scene.StartADV(evt, scene.cancellation.Token) .ContinueWith(() => Program.ADVProcessingCheck(scene.cancellation.Token)) .ContinueWith(() => { PregnancyGameController.ApplyToAllDatas((chara, data) => { if (chara == heroine) { if (isPillEvent) { data.CanAskForAfterpill = false; } else { data.CanTellAboutPregnancy = false; } return(true); } return(false); }); var vars = ActionScene.instance.AdvScene.Scenario.Vars; ApplyStatChangeVars(heroine, preg, vars); // Fix mouth getting permanently locked by the events heroine.chaCtrl.ChangeMouthFixed(false); }) .Forget(); }
public void Execute(Heroine player) { if (Input.GetKeyUp(KeyCode.LeftControl)) {//Exiting this state rbPlayer.transform.localScale = Vector3.one; player.GetComponent <MeshFilter>().mesh = player.standingMesh; player.heroineState = new StandingStateHeroine(); player.heroineState.Enter(player); } }
public override Task ReportResultAsync(Guid jobId, Heroine heroine, IReadOnlyList <int> selectionIds) { Console.WriteLine( "[{0}] ジョブ {1} が完了\nルート: {2}\n通った選択肢: {3}", DateTime.Now, jobId, heroine, string.Join(" → ", selectionIds) ); return(Task.CompletedTask); }
public void Execute(Heroine player) { if (rbPlayer.velocity.magnitude <= 0.01f) {//Exiting this state player.heroineState = new StandingStateHeroine(); player.heroineState.Enter(player); } if (Input.GetKeyDown(KeyCode.LeftControl)) {//Go to diving player.heroineState = new DivingStateHeroine(); player.heroineState.Enter(player); } }
public void Enter(Heroine player) { rbPlayer = player.rb; player.UpdateObject("Ducky_Melt");//Sneaking suspicion this is terrible vatMat = player.activeGO.GetComponent <MeshRenderer>().material; vatMat.SetFloat("_speed", 0.25f); vatMat.SetFloat("_time", 0f); //time = 0.01f;//For some reason it can flash a single frame of a mid-melt, unknown why, this didn't fix. ///The above SetFloat _time fixed it }
public void Execute(Heroine player) { if (Input.GetKeyDown(KeyCode.Space)) {//Exiting this state to JUMPING rbPlayer.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse); player.heroineState = new JumpingStateHeroine(); player.heroineState.Enter(player); } else if (Input.GetKeyDown(KeyCode.LeftControl)) {//Exiting this state to DUCKING player.heroineState = new DuckingStateHeroine(); player.heroineState.Enter(player); } }
public void Execute(Heroine player) { if (Input.GetKeyUp(KeyCode.LeftShift)) {//Go to jumping SPECIAL rbPlayer.isKinematic = false; player.heroineState = new JumpingStateHeroine(); player.heroineState.Enter(player); } if (Input.GetKeyDown(KeyCode.LeftControl)) {//Go to diving rbPlayer.isKinematic = false; player.heroineState = new DivingStateHeroine(); player.heroineState.Enter(player); } }
// Overrules any pregnancies started at the same time public static void ForceStopPregnancyDelayed(Heroine heroine) { PregnancyPlugin.Logger.LogDebug($"ForceStopPregnancyDelayed: heroine={heroine.parameter.fullname}"); heroine.talkEvent.Add(Constants.CancelPregEventID); ApplyToAllDatas((chara, data) => { if (chara == heroine && (data.CanAskForAfterpill || data.CanTellAboutPregnancy)) { data.CanAskForAfterpill = false; data.CanTellAboutPregnancy = false; return(true); } return(false); }); }
public static void TitleSceneSetPositionPostfix(ref Camera ___mainCamera, Heroine ___heroine) { if (VRManager.Instance.Mode.GetType().Equals(typeof(GenericSeatedMode))) { ((GenericSeatedMode)VRManager.Instance.Mode).Recenter(); } VRLog.Info("Setting VR Camera to game camera (Title SetPOS)"); //VRPatcher.MoveVRCameraToMainCamera(); if (___heroine != null) { AdjustForFOVDifference(___mainCamera.transform, ___heroine.transform, TITLE_FOV, GetVRFOV(), TITLE_DISTANCE_ADJ_RATIO); } VRPatcher.MoveVRCameraToTarget(___mainCamera.transform); }
public void Execute(Heroine player) { //Update the melt material time += Time.deltaTime; vatMat.SetFloat("_time", Mathf.Min(3.5f, time)); if (Input.GetKeyUp(KeyCode.LeftShift)) {//Go to ducking //Reset the melt material to not melt //player.activeGO.GetComponent<MeshRenderer>().material.SetFloat("_speed", 0.0f); player.heroineState = new DuckingStateHeroine(); player.heroineState.Enter(player); } }
public void Execute(Heroine player) { if (Time.fixedTime > timeJumped + timeDelta && rbPlayer.position.y <= 0.6f) {//Exiting this state player.heroineState = new StandingStateHeroine(); player.heroineState.Enter(player); } if (Input.GetKeyDown(KeyCode.LeftControl)) {//Go to diving player.heroineState = new DivingStateHeroine(); player.heroineState.Enter(player); } if (Input.GetKeyDown(KeyCode.LeftShift)) {//Go to Hover player.heroineState = new HoveringStateHeroine(); player.heroineState.Enter(player); } }
// silent means the heroine doesn't know about it and will not trigger an afterpill event public static void StartPregnancyDelayed(Heroine heroine, bool silent) { PregnancyPlugin.Logger.LogDebug($"StartPregnancyDelayed: heroine={heroine.parameter.fullname} silent={silent}"); // Delay preg start/stop effects to the next period change so that everything done in a single // time period is averaged out, and that there is no sudden change to the belly size. heroine.talkEvent.Add(Constants.StartPregEventID); if (!silent) { ApplyToAllDatas((chara, data) => { if (chara == heroine && !data.CanAskForAfterpill) { data.CanAskForAfterpill = true; return(true); } return(false); }); } }
public void Execute(Heroine player) { if (Input.GetKeyUp(KeyCode.LeftControl)) {//Exiting this state rbPlayer.transform.localScale = Vector3.one; player.heroineState = new StandingStateHeroine(); player.heroineState.Enter(player); } if (Input.GetKeyDown(KeyCode.LeftShift)) {//Melty Duck rbPlayer.transform.localScale = Vector3.one; player.heroineState = new MeltingDuckStateHeroine(); player.heroineState.Enter(player); } }
public void Execute(Heroine player) { if (Input.GetKeyDown(KeyCode.Space)) { //Exiting this state to JUMPING rbPlayer.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse); //Having it here fixes an issue going to Jump from Hover retriggering jump player.heroineState = new JumpingStateHeroine(); player.heroineState.Enter(player); } else if (Input.GetKeyDown(KeyCode.LeftControl)) {//Exiting this state to DUCKING player.heroineState = new DuckingStateHeroine(); player.heroineState.Enter(player); } if (Input.GetKeyDown(KeyCode.LeftShift)) { player.heroineState = new MeltingStateHeroine(); player.heroineState.Enter(player); } }
private static int GetRelationSafe(Heroine heroine) { if (heroine.isGirlfriend) { // This check crashes outside of main game because it needs an instance // todo turn this into an universal fix? if (heroine.favor >= 150) { return(3); } return(2); } else { if (heroine.isFriend) { return(1); } return(0); } }
private static List <Program.Transfer> GetEvent(Heroine heroine, PregnancyData data, bool isPill) { var personalityNo = _personalityHasPills.ContainsKey(heroine.personality) ? heroine.personality : 99; var evtName = $"c{personalityNo:D2}_"; if (isPill) { evtName += "AS_"; } else if (data.PregnancyCount <= 1) { evtName += "PREG_"; } else { evtName += "XPREG_"; } var pattern = evtName + @"[\w\d ]+.csv$"; var containingAssembly = typeof(CustomEventsFeature).Assembly; var evtResourceName = containingAssembly.GetManifestResourceNames().SingleOrDefault(fname => Regex.IsMatch(fname, pattern)); if (evtResourceName == null) { throw new IOException($"Pattern {pattern} did not match any resources inside assembly {containingAssembly}"); } using (var resourceStream = containingAssembly.GetManifestResourceStream(evtResourceName)) using (var reader = new StreamReader(resourceStream ?? throw new InvalidOperationException($"{evtResourceName} not found in assembly {containingAssembly}"))) { var lines = reader.ReadToEnd().Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); var paramList = CsvHelper.ReadFomCsv(lines); return(paramList.Select(x => new Program.Transfer(x)).ToList()); } }
private static void IntroductionEventHook(Heroine heroine) { try { var preg = heroine.GetPregnancyData(); if (!preg.GameplayEnabled) { return; } if (preg.CanAskForAfterpill && preg.Week <= 1) { RunIntroEvent(heroine, preg, true); } else if (preg.CanTellAboutPregnancy && preg.Week >= 6) { RunIntroEvent(heroine, preg, false); } } catch (Exception e) { PregnancyPlugin.Logger.LogError(e); } }
public void Enter(Heroine player) { rbPlayer = player.rb; rbPlayer.isKinematic = true; player.UpdateObject("Fan");//Sneaking suspicion this is terrible }
public void Enter(Heroine player) { rbPlayer = player.rb; }
public bool ApplyFeature(ref CompositeDisposable disp, MoreShopItemsPlugin inst) { var ico = ResourceUtils.GetEmbeddedResource("item_talisman.png", typeof(MoreShopItemsPlugin).Assembly).LoadTexture(); var talismanCategoryId = StoreApi.RegisterShopItemCategory(ico); disp.Add(ico); const int maxTalismansOwned = 2; disp.Add(StoreApi.RegisterShopItem( itemId: MoreShopItemsPlugin.TalismanItemId, itemName: "Twin-making Talisman", explaination: "An old talisman that was allegedly used for conversing with spirits in the past. It can summon a fake twin of any living person that is experienced in sex. (One time use during H scenes)", shopType: StoreApi.ShopType.NightOnly, itemBackground: StoreApi.ShopBackground.Pink, itemCategory: talismanCategoryId, stock: maxTalismansOwned, resetsDaily: false, cost: 100, numText: "{0} remaining out of " + maxTalismansOwned)); disp.Add(CustomTrespassingHsceneButtons.AddHsceneTrespassingButtonWithConfirmation( buttonText: "Let's use a Twin-making Talisman", spawnConditionCheck: hSprite => { var flags = hSprite.flags; return((flags.mode == HFlag.EMode.aibu || flags.mode == HFlag.EMode.sonyu || flags.mode == HFlag.EMode.houshi) && !flags.isFreeH // 3P is only available for experienced or horny && flags.lstHeroine[0].HExperience >= Heroine.HExperienceKind.慣れ && StoreApi.GetItemAmountBought(MoreShopItemsPlugin.TalismanItemId) > 0 // Only enable if not coming from a peeping H scene, because trying to start 3P in that state just ends the H scene && GameObject.FindObjectOfType <HScene>().dataH.peepCategory.Count == 0); }, confirmBoxTitle: "Hシーン確認", confirmBoxSentence: "Do you want to use one of your Twin-making Talismans?\n\nIt's supposed to create a twin of the girl, but what will actually happen?", onConfirmed: hSprite => { MoreShopItemsPlugin.Logger.LogDebug("Twin-making Talisman used"); // Custom code, copy current heroine and add a copy to the "other heroine waiting" field var hsp = GameObject.FindObjectOfType <HSceneProc>(); if (hsp == null) { throw new ArgumentNullException(nameof(hsp)); } var currHeroine = hsp.dataH.lstFemale[0]; if (currHeroine == null) { throw new ArgumentNullException(nameof(currHeroine)); } MoreShopItemsPlugin.Logger.LogDebug($"Creating a copy of the main heroine: {currHeroine.Name} chaCtrl={currHeroine.chaCtrl}"); Heroine.SetBytes(currHeroine.version, Heroine.GetBytes(currHeroine), out var copyHeroine); copyHeroine.chaCtrl = currHeroine.chaCtrl; hsp.dataH.newHeroione = copyHeroine; // Stock game code to initialize the 3P transition MoreShopItemsPlugin.Logger.LogDebug("Starting 3P transition copied character"); var flags = hSprite.flags; flags.click = HFlag.ClickKind.end; flags.isHSceneEnd = true; flags.numEnd = 2; //flags.lstHeroine[0].lewdness = 100; var asi = ActionScene.instance; if (asi == null) { throw new ArgumentNullException(nameof(asi)); } if (asi) { asi.isPenetration = true; } if (flags.shortcut != null) { flags.shortcut.enabled = false; } if (asi) { asi.ShortcutKeyEnable(false); } // Eat one of the held items StoreApi.DecreaseItemAmountBought(MoreShopItemsPlugin.TalismanItemId); })); return(true); }
internal static string GetHeroineName(Heroine heroine) { return(!string.IsNullOrEmpty(heroine.Name) ? heroine.Name : heroine.ChaName); }
private static void DrawSingleGirlCheats(Heroine currentAdvGirl, CheatToolsWindow cheatToolsWindow) { GUILayout.BeginVertical(GUI.skin.box); { GUILayout.Label("Selected heroine name: " + (GetHeroineName(currentAdvGirl))); GUILayout.Space(6); if (currentAdvGirl.chaCtrl != null && currentAdvGirl.chaCtrl.fileGameInfo2 != null) { var anyChanges = false; var gi2 = currentAdvGirl.gameinfo2; void DrawSingleStateBtn(ChaFileDefine.State state) { if (GUILayout.Button(state.ToString())) { gi2.nowState = state; gi2.calcState = state; gi2.nowDrawState = state; gi2.Favor = state == ChaFileDefine.State.Favor ? 100 : Mathf.Min(gi2.Favor, 90); gi2.Enjoyment = state == ChaFileDefine.State.Enjoyment ? 100 : Mathf.Min(gi2.Enjoyment, 90); gi2.Aversion = state == ChaFileDefine.State.Aversion ? 100 : Mathf.Min(gi2.Aversion, 90); gi2.Slavery = state == ChaFileDefine.State.Slavery ? 100 : Mathf.Min(gi2.Slavery, 90); gi2.Broken = state == ChaFileDefine.State.Broken ? 100 : Mathf.Min(gi2.Broken, 90); gi2.Dependence = state == ChaFileDefine.State.Dependence ? 100 : Mathf.Min(gi2.Dependence, 90); anyChanges = true; } } GUILayout.BeginHorizontal(); { GUILayout.Label("Current state: " + gi2.nowState); GUILayout.FlexibleSpace(); DrawSingleStateBtn(ChaFileDefine.State.Blank); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); { DrawSingleStateBtn(ChaFileDefine.State.Favor); DrawSingleStateBtn(ChaFileDefine.State.Enjoyment); DrawSingleStateBtn(ChaFileDefine.State.Aversion); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); { DrawSingleStateBtn(ChaFileDefine.State.Slavery); DrawSingleStateBtn(ChaFileDefine.State.Broken); DrawSingleStateBtn(ChaFileDefine.State.Dependence); } GUILayout.EndHorizontal(); GUILayout.Space(6); GUILayout.Label("Statistics:"); void ShowSingleSlider(string name, Action <int> set, Func <int> get) { GUILayout.BeginHorizontal(); { var status = get(); GUILayout.Label(name + ": " + status, GUILayout.Width(120)); var newStatus = Mathf.RoundToInt(GUILayout.HorizontalSlider(status, 0, 100)); if (newStatus != status) { set(newStatus); anyChanges = true; } } GUILayout.EndHorizontal(); } void ShowSingleTextfield(string name, Action <int> set, Func <int> get) { GUILayout.BeginHorizontal(); { GUILayout.Label(name + ": ", GUILayout.Width(120)); GUI.changed = false; var status = get(); var textField = GUILayout.TextField(status.ToString()); if (GUI.changed && int.TryParse(textField, out var newStatus) && newStatus != status) { set(newStatus); anyChanges = true; } GUI.changed = false; } GUILayout.EndHorizontal(); } ShowSingleSlider(nameof(gi2.Favor), i => gi2.Favor = i, () => gi2.Favor); ShowSingleSlider(nameof(gi2.Enjoyment), i => gi2.Enjoyment = i, () => gi2.Enjoyment); ShowSingleSlider(nameof(gi2.Aversion), i => gi2.Aversion = i, () => gi2.Aversion); ShowSingleSlider(nameof(gi2.Slavery), i => gi2.Slavery = i, () => gi2.Slavery); ShowSingleSlider(nameof(gi2.Broken), i => gi2.Broken = i, () => gi2.Broken); ShowSingleSlider(nameof(gi2.Dependence), i => gi2.Dependence = i, () => gi2.Dependence); ShowSingleSlider(nameof(gi2.Dirty), i => gi2.Dirty = i, () => gi2.Dirty); ShowSingleSlider(nameof(gi2.Tiredness), i => gi2.Tiredness = i, () => gi2.Tiredness); ShowSingleSlider(nameof(gi2.Toilet), i => gi2.Toilet = i, () => gi2.Toilet); ShowSingleSlider(nameof(gi2.Libido), i => gi2.Libido = i, () => gi2.Libido); ShowSingleTextfield(nameof(gi2.hCount), i => { gi2.hCount = i; if (i == 0) { gi2.firstHFlag = true; } }, () => gi2.hCount); if (anyChanges) { _onGirlStatsChanged(_currentVisibleGirl); } if (GUILayout.Button("View more stats and flags")) { cheatToolsWindow.Editor.Inspector.Push(new InstanceStackEntry(gi2, "Heroine " + GetHeroineName(currentAdvGirl)), true); } } GUILayout.Space(6); if (GUILayout.Button("Navigate to Heroine's GameObject")) { if (currentAdvGirl.transform != null) { cheatToolsWindow.Editor.TreeViewer.SelectAndShowObject(currentAdvGirl.transform); } else { CheatToolsPlugin.Logger.Log(LogLevel.Warning | LogLevel.Message, "Heroine has no body assigned"); } } if (GUILayout.Button("Open Heroine in inspector")) { cheatToolsWindow.Editor.Inspector.Push(new InstanceStackEntry(currentAdvGirl, "Heroine " + GetHeroineName(currentAdvGirl)), true); } if (GUILayout.Button("Inspect extended data")) { cheatToolsWindow.Editor.Inspector.Push(new InstanceStackEntry(ExtensibleSaveFormat.ExtendedSave.GetAllExtendedData(currentAdvGirl.chaFile), "ExtData for " + currentAdvGirl.Name), true); } } GUILayout.EndVertical(); }