mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-01-10 16:52:16 +00:00
Merge branch 'master' into bot-maint-2
This commit is contained in:
commit
44374879de
34 changed files with 726 additions and 506 deletions
|
|
@ -1069,6 +1069,7 @@ static void IdentifyVersion(void)
|
|||
D_AddFile(startupiwads, va(pandf,srb2waddir,"textures.pk3"));
|
||||
D_AddFile(startupiwads, va(pandf,srb2waddir,"chars.pk3"));
|
||||
D_AddFile(startupiwads, va(pandf,srb2waddir,"maps.pk3"));
|
||||
D_AddFile(startupiwads, va(pandf,srb2waddir,"followers.pk3"));
|
||||
#ifdef USE_PATCH_FILE
|
||||
D_AddFile(startupiwads, va(pandf,srb2waddir,"patch.pk3"));
|
||||
#endif
|
||||
|
|
@ -1255,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")))
|
||||
|
|
@ -1272,6 +1274,7 @@ void D_SRB2Main(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// get map from parms
|
||||
|
||||
|
|
@ -1317,6 +1320,7 @@ void D_SRB2Main(void)
|
|||
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_TEXTURES_PK3); // textures.pk3
|
||||
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_CHARS_PK3); // chars.pk3
|
||||
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_MAPS_PK3); // maps.pk3 -- 4 - If you touch this, make sure to touch up the majormods stuff below.
|
||||
mainwads++; W_VerifyFileMd5(mainwads, ASSET_HASH_FOLLOWERS_PK3); // followers.pk3
|
||||
#ifdef USE_PATCH_FILE
|
||||
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_PATCH_PK3); // patch.pk3
|
||||
#endif
|
||||
|
|
@ -1325,6 +1329,7 @@ void D_SRB2Main(void)
|
|||
mainwads++; // textures.pk3
|
||||
mainwads++; // chars.pk3
|
||||
mainwads++; // maps.pk3
|
||||
mainwads++; // followers.pk3
|
||||
#ifdef USE_PATCH_FILE
|
||||
mainwads++; // patch.pk3
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -459,7 +459,12 @@ INT32 CL_CheckFiles(void)
|
|||
if (modifiedgame)
|
||||
{
|
||||
CONS_Debug(DBG_NETPLAY, "game is modified; only doing basic checks\n");
|
||||
for (i = 0, j = mainwads+1; i < fileneedednum || j < numwadfiles;)
|
||||
#ifdef DEVELOP
|
||||
j = 0;
|
||||
#else
|
||||
j = mainwads + 1;
|
||||
#endif
|
||||
for (i = 0; i < fileneedednum || j < numwadfiles;)
|
||||
{
|
||||
if (j < numwadfiles && !wadfiles[j]->important)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3477,7 +3477,19 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_DEADRANDOMITEM",
|
||||
|
||||
// Sphere Box (for Battle)
|
||||
"S_SPHEREBOX",
|
||||
"S_SPHEREBOX1",
|
||||
"S_SPHEREBOX2",
|
||||
"S_SPHEREBOX3",
|
||||
"S_SPHEREBOX4",
|
||||
"S_SPHEREBOX5",
|
||||
"S_SPHEREBOX6",
|
||||
"S_SPHEREBOX7",
|
||||
"S_SPHEREBOX8",
|
||||
"S_SPHEREBOX9",
|
||||
"S_SPHEREBOX10",
|
||||
"S_SPHEREBOX11",
|
||||
"S_SPHEREBOX12",
|
||||
"S_DEADSPHEREBOX",
|
||||
|
||||
// Random Item Pop
|
||||
"S_RANDOMITEMPOP1",
|
||||
|
|
@ -5454,6 +5466,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
|
||||
// SRB2kart
|
||||
"MT_RANDOMITEM",
|
||||
"MT_SPHEREBOX",
|
||||
"MT_RANDOMITEMPOP",
|
||||
"MT_FLOATINGITEM",
|
||||
"MT_ITEMCAPSULE",
|
||||
|
|
@ -5794,6 +5807,8 @@ const char *const MOBJFLAG_LIST[] = {
|
|||
"GRENADEBOUNCE",
|
||||
"RUNSPAWNFUNC",
|
||||
"DONTENCOREMAP",
|
||||
"PICKUPFROMBELOW",
|
||||
"NOSQUISH",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
169
src/hu_stuff.c
169
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<MAXPLAYERS); i++)
|
||||
{
|
||||
if (stop_spamming[i] > 0)
|
||||
stop_spamming[i]--;
|
||||
}
|
||||
|
||||
// handle chat timers
|
||||
for (i=0; (i<chat_nummsg_min); i++)
|
||||
{
|
||||
if (chat_timers[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<<V_ALPHASHIFT), songcreditbg);
|
||||
{
|
||||
V_DrawFixedPatch(x, y - (2 * FRACUNIT), FRACUNIT, V_SNAPTOLEFT|(bgt<<V_ALPHASHIFT), songcreditbg, NULL);
|
||||
}
|
||||
|
||||
if (cursongcredit.trans < NUMTRANSMAPS)
|
||||
V_DrawRightAlignedThinString(cursongcredit.x, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE|V_SNAPTOLEFT|(cursongcredit.trans<<V_ALPHASHIFT), str);
|
||||
{
|
||||
V_DrawRightAlignedThinStringAtFixed(x, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE|V_SNAPTOLEFT|(cursongcredit.trans<<V_ALPHASHIFT), str);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1988,9 +2072,6 @@ void HU_Drawer(void)
|
|||
// draw chat string plus cursor
|
||||
if (chat_on)
|
||||
{
|
||||
// count down the scroll timer.
|
||||
if (chat_scrolltime > 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<MAXPLAYERS); i++)
|
||||
{
|
||||
if (stop_spamming[i] > 0)
|
||||
stop_spamming[i]--;
|
||||
}
|
||||
|
||||
// handle chat timers
|
||||
for (i=0; (i<chat_nummsg_min); i++)
|
||||
{
|
||||
if (chat_timers[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, ".");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -17,6 +17,9 @@ boolean K_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2)
|
|||
boolean damageitem = false;
|
||||
boolean sprung = false;
|
||||
|
||||
if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0))
|
||||
return true;
|
||||
|
||||
if (((t1->target == t2) || (t1->target == t2->target)) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0)))
|
||||
return true;
|
||||
|
||||
|
|
@ -108,6 +111,9 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
|
|||
{
|
||||
boolean damageitem = false;
|
||||
|
||||
if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0))
|
||||
return true;
|
||||
|
||||
if (((t1->target == t2) || (t1->target == t2->target)) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0)))
|
||||
return true;
|
||||
|
||||
|
|
@ -186,6 +192,9 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
|
|||
|
||||
boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2)
|
||||
{
|
||||
if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0))
|
||||
return true;
|
||||
|
||||
// Push fakes out of other item boxes
|
||||
if (t2->type == MT_RANDOMITEM || t2->type == MT_EGGMANITEM)
|
||||
{
|
||||
|
|
@ -258,6 +267,9 @@ boolean K_EggItemCollide(mobj_t *t1, mobj_t *t2)
|
|||
|
||||
boolean K_MineCollide(mobj_t *t1, mobj_t *t2)
|
||||
{
|
||||
if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0))
|
||||
return true;
|
||||
|
||||
if (((t1->target == t2) || (t1->target == t2->target)) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0)))
|
||||
return true;
|
||||
|
||||
|
|
@ -331,6 +343,9 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2)
|
|||
|
||||
boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2)
|
||||
{
|
||||
if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0))
|
||||
return true;
|
||||
|
||||
if (((t1->target == t2) || (t1->target == t2->target)) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0)))
|
||||
return true;
|
||||
|
||||
|
|
@ -398,6 +413,9 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2)
|
|||
|
||||
boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2)
|
||||
{
|
||||
if ((t1->threshold > 0 && t2->hitlag > 0) || (t2->threshold > 0 && t1->hitlag > 0))
|
||||
return true;
|
||||
|
||||
if (((t1->target == t2) || (t1->target == t2->target)) && (t1->threshold > 0 || (t2->type != MT_PLAYER && t2->threshold > 0)))
|
||||
return true;
|
||||
|
||||
|
|
@ -465,7 +483,8 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2)
|
|||
{
|
||||
boolean t1Condition = false;
|
||||
boolean t2Condition = false;
|
||||
boolean stung = false;
|
||||
boolean stungT1 = false;
|
||||
boolean stungT2 = false;
|
||||
|
||||
// Grow damage
|
||||
t1Condition = (t1->scale > t2->scale + (mapobjectscale/8));
|
||||
|
|
@ -537,25 +556,35 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2)
|
|||
|
||||
if (t1Condition == true)
|
||||
{
|
||||
P_PlayerRingBurst(t2->player, 1);
|
||||
|
||||
if (t2->player->rings <= 0)
|
||||
{
|
||||
P_DamageMobj(t2, t1, t1, 1, DMG_STING);
|
||||
stung = true;
|
||||
stungT2 = true;
|
||||
}
|
||||
|
||||
P_PlayerRingBurst(t2->player, 1);
|
||||
}
|
||||
|
||||
if (t2Condition == true)
|
||||
{
|
||||
P_PlayerRingBurst(t1->player, 1);
|
||||
|
||||
if (t1->player->rings <= 0)
|
||||
{
|
||||
P_DamageMobj(t1, t2, t2, 1, DMG_STING);
|
||||
stung = true;
|
||||
stungT1 = true;
|
||||
}
|
||||
|
||||
P_PlayerRingBurst(t1->player, 1);
|
||||
}
|
||||
|
||||
return stung;
|
||||
// No damage hitlag for stinging.
|
||||
if (stungT1 == true && stungT2 == false)
|
||||
{
|
||||
t2->eflags &= ~MFE_DAMAGEHITLAG;
|
||||
}
|
||||
else if (stungT2 == true && stungT1 == false)
|
||||
{
|
||||
t1->eflags &= ~MFE_DAMAGEHITLAG;
|
||||
}
|
||||
|
||||
return (stungT1 || stungT2);
|
||||
}
|
||||
|
|
|
|||
182
src/k_hud.c
182
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
|
||||
|
|
|
|||
108
src/k_kart.c
108
src/k_kart.c
|
|
@ -1963,13 +1963,13 @@ 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);
|
||||
|
||||
dust->momx = 3*player->mo->momx/5;
|
||||
dust->momy = 3*player->mo->momy/5;
|
||||
//dust->momz = 3*player->mo->momz/5;
|
||||
dust->momz = 3*P_GetMobjZMovement(player->mo)/5;
|
||||
|
||||
K_MatchGenericExtraFlags(dust, player->mo);
|
||||
}
|
||||
|
|
@ -1996,6 +1996,7 @@ void K_SpawnDriftBoostClip(player_t *player)
|
|||
{
|
||||
mobj_t *clip;
|
||||
fixed_t scale = 115*FRACUNIT/100;
|
||||
fixed_t momz = P_GetMobjZMovement(player->mo);
|
||||
fixed_t z;
|
||||
|
||||
if (( player->mo->eflags & MFE_VERTICALFLIP ))
|
||||
|
|
@ -2012,8 +2013,8 @@ void K_SpawnDriftBoostClip(player_t *player)
|
|||
clip->fuse = 105;
|
||||
clip->momz = 7 * P_MobjFlip(clip) * clip->scale;
|
||||
|
||||
if (player->mo->momz > 0)
|
||||
clip->momz += player->mo->momz;
|
||||
if (momz > 0)
|
||||
clip->momz += momz;
|
||||
|
||||
P_InstaThrust(clip, player->mo->angle +
|
||||
P_RandomFlip(P_RandomRange(FRACUNIT/2, FRACUNIT)),
|
||||
|
|
@ -2042,10 +2043,10 @@ 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*player->mo->momz/4;
|
||||
fast->momz = 3*P_GetMobjZMovement(player->mo)/4;
|
||||
|
||||
K_MatchGenericExtraFlags(fast, player->mo);
|
||||
|
||||
|
|
@ -2067,10 +2068,10 @@ void K_SpawnInvincibilitySpeedLines(mobj_t *mo)
|
|||
|
||||
fast->momx = 3*mo->momx/4;
|
||||
fast->momy = 3*mo->momy/4;
|
||||
fast->momz = 3*mo->momz/4;
|
||||
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);
|
||||
|
|
@ -3135,9 +3136,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);
|
||||
}
|
||||
|
||||
|
|
@ -3518,7 +3525,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)
|
||||
|
|
@ -3599,7 +3606,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);
|
||||
|
|
@ -3686,7 +3693,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;
|
||||
|
|
@ -3799,7 +3806,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));
|
||||
|
|
@ -3967,7 +3974,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);
|
||||
|
||||
|
|
@ -4009,12 +4019,13 @@ 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);
|
||||
spark->momx += mo->momx; // copy player speed
|
||||
spark->momy += mo->momy;
|
||||
spark->momz += P_GetMobjZMovement(mo);
|
||||
|
||||
sparkangle += ANGLE_90;
|
||||
}
|
||||
|
|
@ -4059,13 +4070,13 @@ 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);
|
||||
|
||||
spark->momx = player->mo->momx/2;
|
||||
spark->momy = player->mo->momy/2;
|
||||
//spark->momz = player->mo->momz/2;
|
||||
spark->momz = P_GetMobjZMovement(player->mo)/2;
|
||||
|
||||
spark->color = K_DriftSparkColor(player, player->driftcharge);
|
||||
|
||||
|
|
@ -4203,12 +4214,12 @@ 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;
|
||||
spark->momy = (6*player->mo->momy)/5;
|
||||
//spark->momz = player->mo->momz/2;
|
||||
spark->momz = P_GetMobjZMovement(player->mo);
|
||||
|
||||
K_MatchGenericExtraFlags(spark, player->mo);
|
||||
}
|
||||
|
|
@ -4255,7 +4266,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);
|
||||
|
|
@ -4311,7 +4322,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.
|
||||
|
|
@ -4357,7 +4368,7 @@ void K_SpawnWipeoutTrail(mobj_t *mo, boolean offroad)
|
|||
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);
|
||||
|
|
@ -4366,7 +4377,7 @@ void K_SpawnWipeoutTrail(mobj_t *mo, boolean offroad)
|
|||
{
|
||||
dust->momx = mo->momx/2;
|
||||
dust->momy = mo->momy/2;
|
||||
dust->momz = mo->momz/2;
|
||||
dust->momz = P_GetMobjZMovement(mo)/2;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4427,7 +4438,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);
|
||||
|
|
@ -4437,7 +4448,7 @@ void K_SpawnDraftDust(mobj_t *mo)
|
|||
|
||||
dust->momx = (4*mo->momx)/5;
|
||||
dust->momy = (4*mo->momy)/5;
|
||||
//dust->momz = (4*mo->momz)/5;
|
||||
dust->momz = (4*P_GetMobjZMovement(mo))/5;
|
||||
|
||||
P_Thrust(dust, dust->angle, 4*mo->scale);
|
||||
|
||||
|
|
@ -4850,11 +4861,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;
|
||||
|
|
@ -4930,7 +4948,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);
|
||||
|
|
@ -4943,7 +4961,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);
|
||||
|
|
@ -4967,7 +4985,7 @@ static void K_FlameDashLeftoverSmoke(mobj_t *src)
|
|||
|
||||
smoke->momx = 3*src->momx/4;
|
||||
smoke->momy = 3*src->momy/4;
|
||||
smoke->momz = 3*src->momz/4;
|
||||
smoke->momz = 3*P_GetMobjZMovement(src)/4;
|
||||
|
||||
P_Thrust(smoke, src->angle + FixedAngle(P_RandomRange(135, 225)<<FRACBITS), P_RandomRange(0, 8) * src->scale);
|
||||
smoke->momz += P_RandomRange(0, 4) * src->scale;
|
||||
|
|
@ -5261,7 +5279,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;
|
||||
|
|
@ -5417,6 +5435,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
|
||||
|
|
@ -5504,7 +5528,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);
|
||||
|
|
@ -6709,7 +6733,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
if (gametype == GT_RACE && player->rings <= 0) // spawn ring debt indicator
|
||||
{
|
||||
mobj_t *debtflag = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy,
|
||||
player->mo->z + player->mo->momz + player->mo->height + (24*player->mo->scale), MT_THOK);
|
||||
player->mo->z + P_GetMobjZMovement(player->mo) + player->mo->height + (24*player->mo->scale), MT_THOK);
|
||||
|
||||
P_SetMobjState(debtflag, S_RINGDEBT);
|
||||
P_SetScale(debtflag, (debtflag->destscale = player->mo->scale));
|
||||
|
|
@ -6741,7 +6765,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
star->flags |= MF_NOGRAVITY;
|
||||
star->momx = player->mo->momx / 2;
|
||||
star->momy = player->mo->momy / 2;
|
||||
star->momz = player->mo->momz / 2;
|
||||
star->momz = P_GetMobjZMovement(player->mo) / 2;
|
||||
star->fuse = 12;
|
||||
star->scale = player->mo->scale;
|
||||
star->destscale = star->scale / 2;
|
||||
|
|
@ -6954,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)
|
||||
|
|
@ -7146,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;
|
||||
|
|
@ -7766,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);
|
||||
|
|
@ -8311,13 +8339,13 @@ 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;
|
||||
wind->momz = 3 * parent->momz / 4;
|
||||
wind->momz = 3 * P_GetMobjZMovement(parent) / 4;
|
||||
|
||||
K_MatchGenericExtraFlags(wind, parent);
|
||||
}
|
||||
|
|
@ -8346,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;
|
||||
}
|
||||
}
|
||||
|
|
@ -8760,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;
|
||||
|
|
@ -8870,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;
|
||||
|
|
@ -8911,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;
|
||||
|
|
@ -9307,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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
@ -3872,6 +3908,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},
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
28
src/mserv.c
28
src/mserv.c
|
|
@ -61,6 +61,8 @@ static void MasterServer_OnChange(void);
|
|||
|
||||
static void Advertise_OnChange(void);
|
||||
|
||||
static void RendezvousServer_OnChange(void);
|
||||
|
||||
static CV_PossibleValue_t masterserver_update_rate_cons_t[] = {
|
||||
{2, "MIN"},
|
||||
{60, "MAX"},
|
||||
|
|
@ -68,7 +70,7 @@ static CV_PossibleValue_t masterserver_update_rate_cons_t[] = {
|
|||
};
|
||||
|
||||
consvar_t cv_masterserver = CVAR_INIT ("masterserver", "https://ms.kartkrew.org/ms/api", CV_SAVE|CV_CALL, NULL, MasterServer_OnChange);
|
||||
consvar_t cv_rendezvousserver = CVAR_INIT ("rendezvousserver", "jart-dev.jameds.org", CV_SAVE, NULL, NULL);
|
||||
consvar_t cv_rendezvousserver = CVAR_INIT ("rendezvousserver", "relay.kartkrew.org", CV_SAVE|CV_CALL, NULL, RendezvousServer_OnChange);
|
||||
consvar_t cv_servername = CVAR_INIT ("servername", "SRB2Kart server", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Update_parameters);
|
||||
consvar_t cv_server_contact = CVAR_INIT ("server_contact", "", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Update_parameters);
|
||||
|
||||
|
|
@ -515,17 +517,6 @@ static void MasterServer_OnChange(void)
|
|||
#ifdef MASTERSERVER
|
||||
UnregisterServer();
|
||||
|
||||
/*
|
||||
TODO: remove this for v2, it's just a hack
|
||||
for those coming in with an old config.
|
||||
*/
|
||||
if (
|
||||
! cv_masterserver.changed &&
|
||||
strcmp(cv_masterserver.string, "ms.srb2.org:28900") == 0
|
||||
){
|
||||
CV_StealthSet(&cv_masterserver, cv_masterserver.defaultvalue);
|
||||
}
|
||||
|
||||
Set_api(cv_masterserver.string);
|
||||
|
||||
if (Online())
|
||||
|
|
@ -563,3 +554,16 @@ Advertise_OnChange(void)
|
|||
DRPC_UpdatePresence();
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef DEVELOP
|
||||
static void
|
||||
RendezvousServer_OnChange (void)
|
||||
{
|
||||
consvar_t *cvar = &cv_rendezvousserver;
|
||||
|
||||
if (!strcmp(cvar->string, "jart-dev.jameds.org"))
|
||||
CV_StealthSet(cvar, cvar->defaultvalue);
|
||||
}
|
||||
#else
|
||||
#error "This was an indev thing, remove at release."
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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<<FRACBITS),
|
||||
P_ReturnThrustY(mo, mo->angle - ANGLE_90, 32<<FRACBITS),
|
||||
32<<FRACBITS, MT_BOSSJUNK);
|
||||
mo2->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<<FRACBITS),
|
||||
P_ReturnThrustY(mo, mo->angle + ANGLE_90, 32<<FRACBITS),
|
||||
32<<FRACBITS, MT_BOSSJUNK);
|
||||
mo2->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<<FRACBITS),
|
||||
P_ReturnThrustY(mo, mo->angle - ANGLE_90, 32<<FRACBITS),
|
||||
32<<FRACBITS, MT_BOSSJUNK);
|
||||
mo2->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<<FRACBITS),
|
||||
P_ReturnThrustY(mo, mo->angle + ANGLE_90, 32<<FRACBITS),
|
||||
32<<FRACBITS, MT_BOSSJUNK);
|
||||
mo2->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<<FRACBITS),
|
||||
MT_BOSSJUNK);
|
||||
mo2->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<<FRACBITS, y<<FRACBITS, z<<FRACBITS, 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;
|
||||
|
|
@ -7325,7 +7326,7 @@ void A_SpawnObjectRelative(mobj_t *actor)
|
|||
(actor->eflags & MFE_VERTICALFLIP) ? ((actor->z + actor->height - mobjinfo[type].height) - FixedMul(z<<FRACBITS, actor->scale)) : (actor->z + FixedMul(z<<FRACBITS, actor->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<<FRACBITS, actor->scale)) : (actor->z + FixedMul(z<<FRACBITS, actor->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))<<FRACBITS, false);
|
||||
if (locvar1 > 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1184,7 +1184,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
mo->angle = FixedAngle((P_RandomKey(36)*10)<<FRACBITS);
|
||||
|
||||
mo2 = P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_BOSSJUNK);
|
||||
mo2->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
|
||||
|
|
@ -1251,6 +1251,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))
|
||||
|
|
@ -1322,7 +1328,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;
|
||||
}
|
||||
|
|
@ -1547,7 +1553,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;\
|
||||
|
|
@ -1569,7 +1575,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;
|
||||
|
|
@ -1615,7 +1621,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;\
|
||||
|
|
@ -1641,7 +1647,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;
|
||||
|
|
@ -1766,7 +1772,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);
|
||||
}
|
||||
|
||||
|
|
@ -1838,8 +1844,10 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
if (!(target->flags & MF_SHOOTABLE))
|
||||
return false; // shouldn't happen...
|
||||
|
||||
#if 0
|
||||
if (!(damagetype & DMG_DEATHMASK) && target->hitlag > 0)
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (target->flags2 & MF2_SKULLFLY)
|
||||
|
|
@ -1922,7 +1930,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
|
||||
if (combo == false)
|
||||
{
|
||||
if (player->flashing > 0)
|
||||
if (player->mo->hitlag == 0 && player->flashing > 0)
|
||||
{
|
||||
// Post-hit invincibility
|
||||
K_DoInstashield(player);
|
||||
|
|
|
|||
|
|
@ -410,6 +410,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);
|
||||
|
|
@ -530,5 +533,6 @@ fixed_t P_ScaleFromMap(fixed_t n, fixed_t scale);
|
|||
fixed_t P_GetMobjHead(const mobj_t *);
|
||||
fixed_t P_GetMobjFeet(const mobj_t *);
|
||||
fixed_t P_GetMobjGround(const mobj_t *);
|
||||
fixed_t P_GetMobjZMovement(mobj_t *mo);
|
||||
|
||||
#endif // __P_LOCAL__
|
||||
|
|
|
|||
34
src/p_map.c
34
src/p_map.c
|
|
@ -155,6 +155,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
|
||||
// =========================================================================
|
||||
|
|
@ -267,9 +291,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);
|
||||
|
|
@ -346,13 +368,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)
|
||||
|
|
@ -408,7 +430,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;
|
||||
}
|
||||
|
||||
|
|
|
|||
151
src/p_mobj.c
151
src/p_mobj.c
|
|
@ -1201,7 +1201,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
|
|||
gravityadd = -((gravityadd/5) + (gravityadd/8));
|
||||
}
|
||||
|
||||
gravityadd = FixedMul(gravityadd, mo->scale);
|
||||
gravityadd = FixedMul(gravityadd, mapobjectscale);
|
||||
|
||||
return gravityadd;
|
||||
}
|
||||
|
|
@ -2383,7 +2383,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);
|
||||
|
|
@ -2403,7 +2403,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);
|
||||
|
|
@ -3574,7 +3574,8 @@ static void P_CheckFloatbobPlatforms(mobj_t *mobj)
|
|||
|
||||
static void P_SquishThink(mobj_t *mobj)
|
||||
{
|
||||
if (!(mobj->eflags & MFE_SLOPELAUNCHED))
|
||||
if (!(mobj->flags & MF_NOSQUISH) &&
|
||||
!(mobj->eflags & MFE_SLOPELAUNCHED))
|
||||
{
|
||||
K_Squish(mobj);
|
||||
}
|
||||
|
|
@ -4049,7 +4050,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
|
||||
|
|
@ -4060,7 +4061,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
|
||||
}
|
||||
|
|
@ -4385,7 +4386,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);
|
||||
|
|
@ -5068,7 +5069,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);
|
||||
|
|
@ -5529,7 +5530,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)
|
||||
|
|
@ -6814,12 +6815,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,
|
||||
|
|
@ -7014,6 +7018,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;
|
||||
|
|
@ -7026,6 +7033,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:
|
||||
|
|
@ -7398,10 +7408,10 @@ 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*mobj->target->momz/4;
|
||||
fast->momz = 3*P_GetMobjZMovement(mobj->target)/4;
|
||||
|
||||
K_MatchGenericExtraFlags(fast, mobj);
|
||||
P_SetMobjState(fast, S_FLAMESHIELDLINE1 + i);
|
||||
|
|
@ -7460,7 +7470,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;
|
||||
|
|
@ -8838,7 +8848,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)<<FRACBITS);
|
||||
P_InitAngle(debris, FixedAngle(P_RandomRange(0,360)<<FRACBITS));
|
||||
P_InstaThrust(debris, debris->angle, P_RandomRange(3,18)*(FRACUNIT/4));
|
||||
debris->momz = P_RandomRange(4,8)<<FRACBITS;
|
||||
if (!i) // kinda hacky :V
|
||||
|
|
@ -9614,7 +9624,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
case MT_CRUSHSTACEAN:
|
||||
{
|
||||
mobj_t *bigmeatyclaw = P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_CRUSHCLAW);
|
||||
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;
|
||||
|
|
@ -9623,7 +9633,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;
|
||||
|
|
@ -9756,7 +9766,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:
|
||||
{
|
||||
|
|
@ -9878,7 +9888,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;
|
||||
}
|
||||
|
|
@ -9895,7 +9905,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);
|
||||
|
|
@ -9955,7 +9965,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)<<FRACBITS)>>ANGLETOFINESHIFT) & FINEMASK)),
|
||||
cur->y + ((cur->radius>>FRACBITS) * FINESINE((FixedAngle((90*cur->threshold)<<FRACBITS)>>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);
|
||||
|
|
@ -10716,7 +10726,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;
|
||||
|
|
@ -10803,6 +10813,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);
|
||||
|
|
@ -11397,7 +11413,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;\
|
||||
|
|
@ -11596,29 +11612,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;
|
||||
|
|
@ -11795,19 +11811,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:
|
||||
|
|
@ -11816,7 +11832,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);
|
||||
|
|
@ -11840,7 +11856,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;
|
||||
|
|
@ -11950,7 +11966,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);
|
||||
|
|
@ -12136,7 +12152,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)),
|
||||
|
|
@ -12353,7 +12369,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
|
||||
|
|
@ -12365,8 +12383,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;
|
||||
|
||||
|
|
@ -12773,7 +12791,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));
|
||||
|
|
@ -12835,7 +12853,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));
|
||||
|
|
@ -12900,7 +12918,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));
|
||||
|
|
@ -12979,7 +12997,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));
|
||||
|
|
@ -13067,7 +13085,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));
|
||||
|
||||
|
|
@ -13137,6 +13155,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;
|
||||
}
|
||||
|
||||
|
|
@ -13153,6 +13182,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;
|
||||
}
|
||||
|
||||
|
|
@ -13164,3 +13201,25 @@ fixed_t P_GetMobjGround(const mobj_t *mobj)
|
|||
{
|
||||
return P_IsObjectFlipped(mobj) ? mobj->ceilingz : mobj->floorz;
|
||||
}
|
||||
|
||||
//
|
||||
// P_GetMobjZMovement
|
||||
// Returns the Z momentum of the object, accounting for slopes if the object is grounded
|
||||
//
|
||||
fixed_t P_GetMobjZMovement(mobj_t *mo)
|
||||
{
|
||||
pslope_t *slope = mo->standingslope;
|
||||
angle_t angDiff;
|
||||
fixed_t speed;
|
||||
|
||||
if (!P_IsObjectOnGround(mo))
|
||||
return mo->momz;
|
||||
|
||||
if (!slope)
|
||||
return 0;
|
||||
|
||||
angDiff = R_PointToAngle2(0, 0, mo->momx, mo->momy) - slope->xydirection;
|
||||
speed = FixedHypot(mo->momx, mo->momy);
|
||||
|
||||
return P_ReturnThrustY(mo, slope->zangle, P_ReturnThrustX(mo, angDiff, speed));
|
||||
}
|
||||
|
|
@ -159,6 +159,8 @@ typedef enum
|
|||
MF_DONTENCOREMAP = 1<<28,
|
||||
// Hitbox extends just as far below as above.
|
||||
MF_PICKUPFROMBELOW = 1<<29,
|
||||
// Disable momentum-based squash and stretch.
|
||||
MF_NOSQUISH = 1<<30,
|
||||
// free: to and including 1<<31
|
||||
} mobjflag_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -2885,19 +2885,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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3633,7 +3633,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
|
||||
|
|
@ -3928,7 +3928,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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
20
src/p_user.c
20
src/p_user.c
|
|
@ -379,7 +379,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!
|
||||
|
|
|
|||
21
src/r_fps.c
21
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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
127
src/r_things.c
127
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)
|
||||
|
|
@ -284,14 +285,13 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
|||
// store sprite info in lookup tables
|
||||
//FIXME : numspritelumps do not duplicate sprite replacements
|
||||
|
||||
W_ReadLumpHeaderPwad(wadnum, l, &patch, PNG_HEADER_SIZE, 0);
|
||||
|
||||
#ifndef NO_PNG_LUMPS
|
||||
{
|
||||
UINT8 header[PNG_HEADER_SIZE];
|
||||
size_t len = W_LumpLengthPwad(wadnum, l);
|
||||
|
||||
W_ReadLumpHeaderPwad(wadnum, l, header, sizeof header, 0);
|
||||
|
||||
if (Picture_IsLumpPNG(header, len))
|
||||
if (Picture_IsLumpPNG((UINT8*)&patch, len))
|
||||
{
|
||||
UINT8 *png = W_CacheLumpNumPwad(wadnum, l, PU_STATIC);
|
||||
Picture_PNGDimensions((UINT8 *)png, &width, &height, &topoffset, &leftoffset, len);
|
||||
|
|
@ -303,7 +303,6 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
|||
if (!isPNG)
|
||||
#endif
|
||||
{
|
||||
W_ReadLumpHeaderPwad(wadnum, l, &patch, sizeof(INT16) * 4, 0);
|
||||
width = (INT32)(SHORT(patch.width));
|
||||
height = (INT32)(SHORT(patch.height));
|
||||
topoffset = (INT16)(SHORT(patch.topoffset));
|
||||
|
|
@ -1149,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)
|
||||
{
|
||||
|
|
@ -1168,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
|
||||
{
|
||||
|
|
@ -1182,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
|
||||
{
|
||||
|
|
@ -1192,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;
|
||||
}
|
||||
|
||||
|
|
@ -1206,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);
|
||||
|
||||
|
|
@ -1246,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;
|
||||
|
|
@ -1269,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);
|
||||
|
|
@ -1289,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;
|
||||
|
|
@ -1298,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
|
||||
|
||||
|
|
@ -1312,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;
|
||||
|
|
@ -1331,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));
|
||||
|
|
@ -1470,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?)
|
||||
|
|
@ -1817,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))
|
||||
|
|
@ -1911,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)
|
||||
|
|
@ -1935,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;
|
||||
|
|
@ -2100,8 +2107,7 @@ static void R_ProjectSprite(mobj_t *thing)
|
|||
//
|
||||
// determine the colormap (lightlevel & special effects)
|
||||
//
|
||||
if (vis->cut & SC_FULLBRIGHT
|
||||
&& (!vis->extra_colormap || !(vis->extra_colormap->flags & CMF_FADEFULLBRIGHTSPRITES)))
|
||||
if (vis->cut & SC_FULLBRIGHT)
|
||||
{
|
||||
// full bright: goggles
|
||||
vis->colormap = colormaps;
|
||||
|
|
@ -2135,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;
|
||||
|
|
@ -2161,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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue