Makes it through all kart files

All that's left is SDL, OGL, maybe also Lua
This commit is contained in:
Sally Coolatta 2020-08-15 04:42:56 -04:00
parent fd5fe916bc
commit 9efdc98de6
19 changed files with 141 additions and 275 deletions

View file

@ -466,22 +466,25 @@ enum GameTypeRules
// Battle gametype rules
GTR_BUMPERS = 1<<3, // Enables the bumper health system
GTR_KARMA = 1<<4, // Enables the Karma system if you're out of bumpers
GTR_ITEMARROWS = 1<<5, // Show item box arrows above players
GTR_BATTLESTARTS = 1<<6, // Use Battle Mode start positions.
GTR_POINTLIMIT = 1<<7, // Reaching point limit ends the round
GTR_TIMELIMIT = 1<<8, // Reaching time limit ends the round
GTR_OVERTIME = 1<<9, // Allow overtime behavior
GTR_WANTED = 1<<4, // Enables the wanted anti-camping system
GTR_KARMA = 1<<5, // Enables the Karma system if you're out of bumpers
GTR_ITEMARROWS = 1<<6, // Show item box arrows above players
GTR_CAPSULES = 1<<7, // Enables the wanted anti-camping system
GTR_BATTLESTARTS = 1<<8, // Use Battle Mode start positions.
GTR_POINTLIMIT = 1<<9, // Reaching point limit ends the round
GTR_TIMELIMIT = 1<<10, // Reaching time limit ends the round
GTR_OVERTIME = 1<<11, // Allow overtime behavior
// Custom gametype rules
GTR_TEAMS = 1<<10, // Teams are forced on
GTR_NOTEAMS = 1<<11, // Teams are forced off
GTR_TEAMSTARTS = 1<<12, // Use team-based start positions
GTR_TEAMS = 1<<12, // Teams are forced on
GTR_NOTEAMS = 1<<13, // Teams are forced off
GTR_TEAMSTARTS = 1<<14, // Use team-based start positions
// Grand Prix rules
GTR_CAMPAIGN = 1<<13, // Handles cup-based progression
GTR_LIVES = 1<<14, // Lives system, players are forced to spectate during Game Over.
GTR_SPECIALBOTS = 1<<15, // Bot difficulty gets stronger between rounds, and the rival system is enabled.
GTR_CAMPAIGN = 1<<15, // Handles cup-based progression
GTR_LIVES = 1<<16, // Lives system, players are forced to spectate during Game Over.
GTR_SPECIALBOTS = 1<<17, // Bot difficulty gets stronger between rounds, and the rival system is enabled.
// free: to and including 1<<31
};

View file

@ -300,20 +300,12 @@ static void K_SpawnOvertimeParticles(fixed_t x, fixed_t y, fixed_t scale, mobjty
if (sec->floorpic != skyflatnum)
{
#ifdef ESLOPE
flatz[numflats] = (sec->f_slope ? P_GetZAt(sec->f_slope, x, y) : sec->floorheight);
#else
flatz[numflats] = (sec->floorheight);
#endif
flatz[numflats] = P_GetZAt(sec->f_slope, x, y, sec->floorheight);
numflats++;
}
if (sec->ceilingpic != skyflatnum && ceiling)
{
#ifdef ESLOPE
flatz[numflats] = (sec->c_slope ? P_GetZAt(sec->c_slope, x, y) : sec->ceilingheight) - FixedMul(mobjinfo[type].height, scale);
#else
flatz[numflats] = (sec->ceilingheight) - FixedMul(mobjinfo[type].height, scale);
#endif
flatz[numflats] = P_GetZAt(sec->c_slope, x, y, sec->ceilingheight) - FixedMul(mobjinfo[type].height, scale);
flip[numflats] = true;
numflats++;
}
@ -327,20 +319,12 @@ static void K_SpawnOvertimeParticles(fixed_t x, fixed_t y, fixed_t scale, mobjty
continue;
if (*rover->toppic != skyflatnum)
{
#ifdef ESLOPE
flatz[numflats] = (*rover->t_slope ? P_GetZAt(*rover->t_slope, x, y) : *rover->topheight);
#else
flatz[numflats] = (*rover->topheight);
#endif
flatz[numflats] = P_GetZAt(*rover->t_slope, x, y, *rover->topheight);
numflats++;
}
if (*rover->bottompic != skyflatnum && ceiling)
{
#ifdef ESLOPE
flatz[numflats] = (*rover->b_slope ? P_GetZAt(*rover->b_slope, x, y) : *rover->bottomheight) - FixedMul(mobjinfo[type].height, scale);
#else
flatz[numflats] = (*rover->bottomheight) - FixedMul(mobjinfo[type].height, scale);
#endif
flatz[numflats] = P_GetZAt(*rover->b_slope, x, y, *rover->bottomheight);
flip[numflats] = true;
numflats++;
}
@ -598,11 +582,7 @@ void K_SpawnBattleCapsules(void)
mt->mobj = NULL;
mtsector = R_PointInSubsector(mt->x << FRACBITS, mt->y << FRACBITS)->sector;
mt->z = (INT16)(
#ifdef ESLOPE
mtsector->f_slope ? P_GetZAt(mtsector->f_slope, mt->x << FRACBITS, mt->y << FRACBITS) :
#endif
mtsector->floorheight)>>FRACBITS;
mt->z = (INT16)(P_GetZAt(mtsector->f_slope, mt->x << FRACBITS, mt->y << FRACBITS, mtsector->floorheight) / FRACUNIT);
x = mt->x << FRACBITS;
y = mt->y << FRACBITS;
@ -611,11 +591,7 @@ void K_SpawnBattleCapsules(void)
if (mt->options & MTF_OBJECTFLIP)
{
z = (
#ifdef ESLOPE
sec->c_slope ? P_GetZAt(sec->c_slope, x, y) :
#endif
sec->ceilingheight) - mobjinfo[MT_BATTLECAPSULE].height;
z = P_GetZAt(sec->c_slope, x, y, sec->ceilingheight) - mobjinfo[MT_BATTLECAPSULE].height;
floorheights[0] = z;
@ -624,11 +600,7 @@ void K_SpawnBattleCapsules(void)
}
else
{
z =
#ifdef ESLOPE
sec->f_slope ? P_GetZAt(sec->f_slope, x, y) :
#endif
sec->floorheight;
z = P_GetZAt(sec->f_slope, x, y, sec->floorheight);
floorheights[0] = z;
@ -646,19 +618,11 @@ void K_SpawnBattleCapsules(void)
{
if (mt->options & MTF_OBJECTFLIP)
{
floorheights[numfloors] = (
#ifdef ESLOPE
*rover->b_slope ? P_GetZAt(*rover->b_slope, x, y) :
#endif
*rover->bottomheight) - mobjinfo[MT_BATTLECAPSULE].height;
floorheights[numfloors] = P_GetZAt(*rover->b_slope, x, y, *rover->bottomheight) - mobjinfo[MT_BATTLECAPSULE].height;
}
else
{
floorheights[numfloors] = (
#ifdef ESLOPE
*rover->t_slope ? P_GetZAt(*rover->t_slope, x, y) :
#endif
*rover->topheight);
floorheights[numfloors] = P_GetZAt(*rover->t_slope, x, y, *rover->topheight);
}
numfloors++;

View file

@ -183,12 +183,12 @@ static boolean K_BotHatesThisSector(player_t *player, sector_t *sec, fixed_t x,
if (flip == true)
{
specialflag = SF_FLIPSPECIAL_CEILING;
highestfloor = (sec->c_slope ? P_GetZAt(sec->c_slope, x, y) : sec->ceilingheight);
highestfloor = P_GetZAt(sec->c_slope, x, y, sec->ceilingheight);
}
else
{
specialflag = SF_FLIPSPECIAL_FLOOR;
highestfloor = (sec->f_slope ? P_GetZAt(sec->f_slope, x, y) : sec->floorheight);
highestfloor = P_GetZAt(sec->f_slope, x, y, sec->floorheight);
}
if (sec->flags & specialflag)
@ -206,8 +206,8 @@ static boolean K_BotHatesThisSector(player_t *player, sector_t *sec, fixed_t x,
continue;
}
top = (*rover->t_slope ? P_GetZAt(*rover->t_slope, x, y) : *rover->topheight);
bottom = (*rover->b_slope ? P_GetZAt(*rover->b_slope, x, y) : *rover->bottomheight);
top = P_GetZAt(*rover->t_slope, x, y, *rover->topheight);
bottom = P_GetZAt(*rover->b_slope, x, y, *rover->bottomheight);
if (!(rover->flags & FF_BLOCKPLAYER))
{

View file

@ -533,7 +533,7 @@ void K_FakeBotResults(player_t *bot)
if (besttime == UINT32_MAX // No one finished, so you don't finish either.
|| bot->distancetofinish >= worstdist) // Last place, you aren't going to finish.
{
bot->pflags |= PF_TIMEOVER;
bot->pflags |= PF_GAMETYPEOVER;
return;
}

View file

@ -870,11 +870,6 @@ static void K_initKartHUD(void)
}
}
}
if (timeinmap > 105)
hudtrans = cv_translucenthud.value;
else
hudtrans = 0;
}
static void K_drawKartItem(void)
@ -1167,7 +1162,7 @@ static void K_drawKartItem(void)
V_DrawFixedPatch(fx<<FRACBITS, fy<<FRACBITS, FRACUNIT, V_HUDTRANS|V_SLIDEIN|fflags, localpatch, colmap);
// Extensible meter, currently only used for rocket sneaker...
if (itembar && hudtrans)
if (itembar)
{
const INT32 fill = ((itembar*barlength)/maxl);
const INT32 length = min(barlength, fill);
@ -1334,7 +1329,7 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UI
if (emblem->collected)
{
emblempic[curemb] = W_CachePatchName(M_GetEmblemPatch(emblem), PU_CACHE);
emblempic[curemb] = W_CachePatchName(M_GetEmblemPatch(emblem, false), PU_CACHE);
emblemcol[curemb] = R_GetTranslationColormap(TC_DEFAULT, M_GetEmblemColor(emblem), GTC_CACHE);
if (++curemb == 3)
break;
@ -1538,10 +1533,8 @@ static boolean K_drawKartPositionFaces(void)
if (numplayersingame <= 1)
return true;
#ifdef HAVE_BLUA
if (!LUA_HudEnabled(hud_minirankings))
return false; // Don't proceed but still return true for free play above if HUD is disabled.
#endif
for (j = 0; j < numplayersingame; j++)
{
@ -1612,10 +1605,8 @@ static boolean K_drawKartPositionFaces(void)
V_DrawMappedPatch(FACE_X, Y, V_HUDTRANS|V_SLIDEIN|V_SNAPTOLEFT, facerankprefix[players[rankplayer[i]].skin], colormap);
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_battlebumpers))
{
#endif
if (gametype == GT_BATTLE && players[rankplayer[i]].kartstuff[k_bumper] > 0)
{
V_DrawMappedPatch(bumperx-2, Y, V_HUDTRANS|V_SLIDEIN|V_SNAPTOLEFT, kp_tinybumper[0], colormap);
@ -1625,9 +1616,7 @@ static boolean K_drawKartPositionFaces(void)
V_DrawMappedPatch(bumperx, Y, V_HUDTRANS|V_SLIDEIN|V_SNAPTOLEFT, kp_tinybumper[1], colormap);
}
}
#ifdef HAVE_BLUA
} // A new level of stupidity: checking if lua is enabled to close a bracket. :Fascinating:
#endif
}
if (i == strank)
@ -1764,7 +1753,7 @@ void K_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, IN
{
if (players[tab[i].num].exiting)
V_DrawRightAlignedThinString(x+rightoffset, y-1, hilicol|V_6WIDTHSPACE, timestring(players[tab[i].num].realtime));
else if (players[tab[i].num].pflags & PF_TIMEOVER)
else if (players[tab[i].num].pflags & PF_GAMETYPEOVER)
V_DrawRightAlignedThinString(x+rightoffset, y-1, V_6WIDTHSPACE, "NO CONTEST.");
else if (circuitmap)
V_DrawRightAlignedThinString(x+rightoffset, y-1, V_6WIDTHSPACE, va("Lap %d", tab[i].count));
@ -1773,7 +1762,7 @@ void K_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, IN
{
if (players[tab[i].num].exiting)
V_DrawRightAlignedString(x+rightoffset, y, hilicol, timestring(players[tab[i].num].realtime));
else if (players[tab[i].num].pflags & PF_TIMEOVER)
else if (players[tab[i].num].pflags & PF_GAMETYPEOVER)
V_DrawRightAlignedThinString(x+rightoffset, y-1, 0, "NO CONTEST.");
else if (circuitmap)
V_DrawRightAlignedString(x+rightoffset, y, 0, va("Lap %d", tab[i].count));
@ -2207,7 +2196,7 @@ static void K_drawKartWanted(void)
}
}
static void K_ObjectTracking(fixed_t *hud_x, fixed_t *hud_y, vertex_t *campos, angle_t camang, angle_t camaim, vertex_t *point)
static void K_ObjectTracking(fixed_t *hud_x, fixed_t *hud_y, vector3_t *campos, angle_t camang, angle_t camaim, vector3_t *point)
{
const INT32 swhalf = (BASEVIDWIDTH / 2);
const fixed_t swhalffixed = swhalf * FRACUNIT;
@ -2309,7 +2298,7 @@ static void K_drawKartPlayerCheck(void)
{
const fixed_t maxdistance = FixedMul(1280 * mapobjectscale, K_GetKartGameSpeedScalar(gamespeed));
camera_t *thiscam;
vertex_t c;
vector3_t c;
UINT8 cnum = 0;
UINT8 i;
INT32 splitflags = V_SNAPTOBOTTOM|V_SPLITSCREEN;
@ -2354,7 +2343,7 @@ static void K_drawKartPlayerCheck(void)
UINT8 *colormap = NULL;
UINT8 pnum = 0;
fixed_t x = 0;
vertex_t v;
vector3_t v;
if (!playeringame[i] || checkplayer->spectator)
{
@ -2446,8 +2435,9 @@ static void K_DrawRivalTagForPlayer(fixed_t x, fixed_t y)
static void K_DrawNameTagForPlayer(fixed_t x, fixed_t y, player_t *p, UINT8 cnum)
{
INT32 namelen = V_ThinStringWidth(player_names[p - players], V_6WIDTHSPACE|V_ALLOWLOWERCASE);
INT32 clr = K_SkincolorToTextColor(p->skincolor);
const INT32 clr = skincolors[p->skincolor].chatcolor;
const INT32 namelen = V_ThinStringWidth(player_names[p - players], V_6WIDTHSPACE|V_ALLOWLOWERCASE);
UINT8 *colormap = V_GetStringColormap(clr);
INT32 barx = 0, bary = 0, barw = 0;
@ -2499,7 +2489,7 @@ static void K_drawKartNameTags(void)
{
const fixed_t maxdistance = 8192*mapobjectscale;
camera_t *thiscam;
vertex_t c;
vector3_t c;
UINT8 cnum = 0;
UINT8 tobesorted[MAXPLAYERS];
fixed_t sortdist[MAXPLAYERS];
@ -2538,7 +2528,7 @@ static void K_drawKartNameTags(void)
{
player_t *ntplayer = &players[i];
fixed_t distance = maxdistance+1;
vertex_t v;
vector3_t v;
if (!playeringame[i] || ntplayer->spectator)
{
@ -2613,7 +2603,7 @@ static void K_drawKartNameTags(void)
fixed_t y = -BASEVIDWIDTH * FRACUNIT;
SINT8 localindicator = -1;
vertex_t v;
vector3_t v;
v.x = ntplayer->mo->x;
v.y = ntplayer->mo->y;
@ -3249,10 +3239,9 @@ static void K_drawBattleFullscreen(void)
INT32 splitflags = V_SNAPTOTOP; // I don't feel like properly supporting non-green resolutions, so you can have a misuse of SNAPTO instead
fixed_t scale = FRACUNIT;
boolean drawcomebacktimer = true; // lazy hack because it's cleaner in the long run.
#ifdef HAVE_BLUA
if (!LUA_HudEnabled(hud_battlecomebacktimer))
drawcomebacktimer = false;
#endif
if (r_splitscreen)
{
@ -3361,9 +3350,7 @@ static void K_drawBattleFullscreen(void)
return;
}
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_freeplay))
#endif
K_drawKartFreePlay(leveltime);
}
}
@ -3513,8 +3500,8 @@ static void K_drawInput(void)
static INT32 pn = 0;
INT32 target = 0, splitflags = (V_SNAPTOBOTTOM|V_SNAPTORIGHT);
INT32 x = BASEVIDWIDTH - 32, y = BASEVIDHEIGHT-24, offs, col;
const INT32 accent1 = splitflags|colortranslations[stplyr->skincolor][5];
const INT32 accent2 = splitflags|colortranslations[stplyr->skincolor][9];
const INT32 accent1 = splitflags | skincolors[stplyr->skincolor].ramp[5];
const INT32 accent2 = splitflags | skincolors[stplyr->skincolor].ramp[9];
ticcmd_t *cmd = &stplyr->cmd;
if (timeinmap <= 105)
@ -3899,66 +3886,50 @@ void K_drawKartHUD(void)
if (!demo.title && (!battlefullscreen || r_splitscreen))
{
// Draw the CHECK indicator before the other items, so it's overlapped by everything else
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_check)) // delete lua when?
#endif
if (cv_kartcheck.value && !splitscreen && !players[displayplayers[0]].exiting && !freecam)
K_drawKartPlayerCheck();
// nametags
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_names))
#endif
K_drawKartNameTags();
// Draw WANTED status
if (gametype == GT_BATTLE)
{
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_wanted))
#endif
K_drawKartWanted();
}
if (cv_kartminimap.value)
{
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_minimap))
#endif
K_drawKartMinimap();
}
}
if (battlefullscreen && !freecam)
{
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_battlefullscreen))
#endif
K_drawBattleFullscreen();
return;
}
// Draw the item window
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_item) && !freecam)
#endif
K_drawKartItem();
// If not splitscreen, draw...
if (!r_splitscreen && !demo.title)
{
// Draw the timestamp
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_time))
#endif
K_drawKartTimestamp(stplyr->realtime, TIME_X, TIME_Y, gamemap, 0);
if (!modeattacking)
{
// The top-four faces on the left
/*#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_minirankings))
#endif*/
//if (LUA_HudEnabled(hud_minirankings))
isfreeplay = K_drawKartPositionFaces();
}
}
@ -3968,9 +3939,7 @@ void K_drawKartHUD(void)
// Draw the speedometer
if (cv_kartspeedometer.value && !r_splitscreen)
{
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_speedometer))
#endif
K_drawKartSpeedometer();
}
@ -3999,9 +3968,7 @@ void K_drawKartHUD(void)
else if (gametype == GT_RACE) // Race-only elements
{
// Draw the lap counter
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_gametypeinfo))
#endif
K_drawKartLapsAndRings();
if (isfreeplay)
@ -4009,26 +3976,20 @@ void K_drawKartHUD(void)
else if (!modeattacking)
{
// Draw the numerical position
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_position))
#endif
K_DrawKartPositionNum(stplyr->kartstuff[k_position]);
}
else //if (!(demo.playback && hu_showscores))
{
// Draw the input UI
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_position))
#endif
K_drawInput();
}
}
else if (gametype == GT_BATTLE) // Battle-only
{
// Draw the hits left!
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_gametypeinfo))
#endif
K_drawKartBumpersOrKarma();
}
}
@ -4070,9 +4031,7 @@ void K_drawKartHUD(void)
// Draw FREE PLAY.
if (isfreeplay && !stplyr->spectator && timeinmap > 113)
{
#ifdef HAVE_BLUA
if (LUA_HudEnabled(hud_freeplay))
#endif
K_drawKartFreePlay(leveltime);
}
@ -4102,7 +4061,7 @@ void K_drawKartHUD(void)
if (cv_kartdebugcolorize.value && stplyr->mo && stplyr->mo->skin)
{
INT32 x = 0, y = 0;
UINT8 c;
UINT16 c;
for (c = 1; c < MAXSKINCOLORS; c++)
{

View file

@ -11,6 +11,7 @@
#include "doomtype.h"
#include "doomstat.h"
#include "hu_stuff.h"
#ifndef __K_HUD__
#define __K_HUD__

View file

@ -1785,8 +1785,8 @@ void K_KartMoveAnimation(player_t *player)
if (!spinningwheels)
{
// TODO: These should prooobably be different SPR2s
// Just a quick hack to prevent needing to do this :V
player->mo->frame = (player->mo->frames & ~FF_FRAMEMASK);
// Just a quick hack to prevent needing to do that :V
player->mo->frame = (player->mo->frame & ~FF_FRAMEMASK);
}
}
else
@ -3332,8 +3332,7 @@ static void K_SpawnAIZDust(player_t *player)
void K_SpawnBoostTrail(player_t *player)
{
fixed_t newx;
fixed_t newy;
fixed_t newx, newy, newz;
fixed_t ground;
mobj_t *flame;
angle_t travelangle;
@ -3349,7 +3348,7 @@ void K_SpawnBoostTrail(player_t *player)
return;
if (player->mo->eflags & MFE_VERTICALFLIP)
ground = player->mo->ceilingz - FixedMul(mobjinfo[MT_SNEAKERTRAIL].height, player->mo->scale);
ground = player->mo->ceilingz;
else
ground = player->mo->floorz;
@ -3362,14 +3361,13 @@ void K_SpawnBoostTrail(player_t *player)
{
newx = player->mo->x + P_ReturnThrustX(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(24*FRACUNIT, player->mo->scale));
newy = player->mo->y + P_ReturnThrustY(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(24*FRACUNIT, player->mo->scale));
#ifdef ESLOPE
if (player->mo->standingslope)
newz = P_GetZAt(player->mo->standingslope, newx, newy, ground);
if (player->mo->eflags & MFE_VERTICALFLIP)
{
ground = P_GetZAt(player->mo->standingslope, newx, newy);
if (player->mo->eflags & MFE_VERTICALFLIP)
ground -= FixedMul(mobjinfo[MT_SNEAKERTRAIL].height, player->mo->scale);
newz -= FixedMul(mobjinfo[MT_SNEAKERTRAIL].height, player->mo->scale);
}
#endif
flame = P_SpawnMobj(newx, newy, ground, MT_SNEAKERTRAIL);
P_SetTarget(&flame->target, player->mo);
@ -4238,9 +4236,7 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound)
if (mo->eflags & MFE_SPRUNG)
return;
#ifdef ESLOPE
mo->standingslope = NULL;
#endif
mo->eflags |= MFE_SPRUNG;
@ -4633,7 +4629,7 @@ void K_RepairOrbitChain(mobj_t *orbit)
}
// Simplified version of a code bit in P_MobjFloorZ
static fixed_t K_BananaSlopeZ(pslope_t *slope, fixed_t x, fixed_t y, fixed_t radius, boolean ceiling)
static fixed_t K_BananaSlopeZ(pslope_t *slope, fixed_t x, fixed_t y, fixed_t z, fixed_t radius, boolean ceiling)
{
fixed_t testx, testy;
@ -4656,42 +4652,26 @@ static fixed_t K_BananaSlopeZ(pslope_t *slope, fixed_t x, fixed_t y, fixed_t rad
testx += x;
testy += y;
return P_GetZAt(slope, testx, testy);
return P_GetZAt(slope, testx, testy, z);
}
static void K_CalculateBananaSlope(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z, fixed_t radius, fixed_t height, boolean flip, boolean player)
{
fixed_t newz;
sector_t *sec;
#ifdef ESLOPE
pslope_t *slope = NULL;
#endif
sec = R_PointInSubsector(x, y)->sector;
if (flip)
{
#ifdef ESLOPE
if (sec->c_slope)
{
slope = sec->c_slope;
newz = K_BananaSlopeZ(slope, x, y, radius, true);
}
else
#endif
newz = sec->ceilingheight;
slope = sec->c_slope ? sec->c_slope : NULL;
newz = K_BananaSlopeZ(slope, x, y, sec->ceilingheight, radius, true);
}
else
{
#ifdef ESLOPE
if (sec->f_slope)
{
slope = sec->f_slope;
newz = K_BananaSlopeZ(slope, x, y, radius, false);
}
else
#endif
newz = sec->floorheight;
slope = sec->f_slope ? sec->f_slope : NULL;
newz = K_BananaSlopeZ(slope, x, y, sec->floorheight, radius, true);
}
// Check FOFs for a better suited slope
@ -4713,19 +4693,8 @@ static void K_CalculateBananaSlope(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z
|| (rover->flags & FF_SWIMMABLE)))
continue;
#ifdef ESLOPE
if (*rover->t_slope)
top = K_BananaSlopeZ(*rover->t_slope, x, y, radius, false);
else
#endif
top = *rover->topheight;
#ifdef ESLOPE
if (*rover->b_slope)
bottom = K_BananaSlopeZ(*rover->b_slope, x, y, radius, true);
else
#endif
bottom = *rover->bottomheight;
top = K_BananaSlopeZ(*rover->t_slope, x, y, *rover->topheight, radius, false);
bottom = K_BananaSlopeZ(*rover->b_slope, x, y, *rover->bottomheight, radius, true);
if (flip)
{
@ -4748,10 +4717,7 @@ static void K_CalculateBananaSlope(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z
if (bottom < newz && abs(d1) < abs(d2))
{
newz = bottom;
#ifdef ESLOPE
if (*rover->b_slope)
slope = *rover->b_slope;
#endif
slope = *rover->b_slope ? *rover->b_slope : NULL;
}
}
else
@ -4775,18 +4741,13 @@ static void K_CalculateBananaSlope(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z
if (top > newz && abs(d1) < abs(d2))
{
newz = top;
#ifdef ESLOPE
if (*rover->t_slope)
slope = *rover->t_slope;
#endif
slope = *rover->t_slope ? *rover->t_slope : NULL;
}
}
}
}
#if 0
mobj->standingslope = slope;
#endif
//mobj->standingslope = slope;
#ifdef HWRENDER
mobj->modeltilt = slope;
@ -4988,13 +4949,11 @@ static void K_MoveHeldObjects(player_t *player)
if (R_PointToDist2(cur->x, cur->y, targx, targy) > 768*FRACUNIT)
P_TeleportMove(cur, targx, targy, cur->z);
#ifdef ESLOPE
if (P_IsObjectOnGround(cur))
{
K_CalculateBananaSlope(cur, cur->x, cur->y, cur->z,
cur->radius, cur->height, (cur->eflags & MFE_VERTICALFLIP), false);
}
#endif
cur = cur->hnext;
}

View file

@ -46,7 +46,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor);
void K_StealBumper(player_t *player, player_t *victim, boolean force);
void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source);
void K_SpawnMineExplosion(mobj_t *source, UINT8 color);
UINT8 K_DriftSparkColor(player_t *player, INT32 charge);
UINT16 K_DriftSparkColor(player_t *player, INT32 charge);
void K_SpawnBoostTrail(player_t *player);
void K_SpawnSparkleTrail(mobj_t *mo);
void K_SpawnWipeoutTrail(mobj_t *mo, boolean translucent);
@ -69,6 +69,7 @@ void K_SpawnDriftBoostExplosion(player_t *player, int stage);
void K_KartUpdatePosition(player_t *player);
void K_DropItems(player_t *player);
void K_DropRocketSneaker(player_t *player);
void K_DropKitchenSink(player_t *player);
void K_StripItems(player_t *player);
void K_StripOther(player_t *player);
void K_MomentumToFacing(player_t *player);

View file

@ -110,7 +110,7 @@ void K_DoIngameRespawn(player_t *player)
if (leveltime < starttime) // FAULT
{
player->powers[pw_nocontrol] = (starttime - leveltime) + 50;
player->pflags |= PF_SKIDDOWN; // cheeky pflag reuse
player->pflags |= PF_WPNDOWN; // cheeky pflag reuse
S_StartSound(player->mo, sfx_s3k83);
player->karthud[khud_fault] = 1;
}
@ -134,11 +134,11 @@ void K_DoIngameRespawn(player_t *player)
mapthing_t *beststart = NULL;
UINT8 numstarts = 0;
if (G_RaceGametype())
if (gametype == GT_RACE)
{
numstarts = numcoopstarts;
}
else if (G_BattleGametype())
else if (gametype == GT_BATTLE)
{
numstarts = numdmstarts;
}
@ -152,11 +152,11 @@ void K_DoIngameRespawn(player_t *player)
UINT32 dist = UINT32_MAX;
mapthing_t *checkstart = NULL;
if (G_RaceGametype())
if (gametype == GT_RACE)
{
checkstart = playerstarts[i];
}
else if (G_BattleGametype())
else if (gametype == GT_BATTLE)
{
checkstart = deathmatchstarts[i];
}
@ -281,7 +281,7 @@ static void K_MovePlayerToRespawnPoint(player_t *player)
const fixed_t realstepamt = (64 * mapobjectscale);
fixed_t stepamt = realstepamt;
vertex_t dest, step, laser;
vector3_t dest, step, laser;
angle_t stepha, stepva;
fixed_t dist, fulldist;
@ -563,7 +563,7 @@ static void K_DropDashWait(player_t *player)
for (i = 0; i < ns; i++)
{
const angle_t newangle = sidediff * i;
vertex_t spawn;
vector3_t spawn;
mobj_t *laser;
spawn.x = player->mo->x + P_ReturnThrustX(player->mo, newangle, 31 * player->mo->scale);
@ -674,7 +674,7 @@ static void K_HandleDropDash(player_t *player)
//P_PlayRinglossSound(player->mo);
P_PlayerRingBurst(player, 3);
if (G_BattleGametype())
if (gametype == GT_BATTLE)
{
if (player->kartstuff[k_bumper] > 0)
{

View file

@ -19,6 +19,7 @@
#include "r_local.h"
#include "z_zone.h"
#include "g_game.h"
#include "p_slopes.h"
// The number of sparkles per waypoint connection in the waypoint visualisation
static const UINT32 SPARKLES_PER_CONNECTION = 16U;
@ -425,10 +426,10 @@ static void K_DebugWaypointsSpawnLine(waypoint_t *const waypoint1, waypoint_t *c
fixed_t x, y, z;
UINT32 waypointdist;
INT32 n;
skincolors_t linkcolour = SKINCOLOR_GREEN;
UINT16 linkcolour = SKINCOLOR_GREEN;
// This array is used to choose which colour should be on this connection
const skincolors_t linkcolours[] = {
const UINT16 linkcolours[] = {
SKINCOLOR_RED,
SKINCOLOR_BLUE,
SKINCOLOR_ORANGE,
@ -437,7 +438,7 @@ static void K_DebugWaypointsSpawnLine(waypoint_t *const waypoint1, waypoint_t *c
SKINCOLOR_CYAN,
SKINCOLOR_WHITE,
};
const size_t linkcolourssize = sizeof(linkcolours) / sizeof(skincolors_t);
const size_t linkcolourssize = sizeof(linkcolours) / sizeof(UINT16);
// Error conditions
I_Assert(waypoint1 != NULL);
@ -1908,14 +1909,14 @@ static boolean K_RaiseWaypoint(
){
if (descending)
{
z = P_GetFOFBottomZAt(rover, x, y);
z = P_GetZAt(*rover->b_slope, x, y, *rover->bottomheight);
if (z > riser->z && z < sort)
sort = z;
}
else
{
z = P_GetFOFTopZAt(rover, x, y);
z = P_GetZAt(*rover->t_slope, x, y, *rover->topheight);
if (z < riser->z && z > sort)
sort = z;

View file

@ -1341,7 +1341,6 @@ static UINT8 ArchiveValueDemo(int TABLESINDEX, int myindex)
}
break;
}
#ifdef ESLOPE
case ARCH_SLOPE:
{
pslope_t *slope = *((pslope_t **)lua_touserdata(gL, myindex));
@ -1353,7 +1352,6 @@ static UINT8 ArchiveValueDemo(int TABLESINDEX, int myindex)
}
break;
}
#endif
case ARCH_MAPHEADER:
{
mapheader_t *header = *((mapheader_t **)lua_touserdata(gL, myindex));
@ -1795,11 +1793,9 @@ static UINT8 UnArchiveValueDemo(int TABLESINDEX, char field[1024])
case ARCH_SECTOR:
LUA_PushUserdata(gL, &sectors[READUINT16(demo_p)], META_SECTOR);
break;
#ifdef ESLOPE
case ARCH_SLOPE:
LUA_PushUserdata(gL, P_SlopeById(READUINT16(demo_p)), META_SLOPE);
break;
#endif
case ARCH_MAPHEADER:
LUA_PushUserdata(gL, mapheaderinfo[READUINT16(demo_p)], META_MAPHEADER);
break;

View file

@ -5206,12 +5206,9 @@ static void M_HandleAddons(INT32 choice)
M_AddonExec(KEY_ENTER);
break;
case EXT_LUA:
#ifndef HAVE_BLUA
S_StartSound(NULL, sfx_s26d);
M_StartMessage(va("%c%s\x80\nThis version of SRB2Kart does not\nhave support for .lua files.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), dirmenu[dir_on[menudepthleft]]+DIR_STRING),NULL,MM_NOTHING);
break;
#endif
// else intentional fallthrough
case EXT_SOC:
case EXT_WAD:
#ifdef USE_KART

View file

@ -13231,7 +13231,7 @@ void A_Boss5FindWaypoint(mobj_t *actor)
}
// allocate the table and reset count to zero
fangwaypoints = Z_Calloc(sizeof(*waypoints)*numfangwaypoints, PU_STATIC, NULL);
fangwaypoints = Z_Calloc(sizeof(*tubewaypoints)*numfangwaypoints, PU_STATIC, NULL);
numfangwaypoints = 0;
// now find them again and add them to the table!

View file

@ -4820,50 +4820,20 @@ fixed_t P_FloorzAtPos(fixed_t x, fixed_t y, fixed_t z, fixed_t height)
return floorz;
}
fixed_t
P_GetFOFTopZAt (ffloor_t *rover, fixed_t x, fixed_t y)
{
(void)x;
(void)y;
#ifdef ESLOPE
if (*rover->t_slope)
return P_GetZAt(*rover->t_slope, x, y);
else
#endif
return *rover->topheight;
}
fixed_t
P_GetFOFBottomZAt (ffloor_t *rover, fixed_t x, fixed_t y)
{
(void)x;
(void)y;
#ifdef ESLOPE
if (*rover->b_slope)
return P_GetZAt(*rover->b_slope, x, y);
else
#endif
return *rover->bottomheight;
}
fixed_t
P_VeryTopOfFOF (ffloor_t *rover)
{
#ifdef ESLOPE
if (*rover->t_slope)
return (*rover->t_slope)->highz;
else
#endif
return *rover->topheight;
}
fixed_t
P_VeryBottomOfFOF (ffloor_t *rover)
{
#ifdef ESLOPE
if (*rover->b_slope)
return (*rover->b_slope)->lowz;
else
#endif
return *rover->bottomheight;
}

View file

@ -2738,7 +2738,6 @@ boolean P_SceneryZMovement(mobj_t *mo)
// set standingslope
P_TryMove(mo, mo->x, mo->y, true);
mo->momz = -mo->momz;
#ifdef ESLOPE
if (mo->standingslope)
{
if (mo->flags & MF_NOCLIPHEIGHT)
@ -2746,7 +2745,6 @@ boolean P_SceneryZMovement(mobj_t *mo)
else if (!P_IsObjectOnGround(mo))
P_SlopeLaunch(mo);
}
#endif
S_StartSound(mo, mo->info->activesound);
}
break;
@ -11160,7 +11158,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
UINT8 id = mthing->angle & 255;
mobj->health = id;
mobj->threshold = sequence;
P_AddWaypoint(sequence, id, mobj);
P_AddTubeWaypoint(sequence, id, mobj);
break;
}
case MT_DSZSTALAGMITE:

View file

@ -34,6 +34,43 @@ void P_CalculateSlopeNormal(pslope_t *slope) {
slope->normal.y = FixedMul(FINESINE(slope->zangle>>ANGLETOFINESHIFT), slope->d.y);
}
// Calculate slope's high & low z
static void P_CalculateLineSlopeHighLow(pslope_t *slope, line_t *line, boolean ceiling, boolean back)
{
// To find the real highz/lowz of a slope, you need to check all the vertexes
// in the slope's sector with P_GetZAt to get the REAL lowz & highz
// Although these slopes are set by floorheights the ANGLE is what a slope is,
// so technically any slope can extend on forever (they are just bound by sectors)
// *You can use sourceline as a reference to see if two slopes really are the same
size_t l;
sector_t *checksector = back ? line->backsector : line->frontsector;
// Default points for high and low
fixed_t highest = INT32_MIN;
fixed_t lowest = INT32_MAX;
// Now check to see what the REAL high and low points of the slope inside the sector
// TODO: Is this really needed outside of FOFs? -Red
for (l = 0; l < checksector->linecount; l++)
{
pslope_t *checkslope = ceiling ? checksector->c_slope : checksector->f_slope;
fixed_t height = P_GetSlopeZAt(checkslope, checksector->lines[l]->v1->x, checksector->lines[l]->v1->y);
if (height > highest)
highest = height;
if (height < lowest)
lowest = height;
}
// Sets extra clipping data for the slope
slope->highz = highest;
slope->lowz = lowest;
}
/// Setup slope via 3 vertexes.
static void ReconfigureViaVertexes (pslope_t *slope, const vector3_t v1, const vector3_t v2, const vector3_t v3)
{
@ -316,13 +353,15 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker)
// In P_SpawnSlopeLine the origin is the centerpoint of the sourcelinedef
fslope = line->frontsector->f_slope =
MakeViaVectors(&point, &direction, dz, flags);
MakeViaVectors(&point, &direction, dz, flags);
// Now remember that f_slope IS a vector
// fslope->o = origin 3D point 1 of the vector
// fslope->d = destination 3D point 2 of the vector
// fslope->normal is a 3D line perpendicular to the 3D vector
P_CalculateLineSlopeHighLow(fslope, line, false, false);
fslope->zangle = R_PointToAngle2(0, origin.z, extent, point.z);
fslope->xydirection = R_PointToAngle2(origin.x, origin.y, point.x, point.y);
@ -338,7 +377,9 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker)
dz = FixedDiv(origin.z - point.z, extent);
cslope = line->frontsector->c_slope =
MakeViaVectors(&point, &direction, dz, flags);
MakeViaVectors(&point, &direction, dz, flags);
P_CalculateLineSlopeHighLow(cslope, line, true, false);
cslope->zangle = R_PointToAngle2(0, origin.z, extent, point.z);
cslope->xydirection = R_PointToAngle2(origin.x, origin.y, point.x, point.y);
@ -378,7 +419,9 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker)
dz = FixedDiv(origin.z - point.z, extent);
fslope = line->backsector->f_slope =
MakeViaVectors(&point, &direction, dz, flags);
MakeViaVectors(&point, &direction, dz, flags);
P_CalculateLineSlopeHighLow(fslope, line, false, true);
fslope->zangle = R_PointToAngle2(0, origin.z, extent, point.z);
fslope->xydirection = R_PointToAngle2(origin.x, origin.y, point.x, point.y);
@ -395,7 +438,9 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker)
dz = FixedDiv(origin.z - point.z, extent);
cslope = line->backsector->c_slope =
MakeViaVectors(&point, &direction, dz, flags);
MakeViaVectors(&point, &direction, dz, flags);
P_CalculateLineSlopeHighLow(cslope, line, true, true);
cslope->zangle = R_PointToAngle2(0, origin.z, extent, point.z);
cslope->xydirection = R_PointToAngle2(origin.x, origin.y, point.x, point.y);

View file

@ -5512,30 +5512,6 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
return fflr;
}
static fixed_t
Floor_height (sector_t *s, fixed_t x, fixed_t y)
{
#ifdef ESLOPE
return s->f_slope ? P_GetZAt(s->f_slope, x, y) : s->floorheight;
#else
(void)x;
(void)y;
return s->floorheight;
#endif
}
static fixed_t
Ceiling_height (sector_t *s, fixed_t x, fixed_t y)
{
#ifdef ESLOPE
return s->c_slope ? P_GetZAt(s->c_slope, x, y) : s->ceilingheight;
#else
(void)x;
(void)y;
return s->ceilingheight;
#endif
}
static void
P_RaiseTaggedThingsToFakeFloor (
UINT16 type,
@ -5566,12 +5542,12 @@ P_RaiseTaggedThingsToFakeFloor (
if (( mo->flags2 & MF2_OBJECTFLIP ))
{
offset = ( mo->ceilingz - mo->info->height ) - mo->z;
mo->z = ( Floor_height(control, mo->x, mo->y) - mo->info->height ) - offset;
mo->z = ( P_GetZAt(control->f_slope, mo->x, mo->y, control->floorheight) - mo->info->height ) - offset;
}
else
{
offset = mo->z - mo->floorz;
mo->z = Ceiling_height(control, mo->x, mo->y) + offset;
mo->z = P_GetZAt(control->c_slope, mo->x, mo->y, control->ceilingheight) + offset;
}
}
}

View file

@ -244,6 +244,10 @@ typedef struct pslope_s
angle_t xydirection;/// Precomputed angle of the normal's projection on the XY plane.
UINT8 flags; // Slope options
// SRB2Kart: For P_VeryTopOfFOF & P_VeryBottomOfFOF
fixed_t lowz;
fixed_t highz;
} pslope_t;
typedef enum

View file

@ -1967,21 +1967,13 @@ void R_StoreWallRange(INT32 start, INT32 stop)
// frontsector->ceiling and backsector->floor to see if a door was closed.
// Without the following code, sprites get displayed behind closed doors.
{
#ifdef ESLOPE
if (doorclosed || (worldhigh <= worldbottom && worldhighslope <= worldbottomslope))
#else
if (doorclosed || backsector->ceilingheight <= frontsector->floorheight)
#endif
{
ds_p->sprbottomclip = negonearray;
ds_p->bsilheight = INT32_MAX;
ds_p->silhouette |= SIL_BOTTOM;
}
#ifdef ESLOPE
if (doorclosed || (worldlow >= worldtop && worldlowslope >= worldtopslope))
#else
if (doorclosed || backsector->floorheight >= frontsector->ceilingheight)
#endif
{ // killough 1/17/98, 2/8/98
ds_p->sprtopclip = screenheightarray;
ds_p->tsilheight = INT32_MIN;