Add portal fizzle rumble

This commit is contained in:
James Lambert 2023-10-20 22:00:59 -06:00
parent e1a5a2c852
commit 3d3c012fea
5 changed files with 27 additions and 5 deletions

View file

@ -233,7 +233,7 @@ static void gameProc(void* arg) {
setViMode(0);
osViBlack(1);
levelLoadWithCallbacks(INTRO_MENU);
levelLoadWithCallbacks(3);
gCurrentTestSubject = 0;
cutsceneRunnerReset();
controllersInit();

View file

@ -12,6 +12,16 @@ struct RumblePakWave gPlayerDieRumbleWave = {
.samplesPerTick = 1 << 5,
};
unsigned char gPlayerClosePortalRumbleData[] = {
0xFF, 0xEE,
};
struct RumblePakWave gPlayerClosePortalRumble = {
.samples = gPlayerClosePortalRumbleData,
.sampleCount = 8,
.samplesPerTick = 1 << 5,
};
unsigned char gPlayerLandSoftData[] = {
0xFE, 0x90,
};

View file

@ -5,6 +5,8 @@
extern struct RumblePakWave gPlayerDieRumbleWave;
extern struct RumblePakWave gPlayerClosePortalRumble;
void playerHandleLandingRumble(float velocityChange);
#endif

View file

@ -32,6 +32,7 @@
#include "../menu/game_menu.h"
#include "../effects/effect_definitions.h"
#include "../controls/rumble_pak.h"
#include "../player/player_rumble_clips.h"
extern struct GameMenu gGameMenu;
@ -410,13 +411,19 @@ void sceneCheckPortals(struct Scene* scene) {
hudUpdatePortalIndicators(&scene->hud, &raycastRay, &playerUp);
if (scene->player.body.flags & RigidBodyFizzled) {
int didClose = 0;
if (scene->portals[0].flags & PortalFlagsPlayerPortal) {
sceneClosePortal(scene, 0);
didClose |= sceneClosePortal(scene, 0);
}
if (scene->portals[1].flags & PortalFlagsPlayerPortal) {
sceneClosePortal(scene, 1);
didClose |= sceneClosePortal(scene, 1);
}
scene->player.body.flags &= ~RigidBodyFizzled;
if (didClose) {
rumblePakClipPlay(&gPlayerClosePortalRumble);
}
}
int isOpen = collisionSceneIsPortalOpen();
@ -981,7 +988,7 @@ int sceneFirePortal(struct Scene* scene, struct Ray* ray, struct Vector3* player
return 1;
}
void sceneClosePortal(struct Scene* scene, int portalIndex) {
int sceneClosePortal(struct Scene* scene, int portalIndex) {
if (gCollisionScene.portalTransforms[portalIndex]) {
soundPlayerPlay(soundsPortalFizzle, 1.0f, 1.0f, &gCollisionScene.portalTransforms[portalIndex]->position, &gZeroVec, SoundTypeAll);
hudShowSubtitle(&gScene.hud, PORTAL_FIZZLE_MOVED, SubtitleTypeCaption);
@ -991,5 +998,8 @@ void sceneClosePortal(struct Scene* scene, int portalIndex) {
scene->portals[portalIndex].transformIndex = NO_TRANSFORM_INDEX;
collisionSceneRemoveDynamicObject(&scene->portals[portalIndex].collisionObject);
return 1;
}
return 0;
}

View file

@ -100,6 +100,6 @@ void sceneQueueCheckpoint(struct Scene* scene);
int sceneOpenPortalFromHit(struct Scene* scene, struct Ray* ray, struct RaycastHit* hit, struct Vector3* playerUp, int portalIndex, int roomIndex, int fromPlayer, int just_checking);
int sceneFirePortal(struct Scene* scene, struct Ray* ray, struct Vector3* playerUp, int portalIndex, int roomIndex, int fromPlayer, int just_checking);
void sceneClosePortal(struct Scene* scene, int portalIndex);
int sceneClosePortal(struct Scene* scene, int portalIndex);
#endif