#include "pso/TObject.h"
#define MATCHING
#define o(name) const char *name##_name = #name;
OBJECT_NAMES
#undef o
void debug_print(const char *fmt) {
}
bool TObject::toggle_flag_9_if_flag_10_is_clear() {
if (get_flags(0x400)) {
return false;
}
if (!get_flag_9()) {
set_flag_9();
return true;
} else {
clear_flag_9();
return false;
}
}
void TObject::free(void *ptr) {
}
void *TObject::alloc(unsigned long size) {
return NULL;
}
bool TObject::is_flag_0_clear_for_all_parents() {
for (TObject *parent = this; parent != NULL; parent = parent->up) {
if (parent->get_flags(1)) {
return false;
}
}
return true;
}
int TObject::get_node_count() {
TObject *child;
int node_count = 0;
for (child = this->down; child != NULL; child = child->next) {
node_count += child->get_node_count() + 1;
}
return node_count;
}
void TObject::log(const char *str) {
debug_print(str);
}
void TObject::empty_func2() {
}
void TObject::func_0x14() {
}
void TObject::func_0x10() {
}
void TObject::run_task() {
}
void TObject::set_parent(TObject *parent) {
remove_parent();
add_parent(parent, true);
}
void TObject::empty_func() {
}
void TObject::call_func_0x10_for_each_node2() {
for (TObject *child = this->down; child != NULL; child = child->next) {
if (child->get_flags(0x200)) {
child->func_0x10();
child->clear_flag_9();
}
child->call_func_0x10_for_each_node2();
}
}
void TObject::call_func_0x14_for_each_node() {
for (TObject *child = this->down; child != NULL; child = child->next) {
if (!child->get_flags(0x100)) {
child->func_0x14();
child->call_func_0x14_for_each_node();
}
}
}
void TObject::call_func_0x10_for_each_node() {
for (TObject *child = this->down; child != NULL; child = child->next) {
if (!child->get_flags(0x10)) {
child->func_0x10();
child->call_func_0x10_for_each_node();
}
}
}
#ifndef MATCHING
void TObject::run_tasks() {
TObject *child = this->down;
while (this->down != NULL && child != NULL) {
TObject *node = child;
child = child->next;
if (node->get_flags(0x0f)) {
if (node->get_flags(1)) {
node->clear_flags(1);
if (!node->get_flags(0x20)) {
delete node;
} else {
child->clear_flags(0);
if (node->get_flags(2)) {
node->delete_children();
node->run_task();
node->clear_flags(2);
}
if (!node->get_flags(4)) {
child->clear_flags(0);
}
}
}
} else {
node->run_task();
node->run_tasks();
}
}
}
#else
asm void TObject::run_tasks() {
nofralloc
stwu r1, -0x20(r1)
mflr r0
stw r0, 0x24(r1)
stmw r29, 0x14(r1)
mr r29, r3
lwz r31, 0x14(r3)
b lbl_802298f8
lbl_80229844:
mr r30, r31
lwz r31, 0xc(r31)
lhz r3, 4(r30)
clrlwi. r0, r3, 0x1c
beq- lbl_802298dc
clrlwi. r0, r3, 0x1f
beq- lbl_80229898
rlwinm r0, r3, 0, 0x10, 0x1e
sth r0, 4(r30)
lhz r0, 4(r30)
rlwinm. r0, r0, 0, 0x1a, 0x1a
bne- lbl_80229898
cmplwi r30, 0
beq- lbl_802298f8
mr r3, r30
li r4, 0x1
lwz r12, 0x18(r30)
lwz r12, 8(r12)
mtctr r12
bctrl
b lbl_802298f8
lbl_80229898:
lhz r0, 4(r30)
rlwinm. r0, r0, 0, 0x1e, 0x1e
beq- lbl_802298cc
mr r3, r30
bl delete_children
mr r3, r30
lwz r12, 0x18(r30)
lwz r12, 0xc(r12)
mtctr r12
bctrl
lhz r0, 4(r30)
rlwinm r0, r0, 0, 0x1f, 0x1d
sth r0, 4(r30)
lbl_802298cc:
lhz r3, 4(r30)
rlwinm. r0, r3, 0, 0x1d, 0x1d
bne- lbl_802298f8
b lbl_802298f8
lbl_802298dc:
mr r3, r30
lwz r12, 0x18(r30)
lwz r12, 0xc(r12)
mtctr r12
bctrl
mr r3, r30
bl run_tasks
lbl_802298f8:
lwz r0, 0x14(r29)
cmplwi r0, 0
beq- lbl_8022990c
cmplwi r31, 0
bne+ lbl_80229844
lbl_8022990c:
lmw r29, 0x14(r1)
lwz r0, 0x24(r1)
mtlr r0
addi r1, r1, 0x20
blr
}
#endif
void TObject::set_flag_0_for_each_node() {
for (TObject *child = this->down; child != NULL; child = child->next) {
child->set_flag_0();
child->set_flag_0_for_each_node();
}
}
void TObject::delete_children() {
_delete_children();
}
TObject::~TObject() {
if (!get_flags(0x20)) {
set_flags(0x20);
_delete_children();
remove_parent();
}
}
TObject::TObject(TObject *parent) {
flags = 0;
up = parent;
down = NULL;
name = TObject_name;
add_parent(parent, false);
}
void TObject::clear_flag_9() {
clear_flags(0x200);
}
void TObject::set_flag_9() {
set_flags(0x200);
}
u32 TObject::get_flag_9() {
return get_flags(0x200);
}
void TObject::set_flag_0() {
set_flags(1);
}