Files
SergObsidian/PERSONAL PROJECTS/P2EP/pseudoCode/FUN_80011f2c InitInterfaceManager.md
2025-04-20 00:05:45 +05:00

3.1 KiB
Raw Blame History

#include <libgte.h>
#include <libgpu.h>

/* Структура данных интерфейса */
typedef struct {
    int max_elements;         // Максимальное количество элементов (param_2)
    int version_flag;         // Флаг версии (инициализируется 1)
    int element_size;         // Размер элемента (0x15 слов)
    void* render_callback;    // Функция рендеринга (LAB_8001399c)
    int* element_array;       // Массив элементов
    int* texture_data;        // Данные текстур (param_3)
    int* palette_data;        // Данные палитры (param_4)
} InterfaceManager;

/* Глобальный указатель на менеджер */
InterfaceManager* g_InterfaceMgr = (InterfaceManager*)0x8007CB34;

/* Инициализация менеджера интерфейса */
void InitInterfaceManager(int* manager_ptr, int max_elements, int texture_data, int palette_data) 
{
    /* Инициализация базовых полей */
    g_InterfaceMgr = (InterfaceManager*)manager_ptr;
    g_InterfaceMgr->max_elements = max_elements;
    g_InterfaceMgr->version_flag = 1;
    
    /* Вызов внутренней функции инициализации */
    InitInterfaceInternal();
    
    /* Инициализация элементов */
    for(int i = 0; i < max_elements; i++) {
        InterfaceElement* elem = GetInterfaceElement(i);
        elem->index = i;
        elem->state = 0xFFFF; // Изначально неактивен
    }
    
    /* Обработка графических данных */
    if(texture_data != 0) {
        g_InterfaceMgr->texture_data = (int*)texture_data;
        g_InterfaceMgr->palette_data = (int*)(texture_data + palette_data * 4);
        
        for(int i = 0; i < max_elements; i++) {
            InterfaceElement* elem = GetInterfaceElement(i);
            elem->texture_ptr = texture_data;
            elem->palette_ptr = texture_data + palette_data * 4;
        }
    } else {
        /* Режим без текстур */
        for(int i = 0; i < max_elements; i++) {
            InterfaceElement* elem = GetInterfaceElement(i);
            elem->flags |= 0x1000; // Устанавливаем флаг "без текстуры"
        }
    }
    
    /* Инициализация callback-функции */
    g_InterfaceMgr->render_callback = &DefaultRenderCallback;
    
    /* Сброс дополнительных параметров */
    for(int i = 0; i < 4; i++) {
        g_InterfaceMgr->unused_params[i] = 0;
    }
    
    /* Глобальный флаг */
    g_GlobalFlag = 0;
}

/* Вспомогательные функции */
InterfaceElement* GetInterfaceElement(int index) {
    return (InterfaceElement*)((char*)g_InterfaceMgr->element_array + 
                              index * sizeof(InterfaceElement));
}

void InitInterfaceInternal() {
    /* ... реализация FUN_80012084 ... */ 
}

void DefaultRenderCallback() {
    /* ... реализация LAB_8001399c ... */
}