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

80 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

``` 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 ... */
}
```