WeendVidente
offline
Опыт:
2,092Активность: |
[Нужна наработка] Диалоговая система
Нужна удобная система разветвленных диалогов, навроде той что можно увидеть в Baldur's Gate, Planescape Torment или Fallout 1/2.
Конкретно у меня уже кое-что есть, но это "кое-что" очень неудобно и громоздко, в итоге 90% сил идут на то, чтобы проследить соответствие id-реплики id-ответа. Я прошу либо систематизировать как-то то, что есть у меня (ниже один из двух диалогов написанный на данный момент), или сделать с нуля. Диалог с барменом » раскрыть Код:
Начинается диалог с использования способности на юнит, в зависимости от юнита переменной udg_dstate_i задается стартовое значение и выдается первая реплика. Написав таким(^) образом два диалога пропало всякое желание что-то делать дальше, пытался и сам какую-то системку замутить, но толком ничего не вышло, даже не знаю откуда браться за это. //Ах да, идея взята из Дюны Отредактировано WeendVidente, 07.07.2013 в 22:11. |
07.07.2013, 21:29 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
WeendVidente:
Свой двиг не дам, лень саппортингом заниматься, по этому могу только посоветовать заюзать систему Clamp 'a, он делал. Правда я не помню, можно ли у него реализовать разветвление... Собсно делать тебе систему эту точно никто не будет, нормальных наработок в паблике вроде как нету в принципе. |
07.07.2013, 22:00 | #2
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
WeendVidente
offline
Опыт:
2,092Активность: |
Цитата:
Знаю, искал. WeendVidente добавил: Цитата:
Нашел только для СтарКрафта |
||
07.07.2013, 22:10 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
WeendVidente, в лс ему напиши, точно где то была. |
07.07.2013, 22:36 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Nerevar
I'll be back!
offline
Опыт:
18,352Активность: |
единственное что могу посоветовать - найти закономерность и попытаться описаться наиболее общими параметрами,а ля
в данном случае 4 и 5 ответ не выводятся,так как не предусмотрены и это учтено в переменной-счетчике
ну и если не нужны некоторые поля - не инициализировать их короче думай |
07.07.2013, 22:38 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
» неудержалсо
|
07.07.2013, 22:52 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
WeendVidente, по сабжу, рекомендую отказаться от этой затеи с разветвленными диалогами. Во первых систему такую не найдете. Во вторых реализовать потенциал такой системы крайне сложно. В третьих подобная разработка займет уйму времени, у варкрафта этого времени нету. |
08.07.2013, 15:28 | #7
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,258Активность: |
Faion:
Взаимоисключающие, но я и правда делал, и даже с ветвлением. Ну, я могу слить. В таком случае я гений. 200 строк система и демонстрационный диалог. Clamp добавил:
((кат Система древовидных диалогов с регистрацией события ответа
((кат DialogsInclude
((код cJass
library DialogsInclude
{ int DL_Id = 1 айди отображаемого в данный момент диалога string array DL_Text [1000] текст в диалоге string array DL_Answer [1000][10] варианты ответов по порядку int array DL_Action [1000][10] айди ФУНКЦИИ ДЕЙСТВИЯ (НЕ ДИАЛОГА), которая вызывается при выборе ответа int array DL_AnsNum [1000] количество ответов на диалог int DL_MaxSelectedString = 1 максимальная выделенная строка (для перехода через верх/низ)
int DL_SelectedString = 1 текщая выделенная строка bool DL_InDialog = false индикатор активного диалога
} )) )) ((кат DialogsCore
((код cJass
library DialogsCore initializer DialogsCoreInit uses DialogsInclude
{ void DL_RefreshScreen() { int i = 1 if(DL_InDialog==true) { ClearTextMessages() DisplayTimedTextToPlayer(Player(0),0,0,999, DL_Text[DL_Id]) DisplayTimedTextToPlayer(Player(0),0,0,999, " ") loop { if(i == DL_SelectedString) { DisplayTimedTextToPlayer(Player(0),0,0,999, CGold(DL_Answer[DL_Id][i])) } else { DisplayTimedTextToPlayer(Player(0),0,0,999, CBrown(DL_Answer[DL_Id][i])) } exitwhen i == DL_AnsNum[DL_Id] i++ } } } private void PressDOWN()
{ if(DL_InDialog==true) { if(DL_SelectedString + 1 <= DL_MaxSelectedString) { DL_SelectedString++ } else { DL_SelectedString = 1 } DL_RefreshScreen() } } private void PressUP()
{ if(DL_InDialog==true) { if(DL_SelectedString - 1 >= 1) { DL_SelectedString-- } else { DL_SelectedString = DL_MaxSelectedString } DL_RefreshScreen() } } private void PressOK()
{ if(DL_InDialog==true) { int NewId = DL_Action[DL_Id][DL_SelectedString] ExecuteFunc("DialogsAction_"+I2S(NewId)) DL_MaxSelectedString = DL_AnsNum[NewId] DL_SelectedString = 1 DL_RefreshScreen() } } private void DialogsCoreInit()
{ DL_MaxSelectedString = DL_AnsNum[1] trigger trig = CreateTrigger() TriggerRegisterPlayerEvent(trig,Player(0),EVENT_PLAYER_ARROW_DOWN_DOWN) TriggerAddAction(trig,function PressDOWN) trig = CreateTrigger() TriggerRegisterPlayerEvent(trig,Player(0),EVENT_PLAYER_ARROW_UP_DOWN) TriggerAddAction(trig,function PressUP) trig = CreateTrigger() TriggerRegisterPlayerEvent(trig,Player(0),EVENT_PLAYER_ARROW_RIGHT_DOWN) TriggerAddAction(trig,function PressOK) trig = null } } )) )) ((кат DialogsActions
((код cJass
library DialogsActions uses DialogsInclude, DialogsCore, Logs
{ void DialogsAction_2() { AddLog(CGold(PlayerName) + " uses " + CGold("Magic receiver")) DL_Id = 2 DL_RefreshScreen() } void DialogsAction_3() { DL_Id = 3 DL_RefreshScreen() } void DialogsAction_4() { DL_Id = 4 DL_RefreshScreen() } void DialogsAction_5() { DL_InDialog= false ClearTextMessages() } } )) )) ((кат DialogsIntro
((код cJass
library DialogsIntro init Init uses DialogsInclude, Print
{ private void DialogsTexts() { DL_Text[1] = CGray("You can use current answer by pressing right arrow.\n")+"Your "+CBlue("magic receiver")+" find emergency message." DL_Answer[1][1] = "Take a message" DL_Action[1][1] = 2 DL_AnsNum[1] = 1 DL_Text[2] = CGreen("Unknown")+": somebody, help us! "+CRed("cough")+" We stuck in old granary in the north of the city..."
DL_Answer[2][1] = "Continue" DL_Action[2][1] = 3 DL_AnsNum[2] = 1 DL_Text[3] = CGreen("Unknown")+": there are a lot of people uninfected by "+CRed("*hard cough*")+" plague..."
DL_Answer[3][1] = "Continue" DL_Action[3][1] = 4 DL_AnsNum[3] = 1 DL_Text[4] = CGray("You can choose answer by pressing up/down arrows.\n")+CGreen("Unknown")+": our clean water supplies will be enough for a couple of hours, and then...\n"+CGray("End of transmission.")
DL_Answer[4][1] = "Switch off receiver" DL_Answer[4][2] = "Repeat" DL_Action[4][1] = 5 DL_Action[4][2] = 2 DL_AnsNum[4] = 2 } private void Init()
{ DialogsTexts() } } )) )) )) Clamp добавил: В DialogsCore можно вставить любой метод отображения текстов, от обычных диалогов до супер-пупер-буковки-картинки. Отредактировано Clamp, 12.07.2013 в 20:18. |
12.07.2013, 20:10 | #8
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|