summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKEKW555 <152369890+KEKW555@users.noreply.github.com>2023-12-18 09:45:36 +0530
committerGitHub <noreply@github.com>2023-12-17 20:15:36 -0800
commit888033f7bdb32e2fdee51ebed7c65f2967267bc5 (patch)
tree8075fae1a7046074d6bf030501c3751251f2f33e /src
parent7ea08d4aa23fdf9ce62c1f939081de1d9115a950 (diff)
Restore evil spirit (#654)
* Delete asm/object directory * Restore evilSpirit.c * Sync linker * Delete data/const/object/evilSpirit.s * Update assets.json * Fix fields
Diffstat (limited to 'src')
-rw-r--r--src/object/evilSpirit.c214
1 files changed, 214 insertions, 0 deletions
diff --git a/src/object/evilSpirit.c b/src/object/evilSpirit.c
new file mode 100644
index 00000000..0208d997
--- /dev/null
+++ b/src/object/evilSpirit.c
@@ -0,0 +1,214 @@
+#define NENT_DEPRECATED
+#include "entity.h"
+#include "functions.h"
+#include "flags.h"
+#include "object.h"
+
+typedef struct {
+ Entity base;
+ u8 filler[0xe];
+ u16 unk76;
+ u16 unk78;
+ u16 unk7a;
+ u16 unk7c;
+ u8 filler2;
+ u8 unk7f;
+ s32 x;
+ s32 y;
+} EvilSpiritEntity;
+
+void EvilSpirit_Init(EvilSpiritEntity*);
+void EvilSpirit_Action1(EvilSpiritEntity*);
+void EvilSpirit_Action2(EvilSpiritEntity*);
+void EvilSpirit_Action3(EvilSpiritEntity*);
+
+void EvilSpirit(Entity* this) {
+ static void (*const EvilSpirit_Actions[])(EvilSpiritEntity*) = {
+ EvilSpirit_Init,
+ EvilSpirit_Action1,
+ EvilSpirit_Action2,
+ EvilSpirit_Action3,
+ };
+ EvilSpirit_Actions[this->action]((EvilSpiritEntity*)this);
+ this->contactFlags = 0;
+ SetAffineInfo(this, ((EvilSpiritEntity*)this)->unk76, ((EvilSpiritEntity*)this)->unk7a, 0);
+}
+
+void EvilSpirit_Init(EvilSpiritEntity* this) {
+ static const u16 gUnk_08120678[] = { 0x100, 0x110, 0x150, 0x1c0, 0x200 };
+ u32 uVar1;
+ Entity* evilSpiritEnt;
+ u32 index;
+
+ if (CheckLocalFlag(SORA_ELDER_RECOVER)) {
+ DeleteThisEntity();
+ }
+ super->action = 1;
+ uVar1 = gUnk_08120678[super->type];
+ this->unk7c = uVar1;
+ this->unk76 = uVar1;
+ this->unk7a = this->unk7c;
+ if (super->type == 0) {
+ this->x = super->x.WORD;
+ this->y = super->y.WORD;
+ super->spriteRendering.b3 = 0;
+ super->parent = super;
+ COLLISION_ON(super);
+ super->collisionFlags = 7;
+ super->hitType = 1;
+ super->flags2 = 4;
+ for (index = 0; index < 4; index++) {
+ evilSpiritEnt = CreateObjectWithParent(super, EVIL_SPIRIT, index + 1, 0);
+ super->child = evilSpiritEnt;
+ if (evilSpiritEnt != NULL) {
+ evilSpiritEnt->parent = super->parent;
+ super->child->child = super;
+ super->parent = super->child;
+ }
+ }
+ } else {
+ super->spriteRendering.b3 = 1;
+ }
+ InitializeAnimation(super, super->type);
+ EvilSpirit_Action1(this);
+}
+
+void EvilSpirit_Action1(EvilSpiritEntity* this) {
+ s32 sVar3;
+ u32 dir;
+ s16 iVar5;
+
+ if (super->type != 0) {
+ if (((EvilSpiritEntity*)super->child)->unk7f == 0) {
+ this->unk76 = this->unk7c;
+ this->unk7a = this->unk7c;
+ super->speed = 0x300;
+ super->direction =
+ sub_080045DA(super->parent->x.WORD - super->x.WORD, super->parent->y.WORD - super->y.WORD) ^ 0x80;
+ } else {
+ super->speed = 0x600;
+ dir = sub_080045DA(gPlayerEntity.x.WORD - super->x.WORD, gPlayerEntity.y.WORD - super->y.WORD) ^ 0x80;
+ if (dir != super->direction) {
+ if ((u8)(dir - super->direction) > 0x80) {
+ super->direction += 3;
+ } else {
+ super->direction -= 3;
+ }
+ }
+ if ((gPlayerEntity.animationState & 2) == 0) {
+ this->unk76 = this->unk7c + 0x40;
+ } else {
+ this->unk76 = this->unk7c - 0x20;
+ this->unk7a = this->unk7c + 0x50;
+ ;
+ }
+ }
+ super->x = super->parent->x;
+ super->y = super->parent->y;
+ LinearMoveAngle(super, (int)super->speed, super->direction);
+ return;
+ }
+
+ if ((super->contactFlags & 0x7f) == 0x13) {
+ super->direction++;
+ super->gustJarTolerance--;
+ this->unk7f = 1;
+ if ((gPlayerEntity.animationState & 2) == 0) {
+ this->unk76 = this->unk7c + 0x10;
+ } else {
+ this->unk76 = this->unk7c - 0x20;
+ this->unk7a = this->unk7c + 0x30;
+ }
+ } else {
+ super->direction = super->direction + 2;
+ super->gustJarTolerance = 0xf0;
+ this->unk7f = 0;
+ this->unk76 = this->unk7c;
+ this->unk7a = this->unk7c;
+ }
+
+ if (super->gustJarTolerance == 0) {
+ super->action = 2;
+ this->unk7f = 0;
+ return;
+ }
+
+ if ((super->direction + 0x40) * 0x1000000 >= 0) {
+ sVar3 = this->unk76;
+ if ((short)this->unk76 >= 1) {
+ this->unk76 = -sVar3;
+ }
+ } else {
+ sVar3 = this->unk76;
+ if (-1 >= (short)this->unk76) {
+ this->unk76 = -sVar3;
+ }
+ }
+
+ sVar3 = FixedMul(gSineTable[super->direction], 0x2000);
+ iVar5 = FixedDiv(sVar3, 0x100);
+ super->x.WORD = this->x + (iVar5 << 8);
+ sVar3 = FixedMul(gSineTable[super->direction + 0x40], 0x1000);
+ iVar5 = FixedDiv(sVar3, 0x100);
+ super->y.WORD = this->y - (iVar5 << 8);
+}
+
+void EvilSpirit_Action2(EvilSpiritEntity* this) {
+ u32 index;
+
+ if ((super->contactFlags & 0x7f) != 0x13) {
+ super->action = 3;
+ } else {
+ if (sub_0806F3E4(super)) {
+ SetLocalFlag(SORA_ELDER_RECOVER);
+ SetRoomFlag(0);
+
+ for (index = 0; index < 4; index++) {
+ Entity* ent = super->child;
+ super->child = ent->parent;
+ DeleteEntity(ent);
+ }
+ DeleteThisEntity();
+ }
+ }
+}
+
+void EvilSpirit_Action3(EvilSpiritEntity* this) {
+ short sVar2;
+ short iVar4;
+ int iVar6;
+
+ super->direction = sub_080045DA(this->x - super->x.WORD, this->y - super->y.WORD);
+ if ((super->contactFlags & 0x7f) == 0x13) {
+ super->speed = 0x100;
+ super->gustJarTolerance--;
+ this->unk7f = 1;
+
+ if ((gPlayerEntity.animationState & 2) == 0) {
+ this->unk76 = this->unk7c + 0x10;
+ } else {
+ this->unk76 = this->unk7c - 0x20;
+ this->unk7a = this->unk7c + 0x30;
+ }
+ } else {
+ super->speed = 0x200;
+ super->gustJarTolerance = 0xf0;
+ this->unk7f = 0;
+ this->unk76 = this->unk7c;
+ this->unk7a = this->unk7c;
+ }
+
+ if (super->gustJarTolerance == 0) {
+ super->action = 2;
+ this->unk7f = 0;
+ } else {
+ LinearMoveAngle(super, super->speed, super->direction);
+ super->direction ^= 0x80;
+ sVar2 = FixedMul(gSineTable[super->direction], 0x2000);
+ iVar6 = this->x + (FixedDiv(sVar2, 0x100) << 8);
+ sVar2 = FixedMul(gSineTable[super->direction + 0x40], 0x1000);
+ if (EntityWithinDistance(super, iVar6, this->y - (FixedDiv(sVar2, 0x100) << 8), 2)) {
+ super->action = 1;
+ }
+ }
+}