69 lines
2.7 KiB
C
69 lines
2.7 KiB
C
// Written by Moisés
|
|
#include "include/game/module.h"
|
|
#include "include/game/math.h"
|
|
#include "cv64.h"
|
|
|
|
extern vec3f player_pos;
|
|
extern vec3s player_angle; // player_angle.y = Player's facing angle (yaw)
|
|
extern f32 player_height_with_respect_of_floor; // Stored negative in-game
|
|
|
|
#define SHT_MAX 32767.0f
|
|
#define SHT_MINV (1.0f / SHT_MAX)
|
|
|
|
void spawn_item_behind_player(s32 item) {
|
|
interactuablesModule* pickable_item = NULL;
|
|
const f32 spawnDistance = 8.0f;
|
|
vec3f player_backwards_dir;
|
|
|
|
pickable_item = (interactuablesModule*)module_createAndSetChild(moduleList_findFirstModuleByID(ACTOR_CREATOR), ACTOR_ITEM);
|
|
if (pickable_item != NULL) {
|
|
// Convert facing angle to a vec3f
|
|
// SHT_MINV needs to be negative here for the item to be spawned properly on the character's back
|
|
player_backwards_dir.x = coss(-player_angle.y) * -SHT_MINV;
|
|
player_backwards_dir.z = sins(-player_angle.y) * -SHT_MINV;
|
|
// Multiply facing vector with distance away from the player
|
|
vec3f_multiplyScalar(&player_backwards_dir, &player_backwards_dir, spawnDistance);
|
|
// Assign the position of the item relative to the player's current position.
|
|
vec3f_add(&pickable_item->position, &player_pos, &player_backwards_dir);
|
|
// The Y position of the item will be the same as the floor right under the player
|
|
// The player's height with respect of the flower under them is already stored negative in-game,
|
|
// so no need to substract
|
|
pickable_item->position.y = player_pos.y + 5.0f;
|
|
pickable_item->height = pickable_item->position.y;
|
|
|
|
// Assign item ID
|
|
pickable_item->item_ID = item;
|
|
}
|
|
}
|
|
|
|
|
|
const f32 droppingAccel = 0.05f;
|
|
const f32 maxDroppingSpeed = 1.5f;
|
|
f32 droppingSpeed = 0.0f;
|
|
f32 droppingTargetYPos = 0.0f;
|
|
u8 dropItemCalcFuncCalled = FALSE;
|
|
|
|
s32 drop_item_calc(interactuablesModule* pickable_item) {
|
|
if (dropItemCalcFuncCalled == FALSE) {
|
|
droppingTargetYPos = player_pos.y + player_height_with_respect_of_floor + 1.0f;
|
|
if (pickable_item->item_ID == CROSS || pickable_item->item_ID == AXE ||
|
|
pickable_item->item_ID == CROSS__VANISH || pickable_item->item_ID == AXE__VANISH) {
|
|
droppingTargetYPos += 3.0f;
|
|
}
|
|
dropItemCalcFuncCalled = TRUE;
|
|
return TRUE;
|
|
}
|
|
if (pickable_item->position.y <= droppingTargetYPos) {
|
|
droppingSpeed = 0.0f;
|
|
dropItemCalcFuncCalled = FALSE;
|
|
return FALSE;
|
|
}
|
|
else {
|
|
if (droppingSpeed < maxDroppingSpeed) {
|
|
droppingSpeed += droppingAccel;
|
|
}
|
|
pickable_item->position.y -= droppingSpeed;
|
|
pickable_item->height = pickable_item->position.y;
|
|
return TRUE;
|
|
}
|
|
} |