Beispiel #1
0
        private static bool ImportArticyPins(ArticyFlowObject source, BaseDialogueObject target, bool compileInputScripts, bool compileOutputScripts, Dictionary <ulong, DialoguePin> pinIndex)
        {
            FlowObjectPin articyPin;
            DialoguePin   pin;
            bool          badScripts = false;

            foreach (GraphPin graphPin in source.Inputs)
            {
                articyPin = (FlowObjectPin)graphPin;
                pin       = new DialoguePin(articyPin.Type);
                if (compileInputScripts && !string.IsNullOrWhiteSpace(articyPin.Script))
                {
                    if ((pin.Script = CompileScript(articyPin.Script, Dialogues.InputPinScriptEnvironment, "input pin", articyPin.Id)) == null)
                    {
                        badScripts = true;
                    }
                }
                if (string.IsNullOrEmpty(target.Key))
                {
                    GameDebugger.Log(LogLevel.Debug, "Adding intput pin to '0x{0:X16}'", target.Id);
                }
                else
                {
                    GameDebugger.Log(LogLevel.Debug, "Adding intput pin to '{0}'", target.Key);
                }
                pinIndex.Add(articyPin.Id, pin);
                target.AddInput(pin);
            }

            foreach (GraphPin graphPin in source.Outputs)
            {
                articyPin = (FlowObjectPin)graphPin;
                pin       = new DialoguePin(articyPin.Type);
                if (compileOutputScripts && !string.IsNullOrWhiteSpace(articyPin.Script))
                {
                    if ((pin.Script = CompileScript(articyPin.Script, Dialogues.InstructionScriptEnvironment, "output pin", articyPin.Id)) == null)
                    {
                        badScripts = true;
                    }
                }
                if (string.IsNullOrEmpty(target.Key))
                {
                    GameDebugger.Log(LogLevel.Debug, "Adding output pin to '0x{0:X16}'", target.Id);
                }
                else
                {
                    GameDebugger.Log(LogLevel.Debug, "Adding output pin to '{0}'", target.Key);
                }
                pinIndex.Add(articyPin.Id, pin);
                target.AddOutput(pin);
            }

            return(badScripts);
        }
Beispiel #2
0
 public static void Add(BaseDialogueObject obj)
 {
     m_Objects.Add(obj.Id, obj);
     if (obj is Dialogue)
     {
         m_Dialogues.Add(obj.Id, (Dialogue)obj);
     }
     if (!string.IsNullOrWhiteSpace(obj.Key))
     {
         GameDebugger.Log(LogLevel.Debug, "Added {0} '{1}' to dialogue system", obj.GetType().Name, obj.Key);
         m_ObjectIndex.Add(obj.Key, obj);
         if (obj is Dialogue)
         {
             m_DialogueIndex.Add(obj.Key, (Dialogue)obj);
         }
     }
     else
     {
         GameDebugger.Log(LogLevel.Debug, "Added {0} '0x{1:X16}' to dialogue system", obj.GetType().Name, obj.Id);
     }
 }
Beispiel #3
0
        protected bool BuildChoices(GraphPin inputPin, List <DialogueFragment> fragments)
        {
            DialoguePin pin = inputPin as DialoguePin;

            if (pin == null)
            {
                return(false);
            }

            BaseDialogueObject obj = pin.Node as BaseDialogueObject;

            if (obj == null)
            {
                return(false);
            }

            if (pin.Type == GraphPin.PinType.Output && obj is Dialogue)
            {
                return(true);                // connection to a dialogue output is reached so it's the end of the dialogue
            }
            bool processObject = true;

            if (pin.Script != null)
            {
                dynamic result = pin.Script.Run(this);
                if (pin.Type == GraphPin.PinType.Input)
                {
                    if (!(result is Boolean))
                    {
                        GameDebugger.Log(LogLevel.Warning, "One of input pins script on dialogue object '0x{0:X16}' exits with a non boolean result ({1})", obj.Id, result.GetType().Name);
                        return(true);                 // end the dialogue due to error
                    }
                    if (!result)                      // input pin is a condition. if it returns false, then object is not processed
                    {
                        processObject = false;
                    }
                }
            }

            if (processObject && !(obj is Dialogue) && pin.Type == GraphPin.PinType.Input)
            {
                if (BuildChoices(obj, fragments))
                {
                    return(true);
                }
            }

            foreach (GraphConnection conn in pin.Connections)
            {
                if (conn.Target == pin)
                {
                    continue;                             // ignore incoming connections
                }
                if (BuildChoices(conn.Target, fragments)) // recursion through connections
                {
                    return(true);
                }
            }

            return(false);
        }
Beispiel #4
0
        protected bool BuildChoices(BaseDialogueObject fromObject, List <DialogueFragment> fragments)
        {
            IList <GraphPin> pins;

            if (fromObject is Dialogue)
            {
                pins = fromObject.Inputs;
            }
            else if (fromObject is DialogueCondition)
            {
                DialogueCondition condition = (DialogueCondition)fromObject;
                if (condition.Script == null)
                {
                    GameDebugger.Log(LogLevel.Warning, "Condition '0x{0:X16}' has no script", condition.Id);
                    return(true);
                }
                dynamic result = condition.Script.Run(this);
                if (!(result is Boolean))
                {
                    GameDebugger.Log(LogLevel.Warning, "Condition '0x{0:X16}' script exits with a non boolean result ({1})", condition.Id, result.GetType().Name);
                    return(true);                    // end the dialogue due to error
                }
                pins = new List <GraphPin>();
                pins.Add(condition.Outputs[result ? 0 : 1]);
            }
            else
            {
                if (fromObject is DialogueFragment)
                {
                    DialogueFragment fragment = (DialogueFragment)fromObject;
                    if (!string.IsNullOrWhiteSpace(fragment.MenuText))
                    {
                        fragments.Add(fragment);
                        return(false);
                    }

                    if (OnActorTalk != null)
                    {
                        OnActorTalk.Invoke(new ActorTalkEventArgs(fragment));
                    }
                }
                pins = fromObject.Outputs;
            }

            if (fromObject is DialogueInstruction)
            {
                DialogueInstruction instruction = (DialogueInstruction)fromObject;
                if (instruction.Script != null)
                {
                    instruction.Script.Run(this);
                }
            }

            if (fromObject is DialogueJump)
            {
                DialogueJump jump = (DialogueJump)fromObject;
                if (jump.TargetPin != null)
                {
                    if (BuildChoices(jump.TargetPin, fragments))
                    {
                        return(true);
                    }
                }
                else if (jump.Target != null)
                {
                    if (BuildChoices(jump.Target, fragments))
                    {
                        return(true);
                    }
                }
            }

            foreach (GraphPin gpin in pins)
            {
                if (BuildChoices(gpin, fragments))
                {
                    return(true);
                }
            }
            return(false);
        }
Beispiel #5
0
 public bool BuildChoices(BaseDialogueObject fromObject)
 {
     return(BuildChoices(new BaseDialogueObject[] { fromObject }));
 }