summaryrefslogtreecommitdiff
path: root/src/object
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-02-28 21:08:27 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-03-10 19:17:41 +0100
commite41e97950b0c9bd6502ef118b38440a9ec6d9a4e (patch)
tree468f50ab12c1bd2099010d7b3bf4acc1212499bd /src/object
parenta462cd8daa576a6ee17f662e3b83739e70159317 (diff)
Decompile Object3A
Diffstat (limited to 'src/object')
-rw-r--r--src/object/object3A.c164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/object/object3A.c b/src/object/object3A.c
new file mode 100644
index 00000000..568712f6
--- /dev/null
+++ b/src/object/object3A.c
@@ -0,0 +1,164 @@
+/**
+ * @file object3A.c
+ * @ingroup Objects
+ *
+ * @brief Object3A object
+ */
+
+#define NENT_DEPRECATED
+#include "global.h"
+#include "object.h"
+#include "functions.h"
+#include "screen.h"
+
+typedef struct {
+ /*0x00*/ Entity base;
+ /*0x68*/ u16 unk_68;
+ /*0x6a*/ u16 unk_6a;
+ /*0x6c*/ u8 unk_6c[0x15];
+ /*0x81*/ u8 unk_81;
+ /*0x82*/ s8 unk_82;
+ /*0x83*/ u8 unk_83;
+ /*0x84*/ u8 unk_84;
+ /*0x85*/ s8 unk_85;
+ /*0x86*/ s16 unk_86;
+} Object3AEntity;
+
+typedef struct {
+ u16 unk_0;
+ u16 unk_1;
+ u16 unk_2;
+ s16 unk_3;
+ u16 unk_4;
+ u16 unk_5;
+ s16 unk_6;
+ u16 unk_7;
+ u16 unk_8;
+ u16 unk_9;
+} struct_081215E8;
+
+extern void sub_0801E49C(u32, u32, u32, u32);
+extern bool32 gUnk_02036BB8;
+
+void sub_0808C6D4(Object3AEntity*);
+void sub_0808C74C(Object3AEntity*);
+void sub_0808C858(Object3AEntity*);
+void sub_0808C8B8(Object3AEntity*);
+void sub_0808C840(Object3AEntity*);
+
+const struct_081215E8 gUnk_081215E8[] = {
+ { 5, 4, 280, -6, 0, 0, -8, 0, 31, 63 },
+ { 6, 2, 0, 4, 0, 0, 8, 0, 63, 31 },
+ { 7, 4, 0, 4, 0, 0, -6, 0, 63, 31 },
+ { 6, 2, 0, 16, 0, 0, 16, 0, 63, 31 },
+};
+
+void Object3A(Object3AEntity* this) {
+ static void (*const gUnk_08121638[])(Object3AEntity*) = {
+ sub_0808C6D4,
+ sub_0808C74C,
+ };
+ static void (*const gUnk_08121640[])(Object3AEntity*) = {
+ sub_0808C858,
+ sub_0808C8B8,
+ };
+
+ if (super->type == 0) {
+ gUnk_08121638[super->action](this);
+ } else {
+ gUnk_08121640[super->action](this);
+ }
+}
+
+void sub_0808C6D4(Object3AEntity* this) {
+ Object3AEntity* obj;
+ const struct_081215E8* ptr = &gUnk_081215E8[super->type2];
+ this->unk_86 = ptr->unk_2;
+ this->unk_85 = ptr->unk_3;
+ this->unk_84 = ptr->unk_4;
+ this->unk_83 = ptr->unk_5;
+ this->unk_82 = ptr->unk_6;
+ this->unk_81 = ptr->unk_7;
+ sub_0801E1B8((gScreen.controls.windowInsideControl & 0xff00) | ptr->unk_8, ptr->unk_9);
+ super->action = 1;
+ sub_0808C74C(this);
+ obj = (Object3AEntity*)CreateObject(OBJECT_3A, 1, ptr->unk_0);
+ if (obj != NULL) {
+ obj->unk_6a = ptr->unk_1;
+ }
+}
+
+void sub_0808C74C(Object3AEntity* this) {
+ if (super->parent != NULL) {
+ super->x.HALF.HI = super->parent->x.HALF.HI - gRoomControls.scroll_x;
+ super->y.HALF.HI = super->parent->y.HALF.HI - gRoomControls.scroll_y;
+ } else {
+ super->x.HALF.HI = 0x78;
+ super->y.HALF.HI = 0x50;
+ }
+ if (this->unk_86 < 0) {
+ sub_0801E49C(super->x.HALF.HI, super->y.HALF.HI, 0, 0);
+ gUnk_02036BB8 = TRUE;
+ sub_0808C840(this);
+ }
+ if (this->unk_86 > 500) {
+ sub_0801E49C(super->x.HALF.HI, super->y.HALF.HI, 500, 0);
+ gUnk_02036BB8 = 1;
+ sub_0808C840(this);
+ }
+ this->unk_86 += this->unk_85;
+ this->unk_85 += this->unk_84;
+ if (this->unk_85 > 0x10) {
+ this->unk_85 = 0x10;
+ }
+ if (this->unk_85 < -0x10) {
+ this->unk_85 = 0xf0;
+ }
+ this->unk_83 += this->unk_82;
+ this->unk_82 += this->unk_81;
+ if (this->unk_82 > 0x10) {
+ this->unk_82 = 0x10;
+ }
+ if (this->unk_82 < -0x10) {
+ this->unk_82 = -0x10;
+ }
+ sub_0801E49C(super->x.HALF.HI, super->y.HALF.HI, this->unk_86, this->unk_83);
+}
+
+void sub_0808C840(Object3AEntity* this) {
+ gScreen.controls.layerFXControl = 0;
+ sub_0801E104();
+ DeleteThisEntity();
+}
+
+void sub_0808C858(Object3AEntity* this) {
+ if ((super->type2 & 2) != 0) {
+ gScreen.controls.layerFXControl = 0x3fbf;
+ } else {
+ gScreen.controls.layerFXControl = 0x3fff;
+ }
+ if ((super->type2 & 1) != 0) {
+ gScreen.controls.layerBrightness = 0;
+ } else {
+ gScreen.controls.layerBrightness = 0x10;
+ }
+ super->action = 1;
+ this->unk_68 = 0x100;
+}
+
+void sub_0808C8B8(Object3AEntity* this) {
+ s32 tmp = this->unk_68 -= this->unk_6a;
+ if (tmp * 0x10000 < 0) {
+ this->unk_68 = 0;
+ }
+ if ((super->type2 & 1) != 0) {
+ gScreen.controls.layerBrightness = 0x10 - ((s16)this->unk_68 >> 4);
+ } else {
+ gScreen.controls.layerBrightness = (s16)this->unk_68 >> 4;
+ }
+ if ((s16)this->unk_68 == 0) {
+ DeleteThisEntity();
+ }
+}
+
+const u16 gUnk_08121648[] = { 264, 252, 256, 256, 248, 260, 240, 264, 248, 260, 256, 256, 264, 252, 272, 248 };