This class represents the States in the Finite State System. Each state has a Dictionary with pairs (transition-state) showing which state the FSM should be if a transition is fired while this state is the current state. Method Reason is used to determine which transition should be fired . Method Act has the code to perform the actions the NPC is supposed do if it's on this state.
	void RegisterHash(string key,FsmState state)
	{
		int hash = Animator.StringToHash(key);
		fsmStateLUT.Add(hash,state);
		
		if ( debug) Debug.Log ("registered "+key+" ->"+hash );
	}
Exemplo n.º 2
0
 public static void AddAction(this FsmState state, FsmStateAction action)
 {
     action.Fsm    = state.Fsm;
     state.Actions = state.Actions.Append(action).ToArray();
 }
Exemplo n.º 3
0
        public static void RemoveAction <T>(this PMFSM fsm, string statename) where T : FsmStateAction
        {
            FsmState state = fsm.GetState(statename);

            state.Actions = state.Actions.Where(action => action.GetType() != typeof(T)).ToArray();
        }
Exemplo n.º 4
0
 public static T GetAction <T>(this FsmState state) where T : FsmStateAction
 {
     return((T)state.Actions.FirstOrDefault(action => action.GetType() == typeof(T)));
 }
Exemplo n.º 5
0
    public void Synchronize()
    {
        if (animator == null || Fsm == null)
        {
            return;
        }

        bool hasSwitchedState = false;

        if (animator.IsInTransition(LayerIndex))
        {
            AnimatorTransitionInfo _transitionInfo = animator.GetAnimatorTransitionInfo(LayerIndex);
            int _currentTransition         = _transitionInfo.nameHash;
            int _currentTransitionUserName = animator.GetAnimatorTransitionInfo(LayerIndex).userNameHash;

            if (lastTransition != _currentTransition)
            {
                if (debug)
                {
                    Debug.Log("is in transition");
                }

                // look for a username based transition
                if (fsmStateLUT.ContainsKey(_currentTransitionUserName))
                {
                    FsmState _fsmState = fsmStateLUT[_currentTransitionUserName];
                    if (Fsm.Fsm.ActiveState != _fsmState)
                    {
                        SwitchState(Fsm.Fsm, _fsmState);
                        // Only in 1.8
                        //Fsm.Fsm.SwitchState(_fsmState);
                        hasSwitchedState = true;
                    }
                }

                // set state
                if (!hasSwitchedState && fsmStateLUT.ContainsKey(_currentTransition))
                {
                    FsmState _fsmState = fsmStateLUT[_currentTransition];
                    if (Fsm.Fsm.ActiveState != _fsmState)
                    {
                        SwitchState(Fsm.Fsm, _fsmState);
                        // Only in 1.8
                        //Fsm.Fsm.SwitchState(_fsmState);
                        hasSwitchedState = true;
                    }
                }


                if (!hasSwitchedState && debug)
                {
                    Debug.LogWarning("Fsm is missing animator transition name or username for hash:" + _currentTransition);
                }

                // record change
                lastTransition = _currentTransition;
            }
        }

        // if we have not succeeded with any potential transitions, we look for states
        if (!hasSwitchedState)
        {
            int _currentState = animator.GetCurrentAnimatorStateInfo(LayerIndex).nameHash;
            if (lastState != _currentState)
            {
                if (debug)
                {
                    Debug.Log("Net state switch");
                }
                // set state
                if (fsmStateLUT.ContainsKey(_currentState))
                {
                    FsmState _fsmState = fsmStateLUT[_currentState];
                    if (Fsm.Fsm.ActiveState != _fsmState)
                    {
                        SwitchState(Fsm.Fsm, _fsmState);
                        // Only in 1.8
                        //Fsm.Fsm.SwitchState(_fsmState);
                    }
                }
                else
                {
                    if (debug)
                    {
                        Debug.LogWarning("Fsm is missing animator state hash:" + _currentState);
                    }
                }

                // record change
                lastState = _currentState;
            }
        }
    }
Exemplo n.º 6
0
        public override void Process(string scene, Object changeObj)
        {
            if (scene != _sceneName || !(changeObj is PlayMakerFSM fsm) || fsm.FsmName != _fsmName ||
                fsm.gameObject.name != _objectName)
            {
                return;
            }

            // Begin showing lore state
            FsmState startReading = fsm.GetState("Trink 1");

            startReading.ClearTransitions();
            startReading.RemoveActionsOfType <FsmStateAction>();

            // Yeeting the shop menu probably isn't ideal; however, we can't close it because the shop menu's descendant is carrying
            // this FSM that's showing the lore. So welcome to spaghetti-land I guess
            startReading.AddAction(new RandomizerExecuteLambda(() => {
                GameObject.Find("Shop Menu").transform.SetPositionY(200);
            }));

            startReading.AddAction(new RandomizerExecuteLambda(() => GameObject.Find("DialogueManager")
                                                               .LocateMyFSM("Box Open").SendEvent("BOX UP")));
            startReading.AddAction(new Wait()
            {
                time        = 0.3f,
                finishEvent = FsmEvent.Finished
            });


            // Reading
            FsmState loreReading = new FsmState(fsm.GetState("No"))
            {
                Name = "Lore Reading"
            };

            loreReading.ClearTransitions();
            loreReading.RemoveActionsOfType <FsmStateAction>();

            loreReading.AddAction(new RandomizerExecuteLambda(() => {
                GameObject dialogueManager = GameObject.Find("DialogueManager");
                GameObject textObj         = dialogueManager.transform.Find("Text").gameObject;

                // Extract the parameters of the shown lore
                ReqDef loredef             = LogicManager.GetItemDef(fsm.FsmVariables.StringVariables.First(v => v.Name == "PD Bool Name").Value.Split('.')[2]);
                string key                 = loredef.loreKey;
                string sheet               = string.IsNullOrEmpty(loredef.loreSheet) ? "Lore Tablets" : loredef.loreSheet;
                TextAlignmentOptions align = loredef.textType == ChangeShinyIntoText.TextType.LeftLore
                    ? TextAlignmentOptions.TopLeft : TextAlignmentOptions.Top;

                textObj.GetComponent <TextMeshPro>().alignment = align;
                textObj.GetComponent <DialogueBox>().StartConversation(key, sheet);
            }));


            // Finished Reading
            FsmState finishReading = new FsmState(fsm.GetState("No"))
            {
                Name = "Lore Finish Reading"
            };

            finishReading.ClearTransitions();
            finishReading.RemoveActionsOfType <FsmStateAction>();

            finishReading.AddAction(new RandomizerExecuteLambda(() => {
                GameObject dialogueManager = GameObject.Find("DialogueManager");
                GameObject textObj         = dialogueManager.transform.Find("Text").gameObject;
                dialogueManager.LocateMyFSM("Box Open").SendEvent("BOX DOWN");
                textObj.GetComponent <TextMeshPro>().alignment = TextAlignmentOptions.TopLeft;
            }));
            // Add a useless wait here; this is basically just to give the dialogue box time to disappear before returning the shop menu.
            // The time value isn't a special number; I just found that it seemed to work well.
            finishReading.AddAction(new Wait()
            {
                time        = 0.15f,
                finishEvent = FsmEvent.Finished
            });

            // Return the shop menu to its rightful position
            fsm.GetState("Reset").AddFirstAction(new RandomizerExecuteLambda(() => {
                GameObject.Find("Shop Menu").transform.SetPositionY(0.5f);
            }));

            // Adding states
            startReading.AddTransition("FINISHED", loreReading.Name);
            loreReading.AddTransition("CONVO_FINISH", finishReading.Name);
            finishReading.AddTransition("FINISHED", "Reset");

            fsm.AddState(loreReading);
            fsm.AddState(finishReading);
        }
Exemplo n.º 7
0
        public override void Process(string scene, Object changeObj)
        {
            if (scene != _sceneName || !(changeObj is PlayMakerFSM fsm) || fsm.FsmName != _fsmName ||
                fsm.gameObject.name != _objectName)
            {
                return;
            }

            FsmState noState = new FsmState(fsm.GetState("Idle"))
            {
                Name = "YN No"
            };

            noState.ClearTransitions();
            noState.RemoveActionsOfType <FsmStateAction>();

            noState.AddTransition("FINISHED", "Give Control");

            Tk2dPlayAnimationWithEvents heroUp = new Tk2dPlayAnimationWithEvents
            {
                gameObject = new FsmOwnerDefault
                {
                    OwnerOption = OwnerDefaultOption.SpecifyGameObject,
                    GameObject  = SereCore.Ref.Hero.gameObject
                },
                clipName = "Collect Normal 3",
                animationTriggerEvent  = null,
                animationCompleteEvent = FsmEvent.GetFsmEvent("FINISHED")
            };

            noState.AddAction(new RandomizerCallStaticMethod(GetType(), nameof(CloseYNDialogue)));
            noState.AddAction(heroUp);

            FsmState giveControl = new FsmState(fsm.GetState("Idle"))
            {
                Name = "Give Control"
            };

            giveControl.ClearTransitions();
            giveControl.RemoveActionsOfType <FsmStateAction>();

            giveControl.AddTransition("FINISHED", "Idle");

            giveControl.AddAction(new RandomizerExecuteLambda(() => PlayMakerFSM.BroadcastEvent("END INSPECT")));

            fsm.AddState(noState);
            fsm.AddState(giveControl);

            FsmState charm    = fsm.GetState("Charm?");
            string   yesState = charm.Transitions[0].ToState;

            charm.ClearTransitions();

            charm.AddTransition("HERO DAMAGED", noState.Name);
            charm.AddTransition("NO", noState.Name);
            charm.AddTransition("YES", yesState);

            fsm.GetState(yesState).AddAction(new RandomizerCallStaticMethod(GetType(), nameof(CloseYNDialogue)));

            if (_type == CostType.Simple)
            {
                fsm.GetState(yesState).AddFirstAction(new RandomizerExecuteLambda(() => PlayerData.instance.simpleKeys -= _cost));
            }


            charm.AddFirstAction(new RandomizerCallStaticMethod(GetType(), nameof(OpenYNDialogue), fsm.gameObject,
                                                                _nameKey, _cost, _type));
        }
Exemplo n.º 8
0
    /// <summary>
    /// This method places new states inside the FSM,
    /// or prints an ERROR message if the state was already inside the List.
    /// First state added is also the initial state.
    /// </summary>
    public void AddState(FsmState s)
    {
        // Check for Null reference before deleting
        if (s == null)
        {
            throw new Exception("FSM ERROR: Null reference is not allowed");
        }

        s.SetOwner(this);

        // First State inserted is also the Initial state,
        //   the state the machine is in when the simulation begins
        if (states.Count == 0)
        {
            states.Add(s);
            currentState = s;
            currentStateID = s.ID;
            return;
        }

        // Add the state to the List if it's not inside it
        foreach (FsmState state in states)
        {
            if (state.ID == s.ID)
            {
                throw new Exception("FSM ERROR: Impossible to add state " + s.ID.ToString() +
                               " because state has already been added");
            }
        }

        states.Add(s);
    }
Exemplo n.º 9
0
 public static FsmTransition GetTransition(this FsmState state, string eventName) => state.GetFsmTransition(eventName);
Exemplo n.º 10
0
 public static void RemoveAction(this FsmState state, int index) => state.RemoveFsmAction(index);
Exemplo n.º 11
0
 public static void RemoveTransition(this FsmState state, string eventName) => state.RemoveFsmTransition(eventName);
Exemplo n.º 12
0
 public static void ChangeTransition(this FsmState state, string eventName, string toState) => state.ChangeFsmTransition(eventName, toState);
Exemplo n.º 13
0
 public static void InsertAction(this FsmState state, FsmStateAction action, int index) => state.InsertFsmAction(action, index);
Exemplo n.º 14
0
    /// <summary>
    /// This method tries to change the state the FSM is in based on
    /// the current state and the transition passed. If current state
    ///  doesn't have a target state for the transition passed, 
    /// an ERROR message is printed.
    /// </summary>
    public void PerformTransition(FsmTransitionId trans)
    {
        // Check for NullTransition before changing the current state
        if (trans == FsmTransitionId.NullTransition)
        {
            throw new Exception("FSM ERROR: NullTransition is not allowed for a real transition");
        }

        // Check if the currentState has the transition passed as argument
        FsmStateId id = currentState.GetOutputState(trans);
        if (id == FsmStateId.NullStateID)
        {
            throw new Exception("FSM ERROR: State " + currentStateID.ToString() + " does not have a target state " +
                           " for transition " + trans.ToString());
        }

        // Update the currentStateID and currentState
        currentStateID = id;
        foreach (FsmState state in states)
        {
            if (state.ID == currentStateID)
            {
                // Do the post processing of the state before setting the new one
                currentState.DoBeforeLeaving();

                currentState = state;

                // Reset the state to its desired condition before it can reason or act
                currentState.DoBeforeEntering();
                break;
            }
        }
    }
Exemplo n.º 15
0
 public static void AddTransition(this FsmState state, string fsmEvent, FsmState toState)
 {
     AddTransition(state, FsmEvent.FindEvent(fsmEvent), toState);
 }
	void SwitchState(Fsm fsm, FsmState state)
	{
		MethodInfo switchState = fsm.GetType().GetMethod("SwitchState", BindingFlags.NonPublic | BindingFlags.Instance);
		if (switchState!=null)
		{
			switchState.Invoke(fsm , new object[] { state });
		}
	}
Exemplo n.º 17
0
 public static void RemoveActionsOfType <T>(this FsmState self) where T : FsmStateAction
 {
     self.Actions = self.Actions.Where(action => !(action is T)).ToArray();
 }
Exemplo n.º 18
0
 /**
  * Constructor with OnEnter, OnUpdate and OnExit routines.
  */
 public FsmDelegateAction(FsmState owner, FsmActionRoutine onEnterRoutine, FsmActionRoutine onUpdateRoutine, FsmActionRoutine onExitRoutine = null) : base(owner)
 {
     this.onEnterRoutine  = onEnterRoutine;
     this.onUpdateRoutine = onUpdateRoutine;
     this.onExitRoutine   = onExitRoutine;
 }
Exemplo n.º 19
0
 public static T GetActionOfType <T>(this FsmState self) where T : FsmStateAction
 {
     return(self.Actions.OfType <T>().FirstOrDefault());
 }
Exemplo n.º 20
0
        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"); // This path works well for our changes

            // 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(() => RandomizerMod.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 = RandomizerMod.GetSprite("ShopIcons.WanderersJournal");
                break;

            case 2:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_TRINKET2";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.HallownestSeal");
                break;

            case 3:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_TRINKET3";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.KingsIdol");
                break;

            case 4:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_TRINKET4";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.ArcaneEgg");
                break;

            case 6:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_TRAM_PASS";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.TramPass");
                break;

            case 8:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_STOREKEY";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.ShopkeepersKey");
                break;

            case 9:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_CITYKEY";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.CityKey");
                break;

            case 10:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_LOVEKEY";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.LoveKey");
                break;

            case 11:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_RANCIDEGG";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.RancidEgg");
                break;

            case 12:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_SIMPLEKEY";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.SimpleKey");
                break;

            case 13:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "RANDOMIZER_NAME_CHARM_NOTCH";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.CharmNotch");
                break;

            case 14:
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "RANDOMIZER_NAME_PALE_ORE";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.PaleOre");
                break;

            case 20:     //lantern
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_LANTERN";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.Lantern");
                break;

            case 21:     //elegant key
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "INV_NAME_WHITEKEY";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.ElegantKey");
                break;

            case 22:     //mask shards
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "RANDOMIZER_NAME_MASK_SHARD";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.MaskShard");
                break;

            case 23:     //vessel fragments
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "RANDOMIZER_NAME_VESSEL_FRAGMENT";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.VesselFragment");
                break;

            case 24:     //whispering root
                giveTrinket.GetActionsOfType <GetLanguageString>().First().convName     = "RANDOMIZER_NAME_ESSENCE";
                giveTrinket.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite("ShopIcons.Essence");
                break;
            }
        }
Exemplo n.º 21
0
 public static T[] GetActionsOfType <T>(this FsmState self) where T : FsmStateAction
 {
     return(self.Actions.OfType <T>().ToArray());
 }
Exemplo n.º 22
0
        /*
         * Room changes required for the randomizer to function on any mode
         * For example, removing certain vanilla item locations which can't be handled by RandomizerAction
         */

        public static void ApplyRandomizerChanges(Scene newScene)
        {
            switch (newScene.name)
            {
            // Prevent Grimm encounter which gives Grimmchild
            case SceneNames.Grimm_Main_Tent:
                PlayerData.instance.metGrimm = true;
                break;

            // Prevent reading tablet which gives completion percentage
            case SceneNames.Room_Final_Boss_Atrium:
                GameObject.Find("Tut_tablet_top").LocateMyFSM("Inspection").GetState("Init").ClearTransitions();
                break;

            // Removes the prompt to donate to the 3000 geo fountain in Basin
            case SceneNames.Abyss_04:
                Object.Destroy(GameObject.Find("Fountain Donation"));
                break;

            // Opens lifeblood door in Abyss with any amount of blue health
            case SceneNames.Abyss_06_Core:
                if (PlayerData.instance.healthBlue > 0 || PlayerData.instance.joniHealthBlue > 0 || GameManager.instance.entryGateName == "left1")
                {
                    PlayerData.instance.SetBoolInternal("blueVineDoor", true);
                    PlayMakerFSM BlueDoorFSM = GameObject.Find("Blue Door").LocateMyFSM("Control");
                    BlueDoorFSM.GetState("Init").RemoveTransitionsTo("Got Charm");
                }
                break;

            // Removes trigger for Void Heart sequence
            case SceneNames.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;

            // Automatically unlock Godseeker and add an action to the Godtuner spot to remove simple key on purchase
            case SceneNames.GG_Waterways:
                PlayerData.instance.SetBool("godseekerUnlocked", true);
                if (GameObject.Find("Randomizer Shiny") != null)
                {
                    PlayMakerFSM godtuner = GameObject.Find("Randomizer Shiny").LocateMyFSM("Shiny Control");
                    godtuner.GetState(godtuner.GetState("Charm?").Transitions.First(t => t.EventName == "YES").ToState).AddFirstAction(new RandomizerExecuteLambda(() => PlayerData.instance.DecrementInt("simpleKeys")));
                }
                break;

            // Spawns mawlek shard out of bounds and moves it inbounds when mawlek is killed
            case SceneNames.Crossroads_09:
                if (GameObject.Find("Randomizer Shiny") is GameObject mawlekShard)
                {
                    mawlekShard.transform.SetPositionY(100f);
                    IEnumerator mawlekDead()
                    {
                        yield return(new WaitUntil(() => PlayerData.instance.killedMawlek));

                        mawlekShard.transform.SetPositionY(10f);
                        mawlekShard.transform.SetPositionX(61.5f);
                    }

                    GameManager.instance.StartCoroutine(mawlekDead());
                }
                break;

            // Removes Grubfather rewards corresponding to randomizer items
            case SceneNames.Crossroads_38:
                Object.Destroy(GameObject.Find("Reward 5"));      //Mask
                Object.Destroy(GameObject.Find("Reward 10"));     //Charm
                Object.Destroy(GameObject.Find("Reward 16"));     //Rancid Egg
                Object.Destroy(GameObject.Find("Reward 23"));     //Relic
                Object.Destroy(GameObject.Find("Reward 31"));     //Pale Ore
                Object.Destroy(GameObject.Find("Reward 38"));     //Relic
                Object.Destroy(GameObject.Find("Reward 46"));     //Charm
                break;

            // Remove gate from Ancestral Mound
            case SceneNames.Crossroads_ShamanTemple:
                Object.Destroy(GameObject.Find("Bone Gate"));
                break;

            // Remove Beast's Den hardsave, allow rear access from entrance, destroy Herrah
            case SceneNames.Deepnest_Spider_Town:
                GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                {
                    sceneName      = "Deepnest_Spider_Town",
                    id             = "Collapser Small (12)",
                    activated      = true,
                    semiPersistent = false
                });

                FsmState denHardSave = GameObject.Find("RestBench Spider").LocateMyFSM("Fade").GetState("Land");
                denHardSave.RemoveActionsOfType <CallMethodProper>();
                denHardSave.RemoveActionsOfType <SendMessage>();
                denHardSave.RemoveActionsOfType <SetPlayerDataBool>();

                Object.Destroy(GameObject.Find("Dreamer Hegemol"));
                Object.Destroy(GameObject.Find("Dream Enter"));
                Object.Destroy(GameObject.Find("Dream Impact"));
                Object.Destroy(GameObject.Find("Shield"));
                break;

            // Edits Dream Nail location to change scene to seer
            case SceneNames.Dream_Nailcollection:
                FSMUtility.LocateFSM(GameObject.Find("Randomizer Shiny"), "Shiny Control").GetState("Finish")
                .AddAction(new RandomizerChangeScene("RestingGrounds_07", "right1"));
                break;

            // Edit Hornet room to open gates after boss fight, and removes dreamer cutscene
            case SceneNames.Fungus1_04:
                foreach (PlayMakerFSM childFSM in GameObject.Find("Cloak Corpse")
                         .GetComponentsInChildren <PlayMakerFSM>(true))
                {
                    if (childFSM.FsmName == "Shiny Control")
                    {
                        SendEvent openGate = new SendEvent
                        {
                            eventTarget = new FsmEventTarget
                            {
                                target      = FsmEventTarget.EventTarget.BroadcastAll,
                                excludeSelf = true
                            },
                            sendEvent  = FsmEvent.FindEvent("BG OPEN"),
                            delay      = 0,
                            everyFrame = false
                        };
                        childFSM.GetState("Destroy").AddFirstAction(openGate);
                        childFSM.GetState("Finish").AddFirstAction(openGate);

                        break;
                    }
                }

                ObjectDestroyer.Destroy("Dreamer Scene 1");
                ObjectDestroyer.Destroy("Hornet Saver");
                ObjectDestroyer.Destroy("Cutscene Dreamer");
                ObjectDestroyer.Destroy("Dream Scene Activate");

                if (!Ref.PD.hornet1Defeated)
                {
                    Object.Destroy(FSMUtility.LocateFSM(GameObject.Find("Camera Locks Boss"), "FSM"));
                }
                break;

            // Make city crest gate openable infinite times and not hard save
            case SceneNames.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;

            // Removes Leg Eater dialogue tree, preventing him from dying
            case SceneNames.Fungus2_26:
                PlayMakerFSM legEater       = FSMUtility.LocateFSM(GameObject.Find("Leg Eater"), "Conversation Control");
                FsmState     legEaterChoice = legEater.GetState("Convo Choice");
                legEaterChoice.RemoveTransitionsTo("Convo 1");
                legEaterChoice.RemoveTransitionsTo("Convo 2");
                legEaterChoice.RemoveTransitionsTo("Convo 3");
                legEaterChoice.RemoveTransitionsTo("Infected Crossroad");
                legEaterChoice.RemoveTransitionsTo("Bought Charm");
                legEaterChoice.RemoveTransitionsTo("Gold Convo");
                legEaterChoice.RemoveTransitionsTo("All Gold");
                legEaterChoice.RemoveTransitionsTo("Ready To Leave");
                legEater.GetState("All Gold?").RemoveTransitionsTo("No Shop");
                Ref.PD.legEaterLeft = false;
                break;

            // Destroy Monomon and remove Quirrel encounter
            case SceneNames.Fungus3_archive_02:
                PlayerData.instance.SetBool("summonedMonomon", true);
                Object.Destroy(GameObject.Find("Inspect Region"));
                Object.Destroy(GameObject.Find("Quirrel Wounded"));
                Object.Destroy(GameObject.Find("Quirrel"));
                Object.Destroy(GameObject.Find("Monomon"));
                Object.Destroy(GameObject.Find("Dream Enter"));
                Object.Destroy(GameObject.Find("Dream Impact"));
                Object.Destroy(GameObject.Find("Shield"));
                break;

            // Destroys original lurker key. Moves new shiny out of bounds if lurker is alive and moves it inbounds when lurker is killed
            case "GG_Lurker":
                if (PlayerData.instance.killedPaleLurker)
                {
                    Object.Destroy(GameObject.Find("Shiny Item Key"));
                }
                else
                {
                    GameObject.Find("New Shiny").transform.SetPositionY(200f);
                    IEnumerator LurkerKilled()
                    {
                        yield return(new WaitUntil(() => PlayerData.instance.killedPaleLurker || GameManager.instance.sceneName != "GG_Lurker"));

                        yield return(new WaitUntil(() => GameObject.Find("Shiny Item Key") is GameObject lurkerKey || GameManager.instance.sceneName != "GG_Lurker"));

                        if (GameManager.instance.sceneName == "GG_Lurker")
                        {
                            Object.Destroy(GameObject.Find("Shiny Item Key"));
                            GameObject lurkerCorpse = Object.FindObjectsOfType <GameObject>().First(obj => obj.name.StartsWith("Corpse Pale Lurker"));    // Corpse Pale Lurker(Clone)
                            GameObject.Find("New Shiny").transform.SetPosition2D(lurkerCorpse.transform.position);
                        }
                    }

                    GameManager.instance.StartCoroutine(LurkerKilled());
                }
                break;

            // Make tolls always interactable, in the rare case that lantern is not randomized but RG access through the dark room is expected, or if the player starts in CP without dark room access to escape
            case SceneNames.Mines_33:
                if (RandomizerMod.Instance.Settings.DarkRooms && !RandomizerMod.Instance.Settings.RandomizeKeys ||
                    !RandomizerMod.Instance.Settings.DarkRooms && RandomizerMod.Instance.Settings.StartName == "Hallownest's Crown")
                {
                    GameObject[] tolls = new GameObject[] { GameObject.Find("Toll Gate Machine"), GameObject.Find("Toll Gate Machine (1)") };
                    foreach (GameObject toll in tolls)
                    {
                        Object.Destroy(FSMUtility.LocateFSM(toll, "Disable if No Lantern"));
                    }
                }
                break;

            // Move Seer back to make room for items, and remove essence rewards
            case SceneNames.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.dreamReward5b = true;
                moth.FsmVariables.GetFsmBool("Got Reward 5b").Value = true;     //Skill
                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;

            // Make Sly pickup send Sly back upstairs -- warps player out to prevent resulting softlock from trying to enter the shop from a missing transition
            case SceneNames.Room_Sly_Storeroom:
                FsmState slyFinish = FSMUtility.LocateFSM(GameObject.Find("Randomizer Shiny"), "Shiny Control").GetState("Finish");
                slyFinish.AddAction(new RandomizerSetBool("SlyCharm", true));
                slyFinish.AddAction(new RandomizerChangeScene("Town", "door_sly"));
                break;

            // Many changes to make the desolate dive pickup work properly
            case SceneNames.Ruins1_24:
                // Stop spell container from destroying itself
                PlayMakerFSM quakePickup = FSMUtility.LocateFSM(GameObject.Find("Quake Pickup"), "Pickup");
                quakePickup.GetState("Idle").RemoveActionsOfType <IntCompare>();
                foreach (PlayMakerFSM childFSM in quakePickup.gameObject.GetComponentsInChildren <PlayMakerFSM>(true))
                {
                    if (childFSM.FsmName == "Shiny Control")
                    {
                        // Make spell container spawn shiny instead
                        quakePickup.GetState("Appear").GetActionsOfType <ActivateGameObject>()[1].gameObject
                        .GameObject.Value = childFSM.gameObject;

                        // Make shiny open gates on pickup/destroy
                        SendEvent openGate = new SendEvent
                        {
                            eventTarget = new FsmEventTarget
                            {
                                target      = FsmEventTarget.EventTarget.BroadcastAll,
                                excludeSelf = true
                            },
                            sendEvent  = FsmEvent.FindEvent("BG OPEN"),
                            delay      = 0,
                            everyFrame = false
                        };
                        childFSM.GetState("Destroy").AddFirstAction(openGate);
                        childFSM.GetState("Finish").AddFirstAction(openGate);
                        break;
                    }
                }

                // Stop the weird invisible floor from appearing if dive has been obtained
                if (Ref.PD.quakeLevel > 0)
                {
                    Object.Destroy(GameObject.Find("Roof Collider Battle"));
                }

                // Change battle gate to be destroyed if Soul Master is dead instead of it the player has quake
                FsmState checkQuake = FSMUtility.LocateFSM(GameObject.Find("Battle Gate (1)"), "Destroy if Quake").GetState("Check");
                checkQuake.RemoveActionsOfType <FsmStateAction>();
                checkQuake.AddAction(new RandomizerBoolTest(nameof(PlayerData.killedMageLord), null, "DESTROY", true));
                break;

            // Prevent simple key softlocks
            case SceneNames.Ruins2_04:
                FsmState hotSpringsKey = GameObject.Find("Inspect").LocateMyFSM("Conversation Control").GetState("Got Key?");
                hotSpringsKey.RemoveActionsOfType <IntCompare>();
                hotSpringsKey.AddAction(new RandomizerExecuteLambda(() =>
                {
                    if (GameManager.instance.GetPlayerDataInt("simpleKeys") > 1 || (PlayerData.instance.openedWaterwaysManhole && GameManager.instance.GetPlayerDataInt("simpleKeys") > 0))
                    {
                        PlayMakerFSM.BroadcastEvent("YES");
                    }
                    else
                    {
                        PlayMakerFSM.BroadcastEvent("NO");
                    }
                }));
                break;

            // Destroy Lurien
            case SceneNames.Ruins2_Watcher_Room:
                Object.Destroy(GameObject.Find("Dreamer Lurien"));
                Object.Destroy(GameObject.Find("Dream Enter"));
                Object.Destroy(GameObject.Find("Dream Impact"));
                Object.Destroy(GameObject.Find("Shield"));
                break;

            // Open all colosseum trials
            case SceneNames.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;

            // Destroy Grey Mourner after the flower has been delivered
            case SceneNames.Room_Mansion:
                if (PlayerData.instance.xunFlowerGiven)
                {
                    PlayerData.instance.xunRewardGiven = true;
                }
                break;

            // Removes King's Brand cutscene trigger
            case SceneNames.Room_Wyrm:
                Object.Destroy(GameObject.Find("Avalanche End"));
                break;

            // Open Colosseum gates after picking up resp. items
            case SceneNames.Room_Colosseum_Bronze:
                GameObject.Find("Colosseum Manager").LocateMyFSM("Geo Pool").GetState("Open Gates").AddFirstAction(new RandomizerSetBool("colosseumBronzeCompleted", true, true));
                break;

            case SceneNames.Room_Colosseum_Silver:
                GameObject.Find("Colosseum Manager").LocateMyFSM("Geo Pool").GetState("Open Gates").AddFirstAction(new RandomizerSetBool("colosseumSilverCompleted", true, true));
                break;

            // Prevent simple key softlocks
            case SceneNames.Town:
                FsmState jijiKey = GameObject.Find("Jiji Door").LocateMyFSM("Conversation Control").GetState("Key?");
                jijiKey.RemoveActionsOfType <GetPlayerDataInt>();
                jijiKey.RemoveActionsOfType <IntCompare>();
                jijiKey.AddAction(new RandomizerExecuteLambda(() =>
                {
                    if (GameManager.instance.GetPlayerDataInt("simpleKeys") > 1 || (PlayerData.instance.openedWaterwaysManhole && GameManager.instance.GetPlayerDataInt("simpleKeys") > 0))
                    {
                        PlayMakerFSM.BroadcastEvent("KEY");
                    }
                    else
                    {
                        PlayMakerFSM.BroadcastEvent("NOKEY");
                    }
                }));
                break;
            }
        }
Exemplo n.º 23
0
 public static void ClearTransitions(this FsmState self)
 {
     self.Transitions = new FsmTransition[0];
 }
Exemplo n.º 24
0
 public static FsmStateAction GetAction(this FsmState state, int actionindex)
 {
     return(state.Actions[actionindex]);
 }
Exemplo n.º 25
0
        /*
         * Better organization someday...
         */
        public static void MiscQoLChanges(Scene newScene)
        {
            string sceneName = newScene.name;

            // Make baldurs always able to spit rollers and reduce hp
            if (sceneName == SceneNames.Crossroads_11_alt || sceneName == SceneNames.Crossroads_ShamanTemple ||
                sceneName == SceneNames.Fungus1_28)
            {
                foreach (GameObject obj in Object.FindObjectsOfType <GameObject>())
                {
                    if (obj.name.Contains("Blocker"))
                    {
                        HealthManager hm = obj.GetComponent <HealthManager>();
                        if (hm != null)
                        {
                            hm.hp = 5;
                        }
                        PlayMakerFSM fsm = FSMUtility.LocateFSM(obj, "Blocker Control");
                        if (fsm != null)
                        {
                            fsm.GetState("Can Roller?").RemoveActionsOfType <IntCompare>();
                        }
                    }
                }
            }

            switch (sceneName)
            {
            // Lemm sell all

            /*
             * case SceneNames.Ruins1_05b when RandomizerMod.Instance.Settings.Lemm:
             *  PlayMakerFSM lemm = FSMUtility.LocateFSM(GameObject.Find("Relic Dealer"), "npc_control");
             *  lemm.GetState("Convo End").AddAction(new RandomizerSellRelics());
             *  break;
             */

            // Grubfather rewards are given out all at once
            case SceneNames.Crossroads_38 when RandomizerMod.Instance.Settings.Grubfather:
                PlayMakerFSM grubDaddy = FSMUtility.LocateFSM(GameObject.Find("Grub King"), "King Control");
                grubDaddy.GetState("Final Reward?").RemoveTransitionsTo("Recover");
                grubDaddy.GetState("Final Reward?").AddTransition("FINISHED", "Recheck");
                grubDaddy.GetState("Recheck").RemoveTransitionsTo("Gift Anim");
                grubDaddy.GetState("Recheck").AddTransition("FINISHED", "Activate Reward");

                int geoTotal = 0;
                grubDaddy.GetState("All Given").AddAction(new RandomizerAddGeo(grubDaddy.gameObject, 0, true));
                grubDaddy.GetState("Recheck").AddFirstAction(new RandomizerExecuteLambda(() =>
                                                                                         grubDaddy.GetState("All Given").GetActionsOfType <RandomizerAddGeo>()[0].SetGeo(geoTotal)));

                foreach (PlayMakerFSM grubFsm in grubDaddy.gameObject.GetComponentsInChildren <PlayMakerFSM>(true))
                {
                    if (grubFsm.FsmName == "grub_reward_geo")
                    {
                        FsmState grubGeoState = grubFsm.GetState("Remaining?");
                        int      geo          = grubGeoState.GetActionsOfType <IntCompare>()[0].integer1.Value;

                        grubGeoState.RemoveActionsOfType <FsmStateAction>();
                        grubGeoState.AddAction(new RandomizerExecuteLambda(() => geoTotal += geo));
                        grubGeoState.AddTransition("FINISHED", "End");
                    }
                }
                break;

            // Great Hopper Easter Egg, I guess
            case SceneNames.Deepnest_East_16:
                GameObject hopper1 = newScene.FindGameObject("Giant Hopper");
                GameObject hopper2 = newScene.FindGameObject("Giant Hopper (1)");

                for (int i = 0; i < 10; i++)
                {
                    GameObject newHopper1 = Object.Instantiate(hopper1, hopper1.transform.parent);
                    GameObject newHopper2 = Object.Instantiate(hopper2, hopper2.transform.parent);

                    HealthManager hopper1HM = newHopper1.GetComponent <HealthManager>();
                    hopper1HM.SetGeoSmall(0);
                    hopper1HM.SetGeoMedium(0);
                    hopper1HM.SetGeoLarge(0);

                    HealthManager hopper2HM = newHopper2.GetComponent <HealthManager>();
                    hopper2HM.SetGeoSmall(0);
                    hopper2HM.SetGeoMedium(0);
                    hopper2HM.SetGeoLarge(0);

                    Vector3 hopper1Pos = newHopper1.transform.localPosition;
                    hopper1Pos = new Vector3(
                        hopper1Pos.x + i,
                        hopper1Pos.y,
                        hopper1Pos.z);
                    newHopper1.transform.localPosition = hopper1Pos;

                    Vector3 hopper2Pos = newHopper2.transform.localPosition;
                    hopper2Pos = new Vector3(
                        hopper2Pos.x + i - 4,
                        hopper2Pos.y,
                        hopper2Pos.z);
                    newHopper2.transform.localPosition = hopper2Pos;
                }
                break;

            // Skip dreamer text before Dream Nail
            case SceneNames.RestingGrounds_04:
                FsmState dreamerPlaqueInspect = FSMUtility
                                                .LocateFSM(GameObject.Find("Dreamer Plaque Inspect"), "Conversation Control")
                                                .GetState("Hero Anim");
                dreamerPlaqueInspect.RemoveActionsOfType <ActivateGameObject>();
                dreamerPlaqueInspect.RemoveTransitionsTo("Fade Up");
                dreamerPlaqueInspect.AddTransition("FINISHED", "Map Msg?");

                PlayMakerFSM dreamerScene2 = FSMUtility.LocateFSM(GameObject.Find("Dreamer Scene 2"), "Control");
                dreamerScene2.GetState("Take Control").RemoveTransitionsTo("Blast");
                dreamerScene2.GetState("Take Control").AddTransition("FINISHED", "Fade Out");
                dreamerScene2.GetState("Fade Out").RemoveTransitionsTo("Dial Wait");
                dreamerScene2.GetState("Fade Out").AddTransition("FINISHED", "Set Compass Point");
                break;
            }
        }
Exemplo n.º 26
0
 public static T GetAction <T>(this FsmState state, int actionindex) where T : FsmStateAction
 {
     return((T)state.Actions[actionindex]);
 }
Exemplo n.º 27
0
 /**
  * Constructor
  */
 public TimedFadeVolume(FsmState owner, string timeReferenceName) : base(owner)
 {
     // dummy time only
     // duration time will be set on enter
     this.timer = new CountdownTimer(1, timeReferenceName);
 }
Exemplo n.º 28
0
 public static void RemoveAction <T>(this FsmState state) where T : FsmStateAction
 {
     state.Actions = state.Actions.Where(action => action.GetType() != typeof(T)).ToArray();
 }
Exemplo n.º 29
0
        // ReSharper disable once Unity.InvalidParameters Go f**k yourself ReSharper.
        private void Reset(Scene from, Scene to)
        {
            // Essentially makes sure they complete grimm quest before starting infinite grimm.
            // Otherwise the player would have a hard time upgrading their grimmchild.
            if (to.name == "Grimm_Nightmare")
            {
                if (!PlayerData.instance.GetBoolInternal("defeatedNightmareGrimm") ||
                    !PlayerData.instance.killedNightmareGrimm)
                {
                    return;
                }

                try
                {
                    memeBullshitSpikes    = new GameObject[15];
                    memeBullshitSpikeFSMs = new PlayMakerFSM[15];
                }
                catch (Exception e)
                {
                    infinite_globals.log("exception " + e);
                }

                //lul

                try
                {
                    rng = new Random();

                    PlayerData.instance.AddMPCharge(99 * 2);
                    PlayerData.instance.MPCharge  = 99;
                    PlayerData.instance.MPReserve = 99;
                }
                catch (Exception e)
                {
                    infinite_globals.log("Error either making the RNG or adding MP to player " + e);
                }

                phase1   = false;
                phase2   = false;
                phase3   = false;
                balloon1 = false;
                balloon2 = false;

                damageDone = 0;
                // Just needs to be high enough he won't naturally die or use balloon attack.
                defaultHealth = 3000;

                grimmchildFrameCounter = 300;

                // Assigning the FSMs.
                try
                {
                    grimmContainer = GameObject.Find("Grimm Control");
                    grimm          = grimmContainer.FindGameObjectInChildren("Nightmare Grimm Boss");
                    grimmAnim      = grimm.GetComponent <tk2dSpriteAnimator>();
                    grimmFSM       = FSMUtility.LocateFSM(grimm, "Control");
                }
                catch (Exception e)
                {
                    infinite_globals.log("Exception in finding grimm " + e);
                }

                teleinFPS       = grimmAnim.GetClipByName("Tele In").fps;
                teleoutFPS      = grimmAnim.GetClipByName("Tele Out").fps;
                uppercutendFPS  = grimmAnim.GetClipByName("Uppercut End").fps;
                slashrecoverFPS = grimmAnim.GetClipByName("Slash Recover").fps;
                evadeendFPS     = grimmAnim.GetClipByName("Evade End").fps;
                spikesFPS       = grimmAnim.GetClipByName("Spike Up").fps;

                if (memeBullshitGrimmContainer == null)
                {
                    memeBullshitGrimmContainer = Instantiate(grimmContainer);
                }

                memeBullshitGrimm    = memeBullshitGrimmContainer.FindGameObjectInChildren("Nightmare Grimm Boss");
                memeBullshitGrimmFSM = FSMUtility.LocateFSM(memeBullshitGrimm, "Control");

                hm    = grimm.GetComponent <HealthManager>();
                hm.hp = defaultHealth;

                memeBullshitHealthManager    = memeBullshitGrimm.GetComponent <HealthManager>();
                memeBullshitHealthManager.hp = defaultHealth;

                // Starts the update process. This just saves CPU cycles when not in the grimm room.
                // It is done after loading the FSMs in case they error out and the Reset function never finishes.
                runningIG = true;

                // Maybe just set to true and leave it that way.
                didDie           = false;
                playerDieTimeout = 0;


                grimmFSM.ChangeTransition("Move Choice", "PILLARS", "AD Pos");
                grimmFSM.ChangeTransition("Move Choice", "SPIKES", "Slash Pos");

                grimmFSM.ChangeTransition("Firebat 3", "FINISHED", "FB Behind");
                grimmFSM.ChangeTransition("G Dash Recover", "FINISHED", "Slash End");

                memeBullshitGrimmFSM.ChangeTransition("Move Choice", "FIREBATS", "Spike Attack");
                memeBullshitGrimmFSM.ChangeTransition("Move Choice", "SLASH", "Spike Attack");
                memeBullshitGrimmFSM.ChangeTransition("Move Choice", "AIR DASH", "Spike Attack");
                memeBullshitGrimmFSM.ChangeTransition("Move Choice", "SPIKES", "Spike Attack");
                memeBullshitGrimmFSM.ChangeTransition("Move Choice", "PILLARS", "Spike Attack");

                GameObject[] objects = FindObjectsOfType <GameObject>();
                int          i       = 0;
                foreach (GameObject go in objects)
                {
                    if (!go.name.Contains("Nightmare Spike"))
                    {
                        continue;
                    }

                    memeBullshitSpikes[i]    = go;
                    memeBullshitSpikeFSMs[i] = FSMUtility.LocateFSM(go, "Control");
                    i++;
                }

                FsmState spikeState           = memeBullshitGrimmFSM.getState("Spike Attack");
                List <FsmStateAction> actions = spikeState.Actions.ToList();
                actions.Insert(0, new CallMethod
                {
                    behaviour  = this,
                    everyFrame = false,
                    methodName = "setupNGGSpikes",
                    parameters = new FsmVar[0]
                });
                spikeState.Actions = actions.ToArray();

                StartCoroutine(infinite_globals.destroyStuff(infinite_globals.ANNOYING_OBJECTS_TO_KILL));
                if (infinite_globals.noLagMode2)
                {
                    StartCoroutine(infinite_globals.destroyStuff(infinite_globals.LAG_OBJECTS_TO_KILL));
                }

                StartCoroutine(infinite_globals.destroyStuff(infinite_globals.NGG_OBJECTS_TO_KILL));

                infinite_globals.log("Setup Nightmare IGG(s) battle... Have fun, puny mortal.");
                if (!infinite_globals.hardmode)
                {
                    return;
                }

                infinite_globals.log("IGG is in hard mode! You might as well give up now...");
                phase1 = true;
                phase2 = true;
                doNextPhase();
            }
            else
            {
                runningIG = false;
            }
        }
Exemplo n.º 30
0
 public static void InsertAction(this FsmState state, int actionindex, FsmStateAction action)
 {
     action.Fsm    = state.Fsm;
     state.Actions = state.Actions.Insert(actionindex, action).ToArray();
 }
Exemplo n.º 31
0
        private void Update()
        {
            if (playerDieTimeout > 0 && didDie)
            {
                playerDieTimeout--;
                if (playerDieTimeout != 0)
                {
                    return;
                }
                StartCoroutine(infinite_globals.playerDies(damageDone));
                didDie = false;
            }

            if (!runningIG)
            {
                return;
            }

            // Infinite code.
            if (hm.hp != defaultHealth)
            {
                damageDone += (defaultHealth - hm.hp);
                hm.hp       = defaultHealth;

                HeroController.instance.geoCounter.geoTextMesh.text = "" + damageDone;
                HeroController.instance.geoCounter.UpdateGeo(); // idek if this does something
            }

            if (memeBullshitHealthManager.hp != defaultHealth)
            {
                damageDone += (defaultHealth - memeBullshitHealthManager.hp);
                memeBullshitHealthManager.hp = defaultHealth;

                HeroController.instance.geoCounter.geoTextMesh.text = "" + damageDone;
                HeroController.instance.geoCounter.UpdateGeo(); // idek if this does something
            }

            if (PlayerData.instance.health <= 0)
            {
                didDie           = true;
                runningIG        = false;
                playerDieTimeout = 300;

                grimmAnim.GetClipByName("Tele In").fps       = teleinFPS;
                grimmAnim.GetClipByName("Tele Out").fps      = teleoutFPS;
                grimmAnim.GetClipByName("Uppercut End").fps  = uppercutendFPS;
                grimmAnim.GetClipByName("Slash Recover").fps = slashrecoverFPS;
                grimmAnim.GetClipByName("Evade End").fps     = evadeendFPS;
                grimmAnim.GetClipByName("Spike Up").fps      = spikesFPS;

                infinite_tent.damageDone = damageDone;

                infinite_globals.log("Cleaned up NGG fight.");
            }

            // This is some incredibly sketchy code. Basically it waits a little before spawning grimmchild
            // But not just any grimmchild, a random copied grimmchild from the last level.
            // Not exactly elegant but it works.
            if (grimmchildFrameCounter > 0)
            {
                grimmchildFrameCounter--;

                if (grimmchildFrameCounter == 0)
                {
                    if (PlayerData.instance.GetBoolInternal("equippedCharm_40"))
                    {
                        infinite_globals.log("Spawning grimmchild in grimm arena.");
                        PlayMakerFSM gcControl = FSMUtility.LocateFSM(infinite_tent.grimmchild, "Control");
                        infinite_tent.grimmchild.SetActive(true);
                        FsmState starting = gcControl.getState("Pause");
                        starting.removeActionsOfType <BoolTest>();
                        starting.clearTransitions();
                        starting.addTransition("FINISHED", "Spawn");
                        starting.addTransition("AWOKEN", "Spawn");
                    }
                }
            }
            if (infinite_globals.hardmode)
            {
                return;
            }
            doNextPhase();


            if (damageDone >= 3200 && infinite_globals.nggDies)
            {
                runningIG = false;
                hm.hp     = -100;
                hm.Die(0f, AttackTypes.Generic, true);
                runningIG        = false;
                playerDieTimeout = 300;

                grimmAnim.GetClipByName("Tele In").fps       = teleinFPS;
                grimmAnim.GetClipByName("Tele Out").fps      = teleoutFPS;
                grimmAnim.GetClipByName("Uppercut End").fps  = uppercutendFPS;
                grimmAnim.GetClipByName("Slash Recover").fps = slashrecoverFPS;
                grimmAnim.GetClipByName("Evade End").fps     = evadeendFPS;
                grimmAnim.GetClipByName("Spike Up").fps      = spikesFPS;

                infinite_tent.damageDone = 3200;

                infinite_globals.log("Cleaned up NGG fight.");
                Destroy(memeBullshitGrimm);

                //StartCoroutine(killPlayer());
            }
        }
Exemplo n.º 32
0
 public static void AddTransition(this FsmState state, string fsmEvent, string toState)
 {
     AddTransition(state, FsmEvent.FindEvent(fsmEvent), state.Fsm.GetState(toState));
 }
        public override void Process(string scene, Object changeObj)
        {
            if (!(scene == _sceneName && changeObj is PlayMakerFSM fsm))
            {
                return;
            }
            var grimmkinLevel = 1;

            switch (scene)
            {
            case "Tutorial_01":
            case "RestingGrounds_06":
            case "Deepnest_East_03":
                grimmkinLevel = 2;
                break;

            case "Fungus2_30":
            case "Abyss_02":
            case "Hive_03":
                grimmkinLevel = 3;
                break;
            }
            if (fsm.FsmName == "Control")
            {
                // Make the grimmkin think we have the appropriate
                // Grimmchild level, so that it behaves the same
                // regardless of how much Grimmchild has been
                // upgraded.
                switch (fsm.gameObject.name)
                {
                case "Flamebearer Small(Clone)":
                case "Flamebearer Med(Clone)":
                case "Flamebearer Large(Clone)":
                    FixGrimmkinFSM(fsm, grimmkinLevel);
                    break;
                }
                return;
            }
            if (!(fsm.FsmName == _fsmName && fsm.gameObject.name == _objectName))
            {
                return;
            }

            FsmState get = fsm.GetState("Get");

            get.RemoveActionsOfType <IncrementPlayerDataInt>();
            get.RemoveActionsOfType <SendMessage>();
            get.AddFirstAction(new RandomizerExecuteLambda(() => {
                var def = LogicManager.GetItemDef(RandomizerMod.Instance.Settings.GetEffectiveItem(_item));
                // Make sure the correct icon and text appear.
                // Modifying the FSM from within itself is a bit of a kludge, but it's
                // simpler than replacing the existing item popup altogether.
                get.GetActionsOfType <GetLanguageString>().First().convName     = def.nameKey;
                get.GetActionsOfType <SetSpriteRendererSprite>().First().sprite = RandomizerMod.GetSprite(def.shopSpriteKey);
            }));
            get.AddAction(new RandomizerExecuteLambda(() => GiveItem(_action, _item, _location)));


            if (_objectName == "Brumm Torch NPC")
            {
                var checkActive = fsm.GetState("Check Active");
                checkActive.Actions    = new FsmStateAction[1];
                checkActive.Actions[0] = new RandomizerExecuteLambda(() => fsm.SendEvent(IsBrummActive() ? "FINISHED" : "INACTIVE"));
                var convo1 = fsm.GetState("Convo 1");
                convo1.RemoveActionsOfType <IntCompare>();
            }
            else
            {
                var init = fsm.GetState("State");
                init.RemoveActionsOfType <IntCompare>();
                init.RemoveActionsOfType <IntSwitch>();
                init.AddAction(new RandomizerExecuteLambda(() => fsm.SendEvent(Ref.PD.GetInt("grimmChildLevel") >= grimmkinLevel ? "LEVEL " + grimmkinLevel : "KILLED")));
            }
        }
Exemplo n.º 34
0
 /**
  * Constructor with OnEnter routine.
  */
 public FsmDelegateAction(FsmState owner, FsmActionRoutine onEnterRoutine) : this(owner, onEnterRoutine, null, null)
 {
 }
        public static void IntrospectFsmStateActions(FsmState state,XmlElement parentElement)
        {
            if (state.Actions.Length==0)
            {
                return;
            }

            XmlElement _actionsElement = IntrospectionXmlProxy.AddElement(parentElement,"Actions");

            foreach(FsmStateAction _action in state.Actions)
            {

                XmlElement _actionElement = IntrospectionXmlProxy.AddElement(_actionsElement,"Action");

                IntrospectionXmlProxy.AddElementIfNotEmpty(_actionElement,"Name",_action.Name);

                if (!_action.IsAutoNamed)
                {
                    IntrospectionXmlProxy.AddElement(_actionElement,"IsAutoNamed","False");
                }

                if (!_action.Active)
                {
                    IntrospectionXmlProxy.AddElement(_actionElement,"Active","False");
                }
            }
        }