Castlevania 64: Implement New Game (#2472)
This commit is contained in:
69
worlds/cv64/src/drop_sub_weapon.c
Normal file
69
worlds/cv64/src/drop_sub_weapon.c
Normal file
@@ -0,0 +1,69 @@
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user