// тоже самое в пошаговом режиме, предусматривается возможность обратного запуска из обработчика дисплея // чтобы не делать рекурсивный Talk // по сути уже не нужно private void StepDialogue(Dialogue d, int startphrase, int choice, Action onComplete) { Person[] P = { d.Pers1, d.Pers2 }; Phrase ph; int i = startphrase; if (i < d.count) { if ((ph = d.D_GetPhrase(i, choice)) != null) { if (ph.IsChoice()) { AskMain(q2(i + 1) ? P[0] : P[1], ph.Ph_GetChoice(), startphrase, d, onComplete); return; } else { Talk(q2(i + 1) ? P[0] : P[1], ph.Ph_GetReplika(MainStory)); } // if (ph.IsFinal ()) // break; } } FinishDialogue(onComplete); }
private void SetAct(Dialogue d, int pN, Action a1, Action a2) { d.D_GetPhrase(pN).Ph_InitAct(a1, a2); }
// запуск диалога; пихаем все строчки 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); }