summaryrefslogtreecommitdiff
path: root/src/object/lightableSwitch.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/object/lightableSwitch.c')
-rw-r--r--src/object/lightableSwitch.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/src/object/lightableSwitch.c b/src/object/lightableSwitch.c
new file mode 100644
index 00000000..2368da04
--- /dev/null
+++ b/src/object/lightableSwitch.c
@@ -0,0 +1,145 @@
+#include "global.h"
+#include "entity.h"
+#include "room.h"
+#include "flags.h"
+#include "functions.h"
+
+extern void sub_0809EB30(Entity*);
+extern void sub_0809EAD8(Entity*);
+extern void sub_0809EABC(Entity*);
+extern void sub_08004488(u32);
+extern void sub_080A2CC0(Entity*, Entity**, u16*);
+extern Entity* GetCurrentRoomProperty(u32);
+extern void SetTile(u32, u32, u32);
+extern void sub_0806F69C(Entity*);
+
+extern void (*const gUnk_081243B4[])(Entity*);
+extern void (*const gUnk_081243BC[])(Entity*);
+extern void (*const gUnk_081243C4[])(Entity*);
+
+extern BoundingBox gUnk_080FD150;
+
+void LightableSwitch(Entity* this) {
+ gUnk_081243B4[this->entityType.form](this);
+ sub_0809EB30(this);
+}
+
+void sub_0809EA1C(Entity* this) {
+ gUnk_081243BC[this->action](this);
+}
+
+void sub_0809EA34(Entity* this) {
+ this->action = 1;
+ this->flags = this->flags | 0x80;
+ this->frameIndex = 0;
+ this->field_0x3c = 7;
+ this->field_0x40 = 0x48;
+ this->damageType = 0x28;
+ this->flags2 = 10;
+ this->boundingBox = &gUnk_080FD150;
+ sub_0809EAD8(this);
+ UpdateSpriteForCollisionLayer(this);
+ sub_0809EABC(this);
+}
+
+void sub_0809EA80(Entity* this) {
+
+ if ((this->bitfield & 0x80) != 0) {
+ if (CheckFlags(this->field_0x86) != 0) {
+ ClearFlag(this->field_0x86);
+ } else {
+ SetFlag(this->field_0x86);
+ }
+ sub_08004488(0x110);
+ }
+ sub_0809EABC(this);
+}
+
+void sub_0809EABC(Entity* this) {
+ bool32 anySet;
+ u32 f;
+
+ f = CheckFlags(this->field_0x86);
+ anySet = (-f | f) >> 0x1F;
+ if (this->frameIndex != anySet) {
+ this->frameIndex = anySet;
+ }
+}
+
+void sub_0809EAD8(Entity* this) {
+ u8 bVar1;
+ Entity* pEVar2;
+
+ if (this->entityType.parameter != 0) {
+
+ this->attachedEntity = GetCurrentRoomProperty(this->entityType.parameter);
+ sub_080A2CC0(this, &this->attachedEntity, &this->field_0x74);
+
+ } else {
+ SetTile(0x4050, COORD_TO_TILE(this), this->collisionLayer);
+ }
+}
+
+void sub_0809EB30(Entity* this) {
+ u16 uVar1;
+ u16* puVar2;
+
+ if (this->entityType.parameter != 0) {
+ if ((this->direction & 0x80) == 0) {
+ sub_0806F69C(this);
+ }
+ puVar2 = &this->field_0x74;
+ if (!--*puVar2) {
+ sub_080A2CC0(this, &this->attachedEntity, puVar2);
+ }
+ }
+}
+
+void sub_0809EB68(Entity* this) {
+ gUnk_081243C4[this->action](this);
+}
+
+void sub_0809EB80(Entity* this) {
+
+ this->action = 1;
+ this->flags = this->flags | 0x80;
+ this->frameIndex = 3;
+ this->field_0x3c = 7;
+ this->field_0x40 = 0x48;
+ this->damageType = 0x28;
+ this->flags2 = 10;
+ this->boundingBox = &gUnk_080FD150;
+ sub_0809EAD8(this);
+ UpdateSpriteForCollisionLayer(this);
+ if (CheckFlags(this->cutsceneBeh.HWORD) != 0) {
+ this->action = 3;
+ this->frameIndex = 2;
+ }
+}
+
+void sub_0809EBD8(Entity* this) {
+ if ((this->bitfield & 0x80) != 0) {
+ this->action = 2;
+ this->actionDelay = 0x10;
+ this->frameIndex = 2;
+ SetFlag(this->field_0x86);
+ sub_08004488(0x110);
+ }
+}
+
+void sub_0809EC08(Entity* this) {
+
+ if (CheckFlags(this->cutsceneBeh.HWORD) != 0) {
+ this->action = 3;
+
+ } else {
+ if (--this->actionDelay == 0) {
+ this->action = 1;
+ this->frameIndex = 3;
+ ClearFlag(this->field_0x86);
+ sub_08004488(0x110);
+ }
+ }
+}
+
+void nullsub_126(Entity* this) { } \ No newline at end of file