В этом уроке мы рассмотрим доступные в скриптах типы данных и как с ними работать.
Подстатья
20 219
30
avuremybe, в плюсах такое же поведение:
int main()
{
    
    int a = 0;
    std::cout<< (a == true) << (a == false) << (a ? 1 : 0) << "\n"; // 010
    
    int b = 1;
    std::cout<< (b == true) << (b == false) << (b ? 1 : 0) << "\n"; // 101
    
    int c = 2;
    std::cout<< (c == true) << (c == false) << (c ? 1 : 0) << "\n"; // 001
    
    int d = -2;
    std::cout<< (d == true) << (d == false) << (d ? 1 : 0) << "\n"; // 001

    return 0;
}
24
nazarpunk, совместно с Rasarak удалось разгадать тайну работы bool в этой шайтан-машине:
int a;

if (a == true) {}	// при таком обращении 1 возвращает true, а все остальные числа - false
if (a) {}			// а при таком - 0 возвращает false, a все остальные числа true
24
Вышла новая версия! Прокрутить к ресурсу
Добавлено описание следующих нюансов:
  • Уточнение принимаемых значений bool, если передавать в него числа.
  • Передача float в bool.
  • Прямое присвоение float строке.
  • Особенности работы string.
На этом уроке мы рассмотрим операторы условного ветвления if/else и switch
Подстатья
18 156
24
Вышла новая версия! Прокрутить к ресурсу
Внесены подсказанные Rosarak правки:
  • особенности ветвлений else if вне интерфейсов
  • выполнение кода оператором switch вне конструкций case-break
  • альтернатива лейблу default для последних версий Storm Engine
  • третий вариант обхода ограничения на логические И и ИЛИ в одном выражении
В ходе этого урока мы рассмотрим реализацию так называемых объектов, которые служат аналогом объектов класса в скриптовой части игры.
Подстатья
5 128
24
Вышла новая версия! Прокрутить к ресурсу
  • Добавлен раздел, описывающий функции для работы с атрибутами объекта.
позже будет добавлен раздел практических примеров работы с объектами
В данном уроке мы познакомимся с массивами переменных и научимся с ними работать.
Подстатья
11 125
24
Rosarak, мысль интересная.
Для ситуаций, когда очень нужно и без этого никак - вполне себе решение.
5
В качестве динамических массивов можно использовать атрибутную систему. В движке атрибуты - это отдельный класс, напоминающий рекурсивный ассоциативный массив.
В данном уроке мы разберёмся как устроен менеджер событий в игре, а также связанные с ним функции.
Подстатья
4 105
24
nazarpunk, открыли недавно. Пацаны всем селом уже успели там многое перепилить, но основа на месте
30
avuremybe, хм, интересно, а исходники игры открыты или дизасемблированы?
24
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));
}