Files
tmc/src/playerItem.c
T
2023-12-31 21:26:12 -08:00

119 lines
4.1 KiB
C

#include "global.h"
#include "functions.h"
#include "player.h"
#include "playeritem.h"
typedef void(PlayerItemFunc)(Entity*);
PlayerItemFunc PlayerItemSword;
PlayerItemFunc PlayerItemBomb;
PlayerItemFunc PlayerItemBoomerang;
PlayerItemFunc PlayerItemBow;
PlayerItemFunc PlayerItemShield;
PlayerItemFunc PlayerItemLantern;
PlayerItemFunc PlayerItemNulled;
PlayerItemFunc PlayerItemGustJar;
PlayerItemFunc PlayerItemPacciCane;
PlayerItemFunc PlayerItemDashSword;
PlayerItemFunc PlayerItemCellOverwriteSet;
PlayerItemFunc PlayerItemBottle;
PlayerItemFunc PlayerItemSwordBeam;
PlayerItemFunc PlayerItemGust;
PlayerItemFunc PlayerItemGustBig;
PlayerItemFunc PlayerItemPacciCaneProjectile;
PlayerItemFunc PlayerItemHeldObject;
PlayerItemFunc PlayerItemSpiralBeam;
PlayerItemFunc PlayerItemFireRodProjectile;
PlayerItemFunc PlayerItemNulled2;
typedef struct {
u8 bitfield;
u8 index;
u8 firstItemIndex;
u8 hurtType;
u8 hitType;
u8 spriteIndex;
u16 gfx;
} PlayerItemDefinition;
extern const PlayerItemDefinition gPlayerItemDefinitions[];
extern const PlayerItemDefinition* gAdditionalPlayerItemDefinitions[3];
PlayerItemFunc* const gPlayerItemFunctions[] = {
[PLAYER_ITEM_NONE] = DeleteEntity,
[PLAYER_ITEM_SWORD] = PlayerItemSword,
[PLAYER_ITEM_BOMB] = PlayerItemBomb,
[PLAYER_ITEM_BOOMERANG] = PlayerItemBoomerang,
[PLAYER_ITEM_BOW] = PlayerItemBow,
[PLAYER_ITEM_SHIELD] = PlayerItemShield,
[PLAYER_ITEM_LANTERN] = PlayerItemLantern,
[PLAYER_ITEM_NULLED] = PlayerItemNulled,
[PLAYER_ITEM_GUST_JAR] = PlayerItemGustJar,
[PLAYER_ITEM_PACCI_CANE] = PlayerItemPacciCane,
[PLAYER_ITEM_NONE2] = DeleteEntity,
[PLAYER_ITEM_NONE3] = DeleteEntity,
[PLAYER_ITEM_DASH_SWORD] = PlayerItemDashSword,
[PLAYER_ITEM_CELL_OVERWRITE_SET] = PlayerItemCellOverwriteSet,
[PLAYER_ITEM_BOTTLE] = PlayerItemBottle,
[PLAYER_ITEM_SWORD_BEAM1] = PlayerItemSwordBeam,
[PLAYER_ITEM_GUST] = PlayerItemGust,
[PLAYER_ITEM_GUST_BIG] = PlayerItemGustBig,
[PLAYER_ITEM_PACCI_CANE_PROJECTILE] = PlayerItemPacciCaneProjectile,
[PLAYER_ITEM_HELD_OBJECT] = PlayerItemHeldObject,
[PLAYER_ITEM_SPIRAL_BEAM] = PlayerItemSpiralBeam,
[PLAYER_ITEM_FIRE_ROD_PROJECTILE] = PlayerItemFireRodProjectile,
[PLAYER_ITEM_SWORD_BEAM2] = PlayerItemSwordBeam,
[PLAYER_ITEM_NULLED2] = PlayerItemNulled2,
[PLAYER_ITEM_CELL_OVERWRITE_SET2] = PlayerItemCellOverwriteSet,
};
void ItemInit(Entity*);
void ItemUpdate(Entity* this) {
if ((this->flags & ENT_DID_INIT) == 0 && this->action == 0 && this->subAction == 0)
ItemInit(this);
if (!EntityDisabled(this)) {
gPlayerItemFunctions[this->id](this);
this->contactFlags &= ~CONTACT_NOW;
if (this->iframes != 0) {
if (this->iframes > 0)
this->iframes--;
else
this->iframes++;
}
}
DrawEntity(this);
}
void ItemInit(Entity* this) {
u32 tmp2, tmp3;
const PlayerItemDefinition* definition = &gPlayerItemDefinitions[this->id];
if (definition->bitfield == 0xff) {
u32 tmp = definition->firstItemIndex;
definition = gAdditionalPlayerItemDefinitions[definition->index];
definition = &definition[((GenericEntity*)this)->field_0x68.HALF.LO - tmp];
}
tmp3 = definition->bitfield;
tmp2 = tmp3 & 0xf;
this->palette.raw = (tmp3 << 4) | (tmp2);
this->damage = definition->index;
this->hurtType = definition->hurtType;
this->hitType = definition->hitType;
this->spriteIndex = definition->spriteIndex;
if (definition->gfx == 0) {
this->spriteVramOffset = gPlayerEntity.base.spriteVramOffset;
} else {
this->spriteVramOffset = definition->gfx & 0x3ff;
}
if (this->animationState == IdleNorth) {
this->animationState = gPlayerEntity.base.animationState & 6;
}
this->collisionLayer = gPlayerEntity.base.collisionLayer;
this->spriteRendering.b3 = gPlayerEntity.base.spriteRendering.b3;
this->spritePriority.b0 = gPlayerEntity.base.spritePriority.b0;
this->spriteOrientation.flipY = gPlayerEntity.base.spriteOrientation.flipY;
this->health = 1;
this->flags |= ENT_DID_INIT;
}