diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/object/pot.c | 142 |
1 files changed, 138 insertions, 4 deletions
diff --git a/src/object/pot.c b/src/object/pot.c index 39a7b4c1..5ea63ab5 100755 --- a/src/object/pot.c +++ b/src/object/pot.c @@ -5,8 +5,13 @@ #include "player.h" #include "room.h" +static void sub_08082824(Entity*); +static void sub_08082850(Entity*, Entity*); +static void sub_08082608(Entity*); + extern void (*const gUnk_0811F090[])(Entity*); extern void (*const gUnk_0811F0A8[])(Entity*); +extern void (*const gUnk_0811F0C4[])(Entity*); extern BoundingBox gUnk_080FD338; // TODO: should be const extern BoundingBox gUnk_080FD340; // TODO: should be const @@ -15,10 +20,9 @@ extern u32 sub_08016A30(Entity*); extern u32 sub_080001DA(u32, u32); extern u32 GetTileTypeByEntity(Entity*); extern void sub_08078930(Entity*); -extern void sub_08082824(Entity*); extern u32 sub_080002B8(Entity*); -extern void sub_08082850(Entity*, Entity*); -extern void sub_08082608(Entity*); +extern void sub_08016A6C(Entity*); +extern u32 sub_0800442E(Entity*); void Pot(Entity* this) { gUnk_0811F090[this->action](this); @@ -163,7 +167,137 @@ void sub_080825F0(Entity* this) { } } -void sub_08082608(Entity* this) { +static void sub_08082608(Entity* this) { this->action = 1; this->previousActionFlag = 0; } + +void sub_08082614(Entity* this) { + u32 tileType; + + sub_0800445C(this); + if (--this->actionDelay != 0xFF) { + sub_0806F69C(this); + sub_08016A6C(this); + return; + } + + if (sub_0800442E(this)) { + return; + } + + this->action = 1; + if (gPlayerState.flags.all & 0x80) { + this->nonPlanarMovement <<= 1; + } + + this->field_0x70.HALF.LO = sub_080001DA(COORD_TO_TILE(this), this->collisionLayer); + tileType = GetTileTypeByEntity(this); + switch (tileType) { + case 0x71: + case 0x72: + sub_08082850(this, NULL); + break; + default: + SetTile(0x4000, COORD_TO_TILE(this), this->collisionLayer); + sub_08078930(this); + break; + } +} + +void sub_080826E4(Entity* this) { + gUnk_0811F0C4[this->previousActionFlag](this); +} + +void sub_080826FC(Entity* this) { + this->previousActionFlag = 1; + this->field_0x1d = 48; + this->actionDelay = 0; +} + +void sub_0808270C(Entity* this) { + if ((gPlayerState.field_0x1c & 0xF) != 0x1 || (this->bitfield & 0x7F) != 0x13) { + this->spriteOffsetX = 0; + this->action = 1; + SetTile(0x4000, COORD_TO_TILE(this), this->collisionLayer); + } else { + sub_0806F4E8(this); + } +} + +void sub_08082778(Entity* this) { + if (this->actionDelay == 0) { + this->actionDelay = 1; + this->spriteOffsetX = 0; + this->spriteOffsetY = -2; + SetTile((u16)this->field_0x70.HALF.LO, COORD_TO_TILE(this), this->collisionLayer); + } + + if ((gPlayerState.field_0x1c & 0xF) != 0x1 || (this->bitfield & 0x7F) != 0x13) { + sub_08082850(this, NULL); + } else { + sub_0806F3E4(this); + } +} + +void sub_080827F8(Entity* this) { + if (gPlayerState.field_0x1c == 0) { + sub_08082850(this, NULL); + } +} + +void nullsub_512(Entity* this) { +} + +void sub_08082818(Entity* this) { + sub_08082850(this, NULL); +} + +static void sub_08082824(Entity* this) { + if (this->field_0x20 < 0) { + this->spriteSettings.b.flipY = 1; + } + + if (sub_08003FC4(this, 0x2000) == 0) { + sub_08082850(this, NULL); + } +} + +static void sub_08082850(Entity* this, Entity* parent) { + u32 parameter = sub_0808288C(this, this->entityType.form, this->field_0x7c.BYTES.byte1, this->entityType.parameter); + Entity* fxEntity = CreateFx(this, 5, parameter); + if (fxEntity) { + fxEntity->parent = parent; + } + + if (this->entityType.parameter == 1) { + SetFlag(this->field_0x86); + } + + DeleteThisEntity(); +} + +u32 sub_0808288C(Entity* this, u32 form, u32 arg2, u32 arg3) { + Entity* entity; + u32 result = 0; + switch (form) { + case 0xFF: + result = 0; + break; + case 0: + result = 0x80; + break; + default: + entity = CreateObjectWithParent(this, 0, form, arg2); + if (entity) { + if (arg3 == 2) { + entity->actionDelay = 5; + entity->field_0x86 = this->field_0x86; + } else { + entity->actionDelay = 0; + } + } + break; + } + return result; +} |
