mirror of https://github.com/zeldaret/tmc.git
117 lines
3.8 KiB
C
117 lines
3.8 KiB
C
/**
|
|
* @file treeItem.c
|
|
* @ingroup Enemies
|
|
*
|
|
* @brief Tree Item enemy
|
|
*/
|
|
|
|
#include "global.h"
|
|
#include "enemy.h"
|
|
#include "object.h"
|
|
#include "item.h"
|
|
|
|
static bool32 ShouldSpawnTreeItem(Entity*);
|
|
|
|
extern void sub_08049CF4(Entity*);
|
|
|
|
const u8 gTreeItemDropTables[][16] = {
|
|
{ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
|
|
};
|
|
const u8 gTreeItemDrops[] = { 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x00, 0x00, 0x00, 0x00 };
|
|
|
|
#define FAIRY_INDEX 8
|
|
|
|
void TreeItem(Entity* this) {
|
|
Entity* itemEntity;
|
|
|
|
if (this->action == 0) {
|
|
this->action++;
|
|
this->field_0x68.HALF.LO = GetRandomByWeight(gTreeItemDropTables[this->type]);
|
|
if (this->field_0x68.HALF.LO > FAIRY_INDEX) {
|
|
DeleteThisEntity();
|
|
}
|
|
if (this->field_0x68.HALF.LO < FAIRY_INDEX && GetInventoryValue(ITEM_KINSTONE_BAG) == 0) {
|
|
this->field_0x68.HALF.LO = FAIRY_INDEX;
|
|
}
|
|
}
|
|
|
|
if (!ShouldSpawnTreeItem(this)) {
|
|
return;
|
|
}
|
|
|
|
switch (this->field_0x68.HALF.LO) {
|
|
case FAIRY_INDEX:
|
|
itemEntity = CreateObject(FAIRY, 0x60, 0);
|
|
if (itemEntity) {
|
|
itemEntity->timer = 0;
|
|
CopyPosition(this, itemEntity);
|
|
}
|
|
break;
|
|
case 0 ...(FAIRY_INDEX - 1):
|
|
itemEntity = CreateObject(OBJECT_96, 0x7, gTreeItemDrops[this->field_0x68.HALF.LO]);
|
|
if (itemEntity) {
|
|
CopyPosition(this, itemEntity);
|
|
itemEntity->y.HALF.HI += 16;
|
|
itemEntity->z.HALF.HI = -32;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
sub_08049CF4(this);
|
|
DeleteThisEntity();
|
|
}
|
|
|
|
static bool32 ShouldSpawnTreeItem(Entity* this) {
|
|
int diff;
|
|
int expectedStateX, expectedStateY;
|
|
int playerState;
|
|
|
|
if (gPlayerEntity.action != PLAYER_BOUNCE) {
|
|
return FALSE;
|
|
}
|
|
|
|
diff = gPlayerEntity.x.HALF.HI - this->x.HALF.HI;
|
|
expectedStateX = 6;
|
|
if (diff & 0x8000) {
|
|
expectedStateX = 2;
|
|
}
|
|
|
|
diff += 40;
|
|
if ((u16)diff >= 80) {
|
|
return FALSE;
|
|
}
|
|
|
|
diff = gPlayerEntity.y.HALF.HI - this->y.HALF.HI;
|
|
expectedStateY = 0;
|
|
if (diff & 0x8000) {
|
|
expectedStateY = 4;
|
|
}
|
|
|
|
diff += 40;
|
|
if ((u16)diff >= 80) {
|
|
return FALSE;
|
|
}
|
|
|
|
playerState = gPlayerEntity.animationState;
|
|
if ((playerState == 0 && expectedStateY == 0) || (playerState == 4 && expectedStateY == 4) ||
|
|
(playerState == 6 && expectedStateX == 6) || (playerState == 2 && expectedStateX == 2)) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|