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?"); // Remove actions that stop shiny from spawning pdBool.RemoveActionsOfType <PlayerDataBoolTest>(); pdBool.RemoveActionsOfType <StringCompare>(); // Add our own check to stop the shiny from being grabbed twice pdBool.AddAction(new RandomizerBoolTest(_boolName, null, "COLLECTED")); // The "Charm?" state is a good entry point for our geo spawning charm.AddAction(new RandomizerExecuteLambda(() => RandoLogger.UpdateHelperLog())); charm.AddAction(new RandomizerExecuteLambda(() => RandoLogger.LogItemToTrackerByBoolName(_boolName, _location))); charm.AddFirstAction(new RandomizerExecuteLambda(() => AreaRando.Instance.Settings.UpdateObtainedProgressionByBoolName(_boolName))); charm.AddFirstAction(new RandomizerSetBool(_boolName, true)); charm.AddFirstAction(new RandomizerAddGeo(fsm.gameObject, _geoAmount)); // Skip all the other type checks charm.ClearTransitions(); charm.AddTransition("FINISHED", "Flash"); }
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 getCharm = fsm.GetState("Get Charm"); // Remove actions that stop shiny from spawning pdBool.RemoveActionsOfType <PlayerDataBoolTest>(); pdBool.RemoveActionsOfType <StringCompare>(); // Add action to potentially despawn the object pdBool.AddAction(new RandomizerBoolTest(_boolName, null, "COLLECTED", true)); // Force the FSM into the charm state, set it to the correct charm charm.ClearTransitions(); charm.AddTransition("FINISHED", "Get Charm"); getCharm.RemoveActionsOfType <SetPlayerDataBool>(); getCharm.AddAction(new RandomizerSetBool(_boolName, true, true)); getCharm.AddFirstAction(new RandomizerExecuteLambda(() => RandomizerMod.Instance.Settings.UpdateObtainedProgressionByBoolName(_boolName))); getCharm.AddAction(new RandomizerExecuteLambda(() => RandoLogger.UpdateHelperLog())); getCharm.AddAction(new RandomizerExecuteLambda(() => RandoLogger.LogItemToTrackerByBoolName(_boolName, _location))); fsm.GetState("Normal Msg").GetActionsOfType <SetFsmInt>()[0].setValue = _charmNum; }
public override void Process(string scene, Object changeObj) { if (scene != _sceneName || !(changeObj is PlayMakerFSM fsm) || fsm.FsmName != _fsmName || fsm.gameObject.name != _objectName) { return; } // Remove actions that activate shiny item FsmState spawnItems = fsm.GetState("Spawn Items"); spawnItems.RemoveActionsOfType <ActivateAllChildren>(); fsm.GetState("Activated").RemoveActionsOfType <ActivateAllChildren>(); // Add geo to chest // Chest geo pool cannot be trusted, often spawns less than it should spawnItems.AddAction(new RandomizerAddGeo(fsm.gameObject, _geoAmount)); spawnItems.AddAction(new RandomizerExecuteLambda(() => RandoLogger.LogItemToTrackerByGeo(_geoAmount))); spawnItems.AddAction(new RandomizerExecuteLambda(() => RandoLogger.UpdateHelperLog())); spawnItems.AddFirstAction(new RandomizerSetBool(_boolName, true)); // Remove pre-existing geo from chest foreach (FlingObjectsFromGlobalPool fling in spawnItems.GetActionsOfType <FlingObjectsFromGlobalPool>()) { fling.spawnMin = 0; fling.spawnMax = 0; } // Need to check SpawnFromPool action too because of Mantis Lords chest foreach (SpawnFromPool spawn in spawnItems.GetActionsOfType <SpawnFromPool>()) { spawn.spawnMin = 0; spawn.spawnMax = 0; } }
public static void SceneChanged(Scene newScene) { RecalculateRandom(); // Critical changes for randomizer functionality { ApplyRandomizerChanges(newScene); BreakDiveFloors(newScene); ExtraPlatforms(newScene); // EditStagStations(newScene); EditCorniferAndIselda(newScene); DestroyLoreTablets(newScene); DeleteCollectorGrubs(newScene); DestroyMimicObjects(newScene); } // Transition fixes: critical changes for transition randomizer functionality, protected by bool checks so they can also be used for item randomizer if necessary // Control fixes: npc quests that could otherwise be broken with out-of-sequence rooms { ApplyTransitionFixes(newScene); ApplyControlFixes(newScene); } // QoL Fixes - hints of all types, lemm sell all, fast grubfather, fast dream nail cutscene, etc { MiscQoLChanges(newScene); ApplyHintChanges(newScene); Jiji.JijiSceneEdits(newScene); AddWaterSpawns(newScene); } // Mainly restores pogos, etc., that were removed by TC { FixMiscSkips(newScene); } { DreamPlantEdits.ReplaceDreamPlantOrbs(newScene); } // make sure log is regularly updated with game info // do not destroy helper log on game end or quitout if (newScene.name != SceneNames.Menu_Title) { RandoLogger.UpdateHelperLog(); } }
public static void SceneChanged(Scene newScene) { RecalculateRandom(); // Critical changes for randomizer functionality { ApplyRandomizerChanges(newScene); ExtraPlatforms(newScene); EditStagStations(newScene); EditCorniferAndIselda(newScene); DeleteCollectorGrubs(newScene); } // Transition fixes: critical changes for transition randomizer functionality, protected by bool checks so they can also be used for item randomizer if necessary // Control fixes: npc quests that could otherwise be broken with out-of-sequence rooms { ApplyTransitionFixes(newScene); ApplyControlFixes(newScene); } // QoL Fixes - hints of all types, lemm sell all, fast grubfather, fast dream nail cutscene, etc { MiscQoLChanges(newScene); ApplyHintChanges(newScene); } // Mainly restores pogos, etc., that were removed by TC { FixMiscSkips(newScene); } { DreamPlantEdits.ReplaceDreamPlantOrbs(newScene); } // Restores all lever skips which were possible on patch 1221 if (RandomizerMod.Instance.Settings.LeverSkips) { FixLeverSkips(newScene); } // make sure log is regularly updated with game info RandoLogger.UpdateHelperLog(); }
public override void Process(string scene, UnityEngine.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 trinkFlash = fsm.GetState("Trink Flash"); FsmState giveTrinket = fsm.GetState("Store Key"); // Remove actions that stop shiny from spawning pdBool.RemoveActionsOfType <PlayerDataBoolTest>(); pdBool.RemoveActionsOfType <StringCompare>(); // Add our own check to stop the shiny from being grabbed twice pdBool.AddAction(new RandomizerBoolTest(_boolName, null, "COLLECTED", true)); // Force the FSM to follow the path for the correct trinket charm.ClearTransitions(); charm.AddTransition("FINISHED", "Trink Flash"); trinkFlash.ClearTransitions(); fsm.GetState("Trinket Type").ClearTransitions(); trinkFlash.AddTransition("FINISHED", "Store Key"); giveTrinket.AddFirstAction(new RandomizerExecuteLambda(() => AreaRando.Instance.Settings.UpdateObtainedProgressionByBoolName(_boolName))); giveTrinket.AddAction(new RandomizerExecuteLambda(() => RandoLogger.LogItemToTrackerByBoolName(_boolName, _location))); giveTrinket.AddAction(new RandomizerExecuteLambda(() => RandoLogger.UpdateHelperLog())); giveTrinket.GetActionsOfType <SetPlayerDataBool>().First().boolName = _boolName; // Makes sure the correct icon and text appear switch (_trinketNum) { case 1: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_TRINKET1"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.WanderersJournal"); break; case 2: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_TRINKET2"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.HallownestSeal"); break; case 3: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_TRINKET3"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.KingsIdol"); break; case 4: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_TRINKET4"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.ArcaneEgg"); break; case 6: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_TRAM_PASS"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.TramPass"); break; case 8: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_STOREKEY"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.ShopkeepersKey"); break; case 9: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_CITYKEY"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.CityKey"); break; case 10: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_LOVEKEY"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.LoveKey"); break; case 11: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_RANCIDEGG"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.RancidEgg"); break; case 12: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_SIMPLEKEY"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.SimpleKey"); break; case 13: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "RANDOMIZER_NAME_CHARM_NOTCH"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.CharmNotch"); break; case 14: giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "RANDOMIZER_NAME_PALE_ORE"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.PaleOre"); break; case 20: //lantern giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_LANTERN"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.Lantern"); break; case 21: //elegant key giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "INV_NAME_WHITEKEY"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.ElegantKey"); break; case 22: //mask shards giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "RANDOMIZER_NAME_MASK_SHARD"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.MaskShard"); break; case 23: //vessel fragments giveTrinket.GetActionsOfType <GetLanguageString>().First().convName = "RANDOMIZER_NAME_VESSEL_FRAGMENT"; giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = AreaRando.GetSprite("ShopIcons.VesselFragment"); break; } }
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); } string logBoolName = string.Empty; for (int i = 0; i < _itemDefs.Length; i++) { if (!Ref.PD.GetBool(_itemDefs[i].BoolName)) { logBoolName = _itemDefs[i].BoolName; break; } } // 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 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"); }