From 908bbba4ec418eea764fd36964cd20fcbe146ec3 Mon Sep 17 00:00:00 2001 From: Lat Date: Mon, 18 Sep 2023 18:14:00 +0200 Subject: [PATCH] Rideroid: second pass --- src/info.c | 4 +- src/k_objects.h | 2 +- src/objects/rideroid.c | 94 +++++++++++++++++++++++++++++++----------- src/p_map.c | 9 +++- src/sounds.c | 5 +++ 5 files changed, 86 insertions(+), 28 deletions(-) diff --git a/src/info.c b/src/info.c index 291169514..a8c684a0e 100644 --- a/src/info.c +++ b/src/info.c @@ -30406,13 +30406,13 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 80*FRACUNIT, // radius + 30*FRACUNIT, // radius 40*FRACUNIT, // height 0, // display offset 0, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT, // flags + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags S_NULL // raisestate }, diff --git a/src/k_objects.h b/src/k_objects.h index 83c704b1f..432063383 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -227,9 +227,9 @@ void Obj_ActivateCheckpointInstantly(mobj_t* mobj); /* Rideroid / Rideroid Node */ void Obj_RideroidThink(mobj_t *mo); - void Obj_RideroidNodeSpawn(mobj_t *mo); void Obj_RideroidNodeThink(mobj_t *mo); +void Obj_getPlayerOffRideroid(mobj_t *mo); // used in p_map.c to get off of em when passing transfer lines. #ifdef __cplusplus diff --git a/src/objects/rideroid.c b/src/objects/rideroid.c index 405630f83..bd3600693 100644 --- a/src/objects/rideroid.c +++ b/src/objects/rideroid.c @@ -56,21 +56,42 @@ static void plr_resetRideroidVars(player_t *p) // kills the rideroid and removes it from the map. static void Obj_killRideroid(mobj_t *mo) { + UINT8 i; + + for (i = 0; i < 32; i++) + { + mobj_t *t = P_SpawnMobj(mo->x, mo->y, mo->z, MT_THOK); + t->color = SKINCOLOR_TEAL; + t->frame = FF_FULLBRIGHT; + t->destscale = 1; + t->momx = P_RandomRange(PR_DECORATION, -32, 32)*mapobjectscale; + t->momy = P_RandomRange(PR_DECORATION, -32, 32)*mapobjectscale; + t->momz = P_RandomRange(PR_DECORATION, -32, 32)*mapobjectscale; + } P_RemoveMobj(mo); } -// this assumes mo->target and mo->target->player is valid. -// if it's not, uuuh well too bad. -static void Obj_getPlayerOffRideroid(mobj_t *mo) +// makes the player get off of the rideroid. +void Obj_getPlayerOffRideroid(mobj_t *mo) { mobj_t *pmo = mo->target; - player_t *p = pmo->player; - pmo->flags &= ~MF_NOGRAVITY; - plr_resetRideroidVars(p); - - if (!P_MobjWasRemoved(mo)) + if (pmo && !P_MobjWasRemoved(pmo)) + { + player_t *p = pmo->player; + + pmo->flags &= ~MF_NOGRAVITY; + plr_resetRideroidVars(p); + mo->fuse = TICRATE/2; + mo->momx = mo->momx*2; + mo->momy = mo->momy*2; + mo->momz = 0; + mo->target = NULL; + + S_StartSound(mo, sfx_ridr4); + + } } // this assumes mo->target and mo->target->player is valid. @@ -97,19 +118,23 @@ static fixed_t Obj_rideroidLerp(INT32 start, INT32 finish, INT32 percent) static void Obj_rideroidTrail(mobj_t *mo) { mobj_t *pmo = mo->target; - player_t *p = pmo->player; // used to make some graphics local to save on framerate + player_t *p; UINT8 i, j; angle_t h_an = mo->angle + ANG1*90; + + if (pmo && !P_MobjWasRemoved(pmo)) + { + p = pmo->player; // used to make some graphics local to save on framerate + mo->color = pmo->color; + mo->colorized = pmo->colorized; + } // from here, we will use the following: // extravalue1: prev x // extravalue2: prev y // cusval: prev z // cvmem: prev roll angle - - mo->color = pmo->color; - mo->colorized = pmo->colorized; for (j = 0; j < 9; j++) { @@ -135,7 +160,7 @@ static void Obj_rideroidTrail(mobj_t *mo) P_SetScale(t, max(1, mapobjectscale*5/6 - ((10-j)*mapobjectscale/120))); t->destscale = 1; - if (p != &players[consoleplayer] && j) + if (p && p != &players[consoleplayer] && j) t->renderflags |= RF_DONTDRAW; } @@ -156,6 +181,10 @@ static void Obj_updateRideroidPos(mobj_t *mo) fixed_t y = pmo->y + 2*FINESINE(pmo->angle>>ANGLETOFINESHIFT); P_MoveOrigin(mo, x, y, pmo->z - 10*mapobjectscale); + mo->momx = pmo->momx; + mo->momy = pmo->momy; + mo->momz = pmo->momz; + Obj_rideroidTrail(mo); } @@ -176,7 +205,19 @@ void Obj_RideroidThink(mobj_t *mo) if (!pmo || P_MobjWasRemoved(pmo)) { - Obj_killRideroid(mo); + if (!mo->fuse) + { + mo->fuse = TICRATE/2; + } + else if (mo->fuse == 1) + { + Obj_killRideroid(mo); + } + else + { + Obj_rideroidTrail(mo); + mo->rollangle += ANG1*24; + } return; } @@ -197,7 +238,7 @@ void Obj_RideroidThink(mobj_t *mo) p->rideroid = true; p->rdnodepull = false; - //S_StartSound(pmo, sfx_ridr2); + S_StartSound(pmo, sfx_ridr2); } return; @@ -231,8 +272,8 @@ void Obj_RideroidThink(mobj_t *mo) mo->movecount++; // we use this as a timer for sounds and whatnot. - //if (mo->movecount == 1 || !(mo->movecount%TICRATE)) - //S_StartSound(mo, sfx_ridr3); + if (mo->movecount == 1 || !(mo->movecount%TICRATE)) + S_StartSound(mo, sfx_ridr3); // aaaaand the actual gameplay and shit... wooooo @@ -294,7 +335,7 @@ void Obj_RideroidThink(mobj_t *mo) if (p->cmd.turning < -400) { - P_Thrust(pmo, mo->angle - 90*ANG1, 2*mapobjectscale); + P_Thrust(pmo, mo->angle - ANGLE_90, 2*mapobjectscale); p->rideroidrollangle -= ANG1*3; if (p->rideroidrollangle < -ANG1*25) @@ -305,7 +346,7 @@ void Obj_RideroidThink(mobj_t *mo) } else if (p->cmd.turning > 400) { - P_Thrust(pmo, mo->angle + 90*ANG1, 2*mapobjectscale); + P_Thrust(pmo, mo->angle + ANGLE_90, 2*mapobjectscale); p->rideroidrollangle += ANG1*3; if (p->rideroidrollangle > ANG1*25) @@ -323,15 +364,20 @@ void Obj_RideroidThink(mobj_t *mo) p->rdaddmomx = pmo->momx - basemomx; p->rdaddmomy = pmo->momy - basemomy; - //CONS_Printf("CURR: %d, %d\n", pmo->momx/mapobjectscale, pmo->momy/mapobjectscale); - //CONS_Printf("BASE: %d, %d\n", basemomx/mapobjectscale, basemomy/mapobjectscale); - //CONS_Printf("ADD: %d, %d\n", p->rdaddmomx/mapobjectscale, p->rdaddmomy/mapobjectscale); + /*CONS_Printf("CURR: %d, %d\n", pmo->momx/mapobjectscale, pmo->momy/mapobjectscale); + CONS_Printf("BASE: %d, %d\n", basemomx/mapobjectscale, basemomy/mapobjectscale); + CONS_Printf("ADD: %d, %d\n", p->rdaddmomx/mapobjectscale, p->rdaddmomy/mapobjectscale);*/ // find out how much addmomx and addmomy we can actually get. // we do this by misusing P_Thrust to calc our values then immediately cancelling it. basemomx = pmo->momx; basemomy = pmo->momy; - P_Thrust(pmo, mo->angle - ANG1*90, RIDEROIDMAXADD*6*mapobjectscale); + + if (mo->angle > ANGLE_90 && mo->angle < ANGLE_270) + P_Thrust(pmo, mo->angle - ANGLE_90, RIDEROIDMAXADD*6*mapobjectscale); + else + P_Thrust(pmo, mo->angle + ANGLE_90, RIDEROIDMAXADD*6*mapobjectscale); + xthreshold = pmo->momx - basemomx; ythreshold = pmo->momy - basemomy; @@ -489,7 +535,7 @@ void Obj_RideroidNodeThink(mobj_t *mo) rd->angle = players[i].rideroidangle; P_SetTarget(&rd->target, pmo); - //S_StartSound(rd, sfx_ridr1); + S_StartSound(rd, sfx_ridr1); //CONS_Printf("rd pull\n"); diff --git a/src/p_map.c b/src/p_map.c index 92a2a65d4..25e1b6178 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1877,7 +1877,14 @@ static BlockItReturn_t PIT_CheckLine(line_t *ld) else if (shouldCollide == 2) return BMIT_CONTINUE; // force no collide } - + + // a bit of a hacky behaviour, but not that I know where else it would go. + if (tm.thing->type == MT_RIDEROID + && tm.blockingline->flags & ML_TFERLINE) + { + Obj_getPlayerOffRideroid(tm.thing); + } + if (!ld->backsector) // one sided line { if (P_PointOnLineSide(tm.thing->x, tm.thing->y, ld)) diff --git a/src/sounds.c b/src/sounds.c index 18bfa26d9..73e292e4e 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -1210,6 +1210,11 @@ sfxinfo_t S_sfx[NUMSFX] = {"rank", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Rank slam + {"ridr1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Boarding Rideroid"}, // Rideroid Activation + {"ridr2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Rideroid Diveroll + {"ridr3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Rideroid Loop + {"ridr4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Leaving Rideroid + // SRB2Kart - Engine sounds // Engine class A {"krta00", false, 48, 65, -1, NULL, 0, -1, -1, LUMPERROR, ""},