private void GameLoop_GameLaunched(object sender, GameLaunchedEventArgs e) { // Setup third party mod compatibility bridge Compat.Setup(this.Helper.ModRegistry, this.Monitor); IQuestApi questApi = this.Helper.ModRegistry.GetApi <IQuestApi>("purrplingcat.questframework"); var storyHelper = new StoryHelper(this.ContentLoader, questApi.GetManagedApi(this.ModManifest)); questApi.Events.GettingReady += (_, args) => storyHelper.LoadQuests(this.GameMaster); questApi.Events.Ready += (_, args) => storyHelper.SanitizeOldAdventureQuestsInLog(); // Mod's services and drivers this.QuestApi = questApi; this.SpecialEvents = new SpecialModEvents(); this.DialogueDriver = new DialogueDriver(this.Helper.Events); this.HintDriver = new HintDriver(this.Helper.Events); this.StuffDriver = new StuffDriver(this.Helper.Data, this.Monitor); this.MailDriver = new MailDriver(this.ContentLoader, this.Monitor); this.GameMaster = new GameMaster(this.Helper, storyHelper, this.Monitor); this.CompanionHud = new CompanionDisplay(this.Config, this.ContentLoader); this.CompanionManager = new CompanionManager(this.GameMaster, this.DialogueDriver, this.HintDriver, this.CompanionHud, this.Config, this.Monitor); this.StuffDriver.RegisterEvents(this.Helper.Events); this.MailDriver.RegisterEvents(this.SpecialEvents); this.ApplyPatches(); // Apply harmony patches this.InitializeScenarios(); }
private void ModEvents_QuestCompleted(object sender, IQuestCompletedArgs e) { int id = StoryHelper.ResolveId(e.Quest.id.Value); if (id == 4 && !Game1.player.hasOrWillReceiveMail(DONE_LETTER_KEY)) { Game1.addMailForTomorrow(DONE_LETTER_KEY); } }
private static void ActiveSceneChanged(Scene oldScene, Scene newScene) { if (!enabled) { return; } if (newScene.name == "Main" && settings.ReplaceMusic) { if (Module <GlobleBlackBoard> .Self != null && Module <GlobleBlackBoard> .Self.HasInfo("pennyleave")) { Actor actor = StoryHelper.GetActor(4000141, string.Empty); if (actor == null) { return; } GameObject gameObject = actor.gameObject; audio = actor.gameObject.AddComponent <AudioSource>(); } else { audio = Player.Self.actor.gameObject.AddComponent <AudioSource>(); } audio.dopplerLevel = 0; audio.volume = settings.MusicVolume; audio.maxDistance = settings.MusicDistance; audio.minDistance = 1; audio.loop = true; audio.spatialBlend = settings.SpatialBlend; audio.rolloffMode = AudioRolloffMode.Logarithmic; AudioClip audioClip = songAudio; if (audioClip == null) { Dbgl("audio clip is null"); } else { audio.clip = audioClip; audio.Play(); } //Module<AudioPlayer>.Self.PlayEffect2D(52115, false, true, false); } else if (audio != null) { audio.Stop(); } }
private void BeginStoryIfValid() { List <StoryPage> storyPages = _stateMachine.CurrentChoiceOutcome.ChosenStoryPages.ToList(); if (StoryHelper.IsStoryPagesValid(storyPages)) { _isValidStory = true; //_stateMachine.SetStoryPages(storyPages); _pageController.Begin(storyPages); } // otherwise it's an invalid story else { Debug.LogError("No Valid story assigned"); _isValidStory = false; } }
private void Events_ReloadObjective(object sender, IQuestReloadObjectiveArgs e) { if (e.Quest.questType.Value != StoryHelper.ADVENTURE_QUEST_TYPE) { return; // Update only mod's kind of quests } int id = StoryHelper.ResolveId(e.Quest.id.Value); string type = this.StoryHelper.GetQuestType(id); if (type.Equals(TYPE_RECRUITMENT)) { // Update current objective for recruitment quest type (example: 2/10 companions recruited) var ps = this.GameMaster.Data.GetPlayerState(); e.Quest.currentObjective = this.contentLoader.LoadString($"Strings/Strings:questObjective.recruitment", ps.recruited.Count, e.Quest.completionString.Value); } }
private static bool Prefix(XmlNode ___mInfo, Trigger ___mTrigger) { if (!enabled) { return(true); } int dead = (int)Util.GetVarRefOrValue(___mInfo, "dead", VarValue.EType.Int, ___mTrigger).Value; if (dead == -1) { int actorId = StoryHelper.GetActorId(___mInfo, ___mTrigger, true); Dbgl($"restoring {actorId} favor"); Module <FavorManager> .Self.RemoveFromBlackList(actorId); return(false); } return(true); }
static bool Prefix(CheckMarriage __instance, ref bool __result, ref int ___npcId, bool ___flag) { if (!enabled) { return(true); } ___npcId = StoryHelper.GetActorId(mInfoByRef(__instance), mTriggerByRef(__instance), false); if (___npcId == -1) { int s = GetCurrentSpouse(); __result = (s != 0) == ___flag; Dbgl("Checking married: " + (s != 0) + " (needed " + ___flag + ")"); } else { __result = IsSpouse(___npcId) == ___flag; Dbgl("Checking married to " + StoryHelper.GetActor(___npcId).ActorName + ": " + IsSpouse(___npcId) + " (needed " + ___flag + ")"); } return(false); }
private void CheckForComplete(Quest quest, IGameMasterMessage completionMessage = null) { bool completed; switch (this.StoryHelper.GetQuestType(StoryHelper.ResolveId(quest.id.Value))) { case TYPE_RECRUITMENT: // Is recruitment quest done? Check via compare count of current recruited companions stat with goal from quest var ps = this.GameMaster.Data.GetPlayerState(); completed = int.TryParse(quest.completionString.Value, out int goal) && ps.recruited.Count >= goal; break; default: // Is basic quest done? Check via completion string completed = quest.completionString.Value.Equals(completionMessage?.Name); break; } if (completed) { quest.questComplete(); } }
private static void OnWakeUp(object[] obj) { if (!enabled) { return; } if (Module <GlobleBlackBoard> .Self.HasInfo("pennyleave")) { if (!Module <GlobleBlackBoard> .Self.HasInfo("pennycomebackagain")) { Module <GlobleBlackBoard> .Self.SetInfo("pennycomebackagain", "1"); Module <FavorManager> .Self.GainFavorValue(PennyID, -1, 600); } Vector3 position = new Vector3(225.5f, 48.0f, -94.5f); Vector3 rot = new Vector3(0f, -90f, 0f); Actor actor = StoryHelper.GetActor(PennyID, string.Empty); //Module<SceneItemManager>.Self.CreateWithSceneFlag((SceneItemType)0, 168510, "Mission/Mission_pennyshow", "Main", "show_taizi", "0", false, AssetType.Mission); if (actor == null) { actor = Module <NpcRepository> .Self.CreateNpc(4000141); } if (actor != null) { actor.ClearActionQueue(); actor.DoCommand(ACType.Transfer, ACTransferPara.Construct("Main", position, rot)); actor.gamePos = position; //actor.SetAiActive(true); actor.DoCommand(ACType.Animation, ACTAnimationPara.Construct("AlwaysGuitar", null, null, false)); //actor.SetBehaviorState(BehaveState.Default); } } }
private static void OnGUI(UnityModManager.ModEntry modEntry) { float infoBoxWidth = (typeof(UnityModManager).GetProperty("Params", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, new object[] { }) as UnityModManager.Param).WindowWidth * 0.9f; if (infoBoxWidth == 0) { infoBoxWidth = 960; } float buttonWidthShort = infoBoxWidth / 7f; float buttonWidthMedium = infoBoxWidth / 2f; if (Module <FavorManager> .Self?.GetAllShowFavorObjects() == null) { npcContent = null; return; } if (npcContent == null || npcContent.Length != Module <FavorManager> .Self.GetAllShowFavorObjects().Length + 1) { npcContent = new string[Module <FavorManager> .Self.GetAllShowFavorObjects().Length + 1]; } string[] tempNPC = new string[Module <FavorManager> .Self.GetAllShowFavorObjects().Length]; for (int i = 0; i < Module <FavorManager> .Self.GetAllShowFavorObjects().Length; i++) { FavorObject favorObject = Module <FavorManager> .Self.GetAllShowFavorObjects()[i]; NpcData npcData = Module <FavorManager> .Self.npcData[i]; string text = (npcData == null) ? favorObject.ID.ToString() : npcData.Name; string text2 = (!favorObject.IsDebut) ? string.Empty : "(?) "; tempNPC[i] = string.Concat(new object[] { text, " ", text2, favorObject.ID, " ", FavorRelationshipUtil.GetGenderRelation(npcData.gender, favorObject.Relationship), " ", favorObject.FavorValue }); } tempNPC.CopyTo(npcContent, 0); string[] sortedNPC = new string[Module <FavorManager> .Self.GetAllShowFavorObjects().Length + 1]; Array.Sort(tempNPC); tempNPC.CopyTo(sortedNPC, 0); npcContent[npcContent.Length - 1] = "All NPCs"; sortedNPC[sortedNPC.Length - 1] = "All NPCs"; GUILayout.Box("NPC Count:" + Module <FavorManager> .Self.GetAllShowFavorObjects().Length, new GUILayoutOption[0]); realSelectIndex = GUILayout.SelectionGrid(realSelectIndex, sortedNPC, 2, new GUILayoutOption[] { GUILayout.Width((float)infoBoxWidth) }); selectIndex = npcContent.IndexOf(sortedNPC[realSelectIndex]); GUILayout.Space(10); GUILayout.BeginHorizontal(new GUILayoutOption[0]); if (GUILayout.Button("Talk", new GUILayoutOption[] { GUILayout.Width((float)buttonWidthShort) })) { if (selectIndex < npcContent.Length - 1) { FavorObject favorObject2 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex]; IFavorBehavior favorBehavior = favorObject2.FavorBehaviorList.Find((IFavorBehavior it) => it is FavorBehavior_Dialog); favorBehavior.Execute(favorObject2, null); favorObject2.IsDebut = false; } else { foreach (FavorObject favorObject3 in Module <FavorManager> .Self.GetAllShowFavorObjects()) { IFavorBehavior favorBehavior2 = favorObject3.FavorBehaviorList.Find((IFavorBehavior it) => it is FavorBehavior_Dialog); favorBehavior2.Execute(favorObject3, null); favorObject3.IsDebut = false; } } } giftIdStr = GUILayout.TextField(giftIdStr, new GUILayoutOption[] { GUILayout.Width(58f) }); if (GUILayout.Button("Gift", new GUILayoutOption[] { GUILayout.Width((float)buttonWidthShort) })) { int num; int.TryParse(giftIdStr, out num); if (selectIndex < npcContent.Length - 1) { FavorObject favorObject4 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex]; IFavorBehavior favorBehavior3 = favorObject4.FavorBehaviorList.Find((IFavorBehavior it) => it is FavorBehavior_GiveGift); favorBehavior3.Execute(favorObject4, new object[] { num }); favorObject4.IsDebut = false; } else { foreach (FavorObject favorObject5 in Module <FavorManager> .Self.GetAllShowFavorObjects()) { IFavorBehavior favorBehavior4 = favorObject5.FavorBehaviorList.Find((IFavorBehavior it) => it is FavorBehavior_GiveGift); favorBehavior4.Execute(favorObject5, new object[] { num }); favorObject5.IsDebut = false; } } } addFavor = GUILayout.TextField(addFavor, new GUILayoutOption[] { GUILayout.Width(40f) }); if (GUILayout.Button("Add", new GUILayoutOption[] { GUILayout.Width((float)buttonWidthShort) })) { int gainFavorValue; int.TryParse(addFavor, out gainFavorValue); if (selectIndex < npcContent.Length - 1) { FavorObject favorObject6 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex]; favorObject6.GainFavorValue(-1, gainFavorValue, true, true, true); favorObject6.IsDebut = false; } else { foreach (FavorObject favorObject7 in Module <FavorManager> .Self.GetAllShowFavorObjects()) { Actor actor = Module <ActorMgr> .Self.Get(favorObject7.ID); if (!(actor == null) && (!(actor != null) || !actor.InFarAwayScene())) { favorObject7.GainFavorValue(-1, gainFavorValue, true, true, true); favorObject7.IsDebut = false; } } } } GUILayout.EndHorizontal(); GUILayout.Space(10); GUILayout.BeginHorizontal(new GUILayoutOption[0]); if (GUILayout.Button("Love", new GUILayoutOption[] { GUILayout.Width((float)buttonWidthShort) })) { if (selectIndex < npcContent.Length - 1) { FavorObject favorObject10 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex]; FavorUtility.SetNpcRelation(favorObject10.ID, FavorRelationshipId.NormalLover, 0); favorObject10.IsDebut = false; } else { foreach (FavorObject favorObject11 in Module <FavorManager> .Self.GetAllShowFavorObjects()) { FavorUtility.SetNpcRelation(favorObject11.ID, FavorRelationshipId.NormalLover, 0); favorObject11.IsDebut = false; } } } if (GUILayout.Button("BreakUp", new GUILayoutOption[] { GUILayout.Width((float)buttonWidthShort) })) { if (selectIndex < npcContent.Length - 1) { FavorObject favorObject12 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex]; FavorRelationLover.Breakup(favorObject12); favorObject12.IsDebut = false; } else { foreach (FavorObject favorObject13 in Module <FavorManager> .Self.GetAllShowFavorObjects()) { FavorRelationLover.Breakup(favorObject13); favorObject13.IsDebut = false; } } } if (GUILayout.Button("Marry", new GUILayoutOption[] { GUILayout.Width((float)buttonWidthShort) })) { if (selectIndex < npcContent.Length - 1) { FavorObject favorObject14 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex]; FavorUtility.SetNpcRelation(favorObject14.ID, FavorRelationshipId.NormalCouple, 0); favorObject14.IsDebut = false; } else { foreach (FavorObject favorObject15 in Module <FavorManager> .Self.GetAllShowFavorObjects()) { favorObject15.IsDebut = false; FavorUtility.SetNpcRelation(favorObject15.ID, FavorRelationshipId.NormalCouple, 0); } } } if (GUILayout.Button("Divorce", new GUILayoutOption[] { GUILayout.Width((float)buttonWidthShort) })) { if (selectIndex < npcContent.Length - 1) { FavorObject favorObject16 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex]; FavorRelationMarriage.DoDivorce(favorObject16); favorObject16.IsDebut = false; } else { foreach (FavorObject favorObject17 in Module <FavorManager> .Self.GetAllShowFavorObjects()) { FavorRelationMarriage.DoDivorce(favorObject17); favorObject17.IsDebut = false; } } } if (GUILayout.Button("Move", new GUILayoutOption[] { GUILayout.Width((float)buttonWidthShort) })) { if (selectIndex < npcContent.Length - 1) { FavorObject favorObject18 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex]; if (favorObject18 != null) { Actor actor2 = StoryHelper.GetActor(favorObject18.ID, string.Empty); if (actor2 == null) { actor2 = Module <NpcRepository> .Self.CreateNpc(favorObject18.ID); Debug.Log(string.Concat(new object[] { "创建NPC->", favorObject18.ID, " Name:", (!actor2) ? "Null" : actor2.ActorName, " 于地点:", Module <Player> .Self.actor.gamePos, new Vector3(0f, 2f, 0f) })); } if (actor2 != null) { actor2.ClearActionQueue(); actor2.DoCommand(ACType.Transfer, ACTransferPara.Construct(Module <ScenarioModule> .Self.CurrentScenarioName, Module <Player> .Self.actor.gamePos + new Vector3(0f, 2f, 0f), Vector3.zero)); } } } else { foreach (FavorObject favorObject19 in Module <FavorManager> .Self.GetAllShowFavorObjects()) { if (favorObject19 != null) { Actor actor3 = StoryHelper.GetActor(favorObject19.ID, string.Empty); if (actor3 == null) { actor3 = Module <NpcRepository> .Self.CreateNpc(favorObject19.ID); Debug.Log(string.Concat(new object[] { "创建NPC->", favorObject19.ID, " Name:", (!actor3) ? "Null" : actor3.ActorName, " 于地点:", Module <Player> .Self.actor.gamePos, new Vector3(0f, 2f, 0f) })); } if (actor3 != null) { actor3.ClearActionQueue(); actor3.DoCommand(ACType.Transfer, ACTransferPara.Construct(Module <ScenarioModule> .Self.CurrentScenarioName, Module <Player> .Self.actor.gamePos + new Vector3(0f, 2f, 0f), Vector3.zero)); } } } } } GUILayout.EndHorizontal(); GUILayout.Space(10); GUILayout.BeginHorizontal(new GUILayoutOption[0]); GUILayout.Label($"Relation: {Enum.GetName(typeof(FavorRelationshipId), relationEnum[relationId])}", new GUILayoutOption[] { GUILayout.Width(150) }); relationId = (int)GUILayout.HorizontalSlider(relationId, 0, relationEnum.Length - 1, new GUILayoutOption[0]); if (GUILayout.Button("Set", new GUILayoutOption[] { GUILayout.Width(150) })) { try { int relationIdEnum = relationEnum[relationId]; if (selectIndex < npcContent.Length - 1) { FavorObject favorObject8 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex]; FavorUtility.SetNpcRelation(favorObject8.ID, (FavorRelationshipId)relationIdEnum, 0); favorObject8.IsDebut = false; } else { foreach (FavorObject favorObject9 in Module <FavorManager> .Self.GetAllShowFavorObjects()) { FavorUtility.SetNpcRelation(favorObject9.ID, (FavorRelationshipId)relationIdEnum, 0); favorObject9.IsDebut = false; } } } catch { } } GUILayout.EndHorizontal(); GUILayout.Space(20); }