mirror of
https://github.com/zeldaret/tmc
synced 2026-05-28 08:25:51 -04:00
77 lines
2.9 KiB
C
77 lines
2.9 KiB
C
/**
|
|
* @file houseSignManager.c
|
|
* @ingroup Managers
|
|
*
|
|
* @brief Keeps track in its bitfield of whether 0x10 x 0x10 rects at certain positions are on the screen.
|
|
*
|
|
* Spawns HOUSE_SIGN objects that check this and unsets the value in the bitfield.
|
|
* Creates the signs on the houses in hyrule town.
|
|
*/
|
|
#include "manager/houseSignManager.h"
|
|
|
|
#include "area.h"
|
|
#include "asm.h"
|
|
#include "object.h"
|
|
#include "object/houseSign.h"
|
|
#include "room.h"
|
|
|
|
typedef struct {
|
|
u16 x;
|
|
u16 y;
|
|
u8 type;
|
|
u8 frameIndex;
|
|
u8 collisionLayer;
|
|
u8 _padding;
|
|
} SpawnData;
|
|
|
|
void HouseSignManager_Main(HouseSignManager* this) {
|
|
static const SpawnData gUnk_081084C8[] = {
|
|
{ 0x48, 0x90, 0x0, 0x0, 0x2, 0x0 }, { 0x138, 0x30, 0x1, 0x1, 0x2, 0x0 },
|
|
{ 0x168, 0x90, 0x2, 0x2, 0x2, 0x0 }, { 0x2c8, 0x80, 0x3, 0x3, 0x2, 0x0 },
|
|
{ 0x388, 0x240, 0x4, 0x4, 0x2, 0x0 }, { 0x158, 0x1ed, 0x5, 0x5, 0x2, 0x0 },
|
|
{ 0x15a, 0x228, 0x6, 0x6, 0x2, 0x0 }, { 0x158, 0x26b, 0x7, 0x7, 0x2, 0x0 },
|
|
{ 0x198, 0x2b1, 0x8, 0x8, 0x2, 0x0 }, { 0x258, 0x2ac, 0x9, 0x9, 0x2, 0x0 },
|
|
{ 0x298, 0x21a, 0xa, 0xa, 0x2, 0x0 }, { 0x298, 0x1cb, 0xb, 0xb, 0x2, 0x0 },
|
|
{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
|
|
};
|
|
static const SpawnData gUnk_08108530[] = {
|
|
{ 0x8, 0x30, 0x1, 0x1, 0x2, 0x0 }, { 0x38, 0x90, 0x2, 0x2, 0x2, 0x0 },
|
|
{ 0x198, 0x80, 0x3, 0x2, 0x2, 0x0 }, { 0x28, 0x1ed, 0x5, 0x5, 0x2, 0x0 },
|
|
{ 0x2a, 0x228, 0x6, 0x6, 0x2, 0x0 }, { 0x28, 0x26b, 0x7, 0x7, 0x2, 0x0 },
|
|
{ 0x68, 0x2b1, 0x8, 0x8, 0x2, 0x0 }, { 0x128, 0x2ac, 0x9, 0x9, 0x2, 0x0 },
|
|
{ 0x168, 0x21a, 0xa, 0xa, 0x2, 0x0 }, { 0x168, 0x1cb, 0xb, 0xb, 0x2, 0x0 },
|
|
{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
|
|
};
|
|
const SpawnData* spawnData;
|
|
u32 type2;
|
|
|
|
if (super->action == 0) {
|
|
super->action = 1;
|
|
}
|
|
if (gRoomControls.area == AREA_FESTIVAL_TOWN) {
|
|
spawnData = gUnk_08108530;
|
|
} else {
|
|
spawnData = gUnk_081084C8;
|
|
}
|
|
type2 = 0;
|
|
while ((spawnData->x != 0) && (type2 < 0x20)) {
|
|
u32 bitfieldFlag = 1 << type2;
|
|
if ((((this->bitfield & bitfieldFlag) == 0) &&
|
|
(CheckRectOnScreen(spawnData->x, spawnData->y, 0x10, 0x10) != 0))) {
|
|
HouseSignEntity* object = (HouseSignEntity*)CreateObject(HOUSE_SIGN, spawnData->type, type2);
|
|
if (object != NULL) {
|
|
object->base.frameIndex = spawnData->frameIndex;
|
|
object->base.x.HALF.HI = gRoomControls.origin_x + spawnData->x;
|
|
object->base.y.HALF.HI = gRoomControls.origin_y + spawnData->y;
|
|
object->base.parent = (Entity*)this;
|
|
object->unk_80 = spawnData->x;
|
|
object->unk_82 = spawnData->y;
|
|
object->base.collisionLayer = spawnData->collisionLayer;
|
|
this->bitfield |= bitfieldFlag;
|
|
}
|
|
}
|
|
spawnData++;
|
|
type2++;
|
|
}
|
|
}
|