mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
Synchronized red coin count on join.
This commit is contained in:
parent
518a1fda4b
commit
3ab1b0b4b5
3 changed files with 25 additions and 8 deletions
|
|
@ -23,7 +23,6 @@ struct NetworkSystem* gNetworkSystem = &gNetworkSystemSocket;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LOADING_LEVEL_THRESHOLD 10
|
#define LOADING_LEVEL_THRESHOLD 10
|
||||||
#define SYNCING_LEVEL_THRESHOLD 30 * 6
|
|
||||||
|
|
||||||
u16 networkLoadingLevel = 0;
|
u16 networkLoadingLevel = 0;
|
||||||
bool gNetworkLevelLoaded = false;
|
bool gNetworkLevelLoaded = false;
|
||||||
|
|
@ -225,15 +224,12 @@ void network_receive(u8 localIndex, u8* data, u16 dataLength) {
|
||||||
void network_update(void) {
|
void network_update(void) {
|
||||||
|
|
||||||
// check for level loaded event
|
// check for level loaded event
|
||||||
if (networkLoadingLevel < SYNCING_LEVEL_THRESHOLD) {
|
if (networkLoadingLevel < LOADING_LEVEL_THRESHOLD) {
|
||||||
networkLoadingLevel++;
|
networkLoadingLevel++;
|
||||||
if (!gNetworkLevelLoaded && networkLoadingLevel >= LOADING_LEVEL_THRESHOLD) {
|
if (!gNetworkLevelLoaded && networkLoadingLevel >= LOADING_LEVEL_THRESHOLD) {
|
||||||
gNetworkLevelLoaded = true;
|
gNetworkLevelLoaded = true;
|
||||||
network_on_loaded_level();
|
network_on_loaded_level();
|
||||||
}
|
}
|
||||||
if (networkLoadingLevel >= SYNCING_LEVEL_THRESHOLD) {
|
|
||||||
gNetworkLevelSyncing = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// send out update packets
|
// send out update packets
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,12 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "../network.h"
|
#include "../network.h"
|
||||||
|
#include "game/object_list_processor.h"
|
||||||
#include "game/interaction.h"
|
#include "game/interaction.h"
|
||||||
#include "game/level_update.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
|
#define DISABLE_MODULE_LOG 1
|
||||||
#include "pc/debuglog.h"
|
#include "pc/debuglog.h"
|
||||||
|
|
||||||
|
|
@ -20,6 +25,7 @@ void network_send_level(struct NetworkPlayer* toNp, bool sendArea) {
|
||||||
|
|
||||||
// level variables
|
// level variables
|
||||||
packet_write(&p, &gMarioStates[0].numCoins, sizeof(s16));
|
packet_write(&p, &gMarioStates[0].numCoins, sizeof(s16));
|
||||||
|
packet_write(&p, &gRedCoinsCollected, sizeof(u8));
|
||||||
packet_write(&p, &gPssSlideStarted, sizeof(u8));
|
packet_write(&p, &gPssSlideStarted, sizeof(u8));
|
||||||
packet_write(&p, &gHudDisplay.timer, sizeof(u16));
|
packet_write(&p, &gHudDisplay.timer, sizeof(u16));
|
||||||
|
|
||||||
|
|
@ -61,7 +67,18 @@ void network_receive_level(struct Packet* p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// read level variables
|
// read level variables
|
||||||
packet_write(p, &gMarioStates[0].numCoins, sizeof(s16));
|
u8 redCoinsCollected;
|
||||||
packet_write(p, &gPssSlideStarted, sizeof(u8));
|
packet_read(p, &gMarioStates[0].numCoins, sizeof(s16));
|
||||||
packet_write(p, &gHudDisplay.timer, sizeof(u16));
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ void network_send_sync_valid(struct NetworkPlayer* toNp) {
|
||||||
|
|
||||||
if (toNp == gNetworkPlayerLocal) {
|
if (toNp == gNetworkPlayerLocal) {
|
||||||
// the player is the server, no need to send it
|
// the player is the server, no need to send it
|
||||||
|
gNetworkLevelSyncing = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,4 +60,7 @@ void network_receive_sync_valid(struct Packet* p) {
|
||||||
LOG_INFO("informing server of sync valid");
|
LOG_INFO("informing server of sync valid");
|
||||||
network_send_sync_valid(gNetworkPlayerServer);
|
network_send_sync_valid(gNetworkPlayerServer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we're no longer syncing
|
||||||
|
gNetworkLevelSyncing = false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue