193 lines
8.3 KiB
C
193 lines
8.3 KiB
C
#include <actors.h>
|
|
#include <code_800029B0.h>
|
|
#include <defines.h>
|
|
#include <main.h>
|
|
|
|
/**
|
|
* @brief Update the banana actor
|
|
*
|
|
* @param banana
|
|
*/
|
|
void update_actor_banana(struct BananaActor* banana) {
|
|
UNUSED f32 pad;
|
|
Player* player;
|
|
struct BananaActor* elderBanana;
|
|
struct Controller* controller;
|
|
Vec3f someOtherVelocity;
|
|
Vec3f someVelocity;
|
|
f32 temp_f0;
|
|
UNUSED f32 var_f8;
|
|
UNUSED f32 pad2;
|
|
UNUSED f32 pad3;
|
|
UNUSED f32 pad4[2];
|
|
f32 temp_f12;
|
|
f32 temp_f2;
|
|
f32 temp_f14;
|
|
f32 temp_f16;
|
|
f32 unkX;
|
|
f32 unkY;
|
|
f32 unkZ;
|
|
|
|
player = &gPlayers[banana->playerId];
|
|
switch (banana->state) {
|
|
case HELD_BANANA:
|
|
temp_f2 = player->pos[0] - banana->pos[0];
|
|
temp_f14 = player->pos[1] - banana->pos[1];
|
|
temp_f16 = player->pos[2] - banana->pos[2];
|
|
temp_f12 = sqrtf((temp_f2 * temp_f2) + (temp_f14 * temp_f14) + (temp_f16 * temp_f16)) / 10.0f;
|
|
if (temp_f12 == 0.0f) {
|
|
banana->pos[0] = player->pos[0] + 0.2f;
|
|
banana->pos[1] = player->pos[1] + 0.2f;
|
|
banana->pos[2] = player->pos[2] + 0.2f;
|
|
} else {
|
|
temp_f2 /= temp_f12;
|
|
temp_f14 /= temp_f12;
|
|
temp_f16 /= temp_f12;
|
|
banana->pos[0] = player->pos[0] - temp_f2;
|
|
banana->pos[1] = player->pos[1] - temp_f14 - 2.0f;
|
|
banana->pos[2] = player->pos[2] - temp_f16;
|
|
}
|
|
check_bounding_collision(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1],
|
|
banana->pos[2]);
|
|
func_802B4E30((struct Actor*) banana);
|
|
if ((player->type & PLAYER_HUMAN) != 0) {
|
|
if (gDemoMode) {
|
|
controller = gControllerOne;
|
|
} else {
|
|
controller = &gControllers[banana->playerId];
|
|
}
|
|
if ((controller->buttonDepressed & Z_TRIG) != 0) {
|
|
controller->buttonDepressed &= ~Z_TRIG;
|
|
banana->state = 1;
|
|
banana->unk_04 = 0x00B4;
|
|
player->triggers &= ~DRAG_ITEM_EFFECT;
|
|
func_800C9060(player - gPlayerOne, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x12));
|
|
pad3 = controller->rawStickY;
|
|
if ((pad3 > 30.0f) && (controller->rawStickX < 10) && (controller->rawStickX >= -9)) {
|
|
pad3 = pad3 - ((f32) 30);
|
|
pad3 = (pad3 / 20.0f) + 0.5f;
|
|
if (player->speed < 2.0f) {
|
|
temp_f0 = 4.0f;
|
|
} else {
|
|
temp_f0 = (player->speed * 0.75f) + 3.5f + pad3;
|
|
}
|
|
vec3f_set(someVelocity, 0, pad3, temp_f0);
|
|
func_802B64C4(someVelocity, player->rotation[1] + player->unk_0C0);
|
|
banana->velocity[0] = someVelocity[0];
|
|
banana->velocity[1] = someVelocity[1];
|
|
banana->velocity[2] = someVelocity[2];
|
|
} else {
|
|
banana->velocity[0] = 0;
|
|
banana->velocity[1] = 1.5f;
|
|
banana->velocity[2] = 0;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case DROPPED_BANANA:
|
|
if (banana->unk_04 != 0) {
|
|
banana->unk_04 -= 1;
|
|
if (banana->unk_04 == 0) {
|
|
banana->flags &= ~0x1000;
|
|
}
|
|
}
|
|
banana->pos[0] += banana->velocity[0];
|
|
banana->pos[2] += banana->velocity[2];
|
|
if (banana->velocity[1] > -1.0f) {
|
|
banana->velocity[1] -= 0.15f;
|
|
}
|
|
banana->pos[1] += banana->velocity[1];
|
|
if ((banana->pos[2] < (f32) gTrackMinZ) || ((f32) gTrackMaxZ < banana->pos[2]) ||
|
|
(banana->pos[0] < (f32) gTrackMinX) || ((f32) gTrackMaxX < banana->pos[0]) ||
|
|
(banana->pos[1] < (f32) gTrackMinY)) {
|
|
destroy_destructable_actor((struct Actor*) banana);
|
|
} else {
|
|
check_bounding_collision(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1],
|
|
banana->pos[2]);
|
|
banana->unk30.unk34 = 1;
|
|
if ((banana->unk30.unk34 != 0) && (banana->unk30.surfaceDistance[2] < 0.0f)) {
|
|
someOtherVelocity[0] = -banana->unk30.orientationVector[0];
|
|
someOtherVelocity[1] = -banana->unk30.orientationVector[1];
|
|
someOtherVelocity[2] = -banana->unk30.orientationVector[2];
|
|
banana->pos[0] += someOtherVelocity[0] * banana->unk30.surfaceDistance[2];
|
|
banana->pos[1] += someOtherVelocity[1] * banana->unk30.surfaceDistance[2];
|
|
banana->pos[2] += someOtherVelocity[2] * banana->unk30.surfaceDistance[2];
|
|
banana->flags &= ~0x1000;
|
|
banana->state = 4;
|
|
}
|
|
}
|
|
break;
|
|
case FIRST_BANANA_BUNCH_BANANA:
|
|
someVelocity[0] = 0.0f;
|
|
someVelocity[1] = 0.0f;
|
|
someVelocity[2] = -5.0f;
|
|
func_802B64C4(someVelocity, player->rotation[1] + player->unk_0C0);
|
|
unkX = player->pos[0] + someVelocity[0];
|
|
unkY = player->pos[1] + someVelocity[1];
|
|
unkZ = player->pos[2] + someVelocity[2];
|
|
temp_f2 = unkX - banana->pos[0];
|
|
temp_f14 = unkY - banana->pos[1];
|
|
temp_f16 = unkZ - banana->pos[2];
|
|
temp_f0 = sqrtf((temp_f2 * temp_f2) + (temp_f14 * temp_f14) + (temp_f16 * temp_f16));
|
|
if (temp_f0 == 0.0f) {
|
|
banana->pos[0] = player->pos[0] + 0.2f;
|
|
banana->pos[1] = player->pos[1] + 0.2f;
|
|
banana->pos[2] = player->pos[2] + 0.2f;
|
|
} else {
|
|
temp_f2 /= temp_f0;
|
|
temp_f14 /= temp_f0;
|
|
temp_f16 /= temp_f0;
|
|
banana->pos[0] = someVelocity[0] + (unkX - temp_f2);
|
|
banana->pos[1] = unkY - temp_f14 - 2.0f;
|
|
banana->pos[2] = unkZ - temp_f16;
|
|
}
|
|
check_bounding_collision(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1],
|
|
banana->pos[2]);
|
|
func_802B4E30((struct Actor*) banana);
|
|
break;
|
|
case BANANA_BUNCH_BANANA:
|
|
elderBanana = (struct BananaActor*) GET_ACTOR(banana->elderIndex);
|
|
temp_f2 = elderBanana->pos[0] - banana->pos[0];
|
|
temp_f14 = elderBanana->pos[1] - banana->pos[1];
|
|
temp_f16 = elderBanana->pos[2] - banana->pos[2];
|
|
temp_f12 = sqrtf((temp_f2 * temp_f2) + (temp_f14 * temp_f14) + (temp_f16 * temp_f16)) / 5.0f;
|
|
if (temp_f12 == 0.0f) {
|
|
banana->pos[0] = elderBanana->pos[0] + 0.2f;
|
|
banana->pos[1] = elderBanana->pos[1] + 0.2f;
|
|
banana->pos[2] = elderBanana->pos[2] + 0.2f;
|
|
} else {
|
|
temp_f2 /= temp_f12;
|
|
temp_f14 /= temp_f12;
|
|
temp_f16 /= temp_f12;
|
|
banana->pos[0] = elderBanana->pos[0] - temp_f2;
|
|
banana->pos[1] = elderBanana->pos[1] - temp_f14 - 2.0f;
|
|
banana->pos[2] = elderBanana->pos[2] - temp_f16;
|
|
}
|
|
var_f8 = banana->pos[2];
|
|
check_bounding_collision(&banana->unk30, banana->boundingBoxSize + 1.0f, banana->pos[0], banana->pos[1],
|
|
banana->pos[2]);
|
|
func_802B4E30((struct Actor*) banana);
|
|
break;
|
|
case DESTROYED_BANANA:
|
|
banana->velocity[1] -= 0.3f;
|
|
if (banana->velocity[1] < -5.0f) {
|
|
banana->velocity[1] = -5.0f;
|
|
}
|
|
banana->pos[1] += banana->velocity[1];
|
|
banana->rot[0] += 0x16C;
|
|
banana->rot[1] -= 0x5B0;
|
|
banana->rot[2] += 0x38E;
|
|
banana->unk_04 -= 1;
|
|
if (banana->unk_04 == 0) {
|
|
destroy_actor((struct Actor*) banana);
|
|
}
|
|
break;
|
|
case BANANA_ON_GROUND:
|
|
banana->flags |= 0xC000;
|
|
banana->flags &= ~0x1000;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|