typedef signed char s8;
typedef signed short int s16;
typedef signed long s32;
typedef signed long long int s64;
typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned long u32;
typedef unsigned long long int u64;
typedef int BOOL;
typedef unsigned long size_t;
typedef long ptrdiff_t;
#define FALSE 0
#define TRUE 1
#define NULL 0
#if !defined(__cplusplus) || __cplusplus < 201103L
#ifndef nullptr
#define nullptr NULL
#endif
#endif
#define ATTRIBUTE_ALIGN(num) __attribute__((aligned(num)))
#define OBJECT_NAME(name) const char *name##_name = #name;
#define OBJECT_NAMES \
o(TObject) \
o(TMainTask)
#define TL_OBJECTS \
o(tl_su, TL_SU) \
o(tl_00, TL_00) \
o(tl_camera, TL_CAMERA) \
o(tl_01, TL_01) \
o(tl_02, TL_02) \
o(tl_item_equip, TL_ITEM_EQUIP) \
o(tl_03, TL_03) \
o(tl_loc_start, TL_LOC_START) \
o(tl_04, TL_04) \
o(tl_05, TL_05) \
o(tl_06, TL_06) \
o(tl_07, TL_07) \
o(tl_loc_end, TL_LOC_END) \
o(tl_window, TL_WINDOW) \
o(tl_particle, TL_PARTICLE) \
o(tl_particlemodel, TL_PARTICLEMODEL) \
o(tl_radermap, TL_RADERMAP) \
o(tl_clipout, TL_CLIPOUT) \
o(tl_fade, TL_FADE) \
o(tl_fadeafter, TL_FADEAFTER)
#define FOREACH_NODE(type, first, varname) for (type *varname = (type *)(first); varname != NULL; varname = (type *)(varname->next))
#define FOREACH_NODE_NODECL(type, first, varname) for (varname = (type *)(first); varname != NULL; varname = (type *)(varname->next))
#define FOREACH_NODE_MULTI_ITER(type, first, varname, ...) for (type *varname = (type *)(first); varname != NULL; varname = (type *)(varname->next), __VA_ARGS__)
#define FOREACH_NODE_NODECL_MULTI_ITER(type, first, varname, ...) for (varname = (type *)(first); varname != NULL; varname = (type *)(varname->next), __VA_ARGS__)
#define X_OR_Y_CHILD(flags, old_flags, one_prefix, zero_prefix, suffix) \
if (flags != old_flags) { \
TMainTask *child; \
u32 bit = 1; \
FOREACH_NODE_NODECL_MULTI_ITER(TMainTask, main_task.down, child, bit <<= 1) { \
if (flags & bit) { \
child->one_prefix##_##suffix(); \
} else { \
child->zero_prefix##_##suffix(); \
} \
} \
old_flags = flags; \
}
#define SET_OR_CLEAR_CHILD_FLAGS(flags, old_flags, flag_bit) \
X_OR_Y_CHILD(flags, old_flags, set_flag, clear_flag, flag_bit)
#define DISALLOW_OR_ALLOW_CHILD(flags, old_flags, flag_name) \
X_OR_Y_CHILD(flags, old_flags, disallow, allow, flag_name)
class THeap;
class TObject;
class TMainTask;
static const int tl_object_count = 20;
#define o(name) extern const char *name##_name;
OBJECT_NAMES
#undef o
#define o(var, name) extern const char *var##_name;
TL_OBJECTS
#undef o
#define o(var, name) extern TObject *var;
TL_OBJECTS
#undef o
extern THeap *obj_heap;
extern THeap *alt_heap;
extern TMainTask main_task;
extern TObject global_obj1;
extern TObject global_obj2;
u32 some_main_task_flag = 1;
u32 update_flags;
u32 old_update_flags;
u32 render_flags;
u32 old_render_flags;
u32 render_shadow_flags;
u32 old_render_shadow_flags;
u32 some_id_805c6f74;
extern void heap_xfree(void *ptr);
extern void *heap_xmalloc(size_t size);
extern void camera_stuff();
extern void set_depth_buffer_settings_1();
extern void set_depth_buffer_settings_2();
extern void set_depth_buffer_settings_3();
extern void set_depth_buffer_settings_id(u32 id);
extern void save_depth_buffer_settings();
extern void restore_depth_buffer_settings();
extern void func_80083a00();
extern void func_80141618();
extern void set_some_id(u32 id);
extern void func_803e11e8(u32 arg1);
extern void func_803e11f0();
enum object_flags {
NONE = 0,
QUEUE_DESTRUCTION = 1,
CHILD_QUEUE_DESTRUCTION = 2,
BIT_2 = 4,
BIT_3 = 8,
DISALLOW_UPDATE = 0x0F,
DISALLOW_RENDER = 0x10,
DISALLOW_DESTRUCTION = 0x20,
DISALLOW_RENDER_SHADOWS = 0x100,
BIT_9 = 0x200,
BIT_10 = 0x400,
BIT_11 = 0x800,
BIT_12 = 0x1000,
BIT_13 = 0x2000,
BIT_14 = 0x4000,
BIT_15 = 0x8000,
ALL_BITS = 0xFFFF
};
static inline object_flags operator^(object_flags a, object_flags b) { return static_cast<object_flags>(static_cast<u16>(a) ^ static_cast<u16>(b)); };
static inline object_flags operator&(object_flags a, object_flags b) { return static_cast<object_flags>(static_cast<u16>(a) & static_cast<u16>(b)); };
static inline object_flags operator|(object_flags a, object_flags b) { return static_cast<object_flags>(static_cast<u16>(a) | static_cast<u16>(b)); };
static inline object_flags operator~(object_flags a) { return static_cast<object_flags>(~static_cast<u16>(a)); }
static inline void operator^=(object_flags &a, object_flags b) { a = a ^ b; };
static inline void operator&=(object_flags &a, object_flags b) { a = a & b; };
static inline void operator|=(object_flags &a, object_flags b) { a = a | b; };
class THeap {
public:
struct heap_node {
heap_node *next;
size_t remaining_size;
};
heap_node *heap_nodes;
size_t mbr_0x04;
size_t align;
size_t mbr_0x0C;
size_t mbr_0x10;
public:
THeap(size_t size, int align);
~THeap();
void *operator new(size_t size) { return heap_xmalloc(size); };
void operator delete(void *ptr) { heap_xfree(ptr); };
void *heap_alloc(size_t size);
void *heap_zalloc(size_t size);
void heap_free(void *ptr);
};
class TObject {
public:
const char *name;
union {
object_flags flags;
u16 flags_u16;
};
u16 id;
TObject *prev;
TObject *next;
TObject *up;
TObject *down;
public:
void disallow_rendering_shadows();
void allow_rendering_shadows();
void disallow_rendering();
void allow_rendering();
void set_flag_3();
void clear_flag_3();
void queue_destruction();
void set_flag_9();
u32 get_flag_9();
void clear_flag_9();
TObject(TObject *parent = NULL);
virtual ~TObject();
void *operator new (size_t size) { return alloc(size); };
void operator delete(void *ptr) { free(ptr); };
void delete_children();
void queue_destruction_for_each_node();
void run_tasks();
void render_nodes();
void render_shadows_for_each_node();
void render_nodes2();
void empty_func();
void set_parent(TObject *parent);
virtual void run_task();
virtual void render();
virtual void render_shadows();
void empty_func2();
void log(const char *str);
int get_node_count();
bool all_parents_unqueued_for_destruction();
static void *alloc(size_t size);
static void free(void *ptr);
bool toggle_flag_9_if_flag_10_is_clear();
private:
void _delete_children() {
while (this->down != NULL) {
delete this->down;
}
};
void add_parent(TObject *parent, bool set_parent) {
if (set_parent) {
up = parent;
}
TObject *child;
if (parent == NULL) {
this->prev = this;
this->next = NULL;
return;
}
child = parent->down;
if (child != NULL) {
this->prev = child->next;
this->next = NULL;
child->prev->next = this;
child->prev = this;
} else {
this->prev = this;
parent->down = this;
this->next = NULL;
}
};
void remove_parent() {
if (this->up != NULL) {
if (this->prev == this) {
this->up->down = NULL;
} else if (this->up->down == this) {
this->up->down = this->prev;
this->prev->next = NULL;
if (this->next != NULL) {
this->next->prev = this->next;
}
} else {
this->prev->next = this->next;
if (this->next != NULL) {
this->next->prev = this->prev;
} else {
this->up->down->prev = this->prev;
}
}
}
};
void set_flags(object_flags flags) {
this->flags |= flags;
}
void clear_flags(object_flags flags) {
flags_u16 &= ~static_cast<u16>(flags);
}
u32 get_flags(object_flags flags) {
return this->flags & flags;
};
};
class TMainTask : public TObject {
public:
u32 task_flags;
u32 mbr_0x20;
u32 mbr_0x24;
public:
TMainTask();
void unused_render_func();
void render_objects();
void render_ui();
void render_particle_effects();
void render_effects();
void render_geometry();
void func_80228bbc();
void func_80228c44(s32 arg0);
void func_80228dbc();
void render_clipout_and_fade();
void init_main_task();
virtual ~TMainTask();
virtual void run_task();
virtual void render();
virtual void render_shadows();
private:
void set_task_flags(u32 flags) {
this->task_flags |= flags;
}
void clear_task_flags(u32 flags) {
this->task_flags &= ~flags;
}
u32 get_task_flags(u32 flags) {
return this->task_flags & flags;
};
};