mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-10-19 03:32:41 +00:00
Snap players on top of synchronized platforms
This commit is contained in:
parent
b6d96adbf0
commit
dd8de27014
5 changed files with 55 additions and 18 deletions
|
@ -420,6 +420,12 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32
|
||||||
surfaceNode = surfaceNode->next;
|
surfaceNode = surfaceNode->next;
|
||||||
interpolate = gInterpolatingSurfaces && surf->modifiedTimestamp == gGlobalTimer;
|
interpolate = gInterpolatingSurfaces && surf->modifiedTimestamp == gGlobalTimer;
|
||||||
|
|
||||||
|
if (gCheckingSurfaceCollisionsForObject != NULL) {
|
||||||
|
if (surf->object != gCheckingSurfaceCollisionsForObject) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
x1 = surf->vertex1[0];
|
x1 = surf->vertex1[0];
|
||||||
z1 = surf->vertex1[2];
|
z1 = surf->vertex1[2];
|
||||||
x2 = surf->vertex2[0];
|
x2 = surf->vertex2[0];
|
||||||
|
|
|
@ -144,7 +144,7 @@ s32 gNumStaticSurfaces;
|
||||||
*/
|
*/
|
||||||
struct MemoryPool *gObjectMemoryPool;
|
struct MemoryPool *gObjectMemoryPool;
|
||||||
|
|
||||||
|
struct Object* gCheckingSurfaceCollisionsForObject = NULL;
|
||||||
s16 gCheckingSurfaceCollisionsForCamera;
|
s16 gCheckingSurfaceCollisionsForCamera;
|
||||||
s16 gFindFloorIncludeSurfaceIntangible;
|
s16 gFindFloorIncludeSurfaceIntangible;
|
||||||
s16 *gEnvironmentRegions;
|
s16 *gEnvironmentRegions;
|
||||||
|
|
|
@ -103,6 +103,7 @@ extern s32 gNumStaticSurfaces;
|
||||||
|
|
||||||
extern struct MemoryPool *gObjectMemoryPool;
|
extern struct MemoryPool *gObjectMemoryPool;
|
||||||
|
|
||||||
|
extern struct Object* gCheckingSurfaceCollisionsForObject;
|
||||||
extern s16 gCheckingSurfaceCollisionsForCamera;
|
extern s16 gCheckingSurfaceCollisionsForCamera;
|
||||||
extern s16 gFindFloorIncludeSurfaceIntangible;
|
extern s16 gFindFloorIncludeSurfaceIntangible;
|
||||||
extern s16 *gEnvironmentRegions;
|
extern s16 *gEnvironmentRegions;
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
||||||
static u8 warpToLevel = LEVEL_DDD;
|
static u8 warpToLevel = LEVEL_BITFS;
|
||||||
|
|
||||||
#define SCANCODE_0 0x0B
|
#define SCANCODE_0 0x0B
|
||||||
#define SCANCODE_1 0x02
|
#define SCANCODE_1 0x02
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#include "game/mario.h"
|
#include "game/mario.h"
|
||||||
#include "game/area.h"
|
#include "game/area.h"
|
||||||
#include "audio/external.h"
|
#include "audio/external.h"
|
||||||
|
#include "engine/surface_collision.h"
|
||||||
|
#include "game/object_list_processor.h"
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
struct PacketPlayerData {
|
struct PacketPlayerData {
|
||||||
|
@ -44,20 +46,22 @@ struct PacketPlayerData {
|
||||||
s16 currentRoom;
|
s16 currentRoom;
|
||||||
|
|
||||||
u8 customFlags;
|
u8 customFlags;
|
||||||
u32 heldSyncID;
|
u8 heldSyncID;
|
||||||
u32 heldBySyncID;
|
u8 heldBySyncID;
|
||||||
u32 interactSyncID;
|
u8 interactSyncID;
|
||||||
u32 usedSyncID;
|
u8 usedSyncID;
|
||||||
|
u8 platformSyncID;
|
||||||
|
|
||||||
s16 currLevelNum;
|
s16 currLevelNum;
|
||||||
s16 currAreaIndex;
|
s16 currAreaIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void read_packet_data(struct PacketPlayerData* data, struct MarioState* m) {
|
static void read_packet_data(struct PacketPlayerData* data, struct MarioState* m) {
|
||||||
u32 heldSyncID = (m->heldObj != NULL) ? m->heldObj->oSyncID : 0;
|
u8 heldSyncID = (m->heldObj != NULL) ? m->heldObj->oSyncID : 0;
|
||||||
u32 heldBySyncID = (m->heldByObj != NULL) ? m->heldByObj->oSyncID : 0;
|
u8 heldBySyncID = (m->heldByObj != NULL) ? m->heldByObj->oSyncID : 0;
|
||||||
u32 interactSyncID = (m->interactObj != NULL) ? m->interactObj->oSyncID : 0;
|
u8 interactSyncID = (m->interactObj != NULL) ? m->interactObj->oSyncID : 0;
|
||||||
u32 usedSyncID = (m->usedObj != NULL) ? m->usedObj->oSyncID : 0;
|
u8 usedSyncID = (m->usedObj != NULL) ? m->usedObj->oSyncID : 0;
|
||||||
|
u8 platformSyncID = (m->marioObj->platform != NULL) ? m->marioObj->platform->oSyncID : 0;
|
||||||
|
|
||||||
u8 customFlags = SET_BIT((m->freeze > 0), 0);
|
u8 customFlags = SET_BIT((m->freeze > 0), 0);
|
||||||
|
|
||||||
|
@ -99,14 +103,15 @@ static void read_packet_data(struct PacketPlayerData* data, struct MarioState* m
|
||||||
data->heldBySyncID = heldBySyncID;
|
data->heldBySyncID = heldBySyncID;
|
||||||
data->interactSyncID = interactSyncID;
|
data->interactSyncID = interactSyncID;
|
||||||
data->usedSyncID = usedSyncID;
|
data->usedSyncID = usedSyncID;
|
||||||
|
data->platformSyncID = platformSyncID;
|
||||||
|
|
||||||
data->currLevelNum = gCurrLevelNum;
|
data->currLevelNum = gCurrLevelNum;
|
||||||
data->currAreaIndex = gCurrAreaIndex;
|
data->currAreaIndex = gCurrAreaIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_packet_data(struct PacketPlayerData* data, struct MarioState* m,
|
static void write_packet_data(struct PacketPlayerData* data, struct MarioState* m,
|
||||||
u8* customFlags, u32* heldSyncID, u32* heldBySyncID,
|
u8* customFlags, u8* heldSyncID, u8* heldBySyncID,
|
||||||
u32* interactSyncID, u32* usedSyncID) {
|
u8* interactSyncID, u8* usedSyncID, u8* platformSyncID) {
|
||||||
memcpy(m->marioObj->rawData.asU32, data->rawData, sizeof(u32) * 80);
|
memcpy(m->marioObj->rawData.asU32, data->rawData, sizeof(u32) * 80);
|
||||||
m->marioObj->header.gfx.node.flags = data->nodeFlags;
|
m->marioObj->header.gfx.node.flags = data->nodeFlags;
|
||||||
*m->controller = data->controller;
|
*m->controller = data->controller;
|
||||||
|
@ -145,6 +150,7 @@ static void write_packet_data(struct PacketPlayerData* data, struct MarioState*
|
||||||
*heldBySyncID = data->heldBySyncID;
|
*heldBySyncID = data->heldBySyncID;
|
||||||
*interactSyncID = data->interactSyncID;
|
*interactSyncID = data->interactSyncID;
|
||||||
*usedSyncID = data->usedSyncID;
|
*usedSyncID = data->usedSyncID;
|
||||||
|
*platformSyncID = data->platformSyncID;
|
||||||
}
|
}
|
||||||
|
|
||||||
void network_send_player(void) {
|
void network_send_player(void) {
|
||||||
|
@ -190,14 +196,16 @@ void network_receive_player(struct Packet* p) {
|
||||||
if (levelAreaMismatch) { return; }
|
if (levelAreaMismatch) { return; }
|
||||||
|
|
||||||
// apply data from packet to mario state
|
// apply data from packet to mario state
|
||||||
u32 heldSyncID = 0;
|
u8 heldSyncID = 0;
|
||||||
u32 heldBySyncID = 0;
|
u8 heldBySyncID = 0;
|
||||||
u32 interactSyncID = 0;
|
u8 interactSyncID = 0;
|
||||||
u32 usedSyncID = 0;
|
u8 usedSyncID = 0;
|
||||||
|
u8 platformSyncID = 0;
|
||||||
u8 customFlags = 0;
|
u8 customFlags = 0;
|
||||||
write_packet_data(&data, m, &customFlags,
|
write_packet_data(&data, m, &customFlags,
|
||||||
&heldSyncID, &heldBySyncID,
|
&heldSyncID, &heldBySyncID,
|
||||||
&interactSyncID, &usedSyncID);
|
&interactSyncID, &usedSyncID,
|
||||||
|
&platformSyncID);
|
||||||
|
|
||||||
// read custom flags
|
// read custom flags
|
||||||
m->freeze = GET_BIT(customFlags, 0);
|
m->freeze = GET_BIT(customFlags, 0);
|
||||||
|
@ -244,6 +252,28 @@ void network_receive_player(struct Packet* p) {
|
||||||
m->usedObj = gSyncObjects[usedSyncID].o;
|
m->usedObj = gSyncObjects[usedSyncID].o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// place on top of platform
|
||||||
|
if (platformSyncID != 0 && gSyncObjects[platformSyncID].o != NULL) {
|
||||||
|
struct Surface* floor = NULL;
|
||||||
|
// search up to 500 units for the platform
|
||||||
|
f32 maxDifference = 500;
|
||||||
|
m->pos[1] += maxDifference;
|
||||||
|
|
||||||
|
// find the platform
|
||||||
|
gCheckingSurfaceCollisionsForObject = gSyncObjects[platformSyncID].o;
|
||||||
|
f32 height = find_floor(m->pos[0], m->pos[1], m->pos[2], &floor);
|
||||||
|
gCheckingSurfaceCollisionsForObject = NULL;
|
||||||
|
|
||||||
|
f32 difference = ABS((m->pos[1] - maxDifference) - height);
|
||||||
|
if (floor != NULL && difference <= maxDifference) {
|
||||||
|
// place on top of platform
|
||||||
|
m->pos[1] = height;
|
||||||
|
} else {
|
||||||
|
// search failed, reset position
|
||||||
|
m->pos[1] -= maxDifference;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// jump kicking: restore action state, otherwise it won't play
|
// jump kicking: restore action state, otherwise it won't play
|
||||||
if (m->action == ACT_JUMP_KICK) {
|
if (m->action == ACT_JUMP_KICK) {
|
||||||
m->actionState = oldData.actionState;
|
m->actionState = oldData.actionState;
|
||||||
|
|
Loading…
Reference in a new issue