diff --git a/src/doomstat.h b/src/doomstat.h index 4f5488570..bc4f48a51 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -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 }; diff --git a/src/k_battle.c b/src/k_battle.c index 2093c2121..c3781fb30 100644 --- a/src/k_battle.c +++ b/src/k_battle.c @@ -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++; diff --git a/src/k_botsearch.c b/src/k_botsearch.c index 4dd55cc42..dbd0f077f 100644 --- a/src/k_botsearch.c +++ b/src/k_botsearch.c @@ -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)) { diff --git a/src/k_grandprix.c b/src/k_grandprix.c index a4882147a..57e31a885 100644 --- a/src/k_grandprix.c +++ b/src/k_grandprix.c @@ -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; } diff --git a/src/k_hud.c b/src/k_hud.c index dbfbf684f..16c2b408b 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -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<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++) { diff --git a/src/k_hud.h b/src/k_hud.h index 0c205990e..ac623d05c 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -11,6 +11,7 @@ #include "doomtype.h" #include "doomstat.h" +#include "hu_stuff.h" #ifndef __K_HUD__ #define __K_HUD__ diff --git a/src/k_kart.c b/src/k_kart.c index a75ac8577..fdbb6e499 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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; } diff --git a/src/k_kart.h b/src/k_kart.h index 67d7a3495..10a556c9c 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -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); diff --git a/src/k_respawn.c b/src/k_respawn.c index be55e2389..7773b7faf 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -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) { diff --git a/src/k_waypoint.c b/src/k_waypoint.c index e61c238d8..b9581e871 100644 --- a/src/k_waypoint.c +++ b/src/k_waypoint.c @@ -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; diff --git a/src/lua_script.c b/src/lua_script.c index fd61879eb..f8c233a54 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -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, §ors[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; diff --git a/src/m_menu.c b/src/m_menu.c index 5d6a35e7c..1fb5d3a58 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -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 diff --git a/src/p_enemy.c b/src/p_enemy.c index ce4b12074..e96189293 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -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! diff --git a/src/p_map.c b/src/p_map.c index c8d88c5ef..21912e37d 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -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; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 65740862c..15ee5daf7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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: diff --git a/src/p_slopes.c b/src/p_slopes.c index df7ef45c0..1e674e089 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -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); diff --git a/src/p_spec.c b/src/p_spec.c index 1131ce7e4..3d8dfbdec 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -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; } } } diff --git a/src/r_defs.h b/src/r_defs.h index c42a2ee3e..715067176 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -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 diff --git a/src/r_segs.c b/src/r_segs.c index f9d129900..0e0177fe5 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -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;