Merge branch 'blankart-dev' into infostuff
This commit is contained in:
commit
360e7419e8
36 changed files with 1000 additions and 395 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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..."));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
258
src/d_netcmd.c
258
src/d_netcmd.c
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 },
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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++)
|
||||
|
|
|
|||
28
src/g_game.c
28
src/g_game.c
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -34,10 +34,12 @@ _(OP_OPENGL)
|
|||
|
||||
_(OP_SOUND)
|
||||
_(SR_SOUNDTEST)
|
||||
_(OP_SNDEFX)
|
||||
|
||||
_(OP_HUD)
|
||||
_(OP_CHAT)
|
||||
_(OP_GAMEHUD)
|
||||
_(OP_OFFSET)
|
||||
|
||||
_(OP_CAMERA)
|
||||
_(OP_P1CAMERA)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
324
src/k_kart.c
324
src/k_kart.c
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
//
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
361
src/m_menu.c
361
src/m_menu.c
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
||||
|
|
|
|||
112
src/p_mobj.c
112
src/p_mobj.c
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
//
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
|||
2
thirdparty/CMakeLists.txt
vendored
2
thirdparty/CMakeLists.txt
vendored
|
|
@ -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"
|
||||
)
|
||||
|
|
|
|||
Loading…
Reference in a new issue