mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-26 03:51:50 +00:00
WIP: SPB Attack - temp menu draws OOB, no unlocks
This commit is contained in:
parent
9f46c705f0
commit
79d8e4e109
13 changed files with 70 additions and 2 deletions
|
|
@ -671,6 +671,8 @@ struct player_t
|
||||||
|
|
||||||
UINT8 eggmanTransferDelay;
|
UINT8 eggmanTransferDelay;
|
||||||
|
|
||||||
|
fixed_t SPBdistance;
|
||||||
|
|
||||||
UINT8 tripwireReboundDelay; // When failing Tripwire, brieftly lock out speed-based tripwire pass (anti-cheese)
|
UINT8 tripwireReboundDelay; // When failing Tripwire, brieftly lock out speed-based tripwire pass (anti-cheese)
|
||||||
|
|
||||||
mobj_t *stumbleIndicator;
|
mobj_t *stumbleIndicator;
|
||||||
|
|
|
||||||
|
|
@ -139,6 +139,7 @@ extern boolean metalrecording;
|
||||||
#define ATTACKING_NONE 0
|
#define ATTACKING_NONE 0
|
||||||
#define ATTACKING_TIME 1
|
#define ATTACKING_TIME 1
|
||||||
#define ATTACKING_LAP (1<<1)
|
#define ATTACKING_LAP (1<<1)
|
||||||
|
#define ATTACKING_SPB (1<<2)
|
||||||
extern UINT8 modeattacking;
|
extern UINT8 modeattacking;
|
||||||
|
|
||||||
// menu demo things
|
// menu demo things
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,7 @@ demoghost *ghosts = NULL;
|
||||||
#define DEMOVERSION 0x0007
|
#define DEMOVERSION 0x0007
|
||||||
#define DEMOHEADER "\xF0" "KartReplay" "\x0F"
|
#define DEMOHEADER "\xF0" "KartReplay" "\x0F"
|
||||||
|
|
||||||
#define DF_ATTACKMASK (ATTACKING_TIME|ATTACKING_LAP) // This demo contains time/lap data
|
#define DF_ATTACKMASK (ATTACKING_TIME|ATTACKING_LAP|ATTACKING_SPB) // This demo contains time/lap data
|
||||||
|
|
||||||
#define DF_GHOST 0x08 // This demo contains ghost data too!
|
#define DF_GHOST 0x08 // This demo contains ghost data too!
|
||||||
|
|
||||||
|
|
|
||||||
17
src/k_hud.c
17
src/k_hud.c
|
|
@ -1654,6 +1654,23 @@ void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT32 splitflags, U
|
||||||
workx += 6;
|
workx += 6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (modeattacking & ATTACKING_SPB && stplyr->SPBdistance > 0)
|
||||||
|
{
|
||||||
|
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->skincolor, GTC_CACHE);
|
||||||
|
int ybar = 180;
|
||||||
|
int widthbar = 120;
|
||||||
|
|
||||||
|
V_DrawFill(160 - widthbar / 2, ybar, widthbar, 1, 6);
|
||||||
|
V_DrawMappedPatch(160 + widthbar/2 - 7, ybar - 7, FRACUNIT, faceprefix[stplyr->skin][FACE_MINIMAP], colormap);
|
||||||
|
|
||||||
|
// vibes-based math
|
||||||
|
int bombxoff = (stplyr->SPBdistance/mapobjectscale - mobjinfo[MT_SPB].radius/FRACUNIT - mobjinfo[MT_PLAYER].radius/FRACUNIT) * 8;
|
||||||
|
bombxoff = sqrt(bombxoff) - 5;
|
||||||
|
bombxoff = max(0, min(bombxoff, widthbar));
|
||||||
|
V_DrawScaledPatch(160 + widthbar/2 - bombxoff, ybar - 7, FRACUNIT, W_CachePatchName("SPBMMAP", PU_CACHE));
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static fixed_t K_DrawKartPositionNumPatch(UINT8 num, UINT8 *color, fixed_t x, fixed_t y, fixed_t scale, INT32 flags)
|
static fixed_t K_DrawKartPositionNumPatch(UINT8 num, UINT8 *color, fixed_t x, fixed_t y, fixed_t scale, INT32 flags)
|
||||||
|
|
|
||||||
|
|
@ -4095,6 +4095,13 @@ INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) // A
|
||||||
{
|
{
|
||||||
if (inflictor->type == MT_SPBEXPLOSION && inflictor->movefactor)
|
if (inflictor->type == MT_SPBEXPLOSION && inflictor->movefactor)
|
||||||
{
|
{
|
||||||
|
if (modeattacking & ATTACKING_SPB)
|
||||||
|
{
|
||||||
|
P_DamageMobj(player->mo, inflictor, source, 1, DMG_INSTAKILL);
|
||||||
|
player->SPBdistance = 0;
|
||||||
|
S_StopMusic();
|
||||||
|
}
|
||||||
|
|
||||||
spbMultiplier = inflictor->movefactor;
|
spbMultiplier = inflictor->movefactor;
|
||||||
|
|
||||||
if (spbMultiplier <= 0)
|
if (spbMultiplier <= 0)
|
||||||
|
|
|
||||||
|
|
@ -232,6 +232,7 @@ typedef enum
|
||||||
ta_replay = 0,
|
ta_replay = 0,
|
||||||
ta_guest,
|
ta_guest,
|
||||||
ta_ghosts,
|
ta_ghosts,
|
||||||
|
ta_spb,
|
||||||
ta_spacer,
|
ta_spacer,
|
||||||
ta_start,
|
ta_start,
|
||||||
} ta_e;
|
} ta_e;
|
||||||
|
|
@ -761,6 +762,8 @@ extern consvar_t cv_dummykartspeed;
|
||||||
extern consvar_t cv_dummygpencore;
|
extern consvar_t cv_dummygpencore;
|
||||||
extern consvar_t cv_dummymatchbots;
|
extern consvar_t cv_dummymatchbots;
|
||||||
|
|
||||||
|
extern consvar_t cv_dummyspbattack;
|
||||||
|
|
||||||
void M_SetupDifficultyOptions(INT32 choice);
|
void M_SetupDifficultyOptions(INT32 choice);
|
||||||
void M_SetupDifficultySelect(INT32 choice);
|
void M_SetupDifficultySelect(INT32 choice);
|
||||||
void M_DifficultySelectInputs(INT32 choice);
|
void M_DifficultySelectInputs(INT32 choice);
|
||||||
|
|
|
||||||
|
|
@ -1138,6 +1138,8 @@ void M_Init(void)
|
||||||
CV_RegisterVar(&cv_dummygpencore);
|
CV_RegisterVar(&cv_dummygpencore);
|
||||||
CV_RegisterVar(&cv_dummymatchbots);
|
CV_RegisterVar(&cv_dummymatchbots);
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_dummyspbattack);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_dummyaddonsearch);
|
CV_RegisterVar(&cv_dummyaddonsearch);
|
||||||
|
|
||||||
M_UpdateMenuBGImage(true);
|
M_UpdateMenuBGImage(true);
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,13 @@ static kartitems_t K_KartItemReelTimeAttack[] =
|
||||||
KITEM_NONE
|
KITEM_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static kartitems_t K_KartItemReelSPBAttack[] =
|
||||||
|
{
|
||||||
|
KITEM_GACHABOM,
|
||||||
|
KITEM_SUPERRING,
|
||||||
|
KITEM_NONE
|
||||||
|
};
|
||||||
|
|
||||||
static kartitems_t K_KartItemReelBreakTheCapsules[] =
|
static kartitems_t K_KartItemReelBreakTheCapsules[] =
|
||||||
{
|
{
|
||||||
KITEM_GACHABOM,
|
KITEM_GACHABOM,
|
||||||
|
|
@ -1238,6 +1245,11 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet
|
||||||
presetlist = K_KartItemReelBreakTheCapsules;
|
presetlist = K_KartItemReelBreakTheCapsules;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (modeattacking & ATTACKING_SPB)
|
||||||
|
{
|
||||||
|
presetlist = K_KartItemReelSPBAttack;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; presetlist[i] != KITEM_NONE; i++)
|
for (i = 0; presetlist[i] != KITEM_NONE; i++)
|
||||||
{
|
{
|
||||||
K_PushToRouletteItemList(roulette, presetlist[i]);
|
K_PushToRouletteItemList(roulette, presetlist[i]);
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,16 @@
|
||||||
#include "../m_misc.h" // M_MkdirEach
|
#include "../m_misc.h" // M_MkdirEach
|
||||||
#include "../z_zone.h" // Z_StrDup/Z_Free
|
#include "../z_zone.h" // Z_StrDup/Z_Free
|
||||||
|
|
||||||
|
consvar_t cv_dummyspbattack = CVAR_INIT ("dummyspbattack", "Off", CV_HIDDEN, CV_OnOff, NULL);
|
||||||
|
|
||||||
// see ta_e
|
// see ta_e
|
||||||
menuitem_t PLAY_TimeAttack[] =
|
menuitem_t PLAY_TimeAttack[] =
|
||||||
{
|
{
|
||||||
{IT_STRING | IT_SUBMENU, "Replay...", NULL, NULL, {.submenu = &PLAY_TAReplayDef}, 0, 0},
|
{IT_STRING | IT_SUBMENU, "Replay...", NULL, NULL, {.submenu = &PLAY_TAReplayDef}, 0, 0},
|
||||||
{IT_STRING | IT_SUBMENU, "Guest...", NULL, NULL, {.submenu = &PLAY_TAReplayGuestDef}, 0, 0},
|
{IT_STRING | IT_SUBMENU, "Guest...", NULL, NULL, {.submenu = &PLAY_TAReplayGuestDef}, 0, 0},
|
||||||
{IT_STRING | IT_SUBMENU, "Ghosts...", NULL, NULL, {.submenu = &PLAY_TAGhostsDef}, 0, 0},
|
{IT_STRING | IT_SUBMENU, "Ghosts...", NULL, NULL, {.submenu = &PLAY_TAGhostsDef}, 0, 0},
|
||||||
|
{IT_STRING | IT_CVAR, "SPB Attack", NULL,
|
||||||
|
NULL, {.cvar = &cv_dummyspbattack}, 0, 0},
|
||||||
{IT_HEADERTEXT|IT_HEADER, "", NULL, NULL, {NULL}, 0, 0},
|
{IT_HEADERTEXT|IT_HEADER, "", NULL, NULL, {NULL}, 0, 0},
|
||||||
{IT_STRING | IT_CALL, "Start", NULL, NULL, {.routine = M_StartTimeAttack}, 0, 0},
|
{IT_STRING | IT_CALL, "Start", NULL, NULL, {.routine = M_StartTimeAttack}, 0, 0},
|
||||||
};
|
};
|
||||||
|
|
@ -426,6 +430,11 @@ void M_StartTimeAttack(INT32 choice)
|
||||||
modeattacking |= ATTACKING_LAP;
|
modeattacking |= ATTACKING_LAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cv_dummyspbattack.value)
|
||||||
|
{
|
||||||
|
modeattacking |= ATTACKING_SPB;
|
||||||
|
}
|
||||||
|
|
||||||
// Still need to reset devmode
|
// Still need to reset devmode
|
||||||
cht_debug = 0;
|
cht_debug = 0;
|
||||||
emeralds = 0;
|
emeralds = 0;
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,9 @@ static void SPBMantaRings(mobj_t *spb)
|
||||||
const fixed_t floatHeight = 24 * spb->scale;
|
const fixed_t floatHeight = 24 * spb->scale;
|
||||||
fixed_t floorDist = INT32_MAX;
|
fixed_t floorDist = INT32_MAX;
|
||||||
|
|
||||||
|
if (modeattacking & ATTACKING_SPB)
|
||||||
|
return; // no one else to use 'em
|
||||||
|
|
||||||
if (leveltime % SPB_MANTA_VRATE == 0)
|
if (leveltime % SPB_MANTA_VRATE == 0)
|
||||||
{
|
{
|
||||||
spb_manta_vscale(spb) = max(spb_manta_vscale(spb) - 1, SPB_MANTA_VMAX);
|
spb_manta_vscale(spb) = max(spb_manta_vscale(spb) - 1, SPB_MANTA_VMAX);
|
||||||
|
|
@ -730,6 +733,8 @@ static void SPBChase(mobj_t *spb, mobj_t *bestMobj)
|
||||||
|
|
||||||
dist = P_AproxDistance(P_AproxDistance(spb->x - chase->x, spb->y - chase->y), spb->z - chase->z);
|
dist = P_AproxDistance(P_AproxDistance(spb->x - chase->x, spb->y - chase->y), spb->z - chase->z);
|
||||||
|
|
||||||
|
chasePlayer->SPBdistance = dist;
|
||||||
|
|
||||||
desiredSpeed = FixedMul(baseSpeed, FRACUNIT + FixedDiv(dist - range, range));
|
desiredSpeed = FixedMul(baseSpeed, FRACUNIT + FixedDiv(dist - range, range));
|
||||||
|
|
||||||
if (desiredSpeed < baseSpeed)
|
if (desiredSpeed < baseSpeed)
|
||||||
|
|
|
||||||
|
|
@ -1921,7 +1921,7 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player->exiting && specialstageinfo.valid == true)
|
if (!player->exiting && (specialstageinfo.valid == true || modeattacking & ATTACKING_SPB))
|
||||||
{
|
{
|
||||||
player->pflags |= PF_NOCONTEST;
|
player->pflags |= PF_NOCONTEST;
|
||||||
P_DoPlayerExit(player);
|
P_DoPlayerExit(player);
|
||||||
|
|
|
||||||
|
|
@ -12225,6 +12225,9 @@ static mobjtype_t P_GetMobjtypeSubstitute(mapthing_t *mthing, mobjtype_t i)
|
||||||
if ((i == MT_RANDOMITEM) && (gametyperules & (GTR_PAPERITEMS|GTR_CIRCUIT)) == (GTR_PAPERITEMS|GTR_CIRCUIT))
|
if ((i == MT_RANDOMITEM) && (gametyperules & (GTR_PAPERITEMS|GTR_CIRCUIT)) == (GTR_PAPERITEMS|GTR_CIRCUIT))
|
||||||
return MT_PAPERITEMSPOT;
|
return MT_PAPERITEMSPOT;
|
||||||
|
|
||||||
|
if ((i == MT_RING) && (modeattacking & ATTACKING_SPB))
|
||||||
|
return MT_THOK;
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1973,6 +1973,13 @@ static void K_HandleLapIncrement(player_t *player)
|
||||||
rainbowstartavailable = false;
|
rainbowstartavailable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (player->laps == 1 && modeattacking & ATTACKING_SPB)
|
||||||
|
{
|
||||||
|
P_SpawnMobj(player->mo->x - FixedMul(8000*mapobjectscale, cos(player->mo->angle)),
|
||||||
|
player->mo->y - FixedMul(8000*mapobjectscale, sin(player->mo->angle)),
|
||||||
|
player->mo->z, MT_SPB);
|
||||||
|
}
|
||||||
|
|
||||||
if (netgame && player->laps > numlaps)
|
if (netgame && player->laps > numlaps)
|
||||||
CON_LogMessage(va(M_GetText("%s has finished the race.\n"), player_names[player-players]));
|
CON_LogMessage(va(M_GetText("%s has finished the race.\n"), player_names[player-players]));
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue