Диалоговая система

Добавлен , опубликован
По старой доброй традиции сначала — код, потом — комментарии.

Используемые дефайны и переменные:
define
{
    void = nothing
    bool = boolean
    int = integer
    init = initializer
}


int Id = 1
string array    Text    [1000]
string array    Answer  [1000][10]
int    array    Action  [1000][10]
int    array    AnsNum  [1000]


int MaxSelectedString = 1
int SelectedString = 1

string SelectedTextColor = "|cffffa500"
string UnselectedTextColor = "|cff8b4513"
Сама система
library DialogsCore init DialogsCoreInit uses Dialogs
{
    void RefreshScreen()
    {
        int i = 1
        ClearTextMessages()
        DisplayTextToPlayer(Player(0),0,0, Text[Id])
        loop
        {
            if(i == SelectedString)
            {
                DisplayTextToPlayer(Player(0),0,0, SelectedTextColor + Answer[Id][i])
            }
            else
            {
                DisplayTextToPlayer(Player(0),0,0, UnselectedTextColor + Answer[Id][i])
            }
            exitwhen i == AnsNum[Id]
            i++
        }
    }
    
    void PressDOWN()
    {
        if(SelectedString + 1 <= MaxSelectedString)
        {
            SelectedString++
        }
        else
        {
            SelectedString = 1
        }
        RefreshScreen()
    }
    
    void PressUP()
    {
        if(SelectedString - 1 >= 1)
        {
            SelectedString--
        }
        else
        {
            SelectedString = MaxSelectedString
        }
        RefreshScreen()
    }
    
    void PressOK()
    {
        int i = 1
        Id = Action[Id][SelectedString]
        MaxSelectedString = AnsNum[Id]
        SelectedString = 1
        RefreshScreen()
    }
    
    void DialogsCoreInit()
    {
        MaxSelectedString = 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
        RefreshScreen()
    }
}
Пример использования системы (теперь с комментариями!)
library Dialogs init DialogsInit
{
    void DialogsMainTexts()
    {
        int Used = 4    //использованные диалоги (просто для удобства)
        
        //первый индекс - айди диалога
        Text[1] = "No1"    //заголовок текущего диалога a.k.a. речь NPC
        Answer[1][1] = "Go to 2"    //вариант ответа #1
        Answer[1][2] = "Go to 3"    //вариант ответа #2
        Answer[1][3] = "Go to 4"    //вариант ответа #3
        Action[1][1] = 2    //айди вызываемого первым ответом диалога
        Action[1][2] = 3    //айди вызываемого вторым ответом диалога
        Action[1][3] = 4    //айди вызываемого третьим ответом диалога
        AnsNum[1] = 3    //количество ответов в ветке
        
        Text[2] = "No2"
        Answer[2][1] = "Go to 1"
        Answer[2][2] = "Go to 2"
        Answer[2][3] = "Go to 3"
        Answer[2][4] = "Go to 4"
        Action[2][1] = 1
        Action[2][2] = 2
        Action[2][3] = 3
        Action[2][4] = 4
        AnsNum[2] = 4

        Text[3] = "No3"
        Answer[3][1] = "Go to 1"
        Answer[3][2] = "Go to 2"
        Action[3][1] = 1
        Action[3][2] = 2
        AnsNum[3] = 2

        Text[4] = "No4"
        Answer[4][1] = "Go to 1"
        Answer[4][2] = "Go to 2"
        Answer[4][3] = "Go to 3"
        Action[4][1] = 1
        Action[4][2] = 2
        Action[4][3] = 3
        AnsNum[4] = 3
    }

    void DialogsInit()
    {
        DialogsMainTexts()
        //тут можно разбивать по функциям разные ветви диалога, например
    }
}

Суть невероятно проста: скачем по массивам через прямую адресацию.
Плюсы ищите сами, а минус один — нельзя влепить еще какие-нибудь действия, кроме открытия новой ветви диалога.

Не более 10 ответов.
Не более 255 символов на высказывание NPC/пункт меню/ответ.
Не более 1000 диалогов.
`
ОЖИДАНИЕ РЕКЛАМЫ...