diff --git a/src/d_main.c b/src/d_main.c index 2419f419b..20f73ea69 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1256,6 +1256,7 @@ void D_SRB2Main(void) // Do this up here so that WADs loaded through the command line can use ExecCfg COM_Init(); +#ifndef TESTERS // add any files specified on the command line with -file wadfile // to the wad list if (!((M_GetUrlProtocolArg() || M_CheckParm("-connect")) && !M_CheckParm("-server"))) @@ -1273,6 +1274,7 @@ void D_SRB2Main(void) } } } +#endif // get map from parms diff --git a/src/d_netcmd.c b/src/d_netcmd.c index c221aee90..7fa504e90 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3866,6 +3866,7 @@ static void Got_RunSOCcmd(UINT8 **cp, INT32 playernum) */ static void Command_Addfile(void) { +#ifndef TESTERS size_t argc = COM_Argc(); // amount of arguments total size_t curarg; // current argument index @@ -3995,6 +3996,7 @@ static void Command_Addfile(void) else SendNetXCmd(XD_ADDFILE, buf, buf_p - buf); } +#endif/*TESTERS*/ } static void Got_RequestAddfilecmd(UINT8 **cp, INT32 playernum) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 0da791279..13d31dc14 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -40,9 +40,12 @@ #include "../r_things.h" // R_GetShadowZ #include "../d_main.h" #include "../p_slopes.h" -#include "../k_kart.h" // HITLAGJITTERS #include "hw_md2.h" +// SRB2Kart +#include "../k_kart.h" // HITLAGJITTERS +#include "../r_fps.h" + #ifdef NEWCLIP #include "hw_clip.h" #endif @@ -3641,17 +3644,9 @@ static void HWR_DrawDropShadow(mobj_t *thing, fixed_t scale) fixed_t slopez; pslope_t *groundslope; - fixed_t interpx = thing->x; - fixed_t interpy = thing->y; - fixed_t interpz = thing->z; - - // do interpolation - if (cv_frameinterpolation.value == 1) - { - interpx = thing->old_x + FixedMul(rendertimefrac, thing->x - thing->old_x); - interpy = thing->old_y + FixedMul(rendertimefrac, thing->y - thing->old_y); - interpz = thing->old_z + FixedMul(rendertimefrac, thing->z - thing->old_z); - } + fixed_t interpx = R_InterpolateFixed(thing->old_x, thing->x); + fixed_t interpy = R_InterpolateFixed(thing->old_y, thing->y); + fixed_t interpz = R_InterpolateFixed(thing->old_z, thing->z); // hitlag vibrating (todo: interp somehow?) if (thing->hitlag > 0 && (thing->eflags & MFE_DAMAGEHITLAG)) @@ -3673,7 +3668,7 @@ static void HWR_DrawDropShadow(mobj_t *thing, fixed_t scale) interpy += thing->spryoff; interpz += thing->sprzoff; - groundz = R_GetShadowZ(thing, &groundslope); + groundz = R_GetShadowZ(thing, &groundslope, interpx, interpy, interpz); gpatch = (patch_t *)W_CachePatchName("DSHADOW", PU_SPRITE); if (!(gpatch && ((GLPatch_t *)gpatch->hardware)->mipmap->format)) return; @@ -5084,25 +5079,18 @@ static void HWR_ProjectSprite(mobj_t *thing) dispoffset = thing->info->dispoffset; - interpx = thing->x; - interpy = thing->y; - interpz = thing->z; - interpangle = (thing->player ? thing->player->drawangle : thing->angle); + interpx = R_InterpolateFixed(thing->old_x, thing->x); + interpy = R_InterpolateFixed(thing->old_y, thing->y); + interpz = R_InterpolateFixed(thing->old_z, thing->z); + interpangle = ANGLE_MAX; - if (cv_frameinterpolation.value == 1) + if (thing->player) { - interpx = thing->old_x + FixedMul(rendertimefrac, thing->x - thing->old_x); - interpy = thing->old_y + FixedMul(rendertimefrac, thing->y - thing->old_y); - interpz = thing->old_z + FixedMul(rendertimefrac, thing->z - thing->old_z); - - if (thing->player) - { - interpangle = thing->player->old_drawangle + FixedMul(rendertimefrac, thing->player->drawangle - thing->player->old_drawangle); - } - else - { - interpangle = thing->old_angle + FixedMul(rendertimefrac, thing->angle - thing->old_angle); - } + interpangle = R_InterpolateAngle(thing->player->old_drawangle, thing->player->drawangle); + } + else + { + interpangle = R_InterpolateAngle(thing->old_angle, thing->angle); } // hitlag vibrating (todo: interp somehow?) @@ -5307,7 +5295,7 @@ static void HWR_ProjectSprite(mobj_t *thing) if (caster && !P_MobjWasRemoved(caster)) { - fixed_t groundz = R_GetShadowZ(thing, NULL); + fixed_t groundz = R_GetShadowZ(thing, NULL, interpx, interpy, interpz); fixed_t floordiff = abs(((thing->eflags & MFE_VERTICALFLIP) ? caster->height : 0) + caster->z - groundz); shadowheight = FIXED_TO_FLOAT(floordiff); @@ -5526,17 +5514,9 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) if (!thing) return; - interpx = thing->x; - interpy = thing->y; - interpz = thing->z; - - // do interpolation - if (cv_frameinterpolation.value == 1) - { - interpx = thing->old_x + FixedMul(rendertimefrac, thing->x - thing->old_x); - interpy = thing->old_y + FixedMul(rendertimefrac, thing->y - thing->old_y); - interpz = thing->old_z + FixedMul(rendertimefrac, thing->z - thing->old_z); - } + interpx = R_InterpolateFixed(thing->old_x, thing->x); + interpy = R_InterpolateFixed(thing->old_y, thing->y); + interpz = R_InterpolateFixed(thing->old_z, thing->z); // transform the origin point tr_x = FIXED_TO_FLOAT(interpx) - gl_viewx; diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 95077a54a..cf9d0b5c8 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -46,6 +46,7 @@ // SRB2Kart #include "../k_color.h" #include "../k_kart.h" // HITLAGJITTERS +#include "../r_fps.h" #ifdef HAVE_PNG @@ -1368,17 +1369,9 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) INT32 mod; float finalscale; - fixed_t interpx = spr->mobj->x; - fixed_t interpy = spr->mobj->y; - fixed_t interpz = spr->mobj->z; - - // do interpolation - if (cv_frameinterpolation.value == 1) - { - interpx = spr->mobj->old_x + FixedMul(rendertimefrac, spr->mobj->x - spr->mobj->old_x); - interpy = spr->mobj->old_y + FixedMul(rendertimefrac, spr->mobj->y - spr->mobj->old_y); - interpz = spr->mobj->old_z + FixedMul(rendertimefrac, spr->mobj->z - spr->mobj->old_z); - } + fixed_t interpx = R_InterpolateFixed(spr->mobj->old_x, spr->mobj->x); + fixed_t interpy = R_InterpolateFixed(spr->mobj->old_y, spr->mobj->y); + fixed_t interpz = R_InterpolateFixed(spr->mobj->old_z, spr->mobj->z); // hitlag vibrating if (spr->mobj->hitlag > 0 && (spr->mobj->eflags & MFE_DAMAGEHITLAG)) @@ -1636,10 +1629,16 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) if (sprframe->rotate || papersprite) { - fixed_t anglef = AngleFixed(spr->mobj->angle); + fixed_t anglef = INT32_MAX; if (spr->mobj->player) - anglef = AngleFixed(spr->mobj->player->drawangle); + { + anglef = AngleFixed(R_InterpolateAngle(spr->mobj->player->old_drawangle, spr->mobj->player->drawangle)); + } + else + { + anglef = AngleFixed(R_InterpolateAngle(spr->mobj->old_angle, spr->mobj->angle)); + } p.angley = FIXED_TO_FLOAT(anglef); } @@ -1671,8 +1670,8 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) } } - p.anglez = FIXED_TO_FLOAT(AngleFixed(spr->mobj->pitch)); - p.anglex = FIXED_TO_FLOAT(AngleFixed(spr->mobj->roll)); + p.anglez = FIXED_TO_FLOAT(AngleFixed(R_InterpolateAngle(spr->mobj->old_pitch, spr->mobj->pitch))); + p.anglex = FIXED_TO_FLOAT(AngleFixed(R_InterpolateAngle(spr->mobj->old_roll, spr->mobj->roll))); // SRB2CBTODO: MD2 scaling support finalscale *= FIXED_TO_FLOAT(spr->mobj->scale); diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 7afc7d531..498daad9a 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -56,6 +56,7 @@ #include "k_kart.h" #include "k_color.h" #include "k_hud.h" +#include "r_fps.h" // coords are scaled #define HU_INPUTX 0 @@ -165,6 +166,8 @@ static tic_t cechotimer = 0; static tic_t cechoduration = 5*TICRATE; static INT32 cechoflags = 0; +static tic_t resynch_ticker = 0; + //====================================================================== // HEADS UP INIT //====================================================================== @@ -892,6 +895,60 @@ static inline boolean HU_keyInChatString(char *s, char ch) // // +static void HU_TickSongCredits(void) +{ + if (cursongcredit.def == NULL) // No def + { + cursongcredit.x = cursongcredit.old_x = 0; + cursongcredit.anim = 0; + cursongcredit.trans = NUMTRANSMAPS; + return; + } + + cursongcredit.old_x = cursongcredit.x; + + if (cursongcredit.anim > 0) + { + char *str = va("\x1F"" %s", cursongcredit.def->source); + INT32 len = V_ThinStringWidth(str, V_ALLOWLOWERCASE|V_6WIDTHSPACE); + fixed_t destx = (len+7) * FRACUNIT; + + if (cursongcredit.trans > 0) + { + cursongcredit.trans--; + } + + if (cursongcredit.x < destx) + { + cursongcredit.x += (destx - cursongcredit.x) / 2; + } + + if (cursongcredit.x > destx) + { + cursongcredit.x = destx; + } + + cursongcredit.anim--; + } + else + { + if (cursongcredit.trans < NUMTRANSMAPS) + { + cursongcredit.trans++; + } + + if (cursongcredit.x > 0) + { + cursongcredit.x /= 2; + } + + if (cursongcredit.x < 0) + { + cursongcredit.x = 0; + } + } +} + void HU_Ticker(void) { if (dedicated) @@ -906,6 +963,49 @@ void HU_Ticker(void) hu_showscores = false; hu_keystrokes = false; + + if (chat_on) + { + // count down the scroll timer. + if (chat_scrolltime > 0) + chat_scrolltime--; + } + else + { + chat_scrolltime = 0; + } + + if (netgame) // would handle that in hu_drawminichat, but it's actually kinda awkward when you're typing a lot of messages. (only handle that in netgames duh) + { + size_t i = 0; + + // handle spam while we're at it: + for(; (i 0) + stop_spamming[i]--; + } + + // handle chat timers + for (i=0; (i 0) + chat_timers[i]--; + else + HU_removeChatText_Mini(); + } + } + + cechotimer--; + + if (gamestate != GS_LEVEL) + { + return; + } + + resynch_ticker++; + + HU_TickSongCredits(); } #ifndef NONET @@ -1887,8 +1987,6 @@ static void HU_DrawCEcho(void) echoptr = line; echoptr++; } - - --cechotimer; } // @@ -1938,42 +2036,28 @@ static void HU_DrawDemoInfo(void) void HU_DrawSongCredits(void) { char *str; - INT32 len, destx; - INT32 y = (r_splitscreen ? (BASEVIDHEIGHT/2)-4 : 32); + fixed_t x; + fixed_t y = (r_splitscreen ? (BASEVIDHEIGHT/2)-4 : 32) * FRACUNIT; INT32 bgt; if (!cursongcredit.def) // No def + { return; + } str = va("\x1F"" %s", cursongcredit.def->source); - len = V_ThinStringWidth(str, V_ALLOWLOWERCASE|V_6WIDTHSPACE); - destx = (len+7); + bgt = (NUMTRANSMAPS/2) + (cursongcredit.trans / 2); + x = R_InterpolateFixed(cursongcredit.old_x, cursongcredit.x); - if (cursongcredit.anim) - { - if (cursongcredit.trans > 0) - cursongcredit.trans--; - if (cursongcredit.x < destx) - cursongcredit.x += (destx - cursongcredit.x) / 2; - if (cursongcredit.x > destx) - cursongcredit.x = destx; - cursongcredit.anim--; - } - else - { - if (cursongcredit.trans < NUMTRANSMAPS) - cursongcredit.trans++; - if (cursongcredit.x > 0) - cursongcredit.x /= 2; - if (cursongcredit.x < 0) - cursongcredit.x = 0; - } - - bgt = (NUMTRANSMAPS/2)+(cursongcredit.trans/2); if (bgt < NUMTRANSMAPS) - V_DrawScaledPatch(cursongcredit.x, y-2, V_SNAPTOLEFT|(bgt< 0) - chat_scrolltime--; if (!OLDCHAT) HU_DrawChat(); else @@ -1999,31 +2080,9 @@ void HU_Drawer(void) else { typelines = 1; - chat_scrolltime = 0; if (!OLDCHAT && cv_consolechat.value < 2 && netgame) // Don't display minimized chat if you set the mode to Window (Hidden) HU_drawMiniChat(); // draw messages in a cool fashion. } - - if (netgame) // would handle that in hu_drawminichat, but it's actually kinda awkward when you're typing a lot of messages. (only handle that in netgames duh) - { - size_t i = 0; - - // handle spam while we're at it: - for(; (i 0) - stop_spamming[i]--; - } - - // handle chat timers - for (i=0; (i 0) - chat_timers[i]--; - else - HU_removeChatText_Mini(); - } - } #endif if (cechotimer) @@ -2062,12 +2121,10 @@ void HU_Drawer(void) // draw desynch text if (hu_redownloadinggamestate) { - static UINT32 resynch_ticker = 0; char resynch_text[14]; UINT32 i; // Animate the dots - resynch_ticker++; strcpy(resynch_text, "Resynching"); for (i = 0; i < (resynch_ticker / 16) % 4; i++) strcat(resynch_text, "."); diff --git a/src/k_battle.c b/src/k_battle.c index 8a5257206..c4902fb05 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -235,7 +235,7 @@ mobj_t *K_SpawnSphereBox(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 f (void)amount; - drop->angle = angle; + P_InitAngle(drop, angle); P_Thrust(drop, FixedAngle(P_RandomFixed() * 180) + angle, P_RandomRange(4, 12) * mapobjectscale); @@ -529,7 +529,7 @@ static void K_SpawnOvertimeLaser(fixed_t x, fixed_t y, fixed_t scale) mo->eflags |= MFE_VERTICALFLIP; } - mo->angle = R_PointToAngle2(mo->x, mo->y, battleovertime.x, battleovertime.y) + ANGLE_90; + P_InitAngle(mo, R_PointToAngle2(mo->x, mo->y, battleovertime.x, battleovertime.y) + ANGLE_90); mo->renderflags |= (RF_DONTDRAW & ~(K_GetPlayerDontDrawFlag(player))); P_SetScale(mo, scale); diff --git a/src/k_hud.c b/src/k_hud.c index 7f54abd49..ae6124a75 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -31,6 +31,7 @@ #include "r_main.h" #include "s_sound.h" #include "r_things.h" +#include "r_fps.h" #define NUMPOSNUMS 10 #define NUMPOSFRAMES 7 // White, three blues, three reds @@ -835,48 +836,26 @@ void K_ObjectTracking(trackingResult_t *result, vector3_t *point, UINT8 cameraNu return; } - // TODO: needs da interp + // TODO: parts need interp if (cam->chase == true && !player->spectator) { // Use the camera's properties. - viewpointX = cam->x; - viewpointY = cam->y; - viewpointZ = cam->z - point->z; - viewpointAngle = (INT32)cam->angle; - viewpointAiming = (INT32)cam->aiming; - viewpointRoll = (INT32)player->viewrollangle; - - if (cv_frameinterpolation.value == 1) - { - viewpointX = cam->old_x + FixedMul(rendertimefrac, cam->x - cam->old_x); - viewpointY = cam->old_y + FixedMul(rendertimefrac, cam->y - cam->old_y); - viewpointZ = (cam->old_z + FixedMul(rendertimefrac, cam->z - cam->old_z)) - point->z; - - viewpointAngle = (INT32)(cam->old_angle + FixedMul(rendertimefrac, cam->angle - cam->old_angle)); - viewpointAiming = (INT32)(cam->old_aiming + FixedMul(rendertimefrac, cam->aiming - cam->old_aiming)); - viewpointRoll = (INT32)(player->old_viewrollangle + FixedMul(rendertimefrac, player->viewrollangle - player->old_viewrollangle)); - } + viewpointX = R_InterpolateFixed(cam->old_x, cam->x); + viewpointY = R_InterpolateFixed(cam->old_y, cam->y); + viewpointZ = R_InterpolateFixed(cam->old_z, cam->z) - point->z; + viewpointAngle = (INT32)R_InterpolateAngle(cam->old_angle, cam->angle); + viewpointAiming = (INT32)R_InterpolateAngle(cam->old_aiming, cam->aiming); + viewpointRoll = (INT32)R_InterpolateAngle(player->old_viewrollangle, player->viewrollangle); } else { // Use player properties. - viewpointX = player->mo->x; - viewpointY = player->mo->y; - viewpointZ = player->viewz - point->z; - viewpointAngle = (INT32)player->mo->angle; + viewpointX = R_InterpolateFixed(player->mo->old_x, player->mo->x); + viewpointY = R_InterpolateFixed(player->mo->old_y, player->mo->y); + viewpointZ = R_InterpolateFixed(player->mo->old_z, player->mo->z) - point->z; //player->old_viewz + viewpointAngle = (INT32)R_InterpolateAngle(player->mo->old_angle, player->mo->angle); viewpointAiming = (INT32)player->aiming; - viewpointRoll = (INT32)player->viewrollangle; - - if (cv_frameinterpolation.value == 1) - { - viewpointX = player->mo->old_x + FixedMul(rendertimefrac, player->mo->x - player->mo->old_x); - viewpointY = player->mo->old_y + FixedMul(rendertimefrac, player->mo->y - player->mo->old_y); - viewpointZ = (player->mo->old_z + FixedMul(rendertimefrac, player->viewz - player->mo->old_z)) - point->z; //player->old_viewz - - viewpointAngle = (INT32)(player->mo->old_angle + FixedMul(rendertimefrac, player->mo->angle - player->mo->old_angle)); - //viewpointAiming = (INT32)(player->mo->old_aiming + FixedMul(rendertimefrac, player->mo->aiming - player->mo->old_aiming)); - viewpointRoll = (INT32)(player->old_viewrollangle + FixedMul(rendertimefrac, player->viewrollangle - player->old_viewrollangle)); - } + viewpointRoll = (INT32)R_InterpolateAngle(player->old_viewrollangle, player->viewrollangle); } viewpointAngle += (INT32)angleOffset; @@ -2631,24 +2610,13 @@ static void K_drawKartPlayerCheck(void) continue; } - v.x = checkplayer->mo->x; - v.y = checkplayer->mo->y; - v.z = checkplayer->mo->z; + v.x = R_InterpolateFixed(checkplayer->mo->old_x, checkplayer->mo->x); + v.y = R_InterpolateFixed(checkplayer->mo->old_y, checkplayer->mo->y); + v.z = R_InterpolateFixed(checkplayer->mo->old_z, checkplayer->mo->z); - pPos.x = stplyr->mo->x; - pPos.y = stplyr->mo->y; - pPos.z = stplyr->mo->z; - - if (cv_frameinterpolation.value == 1) - { - v.x = checkplayer->mo->old_x + FixedMul(rendertimefrac, checkplayer->mo->x - checkplayer->mo->old_x); - v.y = checkplayer->mo->old_y + FixedMul(rendertimefrac, checkplayer->mo->y - checkplayer->mo->old_y); - v.z = checkplayer->mo->old_z + FixedMul(rendertimefrac, checkplayer->mo->z - checkplayer->mo->old_z); - - pPos.x = stplyr->mo->old_x + FixedMul(rendertimefrac, stplyr->mo->x - stplyr->mo->old_x); - pPos.y = stplyr->mo->old_y + FixedMul(rendertimefrac, stplyr->mo->y - stplyr->mo->old_y); - pPos.z = stplyr->mo->old_z + FixedMul(rendertimefrac, stplyr->mo->z - stplyr->mo->old_z); - } + pPos.x = R_InterpolateFixed(stplyr->mo->old_x, stplyr->mo->x); + pPos.y = R_InterpolateFixed(stplyr->mo->old_y, stplyr->mo->y); + pPos.z = R_InterpolateFixed(stplyr->mo->old_z, stplyr->mo->z); distance = R_PointToDist2(pPos.x, pPos.y, v.x, v.y); @@ -2834,29 +2802,15 @@ static void K_drawKartNameTags(void) if (thiscam->chase == true) { - c.x = thiscam->x; - c.y = thiscam->y; - c.z = thiscam->z; - - if (cv_frameinterpolation.value == 1) - { - c.x = thiscam->old_x + FixedMul(rendertimefrac, thiscam->x - thiscam->old_x); - c.y = thiscam->old_y + FixedMul(rendertimefrac, thiscam->y - thiscam->old_y); - c.z = thiscam->old_z + FixedMul(rendertimefrac, thiscam->z - thiscam->old_z); - } + c.x = R_InterpolateFixed(thiscam->old_x, thiscam->x); + c.y = R_InterpolateFixed(thiscam->old_y, thiscam->y); + c.z = R_InterpolateFixed(thiscam->old_z, thiscam->z); } else { - c.x = stplyr->mo->x; - c.y = stplyr->mo->y; - c.z = stplyr->mo->z; - - if (cv_frameinterpolation.value == 1) - { - c.x = stplyr->mo->old_x + FixedMul(rendertimefrac, stplyr->mo->x - stplyr->mo->old_x); - c.y = stplyr->mo->old_y + FixedMul(rendertimefrac, stplyr->mo->y - stplyr->mo->old_y); - c.z = stplyr->mo->old_z + FixedMul(rendertimefrac, stplyr->mo->z - stplyr->mo->old_z); - } + c.x = R_InterpolateFixed(stplyr->mo->old_x, stplyr->mo->x); + c.y = R_InterpolateFixed(stplyr->mo->old_y, stplyr->mo->y); + c.z = R_InterpolateFixed(stplyr->mo->old_z, stplyr->mo->z); } for (i = 0; i < MAXPLAYERS; i++) @@ -2895,16 +2849,9 @@ static void K_drawKartNameTags(void) continue; } - v.x = ntplayer->mo->x; - v.y = ntplayer->mo->y; - v.z = ntplayer->mo->z; - - if (cv_frameinterpolation.value == 1) - { - v.x = ntplayer->mo->old_x + FixedMul(rendertimefrac, ntplayer->mo->x - ntplayer->mo->old_x); - v.y = ntplayer->mo->old_y + FixedMul(rendertimefrac, ntplayer->mo->y - ntplayer->mo->old_y); - v.z = ntplayer->mo->old_z + FixedMul(rendertimefrac, ntplayer->mo->z - ntplayer->mo->old_z); - } + v.x = R_InterpolateFixed(ntplayer->mo->old_x, ntplayer->mo->x); + v.y = R_InterpolateFixed(ntplayer->mo->old_x, ntplayer->mo->x); + v.z = R_InterpolateFixed(ntplayer->mo->old_x, ntplayer->mo->x); if (!(ntplayer->mo->eflags & MFE_VERTICALFLIP)) { @@ -2959,16 +2906,9 @@ static void K_drawKartNameTags(void) SINT8 localindicator = -1; vector3_t v; - v.x = ntplayer->mo->x; - v.y = ntplayer->mo->y; - v.z = ntplayer->mo->z; - - if (cv_frameinterpolation.value == 1) - { - v.x = ntplayer->mo->old_x + FixedMul(rendertimefrac, ntplayer->mo->x - ntplayer->mo->old_x); - v.y = ntplayer->mo->old_y + FixedMul(rendertimefrac, ntplayer->mo->y - ntplayer->mo->old_y); - v.z = ntplayer->mo->old_z + FixedMul(rendertimefrac, ntplayer->mo->z - ntplayer->mo->old_z); - } + v.x = R_InterpolateFixed(ntplayer->mo->old_x, ntplayer->mo->x); + v.y = R_InterpolateFixed(ntplayer->mo->old_y, ntplayer->mo->y); + v.z = R_InterpolateFixed(ntplayer->mo->old_z, ntplayer->mo->z); v.z += (ntplayer->mo->height / 2); @@ -3208,14 +3148,8 @@ static void K_drawKartMinimap(void) else colormap = NULL; - interpx = g->mo->x; - interpy = g->mo->y; - - if (cv_frameinterpolation.value == 1) - { - interpx = g->mo->old_x + FixedMul(rendertimefrac, g->mo->x - g->mo->old_x); - interpy = g->mo->old_y + FixedMul(rendertimefrac, g->mo->y - g->mo->old_y); - } + interpx = R_InterpolateFixed(g->mo->old_x, g->mo->x); + interpy = R_InterpolateFixed(g->mo->old_y, g->mo->y); K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, faceprefix[skin][FACE_MINIMAP], colormap, AutomapPic); g = g->next; @@ -3273,14 +3207,8 @@ static void K_drawKartMinimap(void) else colormap = NULL; - interpx = players[i].mo->x; - interpy = players[i].mo->y; - - if (cv_frameinterpolation.value == 1) - { - interpx = players[i].mo->old_x + FixedMul(rendertimefrac, players[i].mo->x - players[i].mo->old_x); - interpy = players[i].mo->old_y + FixedMul(rendertimefrac, players[i].mo->y - players[i].mo->old_y); - } + interpx = R_InterpolateFixed(players[i].mo->old_x, players[i].mo->x); + interpy = R_InterpolateFixed(players[i].mo->old_y, players[i].mo->y); K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, faceprefix[skin][FACE_MINIMAP], colormap, AutomapPic); // Target reticule @@ -3308,14 +3236,8 @@ static void K_drawKartMinimap(void) colormap = R_GetTranslationColormap(TC_RAINBOW, mobj->color, GTC_CACHE); } - interpx = mobj->x; - interpy = mobj->y; - - if (cv_frameinterpolation.value == 1) - { - interpx = mobj->old_x + FixedMul(rendertimefrac, mobj->x - mobj->old_x); - interpy = mobj->old_y + FixedMul(rendertimefrac, mobj->y - mobj->old_y); - } + interpx = R_InterpolateFixed(mobj->old_x, mobj->x); + interpy = R_InterpolateFixed(mobj->old_y, mobj->y); K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, kp_spbminimap, colormap, AutomapPic); } @@ -3345,14 +3267,8 @@ static void K_drawKartMinimap(void) else colormap = NULL; - interpx = players[localplayers[i]].mo->x; - interpy = players[localplayers[i]].mo->y; - - if (cv_frameinterpolation.value == 1) - { - interpx = players[localplayers[i]].mo->old_x + FixedMul(rendertimefrac, players[localplayers[i]].mo->x - players[localplayers[i]].mo->old_x); - interpy = players[localplayers[i]].mo->old_y + FixedMul(rendertimefrac, players[localplayers[i]].mo->y - players[localplayers[i]].mo->old_y); - } + interpx = R_InterpolateFixed(players[localplayers[i]].mo->old_x, players[localplayers[i]].mo->x); + interpy = R_InterpolateFixed(players[localplayers[i]].mo->old_y, players[localplayers[i]].mo->y); K_drawKartMinimapIcon(interpx, interpy, x, y, splitflags, faceprefix[skin][FACE_MINIMAP], colormap, AutomapPic); @@ -3631,7 +3547,7 @@ static void K_drawKartFinish(void) x = ((TICRATE - stplyr->karthud[khud_cardanimation])*(xval > x ? xval : x))/TICRATE; ox = ((TICRATE - (stplyr->karthud[khud_cardanimation] - 1))*(xval > x ? xval : x))/TICRATE; - interpx = ox + FixedMul(rendertimefrac, x - ox); + interpx = R_InterpolateFixed(ox, x); if (r_splitscreen && stplyr == &players[displayplayers[1]]) interpx = -interpx; @@ -4028,7 +3944,7 @@ static void K_drawLapStartAnim(void) const UINT8 t = stplyr->karthud[khud_lapanimation]; const UINT8 progress = 80 - t; - const UINT8 tOld = t - 1; + const UINT8 tOld = t + 1; const UINT8 progressOld = 80 - tOld; const tic_t leveltimeOld = leveltime - 1; @@ -4039,11 +3955,11 @@ static void K_drawLapStartAnim(void) newval = (BASEVIDWIDTH/2 + (32 * max(0, t - 76))) * FRACUNIT; oldval = (BASEVIDWIDTH/2 + (32 * max(0, tOld - 76))) * FRACUNIT; - interpx = oldval + FixedMul(rendertimefrac, newval - oldval); + interpx = R_InterpolateFixed(oldval, newval); newval = (48 - (32 * max(0, progress - 76))) * FRACUNIT; oldval = (48 - (32 * max(0, progressOld - 76))) * FRACUNIT; - interpy = oldval + FixedMul(rendertimefrac, newval - oldval); + interpy = R_InterpolateFixed(oldval, newval); V_DrawFixedPatch( interpx, interpy, @@ -4054,7 +3970,7 @@ static void K_drawLapStartAnim(void) { newval = (4 - abs((signed)((leveltime % 8) - 4))) * FRACUNIT; oldval = (4 - abs((signed)((leveltimeOld % 8) - 4))) * FRACUNIT; - interpy += oldval + FixedMul(rendertimefrac, newval - oldval); + interpy += R_InterpolateFixed(oldval, newval); V_DrawFixedPatch( interpx, interpy, @@ -4066,7 +3982,7 @@ static void K_drawLapStartAnim(void) { newval = (62 - (32 * max(0, progress - 76))) * FRACUNIT; oldval = (62 - (32 * max(0, progressOld - 76))) * FRACUNIT; - interpx = oldval + FixedMul(rendertimefrac, newval - oldval); + interpx = R_InterpolateFixed(oldval, newval); V_DrawFixedPatch( interpx, // 27 @@ -4078,7 +3994,7 @@ static void K_drawLapStartAnim(void) { newval = (188 + (32 * max(0, progress - 76))) * FRACUNIT; oldval = (188 + (32 * max(0, progressOld - 76))) * FRACUNIT; - interpx = oldval + FixedMul(rendertimefrac, newval - oldval); + interpx = R_InterpolateFixed(oldval, newval); V_DrawFixedPatch( interpx, // 194 @@ -4091,7 +4007,7 @@ static void K_drawLapStartAnim(void) { newval = (82 - (32 * max(0, progress - 76))) * FRACUNIT; oldval = (82 - (32 * max(0, progressOld - 76))) * FRACUNIT; - interpx = oldval + FixedMul(rendertimefrac, newval - oldval); + interpx = R_InterpolateFixed(oldval, newval); V_DrawFixedPatch( interpx, // 61 @@ -4103,7 +4019,7 @@ static void K_drawLapStartAnim(void) { newval = (188 + (32 * max(0, progress - 76))) * FRACUNIT; oldval = (188 + (32 * max(0, progressOld - 76))) * FRACUNIT; - interpx = oldval + FixedMul(rendertimefrac, newval - oldval); + interpx = R_InterpolateFixed(oldval, newval); V_DrawFixedPatch( interpx, // 194 @@ -4115,7 +4031,7 @@ static void K_drawLapStartAnim(void) { newval = (208 + (32 * max(0, progress - 76))) * FRACUNIT; oldval = (208 + (32 * max(0, progressOld - 76))) * FRACUNIT; - interpx = oldval + FixedMul(rendertimefrac, newval - oldval); + interpx = R_InterpolateFixed(oldval, newval); V_DrawFixedPatch( interpx, // 221 diff --git a/src/k_kart.c b/src/k_kart.c index f0dc4ba09..53426531a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1975,7 +1975,7 @@ void K_SpawnDashDustRelease(player_t *player) dust = P_SpawnMobj(newx, newy, player->mo->z, MT_FASTDUST); P_SetTarget(&dust->target, player->mo); - dust->angle = travelangle - ((i&1) ? -1 : 1)*ANGLE_45; + P_InitAngle(dust, travelangle - ((i&1) ? -1 : 1) * ANGLE_45); dust->destscale = player->mo->scale; P_SetScale(dust, player->mo->scale); @@ -2055,7 +2055,7 @@ void K_SpawnNormalSpeedLines(player_t *player) MT_FASTLINE); P_SetTarget(&fast->target, player->mo); - fast->angle = K_MomentumAngle(player->mo); + P_InitAngle(fast, K_MomentumAngle(player->mo)); fast->momx = 3*player->mo->momx/4; fast->momy = 3*player->mo->momy/4; fast->momz = 3*P_GetMobjZMovement(player->mo)/4; @@ -2083,7 +2083,7 @@ void K_SpawnInvincibilitySpeedLines(mobj_t *mo) fast->momz = 3*P_GetMobjZMovement(mo)/4; P_SetTarget(&fast->target, mo); - fast->angle = K_MomentumAngle(mo); + P_InitAngle(fast, K_MomentumAngle(mo)); fast->color = mo->color; fast->colorized = true; K_MatchGenericExtraFlags(fast, mo); @@ -3148,9 +3148,15 @@ void K_DoInstashield(player_t *player) S_StartSound(player->mo, sfx_cdpcm9); layera = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_INSTASHIELDA); + layera->old_x = player->mo->old_x; + layera->old_y = player->mo->old_y; + layera->old_z = player->mo->old_z; P_SetTarget(&layera->target, player->mo); layerb = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_INSTASHIELDB); + layerb->old_x = player->mo->old_x; + layerb->old_y = player->mo->old_y; + layerb->old_z = player->mo->old_z; P_SetTarget(&layerb->target, player->mo); } @@ -3531,7 +3537,7 @@ void K_TakeBumpersFromPlayer(player_t *player, player_t *victim, UINT8 amount) P_SetTarget(&newmo->tracer, victim->mo); P_SetTarget(&newmo->target, player->mo); - newmo->angle = (diff * (newbumper-1)); + P_InitAngle(newmo, (diff * (newbumper-1))); newmo->color = victim->skincolor; if (newbumper+1 < 2) @@ -3612,7 +3618,7 @@ void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 mobj->z -= mobj->height>>1; // change angle - mobj->angle = R_PointToAngle2(mobj->x, mobj->y, x, y); + P_InitAngle(mobj, R_PointToAngle2(mobj->x, mobj->y, x, y)); // change slope dist = P_AproxDistance(P_AproxDistance(x - mobj->x, y - mobj->y), z - mobj->z); @@ -3699,7 +3705,7 @@ void K_SpawnMineExplosion(mobj_t *source, UINT8 color) { dust = P_SpawnMobj(source->x, source->y, source->z, MT_SMOKE); P_SetMobjState(dust, S_OPAQUESMOKE1); - dust->angle = (ANGLE_180/16) * i; + P_InitAngle(dust, (ANGLE_180/16) * i); P_SetScale(dust, source->scale); dust->destscale = source->scale*10; dust->scalespeed = source->scale/12; @@ -3812,7 +3818,7 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I th->z = th->floorz; } - th->angle = an; + P_InitAngle(th, an); th->momx = FixedMul(finalspeed, FINECOSINE(an>>ANGLETOFINESHIFT)); th->momy = FixedMul(finalspeed, FINESINE(an>>ANGLETOFINESHIFT)); @@ -3980,7 +3986,10 @@ static void K_SpawnDriftElectricity(player_t *player) y = P_ReturnThrustY(mo, verticalangle, verticalradius) + P_ReturnThrustY(mo, horizonatalangle, horizontalradius); spark = P_SpawnMobjFromMobj(mo, x, y, 0, MT_DRIFTELECTRICITY); - spark->angle = sparkangle; + P_InitAngle(spark, sparkangle); + spark->momx = mo->momx; + spark->momy = mo->momy; + spark->momz = mo->momz; spark->color = color; K_GenericExtraFlagsNoZAdjust(spark, mo); @@ -4022,7 +4031,7 @@ void K_SpawnDriftElectricSparks(player_t *player) fixed_t yoff = P_ReturnThrustY(mo, sparkangle, sparkradius); mobj_t *spark = P_SpawnMobjFromMobj(mo, x + xoff, y + yoff, z, MT_DRIFTELECTRICSPARK); - spark->angle = sparkangle; + P_InitAngle(spark, sparkangle); spark->color = color; P_InstaThrust(spark, mo->angle + ANGLE_90, hspeed); P_SetObjectMomZ(spark, vspeed, false); @@ -4073,7 +4082,7 @@ static void K_SpawnDriftSparks(player_t *player) spark = P_SpawnMobj(newx, newy, player->mo->z, MT_DRIFTSPARK); P_SetTarget(&spark->target, player->mo); - spark->angle = travelangle-(ANGLE_45/5)*player->drift; + P_InitAngle(spark, travelangle-(ANGLE_45/5)*player->drift); spark->destscale = player->mo->scale; P_SetScale(spark, player->mo->scale); @@ -4217,7 +4226,7 @@ static void K_SpawnAIZDust(player_t *player) newy = player->mo->y + P_ReturnThrustY(player->mo, travelangle - (player->aizdriftstrat*ANGLE_45), FixedMul(24*FRACUNIT, player->mo->scale)); spark = P_SpawnMobj(newx, newy, player->mo->z, MT_AIZDRIFTSTRAT); - spark->angle = travelangle+(player->aizdriftstrat*ANGLE_90); + P_InitAngle(spark, travelangle+(player->aizdriftstrat*ANGLE_90)); P_SetScale(spark, (spark->destscale = (3*player->mo->scale)>>2)); spark->momx = (6*player->mo->momx)/5; @@ -4269,7 +4278,7 @@ void K_SpawnBoostTrail(player_t *player) flame = P_SpawnMobj(newx, newy, ground, MT_SNEAKERTRAIL); P_SetTarget(&flame->target, player->mo); - flame->angle = travelangle; + P_InitAngle(flame, travelangle); flame->fuse = TICRATE*2; flame->destscale = player->mo->scale; P_SetScale(flame, player->mo->scale); @@ -4325,7 +4334,7 @@ void K_SpawnSparkleTrail(mobj_t *mo) newz = mo->z + (P_RandomRange(0, mo->height>>FRACBITS)*FRACUNIT); sparkle = P_SpawnMobj(newx, newy, newz, MT_SPARKLETRAIL); - sparkle->angle = R_PointToAngle2(mo->x, mo->y, sparkle->x, sparkle->y); + P_InitAngle(sparkle, R_PointToAngle2(mo->x, mo->y, sparkle->x, sparkle->y)); sparkle->movefactor = R_PointToDist2(mo->x, mo->y, sparkle->x, sparkle->y); // Save the distance we spawned away from the player. //CONS_Printf("movefactor: %d\n", sparkle->movefactor/FRACUNIT); sparkle->extravalue1 = (sparkle->z - mo->z); // Keep track of our Z position relative to the player's, I suppose. @@ -4371,7 +4380,7 @@ void K_SpawnWipeoutTrail(mobj_t *mo) mo->z, MT_WIPEOUTTRAIL); P_SetTarget(&dust->target, mo); - dust->angle = K_MomentumAngle(mo); + P_InitAngle(dust, K_MomentumAngle(mo)); dust->destscale = mo->scale; P_SetScale(dust, mo->scale); K_FlipFromObject(dust, mo); @@ -4434,7 +4443,7 @@ void K_SpawnDraftDust(mobj_t *mo) P_SetMobjState(dust, S_DRAFTDUST1 + foff); P_SetTarget(&dust->target, mo); - dust->angle = ang - (ANGLE_90 * sign); // point completely perpendicular from the player + P_InitAngle(dust, ang - (ANGLE_90 * sign)); // point completely perpendicular from the player dust->destscale = mo->scale; P_SetScale(dust, mo->scale); K_FlipFromObject(dust, mo); @@ -4857,11 +4866,18 @@ void K_PuntMine(mobj_t *origMine, mobj_t *punter) mine = P_SpawnMobj(origMine->x, origMine->y, origMine->z, MT_SSMINE); P_SetTarget(&mine->target, mineOwner); + mine->angle = origMine->angle; mine->flags2 = origMine->flags2; mine->floorz = origMine->floorz; mine->ceilingz = origMine->ceilingz; + // Copy interp data + mine->old_angle = origMine->old_angle; + mine->old_x = origMine->old_x; + mine->old_y = origMine->old_y; + mine->old_z = origMine->old_z; + // Since we aren't using P_KillMobj, we need to clean up the hnext reference P_SetTarget(&mineOwner->hnext, NULL); mineOwner->player->bananadrag = 0; @@ -4937,7 +4953,7 @@ static void K_DoThunderShield(player_t *player) for (i=0; i<7; i++) { mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK); - mo->angle = P_RandomRange(0, 359)*ANG1; + P_InitAngle(mo, P_RandomRange(0, 359)*ANG1); mo->fuse = P_RandomRange(20, 50); P_SetTarget(&mo->target, player->mo); P_SetMobjState(mo, S_KLIT1); @@ -4950,7 +4966,7 @@ static void K_DoThunderShield(player_t *player) sx = player->mo->x + FixedMul((player->mo->scale*THUNDERRADIUS), FINECOSINE((an*i)>>ANGLETOFINESHIFT)); sy = player->mo->y + FixedMul((player->mo->scale*THUNDERRADIUS), FINESINE((an*i)>>ANGLETOFINESHIFT)); mo = P_SpawnMobj(sx, sy, player->mo->z, MT_THOK); - mo-> angle = an*i; + P_InitAngle(mo, an*i); mo->extravalue1 = THUNDERRADIUS; // Used to know whether we should teleport by radius or something. mo->scale = player->mo->scale*3; P_SetTarget(&mo->target, player->mo); @@ -5268,7 +5284,7 @@ static void K_ThrowLandMine(player_t *player) P_SetScale(landMine, player->mo->scale); landMine->destscale = player->mo->destscale; - landMine->angle = player->mo->angle; + P_InitAngle(landMine, player->mo->angle); landMine->momz = (30 * mapobjectscale * P_MobjFlip(player->mo)) + player->mo->momz; landMine->color = player->skincolor; @@ -5424,6 +5440,12 @@ void K_DropHnextList(player_t *player, boolean keepshields) dropwork->floorz = work->floorz; dropwork->ceilingz = work->ceilingz; + // Copy interp data + dropwork->old_angle = work->old_angle; + dropwork->old_x = work->old_x; + dropwork->old_y = work->old_y; + dropwork->old_z = work->old_z; + if (ponground) { // floorz and ceilingz aren't properly set to account for FOFs and Polyobjects on spawn @@ -5511,7 +5533,7 @@ mobj_t *K_CreatePaperItem(fixed_t x, fixed_t y, fixed_t z, angle_t angle, SINT8 P_SetScale(drop, drop->scale>>4); drop->destscale = (3*drop->destscale)/2; - drop->angle = angle; + P_InitAngle(drop, angle); P_Thrust(drop, FixedAngle(P_RandomFixed() * 180) + angle, 16*mapobjectscale); @@ -6956,7 +6978,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { mobj_t *ring = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_RING); ring->extravalue1 = 1; // Ring collect animation timer - ring->angle = player->mo->angle; // animation angle + P_InitAngle(ring, player->mo->angle); // animation angle P_SetTarget(&ring->target, player->mo); // toucher for thinker player->pickuprings++; if (player->superring <= 3) @@ -7148,6 +7170,9 @@ void K_KartPlayerAfterThink(player_t *player) } ret = P_SpawnMobj(targ->mo->x, targ->mo->y, targ->mo->z, MT_PLAYERRETICULE); + ret->old_x = targ->mo->old_x; + ret->old_y = targ->mo->old_y; + ret->old_z = targ->mo->old_z; P_SetTarget(&ret->target, targ->mo); ret->frame |= ((leveltime % 10) / 2); ret->tics = 1; @@ -7768,6 +7793,7 @@ void K_SpawnDriftBoostExplosion(player_t *player, int stage) { mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_DRIFTEXPLODE); + P_InitAngle(overlay, K_MomentumAngle(player->mo)); P_SetTarget(&overlay->target, player->mo); P_SetScale(overlay, (overlay->destscale = player->mo->scale)); K_FlipFromObject(overlay, player->mo); @@ -8313,9 +8339,9 @@ static void K_KartSpindashWind(mobj_t *parent) P_SetTarget(&wind->target, parent); if (parent->momx || parent->momy) - wind->angle = R_PointToAngle2(0, 0, parent->momx, parent->momy); + P_InitAngle(wind, R_PointToAngle2(0, 0, parent->momx, parent->momy)); else - wind->angle = parent->player->drawangle; + P_InitAngle(wind, parent->player->drawangle); wind->momx = 3 * parent->momx / 4; wind->momy = 3 * parent->momy / 4; @@ -8348,7 +8374,7 @@ static void K_KartSpindash(player_t *player) mobj_t *grease; grease = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_TIREGREASE); P_SetTarget(&grease->target, player->mo); - grease->angle = K_MomentumAngle(player->mo); + P_InitAngle(grease, K_MomentumAngle(player->mo)); grease->extravalue1 = i; } } @@ -8762,7 +8788,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_ROCKETSNEAKER); K_MatchGenericExtraFlags(mo, player->mo); mo->flags |= MF_NOCLIPTHING; - mo->angle = player->mo->angle; + P_InitAngle(mo, player->mo->angle); mo->threshold = 10; mo->movecount = moloop%2; mo->movedir = mo->lastlook = moloop+1; @@ -8872,7 +8898,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) break; } mo->flags |= MF_NOCLIPTHING; - mo->angle = newangle; + P_InitAngle(mo, newangle); mo->threshold = 10; mo->movecount = player->itemamount; mo->movedir = mo->lastlook = moloop+1; @@ -8913,7 +8939,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) break; } mo->flags |= MF_NOCLIPTHING; - mo->angle = newangle; + P_InitAngle(mo, newangle); mo->threshold = 10; mo->movecount = player->itemamount; mo->movedir = mo->lastlook = moloop+1; @@ -9309,7 +9335,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) spdl = P_SpawnMobj(sx, sy, sz, MT_FASTLINE); P_SetTarget(&spdl->target, player->mo); - spdl->angle = R_PointToAngle2(spdl->x, spdl->y, player->mo->x, player->mo->y); + P_InitAngle(spdl, R_PointToAngle2(spdl->x, spdl->y, player->mo->x, player->mo->y)); spdl->rollangle = -ANG1*90*P_MobjFlip(player->mo); // angle them downwards relative to the player's gravity... spdl->spriteyscale = player->trickboostpower+FRACUNIT; spdl->momx = player->mo->momx; diff --git a/src/k_race.c b/src/k_race.c index ec3bd9b4f..f459e7a80 100644 --- a/src/k_race.c +++ b/src/k_race.c @@ -370,7 +370,7 @@ static void K_DrawFinishLineBeamForLine(fixed_t offset, angle_t aiming, line_t * P_SetMobjState(end1, S_FINISHBEAMEND1); end1->renderflags = RF_DONTDRAW & ~K_GetPlayerDontDrawFlag(&players[displayplayers[i]]); - end1->angle = lineangle; + P_InitAngle(end1, lineangle); end2 = P_SpawnMobj( v->x + (8*sx), @@ -381,7 +381,7 @@ static void K_DrawFinishLineBeamForLine(fixed_t offset, angle_t aiming, line_t * P_SetMobjState(end2, S_FINISHBEAMEND2); end2->renderflags = RF_DONTDRAW & ~K_GetPlayerDontDrawFlag(&players[displayplayers[i]]); - end2->angle = lineangle; + P_InitAngle(end2, lineangle); P_SetTarget(&end2->tracer, end1); end2->flags2 |= MF2_LINKDRAW; diff --git a/src/k_respawn.c b/src/k_respawn.c index 2e93a57d8..b79a5ca69 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -582,7 +582,7 @@ static void K_MovePlayerToRespawnPoint(player_t *player) P_SetTarget(&lasermo->target, player->mo); - lasermo->angle = stepha + ANGLE_90; + P_InitAngle(lasermo, stepha + ANGLE_90); P_SetScale(lasermo, (lasermo->destscale = player->mo->scale)); } } @@ -645,7 +645,7 @@ static void K_DropDashWait(player_t *player) P_SetTarget(&laser->target, player->mo); - laser->angle = newangle + ANGLE_90; + P_InitAngle(laser, newangle + ANGLE_90); laser->momz = (8 * player->mo->scale) * P_MobjFlip(player->mo); P_SetScale(laser, (laser->destscale = player->mo->scale)); } diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 7f410310c..534325283 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1415,7 +1415,7 @@ static int lib_pTeleportMove(lua_State *L) INLEVEL if (!thing) return LUA_ErrInvalid(L, "mobj_t"); - LUA_Deprecated(L, "P_TeleportMove", "P_SetOrigin or P_MoveOrigin"); + LUA_Deprecated(L, "P_TeleportMove", "P_SetOrigin\" or \"P_MoveOrigin"); lua_pushboolean(L, P_SetOrigin(thing, x, y, z)); LUA_PushUserdata(L, tmthing, META_MOBJ); P_SetTarget(&tmthing, ptmthing); @@ -1456,6 +1456,42 @@ static int lib_pMoveOrigin(lua_State *L) return 2; } +static int lib_pInitAngle(lua_State *L) +{ + mobj_t *thing = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); + angle_t newValue = luaL_checkangle(L, 2); + NOHUD + INLEVEL + if (!thing) + return LUA_ErrInvalid(L, "mobj_t"); + P_InitAngle(thing, newValue); + return 0; +} + +static int lib_pInitPitch(lua_State *L) +{ + mobj_t *thing = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); + angle_t newValue = luaL_checkangle(L, 2); + NOHUD + INLEVEL + if (!thing) + return LUA_ErrInvalid(L, "mobj_t"); + P_InitPitch(thing, newValue); + return 0; +} + +static int lib_pInitRoll(lua_State *L) +{ + mobj_t *thing = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); + angle_t newValue = luaL_checkangle(L, 2); + NOHUD + INLEVEL + if (!thing) + return LUA_ErrInvalid(L, "mobj_t"); + P_InitRoll(thing, newValue); + return 0; +} + static int lib_pSlideMove(lua_State *L) { mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); @@ -3871,6 +3907,9 @@ static luaL_Reg lib[] = { {"P_TeleportMove",lib_pTeleportMove}, {"P_SetOrigin",lib_pSetOrigin}, {"P_MoveOrigin",lib_pMoveOrigin}, + {"P_InitAngle",lib_pInitAngle}, + {"P_InitPitch",lib_pInitPitch}, + {"P_InitRoll",lib_pInitRoll}, {"P_SlideMove",lib_pSlideMove}, {"P_BounceMove",lib_pBounceMove}, {"P_CheckSight", lib_pCheckSight}, diff --git a/src/m_menu.c b/src/m_menu.c index 150b64d9c..3a5be46a9 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -229,7 +229,9 @@ static char *M_GetConditionString(condition_t cond); menu_t SR_MainDef, SR_UnlockChecklistDef; // Misc. Main Menu +#ifndef TESTERS static void M_SinglePlayerMenu(INT32 choice); +#endif static void M_Options(INT32 choice); static void M_Manual(INT32 choice); static void M_SelectableClearMenus(INT32 choice); @@ -6814,6 +6816,7 @@ static void M_Credits(INT32 choice) // SINGLE PLAYER MENU // ================== +#ifndef TESTERS static void M_SinglePlayerMenu(INT32 choice) { (void)choice; @@ -6826,6 +6829,7 @@ static void M_SinglePlayerMenu(INT32 choice) M_SetupNextMenu(&SP_MainDef); } +#endif /*static void M_LoadGameLevelSelect(INT32 choice) { diff --git a/src/p_enemy.c b/src/p_enemy.c index 749d0dc09..d9b1fd840 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -1220,7 +1220,7 @@ void A_StatueBurst(mobj_t *actor) if (!locvar1 || !(new = P_SpawnMobjFromMobj(actor, 0, 0, 0, locvar1))) return; - new->angle = actor->angle; + P_InitAngle(new, actor->angle); P_SetTarget(&new->target, actor->target); if (locvar2) P_SetMobjState(new, (statenum_t)locvar2); @@ -2519,8 +2519,8 @@ void A_LobShot(mobj_t *actor) P_SetTarget(&shot->target, actor); // where it came from - shot->angle = an = actor->angle; - an >>= ANGLETOFINESHIFT; + P_InitAngle(shot, actor->angle); + an = actor->angle >> ANGLETOFINESHIFT; dist = P_AproxDistance(actor->target->x - shot->x, actor->target->y - shot->y); @@ -2886,7 +2886,7 @@ void A_Boss1Laser(mobj_t *actor) S_StartSound(actor, mobjinfo[locvar1].seesound); point = P_SpawnMobj(x + P_ReturnThrustX(actor, actor->angle, actor->radius), y + P_ReturnThrustY(actor, actor->angle, actor->radius), actor->z - actor->height / 2, MT_EGGMOBILE_TARGET); - point->angle = actor->angle; + P_InitAngle(point, actor->angle); point->fuse = dur+1; P_SetTarget(&point->target, actor->target); P_SetTarget(&actor->target, point); @@ -2896,7 +2896,7 @@ void A_Boss1Laser(mobj_t *actor) point = P_SpawnMobj(x, y, z, locvar1); P_SetTarget(&point->target, actor); - point->angle = actor->angle; + P_InitAngle(point, actor->angle); speed = point->radius; point->momz = FixedMul(FINECOSINE(angle>>ANGLETOFINESHIFT), speed); point->momx = FixedMul(FINESINE(angle>>ANGLETOFINESHIFT), FixedMul(FINECOSINE(point->angle>>ANGLETOFINESHIFT), speed)); @@ -2905,7 +2905,7 @@ void A_Boss1Laser(mobj_t *actor) for (i = 0; i < 256; i++) { mobj_t *mo = P_SpawnMobj(point->x, point->y, point->z, point->type); - mo->angle = point->angle; + P_InitAngle(mo, point->angle); mo->color = LASERCOLORS[((UINT8)(i + 3*dur) >> 2) % sizeof(LASERCOLORS)]; // codeing P_UnsetThingPosition(mo); mo->flags = MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY; @@ -2937,7 +2937,7 @@ void A_Boss1Laser(mobj_t *actor) if (z - floorz < mobjinfo[MT_EGGMOBILE_FIRE].height>>1 && dur & 1) { point = P_SpawnMobj(x, y, floorz, MT_EGGMOBILE_FIRE); - point->angle = actor->angle; + P_InitAngle(point, actor->angle); point->destscale = actor->scale; P_SetScale(point, point->destscale); P_SetTarget(&point->target, actor); @@ -3521,7 +3521,7 @@ bossjustdie: P_ReturnThrustX(mo, mo->angle - ANGLE_90, 32<angle - ANGLE_90, 32<angle = mo->angle; + P_InitAngle(mo2, mo->angle); P_InstaThrust(mo2, mo2->angle - ANGLE_90, 4*mo2->scale); P_SetObjectMomZ(mo2, 4*FRACUNIT, false); P_SetMobjState(mo2, S_BOSSEGLZ1); @@ -3530,7 +3530,7 @@ bossjustdie: P_ReturnThrustX(mo, mo->angle + ANGLE_90, 32<angle + ANGLE_90, 32<angle = mo->angle; + P_InitAngle(mo2, mo->angle); P_InstaThrust(mo2, mo2->angle + ANGLE_90, 4*mo2->scale); P_SetObjectMomZ(mo2, 4*FRACUNIT, false); P_SetMobjState(mo2, S_BOSSEGLZ2); @@ -3542,7 +3542,7 @@ bossjustdie: P_ReturnThrustX(mo, mo->angle - ANGLE_90, 32<angle - ANGLE_90, 32<angle = mo->angle; + P_InitAngle(mo2, mo->angle); P_InstaThrust(mo2, mo2->angle - ANGLE_90, 4*mo2->scale); P_SetObjectMomZ(mo2, 4*FRACUNIT, false); P_SetMobjState(mo2, S_BOSSTANK1); @@ -3551,7 +3551,7 @@ bossjustdie: P_ReturnThrustX(mo, mo->angle + ANGLE_90, 32<angle + ANGLE_90, 32<angle = mo->angle; + P_InitAngle(mo2, mo->angle); P_InstaThrust(mo2, mo2->angle + ANGLE_90, 4*mo2->scale); P_SetObjectMomZ(mo2, 4*FRACUNIT, false); P_SetMobjState(mo2, S_BOSSTANK2); @@ -3559,7 +3559,7 @@ bossjustdie: mo2 = P_SpawnMobjFromMobj(mo, 0, 0, mobjinfo[MT_EGGMOBILE2].height + (32<angle = mo->angle; + P_InitAngle(mo2, mo->angle); P_SetObjectMomZ(mo2, 4*FRACUNIT, false); mo2->momz += mo->momz; P_SetMobjState(mo2, S_BOSSSPIGOT); @@ -3568,7 +3568,7 @@ bossjustdie: case MT_EGGMOBILE3: { mo2 = P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_BOSSJUNK); - mo2->angle = mo->angle; + P_InitAngle(mo2, mo->angle); P_SetMobjState(mo2, S_BOSSSEBH1); } break; @@ -3642,7 +3642,8 @@ bossjustdie: pole->tracer->flags |= MF_NOCLIPTHING; P_SetScale(pole, (pole->destscale = 2*FRACUNIT)); P_SetScale(pole->tracer, (pole->tracer->destscale = 2*FRACUNIT)); - pole->angle = pole->tracer->angle = mo->tracer->angle; + P_InitAngle(pole, mo->tracer->angle); + P_InitAngle(pole->tracer, mo->tracer->angle); pole->tracer->tracer->angle = pole->angle - ANGLE_90; pole->momx = P_ReturnThrustX(pole, pole->angle, speed); pole->momy = P_ReturnThrustY(pole, pole->angle, speed); @@ -4011,7 +4012,7 @@ void A_AttractChase(mobj_t *actor) sparkle = P_SpawnMobj(actor->target->x, actor->target->y, actor->target->z, MT_RINGSPARKS); P_SetTarget(&sparkle->target, actor->target); - sparkle->angle = (actor->target->angle + (offset>>1)) + (offset * actor->target->player->sparkleanim); + P_InitAngle(sparkle, (actor->target->angle + (offset>>1)) + (offset * actor->target->player->sparkleanim)); actor->target->player->sparkleanim = (actor->target->player->sparkleanim+1) % 20; P_KillMobj(actor, actor->target, actor->target, DMG_NORMAL); @@ -5265,7 +5266,7 @@ void A_RockSpawn(mobj_t *actor) mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_FALLINGROCK); P_SetMobjState(mo, mobjinfo[type].spawnstate); - mo->angle = R_PointToAngle2(line->v2->x, line->v2->y, line->v1->x, line->v1->y); + P_InitAngle(mo, R_PointToAngle2(line->v2->x, line->v2->y, line->v1->x, line->v1->y)); P_InstaThrust(mo, mo->angle, dist + randomoomph); mo->momz = dist + randomoomph; @@ -7131,7 +7132,7 @@ void A_Boss3ShockThink(mobj_t *actor) snew->momx = (actor->momx + snext->momx) >> 1; snew->momy = (actor->momy + snext->momy) >> 1; snew->momz = (actor->momz + snext->momz) >> 1; // is this really needed? - snew->angle = (actor->angle + snext->angle) >> 1; + P_InitAngle(snew, (actor->angle + snext->angle) >> 1); P_SetTarget(&snew->target, actor->target); snew->fuse = actor->fuse; @@ -7283,7 +7284,7 @@ void A_SpawnObjectAbsolute(mobj_t *actor) mo = P_SpawnMobj(x<angle = actor->angle; + P_InitAngle(mo, actor->angle); if (actor->eflags & MFE_VERTICALFLIP) mo->flags2 |= MF2_OBJECTFLIP; @@ -7325,7 +7326,7 @@ void A_SpawnObjectRelative(mobj_t *actor) (actor->eflags & MFE_VERTICALFLIP) ? ((actor->z + actor->height - mobjinfo[type].height) - FixedMul(z<scale)) : (actor->z + FixedMul(z<scale)), type); // Spawn objects with an angle matching the spawner's, rather than spawning Eastwards - Monster Iestyn - mo->angle = actor->angle; + P_InitAngle(mo, actor->angle); if (actor->eflags & MFE_VERTICALFLIP) mo->flags2 |= MF2_OBJECTFLIP; @@ -8035,7 +8036,7 @@ void A_BossJetFume(mobj_t *actor) P_SetScale(filler, filler->destscale); if (actor->eflags & MFE_VERTICALFLIP) filler->flags2 |= MF2_OBJECTFLIP; - filler->angle = actor->angle - ANGLE_180; + P_InitAngle(filler, actor->angle - ANGLE_180); P_SetTarget(&actor->tracer, filler); }*/ @@ -9745,7 +9746,7 @@ void A_TrapShot(mobj_t *actor) S_StartSound(missile, missile->info->seesound); P_SetTarget(&missile->target, actor); - missile->angle = actor->angle; + P_InitAngle(missile, actor->angle); speed = FixedMul(missile->info->speed, missile->scale); @@ -10324,7 +10325,7 @@ void A_BrakLobShot(mobj_t *actor) S_StartSound(shot, shot->info->seesound); P_SetTarget(&shot->target, actor); // where it came from - shot->angle = actor->angle; + P_InitAngle(shot, actor->angle); // Horizontal axes first. First parameter is initial horizontal impulse, second is to correct its angle. shot->momx = FixedMul(FixedMul(v, FINECOSINE(theta >> ANGLETOFINESHIFT)), FINECOSINE(shot->angle >> ANGLETOFINESHIFT)); @@ -10391,7 +10392,7 @@ void A_NapalmScatter(mobj_t *actor) mo = P_SpawnMobj(actor->x, actor->y, actor->z, typeOfShot); P_SetTarget(&mo->target, actor->target); // Transfer target so Brak doesn't hit himself like an idiot - mo->angle = fa << ANGLETOFINESHIFT; + P_InitAngle(mo, fa << ANGLETOFINESHIFT); mo->momx = FixedMul(FINECOSINE(fa),vx); mo->momy = FixedMul(FINESINE(fa),vx); mo->momz = vy; @@ -10415,7 +10416,7 @@ void A_SpawnFreshCopy(mobj_t *actor) newObject = P_SpawnMobjFromMobj(actor, 0, 0, 0, actor->type); newObject->flags2 = actor->flags2 & MF2_AMBUSH; - newObject->angle = actor->angle; + P_InitAngle(newObject, actor->angle); newObject->color = actor->color; P_SetTarget(&newObject->target, actor->target); P_SetTarget(&newObject->tracer, actor->tracer); @@ -10451,7 +10452,7 @@ mobj_t *P_InternalFlickySpawn(mobj_t *actor, mobjtype_t flickytype, fixed_t momz } flicky = P_SpawnMobjFromMobj(actor, offsx, offsy, 0, flickytype); - flicky->angle = actor->angle; + P_InitAngle(flicky, actor->angle); if (flickytype == MT_SEED) flicky->z += P_MobjFlip(actor)*(actor->height - flicky->height)/2; @@ -10601,7 +10602,7 @@ void A_FlickyCenter(mobj_t *actor) else if (actor->flags & MF_SLIDEME) // aimless { actor->tracer->fuse = 0; // less than 2*TICRATE means move aimlessly. - actor->tracer->angle = P_RandomKey(180)*ANG2; + P_InitAngle(actor->tracer, P_RandomKey(180)*ANG2); } else //orbit actor->tracer->fuse = FRACUNIT; @@ -11302,7 +11303,7 @@ void A_ConnectToGround(mobj_t *actor) { work = P_SpawnMobjFromMobj(actor, 0, 0, workz, locvar1); if (work) - work->angle = ang; + P_InitAngle(work, ang); ang += ANGLE_90; workz += workh; } @@ -11348,7 +11349,7 @@ void A_SpawnParticleRelative(mobj_t *actor) (actor->eflags & MFE_VERTICALFLIP) ? ((actor->z + actor->height - mobjinfo[MT_PARTICLE].height) - FixedMul(z<scale)) : (actor->z + FixedMul(z<scale)), MT_PARTICLE); // Spawn objects with an angle matching the spawner's, rather than spawning Eastwards - Monster Iestyn - mo->angle = actor->angle; + P_InitAngle(mo, actor->angle); if (actor->eflags & MFE_VERTICALFLIP) mo->flags2 |= MF2_OBJECTFLIP; @@ -12095,7 +12096,7 @@ void A_Boss5MakeJunk(mobj_t *actor) broked->fuse = TICRATE; else broked->fuse = (((locvar2 & 1) ? 4 : 2)*TICRATE)/3; - broked->angle = ang; + P_InitAngle(broked, ang); P_InstaThrust(broked, ang, ((locvar2 & 2) ? 8 : 5)*actor->scale); P_SetObjectMomZ(broked, (((locvar2) ? 4 : 0) + P_RandomRange(2, 5))< 0) @@ -12174,7 +12175,7 @@ static void P_DustRing(mobjtype_t mobjtype, UINT32 div, fixed_t x, fixed_t y, fi mobjtype ); - dust->angle = ang*i + ANGLE_90; + P_InitAngle(dust, ang*i + ANGLE_90); P_SetScale(dust, FixedMul(initscale, scale)); dust->destscale = FixedMul(4*FRACUNIT + P_RandomFixed(), scale); dust->scalespeed = scale/24; @@ -12379,7 +12380,7 @@ static mobj_t *P_TrainSeg(mobj_t *src, fixed_t x, fixed_t y, fixed_t z, angle_t s->fuse = 16*TICRATE; s->sprite = spr; s->frame = frame|FF_PAPERSPRITE; - s->angle = ang; + P_InitAngle(s, ang); P_Thrust(s, src->angle, 7*FRACUNIT); return s; } @@ -12751,7 +12752,7 @@ void A_SaloonDoorSpawn(mobj_t *actor) // One door... if (!(door = P_SpawnMobjFromMobj(actor, c, s, 0, locvar1))) return; - door->angle = ang + ANGLE_180; + P_InitAngle(door, ang + ANGLE_180); door->extravalue1 = AngleFixed(door->angle); // Origin angle door->extravalue2 = 0; // Angular speed P_SetTarget(&door->tracer, actor); // Origin door @@ -12759,7 +12760,7 @@ void A_SaloonDoorSpawn(mobj_t *actor) // ...two door! if (!(door = P_SpawnMobjFromMobj(actor, -c, -s, 0, locvar1))) return; - door->angle = ang; + P_InitAngle(door, ang); door->extravalue1 = AngleFixed(door->angle); // Origin angle door->extravalue2 = 0; // Angular speed P_SetTarget(&door->tracer, actor); // Origin door @@ -12955,7 +12956,7 @@ void A_SpawnPterabytes(mobj_t *actor) c = FINECOSINE(fa); s = FINESINE(fa); waypoint = P_SpawnMobjFromMobj(actor, FixedMul(c, rad), FixedMul(s, rad), 0, MT_PTERABYTEWAYPOINT); - waypoint->angle = ang + ANGLE_90; + P_InitAngle(waypoint, ang + ANGLE_90); P_SetTarget(&waypoint->tracer, actor); ptera = P_SpawnMobjFromMobj(waypoint, 0, 0, 0, MT_PTERABYTE); ptera->angle = waypoint->angle; @@ -13129,7 +13130,7 @@ void A_DragonbomberSpawn(mobj_t *actor) segment = P_SpawnMobjFromMobj(mo, x, y, 0, MT_DRAGONTAIL); P_SetTarget(&segment->target, mo); P_SetTarget(&mo->tracer, segment); - segment->angle = mo->angle; + P_InitAngle(segment, mo->angle); mo = segment; } for (i = 0; i < 2; i++) // spawn wings @@ -13399,6 +13400,9 @@ void A_JawzChase(mobj_t *actor) } ret = P_SpawnMobj(actor->tracer->x, actor->tracer->y, actor->tracer->z, MT_PLAYERRETICULE); + ret->old_x = actor->tracer->old_x; + ret->old_y = actor->tracer->old_y; + ret->old_z = actor->tracer->old_z; P_SetTarget(&ret->target, actor->tracer); ret->frame |= ((leveltime % 10) / 2) + 5; ret->color = actor->cvmem; @@ -13531,7 +13535,7 @@ static void SpawnSPBDust(mobj_t *mo) P_SetScale(dust, mo->scale*2); dust->colorized = true; dust->color = SKINCOLOR_RED; - dust->angle = mo->angle - FixedAngle(FRACUNIT*90 - FRACUNIT*180*i); // The first one will spawn to the right of the spb, the second one to the left. + P_InitAngle(dust, mo->angle - FixedAngle(FRACUNIT*90 - FRACUNIT*180*i)); // The first one will spawn to the right of the spb, the second one to the left. P_Thrust(dust, dust->angle, 6*dust->scale); K_MatchGenericExtraFlags(dust, mo); @@ -13568,7 +13572,7 @@ static void SpawnSPBAIZDust(mobj_t *mo, INT32 dir) spark->flags = MF_NOGRAVITY|MF_PAIN; P_SetTarget(&spark->target, mo); - spark->angle = travelangle+(dir*ANGLE_90); + P_InitAngle(spark, travelangle+(dir*ANGLE_90)); P_SetScale(spark, (spark->destscale = mo->scale*3/2)); spark->momx = (6*mo->momx)/5; @@ -13587,7 +13591,7 @@ static void SpawnSPBSpeedLines(mobj_t *actor) MT_FASTLINE); P_SetTarget(&fast->target, actor); - fast->angle = K_MomentumAngle(actor); + P_InitAngle(fast, K_MomentumAngle(actor)); fast->color = SKINCOLOR_RED; fast->colorized = true; K_MatchGenericExtraFlags(fast, actor); @@ -14289,7 +14293,7 @@ void A_RandomShadowFrame(mobj_t *actor) P_SetScale(fake, FRACUNIT*3/2); fake->scale = FRACUNIT*3/2; fake->destscale = FRACUNIT*3/2; - fake->angle = actor->angle; + P_InitAngle(fake, actor->angle); fake->tics = -1; actor->renderflags |= RF_DONTDRAW; actor->extravalue1 = 1; @@ -14677,6 +14681,8 @@ void A_FlameShieldPaper(mobj_t *actor) paper->frame |= framea; } + P_InitAngle(paper, paper->angle); + paper->extravalue1 = i; } } diff --git a/src/p_inter.c b/src/p_inter.c index 8c069569c..112b7feee 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1185,7 +1185,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget mo->angle = FixedAngle((P_RandomKey(36)*10)<angle = mo->angle; + P_InitAngle(mo2, mo->angle); P_SetMobjState(mo2, S_BOSSSEBH2); if (++i == 2) // we've already removed 2 of these, let's stop now @@ -1252,6 +1252,12 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget kart->eflags |= MFE_DAMAGEHITLAG; P_SetObjectMomZ(kart, 6*FRACUNIT, false); kart->extravalue1 = target->player->kartweight; + + // Copy interp data + kart->old_angle = target->old_angle; + kart->old_x = target->old_x; + kart->old_y = target->old_y; + kart->old_z = target->old_z; } if (source && !P_MobjWasRemoved(source)) @@ -1323,7 +1329,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget for (i = 0; i < 2; i++) { mobj_t *blast = P_SpawnMobjFromMobj(target, 0, 0, target->info->height >> 1, MT_BATTLEBUMPER_BLAST); - blast->angle = angle + i*ANGLE_90; + P_InitAngle(blast, angle + i*ANGLE_90); P_SetScale(blast, 2*blast->scale/3); blast->destscale = 2*blast->scale; } @@ -1548,7 +1554,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget chunk = P_SpawnMobjFromMobj(target, 0, 0, 0, MT_SPIKE);\ P_SetMobjState(chunk, target->info->xdeathstate);\ chunk->health = 0;\ - chunk->angle = angtweak;\ + P_InitAngle(chunk, angtweak);\ P_UnsetThingPosition(chunk);\ chunk->flags = MF_NOCLIP;\ chunk->x += xmov;\ @@ -1570,7 +1576,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget chunk = P_SpawnMobjFromMobj(target, 0, 0, 0, MT_SPIKE); P_SetMobjState(chunk, target->info->deathstate); chunk->health = 0; - chunk->angle = ang + ANGLE_180; + P_InitAngle(chunk, ang + ANGLE_180); P_UnsetThingPosition(chunk); chunk->flags = MF_NOCLIP; chunk->x -= xoffs; @@ -1616,7 +1622,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget chunk = P_SpawnMobjFromMobj(target, 0, 0, 0, MT_WALLSPIKE);\ P_SetMobjState(chunk, target->info->xdeathstate);\ chunk->health = 0;\ - chunk->angle = target->angle;\ + P_InitAngle(chunk, target->angle);\ P_UnsetThingPosition(chunk);\ chunk->flags = MF_NOCLIP;\ chunk->x += xmov - forwardxoffs;\ @@ -1642,7 +1648,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget P_SetMobjState(chunk, target->info->deathstate); chunk->health = 0; - chunk->angle = target->angle; + P_InitAngle(chunk, target->angle); P_UnsetThingPosition(chunk); chunk->flags = MF_NOCLIP; chunk->x += forwardxoffs - xoffs; @@ -1767,7 +1773,7 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, boom = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_FZEROBOOM); boom->scale = player->mo->scale; - boom->angle = player->mo->angle; + P_InitAngle(boom, player->mo->angle); P_SetTarget(&boom->target, player->mo); } diff --git a/src/p_local.h b/src/p_local.h index b9802b106..2cb291b11 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -411,6 +411,9 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff); boolean P_Move(mobj_t *actor, fixed_t speed); boolean P_SetOrigin(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z); boolean P_MoveOrigin(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z); +void P_InitAngle(mobj_t *thing, angle_t newValue); +void P_InitPitch(mobj_t *thing, angle_t newValue); +void P_InitRoll(mobj_t *thing, angle_t newValue); void P_SlideMove(mobj_t *mo); void P_BouncePlayerMove(mobj_t *mo); void P_BounceMove(mobj_t *mo); diff --git a/src/p_map.c b/src/p_map.c index bbf3e39ce..8fb58cd0a 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -157,6 +157,30 @@ boolean P_MoveOrigin(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z) return P_TeleportMove(thing, x, y, z); } +// +// P_InitAngle - Change an object's angle, including interp values. +// +void P_InitAngle(mobj_t *thing, angle_t newValue) +{ + thing->angle = thing->old_angle = newValue; +} + +// +// P_InitPitch - Change an object's pitch, including interp values. +// +void P_InitPitch(mobj_t *thing, angle_t newValue) +{ + thing->pitch = thing->old_pitch = newValue; +} + +// +// P_InitRoll - Change an object's roll, including interp values. +// +void P_InitRoll(mobj_t *thing, angle_t newValue) +{ + thing->roll = thing->old_roll = newValue; +} + // ========================================================================= // MOVEMENT ITERATOR FUNCTIONS // ========================================================================= @@ -269,9 +293,7 @@ static boolean P_SpecialIsLinedefCrossType(line_t *ld) // boolean P_DoSpring(mobj_t *spring, mobj_t *object) { - //INT32 pflags; - const fixed_t hscale = mapobjectscale + (mapobjectscale - object->scale); - const fixed_t vscale = mapobjectscale + (object->scale - mapobjectscale); + const fixed_t scaleVal = FixedSqrt(FixedMul(mapobjectscale, spring->scale)); fixed_t vertispeed = spring->info->mass; fixed_t horizspeed = spring->info->damage; UINT16 starcolor = (spring->info->painchance % numskincolors); @@ -349,13 +371,13 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) if (vertispeed) { - object->momz = FixedMul(vertispeed, FixedSqrt(FixedMul(vscale, spring->scale))); + object->momz = FixedMul(vertispeed, scaleVal); } if (horizspeed) { angle_t finalAngle = spring->angle; - fixed_t finalSpeed = FixedMul(horizspeed, FixedSqrt(FixedMul(hscale, spring->scale))); + fixed_t finalSpeed = FixedMul(horizspeed, scaleVal); fixed_t objectSpeed; if (object->player) @@ -411,7 +433,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) mobj_t *grease; grease = P_SpawnMobj(object->x, object->y, object->z, MT_TIREGREASE); P_SetTarget(&grease->target, object); - grease->angle = K_MomentumAngle(object); + P_InitAngle(grease, K_MomentumAngle(object)); grease->extravalue1 = i; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 3b664cb49..f3d326862 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1202,7 +1202,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) gravityadd = -((gravityadd/5) + (gravityadd/8)); } - gravityadd = FixedMul(gravityadd, mo->scale); + gravityadd = FixedMul(gravityadd, mapobjectscale); return gravityadd; } @@ -2391,7 +2391,7 @@ boolean P_ZMovement(mobj_t *mo) MT_KART_TIRE ); - tire->angle = mo->angle; + P_InitAngle(tire, mo->angle); tire->fuse = 3*TICRATE; P_InstaThrust(tire, tireAngle, 4 * mo->scale); P_SetObjectMomZ(tire, 4*FRACUNIT, false); @@ -2411,7 +2411,7 @@ boolean P_ZMovement(mobj_t *mo) MT_KART_TIRE ); - tire->angle = mo->angle; + P_InitAngle(tire, mo->angle); tire->fuse = 3*TICRATE; P_InstaThrust(tire, tireAngle, 4 * mo->scale); P_SetObjectMomZ(tire, 4*FRACUNIT, false); @@ -4144,7 +4144,7 @@ static void P_SpawnItemCapsuleParts(mobj_t *mobj) part = part->hnext; P_SetTarget(&part->target, mobj); P_SetMobjState(part, buttState); - part->angle = i * ANG_CAPSULE; + P_InitAngle(part, i * ANG_CAPSULE); part->movedir = spin; // rotation speed part->movefactor = 0; // z offset part->extravalue1 = buttScale; // relative scale @@ -4155,7 +4155,7 @@ static void P_SpawnItemCapsuleParts(mobj_t *mobj) part = part->hnext; P_SetTarget(&part->target, mobj); P_SetMobjState(part, S_ITEMCAPSULE_TOP_SIDE); - part->angle = i * ANG_CAPSULE; + P_InitAngle(part, i * ANG_CAPSULE); part->movedir = spin; // rotation speed part->movefactor = mobj->info->height - part->info->height; // z offset } @@ -4480,7 +4480,7 @@ void P_SpawnParaloop(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 numb mobj->z -= mobj->height>>1; // change angle - mobj->angle = R_PointToAngle2(mobj->x, mobj->y, x, y); + P_InitAngle(mobj, R_PointToAngle2(mobj->x, mobj->y, x, y)); // change slope dist = P_AproxDistance(P_AproxDistance(x - mobj->x, y - mobj->y), z - mobj->z); @@ -5163,7 +5163,7 @@ static void P_FlameJetSceneryThink(mobj_t *mobj) flame = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_FLAMEJETFLAME); P_SetMobjState(flame, S_FLAMEJETFLAME4); - flame->angle = mobj->angle; + P_InitAngle(flame, mobj->angle); if (mobj->flags2 & MF2_AMBUSH) // Wave up and down instead of side-to-side flame->momz = mobj->fuse << (FRACBITS - 2); @@ -5624,7 +5624,7 @@ static void P_MobjSceneryThink(mobj_t *mobj) { mobj_t *blast = P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_BATTLEBUMPER_BLAST); - blast->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy) + ANGLE_45; + P_InitAngle(blast, R_PointToAngle2(0, 0, mobj->momx, mobj->momy) + ANGLE_45); blast->destscale *= 4; if (i & 1) @@ -6909,12 +6909,15 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (( mobj->fuse & 1 )) { nudge = 4*mobj->target->radius; + /* unrotate interp angle */ + mobj->old_angle -= ANGLE_90; } else { nudge = 2*mobj->target->radius; /* rotate the papersprite frames to see the flat angle */ mobj->angle += ANGLE_90; + mobj->old_angle += ANGLE_90; } P_MoveOrigin(mobj, @@ -7109,6 +7112,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj) return false; } P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z); + mobj->old_x = mobj->target->old_x; + mobj->old_y = mobj->target->old_y; + mobj->old_z = mobj->target->old_z; break; case MT_INSTASHIELDB: mobj->renderflags ^= RF_DONTDRAW; @@ -7121,6 +7127,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj) return false; } P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z); + mobj->old_x = mobj->target->old_x; + mobj->old_y = mobj->target->old_y; + mobj->old_z = mobj->target->old_z; K_MatchGenericExtraFlags(mobj, mobj->target); break; case MT_BATTLEPOINT: @@ -7493,7 +7502,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->z + (mobj->height/2) + (P_RandomRange(-20,20) * mobj->scale), MT_FASTLINE); - fast->angle = mobj->angle; + P_InitAngle(fast, mobj->angle); fast->momx = 3*mobj->target->momx/4; fast->momy = 3*mobj->target->momy/4; fast->momz = 3*P_GetMobjZMovement(mobj->target)/4; @@ -7555,7 +7564,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (underlayst != S_NULL) { mobj_t *underlay = P_SpawnMobj(mobj->target->x, mobj->target->y, mobj->target->z, MT_FLAMESHIELDUNDERLAY); - underlay->angle = mobj->angle; + P_InitAngle(underlay, mobj->angle); P_SetMobjState(underlay, underlayst); } break; @@ -8933,7 +8942,7 @@ static boolean P_FuseThink(mobj_t *mobj) for (i = 0; i < 5; i++) { mobj_t *debris = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_SMK_ICEBLOCK_DEBRIS); - debris->angle = FixedAngle(P_RandomRange(0,360)<angle, P_RandomRange(3,18)*(FRACUNIT/4)); debris->momz = P_RandomRange(4,8)<angle = mobj->angle + ((mobj->flags2 & MF2_AMBUSH) ? ANGLE_90 : ANGLE_270);; + P_InitAngle(bigmeatyclaw, mobj->angle + ((mobj->flags2 & MF2_AMBUSH) ? ANGLE_90 : ANGLE_270)); P_SetTarget(&mobj->tracer, bigmeatyclaw); P_SetTarget(&bigmeatyclaw->tracer, mobj); mobj->reactiontime >>= 1; @@ -9718,7 +9727,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_BANPYURA: { mobj_t *bigmeatyclaw = P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_BANPSPRING); - bigmeatyclaw->angle = mobj->angle + ((mobj->flags2 & MF2_AMBUSH) ? ANGLE_90 : ANGLE_270);; + P_InitAngle(bigmeatyclaw, mobj->angle + ((mobj->flags2 & MF2_AMBUSH) ? ANGLE_90 : ANGLE_270)); P_SetTarget(&mobj->tracer, bigmeatyclaw); P_SetTarget(&bigmeatyclaw->tracer, mobj); mobj->reactiontime >>= 1; @@ -9851,7 +9860,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) break; case MT_MINECARTEND: P_SetTarget(&mobj->tracer, P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_MINECARTENDSOLID)); - mobj->tracer->angle = mobj->angle + ANGLE_90; + P_InitAngle(mobj->tracer, mobj->angle + ANGLE_90); break; case MT_TORCHFLOWER: { @@ -9973,7 +9982,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) angle_t ang = i * diff; mobj_t *side = P_SpawnMobj(mobj->x + FINECOSINE((ang>>ANGLETOFINESHIFT) & FINEMASK), mobj->y + FINESINE((ang>>ANGLETOFINESHIFT) & FINEMASK), mobj->z, MT_DAYTONAPINETREE_SIDE); - side->angle = ang; + P_InitAngle(side, ang); side->target = mobj; side->threshold = i; } @@ -9990,7 +9999,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) cur = P_SpawnMobj(mobj->x + FINECOSINE(((mobj->angle*8)>>ANGLETOFINESHIFT) & FINEMASK), mobj->y + FINESINE(((mobj->angle*8)>>ANGLETOFINESHIFT) & FINEMASK), mobj->z, MT_EZZPROPELLER_BLADE); - cur->angle = mobj->angle; + P_InitAngle(cur, mobj->angle); P_SetTarget(&cur->hprev, prev); P_SetTarget(&prev->hnext, cur); @@ -10050,7 +10059,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) cur->threshold = i; P_MoveOrigin(cur, cur->x + ((cur->radius>>FRACBITS) * FINECOSINE((FixedAngle((90*cur->threshold)<>ANGLETOFINESHIFT) & FINEMASK)), cur->y + ((cur->radius>>FRACBITS) * FINESINE((FixedAngle((90*cur->threshold)<>ANGLETOFINESHIFT) & FINEMASK)), cur->z); - cur->angle = ANGLE_90*(cur->threshold+1); + P_InitAngle(cur, ANGLE_90*(cur->threshold+1)); P_SetTarget(&cur->hprev, prev); P_SetTarget(&prev->hnext, cur); @@ -10811,7 +10820,7 @@ void P_SpawnPlayer(INT32 playernum) mobj = P_SpawnMobj(0, 0, 0, MT_PLAYER); (mobj->player = p)->mo = mobj; - mobj->angle = 0; + mobj->angle = mobj->old_angle = 0; // set color translations for player sprites mobj->color = p->skincolor; @@ -10898,6 +10907,12 @@ void P_AfterPlayerSpawn(INT32 playernum) mobj_t *mobj = p->mo; UINT8 i; + // Update interpolation + mobj->old_x = mobj->x; + mobj->old_y = mobj->y; + mobj->old_z = mobj->z; + mobj->old_angle = mobj->angle; + P_SetPlayerAngle(p, mobj->angle); p->viewheight = P_GetPlayerViewHeight(p); @@ -11492,7 +11507,7 @@ static boolean P_SetupMace(mapthing_t *mthing, mobj_t *mobj, boolean *doangle) spawnee->friction = mroll;\ spawnee->movefactor = mwidthset;\ spawnee->movecount = dist;\ - spawnee->angle = myaw;\ + P_InitAngle(spawnee, myaw);\ spawnee->flags |= (MF_NOGRAVITY|mflagsapply);\ spawnee->flags2 |= (mflags2apply|moreflags2);\ spawnee->eflags |= meflagsapply;\ @@ -11691,29 +11706,29 @@ static boolean P_SetupBooster(mapthing_t* mthing, mobj_t* mobj, boolean strong) statenum_t rollerstate = strong ? S_REDBOOSTERROLLER : S_YELLOWBOOSTERROLLER; mobj_t *seg = P_SpawnMobjFromMobj(mobj, 26*x1, 26*y1, 0, MT_BOOSTERSEG); - seg->angle = angle - ANGLE_90; + P_InitAngle(seg, angle - ANGLE_90); P_SetMobjState(seg, facestate); seg = P_SpawnMobjFromMobj(mobj, -26*x1, -26*y1, 0, MT_BOOSTERSEG); - seg->angle = angle + ANGLE_90; + P_InitAngle(seg, angle + ANGLE_90); P_SetMobjState(seg, facestate); seg = P_SpawnMobjFromMobj(mobj, 21*x2, 21*y2, 0, MT_BOOSTERSEG); - seg->angle = angle; + P_InitAngle(seg, angle); P_SetMobjState(seg, leftstate); seg = P_SpawnMobjFromMobj(mobj, -21*x2, -21*y2, 0, MT_BOOSTERSEG); - seg->angle = angle; + P_InitAngle(seg, angle); P_SetMobjState(seg, rightstate); seg = P_SpawnMobjFromMobj(mobj, 13*(x1 + x2), 13*(y1 + y2), 0, MT_BOOSTERROLLER); - seg->angle = angle; + P_InitAngle(seg, angle); P_SetMobjState(seg, rollerstate); seg = P_SpawnMobjFromMobj(mobj, 13*(x1 - x2), 13*(y1 - y2), 0, MT_BOOSTERROLLER); - seg->angle = angle; + P_InitAngle(seg, angle); P_SetMobjState(seg, rollerstate); seg = P_SpawnMobjFromMobj(mobj, -13*(x1 + x2), -13*(y1 + y2), 0, MT_BOOSTERROLLER); - seg->angle = angle; + P_InitAngle(seg, angle); P_SetMobjState(seg, rollerstate); seg = P_SpawnMobjFromMobj(mobj, -13*(x1 - x2), -13*(y1 - y2), 0, MT_BOOSTERROLLER); - seg->angle = angle; + P_InitAngle(seg, angle); P_SetMobjState(seg, rollerstate); return true; @@ -11890,19 +11905,19 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean case MT_THZTREE: { // Spawn the branches angle_t mobjangle = FixedAngle((mthing->angle % 113) << FRACBITS); - P_SpawnMobjFromMobj(mobj, FRACUNIT, 0, 0, MT_THZTREEBRANCH)->angle = mobjangle + ANGLE_22h; - P_SpawnMobjFromMobj(mobj, 0, FRACUNIT, 0, MT_THZTREEBRANCH)->angle = mobjangle + ANGLE_157h; - P_SpawnMobjFromMobj(mobj, -FRACUNIT, 0, 0, MT_THZTREEBRANCH)->angle = mobjangle + ANGLE_270; + P_InitAngle(P_SpawnMobjFromMobj(mobj, FRACUNIT, 0, 0, MT_THZTREEBRANCH), mobjangle + ANGLE_22h); + P_InitAngle(P_SpawnMobjFromMobj(mobj, 0, FRACUNIT, 0, MT_THZTREEBRANCH), mobjangle + ANGLE_157h); + P_InitAngle(P_SpawnMobjFromMobj(mobj, -FRACUNIT, 0, 0, MT_THZTREEBRANCH), mobjangle + ANGLE_270); } break; case MT_CEZPOLE1: case MT_CEZPOLE2: { // Spawn the banner angle_t mobjangle = FixedAngle(mthing->angle << FRACBITS); - P_SpawnMobjFromMobj(mobj, + P_InitAngle(P_SpawnMobjFromMobj(mobj, P_ReturnThrustX(mobj, mobjangle, 4 << FRACBITS), P_ReturnThrustY(mobj, mobjangle, 4 << FRACBITS), - 0, ((mobj->type == MT_CEZPOLE1) ? MT_CEZBANNER1 : MT_CEZBANNER2))->angle = mobjangle + ANGLE_90; + 0, ((mobj->type == MT_CEZPOLE1) ? MT_CEZBANNER1 : MT_CEZBANNER2)), mobjangle + ANGLE_90); } break; case MT_HHZTREE_TOP: @@ -11911,7 +11926,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj_t* leaf; #define doleaf(x, y) \ leaf = P_SpawnMobjFromMobj(mobj, x, y, 0, MT_HHZTREE_PART);\ - leaf->angle = mobjangle;\ + P_InitAngle(leaf, mobjangle);\ P_SetMobjState(leaf, leaf->info->seestate);\ mobjangle += ANGLE_90 doleaf(FRACUNIT, 0); @@ -11935,7 +11950,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean fixed_t xoffs = FINECOSINE(fa); fixed_t yoffs = FINESINE(fa); mobj_t* leaf = P_SpawnMobjFromMobj(mobj, xoffs, yoffs, 0, MT_BIGFERNLEAF); - leaf->angle = angle; + P_InitAngle(leaf, angle); angle += ANGLE_45; } break; @@ -12045,7 +12060,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean mobj->x - P_ReturnThrustX(mobj, mobjangle, baseradius), mobj->y - P_ReturnThrustY(mobj, mobjangle, baseradius), mobj->z, MT_WALLSPIKEBASE); - base->angle = mobjangle + ANGLE_90; + P_InitAngle(base, mobjangle + ANGLE_90); base->destscale = mobj->destscale; P_SetScale(base, mobj->scale); P_SetTarget(&base->target, mobj); @@ -12231,7 +12246,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean leaf = P_SpawnMobj(mobj->x + FINECOSINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK), mobj->y + FINESINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK), top, MT_AAZTREE_LEAF); - leaf->angle = mobj->angle; + P_InitAngle(leaf, mobj->angle); // Small coconut for each leaf P_SpawnMobj(mobj->x + (32 * FINECOSINE((mobj->angle>>ANGLETOFINESHIFT) & FINEMASK)), @@ -12448,7 +12463,9 @@ static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, return mobj; if (doangle) - mobj->angle = FixedAngle(mthing->angle << FRACBITS); + { + P_InitAngle(mobj, FixedAngle(mthing->angle << FRACBITS)); + } if ((mobj->flags & MF_SPRING) && mobj->info->damage != 0 @@ -12460,8 +12477,8 @@ static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, mobj->spryoff = FixedMul(mobj->radius, FINESINE(a >> ANGLETOFINESHIFT)); } - mobj->pitch = FixedAngle(mthing->pitch << FRACBITS); - mobj->roll = FixedAngle(mthing->roll << FRACBITS); + P_InitPitch(mobj, FixedAngle(mthing->pitch << FRACBITS)); + P_InitRoll(mobj, FixedAngle(mthing->roll << FRACBITS)); mthing->mobj = mobj; @@ -12868,7 +12885,7 @@ mobj_t *P_SpawnXYZMissile(mobj_t *source, mobj_t *dest, mobjtype_t type, P_SetTarget(&th->target, source); // where it came from an = R_PointToAngle2(x, y, dest->x, dest->y); - th->angle = an; + P_InitAngle(th, an); an >>= ANGLETOFINESHIFT; th->momx = FixedMul(speed, FINECOSINE(an)); th->momy = FixedMul(speed, FINESINE(an)); @@ -12930,7 +12947,7 @@ mobj_t *P_SpawnAlteredDirectionMissile(mobj_t *source, mobjtype_t type, fixed_t P_SetTarget(&th->target, source->target); // where it came from an = R_PointToAngle2(0, 0, source->momx, source->momy) + (ANG1*shiftingAngle); - th->angle = an; + P_InitAngle(th, an); an >>= ANGLETOFINESHIFT; th->momx = FixedMul(speed, FINECOSINE(an)); th->momy = FixedMul(speed, FINESINE(an)); @@ -12995,7 +13012,7 @@ mobj_t *P_SpawnPointMissile(mobj_t *source, fixed_t xa, fixed_t ya, fixed_t za, P_SetTarget(&th->target, source); // where it came from an = R_PointToAngle2(x, y, xa, ya); - th->angle = an; + P_InitAngle(th, an); an >>= ANGLETOFINESHIFT; th->momx = FixedMul(speed, FINECOSINE(an)); th->momy = FixedMul(speed, FINESINE(an)); @@ -13074,7 +13091,7 @@ mobj_t *P_SpawnMissile(mobj_t *source, mobj_t *dest, mobjtype_t type) else an = R_PointToAngle2(source->x, source->y, dest->x, dest->y); - th->angle = an; + P_InitAngle(th, an); an >>= ANGLETOFINESHIFT; th->momx = FixedMul(speed, FINECOSINE(an)); th->momy = FixedMul(speed, FINESINE(an)); @@ -13162,7 +13179,7 @@ mobj_t *P_SPMAngle(mobj_t *source, mobjtype_t type, angle_t angle, UINT8 allowai speed = th->info->speed; - th->angle = an; + P_InitAngle(th, an); th->momx = FixedMul(speed, FINECOSINE(an>>ANGLETOFINESHIFT)); th->momy = FixedMul(speed, FINESINE(an>>ANGLETOFINESHIFT)); @@ -13232,6 +13249,17 @@ mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zo newmobj->z = mobj->z + mobj->height - zofs - newmobj->height; } + // EXPERIMENT: Let all objects set their interp values relative to their owner's old values. + // This will hopefully create a lot less mobj-specific spawn cases, + // but if there's any weird scenarios feel free to remove again. + newmobj->old_x = mobj->old_x + xofs; + newmobj->old_y = mobj->old_y + yofs; + newmobj->old_z = mobj->old_z + zofs; + /* + newmobj->angle = mobj->angle; + newmobj->old_angle = mobj->old_angle; + */ + return newmobj; } @@ -13248,6 +13276,14 @@ fixed_t P_GetMobjHead(const mobj_t *mobj) fixed_t P_GetMobjFeet(const mobj_t *mobj) { + /* + | | + | | + /--\------/ | + | | + ----------------- + */ + return P_IsObjectFlipped(mobj) ? mobj->z + mobj->height : mobj->z; } diff --git a/src/p_saveg.c b/src/p_saveg.c index bfa6d6e15..7710ee0de 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2893,19 +2893,19 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) mobj->info = &mobjinfo[mobj->type]; if (diff & MD_POS) { - mobj->x = READFIXED(save_p); - mobj->y = READFIXED(save_p); - mobj->angle = READANGLE(save_p); - mobj->pitch = READANGLE(save_p); - mobj->roll = READANGLE(save_p); + mobj->x = mobj->old_x = READFIXED(save_p); + mobj->y = mobj->old_y = READFIXED(save_p); + mobj->angle = mobj->old_angle = READANGLE(save_p); + mobj->pitch = mobj->old_pitch = READANGLE(save_p); + mobj->roll = mobj->old_roll = READANGLE(save_p); } else { - mobj->x = mobj->spawnpoint->x << FRACBITS; - mobj->y = mobj->spawnpoint->y << FRACBITS; - mobj->angle = FixedAngle(mobj->spawnpoint->angle*FRACUNIT); - mobj->pitch = FixedAngle(mobj->spawnpoint->pitch*FRACUNIT); - mobj->roll = FixedAngle(mobj->spawnpoint->roll*FRACUNIT); + mobj->x = mobj->old_x = mobj->spawnpoint->x << FRACBITS; + mobj->y = mobj->old_y = mobj->spawnpoint->y << FRACBITS; + mobj->angle = mobj->old_angle = FixedAngle(mobj->spawnpoint->angle*FRACUNIT); + mobj->pitch = mobj->old_pitch = FixedAngle(mobj->spawnpoint->pitch*FRACUNIT); + mobj->roll = mobj->old_roll = FixedAngle(mobj->spawnpoint->roll*FRACUNIT); } if (diff & MD_MOM) { diff --git a/src/p_spec.c b/src/p_spec.c index a52cfe932..fca9e9035 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3634,7 +3634,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (mobj) { if (line->flags & ML_EFFECT1) - mobj->angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); + P_InitAngle(mobj, R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y)); CONS_Debug(DBG_GAMELOGIC, "Linedef Type %d - Spawn Object: %d spawned at (%d, %d, %d)\n", line->special, mobj->type, mobj->x>>FRACBITS, mobj->y>>FRACBITS, mobj->z>>FRACBITS); //TODO: Convert mobj->type to a string somehow. } else @@ -3929,7 +3929,7 @@ void P_SetupSignExit(player_t *player) if (player->mo && !P_MobjWasRemoved(player->mo)) { thing = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->floorz, MT_SIGN); - thing->angle = player->mo->angle; + P_InitAngle(thing, player->mo->angle); P_SetupSignObject(thing, player->mo, true); // Use :youfuckedup: sign face } } diff --git a/src/p_telept.c b/src/p_telept.c index 3e2917092..434994ce6 100644 --- a/src/p_telept.c +++ b/src/p_telept.c @@ -97,7 +97,7 @@ void P_MixUp(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle, P_FlashPal(thing->player, PAL_MIXUP, 10); } - thing->angle = angle; + P_InitAngle(thing, angle); thing->momx = thing->momy = thing->momz = 0; @@ -171,7 +171,7 @@ boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle P_FlashPal(thing->player, PAL_MIXUP, 10); } - thing->angle = angle; + P_InitAngle(thing, angle); return true; } diff --git a/src/p_user.c b/src/p_user.c index 9ba08e7d4..a5b07fbc6 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -380,7 +380,7 @@ void P_GiveFinishFlags(player_t *player) fixed_t xoffs = FINECOSINE(fa); fixed_t yoffs = FINESINE(fa); mobj_t* flag = P_SpawnMobjFromMobj(player->mo, xoffs, yoffs, 0, MT_FINISHFLAG); - flag->angle = angle; + P_InitAngle(flag, angle); angle += FixedAngle(120*FRACUNIT); P_SetTarget(&flag->target, player->mo); @@ -2176,7 +2176,7 @@ void P_MovePlayer(player_t *player) if (trailScale > 0) { const angle_t forwardangle = K_MomentumAngle(player->mo); - const fixed_t playerVisualRadius = player->mo->radius + 8*FRACUNIT; + const fixed_t playerVisualRadius = player->mo->radius + (8 * player->mo->scale); const size_t numFrames = S_WATERTRAIL8 - S_WATERTRAIL1; const statenum_t curOverlayFrame = S_WATERTRAIL1 + (leveltime % numFrames); const statenum_t curUnderlayFrame = S_WATERTRAILUNDERLAY1 + (leveltime % numFrames); @@ -2197,7 +2197,7 @@ void P_MovePlayer(player_t *player) // underlay water = P_SpawnMobj(x1, y1, ((player->mo->eflags & MFE_VERTICALFLIP) ? player->mo->waterbottom - FixedMul(mobjinfo[MT_WATERTRAILUNDERLAY].height, player->mo->scale) : player->mo->watertop), MT_WATERTRAILUNDERLAY); - water->angle = forwardangle - ANGLE_180 - ANGLE_22h; + P_InitAngle(water, forwardangle - ANGLE_180 - ANGLE_22h); water->destscale = trailScale; water->momx = player->mo->momx; water->momy = player->mo->momy; @@ -2208,7 +2208,7 @@ void P_MovePlayer(player_t *player) // overlay water = P_SpawnMobj(x1, y1, ((player->mo->eflags & MFE_VERTICALFLIP) ? player->mo->waterbottom - FixedMul(mobjinfo[MT_WATERTRAIL].height, player->mo->scale) : player->mo->watertop), MT_WATERTRAIL); - water->angle = forwardangle - ANGLE_180 - ANGLE_22h; + P_InitAngle(water, forwardangle - ANGLE_180 - ANGLE_22h); water->destscale = trailScale; water->momx = player->mo->momx; water->momy = player->mo->momy; @@ -2220,7 +2220,7 @@ void P_MovePlayer(player_t *player) // Underlay water = P_SpawnMobj(x2, y2, ((player->mo->eflags & MFE_VERTICALFLIP) ? player->mo->waterbottom - FixedMul(mobjinfo[MT_WATERTRAILUNDERLAY].height, player->mo->scale) : player->mo->watertop), MT_WATERTRAILUNDERLAY); - water->angle = forwardangle - ANGLE_180 + ANGLE_22h; + P_InitAngle(water, forwardangle - ANGLE_180 + ANGLE_22h); water->destscale = trailScale; water->momx = player->mo->momx; water->momy = player->mo->momy; @@ -2231,7 +2231,7 @@ void P_MovePlayer(player_t *player) // Overlay water = P_SpawnMobj(x2, y2, ((player->mo->eflags & MFE_VERTICALFLIP) ? player->mo->waterbottom - FixedMul(mobjinfo[MT_WATERTRAIL].height, player->mo->scale) : player->mo->watertop), MT_WATERTRAIL); - water->angle = forwardangle - ANGLE_180 + ANGLE_22h; + P_InitAngle(water, forwardangle - ANGLE_180 + ANGLE_22h); water->destscale = trailScale; water->momx = player->mo->momx; water->momy = player->mo->momy; @@ -3989,7 +3989,7 @@ static void P_HandleFollower(player_t *player) P_SetTarget(&player->follower, P_SpawnMobj(sx, sy, sz, MT_FOLLOWER)); P_SetFollowerState(player->follower, fl.idlestate); P_SetTarget(&player->follower->target, player->mo); // we need that to know when we need to disappear - player->follower->angle = player->mo->angle; + P_InitAngle(player->follower, player->mo->angle); // This is safe to only spawn it here, the follower is removed then respawned when switched. if (bubble) @@ -4052,10 +4052,8 @@ static void P_HandleFollower(player_t *player) if (player->pflags & PF_NOCONTEST) player->follower->renderflags |= RF_DONTDRAW; - if (player->speed && (player->follower->momx || player->follower->momy)) - player->follower->angle = K_MomentumAngle(player->follower); - // if we're moving let's make the angle the direction we're moving towards. This is to avoid drifting / reverse looking awkward. - // Make sure the follower itself is also moving however, otherwise we'll be facing angle 0 + // if we're moving let's make the angle the direction we're moving towards. This is to avoid drifting / reverse looking awkward. + player->follower->angle = K_MomentumAngle(player->follower); // Finally, if the follower has bubbles, move them, set their scale, etc.... // This is what I meant earlier by it being easier, now we can just use this weird lil loop to get the job done! diff --git a/src/r_fps.c b/src/r_fps.c index 7258d3b75..59f10bae8 100644 --- a/src/r_fps.c +++ b/src/r_fps.c @@ -32,7 +32,6 @@ static viewvars_t skyview_new[MAXSPLITSCREENPLAYERS]; static viewvars_t *oldview = &pview_old[0]; viewvars_t *newview = &pview_new[0]; - enum viewcontext_e viewcontext = VIEWCONTEXT_PLAYER1; static fixed_t R_LerpFixed(fixed_t from, fixed_t to, fixed_t frac) @@ -147,3 +146,23 @@ void R_SetViewContext(enum viewcontext_e _viewcontext) break; } } + +fixed_t R_InterpolateFixed(fixed_t from, fixed_t to) +{ + if (cv_frameinterpolation.value == 0) + { + return to; + } + + return (from + R_LerpFixed(from, to, rendertimefrac)); +} + +angle_t R_InterpolateAngle(angle_t from, angle_t to) +{ + if (cv_frameinterpolation.value == 0) + { + return to; + } + + return (from + R_LerpAngle(from, to, rendertimefrac)); +} diff --git a/src/r_fps.h b/src/r_fps.h index eb674b142..246c16e64 100644 --- a/src/r_fps.h +++ b/src/r_fps.h @@ -56,4 +56,7 @@ void R_UpdateViewInterpolation(void); // Set the current view context (the viewvars pointed to by newview) void R_SetViewContext(enum viewcontext_e _viewcontext); +fixed_t R_InterpolateFixed(fixed_t from, fixed_t to); +angle_t R_InterpolateAngle(angle_t from, angle_t to); + #endif diff --git a/src/r_things.c b/src/r_things.c index 8636eeef0..97d45d62d 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -46,6 +46,7 @@ // SRB2kart #include "k_color.h" #include "k_kart.h" // HITLAGJITTERS +#include "r_fps.h" #define MINZ (FRACUNIT*4) #define BASEYCENTER (BASEVIDHEIGHT/2) @@ -1147,15 +1148,21 @@ static void R_SplitSprite(vissprite_t *sprite) // Get the first visible floor below the object for shadows // shadowslope is filled with the floor's slope, if provided // -fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope) +fixed_t R_GetShadowZ( + mobj_t *thing, pslope_t **shadowslope, + fixed_t interpx, fixed_t interpy, fixed_t interpz) { + fixed_t halfHeight = interpz + (thing->height >> 1); boolean isflipped = thing->eflags & MFE_VERTICALFLIP; + fixed_t floorz = P_GetFloorZ(thing, thing->subsector->sector, interpx, interpy, NULL); + fixed_t ceilingz = P_GetCeilingZ(thing, thing->subsector->sector, interpx, interpy, NULL); fixed_t z, groundz = isflipped ? INT32_MAX : INT32_MIN; pslope_t *slope, *groundslope = NULL; msecnode_t *node; sector_t *sector; ffloor_t *rover; -#define CHECKZ (isflipped ? z > thing->z+thing->height/2 && z < groundz : z < thing->z+thing->height/2 && z > groundz) + +#define CHECKZ (isflipped ? z > halfHeight && z < groundz : z < halfHeight && z > groundz) for (node = thing->touching_sectorlist; node; node = node->m_sectorlist_next) { @@ -1166,7 +1173,7 @@ fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope) if (sector->heightsec != -1) z = isflipped ? sectors[sector->heightsec].ceilingheight : sectors[sector->heightsec].floorheight; else - z = isflipped ? P_GetSectorCeilingZAt(sector, thing->x, thing->y) : P_GetSectorFloorZAt(sector, thing->x, thing->y); + z = isflipped ? P_GetSectorCeilingZAt(sector, interpx, interpy) : P_GetSectorFloorZAt(sector, interpx, interpy); if CHECKZ { @@ -1180,7 +1187,7 @@ fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope) if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERPLANES) || (rover->alpha < 90 && !(rover->flags & FF_SWIMMABLE))) continue; - z = isflipped ? P_GetFFloorBottomZAt(rover, thing->x, thing->y) : P_GetFFloorTopZAt(rover, thing->x, thing->y); + z = isflipped ? P_GetFFloorBottomZAt(rover, interpx, interpy) : P_GetFFloorTopZAt(rover, interpx, interpy); if CHECKZ { @@ -1190,10 +1197,10 @@ fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope) } } - if (isflipped ? (thing->ceilingz < groundz - (!groundslope ? 0 : FixedMul(abs(groundslope->zdelta), thing->radius*3/2))) - : (thing->floorz > groundz + (!groundslope ? 0 : FixedMul(abs(groundslope->zdelta), thing->radius*3/2)))) + if (isflipped ? (ceilingz < groundz - (!groundslope ? 0 : FixedMul(abs(groundslope->zdelta), thing->radius*3/2))) + : (floorz > groundz + (!groundslope ? 0 : FixedMul(abs(groundslope->zdelta), thing->radius*3/2)))) { - groundz = isflipped ? thing->ceilingz : thing->floorz; + groundz = isflipped ? ceilingz : floorz; groundslope = NULL; } @@ -1204,10 +1211,10 @@ fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope) { INT32 xl, xh, yl, yh, bx, by; - xl = (unsigned)(thing->x - thing->radius - bmaporgx)>>MAPBLOCKSHIFT; - xh = (unsigned)(thing->x + thing->radius - bmaporgx)>>MAPBLOCKSHIFT; - yl = (unsigned)(thing->y - thing->radius - bmaporgy)>>MAPBLOCKSHIFT; - yh = (unsigned)(thing->y + thing->radius - bmaporgy)>>MAPBLOCKSHIFT; + xl = (unsigned)(interpx - thing->radius - bmaporgx)>>MAPBLOCKSHIFT; + xh = (unsigned)(interpx + thing->radius - bmaporgx)>>MAPBLOCKSHIFT; + yl = (unsigned)(interpy - thing->radius - bmaporgy)>>MAPBLOCKSHIFT; + yh = (unsigned)(interpy + thing->radius - bmaporgy)>>MAPBLOCKSHIFT; BMBOUNDFIX(xl, xh, yl, yh); @@ -1244,7 +1251,7 @@ fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope) // We're inside it! Yess... z = po->lines[0]->backsector->ceilingheight; - if (z < thing->z+thing->height/2 && z > groundz) + if (z < halfHeight && z > groundz) { groundz = z; groundslope = NULL; @@ -1267,11 +1274,12 @@ fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope) static void R_SkewShadowSprite( mobj_t *thing, pslope_t *groundslope, fixed_t groundz, INT32 spriteheight, fixed_t scalemul, - fixed_t *shadowyscale, fixed_t *shadowskew) + fixed_t *shadowyscale, fixed_t *shadowskew, + fixed_t interpx, fixed_t interpy) { // haha let's try some dumb stuff fixed_t xslope, zslope; - angle_t sloperelang = (R_PointToAngle(thing->x, thing->y) - groundslope->xydirection) >> ANGLETOFINESHIFT; + angle_t sloperelang = (R_PointToAngle(interpx, interpy) - groundslope->xydirection) >> ANGLETOFINESHIFT; xslope = FixedMul(FINESINE(sloperelang), groundslope->zdelta); zslope = FixedMul(FINECOSINE(sloperelang), groundslope->zdelta); @@ -1287,7 +1295,10 @@ static void R_SkewShadowSprite( *shadowskew = xslope; } -static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, fixed_t tx, fixed_t tz) +static void R_ProjectDropShadow( + mobj_t *thing, vissprite_t *vis, + fixed_t scale, fixed_t tx, fixed_t tz, + fixed_t interpx, fixed_t interpy, fixed_t interpz) { vissprite_t *shadow; patch_t *patch; @@ -1296,7 +1307,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, fixed_t groundz; pslope_t *groundslope; - groundz = R_GetShadowZ(thing, &groundslope); + groundz = R_GetShadowZ(thing, &groundslope, interpx, interpy, interpz); if (abs(groundz-viewz)/tz > 4) return; // Prevent stretchy shadows and possible crashes @@ -1310,7 +1321,14 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, shadowskew = 0; if (groundslope) - R_SkewShadowSprite(thing, groundslope, groundz, patch->height, FRACUNIT, &shadowyscale, &shadowskew); + { + R_SkewShadowSprite( + thing, + groundslope, groundz, + patch->height, FRACUNIT, + &shadowyscale, &shadowskew, + interpx, interpy); + } tx -= patch->width * shadowxscale/2; x1 = (centerxfrac + FixedMul(tx,xscale))>>FRACBITS; @@ -1329,8 +1347,8 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, shadow->mobjflags = 0; shadow->sortscale = vis->sortscale; shadow->dispoffset = vis->dispoffset - 5; - shadow->gx = thing->x; - shadow->gy = thing->y; + shadow->gx = interpx; + shadow->gy = interpy; shadow->gzt = groundz + patch->height * shadowyscale / 2; shadow->gz = shadow->gzt - patch->height * shadowyscale; shadow->texturemid = FixedMul(thing->scale, FixedDiv(shadow->gzt - viewz, shadowyscale)); @@ -1468,26 +1486,18 @@ static void R_ProjectSprite(mobj_t *thing) #endif // uncapped/interpolation - fixed_t interpx = thing->x; - fixed_t interpy = thing->y; - fixed_t interpz = thing->z; - angle_t interpangle = (thing->player ? thing->player->drawangle : thing->angle); + fixed_t interpx = R_InterpolateFixed(thing->old_x, thing->x); + fixed_t interpy = R_InterpolateFixed(thing->old_y, thing->y); + fixed_t interpz = R_InterpolateFixed(thing->old_z, thing->z); + angle_t interpangle = ANGLE_MAX; - // do interpolation - if (cv_frameinterpolation.value == 1) + if (thing->player) { - interpx = thing->old_x + FixedMul(rendertimefrac, thing->x - thing->old_x); - interpy = thing->old_y + FixedMul(rendertimefrac, thing->y - thing->old_y); - interpz = thing->old_z + FixedMul(rendertimefrac, thing->z - thing->old_z); - - if (thing->player) - { - interpangle = thing->player->old_drawangle + FixedMul(rendertimefrac, thing->player->drawangle - thing->player->old_drawangle); - } - else - { - interpangle = thing->old_angle + FixedMul(rendertimefrac, thing->angle - thing->old_angle); - } + interpangle = R_InterpolateAngle(thing->player->old_drawangle, thing->player->drawangle); + } + else + { + interpangle = R_InterpolateAngle(thing->old_angle, thing->angle); } // hitlag vibrating (todo: interp somehow?) @@ -1815,11 +1825,10 @@ static void R_ProjectSprite(mobj_t *thing) fixed_t linkscale; thing = thing->tracer; - if (cv_frameinterpolation.value == 1) - { - interpx = thing->old_x + FixedMul(thing->x - thing->old_x, rendertimefrac); - interpy = thing->old_y + FixedMul(thing->y - thing->old_y, rendertimefrac); - } + + interpx = R_InterpolateFixed(thing->old_x, thing->x); + interpy = R_InterpolateFixed(thing->old_y, thing->y); + interpz = R_InterpolateFixed(thing->old_z, thing->z); // hitlag vibrating (todo: interp somehow?) if (thing->hitlag > 0 && (thing->eflags & MFE_DAMAGEHITLAG)) @@ -1909,7 +1918,7 @@ static void R_ProjectSprite(mobj_t *thing) if (shadowdraw || shadoweffects) { - fixed_t groundz = R_GetShadowZ(thing, NULL); + fixed_t groundz = R_GetShadowZ(thing, NULL, interpx, interpy, interpz); boolean isflipped = (thing->eflags & MFE_VERTICALFLIP); if (shadoweffects) @@ -1933,7 +1942,7 @@ static void R_ProjectSprite(mobj_t *thing) if (shadowskew) { - R_SkewShadowSprite(thing, thing->standingslope, groundz, patch->height, shadowscale, &spriteyscale, &sheartan); + R_SkewShadowSprite(thing, thing->standingslope, groundz, patch->height, shadowscale, &spriteyscale, &sheartan, interpx, interpy); gzt = (isflipped ? (thing->z + thing->height) : thing->z) + patch->height * spriteyscale / 2; gz = gzt - patch->height * spriteyscale; @@ -2132,7 +2141,10 @@ static void R_ProjectSprite(mobj_t *thing) R_SplitSprite(vis); if (oldthing->shadowscale && cv_shadow.value) - R_ProjectDropShadow(oldthing, vis, oldthing->shadowscale, basetx, basetz); + { + R_ProjectDropShadow(oldthing, vis, oldthing->shadowscale, basetx, basetz, + interpx, interpy, interpz); + } // Debug ++objectsdrawn; @@ -2158,17 +2170,9 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) fixed_t gz, gzt; // uncapped/interpolation - fixed_t interpx = thing->x; - fixed_t interpy = thing->y; - fixed_t interpz = thing->z; - - // do interpolation - if (cv_frameinterpolation.value == 1) - { - interpx = thing->old_x + FixedMul(rendertimefrac, thing->x - thing->old_x); - interpy = thing->old_y + FixedMul(rendertimefrac, thing->y - thing->old_y); - interpz = thing->old_z + FixedMul(rendertimefrac, thing->z - thing->old_z); - } + fixed_t interpx = R_InterpolateFixed(thing->old_x, thing->x); + fixed_t interpy = R_InterpolateFixed(thing->old_y, thing->y); + fixed_t interpz = R_InterpolateFixed(thing->old_z, thing->z); // transform the origin point tr_x = interpx - viewx; diff --git a/src/r_things.h b/src/r_things.h index 7ff1bd4c7..4e0c8194a 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -59,7 +59,7 @@ void R_DrawFlippedMaskedColumn(column_t *column, column_t *brightmap); extern INT16 negonearray[MAXVIDWIDTH]; extern INT16 screenheightarray[MAXVIDWIDTH]; -fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope); +fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope, fixed_t interpx, fixed_t interpy, fixed_t interpz); //SoM: 6/5/2000: Light sprites correctly! void R_AddSprites(sector_t *sec, INT32 lightlevel); diff --git a/src/s_sound.c b/src/s_sound.c index 7e44bb207..ac66a5777 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1580,7 +1580,7 @@ void S_ShowMusicCredit(void) { cursongcredit.def = def; cursongcredit.anim = 5*TICRATE; - cursongcredit.x = 0; + cursongcredit.x = cursongcredit.old_x =0; cursongcredit.trans = NUMTRANSMAPS; return; } diff --git a/src/s_sound.h b/src/s_sound.h index 816a90fb5..3e6decf74 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -179,8 +179,9 @@ extern struct cursongcredit { musicdef_t *def; UINT16 anim; - INT32 x; UINT8 trans; + fixed_t x; + fixed_t old_x; } cursongcredit; extern musicdef_t *musicdefstart; diff --git a/src/v_video.c b/src/v_video.c index 5bd7ba733..abaee0886 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -2216,6 +2216,18 @@ void V_DrawRightAlignedThinString(INT32 x, INT32 y, INT32 option, const char *st V_DrawThinString(x, y, option, string); } +void V_DrawCenteredThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string) +{ + x -= (V_ThinStringWidth(string, option) / 2) * FRACUNIT; + V_DrawThinStringAtFixed(x, y, option, string); +} + +void V_DrawRightAlignedThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string) +{ + x -= V_ThinStringWidth(string, option) * FRACUNIT; + V_DrawThinStringAtFixed(x, y, option, string); +} + // Draws a number using the PING font thingy. // TODO: Merge number drawing functions into one with "font name" selection. diff --git a/src/v_video.h b/src/v_video.h index da4506c9a..402f485a4 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -261,6 +261,8 @@ void V_DrawRightAlignedThinString(INT32 x, INT32 y, INT32 option, const char *st #define V_DrawThinStringAtFixed( x,y,option,string ) \ V__DrawOneScaleString (x,y,FRACUNIT,option,TINY_FONT,string) +void V_DrawCenteredThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string); +void V_DrawRightAlignedThinStringAtFixed(fixed_t x, fixed_t y, INT32 option, const char *string); // Draws a titlecard font string. // timer: when the letters start appearing (leave to 0 to disable)