Fix activated ball catcher save file serialization

Previously, all activated catchers would reference the same ball
when saving, causing position and signal issues if the referenced
ball's launcher was in use.

Fixes glitchy ball movement in chamber 15 final room.
This commit is contained in:
Matt Penny 2024-07-17 23:46:31 -04:00
parent ef179ec553
commit f67ba7a5cc
4 changed files with 11 additions and 10 deletions

View file

@ -316,7 +316,7 @@ void pedestalDeserialize(struct Serializer* serializer, struct Scene* scene) {
}
void launcherSerialize(struct Serializer* serializer, SerializeAction action, struct Scene* scene) {
for (int i = 0; i < scene->ballLancherCount; ++i) {
for (int i = 0; i < scene->ballLauncherCount; ++i) {
struct BallLauncher* launcher = &scene->ballLaunchers[i];
action(serializer, &launcher->currentBall.targetSpeed, sizeof(float));
action(serializer, &launcher->currentBall.flags, sizeof(short));
@ -333,7 +333,7 @@ void launcherSerialize(struct Serializer* serializer, SerializeAction action, st
}
void launcherDeserialize(struct Serializer* serializer, struct Scene* scene) {
for (int i = 0; i < scene->ballLancherCount; ++i) {
for (int i = 0; i < scene->ballLauncherCount; ++i) {
struct BallLauncher* launcher = &scene->ballLaunchers[i];
serializeRead(serializer, &launcher->currentBall.targetSpeed, sizeof(float));
serializeRead(serializer, &launcher->currentBall.flags, sizeof(short));
@ -361,8 +361,8 @@ void catcherSerialize(struct Serializer* serializer, SerializeAction action, str
short caughtIndex = -1;
for (int launcherIndex = 0; launcherIndex < scene->ballLancherCount; ++launcherIndex) {
if (&scene->ballLaunchers[i].currentBall == catcher->caughtBall) {
for (int launcherIndex = 0; launcherIndex < scene->ballLauncherCount; ++launcherIndex) {
if (&scene->ballLaunchers[launcherIndex].currentBall == catcher->caughtBall) {
caughtIndex = launcherIndex;
break;
}

View file

@ -146,4 +146,5 @@ void ballCatcherHandBall(struct BallCatcher* catcher, struct Ball* caughtBall) {
struct Vector3 targetPosition;
transformPoint(&catcher->rigidBody.transform, &gLocalCatcherLocation, &targetPosition);
catcher->caughtBall->rigidBody.transform.position = targetPosition;
catcher->caughtBall->flags |= BallFlagsPowering;
}

View file

@ -233,9 +233,9 @@ void sceneInitNoPauseMenu(struct Scene* scene, int mainMenuMode) {
ballBurnMarkInit();
scene->ballLancherCount = gCurrentLevel->ballLauncherCount;
scene->ballLaunchers = malloc(sizeof(struct BallLauncher) * scene->ballLancherCount);
for (int i = 0; i < scene->ballLancherCount; ++i) {
scene->ballLauncherCount = gCurrentLevel->ballLauncherCount;
scene->ballLaunchers = malloc(sizeof(struct BallLauncher) * scene->ballLauncherCount);
for (int i = 0; i < scene->ballLauncherCount; ++i) {
ballLauncherInit(&scene->ballLaunchers[i], &gCurrentLevel->ballLaunchers[i]);
}
@ -672,7 +672,7 @@ void sceneUpdate(struct Scene* scene) {
}
for (int i = 0; i < scene->ballCatcherCount; ++i) {
ballCatcherUpdate(&scene->ballCatchers[i], scene->ballLaunchers, scene->ballLancherCount);
ballCatcherUpdate(&scene->ballCatchers[i], scene->ballLaunchers, scene->ballLauncherCount);
}
for (int i = 0; i < scene->triggerListenerCount; ++i) {
@ -735,7 +735,7 @@ void sceneUpdate(struct Scene* scene) {
boxDropperUpdate(&scene->boxDroppers[i]);
}
for (int i = 0; i < scene->ballLancherCount; ++i) {
for (int i = 0; i < scene->ballLauncherCount; ++i) {
ballLauncherUpdate(&scene->ballLaunchers[i]);
}

View file

@ -78,7 +78,7 @@ struct Scene {
u8 signageCount;
u8 boxDropperCount;
u8 switchCount;
u8 ballLancherCount;
u8 ballLauncherCount;
u8 ballCatcherCount;
u8 clockCount;
u8 securityCameraCount;