XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
WeendVidente

offline
Опыт: 2,092
Активность:
[Нужна наработка] Диалоговая система
Нужна удобная система разветвленных диалогов, навроде той что можно увидеть в Baldur's Gate, Planescape Torment или Fallout 1/2.
Конкретно у меня уже кое-что есть, но это "кое-что" очень неудобно и громоздко, в итоге 90% сил идут на то, чтобы проследить соответствие id-реплики id-ответа.
Я прошу либо систематизировать как-то то, что есть у меня (ниже один из двух диалогов написанный на данный момент), или сделать с нуля.

Диалог с барменом
» раскрыть
Код:
function Trig_GGBarmen_Actions takes nothing returns nothing
if GetUnitTypeId(GetTriggerUnit()) == 'H010' then  //Главный герой
local unit u = udg_hero[GetPlayerId(GetTriggerPlayer())+1] //Главный герой

    if udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] == 11 then //первая единица означает локацию, вторая единица - NPC на этой локации. Исключительно для коддера
        if GetSpellAbilityId() == 'A00S' then //Q - 'Я хочу снять комнату.'
            if (GetRectMinX(gg_rct_KlamGGRoom) <= GetUnitX(gg_unit_h011_0009)) and (GetUnitX(gg_unit_h011_0009) <= GetRectMaxX(gg_rct_KlamGGRoom)) and (GetRectMinY(gg_rct_KlamGGRoom) <= GetUnitY(gg_unit_h011_0009)) and (GetUnitY(gg_unit_h011_0009) <= GetRectMaxY(gg_rct_KlamGGRoom)) == true //Проверяем наличие наркомана в комнате
                call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Сожалею, грязнуля, но свободных нет. Взамен есть один кекс, который изрядно мне надоел - разберись с ним и сможешь снять его комнату.")
                call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'А почему сам не сделаешь этого?'")
                call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'По рукам.'")
                set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 111 //Переменная отвечает за состояние диалога, в совокупности с использованием способностей-вариантов ответа возвращает нужные реплики
                call SaveInteger(udg_hash, GetHandleId(u), StringHash("QGGNark"), 1) //Узнал о наркомане
            else
                call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1]) //Конец диалога
                call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Двадцатка и можещь дрыхнуть.")
                call SaveInteger(udg_hash, GetHandleId(u), StringHash("QGGNark"), 0) //Пробдема с наркоманом решена
            endif
        elseif GetSpellAbilityId() == 'A00T' then //W - 'Что есть выпить?'
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Выпивка.")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'Юморист?'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'Ха-ха!'")
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 112
        elseif GetSpellAbilityId() == 'A00O' then //E - 'Расскажи о городе.'
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Город как город... Живем земледелием, трапперством, а лично я еще и самогоном. В целом, если верить слухам, то Кламат - один их самых спокойных городов в пустоши, но сам я отсюда уже давно не выезжал, так что ручаться не буду.")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'Ну с инфраструктурой все ясно, а как насчет развлечений?'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'Есть здесь у вас чем заняться хорошим людям?'")
            if LoadInteger(udg_hash, GetHandleId(u), StringHash("RGGBarM")) == 0 //Была ли изменена репутация в ходе этого диалога
                call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "E -  'Мда, та еще дыра...'") // -репутации
                call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "R -  'Похоже хорошее место.'") // +репутации
            endif
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 113
        endif
//==========================================================================            
    elseif udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] == 111 then
        if GetSpellAbilityId() == 'A00S' then //Q -  'А почему сам не сделаешь этого?'
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Это твой шанс показать себя, разве этого не достаточно?.")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'Да, ты прав.'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'Нет.'")
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 1111
        elseif GetSpellAbilityId() == 'A00T' then //W -  'По рукам.'
            call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1])
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 5, "Он в дальне комнате слева.")
        endif
//==========================================================================            
    elseif udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] == 1111 then
        if GetSpellAbilityId() == 'A00S' then //Q -  'Да, ты прав.'
            call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1])
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 5, "Он в дальне комнате слева.")
        elseif GetSpellAbilityId() == 'A00T' then //W -  'Нет.'
            call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1])
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 5, "Ну и спи на улице.")
        endif
//==========================================================================            
    elseif udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] == 112 then
        if GetSpellAbilityId() == 'A00S' then //Q -  'Юморист?'
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "А что-то не нравиться?")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'Да, пересохшее горло.'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'Нет.'")
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 1121
        elseif GetSpellAbilityId() == 'A00T' then //W -  'Ха-ха!'
            call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1])
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 5, "Держи, за счет заведения.")
        endif
//==========================================================================            
    elseif udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] == 1121 then
        if GetSpellAbilityId() == 'A00S' then //Q -  'Да, пересохшее горло.'
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Есть отвратное пиво за пятерку, а есть 'что-то покрепче', но за семь.")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  ''Отвратное' - хорошее название...'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'Расскажи про 'что-то покрепче' - заинтриговал!'")
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 111211
        elseif GetSpellAbilityId() == 'A00T' then //W -  'Нет.'
            call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1])
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 5, "Вот и хорошо.")
        endif
//==========================================================================            
    elseif udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] == 11211 then
        if GetSpellAbilityId() == 'A00S' then //Q -  ''Отвратное' - хорошее название...'
//            call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1])
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Что еще?.")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'Я хочу снять комнату.'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'Что есть выпить?'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "E -  'Расскажи о городе.'")
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 11
        elseif GetSpellAbilityId() == 'A00T' then //W -  'Расскажи про 'что-то покрепче' - заинтриговал!'
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Видишь аппарат в углу? Мой шедевр алокпромышленной мысли. Гоню и разливаю прямо здесь, на глазах у клиентов, чтобы все видели, что Сайог ничего не подмешивает, да.")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'Черт... Это круто!'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'М-м, а были прецеденты?'")
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 112112
        endif
//==========================================================================            
    elseif udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] == 112112 then
        if GetSpellAbilityId() == 'A00S' then //Q -  'Черт... Это круто!'
            call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1])
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 5, "Да, мужик...")
        elseif GetSpellAbilityId() == 'A00T' then //W -  'М-м, а были прецеденты?'
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Кто-кто? Нет, мужик, ты чего? У меня чистая выпивка, и нет в ней, да и небыло никогда, никаких прецедентов! Хорош мне тут клиентов распугивать.")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'Ок.'")
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 1121121
        endif
//==========================================================================            
    elseif udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] == 1121121 then
        if GetSpellAbilityId() == 'A00S' then //Q -  'Ок.'
            call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1])
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 5, "...")
        endif
//==========================================================================            
    elseif udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] == 113 then
        if GetSpellAbilityId() == 'A00S' then //Q -  'Ну с инфраструктурой все ясно, а как насчет развлечений?'
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Золотой Гекко - местная столица развлечений, дальше по улице мясная лавка Дантонов - не самое веселое место, а еще дальше расположена баня, с 'особыми' услугами, ну ты понимаешь... А немного южнее ты найдешь магазинчик Бакнеров. В целом все.")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'Ну с инфраструктурой все ясно, а как насчет развлечений?'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'Есть здесь у вас чем заняться хорошим людям?'")
            if LoadInteger(udg_hash, GetHandleId(u), StringHash("RGGBarM")) == 0
                call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "E -  'Мда, та еще дыра...'")
                call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "R -  'Похоже хорошее место.'")
            endif
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 113
        elseif GetSpellAbilityId() == 'A00T' then //W -  'Есть здесь у вас чем заняться хорошим людям?'
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Для хорошим людям в Кламате всегда место найдеться. Если встретищь таких - дай им знать об этом, ха-ха! Да ладно, шучу я. Сходи к Бакнерам - совет.")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'Ну с инфраструктурой все ясно, а как насчет развлечений?'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'Есть здесь у вас чем заняться хорошим людям?'")
            if LoadInteger(udg_hash, GetHandleId(u), StringHash("RGGBarM")) == 0
                call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "E -  'Мда, та еще дыра...'")
                call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "R -  'Похоже хорошее место.'")
            endif
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 113
        elseif GetSpellAbilityId() == 'A00O' then //E -  'Мда, та еще дыра...'
            call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1])
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 5, "Ну и вали отсюда в таком случае!..")
            call SaveInteger(udg_hash, GetHandleId(u), StringHash("RGGBarM"), -1)
            call SaveInteger(udg_hash, GetHandleId(u), StringHash("RepKlam"), LoadInteger(udg_hash, GetHandleId(u), StringHash("RepKlam"))-5)//RepKlam - это репутация в этом городе
        elseif GetSpellAbilityId() == 'A00V' then //R -  'Похоже хорошее место.'
            call de(u, udg_dlg[GetPlayerId(GetTriggerPlayer())+1])
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 5, "Не супер, но мне нравится.")
            call SaveInteger(udg_hash, GetHandleId(u), StringHash("RGGBarM"), 1)
            call SaveInteger(udg_hash, GetHandleId(u), StringHash("RepKlam"), LoadInteger(udg_hash, GetHandleId(u), StringHash("RepKlam"))+5) //RepKlam - это репутация в этом городе
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "Q -  'Ну с инфраструктурой все ясно, а как насчет развлечений?'")
            call DisplayTimedTextToPlayer( GetTriggerPlayer(), 0, 0, 999, "W -  'Есть здесь у вас чем заняться хорошим людям?'")
            set udg_dstate_i[GetPlayerId(GetTriggerPlayer())+1] = 113
        endif
//==========================================================================            

    endif
set u = null
endif
endfunction

//===========================================================================
function InitTrig_KlamBarmen takes nothing returns nothing
    set gg_trg_KlamBarmen = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_KlamBarmen, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( gg_trg_KlamBarmen, function Trig_GGBarmen_Actions )
endfunction



Начинается диалог с использования способности на юнит, в зависимости от юнита переменной udg_dstate_i задается стартовое значение и выдается первая реплика.

Написав таким(^) образом два диалога пропало всякое желание что-то делать дальше, пытался и сам какую-то системку замутить, но толком ничего не вышло, даже не знаю откуда браться за это.

//Ах да, идея взята из Дюны

Отредактировано WeendVidente, 07.07.2013 в 22:11.
Старый 07.07.2013, 21:29
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
WeendVidente:
Нужна удобная система разветвленных диалогов,
Свой двиг не дам, лень саппортингом заниматься, по этому могу только посоветовать заюзать систему Clamp 'a, он делал. Правда я не помню, можно ли у него реализовать разветвление...
Собсно делать тебе систему эту точно никто не будет, нормальных наработок в паблике вроде как нету в принципе.
Старый 07.07.2013, 22:00
WeendVidente

offline
Опыт: 2,092
Активность:
Цитата:
нормальных наработок в паблике вроде как нету в принципе.

Знаю, искал.

WeendVidente добавил:
Цитата:
могу только посоветовать заюзать систему Clamp 'a, он делал

Нашел только для СтарКрафта
Старый 07.07.2013, 22:10
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
WeendVidente, в лс ему напиши, точно где то была.
Старый 07.07.2013, 22:36
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
единственное что могу посоветовать - найти закономерность и попытаться описаться наиболее общими параметрами,а ля
string quest_name[0]="bla bla bla"
integer quest_ability[0]='A000'
string quest_question[0]="ты куда дел мои трусы?"
integer quest_answer_count[0]=3
string quest_answer_0[0]="я не брал!"
string quest_answer_1[0]="они на тебе!"
string quest_answer_2[0]="превед медвед!"
string quest_answer_3[0]=""
string quest_answer_4[0]=""
в данном случае 4 и 5 ответ не выводятся,так как не предусмотрены и это учтено в переменной-счетчике
ну и если не нужны некоторые поля - не инициализировать их
короче думай
Старый 07.07.2013, 22:38
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
» неудержалсо
scope Quest1
{   
    #include "QuestModel.j"
    
    #define private <Action1()> =
    {
        if(GetRandomInt(0,1) == 1)
        {
            Answer = "Прости прости, я просто пошутил, вот твои деньги"; GoldAdd(Value); 
            Value = 0;
            Value1 = 0;
            Value2 = 0;
            SetQuestCompleted();
        }
        else
        { 
            Answer = "Чего ты сказал?! А ну проваливай отсюда!"; 
            int id = QuestMobs_Spawn('hfoo', 3, 0.0, 0.0, 0, 350 , onANY, 60.0);
            onComplete(id, 1, 6, "Победа", true);
        } 
    }
    
    StartQuest
        QuestInitData
        {
            // параметры квеста
            Id = 7
            IsSingle = false;
            IsRepeated = false;
            Name = "Джан-Кен-Пон";
            Description = "Эй! Не желаешь сыграть в \"Камень-Ножницы-Бумага\" на деньги?"
            Reputation = -1;
            Rang = -1;
            Clan = -1;
            AllyClanId = -1;
            EnemyClanId = -1;
            // параметры для настройки цепочки квестов
            ConditionQuestId = -1 ;
            CheckAll = false;
            ConditionStatus = -1;
            // сопутствующий квест
            AttendantQuestId = 0;
            AttendantQuestInfo = "";
            // квест противостояния
            ContrQuestId = 0;
            ContrQuestInfo = ""
            // награда
            ItemReward = 'belv'
            ExpAutoscore = false;
            Exp = 500
            MoneyAutoscore = false;
            Money = 0
            // участники
            NpcMembersId[1] = 21;
        }
                
        // если ведется диалог нпц c id = 1
        IsNpcIdAndStage(21,1)
        {
            // предложение сыграть
            IsDialogStage(1)
            {
                if (PlayerGold > 0)
                {
                    TReplic("Да", "Хм, а давай, почему бы и нет", "Отлично! Сколько желаешь поставить на кон?", SetQuestInProgress(); ToDialog(2););
                }
                TReplic("Нет", "Мне это не интересно", "Жаль", Exit(););
                TQuestInfo("Узнать правила", "Расскажи о правилах", "Игроки считают вместе вслух «Камень… Ножницы… Бумага… Раз… Два… Три» В общем обычная игра. Побеждает тот кто больше раз выйграет из 3х попыток. Ничьи не считаются.");
            }
            
            // ставка
            IsDialogStage(2)
            {
                Hint = "Сделайте вашу ставку";
                if (PlayerGold >= 100)
                {
                    TReplic("Поставить 100 рё", "Я ставлю 100 рё", "Хорошо, ставка принята, поехали!", Value = 100; GoldRemove(100); ToDialog(3));
                }
                if (PlayerGold >= 500)
                {
                    TReplic("Поставить 500 рё", "Я ставлю 500 рё", "Хорошо, ставка принята, поехали!", Value = 500; GoldRemove(500); ToDialog(3));
                }
                if (PlayerGold >= 1000)
                {
                    TReplic("Поставить 1000 рё", "Я ставлю 1000 рё", "Хорошо, ставка принята, поехали!", Value = 1000; GoldRemove(1000); ToDialog(3));
                }
            }
            
            // игра
            IsDialogStage(3)
            {
                Hint = "«Камень… Ножницы… Бумага… Раз… Два… Три»";
                int rnd = GetRandomInt(0,2)
                string array vars; vars[0] = "Камень"; vars[1] = "Ножницы"; vars[2] = "Бумага"
                TReplic("Камень", "*Вы выбрали Камень*", "*Выбрал " + vars[rnd] + "*",
                    Counter++; if(rnd == 1) {SystemMsg = "«Камень затупляет или ломает ножницы» Вы выйграли!"; Counter1++;} elseif (rnd == 2){ SystemMsg = "«Бумага накрывает или заворачивает камень» Вы проиграли!"; Counter2++;} else { SystemMsg = "Ничья!";Counter--;}  
                );
                TReplic("Ножницы", "*Вы выбрали Ножницы*", "*Выбрал " + vars[rnd] + "*", 
                    Counter++; if(rnd == 2){SystemMsg = "«Ножницы разрезают бумагу» Вы выйграли!"; Counter1++;} elseif (rnd == 0) { SystemMsg = "«Камень затупляет или ломает ножницы» Вы проиграли!"; Counter2++; } else { SystemMsg = "Ничья!"; Counter--;}  
                );
                TReplic("Бумага", "*Вы выбрали Бумагу*", "*Выбрал " + vars[rnd] + "*",
                    Counter++; if(rnd == 0){SystemMsg = "«Бумага накрывает или заворачивает камень» Вы выйграли!"; Counter1++;} elseif (rnd == 1) { SystemMsg = "«Ножницы разрезают бумагу» Вы проиграли!"; Counter2++; } else { SystemMsg = "Ничья!"; Counter--;}  
                );

                if(Counter == 3) 
                {
                    if(Counter1 > Counter2)
                    {
                        SystemMsg = "Вы выйграли в игре!"
                        ToDialog(4);
                    }
                    else
                    {   
                        SystemMsg = "Вы проиграли в игре!"
                        ToDialog(5);
                    } 
                    Counter = 0;
                    Counter1 = 0;
                    Counter2 = 0;
                }
            }
            
            // победный диалог
            IsDialogStage(4)
            {
                TReplic("Забрать награду", "Я победил, давай мой выйгрышь", "Вот ваша награда. Поздравляю", GoldAdd(Value*2);Value =0; SetQuestCompleted(););
            }
            
            // проигрышный диалог диалог
            IsDialogStage(5)
            {
                TReplic("Сыграть еще раз", "Пожалуй я попробую сыграть еще раз", "Отличный настрой, тогда сыграем еще раз!", ToDialog(2););
                TReplic("Обвинить в жульничестве", "Ты меня обманул! Я уверен! Верни мои деньги жулик!", "", Action1(); );
            }
            
            IsDialogStage(6)
            {
                TReplic("Требовать деньги", "Я победил, давай мой выйгрышь", "Вот ваша награда. Поздравляю", GoldAdd(Value*2);Value =0; SetQuestCompleted(););
            }
            
            ToQuestList();
            ExitButton();
        }
        
    EndQuest
}
Старый 07.07.2013, 22:52
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
WeendVidente, по сабжу, рекомендую отказаться от этой затеи с разветвленными диалогами.
Во первых систему такую не найдете.
Во вторых реализовать потенциал такой системы крайне сложно.
В третьих подобная разработка займет уйму времени, у варкрафта этого времени нету.
Старый 08.07.2013, 15:28
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Faion:
могу только посоветовать заюзать систему Clamp 'a
нормальных наработок в паблике вроде как нету в принципе.
Взаимоисключающие, но я и правда делал, и даже с ветвлением.
Во первых, систему такую не найдете.
Ну, я могу слить.
Во вторых, реализовать потенциал такой системы крайне сложно.
В таком случае я гений.
В третьих, подобная разработка займет уйму времени, у варкрафта этого времени нету.
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
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 02:16.