Adjusted how "static" sync entities are removed

No longer needs hacky stuff like relying on the macro for goomba triplet removal.
Instead we simply keep a list of sync ids of objects that were removed (but were
around at the start of level loading)
This commit is contained in:
MysterD 2021-06-13 19:00:55 -07:00
parent 3ab1b0b4b5
commit b1ac0c9f7f
5 changed files with 49 additions and 19 deletions

View File

@ -94,7 +94,7 @@ void network_on_init_level(void) {
}
void network_on_loaded_level(void) {
// check for level change
area_remove_sync_ids_clear();
struct NetworkPlayer* np = gNetworkPlayerLocal;
if (np != NULL) {
bool levelMatch = (np->currCourseNum == gCurrCourseNum

View File

@ -220,6 +220,9 @@ void network_send_area_request(struct NetworkPlayer* fromNp, struct NetworkPlaye
void network_receive_area_request(struct Packet* p);
// packet_area.c
void area_remove_sync_ids_add(u8 syncId);
void area_remove_sync_ids_clear(void);
void network_send_area(struct NetworkPlayer* toNp);
void network_receive_area(struct Packet* p);

View File

@ -12,6 +12,23 @@
//#define DISABLE_MODULE_LOG 1
#include "pc/debuglog.h"
u8 sRemoveSyncIds[RESERVED_IDS_SYNC_OBJECT_OFFSET] = { 0 };
u8 sRemoveSyncIdsIndex = 0;
void area_remove_sync_ids_add(u8 syncId) {
if (syncId >= RESERVED_IDS_SYNC_OBJECT_OFFSET) { return; }
for (int i = 0; i < sRemoveSyncIdsIndex; i++) {
if (sRemoveSyncIds[i] == syncId) { return; }
}
sRemoveSyncIds[sRemoveSyncIdsIndex++] = syncId;
}
void area_remove_sync_ids_clear(void) {
sRemoveSyncIdsIndex = 0;
}
/////////////////////////////////////////////////
void network_send_area(struct NetworkPlayer* toNp) {
extern s16 gCurrCourseNum, gCurrActNum, gCurrLevelNum, gCurrAreaIndex;
@ -26,6 +43,13 @@ void network_send_area(struct NetworkPlayer* toNp) {
packet_write(&p, &gCurrLevelNum, sizeof(s16));
packet_write(&p, &gCurrAreaIndex, sizeof(s16));
// write sync id removals
packet_write(&p, &sRemoveSyncIdsIndex, sizeof(u8));
for (int i = 0; i < sRemoveSyncIdsIndex; i++) {
packet_write(&p, &sRemoveSyncIds[i], sizeof(u8));
LOG_INFO("tx remove sync id %d", sRemoveSyncIds[i]);
}
// count respawners and write
u8 respawnerCount = 0;
for (int i = 0; i < MAX_SYNC_OBJECTS; i++) {
@ -111,6 +135,19 @@ void network_receive_area(struct Packet* p) {
return;
}
// read removed sync ids
area_remove_sync_ids_clear();
packet_read(p, &sRemoveSyncIdsIndex, sizeof(u8));
for (int i = 0; i < sRemoveSyncIdsIndex; i++) {
packet_read(p, &sRemoveSyncIds[i], sizeof(u8));
struct SyncObject* so = &gSyncObjects[sRemoveSyncIds[i]];
if (so->o != NULL) {
so->o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
}
network_forget_sync_object(so);
LOG_INFO("rx remove sync id %d", sRemoveSyncIds[i]);
}
// read respawner count
u8 respawnerCount = 0;
packet_read(p, &respawnerCount, sizeof(u8));

View File

@ -88,7 +88,7 @@ static void network_send_level_macro_area(struct NetworkPlayer* destNp, u8 areaI
// check for special cases
const BehaviorScript* behavior = MacroObjectPresets[presetID].behavior;
if ((behavior == bhvCoinFormation || behavior == bhvGoombaTripletSpawner) && *respawnInfo != 0) {
if ((behavior == bhvCoinFormation) && *respawnInfo != 0) {
*macroSpecialCount = *macroSpecialCount + 1;
u16 offset = respawnInfo - area->macroObjects;
packet_write(&p, &offset, sizeof(u16));
@ -197,21 +197,6 @@ void network_receive_level_macro(struct Packet* p) {
}
LOG_INFO("rx macro special: coin formation");
}
else if (behavior == bhvGoombaTripletSpawner) {
o->oBehParams = *respawnInfo;
u8 goombaParams = (o->oBehParams >> 8) & 0xFF;
u8 childIndex = 0;
for (int i = 0; i < OBJECT_POOL_CAPACITY; i++) {
struct Object* o2 = &gObjectPool[i];
if (o2->parentObj != o) { continue; }
if (o2 == o) { continue; }
if (goombaParams & (1 << childIndex++)) {
obj_mark_for_deletion(o2);
}
}
LOG_INFO("rx macro special: goomba triplet %d", *respawnInfo);
}
}
}
}

View File

@ -13,6 +13,7 @@
struct SyncObject gSyncObjects[MAX_SYNC_OBJECTS] = { 0 };
struct Packet sLastSyncEntReliablePacket[MAX_SYNC_OBJECTS] = { 0 };
u8 sNextSyncId = 0;
struct Packet* get_last_sync_ent_reliable_packet(u8 syncId) {
return &sLastSyncEntReliablePacket[syncId];
@ -137,6 +138,7 @@ bool network_sync_object_initialized(struct Object* o) {
}
void network_clear_sync_objects(void) {
sNextSyncId = 0;
network_on_init_level();
for (u16 i = 0; i < MAX_SYNC_OBJECTS; i++) {
network_forget_sync_object(&gSyncObjects[i]);
@ -150,8 +152,10 @@ void network_set_sync_id(struct Object* o) {
if (!gNetworkLevelLoaded) {
// while loading, just fill in sync ids from 1 to MAX_SYNC_OBJECTS
for (int i = 1; i < MAX_SYNC_OBJECTS; i++) {
if (gSyncObjects[i].o != NULL) { continue; }
syncId = i;
sNextSyncId++;
sNextSyncId = sNextSyncId % RESERVED_IDS_SYNC_OBJECT_OFFSET;
if (gSyncObjects[sNextSyncId].o != NULL) { continue; }
syncId = sNextSyncId;
break;
}
} else {
@ -517,6 +521,7 @@ void network_forget_sync_object(struct SyncObject* so) {
if (so == so2) {
sLastSyncEntReliablePacket[syncId].error = true;
}
area_remove_sync_ids_add(syncId);
}
so->o = NULL;