public void draw()
        {
            EditorGUILayout.HelpBox(TC.get("RandomEffect.Description"), MessageType.Info);
            EditorGUI.BeginChangeCheck();
            var newProbability = EditorGUILayout.IntSlider("RandomEffect.Probability.Description".Traslate(),
                                                           effect.getProbability(), 0, 100);

            if (EditorGUI.EndChangeCheck())
            {
                effect.setProbability(newProbability);
            }

            using (new EditorGUILayout.HorizontalScope())
            {
                GUILayout.Label("RandomEffect.Positive.Title".Traslate());
                if (GUILayout.Button(effect.getPositiveEffect() == null ? addTexture : removeTexture, GUILayout.Width(20)))
                {
                    if (effect.getPositiveEffect() == null)
                    {
                        EffectEditorWindow.CreateEffect(newEffect =>
                        {
                            effect.setPositiveEffect(newEffect);
                        });
                    }
                    else
                    {
                        effect.setPositiveEffect(null);
                        effect.setNegativeEffect(null);
                    }
                }
            }

            using (new EditorGUI.DisabledScope(effect.getPositiveEffect() == null))
            {
                using (new EditorGUILayout.HorizontalScope())
                {
                    GUILayout.Label("RandomEffect.Negative.Title".Traslate());
                    if (GUILayout.Button(effect.getNegativeEffect() == null ? addTexture : removeTexture, GUILayout.Width(20)))
                    {
                        if (effect.getNegativeEffect() == null)
                        {
                            EffectEditorWindow.CreateEffect(effect.setNegativeEffect);
                        }
                        else
                        {
                            effect.setNegativeEffect(null);
                        }
                    }
                }
            }
        }
コード例 #2
0
        public static void appendEffects(XmlDocument doc, XmlNode effectsNode, Effects effects)
        {
            // Add every effect
            foreach (AbstractEffect effect in effects.getEffects())
            {
                XmlElement effectElement = null;

                if (effect.getType() == EffectType.CUSTOM_EFFECT)
                {
                    DOMWriterUtility.DOMWrite(effectsNode, effect);
                }
                else
                {
                    if (effect.getType() != EffectType.RANDOM_EFFECT)
                    {
                        effectElement = buildEffectNode(effect, doc);
                    }
                    else
                    {
                        RandomEffect randomEffect = (RandomEffect)effect;
                        effectElement = doc.CreateElement("random-effect");
                        effectElement.SetAttribute("probability", randomEffect.getProbability().ToString());

                        XmlElement posEfElement = null;
                        XmlElement negEfElement = null;

                        if (randomEffect.getPositiveEffect() != null)
                        {
                            posEfElement = buildEffectNode(randomEffect.getPositiveEffect(), doc);
                            effectElement.AppendChild(posEfElement);
                            if (randomEffect.getNegativeEffect() != null)
                            {
                                negEfElement = buildEffectNode(randomEffect.getNegativeEffect(), doc);
                                effectElement.AppendChild(negEfElement);
                            }
                        }
                    }
                    // Add the effect
                    effectsNode.AppendChild(effectElement);
                }

                // Add conditions associated to that effect
                // Create conditions for current effect

                DOMWriterUtility.DOMWrite(effectsNode, effect.getConditions());
            }
        }
コード例 #3
0
        public bool execute()
        {
            var forceWait = false;

            if (effect != null && (!runsOnce || timesRun == 0 || waitForLoadPulse))
            {
                if (!validated)
                {
                    isValid   = conditions == null || ConditionChecker.check(conditions);
                    validated = true;
                }

                if (isValid)
                {
                    switch (effect.getType())
                    {
                    case EffectType.ACTIVATE:
                        Game.Instance.GameState.SetFlag(((ActivateEffect)effect).getTargetId(), FlagCondition.FLAG_ACTIVE);
                        break;

                    case EffectType.DEACTIVATE:
                        Game.Instance.GameState.SetFlag(((DeactivateEffect)effect).getTargetId(), FlagCondition.FLAG_INACTIVE);
                        break;

                    case EffectType.SHOW_TEXT:
                        var showTextEffect = (ShowTextEffect)effect;
                        Game.Instance.Talk(showTextEffect.getText(), showTextEffect.getX(), showTextEffect.getY(),
                                           showTextEffect.getRgbFrontColor(), showTextEffect.getRgbBorderColor());
                        forceWait = true;
                        break;

                    case EffectType.SPEAK_PLAYER:
                        Game.Instance.Talk(((SpeakPlayerEffect)effect).getLine(), Player.IDENTIFIER);
                        forceWait = true;
                        break;

                    case EffectType.SPEAK_CHAR:
                        Game.Instance.Talk(((SpeakCharEffect)effect).getLine(), ((SpeakCharEffect)effect).getTargetId());
                        forceWait = true;
                        break;

                    case EffectType.TRIGGER_SCENE:
                        if (!waitForLoadPulse)
                        {
                            runsOnce = false;
                            TriggerSceneEffect tse = ((TriggerSceneEffect)effect);
                            if (!Game.Instance.GameState.IsFirstPerson)
                            {
                                var playerContext = Game.Instance.GameState.PlayerContext;
                                if (tse.getX() != int.MinValue || tse.getY() != int.MinValue)
                                {
                                    playerContext.setPosition(tse.getX(), tse.getY());
                                    if (tse.DestinyScale > 0)
                                    {
                                        playerContext.Scale = tse.DestinyScale;
                                    }
                                }
                                else
                                {
                                    var targetScene = Game.Instance.GameState.GetChapterTarget(tse.getTargetId()) as Scene;
                                    if (targetScene != null)
                                    {
                                        if (targetScene.getTrajectory() != null)
                                        {
                                            var initial = targetScene.getTrajectory().getInitial();
                                            playerContext.setPosition(initial.getX(), initial.getY());
                                            playerContext.Scale = initial.getScale();
                                        }
                                        else
                                        {
                                            playerContext.setPosition(targetScene.getPositionX(), targetScene.getPositionY());
                                            playerContext.Scale = targetScene.getPlayerScale();
                                        }
                                    }
                                }
                            }

                            var trace = !(additionalInfo.ContainsKey("disable_trace") && (bool)additionalInfo["disable_trace"]);
                            Game.Instance.RunTarget(tse.getTargetId(), tse.getTransitionTime(), tse.getTransitionType(), null, trace);
                            waitForLoadPulse = true;
                            forceWait        = true;
                        }
                        else
                        {
                            waitForLoadPulse = false;
                        }
                        // DODO make something to wait until the target is ready to prevent undesired effect advance
                        break;

                    case EffectType.TRIGGER_CUTSCENE:
                        runsOnce = false;
                        TriggerCutsceneEffect tce = (TriggerCutsceneEffect)effect;
                        if (timesRun > 1)     // The first interaction is the run target callback
                        {
                            if (additionalInfo.ContainsKey("sub_effects_wait"))
                            {
                                forceWait = false;
                            }
                            else
                            {
                                InteractuableResult res = ((Interactuable)additionalInfo["scene"]).Interacted();
                                if (res == InteractuableResult.REQUIRES_MORE_INTERACTION)
                                {
                                    forceWait = true;
                                }
                                else if (res == InteractuableResult.DOES_SOMETHING)
                                {
                                    additionalInfo["sub_effects_wait"] = true;
                                    forceWait = true;
                                }
                            }
                        }
                        else if (timesRun == 1)
                        {
                            forceWait = true;
                        }
                        else if (timesRun == 0)
                        {
                            var trace = !(additionalInfo.ContainsKey("disable_trace") && (bool)additionalInfo["disable_trace"]);

                            additionalInfo.Add("lastscene", Game.Instance.GameState.CurrentTarget);
                            additionalInfo.Add("scene", Game.Instance.RunTarget(tce.getTargetId(), null, trace));
                            forceWait = true;
                        }

                        if (!forceWait && ((Cutscene)((IRunnerChapterTarget)additionalInfo["scene"]).Data).getNext() == Cutscene.GOBACK)
                        {
                            string last = (string)additionalInfo["lastscene"];
                            Game.Instance.RunTarget(last);
                        }

                        break;

                    case EffectType.TRIGGER_LAST_SCENE:
                        runsOnce = false;
                        Game.Instance.SwitchToLastTarget();
                        break;

                    case EffectType.TRIGGER_CONVERSATION:
                        runsOnce = false;
                        runsOnce = false;
                        if (timesRun == 0)
                        {
                            var tcoe = (TriggerConversationEffect)effect;
                            this.additionalInfo.Add("conversation", new GraphConversationHolder(Game.Instance.GameState.GetConversation(tcoe.getTargetId())));
                        }
                        forceWait = ((GraphConversationHolder)this.additionalInfo["conversation"]).execute();
                        break;

                    case EffectType.RANDOM_EFFECT:
                        RandomEffect re = (RandomEffect)effect;

                        if (timesRun == 0)
                        {
                            int pro = re.getProbability(), now = Random.Range(0, 100);

                            if (pro <= now)
                            {
                                if (re.getPositiveEffect() != null)
                                {
                                    additionalInfo.Add("current", new EffectHolderNode(re.getPositiveEffect()));
                                    runsOnce = false;
                                }
                            }
                            else if (re.getNegativeEffect() != null)
                            {
                                additionalInfo.Add("current", new EffectHolderNode(re.getNegativeEffect()));
                                runsOnce = false;
                            }
                        }

                        if (additionalInfo.ContainsKey("current"))
                        {
                            var subEffectHolder = (EffectHolderNode)additionalInfo["current"];
                            forceWait = subEffectHolder.execute();
                            runsOnce  = subEffectHolder.runsOnce;
                        }

                        break;

                    case EffectType.SET_VALUE:
                        SetValueEffect sve = (SetValueEffect)effect;
                        Game.Instance.GameState.SetVariable(sve.getTargetId(), sve.getValue());
                        break;

                    case EffectType.INCREMENT_VAR:
                        IncrementVarEffect ive = (IncrementVarEffect)effect;
                        Game.Instance.GameState.SetVariable(ive.getTargetId(), Game.Instance.GameState.GetVariable(ive.getTargetId()) + ive.getIncrement());
                        break;

                    case EffectType.DECREMENT_VAR:
                        DecrementVarEffect dve = (DecrementVarEffect)effect;
                        Game.Instance.GameState.SetVariable(dve.getTargetId(), Game.Instance.GameState.GetVariable(dve.getTargetId()) - dve.getDecrement());
                        break;

                    case EffectType.MACRO_REF:
                        runsOnce = false;
                        if (timesRun == 0)
                        {
                            MacroReferenceEffect mre = (MacroReferenceEffect)effect;
                            this.additionalInfo.Add("macro", new EffectHolder(Game.Instance.GameState.GetMacro(mre.getTargetId())));
                        }
                        forceWait = ((EffectHolder)this.additionalInfo["macro"]).execute();
                        break;

                    case EffectType.MOVE_OBJECT:
                        MoveObjectEffect moe = (MoveObjectEffect)effect;
                        runsOnce = !moe.isAnimated();

                        if (timesRun == 0)
                        {
                            if (moe.isAnimated())
                            {
                                Game.Instance.GameState.Move(moe.getTargetId(), new Vector2(moe.getX(), moe.getY()), moe.getTranslateSpeed(), this);
                            }
                            else
                            {
                                Game.Instance.GameState.Move(moe.getTargetId(), new Vector2(moe.getX(), moe.getY()));
                            }
                        }
                        if (!runsOnce && !pulsed)
                        {
                            forceWait = true;
                        }
                        break;

                    case EffectType.MOVE_NPC:
                        MoveNPCEffect mne = (MoveNPCEffect)effect;
                        runsOnce = true;

                        if (timesRun == 0)
                        {
                            Game.Instance.GameState.Move(mne.getTargetId(), new Vector2(mne.getX(), mne.getY()), 1, this);
                        }
                        if (!runsOnce && !pulsed)
                        {
                            forceWait = true;
                        }
                        break;

                    case EffectType.GENERATE_OBJECT:
                        GenerateObjectEffect gen = (GenerateObjectEffect)effect;
                        var toAdd = Game.Instance.GameState.FindElement <Item>(gen.getTargetId());
                        InventoryManager.Instance.AddElement(toAdd);
                        break;

                    case EffectType.CONSUME_OBJECT:
                        ConsumeObjectEffect con = (ConsumeObjectEffect)effect;
                        var toRemove            = Game.Instance.GameState.FindElement <Item>(con.getTargetId());
                        InventoryManager.Instance.RemoveElement(toRemove);
                        break;

                    case EffectType.TRIGGER_BOOK:
                        if (timesRun == 0)
                        {
                            if (InventoryManager.Instance.Opened)
                            {
                                InventoryManager.Instance.Close();
                            }
                            TriggerBookEffect triggerBookEffect = (TriggerBookEffect)effect;
                            Game.Instance.ShowBook(triggerBookEffect.getTargetId());
                        }
                        runsOnce  = false;
                        forceWait = Game.Instance.ShowingBook;
                        break;

                    case EffectType.PLAY_SOUND:
                        PlaySoundEffect pse       = (PlaySoundEffect)effect;
                        AudioClip       audioClip = Game.Instance.ResourceManager.getAudio(pse.getPath());
                        PlayMusicOn(audioClip, Game.Instance);
                        break;

                    case EffectType.WAIT_TIME:
                        WaitTimeEffect wte = (WaitTimeEffect)effect;
                        runsOnce = false;
                        if (timesRun == 0)
                        {
                            Game.Instance.PulseOnTime(this, wte.getTime());
                        }
                        if (!pulsed)
                        {
                            forceWait = true;
                        }
                        break;

                    case EffectType.CUSTOM_EFFECT:
                        runsOnce = false;
                        if (timesRun == 0)
                        {
                            this.additionalInfo["custom_effect_runner"] = CustomEffectRunnerFactory.Instance.CreateRunnerFor(effect);
                        }
                        forceWait = ((CustomEffectRunner)this.additionalInfo["custom_effect_runner"]).execute();
                        break;
                    }
                }
            }

            if (!forceWait)
            {
                timesRun = 0;
            }
            else
            {
                timesRun++;
            }

            return(forceWait);
        }
コード例 #4
0
    public bool execute()
    {
        bool forcewait = false;

        if (!(runs_once && times_runed > 0))
        {
            if (effect == null || effect.getConditions() == null)
            {
                Debug.Log("Asd");
            }
            else
            {
                if (!validated)
                {
                    is_valid  = ConditionChecker.check(effect.getConditions());
                    validated = true;
                }

                if (is_valid)
                {
                    switch (effect.getType())
                    {
                    case EffectType.ACTIVATE:
                        Game.Instance.GameState.setFlag(((ActivateEffect)effect).getTargetId(), FlagCondition.FLAG_ACTIVE);
                        break;

                    case EffectType.DEACTIVATE:
                        Game.Instance.GameState.setFlag(((DeactivateEffect)effect).getTargetId(), FlagCondition.FLAG_INACTIVE);
                        break;

                    case EffectType.SPEAK_PLAYER:
                        Game.Instance.talk(((SpeakPlayerEffect)effect).getLine(), null);
                        forcewait = true;
                        break;

                    case EffectType.SPEAK_CHAR:
                        Game.Instance.talk(((SpeakCharEffect)effect).getLine(), ((SpeakCharEffect)effect).getTargetId());
                        forcewait = true;
                        break;

                    case EffectType.TRIGGER_SCENE:
                        runs_once = false;
                        Game.Instance.renderScene(((TriggerSceneEffect)effect).getTargetId());
                        break;

                    case EffectType.TRIGGER_CUTSCENE:
                        runs_once = false;
                        TriggerCutsceneEffect tce = (TriggerCutsceneEffect)effect;
                        if (times_runed > 0)
                        {
                            forcewait = ((SceneMB)aditional_info ["scene"]).Interacted() == InteractuableResult.REQUIRES_MORE_INTERACTION;
                        }
                        else
                        {
                            aditional_info = new Dictionary <string, object> ();
                            aditional_info.Add("lastscene", Game.Instance.GameState.CurrentScene);
                            aditional_info.Add("scene", Game.Instance.renderScene(tce.getTargetId()).GetComponent <SceneMB> ());
                            forcewait = true;
                        }

                        if (!forcewait && ((Slidescene)((SceneMB)aditional_info ["scene"]).sceneData).getNext() == Slidescene.GOBACK)
                        {
                            string last = (string)aditional_info ["lastscene"];
                            Game.Instance.renderScene(last);
                        }

                        break;

                    case EffectType.TRIGGER_LAST_SCENE:
                        runs_once = false;
                        Game.Instance.renderLastScene();
                        break;

                    case EffectType.TRIGGER_CONVERSATION:
                        runs_once = false;
                        runs_once = false;
                        if (times_runed == 0)
                        {
                            TriggerConversationEffect tcoe = (TriggerConversationEffect)effect;
                            this.aditional_info.Add("conversation", new GraphConversationHolder(Game.Instance.GameState.getConversation(tcoe.getTargetId())));
                        }
                        forcewait = ((GraphConversationHolder)this.aditional_info ["conversation"]).execute();
                        break;

                    case EffectType.RANDOM_EFFECT:
                        runs_once = false;
                        RandomEffect re = (RandomEffect)effect;

                        if (!aditional_info.ContainsKey("first"))
                        {
                            aditional_info.Add("first", new EffectHolderNode(re.getPositiveEffect()));
                            aditional_info.Add("second", new EffectHolderNode(re.getNegativeEffect()));
                        }

                        if (times_runed == 0)
                        {
                            int pro = re.getProbability(), now = Random.Range(0, 100);
                            if (aditional_info.ContainsKey("current"))
                            {
                                aditional_info.Remove("current");
                            }

                            if (pro <= now)
                            {
                                aditional_info.Add("current", "first");
                            }
                            else
                            {
                                aditional_info.Add("current", "second");
                            }

                            forcewait = ((EffectHolderNode)aditional_info [((string)aditional_info ["current"])]).execute();
                        }
                        else
                        {
                            forcewait = ((EffectHolderNode)aditional_info [((string)aditional_info ["current"])]).execute();
                        }

                        break;

                    case EffectType.SET_VALUE:
                        SetValueEffect sve = (SetValueEffect)effect;
                        Game.Instance.GameState.setVariable(sve.getTargetId(), sve.getValue());
                        break;

                    case EffectType.INCREMENT_VAR:
                        IncrementVarEffect ive = (IncrementVarEffect)effect;
                        Game.Instance.GameState.setVariable(ive.getTargetId(), Game.Instance.GameState.getVariable(ive.getTargetId()) + ive.getIncrement());
                        break;

                    case EffectType.DECREMENT_VAR:
                        DecrementVarEffect dve = (DecrementVarEffect)effect;
                        Game.Instance.GameState.setVariable(dve.getTargetId(), Game.Instance.GameState.getVariable(dve.getTargetId()) - dve.getDecrement());
                        break;

                    case EffectType.MACRO_REF:
                        runs_once = false;
                        if (times_runed == 0)
                        {
                            MacroReferenceEffect mre = (MacroReferenceEffect)effect;
                            this.aditional_info.Add("macro", new EffectHolder(Game.Instance.GameState.getMacro(mre.getTargetId())));
                        }
                        forcewait = ((EffectHolder)this.aditional_info ["macro"]).execute();
                        break;

                    case EffectType.MOVE_OBJECT:
                        MoveObjectEffect moe = (MoveObjectEffect)effect;
                        Game.Instance.GameState.Move(moe.getTargetId(), new Vector2(moe.getX(), 600 - moe.getY()) / 10f);
                        break;
                    }
                }
            }
        }

        if (!forcewait)
        {
            times_runed = 0;
        }
        else
        {
            times_runed++;
        }

        return(forcewait);
    }