Exemplo n.º 1
0
    public void Enter(Heroine player)
    {
        rbPlayer = player.rb;
        //rbPlayer.transform.localScale *= 0.5f;

        player.UpdateObject("Ducky_Melt");//Sneaking suspicion this is terrible
    }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 4
0
        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());
        }
Exemplo n.º 6
0
        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);
     }
 }
Exemplo n.º 8
0
        public string GetProbability(int selectionId, ChoiceAction choice, Heroine heroine)
        {
            var p = this.RouteProbabilities
                    .GetValueOrDefault((selectionId, choice))
                    ?.GetValueOrDefault(heroine);

            return($"{p:F1} %");
        }
Exemplo n.º 9
0
        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();
        }
Exemplo n.º 10
0
    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);
        }
    }
Exemplo n.º 11
0
        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);
     }
 }
Exemplo n.º 16
0
        // 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);
            });
        }
Exemplo n.º 17
0
        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);
     }
 }
Exemplo n.º 20
0
 // 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);
         });
     }
 }
Exemplo n.º 21
0
    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);
        }
    }
Exemplo n.º 22
0
    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);
        }
    }
Exemplo n.º 23
0
 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);
     }
 }
Exemplo n.º 24
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());
                }
        }
Exemplo n.º 25
0
        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;
 }
Exemplo n.º 28
0
        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);
        }
Exemplo n.º 29
0
 internal static string GetHeroineName(Heroine heroine)
 {
     return(!string.IsNullOrEmpty(heroine.Name) ? heroine.Name : heroine.ChaName);
 }
Exemplo n.º 30
0
        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();
        }