Synchronized platform-on-tracks

This commit is contained in:
MysterD 2020-08-10 19:08:47 -07:00
parent 0ceba4b372
commit 5ca3f2ebd7
2 changed files with 45 additions and 12 deletions

View file

@ -43,6 +43,7 @@ static void platform_on_track_mario_not_on_platform(void) {
if (cur_obj_wait_then_blink(150, 40)) { if (cur_obj_wait_then_blink(150, 40)) {
platform_on_track_reset(); platform_on_track_reset();
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
if (network_owns_object(o)) { network_send_object(o); }
} }
} }
} }
@ -51,6 +52,12 @@ static void platform_on_track_mario_not_on_platform(void) {
* Init function for bhvPlatformOnTrack. * Init function for bhvPlatformOnTrack.
*/ */
void bhv_platform_on_track_init(void) { void bhv_platform_on_track_init(void) {
if (o->oSyncID == 0) {
network_init_object(o, 1000.0f);
network_object_settings(o, TRUE, 5.0f, TRUE, NULL);
}
if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) { if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) {
s16 pathIndex = (u16)(o->oBehParams >> 16) & PLATFORM_ON_TRACK_BP_MASK_PATH; s16 pathIndex = (u16)(o->oBehParams >> 16) & PLATFORM_ON_TRACK_BP_MASK_PATH;
o->oPlatformOnTrackType = ((u16)(o->oBehParams >> 16) & PLATFORM_ON_TRACK_BP_MASK_TYPE) >> 4; o->oPlatformOnTrackType = ((u16)(o->oBehParams >> 16) & PLATFORM_ON_TRACK_BP_MASK_TYPE) >> 4;
@ -111,10 +118,12 @@ static void platform_on_track_act_wait_for_mario(void) {
if (gMarioObject->platform == o) { if (gMarioObject->platform == o) {
if (o->oTimer > 20) { if (o->oTimer > 20) {
o->oAction = PLATFORM_ON_TRACK_ACT_MOVE_ALONG_TRACK; o->oAction = PLATFORM_ON_TRACK_ACT_MOVE_ALONG_TRACK;
if (network_owns_object(o)) { network_send_object(o); }
} }
} else { } else {
if (o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) { if (o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) {
platform_on_track_reset(); platform_on_track_reset();
if (network_owns_object(o)) { network_send_object(o); }
} }
o->oTimer = 0; o->oTimer = 0;
@ -206,7 +215,12 @@ static void platform_on_track_act_move_along_track(void) {
} }
} }
if (gMarioObject->platform != o) { u8 anyMarioOnPlatform = FALSE;
for (int i = 0; i < MAX_PLAYERS; i++) {
if (gMarioStates[i].marioObj->platform == o) { anyMarioOnPlatform = TRUE; }
}
if (!anyMarioOnPlatform) {
platform_on_track_mario_not_on_platform(); platform_on_track_mario_not_on_platform();
} else { } else {
o->oTimer = 0; o->oTimer = 0;
@ -230,7 +244,12 @@ static void platform_on_track_act_pause_briefly(void) {
static void platform_on_track_act_fall(void) { static void platform_on_track_act_fall(void) {
cur_obj_move_using_vel_and_gravity(); cur_obj_move_using_vel_and_gravity();
if (gMarioObject->platform != o) { u8 anyMarioOnPlatform = FALSE;
for (int i = 0; i < MAX_PLAYERS; i++) {
if (gMarioStates[i].marioObj->platform == o) { anyMarioOnPlatform = TRUE; }
}
if (!anyMarioOnPlatform) {
platform_on_track_mario_not_on_platform(); platform_on_track_mario_not_on_platform();
} else { } else {
o->oTimer = 0; o->oTimer = 0;
@ -247,10 +266,19 @@ static void platform_on_track_rock_ski_lift(void) {
o->oFaceAngleRoll += (s32) o->oPlatformOnTrackSkiLiftRollVel; o->oFaceAngleRoll += (s32) o->oPlatformOnTrackSkiLiftRollVel;
struct Object* player = NULL;
for (int i = 0; i < MAX_PLAYERS; i++) {
if (gMarioStates[i].marioObj->platform != o) { continue; }
player = gMarioStates[i].marioObj;
break;
}
// Tilt away from the moving direction and toward mario // Tilt away from the moving direction and toward mario
if (gMarioObject->platform == o) { if (player != NULL) {
int distanceToPlayer = dist_between_objects(o, player);
int angleToPlayer = obj_angle_to_object(o, player);
targetRoll = o->oForwardVel * sins(o->oMoveAngleYaw) * -50.0f targetRoll = o->oForwardVel * sins(o->oMoveAngleYaw) * -50.0f
+ (s32)(o->oDistanceToMario * sins(o->oAngleToMario - o->oFaceAngleYaw) * -4.0f); + (s32)(distanceToPlayer * sins(angleToPlayer - o->oFaceAngleYaw) * -4.0f);
} }
oscillate_toward( oscillate_toward(
@ -285,10 +313,15 @@ void bhv_platform_on_track_update(void) {
break; break;
} }
u8 anyMarioOnPlatform = FALSE;
for (int i = 0; i < MAX_PLAYERS; i++) {
if (gMarioStates[i].marioObj->platform == o) { anyMarioOnPlatform = TRUE; }
}
if (!o->oPlatformOnTrackIsNotSkiLift) { if (!o->oPlatformOnTrackIsNotSkiLift) {
platform_on_track_rock_ski_lift(); platform_on_track_rock_ski_lift();
} else if (o->oPlatformOnTrackType == PLATFORM_ON_TRACK_TYPE_CARPET) { } else if (o->oPlatformOnTrackType == PLATFORM_ON_TRACK_TYPE_CARPET) {
if (!o->oPlatformOnTrackWasStoodOn && gMarioObject->platform == o) { if (!o->oPlatformOnTrackWasStoodOn && anyMarioOnPlatform) {
o->oPlatformOnTrackOffsetY = -8.0f; o->oPlatformOnTrackOffsetY = -8.0f;
o->oPlatformOnTrackWasStoodOn = TRUE; o->oPlatformOnTrackWasStoodOn = TRUE;
} }

View file

@ -94,13 +94,6 @@ static struct SyncObject* packet_read_object_header(struct Packet* p) {
return NULL; return NULL;
} }
// retrieve SyncObject, check if we should update using callback
struct SyncObject* so = &syncObjects[syncId];
if (so->ignore_if_true != NULL && (*so->ignore_if_true)(so->o)) {
return NULL;
}
so->clockSinceUpdate = clock();
// extract object, sanity check // extract object, sanity check
struct Object* o = syncObjects[syncId].o; struct Object* o = syncObjects[syncId].o;
if (o == NULL) { if (o == NULL) {
@ -108,6 +101,13 @@ static struct SyncObject* packet_read_object_header(struct Packet* p) {
return NULL; return NULL;
} }
// retrieve SyncObject, check if we should update using callback
struct SyncObject* so = &syncObjects[syncId];
if (so->ignore_if_true != NULL && (*so->ignore_if_true)(so->o)) {
return NULL;
}
so->clockSinceUpdate = clock();
// make sure it's active // make sure it's active
if (o->activeFlags == ACTIVE_FLAG_DEACTIVATED) { if (o->activeFlags == ACTIVE_FLAG_DEACTIVATED) {
return NULL; return NULL;