Synchronized red coin count on join.

This commit is contained in:
MysterD 2021-06-13 18:32:35 -07:00
parent 518a1fda4b
commit 3ab1b0b4b5
3 changed files with 25 additions and 8 deletions

View file

@ -23,7 +23,6 @@ struct NetworkSystem* gNetworkSystem = &gNetworkSystemSocket;
#endif
#define LOADING_LEVEL_THRESHOLD 10
#define SYNCING_LEVEL_THRESHOLD 30 * 6
u16 networkLoadingLevel = 0;
bool gNetworkLevelLoaded = false;
@ -225,15 +224,12 @@ void network_receive(u8 localIndex, u8* data, u16 dataLength) {
void network_update(void) {
// check for level loaded event
if (networkLoadingLevel < SYNCING_LEVEL_THRESHOLD) {
if (networkLoadingLevel < LOADING_LEVEL_THRESHOLD) {
networkLoadingLevel++;
if (!gNetworkLevelLoaded && networkLoadingLevel >= LOADING_LEVEL_THRESHOLD) {
gNetworkLevelLoaded = true;
network_on_loaded_level();
}
if (networkLoadingLevel >= SYNCING_LEVEL_THRESHOLD) {
gNetworkLevelSyncing = false;
}
}
// send out update packets

View file

@ -1,7 +1,12 @@
#include <stdio.h>
#include "../network.h"
#include "game/object_list_processor.h"
#include "game/interaction.h"
#include "game/level_update.h"
#include "game/ingame_menu.h"
#include "behavior_table.h"
#include "object_constants.h"
#include "object_fields.h"
#define DISABLE_MODULE_LOG 1
#include "pc/debuglog.h"
@ -20,6 +25,7 @@ void network_send_level(struct NetworkPlayer* toNp, bool sendArea) {
// level variables
packet_write(&p, &gMarioStates[0].numCoins, sizeof(s16));
packet_write(&p, &gRedCoinsCollected, sizeof(u8));
packet_write(&p, &gPssSlideStarted, sizeof(u8));
packet_write(&p, &gHudDisplay.timer, sizeof(u16));
@ -61,7 +67,18 @@ void network_receive_level(struct Packet* p) {
}
// read level variables
packet_write(p, &gMarioStates[0].numCoins, sizeof(s16));
packet_write(p, &gPssSlideStarted, sizeof(u8));
packet_write(p, &gHudDisplay.timer, sizeof(u16));
u8 redCoinsCollected;
packet_read(p, &gMarioStates[0].numCoins, sizeof(s16));
packet_read(p, &redCoinsCollected, sizeof(u8));
packet_read(p, &gPssSlideStarted, sizeof(u8));
packet_read(p, &gHudDisplay.timer, sizeof(u16));
// hacky way to override red coins collected
gRedCoinsCollected = redCoinsCollected;
for (int i = 0; i < OBJECT_POOL_CAPACITY; i++) {
struct Object* o = &gObjectPool[i];
if (o->behavior == bhvBowserCourseRedCoinStar || o->behavior == bhvHiddenRedCoinStar) {
o->oHiddenStarTriggerCounter = redCoinsCollected;
}
}
}

View file

@ -10,6 +10,7 @@ void network_send_sync_valid(struct NetworkPlayer* toNp) {
if (toNp == gNetworkPlayerLocal) {
// the player is the server, no need to send it
gNetworkLevelSyncing = false;
return;
}
@ -59,4 +60,7 @@ void network_receive_sync_valid(struct Packet* p) {
LOG_INFO("informing server of sync valid");
network_send_sync_valid(gNetworkPlayerServer);
}
// we're no longer syncing
gNetworkLevelSyncing = false;
}