summaryrefslogtreecommitdiff
path: root/src/object/cameraTarget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/object/cameraTarget.c')
-rw-r--r--src/object/cameraTarget.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/src/object/cameraTarget.c b/src/object/cameraTarget.c
new file mode 100644
index 00000000..1f3dde08
--- /dev/null
+++ b/src/object/cameraTarget.c
@@ -0,0 +1,162 @@
+/**
+ * @file cameraTarget.c
+ * @ingroup Objects
+ *
+ * @brief Camera Target object
+ */
+#define NENT_DEPRECATED
+#include "common.h"
+#include "entity.h"
+#include "functions.h"
+#include "kinstone.h"
+#include "message.h"
+
+// typedef struct {
+// Entity base;
+// u8 filler[0x18];
+// u16 tilePos;
+// } BenchEntity;
+
+extern void sub_080ADDD8(u32, u32);
+void sub_080838DC(Entity*);
+void sub_08083A40(Entity*);
+void CameraTarget_Init(Entity*);
+void CameraTarget_Action1(Entity*);
+void CameraTarget_Action2(Entity*);
+
+#ifdef EU
+static const s32 gUnk_0811F744[] = {
+ 0x00027940,
+ 0x00027B40,
+ 0x00027D40,
+ 0x00027F40,
+};
+#else
+static const s32 gUnk_0811F744[] = {
+ 0x00027980,
+ 0x00027B80,
+ 0x00027D80,
+ 0x00027F80,
+};
+#endif
+
+void CameraTarget(Entity* this) {
+ static void (*const gUnk_0811F754[])(Entity*) = {
+ CameraTarget_Init,
+ CameraTarget_Action1,
+ CameraTarget_Action2,
+ };
+
+ u32 uVar2 = gPlayerState.field_0x27[0] > 0;
+
+ switch (gFuseInfo._0) {
+ case 0:
+ case 1:
+ case 2:
+ if ((gMessage.doTextBox & 0x7f) != 0) {
+ default:
+ if (gUnk_03003DF0.unk_4[3] == 50) {
+ if (CheckKinstoneFused(KINSTONE_32) == 0) {
+ uVar2 = 0;
+ break;
+ }
+ }
+ uVar2 = 1;
+ }
+ break;
+ }
+
+ if (uVar2) {
+ sub_080838DC(this);
+ }
+ gUnk_0811F754[this->action](this);
+}
+
+void sub_080838DC(Entity* this) {
+ this->spriteSettings.draw = 0;
+ this->spriteOrientation.flipY = 1;
+ this->spriteRendering.b3 = 0;
+ this->spritePriority.b0 = 0;
+ this->timer = 4;
+ this->child = NULL;
+ this->action = 0;
+}
+
+void CameraTarget_Init(Entity* this) {
+ if (this->spriteAnimation[0] != 1) {
+ LoadSwapGFX(this, 1, 1);
+ this->spriteVramOffset -= 0x10;
+#ifdef EU
+ sub_080ADDD8(1, 0x10277e0);
+#else
+ sub_080ADDD8(1, 0x1027820);
+#endif
+ sub_080838DC(this);
+ }
+ this->action = 1;
+ this->flags |= ENT_PERSIST;
+ SetDefaultPriority(this, 6);
+}
+
+void CameraTarget_Action1(Entity* this) {
+ if (this->timer) {
+ this->timer--;
+ } else {
+ if ((*(Entity**)(gUnk_03003DF0.unk_4 + 8) != NULL) && ((u8)(gUnk_03003DF0.unk_4[3] - 1) < 100)) {
+ this->child = *(Entity**)(gUnk_03003DF0.unk_4 + 8);
+ this->interactType = gUnk_03003DF0.unk_3;
+ sub_08083A40(this);
+ }
+ }
+}
+
+void CameraTarget_Action2(Entity* this) {
+ u32 bVar1;
+ u32 bVar2;
+ u32 bVar3;
+ u32 temp;
+ u32 temp2;
+ struct_080C9CBC* ptr;
+
+ if ((this->type != 1) &&
+ (((u8)(gUnk_03003DF0.unk_4[3] - 1) >= 100 || (this->child != *(Entity**)(gUnk_03003DF0.unk_4 + 8))))) {
+ sub_080838DC(this);
+ } else {
+ this->x = this->child->x;
+ this->y = this->child->y;
+ this->z = this->child->z;
+ if (this->frame == 1) {
+ this->frame = 0;
+ if (this->type == 0) {
+ bVar2 = gUnk_03003DF0.unk_4[3];
+ } else {
+ bVar2 = this->type2;
+ }
+ ptr = gUnk_080C9CBC + bVar2;
+ bVar1 = ptr->_5[0];
+ bVar3 = bVar1 & 1;
+ this->palette.b.b0 = bVar3;
+ temp = gUnk_0811F744[bVar1] < 0;
+ temp2 = (gUnk_0811F744[bVar1] & 0xffffff) | temp;
+ sub_080ADDD8(0, temp2 | 0x1000000);
+ }
+ GetNextFrame(this);
+ }
+}
+
+void sub_08083A40(Entity* this) {
+ u32 bVar1;
+
+ this->spriteSettings.draw = 1;
+ this->action = 2;
+ if (this->child->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
+ bVar1 = 0;
+ this->spriteOffsetX = 8;
+ } else {
+ bVar1 = 1;
+ this->spriteOffsetX = -8;
+ }
+ this->spriteOffsetY = -18;
+ InitializeAnimation(this, bVar1);
+ CameraTarget_Action2(this);
+}