private void RealizeFunction(LogicFunction function, bool isTest = false) { if (function is LogicSplitter) { List <LogicFunction> outputs = ((LogicSplitter)function).actionOutputs; for (int i = 0; i < outputs.Count; i++) { ((LogicSplitter)function).realizeOutputs[i] = true; RealizeFunction(outputs[i], isTest); } } else if (function is DataSplitter) { DataSplitter dataSplitter = (DataSplitter)function; bool result = dataSplitter.GetResult(); if (result) { dataSplitter.realizeTrue = true; RealizeFunction(dataSplitter.trueOutput, isTest); } else { dataSplitter.realizeFalse = true; RealizeFunction(dataSplitter.falseOutput, isTest); } } else if (function is LogicEffect) { ((LogicEffect)function).Realize(curOwner, team, isTest); } else if (function is WaitFunction) { ((WaitFunction)function).CreateWaitAction(delegate { RealizeFunction(((WaitFunction)function).actionOutput, isTest); }); } else if (function is ChallengeFunction) { ChallengeFunction challengeFunction = (ChallengeFunction)function; challengeFunction.CreateWaitAction(curOwner, delegate { challengeFunction.realizeTrue = true; challengeFunction.realizeFalse = false; if (challengeFunction.trueFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(challengeFunction.trueFileNote, curOwner.GetTeam().transform)); } RealizeFunction(challengeFunction.trueOutput, isTest); }, delegate { challengeFunction.realizeTrue = false; challengeFunction.realizeFalse = true; if (challengeFunction.falseFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(challengeFunction.falseFileNote, curOwner.GetTeam().transform)); } RealizeFunction(challengeFunction.falseOutput, isTest); }); } else if (function is ChooseMethodFunction) { ChooseMethodFunction methodFunction = (ChooseMethodFunction)function; if (methodFunction.dialog == null || !curOwner.GetTeam().GetLeader().IsObedient()) { Method method = methodFunction.Realize(curOwner); Debug.Log(string.Format("ChooseMethod - {0}", method.ToString()), methodFunction); if (method == Method.Brutal) { if (methodFunction.brutalFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(methodFunction.brutalFileNote, curOwner.GetTeam().transform)); } RealizeFunction(methodFunction.brutalOutput, isTest); } else if (method == Method.Accuracy) { if (methodFunction.carefulFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(methodFunction.carefulFileNote, curOwner.GetTeam().transform)); } RealizeFunction(methodFunction.carefulOutput, isTest); } else if (method == Method.Diplomacy) { if (methodFunction.diplomatFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(methodFunction.diplomatFileNote, curOwner.GetTeam().transform)); } RealizeFunction(methodFunction.diplomatOutput, isTest); } else if (method == Method.Science) { if (methodFunction.scienceFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(methodFunction.scienceFileNote, curOwner.GetTeam().transform)); } RealizeFunction(methodFunction.scienceOutput, isTest); } } else { Debug.Log(string.Format("ChooseMethod start dialog"), methodFunction); UnityAction action = delegate { int index = methodFunction.dialog.GetEnds().IndexOf(methodFunction.dialog.end); if (methodFunction.dialogFileNotes[index] != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(methodFunction.dialogFileNotes[index], curOwner.GetTeam().transform)); } RealizeFunction(methodFunction.dialogOutputs[index], isTest); }; Dialog.DialogManager.GetInstantiate().StartDialog(methodFunction.dialog, curOwner.GetTeam(), ((iEffectsContainer)curOwner).GetQuest(), action); } } else if (function is ChooseTemperFunction) { ChooseTemperFunction temperFunction = (ChooseTemperFunction)function; if (temperFunction.dialog == null || !curOwner.GetTeam().GetLeader().IsObedient()) { Temper temper = temperFunction.Realize(curOwner); Debug.Log(string.Format("ChooseTemper - {0}", temper.ToString()), temperFunction); if (temper == Temper.RUDE) { if (temperFunction.rudeFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(temperFunction.rudeFileNote, curOwner.GetTeam().transform)); } RealizeFunction(temperFunction.rudeOutput, isTest); } else if (temper == Temper.PRUDENT) { if (temperFunction.prudentFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(temperFunction.prudentFileNote, curOwner.GetTeam().transform)); } RealizeFunction(temperFunction.prudentOutput, isTest); } else if (temper == Temper.MERCIFUL) { if (temperFunction.mercifulFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(temperFunction.mercifulFileNote, curOwner.GetTeam().transform)); } RealizeFunction(temperFunction.mercifulOutput, isTest); } else if (temper == Temper.CRUEL) { if (temperFunction.cruelFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(temperFunction.cruelFileNote, curOwner.GetTeam().transform)); } RealizeFunction(temperFunction.cruelOutput, isTest); } else if (temper == Temper.MERCANTILE) { if (temperFunction.mercantileFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(temperFunction.mercantileFileNote, curOwner.GetTeam().transform)); } RealizeFunction(temperFunction.mercantileOutput, isTest); } else if (temper == Temper.PRINCIPLED) { if (temperFunction.principledFileNote != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(temperFunction.principledFileNote, curOwner.GetTeam().transform)); } RealizeFunction(temperFunction.principledOutput, isTest); } } else { Debug.Log(string.Format("ChooseTemper start dialog"), temperFunction); UnityAction action = delegate { int index = temperFunction.dialog.GetEnds().IndexOf(temperFunction.dialog.end); temperFunction.LoyaltyInfluence(temperFunction.dialogTemper[index], curOwner); if (temperFunction.dialogFileNotes[index] != null) { curOwner.GetTeam().reportQuest.Add(((iEffectsContainer)curOwner).GetQuest()); curOwner.GetTeam().reportNotes.Add(FileNoteContainer.Create(temperFunction.dialogFileNotes[index], curOwner.GetTeam().transform)); } RealizeFunction(temperFunction.dialogOutputs[index], isTest); }; Dialog.DialogManager.GetInstantiate().StartDialog(temperFunction.dialog, curOwner.GetTeam(), ((iEffectsContainer)curOwner).GetQuest(), action); } } }