Newly added object files: Fix trailing whitespace + EOF newline

This commit is contained in:
toaster 2023-09-26 22:04:14 +01:00
parent bee1cb9a04
commit 490959b6f7
8 changed files with 328 additions and 331 deletions

View file

@ -32,17 +32,17 @@
// Touching the bungee, used in p_inter.c // Touching the bungee, used in p_inter.c
void Obj_BungeeSpecial(mobj_t *mo, player_t *p) void Obj_BungeeSpecial(mobj_t *mo, player_t *p)
{ {
mobj_t *latch; mobj_t *latch;
if (P_IsObjectOnGround(p->mo) || p->springstars || K_isPlayerInSpecialState(p)) if (P_IsObjectOnGround(p->mo) || p->springstars || K_isPlayerInSpecialState(p))
return; return;
P_InstaThrust(p->mo, 0, 0); P_InstaThrust(p->mo, 0, 0);
p->bungee = BUNGEE_LATCH; p->bungee = BUNGEE_LATCH;
p->mo->flags |= MF_NOCLIPTHING; // prevent players from bumping if they latch onto the same bungee. p->mo->flags |= MF_NOCLIPTHING; // prevent players from bumping if they latch onto the same bungee.
p->pflags |= PF_NOFASTFALL; // didn't know this flag existed but it's very convenient!! p->pflags |= PF_NOFASTFALL; // didn't know this flag existed but it's very convenient!!
latch = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_THOK); latch = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->z, MT_THOK);
P_SetMobjState(latch, S_INVISIBLE); P_SetMobjState(latch, S_INVISIBLE);
latch->angle = mo->angle; latch->angle = mo->angle;
@ -54,22 +54,22 @@ void Obj_BungeeSpecial(mobj_t *mo, player_t *p)
// this is the thinker to call on the player when they get bungee'd. // this is the thinker to call on the player when they get bungee'd.
void Obj_playerBungeeThink(player_t *p) void Obj_playerBungeeThink(player_t *p)
{ {
mobj_t *bungee = p->mo->tracer; mobj_t *bungee = p->mo->tracer;
UINT8 i; UINT8 i;
// someone removed it // someone removed it
if (!bungee || P_MobjWasRemoved(bungee)) if (!bungee || P_MobjWasRemoved(bungee))
return; return;
bungee->tics = 4; // we set this to a low value so that it despawns if the player vanishes for some reason. bungee->tics = 4; // we set this to a low value so that it despawns if the player vanishes for some reason.
if (p->bungee == BUNGEE_LATCH) if (p->bungee == BUNGEE_LATCH)
{ {
// rr has super high gravity which gets in the way. // rr has super high gravity which gets in the way.
p->mo->flags |= MF_NOGRAVITY; p->mo->flags |= MF_NOGRAVITY;
p->mo->momz = (p->mo->momz*9)/10; p->mo->momz = (p->mo->momz*9)/10;
if (abs(p->mo->momz) < 6*mapobjectscale) if (abs(p->mo->momz) < 6*mapobjectscale)
{ {
p->bungee = BUNGEE_LAUNCH; p->bungee = BUNGEE_LAUNCH;
@ -80,40 +80,40 @@ void Obj_playerBungeeThink(player_t *p)
else if (p->bungee == BUNGEE_LAUNCH) else if (p->bungee == BUNGEE_LAUNCH)
{ {
p->mo->momz = (p->mo->momz*12)/10; p->mo->momz = (p->mo->momz*12)/10;
// if we go above/below (depending on our flip flags) the bungee, release us! // if we go above/below (depending on our flip flags) the bungee, release us!
if ((p->mo->eflags & MFE_VERTICALFLIP && p->mo->z < bungee->z) if ((p->mo->eflags & MFE_VERTICALFLIP && p->mo->z < bungee->z)
|| (!(p->mo->eflags & MFE_VERTICALFLIP) && p->mo->z > bungee->z )) || (!(p->mo->eflags & MFE_VERTICALFLIP) && p->mo->z > bungee->z ))
{ {
p->mo->flags &= ~MF_NOGRAVITY; p->mo->flags &= ~MF_NOGRAVITY;
p->mo->flags &= ~MF_NOCLIPTHING; p->mo->flags &= ~MF_NOCLIPTHING;
p->pflags &= ~PF_NOFASTFALL; p->pflags &= ~PF_NOFASTFALL;
p->bungee = BUNGEE_NONE; p->bungee = BUNGEE_NONE;
P_InstaThrust(p->mo, bungee->angle, p->mo->momz/8); P_InstaThrust(p->mo, bungee->angle, p->mo->momz/8);
p->mo->momz = (p->mo->momz*3)/4; p->mo->momz = (p->mo->momz*3)/4;
p->springstars = TICRATE; // these are used as a buffer not to latch to vines again. p->springstars = TICRATE; // these are used as a buffer not to latch to vines again.
p->springcolor = SKINCOLOR_EMERALD; p->springcolor = SKINCOLOR_EMERALD;
P_RemoveMobj(bungee); P_RemoveMobj(bungee);
P_SetTarget(&p->mo->tracer, NULL); P_SetTarget(&p->mo->tracer, NULL);
return; return;
} }
} }
// basic visuals (but hey they work fine enough!) // basic visuals (but hey they work fine enough!)
for (i=0; i<8; i++) for (i=0; i<8; i++)
{ {
fixed_t xpos = -(bungee->x - p->mo->x) /8 *i; fixed_t xpos = -(bungee->x - p->mo->x) /8 *i;
fixed_t ypos = -(bungee->y - p->mo->y) /8 *i; fixed_t ypos = -(bungee->y - p->mo->y) /8 *i;
fixed_t zpos = -(bungee->z - p->mo->z) /8 *i; fixed_t zpos = -(bungee->z - p->mo->z) /8 *i;
mobj_t *seg = P_SpawnMobj(bungee->x + xpos, bungee->y + ypos, bungee->z + zpos, MT_THOK); mobj_t *seg = P_SpawnMobj(bungee->x + xpos, bungee->y + ypos, bungee->z + zpos, MT_THOK);
P_SetScale(seg, mapobjectscale/3); P_SetScale(seg, mapobjectscale/3);
seg->color = SKINCOLOR_EMERALD; seg->color = SKINCOLOR_EMERALD;
seg->frame = 0; seg->frame = 0;
seg->fuse = 2; seg->fuse = 2;
} }
} }

View file

@ -36,10 +36,10 @@ void Obj_DLZHoverSpawn(mobj_t *mo)
void Obj_DLZHoverCollide(mobj_t *mo, mobj_t *mo2) void Obj_DLZHoverCollide(mobj_t *mo, mobj_t *mo2)
{ {
player_t *p = mo->player; player_t *p = mo->player;
if (!p || p->lasthover == leveltime) if (!p || p->lasthover == leveltime)
return; return;
if (abs(mo->z - mo2->z) < 512*mapobjectscale) if (abs(mo->z - mo2->z) < 512*mapobjectscale)
{ {
// momz adjust // momz adjust
@ -57,14 +57,14 @@ void Obj_DLZHoverCollide(mobj_t *mo, mobj_t *mo2)
mo->momz += 8*mapobjectscale; mo->momz += 8*mapobjectscale;
} }
} }
// speed adjust // speed adjust
if (p->speed > K_GetKartSpeed(p, false, false)) if (p->speed > K_GetKartSpeed(p, false, false))
P_Thrust(mo, R_PointToAngle2(0, 0, -mo->momx, -mo->momy), mapobjectscale/16); P_Thrust(mo, R_PointToAngle2(0, 0, -mo->momx, -mo->momy), mapobjectscale/16);
if (!S_SoundPlaying(mo, sfx_s3kc6s)) if (!S_SoundPlaying(mo, sfx_s3kc6s))
S_StartSound(mo, sfx_s3kc6s); S_StartSound(mo, sfx_s3kc6s);
p->lasthover = leveltime; p->lasthover = leveltime;
} }
} }
@ -83,23 +83,23 @@ void Obj_DLZRingVaccumCollide(mobj_t *mo, mobj_t *mo2)
if (mo->z + mo->height < mo2->z) if (mo->z + mo->height < mo2->z)
return; return;
if (mo->z > mo2->z + mo2->height) if (mo->z > mo2->z + mo2->height)
return; return;
if (!P_IsObjectOnGround(mo) || mo->momz) if (!P_IsObjectOnGround(mo) || mo->momz)
return; return;
fake = P_SpawnMobj(mo->x, mo->y, mo->z, MT_FLINGRING); fake = P_SpawnMobj(mo->x, mo->y, mo->z, MT_FLINGRING);
P_SetScale(fake, mo->scale); P_SetScale(fake, mo->scale);
fake->scalespeed = mapobjectscale/64; fake->scalespeed = mapobjectscale/64;
fake->destscale = 1; fake->destscale = 1;
P_SetTarget(&fake->target, mo2); P_SetTarget(&fake->target, mo2);
fake->angle = R_PointToAngle2(mo2->x, mo2->y, fake->x, fake->y); fake->angle = R_PointToAngle2(mo2->x, mo2->y, fake->x, fake->y);
fake->movefactor = R_PointToDist2(mo2->x, mo2->y, fake->x, fake->y); fake->movefactor = R_PointToDist2(mo2->x, mo2->y, fake->x, fake->y);
P_RemoveMobj(mo); P_RemoveMobj(mo);
} }
@ -107,27 +107,27 @@ void Obj_DLZSuckedRingThink(mobj_t *mo)
{ {
mobj_t *t = mo->target; mobj_t *t = mo->target;
fixed_t x, y; fixed_t x, y;
// commit die if the target disappears for some fucking reason // commit die if the target disappears for some fucking reason
if (!t || P_MobjWasRemoved(t)) if (!t || P_MobjWasRemoved(t))
{ {
P_RemoveMobj(mo); P_RemoveMobj(mo);
return; return;
} }
x = t->x + mo->movefactor*FINECOSINE(mo->angle>>ANGLETOFINESHIFT); x = t->x + mo->movefactor*FINECOSINE(mo->angle>>ANGLETOFINESHIFT);
y = t->y + mo->movefactor*FINESINE(mo->angle>>ANGLETOFINESHIFT); y = t->y + mo->movefactor*FINESINE(mo->angle>>ANGLETOFINESHIFT);
P_MoveOrigin(mo, x, y, mo->z); P_MoveOrigin(mo, x, y, mo->z);
if (mo->cusval < 24) if (mo->cusval < 24)
mo->cusval++; mo->cusval++;
mo->angle += mo->cusval*ANG1; mo->angle += mo->cusval*ANG1;
if (mo->cusval > 8 && mo->movefactor) if (mo->cusval > 8 && mo->movefactor)
mo->movefactor -= 1; mo->movefactor -= 1;
if (mo->scale < mapobjectscale/12) if (mo->scale < mapobjectscale/12)
P_RemoveMobj(mo); P_RemoveMobj(mo);
} }

View file

@ -36,25 +36,25 @@ void Obj_DLZRocketThink(mobj_t *mo)
{ {
UINT8 i; UINT8 i;
angle_t an = mo->angle + ANGLE_90; angle_t an = mo->angle + ANGLE_90;
if (mo->extravalue1) if (mo->extravalue1)
return; return;
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
fixed_t x = mo->x + FixedMul(mapobjectscale, DLZROCKETDIST*FINECOSINE(an>>ANGLETOFINESHIFT)); fixed_t x = mo->x + FixedMul(mapobjectscale, DLZROCKETDIST*FINECOSINE(an>>ANGLETOFINESHIFT));
fixed_t y = mo->y + FixedMul(mapobjectscale, DLZROCKETDIST*FINESINE(an>>ANGLETOFINESHIFT)); fixed_t y = mo->y + FixedMul(mapobjectscale, DLZROCKETDIST*FINESINE(an>>ANGLETOFINESHIFT));
mobj_t *r = P_SpawnMobj(x, y, mo->z, MT_THOK); mobj_t *r = P_SpawnMobj(x, y, mo->z, MT_THOK);
P_SetMobjState(r, i ? S_DLZROCKET_L : S_DLZROCKET_R); P_SetMobjState(r, i ? S_DLZROCKET_L : S_DLZROCKET_R);
P_SetScale(r, (mapobjectscale*3)/2); P_SetScale(r, (mapobjectscale*3)/2);
r->destscale = (mapobjectscale*3)/2; r->destscale = (mapobjectscale*3)/2;
r->angle = mo->spawnpoint->angle*ANG1; r->angle = mo->spawnpoint->angle*ANG1;
r->tics = -1; r->tics = -1;
an += ANGLE_180; an += ANGLE_180;
} }
mo->extravalue1 = 1; mo->extravalue1 = 1;
} }
@ -63,7 +63,7 @@ void Obj_DLZRocketDismount(player_t *p)
// we aren't mounted on one. // we aren't mounted on one.
if (!p->dlzrocket) if (!p->dlzrocket)
return; return;
p->dlzrocket = 0; p->dlzrocket = 0;
K_SpawnMineExplosion(p->mo, p->mo->color, 3); K_SpawnMineExplosion(p->mo, p->mo->color, 3);
S_StartSound(p->mo, sfx_s3k4e); S_StartSound(p->mo, sfx_s3k4e);
@ -74,29 +74,29 @@ void Obj_DLZRocketSpecial(mobj_t *mo, player_t *p)
{ {
if (K_isPlayerInSpecialState(p)) // already on one, don't bother resetting, duh. if (K_isPlayerInSpecialState(p)) // already on one, don't bother resetting, duh.
return; return;
p->mo->z = mo->z + 16*P_MobjFlip(p->mo)*mapobjectscale; p->mo->z = mo->z + 16*P_MobjFlip(p->mo)*mapobjectscale;
P_SetPlayerAngle(p->mo->player, mo->angle); P_SetPlayerAngle(p->mo->player, mo->angle);
p->dlzrocket = true; p->dlzrocket = true;
p->dlzrocketangle = mo->angle; p->dlzrocketangle = mo->angle;
p->dlzrocketanglev = 0; p->dlzrocketanglev = 0;
p->dlzrocketspd = DLZROCKETSPEED; p->dlzrocketspd = DLZROCKETSPEED;
p->spinouttimer = 0; p->spinouttimer = 0;
p->wipeoutslow = 0; p->wipeoutslow = 0;
S_StartSound(mo, sfx_s262); S_StartSound(mo, sfx_s262);
} }
void Obj_playerDLZRocket(player_t *p) void Obj_playerDLZRocket(player_t *p)
{ {
fixed_t maxspd = DLZROCKETSPEED; fixed_t maxspd = DLZROCKETSPEED;
angle_t visangle; angle_t visangle;
UINT8 i, j; UINT8 i, j;
p->dlzrocket++; p->dlzrocket++;
// helper arrows at the start of the ride to tell players they can move freely // helper arrows at the start of the ride to tell players they can move freely
if (p->dlzrocket < TICRATE*2 if (p->dlzrocket < TICRATE*2
&& leveltime%10 < 5) && leveltime%10 < 5)
@ -107,22 +107,20 @@ void Obj_playerDLZRocket(player_t *p)
P_SetScale(arr, 2*mapobjectscale); P_SetScale(arr, 2*mapobjectscale);
arr->tics = 2; arr->tics = 2;
} }
// calc max speed // calc max speed
if (p->ringboost) if (p->ringboost)
maxspd += 10; maxspd += 10;
if (p->startboost) if (p->startboost)
maxspd += 30; maxspd += 30;
// set player speed // set player speed
if (p->dlzrocketspd < maxspd) if (p->dlzrocketspd < maxspd)
p->dlzrocketspd++; p->dlzrocketspd++;
else if (p->dlzrocketspd > maxspd) else if (p->dlzrocketspd > maxspd)
p->dlzrocket--; p->dlzrocket--;
// so long as PF_STASIS is applied, let the angle be overwritten freely. // so long as PF_STASIS is applied, let the angle be overwritten freely.
// this is used by seasaws but can be used for misc modding purposes too. // this is used by seasaws but can be used for misc modding purposes too.
if (p->pflags & PF_STASIS) if (p->pflags & PF_STASIS)
@ -131,42 +129,42 @@ void Obj_playerDLZRocket(player_t *p)
{ {
SINT8 turndir = 0; SINT8 turndir = 0;
P_SetPlayerAngle(p->mo->player, p->dlzrocketangle); P_SetPlayerAngle(p->mo->player, p->dlzrocketangle);
if (p->cmd.turning > 0) if (p->cmd.turning > 0)
turndir = 1; turndir = 1;
else if (p->cmd.turning < 0) else if (p->cmd.turning < 0)
turndir = -1; turndir = -1;
p->dlzrocketangle += turndir*DLZROCKETTURNSPEED; p->dlzrocketangle += turndir*DLZROCKETTURNSPEED;
if (p->cmd.throwdir > 0) if (p->cmd.throwdir > 0)
p->dlzrocketanglev = min(DLZROCKETMAXVERT, p->dlzrocketanglev + DLZROCKETVERTSPEED); p->dlzrocketanglev = min(DLZROCKETMAXVERT, p->dlzrocketanglev + DLZROCKETVERTSPEED);
else if (p->cmd.throwdir < 0) else if (p->cmd.throwdir < 0)
p->dlzrocketanglev = max(-DLZROCKETMAXVERT, p->dlzrocketanglev - DLZROCKETVERTSPEED); p->dlzrocketanglev = max(-DLZROCKETMAXVERT, p->dlzrocketanglev - DLZROCKETVERTSPEED);
} }
// angle correction on ceilings (THIS CODE LOOKS AWFUL AND IT CAN PROBABLY BE DONE BETTER......) // angle correction on ceilings (THIS CODE LOOKS AWFUL AND IT CAN PROBABLY BE DONE BETTER......)
if ( (!(p->mo->eflags & MFE_VERTICALFLIP) && (p->mo->z+p->mo->height >= p->mo->ceilingz)) if ( (!(p->mo->eflags & MFE_VERTICALFLIP) && (p->mo->z+p->mo->height >= p->mo->ceilingz))
|| (p->mo->eflags & MFE_VERTICALFLIP && p->mo->z <= p->mo->floorz)) || (p->mo->eflags & MFE_VERTICALFLIP && p->mo->z <= p->mo->floorz))
if ( (!(p->mo->eflags & MFE_VERTICALFLIP) && p->dlzrocketanglev > 0) if ( (!(p->mo->eflags & MFE_VERTICALFLIP) && p->dlzrocketanglev > 0)
|| (p->mo->eflags & MFE_VERTICALFLIP && p->dlzrocketanglev < 0)) || (p->mo->eflags & MFE_VERTICALFLIP && p->dlzrocketanglev < 0))
p->dlzrocketanglev = 0; p->dlzrocketanglev = 0;
if (!(p->pflags & PF_STASIS)) if (!(p->pflags & PF_STASIS))
{ {
angle_t van = p->dlzrocketanglev /4; angle_t van = p->dlzrocketanglev /4;
P_InstaThrust(p->mo, p->dlzrocketangle, FixedMul(mapobjectscale, p->dlzrocketspd*FINECOSINE(van>>ANGLETOFINESHIFT))); P_InstaThrust(p->mo, p->dlzrocketangle, FixedMul(mapobjectscale, p->dlzrocketspd*FINECOSINE(van>>ANGLETOFINESHIFT)));
p->mo->momz = FixedMul(mapobjectscale, p->dlzrocketspd*FINESINE((angle_t)p->dlzrocketanglev>>ANGLETOFINESHIFT)); p->mo->momz = FixedMul(mapobjectscale, p->dlzrocketspd*FINESINE((angle_t)p->dlzrocketanglev>>ANGLETOFINESHIFT));
} }
if (leveltime%4 == 0) if (leveltime%4 == 0)
S_StartSound(p->mo, sfx_s1c8); S_StartSound(p->mo, sfx_s1c8);
// finally, visuals. // finally, visuals.
visangle = p->mo->angle + ANGLE_90; visangle = p->mo->angle + ANGLE_90;
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
fixed_t x = p->mo->x + FixedMul(mapobjectscale, 56*FINECOSINE(visangle>>ANGLETOFINESHIFT)); fixed_t x = p->mo->x + FixedMul(mapobjectscale, 56*FINECOSINE(visangle>>ANGLETOFINESHIFT));
@ -176,29 +174,28 @@ void Obj_playerDLZRocket(player_t *p)
P_SetMobjState(r, i ? S_DLZROCKET_L : S_DLZROCKET_R); P_SetMobjState(r, i ? S_DLZROCKET_L : S_DLZROCKET_R);
P_SetScale(r, (mapobjectscale*3)/2); P_SetScale(r, (mapobjectscale*3)/2);
r->angle = p->mo->angle; r->angle = p->mo->angle;
for (j = 0; j < 2; j++) for (j = 0; j < 2; j++)
{ {
fixed_t xoffs = P_RandomRange(PR_FUZZ, -6, 6)*mapobjectscale; fixed_t xoffs = P_RandomRange(PR_FUZZ, -6, 6)*mapobjectscale;
fixed_t yoffs = P_RandomRange(PR_FUZZ, -6, 6)*mapobjectscale; fixed_t yoffs = P_RandomRange(PR_FUZZ, -6, 6)*mapobjectscale;
fixed_t soffs = P_RandomRange(PR_FUZZ, 0, 3); fixed_t soffs = P_RandomRange(PR_FUZZ, 0, 3);
mobj_t *expl = P_SpawnMobj(r->x + xoffs, r->y + yoffs, r->z + xoffs, MT_THOK); mobj_t *expl = P_SpawnMobj(r->x + xoffs, r->y + yoffs, r->z + xoffs, MT_THOK);
P_SetMobjState(expl, S_QUICKBOOM1+soffs); P_SetMobjState(expl, S_QUICKBOOM1+soffs);
expl->color = p->mo->color; expl->color = p->mo->color;
P_SetScale(expl, mapobjectscale); P_SetScale(expl, mapobjectscale);
expl->destscale = 2*mapobjectscale; expl->destscale = 2*mapobjectscale;
if (p->startboost) if (p->startboost)
expl->color = K_RainbowColor(leveltime); expl->color = K_RainbowColor(leveltime);
} }
visangle += ANGLE_180; visangle += ANGLE_180;
} }
if ((p->dlzrocket > 10 && (P_IsObjectOnGround(p->mo) || p->mo->eflags & MFE_JUSTBOUNCEDWALL)) if ((p->dlzrocket > 10 && (P_IsObjectOnGround(p->mo) || p->mo->eflags & MFE_JUSTBOUNCEDWALL))
|| p->spinouttimer || p->wipeoutslow || p->tumbleHeight) || p->spinouttimer || p->wipeoutslow || p->tumbleHeight)
Obj_DLZRocketDismount(p); Obj_DLZRocketDismount(p);
}
}

View file

@ -28,34 +28,34 @@
// updates the seasaw's visuals and hitboxes using the hnext/hprev list. // updates the seasaw's visuals and hitboxes using the hnext/hprev list.
static void Obj_DLZSeasawUpdate(mobj_t *mo, boolean ghostme) static void Obj_DLZSeasawUpdate(mobj_t *mo, boolean ghostme)
{ {
mobj_t *ptr = mo; mobj_t *ptr = mo;
mobj_t *ptrp = mo; mobj_t *ptrp = mo;
UINT8 i, j; UINT8 i, j;
angle_t visan = (angle_t)mo->extravalue1 + ANGLE_90; angle_t visan = (angle_t)mo->extravalue1 + ANGLE_90;
P_SetScale(mo, 2*mapobjectscale); P_SetScale(mo, 2*mapobjectscale);
if (mo->tracer && !P_MobjWasRemoved(mo->tracer)) if (mo->tracer && !P_MobjWasRemoved(mo->tracer))
{ {
mo->tracer->tics = 3; mo->tracer->tics = 3;
P_MoveOrigin(mo->tracer, mo->x, mo->y, mo->z); P_MoveOrigin(mo->tracer, mo->x, mo->y, mo->z);
P_SetScale(mo->tracer, mo->scale); P_SetScale(mo->tracer, mo->scale);
if (mo->eflags & MFE_VERTICALFLIP) if (mo->eflags & MFE_VERTICALFLIP)
{ {
mo->tracer->eflags |= MFE_VERTICALFLIP; mo->tracer->eflags |= MFE_VERTICALFLIP;
mo->tracer->eflags |= MF2_OBJECTFLIP; mo->tracer->eflags |= MF2_OBJECTFLIP;
} }
} }
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
INT32 dist = 32; // visuals dist INT32 dist = 32; // visuals dist
INT32 hdist = 16; // hitbox dist INT32 hdist = 16; // hitbox dist
// visuals // visuals
for (j = 0; j < 2; j++) for (j = 0; j < 2; j++)
{ {
@ -65,7 +65,7 @@ static void Obj_DLZSeasawUpdate(mobj_t *mo, boolean ghostme)
fixed_t x = mo->x + FixedMul(mo->scale, dist*FINECOSINE(visan>>ANGLETOFINESHIFT)); fixed_t x = mo->x + FixedMul(mo->scale, dist*FINECOSINE(visan>>ANGLETOFINESHIFT));
fixed_t y = mo->y + FixedMul(mo->scale, dist*FINESINE(visan>>ANGLETOFINESHIFT)); fixed_t y = mo->y + FixedMul(mo->scale, dist*FINESINE(visan>>ANGLETOFINESHIFT));
ptr = ptr->hnext; ptr = ptr->hnext;
P_MoveOrigin(ptr, x, y, mo->z + 8*mapobjectscale*P_MobjFlip(mo)); P_MoveOrigin(ptr, x, y, mo->z + 8*mapobjectscale*P_MobjFlip(mo));
ptr->angle = visan; ptr->angle = visan;
ptr->tics = 3; ptr->tics = 3;
@ -76,7 +76,7 @@ static void Obj_DLZSeasawUpdate(mobj_t *mo, boolean ghostme)
ptr->eflags |= MFE_VERTICALFLIP; ptr->eflags |= MFE_VERTICALFLIP;
ptr->flags2 |= MF2_OBJECTFLIP; ptr->flags2 |= MF2_OBJECTFLIP;
} }
if (ghostme && leveltime&1) if (ghostme && leveltime&1)
{ {
mobj_t *g = P_SpawnGhostMobj(ptr); mobj_t *g = P_SpawnGhostMobj(ptr);
@ -84,23 +84,23 @@ static void Obj_DLZSeasawUpdate(mobj_t *mo, boolean ghostme)
g->color = mo->color; g->color = mo->color;
g->fuse = 3; g->fuse = 3;
} }
dist += 55; dist += 55;
} }
} }
// hitboxes: // hitboxes:
for (j = 0; j < 8; j++) for (j = 0; j < 8; j++)
{ {
// get our mobj. // get our mobj.
if (ptrp && !P_MobjWasRemoved(ptrp) && ptrp->hprev && !P_MobjWasRemoved(ptrp->hprev)) if (ptrp && !P_MobjWasRemoved(ptrp) && ptrp->hprev && !P_MobjWasRemoved(ptrp->hprev))
{ {
fixed_t x = mo->x + FixedMul(mo->scale, hdist*FINECOSINE(visan>>ANGLETOFINESHIFT)); fixed_t x = mo->x + FixedMul(mo->scale, hdist*FINECOSINE(visan>>ANGLETOFINESHIFT));
fixed_t y = mo->y + FixedMul(mo->scale, hdist*FINESINE(visan>>ANGLETOFINESHIFT)); fixed_t y = mo->y + FixedMul(mo->scale, hdist*FINESINE(visan>>ANGLETOFINESHIFT));
ptrp = ptrp->hprev; ptrp = ptrp->hprev;
P_SetOrigin(ptrp, x, y, mo->z + 8*mapobjectscale*P_MobjFlip(mo)); // it's invisible so nobody cares about interpolating it. P_SetOrigin(ptrp, x, y, mo->z + 8*mapobjectscale*P_MobjFlip(mo)); // it's invisible so nobody cares about interpolating it.
ptrp->angle = visan; ptrp->angle = visan;
ptrp->tics = 3; ptrp->tics = 3;
@ -111,12 +111,12 @@ static void Obj_DLZSeasawUpdate(mobj_t *mo, boolean ghostme)
ptrp->eflags |= MFE_VERTICALFLIP; ptrp->eflags |= MFE_VERTICALFLIP;
ptrp->flags2 |= MF2_OBJECTFLIP; ptrp->flags2 |= MF2_OBJECTFLIP;
} }
hdist += 16; hdist += 16;
} }
} }
visan += ANGLE_180; visan += ANGLE_180;
} }
} }
@ -128,10 +128,10 @@ void Obj_DLZSeasawSpawn(mobj_t *mo)
mobj_t *ptr = mo; mobj_t *ptr = mo;
mobj_t *ptrp = mo; mobj_t *ptrp = mo;
UINT8 i, j; UINT8 i, j;
// setup vars // setup vars
mo->extravalue1 = (INT32)mo->angle; mo->extravalue1 = (INT32)mo->angle;
// center pole: // center pole:
pole = P_SpawnMobj(mo->x, mo->y, mo->z, MT_THOK); pole = P_SpawnMobj(mo->x, mo->y, mo->z, MT_THOK);
pole->tics = -1; pole->tics = -1;
@ -139,37 +139,37 @@ void Obj_DLZSeasawSpawn(mobj_t *mo)
pole->frame = 0; pole->frame = 0;
P_SetTarget(&pole->target, mo); P_SetTarget(&pole->target, mo);
P_SetTarget(&mo->tracer, pole); P_SetTarget(&mo->tracer, pole);
if (mo->eflags & MFE_VERTICALFLIP) if (mo->eflags & MFE_VERTICALFLIP)
pole->eflags |= MFE_VERTICALFLIP; pole->eflags |= MFE_VERTICALFLIP;
// spawn visuals / hitboxes. // spawn visuals / hitboxes.
for (i = 0; i < 2; i++) // for each side... for (i = 0; i < 2; i++) // for each side...
{ {
for (j = 0; j < 2; j++) // spawn the 2 visual papersprites on each side. for (j = 0; j < 2; j++) // spawn the 2 visual papersprites on each side.
{ {
// right now we don't care if the objects are positionned properly. // right now we don't care if the objects are positionned properly.
mobj_t *vis = P_SpawnMobj(mo->x, mo->y, mo->z + 8*mapobjectscale*P_MobjFlip(mo), MT_DLZ_SEASAW_VISUAL); mobj_t *vis = P_SpawnMobj(mo->x, mo->y, mo->z + 8*mapobjectscale*P_MobjFlip(mo), MT_DLZ_SEASAW_VISUAL);
vis->sprite = SPR_DLZS; vis->sprite = SPR_DLZS;
vis->frame = (j+1)|FF_PAPERSPRITE; vis->frame = (j+1)|FF_PAPERSPRITE;
vis->tics = -1; vis->tics = -1;
if (mo->eflags & MFE_VERTICALFLIP) if (mo->eflags & MFE_VERTICALFLIP)
{ {
vis->eflags |= MFE_VERTICALFLIP; vis->eflags |= MFE_VERTICALFLIP;
vis->flags2 |= MF2_OBJECTFLIP; vis->flags2 |= MF2_OBJECTFLIP;
} }
P_SetTarget(&vis->target, mo); P_SetTarget(&vis->target, mo);
P_SetTarget(&ptr->hnext, vis); // save in an hnext list for updating later. P_SetTarget(&ptr->hnext, vis); // save in an hnext list for updating later.
ptr = vis; ptr = vis;
} }
for (j = 0; j < 8; j++) // spawn the 8 hitboxes on each side. for (j = 0; j < 8; j++) // spawn the 8 hitboxes on each side.
{ {
// right now we don't care if the objects are positionned properly. // right now we don't care if the objects are positionned properly.
mobj_t *h = P_SpawnMobj(mo->x, mo->y, mo->z + 8*mapobjectscale*P_MobjFlip(mo), MT_DLZ_SEASAW_HITBOX); mobj_t *h = P_SpawnMobj(mo->x, mo->y, mo->z + 8*mapobjectscale*P_MobjFlip(mo), MT_DLZ_SEASAW_HITBOX);
h->extravalue1 = i; // keep track of which side we're on. h->extravalue1 = i; // keep track of which side we're on.
h->tics = -1; h->tics = -1;
@ -179,22 +179,22 @@ void Obj_DLZSeasawSpawn(mobj_t *mo)
h->eflags |= MFE_VERTICALFLIP; h->eflags |= MFE_VERTICALFLIP;
h->flags2 |= MF2_OBJECTFLIP; h->flags2 |= MF2_OBJECTFLIP;
} }
P_SetTarget(&h->target, mo); P_SetTarget(&h->target, mo);
P_SetTarget(&ptrp->hprev, h); // save in an hprev list for updating later. P_SetTarget(&ptrp->hprev, h); // save in an hprev list for updating later.
ptrp = h; ptrp = h;
} }
} }
// update after spawning the objects so that they appear in the right spot when the map loads. // update after spawning the objects so that they appear in the right spot when the map loads.
Obj_DLZSeasawUpdate(mo, false); Obj_DLZSeasawUpdate(mo, false);
} }
static void Obj_DLZSeasawReset(mobj_t *mo) static void Obj_DLZSeasawReset(mobj_t *mo)
{ {
mo->extravalue1 = (INT32)mo->angle; mo->extravalue1 = (INT32)mo->angle;
P_SetTarget(&mo->target, NULL); P_SetTarget(&mo->target, NULL);
Obj_DLZSeasawUpdate(mo, false); Obj_DLZSeasawUpdate(mo, false);
} }
// main seasaw thinker. // main seasaw thinker.
@ -203,26 +203,26 @@ void Obj_DLZSeasawThink(mobj_t *mo)
boolean ghost = false; boolean ghost = false;
SINT8 rot = 1; SINT8 rot = 1;
fixed_t px, py; fixed_t px, py;
if (mo->target && !P_MobjWasRemoved(mo->target)) if (mo->target && !P_MobjWasRemoved(mo->target))
{ {
mobj_t *t = mo->target; mobj_t *t = mo->target;
player_t *p = t->player; // our target should always be a player, do NOT porceed if it isn't. player_t *p = t->player; // our target should always be a player, do NOT porceed if it isn't.
if (!p) // untarget this instantly. if (!p) // untarget this instantly.
{ {
Obj_DLZSeasawReset(mo); Obj_DLZSeasawReset(mo);
return; return;
} }
if (!mo->extravalue2) if (!mo->extravalue2)
rot = -1; rot = -1;
// first half of the animation... // first half of the animation...
if (!p->seasawdir) if (!p->seasawdir)
{ {
INT32 angleadd = ANG1*max(4, (mo->movefactor/3)/mapobjectscale) * rot; INT32 angleadd = ANG1*max(4, (mo->movefactor/3)/mapobjectscale) * rot;
if (p->seasawangleadd > 175) if (p->seasawangleadd > 175)
angleadd /= max(1, (p->seasawangleadd - 160)/8); angleadd /= max(1, (p->seasawangleadd - 160)/8);
@ -242,39 +242,39 @@ void Obj_DLZSeasawThink(mobj_t *mo)
p->seasawangleadd = 0; // reset, we're gonna do a full 360! p->seasawangleadd = 0; // reset, we're gonna do a full 360!
p->seasawmoreangle = p->seasawangleadd - 170; p->seasawmoreangle = p->seasawangleadd - 170;
S_StartSound(t, sfx_s3k88); S_StartSound(t, sfx_s3k88);
S_StartSound(t, sfx_s3ka2); S_StartSound(t, sfx_s3ka2);
} }
} }
else else
{ {
INT32 angleadd = (mo->cvmem*2 +1)*(-rot); INT32 angleadd = (mo->cvmem*2 +1)*(-rot);
mo->cvmem++; mo->cvmem++;
p->seasawangleadd += abs(angleadd)/2; // for some reason i need to do this and i'm actually not sure why. p->seasawangleadd += abs(angleadd)/2; // for some reason i need to do this and i'm actually not sure why.
mo->extravalue1 += angleadd*ANG1; mo->extravalue1 += angleadd*ANG1;
p->seasawangle += angleadd*ANG1; p->seasawangle += angleadd*ANG1;
P_SetPlayerAngle(p, (angle_t)(p->seasawangle - ANGLE_90*rot)); P_SetPlayerAngle(p, (angle_t)(p->seasawangle - ANGLE_90*rot));
ghost = true; ghost = true;
if (p->seasawangleadd >= 340 + p->seasawmoreangle) if (p->seasawangleadd >= 340 + p->seasawmoreangle)
{ {
// reset everything and send the player zooming // reset everything and send the player zooming
Obj_DLZSeasawReset(mo); Obj_DLZSeasawReset(mo);
P_SetPlayerAngle(p, mo->angle); P_SetPlayerAngle(p, mo->angle);
P_MoveOrigin(t, t->x, t->y, t->z); // miscall that to set the position properly. P_MoveOrigin(t, t->x, t->y, t->z); // miscall that to set the position properly.
P_InstaThrust(t, mo->angle, mo->movefactor*3); // send the player flying at triple the speed they came at us with. P_InstaThrust(t, mo->angle, mo->movefactor*3); // send the player flying at triple the speed they came at us with.
S_StartSound(t, sfx_cdfm62); S_StartSound(t, sfx_cdfm62);
p->seasawangleadd = 0; p->seasawangleadd = 0;
p->seasawangle = 0; p->seasawangle = 0;
p->seasawmoreangle = 0; p->seasawmoreangle = 0;
p->seasaw = false; p->seasaw = false;
Obj_DLZSeasawUpdate(mo, true); Obj_DLZSeasawUpdate(mo, true);
return; return;
} }
} }
// update the player // update the player
@ -285,9 +285,9 @@ void Obj_DLZSeasawThink(mobj_t *mo)
} }
else else
Obj_DLZSeasawReset(mo); Obj_DLZSeasawReset(mo);
// finally, update the visuals. // finally, update the visuals.
Obj_DLZSeasawUpdate(mo, ghost); Obj_DLZSeasawUpdate(mo, ghost);
} }
// ported just for convenience of not needing to rewrite the code to account for UINT32 angles... // ported just for convenience of not needing to rewrite the code to account for UINT32 angles...
@ -308,7 +308,7 @@ void Obj_DLZSeasawCollide(mobj_t *mo, mobj_t *mo2)
// cooldown / respawning // cooldown / respawning
if (p->seasawcooldown || p->respawn.timer) if (p->seasawcooldown || p->respawn.timer)
return; return;
// other wacko state that'd do very weird shit if we overwrote it. // other wacko state that'd do very weird shit if we overwrote it.
if (K_isPlayerInSpecialState(p)) if (K_isPlayerInSpecialState(p))
return; return;
@ -316,23 +316,23 @@ void Obj_DLZSeasawCollide(mobj_t *mo, mobj_t *mo2)
// another player is already using the seasar // another player is already using the seasar
if (mo2->target && !P_MobjWasRemoved(mo2->target) && mo2->target->target && !P_MobjWasRemoved(mo2->target->target)) if (mo2->target && !P_MobjWasRemoved(mo2->target) && mo2->target->target && !P_MobjWasRemoved(mo2->target->target))
return; return;
// height checks // height checks
if (mo->z + mo->height < mo2->z) if (mo->z + mo->height < mo2->z)
return; return;
if (mo->z > mo2->z + mo2->height) if (mo->z > mo2->z + mo2->height)
return; return;
// too slow. // too slow.
if (p->speed < K_GetKartSpeed(p, false, false)/3) if (p->speed < K_GetKartSpeed(p, false, false)/3)
return; return;
momangle = angtoint(R_PointToAngle2(0, 0, mo->momx, mo->momy)); momangle = angtoint(R_PointToAngle2(0, 0, mo->momx, mo->momy));
//CONS_Printf("%d / %d -> %d\n", momangle, angtoint(mo2->target->angle), (abs(((momangle - angtoint(mo2->target->angle) +180) % 360) - 180))); //CONS_Printf("%d / %d -> %d\n", momangle, angtoint(mo2->target->angle), (abs(((momangle - angtoint(mo2->target->angle) +180) % 360) - 180)));
// this depends on the side we hit the thing from. // this depends on the side we hit the thing from.
if (abs(((momangle - angtoint(mo2->target->angle) +180) % 360) - 180) > 60) if (abs(((momangle - angtoint(mo2->target->angle) +180) % 360) - 180) > 60)
{ {
@ -340,17 +340,17 @@ void Obj_DLZSeasawCollide(mobj_t *mo, mobj_t *mo2)
mo2->target->extravalue1 += ANGLE_180; mo2->target->extravalue1 += ANGLE_180;
invert = true; invert = true;
} }
mo2->target->movefactor = p->speed; // keep the speed the player was going at. mo2->target->movefactor = p->speed; // keep the speed the player was going at.
mo2->target->extravalue2 = mo2->extravalue1; // which side of the pole are we on? mo2->target->extravalue2 = mo2->extravalue1; // which side of the pole are we on?
// if inverted, then invert the value too. // if inverted, then invert the value too.
if (invert) if (invert)
mo2->target->extravalue2 = (!mo2->target->extravalue2) ? 1 : 0; mo2->target->extravalue2 = (!mo2->target->extravalue2) ? 1 : 0;
P_SetTarget(&mo2->target->target, mo); P_SetTarget(&mo2->target->target, mo);
mo2->target->cvmem = 0; mo2->target->cvmem = 0;
// set player vars now: // set player vars now:
p->seasawdist = R_PointToDist2(mo->x, mo->y, mo2->target->x, mo2->target->y) /FRACUNIT; // distance from us to the center p->seasawdist = R_PointToDist2(mo->x, mo->y, mo2->target->x, mo2->target->y) /FRACUNIT; // distance from us to the center
p->seasawangle = (INT32)R_PointToAngle2(mo2->target->x, mo2->target->y, mo->x, mo->y); // angle from the center to us p->seasawangle = (INT32)R_PointToAngle2(mo2->target->x, mo2->target->y, mo->x, mo->y); // angle from the center to us
@ -359,6 +359,6 @@ void Obj_DLZSeasawCollide(mobj_t *mo, mobj_t *mo2)
p->seasaw = true; p->seasaw = true;
p->pflags |= PF_STASIS; p->pflags |= PF_STASIS;
p->seasawcooldown = TICRATE/2; p->seasawcooldown = TICRATE/2;
S_StartSound(mo, sfx_s3k88); S_StartSound(mo, sfx_s3k88);
} }

View file

@ -37,7 +37,7 @@ void Obj_EggBallSpawnerThink(mobj_t *mo)
mobj_t *ball = P_SpawnMobj(mo->x, mo->y, mo->z, MT_LSZ_EGGBALL); mobj_t *ball = P_SpawnMobj(mo->x, mo->y, mo->z, MT_LSZ_EGGBALL);
ball->angle = mo->angle; ball->angle = mo->angle;
P_SetScale(ball, 6*mapobjectscale); P_SetScale(ball, 6*mapobjectscale);
mo->extravalue1 = P_RandomRange(PR_FUZZ, TICRATE*BALLMINSPAWNTIME, TICRATE*BALLMAXSPAWNTIME); mo->extravalue1 = P_RandomRange(PR_FUZZ, TICRATE*BALLMINSPAWNTIME, TICRATE*BALLMAXSPAWNTIME);
} }
mo->extravalue1--; mo->extravalue1--;
@ -50,18 +50,18 @@ void Obj_EggBallSpawnerThink(mobj_t *mo)
void Obj_EggBallThink(mobj_t *mo) void Obj_EggBallThink(mobj_t *mo)
{ {
P_SetScale(mo, 6*mapobjectscale); P_SetScale(mo, 6*mapobjectscale);
if (mo->eflags & MFE_JUSTHITFLOOR if (mo->eflags & MFE_JUSTHITFLOOR
&& mo->threshold) && mo->threshold)
{ {
if (mo->threshold < -10*mapobjectscale) if (mo->threshold < -10*mapobjectscale)
{ {
UINT8 i; UINT8 i;
mo->momz = (fixed_t)(-mo->threshold)/8; mo->momz = (fixed_t)(-mo->threshold)/8;
for (i=0; i<16; i++) for (i=0; i<16; i++)
{ {
angle_t an = ANG1; angle_t an = ANG1;
@ -70,14 +70,14 @@ void Obj_EggBallThink(mobj_t *mo)
P_InstaThrust(dust, (360/16)*an*i, mapobjectscale*24); // the angle thing is to avoid a warning due to overflows. P_InstaThrust(dust, (360/16)*an*i, mapobjectscale*24); // the angle thing is to avoid a warning due to overflows.
dust->momz = P_RandomRange(PR_FUZZ, 0, 7)*mapobjectscale; dust->momz = P_RandomRange(PR_FUZZ, 0, 7)*mapobjectscale;
} }
S_StartSound(mo, sfx_s3k59); S_StartSound(mo, sfx_s3k59);
P_StartQuakeFromMobj(FRACUNIT*20, 6, 512 * mapobjectscale, mo); P_StartQuakeFromMobj(FRACUNIT*20, 6, 512 * mapobjectscale, mo);
} }
} }
if (!mo->extravalue1) if (!mo->extravalue1)
{ {
if (P_IsObjectOnGround(mo)) if (P_IsObjectOnGround(mo))
@ -95,17 +95,17 @@ void Obj_EggBallThink(mobj_t *mo)
fixed_t dx = mo->x + P_RandomRange(PR_FUZZ, -96, 96)*mapobjectscale - mo->momx*2; fixed_t dx = mo->x + P_RandomRange(PR_FUZZ, -96, 96)*mapobjectscale - mo->momx*2;
fixed_t dy = mo->y + P_RandomRange(PR_FUZZ, -96, 96)*mapobjectscale - mo->momy*2; fixed_t dy = mo->y + P_RandomRange(PR_FUZZ, -96, 96)*mapobjectscale - mo->momy*2;
fixed_t dz = mo->z; fixed_t dz = mo->z;
mobj_t *dust = P_SpawnMobj(dx, dy, dz, MT_DRIFTDUST); mobj_t *dust = P_SpawnMobj(dx, dy, dz, MT_DRIFTDUST);
P_SetScale(dust, mapobjectscale*3); P_SetScale(dust, mapobjectscale*3);
dust->momz = P_RandomRange(PR_FUZZ, 0, 7)*mapobjectscale; dust->momz = P_RandomRange(PR_FUZZ, 0, 7)*mapobjectscale;
dust->destscale = mapobjectscale*8; dust->destscale = mapobjectscale*8;
} }
P_InstaThrust(mo, mo->angle, mo->cusval); P_InstaThrust(mo, mo->angle, mo->cusval);
mo->extravalue2 += 1; mo->extravalue2 += 1;
mo->frame = mo->extravalue2 % (24 * 2) / 2; // 24 is for frame Y. mo->frame = mo->extravalue2 % (24 * 2) / 2; // 24 is for frame Y.
// build up speed // build up speed
if (P_IsObjectOnGround(mo)) if (P_IsObjectOnGround(mo))
{ {
@ -124,11 +124,11 @@ void Obj_EggBallThink(mobj_t *mo)
} }
} }
} }
mo->movedir = mo->z; mo->movedir = mo->z;
} }
mo->threshold = mo->momz; mo->threshold = mo->momz;
if (P_CheckDeathPitCollide(mo)) if (P_CheckDeathPitCollide(mo))
P_RemoveMobj(mo); P_RemoveMobj(mo);
} }

View file

@ -48,17 +48,17 @@ static void plr_resetRideroidVars(player_t *p)
p->rideroidangle = 0; p->rideroidangle = 0;
p->rideroidspeed = 0; p->rideroidspeed = 0;
p->rideroidrollangle = 0; p->rideroidrollangle = 0;
p->rdaddmomx = 0; p->rdaddmomx = 0;
p->rdaddmomy = 0; p->rdaddmomy = 0;
p->rdaddmomz = 0; p->rdaddmomz = 0;
} }
// kills the rideroid and removes it from the map. // kills the rideroid and removes it from the map.
static void Obj_killRideroid(mobj_t *mo) static void Obj_killRideroid(mobj_t *mo)
{ {
UINT8 i; UINT8 i;
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
{ {
mobj_t *t = P_SpawnMobj(mo->x, mo->y, mo->z, MT_THOK); mobj_t *t = P_SpawnMobj(mo->x, mo->y, mo->z, MT_THOK);
@ -76,11 +76,11 @@ static void Obj_killRideroid(mobj_t *mo)
void Obj_getPlayerOffRideroid(mobj_t *mo) void Obj_getPlayerOffRideroid(mobj_t *mo)
{ {
mobj_t *pmo = mo->target; mobj_t *pmo = mo->target;
if (pmo && !P_MobjWasRemoved(pmo)) if (pmo && !P_MobjWasRemoved(pmo))
{ {
player_t *p = pmo->player; player_t *p = pmo->player;
pmo->flags &= ~MF_NOGRAVITY; pmo->flags &= ~MF_NOGRAVITY;
plr_resetRideroidVars(p); plr_resetRideroidVars(p);
@ -89,9 +89,9 @@ void Obj_getPlayerOffRideroid(mobj_t *mo)
mo->momy = mo->momy*2; mo->momy = mo->momy*2;
mo->momz = 0; mo->momz = 0;
mo->target = NULL; mo->target = NULL;
S_StartSound(mo, sfx_ridr4); S_StartSound(mo, sfx_ridr4);
} }
} }
@ -103,11 +103,11 @@ static void Obj_explodeRideroid(mobj_t *mo)
Obj_getPlayerOffRideroid(mo); Obj_getPlayerOffRideroid(mo);
K_SpawnMineExplosion(pmo, pmo->color, 3); K_SpawnMineExplosion(pmo, pmo->color, 3);
S_StartSound(pmo, sfx_s3k4e); S_StartSound(pmo, sfx_s3k4e);
Obj_killRideroid(mo); Obj_killRideroid(mo);
// @TODO: quake. // @TODO: quake.
} }
// used to create a smooth trail. // used to create a smooth trail.
@ -120,23 +120,23 @@ static void Obj_rideroidTrail(mobj_t *mo)
{ {
mobj_t *pmo = mo->target; mobj_t *pmo = mo->target;
player_t *p = NULL; player_t *p = NULL;
UINT8 i, j; UINT8 i, j;
angle_t h_an = mo->angle + ANG1*90; angle_t h_an = mo->angle + ANG1*90;
if (pmo && !P_MobjWasRemoved(pmo)) if (pmo && !P_MobjWasRemoved(pmo))
{ {
p = pmo->player; // used to make some graphics local to save on framerate p = pmo->player; // used to make some graphics local to save on framerate
mo->color = pmo->color; mo->color = pmo->color;
mo->colorized = pmo->colorized; mo->colorized = pmo->colorized;
} }
// from here, we will use the following: // from here, we will use the following:
// extravalue1: prev x // extravalue1: prev x
// extravalue2: prev y // extravalue2: prev y
// cusval: prev z // cusval: prev z
// cvmem: prev roll angle // cvmem: prev roll angle
for (j = 0; j < 9; j++) for (j = 0; j < 9; j++)
{ {
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
@ -146,14 +146,14 @@ static void Obj_rideroidTrail(mobj_t *mo)
fixed_t x = (fixed_t)Obj_rideroidLerp((fixed_t)mo->extravalue1, mo->x, percent); fixed_t x = (fixed_t)Obj_rideroidLerp((fixed_t)mo->extravalue1, mo->x, percent);
fixed_t y = (fixed_t)Obj_rideroidLerp((fixed_t)mo->extravalue2, mo->y, percent); fixed_t y = (fixed_t)Obj_rideroidLerp((fixed_t)mo->extravalue2, mo->y, percent);
fixed_t z = (fixed_t)Obj_rideroidLerp((fixed_t)mo->cusval, mo->z, percent); fixed_t z = (fixed_t)Obj_rideroidLerp((fixed_t)mo->cusval, mo->z, percent);
angle_t v_an = i ? (roll+ANG1*90) : (roll-ANG1*90); angle_t v_an = i ? (roll+ANG1*90) : (roll-ANG1*90);
fixed_t pos = FixedMul(mo->scale, FINESINE(v_an>>ANGLETOFINESHIFT)*60); fixed_t pos = FixedMul(mo->scale, FINESINE(v_an>>ANGLETOFINESHIFT)*60);
fixed_t tx = x+FixedMul(FINECOSINE(h_an>>ANGLETOFINESHIFT), pos); fixed_t tx = x+FixedMul(FINECOSINE(h_an>>ANGLETOFINESHIFT), pos);
fixed_t ty = y+FixedMul(FINESINE(h_an>>ANGLETOFINESHIFT), pos); fixed_t ty = y+FixedMul(FINESINE(h_an>>ANGLETOFINESHIFT), pos);
fixed_t tz = z+FixedMul(FINECOSINE(v_an>>ANGLETOFINESHIFT)*60, mo->scale); fixed_t tz = z+FixedMul(FINECOSINE(v_an>>ANGLETOFINESHIFT)*60, mo->scale);
mobj_t *t = P_SpawnMobj(tx, ty, tz, MT_THOK); mobj_t *t = P_SpawnMobj(tx, ty, tz, MT_THOK);
t->color = SKINCOLOR_TEAL; t->color = SKINCOLOR_TEAL;
t->frame = FF_FULLBRIGHT|FF_TRANS50; t->frame = FF_FULLBRIGHT|FF_TRANS50;
@ -168,10 +168,10 @@ static void Obj_rideroidTrail(mobj_t *mo)
else if (p->startboost) else if (p->startboost)
t->color = K_RainbowColor(leveltime); t->color = K_RainbowColor(leveltime);
} }
} }
} }
mo->extravalue1 = (INT32)mo->x; mo->extravalue1 = (INT32)mo->x;
mo->extravalue2 = (INT32)mo->y; mo->extravalue2 = (INT32)mo->y;
mo->cusval = (INT32)mo->z; mo->cusval = (INT32)mo->z;
@ -182,15 +182,15 @@ static void Obj_rideroidTrail(mobj_t *mo)
static void Obj_updateRideroidPos(mobj_t *mo) static void Obj_updateRideroidPos(mobj_t *mo)
{ {
mobj_t *pmo = mo->target; mobj_t *pmo = mo->target;
fixed_t x = pmo->x + 2*FINECOSINE(pmo->angle>>ANGLETOFINESHIFT); fixed_t x = pmo->x + 2*FINECOSINE(pmo->angle>>ANGLETOFINESHIFT);
fixed_t y = pmo->y + 2*FINESINE(pmo->angle>>ANGLETOFINESHIFT); fixed_t y = pmo->y + 2*FINESINE(pmo->angle>>ANGLETOFINESHIFT);
P_MoveOrigin(mo, x, y, pmo->z - 10*mapobjectscale); P_MoveOrigin(mo, x, y, pmo->z - 10*mapobjectscale);
mo->momx = pmo->momx; mo->momx = pmo->momx;
mo->momy = pmo->momy; mo->momy = pmo->momy;
mo->momz = pmo->momz; mo->momz = pmo->momz;
Obj_rideroidTrail(mo); Obj_rideroidTrail(mo);
} }
@ -199,16 +199,16 @@ void Obj_RideroidThink(mobj_t *mo)
{ {
player_t *p; player_t *p;
mobj_t *pmo = mo->target; mobj_t *pmo = mo->target;
fixed_t basemomx; fixed_t basemomx;
fixed_t basemomy; fixed_t basemomy;
fixed_t xthreshold; fixed_t xthreshold;
fixed_t ythreshold; fixed_t ythreshold;
// speed values... // speed values...
fixed_t maxspd = RIDEROIDSPEED*mapobjectscale; fixed_t maxspd = RIDEROIDSPEED*mapobjectscale;
if (!pmo || P_MobjWasRemoved(pmo)) if (!pmo || P_MobjWasRemoved(pmo))
{ {
if (!mo->fuse) if (!mo->fuse)
@ -226,69 +226,69 @@ void Obj_RideroidThink(mobj_t *mo)
} }
return; return;
} }
// if we're here, our player should still exist which is kinda crazy! // if we're here, our player should still exist which is kinda crazy!
p = pmo->player; p = pmo->player;
// pulling towards the node, AKA towards where the rideroid is, which just so happens to be us right now. // pulling towards the node, AKA towards where the rideroid is, which just so happens to be us right now.
if (p->rdnodepull) if (p->rdnodepull)
{ {
pmo->momx = (mo->x - pmo->x)/6; pmo->momx = (mo->x - pmo->x)/6;
pmo->momy = (mo->y - pmo->y)/6; pmo->momy = (mo->y - pmo->y)/6;
pmo->momz = (mo->z - pmo->z)/6; pmo->momz = (mo->z - pmo->z)/6;
//CONS_Printf("%d\n", R_PointToDist2(mo->x, mo->y, pmo->x, pmo->y)/FRACUNIT); //CONS_Printf("%d\n", R_PointToDist2(mo->x, mo->y, pmo->x, pmo->y)/FRACUNIT);
if (R_PointToDist2(mo->x, mo->y, pmo->x, pmo->y) < NODEPULLOK*mapobjectscale) if (R_PointToDist2(mo->x, mo->y, pmo->x, pmo->y) < NODEPULLOK*mapobjectscale)
{ {
p->rideroid = true; p->rideroid = true;
p->rdnodepull = false; p->rdnodepull = false;
S_StartSound(pmo, sfx_ridr2); S_StartSound(pmo, sfx_ridr2);
} }
return; return;
} }
// if we're here, we made it to the rideroid and we can use it, or something like that! // if we're here, we made it to the rideroid and we can use it, or something like that!
// calculate the maximum speed we can move at. // calculate the maximum speed we can move at.
// the values are a little arbitrary but they work for how little use these have. // the values are a little arbitrary but they work for how little use these have.
if (p->ringboost) if (p->ringboost)
maxspd = (maxspd*12)/10; // Ring Boost: 120% max speed. maxspd = (maxspd*12)/10; // Ring Boost: 120% max speed.
if (p->draftpower) if (p->draftpower)
{ {
UINT8 draftperc = (p->draftpower*100 / FRACUNIT); // 0-100% UINT8 draftperc = (p->draftpower*100 / FRACUNIT); // 0-100%
maxspd += (draftperc/5) / 100; maxspd += (draftperc/5) / 100;
} }
if (p->startboost) if (p->startboost)
maxspd = (maxspd*15)/10; // 150% speed maxspd = (maxspd*15)/10; // 150% speed
// increase speed as we go unless we're turning harshly. // increase speed as we go unless we're turning harshly.
if (p->rideroidspeed*mapobjectscale < maxspd) if (p->rideroidspeed*mapobjectscale < maxspd)
{ {
if (abs(p->cmd.turning < 400)) if (abs(p->cmd.turning < 400))
p->rideroidspeed += (p->ringboost ? 2 : 1); // acceleration is also higher with a ring boost. p->rideroidspeed += (p->ringboost ? 2 : 1); // acceleration is also higher with a ring boost.
} }
else else
p->rideroidspeed -= 1; p->rideroidspeed -= 1;
// sounds // sounds
mo->movecount++; // we use this as a timer for sounds and whatnot. mo->movecount++; // we use this as a timer for sounds and whatnot.
if (mo->movecount == 1 || !(mo->movecount%TICRATE)) if (mo->movecount == 1 || !(mo->movecount%TICRATE))
S_StartSound(mo, sfx_ridr3); S_StartSound(mo, sfx_ridr3);
// aaaaand the actual gameplay and shit... wooooo // aaaaand the actual gameplay and shit... wooooo
pmo->angle = mo->angle; pmo->angle = mo->angle;
pmo->flags |= MF_NOGRAVITY; pmo->flags |= MF_NOGRAVITY;
// do not let the player touch the ground // do not let the player touch the ground
// @TODO: check all 4 corners of the player and use P_GetZAt to account for slopes if pmo->standslope isn't NULL. // @TODO: check all 4 corners of the player and use P_GetZAt to account for slopes if pmo->standslope isn't NULL.
// right now it's not important as LV doesn't mix rdr and slopes but if somehow i manage to pull through w this shit it'll need to be done // right now it's not important as LV doesn't mix rdr and slopes but if somehow i manage to pull through w this shit it'll need to be done
@ -304,22 +304,22 @@ void Obj_RideroidThink(mobj_t *mo)
if (pmo->z < minz) if (pmo->z < minz)
pmo->z = minz; pmo->z = minz;
} }
// if we hit a wall or get hit, get off of the rideroid. // if we hit a wall or get hit, get off of the rideroid.
if (pmo->eflags & MFE_JUSTBOUNCEDWALL || P_PlayerInPain(p)) if (pmo->eflags & MFE_JUSTBOUNCEDWALL || P_PlayerInPain(p))
{ {
Obj_explodeRideroid(mo); Obj_explodeRideroid(mo);
return; return;
} }
// now actual movement: // now actual movement:
// first, do the movement for this frame // first, do the movement for this frame
P_InstaThrust(pmo, (angle_t)p->rideroidangle, p->rideroidspeed*mapobjectscale); P_InstaThrust(pmo, (angle_t)p->rideroidangle, p->rideroidspeed*mapobjectscale);
basemomx = p->mo->momx; basemomx = p->mo->momx;
basemomy = p->mo->momy; basemomy = p->mo->momy;
pmo->momx += p->rdaddmomx; pmo->momx += p->rdaddmomx;
pmo->momy += p->rdaddmomy; pmo->momy += p->rdaddmomy;
pmo->momz += p->rdaddmomz; pmo->momz += p->rdaddmomz;
@ -329,7 +329,7 @@ void Obj_RideroidThink(mobj_t *mo)
pmo->rollangle = p->rideroidrollangle; pmo->rollangle = p->rideroidrollangle;
mo->rollangle = p->rideroidrollangle; mo->rollangle = p->rideroidrollangle;
pmo->pitch = 0; pmo->pitch = 0;
// update the rideroid object (me) to be below the target player // update the rideroid object (me) to be below the target player
Obj_updateRideroidPos(mo); Obj_updateRideroidPos(mo);
@ -340,71 +340,71 @@ void Obj_RideroidThink(mobj_t *mo)
fixed_t savemomy = pmo->momy; fixed_t savemomy = pmo->momy;
SINT8 dir = 0; SINT8 dir = 0;
INT32 a; INT32 a;
if (p->cmd.turning < -400) if (p->cmd.turning < -400)
{ {
a = (INT32)(mo->angle) - ANG1*90; a = (INT32)(mo->angle) - ANG1*90;
P_Thrust(pmo, mo->angle - ANGLE_90, 2*mapobjectscale); P_Thrust(pmo, mo->angle - ANGLE_90, 2*mapobjectscale);
p->rideroidrollangle -= ANG1*3; p->rideroidrollangle -= ANG1*3;
if (p->rideroidrollangle < -ANG1*25) if (p->rideroidrollangle < -ANG1*25)
p->rideroidrollangle = -ANG1*25; p->rideroidrollangle = -ANG1*25;
dir = 1; dir = 1;
} }
else if (p->cmd.turning > 400) else if (p->cmd.turning > 400)
{ {
a = (INT32)(mo->angle) + ANG1*90; a = (INT32)(mo->angle) + ANG1*90;
P_Thrust(pmo, mo->angle + ANGLE_90, 2*mapobjectscale); P_Thrust(pmo, mo->angle + ANGLE_90, 2*mapobjectscale);
p->rideroidrollangle += ANG1*3; p->rideroidrollangle += ANG1*3;
if (p->rideroidrollangle > ANG1*25) if (p->rideroidrollangle > ANG1*25)
p->rideroidrollangle = ANG1*25; p->rideroidrollangle = ANG1*25;
dir = -1; dir = -1;
} }
if (dir != 0 && leveltime & 1 && p->rideroidspeed > RIDEROIDSPEED/2) if (dir != 0 && leveltime & 1 && p->rideroidspeed > RIDEROIDSPEED/2)
{ {
p->rideroidspeed -= 1; p->rideroidspeed -= 1;
} }
if (dir != 0) if (dir != 0)
{ {
// save the added momentum // save the added momentum
p->rdaddmomx = pmo->momx - basemomx; p->rdaddmomx = pmo->momx - basemomx;
p->rdaddmomy = pmo->momy - basemomy; p->rdaddmomy = pmo->momy - basemomy;
//CONS_Printf("AX1: %d, AY1: %d\n", p->rdaddmomx/mapobjectscale, p->rdaddmomy/mapobjectscale); //CONS_Printf("AX1: %d, AY1: %d\n", p->rdaddmomx/mapobjectscale, p->rdaddmomy/mapobjectscale);
pmo->momx = basemomx; pmo->momx = basemomx;
pmo->momy = basemomy; pmo->momy = basemomy;
/*CONS_Printf("CURR: %d, %d\n", pmo->momx/mapobjectscale, pmo->momy/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("BASE: %d, %d\n", basemomx/mapobjectscale, basemomy/mapobjectscale);
CONS_Printf("ADD: %d, %d\n", p->rdaddmomx/mapobjectscale, p->rdaddmomy/mapobjectscale);*/ CONS_Printf("ADD: %d, %d\n", p->rdaddmomx/mapobjectscale, p->rdaddmomy/mapobjectscale);*/
// find out how much addmomx and addmomy we can actually get. // 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. // we do this by misusing P_Thrust to calc our values then immediately cancelling it.
basemomx = pmo->momx; basemomx = pmo->momx;
basemomy = pmo->momy; basemomy = pmo->momy;
a = (INT32)(mo->angle) - dir*ANG1*90; a = (INT32)(mo->angle) - dir*ANG1*90;
P_Thrust(pmo, (angle_t)a, RIDEROIDMAXADD*3*mapobjectscale); P_Thrust(pmo, (angle_t)a, RIDEROIDMAXADD*3*mapobjectscale);
xthreshold = pmo->momx - basemomx; xthreshold = pmo->momx - basemomx;
ythreshold = pmo->momy - basemomy; ythreshold = pmo->momy - basemomy;
//CONS_Printf("XT: %d (%d), YT: %d (%d)\n", xthreshold/mapobjectscale, abs(xthreshold/mapobjectscale), ythreshold/mapobjectscale, abs(ythreshold/mapobjectscale)); //CONS_Printf("XT: %d (%d), YT: %d (%d)\n", xthreshold/mapobjectscale, abs(xthreshold/mapobjectscale), ythreshold/mapobjectscale, abs(ythreshold/mapobjectscale));
// clamp the momentums using the calculated thresholds. // clamp the momentums using the calculated thresholds.
// the fixedmul check checks if both numbers are of the same sign. // the fixedmul check checks if both numbers are of the same sign.
if (abs(p->rdaddmomx) > abs(xthreshold)) if (abs(p->rdaddmomx) > abs(xthreshold))
p->rdaddmomx = xthreshold; p->rdaddmomx = xthreshold;
if (abs(p->rdaddmomy) > abs(ythreshold)) if (abs(p->rdaddmomy) > abs(ythreshold))
p->rdaddmomy = ythreshold; p->rdaddmomy = ythreshold;
@ -423,39 +423,39 @@ void Obj_RideroidThink(mobj_t *mo)
p->rdaddmomy = (p->rdaddmomy*9)/10; p->rdaddmomy = (p->rdaddmomy*9)/10;
p->rideroidrollangle /= 2; p->rideroidrollangle /= 2;
} }
// and now, going up/down // and now, going up/down
if (p->cmd.throwdir > 0) if (p->cmd.throwdir > 0)
{ {
// if we were going the opposite direction, this helps us change our height very easily. // if we were going the opposite direction, this helps us change our height very easily.
if (p->rdaddmomz < 0) if (p->rdaddmomz < 0)
p->rdaddmomz /= 2; p->rdaddmomz /= 2;
p->rdaddmomz = min(RIDEROIDMAXADD*mapobjectscale/7, p->rdaddmomz + mapobjectscale/16); p->rdaddmomz = min(RIDEROIDMAXADD*mapobjectscale/7, p->rdaddmomz + mapobjectscale/16);
if (p->rideroidspeed > RIDEROIDSPEED/2 if (p->rideroidspeed > RIDEROIDSPEED/2
&& abs(p->cmd.turning) > 400 && abs(p->cmd.turning) > 400
&& leveltime & 1) && leveltime & 1)
p->rideroidspeed -= 1; p->rideroidspeed -= 1;
} }
else if (p->cmd.throwdir < 0) else if (p->cmd.throwdir < 0)
{ {
// if we were going the opposite direction, this helps us change our height very easily. // if we were going the opposite direction, this helps us change our height very easily.
if (p->rdaddmomz > 0) if (p->rdaddmomz > 0)
p->rdaddmomz /= 2; p->rdaddmomz /= 2;
p->rdaddmomz = max(-RIDEROIDMAXADD*mapobjectscale/7, p->rdaddmomz - mapobjectscale/16); p->rdaddmomz = max(-RIDEROIDMAXADD*mapobjectscale/7, p->rdaddmomz - mapobjectscale/16);
if (p->rideroidspeed > RIDEROIDSPEED/2 if (p->rideroidspeed > RIDEROIDSPEED/2
&& abs(p->cmd.turning) > 400 && abs(p->cmd.turning) > 400
&& leveltime & 1) && leveltime & 1)
p->rideroidspeed -= 1; p->rideroidspeed -= 1;
} }
else else
p->rdaddmomz = (p->rdaddmomz*6)/10; p->rdaddmomz = (p->rdaddmomz*6)/10;
} }
// transposed lua code. // transposed lua code.
@ -470,25 +470,25 @@ void Obj_RideroidNodeSpawn(mobj_t *mo)
mobj_t *ptr = mo; mobj_t *ptr = mo;
UINT8 i; UINT8 i;
UINT8 j; UINT8 j;
// make it bigger. // make it bigger.
P_SetScale(mo, mo->scale*3); P_SetScale(mo, mo->scale*3);
// spawn the letter things. // spawn the letter things.
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
angle_t ang = mo->angle + (i)*180; angle_t ang = mo->angle + (i)*180;
fixed_t zpos = mo->z + 64*mapobjectscale + mapobjectscale*96*i; fixed_t zpos = mo->z + 64*mapobjectscale + mapobjectscale*96*i;
ang *= ANG1; // this has to be done here or the warning prevents the compile, we don't care about overflowing here. ang *= ANG1; // this has to be done here or the warning prevents the compile, we don't care about overflowing here.
for (j = 0; j < 7; j++) for (j = 0; j < 7; j++)
{ {
fixed_t xpos = mo->x + FixedMul(radius, FINECOSINE(ang>>ANGLETOFINESHIFT)); fixed_t xpos = mo->x + FixedMul(radius, FINECOSINE(ang>>ANGLETOFINESHIFT));
fixed_t ypos = mo->y + FixedMul(radius, FINESINE(ang>>ANGLETOFINESHIFT)); fixed_t ypos = mo->y + FixedMul(radius, FINESINE(ang>>ANGLETOFINESHIFT));
mobj_t *let = P_SpawnMobj(xpos, ypos, zpos, MT_THOK); mobj_t *let = P_SpawnMobj(xpos, ypos, zpos, MT_THOK);
let->sprite = SPR_RDRL; let->sprite = SPR_RDRL;
let->frame = j|FF_FULLBRIGHT|FF_PAPERSPRITE; let->frame = j|FF_FULLBRIGHT|FF_PAPERSPRITE;
@ -496,15 +496,15 @@ void Obj_RideroidNodeSpawn(mobj_t *mo)
let->tics = -1; let->tics = -1;
let->angle = ang + ANG1*90; let->angle = ang + ANG1*90;
let->scale = 2*mapobjectscale; let->scale = 2*mapobjectscale;
// set letter in previous thing's hnext, this will let us loop em easily in the looping thinker. // set letter in previous thing's hnext, this will let us loop em easily in the looping thinker.
P_SetTarget(&ptr->hnext, let); P_SetTarget(&ptr->hnext, let);
// set the ptr to the last letter spawned. // set the ptr to the last letter spawned.
ptr = let; ptr = let;
ang += ANG1*8; ang += ANG1*8;
} }
} }
} }
@ -514,57 +514,57 @@ void Obj_RideroidNodeThink(mobj_t *mo)
mobj_t *ptr = mo->hnext; mobj_t *ptr = mo->hnext;
mobj_t *pmo; mobj_t *pmo;
UINT8 i; UINT8 i;
mo->angle -= NODEROTSPEED; // continuously rotate. mo->angle -= NODEROTSPEED; // continuously rotate.
while (ptr && !P_MobjWasRemoved(ptr)) while (ptr && !P_MobjWasRemoved(ptr))
{ {
// get the new position, move us here, and move on to the next object in line. // get the new position, move us here, and move on to the next object in line.
angle_t newang = ptr->angle - NODEROTSPEED; angle_t newang = ptr->angle - NODEROTSPEED;
fixed_t newxpos = mo->x + FixedMul(radius, FINECOSINE((newang - ANG1*90)>>ANGLETOFINESHIFT)); fixed_t newxpos = mo->x + FixedMul(radius, FINECOSINE((newang - ANG1*90)>>ANGLETOFINESHIFT));
fixed_t newypos = mo->y + FixedMul(radius, FINESINE((newang - ANG1*90)>>ANGLETOFINESHIFT)); fixed_t newypos = mo->y + FixedMul(radius, FINESINE((newang - ANG1*90)>>ANGLETOFINESHIFT));
P_MoveOrigin(ptr, newxpos, newypos, ptr->z); P_MoveOrigin(ptr, newxpos, newypos, ptr->z);
ptr->angle = newang; ptr->angle = newang;
ptr = ptr->hnext; ptr = ptr->hnext;
} }
// check for players coming near us. // check for players coming near us.
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
if (!playeringame[i] || players[i].spectator || players[i].rideroid || if (!playeringame[i] || players[i].spectator || players[i].rideroid ||
players[i].rdnodepull || K_isPlayerInSpecialState(&players[i]) || P_PlayerInPain(&players[i])) players[i].rdnodepull || K_isPlayerInSpecialState(&players[i]) || P_PlayerInPain(&players[i]))
continue; continue;
pmo = players[i].mo; pmo = players[i].mo;
//CONS_Printf("rd: %d\n", players[i].rideroid); //CONS_Printf("rd: %d\n", players[i].rideroid);
if (R_PointToDist2(mo->x, mo->y, pmo->x, pmo->y) < NODERADIUS*mapobjectscale if (R_PointToDist2(mo->x, mo->y, pmo->x, pmo->y) < NODERADIUS*mapobjectscale
&& pmo->z + pmo->height >= mo->z && pmo->z + pmo->height >= mo->z
&& pmo->z <= mo->z + 512*mapobjectscale) && pmo->z <= mo->z + 512*mapobjectscale)
{ {
mobj_t *rd; mobj_t *rd;
plr_undoRespawn(&players[i]); plr_undoRespawn(&players[i]);
plr_resetRideroidVars(&players[i]); plr_resetRideroidVars(&players[i]);
players[i].rdnodepull = true; players[i].rdnodepull = true;
players[i].rideroidangle = mo->spawnpoint->angle*ANG1; // reminder that mo->angle changes, so we use the spawnpoint angle. players[i].rideroidangle = mo->spawnpoint->angle*ANG1; // reminder that mo->angle changes, so we use the spawnpoint angle.
players[i].rideroidspeed = RIDEROIDSPEED; players[i].rideroidspeed = RIDEROIDSPEED;
P_SetTarget(&pmo->tracer, mo); P_SetTarget(&pmo->tracer, mo);
// spawn the rideroid. // spawn the rideroid.
rd = P_SpawnMobj(mo->x, mo->y, mo->z, MT_RIDEROID); rd = P_SpawnMobj(mo->x, mo->y, mo->z, MT_RIDEROID);
rd->angle = players[i].rideroidangle; rd->angle = players[i].rideroidangle;
P_SetTarget(&rd->target, pmo); P_SetTarget(&rd->target, pmo);
S_StartSound(rd, sfx_ridr1); S_StartSound(rd, sfx_ridr1);
//CONS_Printf("rd pull\n"); //CONS_Printf("rd pull\n");
} }
} }
} }

View file

@ -42,7 +42,7 @@ void Obj_WPZKuragenThink(mobj_t *mo)
{ {
//(void)mo; //(void)mo;
boolean active = false; boolean active = false;
// .....and i need to do this... because? // .....and i need to do this... because?
if (!mo->cusval) if (!mo->cusval)
{ {
@ -50,7 +50,7 @@ void Obj_WPZKuragenThink(mobj_t *mo)
mo->destscale = mapobjectscale*2; mo->destscale = mapobjectscale*2;
mo->cusval = 1; mo->cusval = 1;
} }
if (!(mo->spawnpoint->options & 1 || mo->spawnpoint->thing_args[0])) // extra flag skips player checks, making it a decoration. if (!(mo->spawnpoint->options & 1 || mo->spawnpoint->thing_args[0])) // extra flag skips player checks, making it a decoration.
{ {
UINT8 i; UINT8 i;
@ -58,13 +58,13 @@ void Obj_WPZKuragenThink(mobj_t *mo)
{ {
player_t *p; player_t *p;
mobj_t *pmo; mobj_t *pmo;
if (!playeringame[i] || players[i].spectator) if (!playeringame[i] || players[i].spectator)
continue; continue;
p = &players[i]; p = &players[i];
pmo = p->mo; pmo = p->mo;
if (R_PointToDist2(pmo->x, pmo->y, mo->x, mo->y) < mapobjectscale*6144) if (R_PointToDist2(pmo->x, pmo->y, mo->x, mo->y) < mapobjectscale*6144)
{ {
active = true; active = true;
@ -72,11 +72,11 @@ void Obj_WPZKuragenThink(mobj_t *mo)
} }
} }
} }
if (active && mo->extravalue1) if (active && mo->extravalue1)
{ {
mo->extravalue1--; mo->extravalue1--;
if (!mo->extravalue1) if (!mo->extravalue1)
{ {
mobj_t *b = P_SpawnMobj(mo->x, mo->y, mo->z, MT_KURAGENBOMB); mobj_t *b = P_SpawnMobj(mo->x, mo->y, mo->z, MT_KURAGENBOMB);
@ -98,7 +98,7 @@ void Obj_WPZKuragenBombThink(mobj_t *mo)
P_SetScale(mo, mapobjectscale/2); P_SetScale(mo, mapobjectscale/2);
P_RadiusAttack(mo, mo, FRACUNIT*192, DMG_EXPLODE, false); P_RadiusAttack(mo, mo, FRACUNIT*192, DMG_EXPLODE, false);
A_MineExplode(mo); A_MineExplode(mo);
P_RemoveMobj(mo); P_RemoveMobj(mo);
} }
} }

View file

@ -40,16 +40,16 @@ void Obj_WPZTurbineSpawn(mobj_t *mo)
{ {
mobj_t *ptr = mo; mobj_t *ptr = mo;
UINT8 i; UINT8 i;
// spawn the visuals regardless of flags, make em invisible. // spawn the visuals regardless of flags, make em invisible.
// we'll care about updating em if it's worth doing later. // we'll care about updating em if it's worth doing later.
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
{ {
mobj_t *vis = P_SpawnMobj(mo->x, mo->y, mo->z, MT_THOK); mobj_t *vis = P_SpawnMobj(mo->x, mo->y, mo->z, MT_THOK);
P_SetMobjState(vis, S_INVISIBLE); P_SetMobjState(vis, S_INVISIBLE);
vis->tics = 4; // if we don't use it just despawn it later. vis->tics = 4; // if we don't use it just despawn it later.
P_SetTarget(&ptr->hnext, vis); P_SetTarget(&ptr->hnext, vis);
ptr = vis; ptr = vis;
} }
@ -60,22 +60,22 @@ static void Obj_WPZTurbineUpdate(mobj_t *mo)
{ {
angle_t ang = (angle_t)mo->extravalue1; angle_t ang = (angle_t)mo->extravalue1;
mapthing_t *mt = mo->spawnpoint; mapthing_t *mt = mo->spawnpoint;
if (!mt) if (!mt)
return; return;
// fans // fans
if (!mt->thing_args[1]) if (!mt->thing_args[1])
{ {
UINT8 i; UINT8 i;
mobj_t *ptr = mo; mobj_t *ptr = mo;
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
{ {
fixed_t x = mo->x + FixedMul(mapobjectscale, TURBINE_RADIUS*FINECOSINE(ang>>ANGLETOFINESHIFT)); fixed_t x = mo->x + FixedMul(mapobjectscale, TURBINE_RADIUS*FINECOSINE(ang>>ANGLETOFINESHIFT));
fixed_t y = mo->y + FixedMul(mapobjectscale, TURBINE_RADIUS*FINESINE(ang>>ANGLETOFINESHIFT)); fixed_t y = mo->y + FixedMul(mapobjectscale, TURBINE_RADIUS*FINESINE(ang>>ANGLETOFINESHIFT));
// get the mobj // get the mobj
if (ptr && !P_MobjWasRemoved(ptr) && ptr->hnext && !P_MobjWasRemoved(ptr->hnext)) if (ptr && !P_MobjWasRemoved(ptr) && ptr->hnext && !P_MobjWasRemoved(ptr->hnext))
{ {
@ -88,15 +88,15 @@ static void Obj_WPZTurbineUpdate(mobj_t *mo)
ptr->destscale = mapobjectscale*4; ptr->destscale = mapobjectscale*4;
ptr->angle = ang; ptr->angle = ang;
} }
ang += (360/8)*ANG1; ang += (360/8)*ANG1;
} }
} }
// bubbles if we're underwater // bubbles if we're underwater
if (mo->z < mo->watertop && leveltime%10 == 0) if (mo->z < mo->watertop && leveltime%10 == 0)
{ {
INT32 dradius = TURBINE_SPIN; INT32 dradius = TURBINE_SPIN;
INT32 bubbleradius; INT32 bubbleradius;
angle_t bubbleang; angle_t bubbleang;
@ -105,14 +105,14 @@ static void Obj_WPZTurbineUpdate(mobj_t *mo)
if (mt->thing_args[7]) if (mt->thing_args[7])
dradius = mt->thing_args[7]; dradius = mt->thing_args[7];
bubbleradius = P_RandomRange(PR_FUZZ, dradius/4, (dradius*3)/2); bubbleradius = P_RandomRange(PR_FUZZ, dradius/4, (dradius*3)/2);
bubbleang = P_RandomRange(PR_FUZZ, 0, 359)*ANG1; bubbleang = P_RandomRange(PR_FUZZ, 0, 359)*ANG1;
bx = mo->x + FixedMul(mapobjectscale, bubbleradius*FINECOSINE(bubbleang>>ANGLETOFINESHIFT)); bx = mo->x + FixedMul(mapobjectscale, bubbleradius*FINECOSINE(bubbleang>>ANGLETOFINESHIFT));
by = mo->y + FixedMul(mapobjectscale, bubbleradius*FINECOSINE(bubbleang>>ANGLETOFINESHIFT)); by = mo->y + FixedMul(mapobjectscale, bubbleradius*FINECOSINE(bubbleang>>ANGLETOFINESHIFT));
bz = R_PointInSubsector(bx, by)->sector->floorheight; bz = R_PointInSubsector(bx, by)->sector->floorheight;
bubble = P_SpawnMobj(bx, by, bz, MT_WATERPALACEBUBBLE); bubble = P_SpawnMobj(bx, by, bz, MT_WATERPALACEBUBBLE);
bubble->fuse = TICRATE*10; bubble->fuse = TICRATE*10;
bubble->angle = bubbleang; bubble->angle = bubbleang;
@ -135,44 +135,44 @@ void Obj_WPZTurbineThinker(mobj_t *mo)
SINT8 mult = (opt1) ? (-1) : (1); SINT8 mult = (opt1) ? (-1) : (1);
mo->extravalue1 += rotspeed*mult; mo->extravalue1 += rotspeed*mult;
// find players in range and take their phones. // find players in range and take their phones.
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
player_t *p; player_t *p;
mobj_t *pmo; mobj_t *pmo;
if (!playeringame[i] || players[i].spectator || K_isPlayerInSpecialState(&players[i])) if (!playeringame[i] || players[i].spectator || K_isPlayerInSpecialState(&players[i]))
continue; continue;
p = &players[i]; p = &players[i];
pmo = p->mo; pmo = p->mo;
if (R_PointToDist2(pmo->x, pmo->y, mo->x, mo->y) < range if (R_PointToDist2(pmo->x, pmo->y, mo->x, mo->y) < range
&& !p->turbine && !p->turbine
&& !p->respawn.timer) && !p->respawn.timer)
{ {
P_SetTarget(&pmo->tracer, mo); P_SetTarget(&pmo->tracer, mo);
p->turbine = turbinetime; p->turbine = turbinetime;
// to be fully honest i dont rememebr what i was on while writing this // to be fully honest i dont rememebr what i was on while writing this
// but it originally went by mo instead of pmo for angle??? how did it ever *work* ? // but it originally went by mo instead of pmo for angle??? how did it ever *work* ?
p->turbineangle = ANGLE_180 + R_PointToAngle2(0, 0, mo->momx, mo->momy); p->turbineangle = ANGLE_180 + R_PointToAngle2(0, 0, mo->momx, mo->momy);
if (!p->speed) if (!p->speed)
p->turbineangle = ANGLE_180 + mo->angle; p->turbineangle = ANGLE_180 + mo->angle;
p->turbineangle += ANG1*45*mult; p->turbineangle += ANG1*45*mult;
p->turbineheight = baseheight; p->turbineheight = baseheight;
p->turbinespd = false; p->turbinespd = false;
if (FixedDiv(p->speed, K_GetKartSpeed(p, false, false)) > FRACUNIT + FRACUNIT/3 // 133% speed if (FixedDiv(p->speed, K_GetKartSpeed(p, false, false)) > FRACUNIT + FRACUNIT/3 // 133% speed
&& baseheight != sneakerheight) && baseheight != sneakerheight)
{ {
p->turbineheight = sneakerheight; p->turbineheight = sneakerheight;
p->turbinespd = true; p->turbinespd = true;
} }
pmo->flags |= MF_NOCLIP; pmo->flags |= MF_NOCLIP;
} }
} }
@ -198,46 +198,46 @@ void Obj_playerWPZTurbine(player_t *p)
INT32 speed = ANG1*3; INT32 speed = ANG1*3;
boolean mode = false; boolean mode = false;
boolean distreached; boolean distreached;
fixed_t tx, ty, tz; fixed_t tx, ty, tz;
fixed_t momz; fixed_t momz;
if (!t || P_MobjWasRemoved(t)) if (!t || P_MobjWasRemoved(t))
{ {
p->turbine = false; p->turbine = false;
P_SetTarget(&pmo->tracer, NULL); P_SetTarget(&pmo->tracer, NULL);
return; // wtf happened return; // wtf happened
} }
mt = t->spawnpoint; mt = t->spawnpoint;
opt1 = (mt->thing_args[0] != 0); opt1 = (mt->thing_args[0] != 0);
if (mt->thing_args[6]) if (mt->thing_args[6])
dist = mt->thing_args[6]*FRACUNIT; dist = mt->thing_args[6]*FRACUNIT;
if (mt->thing_args[5]) if (mt->thing_args[5])
speed = mt->thing_args[5]*ANG1/10; speed = mt->thing_args[5]*ANG1/10;
if (mt->thing_args[9]) if (mt->thing_args[9])
mode = true; mode = true;
distreached = R_PointToDist2(t->x, t->y, pmo->x, pmo->y) <= dist+32*mapobjectscale; distreached = R_PointToDist2(t->x, t->y, pmo->x, pmo->y) <= dist+32*mapobjectscale;
if (mode && !distreached) if (mode && !distreached)
p->turbineangle = (INT32)R_PointToAngle2(t->x, t->y, pmo->x, pmo->y); p->turbineangle = (INT32)R_PointToAngle2(t->x, t->y, pmo->x, pmo->y);
p->spinouttimer = TICRATE; p->spinouttimer = TICRATE;
pmo->pitch = 0; pmo->pitch = 0;
// determine target x/y/z // determine target x/y/z
tx = t->x + (dist/FRACUNIT)*FINECOSINE((angle_t)(p->turbineangle)>>ANGLETOFINESHIFT); tx = t->x + (dist/FRACUNIT)*FINECOSINE((angle_t)(p->turbineangle)>>ANGLETOFINESHIFT);
ty = t->y + (dist/FRACUNIT)*FINESINE((angle_t)(p->turbineangle)>>ANGLETOFINESHIFT); ty = t->y + (dist/FRACUNIT)*FINESINE((angle_t)(p->turbineangle)>>ANGLETOFINESHIFT);
tz = p->turbineheight; tz = p->turbineheight;
//CONS_Printf("%d %d\n", tx/FRACUNIT, ty/FRACUNIT); //CONS_Printf("%d %d\n", tx/FRACUNIT, ty/FRACUNIT);
if (mode) if (mode)
{ {
if (distreached) if (distreached)
@ -255,13 +255,13 @@ void Obj_playerWPZTurbine(player_t *p)
pmo->momx = (tx - pmo->x)/24 * (p->turbinespd ? 2 : 1); pmo->momx = (tx - pmo->x)/24 * (p->turbinespd ? 2 : 1);
pmo->momy = (ty - pmo->y)/24 * (p->turbinespd ? 2 : 1); pmo->momy = (ty - pmo->y)/24 * (p->turbinespd ? 2 : 1);
} }
momz = (tz - pmo->z)/128 * (p->turbinespd+1); momz = (tz - pmo->z)/128 * (p->turbinespd+1);
if (mt->thing_args[8]) if (mt->thing_args[8])
{ {
momz = (mt->thing_args[8]*FRACUNIT) * ((tz < pmo->z) ? -1 : 1); momz = (mt->thing_args[8]*FRACUNIT) * ((tz < pmo->z) ? -1 : 1);
if (momz < 0) if (momz < 0)
{ {
if (pmo->z + momz < tz) if (pmo->z + momz < tz)
@ -276,9 +276,9 @@ void Obj_playerWPZTurbine(player_t *p)
momz = tz - pmo->z; momz = tz - pmo->z;
} }
} }
} }
pmo->momz = momz; pmo->momz = momz;
p->turbineangle += (speed * (p->turbinespd ? 2 : 1)) * (opt1 ? -1 : 1); p->turbineangle += (speed * (p->turbinespd ? 2 : 1)) * (opt1 ? -1 : 1);
P_SetPlayerAngle(p, (angle_t)p->turbineangle + ANGLE_90*(opt1 ? -1 : 1)); P_SetPlayerAngle(p, (angle_t)p->turbineangle + ANGLE_90*(opt1 ? -1 : 1));
@ -288,7 +288,7 @@ void Obj_playerWPZTurbine(player_t *p)
fixed_t rx = pmo->x + P_RandomRange(PR_FUZZ, -64, 64)*mapobjectscale; fixed_t rx = pmo->x + P_RandomRange(PR_FUZZ, -64, 64)*mapobjectscale;
fixed_t ry = pmo->y + P_RandomRange(PR_FUZZ, -64, 64)*mapobjectscale; fixed_t ry = pmo->y + P_RandomRange(PR_FUZZ, -64, 64)*mapobjectscale;
fixed_t rz = pmo->z + P_RandomRange(PR_FUZZ, -64, 64)*mapobjectscale; fixed_t rz = pmo->z + P_RandomRange(PR_FUZZ, -64, 64)*mapobjectscale;
mobj_t *bubl = P_SpawnMobj(rx, ry, rz, MT_THOK); mobj_t *bubl = P_SpawnMobj(rx, ry, rz, MT_THOK);
P_SetScale(bubl, pmo->scale*2); P_SetScale(bubl, pmo->scale*2);
bubl->scalespeed = pmo->scale/12; bubl->scalespeed = pmo->scale/12;
@ -297,22 +297,22 @@ void Obj_playerWPZTurbine(player_t *p)
bubl->frame = 0; bubl->frame = 0;
bubl->tics = TICRATE; bubl->tics = TICRATE;
} }
if (pmo->momz < mapobjectscale*6) if (pmo->momz < mapobjectscale*6)
{ {
INT32 myang = angtoint(pmo->angle); INT32 myang = angtoint(pmo->angle);
angle_t exitangle = t->angle; angle_t exitangle = t->angle;
INT32 targetangle = angtoint(exitangle); INT32 targetangle = angtoint(exitangle);
INT32 launchangle = myang-targetangle; INT32 launchangle = myang-targetangle;
// WHAT WAS I SMOKING // WHAT WAS I SMOKING
if ( (opt1 && launchangle > -60 && launchangle < -45) if ( (opt1 && launchangle > -60 && launchangle < -45)
|| (!opt1 && launchangle > 45 && launchangle < 60)) || (!opt1 && launchangle > 45 && launchangle < 60))
{ {
P_SetPlayerAngle(p, targetangle*ANG1); P_SetPlayerAngle(p, targetangle*ANG1);
if (mode) if (mode)
P_InstaThrust(pmo, targetangle*ANG1, 128*mapobjectscale); P_InstaThrust(pmo, targetangle*ANG1, 128*mapobjectscale);
else else
@ -320,25 +320,25 @@ void Obj_playerWPZTurbine(player_t *p)
fixed_t spd = FixedHypot(pmo->momx, pmo->momy); fixed_t spd = FixedHypot(pmo->momx, pmo->momy);
P_InstaThrust(pmo, targetangle*ANG1, spd); P_InstaThrust(pmo, targetangle*ANG1, spd);
} }
P_SetTarget(&pmo->tracer, NULL); P_SetTarget(&pmo->tracer, NULL);
p->turbineheight = 0; p->turbineheight = 0;
p->turbineangle = 0; p->turbineangle = 0;
if (p->turbinespd) if (p->turbinespd)
pmo->momz = mapobjectscale*5 * (pmo->eflags & MFE_UNDERWATER ? 2 : 1); pmo->momz = mapobjectscale*5 * (pmo->eflags & MFE_UNDERWATER ? 2 : 1);
if (pmo->eflags & MFE_UNDERWATER) if (pmo->eflags & MFE_UNDERWATER)
{ {
pmo->momz = mapobjectscale*5; pmo->momz = mapobjectscale*5;
pmo->momx = (pmo->momx*17)/10; pmo->momx = (pmo->momx*17)/10;
pmo->momy = (pmo->momy*17)/10; pmo->momy = (pmo->momy*17)/10;
} }
p->spinouttimer = 0; p->spinouttimer = 0;
pmo->flags &= ~MF_NOCLIP; pmo->flags &= ~MF_NOCLIP;
} }
} }
} }
// bubbles that circle the turbine // bubbles that circle the turbine
@ -348,7 +348,7 @@ void Obj_WPZBubbleThink(mobj_t *mo)
mobj_t *t = mo->tracer; mobj_t *t = mo->tracer;
fixed_t tx, ty; fixed_t tx, ty;
mapthing_t *mt; mapthing_t *mt;
// where // where
// where did it go // where did it go
if (!t || P_MobjWasRemoved(t)) if (!t || P_MobjWasRemoved(t))
@ -356,18 +356,18 @@ void Obj_WPZBubbleThink(mobj_t *mo)
P_RemoveMobj(mo); P_RemoveMobj(mo);
return; return;
} }
mt = t->spawnpoint; mt = t->spawnpoint;
if (!mt) if (!mt)
return; return;
mo->momz = mapobjectscale*16; mo->momz = mapobjectscale*16;
tx = t->x + FixedMul(mapobjectscale, mo->movecount*FINECOSINE(ang>>ANGLETOFINESHIFT)); tx = t->x + FixedMul(mapobjectscale, mo->movecount*FINECOSINE(ang>>ANGLETOFINESHIFT));
ty = t->y + FixedMul(mapobjectscale, mo->movecount*FINESINE(ang>>ANGLETOFINESHIFT)); ty = t->y + FixedMul(mapobjectscale, mo->movecount*FINESINE(ang>>ANGLETOFINESHIFT));
mo->momx = (tx - mo->x)/24; mo->momx = (tx - mo->x)/24;
mo->momy = (ty - mo->y)/24; mo->momy = (ty - mo->y)/24;
if (leveltime & 1) if (leveltime & 1)
{ {
fixed_t rx = mo->x + P_RandomRange(PR_FUZZ, -64, 64)*mapobjectscale; fixed_t rx = mo->x + P_RandomRange(PR_FUZZ, -64, 64)*mapobjectscale;
@ -380,9 +380,9 @@ void Obj_WPZBubbleThink(mobj_t *mo)
bubl->frame = 0; bubl->frame = 0;
bubl->tics = TICRATE; bubl->tics = TICRATE;
} }
mo->angle += 3*ANG1 * (mt->thing_args[0] ? -1 : 1); mo->angle += 3*ANG1 * (mt->thing_args[0] ? -1 : 1);
if (mo->z > mo->watertop || mo->z > mo->ceilingz) if (mo->z > mo->watertop || mo->z > mo->ceilingz)
P_RemoveMobj(mo); P_RemoveMobj(mo);
} }