Archipelago/worlds/cv64/src/drop_sub_weapon.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;
}
}