mirror of https://github.com/zeldaret/tmc.git
172 lines
7.6 KiB
C
172 lines
7.6 KiB
C
#include "global.h"
|
|
#include "entity.h"
|
|
#include "room.h"
|
|
#include "npc.h"
|
|
|
|
//clang-format off
|
|
void (*const gNPCFunctions[][3])(Entity* ent) = {
|
|
[NPC_NONE_0] = { DeleteEntity, NULL, NULL },
|
|
[GENTARI] = { Gentari, NULL, Gentari_Fusion },
|
|
[FESTARI] = { Festari, NULL, Festari_Fusion },
|
|
[FOREST_MINISH] = { ForestMinish, ForestMinish_Head, ForestMinish_Fusion },
|
|
[POSTMAN] = { Postman, NULL, Postman_Fusion },
|
|
[NPC_UNK_5] = { NPC5, NULL, NULL },
|
|
[TPWNSPERSON] = { Townsperson, Townsperson_Head, Townsperson_Fusion },
|
|
[KID] = { Kid, Kid_Head, Kid_Fusion },
|
|
[GUARD] = { Guard, Guard_Head, NULL },
|
|
[NPC_UNK_9] = { NPC9, NULL, NULL },
|
|
[STAMP] = { Stamp, NULL, NULL },
|
|
[MAID] = { Maid, Maid_Head, NULL },
|
|
[MARCY] = { Marcy, NULL, NULL },
|
|
[WHEATON] = { Wheaton, NULL, NULL },
|
|
[PITA] = { Pita, NULL, NULL },
|
|
[MINISH_EZLO] = { MinishEzlo, MinishEzlo_Head, NULL },
|
|
[MAILBOX] = { Mailbox, NULL, NULL },
|
|
[BEEDLE] = { Beedle, Beedle_Head, NULL },
|
|
[BROCCO] = { Brocco, NULL, Brocco_Fusion },
|
|
[SITTING_PERSON] = { SittingPerson, SittingPerson_Head, SittingPerson_Fusion },
|
|
[PINA] = { Pina, NULL, Pina_Fusion },
|
|
[GUARD_1] = { Guard, Guard_Head, NULL },
|
|
[MAID_1] = { Maid, Maid_Head, NULL },
|
|
[DIN] = { Din, NULL, Din_Fusion },
|
|
[NAYRU] = { Nayru, NULL, Nayru_Fusion },
|
|
[FARORE] = { Farore, NULL, Farore_Fusion },
|
|
[STURGEON] = { Sturgeon, Sturgeon_Head, Sturgeon_Fusion },
|
|
[TINGLE_SIBLINGS] = { TingleSiblings, NULL, TingleSiblings_Fusion },
|
|
[STOCKWELL] = { Stockwell, NULL, NULL },
|
|
[TALON] = { Talon, Talon_Head, Talon_Fusion },
|
|
[MALON] = { Malon, NULL, Malon_Fusion },
|
|
[EPONA] = { Epona, NULL, Epona_Fusion },
|
|
[MILK_CART] = { MilkCart, NULL, NULL },
|
|
[GHOST_BROTHERS] = { GhostBrothers, NULL, GhostBrothers_Fusion },
|
|
[SMITH] = { Smith, Smith_Head, Smith_Fusion },
|
|
[NPC_UNK_23] = { NPC23, NULL, NULL },
|
|
[KING_DALTUS] = { KingDaltus, NULL, KingDaltus_Fusion },
|
|
[MINISTER_POTHO] = { MinisterPotho, NULL, MinisterPotho_Fusion },
|
|
[NPC_UNK_26] = { NPC26, NULL, NULL },
|
|
[VAATI] = { Vaati, NULL, NULL },
|
|
[ZELDA] = { Zelda, NULL, NULL },
|
|
[MUTOH] = { Mutoh, Mutoh_Head, Mutoh_Fusion },
|
|
[CARPENTER] = { Carpenter, Carpenter_Head, Carpenter_Fusion },
|
|
[CASTOR_WILDS_STATUE] = { CastorWildsStatue, NULL, CastorWildsStatue_Fusion },
|
|
[CAT] = { Cat, NULL, Cat_Fusion },
|
|
[MOUNTAIN_MINISH] = { MountainMinish, MountainMinish_Head, MountainMinish_Fusion },
|
|
[ZELDA_FOLLOWER] = { ZeldaFollower, NULL, NULL },
|
|
[MELARI] = { Melari, Melari_Head, Melari_Fusion },
|
|
[BLADE_BROTHERS] = { BladeBrothers, NULL, BladeBrothers_Fusion },
|
|
[COW] = { Cow, NULL, Cow_Fusion },
|
|
[GORON] = { Goron, NULL, Goron_Fusion },
|
|
[GORON_MERCHANT] = { GoronMerchant, NULL, NULL },
|
|
[GORMAN] = { Gorman, Gorman_Head, NULL },
|
|
[DOG] = { Dog, Dog_Head, Dog_Fusion },
|
|
[SYRUP] = { Syrup, Syrup_Head, NULL },
|
|
[REM] = { Rem, NULL, NULL },
|
|
[TOWN_MINISH] = { TownMinish, TownMinish_Head, TownMinish_Fusion },
|
|
[LIBRARI] = { Librari, NULL, Librari_Fusion },
|
|
[PERCY] = { Percy, Percy_Head, Percy_Fusion },
|
|
[VAATI_REBORN] = { VaatiReborn, NULL, NULL },
|
|
[MOBLIN_LADY] = { MoblinLady, NULL, NULL },
|
|
[LIBRARIANS] = { Librarians, NULL, NULL },
|
|
[FARMERS] = { Farmers, Farmers_Head, Farmers_Fusion },
|
|
[CARLOV] = { Carlov, NULL, NULL },
|
|
[DAMPE] = { Dampe, NULL, Dampe_Fusion },
|
|
[DR_LEFT] = { DrLeft, NULL, NULL },
|
|
[KING_GUSTAF] = { KingGustaf, NULL, NULL },
|
|
[GINA] = { Gina, NULL, Gina_Fusion },
|
|
[SIMON] = { Simon, NULL, NULL },
|
|
[ANJU] = { Anju, NULL, Anju_Fusion },
|
|
[MAMA] = { Mama, Mama_Head, Mama_Fusion },
|
|
[EMMA] = { Emma, NULL, NULL },
|
|
[TEACHERS] = { Teachers, Teachers_Head, Teachers_Fusion },
|
|
[WIND_TRIBESPEOPLE] = { WindTribespeople, WindTribespeople_Head, WindTribespeople_Fusion },
|
|
[GREGAL] = { Gregal, NULL, Gregal_Fusion },
|
|
[MAYOR_HAGEN] = { MayorHagen, NULL, MayorHagen_Fusion },
|
|
[BIG_GORON] = { BigGoron, NULL, NULL },
|
|
[EZLO_CAP] = { EzloCap, NULL, NULL },
|
|
[NPC_UNK_4E] = { NPC4E, NULL, NPC4E_Fusion },
|
|
[NPC_UNK_4F] = { NPC4F, NULL, NULL },
|
|
[CLOTHES_RACK] = { ClothesRack, NULL, NULL },
|
|
[PICOLYTE_BOTTLE] = { PicolyteBottle, NULL, NULL },
|
|
[SMALL_TOWN_MINISH] = { SmallTownMinish, NULL, NULL },
|
|
[HURDY_GURDY_MAN] = { HurdyGurdyMan, HurdyGurdyMan_Head, HurdyGurdyMan_Fusion },
|
|
[CUCCO] = { Cucco, NULL, Cucco_Fusion },
|
|
[CUCCO_CHICK] = { CuccoChick, NULL, CuccoChick_Fusion },
|
|
[FUSION_MENU_NPC] = { FusionMenuNPC, FusionMenuNPC_Head, NULL },
|
|
[PHONOGRAPH] = { Phonograph, NULL, NULL },
|
|
[NPC_UNK_58] = { NPC58, NPC58_Head, NULL },
|
|
[NPC_NONE_1] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_2] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_3] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_4] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_5] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_6] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_7] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_8] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_9] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_10] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_11] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_12] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_13] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_14] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_15] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_16] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_17] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_18] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_19] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_20] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_21] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_22] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_23] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_24] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_25] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_26] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_27] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_28] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_29] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_30] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_31] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_32] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_33] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_34] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_35] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_36] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_37] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_38] = { DeleteEntity, NULL, NULL },
|
|
[NPC_NONE_39] = { DeleteEntity, NULL, NULL }
|
|
};
|
|
//clang-format on
|
|
const u8 npc_unk[] = { 0x04, 0x05, 0x06, 0x06 };
|
|
|
|
extern u8 gUnk_020342F8;
|
|
typedef struct {
|
|
u16 unk0;
|
|
u16 unk1;
|
|
u16 x;
|
|
u16 y;
|
|
} NPCStruct;
|
|
extern NPCStruct gUnk_02031EC0[100];
|
|
|
|
void InitNPC(Entity*);
|
|
u32 ReadBit(void*, u32);
|
|
|
|
// regalloc
|
|
NONMATCH("asm/non_matching/arm_proxy/NPCUpdate.inc", void NPCUpdate(Entity* this)) {
|
|
if ((this->currentHealth & 0x7f) && !ReadBit(&gUnk_020342F8, this->currentHealth - 1))
|
|
DeleteThisEntity();
|
|
if (this->action == 0 && (this->flags & ENT_DID_INIT) == 0)
|
|
InitNPC(this);
|
|
if (!CheckDontUpdate(this))
|
|
gNPCFunctions[this->id][0](this);
|
|
if (this->next != NULL) {
|
|
if (gNPCFunctions[this->id][1] != NULL)
|
|
gNPCFunctions[this->id][1](this);
|
|
if ((this->currentHealth & 0x7f) != 0) {
|
|
u32 temp = this->currentHealth & 0x7f;
|
|
gUnk_02031EC0[temp * 2 - 2].x = this->x.HALF.HI - gRoomControls.roomOriginX;
|
|
gUnk_02031EC0[temp * 2 - 2].y = this->y.HALF.HI - gRoomControls.roomOriginY;
|
|
}
|
|
DrawEntity(this);
|
|
}
|
|
}
|
|
END_NONMATCH
|