Merge branch 'blankart-dev' into infostuff

This commit is contained in:
GenericHeroGuy 2025-05-19 15:23:51 +02:00
commit 360e7419e8
36 changed files with 1000 additions and 395 deletions

View file

@ -54,17 +54,15 @@ git clone https://codeberg.org/NepDisk/blankart.git
cd blankart
mkdir build
cd build
cmake -G "MSYS Makefiles" ..ƒƒ
./_deps/sdl2_mixer-src/external/download.sh
cmake -G "MSYS Makefiles" ..ƒƒ
cmake -G "MSYS Makefiles" ..
make -j$(nproc)
```
## How to install
- Obtain an executable
- Grab the assets from the [blankart-assets repo](https://codeberg.org/NepDisk/blankart-assets)
- Compile the pk3 by running buildmainpk3.bat on windows or buildmainpk3.sh on *nix.
- Copy the generated pk3 into the folder `out/` and your compiled executable into a folder with the [SRB2Kart 1.6 assets](https://github.com/STJr/Kart-Public/releases/download/v1.6/AssetsLinuxOnly.zip) (such as an existing install).
- Compile the pk3s by running buildall.bat on windows or buildall.sh on *nix.
- Copy the generated pk3s from the folder `out/` and your compiled executable into a folder with the [SRB2Kart 1.6 assets](https://github.com/STJr/Kart-Public/releases/download/v1.6/AssetsLinuxOnly.zip) (such as an existing install).
# Disclaimer
BlanKart is in no way affiliated with Kart Krew Dev or Sonic Team Jr. This is just a project meant for fun. If you have any issues report to us not them.

View file

@ -598,7 +598,7 @@ static inline void CL_DrawConnectionStatus(void)
// Draw bottom box
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, V_YELLOWMAP, "Press ESC to abort");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, MENUCAPS|V_YELLOWMAP, "Press ESC to abort");
for (i = 0; i < 16; ++i)
V_DrawFill((BASEVIDWIDTH/2-128) + (i * 16), BASEVIDHEIGHT-24, 16, 8, palstart + ((animtime - i) & 15));
@ -655,7 +655,7 @@ static inline void CL_DrawConnectionStatus(void)
cltext = M_GetText("Connecting to server...");
break;
}
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-16-24, V_YELLOWMAP, cltext);
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-16-24, MENUCAPS|V_YELLOWMAP, cltext);
}
else
{
@ -665,7 +665,7 @@ static inline void CL_DrawConnectionStatus(void)
INT32 checkednum = 0;
INT32 i;
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, V_YELLOWMAP, "Press ESC to abort");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, MENUCAPS|V_YELLOWMAP, "Press ESC to abort");
//ima just count files here
for (i = 0; i < fileneedednum; i++)
@ -673,7 +673,7 @@ static inline void CL_DrawConnectionStatus(void)
checkednum++;
// Loading progress
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP, "Checking server addons...");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, MENUCAPS|V_YELLOWMAP, "Checking server addons...");
totalfileslength = (INT32)((checkednum/(double)(fileneedednum)) * 256);
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 111);
@ -687,7 +687,7 @@ static inline void CL_DrawConnectionStatus(void)
INT32 loadcompletednum = 0;
INT32 i;
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, V_YELLOWMAP, "Press ESC to abort");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, MENUCAPS|V_YELLOWMAP, "Press ESC to abort");
//ima just count files here
for (i = 0; i < fileneedednum; i++)
@ -695,12 +695,12 @@ static inline void CL_DrawConnectionStatus(void)
loadcompletednum++;
// Loading progress
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP, "Loading server addons...");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, MENUCAPS|V_YELLOWMAP, "Loading server addons...");
totalfileslength = (INT32)((loadcompletednum/(double)(fileneedednum)) * 256);
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 111);
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 96);
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE,
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, MENUCAPS|V_20TRANS|V_MONOSPACE,
va(" %2u/%2u Files",loadcompletednum,fileneedednum));
}
else if (lastfilenum != -1)
@ -714,7 +714,7 @@ static inline void CL_DrawConnectionStatus(void)
// Draw the bottom box.
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-58-8, 32, 1);
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-14, V_YELLOWMAP, "Press ESC to abort");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-14, MENUCAPS|V_YELLOWMAP, "Press ESC to abort");
Net_GetNetStat();
dldlength = (INT32)((file->currentsize/(double)file->totalsize) * 256);
@ -742,7 +742,7 @@ static inline void CL_DrawConnectionStatus(void)
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-30, 0,
va(M_GetText("%s downloading"), ((cl_mode == CL_DOWNLOADHTTPFILES) ? "\x82""HTTP" : "\x85""Direct")));
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-22, V_YELLOWMAP,
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-22, MENUCAPS|V_YELLOWMAP,
va(M_GetText("\"%s\""), tempname));
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, V_20TRANS|V_MONOSPACE,
va(" %4uK/%4uK",fileneeded[lastfilenum].currentsize>>10,file->totalsize>>10));
@ -756,20 +756,20 @@ static inline void CL_DrawConnectionStatus(void)
else
totaldldsize = downloadcompletedsize;
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-14, V_YELLOWMAP, "Overall Download Progress");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-14, MENUCAPS|V_YELLOWMAP, "Overall Download Progress");
totalfileslength = (INT32)((totaldldsize/(double)totalfilesrequestedsize) * 256);
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 111);
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 96);
if (totalfilesrequestedsize>>20 >= 10) //display in MB if over 10MB
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE,
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, MENUCAPS|V_20TRANS|V_MONOSPACE,
va(" %4uM/%4uM",totaldldsize>>20,totalfilesrequestedsize>>20));
else
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE,
V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, MENUCAPS|V_20TRANS|V_MONOSPACE,
va(" %4uK/%4uK",totaldldsize>>10,totalfilesrequestedsize>>10));
V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE,
V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, MENUCAPS|V_20TRANS|V_MONOSPACE,
va("%2u/%2u Files ",downloadcompletednum,totalfilesrequestednum));
}
else
@ -780,12 +780,12 @@ static inline void CL_DrawConnectionStatus(void)
//Draw bottom box
M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1);
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, V_YELLOWMAP, "Press ESC to abort");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, MENUCAPS|V_YELLOWMAP, "Press ESC to abort");
for (i = 0; i < 16; ++i)
V_DrawFill((BASEVIDWIDTH/2-128) + (i * 16), BASEVIDHEIGHT-24, 16, 8, palstart + ((animtime - i) & 15));
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP,
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, MENUCAPS|V_YELLOWMAP,
M_GetText("Waiting to download files..."));
}
}

View file

@ -81,12 +81,13 @@
#include <tracy/tracy/Tracy.hpp>
// Put hashes here to get them out of header hell.
#define ASSET_HASH_MAIN_PK3 0x6be3d5a671916bcb
#define ASSET_HASH_SRB2_SRB 0xf3ec1ea4d0eca4a9
#define ASSET_HASH_GFX_KART 0xc91b0d43f5ba131f
#define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291
#define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b
#define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9
#define ASSET_HASH_MAIN_PK3 0x7ec7eac23ac1dfdc
#define ASSET_HASH_MAPPATCH_PK3 0x16726c0303d699fb
#ifdef USE_PATCH_FILE
#define ASSET_HASH_PATCH_PK3 0x0000000000000000
#endif
@ -117,8 +118,6 @@ int SUBVERSION;
// platform independant focus loss
UINT8 window_notinfocus = false;
INT32 window_x;
INT32 window_y;
//
// DEMO LOOP
@ -1201,6 +1200,7 @@ static void IdentifyVersion(void)
D_AddFile(startupiwads, va(pandf,srb2waddir,CHARSNAME));
D_AddFile(startupiwads, va(pandf,srb2waddir,MAPSNAME));
D_AddFile(startupiwads, va(pandf,srb2waddir,MAINNAME));
D_AddFile(startupiwads, va(pandf,srb2waddir,MAPPATCHNAME));
#ifdef USE_PATCH_FILE
D_AddFile(startupiwads, va(pandf,srb2waddir,PATCHNAME));
#endif
@ -1485,6 +1485,7 @@ void D_SRB2Main(void)
W_VerifyFileHash(MAINWAD_CHARS, ASSET_HASH_CHARS_KART);
W_VerifyFileHash(MAINWAD_MAPS, ASSET_HASH_MAPS_KART);
W_VerifyFileHash(MAINWAD_MAIN, ASSET_HASH_MAIN_PK3);
W_VerifyFileHash(MAINWAD_MAPPATCH, ASSET_HASH_MAPPATCH_PK3);
#ifdef USE_PATCH_FILE
W_VerifyFileHash(MAINWAD_PATCH, ASSET_HASH_PATCH_PK3);
#endif
@ -1496,6 +1497,7 @@ void D_SRB2Main(void)
wadfiles[MAINWAD_CHARS]->compatmode = true;
wadfiles[MAINWAD_MAPS]->compatmode = true;
wadfiles[MAINWAD_MAIN]->compatmode = false;
wadfiles[MAINWAD_MAPPATCH]->compatmode = false;
#ifdef USE_PATCH_FILE
wadfiles[MAINWAD_PATCH]->compatmode = false;
#endif

View file

@ -22,14 +22,15 @@ extern "C" {
#endif
// Store file nameres here for future reference else where.
#define MAINNAME "main.pk3"
#define SRB2NAME "srb2.srb"
#define GRAPHICSNAME "gfx.kart"
#define TEXTURESNAME "textures.kart"
#define CHARSNAME "chars.kart"
#define MAPSNAME "maps.kart"
#define MAINNAME "main.pk3"
#define MAPPATCHNAME "mappatch.pk3"
#define PATCHNAME "patch.pk3"
#define MUSICNAME "music.kart"
#define CHARSNAME "chars.kart"
#define GRAPHICSNAME "gfx.kart"
#define SOUNDSNAME "sounds.kart"
typedef enum
@ -40,6 +41,7 @@ typedef enum
MAINWAD_CHARS,
MAINWAD_MAPS,
MAINWAD_MAIN,
MAINWAD_MAPPATCH,
#ifdef USE_PATCH_FILE
MAINWAD_PATCH,
#endif

View file

@ -87,7 +87,6 @@ static void Got_ExitLevelcmd(UINT8 **cp, INT32 playernum);
static void Got_SetupVotecmd(UINT8 **cp, INT32 playernum);
static void Got_ModifyVotecmd(UINT8 **cp, INT32 playernum);
static void Got_PickVotecmd(UINT8 **cp, INT32 playernum);
static void Got_GiveItemcmd(UINT8 **cp, INT32 playernum);
static void Got_RequestAddfilecmd(UINT8 **cp, INT32 playernum);
static void Got_Addfilecmd(UINT8 **cp, INT32 playernum);
static void Got_Pause(UINT8 **cp, INT32 playernum);
@ -447,7 +446,7 @@ consvar_t cv_kartrings = CVAR_INIT ("kartrings", "No", CV_NETVAR|CV_CALL|CV_NOIN
// Stacking related
consvar_t cv_kartstacking = CVAR_INIT ("kartstacking", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartStacking_OnChange);
consvar_t cv_kartstacking_calc_arg_offset = CVAR_INIT ("kartstacking_calcargoffset", "0.32", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL);
consvar_t cv_kartstacking_diminishparam = CVAR_INIT ("kartstacking_diminishparam", "0.32", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL);
consvar_t cv_kartstacking_maxvanillaboost = CVAR_INIT ("kartstacking_maxvanillaboost", "0.375", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL);
consvar_t cv_kartstacking_speedboostdropoff = CVAR_INIT ("kartstacking_speedboostdropoff", "0.01", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL);
consvar_t cv_kartstacking_speedboostdropoff_brake = CVAR_INIT ("kartstacking_speedboostdropoff_brake", "0.05", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL);
@ -518,7 +517,6 @@ consvar_t cv_kartdebugamount = CVAR_INIT ("kartdebugamount", "1", CV_NETVAR|CV_C
#else
#define VALUE "No"
#endif
consvar_t cv_kartallowgiveitem = CVAR_INIT ("kartallowgiveitem", VALUE, CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_YesNo, NULL);
#undef VALUE
consvar_t cv_kartdebugdistribution = CVAR_INIT ("kartdebugdistribution", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL);
@ -695,7 +693,6 @@ const char *netxcmdnames[MAXNETXCMD - 1] =
"ACCEPTPARTYINVITE", // XD_ACCEPTPARTYINVITE
"LEAVEPARTY", // XD_LEAVEPARTY
"CANCELPARTYINVITE", // XD_CANCELPARTYINVITE
"GIVEITEM", // XD_GIVEITEM
"ADDBOT", // XD_ADDBOT
"DISCORD", // XD_DISCORD
"PLAYSOUND", // XD_PLAYSOUND
@ -755,8 +752,6 @@ void D_RegisterServerCommands(void)
RegisterNetXCmd(XD_MODIFYVOTE, Got_ModifyVotecmd);
RegisterNetXCmd(XD_PICKVOTE, Got_PickVotecmd);
RegisterNetXCmd(XD_GIVEITEM, Got_GiveItemcmd);
RegisterNetXCmd(XD_SCHEDULETASK, Got_ScheduleTaskcmd);
RegisterNetXCmd(XD_SCHEDULECLEAR, Got_ScheduleClearcmd);
RegisterNetXCmd(XD_AUTOMATE, Got_Automatecmd);
@ -1119,6 +1114,7 @@ void D_RegisterClientCommands(void)
CV_RegisterVar(&cv_kickstartaccel[i]);
CV_RegisterVar(&cv_shrinkme[i]);
CV_RegisterVar(&cv_deadzone[i]);
CV_RegisterVar(&cv_deadzonestyle[i]);
}
// filesrch.c
@ -1193,15 +1189,18 @@ void D_RegisterClientCommands(void)
COM_AddCommand("god", Command_CheatGod_f);
COM_AddCommand("setrings", Command_Setrings_f);
COM_AddCommand("setlives", Command_Setlives_f);
COM_AddCommand("setscore", Command_Setscore_f);
COM_AddCommand("devmode", Command_Devmode_f);
COM_AddCommand("savecheckpoint", Command_Savecheckpoint_f);
COM_AddCommand("scale", Command_Scale_f);
COM_AddCommand("gravflip", Command_Gravflip_f);
COM_AddCommand("hurtme", Command_Hurtme_f);
COM_AddCommand("ateleport", Command_ATeleport_f);
COM_AddCommand("teleport", Command_Teleport_f);
COM_AddCommand("rteleport", Command_RTeleport_f);
COM_AddCommand("skynum", Command_Skynum_f);
COM_AddCommand("weather", Command_Weather_f);
COM_AddCommand("angle", Command_Angle_f);
CV_RegisterVar(&cv_renderhitbox);
CV_RegisterVar(&cv_showgremlins);
@ -2121,6 +2120,24 @@ void D_Cheat(INT32 playernum, INT32 cheat, ...)
return;
}
if (demo.playback && cheat == CHEAT_DEVMODE)
{
// There is no networking in demos, but devmode is
// too useful to be inaccessible!
// TODO: maybe allow everything, even though it would
// desync replays? May be useful for debugging.
va_start(ap, cheat);
cht_debug = va_arg(ap, UINT32);
va_end(ap);
return;
}
// sanity check
if (demo.playback)
{
return;
}
WRITEUINT8(p, playernum);
WRITEUINT8(p, cheat);
@ -2151,6 +2168,7 @@ void D_Cheat(INT32 playernum, INT32 cheat, ...)
break;
case CHEAT_RELATIVE_TELEPORT:
case CHEAT_TELEPORT:
COPY(WRITEFIXED, fixed_t);
COPY(WRITEFIXED, fixed_t);
COPY(WRITEFIXED, fixed_t);
@ -2159,6 +2177,20 @@ void D_Cheat(INT32 playernum, INT32 cheat, ...)
case CHEAT_DEVMODE:
COPY(WRITEUINT32, UINT32);
break;
case CHEAT_GIVEITEM:
COPY(WRITESINT8, int);
COPY(WRITEUINT8, unsigned int);
break;
case CHEAT_SCORE:
COPY(WRITEUINT32, UINT32);
break;
case CHEAT_ANGLE:
COPY(WRITEANGLE, angle_t);
break;
}
#undef COPY
@ -5547,34 +5579,6 @@ static void Got_PickVotecmd(UINT8 **cp, INT32 playernum)
Y_SetupVoteFinish(pick, level);
}
static void Got_GiveItemcmd(UINT8 **cp, INT32 playernum)
{
int item;
int amt;
item = READSINT8 (*cp);
amt = READUINT8 (*cp);
if (
( netgame && ! cv_kartallowgiveitem.value ) ||
( item < KITEM_SAD || item >= NUMKARTITEMS )
)
{
CONS_Alert(CONS_WARNING,
M_GetText ("Illegal give item received from %s\n"),
player_names[playernum]);
if (server)
SendKick(playernum, KICK_MSG_CON_FAIL);
return;
}
K_StripItems(&players[playernum]);
players[playernum].itemroulette = KROULETTE_DISABLED;
players[playernum].itemtype = item;
players[playernum].itemamount = amt;
}
static void Got_ScheduleTaskcmd(UINT8 **cp, INT32 playernum)
{
char command[MAXTEXTCMD];
@ -5704,10 +5708,12 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum)
if (!P_MobjWasRemoved(player->mo))
{
player->mo->flags ^= MF_NOCLIP;
player->noclip = true;
if (!(player->mo->flags & MF_NOCLIP))
{
status = "off";
player->noclip = false;
}
}
@ -5801,7 +5807,8 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum)
break;
}
case CHEAT_RELATIVE_TELEPORT: {
case CHEAT_RELATIVE_TELEPORT:
case CHEAT_TELEPORT: {
fixed_t x = READFIXED(*cp);
fixed_t y = READFIXED(*cp);
fixed_t z = READFIXED(*cp);
@ -5816,12 +5823,22 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum)
if (!P_MobjWasRemoved(player->mo))
{
P_MapStart();
P_SetOrigin(player->mo,
player->mo->x + x,
player->mo->y + y,
player->mo->z + z);
if (cheat == CHEAT_RELATIVE_TELEPORT)
{
P_SetOrigin(player->mo,
player->mo->x + x,
player->mo->y + y,
player->mo->z + z);
}
else
{
P_SetOrigin(player->mo, x, y, z);
}
P_MapEnd();
player->pflags |= PF_TRUSTWAYPOINTS;
player->bigwaypointgap = 0;
S_StartSound(player->mo, sfx_mixup);
}
@ -5829,7 +5846,10 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum)
strlcpy(t[1], M_Ftrim(f[1]), sizeof t[1]);
strlcpy(t[2], M_Ftrim(f[2]), sizeof t[2]);
CV_CheaterWarning(targetPlayer, va("relative teleport by %d%s, %d%s, %d%s",
CV_CheaterWarning(targetPlayer, va("%s %d%s, %d%s, %d%s",
cheat == CHEAT_RELATIVE_TELEPORT
? "relative teleport by"
: "teleport to",
(int)f[0], t[0], (int)f[1], t[1], (int)f[2], t[2]));
break;
}
@ -5841,6 +5861,54 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum)
break;
}
case CHEAT_GIVEITEM: {
SINT8 item = READSINT8(*cp);
UINT8 amt = READUINT8(*cp);
item = max(item, KITEM_SAD);
item = min(item, NUMKARTITEMS - 1);
K_StripItems(player);
// Cancel roulette if rolling
player->itemroulette = KROULETTE_DISABLED;
player->itemtype = item;
player->itemamount = amt;
if (amt == 0)
{
CV_CheaterWarning(playernum, "delete my items");
}
else
{
// FIXME: we should have actual KITEM_ name array
const char *itemname = cv_kartdebugitem.PossibleValue[1 + item].strvalue;
CV_CheaterWarning(playernum, va("give item %s x%d", itemname, amt));
}
break;
}
case CHEAT_SCORE: {
UINT32 score = READUINT32(*cp);
player->roundscore = score;
CV_CheaterWarning(targetPlayer, va("score = %u", score));
break;
}
case CHEAT_ANGLE: {
angle_t angle = READANGLE(*cp);
float anglef = FIXED_TO_FLOAT(AngleFixed(angle));
P_SetPlayerAngle(player, angle);
CV_CheaterWarning(targetPlayer, va("angle = %d%s", (int)anglef, M_Ftrim(anglef)));
break;
}
case NUMBER_OF_CHEATS:
break;
}
@ -6080,77 +6148,73 @@ static void Command_Archivetest_f(void)
}
#endif
/** Give yourself an, optional quantity or one of, an item.
*
* \sa cv_kartallowgiveitem
*/
/** Give yourself an, optional quantity or one of, an item.**/
static void Command_KartGiveItem_f(void)
{
char buf[2];
UINT8 localplayer = g_localplayers[consoleplayer];
int ac;
const char *name;
int item;
INT32 item;
const char * str;
int i;
/* Allow always in local games. */
if (! netgame || cv_kartallowgiveitem.value)
ac = COM_Argc();
if (ac < 2)
{
ac = COM_Argc();
if (ac < 2)
{
CONS_Printf(
"kartgiveitem <item> [amount]: Give yourself an item\n"
);
}
else
{
item = NUMKARTITEMS;
name = COM_Argv(1);
if (isdigit(*name) || *name == '-')
{
item = atoi(name);
}
else
{
for (i = 0; ( str = kartdebugitem_cons_t[i].strvalue ); ++i)
{
if (strcasecmp(name, str) == 0)
{
item = kartdebugitem_cons_t[i].value;
break;
}
}
}
if (item < NUMKARTITEMS)
{
buf[0] = item;
if (ac > 2)
buf[1] = atoi(COM_Argv(2));
else
buf[1] = 1;/* default to one quantity */
SendNetXCmd(XD_GIVEITEM, buf, 2);
}
else
{
CONS_Alert(CONS_WARNING,
"No item matches '%s'\n",
name);
}
}
CONS_Printf(
"give <item> [amount]: Give yourself an item\n"
);
}
else
{
CONS_Alert(CONS_NOTICE,
"The server does not allow this.\n");
item = NUMKARTITEMS;
name = COM_Argv(1);
if (isdigit(*name) || *name == '-')
{
item = atoi(name);
}
else
{
/* first check exact match */
if (!CV_CompleteValue(&cv_kartdebugitem, &name, &item))
{
CONS_Printf("\x83" "Autocomplete:\n");
/* then do very loose partial matching */
for (i = 0; ( str = kartdebugitem_cons_t[i].strvalue ); ++i)
{
if (strcasestr(str, name) != NULL)
{
CONS_Printf("\x83\t%s\n", str);
item = kartdebugitem_cons_t[i].value;
}
}
}
}
if (item < NUMKARTITEMS)
{
INT32 amt;
if (ac > 2)
amt = atoi(COM_Argv(2));
else
amt = (item != KITEM_NONE);/* default to one quantity, or zero, if KITEM_NONE */
D_Cheat(localplayer, CHEAT_GIVEITEM, item, amt);
}
else
{
CONS_Alert(CONS_WARNING,
"No item matches '%s'\n",
name);
}
}
}

View file

@ -122,7 +122,7 @@ extern consvar_t cv_kartusepwrlv;
extern consvar_t cv_kartrings;
extern consvar_t cv_kartstacking;
extern consvar_t cv_kartstacking_calc_arg_offset;
extern consvar_t cv_kartstacking_diminishparam;
extern consvar_t cv_kartstacking_maxvanillaboost;
extern consvar_t cv_kartstacking_speedboostdropoff;
extern consvar_t cv_kartstacking_speedboostdropoff_brake;
@ -171,7 +171,7 @@ extern consvar_t cv_kartslipdash;
extern consvar_t cv_votetime;
extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartallowgiveitem, cv_kartdebugdistribution, cv_kartdebughuddrop;
extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartdebugdistribution, cv_kartdebughuddrop;
extern consvar_t cv_kartdebugcheckpoint, cv_kartdebugnodes, cv_kartdebugcolorize, cv_kartdebugdirector;
extern consvar_t cv_kartdebugwaypoints, cv_kartdebuglap,cv_kartdebugbotpredict;
@ -249,14 +249,13 @@ typedef enum
XD_ACCEPTPARTYINVITE, // 29
XD_LEAVEPARTY, // 30
XD_CANCELPARTYINVITE, // 31
XD_GIVEITEM, // 32
XD_ADDBOT, // 33
XD_DISCORD, // 34
XD_PLAYSOUND, // 35
XD_SCHEDULETASK, // 36
XD_SCHEDULECLEAR, // 37
XD_AUTOMATE, // 38
XD_CHEAT, // 39
XD_ADDBOT, // 32
XD_DISCORD, // 33
XD_PLAYSOUND, // 34
XD_SCHEDULETASK, // 35
XD_SCHEDULECLEAR, // 36
XD_AUTOMATE, // 37
XD_CHEAT, // 38
MAXNETXCMD
} netxcmd_t;

View file

@ -1402,18 +1402,19 @@ void PT_FileFragment(void)
filename = va("%s", file->filename);
nameonly(filename);
if (!strcmp(filename, MAINNAME)
|| !strcmp(filename, SRB2NAME)
if (!strcmp(filename, SRB2NAME)
|| !strcmp(filename, GRAPHICSNAME)
|| !strcmp(filename, TEXTURESNAME)
|| !strcmp(filename, CHARSNAME)
|| !strcmp(filename, MAPSNAME)
|| !strcmp(filename, MAINNAME)
|| !strcmp(filename, MAPPATCHNAME)
|| !strcmp(filename, PATCHNAME)
|| !strcmp(filename, SOUNDSNAME)
|| !strcmp(filename, MUSICNAME)
)
{
I_Error("Tried to download \"%s\"", filename);
I_Error("Tried to download base-game file: \"%s\"", filename);
}
filename = file->filename;

View file

@ -602,8 +602,9 @@ struct player_t
UINT8 startboost; // (0 to 125) - Boost you get from start of race or respawn drop dash
// Respawn
UINT8 dropdash;
UINT8 respawn;
UINT8 dropdash; // Gain a burst of speed when you drop while respawning
UINT8 respawn; // Timer given when you die.
UINT8 softlocktimer; // Tracks how fast you died after respawning. Use for softlock prevention.
UINT16 flashing;
UINT16 spinouttimer; // Spin-out from a banana peel or oil slick (was "pw_bananacam")
@ -611,6 +612,7 @@ struct player_t
UINT8 instashield; // Instashield no-damage animation timer
UINT8 wipeoutslow; // Timer before you slowdown when getting wiped out
UINT8 justbumped; // Prevent players from endlessly bumping into each other
boolean noclip; // Fix Grow breaking the "noclip" cheat. Also applies noclip as a bonus.
SINT8 drift; // (-5 to 5) - Drifting Left or Right, plus a bigger counter = sharper turn
fixed_t driftcharge; // Charge your drift so you can release a burst of speed
@ -633,6 +635,7 @@ struct player_t
fixed_t boostpower; // Base boost value, for offroad
fixed_t speedboost; // Boost value smoothing for max speed
fixed_t prevspeedboost; // Max speed boost value from the last frame
fixed_t accelboost; // Boost value smoothing for acceleration
angle_t boostangle; // angle set when not spun out OR boosted to determine what direction you should keep going at if you're spun out and boosted.
boostinfo_t boostinfo; // Stores values used for setting speed and accel boosts.

View file

@ -355,8 +355,7 @@ const char *const PLAYERFLAG_LIST[] = {
"\x01",
"\x01",
"\x01",
"\x01",
"ATTACKDOWN",
"SLIDING",
NULL // stop loop here.
@ -775,6 +774,7 @@ struct menu_routine_s const MENU_ROUTINES[] = {
struct menu_drawer_s const MENU_DRAWERS[] = {
{ "DRAWGENERICMENU", &M_DrawGenericMenu },
{ "DRAWGENERICSCROLLMENU", &M_DrawGenericScrollMenu },
{ "DRAWCENTEREDMENU", &M_DrawCenteredMenu },
{ "DRAWPAUSEMENU", &M_DrawPauseMenu },
{ "DRAWCHECKLIST", &M_DrawChecklist },

View file

@ -280,6 +280,7 @@ struct mapthing_t
UINT8 layer; // FOF layer to spawn on, see P_GetMobjSpawnHeight
mapUserProperties_t user; // UDMF user-defined custom properties.
mobj_t *mobj;
boolean patch;
};
#define ZSHIFT 4

View file

@ -173,8 +173,6 @@ extern boolean digital_disabled;
extern UINT8 paused; // Game paused?
extern UINT8 window_notinfocus; // are we in focus? (backend independant -- handles auto pausing and display of "focus lost" message)
extern INT32 window_x;
extern INT32 window_y;
extern boolean nodrawers;
extern boolean noblit;

View file

@ -976,7 +976,7 @@ static void F_DrawDiagCubes(void)
for (j = -4; j < 5; j++)
{
//Up Cubes
V_DrawFill(-((credbgtimer % 128)+1)+(32*j)+32-20, ((credbgtimer % 128)+1)-(32*j), 32, 32, 31|V_SNAPTOBOTTOM|V_SNAPTORIGHT);
V_DrawFill(-((credbgtimer % 128)+1)+(32*j)+32-20, ((credbgtimer % 128)+1)-(32*j), 32, 32, 31|V_SNAPTOTOP|V_SNAPTOLEFT);
V_DrawFill(-((credbgtimer % 128)+1)+(32*j)+32-20, ((credbgtimer % 128)+1)-(32*j), 32, 32, 31|V_SNAPTOTOP|V_SNAPTOLEFT);
V_DrawFill(-((credbgtimer % 128)+1)+(32*j)-20, ((credbgtimer % 128)+1)-(32*j), 32, 32, 31|V_SNAPTOTOP|V_SNAPTOLEFT);
V_DrawFill(-((credbgtimer % 128)+1)+(32*j)-32-20, ((credbgtimer % 128)+1)-(32*j), 32, 32, 31|V_SNAPTOTOP|V_SNAPTOLEFT);
@ -994,8 +994,9 @@ void F_BlanCreditDrawer(void)
fixed_t y = (80<<FRACBITS) - 5*(animtimer<<FRACBITS)/8;
fixed_t yscroll = FixedMul(32<<FRACBITS, FixedDiv(credbgtimer%TICRATE, TICRATE));
V_DrawFill(-100,-100,vid.width, vid.height,81);
V_DrawSciencePatch(0, 0 - yscroll, V_SNAPTOTOP, W_CachePatchName("CREDTILE", PU_CACHE), FRACUNIT);
V_DrawFillConsoleMap(0,0,vid.width, vid.height,0);
V_DrawFillConsoleMap(-100,-100,vid.width, vid.height,0);
// Draw credits text on top
for (i = 0; blancredits[i]; i++)

View file

@ -447,6 +447,14 @@ consvar_t cv_deadzone[MAXSPLITSCREENPLAYERS] = {
CVAR_INIT ("deadzone4", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL)
};
static CV_PossibleValue_t deadzonestyle_cons_t[] = {{0, "Kart"}, {1, "RR"}, {0, NULL}};
consvar_t cv_deadzonestyle[MAXSPLITSCREENPLAYERS] = {
CVAR_INIT ("deadzonestyle", "Kart", CV_SAVE, deadzonestyle_cons_t, NULL),
CVAR_INIT ("deadzonestyle2", "Kart", CV_SAVE, deadzonestyle_cons_t, NULL),
CVAR_INIT ("deadzonestyle3", "Kart", CV_SAVE, deadzonestyle_cons_t, NULL),
CVAR_INIT ("deadzonestyle4", "Kart", CV_SAVE, deadzonestyle_cons_t, NULL)
};
// now automatically allocated in D_RegisterClientCommands
// so that it doesn't have to be updated depending on the value of MAXPLAYERS
char player_names[MAXPLAYERS][MAXPLAYERNAME+1];
@ -661,6 +669,17 @@ static void G_SetSaveGameModified(void)
strcatbf(savegamename, srb2home, PATHSEP);
G_LoadGameData();
// unlock EVERYTHING.
for (UINT8 i = 0; i < MAXUNLOCKABLES; i++)
{
if (!unlockables[i].conditionset)
continue;
if (!unlockables[i].unlocked)
{
unlockables[i].unlocked = true;
}
}
}
// for consistency among messages: this modifies the game and removes savemoddata.
@ -939,9 +958,16 @@ static void G_HandleAxisDeadZone(UINT8 splitnum, joystickvector2_t *joystickvect
{
INT32 gamepadStyle = Joystick[splitnum].bGamepadStyle;
fixed_t deadZone = cv_deadzone[splitnum].value;
SINT8 deadZoneStyle = cv_deadzonestyle[splitnum].value;
// When gamepadstyle is "true" the values are just -1, 0, or 1. This is done in the interface code.
if (!gamepadStyle)
// v1 style deadzone == (deadZoneStyle == 0)
// Deadzone doesn't scale so shallower angles are easier to hit.
// RR style deadzone
// Dead zone scales so shallower angles are harder to hit but you have more range.
if (!gamepadStyle && (deadZoneStyle == 1))
{
// Get the total magnitude of the 2 axes
INT32 magnitude = (joystickvector->xaxis * joystickvector->xaxis) + (joystickvector->yaxis * joystickvector->yaxis);

View file

@ -79,6 +79,7 @@ extern consvar_t cv_invertmouse;
extern consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_shrinkme[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_deadzone[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_deadzonestyle[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_ghost_besttime, cv_ghost_bestlap, cv_ghost_last, cv_ghost_guest, cv_ghost_staff;

View file

@ -494,7 +494,10 @@ void HWR_InitModels(void)
size_t i;
INT32 s;
FILE *f;
char name[24], filename[32];
char name[26], filename[32];
// name[24] is used to check for names in the models.dat file that match with sprites or player skins
// sprite names are always 4 characters long, and names is for player skins can be up to 19 characters long
// PLAYERMODELPREFIX is 6 characters long
float scale, offset;
size_t prefixlen;

View file

@ -328,8 +328,6 @@ const char *I_ClipboardPaste(void);
void I_RegisterSysCommands(void);
void I_CursedWindowMovement(int xd, int yd);
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -34,10 +34,12 @@ _(OP_OPENGL)
_(OP_SOUND)
_(SR_SOUNDTEST)
_(OP_SNDEFX)
_(OP_HUD)
_(OP_CHAT)
_(OP_GAMEHUD)
_(OP_OFFSET)
_(OP_CAMERA)
_(OP_P1CAMERA)

View file

@ -700,6 +700,8 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2)
if ((t1Condition == true || flameT1 == true) && (t2Condition == true || flameT2 == true))
{
K_DoInstashield(t1->player);
K_DoInstashield(t2->player);
return false;
}
else if (t1Condition == true && t2Condition == false)
@ -768,20 +770,6 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2)
return true;
}
}
// Ring Loss on bump.
t1Condition = ((t2->player->rings > 0) && (K_GetShieldFromPlayer(t2->player) == KSHIELD_NONE));
t2Condition = ((t1->player->rings > 0) && (K_GetShieldFromPlayer(t1->player) == KSHIELD_NONE));
if (t1Condition == true)
{
P_PlayerRingBurst(t2->player, 1);
}
if (t2Condition == true)
{
P_PlayerRingBurst(t1->player, 1);
}
return false;
}

View file

@ -261,7 +261,6 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_kartdebugitem);
CV_RegisterVar(&cv_kartdebugamount);
CV_RegisterVar(&cv_kartallowgiveitem);
CV_RegisterVar(&cv_kartdebugdistribution);
CV_RegisterVar(&cv_kartdebughuddrop);
CV_RegisterVar(&cv_kartdebugwaypoints);
@ -284,7 +283,8 @@ void K_RegisterKartStuff(void)
// Stacking
CV_RegisterVar(&cv_kartstacking);
CV_RegisterVar(&cv_kartstacking_calc_arg_offset);
CV_RegisterVar(&cv_kartstacking_diminishparam);
CV_RegisterVar(&cv_kartstacking_maxvanillaboost);
CV_RegisterVar(&cv_kartstacking_speedboostdropoff);
CV_RegisterVar(&cv_kartstacking_speedboostdropoff_brake);
CV_RegisterVar(&cv_kartstacking_accelstack);
@ -611,7 +611,13 @@ static void K_KartGetItemResult(player_t *player, SINT8 getitem)
fixed_t K_ItemOddsScale(UINT8 numPlayers, boolean spbrush)
{
// CEP: due to how baseplayer works, 17P+ lobbies will STILL have the disastrous odds of 0.22 prior, if not WORSE
// let's try adding another condition
const UINT8 basePlayer = 8; // The player count we design most of the game around.
const UINT8 vanillaMax = 17; // CEP: Maximum players in "vanilla" (non-30P) clients.
const UINT8 extPlayer = 24; // CEP: Cap for 17P+ so that odds don't get too muddled.
UINT8 playerCount = (spbrush ? 2 : numPlayers);
fixed_t playerScaling = 0;
@ -627,8 +633,22 @@ fixed_t K_ItemOddsScale(UINT8 numPlayers, boolean spbrush)
else if (playerCount > basePlayer)
{
// More than basePlayer: reduce odds slightly.
// 16P: x0.75
playerScaling = (basePlayer - playerCount) * (FRACUNIT / 32);
// CEP: 17P+ adjustments
if (playerCount < vanillaMax)
{
// Less than vanillaMax: Use standard calculations.
// 16P: x0.6
playerScaling = (basePlayer - playerCount) * (FRACUNIT / 20);
}
else if (playerCount > vanillaMax)
{
// More than vanillaMax: Increase odds to fit with the increased playercount
// 24P: x0.6
// 30P: x0.45
playerScaling = (basePlayer - min(extPlayer, playerCount)) * (FRACUNIT / 40); // adding a cap here to be sure
}
}
return playerScaling;
@ -2031,6 +2051,12 @@ boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean sol
mobj1->player->rmomy = mobj1->momy - mobj1->player->cmomy;
mobj1->player->justbumped = bumptime;
// Moved here so it only fires once on bump.
if ((mobj1->player->rings > 0) && (K_GetShieldFromPlayer(mobj1->player) == KSHIELD_NONE))
{
P_PlayerRingBurst(mobj1->player, 1);
}
if (mobj1->player->spinouttimer)
{
mobj1->player->wipeoutslow = wipeoutslowtime+1;
@ -2045,6 +2071,12 @@ boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean sol
mobj2->player->rmomy = mobj2->momy - mobj2->player->cmomy;
mobj2->player->justbumped = bumptime;
// Moved here so it only fires once on bump.
if ((mobj2->player->rings > 0) && (K_GetShieldFromPlayer(mobj2->player) == KSHIELD_NONE))
{
P_PlayerRingBurst(mobj2->player, 1);
}
if (mobj2->player->spinouttimer)
{
mobj2->player->wipeoutslow = wipeoutslowtime+1;
@ -2616,6 +2648,7 @@ static void K_RespawnChecker(player_t *player)
player->mo->colorized = false;
player->dropdash = 0;
player->respawn = 0;
player->softlocktimer = 3*TICRATE;
}
}
}
@ -2712,7 +2745,7 @@ void K_KartMoveAnimation(player_t *player)
gainaxstate = S_GAINAX_MID1;
}
if (destGlanceDir && !(player->pflags & PF_GAINAX))
/*if (destGlanceDir && !(player->pflags & PF_GAINAX))
{
mobj_t *gainax = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_GAINAX);
gainax->movedir = (destGlanceDir < 0) ? (ANGLE_270-ANG10) : (ANGLE_90+ANG10);
@ -2720,7 +2753,7 @@ void K_KartMoveAnimation(player_t *player)
P_SetMobjState(gainax, gainaxstate);
gainax->flags2 |= MF2_AMBUSH;
player->pflags |= PF_GAINAX;
}
}*/
}
else if (player->cmd.forwardmove < 0 && destGlanceDir == 0)
{
@ -2758,47 +2791,33 @@ void K_KartMoveAnimation(player_t *player)
if (onground == false)
{
// Only use certain frames in the air, to make it look like your tires are spinning fruitlessly!
if (drift > 0)
if (turndir == -1)
{
// Neutral drift
SetState(S_KART_DRIFT_L);
SetState(S_KART_FAST_R);
}
else if (drift < 0)
else if (turndir == 1)
{
// Neutral drift
SetState(S_KART_DRIFT_R);
SetState(S_KART_FAST_L);
}
else
{
if (turndir == -1)
switch (player->glanceDir)
{
SetState(S_KART_FAST_R);
}
else if (turndir == 1)
{
SetState(S_KART_FAST_L);
}
else
{
switch (player->glanceDir)
{
case -2:
SetState(S_KART_FAST_LOOK_R);
break;
case 2:
SetState(S_KART_FAST_LOOK_L);
break;
case -1:
SetState(S_KART_FAST_GLANCE_R);
break;
case 1:
SetState(S_KART_FAST_GLANCE_L);
break;
default:
SetState(S_KART_FAST);
break;
}
case -2:
SetState(S_KART_FAST_LOOK_R);
break;
case 2:
SetState(S_KART_FAST_LOOK_L);
break;
case -1:
SetState(S_KART_FAST_GLANCE_R);
break;
case 1:
SetState(S_KART_FAST_GLANCE_L);
break;
default:
SetState(S_KART_FAST);
break;
}
}
@ -3493,19 +3512,19 @@ static inline fixed_t K_GetSneakerBoostSpeed(void)
static fixed_t diminish(fixed_t speedboost)
{
return FixedSqrt(speedboost + CALC_ARG_OFFSET) - CALC_RET_OFFSET;
return FixedSqrt(speedboost + DIMINISHPARAM) - FixedSqrt(DIMINISHPARAM);
}
void K_DoBoost(player_t *player, fixed_t speedboost, fixed_t accelboost, boolean stack, boolean visible)
{
if (stack && stackingactive)
if (stack && K_StackingActive())
{
player->boostinfo.stackspeedboost += speedboost;
}
player->boostinfo.nonstackspeedboost = max(player->boostinfo.nonstackspeedboost, speedboost);
if (cv_kartstacking_accelstack.value && stackingactive)
if (cv_kartstacking_accelstack.value && K_StackingActive())
{
player->boostinfo.accelboost += accelboost;
}
@ -3557,7 +3576,6 @@ static void K_GetKartBoostPower(player_t *player)
fixed_t finalspeedboost = 0;
fixed_t finalaccelboost = 0;
UINT8 finalgrade = 0;
fixed_t prevspeedboost = player->speedboost;
if (player->spinouttimer && player->wipeoutslow == 1) // Slow down after you've been bumped
{
@ -3647,26 +3665,26 @@ static void K_GetKartBoostPower(player_t *player)
finalgrade = player->boostinfo.grade;
// value smoothing
if (stackingactive)
if (K_StackingActive())
{
if (player->offroad && K_ApplyOffroad(player))
{
player->speedboost = max(finalspeedboost, player->speedboost)/2;
player->accelboost = max(finalaccelboost, player->accelboost)/2;
}
else if (finalspeedboost >= prevspeedboost)
else if (K_Sliptiding(player) || (K_GetKartButtons(player) & BT_BRAKE))
{
player->speedboost = max(player->prevspeedboost - SPEEDBOOSTDROPOFF_BRAKE, min(player->speedboost, MAXVANILLABOOST));
player->accelboost = finalaccelboost;
}
else if (finalspeedboost >= player->prevspeedboost)
{
player->speedboost = max(player->speedboost, finalspeedboost);
player->accelboost = max(player->accelboost, finalaccelboost);
}
else if ((player->aizdriftstrat && abs((player->drift) < 5)) || (K_GetKartButtons(player) & BT_BRAKE))
{
player->speedboost = max(prevspeedboost - SPEEDBOOSTDROPOFF_BRAKE, min(player->speedboost, MAXVANILLABOOST));
player->accelboost = finalaccelboost;
}
else
{
player->speedboost = prevspeedboost - SPEEDBOOSTDROPOFF;
player->speedboost = max(player->speedboost + (finalspeedboost - player->speedboost) / (TICRATE/2), player->speedboost - SPEEDBOOSTDROPOFF);
player->accelboost = finalaccelboost;
}
}
@ -3686,6 +3704,7 @@ static void K_GetKartBoostPower(player_t *player)
player->numboosts = finalgrade;
K_ClearBoost(player);
player->prevspeedboost = player->speedboost;
}
// Returns value based on being Grown or Shrunk otherwise returns FRACUNIT
@ -5457,7 +5476,7 @@ static void K_SneakerPanelStackSound(player_t *player)
const sfxenum_t smallsfx = sfx_cdfm40;
sfxenum_t sfx = normalsfx;
if ((player->numsneakers > 0) && stackingactive)
if ((player->numsneakers > 0) && K_StackingActive() && cv_kartstacking_sneakerstacksound.value)
{
// Use a less annoying sound when stacking sneakers.
sfx = smallsfx;
@ -7519,14 +7538,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
}
if (player->sneakertimer)
{
player->sneakertimer = K_ChainOrDeincrementTime(player, player->sneakertimer, 1, false);
if (player->sneakertimer <= 0)
{
player->mo->flags2 &= ~MF2_WATERRUN;
player->numsneakers = 0;
}
if (player->sneakertimer <= 0)
{
player->mo->flags2 &= ~MF2_WATERRUN;
player->numsneakers = 0;
}
if (player->realsneakertimer)
@ -7550,6 +7567,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->checkskip)
player->checkskip--;
if (player->softlocktimer)
player->softlocktimer--;
if (player->bigwaypointgap && (player->bigwaypointgap > AUTORESPAWN_THRESHOLD || !P_PlayerInPain(player)))
{
player->bigwaypointgap--;
@ -7777,7 +7797,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
// If a Grow player or a sector crushes you, get flattened instead of being killed.
if (player->squishedtimer <= 0)
{
player->mo->flags &= ~MF_NOCLIP;
if (!player->noclip)
{
// le no clipping cheat.
player->mo->flags &= ~MF_NOCLIP;
}
}
else
{
@ -7786,6 +7810,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->mo->momy = 0;
}
if (player->noclip)
{
// Might as well make it apply this as well.
player->mo->flags |= MF_NOCLIP;
}
if ((player->mo->eflags & MFE_UNDERWATER) && player->curshield != KSHIELD_BUBBLE)
{
if (player->breathTimer < UINT16_MAX)
@ -8730,44 +8760,166 @@ static void K_FudgeRespawn(player_t *player, const waypoint_t *const waypoint)
void K_SetRespawnAtNextWaypoint(player_t * player)
{
mobj_t *currentwaypoint;
mobj_t *safewaypoint;
waypoint_t *currentwaypoint = NULL;
waypoint_t *safewaypoint = NULL;
angle_t respawnangle;
size_t i;
// Safety :P
if (!player->currentwaypoint || !player->nextwaypoint)
if (K_UsingLegacyCheckpoints())
{
waypoint_t *oopisepoint = K_GetClosestWaypointToMobj(player->mo);
// Woah what are you doing...
return;
}
if ((player != NULL) && (player->mo != NULL) && (P_MobjWasRemoved(player->mo) == false))
{
// Safety :P
if (!player->currentwaypoint || !player->nextwaypoint)
{
waypoint_t *oopisepoint = K_GetBestWaypointForMobj(player->mo, NULL);
if (!oopisepoint || !oopisepoint->mobj)
{
oopisepoint = K_GetClosestWaypointToMobj(player->mo);
}
if ((oopisepoint->nextwaypoints != NULL) && (oopisepoint->numnextwaypoints > 0))
{
for (i = 0; i < oopisepoint->numnextwaypoints; i++)
{
if (!K_GetWaypointIsEnabled(oopisepoint->nextwaypoints[i]))
{
// Waypoint is not enabled.
continue;
}
if (K_GetWaypointIsShortcut(oopisepoint->nextwaypoints[i]))
{
// Respawning into offroad/tripwire path would suck.
continue;
}
if (!K_GetWaypointIsSpawnpoint(oopisepoint->nextwaypoints[i]))
{
// We can't spawn at these anyway.
continue;
}
if (!oopisepoint->nextwaypoints[i]->mobj)
{
// No mobj? No Dice.
continue;
}
if (!K_SafeRespawnPosition(oopisepoint->nextwaypoints[i]->mobj))
{
// This waypoint is not safe.
continue;
}
if (K_GetWaypointIsFinishline(oopisepoint->nextwaypoints[i]))
{
// Please don't spawn over the line.
safewaypoint = oopisepoint->nextwaypoints[i];
break;
}
safewaypoint = oopisepoint->nextwaypoints[i];
break;
}
}
oopisepoint = safewaypoint;
if ((oopisepoint->prevwaypoints != NULL) && (oopisepoint->numprevwaypoints > 0))
{
for (i = 0; i < oopisepoint->numprevwaypoints; i++)
{
if (!K_GetWaypointIsEnabled(oopisepoint->prevwaypoints[i]))
{
// Waypoint is not enabled.
continue;
}
if (K_GetWaypointIsShortcut(oopisepoint->prevwaypoints[i]))
{
// Respawning into offroad/tripwire path would suck.
continue;
}
if (!K_GetWaypointIsSpawnpoint(oopisepoint->prevwaypoints[i]))
{
// We can't spawn at these anyway.
continue;
}
if (!oopisepoint->prevwaypoints[i]->mobj)
{
// No mobj? No Dice.
continue;
}
currentwaypoint = oopisepoint->prevwaypoints[i];
break;
}
}
CONS_Debug(DBG_GAMELOGIC, M_GetText("Tried to respawn at invalid waypoint! Setting respawn to closest waypoint\n"));
}
else
{
currentwaypoint = player->currentwaypoint;
safewaypoint = player->nextwaypoint;
}
// Better safe then sorry.
if (!oopisepoint)
if (!safewaypoint)
{
// Oh shit, oh fuck.....
CONS_Alert(CONS_WARNING, M_GetText("Tried to respawn at invalid waypoint!\n"));
return;
}
currentwaypoint = player->mo;
safewaypoint = oopisepoint->mobj;
CONS_Debug(DBG_GAMELOGIC, M_GetText("Tried to respawn at invalid waypoint! Setting respawn to closest waypoint\n"));
if (!currentwaypoint)
{
respawnangle = R_PointToAngle2(player->mo->x, player->mo->y, safewaypoint->mobj->x, safewaypoint->mobj->y);
}
else
{
respawnangle = R_PointToAngle2(currentwaypoint->mobj->x, currentwaypoint->mobj->y, safewaypoint->mobj->x, safewaypoint->mobj->y);
}
if (currentwaypoint && K_GetWaypointIsFinishline(safewaypoint))
{
// Please don't spawn after the line.
player->pflags |= PF_TRUSTWAYPOINTS;
player->starposttime = player->realtime;
player->starpostz = currentwaypoint->mobj->z >> FRACBITS;
player->starpostflip = (currentwaypoint->mobj->flags2 & MF2_OBJECTFLIP);
player->starpostangle = player->mo->angle;
// Then do x and y
player->starpostx = currentwaypoint->mobj->x >> FRACBITS;
player->starposty = currentwaypoint->mobj->y >> FRACBITS;
return;
}
player->pflags |= PF_TRUSTWAYPOINTS;
player->starposttime = player->realtime;
player->starpostz = safewaypoint->mobj->z >> FRACBITS;
player->starpostflip = (safewaypoint->mobj->flags2 & MF2_OBJECTFLIP);
player->starpostangle = respawnangle;
// Then do x and y
player->starpostx = safewaypoint->mobj->x >> FRACBITS;
player->starposty = safewaypoint->mobj->y >> FRACBITS;
}
else
{
currentwaypoint = player->currentwaypoint->mobj;
safewaypoint = player->nextwaypoint->mobj;
CONS_Alert(CONS_WARNING, M_GetText("Tried to respawn invalid player or player mobj!\n"));
return;
}
respawnangle = R_PointToAngle2(currentwaypoint->x, currentwaypoint->y, safewaypoint->x, safewaypoint->y);
player->pflags |= PF_TRUSTWAYPOINTS;
player->starposttime = player->realtime;
player->starpostz = (safewaypoint->spawnpoint->z + 15) >> FRACBITS;
player->starpostflip = (safewaypoint->flags2 & MF2_OBJECTFLIP);
player->starpostangle = respawnangle;
// Then do x and y
player->starpostx = safewaypoint->x >> FRACBITS;
player->starposty = safewaypoint->y >> FRACBITS;
}
static boolean K_MobjIsOnLine(mobj_t *const mobj)
@ -9894,7 +10046,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->itemflags &= ~IF_USERINGS;
}
if (player && player->mo && player->mo->health > 0 && !player->spectator && !P_PlayerInPain(player) && player->respawn == 0 && !(player->exiting || mapreset) && leveltime > introtime)
if (player && player->mo && player->mo->health > 0 && !player->spectator && !P_PlayerInPain(player) && player->respawn == 0 && !(player->exiting || mapreset))
{
// First, the really specific, finicky items that function without the item being directly in your item slot.
{
@ -9987,10 +10139,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
{
K_DoSneaker(player, SNEAKERTYPE_ROCKETSNEAKER);
K_PlayBoostTaunt(player->mo);
if (player->rocketsneakertimer <= 3*TICRATE)
if (player->rocketsneakertimer <= 2*TICRATE)
player->rocketsneakertimer = 1;
else
player->rocketsneakertimer -= 3*TICRATE;
player->rocketsneakertimer -= 2*TICRATE;
player->botvars.itemconfirm = 0;
}
}

View file

@ -39,8 +39,7 @@ Make sure this matches the actual number of states
// Precalculated constants for stacked boost diminishing
// *Somewhat* matches old calc but doesn't use arrays, which makes it faster and more memory efficent
#define CALC_ARG_OFFSET K_RAGuard(cv_kartstacking_calc_arg_offset)
#define CALC_RET_OFFSET FixedSqrt(CALC_ARG_OFFSET)
#define DIMINISHPARAM K_RAGuard(cv_kartstacking_diminishparam)
#define MAXVANILLABOOST K_RAGuard(cv_kartstacking_maxvanillaboost)
#define SPEEDBOOSTDROPOFF K_RAGuard(cv_kartstacking_speedboostdropoff)
#define SPEEDBOOSTDROPOFF_BRAKE K_RAGuard(cv_kartstacking_speedboostdropoff_brake)

View file

@ -354,7 +354,7 @@ void Command_RTeleport_f(void)
FLOAT_TO_FIXED(x), FLOAT_TO_FIXED(y), FLOAT_TO_FIXED(z));
}
void Command_Teleport_f(void)
void Command_ATeleport_f(void)
{
fixed_t intx, inty, intz;
size_t i;
@ -575,6 +575,25 @@ void Command_Teleport_f(void)
P_MapEnd();
}
void Command_Teleport_f(void)
{
float x = atof(COM_Argv(1));
float y = atof(COM_Argv(2));
float z = atof(COM_Argv(3));
REQUIRE_DEVMODE;
REQUIRE_INLEVEL;
if (COM_Argc() != 4)
{
CONS_Printf(M_GetText("teleport <x> <y> <z>: teleport to a location\n"));
return;
}
D_Cheat(consoleplayer, CHEAT_TELEPORT,
FLOAT_TO_FIXED(x), FLOAT_TO_FIXED(y), FLOAT_TO_FIXED(z));
}
void Command_Skynum_f(void)
{
REQUIRE_DEVMODE;
@ -782,8 +801,6 @@ void Command_Devmode_f(void)
void Command_Setrings_f(void)
{
REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER;
REQUIRE_PANDORA;
D_Cheat(consoleplayer, CHEAT_RINGS, atoi(COM_Argv(1)));
}
@ -791,12 +808,27 @@ void Command_Setrings_f(void)
void Command_Setlives_f(void)
{
REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER;
REQUIRE_PANDORA;
D_Cheat(consoleplayer, CHEAT_LIVES, atoi(COM_Argv(1)));
}
void Command_Setscore_f(void)
{
REQUIRE_INLEVEL;
D_Cheat(consoleplayer, CHEAT_SCORE, atoi(COM_Argv(1)));
}
void Command_Angle_f(void)
{
const float anglef = atof(COM_Argv(1));
const angle_t angle = FixedAngle(FLOAT_TO_FIXED(anglef));
REQUIRE_INLEVEL;
D_Cheat(consoleplayer, CHEAT_ANGLE, angle);
}
//
// OBJECTPLACE (and related variables)
//

View file

@ -33,7 +33,11 @@ typedef enum {
CHEAT_FLIP,
CHEAT_HURT,
CHEAT_RELATIVE_TELEPORT,
CHEAT_TELEPORT,
CHEAT_DEVMODE,
CHEAT_GIVEITEM,
CHEAT_SCORE,
CHEAT_ANGLE,
NUMBER_OF_CHEATS
} cheat_t;
@ -76,8 +80,11 @@ void Command_Gravflip_f(void);
void Command_Hurtme_f(void);
void Command_Teleport_f(void);
void Command_RTeleport_f(void);
void Command_ATeleport_f(void);
void Command_Skynum_f(void);
void Command_Weather_f(void);
void Command_Angle_f(void);
void Command_Setscore_f(void);
#ifdef _DEBUG
void Command_CauseCfail_f(void);
#endif

View file

@ -368,6 +368,8 @@ consvar_t cv_dummygpdifficulty = CVAR_INIT ("dummygpdifficulty", "Normal", CV_HI
consvar_t cv_dummygpencore = CVAR_INIT ("dummygpencore", "Off", CV_HIDEN, CV_OnOff, NULL);
consvar_t cv_dummygpcup = CVAR_INIT ("dummygpcup", "TEMP", CV_HIDEN, dummygpcup_cons_t, NULL);
consvar_t cv_menucaps = CVAR_INIT ("menucaps", "Off", CV_SAVE, CV_OnOff, NULL);
static tic_t playback_last_menu_interaction_leveltime = 0;
// ==========================================================================
@ -1884,6 +1886,7 @@ void M_Init(void)
quitmsg[QUIT3MSG6] = M_GetText("Aww, is Eggman's Nightclub too\ndifficult for you?\n\n(Press 'Y' to quit)");
CV_RegisterVar(&cv_serversort);
CV_RegisterVar(&cv_menucaps);
}
void M_InitCharacterTables(void)
@ -2053,8 +2056,8 @@ static void M_CentreText(INT32 y, const char *string)
{
INT32 x;
//added : 02-02-98 : centre on 320, because V_DrawString centers on vid.width...
x = (BASEVIDWIDTH - V_StringWidth(string, V_OLDSPACING))>>1;
V_DrawString(x,y,V_OLDSPACING,string);
x = (BASEVIDWIDTH - V_StringWidth(string, MENUCAPS|V_OLDSPACING))>>1;
V_DrawString(x,y, MENUCAPS|V_OLDSPACING,string);
}
//
@ -2177,9 +2180,9 @@ void M_DrawGenericMenu(void)
cursory = y;
if ((currentMenu->menuitems[i].status & IT_DISPLAY)==IT_STRING)
V_DrawString(x, y, 0, currentMenu->menuitems[i].text);
V_DrawString(x, y, MENUCAPS, currentMenu->menuitems[i].text);
else
V_DrawString(x, y, highlightflags, currentMenu->menuitems[i].text);
V_DrawString(x, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].text);
// Cvar specific handling
switch (currentMenu->menuitems[i].status & IT_TYPE)
@ -2204,7 +2207,7 @@ void M_DrawGenericMenu(void)
default:
w = V_StringWidth(cv->string, 0);
V_DrawString(BASEVIDWIDTH - x - w, y,
((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags), cv->string);
((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags)| MENUCAPS, cv->string);
if (i == itemOn)
{
V_DrawCharacter(BASEVIDWIDTH - x - 10 - w - (skullAnimCounter/5), y,
@ -2219,7 +2222,7 @@ void M_DrawGenericMenu(void)
y += STRINGHEIGHT;
break;
case IT_STRING2:
V_DrawString(x, y, 0, currentMenu->menuitems[i].text);
V_DrawString(x, y, MENUCAPS, currentMenu->menuitems[i].text);
/* FALLTHRU */
case IT_DYLITLSPACE:
y += SMALLLINEHEIGHT;
@ -2235,21 +2238,21 @@ void M_DrawGenericMenu(void)
y = currentMenu->y+currentMenu->menuitems[i].alphaKey;
/* FALLTHRU */
case IT_TRANSTEXT2:
V_DrawString(x, y, V_TRANSLUCENT, currentMenu->menuitems[i].text);
V_DrawString(x, y, MENUCAPS|V_TRANSLUCENT, currentMenu->menuitems[i].text);
y += SMALLLINEHEIGHT;
break;
case IT_QUESTIONMARKS:
if (currentMenu->menuitems[i].alphaKey)
y = currentMenu->y+currentMenu->menuitems[i].alphaKey;
V_DrawString(x, y, V_TRANSLUCENT|V_OLDSPACING, M_CreateSecretMenuOption(currentMenu->menuitems[i].text));
V_DrawString(x, y, MENUCAPS|V_TRANSLUCENT|V_OLDSPACING, M_CreateSecretMenuOption(currentMenu->menuitems[i].text));
y += SMALLLINEHEIGHT;
break;
case IT_HEADERTEXT: // draws 16 pixels to the left, in yellow text
if (currentMenu->menuitems[i].alphaKey)
y = currentMenu->y+currentMenu->menuitems[i].alphaKey;
V_DrawString(x-16, y, highlightflags, currentMenu->menuitems[i].text);
V_DrawString(x-16, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].text);
y += SMALLLINEHEIGHT;
break;
}
@ -2266,10 +2269,158 @@ void M_DrawGenericMenu(void)
{
V_DrawScaledPatch(currentMenu->x - 24, cursory, 0,
W_CachePatchName("M_CURSOR", PU_CACHE));
V_DrawString(currentMenu->x, cursory, highlightflags, currentMenu->menuitems[itemOn].text);
V_DrawString(currentMenu->x, cursory, MENUCAPS|highlightflags, currentMenu->menuitems[itemOn].text);
}
}
#define scrollareaheight 72
// note that alphakey is multiplied by 2 for scrolling menus to allow greater usage in UINT8 range.
void M_DrawGenericScrollMenu(void)
{
INT32 x, y, i, max, bottom, tempcentery, cursory = 0;
// DRAW MENU
x = currentMenu->x;
y = currentMenu->y;
if (currentMenu->menuitems[currentMenu->numitems-1].alphaKey < scrollareaheight)
tempcentery = currentMenu->y; // Not tall enough to scroll, but this thinker is used in case it becomes so
else if ((currentMenu->menuitems[itemOn].alphaKey*2 - currentMenu->menuitems[0].alphaKey*2) <= scrollareaheight)
tempcentery = currentMenu->y - currentMenu->menuitems[0].alphaKey*2;
else if ((currentMenu->menuitems[currentMenu->numitems-1].alphaKey*2 - currentMenu->menuitems[itemOn].alphaKey*2) <= scrollareaheight)
tempcentery = currentMenu->y - currentMenu->menuitems[currentMenu->numitems-1].alphaKey*2 + 2*scrollareaheight;
else
tempcentery = currentMenu->y - currentMenu->menuitems[itemOn].alphaKey*2 + scrollareaheight;
for (i = 0; i < currentMenu->numitems; i++)
{
if (currentMenu->menuitems[i].status != IT_DISABLED && currentMenu->menuitems[i].alphaKey*2 + tempcentery >= currentMenu->y)
break;
}
for (bottom = currentMenu->numitems; bottom > 0; bottom--)
{
if (currentMenu->menuitems[bottom-1].status != IT_DISABLED)
break;
}
for (max = bottom; max > 0; max--)
{
if (currentMenu->menuitems[max-1].status != IT_DISABLED && currentMenu->menuitems[max-1].alphaKey*2 + tempcentery <= (currentMenu->y + 2*scrollareaheight))
break;
}
if (i)
V_DrawString(currentMenu->x - 20, currentMenu->y - (skullAnimCounter/5), highlightflags, "\x1A"); // up arrow
if (max != bottom)
V_DrawString(currentMenu->x - 20, currentMenu->y + 2*scrollareaheight + (skullAnimCounter/5), highlightflags, "\x1B"); // down arrow
// draw title (or big pic)
M_DrawMenuTitle();
for (; i < max; i++)
{
y = currentMenu->menuitems[i].alphaKey*2 + tempcentery;
if (i == itemOn)
cursory = y;
switch (currentMenu->menuitems[i].status & IT_DISPLAY)
{
case IT_PATCH:
case IT_DYBIGSPACE:
case IT_BIGSLIDER:
case IT_STRING2:
case IT_DYLITLSPACE:
case IT_GRAYPATCH:
case IT_TRANSTEXT2:
// unsupported
break;
case IT_NOTHING:
break;
case IT_STRING:
case IT_WHITESTRING:
if (i != itemOn && (currentMenu->menuitems[i].status & IT_DISPLAY)==IT_STRING)
V_DrawString(x, y, MENUCAPS, currentMenu->menuitems[i].text);
else
V_DrawString(x, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].text);
// Cvar specific handling
switch (currentMenu->menuitems[i].status & IT_TYPE)
case IT_CVAR:
{
consvar_t *cv = currentMenu->menuitems[i].itemaction.cvar;
switch (currentMenu->menuitems[i].status & IT_CVARTYPE)
{
case IT_CV_SLIDER:
M_DrawSlider(x, y, cv, (i == itemOn));
case IT_CV_NOPRINT: // color use this
case IT_CV_INVISSLIDER: // monitor toggles use this
break;
case IT_CV_STRING:
#if 1
if (y + 12 > (currentMenu->y + 2*scrollareaheight))
break;
M_DrawTextBox(x, y + 4, MAXSTRINGLENGTH, 1);
V_DrawString(x + 8, y + 12, V_ALLOWLOWERCASE, cv->string);
if (skullAnimCounter < 4 && i == itemOn)
V_DrawCharacter(x + 8 + V_StringWidth(cv->string, 0), y + 12,
'_' | 0x80, false);
#else // cool new string type stuff, not ready for limelight
if (i == itemOn)
{
V_DrawFill(x-2, y-1, MAXSTRINGLENGTH*8 + 4, 8+3, 159);
V_DrawString(x, y, V_ALLOWLOWERCASE, cv->string);
if (skullAnimCounter < 4)
V_DrawCharacter(x + V_StringWidth(cv->string, 0), y, '_' | 0x80, false);
}
else
V_DrawRightAlignedString(BASEVIDWIDTH - x, y,
highlightflags|V_ALLOWLOWERCASE, cv->string);
#endif
break;
default:
V_DrawRightAlignedString(BASEVIDWIDTH - x, y,
((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags)|MENUCAPS, cv->string);
if (i == itemOn)
{
V_DrawCharacter(BASEVIDWIDTH - x - 10 - V_StringWidth(cv->string, 0) - (skullAnimCounter/5), y,
'\x1C' | highlightflags, false);
V_DrawCharacter(BASEVIDWIDTH - x + 2 + (skullAnimCounter/5), y,
'\x1D' | highlightflags, false);
}
break;
}
break;
}
break;
case IT_TRANSTEXT:
switch (currentMenu->menuitems[i].status & IT_TYPE)
{
case IT_PAIR:
V_DrawString(x, y,
MENUCAPS|V_TRANSLUCENT, currentMenu->menuitems[i].patch);
V_DrawRightAlignedString(BASEVIDWIDTH - x, y,
V_TRANSLUCENT, currentMenu->menuitems[i].text);
break;
default:
V_DrawString(x, y,
MENUCAPS|V_TRANSLUCENT, currentMenu->menuitems[i].text);
}
break;
case IT_QUESTIONMARKS:
V_DrawString(x, y, MENUCAPS|V_TRANSLUCENT|V_OLDSPACING, M_CreateSecretMenuOption(currentMenu->menuitems[i].text));
break;
case IT_HEADERTEXT:
V_DrawString(x-16, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].text);
break;
}
}
// DRAW THE SKULL CURSOR
V_DrawScaledPatch(currentMenu->x - 24, cursory, 0,
W_CachePatchName("M_CURSOR", PU_PATCH));
}
void M_DrawPauseMenu(void)
{
#ifdef HAVE_DISCORDRPC
@ -2343,9 +2494,9 @@ void M_DrawCenteredMenu(void)
cursory = y;
if ((currentMenu->menuitems[i].status & IT_DISPLAY)==IT_STRING)
V_DrawCenteredString(x, y, 0, currentMenu->menuitems[i].text);
V_DrawCenteredString(x, y, MENUCAPS, currentMenu->menuitems[i].text);
else
V_DrawCenteredString(x, y, highlightflags, currentMenu->menuitems[i].text);
V_DrawCenteredString(x, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].text);
// Cvar specific handling
switch(currentMenu->menuitems[i].status & IT_TYPE)
@ -2367,8 +2518,8 @@ void M_DrawCenteredMenu(void)
y += 16;
break;
default:
V_DrawString(BASEVIDWIDTH - x - V_StringWidth(cv->string, 0), y,
((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags), cv->string);
V_DrawString(BASEVIDWIDTH - x - V_StringWidth(cv->string, MENUCAPS), y,
((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags)|MENUCAPS, cv->string);
break;
}
break;
@ -2376,7 +2527,7 @@ void M_DrawCenteredMenu(void)
y += STRINGHEIGHT;
break;
case IT_STRING2:
V_DrawCenteredString(x, y, 0, currentMenu->menuitems[i].text);
V_DrawCenteredString(x, y, MENUCAPS, currentMenu->menuitems[i].text);
/* FALLTHRU */
case IT_DYLITLSPACE:
y += SMALLLINEHEIGHT;
@ -2385,7 +2536,7 @@ void M_DrawCenteredMenu(void)
if (currentMenu->menuitems[i].alphaKey)
y = currentMenu->y+currentMenu->menuitems[i].alphaKey;
V_DrawCenteredString(x, y, V_TRANSLUCENT|V_OLDSPACING, M_CreateSecretMenuOption(currentMenu->menuitems[i].text));
V_DrawCenteredString(x, y, MENUCAPS|V_TRANSLUCENT|V_OLDSPACING, M_CreateSecretMenuOption(currentMenu->menuitems[i].text));
y += SMALLLINEHEIGHT;
break;
case IT_GRAYPATCH:
@ -2399,7 +2550,7 @@ void M_DrawCenteredMenu(void)
y = currentMenu->y+currentMenu->menuitems[i].alphaKey;
/* FALLTHRU */
case IT_TRANSTEXT2:
V_DrawCenteredString(x, y, V_TRANSLUCENT, currentMenu->menuitems[i].text);
V_DrawCenteredString(x, y, MENUCAPS|V_TRANSLUCENT, currentMenu->menuitems[i].text);
y += SMALLLINEHEIGHT;
break;
}
@ -2416,14 +2567,14 @@ void M_DrawCenteredMenu(void)
{
V_DrawScaledPatch(x - V_StringWidth(currentMenu->menuitems[itemOn].text, 0)/2 - 24, cursory, 0,
W_CachePatchName("M_CURSOR", PU_CACHE));
V_DrawCenteredString(x, cursory, highlightflags, currentMenu->menuitems[itemOn].text);
V_DrawCenteredString(x, cursory, MENUCAPS|highlightflags, currentMenu->menuitems[itemOn].text);
}
if (menustack[0] == MN_MAIN)
{
INT32 texty = vid.height - 10*vid.dupy;
#define addtext(f, str) {\
V_DrawThinString(vid.dupx, texty, V_NOSCALESTART|f, str);\
V_DrawThinString(vid.dupx, texty, MENUCAPS|V_NOSCALESTART|f, str);\
texty -= 10*vid.dupy;\
}
if (customversionstring[0] != '\0')
@ -2821,19 +2972,19 @@ void M_DrawImageDef(void)
if (currentMenu->menuitems[itemOn].alphaKey)
{
V_DrawString(2,BASEVIDHEIGHT-10, V_YELLOWMAP, va("%d", (itemOn<<1)-1)); // intentionally not highlightflags, unlike below
V_DrawRightAlignedString(BASEVIDWIDTH-2,BASEVIDHEIGHT-10, V_YELLOWMAP, va("%d", itemOn<<1)); // ditto
V_DrawString(2,BASEVIDHEIGHT-10, MENUCAPS|V_YELLOWMAP, va("%d", (itemOn<<1)-1)); // intentionally not highlightflags, unlike below
V_DrawRightAlignedString(BASEVIDWIDTH-2,BASEVIDHEIGHT-10, MENUCAPS|V_YELLOWMAP, va("%d", itemOn<<1)); // ditto
}
else
{
INT32 x = BASEVIDWIDTH>>1, y = (BASEVIDHEIGHT>>1) - 4;
x += (itemOn ? 1 : -1)*((BASEVIDWIDTH>>2) + 10);
V_DrawCenteredString(x, y-10, highlightflags, "USE ARROW KEYS");
V_DrawCenteredString(x, y-10, MENUCAPS|highlightflags, "Use arrow keys");
V_DrawCharacter(x - 10 - (skullAnimCounter/5), y,
'\x1C' | highlightflags, false); // left arrow
V_DrawCharacter(x + 2 + (skullAnimCounter/5), y,
'\x1D' | highlightflags, false); // right arrow
V_DrawCenteredString(x, y+10, highlightflags, "TO LEAF THROUGH");
V_DrawCenteredString(x, y+10, MENUCAPS|highlightflags, "to leaf through");
}
}
@ -3107,9 +3258,9 @@ void M_DrawAddons(void)
}
if (Playing())
V_DrawCenteredString(BASEVIDWIDTH/2, 5, warningflags, "Adding files mid-game may cause problems.");
V_DrawCenteredString(BASEVIDWIDTH/2, 5, MENUCAPS|warningflags, "Adding files mid-game may cause problems.");
else
V_DrawCenteredString(BASEVIDWIDTH/2, 5, 0, (recommendedflags == V_SKYMAP ? LOCATIONSTRING2 : LOCATIONSTRING1));
V_DrawCenteredString(BASEVIDWIDTH/2, 5, MENUCAPS, (recommendedflags == V_SKYMAP ? LOCATIONSTRING2 : LOCATIONSTRING1));
if (numwadfiles <= NUMMAINWADS)
y = 0;
@ -3130,7 +3281,7 @@ void M_DrawAddons(void)
hilicol = V_GetStringColormap(highlightflags)[0];
V_DrawString(x-21, (y - 16) + (lsheadingheight - 12), highlightflags|V_ALLOWLOWERCASE, M_AddonsHeaderPath());
V_DrawString(x-21, (y - 16) + (lsheadingheight - 12), MENUCAPS|highlightflags|V_ALLOWLOWERCASE, M_AddonsHeaderPath());
V_DrawFill(x-21, (y - 16) + (lsheadingheight - 3), MAXSTRINGLENGTH*8+6, 1, hilicol);
V_DrawFill(x-21, (y - 16) + (lsheadingheight - 2), MAXSTRINGLENGTH*8+6, 1, 30);
@ -3169,7 +3320,7 @@ void M_DrawAddons(void)
i = m - (2*numaddonsshown + 1);
if (i != 0)
V_DrawString(19, y+4 - (skullAnimCounter/5), highlightflags, "\x1A");
V_DrawString(19, y+4 - (skullAnimCounter/5), MENUCAPS|highlightflags, "\x1A");
if (skullAnimCounter < 4)
flashcol = V_GetStringColormap(highlightflags);
@ -3208,7 +3359,7 @@ void M_DrawAddons(void)
}
if (m != (ssize_t)sizedirmenu)
V_DrawString(19, y-12 + (skullAnimCounter/5), highlightflags, "\x1B");
V_DrawString(19, y-12 + (skullAnimCounter/5), MENUCAPS|highlightflags, "\x1B");
y = BASEVIDHEIGHT - currentMenu->y + 1;
@ -3620,11 +3771,11 @@ static void DrawReplayHutReplayInfo(void)
switch (demolist[dir_on[menudepthleft]].type)
{
case MD_NOTLOADED:
V_DrawCenteredString(160, 40, V_SNAPTOTOP, "Loading replay information...");
V_DrawCenteredString(160, 40, MENUCAPS|V_SNAPTOTOP, "Loading replay information...");
break;
case MD_INVALID:
V_DrawCenteredString(160, 40, V_SNAPTOTOP|warningflags, "This replay cannot be played.");
V_DrawCenteredString(160, 40, MENUCAPS|V_SNAPTOTOP|warningflags, "This replay cannot be played.");
break;
case MD_SUBDIR:
@ -3661,7 +3812,7 @@ static void DrawReplayHutReplayInfo(void)
x += 85;
if (demolist[dir_on[menudepthleft]].map != NEXTMAP_INVALID)
V_DrawString(x, y, V_SNAPTOTOP, G_BuildMapTitle(demolist[dir_on[menudepthleft]].map+1));
V_DrawString(x, y, MENUCAPS|V_SNAPTOTOP, G_BuildMapTitle(demolist[dir_on[menudepthleft]].map+1));
else
V_DrawString(x, y, V_SNAPTOTOP|V_ALLOWLOWERCASE|V_TRANSLUCENT, "Level is not loaded.");
@ -3681,12 +3832,12 @@ static void DrawReplayHutReplayInfo(void)
break;
}
V_DrawThinString(x, y+29, V_SNAPTOTOP|highlightflags, "WINNER");
V_DrawThinString(x, y+29, MENUCAPS|V_SNAPTOTOP|highlightflags, "Winner");
V_DrawString(x+38, y+30, V_SNAPTOTOP|V_ALLOWLOWERCASE, demolist[dir_on[menudepthleft]].standings[0].name);
if (demolist[dir_on[menudepthleft]].gametype == GT_RACE)
{
V_DrawThinString(x, y+39, V_SNAPTOTOP|highlightflags, "TIME");
V_DrawThinString(x, y+39, MENUCAPS|V_SNAPTOTOP|highlightflags, "Time");
V_DrawRightAlignedString(x+84, y+40, V_SNAPTOTOP, va("%d'%02d\"%02d",
G_TicsToMinutes(demolist[dir_on[menudepthleft]].standings[0].timeorscore, true),
G_TicsToSeconds(demolist[dir_on[menudepthleft]].standings[0].timeorscore),
@ -3695,7 +3846,7 @@ static void DrawReplayHutReplayInfo(void)
}
else
{
V_DrawThinString(x, y+39, V_SNAPTOTOP|highlightflags, "SCORE");
V_DrawThinString(x, y+39, MENUCAPS|V_SNAPTOTOP|highlightflags, "Score");
V_DrawString(x+32, y+40, V_SNAPTOTOP, va("%d", demolist[dir_on[menudepthleft]].standings[0].timeorscore));
}
@ -3787,9 +3938,9 @@ void M_DrawReplayHut(void)
cursory = localy;
if ((currentMenu->menuitems[i].status & IT_DISPLAY)==IT_STRING)
V_DrawString(x, localy, V_SNAPTOTOP|V_SNAPTOLEFT, currentMenu->menuitems[i].text);
V_DrawString(x, localy, MENUCAPS|V_SNAPTOTOP|V_SNAPTOLEFT, currentMenu->menuitems[i].text);
else
V_DrawString(x, localy, V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[i].text);
V_DrawString(x, localy, MENUCAPS|V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[i].text);
}
y += currentMenu->menuitems[replaylistitem].alphaKey;
@ -3860,7 +4011,7 @@ void M_DrawReplayHut(void)
// Draw the cursor
V_DrawScaledPatch(currentMenu->x - 24, cursory, V_SNAPTOTOP|V_SNAPTOLEFT,
W_CachePatchName("M_CURSOR", PU_CACHE));
V_DrawString(currentMenu->x, cursory, V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[itemOn].text);
V_DrawString(currentMenu->x, cursory, MENUCAPS|V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[itemOn].text);
// Now draw some replay info!
V_DrawFill(10, 10, 300, 60, V_SNAPTOTOP|159);
@ -3885,11 +4036,11 @@ void M_DrawReplayStartMenu(void)
patch_t *patch;
UINT8 *colormap;
V_DrawRightAlignedString(BASEVIDWIDTH-100, STARTY + i*20, V_SNAPTOTOP|highlightflags, va("%2d", demolist[dir_on[menudepthleft]].standings[i].ranking));
V_DrawRightAlignedString(BASEVIDWIDTH-100, STARTY + i*20, MENUCAPS|V_SNAPTOTOP|highlightflags, va("%2d", demolist[dir_on[menudepthleft]].standings[i].ranking));
V_DrawThinString(BASEVIDWIDTH-96, STARTY + i*20, V_SNAPTOTOP|V_ALLOWLOWERCASE, demolist[dir_on[menudepthleft]].standings[i].name);
if (demolist[dir_on[menudepthleft]].standings[i].timeorscore == UINT32_MAX-1)
V_DrawThinString(BASEVIDWIDTH-92, STARTY + i*20 + 9, V_SNAPTOTOP, "NO CONTEST");
V_DrawThinString(BASEVIDWIDTH-92, STARTY + i*20 + 9, MENUCAPS|V_SNAPTOTOP, "No Contest");
else if (demolist[dir_on[menudepthleft]].gametype == GT_RACE)
V_DrawRightAlignedString(BASEVIDWIDTH-40, STARTY + i*20 + 9, V_SNAPTOTOP, va("%d'%02d\"%02d",
G_TicsToMinutes(demolist[dir_on[menudepthleft]].standings[i].timeorscore, true),
@ -4583,7 +4734,7 @@ void M_DrawChecklist(void)
++line;
secretname = M_CreateSecretMenuOption(unlockables[i].name);
V_DrawString(8, (line*8), (unlockables[i].unlocked ? recommendedflags : warningflags), (secret ? secretname : unlockables[i].name));
V_DrawString(8, (line*8), (unlockables[i].unlocked ? recommendedflags : warningflags)|MENUCAPS, (secret ? secretname : unlockables[i].name));
if (conditionSets[unlockables[i].conditionset - 1].numconditions)
{
@ -4677,7 +4828,7 @@ void M_DrawEmblemHints(void)
break;
}
if (!j)
V_DrawCenteredString(160, 48, highlightflags, "No hidden medals on this map.");
V_DrawCenteredString(160, 48, MENUCAPS|highlightflags, "No hidden medals on this map.");
M_DrawGenericMenu();
}
@ -4720,9 +4871,9 @@ void M_DrawSkyRoom(void)
{
y += currentMenu->y;
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, y, highlightflags, cv_soundtest.string);
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, y, MENUCAPS|highlightflags, cv_soundtest.string);
if (cv_soundtest.value)
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, y + 8, highlightflags, S_sfx[cv_soundtest.value].name);
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, y + 8, MENUCAPS|highlightflags, S_sfx[cv_soundtest.value].name);
if (i == itemOn)
lengthstring = V_StringWidth(cv_soundtest.string, 0);
@ -5226,15 +5377,15 @@ static void M_DrawStatsMaps(void)
besttime += mapheaderinfo[j]->mainrecord[preset]->time;
}
V_DrawString(20, 42, highlightflags, "Combined time records:");
V_DrawString(20, 42, MENUCAPS|highlightflags, "Combined time records:");
sprintf(beststr, "%i:%02i:%02i.%02i", G_TicsToHours(besttime), G_TicsToMinutes(besttime, false), G_TicsToSeconds(besttime), G_TicsToCentiseconds(besttime));
V_DrawRightAlignedString(BASEVIDWIDTH-16, 42, (mapsunfinished ? warningflags : 0), beststr);
if (mapsunfinished)
V_DrawRightAlignedString(BASEVIDWIDTH-16, 50, warningflags, va("(%d unfinished)", mapsunfinished));
V_DrawRightAlignedString(BASEVIDWIDTH-16, 50, MENUCAPS|warningflags, va("(%d unfinished)", mapsunfinished));
else
V_DrawRightAlignedString(BASEVIDWIDTH-16, 50, recommendedflags, "(complete)");
V_DrawRightAlignedString(BASEVIDWIDTH-16, 50, MENUCAPS|recommendedflags, "(complete)");
V_DrawString(32, 50, 0, va("x %d/%d", M_CountEmblems(), numemblems+numextraemblems));
V_DrawSmallScaledPatch(20, 50, 0, W_CachePatchName("GOTITA", PU_STATIC));
@ -5252,8 +5403,8 @@ static void M_DrawStatsMaps(void)
}
else if (dotopname)
{
V_DrawString(20, y, highlightflags, "LEVEL NAME");
V_DrawString(256, y, highlightflags, "MEDALS");
V_DrawString(20, y, MENUCAPS|highlightflags, "Level Name");
V_DrawString(256, y, MENUCAPS|highlightflags, "Medals");
y += 8;
dotopname = false;
}
@ -5262,11 +5413,11 @@ static void M_DrawStatsMaps(void)
M_DrawMapEmblems(mnum+1, 295, y);
if (mapheaderinfo[mnum]->levelflags & LF_NOZONE)
V_DrawString(20, y, 0, va("%s %s",
V_DrawString(20, y, MENUCAPS, va("%s %s",
mapheaderinfo[mnum]->lvlttl,
mapheaderinfo[mnum]->actnum));
else
V_DrawString(20, y, 0, va("%s %s %s",
V_DrawString(20, y, MENUCAPS, va("%s %s %s",
mapheaderinfo[mnum]->lvlttl,
(mapheaderinfo[mnum]->zonttl[0] ? mapheaderinfo[mnum]->zonttl : "Zone"),
mapheaderinfo[mnum]->actnum));
@ -5278,8 +5429,8 @@ static void M_DrawStatsMaps(void)
}
if (dotopname && !location)
{
V_DrawString(20, y, highlightflags, "LEVEL NAME");
V_DrawString(256, y, highlightflags, "MEDALS");
V_DrawString(20, y, MENUCAPS|highlightflags, "Level Name");
V_DrawString(256, y, MENUCAPS|highlightflags, "Medals");
y += 8;
}
else if (location)
@ -5329,31 +5480,31 @@ bottomarrow:
#define DRAWTIMESTAT(y, title, field) { \
char timebuf[80]; \
V_DrawString(20, (y), highlightflags, title); \
V_DrawString(20, (y), MENUCAPS|highlightflags, title); \
tic_t timeval = kartstats.field; \
snprintf(timebuf, 80, "%02i:%02i:%02i", G_TicsToHours(timeval), G_TicsToMinutes(timeval, false), G_TicsToSeconds(timeval)); \
V_DrawRightAlignedString(BASEVIDWIDTH-16, (y), 0, timebuf); \
V_DrawRightAlignedString(BASEVIDWIDTH-16, (y), MENUCAPS, timebuf); \
}
#define DRAWAMOUNTSTAT(y, title, field) { \
V_DrawString(20, (y), highlightflags, title); \
unsigned amountval = kartstats.field; \
V_DrawRightAlignedString(BASEVIDWIDTH-16, (y), 0, va("%u", amountval)); \
V_DrawRightAlignedString(BASEVIDWIDTH-16, (y), MENUCAPS, va("%u", amountval)); \
}
static void M_DrawStatsPlaytime(void)
{
V_DrawString(20, 42, highlightflags, "Total Play Time:");
V_DrawCenteredString(BASEVIDWIDTH/2, 52, 0, va("%i hours, %i minutes, %i seconds",
V_DrawString(20, 42, MENUCAPS|highlightflags, "Total Play Time:");
V_DrawCenteredString(BASEVIDWIDTH/2, 52, MENUCAPS, va("%i hours, %i minutes, %i seconds",
G_TicsToHours(kartstats.totalplaytime),
G_TicsToMinutes(kartstats.totalplaytime, false),
G_TicsToSeconds(kartstats.totalplaytime)));
V_DrawString(20, 62, highlightflags, "Total Matches:");
V_DrawRightAlignedString(BASEVIDWIDTH-16, 62, 0, va("%i played", kartstats.matchesplayed));
V_DrawString(20, 62, MENUCAPS|highlightflags, "Total Matches:");
V_DrawRightAlignedString(BASEVIDWIDTH-16, 62, MENUCAPS, va("%i played", kartstats.matchesplayed));
V_DrawString(20, 82, highlightflags, "Online Power Level:");
V_DrawRightAlignedString(BASEVIDWIDTH-16, 92, 0, va("Race: %i", vspowerlevel[PWRLV_RACE]));
V_DrawRightAlignedString(BASEVIDWIDTH-16, 102, 0, va("Battle: %i", vspowerlevel[PWRLV_BATTLE]));
V_DrawString(20, 82, MENUCAPS|highlightflags, "Online Power Level:");
V_DrawRightAlignedString(BASEVIDWIDTH-16, 92, MENUCAPS, va("Race: %i", vspowerlevel[PWRLV_RACE]));
V_DrawRightAlignedString(BASEVIDWIDTH-16, 102, MENUCAPS, va("Battle: %i", vspowerlevel[PWRLV_BATTLE]));
// Nothing else to draw
if (kartstats.vanilla)
@ -5390,7 +5541,7 @@ void M_DrawLevelStats(void)
{
M_DrawMenuTitle();
V_DrawCenteredString(BASEVIDWIDTH/2, 28, highlightflags, statsPages[statsCurrentPage].title);
V_DrawCenteredString(BASEVIDWIDTH/2, 28, MENUCAPS|highlightflags, statsPages[statsCurrentPage].title);
INT32 w = V_StringWidth(statsPages[statsCurrentPage].title, highlightflags);
V_DrawCharacter(BASEVIDWIDTH/2 - w/2 - 10 - (skullAnimCounter/5), 28,
@ -5550,7 +5701,7 @@ static void M_DrawTimeAttackBackground(menuitem_t *item)
INT16 x = currentMenu->x;
INT16 y = currentMenu->y+item->alphaKey;
consvar_t *ncv = item->itemaction.cvar;
V_DrawString(x, y, V_TRANSLUCENT, item->text);
V_DrawString(x, y, MENUCAPS|V_TRANSLUCENT, item->text);
if (item->status & IT_CV_STRING)
{
M_DrawTextBox(x + 32, y - 8, MAXPLAYERNAME, 1);
@ -5566,7 +5717,7 @@ static void M_DrawTimeAttackBackground(menuitem_t *item)
soffset = 0;
// Should see nothing but strings
V_DrawString(BASEVIDWIDTH - x - soffset - strw, y, highlightflags|V_TRANSLUCENT, str);
V_DrawString(BASEVIDWIDTH - x - soffset - strw, y, MENUCAPS|highlightflags|V_TRANSLUCENT, str);
}
}
@ -5604,7 +5755,7 @@ void M_DrawTimeAttackMenu(void)
if (i == itemOn)
cursory = y;
V_DrawString(x, y, (dispstatus == IT_WHITESTRING) ? highlightflags : 0 , currentMenu->menuitems[i].text);
V_DrawString(x, y, ((dispstatus == IT_WHITESTRING) ? highlightflags : 0) | MENUCAPS, currentMenu->menuitems[i].text);
// Cvar specific handling
if ((currentMenu->menuitems[i].status & IT_TYPE) == IT_CVAR)
@ -5627,7 +5778,7 @@ void M_DrawTimeAttackMenu(void)
soffset = 0;
// Should see nothing but strings
V_DrawString(BASEVIDWIDTH - x - soffset - strw, y, highlightflags, str);
V_DrawString(BASEVIDWIDTH - x - soffset - strw, y, MENUCAPS|highlightflags, str);
if (i == itemOn)
{
@ -5657,7 +5808,7 @@ void M_DrawTimeAttackMenu(void)
// DRAW THE SKULL CURSOR
V_DrawScaledPatch(x - 24, cursory, 0, W_CachePatchName("M_CURSOR", PU_CACHE));
V_DrawString(x, cursory, highlightflags, currentMenu->menuitems[itemOn].text);
V_DrawString(x, cursory, MENUCAPS|highlightflags, currentMenu->menuitems[itemOn].text);
// Level record list
if (cv_nextmap.value)
@ -5674,11 +5825,11 @@ void M_DrawTimeAttackMenu(void)
if (levellistmode != LLM_ITEMBREAKER)
{
V_DrawRightAlignedString(149, 80, highlightflags, "BEST LAP:");
V_DrawRightAlignedString(149, 80, MENUCAPS|highlightflags, "Best Lap:");
K_drawKartTimestamp(lap, 19, 86, -1, 2);
}
V_DrawRightAlignedString(292, 80, highlightflags, "BEST TIME:");
V_DrawRightAlignedString(292, 80, MENUCAPS|highlightflags, "Best Time:");
K_drawKartTimestamp(time, 162, 86, cv_nextmap.value-1, 1);
}
@ -5702,7 +5853,7 @@ void M_DrawTimeAttackMenu(void)
mode = "Custom Mode";
}
V_DrawString(50, 104, V_6WIDTHSPACE, mode);
V_DrawString(50, 104, MENUCAPS|V_6WIDTHSPACE, mode);
}
// ALWAYS DRAW player name, level name, skin and color even when not on this menu!
@ -6230,8 +6381,8 @@ void M_Refresh(INT32 choice)
// Display a little "please wait" message.
M_DrawTextBox(52, BASEVIDHEIGHT/2-10, 25, 3);
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, 0, "Searching for servers...");
V_DrawCenteredString(BASEVIDWIDTH/2, (BASEVIDHEIGHT/2)+12, 0, "Please wait.");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, MENUCAPS, "Searching for servers...");
V_DrawCenteredString(BASEVIDWIDTH/2, (BASEVIDHEIGHT/2)+12, MENUCAPS, "Please wait.");
I_OsPolling();
I_UpdateNoBlit();
if (rendermode == render_soft)
@ -6271,13 +6422,13 @@ void M_DrawConnectMenu(void)
// Page num
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + M_GetItemY(MN_MP_CONNECT, "PAGE"),
highlightflags, va("%u of %d", serverlistpage+1, numPages));
MENUCAPS|highlightflags, va("%u of %d", serverlistpage+1, numPages));
// Horizontal line!
V_DrawFill(1, currentMenu->y+32, 318, 1, 0);
if (serverlistcount <= 0)
V_DrawString(currentMenu->x,currentMenu->y+SERVERHEADERHEIGHT, 0, "No servers found");
V_DrawString(currentMenu->x,currentMenu->y+SERVERHEADERHEIGHT, MENUCAPS, "No servers found");
else
for (i = 0; i < min(serverlistcount - serverlistpage * serversperpage, serversperpage); i++)
{
@ -6335,8 +6486,8 @@ void M_DrawConnectMenu(void)
// Display a little "please wait" message.
M_DrawTextBox(52, BASEVIDHEIGHT/2-10, 25, 3);
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, 0, message);
V_DrawCenteredString(BASEVIDWIDTH/2, (BASEVIDHEIGHT/2)+12, 0, "Please wait.");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, MENUCAPS, message);
V_DrawCenteredString(BASEVIDWIDTH/2, (BASEVIDHEIGHT/2)+12, MENUCAPS, "Please wait.");
}
}
@ -6748,10 +6899,10 @@ void M_DrawMPMainMenu(void)
Update the maxplayers label...
#endif
V_DrawRightAlignedString(BASEVIDWIDTH-x, y+M_GetItemY(MN_MP_MAIN, "STASRV"),
(M_IsItemOn(MN_MP_MAIN, "STASRV") ? highlightflags : 0), "(2-16 players)");
(M_IsItemOn(MN_MP_MAIN, "STASRV") ? highlightflags : 0)|MENUCAPS, "(2-16 players)");
V_DrawRightAlignedString(BASEVIDWIDTH-x, y+M_GetItemY(MN_MP_MAIN, "OFLSRV"),
(M_IsItemOn(MN_MP_MAIN, "OFLSRV") ? highlightflags : 0),
(M_IsItemOn(MN_MP_MAIN, "OFLSRV") ? highlightflags : 0)|MENUCAPS,
"(2-4 players)"
);
@ -6901,7 +7052,7 @@ static void M_ConnectIP(INT32 choice)
// A little "please wait" message.
M_DrawTextBox(56, BASEVIDHEIGHT/2-12, 24, 2);
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, 0, "Connecting to server...");
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, MENUCAPS, "Connecting to server...");
I_OsPolling();
I_UpdateNoBlit();
if (rendermode == render_soft)
@ -7089,10 +7240,10 @@ void M_DrawSetupMultiPlayerMenu(void)
// SRB2Kart: draw the stat backer
// labels
V_DrawThinString(statx+16, staty, V_6WIDTHSPACE|highlightflags, "Acceleration");
V_DrawThinString(statx+91, staty, V_6WIDTHSPACE|highlightflags, "Max Speed");
V_DrawThinString(statx, staty+12, V_6WIDTHSPACE|highlightflags, "Handling");
V_DrawThinString(statx+7, staty+77, V_6WIDTHSPACE|highlightflags, "Weight");
V_DrawThinString(statx+16, staty, MENUCAPS|V_6WIDTHSPACE|highlightflags, "Acceleration");
V_DrawThinString(statx+91, staty, MENUCAPS|V_6WIDTHSPACE|highlightflags, "Max Speed");
V_DrawThinString(statx, staty+12, MENUCAPS|V_6WIDTHSPACE|highlightflags, "Handling");
V_DrawThinString(statx+7, staty+77, MENUCAPS|V_6WIDTHSPACE|highlightflags, "Weight");
// label arrows
V_DrawFixedPatch((statx+64)<<FRACBITS, staty<<FRACBITS, FRACUNIT, 0, statlr, flashcol);
V_DrawFixedPatch((statx+24)<<FRACBITS, (staty+22)<<FRACBITS, FRACUNIT, 0, statud, flashcol);
@ -7949,7 +8100,7 @@ void M_DrawJoystick(void)
#endif
compareval = cv_usejoystick[setupcontrolplayer-1].value;
V_DrawString(menudefs[MN_OP_JOYSTICKSET].x, menudefs[MN_OP_JOYSTICKSET].y+LINEHEIGHT*i-4, (i == compareval) ? V_GREENMAP : 0, joystickInfo[i]);
V_DrawString(menudefs[MN_OP_JOYSTICKSET].x, menudefs[MN_OP_JOYSTICKSET].y+LINEHEIGHT*i-4, ((i == compareval) ? V_GREENMAP : 0)|MENUCAPS, joystickInfo[i]);
}
}
@ -8070,6 +8221,7 @@ void M_Setup1PControlsMenu(INT32 choice)
// Set proper gamepad options
M_SetItemRoutine(MN_OP_CHANGECONTROLS, "SETJOY", M_Setup1PJoystickMenu);
M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEADZ", &cv_deadzone[0]);
M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEAZS", &cv_deadzonestyle[0]);
// Unhide P1-only controls
M_SetItemStatus(MN_OP_CHANGECONTROLS, "TALK", IT_CONTROL); // Chat
@ -8103,6 +8255,7 @@ void M_Setup2PControlsMenu(INT32 choice)
// Set proper gamepad options
M_SetItemRoutine(MN_OP_CHANGECONTROLS, "SETJOY", M_Setup2PJoystickMenu);
M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEADZ", &cv_deadzone[1]);
M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEAZS", &cv_deadzonestyle[1]);
// Hide P1-only controls
M_SetItemStatus(MN_OP_CHANGECONTROLS, "TALK", IT_GRAYEDOUT2); // Chat
@ -8136,6 +8289,7 @@ void M_Setup3PControlsMenu(INT32 choice)
// Set proper gamepad options
M_SetItemRoutine(MN_OP_CHANGECONTROLS, "SETJOY", M_Setup3PJoystickMenu);
M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEADZ", &cv_deadzone[2]);
M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEAZS", &cv_deadzonestyle[2]);
// Hide P1-only controls
M_SetItemStatus(MN_OP_CHANGECONTROLS, "TALK", IT_GRAYEDOUT2); // Chat
@ -8169,6 +8323,7 @@ void M_Setup4PControlsMenu(INT32 choice)
// Set proper gamepad options
M_SetItemRoutine(MN_OP_CHANGECONTROLS, "SETJOY", M_Setup4PJoystickMenu);
M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEADZ", &cv_deadzone[3]);
M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEAZS", &cv_deadzonestyle[3]);
// Hide P1-only controls
M_SetItemStatus(MN_OP_CHANGECONTROLS, "TALK", IT_GRAYEDOUT2); // Chat
@ -8269,7 +8424,7 @@ void M_DrawControl(void)
if (currentMenu->menuitems[i].status == IT_CONTROL)
{
V_DrawString(x, y, ((i == itemOn) ? highlightflags : 0), currentMenu->menuitems[i].text);
V_DrawString(x, y, ((i == itemOn) ? highlightflags : 0)|MENUCAPS, currentMenu->menuitems[i].text);
tmp[0] ='\0';
for (iter = 0; iter < MAXINPUTMAPPING; iter++)
@ -8290,15 +8445,15 @@ void M_DrawControl(void)
(BASEVIDWIDTH-currentMenu->x, y, highlightflags, tmp);
}
/*else if (currentMenu->menuitems[i].status == IT_GRAYEDOUT2)
V_DrawString(x, y, V_TRANSLUCENT, currentMenu->menuitems[i].text);*/
V_DrawString(x, y, MENUCAPS|V_TRANSLUCENT, currentMenu->menuitems[i].text);*/
else if ((currentMenu->menuitems[i].status == IT_HEADER) && (i != max-1))
V_DrawString(13, y+6, highlightflags, currentMenu->menuitems[i].text);
V_DrawString(13, y+6, MENUCAPS|highlightflags, currentMenu->menuitems[i].text);
else if (currentMenu->menuitems[i].status & IT_STRING)
{
V_DrawString(x, y, ((i == itemOn) ? highlightflags : 0), currentMenu->menuitems[i].text);
V_DrawString(x, y, ((i == itemOn) ? highlightflags : 0)|MENUCAPS, currentMenu->menuitems[i].text);
if (currentMenu->menuitems[i].status & IT_CVAR)
{
V_DrawRightAlignedString(BASEVIDWIDTH-currentMenu->x, y, highlightflags, currentMenu->menuitems[i].itemaction.cvar->string);
V_DrawRightAlignedString(BASEVIDWIDTH-currentMenu->x, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].itemaction.cvar->string);
if (i == itemOn)
{
w = V_StringWidth(currentMenu->menuitems[i].itemaction.cvar->string, highlightflags);
@ -8315,7 +8470,7 @@ void M_DrawControl(void)
if (!name) name = "?";
w = V_StringWidth(name, highlightflags);
(w > BASEVIDWIDTH/2 - 4 ? V_DrawRightAlignedThinString : V_DrawRightAlignedString)
(BASEVIDWIDTH-currentMenu->x, y, highlightflags, name);
(BASEVIDWIDTH-currentMenu->x, y, MENUCAPS|highlightflags, name);
}
}
@ -8544,7 +8699,7 @@ void M_DrawVideoMenu(void)
M_DrawGenericMenu();
V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + M_GetItemY(MN_OP_VIDEO, "SETMOD"),
(SCR_IsAspectCorrect(vid.width, vid.height) ? recommendedflags : highlightflags),
(SCR_IsAspectCorrect(vid.width, vid.height) ? recommendedflags : highlightflags)|MENUCAPS,
va("%dx%d", vid.width, vid.height));
#ifdef HWRENDER
@ -8576,13 +8731,13 @@ void M_DrawHUDOptions(void)
M_DrawGenericMenu();
x -= w0;
V_DrawString(x, y, highlightflags, str0);
V_DrawString(x, y, MENUCAPS|highlightflags, str0);
x -= w1;
V_DrawString(x, y, warningflags, str1);
V_DrawString(x, y, MENUCAPS|warningflags, str1);
x -= w2;
V_DrawString(x, y, highlightflags, str2);
V_DrawString(x, y, MENUCAPS|highlightflags, str2);
x -= w3;
V_DrawString(x, y, recommendedflags, str3);
V_DrawString(x, y, MENUCAPS|recommendedflags, str3);
V_DrawRightAlignedString(x, y, highlightflags, "(");
}
@ -8595,17 +8750,17 @@ void M_DrawVideoMode(void)
M_DrawMenuTitle();
V_DrawCenteredString(BASEVIDWIDTH/2, menudefs[MN_OP_VIDEOMODE].y,
highlightflags, "Choose mode, reselect to change default");
MENUCAPS|highlightflags, "Choose mode, reselect to change default");
row = 41;
col = menudefs[MN_OP_VIDEOMODE].y + 14;
for (i = 0; i < vidm_nummodes; i++)
{
if (i == vidm_selected)
V_DrawString(row, col, highlightflags, modedescs[i].desc);
V_DrawString(row, col, MENUCAPS|highlightflags, modedescs[i].desc);
// Show multiples of 320x200 as green.
else
V_DrawString(row, col, (modedescs[i].goodratio) ? recommendedflags : 0, modedescs[i].desc);
V_DrawString(row, col, MENUCAPS|(modedescs[i].goodratio) ? recommendedflags : 0, modedescs[i].desc);
col += 8;
if ((i % vidm_column_size) == (vidm_column_size-1))
@ -8643,11 +8798,11 @@ void M_DrawVideoMode(void)
cv_scr_width.value, cv_scr_height.value));
V_DrawCenteredString(BASEVIDWIDTH/2, menudefs[MN_OP_VIDEOMODE].y + 138,
recommendedflags, "Marked modes are recommended.");
MENUCAPS|recommendedflags, "Marked modes are recommended.");
V_DrawCenteredString(BASEVIDWIDTH/2, menudefs[MN_OP_VIDEOMODE].y + 146,
highlightflags, "Other modes may have visual errors.");
MENUCAPS|highlightflags, "Other modes may have visual errors.");
V_DrawCenteredString(BASEVIDWIDTH/2, menudefs[MN_OP_VIDEOMODE].y + 158,
highlightflags, "Larger modes may have performance issues.");
MENUCAPS|highlightflags, "Larger modes may have performance issues.");
}
// Draw the cursor for the VidMode menu
@ -8902,7 +9057,7 @@ void M_DrawMonitorToggles(void)
if (shitsfree)
shitsfree--;
V_DrawCenteredString(BASEVIDWIDTH/2, currentMenu->y, highlightflags, va("* %s *", currentMenu->menuitems[itemOn].text));
V_DrawCenteredString(BASEVIDWIDTH/2, currentMenu->y, MENUCAPS|highlightflags, va("* %s *", currentMenu->menuitems[itemOn].text));
}
void M_HandleMonitorToggles(INT32 choice)

View file

@ -361,6 +361,7 @@ void M_HandleDiscordRequests(INT32 choice);
#endif
void M_DrawGenericMenu(void);
void M_DrawGenericScrollMenu(void);
void M_DrawCenteredMenu(void);
void M_DrawPauseMenu(void);
void M_DrawChecklist(void);
@ -472,6 +473,10 @@ extern consvar_t cv_dummyrings, cv_dummylives;
extern consvar_t cv_dummymenuplayer, cv_dummyteam, cv_dummyspectate, cv_dummyscramble;
extern consvar_t cv_dummyattackingrings, cv_dummyattackingstacking, cv_dummyattackingchaining;
extern consvar_t cv_dummyattackingslipdash, cv_dummyattackingpurpledrift;
extern consvar_t cv_menucaps;
// allow menu text to be displayed in lowercase
#define MENUCAPS (!cv_menucaps.value ? V_ALLOWLOWERCASE : 0)
extern CV_PossibleValue_t gametype_cons_t[];
extern char dummystaffname[22];

View file

@ -2088,6 +2088,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
player_t *player;
boolean force = false;
boolean spbpop = false;
boolean trapitem = false;
if (objectplacing)
return false;
@ -2155,6 +2156,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
if (player->pflags & PF_GODMODE)
return false;
if (player->exiting)
{
K_DoInstashield(player);
return false;
}
if (!force)
{
// Player hits another player
@ -2360,7 +2367,25 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
P_PlayerRingBurst(player, ringburst);
}
K_PlayPainSound(target, source);
if (inflictor)
{
switch(inflictor->type)
{
case MT_BANANA:
case MT_BANANA_SHIELD:
trapitem = true;
break;
default:
break;
}
}
if (!trapitem)
{
// Bananas don't make you scream.
K_PlayPainSound(target, source);
}
if ((explosioncombo == true) || (cv_kartdebughuddrop.value && !modeattacking))
{

View file

@ -159,7 +159,6 @@ extern consvar_t cv_cam_speed[MAXSPLITSCREENPLAYERS], cv_cam_rotate[MAXSPLITSCRE
extern consvar_t cv_tilting;
extern consvar_t cv_actionmovie;
extern consvar_t cv_windowquake;
extern fixed_t t_cam_dist[MAXSPLITSCREENPLAYERS], t_cam_height[MAXSPLITSCREENPLAYERS], t_cam_rotate[MAXSPLITSCREENPLAYERS];

View file

@ -10596,11 +10596,10 @@ static void P_DefaultMobjShadowScale(mobj_t *thing)
thing->whiteshadow = ((thing->frame & FF_BRIGHTMASK) == FF_FULLBRIGHT);
thing->shadowcolor = 15;
// Those have shadow by default
switch (thing->type)
{
case MT_PLAYER:
thing->shadowscale = FRACUNIT;
break;
case MT_SMALLMACE:
case MT_BIGMACE:
case MT_PUMA:
@ -10622,7 +10621,11 @@ static void P_DefaultMobjShadowScale(mobj_t *thing)
case MT_SINK:
case MT_ROCKETSNEAKER:
case MT_SPB:
thing->shadowscale = 3*FRACUNIT/2;
case MT_ADVENTURESPIKEA:
case MT_ADVENTURESPIKEB:
case MT_ADVENTURESPIKEC:
case MT_CDUFO:
thing->shadowscale = 4*FRACUNIT/3;
break;
case MT_BANANA_SHIELD:
thing->shadowscale = 12*FRACUNIT/5;
@ -10639,17 +10642,112 @@ static void P_DefaultMobjShadowScale(mobj_t *thing)
thing->shadowscale = 3*FRACUNIT/2;
thing->whiteshadow = false;
break;
case MT_FLOATINGITEM:
case MT_ITEMCAPSULE:
thing->shadowscale = FRACUNIT/2;
break;
case MT_THUNDERSHIELD:
case MT_BUBBLESHIELD:
case MT_BUBBLESHIELDTRAP:
case MT_FLAMESHIELD:
case MT_BLUEFRUIT:
case MT_ORANGEFRUIT:
case MT_REDFRUIT:
case MT_PINKFRUIT:
case MT_RANDOMAUDIENCE:
case MT_DOOD_BOX:
case MT_DOOD_BALLOON:
case MT_BLUECRAWLA:
case MT_REDCRAWLA:
case MT_GFZFISH: // Greenflower Fish
case MT_GOLDBUZZ:
case MT_REDBUZZ:
case MT_AQUABUZZ: // AquaBuzz for ATZ
case MT_JETTBOMBER: // Jetty-Syn Bomber
case MT_JETTGUNNER: // Jetty-Syn Gunner
case MT_CRAWLACOMMANDER: // Crawla Commander
case MT_DETON: // Deton
case MT_SKIM: // Skim mine dropper
case MT_TURRET:
case MT_POPUPTURRET:
case MT_SHARP: // Sharp
case MT_JETJAW: // Jet Jaw
case MT_SNAILER: // Snailer
case MT_VULTURE: // Vulture
case MT_POINTY: // Pointy
case MT_POINTYBALL: // Pointy Ball
case MT_ROBOHOOD: // Robo-Hood
case MT_FACESTABBER: // CastleBot FaceStabber
case MT_EGGGUARD: // Egg Guard
case MT_EGGSHIELD: // Egg Shield for Egg Guard
case MT_GSNAPPER: // Green Snapper
case MT_MINUS: // Minus
case MT_SPRINGSHELL: // Spring Shell
case MT_YELLOWSHELL: // Spring Shell (yellow)
case MT_UNIDUS: // Unidus
case MT_UNIBALL: // Unidus Ball
case MT_GOOMBA:
case MT_BLUEGOOMBA:
case MT_KOOPA:
case MT_MONOKUMA:
case MT_ARIDTOAD:
case MT_SRB1_CRAWLA:
case MT_SRB1_BAT:
case MT_SRB1_ROBOFISH:
case MT_SRB1_VOLCANOGUY:
case MT_SRB1_HOPPY:
case MT_SRB1_HOPPYWATER:
case MT_SRB1_HOPPYSKYLAB:
case MT_SRB1_MMZFLYING:
case MT_SRB1_UFO:
case MT_SRB1_GRAYBOT:
case MT_SRB1_ROBOTOPOLIS:
case MT_SRB1_RBZBUZZ:
case MT_SRB1_RBZSPIKES:
case MT_SRB1_METALSONIC:
case MT_SRB1_GOLDBOT:
case MT_SRB1_GENREX:
case MT_BOWLINGPIN:
case MT_EXPLODINGBARREL:
case MT_FROGGER:
case MT_ROBRA:
case MT_CHOMPER:
case MT_BUZZBOMBER:
case MT_GARGOYLE:
case MT_GBA_BOO:
case MT_FLYINGGARG:
thing->shadowscale = FRACUNIT;
break;
case MT_RING:
case MT_FLINGRING:
case MT_FLOATINGITEM:
case MT_BLUEBALL:
case MT_ITEMCAPSULE:
case MT_COIN:
case MT_FLINGCOIN:
case MT_REDTEAMRING:
case MT_BLUETEAMRING:
case MT_REDFLAG:
case MT_BLUEFLAG:
case MT_BOUNCERING:
case MT_AUTOMATICRING:
case MT_INFINITYRING:
case MT_RAILRING:
case MT_EXPLOSIONRING:
case MT_SCATTERRING:
case MT_GRENADERING:
case MT_BOUNCEPICKUP:
case MT_RAILPICKUP:
case MT_AUTOPICKUP:
case MT_EXPLODEPICKUP:
case MT_SCATTERPICKUP:
case MT_GRENADEPICKUP:
case MT_REDRING:
case MT_THROWNBOUNCE:
case MT_THROWNINFINITY:
case MT_THROWNAUTOMATIC:
case MT_THROWNSCATTER:
case MT_THROWNEXPLOSION:
case MT_THROWNGRENADE:
case MT_EMBLEM:
thing->shadowscale = FRACUNIT/3;
break;
default:
if (thing->flags & (MF_ENEMY|MF_BOSS))
thing->shadowscale = FRACUNIT;

View file

@ -244,6 +244,10 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEUINT32(save->p, players[i].airtime);
WRITEUINT8(save->p, players[i].startboost);
WRITEUINT8(save->p, players[i].dropdash);
WRITEUINT8(save->p, players[i].respawn);
WRITEUINT8(save->p, players[i].softlocktimer);
WRITEUINT16(save->p, players[i].flashing);
WRITEUINT16(save->p, players[i].spinouttimer);
WRITEUINT8(save->p, players[i].spinouttype);
@ -251,6 +255,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEUINT8(save->p, players[i].instashield);
WRITEUINT8(save->p, players[i].wipeoutslow);
WRITEUINT8(save->p, players[i].justbumped);
WRITEUINT8(save->p, players[i].noclip);
WRITESINT8(save->p, players[i].drift);
WRITEFIXED(save->p, players[i].driftcharge);
@ -272,6 +277,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEFIXED(save->p, players[i].boostpower);
WRITEFIXED(save->p, players[i].speedboost);
WRITEFIXED(save->p, players[i].prevspeedboost);
WRITEFIXED(save->p, players[i].accelboost);
WRITEANGLE(save->p, players[i].boostangle);
WRITEUINT8(save->p, players[i].numsneakers);
@ -567,6 +573,10 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].airtime = READUINT32(save->p);
players[i].startboost = READUINT8(save->p);
players[i].dropdash = READUINT8(save->p);
players[i].respawn = READUINT8(save->p);
players[i].softlocktimer = READUINT8(save->p);
players[i].flashing = READUINT16(save->p);
players[i].spinouttimer = READUINT16(save->p);
players[i].spinouttype = READUINT8(save->p);
@ -574,6 +584,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].instashield = READUINT8(save->p);
players[i].wipeoutslow = READUINT8(save->p);
players[i].justbumped = READUINT8(save->p);
players[i].noclip = READUINT8(save->p);
players[i].drift = READSINT8(save->p);
players[i].driftcharge = READFIXED(save->p);
@ -595,6 +606,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].boostpower = READFIXED(save->p);
players[i].speedboost = READFIXED(save->p);
players[i].prevspeedboost = READFIXED(save->p);
players[i].accelboost = READFIXED(save->p);
players[i].boostangle = READANGLE(save->p);
players[i].numsneakers = READUINT8(save->p);

View file

@ -137,6 +137,7 @@ node_t *nodes;
line_t *lines;
side_t *sides;
mapthing_t *mapthings;
static boolean basemaptyperemoval[65537];
sector_t *spawnsectors;
line_t *spawnlines;
side_t *spawnsides;
@ -815,6 +816,10 @@ static void P_SpawnMapThings(boolean spawnemblems)
if (!spawnemblems && mt->type == mobjinfo[MT_EMBLEM].doomednum)
continue;
// Don't spawn non-patch objects of this type if they are uneeded
if (mt->patch == false && basemaptyperemoval[mt->type] == true)
continue;
mt->mobj = NULL;
if (mt->type == mobjinfo[MT_LOOPENDPOINT].doomednum)
@ -1410,6 +1415,7 @@ static void P_LoadThings(UINT8 *data)
memset(mt->script_stringargs, 0x00, NUM_SCRIPT_STRINGARGS*sizeof(*mt->script_stringargs));
mt->pitch = mt->roll = 0;
mt->layer = 0;
mt->patch = false;
mt->type &= 4095;
@ -1542,6 +1548,41 @@ static boolean TextmapCount(size_t size, boolean patch)
CONS_Alert(CONS_WARNING, "This map patch is not compatible with the current map (checksum: " HASHFMT "). The patch may not work.\n", maphash);
}
// check for things to remove from the base map
if (patch)
{
tkn = M_TokenizerRead(0);
if (fastcmp(tkn, "basemaptyperemoval"))
{
tkn = M_TokenizerRead(0);
const char *typestr = tkn;
char *end;
// check for types separated by pipes
// e.g. 300|2001|2004
do
{
UINT16 types = strtoull(typestr, &end, 10);
if (types)
{
// Set type to removed.
basemaptyperemoval[types] = true;
CONS_Debug(DBG_SETUP,"Ignoring base mapthing type %d for patch\n", types);
}
if (end == typestr || (*end && *end != '|'))
{
CONS_Alert(CONS_ERROR, "Invalid basemaptyperemoval string '%s'\n", tkn);
return false;
}
typestr = end + 1;
}
while (*end);
}
}
nummapthings = 0;
if (!patch)
{
@ -3291,7 +3332,14 @@ static void P_LoadTextmap(boolean patch)
side_t *sd;
mapthing_t *mt;
CONS_Alert(CONS_NOTICE, "UDMF support is still a work-in-progress; its specs and features are prone to change until it is fully implemented.\n");
if (!patch)
{
CONS_Alert(CONS_NOTICE, "UDMF support is still a work-in-progress; its specs and features are prone to change until it is fully implemented.\n");
}
else
{
CONS_Alert(CONS_NOTICE, "Patching current map.\n");
}
/// Given the UDMF specs, some fields are given a default value.
/// If an element's field has a default value set, it is omitted
@ -3474,6 +3522,7 @@ static void P_LoadTextmap(boolean patch)
memset(mt->script_stringargs, 0x00, NUM_SCRIPT_STRINGARGS*sizeof(*mt->script_stringargs));
mt->layer = 0;
mt->mobj = NULL;
mt->patch = patch;
K_UserPropertiesClear(&mt->user);
@ -8316,6 +8365,8 @@ static void P_InitGametype(void)
lastLowestLap = 0;
spbplace = -1;
G_ClearRetryFlag();
startedInFreePlay = false;
{
UINT8 nump = 0;
@ -8736,6 +8787,8 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate)
P_InitSlopes(); //Initialize slopes before the map loads.
memset(basemaptyperemoval, 0, 65537*sizeof(boolean));
if (!P_LoadMapFromFile())
{
TracyCZoneEnd(__zone);

View file

@ -862,8 +862,6 @@ void P_Ticker(boolean run)
quake.x = M_RandomRange(-ir,ir);
quake.y = M_RandomRange(-ir,ir);
quake.z = M_RandomRange(-ir,ir);
if (cv_windowquake.value)
I_CursedWindowMovement(FixedInt(quake.x), FixedInt(quake.y));
--quake.time;
}
else

View file

@ -2504,9 +2504,9 @@ static void P_DeathThink(player_t *player)
else
player->karthud[khud_timeovercam] = 0;
// Set players next respawn point to the next waypoint
// If they die while still in respawn state for extra safety.
if (player->nextwaypoint && player->respawn > 0)
// If the player dies too fast or dies during respawn...
// Set players next respawn point to the next waypoint for extra safety.
if (player->softlocktimer > 0 || player->respawn > 0)
{
// Now a clean function! Neat, eh?
K_SetRespawnAtNextWaypoint(player);
@ -2644,7 +2644,6 @@ consvar_t cv_cam_rotate[MAXSPLITSCREENPLAYERS] = {
consvar_t cv_tilting = CVAR_INIT ("tilting", "On", CV_SAVE, CV_OnOff, NULL);
consvar_t cv_actionmovie = CVAR_INIT ("actionmovie", "On", CV_SAVE, CV_OnOff, NULL);
consvar_t cv_windowquake = CVAR_INIT ("windowquake", "Off", CV_SAVE, CV_OnOff, NULL);
fixed_t t_cam_dist[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42};
fixed_t t_cam_height[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42};

View file

@ -170,7 +170,7 @@ consvar_t cv_flipcam[MAXSPLITSCREENPLAYERS] = {
CVAR_INIT ("flipcam4", "Off", CV_CALL|CV_SAVE, CV_OnOff, weaponPrefChange4)
};
consvar_t cv_shadow = CVAR_INIT ("shadow", "On", CV_SAVE, CV_OnOff, NULL);
consvar_t cv_shadow = CVAR_INIT ("dropshadow", "On", CV_SAVE, CV_OnOff, NULL);
consvar_t cv_skybox = CVAR_INIT ("skybox", "On", CV_SAVE, CV_OnOff, NULL);
consvar_t cv_ffloorclip = CVAR_INIT ("ffloorclip", "On", CV_SAVE, CV_OnOff, NULL);
consvar_t cv_allowmlook = CVAR_INIT ("allowmlook", "Yes", CV_NETVAR, CV_YesNo, NULL);
@ -1835,7 +1835,6 @@ void R_RegisterEngineStuff(void)
CV_RegisterVar(&cv_tilting);
CV_RegisterVar(&cv_actionmovie);
CV_RegisterVar(&cv_windowquake);
CV_RegisterVar(&cv_sloperoll);
CV_RegisterVar(&cv_showhud);

View file

@ -1056,12 +1056,6 @@ INT32 I_GetKey (void)
return rc;
}
void
I_CursedWindowMovement (int xd, int yd)
{
SDL_SetWindowPosition(window, window_x + xd, window_y + yd);
}
//
// I_JoyScale
//

View file

@ -600,9 +600,6 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
break;
case SDL_WINDOWEVENT_MAXIMIZED:
break;
case SDL_WINDOWEVENT_MOVED:
window_x = evt.data1;
window_y = evt.data2;
}
if (FOCUSUNION == oldfocus) // No state change

View file

@ -777,15 +777,9 @@ skiptallydrawer:
break;
}
//if ((intertic/TICRATE) & 1) // Make it obvious that scrambling is happening next round. (OR NOT, I GUESS)
//{
/*if (cv_scrambleonchange.value && cv_teamscramble.value)
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, hilicol, M_GetText("Teams will be scrambled next round!"));*/
if (speedscramble != -1 && speedscramble != gamespeed)
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, hilicol|V_ALLOWLOWERCASE|V_SNAPTOBOTTOM,
va(M_GetText("Next race will be %s Speed!"), kartspeed_cons_t[1+speedscramble].strvalue));
//}
if ((speedscramble != -1) && (speedscramble != gamespeed))
V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, hilicol|V_ALLOWLOWERCASE|V_SNAPTOBOTTOM,
va(M_GetText("Next race will be %s Speed!"), kartspeed_cons_t[1+speedscramble].strvalue));
}
//

View file

@ -45,7 +45,7 @@ if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}")
"SDL2MIXER_MP3 ON"
"SDL2MIXER_MP3_DRMP3 ON"
"SDL2MIXER_MIDI ON"
"SDL2MIXER_OPUS ON"
"SDL2MIXER_OPUS OFF"
"SDL2MIXER_VORBIS STB"
"SDL2MIXER_WAVE ON"
)