В данном уроке мы познакомимся с массивами переменных и научимся с ними работать.
Подстатья
11 157
5
В качестве динамических массивов можно использовать атрибутную систему. В движке атрибуты - это отдельный класс, напоминающий рекурсивный ассоциативный массив.
В данном уроке мы разберёмся как устроен менеджер событий в игре, а также связанные с ним функции.
Подстатья
4 158
26
nazarpunk, открыли недавно. Пацаны всем селом уже успели там многое перепилить, но основа на месте
30
avuremybe, хм, интересно, а исходники игры открыты или дизасемблированы?
26
nazarpunk, не похоже
uint32_t S_EVENTTAB::AddEventHandler(const char *event_name, uint32_t func_code, uint32_t func_segment_id, int32_t flag, bool bStatic)
{
    uint32_t i;

    const auto hash = MakeHashValue(event_name);

    const auto ti = HASH2INDEX(hash);

    for (uint32_t n = 0; n < Event_num[ti]; n++)
    {
        if (pTable[ti][n].hash == hash)
        {
            if (!storm::iEquals(event_name, pTable[ti][n].name))
                continue;
            // event already in list
            for (i = 0; i < pTable[ti][n].elements; i++)
            {
                // event handler function already set
                if (pTable[ti][n].pFuncInfo[i].func_code == func_code)
                {
                    /*if(pTable[ti][n].pFuncInfo[i].status == FSTATUS_DELETED)
                    {
                      trace("pTable[ti][n].pFuncInfo[i].status == FSTATUS_DELETED : %s",pTable[ti][n].name);
                    }*/
                    // return n;
                    pTable[ti][n].pFuncInfo[i].status = FSTATUS_NORMAL;

                    return (((ti << 24) & 0xff000000) | (n & 0xffffff));
                }
            }
            // add function
            i = pTable[ti][n].elements;
            pTable[ti][n].elements++;
            pTable[ti][n].pFuncInfo.resize(pTable[ti][n].elements);

            pTable[ti][n].pFuncInfo[i].func_code = func_code;
            pTable[ti][n].pFuncInfo[i].segment_id = func_segment_id;
            if (flag)
                pTable[ti][n].pFuncInfo[i].status = FSTATUS_NEW;
            else
                pTable[ti][n].pFuncInfo[i].status = FSTATUS_NORMAL;
            pTable[ti][n].pFuncInfo[i].bStatic = bStatic;
            // return n;
            return (((ti << 24) & 0xff000000) | (n & 0xffffff));
        }
    }

    // add new event
    if (Event_num[ti] >= Buffer_size[ti])
    {
        Buffer_size[ti] += BUFFER_BLOCK_SIZE;
        pTable[ti].resize(Buffer_size[ti]);
    }

    pTable[ti][Event_num[ti]].elements = 1;
    pTable[ti][Event_num[ti]].hash = hash;
    pTable[ti][Event_num[ti]].name = nullptr;

    pTable[ti][Event_num[ti]].pFuncInfo.push_back(EVENT_FUNC_INFO{});
    pTable[ti][Event_num[ti]].pFuncInfo[0].func_code = func_code;
    pTable[ti][Event_num[ti]].pFuncInfo[0].segment_id = func_segment_id;
    if (flag)
        pTable[ti][Event_num[ti]].pFuncInfo[0].status = FSTATUS_NEW;
    else
        pTable[ti][Event_num[ti]].pFuncInfo[0].status = FSTATUS_NORMAL;
    pTable[ti][Event_num[ti]].pFuncInfo[0].bStatic = bStatic;

    if constexpr (true) // bKeepName)
    {
        if (event_name)
        {
            const auto len = strlen(event_name) + 1;
            pTable[ti][Event_num[ti]].name = new char[len];
            memcpy(pTable[ti][Event_num[ti]].name, event_name, len);
        }
    }
    Event_num[ti]++;
    // return (Event_num[ti] - 1);
    return (((ti << 24) & 0xff000000) | ((Event_num[ti] - 1) & 0xffffff));
}
30
Одну и туже функцию можно несколько раз добавить каллбэком в одно и тоже событие.
Здесь собрана информация по всем необходимым инструментам для работы с кодом Корсаров
Подстатья
15 259
26
ScorpioT1000, хмм. Вот этого не знал.
Как дойдут руки поковырять Caribbean Legend - я ознакомлюсь. Они там пересобрали движок на MSVS19 и файлы скриптов все перевели в формат .b (это от вижуал бейсика, как я понял).
38
MS Visual Studio и Visual Studio Code (который я предлагаю) - совершенно противоположные по механикам продукты. Первая - огромная рабочая станция, вторая - супербыстрый опенсурс блокнот на максималках с маркетом расширений в сотни тысяч плагинов и для всех языков (даже для jass китайцы залили еще до назара). Это если бы IDE делали по практикам браузеров.

Я бы вскод юзал вообще для всех текстовых расширений и выкинул нп++, но там нет возможности для "открыть с помощью" открывать новое окно, а не вкладку)
А нет, вру, открывает. Зачем я юзаю нп++ тогда))
26
nazarpunk, проще np++ ничего нет.
Скорпи уже выражал недовольство по поводу моих олдскул-наклонностей))
Я обязательно запилю раздел с MSVS, но сейчас нет на это настроения.
Если есть желание помочь с этим - буду благодарен.
30
Странно, а почему блокнот? Там же обрезанные плюсы. Разве не проще что-то специализированное взять?
В ходе этого урока мы рассмотрим реализацию так называемых объектов, которые служат аналогом объектов класса в скриптовой части игры.
Подстатья
5 158
26
ScorpioT1000, мне бы для начала последние три статьи перевести на человеческий язык и дополнить реальными примерами.
А то они сейчас выглядят как документация, а не обучающий материал для новичка. 😅
За наводки большое спасибо, занесу это в таск-лист.