// запуск диалога; пихаем все строчки Talk сразу, а потом вызываем корутину // с выбором ответа обрываем исполнение, чтобы продолжить после вызова из менюшки // делал на скорую, может, нужно переделать, но вроде работает... private void StartLinearDialogue(Dialogue d, int startphrase, Action onComplete) { Phrase ph; string replika; string[] choice; int i = startphrase, j, link, result; Person[] P = { d.Pers1, d.Pers2 }; Person Pers = P[1]; while (i < d.count) { link = 0; if ((ph = d.D_GetPhrase(i)) != null) { if (ph.Actor != null) { Pers = ph.Actor; } if ((replika = ph.Ph_GetReplika(MainStory)) != null) { //Debug.Log ("это фраза из " + ph.Replika.Count + " реплик"); result = ph.Ph_GetResult(MainStory); Talk(Pers, replika); } else if ((choice = ph.Ph_GetChoice()) != null) { //Debug.Log ("это вопрос из " + choice.Length + " пунктов"); AskMain(Pers, choice, i, d, onComplete); return; } else if ((link = ph.Ph_GetDecision(MainStory)) != 0) { //Debug.Log ("это выбор"); i = link; result = ph.Ph_GetResult(MainStory); } if (ph.IsFinal()) { //Debug.Log ("это конец беседы"); break; } } if (link == 0) // если не десижн, то смотрим переход по схеме диалога { if ((j = d.D_GetLink(i, 0)) > 0) { i = j; } else { i++; } } } //Debug.Log ("Аудиенция окончена"); // снимаем флаг аудиенции с персонажа P[1].Dismiss(); FinishDialogue(onComplete); }
public override sealed void StartDialogue(Dialogue d, Action onComplete) { StartLinearDialogue(d, 0, onComplete); }