summaryrefslogtreecommitdiff
path: root/include/pso/TObject.h
blob: 531dee114c5e561b71faeea5f322ba06cb077f74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#ifndef TOBJECT_H
#define TOBJECT_H

#include "pso/forward.h"
#include "pso/macros.h"
#include <global_types.h>

#define o(name) extern const char *name##_name;
OBJECT_NAMES
#undef o

extern TMainTask main_task;
extern TObject global_obj1;
extern TObject global_obj2;

class TObject {
public:
	const char *name;
	u16 flags;
	u16 id;
	TObject *prev;
	TObject *next;
	TObject *up;
	TObject *down;
public:
	void set_flag_4();
	void clear_flag_4();
	void set_flag_3();
	void clear_flag_3();
	void set_flag_0();
	void set_flag_9();
	u32 get_flag_9();
	void clear_flag_9();

	TObject(TObject *parent = NULL);
	virtual ~TObject();

	void *operator new (unsigned long size) { return alloc(size); };
	void operator delete(void *ptr) { free(ptr); };

	void delete_children();
	void set_flag_0_for_each_node();
	void run_tasks();
	void call_func_0x10_for_each_node();
	void call_func_0x14_for_each_node();
	void call_func_0x10_for_each_node2();
	void empty_func();
	void set_parent(TObject *parent);

	virtual void run_task();
	virtual void render();
	virtual void func_0x14();

	void empty_func2();
	void log(const char *str);
	int get_node_count();
	bool is_flag_0_clear_for_all_parents();
	static void *alloc(unsigned long 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(u16 flags) {
		this->flags |= flags;
	}

	void clear_flags(u16 flags) {
		this->flags &= ~flags;
	}

	u32 get_flags(u16 flags) {
		return this->flags & flags;
	};
};
#endif