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); }
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); } }
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); }
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); }
public bool BuildChoices(BaseDialogueObject fromObject) { return(BuildChoices(new BaseDialogueObject[] { fromObject })); }