public override void Process(string scene, Object changeObj) { if (scene != _sceneName || !(changeObj is PlayMakerFSM fsm) || fsm.FsmName != _fsmName || fsm.gameObject.name != _objectName) { return; } PlayerDataBoolTest pdBoolTest = fsm.GetState(_stateName).GetActionsOfType <PlayerDataBoolTest>()[0]; if (_playerdata) { pdBoolTest.boolName = _boolName; } else if (_altTest == null) { RandomizerBoolTest boolTest = new RandomizerBoolTest(_boolName, pdBoolTest.isFalse, pdBoolTest.isTrue); fsm.GetState(_stateName).RemoveActionsOfType <PlayerDataBoolTest>(); fsm.GetState(_stateName).AddFirstAction(boolTest); } else { FsmEvent trueEvent = pdBoolTest.isTrue; string trueName = trueEvent != null ? trueEvent.Name : null; FsmEvent falseEvent = pdBoolTest.isFalse; string falseName = falseEvent != null ? falseEvent.Name : null; fsm.GetState(_stateName).AddFirstAction( new RandomizerExecuteLambda(() => fsm.SendEvent( _altTest() ? trueName : falseName ))); fsm.GetState(_stateName).RemoveActionsOfType <PlayerDataBoolTest>(); } }
public override void Process(string scene, Object changeObj) { if (scene != _sceneName || !(changeObj is PlayMakerFSM fsm) || fsm.FsmName != _fsmName || fsm.gameObject.name != _objectName) { return; } FsmState pdBool = fsm.GetState("PD Bool?"); FsmState charm = fsm.GetState("Charm?"); FsmState bigGetFlash = fsm.GetState("Big Get Flash"); // Remove actions that stop shiny from spawning pdBool.RemoveActionsOfType <StringCompare>(); // Change pd bool test to our new bool PlayerDataBoolTest boolTest = pdBool.GetActionsOfType <PlayerDataBoolTest>()[0]; if (_playerdata) { boolTest.boolName = _boolName; } else { RandomizerBoolTest randBoolTest = new RandomizerBoolTest(_boolName, boolTest.isFalse, boolTest.isTrue); pdBool.RemoveActionsOfType <PlayerDataBoolTest>(); pdBool.AddFirstAction(randBoolTest); } // Force the FSM to show the big item flash charm.ClearTransitions(); charm.AddTransition("FINISHED", "Big Get Flash"); // Set bool and show the popup after the flash bigGetFlash.AddAction(new RandomizerCallStaticMethod( typeof(BigItemPopup), nameof(BigItemPopup.ShowAdditive), _itemDefs, fsm.gameObject, "GET ITEM MSG END")); // Don't actually need to set the skill here, that happens in BigItemPopup // Maybe change that at some point, it's not where it should happen if (!_playerdata) { bigGetFlash.AddAction(new RandomizerSetBool(_boolName, true)); } // Exit the fsm after the popup bigGetFlash.ClearTransitions(); bigGetFlash.AddTransition("GET ITEM MSG END", "Hero Up"); bigGetFlash.AddTransition("HERO DAMAGED", "Finish"); }
public override void Process(string scene, Object changeObj) { if (scene != _sceneName || !(changeObj is PlayMakerFSM fsm) || fsm.FsmName != _fsmName || fsm.gameObject.name != _objectName) { return; } FsmState pdBool = fsm.GetState("PD Bool?"); FsmState charm = fsm.GetState("Charm?"); FsmState bigGetFlash = fsm.GetState("Big Get Flash"); // Remove actions that stop shiny from spawning pdBool.RemoveActionsOfType <StringCompare>(); // Change pd bool test to our new bool PlayerDataBoolTest boolTest = pdBool.GetActionsOfType <PlayerDataBoolTest>()[0]; RandomizerBoolTest randBoolTest = new RandomizerBoolTest(_item, boolTest.isFalse, boolTest.isTrue); pdBool.RemoveActionsOfType <PlayerDataBoolTest>(); pdBool.AddFirstAction(randBoolTest); // Force the FSM to show the big item flash charm.ClearTransitions(); charm.AddTransition("FINISHED", "Big Get Flash"); //bigGetFlash.AddAction(new RandomizerExecuteLambda(() => RandoLogger.LogItemToTrackerByBoolName(logBoolName, _location))); //bigGetFlash.AddAction(new RandomizerExecuteLambda(() => RandoLogger.UpdateHelperLog())); //bigGetFlash.AddFirstAction(new RandomizerExecuteLambda(() => RandomizerMod.Instance.Settings.UpdateObtainedProgressionByBoolName(logBoolName))); // Set bool and show the popup after the flash bigGetFlash.AddAction(new RandomizerCallStaticMethod( typeof(BigItemPopup), nameof(BigItemPopup.ShowAdditive), _itemDefs, fsm.gameObject, "GET ITEM MSG END")); // Don't actually need to set the skill here, that happens in BigItemPopup // Maybe change that at some point, it's not where it should happen bigGetFlash.AddAction(new RandomizerExecuteLambda(() => GiveItem(_action, _item, _location))); // Exit the fsm after the popup bigGetFlash.ClearTransitions(); bigGetFlash.AddTransition("GET ITEM MSG END", "Hero Up"); bigGetFlash.AddTransition("HERO DAMAGED", "Finish"); }
private IEnumerator ToggleFastFocusCoroutine() { yield return(null); yield return(new WaitWhile(() => HeroController.instance == null || HeroController.instance.spellControl == null)); try { FsmState deepFocusSpeed = HeroController.instance.spellControl.GetState("Deep Focus Speed"); FsmFloat tpd = HeroController.instance.spellControl.FsmVariables.FindFsmFloat("Time Per MP Drain"); PlayerDataBoolTest test = deepFocusSpeed.GetFirstActionOfType <PlayerDataBoolTest>(); FloatMultiply slowFocus = deepFocusSpeed.GetLastActionOfType <FloatMultiply>(); if (test == null || slowFocus == null) { throw new InvalidOperationException("Unable to find Deep Focus Speed actions."); } if (Settings.FasterFocus) { deepFocusSpeed.Actions = new FsmStateAction[] { new FloatMultiply { floatVariable = tpd, multiplyBy = Settings.FasterFocusTimeMultipler, everyFrame = false, }, test, slowFocus, }; } else { deepFocusSpeed.Actions = new FsmStateAction[] { test, slowFocus }; } } catch (Exception e) { LogError(e); } }
public override void Process(string scene, Object changeObj) { if (scene != _sceneName || !(changeObj is PlayMakerFSM fsm) || fsm.FsmName != _fsmName || fsm.gameObject.name != _objectName) { return; } PlayerDataBoolTest pdBoolTest = fsm.GetState(_stateName).GetActionsOfType <PlayerDataBoolTest>()[0]; if (_playerdata) { pdBoolTest.boolName = _boolName; } else { RandomizerBoolTest boolTest = new RandomizerBoolTest(_boolName, pdBoolTest.isFalse, pdBoolTest.isTrue); fsm.GetState(_stateName).RemoveActionsOfType <PlayerDataBoolTest>(); fsm.GetState(_stateName).AddFirstAction(boolTest); } }
public void CR_Change_Room_temple(Scene scene) { if (scene.name != "Room_temple") { return; } Log("CR_Change_Room_temple()"); //yield return null; #region Hornet NPC FSM GameObject hornetNpcGo = scene.FindRoot("Hornet Black Egg NPC"); PlayMakerFSM hornetNpcFsm = hornetNpcGo.LocateMyFSM("Conversation Control"); FsmVariables hornetNpcFsmVar = hornetNpcFsm.FsmVariables; hornetNpcFsm.CopyState("Greet", "Give Item"); hornetNpcFsm.RemoveAction("Give Item", 0); hornetNpcFsm.GetAction <CallMethodProper>("Give Item", 0).parameters = new FsmVar[] { new FsmVar(typeof(string)) { stringValue = "CUSTOM_HORNET_PRE_FINAL_BATTLE" }, new FsmVar(typeof(string)) { stringValue = "Hornet" } }; var pdbtAction = new PlayerDataBoolTest(); pdbtAction.gameObject = hornetNpcFsm.GetAction <PlayerDataBoolTest>("Choice", 1).gameObject; pdbtAction.boolName = "SFGrenadeTestOfTeamworkHornetCompanion"; pdbtAction.isFalse = FsmEvent.GetFsmEvent("ABSENT"); hornetNpcFsm.InsertAction("Choice", pdbtAction, 1); hornetNpcFsm.AddTransition("Choice", "ABSENT", "Give Item"); #endregion #region Shiny FSM GameObject shinyParent = GameObject.Instantiate(PrefabHolder.shinyPrefab); shinyParent.name = "Necklace"; shinyParent.SetActive(false); shinyParent.transform.GetChild(0).gameObject.SetActive(true); shinyParent.transform.position = new Vector3(29.0f, 4.3f, 0.0f); hornetNpcFsm.CopyState("Box Up", "Give Item Spawn"); hornetNpcFsm.ChangeTransition("Give Item Spawn", FsmEvent.Finished.Name, "Talk Finish"); hornetNpcFsm.GetState("Give Item").Transitions.First(x => x.ToState == "Talk Finish").ToState = "Give Item Spawn"; hornetNpcFsm.RemoveAction("Give Item Spawn", 5); hornetNpcFsm.RemoveAction("Give Item Spawn", 4); hornetNpcFsm.RemoveAction("Give Item Spawn", 3); hornetNpcFsm.RemoveAction("Give Item Spawn", 2); hornetNpcFsm.RemoveAction("Give Item Spawn", 1); hornetNpcFsm.RemoveAction("Give Item Spawn", 0); var agoAction = new ActivateGameObject(); agoAction.gameObject = new FsmOwnerDefault(); agoAction.gameObject.OwnerOption = OwnerDefaultOption.SpecifyGameObject; agoAction.gameObject.GameObject = shinyParent; agoAction.activate = true; agoAction.recursive = false; agoAction.resetOnExit = false; agoAction.everyFrame = false; hornetNpcFsm.AddAction("Give Item Spawn", agoAction); hornetNpcFsm.AddAction("Give Item Spawn", new NextFrameEvent() { sendEvent = FsmEvent.Finished }); PlayMakerFSM shinyFsm = shinyParent.transform.GetChild(0).gameObject.LocateMyFSM("Shiny Control"); FsmVariables shinyFsmVars = shinyFsm.FsmVariables; shinyFsmVars.FindFsmInt("Charm ID").Value = 0; shinyFsmVars.FindFsmInt("Type").Value = 0; shinyFsmVars.FindFsmBool("Activated").Value = false; shinyFsmVars.FindFsmBool("Charm").Value = false; shinyFsmVars.FindFsmBool("Dash Cloak").Value = false; shinyFsmVars.FindFsmBool("Exit Dream").Value = false; shinyFsmVars.FindFsmBool("Fling L").Value = false; shinyFsmVars.FindFsmBool("Fling On Start").Value = true; shinyFsmVars.FindFsmBool("Journal").Value = false; shinyFsmVars.FindFsmBool("King's Brand").Value = false; shinyFsmVars.FindFsmBool("Mantis Claw").Value = false; shinyFsmVars.FindFsmBool("Pure Seed").Value = false; shinyFsmVars.FindFsmBool("Quake").Value = false; shinyFsmVars.FindFsmBool("Show Charm Tute").Value = false; shinyFsmVars.FindFsmBool("Slug Fling").Value = false; shinyFsmVars.FindFsmBool("Super Dash").Value = false; shinyFsmVars.FindFsmString("Item Name").Value = Consts.LanguageStrings.HornetInvNameKey; shinyFsmVars.FindFsmString("PD Bool Name").Value = "SFGrenadeTestOfTeamworkHornetCompanion"; IntSwitch isAction = shinyFsm.GetAction <IntSwitch>("Trinket Type", 0); var tmpCompareTo = new List <FsmInt>(isAction.compareTo); tmpCompareTo.Add(tmpCompareTo.Count + 1); isAction.compareTo = tmpCompareTo.ToArray(); shinyFsmVars.FindFsmInt("Trinket Num").Value = tmpCompareTo.Count; var tmpSendEvent = new List <FsmEvent>(isAction.sendEvent); tmpSendEvent.Add(FsmEvent.FindEvent("PURE SEED")); isAction.sendEvent = tmpSendEvent.ToArray(); shinyFsm.CopyState("Love Key", "Necklace"); shinyFsm.GetAction <SetPlayerDataBool>("Necklace", 0).boolName = "SFGrenadeTestOfTeamworkHornetCompanion"; shinyFsm.GetAction <SetSpriteRendererSprite>("Necklace", 1).sprite = TestOfTeamwork.Instance.SpriteDict.Get(TextureStrings.InvHornetKey); shinyFsm.GetAction <GetLanguageString>("Necklace", 2).convName = Consts.LanguageStrings.HornetInvNameKey; shinyFsm.AddTransition("Trinket Type", "PURE SEED", "Necklace"); #endregion Log("~CR_Change_Room_temple()"); }
public static void PatchScene(string scene) { ApplyHints(scene); EditRandomizedItems(scene); switch (scene) { case "Room_Final_Boss_Atrium": GameObject.Find("Tut_tablet_top").LocateMyFSM("Inspection").GetState("Init").ClearTransitions(); break; case "Abyss_06_Core": if (PlayerData.instance.healthBlue > 0 || PlayerData.instance.joniHealthBlue > 0 || GameManager.instance.entryGateName == "left1") { PlayerData.instance.blueVineDoor = true; PlayMakerFSM BlueDoorFSM = GameObject.Find("Blue Door").LocateMyFSM("Control"); BlueDoorFSM.GetState("Init").RemoveTransitionsTo("Got Charm"); } break; case "Abyss_15": GameObject.Find("Dream Enter Abyss").LocateMyFSM("Control").GetState("Init").RemoveTransitionsTo("Idle"); GameObject.Find("Dream Enter Abyss").LocateMyFSM("Control").GetState("Init").AddTransition("FINISHED", "Inactive"); break; case "Crossroads_09": if (GameObject.Find("Randomizer Shiny") is GameObject mawlekShard) { ShinyUtil.WaitForPDBool(mawlekShard, nameof(PlayerData.killedMawlek)).RunCoroutine(); } break; case "Dream_NailCollection": FSMUtility.LocateFSM(GameObject.Find("Randomizer Shiny"), "Shiny Control").GetState("Finish") .AddAction(new ExecuteLambda(() => GameManager.instance.ChangeToScene("RestingGrounds_07", "right1", 0f))); break; case "Fungus1_04": if (!Ref.PD.hornet1Defeated) { UObject.Destroy(FSMUtility.LocateFSM(GameObject.Find("Camera Locks Boss"), "FSM")); } break; case "Fungus2_21": FSMUtility.LocateFSM(GameObject.Find("City Gate Control"), "Conversation Control") .GetState("Activate").RemoveActionsOfType <SetPlayerDataBool>(); FsmState gateSlam = FSMUtility.LocateFSM(GameObject.Find("Ruins_gate_main"), "Open") .GetState("Slam"); gateSlam.RemoveActionsOfType <SetPlayerDataBool>(); gateSlam.RemoveActionsOfType <CallMethodProper>(); gateSlam.RemoveActionsOfType <SendMessage>(); break; case "RestingGrounds_04": // Patch dream nail plaque to look for randomized item if (!RandomizerMod.Instance.ItemPlacements.Any(p => p.Value == "Dream_Nail")) { break; } foreach (FsmState state in new[] { new[] { "Binding Shield Activate", "FSM", "Check" }, new[] { "Dreamer Plaque Inspect", "Conversation Control", "End" }, new[] { "Dreamer Scene 2", "Control", "Init" }, new[] { "PreDreamnail", "FSM", "Check" }, new[] { "PostDreamnail", "FSM", "Check" } }.Select(s => GameObject.Find(s[0]).LocateMyFSM(s[1]).GetState(s[2]))) { PlayerDataBoolTest test = state.GetActionOfType <PlayerDataBoolTest>(); FsmEvent isTrue = test.isTrue; FsmEvent isFalse = test.isFalse; state.RemoveActionsOfType <PlayerDataBoolTest>(); state.AddFirstAction(new ExecuteLambda(() => { if (RandomizerMod.Instance.ObtainedLocations.Contains("Dream_Nail")) { state.Fsm.Event(isTrue); } else { state.Fsm.Event(isFalse); } })); } break; case "RestingGrounds_07": GameObject.Find("Dream Moth").transform.Translate(new Vector3(-5f, 0f)); PlayMakerFSM moth = FSMUtility.LocateFSM(GameObject.Find("Dream Moth"), "Conversation Control"); PlayerData.instance.dreamReward1 = true; moth.FsmVariables.GetFsmBool("Got Reward 1").Value = true; //Relic PlayerData.instance.dreamReward3 = true; moth.FsmVariables.GetFsmBool("Got Reward 3").Value = true; //Pale Ore PlayerData.instance.dreamReward4 = true; moth.FsmVariables.GetFsmBool("Got Reward 4").Value = true; //Charm PlayerData.instance.dreamReward5 = true; moth.FsmVariables.GetFsmBool("Got Reward 5").Value = true; //Vessel Fragment PlayerData.instance.dreamReward6 = true; moth.FsmVariables.GetFsmBool("Got Reward 6").Value = true; //Relic PlayerData.instance.dreamReward7 = true; moth.FsmVariables.GetFsmBool("Got Reward 7").Value = true; //Mask Shard PlayerData.instance.dreamReward8 = true; moth.FsmVariables.GetFsmBool("Got Reward 8").Value = true; //Skill break; case "Room_Sly_Storeroom": FsmState slyFinish = FSMUtility.LocateFSM(GameObject.Find("Randomizer Shiny"), "Shiny Control").GetState("Finish"); slyFinish.AddAction(new ExecuteLambda(() => PlayerData.instance.gotSlyCharm = true)); slyFinish.AddAction(new ExecuteLambda(() => GameManager.instance.ChangeToScene("Town", "door_sly", 0f))); break; case "Ruins1_24": if (GameObject.Find("Randomizer Shiny") is GameObject desolateDive) { ShinyUtil.WaitForPDBool(desolateDive, nameof(PlayerData.killedMageLord)).RunCoroutine(); } if (PlayerData.instance.killedMageLord) { UObject.Destroy(GameObject.Find("Battle Gate (1)")); } break; case "Room_Colosseum_01": PlayerData.instance.colosseumBronzeOpened = true; PlayerData.instance.colosseumSilverOpened = true; PlayerData.instance.colosseumGoldOpened = true; GameObject.Find("Silver Trial Board").LocateMyFSM("Conversation Control").GetState("Hero Anim").ClearTransitions(); GameObject.Find("Silver Trial Board").LocateMyFSM("Conversation Control").GetState("Hero Anim").AddTransition("FINISHED", "Box Up YN"); GameObject.Find("Gold Trial Board").LocateMyFSM("Conversation Control").GetState("Hero Anim").ClearTransitions(); GameObject.Find("Gold Trial Board").LocateMyFSM("Conversation Control").GetState("Hero Anim").AddTransition("FINISHED", "Box Up YN"); break; case "Room_Mansion": if (PlayerData.instance.xunFlowerGiven) { PlayerData.instance.xunRewardGiven = true; } break; case "Room_Colosseum_Bronze": GameObject.Find("Colosseum Manager").LocateMyFSM("Geo Pool").GetState("Open Gates").AddFirstAction(new ExecuteLambda(() => PlayerData.instance.colosseumBronzeCompleted = true)); break; case "Room_Colosseum_Silver": GameObject.Find("Colosseum Manager").LocateMyFSM("Geo Pool").GetState("Open Gates").AddFirstAction(new ExecuteLambda(() => PlayerData.instance.colosseumSilverCompleted = true)); break; case "Town": UObject.Destroy(GameObject.Find("Set Sly Basement Closed")); break; } }