80 lines
3.1 KiB
Markdown
80 lines
3.1 KiB
Markdown
``` c
|
||
#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 ... */
|
||
}
|
||
``` |