Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36d1f59114 | ||
|
|
99d49adad5 | ||
|
|
6267e1a062 | ||
|
|
051bb528a6 | ||
|
|
a95c9bf6ee | ||
|
|
d74ebda83e | ||
|
|
b575c288fa | ||
|
|
f9a6702219 | ||
|
|
cfda853e6f | ||
|
|
14ac3ca9b0 | ||
|
|
e94fecf56d | ||
|
|
51d9aa6197 | ||
|
|
96a29abc62 | ||
|
|
fa1b797a44 | ||
|
|
e1061ab4b4 | ||
|
|
ab0d071d35 | ||
|
|
8129b89034 | ||
|
|
14aaba7a87 | ||
|
|
2c1bb6c268 | ||
|
|
cc6437285f | ||
|
|
b24f6683b7 | ||
|
|
5f559af29c | ||
|
|
eef1c55549 | ||
|
|
3c227ec532 | ||
|
|
50f839e1ad | ||
|
|
8db399be9b | ||
|
|
8cb321993e | ||
|
|
b4cad08ad3 | ||
|
|
fa899d3970 | ||
|
|
b955fdb47d | ||
|
|
4686e8e112 | ||
|
|
667c67a61a | ||
|
|
df9a23a6c7 | ||
|
|
a3f557f4df | ||
|
|
1ac029edc6 | ||
|
|
761766d353 | ||
|
|
72d3360711 | ||
|
|
ac52ec2c48 | ||
|
|
956bc3f7df | ||
|
|
746a8cec8b | ||
|
|
f7a32b5f85 | ||
|
|
bd30ab8fb7 | ||
|
|
4140f93e41 | ||
|
|
8ae6f71578 | ||
|
|
d5083ac66c | ||
|
|
62be792a0d | ||
|
|
c34346cb9a | ||
|
|
d7803ecdcf | ||
|
|
1a2a487a93 | ||
|
|
bed6306cdf | ||
|
|
7521b3abd2 | ||
|
|
58d5bab181 | ||
|
|
2bffe443ed | ||
|
|
261c02f4b6 | ||
|
|
d59ac7d01b | ||
|
|
ac86f36186 | ||
|
|
b5c7fd5a2b | ||
|
|
da103f54d6 |
No files matched your search
+4
-1
@@ -1,5 +1,8 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
# needed for lto to work for some reason
|
||||
cmake_policy(SET CMP0069 NEW)
|
||||
|
||||
if(${PROJECT_SOURCE_DIR} MATCHES ${PROJECT_BINARY_DIR})
|
||||
message(FATAL_ERROR "In-source builds will bring you a world of pain. Please make a separate directory to invoke CMake from.")
|
||||
endif()
|
||||
@@ -31,7 +34,7 @@ if("${SRB2_CPACK_GENERATOR}" STREQUAL "")
|
||||
endif()
|
||||
|
||||
set(CPACK_GENERATOR ${SRB2_CPACK_GENERATOR})
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sonic Robo Blast 2 Kart" CACHE STRING "Program name for display purposes")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sonic Robo Blast 2 Kart Saturn" CACHE STRING "Program name for display purposes")
|
||||
set(CPACK_PACKAGE_VENDOR "Kart Krew" CACHE STRING "Vendor name for display purposes")
|
||||
#set(CPACK_PACKAGE_DESCRIPTION_FILE )
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
||||
|
||||
+2
-2
@@ -54,7 +54,7 @@ set(SRB2_CORE_SOURCES
|
||||
string.c
|
||||
tables.c
|
||||
v_video.c
|
||||
w_wad.cpp
|
||||
w_wad.c
|
||||
y_inter.c
|
||||
z_zone.cpp
|
||||
)
|
||||
@@ -518,7 +518,7 @@ if(${SRB2_CONFIG_HWRENDER})
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_batching.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_shaders.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_bsp.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_cache.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_cache.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_clip.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_draw.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.cpp
|
||||
|
||||
@@ -1437,6 +1437,8 @@ void CONS_Error(const char *msg)
|
||||
// dirty quick hack, but for the good cause
|
||||
while (I_GetKey() != KEY_ENTER)
|
||||
{
|
||||
I_HandleInterrupt();
|
||||
|
||||
// Sleep so we don't take too much of cpu usage
|
||||
I_Sleep(1.f/TICRATE*1000);
|
||||
|
||||
|
||||
+17
-8
@@ -125,6 +125,7 @@ static tic_t freezetimeout[MAXNETNODES]; // Until when can this node freeze the
|
||||
UINT16 pingmeasurecount = 1;
|
||||
UINT32 realpingtable[MAXPLAYERS] = {}; //the base table of ping where an average will be sent to everyone.
|
||||
UINT32 playerpingtable[MAXPLAYERS] = {}; //table of player latency values.
|
||||
UINT32 localplayerping = 0;
|
||||
|
||||
#define GENTLEMANSMOOTHING (TICRATE)
|
||||
static tic_t reference_lag = 0;
|
||||
@@ -356,12 +357,13 @@ void SendNetXCmdForPlayer(UINT8 playerid, netxcmd_t id, const void *param, size_
|
||||
|
||||
if (2+nparam > MAXTEXTCMD)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("packet too large to fit NetXCmd, cannot add netcmd %d! (size: %s, max: %d)\n"), id, sizeu1(2+nparam), MAXTEXTCMD);
|
||||
CONS_Alert(CONS_ERROR, M_GetText("packet too large to fit NetXCmd, cannot add netcmd %s with id %d! (size: %s, max: %d)\n"), netxcmdnames[id-1], id, sizeu1(2+nparam), MAXTEXTCMD);
|
||||
return;
|
||||
}
|
||||
|
||||
// for future reference: if (cv_debug) != debug disabled.
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("NetXCmd buffer full, delaying netcmd %d... (size: %d, needed: %s)\n"), id, localtextcmd[playerid][0], sizeu1(nparam));
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("NetXCmd buffer full, delaying netcmd %s with id %d... (size: %d, needed: %s)\n"), netxcmdnames[id-1], id, localtextcmd[playerid][0], sizeu1(nparam));
|
||||
|
||||
if (buf == NULL)
|
||||
{
|
||||
textcmdbuf[playerid] = (textcmdbuf_t*)Z_Malloc(sizeof(textcmdbuf_t), PU_STATIC, NULL);
|
||||
@@ -2856,10 +2858,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
||||
{
|
||||
INT32 key;
|
||||
|
||||
if (I_Interrupted())
|
||||
{
|
||||
I_Quit();
|
||||
}
|
||||
I_HandleInterrupt();
|
||||
|
||||
I_OsPolling();
|
||||
|
||||
@@ -3498,6 +3497,9 @@ void CL_RemovePlayer(INT32 playernum, INT32 reason)
|
||||
while ((doomcom->numslots > 1) && !playeringame[doomcom->numslots-1])
|
||||
doomcom->numslots--;
|
||||
|
||||
// Unmute slot if player was muted
|
||||
player_muted[playernum] = false;
|
||||
|
||||
// Reset the name
|
||||
sprintf(player_names[playernum], "Player %d", playernum+1);
|
||||
|
||||
@@ -4447,6 +4449,7 @@ void SV_ResetServer(void)
|
||||
pingmeasurecount = 1;
|
||||
memset(realpingtable, 0, sizeof(realpingtable));
|
||||
memset(playerpingtable, 0, sizeof(playerpingtable));
|
||||
localplayerping = 0;
|
||||
|
||||
ClearAdminPlayers();
|
||||
|
||||
@@ -6983,10 +6986,12 @@ static void UpdatePingTable(void)
|
||||
|
||||
INT32 i;
|
||||
|
||||
const boolean playing = Playing();
|
||||
|
||||
if (server)
|
||||
{
|
||||
//if (Playing() && !(gametime % 8)) // Value chosen based on _my vibes man_ << dont do this for v8 atleast, this is placeboeing ppl to hell and back
|
||||
if (Playing() && !(gametime % 35)) // update once per second.
|
||||
//if (playing && !(gametime % 8)) // Value chosen based on _my vibes man_ << dont do this for v8 atleast, this is placeboeing ppl to hell and back
|
||||
if (playing && !(gametime % 35)) // update once per second.
|
||||
PingUpdate();
|
||||
|
||||
fastest = 0;
|
||||
@@ -7045,6 +7050,10 @@ static void UpdatePingTable(void)
|
||||
else
|
||||
lowest_lag = simulated_lag = 0;
|
||||
}
|
||||
|
||||
// this is really dumb but oh well
|
||||
if (playing && !(gametime % 35))
|
||||
localplayerping = playerpingtable[consoleplayer];
|
||||
}
|
||||
|
||||
#ifdef HOLEPUNCH
|
||||
|
||||
@@ -650,6 +650,8 @@ extern UINT8 playernode[MAXPLAYERS];
|
||||
|
||||
extern boolean player_muted[MAXPLAYERS];
|
||||
|
||||
extern UINT32 localplayerping;
|
||||
|
||||
INT32 D_NumPlayers(void);
|
||||
|
||||
void D_ResetTiccmds(void);
|
||||
|
||||
+2
-5
@@ -154,7 +154,7 @@ boolean music_disabled = false;
|
||||
INT32 debugload = 0;
|
||||
#endif
|
||||
|
||||
char savegamename[256];
|
||||
char savegamename[256] = {};
|
||||
|
||||
char srb2home[256] = ".";
|
||||
char srb2path[256] = ".";
|
||||
@@ -726,10 +726,7 @@ void D_SRB2Loop(void)
|
||||
|
||||
enterprecise = I_GetPreciseTime();
|
||||
|
||||
if (I_Interrupted())
|
||||
{
|
||||
I_Quit();
|
||||
}
|
||||
I_HandleInterrupt();
|
||||
|
||||
memset(&g_dc, 0, sizeof(g_dc));
|
||||
Z_Frame_Reset();
|
||||
|
||||
@@ -51,10 +51,6 @@ extern consvar_t cv_mousevisible;
|
||||
//WTF
|
||||
extern consvar_t cv_mouseturn;
|
||||
extern consvar_t cv_usejoystick[4]; //MAXSPLITSCREENPLAYERS
|
||||
#ifdef LJOYSTICK
|
||||
extern consvar_t cv_joyport;
|
||||
extern consvar_t cv_joyport2;
|
||||
#endif
|
||||
extern consvar_t cv_joyscale[4]; //MAXSPLITSCREENPLAYERS
|
||||
|
||||
// normally in p_mobj but the .h is not read
|
||||
|
||||
+33
-19
@@ -167,7 +167,9 @@ UINT8 *PutFileNeeded(UINT16 firstfile)
|
||||
continue;
|
||||
}
|
||||
|
||||
nameonly(strcpy(wadfilename, wadfiles[i]->filename));
|
||||
strncpy(wadfilename, wadfiles[i]->filename, MAX_WADPATH);
|
||||
wadfilename[MAX_WADPATH-1] = '\0';
|
||||
nameonly(wadfilename);
|
||||
|
||||
// Look below at the WRITE macros to understand what these numbers mean.
|
||||
const size_t len = strlen(wadfilename) + 1;
|
||||
@@ -257,9 +259,10 @@ void CL_PrepareDownloadSaveGame(const char *tmpsave)
|
||||
*/
|
||||
boolean CL_CheckDownloadable(void)
|
||||
{
|
||||
UINT8 i,dlstatus = 0;
|
||||
UINT8 i, dlstatus = 0;
|
||||
|
||||
for (i = 0; i < fileneedednum; i++)
|
||||
{
|
||||
if (fileneeded[i].status != FS_FOUND && fileneeded[i].status != FS_OPEN)
|
||||
{
|
||||
if (fileneeded[i].willsend == 1)
|
||||
@@ -270,6 +273,7 @@ boolean CL_CheckDownloadable(void)
|
||||
else //if (fileneeded[i].willsend == 2)
|
||||
dlstatus = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// Downloading locally disabled
|
||||
if (!dlstatus && M_CheckParm("-nodownload"))
|
||||
@@ -280,15 +284,17 @@ boolean CL_CheckDownloadable(void)
|
||||
|
||||
// not downloadable, put reason in console
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("You need additional files to connect to this server:\n"));
|
||||
|
||||
for (i = 0; i < fileneedednum; i++)
|
||||
{
|
||||
if (fileneeded[i].status != FS_FOUND && fileneeded[i].status != FS_OPEN)
|
||||
{
|
||||
CONS_Printf(" * \"%s\" (%dK)", fileneeded[i].filename, fileneeded[i].totalsize >> 10);
|
||||
|
||||
if (fileneeded[i].status == FS_MD5SUMBAD)
|
||||
CONS_Printf(M_GetText(" wrong version, md5: "));
|
||||
else
|
||||
CONS_Printf(M_GetText(" not found, md5: "));
|
||||
if (fileneeded[i].status == FS_MD5SUMBAD)
|
||||
CONS_Printf(M_GetText(" wrong version, md5: "));
|
||||
else
|
||||
CONS_Printf(M_GetText(" not found, md5: "));
|
||||
|
||||
{
|
||||
INT32 j;
|
||||
@@ -299,6 +305,7 @@ boolean CL_CheckDownloadable(void)
|
||||
}
|
||||
CONS_Printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
switch (dlstatus)
|
||||
{
|
||||
@@ -312,6 +319,7 @@ boolean CL_CheckDownloadable(void)
|
||||
CONS_Printf(M_GetText("All files downloadable, but you have chosen to disable downloading locally.\n"));
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -549,7 +557,7 @@ INT32 CL_CheckFiles(void)
|
||||
if (fileneeded[i].status != FS_OPEN)
|
||||
filestoload++;
|
||||
|
||||
if (fileneeded[i].status != FS_NOTCHECKED) //since we're running this over multiple tics now, its possible for us to come across files checked in previous tics
|
||||
if (fileneeded[i].status != FS_NOTCHECKED) // since we're running this over multiple tics now, its possible for us to come across files checked in previous tics
|
||||
continue;
|
||||
|
||||
CONS_Debug(DBG_NETPLAY, "searching for '%s' ", fileneeded[i].filename);
|
||||
@@ -557,14 +565,18 @@ INT32 CL_CheckFiles(void)
|
||||
// Check in already loaded files
|
||||
for (j = mainwads+1; j < numwadfiles; j++)
|
||||
{
|
||||
nameonly(strcpy(wadfilename, wadfiles[j]->filename));
|
||||
|
||||
if (fasticmp(wadfilename, fileneeded[i].filename) &&
|
||||
!memcmp(wadfiles[j]->md5sum, fileneeded[i].md5sum, 16))
|
||||
if (!memcmp(wadfiles[j]->md5sum, fileneeded[i].md5sum, 16))
|
||||
{
|
||||
CONS_Debug(DBG_NETPLAY, "already loaded\n");
|
||||
fileneeded[i].status = FS_OPEN;
|
||||
return 4;
|
||||
strncpy(wadfilename, wadfiles[j]->filename, MAX_WADPATH);
|
||||
wadfilename[MAX_WADPATH-1] = '\0';
|
||||
nameonly(wadfilename);
|
||||
|
||||
if (fasticmp(wadfilename, fileneeded[i].filename))
|
||||
{
|
||||
CONS_Debug(DBG_NETPLAY, "already loaded\n");
|
||||
fileneeded[i].status = FS_OPEN;
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -645,7 +657,7 @@ boolean CL_LoadServerFiles(void)
|
||||
else
|
||||
{
|
||||
const char *s;
|
||||
switch(fileneeded[i].status)
|
||||
switch (fileneeded[i].status)
|
||||
{
|
||||
case FS_NOTFOUND:
|
||||
s = "FS_NOTFOUND";
|
||||
@@ -688,7 +700,7 @@ static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
||||
|
||||
char wadfilename[MAX_WADPATH];
|
||||
|
||||
if (cv_noticedownload.value)
|
||||
if (cv_noticedownload.value && I_GetNodeAddress)
|
||||
CONS_Printf("Sending file \"%s\" (id %d) to node %d (%s)\n", filename, fileid, node, I_GetNodeAddress(node));
|
||||
|
||||
// Find the last file in the list and set a pointer to its "next" field
|
||||
@@ -713,7 +725,9 @@ static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid)
|
||||
// Look for the requested file through all loaded files
|
||||
for (wadnum = 0; wadfiles[wadnum]; wadnum++)
|
||||
{
|
||||
strlcpy(wadfilename, wadfiles[wadnum]->filename, MAX_WADPATH);
|
||||
// im a certified strlcpy hater
|
||||
strncpy(wadfilename, wadfiles[wadnum]->filename, MAX_WADPATH);
|
||||
wadfilename[MAX_WADPATH-1] = '\0';
|
||||
nameonly(wadfilename);
|
||||
|
||||
if (fasticmp(wadfilename, p->id.filename))
|
||||
@@ -1066,7 +1080,7 @@ void Got_Filetxpak(void)
|
||||
{
|
||||
const char *s;
|
||||
|
||||
switch(file->status)
|
||||
switch (file->status)
|
||||
{
|
||||
case FS_NOTFOUND:
|
||||
s = "FS_NOTFOUND";
|
||||
@@ -1194,7 +1208,7 @@ filestatus_t checkfilemd5(char *filename, const UINT8 *wantedmd5sum)
|
||||
fhandle = fopen(filename, "rb");
|
||||
if (fhandle)
|
||||
{
|
||||
md5_stream(fhandle,md5sum);
|
||||
md5_stream(fhandle, md5sum);
|
||||
fclose(fhandle);
|
||||
if (!memcmp(wantedmd5sum, md5sum, 16))
|
||||
return FS_FOUND;
|
||||
|
||||
+88
-49
@@ -337,12 +337,14 @@ static void readfreeslots(MYFILE *f)
|
||||
{
|
||||
if (used_spr[(i-SPR_FIRSTFREESLOT)/8] & (1<<(i%8)))
|
||||
{
|
||||
if (!sprnames[i][4] && memcmp(sprnames[i],word,4)==0)
|
||||
if (!sprnames[i][4] && memcmp(sprnames[i], word, 4) == 0)
|
||||
sprnames[i][4] = (char)f->wad;
|
||||
|
||||
continue; // Already allocated, next.
|
||||
}
|
||||
|
||||
// Found a free slot!
|
||||
strncpy(sprnames[i],word,4);
|
||||
strncpy(sprnames[i], word, 4);
|
||||
//sprnames[i][4] = 0;
|
||||
CONS_Printf("Sprite SPR_%s allocated.\n",word);
|
||||
|
||||
@@ -351,22 +353,26 @@ static void readfreeslots(MYFILE *f)
|
||||
used_spr[(i-SPR_FIRSTFREESLOT)/8] |= 1<<(i%8); // Okay, this sprite slot has been named now.
|
||||
break;
|
||||
}
|
||||
|
||||
if (i > SPR_LASTFREESLOT)
|
||||
I_Error("Out of Sprite Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||
}
|
||||
else if (fastcmp(type, "S"))
|
||||
{
|
||||
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
||||
if (!FREE_STATES[i]) {
|
||||
CONS_Printf("State S_%s allocated.\n",word);
|
||||
{
|
||||
if (!FREE_STATES[i])
|
||||
{
|
||||
CONS_Printf("State S_%s allocated.\n", word);
|
||||
|
||||
LUA_InvalidateMathlibCache(va("S_%s", word));
|
||||
|
||||
FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
||||
strcpy(FREE_STATES[i],word);
|
||||
strcpy(FREE_STATES[i], word);
|
||||
freeslotusage[0][0]++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == NUMSTATEFREESLOTS)
|
||||
I_Error("Out of State Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||
@@ -374,16 +380,19 @@ static void readfreeslots(MYFILE *f)
|
||||
else if (fastcmp(type, "MT"))
|
||||
{
|
||||
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
||||
if (!FREE_MOBJS[i]) {
|
||||
CONS_Printf("MobjType MT_%s allocated.\n",word);
|
||||
{
|
||||
if (!FREE_MOBJS[i])
|
||||
{
|
||||
CONS_Printf("MobjType MT_%s allocated.\n", word);
|
||||
|
||||
LUA_InvalidateMathlibCache(va("MT_%s", word));
|
||||
|
||||
FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
||||
strcpy(FREE_MOBJS[i],word);
|
||||
strcpy(FREE_MOBJS[i], word);
|
||||
freeslotusage[1][0]++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == NUMMOBJFREESLOTS)
|
||||
I_Error("Out of Mobj Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||
@@ -426,8 +435,11 @@ static void readthing(MYFILE *f, INT32 num)
|
||||
strupr(word2);
|
||||
else
|
||||
break;
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
|
||||
const size_t word2len = strlen(word2);
|
||||
|
||||
if (word2[word2len-1] == '\n')
|
||||
word2[word2len-1] = '\0';
|
||||
|
||||
if (fastcmp(word, "MAPTHINGNUM") || fastcmp(word, "DOOMEDNUM"))
|
||||
{
|
||||
@@ -734,14 +746,20 @@ static void readlevelheader(MYFILE *f, INT32 num, INT32 wadnum)
|
||||
{
|
||||
UINT16 tol = 0;
|
||||
tmp = strtok(word2,",");
|
||||
|
||||
do {
|
||||
for (i = 0; TYPEOFLEVEL[i].name; i++)
|
||||
{
|
||||
if (fastcmp(tmp, TYPEOFLEVEL[i].name))
|
||||
break;
|
||||
}
|
||||
|
||||
if (!TYPEOFLEVEL[i].name)
|
||||
deh_warning("Level header %d: unknown typeoflevel flag %s\n", num, tmp);
|
||||
|
||||
tol |= TYPEOFLEVEL[i].flag;
|
||||
} while((tmp = strtok(NULL,",")) != NULL);
|
||||
|
||||
mapheaderinfo[num-1]->typeoflevel = tol;
|
||||
}
|
||||
}
|
||||
@@ -1037,8 +1055,11 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
|
||||
else
|
||||
break;
|
||||
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
const size_t word2len = strlen(word2);
|
||||
|
||||
if (word2[word2len-1] == '\n')
|
||||
word2[word2len-1] = '\0';
|
||||
|
||||
i = atoi(word2);
|
||||
usi = (UINT16)i;
|
||||
|
||||
@@ -1088,12 +1109,14 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
|
||||
else if (fastcmp(word, "MUSICSLOT"))
|
||||
{
|
||||
i = get_mus(word2, true);
|
||||
|
||||
if (i && i <= 1035)
|
||||
snprintf(cutscenes[num]->scene[scenenum].musswitch, 7, "%sM", G_BuildMapName(i));
|
||||
else if (i && i <= 1050)
|
||||
strncpy(cutscenes[num]->scene[scenenum].musswitch, compat_special_music_slots[i - 1036], 7);
|
||||
else
|
||||
cutscenes[num]->scene[scenenum].musswitch[0] = 0; // becomes empty string
|
||||
|
||||
cutscenes[num]->scene[scenenum].musswitch[6] = 0;
|
||||
}
|
||||
#endif
|
||||
@@ -1498,8 +1521,11 @@ static void readframe(MYFILE *f, INT32 num)
|
||||
strupr(word2);
|
||||
else
|
||||
break;
|
||||
if (word2[strlen(word2)-1] == '\n')
|
||||
word2[strlen(word2)-1] = '\0';
|
||||
|
||||
const size_t word2len = strlen(word2);
|
||||
|
||||
if (word2[word2len-1] == '\n')
|
||||
word2[word2len-1] = '\0';
|
||||
|
||||
if (fastcmp(word1, "SPRITENUMBER") || fastcmp(word1, "SPRITENAME"))
|
||||
{
|
||||
@@ -1828,13 +1854,19 @@ static void readextraemblemdata(MYFILE *f, INT32 num)
|
||||
value = atoi(word2); // used for numerical settings
|
||||
|
||||
if (fastcmp(word, "NAME"))
|
||||
{
|
||||
deh_strlcpy(extraemblems[num-1].name, word2,
|
||||
sizeof (extraemblems[num-1].name), va("Extra emblem %d: name", num));
|
||||
sizeof (extraemblems[num-1].name), va("Extra emblem %d: name", num));
|
||||
}
|
||||
else if (fastcmp(word, "OBJECTIVE"))
|
||||
{
|
||||
deh_strlcpy(extraemblems[num-1].description, word2,
|
||||
sizeof (extraemblems[num-1].description), va("Extra emblem %d: objective", num));
|
||||
sizeof (extraemblems[num-1].description), va("Extra emblem %d: objective", num));
|
||||
}
|
||||
else if (fastcmp(word, "CONDITIONSET"))
|
||||
{
|
||||
extraemblems[num-1].conditionset = (UINT8)value;
|
||||
}
|
||||
else if (fastcmp(word, "SPRITE"))
|
||||
{
|
||||
if (word2[0] >= 'A' && word2[0] <= 'Z')
|
||||
@@ -1906,11 +1938,15 @@ static void readunlockable(MYFILE *f, INT32 num)
|
||||
i = atoi(word2); // used for numerical settings
|
||||
|
||||
if (fastcmp(word, "NAME"))
|
||||
{
|
||||
deh_strlcpy(unlockables[num].name, word2,
|
||||
sizeof (unlockables[num].name), va("Unlockable %d: name", num));
|
||||
sizeof (unlockables[num].name), va("Unlockable %d: name", num));
|
||||
}
|
||||
else if (fastcmp(word, "OBJECTIVE"))
|
||||
{
|
||||
deh_strlcpy(unlockables[num].objective, word2,
|
||||
sizeof (unlockables[num].objective), va("Unlockable %d: objective", num));
|
||||
sizeof (unlockables[num].objective), va("Unlockable %d: objective", num));
|
||||
}
|
||||
else if (fastcmp(word, "SHOWCONDITIONSET"))
|
||||
unlockables[num].showconditionset = (UINT8)i;
|
||||
else if (fastcmp(word, "CONDITIONSET"))
|
||||
@@ -8102,7 +8138,7 @@ static mobjtype_t get_mobjtype(const char *word)
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("MT_",word,3))
|
||||
if (fastncmp("MT_", word, 3))
|
||||
word += 3; // take off the MT_
|
||||
|
||||
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
||||
@@ -8128,7 +8164,7 @@ static statenum_t get_state(const char *word)
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("S_",word,2))
|
||||
if (fastncmp("S_", word, 2))
|
||||
word += 2; // take off the S_
|
||||
|
||||
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
||||
@@ -8155,11 +8191,11 @@ static spritenum_t get_sprite(const char *word)
|
||||
if (*word >= '0' && *word <= '9')
|
||||
return atoi(word);
|
||||
|
||||
if (fastncmp("SPR_",word,4))
|
||||
if (fastncmp("SPR_", word, 4))
|
||||
word += 4; // take off the SPR_
|
||||
|
||||
for (i = 0; i < NUMSPRITES; i++)
|
||||
if (!sprnames[i][4] && memcmp(word,sprnames[i],4) == 0)
|
||||
if (!sprnames[i][4] && memcmp(word, sprnames[i], 4) == 0)
|
||||
return i;
|
||||
|
||||
deh_warning("Couldn't find sprite named 'SPR_%s'",word);
|
||||
@@ -8200,14 +8236,15 @@ static UINT16 get_mus(const char *word, UINT8 dehacked_mode)
|
||||
if (!word[2] && toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z')
|
||||
return (UINT16)M_MapNumber(word[0], word[1]);
|
||||
|
||||
if (fastncmp("MUS_",word,4))
|
||||
if (fastncmp("MUS_", word, 4))
|
||||
word += 4; // take off the MUS_
|
||||
else if (fastncmp("O_",word,2) || fastncmp("D_",word,2))
|
||||
else if (fastncmp("O_", word, 2) || fastncmp("D_", word, 2))
|
||||
word += 2; // take off the O_ or D_
|
||||
|
||||
strncpy(lumptmp, word, 4);
|
||||
lumptmp[3] = 0;
|
||||
if (fasticmp("MAP",lumptmp))
|
||||
|
||||
if (fasticmp("MAP", lumptmp))
|
||||
{
|
||||
word += 3;
|
||||
if (toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z')
|
||||
@@ -8320,7 +8357,7 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
sfxenum_t sfx;
|
||||
strlwr(word);
|
||||
CONS_Printf("Sound sfx_%s allocated.\n",word);
|
||||
CONS_Printf("Sound sfx_%s allocated.\n", word);
|
||||
sfx = S_AddSoundFx(word, false, 0, false);
|
||||
|
||||
if (sfx != sfx_None)
|
||||
@@ -8344,8 +8381,10 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
if (!sprnames[j][4] && memcmp(sprnames[j], word, 4) == 0)
|
||||
sprnames[j][4] = wad;
|
||||
|
||||
continue; // Already allocated, next.
|
||||
}
|
||||
|
||||
// Found a free slot!
|
||||
CONS_Printf("Sprite SPR_%s allocated.\n",word);
|
||||
|
||||
@@ -8353,7 +8392,7 @@ static inline int lib_freeslot(lua_State *L)
|
||||
lua_pushfstring(L, "SPR_%s", word);
|
||||
lua_call(L, 1, 0);
|
||||
|
||||
strncpy(sprnames[j],word,4);
|
||||
strncpy(sprnames[j], word, 4);
|
||||
//sprnames[j][4] = 0;
|
||||
used_spr[(j-SPR_FIRSTFREESLOT)/8] |= 1<<(j%8); // Okay, this sprite slot has been named now.
|
||||
lua_pushinteger(L, j);
|
||||
@@ -8371,7 +8410,7 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
if (!FREE_STATES[i])
|
||||
{
|
||||
CONS_Printf("State S_%s allocated.\n",word);
|
||||
CONS_Printf("State S_%s allocated.\n", word);
|
||||
|
||||
lua_pushcfunction(L, lua_glib_invalidate_cache);
|
||||
lua_pushfstring(L, "S_%s", word);
|
||||
@@ -8396,14 +8435,14 @@ static inline int lib_freeslot(lua_State *L)
|
||||
{
|
||||
if (!FREE_MOBJS[i])
|
||||
{
|
||||
CONS_Printf("MobjType MT_%s allocated.\n",word);
|
||||
CONS_Printf("MobjType MT_%s allocated.\n", word);
|
||||
|
||||
lua_pushcfunction(L, lua_glib_invalidate_cache);
|
||||
lua_pushfstring(L, "MT_%s", word);
|
||||
lua_call(L, 1, 0);
|
||||
|
||||
FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
||||
strcpy(FREE_MOBJS[i],word);
|
||||
strcpy(FREE_MOBJS[i], word);
|
||||
freeslotusage[1][0]++;
|
||||
lua_pushinteger(L, i);
|
||||
r++;
|
||||
@@ -8590,6 +8629,7 @@ static int lua_enumlib_mobjtype_get(lua_State *L)
|
||||
{
|
||||
if (!FREE_MOBJS[i])
|
||||
break;
|
||||
|
||||
if (fastcmp(s+3, FREE_MOBJS[i]))
|
||||
{
|
||||
lua_pushinteger(L, MT_FIRSTFREESLOT+i);
|
||||
@@ -8678,30 +8718,29 @@ static int lua_enumlib_sfx_get_ds(lua_State *L)
|
||||
}
|
||||
|
||||
#ifdef MUSICSLOT_COMPATIBILITY
|
||||
static int lua_enumlib_mus_get(lua_State *L)
|
||||
{
|
||||
const char *name = strchr(lua_tostring(L, 1), '_') + 1;
|
||||
int mus = get_mus(name, false);
|
||||
|
||||
static int lua_enumlib_mus_get(lua_State *L)
|
||||
{
|
||||
const char *name = strchr(lua_tostring(L, 1), '_') + 1;
|
||||
int mus = get_mus(name, false);
|
||||
if (mus == 0)
|
||||
return 0;
|
||||
|
||||
if (mus == 0)
|
||||
return 0;
|
||||
lua_pushinteger(L, mus);
|
||||
return 1;
|
||||
}
|
||||
|
||||
lua_pushinteger(L, mus);
|
||||
return 1;
|
||||
}
|
||||
static int lua_enumlib_mus_get_mathlib(lua_State *L)
|
||||
{
|
||||
const char *name = strchr(lua_tostring(L, 1), '_') + 1;
|
||||
int mus = get_mus(name, false);
|
||||
|
||||
static int lua_enumlib_mus_get_mathlib(lua_State *L)
|
||||
{
|
||||
const char *name = strchr(lua_tostring(L, 1), '_') + 1;
|
||||
int mus = get_mus(name, false);
|
||||
if (mus == 0)
|
||||
return luaL_error(L, "music '%s' could not be found.\n", lua_tostring(L, 1));
|
||||
|
||||
if (mus == 0)
|
||||
return luaL_error(L, "music '%s' could not be found.\n", lua_tostring(L, 1));
|
||||
|
||||
lua_pushinteger(L, mus);
|
||||
return 1;
|
||||
}
|
||||
lua_pushinteger(L, mus);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int lua_enumlib_power_get(lua_State *L)
|
||||
|
||||
+3
-1
@@ -81,10 +81,12 @@ typedef struct
|
||||
INT16 flags;
|
||||
INT16 special;
|
||||
INT16 tag;
|
||||
// sidenum[1] will be 0xffff if one sided
|
||||
// sidenum[1] will be NO_INDEX if one sided
|
||||
UINT16 sidenum[2];
|
||||
} ATTRPACK maplinedef_t;
|
||||
|
||||
#define NO_INDEX 0xffff
|
||||
|
||||
//
|
||||
// LineDef attributes.
|
||||
//
|
||||
|
||||
@@ -602,6 +602,9 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||
// None of these that are disabled in the normal build are guaranteed to work perfectly
|
||||
// Compile them at your own risk!
|
||||
|
||||
// undefine to enable fixes and features that are not vanilla compatible
|
||||
#define COMPAT_VANILLA
|
||||
|
||||
//-- SATURN __
|
||||
/// Detect if a client is on Saturn in the clientconfig.
|
||||
/// To seperately allow them to join or block joining from vanilla clients.
|
||||
@@ -666,6 +669,14 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||
#undef UPDATE_ALERT
|
||||
#endif
|
||||
|
||||
// overwrite some of those
|
||||
// when not compiling in vanilla compat mode
|
||||
#ifndef COMPAT_VANILLA
|
||||
#define SATURNJOIN
|
||||
#define SATURNPAK
|
||||
#undef SEENAMES
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
+1
-4
@@ -361,10 +361,7 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
||||
// on for fade-to-black
|
||||
for (;;)
|
||||
{
|
||||
if (I_Interrupted())
|
||||
{
|
||||
I_Quit();
|
||||
}
|
||||
I_HandleInterrupt();
|
||||
|
||||
// get fademask first so we can tell if it exists or not
|
||||
fmask = F_GetFadeMask(wipetype, wipeframe++);
|
||||
|
||||
+10
-10
@@ -515,49 +515,49 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
||||
|
||||
if (cmd->forwardmove != oldcmd[playernum].forwardmove)
|
||||
{
|
||||
WRITEUINT8(demobuf.p,cmd->forwardmove);
|
||||
WRITEUINT8(demobuf.p, cmd->forwardmove);
|
||||
oldcmd[playernum].forwardmove = cmd->forwardmove;
|
||||
ziptic |= ZT_FWD;
|
||||
}
|
||||
|
||||
if (cmd->sidemove != oldcmd[playernum].sidemove)
|
||||
{
|
||||
WRITEUINT8(demobuf.p,cmd->sidemove);
|
||||
WRITEUINT8(demobuf.p, cmd->sidemove);
|
||||
oldcmd[playernum].sidemove = cmd->sidemove;
|
||||
ziptic |= ZT_SIDE;
|
||||
}
|
||||
|
||||
if (cmd->angleturn != oldcmd[playernum].angleturn)
|
||||
{
|
||||
WRITEINT16(demobuf.p,cmd->angleturn);
|
||||
WRITEINT16(demobuf.p, cmd->angleturn);
|
||||
oldcmd[playernum].angleturn = cmd->angleturn;
|
||||
ziptic |= ZT_ANGLE;
|
||||
}
|
||||
|
||||
if (cmd->buttons != oldcmd[playernum].buttons)
|
||||
{
|
||||
WRITEUINT16(demobuf.p,cmd->buttons);
|
||||
WRITEUINT16(demobuf.p, cmd->buttons);
|
||||
oldcmd[playernum].buttons = cmd->buttons;
|
||||
ziptic |= ZT_BUTTONS;
|
||||
}
|
||||
|
||||
if (cmd->aiming != oldcmd[playernum].aiming)
|
||||
{
|
||||
WRITEINT16(demobuf.p,cmd->aiming);
|
||||
WRITEINT16(demobuf.p, cmd->aiming);
|
||||
oldcmd[playernum].aiming = cmd->aiming;
|
||||
ziptic |= ZT_AIMING;
|
||||
}
|
||||
|
||||
if (cmd->driftturn != oldcmd[playernum].driftturn)
|
||||
{
|
||||
WRITEINT16(demobuf.p,cmd->driftturn);
|
||||
WRITEINT16(demobuf.p, cmd->driftturn);
|
||||
oldcmd[playernum].driftturn = cmd->driftturn;
|
||||
ziptic |= ZT_DRIFT;
|
||||
}
|
||||
|
||||
if (cmd->latency != oldcmd[playernum].latency)
|
||||
{
|
||||
WRITEUINT8(demobuf.p,cmd->latency);
|
||||
WRITEUINT8(demobuf.p, cmd->latency);
|
||||
oldcmd[playernum].latency = cmd->latency;
|
||||
ziptic |= ZT_LATENCY;
|
||||
}
|
||||
@@ -726,8 +726,8 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
|
||||
|
||||
// GZT_XYZ is only useful if you've moved 256 FRACUNITS or more in a single tic.
|
||||
if (abs(ghost->x-oldghost[playernum].x) > MAXMOM
|
||||
|| abs(ghost->y-oldghost[playernum].y) > MAXMOM
|
||||
|| abs(ghost->z-oldghost[playernum].z) > MAXMOM
|
||||
|| abs(ghost->y-oldghost[playernum].y) > MAXMOM
|
||||
|| abs(ghost->z-oldghost[playernum].z) > MAXMOM
|
||||
|| ((UINT8)(leveltime & 255) > 0 && (UINT8)(leveltime & 255) <= (UINT8)cv_netdemosyncquality.value)) // Hack to enable slightly nicer resyncing
|
||||
{
|
||||
oldghost[playernum].x = ghost->x;
|
||||
@@ -1375,7 +1375,7 @@ fadeghost:
|
||||
UINT16 i, health;
|
||||
UINT16 count = READUINT16(g->p);
|
||||
//UINT32 type;
|
||||
fixed_t x,y,z;
|
||||
fixed_t x, y, z;
|
||||
angle_t angle;
|
||||
mobj_t *poof;
|
||||
|
||||
|
||||
+16
-11
@@ -66,8 +66,6 @@ boolean botingame = false;
|
||||
UINT8 botskin = 0;
|
||||
UINT8 botcolor = 0;
|
||||
|
||||
JoyType_t Joystick[MAXSPLITSCREENPLAYERS] = {};
|
||||
|
||||
// SRB2kart
|
||||
char gamedatafilename[64] = "kartdata.dat";
|
||||
char timeattackfolder[64] = "kart";
|
||||
@@ -755,7 +753,7 @@ INT32 JoyAxis(axis_input_e axissel, UINT8 player)
|
||||
if (retaxis > (+JOYAXISRANGE))
|
||||
retaxis = +JOYAXISRANGE;
|
||||
|
||||
if (!Joystick[pnum].bGamepadStyle && axissel < AXISDEAD)
|
||||
if (!DigitalGamepadStyle(pnum) && axissel < AXISDEAD)
|
||||
{
|
||||
const INT32 jdeadzone = ((JOYAXISRANGE-1) * deadzone) >> FRACBITS;
|
||||
|
||||
@@ -803,8 +801,8 @@ static void G_HandleLocalDriftturn(ticcmd_t *cmd, UINT8 ssplayer)
|
||||
|
||||
const UINT8 forplayer = (ssplayer-1);
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle;
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !DigitalGamepadStyle(forplayer);
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && DigitalGamepadStyle(forplayer);
|
||||
|
||||
turnright = InputDown(gc_turnright, ssplayer);
|
||||
turnleft = InputDown(gc_turnleft, ssplayer);
|
||||
@@ -992,10 +990,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||
player_t *player = P_GetLocalPlayerForNum(forplayer);
|
||||
|
||||
camera_t *thiscam = &camera[forplayer];
|
||||
const boolean freecam = camera[forplayer].freecam;
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle;
|
||||
const boolean freecam = thiscam->freecam;
|
||||
|
||||
lang = localangle[forplayer];
|
||||
laim = localaiming[forplayer];
|
||||
@@ -1027,6 +1022,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||
return;
|
||||
}
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !DigitalGamepadStyle(forplayer);
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && DigitalGamepadStyle(forplayer);
|
||||
|
||||
usejoystick = (analogjoystickmove || gamepadjoystickmove);
|
||||
turnright = InputDown(gc_turnright, ssplayer);
|
||||
turnleft = InputDown(gc_turnleft, ssplayer);
|
||||
@@ -1311,6 +1309,7 @@ static void G_DoLoadLevel(boolean resetplayer)
|
||||
{
|
||||
// fail so reset game stuff
|
||||
Command_ExitGame_f();
|
||||
P_FreeCorruptMapWarnings();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1344,6 +1343,8 @@ static void G_DoLoadLevel(boolean resetplayer)
|
||||
|
||||
// clear hud messages remains (usually from game startup)
|
||||
CON_ClearHUD();
|
||||
// print any map errors now due to clearhud above :chaosleep:
|
||||
P_PrintCorruptMapWarnings();
|
||||
|
||||
server_lagless = !cv_gentlemens.value;
|
||||
|
||||
@@ -4089,6 +4090,7 @@ char *G_BuildMapTitle(INT32 mapnum)
|
||||
const char *actnum = NULL;
|
||||
|
||||
len += strlen(mapheaderinfo[mapnum-1]->lvlttl);
|
||||
|
||||
if (strlen(mapheaderinfo[mapnum-1]->zonttl) > 0)
|
||||
{
|
||||
zonetext = M_GetText(mapheaderinfo[mapnum-1]->zonttl);
|
||||
@@ -4099,6 +4101,7 @@ char *G_BuildMapTitle(INT32 mapnum)
|
||||
zonetext = M_GetText("Zone");
|
||||
len += strlen(zonetext) + 1; // ' ' + zonetext
|
||||
}
|
||||
|
||||
if (strlen(mapheaderinfo[mapnum-1]->actnum) > 0)
|
||||
{
|
||||
actnum = M_GetText(mapheaderinfo[mapnum-1]->actnum);
|
||||
@@ -4112,8 +4115,10 @@ char *G_BuildMapTitle(INT32 mapnum)
|
||||
|
||||
sprintf(title, "%s", mapheaderinfo[mapnum-1]->lvlttl);
|
||||
|
||||
if (zonetext) sprintf(title + strlen(title), " %s", zonetext);
|
||||
if (actnum) sprintf(title + strlen(title), " %s", actnum);
|
||||
if (zonetext)
|
||||
sprintf(title + strlen(title), " %s", zonetext);
|
||||
if (actnum)
|
||||
sprintf(title + strlen(title), " %s", actnum);
|
||||
}
|
||||
|
||||
return title;
|
||||
|
||||
@@ -373,7 +373,7 @@ static poly_t *CutOutSubsecPoly(seg_t *lseg, INT32 count, poly_t *poly)
|
||||
if (!gl_maphashorizonlines && line->special == HORIZONSPECIAL)
|
||||
gl_maphashorizonlines = true;
|
||||
|
||||
if (line->sidenum[1] != 0xffff)
|
||||
if (line->sidenum[1] != NO_INDEX)
|
||||
{
|
||||
if (sides[line->sidenum[0]].sector == sides[line->sidenum[1]].sector)
|
||||
{
|
||||
|
||||
+10
-5
@@ -446,7 +446,7 @@ typedef struct
|
||||
} GLMapTextureSet_t; // idk i suck at naming things
|
||||
|
||||
static size_t gl_numtextures = 0; // Texture count
|
||||
static GLMapTextureSet_t *gl_textures; // For all textures
|
||||
static GLMapTextureSet_t *gl_textures = NULL; // For all textures
|
||||
|
||||
static void HWR_FreeTextureData(patch_t *patch)
|
||||
{
|
||||
@@ -570,7 +570,8 @@ void HWR_ClearAllTextures(void)
|
||||
/*static void HWR_FreeColormapCache(void)
|
||||
{
|
||||
HWR_FreePatchCache(false);
|
||||
}*/
|
||||
}
|
||||
*/
|
||||
|
||||
void HWR_InitMapTextures(void)
|
||||
{
|
||||
@@ -622,10 +623,12 @@ static void HWR_PrecacheLevelFlats(void)
|
||||
{
|
||||
// lookup for flats that may´ve been already loaded
|
||||
flatcheck flatpresent;
|
||||
flatcheck_init(&flatpresent);
|
||||
size_t i, j;
|
||||
INT32 k;
|
||||
|
||||
flatcheck_init(&flatpresent);
|
||||
flatcheck_reserve(&flatpresent, numlevelflats);
|
||||
|
||||
// special case for encore
|
||||
#ifdef GLENCORE
|
||||
if (encoremap)
|
||||
@@ -726,7 +729,7 @@ static void HWR_PrecacheLevelTextures(void)
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
// check if single-sided linedef
|
||||
if (line->sidenum[j] == 0xffff)
|
||||
if (line->sidenum[j] == NO_INDEX)
|
||||
continue;
|
||||
|
||||
const side_t *side = &sides[line->sidenum[j]];
|
||||
@@ -989,7 +992,6 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
||||
|
||||
flat[steppy] = glMipmap->colormap->source[flat[steppy]];
|
||||
}
|
||||
#endif
|
||||
|
||||
if (haschromakey)
|
||||
{
|
||||
@@ -1001,6 +1003,7 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
|
||||
glMipmap->flags &= ~TF_CHROMAKEYED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Download a Doom 'flat' to the hardware cache and make it ready for use
|
||||
@@ -1127,7 +1130,9 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
|
||||
HWR_UpdatePatchMipmap(patch, glMipmap);
|
||||
}
|
||||
else
|
||||
{
|
||||
HWR_LoadPatchMipmap(patch, glMipmap);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
+203
-379
@@ -1078,15 +1078,15 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum,
|
||||
{
|
||||
bheight = FixedToFloat(P_GetFFloorBottomZAt(list[i].caster, v1x, v1y));
|
||||
endbheight = FixedToFloat(P_GetFFloorBottomZAt(list[i].caster, v2x, v2y));
|
||||
}
|
||||
|
||||
if (endheight >= endtop && height >= top)
|
||||
{
|
||||
if (solid && top > bheight)
|
||||
top = bheight;
|
||||
if (endheight >= endtop && height >= top)
|
||||
{
|
||||
if (top > bheight)
|
||||
top = bheight;
|
||||
|
||||
if (solid && endtop > endbheight)
|
||||
endtop = endbheight;
|
||||
if (endtop > endbheight)
|
||||
endtop = endbheight;
|
||||
}
|
||||
}
|
||||
|
||||
if (i + 1 < sector->numlights)
|
||||
@@ -1167,7 +1167,6 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum,
|
||||
|
||||
static FOutVector* skyWallVertexArray = NULL;
|
||||
static int skyWallVertexArraySize = 0;
|
||||
static int skyWallVertexArrayAllocSize = 65536;// what a mouthful
|
||||
|
||||
static boolean gl_collect_skywalls = false;
|
||||
|
||||
@@ -1178,13 +1177,14 @@ static void HWR_SkyWallList_Clear(void)
|
||||
|
||||
static void HWR_SkyWallList_Add(FOutVector *wallVerts)
|
||||
{
|
||||
static int skyWallVertexArrayAllocSize = 65536; // what a mouthful
|
||||
|
||||
if (!skyWallVertexArray)
|
||||
{
|
||||
// array has not been allocated yet. allocate it now
|
||||
skyWallVertexArray = static_cast<FOutVector*>(Z_Malloc(sizeof(FOutVector) * 4 * skyWallVertexArrayAllocSize, PU_STATIC, NULL));
|
||||
}
|
||||
|
||||
if (skyWallVertexArraySize == skyWallVertexArrayAllocSize)
|
||||
else if (skyWallVertexArraySize >= skyWallVertexArrayAllocSize)
|
||||
{
|
||||
// allocated array got full, allocate more space
|
||||
skyWallVertexArrayAllocSize *= 2;
|
||||
@@ -1222,7 +1222,7 @@ static void HWR_DrawSkyWall(FOutVector *wallVerts, FSurfaceInfo *Surf)
|
||||
wallVerts[0].s = wallVerts[3].s = 0;
|
||||
wallVerts[2].s = wallVerts[1].s = 0;
|
||||
|
||||
if (UNLIKELY(gl_collect_skywalls))
|
||||
if (gl_collect_skywalls)
|
||||
{
|
||||
HWR_SkyWallList_Add(wallVerts);
|
||||
}
|
||||
@@ -1231,6 +1231,7 @@ static void HWR_DrawSkyWall(FOutVector *wallVerts, FSurfaceInfo *Surf)
|
||||
HWR_SetCurrentTexture(NULL);
|
||||
HWR_ProjectWall(wallVerts, Surf, PF_Invisible|PF_NoTexture|PF_Skydecal, 255, NULL);
|
||||
}
|
||||
|
||||
// PF_Invisible so it's not drawn into the colour buffer
|
||||
// PF_NoTexture for no texture
|
||||
// PF_Occlude is set in HWR_ProjectWall to draw into the depth buffer
|
||||
@@ -1402,11 +1403,12 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
// Sky Ceilings
|
||||
wallVerts[3].y = wallVerts[2].y = FLOATMAX;
|
||||
|
||||
auto draw_sky_walls = [&](int vert1, int vert2, fixed_t world, fixed_t worldslope)
|
||||
auto draw_sky_walls = []
|
||||
(int vert1, int vert2, fixed_t world, fixed_t worldslope, auto& wwallVerts, auto& sSurf) FUNCINLINE
|
||||
{
|
||||
wallVerts[vert1].y = FixedToFloat(world);
|
||||
wallVerts[vert2].y = FixedToFloat(worldslope);
|
||||
HWR_DrawSkyWall(wallVerts, &Surf);
|
||||
wwallVerts[vert1].y = FixedToFloat(world);
|
||||
wwallVerts[vert2].y = FixedToFloat(worldslope);
|
||||
HWR_DrawSkyWall(wwallVerts, &sSurf);
|
||||
};
|
||||
|
||||
if (gl_frontsector->ceilingpic == skyflatnum)
|
||||
@@ -1419,7 +1421,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
&& (worldhigh != worldtop || worldhighslope != worldtopslope))
|
||||
// Removing the second line above will render more rarely visible skywalls. Example: Cave garden ceiling in Dark race
|
||||
{
|
||||
draw_sky_walls(0, 1, worldhigh, worldhighslope);
|
||||
draw_sky_walls(0, 1, worldhigh, worldhighslope, wallVerts, Surf);
|
||||
}
|
||||
|
||||
// hack to allow height changes in outdoor areas
|
||||
@@ -1430,13 +1432,13 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
else
|
||||
{
|
||||
// Only the frontsector is sky, just draw a skywall from the front ceiling
|
||||
draw_sky_walls(0, 1, worldtop, worldtopslope);
|
||||
draw_sky_walls(0, 1, worldtop, worldtopslope, wallVerts, Surf);
|
||||
}
|
||||
}
|
||||
else if (gl_backsector->ceilingpic == skyflatnum)
|
||||
{
|
||||
// Only the backsector is sky, just draw a skywall from the front ceiling
|
||||
draw_sky_walls(0, 1, worldtop, worldtopslope);
|
||||
draw_sky_walls(0, 1, worldtop, worldtopslope, wallVerts, Surf);
|
||||
}
|
||||
|
||||
// Sky Floors
|
||||
@@ -1454,19 +1456,19 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
// Removing the second line above will render more rarely visible skywalls. Example: Cave garden ceiling in Dark race
|
||||
&& !(gl_sidedef->bottomtexture))
|
||||
{
|
||||
draw_sky_walls(3, 2, worldlow, worldlowslope);
|
||||
draw_sky_walls(3, 2, worldlow, worldlowslope, wallVerts, Surf);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only the backsector has sky, just draw a skywall from the back floor
|
||||
draw_sky_walls(3, 2, worldbottom, worldbottomslope);
|
||||
draw_sky_walls(3, 2, worldbottom, worldbottomslope, wallVerts, Surf);
|
||||
}
|
||||
}
|
||||
else if ((gl_backsector->floorpic == skyflatnum) && !(gl_sidedef->bottomtexture))
|
||||
{
|
||||
// Only the backsector has sky, just draw a skywall from the back floor if there's no bottomtexture
|
||||
draw_sky_walls(3, 2, worldlow, worldlowslope);
|
||||
draw_sky_walls(3, 2, worldlow, worldlowslope, wallVerts, Surf);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1854,6 +1856,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
|
||||
HWR_DrawSkyWall(wallVerts, &Surf);
|
||||
}
|
||||
|
||||
if (gl_frontsector->floorpic == skyflatnum)
|
||||
{
|
||||
wallVerts[3].y = FixedToFloat(worldbottom);
|
||||
@@ -1868,28 +1871,38 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
//Hurdler: 3d-floors test
|
||||
if (!gl_drawing_stencil && gl_backsector && gl_frontsector->tag != gl_backsector->tag && (gl_backsector->ffloors || gl_frontsector->ffloors))
|
||||
{
|
||||
ffloor_t *rover;
|
||||
fixed_t highcut = 0, lowcut = 0;
|
||||
fixed_t lowcutslope = 0, highcutslope = 0;
|
||||
|
||||
// Used for height comparisons and etc across FOFs and slopes
|
||||
fixed_t high1, highslope1, low1, lowslope1;
|
||||
fixed_t high2, highslope2, low2, lowslope2;
|
||||
|
||||
INT32 texnum;
|
||||
|
||||
lowcut = std::max(worldbottom, worldlow);
|
||||
highcut = std::min(worldtop, worldhigh);
|
||||
lowcutslope = std::max(worldbottomslope, worldlowslope);
|
||||
highcutslope = std::min(worldtopslope, worldhighslope);
|
||||
|
||||
if (gl_backsector->ffloors)
|
||||
auto process_ffloors = [&](boolean backsec) FUNCINLINE
|
||||
{
|
||||
for (rover = gl_backsector->ffloors; rover; rover = rover->next)
|
||||
ffloor_t *rover;
|
||||
INT32 texnum;
|
||||
|
||||
// Used for height comparisons and etc across FOFs and slopes
|
||||
fixed_t high1, highslope1, low1, lowslope1;
|
||||
fixed_t high2, highslope2, low2, lowslope2;
|
||||
|
||||
// i suck at naming stuff lul
|
||||
sector_t* main_sector = backsec ? gl_backsector : gl_frontsector;
|
||||
sector_t* other_sector = backsec ? gl_frontsector : gl_backsector;
|
||||
|
||||
for (rover = main_sector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
const ffloortype_e roverflags = rover->flags;
|
||||
|
||||
if (!(roverflags & FF_EXISTS) || !(roverflags & FF_RENDERSIDES) || (roverflags & FF_INVERTSIDES))
|
||||
if (!(roverflags & FF_EXISTS) || !(roverflags & FF_RENDERSIDES))
|
||||
continue;
|
||||
|
||||
if (backsec && (roverflags & FF_INVERTSIDES))
|
||||
continue;
|
||||
|
||||
if (!backsec && !(roverflags & FF_ALLSIDES))
|
||||
continue;
|
||||
|
||||
SLOPEPARAMS(*rover->t_slope, high1, highslope1, *rover->topheight)
|
||||
@@ -1899,7 +1912,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
continue;
|
||||
|
||||
ffloor_t * r2;
|
||||
for (r2 = gl_frontsector->ffloors; r2; r2 = r2->next)
|
||||
for (r2 = other_sector->ffloors; r2; r2 = r2->next)
|
||||
{
|
||||
if (r2->master == rover->master) // Skip if same control line.
|
||||
break;
|
||||
@@ -1937,14 +1950,14 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
if (r2)
|
||||
continue;
|
||||
|
||||
side_t *side = R_GetFFloorSide(gl_curline->linedef, rover, gl_backsector);
|
||||
const side_t *side = R_GetFFloorSide(gl_curline->linedef, rover, main_sector);
|
||||
|
||||
boolean do_texture_skew;
|
||||
boolean dont_peg_bottom;
|
||||
|
||||
if (rover->master->flags & ML_TFERLINE)
|
||||
{
|
||||
line_t *newline = R_GetFFloorLine(gl_curline->linedef, rover, gl_backsector);
|
||||
const line_t *newline = R_GetFFloorLine(gl_curline->linedef, rover, main_sector);
|
||||
do_texture_skew = newline->flags & ML_DONTPEGTOP;
|
||||
dont_peg_bottom = newline->flags & ML_DONTPEGBOTTOM;
|
||||
}
|
||||
@@ -1967,6 +1980,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
h = highcut;
|
||||
hS = highcutslope;
|
||||
}
|
||||
|
||||
if (l <= lowcut && lS <= lowcutslope)
|
||||
{
|
||||
l = lowcut;
|
||||
@@ -2041,8 +2055,8 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
|
||||
lightnum = HWR_CalcWallLight(lightnum, gl_curline, colormap);
|
||||
|
||||
if (gl_frontsector->numlights)
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, 0, false, &Surf, roverflags, rover, blendmode);
|
||||
if (other_sector->numlights)
|
||||
HWR_SplitWall(other_sector, wallVerts, 0, false, &Surf, roverflags, rover, blendmode);
|
||||
else
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, 0, false, blendmode, true, lightnum, colormap);
|
||||
}
|
||||
@@ -2056,8 +2070,8 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
Surf.PolyColor.s.alpha = CLAMP(rover->alpha, 0, 255);
|
||||
}
|
||||
|
||||
if (gl_frontsector->numlights)
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, texnum, noencore, &Surf, roverflags, rover, blendmode);
|
||||
if (other_sector->numlights)
|
||||
HWR_SplitWall(other_sector, wallVerts, texnum, noencore, &Surf, roverflags, rover, blendmode);
|
||||
else
|
||||
{
|
||||
if (blendmode != PF_Masked)
|
||||
@@ -2067,191 +2081,16 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (gl_backsector->ffloors)
|
||||
{
|
||||
process_ffloors(true);
|
||||
}
|
||||
|
||||
if (gl_frontsector->ffloors) // Putting this seperate should allow 2 FOF sectors to be connected without too many errors? I think?
|
||||
{
|
||||
for (rover = gl_frontsector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
const ffloortype_e roverflags = rover->flags;
|
||||
|
||||
if (!(roverflags & FF_EXISTS) || !(roverflags & FF_RENDERSIDES) || !(roverflags & FF_ALLSIDES))
|
||||
continue;
|
||||
|
||||
SLOPEPARAMS(*rover->t_slope, high1, highslope1, *rover->topheight)
|
||||
SLOPEPARAMS(*rover->b_slope, low1, lowslope1, *rover->bottomheight)
|
||||
|
||||
if ((high1 < lowcut || highslope1 < lowcutslope) || (low1 > highcut || lowslope1 > highcutslope))
|
||||
continue;
|
||||
|
||||
ffloor_t * r2;
|
||||
for (r2 = gl_backsector->ffloors; r2; r2 = r2->next)
|
||||
{
|
||||
if (r2->master == rover->master) // Skip if same control line.
|
||||
break;
|
||||
|
||||
const ffloortype_e r2flags = r2->flags;
|
||||
|
||||
if (!(r2flags & FF_EXISTS) || !(r2flags & FF_RENDERSIDES))
|
||||
continue;
|
||||
|
||||
if (rover->flags & FF_EXTRA)
|
||||
{
|
||||
if (!(r2flags & FF_CUTEXTRA))
|
||||
continue;
|
||||
|
||||
if (r2flags & FF_EXTRA && (r2flags & (FF_TRANSLUCENT|FF_FOG)) != (rover->flags & (FF_TRANSLUCENT|FF_FOG)))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(r2flags & FF_CUTSOLIDS))
|
||||
continue;
|
||||
}
|
||||
|
||||
SLOPEPARAMS(*r2->t_slope, high2, highslope2, *r2->topheight)
|
||||
SLOPEPARAMS(*r2->b_slope, low2, lowslope2, *r2->bottomheight)
|
||||
|
||||
if ((high2 < lowcut || highslope2 < lowcutslope) || (low2 > highcut || lowslope2 > highcutslope))
|
||||
continue;
|
||||
if ((high1 > high2 || highslope1 > highslope2) || (low1 < low2 || lowslope1 < lowslope2))
|
||||
continue;
|
||||
|
||||
break;
|
||||
}
|
||||
if (r2)
|
||||
continue;
|
||||
|
||||
side_t *side = R_GetFFloorSide(gl_curline->linedef, rover, gl_backsector);
|
||||
|
||||
boolean do_texture_skew;
|
||||
boolean dont_peg_bottom;
|
||||
|
||||
if (rover->master->flags & ML_TFERLINE)
|
||||
{
|
||||
line_t *newline = R_GetFFloorLine(gl_curline->linedef, rover, gl_backsector);
|
||||
do_texture_skew = newline->flags & ML_DONTPEGTOP;
|
||||
dont_peg_bottom = newline->flags & ML_DONTPEGBOTTOM;
|
||||
}
|
||||
else
|
||||
{
|
||||
do_texture_skew = rover->master->flags & ML_DONTPEGTOP;
|
||||
dont_peg_bottom = gl_curline->linedef->flags & ML_DONTPEGBOTTOM;
|
||||
}
|
||||
|
||||
texnum = R_GetTextureNum(side->midtexture);
|
||||
|
||||
h = P_GetFFloorTopZAt (rover, v1x, v1y);
|
||||
hS = P_GetFFloorTopZAt (rover, v2x, v2y);
|
||||
l = P_GetFFloorBottomZAt(rover, v1x, v1y);
|
||||
lS = P_GetFFloorBottomZAt(rover, v2x, v2y);
|
||||
|
||||
// Adjust the heights so the FOF does not overlap with top and bottom textures.
|
||||
if (h >= highcut && hS >= highcutslope)
|
||||
{
|
||||
h = highcut;
|
||||
hS = highcutslope;
|
||||
}
|
||||
if (l <= lowcut && lS <= lowcutslope)
|
||||
{
|
||||
l = lowcut;
|
||||
lS = lowcutslope;
|
||||
}
|
||||
|
||||
//Hurdler: HW code starts here
|
||||
//FIXME: check if peging is correct
|
||||
// set top/bottom coords
|
||||
|
||||
wallVerts[3].y = FixedToFloat(h);
|
||||
wallVerts[2].y = FixedToFloat(hS);
|
||||
wallVerts[0].y = FixedToFloat(l);
|
||||
wallVerts[1].y = FixedToFloat(lS);
|
||||
|
||||
if (roverflags & FF_FOG)
|
||||
{
|
||||
wallVerts[3].t = wallVerts[2].t = 0;
|
||||
wallVerts[0].t = wallVerts[1].t = 0;
|
||||
wallVerts[0].s = wallVerts[3].s = 0;
|
||||
wallVerts[2].s = wallVerts[1].s = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Wow, how was this missing from OpenGL for so long?
|
||||
// ...Oh well, anyway, Lower Unpegged now changes pegging of FOFs like in software
|
||||
// -- Monster Iestyn 26/06/18
|
||||
fixed_t texturevpeg = side->rowoffset;
|
||||
|
||||
glTex = HWR_GetTexture(texnum, noencore);
|
||||
|
||||
if (!do_texture_skew) // no skewing
|
||||
{
|
||||
if (dont_peg_bottom)
|
||||
texturevpeg -= (*rover->topheight - *rover->bottomheight);
|
||||
|
||||
wallVerts[3].t = static_cast<float>((*rover->topheight - h) + texturevpeg) * glTex->scaleY;
|
||||
wallVerts[2].t = static_cast<float>((*rover->topheight - hS) + texturevpeg) * glTex->scaleY;
|
||||
wallVerts[0].t = static_cast<float>((*rover->topheight - l) + texturevpeg) * glTex->scaleY;
|
||||
wallVerts[1].t = static_cast<float>((*rover->topheight - lS) + texturevpeg) * glTex->scaleY;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!dont_peg_bottom) // skew by top
|
||||
{
|
||||
wallVerts[3].t = wallVerts[2].t = (static_cast<float>(texturevpeg) * glTex->scaleY);
|
||||
wallVerts[0].t = static_cast<float>((h - l) + texturevpeg) * glTex->scaleY;
|
||||
wallVerts[1].t = static_cast<float>((hS - lS) + texturevpeg) * glTex->scaleY;
|
||||
}
|
||||
else // skew by bottom
|
||||
{
|
||||
wallVerts[0].t = wallVerts[1].t = (static_cast<float>(texturevpeg) * glTex->scaleY);
|
||||
wallVerts[3].t = wallVerts[0].t - static_cast<float>(h - l) * glTex->scaleY;
|
||||
wallVerts[2].t = wallVerts[1].t - static_cast<float>(hS - lS) * glTex->scaleY;
|
||||
}
|
||||
}
|
||||
|
||||
wallVerts[0].s = wallVerts[3].s = cliplow * glTex->scaleX;
|
||||
wallVerts[2].s = wallVerts[1].s = cliphigh * glTex->scaleX;
|
||||
}
|
||||
|
||||
FBITFIELD blendmode;
|
||||
|
||||
if (roverflags & FF_FOG)
|
||||
{
|
||||
blendmode = PF_Fog|PF_NoTexture;
|
||||
|
||||
lightnum = rover->master->frontsector->lightlevel;
|
||||
colormap = rover->master->frontsector->extra_colormap;
|
||||
|
||||
Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(lightnum, colormap);
|
||||
|
||||
lightnum = HWR_CalcWallLight(lightnum, gl_curline, colormap);
|
||||
|
||||
if (gl_backsector->numlights)
|
||||
HWR_SplitWall(gl_backsector, wallVerts, 0, false, &Surf, roverflags, rover, blendmode);
|
||||
else
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, 0, false, blendmode, true, lightnum, colormap);
|
||||
}
|
||||
else
|
||||
{
|
||||
blendmode = PF_Masked;
|
||||
|
||||
if ((roverflags & FF_TRANSLUCENT && rover->alpha < 256) || rover->blend)
|
||||
{
|
||||
blendmode = rover->blend ? HWR_GetBlendModeFlag(rover->blend) : static_cast<FBITFIELD>(PF_Translucent);
|
||||
Surf.PolyColor.s.alpha = CLAMP(rover->alpha, 0, 255);
|
||||
}
|
||||
|
||||
if (gl_backsector->numlights)
|
||||
HWR_SplitWall(gl_backsector, wallVerts, texnum, noencore, &Surf, roverflags, rover, blendmode);
|
||||
else
|
||||
{
|
||||
if (blendmode != PF_Masked)
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, texnum, noencore, blendmode, false, lightnum, colormap);
|
||||
else
|
||||
HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap);
|
||||
}
|
||||
}
|
||||
}
|
||||
process_ffloors(false);
|
||||
}
|
||||
}
|
||||
#undef SLOPEPARAMS
|
||||
@@ -2404,7 +2243,7 @@ static inline void DoAddLine(seg_t* line, angle_t angle1, angle_t angle2)
|
||||
// SoM: Backsector needs to be run through R_FakeFlat
|
||||
static sector_t tempsec;
|
||||
|
||||
auto do_addline = [&](bool dontdraw)
|
||||
auto do_addline = [&](bool dontdraw) FUNCINLINE
|
||||
{
|
||||
// Single sided line?
|
||||
if (!line->backsector)
|
||||
@@ -2484,7 +2323,7 @@ static inline void DoAddLine(seg_t* line, angle_t angle1, angle_t angle2)
|
||||
}
|
||||
}
|
||||
else
|
||||
return;// dont do anything with the other side i guess?
|
||||
return; // dont do anything with the other side i guess?
|
||||
}
|
||||
|
||||
doaddline:
|
||||
@@ -2504,11 +2343,11 @@ static void HWR_AddLine(seg_t *line)
|
||||
|
||||
gl_curline = line;
|
||||
|
||||
v1x = gl_curline->v1->x;
|
||||
v1y = gl_curline->v1->y;
|
||||
v1x = line->v1->x;
|
||||
v1y = line->v1->y;
|
||||
|
||||
v2x = gl_curline->v2->x;
|
||||
v2y = gl_curline->v2->y;
|
||||
v2x = line->v2->x;
|
||||
v2y = line->v2->y;
|
||||
|
||||
// OPTIMIZE: quickly reject orthogonal back sides.
|
||||
angle1 = R_PointToAngle64(v1x, v1y);
|
||||
@@ -2544,6 +2383,7 @@ static boolean HWR_CheckBBox(const fixed_t *bspcoord)
|
||||
{
|
||||
fixed_t px1, py1, px2, py2;
|
||||
angle_t angle1, angle2;
|
||||
const INT32* check;
|
||||
|
||||
// Find the corners of the box
|
||||
// that define the edges from current viewpoint.
|
||||
@@ -2555,10 +2395,12 @@ static boolean HWR_CheckBBox(const fixed_t *bspcoord)
|
||||
if (boxpos == 5)
|
||||
return true;
|
||||
|
||||
px1 = bspcoord[checkcoord[boxpos][0]];
|
||||
py1 = bspcoord[checkcoord[boxpos][1]];
|
||||
px2 = bspcoord[checkcoord[boxpos][2]];
|
||||
py2 = bspcoord[checkcoord[boxpos][3]];
|
||||
check = checkcoord[boxpos];
|
||||
|
||||
px1 = bspcoord[check[0]];
|
||||
py1 = bspcoord[check[1]];
|
||||
px2 = bspcoord[check[2]];
|
||||
py2 = bspcoord[check[3]];
|
||||
|
||||
if (current_bsp_culling_distance)
|
||||
{
|
||||
@@ -2632,7 +2474,6 @@ static boolean HWR_CheckBBox(const fixed_t *bspcoord)
|
||||
return gld_clipper_SafeCheckRange(angle2, angle1);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// HWR_AddPolyObjectSegs
|
||||
//
|
||||
@@ -2818,19 +2659,20 @@ static void HWR_AddPolyObjectPlanes(void)
|
||||
|
||||
for (i = 0; i < numpolys; i++)
|
||||
{
|
||||
polyobjsector = po_ptrs[i]->lines[0]->backsector; // the in-level polyobject sector
|
||||
|
||||
if (!(po_ptrs[i]->flags & POF_RENDERPLANES)) // Only render planes when you should
|
||||
continue;
|
||||
|
||||
if (po_ptrs[i]->translucency >= NUMTRANSMAPS)
|
||||
continue;
|
||||
|
||||
polyobjsector = po_ptrs[i]->lines[0]->backsector; // the in-level polyobject sector
|
||||
|
||||
if (polyobjsector->floorheight <= gl_frontsector->ceilingheight
|
||||
&& polyobjsector->floorheight >= gl_frontsector->floorheight
|
||||
&& (viewz < polyobjsector->floorheight))
|
||||
{
|
||||
light = R_GetPlaneLight(gl_frontsector, polyobjsector->floorheight, true);
|
||||
|
||||
if (po_ptrs[i]->translucency > 0)
|
||||
{
|
||||
FSurfaceInfo Surf = {};
|
||||
@@ -2853,6 +2695,7 @@ static void HWR_AddPolyObjectPlanes(void)
|
||||
&& (viewz > polyobjsector->ceilingheight))
|
||||
{
|
||||
light = R_GetPlaneLight(gl_frontsector, polyobjsector->ceilingheight, true);
|
||||
|
||||
if (po_ptrs[i]->translucency > 0)
|
||||
{
|
||||
FSurfaceInfo Surf = {};
|
||||
@@ -2977,9 +2820,6 @@ static void HWR_Subsector(size_t num)
|
||||
|
||||
floorcolormap = ceilingcolormap = gl_frontsector->extra_colormap;
|
||||
|
||||
cullFloorHeight = P_GetSectorFloorZAt (gl_frontsector, viewx, viewy);
|
||||
cullCeilingHeight = P_GetSectorCeilingZAt(gl_frontsector, viewx, viewy);
|
||||
|
||||
if (gl_frontsector->ffloors)
|
||||
{
|
||||
locFloorHeight = P_GetSectorFloorZAt (gl_frontsector, gl_frontsector->soundorg.x, gl_frontsector->soundorg.y);
|
||||
@@ -2989,21 +2829,21 @@ static void HWR_Subsector(size_t num)
|
||||
|
||||
if (anyMoved == false)
|
||||
{
|
||||
for (rover = gl_frontsector->ffloors; rover; rover = rover->next)
|
||||
if (sub->validcount != validcount)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERPLANES))
|
||||
continue;
|
||||
for (rover = gl_frontsector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERPLANES))
|
||||
continue;
|
||||
|
||||
if (sub->validcount == validcount)
|
||||
continue;
|
||||
const sector_t *controlSec = §ors[rover->secnum];
|
||||
|
||||
const sector_t *controlSec = §ors[rover->secnum];
|
||||
if (controlSec->moved != true)
|
||||
continue;
|
||||
|
||||
if (controlSec->moved != true)
|
||||
continue;
|
||||
|
||||
anyMoved = true;
|
||||
break;
|
||||
anyMoved = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3029,13 +2869,15 @@ static void HWR_Subsector(size_t num)
|
||||
|
||||
sub->sector->extra_colormap = gl_frontsector->extra_colormap;
|
||||
|
||||
// render floor ?
|
||||
// yeah, easy backface cull! :)
|
||||
if (cullFloorHeight < viewz)
|
||||
if (sub->validcount != validcount)
|
||||
{
|
||||
if (gl_frontsector->floorpic != skyflatnum)
|
||||
{
|
||||
if (sub->validcount != validcount)
|
||||
cullFloorHeight = P_GetSectorFloorZAt(gl_frontsector, viewx, viewy);
|
||||
|
||||
// render floor ?
|
||||
// yeah, easy backface cull! :)
|
||||
if (cullFloorHeight < viewz)
|
||||
{
|
||||
HWR_GetFlat(levelflats[gl_frontsector->floorpic].lumpnum, R_NoEncore(gl_frontsector, false));
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], false,
|
||||
@@ -3044,13 +2886,12 @@ static void HWR_Subsector(size_t num)
|
||||
PF_Occlude, floorlightlevel, levelflats[gl_frontsector->floorpic].lumpnum, NULL, 255, floorcolormap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (cullCeilingHeight > viewz)
|
||||
{
|
||||
if (gl_frontsector->ceilingpic != skyflatnum)
|
||||
{
|
||||
if (sub->validcount != validcount)
|
||||
cullCeilingHeight = P_GetSectorCeilingZAt(gl_frontsector, viewx, viewy);
|
||||
|
||||
if (cullCeilingHeight > viewz)
|
||||
{
|
||||
HWR_GetFlat(levelflats[gl_frontsector->ceilingpic].lumpnum, R_NoEncore(gl_frontsector, true));
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], true,
|
||||
@@ -3059,119 +2900,103 @@ static void HWR_Subsector(size_t num)
|
||||
PF_Occlude, ceilinglightlevel, levelflats[gl_frontsector->ceilingpic].lumpnum, NULL, 255, ceilingcolormap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gl_frontsector->ffloors)
|
||||
{
|
||||
/// \todo fix light, xoffs, yoffs, extracolormap ?
|
||||
for (rover = gl_frontsector->ffloors; rover; rover = rover->next)
|
||||
if (gl_frontsector->ffloors)
|
||||
{
|
||||
fixed_t bottomCullHeight, topCullHeight, centerHeight;
|
||||
|
||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERPLANES) || !(rover->flags & FF_RENDERALL))
|
||||
continue;
|
||||
if (sub->validcount == validcount)
|
||||
continue;
|
||||
|
||||
// rendering heights for bottom and top planes
|
||||
// yes there were functions for this stuff, no idea why it wasnt used but bleh
|
||||
bottomCullHeight = P_GetFFloorBottomZAt(rover, viewx, viewy);
|
||||
topCullHeight = P_GetFFloorTopZAt(rover, viewx, viewy);
|
||||
|
||||
if (gl_frontsector->cullheight)
|
||||
/// \todo fix light, xoffs, yoffs, extracolormap ?
|
||||
for (rover = gl_frontsector->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
if (HWR_DoCulling(gl_frontsector->cullheight, viewsector->cullheight, gl_viewz, FixedToFloat(*rover->bottomheight), FixedToFloat(*rover->topheight)))
|
||||
fixed_t bottomCullHeight, topCullHeight, centerHeight;
|
||||
|
||||
if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERPLANES) || !(rover->flags & FF_RENDERALL))
|
||||
continue;
|
||||
}
|
||||
|
||||
// bottom plane
|
||||
centerHeight = P_GetFFloorBottomZAt(rover, gl_frontsector->soundorg.x, gl_frontsector->soundorg.y);
|
||||
|
||||
if (centerHeight <= locCeilingHeight && centerHeight >= locFloorHeight &&
|
||||
((viewz < bottomCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
|
||||
(viewz > bottomCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
|
||||
{
|
||||
if (rover->flags & FF_FOG)
|
||||
if (gl_frontsector->cullheight)
|
||||
{
|
||||
UINT8 alpha;
|
||||
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < bottomCullHeight));
|
||||
|
||||
alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap);
|
||||
|
||||
HWR_AddTransparentFloor(0,
|
||||
&extrasubsectors[num],
|
||||
false,
|
||||
*rover->bottomheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
||||
true, rover->master->frontsector->extra_colormap);
|
||||
if (HWR_DoCulling(gl_frontsector->cullheight, viewsector->cullheight, gl_viewz, FixedToFloat(*rover->bottomheight), FixedToFloat(*rover->topheight)))
|
||||
continue;
|
||||
}
|
||||
else if ((rover->flags & FF_TRANSLUCENT && rover->alpha < 256) || rover->blend) // SoM: Flags are more efficient
|
||||
{
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < bottomCullHeight));
|
||||
|
||||
HWR_AddTransparentFloor(levelflats[*rover->bottompic].lumpnum,
|
||||
&extrasubsectors[num],
|
||||
false,
|
||||
*rover->bottomheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
CLAMP(rover->alpha, 0 ,255), rover->master->frontsector, HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : static_cast<FBITFIELD>(PF_Translucent)),
|
||||
false, gl_frontsector->lightlist[light].extra_colormap);
|
||||
auto render_fof_plane = [&](boolean bottom, boolean underside) FUNCINLINE
|
||||
{
|
||||
fixed_t roverheight;
|
||||
lumpnum_t flatlump;
|
||||
|
||||
if (bottom)
|
||||
{
|
||||
roverheight = *rover->bottomheight;
|
||||
flatlump = levelflats[*rover->bottompic].lumpnum;
|
||||
}
|
||||
else
|
||||
{
|
||||
roverheight = *rover->topheight;
|
||||
flatlump = levelflats[*rover->toppic].lumpnum;
|
||||
}
|
||||
|
||||
if (rover->flags & FF_FOG)
|
||||
{
|
||||
UINT8 alpha;
|
||||
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, underside);
|
||||
|
||||
alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap);
|
||||
|
||||
HWR_AddTransparentFloor(0,
|
||||
&extrasubsectors[num],
|
||||
!bottom,
|
||||
roverheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
||||
true, rover->master->frontsector->extra_colormap);
|
||||
}
|
||||
else if ((rover->flags & FF_TRANSLUCENT && rover->alpha < 256) || rover->blend) // SoM: Flags are more efficient
|
||||
{
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, underside);
|
||||
|
||||
HWR_AddTransparentFloor(flatlump,
|
||||
&extrasubsectors[num],
|
||||
!bottom,
|
||||
roverheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
CLAMP(rover->alpha, 0, 255), rover->master->frontsector, HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : static_cast<FBITFIELD>(PF_Translucent)),
|
||||
false, gl_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
else
|
||||
{
|
||||
HWR_GetFlat(flatlump, R_NoEncore(gl_frontsector, !bottom));
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, underside);
|
||||
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], !bottom, roverheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, flatlump,
|
||||
rover->master->frontsector, 255, gl_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
};
|
||||
|
||||
// bottom plane
|
||||
centerHeight = P_GetFFloorBottomZAt(rover, gl_frontsector->soundorg.x, gl_frontsector->soundorg.y);
|
||||
|
||||
if (centerHeight <= locCeilingHeight && centerHeight >= locFloorHeight)
|
||||
{
|
||||
bottomCullHeight = P_GetFFloorBottomZAt(rover, viewx, viewy);
|
||||
|
||||
if ((viewz < bottomCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
|
||||
(viewz > bottomCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES)))
|
||||
{
|
||||
render_fof_plane(true, (viewz < bottomCullHeight));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
// top plane
|
||||
centerHeight = P_GetFFloorTopZAt(rover, gl_frontsector->soundorg.x, gl_frontsector->soundorg.y);
|
||||
|
||||
if (centerHeight >= locFloorHeight && centerHeight <= locCeilingHeight)
|
||||
{
|
||||
HWR_GetFlat(levelflats[*rover->bottompic].lumpnum, R_NoEncore(gl_frontsector, false));
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < bottomCullHeight));
|
||||
topCullHeight = P_GetFFloorTopZAt(rover, viewx, viewy);
|
||||
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum,
|
||||
rover->master->frontsector, 255, gl_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
}
|
||||
|
||||
// top plane
|
||||
centerHeight = P_GetFFloorTopZAt(rover, gl_frontsector->soundorg.x, gl_frontsector->soundorg.y);
|
||||
|
||||
if (centerHeight >= locFloorHeight &&
|
||||
centerHeight <= locCeilingHeight &&
|
||||
((viewz > topCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
|
||||
(viewz < topCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
|
||||
{
|
||||
if (rover->flags & FF_FOG)
|
||||
{
|
||||
UINT8 alpha;
|
||||
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < topCullHeight));
|
||||
|
||||
alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap);
|
||||
|
||||
HWR_AddTransparentFloor(0,
|
||||
&extrasubsectors[num],
|
||||
true,
|
||||
*rover->topheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
||||
true, rover->master->frontsector->extra_colormap);
|
||||
}
|
||||
else if ((rover->flags & FF_TRANSLUCENT && rover->alpha < 256) || rover->blend)
|
||||
{
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < topCullHeight));
|
||||
|
||||
HWR_AddTransparentFloor(levelflats[*rover->toppic].lumpnum,
|
||||
&extrasubsectors[num],
|
||||
true,
|
||||
*rover->topheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
CLAMP(rover->alpha, 0 ,255), rover->master->frontsector, HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : static_cast<FBITFIELD>(PF_Translucent)),
|
||||
false, gl_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
else
|
||||
{
|
||||
HWR_GetFlat(levelflats[*rover->toppic].lumpnum, R_NoEncore(gl_frontsector, true));
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, (viewz < topCullHeight));
|
||||
|
||||
HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum,
|
||||
rover->master->frontsector, 255, gl_frontsector->lightlist[light].extra_colormap);
|
||||
if ((viewz > topCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
|
||||
(viewz < topCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES)))
|
||||
{
|
||||
render_fof_plane(false, (viewz < topCullHeight));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3214,15 +3039,12 @@ doaddline:
|
||||
// hurdler: false: we only add the sprites, the walls are drawn first
|
||||
if (line)
|
||||
{
|
||||
if (sub->sector->validcount != validcount)
|
||||
{
|
||||
// draw sprites first, coz they are clipped to the solidsegs of
|
||||
// subsectors more 'in front'
|
||||
if (cv_drawdist.value || current_bsp_culling_distance)
|
||||
HWR_AddSprites<AddSpritesType::kLimitDist>(gl_frontsector);
|
||||
else
|
||||
HWR_AddSprites<AddSpritesType::kNoLimitDist>(gl_frontsector);
|
||||
}
|
||||
// draw sprites first, coz they are clipped to the solidsegs of
|
||||
// subsectors more 'in front'
|
||||
if (cv_drawdist.value || current_bsp_culling_distance)
|
||||
HWR_AddSprites<AddSpritesType::kLimitDist>(gl_frontsector);
|
||||
else
|
||||
HWR_AddSprites<AddSpritesType::kNoLimitDist>(gl_frontsector);
|
||||
|
||||
//Hurdler: at this point validcount must be the same, but is not because
|
||||
// gl_frontsector doesn't point anymore to sub->sector due to
|
||||
@@ -3232,11 +3054,11 @@ doaddline:
|
||||
// without talking about the overdraw of course.
|
||||
sub->sector->validcount = validcount;/// \todo fix that in a better way
|
||||
|
||||
if (UNLIKELY(numpolys))
|
||||
if (UNLIKELY(sub->polyList))
|
||||
{
|
||||
while (count--)
|
||||
{
|
||||
if (LIKELY(!line->polyseg)) // ignore segs that belong to polyobjects
|
||||
if (!line->polyseg) // ignore segs that belong to polyobjects
|
||||
{
|
||||
HWR_AddLine(line);
|
||||
}
|
||||
@@ -4327,7 +4149,7 @@ static void HWR_AddTransparentWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, I
|
||||
wallinfo_t *wallinfo = static_cast<wallinfo_t*>(HWR_CreateDrawNode(DRAWNODE_WALL));
|
||||
|
||||
memcpy(wallinfo->wallVerts, wallVerts, sizeof (wallinfo->wallVerts));
|
||||
memcpy(&wallinfo->Surf, pSurf, sizeof (FSurfaceInfo));
|
||||
memcpy(&wallinfo->Surf, pSurf, sizeof(FSurfaceInfo));
|
||||
wallinfo->texnum = texnum;
|
||||
wallinfo->noencore = noencore;
|
||||
wallinfo->blend = blend;
|
||||
@@ -4459,7 +4281,7 @@ static void HWR_RenderDrawNodes(void)
|
||||
gl_frontsector = NULL;
|
||||
|
||||
if (!(plane->blend & PF_NoTexture))
|
||||
HWR_GetFlat(plane->lumpnum, R_NoEncore(plane->FOFSector, plane->isceiling));
|
||||
HWR_GetFlat(plane->lumpnum, R_NoEncore(plane->FOFSector, plane->isceiling));
|
||||
|
||||
HWR_RenderPlane(NULL, plane->xsub, plane->isceiling, plane->fixedheight, plane->blend, plane->lightlevel,
|
||||
plane->lumpnum, plane->FOFSector, plane->alpha, plane->planecolormap);
|
||||
@@ -4473,10 +4295,10 @@ static void HWR_RenderDrawNodes(void)
|
||||
gl_frontsector = NULL;
|
||||
|
||||
if (!(polyplane->blend & PF_NoTexture))
|
||||
HWR_GetFlat(polyplane->lumpnum, R_NoEncore(polyplane->FOFSector, polyplane->isceiling));
|
||||
HWR_GetFlat(polyplane->lumpnum, R_NoEncore(polyplane->FOFSector, polyplane->isceiling));
|
||||
|
||||
HWR_RenderPolyObjectPlane(polyplane->polysector, polyplane->isceiling, polyplane->fixedheight, polyplane->blend, polyplane->lightlevel,
|
||||
polyplane->lumpnum, polyplane->FOFSector, polyplane->alpha, polyplane->planecolormap);
|
||||
polyplane->lumpnum, polyplane->FOFSector, polyplane->alpha, polyplane->planecolormap);
|
||||
|
||||
}
|
||||
break;
|
||||
@@ -4488,7 +4310,7 @@ static void HWR_RenderDrawNodes(void)
|
||||
HWR_GetTexture(wall->texnum, wall->noencore);
|
||||
|
||||
HWR_RenderWall(wall->wallVerts, &wall->Surf, wall->blend, wall->fogwall,
|
||||
wall->lightlevel, wall->wallcolormap);
|
||||
wall->lightlevel, wall->wallcolormap);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -5500,6 +5322,7 @@ void HWR_SetTransform(float fpov)
|
||||
void HWR_ClearClipper(void)
|
||||
{
|
||||
const angle_t a1 = gld_FrustumAngle(gl_aimingangle);
|
||||
|
||||
gld_clipper_Clear();
|
||||
gld_clipper_SafeAddClipRange(viewangle + a1, viewangle - a1);
|
||||
#ifdef HAVE_SPHEREFRUSTRUM
|
||||
@@ -5532,9 +5355,9 @@ static void HWR_RenderViewpoint(gl_portal_t *rootportal, int stencil_level, bool
|
||||
player_t *viewplayer = &players[displayplayers[viewssnum]];
|
||||
const float fpov = FixedToFloat(R_GetPlayerFov(viewplayer));
|
||||
|
||||
auto reset_viewstate = [&]()
|
||||
auto reset_viewstate = [](const float pfov) FUNCINLINE
|
||||
{
|
||||
HWR_SetTransform(fpov);
|
||||
HWR_SetTransform(pfov);
|
||||
HWR_ClearSprites();
|
||||
HWR_ClearClipper();
|
||||
};
|
||||
@@ -5552,7 +5375,7 @@ static void HWR_RenderViewpoint(gl_portal_t *rootportal, int stencil_level, bool
|
||||
currentportallist = &portallist;
|
||||
HWR_SetPortalState(GLPORTAL_SEARCH);
|
||||
|
||||
reset_viewstate();
|
||||
reset_viewstate(fpov);
|
||||
|
||||
if (rootportal)
|
||||
{
|
||||
@@ -5578,13 +5401,13 @@ static void HWR_RenderViewpoint(gl_portal_t *rootportal, int stencil_level, bool
|
||||
// draw normal things in current frame in current incremented stencil buffer area
|
||||
HWR_SetStencilState(HWR_STENCIL_NORMAL, stencil_level);
|
||||
|
||||
reset_viewstate();
|
||||
reset_viewstate(fpov);
|
||||
|
||||
if constexpr (Type == RenderViewpointType::kPortal)
|
||||
{
|
||||
if (allow_portals && rootportal)
|
||||
{
|
||||
HWR_PortalFrame(rootportal);// for portalclipsector, it could have gone null from search
|
||||
HWR_PortalFrame(rootportal); // for portalclipsector, it could have gone null from search
|
||||
HWR_PortalClipping(rootportal);
|
||||
}
|
||||
}
|
||||
@@ -5660,6 +5483,7 @@ static void HWR_RenderViewpoint(gl_portal_t *rootportal, int stencil_level, bool
|
||||
PS_START_TIMING(ps_hw_spritesorttime);
|
||||
HWR_SortVisSprites();
|
||||
PS_STOP_TIMING(ps_hw_spritesorttime);
|
||||
|
||||
PS_START_TIMING(ps_hw_spritedrawtime);
|
||||
if (UNLIKELY(cv_glmdls.value))
|
||||
HWR_DrawSprites<DrawSpritesType::kModels>();
|
||||
@@ -5681,8 +5505,8 @@ static void HWR_RenderViewpoint(gl_portal_t *rootportal, int stencil_level, bool
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals) {
|
||||
HWR_RenderViewpoint<RenderViewpointType::kPortal>(rootportal, stencil_level, allow_portals);
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level) {
|
||||
HWR_RenderViewpoint<RenderViewpointType::kPortal>(rootportal, stencil_level, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ void HWR_SetViewSize(void);
|
||||
void HWR_AddCommands(void);
|
||||
|
||||
void HWR_RenderPlayerView(void);
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals);
|
||||
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level);
|
||||
|
||||
void HWR_ClearSkyDome(void);
|
||||
void HWR_BuildSkyDome(void);
|
||||
|
||||
@@ -80,8 +80,8 @@ void HWR_Portal_Add2Lines(const INT32 line1, const INT32 line2, seg_t *seg)
|
||||
gl_portal_t *portal = HWR_Portal_Add(seg);
|
||||
|
||||
// Offset the portal view by the linedef centers
|
||||
line_t* start = &lines[line1];
|
||||
line_t* dest = &lines[line2];
|
||||
line_t* start = &lines[line1];
|
||||
line_t* dest = &lines[line2];
|
||||
|
||||
angle_t dangle = R_PointToAngle2(0, 0, dest->dx, dest->dy) - R_PointToAngle2(start->dx, start->dy, 0, 0);
|
||||
|
||||
@@ -99,7 +99,7 @@ void HWR_Portal_Add2Lines(const INT32 line1, const INT32 line2, seg_t *seg)
|
||||
dest_c.y = dest->v1->y/2 + dest->v2->y/2;
|
||||
|
||||
disttopoint = R_PointToDist2(start_c.x, start_c.y, viewx, viewy);
|
||||
angtopoint = R_PointToAngle2(start_c.x, start_c.y, viewx, viewy);
|
||||
angtopoint = R_PointToAngle2(start_c.x, start_c.y, viewx, viewy);
|
||||
angtopoint += dangle;
|
||||
|
||||
portal->viewx = dest_c.x + FixedMul(FINECOSINE(angtopoint>>ANGLETOFINESHIFT), disttopoint);
|
||||
@@ -170,7 +170,7 @@ void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float
|
||||
HWR_PortalFrame(portal);
|
||||
|
||||
// call HWR_RenderViewpoint
|
||||
HWR_RenderPortalViewpoint(portal, stencil_level + 1, true);
|
||||
HWR_RenderPortalViewpoint(portal, stencil_level + 1);
|
||||
|
||||
// return to current frame
|
||||
if (rootportal)
|
||||
@@ -220,9 +220,9 @@ boolean HWR_PortalCheckBBox(const fixed_t *bspcoord)
|
||||
if (!portalclipline)
|
||||
return true;
|
||||
|
||||
if (HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXTOP]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXRIGHT], bspcoord[BOXTOP]) ||
|
||||
if (HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXTOP]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXRIGHT], bspcoord[BOXTOP]) ||
|
||||
HWR_PortalCheckPointSide(bspcoord[BOXRIGHT], bspcoord[BOXBOTTOM]))
|
||||
{
|
||||
return true;
|
||||
|
||||
@@ -76,6 +76,11 @@
|
||||
//
|
||||
|
||||
// Include GLSL_FLOOR_FUDGES or GLSL_WALL_FUDGES or define the fudges in shaders that use this macro.
|
||||
|
||||
// dither shader based on
|
||||
// https://github.com/hughsk/glsl-dither/blob/master/8x8.glsl
|
||||
// https://github.com/libretro/glsl-shaders/blob/master/dithering/shaders/bayer_4x4.glsl
|
||||
// adapted and messed about to work with srb2 and scale per resolution
|
||||
#define GLSL_DOOM_COLORMAP_DITHER \
|
||||
"float baseValue = max(startmap * STARTMAP_FUDGE - scale * 0.5 * SCALE_FUDGE, cap);\n" \
|
||||
"float patscale = min(scr_resolution.x / 1280.0, scr_resolution.y / 720.0);\n" \
|
||||
|
||||
@@ -1122,7 +1122,7 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
|
||||
|
||||
const GLfloat deltaZ = FAR_CLIPPING_PLANE - NEAR_CLIPPING_PLANE;
|
||||
|
||||
if ((fabsf((float)deltaZ) < 1.0E-36f) || fpclassify(aspect) == FP_ZERO)
|
||||
if ((fabsf(deltaZ) < 1.0E-36f) || fpclassify(aspect) == FP_ZERO)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -1583,6 +1583,7 @@ void GL_Draw2DLine(F2DCoord * v1, F2DCoord * v2, RGBA_t Color)
|
||||
angle = atanf((v2->y-v1->y)/(v2->x-v1->x));
|
||||
else
|
||||
angle = (float)N_PI_DEMI;
|
||||
|
||||
dx = sinf(angle) / (float)screen_width;
|
||||
dy = cosf(angle) / (float)screen_height;
|
||||
|
||||
@@ -1697,7 +1698,7 @@ static void GL_SetBlendMode(FBITFIELD flags)
|
||||
|
||||
void GL_SetBlend(FBITFIELD PolyFlags)
|
||||
{
|
||||
const FBITFIELD Xor = CurrentPolyFlags^PolyFlags;;
|
||||
const FBITFIELD Xor = CurrentPolyFlags^PolyFlags;
|
||||
|
||||
if (Xor & (PF_Blending|PF_RemoveYWrap|PF_ForceWrapX|PF_ForceWrapY|PF_Occlude|PF_NoTexture|PF_Modulated|PF_NoDepthTest|PF_Decal|PF_Skydecal|PF_Invisible))
|
||||
{
|
||||
|
||||
+54
-8
@@ -133,6 +133,7 @@ static void Command_Say_f(void);
|
||||
static void Command_Sayto_f(void);
|
||||
static void Command_Sayteam_f(void);
|
||||
static void Command_CSay_f(void);
|
||||
static void Command_Mute_f(void);
|
||||
static void Got_Saycmd(const UINT8 **p, INT32 playernum);
|
||||
|
||||
void HU_LoadGraphics(void)
|
||||
@@ -260,6 +261,8 @@ void HU_Init(void)
|
||||
COM_AddCommand("csay", Command_CSay_f);
|
||||
RegisterNetXCmd(XD_SAY, Got_Saycmd);
|
||||
|
||||
COM_AddCommand("muteplayer", Command_Mute_f);
|
||||
|
||||
if (dedicated || rendermode == render_none)
|
||||
return;
|
||||
|
||||
@@ -1022,21 +1025,42 @@ static boolean HU_clearChatSpaces(void)
|
||||
return nothingbutspaces;
|
||||
}
|
||||
|
||||
static void DoMute(const char *name)
|
||||
static void DoMute(const char *name, boolean chat)
|
||||
{
|
||||
INT32 pnum = D_LookupPlayer(name);
|
||||
|
||||
if (pnum < 0)
|
||||
// Shortcut to reuse this function for console and chat command
|
||||
#define PRINT(msg, sound) do { \
|
||||
if (chat) \
|
||||
HU_AddChatText((msg), (sound)); \
|
||||
else \
|
||||
CONS_Printf("%s\n", msg); \
|
||||
} while (0)
|
||||
|
||||
if (pnum < 0 || !playeringame[pnum])
|
||||
{
|
||||
HU_AddChatText("\x85""ERROR: \x80Player not found.", false);
|
||||
PRINT("\x85""ERROR: \x80Player not found.", false);
|
||||
return;
|
||||
}
|
||||
|
||||
player_muted[pnum] = !player_muted[pnum];
|
||||
|
||||
HU_AddChatText(va("Player '%s' has been %smuted.", player_names[pnum], player_muted[pnum] ? "" : "un"), false);
|
||||
PRINT(va("Player '%s' has been %smuted.", player_names[pnum], player_muted[pnum] ? "" : "un"), false);
|
||||
if (player_muted[pnum])
|
||||
HU_AddChatText("Use same command to unmute them.", false);
|
||||
PRINT("Use same command to unmute them.", false);
|
||||
|
||||
#undef PRINT
|
||||
}
|
||||
|
||||
static void Command_Mute_f(void)
|
||||
{
|
||||
if (COM_Argc() < 2)
|
||||
{
|
||||
CONS_Printf(M_GetText("mute <playername|playernum>: mute/unmute a player\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
DoMute(COM_Argv(1), false);
|
||||
}
|
||||
|
||||
static void HU_SendChatMessage(void)
|
||||
@@ -1070,7 +1094,7 @@ static void HU_SendChatMessage(void)
|
||||
if (msglength >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
|
||||
{
|
||||
if (msglength > 6)
|
||||
DoMute(msg+6);
|
||||
DoMute(msg+6, true);
|
||||
else
|
||||
HU_AddChatText("\x82NOTICE: \x80Usage: /mute <name|node>", false);
|
||||
|
||||
@@ -1257,13 +1281,15 @@ boolean HU_Responder(event_t *ev)
|
||||
chat_on = false;
|
||||
I_SetTextInput(false);
|
||||
}
|
||||
else if ((c == KEY_UPARROW || c == KEY_MOUSEWHEELUP) && chat_scroll > 0 && !OLDCHAT) // CHAT SCROLLING YAYS!
|
||||
else if ((c == KEY_UPARROW || c == KEY_PGUP || c == KEY_MOUSEWHEELUP) &&
|
||||
((chat_scroll > 0) && !OLDCHAT)) // CHAT SCROLLING YAYS!
|
||||
{
|
||||
chat_scroll--;
|
||||
justscrolledup = true;
|
||||
chat_scrolltime = 4;
|
||||
}
|
||||
else if ((c == KEY_DOWNARROW || c == KEY_MOUSEWHEELDOWN) && chat_scroll < chat_maxscroll && chat_maxscroll > 0 && !OLDCHAT)
|
||||
else if ((c == KEY_DOWNARROW || c == KEY_PGDN || c == KEY_MOUSEWHEELDOWN) &&
|
||||
((chat_scroll < chat_maxscroll) && (chat_maxscroll > 0) && !OLDCHAT))
|
||||
{
|
||||
chat_scroll++;
|
||||
justscrolleddown = true;
|
||||
@@ -2478,6 +2504,26 @@ void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags)
|
||||
}
|
||||
}
|
||||
|
||||
void HU_drawLocalPlayerPing(INT32 x, INT32 y, INT32 flags)
|
||||
{
|
||||
UINT32 lag = localplayerping;
|
||||
const boolean gentleman = (cv_mindelay.value && (lag < (tic_t)simulated_lag));
|
||||
|
||||
if (gentleman)
|
||||
{
|
||||
lag = simulated_lag;
|
||||
}
|
||||
|
||||
if (cv_pingstyle.value == 0) // kart
|
||||
{
|
||||
HU_drawKartPing(x, y, lag, flags, gentleman);
|
||||
}
|
||||
else if (cv_pingstyle.value == 1) // old style ping
|
||||
{
|
||||
HU_drawOldPing(x, y, lag, flags, gentleman);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// HU_DrawSpectatorTicker
|
||||
//
|
||||
|
||||
@@ -104,6 +104,7 @@ void HU_Drawer(void);
|
||||
char HU_dequeueChatChar(void);
|
||||
void HU_clearChatChars(void);
|
||||
void HU_drawPlayerPing(INT32 x, INT32 y, INT32 pnum, INT32 flags); // Lat': Ping drawer for scoreboard.
|
||||
void HU_drawLocalPlayerPing(INT32 x, INT32 y, INT32 flags);
|
||||
void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, INT32 hilicol);
|
||||
void HU_DrawEmeralds(INT32 x, INT32 y, INT32 pemeralds);
|
||||
const char *HU_SkinColorToConsoleColor(skincolors_t color);
|
||||
|
||||
+1
-19
@@ -36,25 +36,7 @@ extern "C" {
|
||||
"JOYBUTTONS is greater than INT64 bits can hold"
|
||||
#endif
|
||||
|
||||
/** \brief The struct JoyType_s
|
||||
|
||||
share some joystick information (maybe 2 for splitscreen), to the game input code,
|
||||
actually, we need to know if it is a gamepad or analog controls
|
||||
*/
|
||||
|
||||
struct JoyType_s
|
||||
{
|
||||
/*! this joystick is a gamepad, read: digital axes
|
||||
if FALSE, interpret the joystick event data as JOYAXISRANGE (see above) */
|
||||
INT32 bGamepadStyle;
|
||||
|
||||
};
|
||||
typedef struct JoyType_s JoyType_t;
|
||||
/** \brief Joystick info
|
||||
for palyer[sic] 1-4's joystick/gamepad
|
||||
*/
|
||||
|
||||
extern JoyType_t Joystick[MAXSPLITSCREENPLAYERS];
|
||||
#define DigitalGamepadStyle(i) (cv_joyscale[i].value == 0)
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
||||
@@ -203,6 +203,11 @@ void I_ShutdownSystem(void);
|
||||
/** \brief To check if a Interrupt or Terminate Signal was fired
|
||||
*/
|
||||
boolean I_Interrupted(void);
|
||||
static inline void I_HandleInterrupt(void)
|
||||
{
|
||||
if (I_Interrupted())
|
||||
I_Quit();
|
||||
}
|
||||
|
||||
/** \brief The I_GetDiskFreeSpace function
|
||||
|
||||
|
||||
+38
-47
@@ -110,6 +110,11 @@ consvar_t cv_fancyroulette = {"animatedroulette", "Off", CV_SAVE, CV_OnOff, NULL
|
||||
consvar_t cv_darkitembox = {"darkitembox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // itembox gets a dark border with specific items
|
||||
consvar_t cv_multiitemicon = {"multiitemicon", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
enum { ROULETTECOLOR_NONE = -1, ROULETTECOLOR_HUD, ROULETTECOLOR_PLAYER, ROULETTECOLOR_ITEM };
|
||||
static CV_PossibleValue_t roulettecolor_cons_t[] = {
|
||||
{ROULETTECOLOR_NONE, "None"}, {ROULETTECOLOR_HUD, "Hud"}, {ROULETTECOLOR_PLAYER, "Player"}, {ROULETTECOLOR_ITEM, "Item"}, {0, NULL}};
|
||||
consvar_t cv_roulettecolor = {"roulettecolor", "Hud", CV_SAVE, roulettecolor_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_showlaptimes = {"showlaptimes", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_biglaps = {"biglaphud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; // here for ppl who dont want to make 2 more patches for their custom hud
|
||||
@@ -243,6 +248,8 @@ void K_RegisterKartHudStuff(void)
|
||||
CV_RegisterVar(&cv_multiitemicon);
|
||||
CV_RegisterVar(&cv_huditemamount);
|
||||
|
||||
CV_RegisterVar(&cv_roulettecolor);
|
||||
|
||||
CV_RegisterVar(&cv_highresportrait);
|
||||
|
||||
CV_RegisterVar(&cv_nametag);
|
||||
@@ -1507,74 +1514,77 @@ static void K_drawKartItem(void)
|
||||
|
||||
if (stplyr->kartstuff[k_itemroulette])
|
||||
{
|
||||
localcolor = K_GetHudColor();
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_PLAYER)
|
||||
localcolor = stplyr->skincolor;
|
||||
else if (cv_roulettecolor.value != ROULETTECOLOR_NONE)
|
||||
localcolor = K_GetHudColor();
|
||||
|
||||
switch ((stplyr->kartstuff[k_itemroulette] % (14*3)) / 3)
|
||||
{
|
||||
// Each case is handled in threes, to give three frames of in-game time to see the item on the roulette
|
||||
case 0: // Sneaker
|
||||
localpatch = kp_sneaker[offset];
|
||||
//localcolor = SKINCOLOR_RASPBERRY;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_RASPBERRY;
|
||||
break;
|
||||
case 1: // Banana
|
||||
localpatch = kp_banana[offset];
|
||||
//localcolor = SKINCOLOR_YELLOW;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_YELLOW;
|
||||
break;
|
||||
case 2: // Orbinaut
|
||||
localpatch = kp_orbinaut[3+offset];
|
||||
//localcolor = SKINCOLOR_STEEL;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||
break;
|
||||
case 3: // Mine
|
||||
localpatch = kp_mine[offset];
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 4: // Grow
|
||||
localpatch = kp_grow[offset];
|
||||
//localcolor = SKINCOLOR_TEAL;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TEAL;
|
||||
break;
|
||||
case 5: // Hyudoro
|
||||
localpatch = kp_hyudoro[offset];
|
||||
//localcolor = SKINCOLOR_STEEL;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||
break;
|
||||
case 6: // Rocket Sneaker
|
||||
localpatch = kp_rocketsneaker[offset];
|
||||
//localcolor = SKINCOLOR_TANGERINE;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TANGERINE;
|
||||
break;
|
||||
case 7: // Jawz
|
||||
localpatch = kp_jawz[offset];
|
||||
//localcolor = SKINCOLOR_JAWZ;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JAWZ;
|
||||
break;
|
||||
case 8: // Self-Propelled Bomb
|
||||
localpatch = kp_selfpropelledbomb[offset];
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 9: // Shrink
|
||||
localpatch = kp_shrink[offset];
|
||||
//localcolor = SKINCOLOR_ORANGE;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_ORANGE;
|
||||
break;
|
||||
case 10: // Invincibility
|
||||
localpatch = localinv;
|
||||
//localcolor = SKINCOLOR_GREY;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_GREY;
|
||||
break;
|
||||
case 11: // Eggman Monitor
|
||||
localpatch = kp_eggman[offset];
|
||||
//localcolor = SKINCOLOR_ROSE;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_ROSE;
|
||||
break;
|
||||
case 12: // Ballhog
|
||||
localpatch = kp_ballhog[offset];
|
||||
//localcolor = SKINCOLOR_LILAC;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_LILAC;
|
||||
break;
|
||||
case 13: // Thunder Shield
|
||||
localpatch = kp_thundershield[offset];
|
||||
//localcolor = SKINCOLOR_CYAN;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_CYAN;
|
||||
break;
|
||||
/*case 14: // Pogo Spring
|
||||
localpatch = kp_pogospring[offset];
|
||||
localcolor = SKINCOLOR_TANGERINE;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_TANGERINE;
|
||||
break;
|
||||
case 15: // Kitchen Sink
|
||||
localpatch = kp_kitchensink[offset];
|
||||
localcolor = SKINCOLOR_STEEL;
|
||||
if (cv_roulettecolor.value == ROULETTECOLOR_ITEM) localcolor = SKINCOLOR_STEEL;
|
||||
break;*/
|
||||
default:
|
||||
break;
|
||||
@@ -4254,6 +4264,7 @@ static void K_drawInput(void)
|
||||
|
||||
y -= FRACUNIT;
|
||||
|
||||
// stick displays
|
||||
if (cv_showinput.value == 2 || cv_showinput.value == 3)
|
||||
{
|
||||
INT32 axis;
|
||||
@@ -4263,7 +4274,7 @@ static void K_drawInput(void)
|
||||
const INT32 joyy = y>>FRACBITS;
|
||||
static const INT32 joyxoffs = -8;
|
||||
static const INT32 joyyoffs = -24;
|
||||
const boolean usejoysprite = (cv_showinput.value == 3 && joystickicon);
|
||||
const boolean usejoysprite = (cv_showinput.value == 3 && joystickicon);
|
||||
|
||||
// O backing
|
||||
if (usejoysprite)
|
||||
@@ -4281,40 +4292,20 @@ static void K_drawInput(void)
|
||||
// kart does not have anything we can get analogue joystick y axis values from
|
||||
// during normal gameplay, so replicate shit here
|
||||
|
||||
// this is horrid but we cant get actual input in replays so uhh
|
||||
if (demo.playback || !P_IsLocalPlayer(stplyr)) // yeah...........
|
||||
const boolean analogjoystickmove = (!demo.playback && P_IsLocalPlayer(stplyr) && cv_usejoystick[stplyrnum].value && !DigitalGamepadStyle(stplyrnum));
|
||||
axis = analogjoystickmove ? JoyAxis(AXISAIM, stplyrnum+1) : 0;
|
||||
|
||||
if (axis != 0)
|
||||
{
|
||||
hudforward = stplyr->kartstuff[k_throwdir] * KART_FULLTURN;
|
||||
hudforward -= ((axis * KART_FULLTURN) / JOYAXISRANGE);
|
||||
}
|
||||
else
|
||||
{
|
||||
const boolean analogjoystickmove = cv_usejoystick[stplyrnum].value && !Joystick[stplyrnum].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[stplyrnum].value && Joystick[stplyrnum].bGamepadStyle;
|
||||
const UINT8 ssplayer = stplyrnum+1;
|
||||
|
||||
axis = JoyAxis(AXISAIM, ssplayer);
|
||||
|
||||
if (analogjoystickmove && axis != 0)
|
||||
{
|
||||
// JOYAXISRANGE is supposed to be 1023 (divide by 1024)
|
||||
hudforward -= ((axis * KART_FULLTURN) / (JOYAXISRANGE-1));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (InputDown(gc_aimforward, ssplayer) || (gamepadjoystickmove && axis < 0))
|
||||
{
|
||||
hudforward += KART_FULLTURN;
|
||||
}
|
||||
|
||||
if (InputDown(gc_aimbackward, ssplayer) || (gamepadjoystickmove && axis > 0))
|
||||
{
|
||||
hudforward -= KART_FULLTURN;
|
||||
}
|
||||
}
|
||||
|
||||
hudforward = CLAMP(hudforward, -KART_FULLTURN, KART_FULLTURN);
|
||||
hudforward = stplyr->kartstuff[k_throwdir] * KART_FULLTURN;
|
||||
}
|
||||
|
||||
hudforward = CLAMP(hudforward, -KART_FULLTURN, KART_FULLTURN);
|
||||
|
||||
if (cmd->driftturn || hudforward)
|
||||
{
|
||||
INT16 turning = encoremode ? -cmd->driftturn : cmd->driftturn;
|
||||
@@ -4347,7 +4338,7 @@ static void K_drawInput(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else // wheel
|
||||
{
|
||||
if (!cmd->driftturn) // no turn
|
||||
target = 0;
|
||||
|
||||
@@ -41,6 +41,7 @@ extern consvar_t cv_showlaptimes;
|
||||
extern consvar_t cv_battlespeedo;
|
||||
extern consvar_t cv_multiitemicon;
|
||||
extern consvar_t cv_huditemamount;
|
||||
extern consvar_t cv_roulettecolor;
|
||||
|
||||
// for use in timeattack menu
|
||||
extern patch_t *kp_facenum[MAXPLAYERS+1];
|
||||
|
||||
+702
-610
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -652,7 +652,7 @@ static int line_get(lua_State *L)
|
||||
LUA_PushUserdata(L, &sides[line->sidenum[0]], META_SIDE);
|
||||
return 1;
|
||||
case line_backside: // backside
|
||||
if (line->sidenum[1] == 0xffff)
|
||||
if (line->sidenum[1] == NO_INDEX)
|
||||
return 0;
|
||||
LUA_PushUserdata(L, &sides[line->sidenum[1]], META_SIDE);
|
||||
return 1;
|
||||
|
||||
+7
-3
@@ -1025,11 +1025,12 @@ boolean M_Responder(event_t *ev)
|
||||
const INT32 jxdeadzone = ((JOYAXISRANGE-1) * max(cv_xdeadzone[0].value, FRACUNIT/2)) >> FRACBITS;
|
||||
const INT32 jydeadzone = ((JOYAXISRANGE-1) * max(cv_ydeadzone[0].value, FRACUNIT/2)) >> FRACBITS;
|
||||
INT32 accelaxis = abs(cv_moveaxis[0].value);
|
||||
|
||||
if (ev->data1 == 0)
|
||||
{
|
||||
if (ev->data3 != INT32_MAX)
|
||||
{
|
||||
if (Joystick[0].bGamepadStyle || abs(ev->data3) > jydeadzone)
|
||||
if (DigitalGamepadStyle(0) || abs(ev->data3) > jydeadzone)
|
||||
{
|
||||
if (joywaity < thistime
|
||||
&& (pjoyy == 0 || (ev->data3 < 0) != (pjoyy < 0))) // no previous direction OR change direction
|
||||
@@ -1045,7 +1046,7 @@ boolean M_Responder(event_t *ev)
|
||||
|
||||
if (ev->data2 != INT32_MAX && joywaitx < thistime)
|
||||
{
|
||||
if (Joystick[0].bGamepadStyle || abs(ev->data2) > jxdeadzone)
|
||||
if (DigitalGamepadStyle(0) || abs(ev->data2) > jxdeadzone)
|
||||
{
|
||||
if (joywaitx < thistime
|
||||
&& (pjoyx == 0 || (ev->data2 < 0) != (pjoyx < 0))) // no previous direction OR change direction
|
||||
@@ -1064,19 +1065,22 @@ boolean M_Responder(event_t *ev)
|
||||
// The following borrows heavily from Joy1Axis.
|
||||
const boolean xmode = (accelaxis%2);
|
||||
INT32 retaxis = 0;
|
||||
|
||||
if (!xmode)
|
||||
accelaxis--;
|
||||
accelaxis /= 2;
|
||||
|
||||
if (ev->data1 == accelaxis)
|
||||
{
|
||||
const INT32 jacceldeadzone = xmode ? jxdeadzone : jydeadzone;
|
||||
retaxis = xmode ? ev->data2 : ev->data3;
|
||||
|
||||
if (retaxis != INT32_MAX)
|
||||
{
|
||||
if (cv_moveaxis[0].value < 0)
|
||||
retaxis = -retaxis;
|
||||
|
||||
if (Joystick[0].bGamepadStyle || retaxis > jacceldeadzone)
|
||||
if (DigitalGamepadStyle(0) || retaxis > jacceldeadzone)
|
||||
{
|
||||
if (joywaitaccel < thistime && retaxis > pjoyaccel) // only on upwards event
|
||||
{
|
||||
|
||||
+27
-24
@@ -1018,17 +1018,17 @@ static menuitem_t OP_OpenGLOptionsMenu[] =
|
||||
{IT_STRING | IT_CVAR, NULL, "Shaders", &cv_glshaders, 25},
|
||||
{IT_STRING | IT_CVAR, NULL, "Palette Rendering", &cv_glpaletterendering, 30},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Texture Quality", &cv_gltexturedepth, 45},
|
||||
{IT_STRING | IT_CVAR, NULL, "Texture Filter", &cv_glfiltermode, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Anisotropic", &cv_glanisotropicmode, 55},
|
||||
{IT_STRING | IT_CVAR, NULL, "Visual Portals", &cv_glportals, 60},
|
||||
{IT_STRING | IT_CVAR, NULL, "Texture Quality", &cv_gltexturedepth, 40},
|
||||
{IT_STRING | IT_CVAR, NULL, "Texture Filter", &cv_glfiltermode, 45},
|
||||
{IT_STRING | IT_CVAR, NULL, "Anisotropic", &cv_glanisotropicmode, 50},
|
||||
{IT_STRING | IT_CVAR, NULL, "Visual Portals", &cv_glportals, 55},
|
||||
|
||||
{IT_STRING | IT_CVAR, NULL, "Wall Contrast Style", &cv_glfakecontrast, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Slope Contrast", &cv_glslopecontrast, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Dithered Lightning", &cv_gllightdither, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Sprite Billboarding", &cv_glspritebillboarding, 85},
|
||||
{IT_STRING | IT_CVAR, NULL, "Software Perspective", &cv_glshearing, 90},
|
||||
{IT_STRING | IT_CVAR, NULL, "Rendering Distance", &cv_glrenderdistance, 95},
|
||||
{IT_STRING | IT_CVAR, NULL, "Wall Contrast Style", &cv_glfakecontrast, 65},
|
||||
{IT_STRING | IT_CVAR, NULL, "Slope Contrast", &cv_glslopecontrast, 70},
|
||||
{IT_STRING | IT_CVAR, NULL, "Dithered Lightning", &cv_gllightdither, 75},
|
||||
{IT_STRING | IT_CVAR, NULL, "Sprite Billboarding", &cv_glspritebillboarding, 80},
|
||||
{IT_STRING | IT_CVAR, NULL, "Software Perspective", &cv_glshearing, 85},
|
||||
{IT_STRING | IT_CVAR, NULL, "Rendering Distance", &cv_glrenderdistance, 90},
|
||||
};
|
||||
|
||||
static const char* OP_OpenGLTooltips[] =
|
||||
@@ -1848,26 +1848,28 @@ static menuitem_t OP_SaturnHudMenu[] =
|
||||
{IT_STRING|IT_CVAR, NULL, "Item Amount Number", &cv_huditemamount, 110},
|
||||
{IT_STRING|IT_CVAR, NULL, "Animated Roulette", &cv_fancyroulette, 115},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 125},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 130},
|
||||
{IT_STRING|IT_CVAR, NULL, "Item Roulette Color", &cv_roulettecolor, 120},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 140},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Finished on Minimap", &cv_showminimapfinished, 145},
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 150},
|
||||
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 155},
|
||||
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 160},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Lap Emblem", &cv_showlapemblem, 130},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Cecho Messages", &cv_cechotoggle, 135},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 170},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 175},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Names on Minimap", &cv_showminimapnames, 145},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Finished on Minimap", &cv_showminimapfinished, 150},
|
||||
{IT_STRING|IT_CVAR, NULL, "Small Minimap Players", &cv_minihead, 155},
|
||||
{IT_STRING|IT_CVAR, NULL, "Spin Minimap Icons", &cv_spinoutroll, 160},
|
||||
{IT_STRING|IT_CVAR, NULL, "Player Angle Visual", &cv_showminimapangle, 165},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 185},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits", &cv_songcredits, 175},
|
||||
{IT_STRING|IT_CVAR, NULL, "Music Credits on Pause", &cv_pausesongcredits, 180},
|
||||
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 195},
|
||||
{IT_STRING|IT_CVAR, NULL, "Beta Intermissionscreen", &cv_betainterscreen, 190},
|
||||
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 205},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 210},
|
||||
{IT_STRING|IT_CVAR, NULL, "Show Director Prompt", &cv_showdirectorhud, 200},
|
||||
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 220},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Nametags...", &OP_NametagDef, 210},
|
||||
{IT_STRING|IT_SUBMENU, NULL, "Driftgauge...", &OP_DriftGaugeDef, 215},
|
||||
|
||||
{IT_SUBMENU|IT_STRING, NULL, "Hud Offsets...", &OP_HudOffsetDef, 225},
|
||||
};
|
||||
|
||||
static const char* OP_SaturnHudTooltips[] =
|
||||
@@ -1888,6 +1890,7 @@ static const char* OP_SaturnHudTooltips[] =
|
||||
"Use extra graphics for multiple sneakers, bananas and jawz.",
|
||||
"Change when the item amount is to be displayed.\nMultiple will always display the number.\nWhen you have multiple of the same Item.\nAlways will always display the number regardless of Item amount.",
|
||||
"Enables an animation while the roulette is active.",
|
||||
"Changes the way items are colorized in roulette.",
|
||||
"Show the big 'LAP' text on a lap change.",
|
||||
"Show the big Cecho Messages.",
|
||||
"Show player names on the minimap.",
|
||||
|
||||
+8
-4
@@ -328,7 +328,7 @@ void P_NewChaseDir(mobj_t *actor)
|
||||
else
|
||||
d[1] = DI_NODIR;
|
||||
|
||||
if (twodlevel || actor->flags2 & MF2_TWOD)
|
||||
if (UNLIKELY(twodlevel || actor->flags2 & MF2_TWOD))
|
||||
d[2] = DI_NODIR;
|
||||
if (deltay < -FixedMul(10*FRACUNIT, actor->scale))
|
||||
d[2] = DI_SOUTH;
|
||||
@@ -872,7 +872,7 @@ void A_PointyThink(void *thing)
|
||||
TVector v;
|
||||
TVector *res;
|
||||
angle_t fa;
|
||||
fixed_t radius = FixedMul(actor->info->radius*actor->info->reactiontime, actor->scale);
|
||||
fixed_t radius;
|
||||
boolean firsttime = true;
|
||||
INT32 sign;
|
||||
|
||||
@@ -930,6 +930,8 @@ void A_PointyThink(void *thing)
|
||||
if (!actor->tracer) // For some reason we do not have spike balls...
|
||||
return;
|
||||
|
||||
radius = FixedMul(actor->info->radius*actor->info->reactiontime, actor->scale);
|
||||
|
||||
// Position spike balls relative to the value of 'lastlook'.
|
||||
ball = actor->tracer;
|
||||
|
||||
@@ -2759,9 +2761,11 @@ void A_Invincibility(void *thing)
|
||||
if (P_IsLocalPlayer(player) && !player->powers[pw_super])
|
||||
{
|
||||
S_StopMusic();
|
||||
if (mariomode)
|
||||
|
||||
if (UNLIKELY(mariomode))
|
||||
G_GhostAddColor((INT32) (player - players), GHC_INVINCIBLE);
|
||||
S_ChangeMusicInternal((mariomode) ? "minvnc" : "invinc", false);
|
||||
|
||||
S_ChangeMusicInternal((UNLIKELY(mariomode)) ? "minvnc" : "invinc", false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+12
-7
@@ -845,7 +845,7 @@ void T_BounceCheese(levelspecthink_t *bouncer)
|
||||
T_MovePlane(bouncer->sector, 0, bouncer->sector->ceilingheight, 0, 1, -1); // update things on ceiling
|
||||
T_MovePlane(bouncer->sector, 0, bouncer->sector->floorheight, 0, 0, -1); // update things on floor
|
||||
bouncer->sector->ceilingdata = NULL;
|
||||
bouncer->sector->floordata = NULL;;
|
||||
bouncer->sector->floordata = NULL;
|
||||
bouncer->sector->moved = true;
|
||||
P_RemoveThinker(&bouncer->thinker); // remove bouncer from actives
|
||||
}
|
||||
@@ -1107,14 +1107,13 @@ void T_SpikeSector(levelspecthink_t *spikes)
|
||||
|
||||
if (affectsec == spikes->sector) // Applied to an actual sector
|
||||
{
|
||||
fixed_t affectfloor = P_GetSpecialBottomZ(thing, affectsec, affectsec);
|
||||
fixed_t affectceil = P_GetSpecialTopZ(thing, affectsec, affectsec);
|
||||
|
||||
if (affectsec->flags & SF_FLIPSPECIAL_FLOOR)
|
||||
{
|
||||
if (!(thing->eflags & MFE_VERTICALFLIP) && thing->momz > 0)
|
||||
continue;
|
||||
|
||||
fixed_t affectfloor = P_GetSpecialBottomZ(thing, affectsec, affectsec);
|
||||
|
||||
if (thing->z == affectfloor)
|
||||
dothepain = true;
|
||||
}
|
||||
@@ -1124,19 +1123,21 @@ void T_SpikeSector(levelspecthink_t *spikes)
|
||||
if ((thing->eflags & MFE_VERTICALFLIP) && thing->momz < 0)
|
||||
continue;
|
||||
|
||||
fixed_t affectceil = P_GetSpecialTopZ(thing, affectsec, affectsec);
|
||||
|
||||
if (thing->z + thing->height == affectceil)
|
||||
dothepain = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fixed_t affectfloor = P_GetSpecialBottomZ(thing, affectsec, spikes->sector);
|
||||
fixed_t affectceil = P_GetSpecialTopZ(thing, affectsec, spikes->sector);
|
||||
if (affectsec->flags & SF_FLIPSPECIAL_FLOOR)
|
||||
{
|
||||
if (!(thing->eflags & MFE_VERTICALFLIP) && thing->momz > 0)
|
||||
continue;
|
||||
|
||||
fixed_t affectceil = P_GetSpecialTopZ(thing, affectsec, spikes->sector);
|
||||
|
||||
if (thing->z == affectceil)
|
||||
dothepain = true;
|
||||
}
|
||||
@@ -1146,6 +1147,8 @@ void T_SpikeSector(levelspecthink_t *spikes)
|
||||
if ((thing->eflags & MFE_VERTICALFLIP) && thing->momz < 0)
|
||||
continue;
|
||||
|
||||
fixed_t affectfloor = P_GetSpecialBottomZ(thing, affectsec, spikes->sector);
|
||||
|
||||
if (thing->z + thing->height == affectfloor)
|
||||
dothepain = true;
|
||||
}
|
||||
@@ -1652,6 +1655,7 @@ wegotit:
|
||||
static mobj_t *SearchMarioNode(msecnode_t *node)
|
||||
{
|
||||
mobj_t *thing = NULL;
|
||||
|
||||
for (; node; node = node->m_thinglist_next)
|
||||
{
|
||||
// Things which should NEVER be ejected from a MarioBlock, by type.
|
||||
@@ -2079,11 +2083,12 @@ void T_EachTimeThinker(levelspecthink_t *eachtime)
|
||||
continue;
|
||||
|
||||
topheight = P_GetSpecialTopZ(players[j].mo, sec, targetsec);
|
||||
bottomheight = P_GetSpecialBottomZ(players[j].mo, sec, targetsec);
|
||||
|
||||
if (players[j].mo->z > topheight)
|
||||
continue;
|
||||
|
||||
bottomheight = P_GetSpecialBottomZ(players[j].mo, sec, targetsec);
|
||||
|
||||
if (players[j].mo->z + players[j].mo->height < bottomheight)
|
||||
continue;
|
||||
|
||||
|
||||
+1
-1
@@ -1624,7 +1624,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
|
||||
// Drop stuff.
|
||||
// This determines the kind of object spawned
|
||||
// during the death frame of a thing.
|
||||
if (!mariomode // Don't show birds, etc. in Mario Mode Tails 12-23-2001
|
||||
if (LIKELY(!mariomode) // Don't show birds, etc. in Mario Mode Tails 12-23-2001
|
||||
&& target->flags & MF_ENEMY)
|
||||
{
|
||||
if (cv_soniccd.value)
|
||||
|
||||
@@ -99,7 +99,6 @@ typedef struct camera_s
|
||||
// Hold up/down to pan the camera vertically
|
||||
SINT8 dpad_y_held;
|
||||
|
||||
|
||||
// Camera demobjerization
|
||||
// Info for drawing: position.
|
||||
fixed_t x, y, z;
|
||||
|
||||
+8
-7
@@ -3544,6 +3544,12 @@ static boolean PIT_RadiusAttack(mobj_t *thing)
|
||||
if (thing->flags & MF_MONITOR)
|
||||
return true;
|
||||
|
||||
if (thing->floorz > bombspot->z && bombspot->ceilingz < thing->z)
|
||||
return true;
|
||||
|
||||
if (thing->ceilingz < bombspot->z && bombspot->floorz > thing->z)
|
||||
return true;
|
||||
|
||||
dx = abs(thing->x - bombspot->x);
|
||||
dy = abs(thing->y - bombspot->y);
|
||||
dz = abs(thing->z + (thing->height>>1) - bombspot->z);
|
||||
@@ -3557,14 +3563,9 @@ static boolean PIT_RadiusAttack(mobj_t *thing)
|
||||
if (dist >= bombdamage)
|
||||
return true; // out of range
|
||||
|
||||
if (thing->floorz > bombspot->z && bombspot->ceilingz < thing->z)
|
||||
return true;
|
||||
|
||||
if (thing->ceilingz < bombspot->z && bombspot->floorz > thing->z)
|
||||
return true;
|
||||
|
||||
// must be in direct path
|
||||
if (P_CheckSight(thing, bombspot))
|
||||
{ // must be in direct path
|
||||
{
|
||||
P_DamageMobj(thing, bombspot, bombsource, 1); // Tails 01-11-2001
|
||||
}
|
||||
|
||||
|
||||
+6
-2
@@ -242,7 +242,7 @@ void P_CameraLineOpening(line_t *linedef)
|
||||
sector_t *back;
|
||||
fixed_t frontfloor, frontceiling, backfloor, backceiling;
|
||||
|
||||
if (linedef->sidenum[1] == 0xffff)
|
||||
if (linedef->sidenum[1] == NO_INDEX)
|
||||
{
|
||||
// single sided line
|
||||
openrange = 0;
|
||||
@@ -398,7 +398,7 @@ void P_LineOpening(line_t *linedef, mobj_t *mobj)
|
||||
{
|
||||
sector_t *front, *back;
|
||||
|
||||
if (linedef->sidenum[1] == 0xffff)
|
||||
if (linedef->sidenum[1] == NO_INDEX)
|
||||
{
|
||||
// single sided line
|
||||
openrange = 0;
|
||||
@@ -972,6 +972,10 @@ boolean P_BlockLinesIterator(INT32 x, INT32 y, boolean (*func)(line_t *))
|
||||
// First index is really empty, so +1 it.
|
||||
for (list = blockmaplump + offset + 1; *list != -1; list++)
|
||||
{
|
||||
#ifdef RANGECHECK
|
||||
if (*list < 0 || (UINT32)*list >= numlines)
|
||||
I_Error("P_BlockLinesIterator: index >= numlines");
|
||||
#endif
|
||||
ld = &lines[*list];
|
||||
|
||||
if (ld->validcount == validcount)
|
||||
|
||||
@@ -11029,7 +11029,11 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
||||
{
|
||||
if (mthing->type > MAXPLAYERS) // be wary of playerstarts size! playerstarts[MAXPLAYERS]
|
||||
{
|
||||
#ifdef COMPAT_VANILLA
|
||||
CONS_Alert(CONS_ERROR, "Excess player start detected %d This will crash vanilla clients!\n", mthing->type);
|
||||
#else
|
||||
CONS_Debug(DBG_SETUP, "Excess player start detected %d\n", mthing->type);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -11280,7 +11284,11 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
||||
|
||||
if (P_MobjWasRemoved(mobj))
|
||||
{
|
||||
#ifdef COMPAT_VANILLA
|
||||
CONS_Alert(CONS_ERROR, "Failed to spawn map thing #%d at %d, %d. This will crash vanilla clients!\n", mthing->type, x>>FRACBITS, y>>FRACBITS);
|
||||
#else
|
||||
CONS_Debug(DBG_SETUP, "Failed to spawn map thing #%d at %d, %d.\n", mthing->type, x>>FRACBITS, y>>FRACBITS);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+9
-4
@@ -691,7 +691,7 @@ static void ArchiveLines(savebuffer_t *save)
|
||||
if (spawnli->special == 321 || spawnli->special == 322) // only reason li->callcount would be non-zero is if either of these are involved
|
||||
diff |= LD_CLLCOUNT;
|
||||
|
||||
if (li->sidenum[0] != 0xffff)
|
||||
if (li->sidenum[0] != NO_INDEX)
|
||||
{
|
||||
si = &sides[li->sidenum[0]];
|
||||
spawnsi = &spawnsides[li->sidenum[0]];
|
||||
@@ -706,7 +706,8 @@ static void ArchiveLines(savebuffer_t *save)
|
||||
if (si->midtexture != spawnsi->midtexture)
|
||||
diff |= LD_S1MIDTEX;
|
||||
}
|
||||
if (li->sidenum[1] != 0xffff)
|
||||
|
||||
if (li->sidenum[1] != NO_INDEX)
|
||||
{
|
||||
si = &sides[li->sidenum[1]];
|
||||
spawnsi = &spawnsides[li->sidenum[1]];
|
||||
@@ -786,6 +787,7 @@ static void UnArchiveFFloors(savebuffer_t *save, const sector_t *ss)
|
||||
I_Error("Sector does not have any ffloors!");
|
||||
|
||||
fflr_i = READUINT16(save->p); // get first modified ffloor's number ready
|
||||
|
||||
for (;;) // for some reason the usual for (rover = x; ...) thing doesn't work here?
|
||||
{
|
||||
if (fflr_i == 0xffff) // end of modified ffloors list, let's stop already
|
||||
@@ -3510,7 +3512,7 @@ static void P_ReloadSaveLevelData(void)
|
||||
li->firsttag = spawnli->firsttag;
|
||||
li->nexttag = spawnli->nexttag;
|
||||
|
||||
if (li->sidenum[0] != 0xffff)
|
||||
if (li->sidenum[0] != NO_INDEX)
|
||||
{
|
||||
si = &sides[li->sidenum[0]];
|
||||
spawnsi = &spawnsides[li->sidenum[0]];
|
||||
@@ -3521,7 +3523,7 @@ static void P_ReloadSaveLevelData(void)
|
||||
si->midtexture = spawnsi->midtexture;
|
||||
}
|
||||
|
||||
if (li->sidenum[1] != 0xffff)
|
||||
if (li->sidenum[1] != NO_INDEX)
|
||||
{
|
||||
si = &sides[li->sidenum[1]];
|
||||
spawnsi = &spawnsides[li->sidenum[1]];
|
||||
@@ -3588,8 +3590,11 @@ FUNCINLINE static ATTRINLINE boolean P_NetUnArchiveMisc(savebuffer_t *save, bool
|
||||
if (!P_SetupLevel(true, reloading))
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, M_GetText("Can't load the level!\n"));
|
||||
P_FreeCorruptMapWarnings();
|
||||
return false;
|
||||
}
|
||||
|
||||
P_PrintCorruptMapWarnings();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+308
-37
@@ -188,6 +188,57 @@ FUNCNORETURN static ATTRNORETURN void CorruptMapError(const char *msg)
|
||||
I_Error("Invalid or corrupt map.\nLook in log file or text console for technical details.");
|
||||
}
|
||||
|
||||
static char **mapwarnings = NULL;
|
||||
static size_t nummapwarnings = 0;
|
||||
|
||||
// collect map errors we can fix clientside
|
||||
// we then can print em when the map finishes loading
|
||||
// so they actually appear and raise awareness shits fucked
|
||||
// see G_DoLoadLevel as to why :chaosleep:
|
||||
static void CorruptMapWarning(const char *msg)
|
||||
{
|
||||
#ifdef PARANOIA
|
||||
// just error out
|
||||
I_Error("%sThis WILL crash Vanilla clients!\n", msg);
|
||||
#endif
|
||||
nummapwarnings++;
|
||||
mapwarnings = Z_Realloc(mapwarnings, nummapwarnings * sizeof(*mapwarnings), PU_STATIC, NULL);
|
||||
mapwarnings[nummapwarnings-1] = Z_StrDup(msg);
|
||||
}
|
||||
|
||||
void P_PrintCorruptMapWarnings(void)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!nummapwarnings)
|
||||
return;
|
||||
|
||||
for (i = 0; i < nummapwarnings; i++)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "%sAttempting to fix... This WILL crash Vanilla clients!\n", mapwarnings[i]);
|
||||
}
|
||||
|
||||
P_FreeCorruptMapWarnings();
|
||||
}
|
||||
|
||||
void P_FreeCorruptMapWarnings(void)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!nummapwarnings)
|
||||
return;
|
||||
|
||||
for (i = 0; i < nummapwarnings; i++)
|
||||
{
|
||||
Z_Free(mapwarnings[i]);
|
||||
mapwarnings[i] = NULL;
|
||||
}
|
||||
|
||||
Z_Free(mapwarnings);
|
||||
mapwarnings = NULL;
|
||||
nummapwarnings = 0;
|
||||
}
|
||||
|
||||
#define NUMLAPS_DEFAULT 3
|
||||
|
||||
static void P_ClearMapHeaderLighting(mapheader_lighting_t *lighting)
|
||||
@@ -437,8 +488,39 @@ static void P_LoadSegs(UINT8 *data)
|
||||
|
||||
for (i = 0; i < numsegs; i++, li++, ml++)
|
||||
{
|
||||
li->v1 = &vertexes[SHORT(ml->v1)];
|
||||
li->v2 = &vertexes[SHORT(ml->v2)];
|
||||
INT16 v1, v2;
|
||||
|
||||
v1 = SHORT(ml->v1);
|
||||
v2 = SHORT(ml->v2);
|
||||
|
||||
// e6y
|
||||
// check and fix wrong references to non-existent vertexes
|
||||
// see e1m9 @ NIVELES.WAD
|
||||
// http://www.doomworld.com/idgames/index.php?id=12647
|
||||
if ((unsigned)v1 >= numvertexes || (unsigned)v2 >= numvertexes)
|
||||
{
|
||||
if ((unsigned)v1 >= numvertexes)
|
||||
CorruptMapWarning(va("P_LoadSegs: seg %s references a non-existent vertex %d\n", sizeu1(i), v1));
|
||||
if ((unsigned)v2 >= numvertexes)
|
||||
CorruptMapWarning(va("P_LoadSegs: seg %s references a non-existent vertex %d\n", sizeu1(i), v2));
|
||||
|
||||
if (li->sidedef == &sides[li->linedef->sidenum[0]])
|
||||
{
|
||||
li->v1 = lines[ml->linedef].v1;
|
||||
li->v2 = lines[ml->linedef].v2;
|
||||
}
|
||||
else
|
||||
{
|
||||
li->v1 = lines[ml->linedef].v2;
|
||||
li->v2 = lines[ml->linedef].v1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
li->v1 = &vertexes[v1];
|
||||
li->v2 = &vertexes[v2];
|
||||
}
|
||||
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
{
|
||||
@@ -455,14 +537,59 @@ static void P_LoadSegs(UINT8 *data)
|
||||
li->angle = (SHORT(ml->angle))<<FRACBITS;
|
||||
li->offset = (SHORT(ml->offset))<<FRACBITS;
|
||||
rawlinedef = SHORT(ml->linedef);
|
||||
|
||||
//e6y: check for wrong indexes
|
||||
if ((unsigned)rawlinedef >= numlines)
|
||||
{
|
||||
I_Error("P_LoadSegs: seg %s references a non-existent linedef %d", sizeu1(i), (unsigned)rawlinedef);
|
||||
}
|
||||
|
||||
ldef = &lines[rawlinedef];
|
||||
li->linedef = ldef;
|
||||
li->side = rawside = SHORT(ml->side);
|
||||
rawside = SHORT(ml->side);
|
||||
|
||||
//e6y: fix wrong side index
|
||||
if (rawside != 0 && rawside != 1)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadSegs: seg %s contains wrong side index %d.\n", sizeu1(i), rawside));
|
||||
rawside = 1;
|
||||
}
|
||||
|
||||
//e6y: check for wrong indexes
|
||||
if (ldef->sidenum[rawside] >= numsides)
|
||||
{
|
||||
I_Error("P_LoadSegs: linedef %d for seg %s references a non-existent sidedef %d", rawlinedef, sizeu1(i), ldef->sidenum[rawside]);
|
||||
}
|
||||
|
||||
li->side = rawside;
|
||||
|
||||
li->sidedef = &sides[ldef->sidenum[rawside]];
|
||||
li->frontsector = sides[ldef->sidenum[rawside]].sector;
|
||||
|
||||
/* cph 2006/09/30 - our frontsector can be the second side of the
|
||||
* linedef, so must check for NO_INDEX in case we are incorrectly
|
||||
* referencing the back of a 1S line */
|
||||
if (ldef->sidenum[rawside] == NO_INDEX)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadSegs: front of seg %s has no sidedef\n", sizeu1(i)));
|
||||
li->frontsector = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
li->frontsector = sides[ldef->sidenum[rawside]].sector;
|
||||
}
|
||||
|
||||
if (ldef->flags & ML_TWOSIDED)
|
||||
li->backsector = sides[ldef->sidenum[rawside^1]].sector;
|
||||
{
|
||||
if (ldef->sidenum[rawside^1] == NO_INDEX)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadSegs: back of seg %s has no sidedef while being marked as double sided\n", sizeu1(i)));
|
||||
li->backsector = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
li->backsector = sides[ldef->sidenum[rawside^1]].sector;
|
||||
}
|
||||
}
|
||||
|
||||
P_UpdateSegLightOffset(li);
|
||||
}
|
||||
@@ -738,7 +865,33 @@ static void P_LoadNodes(UINT8 *data)
|
||||
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
no->children[j] = SHORT(mn->children[j]);
|
||||
UINT16 child;
|
||||
|
||||
child = SHORT(mn->children[j]);
|
||||
|
||||
if (child & NF_SUBSECTOR)
|
||||
{
|
||||
// Convert to extended type
|
||||
child &= ~NF_SUBSECTOR;
|
||||
|
||||
// haleyjd 11/06/10: check for invalid subsector reference
|
||||
if (child >= numsubsectors)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadNodes: BSP tree %s references invalid subsector %d\n", sizeu1(i), child));
|
||||
child = 0;
|
||||
}
|
||||
|
||||
child |= NF_SUBSECTOR;
|
||||
}
|
||||
else if (child >= numnodes)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadNodes: BSP node %s references invalid node.\n", sizeu1(i)));
|
||||
//I_Error("P_LoadNodes: BSP node %d references invalid node %d.\n", sizeu1(i), Index(((node_t *)no->children[j])));
|
||||
child = 0;
|
||||
}
|
||||
|
||||
no->children[j] = child;
|
||||
|
||||
for (k = 0; k < 4; k++)
|
||||
no->bbox[j][k] = SHORT(mn->bbox[j][k])<<FRACBITS;
|
||||
}
|
||||
@@ -1001,9 +1154,9 @@ static void P_InitializeLinedef(line_t *ld)
|
||||
// cph 2002/07/20 - these errors are fatal if not fixed, so apply them
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
if (ld->sidenum[j] != 0xffff && ld->sidenum[j] >= (UINT16)numsides)
|
||||
if (ld->sidenum[j] != NO_INDEX && ld->sidenum[j] >= (UINT16)numsides)
|
||||
{
|
||||
ld->sidenum[j] = 0xffff;
|
||||
ld->sidenum[j] = NO_INDEX;
|
||||
CONS_Debug(DBG_SETUP, "P_InitializeLinedef: Linedef %s has out-of-range sidedef number\n", sizeu1((size_t)(ld - lines)));
|
||||
}
|
||||
}
|
||||
@@ -1011,23 +1164,23 @@ static void P_InitializeLinedef(line_t *ld)
|
||||
ld->firsttag = ld->nexttag = -1;
|
||||
|
||||
// killough 11/98: fix common wad errors (missing sidedefs):
|
||||
if (ld->sidenum[0] == 0xffff)
|
||||
if (ld->sidenum[0] == NO_INDEX)
|
||||
{
|
||||
ld->sidenum[0] = 0; // Substitute dummy sidedef for missing right side
|
||||
// cph - print a warning about the bug
|
||||
CONS_Debug(DBG_SETUP, "P_InitializeLinedef: Linedef %s missing first sidedef\n", sizeu1((size_t)(ld - lines)));
|
||||
}
|
||||
|
||||
if ((ld->sidenum[1] == 0xffff) && (ld->flags & ML_TWOSIDED))
|
||||
if ((ld->sidenum[1] == NO_INDEX) && (ld->flags & ML_TWOSIDED))
|
||||
{
|
||||
ld->flags &= ~ML_TWOSIDED; // Clear 2s flag for missing left side
|
||||
// cph - print a warning about the bug
|
||||
CONS_Debug(DBG_SETUP, "P_InitializeLinedef: Linedef %s has two-sided flag set, but no second sidedef\n", sizeu1((size_t)(ld - lines)));
|
||||
}
|
||||
|
||||
if (ld->sidenum[0] != 0xffff && ld->special)
|
||||
if (ld->sidenum[0] != NO_INDEX && ld->special)
|
||||
sides[ld->sidenum[0]].special = ld->special;
|
||||
if (ld->sidenum[1] != 0xffff && ld->special)
|
||||
if (ld->sidenum[1] != NO_INDEX && ld->special)
|
||||
sides[ld->sidenum[1]].special = ld->special;
|
||||
}
|
||||
|
||||
@@ -1060,10 +1213,10 @@ static void P_LoadLineDefs2(void)
|
||||
for (; i--; ld++)
|
||||
{
|
||||
ld->frontsector = sides[ld->sidenum[0]].sector; //e6y: Can't be -1 here
|
||||
ld->backsector = ld->sidenum[1] != 0xffff ? sides[ld->sidenum[1]].sector : NULL;
|
||||
ld->backsector = ld->sidenum[1] != NO_INDEX ? sides[ld->sidenum[1]].sector : NULL;
|
||||
|
||||
// Repeat count for midtexture
|
||||
if ((ld->flags & ML_EFFECT5) && (ld->sidenum[1] != 0xffff))
|
||||
if ((ld->flags & ML_EFFECT5) && (ld->sidenum[1] != NO_INDEX))
|
||||
{
|
||||
sides[ld->sidenum[0]].repeatcnt = (INT16)(((unsigned)sides[ld->sidenum[0]].textureoffset >> FRACBITS) >> 12);
|
||||
sides[ld->sidenum[0]].textureoffset = (((unsigned)sides[ld->sidenum[0]].textureoffset >> FRACBITS) & 2047) << FRACBITS;
|
||||
@@ -1079,13 +1232,13 @@ static void P_LoadLineDefs2(void)
|
||||
{
|
||||
size_t len = strlen(sides[ld->sidenum[0]].text)+1;
|
||||
|
||||
if (ld->sidenum[1] != 0xffff && sides[ld->sidenum[1]].text)
|
||||
if (ld->sidenum[1] != NO_INDEX && sides[ld->sidenum[1]].text)
|
||||
len += strlen(sides[ld->sidenum[1]].text);
|
||||
|
||||
ld->text = Z_Malloc(len, PU_LEVEL, NULL);
|
||||
memcpy(ld->text, sides[ld->sidenum[0]].text, strlen(sides[ld->sidenum[0]].text)+1);
|
||||
|
||||
if (ld->sidenum[1] != 0xffff && sides[ld->sidenum[1]].text)
|
||||
if (ld->sidenum[1] != NO_INDEX && sides[ld->sidenum[1]].text)
|
||||
memcpy(ld->text+strlen(ld->text)+1, sides[ld->sidenum[1]].text, strlen(sides[ld->sidenum[1]].text)+1);
|
||||
}
|
||||
break;
|
||||
@@ -1215,14 +1368,14 @@ static void P_LoadSideChangeMusic(boolean firstside, mapsidedef_t *msd, side_t *
|
||||
|
||||
if (msd->bottomtexture[0] != '-' || msd->bottomtexture[1] != '\0')
|
||||
{
|
||||
memcpy(process,msd->bottomtexture,8);
|
||||
memcpy(process, msd->bottomtexture, 8);
|
||||
process[8] = '\0';
|
||||
sd->bottomtexture = get_number(process);
|
||||
}
|
||||
|
||||
if (!(msd->midtexture[0] == '-' && msd->midtexture[1] == '\0') || msd->midtexture[1] != '\0')
|
||||
{
|
||||
memcpy(process,msd->midtexture,8);
|
||||
memcpy(process, msd->midtexture, 8);
|
||||
process[8] = '\0';
|
||||
sd->midtexture = get_number(process);
|
||||
}
|
||||
@@ -1232,7 +1385,7 @@ static void P_LoadSideChangeMusic(boolean firstside, mapsidedef_t *msd, side_t *
|
||||
|
||||
if (firstside || msd->toptexture[0] != '-' || msd->toptexture[1] != '\0')
|
||||
{
|
||||
memcpy(process,msd->toptexture,8);
|
||||
memcpy(process, msd->toptexture, 8);
|
||||
process[8] = '\0';
|
||||
|
||||
// If they type in O_ or D_ and their music name, just shrug,
|
||||
@@ -1272,7 +1425,7 @@ static void P_LoadSidedefs(void *data)
|
||||
// Colormaps!
|
||||
switch (sd->special)
|
||||
{
|
||||
case 63: // variable colormap via 242 linedef
|
||||
case 63: // variable colormap via 242 linedef
|
||||
case 606: //SoM: 4/4/2000: Just colormap transfer
|
||||
// SoM: R_CreateColormap will only create a colormap in software mode...
|
||||
// Perhaps we should just call it instead of doing the calculations here.
|
||||
@@ -1288,26 +1441,26 @@ static void P_LoadSidedefs(void *data)
|
||||
if (msd->toptexture[0] != '-' || msd->toptexture[1] != '\0')
|
||||
{
|
||||
char process[8+1];
|
||||
memcpy(process,msd->toptexture,8);
|
||||
memcpy(process, msd->toptexture, 8);
|
||||
process[8] = '\0';
|
||||
sd->toptexture = get_number(process);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 9: // Mace parameters
|
||||
case 14: // Bustable block parameters
|
||||
case 15: // Fan particle spawner parameters
|
||||
case 9: // Mace parameters
|
||||
case 14: // Bustable block parameters
|
||||
case 15: // Fan particle spawner parameters
|
||||
case 425: // Calls P_SetMobjState on calling mobj
|
||||
case 434: // Custom Power
|
||||
case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors
|
||||
{
|
||||
char process[8*3+1];
|
||||
memset(process,0,8*3+1);
|
||||
memset(process, 0, 8*3+1);
|
||||
sd->toptexture = sd->midtexture = sd->bottomtexture = 0;
|
||||
if (msd->toptexture[0] == '-' && msd->toptexture[1] == '\0')
|
||||
break;
|
||||
else
|
||||
memcpy(process,msd->toptexture,8);
|
||||
memcpy(process, msd->toptexture, 8);
|
||||
if (msd->midtexture[0] != '-' || msd->midtexture[1] != '\0')
|
||||
memcpy(process+strlen(process), msd->midtexture, 8);
|
||||
if (msd->bottomtexture[0] != '-' || msd->bottomtexture[1] != '\0')
|
||||
@@ -1319,12 +1472,12 @@ static void P_LoadSidedefs(void *data)
|
||||
case 443: // Calls a named Lua function
|
||||
{
|
||||
char process[8*3+1];
|
||||
memset(process,0,8*3+1);
|
||||
memset(process, 0, 8*3+1);
|
||||
sd->toptexture = sd->midtexture = sd->bottomtexture = 0;
|
||||
if (msd->toptexture[0] == '-' && msd->toptexture[1] == '\0')
|
||||
break;
|
||||
else
|
||||
memcpy(process,msd->toptexture,8);
|
||||
memcpy(process,msd->toptexture, 8);
|
||||
if (msd->midtexture[0] != '-' || msd->midtexture[1] != '\0')
|
||||
memcpy(process+strlen(process), msd->midtexture, 8);
|
||||
if (msd->bottomtexture[0] != '-' || msd->bottomtexture[1] != '\0')
|
||||
@@ -1625,6 +1778,80 @@ static void P_CreateBlockMap(void)
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// P_VerifyBlockMap
|
||||
//
|
||||
// haleyjd 03/04/10: do verification on validity of blockmap.
|
||||
//
|
||||
static boolean P_VerifyBlockMap(INT32 count)
|
||||
{
|
||||
// FIXME: should any of this shit be unsinged?
|
||||
INT32 x, y;
|
||||
INT32 *maxoffs = blockmaplump + count;
|
||||
|
||||
//skipblstart = true;
|
||||
|
||||
for (y = 0; y < bmapheight; y++)
|
||||
{
|
||||
for (x = 0; x < bmapwidth; x++)
|
||||
{
|
||||
INT32 offset;
|
||||
INT32 *list, *tmplist;
|
||||
INT32 *blockoffset;
|
||||
|
||||
offset = y * bmapwidth + x;
|
||||
blockoffset = blockmaplump + offset + 4;
|
||||
|
||||
// check that block offset is in bounds
|
||||
if (blockoffset >= maxoffs)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "P_VerifyBlockMap: block offset overflow\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
offset = *blockoffset;
|
||||
|
||||
// check that list offset is in bounds
|
||||
if (offset < 4 || offset >= count)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "P_VerifyBlockMap: list offset overflow\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
list = blockmaplump + offset;
|
||||
|
||||
//if (*list != 0)
|
||||
//skipblstart = false;
|
||||
|
||||
// scan forward for a -1 terminator before maxoffs
|
||||
for (tmplist = list; ; tmplist++)
|
||||
{
|
||||
// we have overflowed the lump?
|
||||
if (tmplist >= maxoffs)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "P_VerifyBlockMap: open blocklist\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (*tmplist == -1) // found -1
|
||||
break;
|
||||
}
|
||||
|
||||
// scan the list for out-of-range linedef indicies in list
|
||||
for (tmplist = list; *tmplist != -1; tmplist++)
|
||||
{
|
||||
if (*tmplist < 0 || *tmplist >= (INT32)numlines)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "P_VerifyBlockMap: index >= numlines\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Split from P_LoadBlockMap for convenience
|
||||
// -- Monster Iestyn 08/01/18
|
||||
static void P_ReadBlockMapLump(INT16 *wadblockmaplump, size_t count)
|
||||
@@ -1666,9 +1893,20 @@ static boolean P_LoadRawBlockMap(UINT8 *data, size_t count)
|
||||
|
||||
bmaporgx = blockmaplump[0]<<FRACBITS;
|
||||
bmaporgy = blockmaplump[1]<<FRACBITS;
|
||||
bmapwidth = blockmaplump[2];
|
||||
bmapwidth = blockmaplump[2];
|
||||
bmapheight = blockmaplump[3];
|
||||
|
||||
// haleyjd 03/04/10: check for blockmap problems
|
||||
// http://www.doomworld.com/idgames/index.php?id=12935
|
||||
if (!P_VerifyBlockMap(count))
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadBlockMap: corrupted or invalid BLOCKMAP lump! Check the log for more information.\n"));
|
||||
// vanilla WILL crash here anyways so just rebuild it ourselves
|
||||
Z_Free(blockmaplump);
|
||||
blockmaplump = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
// clear out mobj chains
|
||||
count = sizeof (*blocklinks)* bmapwidth*bmapheight;
|
||||
blocklinks = Z_Calloc(count, PU_LEVEL, NULL);
|
||||
@@ -1703,22 +1941,35 @@ static void P_GroupLines(void)
|
||||
for (i = 0; i < numsubsectors; i++, ss++)
|
||||
{
|
||||
if (ss->firstline >= numsegs)
|
||||
{
|
||||
CorruptMapError(va("P_GroupLines: ss->firstline invalid "
|
||||
"(subsector %s, firstline refers to %d of %s)", sizeu1(i), ss->firstline,
|
||||
sizeu2(numsegs)));
|
||||
}
|
||||
|
||||
seg = &segs[ss->firstline];
|
||||
sidei = (size_t)(seg->sidedef - sides);
|
||||
|
||||
if (!seg->sidedef)
|
||||
{
|
||||
CorruptMapError(va("P_GroupLines: seg->sidedef is NULL "
|
||||
"(subsector %s, firstline is %d)", sizeu1(i), ss->firstline));
|
||||
}
|
||||
|
||||
if (seg->sidedef - sides < 0 || seg->sidedef - sides > (UINT16)numsides)
|
||||
{
|
||||
CorruptMapError(va("P_GroupLines: seg->sidedef refers to sidedef %s of %s "
|
||||
"(subsector %s, firstline is %d)", sizeu1(sidei), sizeu2(numsides),
|
||||
sizeu3(i), ss->firstline));
|
||||
}
|
||||
|
||||
if (!seg->sidedef->sector)
|
||||
{
|
||||
CorruptMapError(va("P_GroupLines: seg->sidedef->sector is NULL "
|
||||
"(subsector %s, firstline is %d, sidedef is %s)", sizeu1(i), ss->firstline,
|
||||
sizeu1(sidei)));
|
||||
}
|
||||
|
||||
ss->sector = seg->sidedef->sector;
|
||||
}
|
||||
|
||||
@@ -1780,20 +2031,36 @@ static void P_GroupLines(void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// PK3 version
|
||||
// -- Monster Iestyn 09/01/18
|
||||
static void P_LoadReject(UINT8 *data, size_t count)
|
||||
static void P_LoadReject(UINT8 *data, size_t rejectsize)
|
||||
{
|
||||
if (!count) // zero length, someone probably used ZDBSP
|
||||
const size_t neededsize = (numsectors * numsectors + 7) >> 3;
|
||||
size_t allocsize = rejectsize;
|
||||
|
||||
if (!rejectsize) // zero length, someone probably used ZDBSP
|
||||
{
|
||||
rejectmatrix = NULL;
|
||||
CONS_Debug(DBG_SETUP, "P_LoadReject: REJECT lump has size 0, will not be loaded\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
rejectmatrix = Z_Malloc(count, PU_LEVEL, NULL); // allocate memory for the reject matrix
|
||||
memcpy(rejectmatrix, data, count); // copy the data into it
|
||||
if (rejectsize < neededsize)
|
||||
{
|
||||
CorruptMapWarning(va("P_LoadReject: REJECT is %s byte%s too small. REJECT might be invalid!\n", sizeu1(neededsize - rejectsize), (neededsize - rejectsize) == 1 ? "" : "s"));
|
||||
#ifdef COMPAT_VANILLA
|
||||
// we can pad this and somewhat prevent desyncs
|
||||
// probs not cool if the reject is from a completely different map
|
||||
// but whatever
|
||||
allocsize = neededsize;
|
||||
#else
|
||||
rejectmatrix = NULL;
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
rejectmatrix = Z_Calloc(allocsize, PU_LEVEL, NULL); // allocate memory for the reject matrix
|
||||
memcpy(rejectmatrix, data, rejectsize); // copy the data into it
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1831,9 +2098,13 @@ static void P_LoadMapLUT(const virtres_t* virt)
|
||||
|
||||
// Lookup tables
|
||||
if (virtreject)
|
||||
{
|
||||
P_LoadReject(virtreject->data, virtreject->size);
|
||||
}
|
||||
else
|
||||
{
|
||||
rejectmatrix = NULL;
|
||||
}
|
||||
|
||||
if (!(virtblockmap && P_LoadRawBlockMap(virtblockmap->data, virtblockmap->size)))
|
||||
P_CreateBlockMap();
|
||||
@@ -2927,7 +3198,7 @@ static size_t sreplaces = 0, mreplaces = 0, digmreplaces = 0;
|
||||
static boolean P_CheckSoundReplacements(UINT16 wadnum, char *name, size_t i)
|
||||
{
|
||||
size_t j;
|
||||
lumpnum_t lumpnum = (i|(wadnum<<16));
|
||||
lumpnum_t lumpnum = (i | (wadnum<<16));
|
||||
|
||||
if (name[0] == 'D')
|
||||
{
|
||||
@@ -2935,8 +3206,8 @@ static boolean P_CheckSoundReplacements(UINT16 wadnum, char *name, size_t i)
|
||||
{
|
||||
for (j = 1; j < NUMSFX; j++)
|
||||
{
|
||||
if (S_sfx[j].name && !strnicmp(S_sfx[j].name, name + 2, 6)
|
||||
&& (S_sfx[j].lumpnum != lumpnum) && (S_sfx[j].lumpnum != LUMPERROR))
|
||||
if ((S_sfx[j].lumpnum != lumpnum) && (S_sfx[j].lumpnum != LUMPERROR) &&
|
||||
S_sfx[j].name && !strnicmp(S_sfx[j].name, name + 2, 6))
|
||||
{
|
||||
// the sound will be reloaded when needed,
|
||||
// since sfx->data will be NULL
|
||||
|
||||
@@ -114,6 +114,9 @@ size_t P_PrecacheLevelFlats(void);
|
||||
|
||||
void P_AllocMapHeader(INT16 i);
|
||||
|
||||
void P_PrintCorruptMapWarnings(void);
|
||||
void P_FreeCorruptMapWarnings(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
+40
-22
@@ -31,8 +31,6 @@ typedef struct {
|
||||
fixed_t bbox[4];
|
||||
} los_t;
|
||||
|
||||
static INT32 sightcounts[2];
|
||||
|
||||
typedef INT32 (*divlinefunc)(fixed_t x, fixed_t y, const divline_t *node);
|
||||
typedef INT32 (*divlinecrossfunc)(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2, const divline_t *node);
|
||||
|
||||
@@ -73,7 +71,7 @@ static inline INT32 P_DivlineCrossedFast(fixed_t x1, fixed_t y1, fixed_t x2, fix
|
||||
return (P_DivlineSideFast(x1, y1, node) == P_DivlineSideFast(x2, y2, node));
|
||||
}
|
||||
|
||||
static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los)
|
||||
static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los, boolean fast)
|
||||
{
|
||||
size_t i;
|
||||
sector_t *polysec;
|
||||
@@ -81,6 +79,8 @@ static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los)
|
||||
if (!(po->flags & POF_RENDERALL))
|
||||
return true; // the polyobject isn't visible, so we can ignore it
|
||||
|
||||
const divlinecrossfunc divlinecrossFunc = fast ? P_DivlineCrossedFast : P_DivlineCrossed;
|
||||
|
||||
polysec = po->lines[0]->backsector;
|
||||
|
||||
for (i = 0; i < po->numLines; ++i)
|
||||
@@ -108,21 +108,21 @@ static boolean P_CrossSubsecPolyObj(polyobj_t *po, register los_t *los)
|
||||
v2 = line->v2;
|
||||
|
||||
// line isn't crossed?
|
||||
if (P_DivlineCrossed(v1->x, v1->y, v2->x, v2->y, &los->strace))
|
||||
if (divlinecrossFunc(v1->x, v1->y, v2->x, v2->y, &los->strace))
|
||||
continue;
|
||||
|
||||
divl.dx = v2->x - (divl.x = v1->x);
|
||||
divl.dy = v2->y - (divl.y = v1->y);
|
||||
|
||||
// line isn't crossed?
|
||||
if (P_DivlineCrossed(los->strace.x, los->strace.y, los->t2x, los->t2y, &divl))
|
||||
if (divlinecrossFunc(los->strace.x, los->strace.y, los->t2x, los->t2y, &divl))
|
||||
continue;
|
||||
|
||||
frac = P_InterceptVector(&los->strace, &divl);
|
||||
|
||||
// get slopes of top and bottom of this polyobject line
|
||||
topslope = FixedDiv(polysec->ceilingheight - los->sightzstart , frac);
|
||||
bottomslope = FixedDiv(polysec->floorheight - los->sightzstart , frac);
|
||||
topslope = FixedDiv(polysec->ceilingheight - los->sightzstart, frac);
|
||||
bottomslope = FixedDiv(polysec->floorheight - los->sightzstart, frac);
|
||||
|
||||
if (topslope >= los->topslope && bottomslope <= los->bottomslope)
|
||||
return false; // view completely blocked
|
||||
@@ -147,6 +147,8 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
I_Error("P_CrossSubsector: ss %s with numss = %s\n", sizeu1(num), sizeu2(numsubsectors));
|
||||
#endif
|
||||
|
||||
const divlinecrossfunc divlinecrossFunc = fast ? P_DivlineCrossedFast : P_DivlineCrossed;
|
||||
|
||||
// haleyjd 02/23/06: this assignment should be after the above check
|
||||
seg = segs + subsectors[num].firstline;
|
||||
|
||||
@@ -158,15 +160,13 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
if (po->validcount != validcount)
|
||||
{
|
||||
po->validcount = validcount;
|
||||
if (!P_CrossSubsecPolyObj(po, los))
|
||||
if (!P_CrossSubsecPolyObj(po, los, fast))
|
||||
return false;
|
||||
}
|
||||
po = (polyobj_t *)(po->link.next);
|
||||
}
|
||||
}
|
||||
|
||||
const divlinecrossfunc divlinecrossFunc = fast ? P_DivlineCrossedFast : P_DivlineCrossed;
|
||||
|
||||
for (count = subsectors[num].numlines; --count >= 0; seg++) // check lines
|
||||
{
|
||||
line_t *line = seg->linedef;
|
||||
@@ -214,14 +214,17 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
|
||||
front = seg->frontsector;
|
||||
back = seg->backsector;
|
||||
|
||||
// calculate position at intercept
|
||||
fracx = los->strace.x + FixedMul(los->strace.dx, frac);
|
||||
fracy = los->strace.y + FixedMul(los->strace.dy, frac);
|
||||
|
||||
// calculate sector heights
|
||||
frontf = P_GetSectorFloorZAt (front, fracx, fracy);
|
||||
frontc = P_GetSectorCeilingZAt(front, fracx, fracy);
|
||||
backf = P_GetSectorFloorZAt (back , fracx, fracy);
|
||||
backc = P_GetSectorCeilingZAt(back , fracx, fracy);
|
||||
|
||||
// crosses a two sided line
|
||||
// no wall to block sight with?
|
||||
if (frontf == backf && frontc == backc
|
||||
@@ -262,6 +265,7 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
ffloor_t *rover;
|
||||
fixed_t topslope, bottomslope;
|
||||
fixed_t topz, bottomz;
|
||||
|
||||
// check front sector's FOFs first
|
||||
for (rover = front->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
@@ -275,9 +279,11 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
bottomz = P_GetFFloorBottomZAt(rover, fracx, fracy);
|
||||
topslope = FixedDiv( topz - los->sightzstart, frac);
|
||||
bottomslope = FixedDiv(bottomz - los->sightzstart, frac);
|
||||
|
||||
if (topslope >= los->topslope && bottomslope <= los->bottomslope)
|
||||
return false; // view completely blocked
|
||||
}
|
||||
|
||||
// check back sector's FOFs as well
|
||||
for (rover = back->ffloors; rover; rover = rover->next)
|
||||
{
|
||||
@@ -291,6 +297,7 @@ static boolean P_CrossSubsector(size_t num, register los_t *los, boolean fast)
|
||||
bottomz = P_GetFFloorBottomZAt(rover, fracx, fracy);
|
||||
topslope = FixedDiv( topz - los->sightzstart, frac);
|
||||
bottomslope = FixedDiv(bottomz - los->sightzstart, frac);
|
||||
|
||||
if (topslope >= los->topslope && bottomslope <= los->bottomslope)
|
||||
return false; // view completely blocked
|
||||
}
|
||||
@@ -315,10 +322,10 @@ static boolean P_CrossBSPNode(INT32 bspnum, register los_t *los, boolean fast)
|
||||
|
||||
while (!(bspnum & NF_SUBSECTOR))
|
||||
{
|
||||
register node_t *bsp = nodes + bspnum;
|
||||
register const node_t *bsp = nodes + bspnum;
|
||||
|
||||
INT32 side = divlineFunc(los->strace.x, los->strace.y, (divline_t *)bsp) & 1;
|
||||
INT32 side2 = divlineFunc(los->t2x, los->t2y, (divline_t *) bsp);
|
||||
INT32 side = divlineFunc(los->strace.x, los->strace.y, (const divline_t *)bsp) & 1;
|
||||
INT32 side2 = divlineFunc(los->t2x, los->t2y, (const divline_t *)bsp);
|
||||
|
||||
if (side == side2)
|
||||
{
|
||||
@@ -357,8 +364,10 @@ boolean P_CheckSight2(mobj_t *t1, mobj_t *t2, boolean fast)
|
||||
I_Assert(!P_MobjWasRemoved(t2));
|
||||
|
||||
if (!t1->subsector || !t2->subsector
|
||||
|| !t1->subsector->sector || !t2->subsector->sector)
|
||||
|| !t1->subsector->sector || !t2->subsector->sector)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
s1 = t1->subsector->sector;
|
||||
s2 = t2->subsector->sector;
|
||||
@@ -368,7 +377,9 @@ boolean P_CheckSight2(mobj_t *t1, mobj_t *t2, boolean fast)
|
||||
{
|
||||
// Check in REJECT table.
|
||||
if (rejectmatrix[pnum>>3] & (1 << (pnum&7))) // can't possibly be connected
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// killough 11/98: shortcut for melee situations
|
||||
@@ -376,11 +387,9 @@ boolean P_CheckSight2(mobj_t *t1, mobj_t *t2, boolean fast)
|
||||
// haleyjd 02/23/06: can't do this if there are polyobjects in the subsec
|
||||
if (!t1->subsector->polyList &&
|
||||
t1->subsector == t2->subsector)
|
||||
{
|
||||
return true;
|
||||
|
||||
// An unobstructed LOS is possible.
|
||||
// Now look from eyes of t1 to any part of t2.
|
||||
sightcounts[1]++;
|
||||
}
|
||||
|
||||
validcount++;
|
||||
|
||||
@@ -423,21 +432,30 @@ boolean P_CheckSight2(mobj_t *t1, mobj_t *t2, boolean fast)
|
||||
continue;
|
||||
}
|
||||
|
||||
topz1 = P_GetFFloorTopZAt (rover, t1->x, t1->y);
|
||||
// Check for blocking floors here.
|
||||
|
||||
topz2 = P_GetFFloorTopZAt (rover, t2->x, t2->y);
|
||||
bottomz1 = P_GetFFloorBottomZAt(rover, t1->x, t1->y);
|
||||
|
||||
if (los.sightzstart < bottomz1 && t2->z >= topz2)
|
||||
{
|
||||
// no way to see through that
|
||||
return false;
|
||||
}
|
||||
|
||||
topz1 = P_GetFFloorTopZAt (rover, t1->x, t1->y);
|
||||
bottomz2 = P_GetFFloorBottomZAt(rover, t2->x, t2->y);
|
||||
|
||||
// Check for blocking floors here.
|
||||
if ((los.sightzstart < bottomz1 && t2->z >= topz2)
|
||||
|| (los.sightzstart >= topz1 && t2->z + t2->height < bottomz2))
|
||||
if (los.sightzstart >= topz1 && t2->z + t2->height < bottomz2)
|
||||
{
|
||||
// no way to see through that
|
||||
return false;
|
||||
}
|
||||
|
||||
if (rover->flags & FF_SOLID)
|
||||
{
|
||||
continue; // shortcut since neither mobj can be inside the 3dfloor
|
||||
}
|
||||
|
||||
if (rover->flags & FF_BOTHPLANES || !(rover->flags & FF_INVERTPLANES))
|
||||
{
|
||||
|
||||
@@ -664,8 +664,10 @@ static pslope_t *P_NewVertexSlope(INT16 tag1, INT16 tag2, INT16 tag3, UINT8 flag
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
mt = ret->vertices[i];
|
||||
|
||||
if (!mt) // If a vertex wasn't found, it's game over. There's nothing you can do to recover (except maybe try and kill the slope instead - TODO?)
|
||||
I_Error("P_NewVertexSlope: Slope vertex %s (for linedef tag %d) not found!", sizeu1(i), tag1);
|
||||
|
||||
if (mt->extrainfo)
|
||||
mt->z = mt->options;
|
||||
else
|
||||
|
||||
+220
-125
@@ -881,7 +881,7 @@ static boolean PolyDoor(line_t *line)
|
||||
|
||||
pdd.polyObjNum = line->tag; // polyobject id
|
||||
|
||||
switch(line->special)
|
||||
switch (line->special)
|
||||
{
|
||||
case 480: // Polyobj_DoorSlide
|
||||
pdd.doorType = POLY_DOOR_SLIDE;
|
||||
@@ -889,7 +889,7 @@ static boolean PolyDoor(line_t *line)
|
||||
pdd.angle = line->angle; // angle of motion
|
||||
pdd.distance = sides[line->sidenum[0]].rowoffset;
|
||||
|
||||
if (line->sidenum[1] != 0xffff)
|
||||
if (line->sidenum[1] != NO_INDEX)
|
||||
pdd.delay = sides[line->sidenum[1]].textureoffset >> FRACBITS; // delay in tics
|
||||
else
|
||||
pdd.delay = 0;
|
||||
@@ -899,7 +899,7 @@ static boolean PolyDoor(line_t *line)
|
||||
pdd.speed = sides[line->sidenum[0]].textureoffset >> FRACBITS; // angular speed
|
||||
pdd.distance = sides[line->sidenum[0]].rowoffset >> FRACBITS; // angular distance
|
||||
|
||||
if (line->sidenum[1] != 0xffff)
|
||||
if (line->sidenum[1] != NO_INDEX)
|
||||
pdd.delay = sides[line->sidenum[1]].textureoffset >> FRACBITS; // delay in tics
|
||||
else
|
||||
pdd.delay = 0;
|
||||
@@ -1234,7 +1234,6 @@ static void P_AddExecutorDelay(line_t *line, mobj_t *mobj, sector_t *sector)
|
||||
boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller)
|
||||
{
|
||||
sector_t *ctlsector;
|
||||
fixed_t dist = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS;
|
||||
size_t i, linecnt, sectori;
|
||||
INT16 specialtype = triggerline->special;
|
||||
//fromlapexec = false;
|
||||
@@ -1272,6 +1271,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
rings = actor->health-1;
|
||||
}
|
||||
|
||||
const fixed_t dist = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS;
|
||||
|
||||
if (triggerline->flags & ML_NOCLIMB)
|
||||
{
|
||||
if (rings > dist)
|
||||
@@ -1293,7 +1294,6 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
msecnode_t *node;
|
||||
mobj_t *mo;
|
||||
INT32 numpush = 0;
|
||||
INT32 numneeded = dist;
|
||||
|
||||
if (!caller)
|
||||
return false; // we need a calling sector to find pushables in, silly!
|
||||
@@ -1308,6 +1308,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
node = node->m_thinglist_next;
|
||||
}
|
||||
|
||||
const fixed_t numneeded = P_AproxDistance(triggerline->dx, triggerline->dy)>>FRACBITS;
|
||||
|
||||
if (triggerline->flags & ML_NOCLIMB) // Need at least or more
|
||||
{
|
||||
if (numpush < numneeded)
|
||||
@@ -1336,6 +1338,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
else if (secspecial == 7) // SRB2Kart: reusing for Race Lap executor
|
||||
{
|
||||
UINT8 lap;
|
||||
INT32 targlap;
|
||||
|
||||
if (actor && actor->player && triggerline->flags & ML_EFFECT4)
|
||||
{
|
||||
@@ -1346,19 +1349,21 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
lap = P_FindLowestLap();
|
||||
}
|
||||
|
||||
targlap = (INT32)(sides[triggerline->sidenum[0]].textureoffset >> FRACBITS);
|
||||
|
||||
if (triggerline->flags & ML_NOCLIMB) // Need higher than or equal to
|
||||
{
|
||||
if (lap < (sides[triggerline->sidenum[0]].textureoffset >> FRACBITS))
|
||||
if (lap < targlap)
|
||||
return false;
|
||||
}
|
||||
else if (triggerline->flags & ML_BLOCKMONSTERS) // Need lower than or equal to
|
||||
{
|
||||
if (lap > (sides[triggerline->sidenum[0]].textureoffset >> FRACBITS))
|
||||
if (lap > targlap)
|
||||
return false;
|
||||
}
|
||||
else // Need equal to
|
||||
{
|
||||
if (lap != (sides[triggerline->sidenum[0]].textureoffset >> FRACBITS))
|
||||
if (lap != targlap)
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1450,6 +1455,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
if (triggerline->flags & ML_EFFECT5) // disregard order for efficiency
|
||||
{
|
||||
for (i = 0; i < linecnt; i++)
|
||||
{
|
||||
if (ctlsector->lines[i]->special >= 400
|
||||
&& ctlsector->lines[i]->special < 500)
|
||||
{
|
||||
@@ -1458,6 +1464,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
else
|
||||
P_ProcessLineSpecial(ctlsector->lines[i], actor, caller);
|
||||
}
|
||||
}
|
||||
}
|
||||
else // walk around the sector in a defined order
|
||||
{
|
||||
@@ -1465,11 +1472,13 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
size_t j, masterlineindex = (size_t)-1;
|
||||
|
||||
for (i = 0; i < linecnt; i++)
|
||||
{
|
||||
if (ctlsector->lines[i] == triggerline)
|
||||
{
|
||||
masterlineindex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PARANOIA
|
||||
if (masterlineindex == (size_t)-1)
|
||||
@@ -1488,11 +1497,13 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
{
|
||||
if (i == j)
|
||||
continue;
|
||||
|
||||
if (ctlsector->lines[i]->v1 == ctlsector->lines[j]->v2)
|
||||
{
|
||||
i = j;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ctlsector->lines[i]->v1 == ctlsector->lines[j]->v1)
|
||||
{
|
||||
i = j;
|
||||
@@ -1500,6 +1511,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (j == linecnt)
|
||||
{
|
||||
const size_t vertexei = (size_t)(ctlsector->lines[i]->v1 - vertexes);
|
||||
@@ -1514,11 +1526,13 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
|
||||
{
|
||||
if (i == j)
|
||||
continue;
|
||||
|
||||
if (ctlsector->lines[i]->v2 == ctlsector->lines[j]->v1)
|
||||
{
|
||||
i = j;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ctlsector->lines[i]->v2 == ctlsector->lines[j]->v2)
|
||||
{
|
||||
i = j;
|
||||
@@ -1595,19 +1609,21 @@ void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller)
|
||||
if (lines[masterline].tag != tag)
|
||||
continue;
|
||||
|
||||
const INT16 specialtype = lines[masterline].special;
|
||||
|
||||
// "No More Enemies" and "Level Load" take care of themselves.
|
||||
if (lines[masterline].special == 313
|
||||
|| lines[masterline].special == 399
|
||||
|| lines[masterline].special == 328
|
||||
|| lines[masterline].special == 323
|
||||
if (specialtype == 313
|
||||
|| specialtype == 399
|
||||
|| specialtype == 328
|
||||
|| specialtype == 323
|
||||
// Each-time executors handle themselves, too
|
||||
|| lines[masterline].special == 301 // Each time
|
||||
|| lines[masterline].special == 306 // Character ability - Each time
|
||||
|| lines[masterline].special == 310 // CTF Red team - Each time
|
||||
|| lines[masterline].special == 312 // CTF Blue team - Each time
|
||||
|| lines[masterline].special == 322 // Trigger on X calls - Each Time
|
||||
|| lines[masterline].special < 300
|
||||
|| lines[masterline].special > 399)
|
||||
|| specialtype == 301 // Each time
|
||||
|| specialtype == 306 // Character ability - Each time
|
||||
|| specialtype == 310 // CTF Red team - Each time
|
||||
|| specialtype == 312 // CTF Blue team - Each time
|
||||
|| specialtype == 322 // Trigger on X calls - Each Time
|
||||
|| specialtype < 300
|
||||
|| specialtype > 399)
|
||||
continue;
|
||||
|
||||
if (!P_RunTriggerLinedef(&lines[masterline], actor, caller))
|
||||
@@ -1973,8 +1989,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
INT32 position = (INT32)max(sides[line->sidenum[0]].midtexture, 0);
|
||||
UINT32 prefadems = (UINT32)max(sides[line->sidenum[0]].textureoffset >> FRACBITS, 0);
|
||||
UINT32 postfadems = (UINT32)max(sides[line->sidenum[0]].rowoffset >> FRACBITS, 0);
|
||||
UINT8 fadetarget = (UINT8)max((line->sidenum[1] != 0xffff) ? sides[line->sidenum[1]].textureoffset >> FRACBITS : 0, 0);
|
||||
INT16 fadesource = (INT16)max((line->sidenum[1] != 0xffff) ? sides[line->sidenum[1]].rowoffset >> FRACBITS : -1, -1);
|
||||
UINT8 fadetarget = (UINT8)max((line->sidenum[1] != NO_INDEX) ? sides[line->sidenum[1]].textureoffset >> FRACBITS : 0, 0);
|
||||
INT16 fadesource = (INT16)max((line->sidenum[1] != NO_INDEX) ? sides[line->sidenum[1]].rowoffset >> FRACBITS : -1, -1);
|
||||
|
||||
// Seek offset from current song position
|
||||
if (line->flags & ML_EFFECT1)
|
||||
@@ -2419,7 +2435,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
P_SetPlayerMobjState(mo, S_KART_STND1); // SRB2kart - was S_PLAY_STND
|
||||
|
||||
// Reset bot too.
|
||||
if (bot) {
|
||||
if (bot)
|
||||
{
|
||||
if (line->flags & ML_NOCLIMB)
|
||||
P_SetOrigin(bot, mo->x, mo->y, mo->z);
|
||||
bot->momx = bot->momy = bot->momz = 1;
|
||||
@@ -2487,7 +2504,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
|
||||
var1 = sides[line->sidenum[0]].toptexture; //(line->dx>>FRACBITS)-1;
|
||||
|
||||
if (line->sidenum[1] != 0xffff && line->flags & ML_BLOCKMONSTERS) // read power from back sidedef
|
||||
if (line->sidenum[1] != NO_INDEX && line->flags & ML_BLOCKMONSTERS) // read power from back sidedef
|
||||
var2 = sides[line->sidenum[1]].toptexture;
|
||||
else if (line->flags & ML_NOCLIMB) // 'Infinite'
|
||||
var2 = UINT16_MAX;
|
||||
@@ -2502,6 +2519,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
P_SetTarget(&dummy->target, bot);
|
||||
A_CustomPower(dummy);
|
||||
}
|
||||
|
||||
P_RemoveMobj(dummy);
|
||||
}
|
||||
break;
|
||||
@@ -2565,11 +2583,15 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
if (mo && mo->player)
|
||||
{
|
||||
UINT16 fractime = (UINT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS);
|
||||
|
||||
if (fractime < 1)
|
||||
fractime = 1; //instantly wears off upon leaving
|
||||
|
||||
if (line->flags & ML_NOCLIMB)
|
||||
fractime |= 1<<15; //more crazy &ing, as if music stuff wasn't enough
|
||||
|
||||
mo->player->powers[pw_nocontrol] = fractime;
|
||||
|
||||
if (bot)
|
||||
bot->player->powers[pw_nocontrol] = fractime;
|
||||
}
|
||||
@@ -2579,8 +2601,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
if (mo)
|
||||
{
|
||||
mo->destscale = FixedDiv(P_AproxDistance(line->dx, line->dy), 100<<FRACBITS);
|
||||
|
||||
if (mo->destscale < FRACUNIT/100)
|
||||
mo->destscale = FRACUNIT/100;
|
||||
|
||||
if (mo->player && bot)
|
||||
bot->destscale = mo->destscale;
|
||||
}
|
||||
@@ -2609,7 +2633,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
if (always || this->bottomtexture)
|
||||
this->bottomtexture = set->bottomtexture;
|
||||
|
||||
if (lines[linenum].sidenum[1] == 0xffff)
|
||||
if (lines[linenum].sidenum[1] == NO_INDEX)
|
||||
continue; // One-sided stops here.
|
||||
|
||||
// Back side
|
||||
@@ -2658,16 +2682,18 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
sector_t *sec;
|
||||
mobj_t *thing;
|
||||
|
||||
if (line->sidenum[1] != 0xffff)
|
||||
if (line->sidenum[1] != NO_INDEX)
|
||||
state = (statenum_t)sides[line->sidenum[1]].toptexture;
|
||||
|
||||
while ((secnum = P_FindSectorFromLineTag(line, secnum)) >= 0)
|
||||
{
|
||||
boolean tryagain;
|
||||
sec = sectors + secnum;
|
||||
|
||||
do {
|
||||
tryagain = false;
|
||||
for (thing = sec->thinglist; thing; thing = thing->snext)
|
||||
{
|
||||
if (thing->type == type)
|
||||
{
|
||||
if (state != NUMSTATES)
|
||||
@@ -2684,6 +2710,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (tryagain);
|
||||
}
|
||||
break;
|
||||
@@ -3259,6 +3286,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
||||
case 3: // Linedef executor requires all players present // Trigger Linedef Exec (Floor Touch, All Players)
|
||||
/// \todo check continues for proper splitscreen support?
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (playeringame[i] && !players[i].bot && players[i].mo && (gametype != GT_COOP || players[i].lives > 0))
|
||||
{
|
||||
if (roversector)
|
||||
@@ -3312,6 +3340,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
||||
goto DoneSection2;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* FALLTHRU */
|
||||
case 4: // Linedef executor that doesn't require touching floor // Trigger Linedef Exec (Anywhere in Sector)
|
||||
case 5: // Linedef executor // Trigger Linedef Exec (Floor Touch)
|
||||
@@ -3385,14 +3414,16 @@ DoneSection2:
|
||||
{
|
||||
const fixed_t hscale = mapobjectscale + (mapobjectscale - player->mo->scale);
|
||||
const fixed_t minspeed = 24*hscale;
|
||||
angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle;
|
||||
// if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0
|
||||
|
||||
if (player->mo->eflags & MFE_SPRUNG)
|
||||
break;
|
||||
|
||||
if (player->speed < minspeed) // Push forward to prevent getting stuck
|
||||
{
|
||||
// if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0
|
||||
const angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle;
|
||||
P_InstaThrust(player->mo, pushangle, minspeed);
|
||||
}
|
||||
|
||||
player->kartstuff[k_pogospring] = 1;
|
||||
K_DoPogoSpring(player->mo, 0, 1);
|
||||
@@ -3408,16 +3439,22 @@ DoneSection2:
|
||||
const fixed_t hscale = mapobjectscale + (mapobjectscale - player->mo->scale);
|
||||
const fixed_t minspeed = 24*hscale;
|
||||
const fixed_t maxspeed = 28*hscale;
|
||||
angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle;
|
||||
// if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0
|
||||
|
||||
if (player->mo->eflags & MFE_SPRUNG)
|
||||
break;
|
||||
|
||||
if (player->speed > maxspeed) // Prevent overshooting jumps
|
||||
{
|
||||
// if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0
|
||||
const angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle;
|
||||
P_InstaThrust(player->mo, pushangle, maxspeed);
|
||||
}
|
||||
else if (player->speed < minspeed) // Push forward to prevent getting stuck
|
||||
{
|
||||
// if we have no speed for SOME REASON, use the player's angle, otherwise we'd be forcefully thrusted to what I can only assume is angle 0
|
||||
const angle_t pushangle = FixedHypot(player->mo->momx, player->mo->momy) ? R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy) : player->mo->angle;
|
||||
P_InstaThrust(player->mo, pushangle, minspeed);
|
||||
}
|
||||
|
||||
player->kartstuff[k_pogospring] = 2;
|
||||
K_DoPogoSpring(player->mo, 0, 1);
|
||||
@@ -3436,11 +3473,14 @@ DoneSection2:
|
||||
|
||||
if (i != -1)
|
||||
{
|
||||
INT32 sfxnum;
|
||||
angle_t lineangle;
|
||||
fixed_t linespeed;
|
||||
|
||||
lineangle = lines[i].angle;
|
||||
linespeed = P_AproxDistance(lines[i].v2->x-lines[i].v1->x, lines[i].v2->y-lines[i].v1->y);
|
||||
const line_t *line = &lines[i];
|
||||
|
||||
lineangle = line->angle;
|
||||
linespeed = P_AproxDistance(line->v2->x-line->v1->x, line->v2->y-line->v1->y);
|
||||
|
||||
player->mo->angle = lineangle;
|
||||
|
||||
@@ -3454,7 +3494,7 @@ DoneSection2:
|
||||
P_ForceLocalAngle(player, player->mo->angle);
|
||||
}
|
||||
|
||||
if (!(lines[i].flags & ML_EFFECT4))
|
||||
if (!(line->flags & ML_EFFECT4))
|
||||
{
|
||||
P_UnsetThingPosition(player->mo);
|
||||
if (roversector) // make FOF speed pads work
|
||||
@@ -3476,7 +3516,14 @@ DoneSection2:
|
||||
player->kartstuff[k_drift] = 0;
|
||||
player->kartstuff[k_driftcharge] = 0;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
S_StartSound(player->mo, sfx_spdpad);
|
||||
|
||||
sfxnum = sides[line->sidenum[0]].toptexture;
|
||||
|
||||
// none or invalid sound?
|
||||
if (sfxnum <= sfx_None || sfxnum >= NUMSFX)
|
||||
sfxnum = sfx_spdpad; // use the zippy sound then!
|
||||
|
||||
S_StartSound(player->mo, sfxnum);
|
||||
|
||||
{
|
||||
sfxenum_t pick = P_RandomKey(2); // Gotta roll the RNG every time this is called for sync reasons
|
||||
@@ -3525,21 +3572,25 @@ DoneSection2:
|
||||
P_DoPlayerExit(player);
|
||||
|
||||
P_SetupSignExit(player);
|
||||
// important: use sector->tag on next line instead of player->mo->subsector->tag
|
||||
// this part is different from in P_PlayerThink, this is what was causing
|
||||
// FOF custom exits not to work.
|
||||
lineindex = P_FindSpecialLineFromTag(2, sector->tag, -1);
|
||||
|
||||
if (gametype == GT_COOP && lineindex != -1) // Custom exit!
|
||||
if (gametype == GT_COOP)
|
||||
{
|
||||
// Special goodies with the block monsters flag depending on emeralds collected
|
||||
if ((lines[lineindex].flags & ML_BLOCKMONSTERS) && ALL7EMERALDS(emeralds))
|
||||
nextmapoverride = (INT16)(lines[lineindex].frontsector->ceilingheight>>FRACBITS);
|
||||
else
|
||||
nextmapoverride = (INT16)(lines[lineindex].frontsector->floorheight>>FRACBITS);
|
||||
// important: use sector->tag on next line instead of player->mo->subsector->tag
|
||||
// this part is different from in P_PlayerThink, this is what was causing
|
||||
// FOF custom exits not to work.
|
||||
lineindex = P_FindSpecialLineFromTag(2, sector->tag, -1);
|
||||
|
||||
if (lines[lineindex].flags & ML_NOCLIMB)
|
||||
skipstats = true;
|
||||
if (lineindex != -1) // Custom exit!)
|
||||
{
|
||||
// Special goodies with the block monsters flag depending on emeralds collected
|
||||
if ((lines[lineindex].flags & ML_BLOCKMONSTERS) && ALL7EMERALDS(emeralds))
|
||||
nextmapoverride = (INT16)(lines[lineindex].frontsector->ceilingheight>>FRACBITS);
|
||||
else
|
||||
nextmapoverride = (INT16)(lines[lineindex].frontsector->floorheight>>FRACBITS);
|
||||
|
||||
if (lines[lineindex].flags & ML_NOCLIMB)
|
||||
skipstats = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -3645,7 +3696,6 @@ DoneSection2:
|
||||
thinker_t *th;
|
||||
mobj_t *waypoint = NULL;
|
||||
mobj_t *mo2;
|
||||
angle_t an;
|
||||
|
||||
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT)
|
||||
break;
|
||||
@@ -3693,10 +3743,13 @@ DoneSection2:
|
||||
CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed);
|
||||
}
|
||||
|
||||
an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle;
|
||||
if (!(lines[lineindex].flags & ML_EFFECT4))
|
||||
{
|
||||
const angle_t an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle;
|
||||
|
||||
if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4))
|
||||
break; // behind back
|
||||
if (an > ANGLE_90 && an < ANGLE_270)
|
||||
break; // behind back
|
||||
}
|
||||
|
||||
P_SetTarget(&player->mo->tracer, waypoint);
|
||||
player->speed = speed;
|
||||
@@ -3718,7 +3771,6 @@ DoneSection2:
|
||||
thinker_t *th;
|
||||
mobj_t *waypoint = NULL;
|
||||
mobj_t *mo2;
|
||||
angle_t an;
|
||||
|
||||
if (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT)
|
||||
break;
|
||||
@@ -3766,10 +3818,13 @@ DoneSection2:
|
||||
CONS_Debug(DBG_GAMELOGIC, "Waypoint %d found in sequence %d - speed = %d\n", waypoint->health, sequence, speed);
|
||||
}
|
||||
|
||||
an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle;
|
||||
if (!(lines[lineindex].flags & ML_EFFECT4))
|
||||
{
|
||||
const angle_t an = R_PointToAngle2(player->mo->x, player->mo->y, waypoint->x, waypoint->y) - player->mo->angle;
|
||||
|
||||
if (an > ANGLE_90 && an < ANGLE_270 && !(lines[lineindex].flags & ML_EFFECT4))
|
||||
break; // behind back
|
||||
if (an > ANGLE_90 && an < ANGLE_270)
|
||||
break; // behind back
|
||||
}
|
||||
|
||||
P_SetTarget(&player->mo->tracer, waypoint);
|
||||
player->speed = speed;
|
||||
@@ -3783,10 +3838,13 @@ DoneSection2:
|
||||
|
||||
case 10: // Finish Line
|
||||
// SRB2kart - 150117
|
||||
if (G_RaceGametype() && (player->starpostnum >= (numstarposts - (numstarposts/2)) || player->exiting))
|
||||
if (!G_RaceGametype())
|
||||
break;
|
||||
|
||||
if (player->starpostnum >= (numstarposts - (numstarposts/2)) || player->exiting)
|
||||
player->kartstuff[k_starpostwp] = player->kartstuff[k_waypoint] = 0;
|
||||
//
|
||||
if (G_RaceGametype() && !player->exiting)
|
||||
if (!player->exiting)
|
||||
{
|
||||
if (player->starpostnum >= (numstarposts - (numstarposts/2))) // srb2kart: must have touched *enough* starposts (was originally "(player->starpostnum == numstarposts)")
|
||||
{
|
||||
@@ -4503,27 +4561,13 @@ void P_PlayerInSpecialSector(player_t *player)
|
||||
|
||||
#undef TELEPORTED
|
||||
|
||||
/** Animate planes, scroll walls, etc. and keeps track of level timelimit and exits if time is up.
|
||||
*
|
||||
* \sa P_CheckTimeLimit, P_CheckPointLimit
|
||||
*/
|
||||
void P_UpdateSpecials(void)
|
||||
static void P_UpdateAnimFlats(void)
|
||||
{
|
||||
anim_t *anim;
|
||||
INT32 i;
|
||||
size_t j;
|
||||
levelflat_t *foundflats; // for flat animation
|
||||
|
||||
// LEVEL TIMER
|
||||
P_CheckTimeLimit();
|
||||
|
||||
// POINT LIMIT
|
||||
P_CheckPointLimit();
|
||||
|
||||
// Dynamic slopeness
|
||||
if (!midgamejoin) // run here when not joined midgame to prevent any potential issues that may arise
|
||||
P_RunDynamicSlopes();
|
||||
|
||||
// ANIMATE TEXTURES
|
||||
for (anim = anims; anim < lastanim; anim++)
|
||||
{
|
||||
@@ -4553,15 +4597,40 @@ void P_UpdateSpecials(void)
|
||||
}
|
||||
}
|
||||
|
||||
/** Animate planes, scroll walls, etc. and keeps track of level timelimit and exits if time is up.
|
||||
*
|
||||
* \sa P_CheckTimeLimit, P_CheckPointLimit
|
||||
*/
|
||||
void P_UpdateSpecials(void)
|
||||
{
|
||||
// LEVEL TIMER
|
||||
P_CheckTimeLimit();
|
||||
|
||||
// POINT LIMIT
|
||||
P_CheckPointLimit();
|
||||
|
||||
#ifdef COMPAT_VANILLA
|
||||
// Dynamic slopeness
|
||||
// we run this here only when not joined midrace
|
||||
// for vanilla compat reasons :chaosleep:
|
||||
if (!midgamejoin)
|
||||
P_RunDynamicSlopes();
|
||||
#endif
|
||||
|
||||
P_UpdateAnimFlats();
|
||||
}
|
||||
|
||||
static inline ffloor_t *P_GetFFloorBySec(sector_t *sec, sector_t *sec2)
|
||||
{
|
||||
ffloor_t *rover;
|
||||
|
||||
if (!sec->ffloors)
|
||||
return NULL;
|
||||
|
||||
for (rover = sec->ffloors; rover; rover = rover->next)
|
||||
if (rover->secnum == (size_t)(sec2 - sectors))
|
||||
return rover;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -4612,6 +4681,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||
|
||||
if (sec == sec2)
|
||||
return NULL; //Don't need a fake floor on a control sector.
|
||||
|
||||
if ((ffloor = (P_GetFFloorBySec(sec, sec2))))
|
||||
return ffloor; // If this ffloor already exists, return it
|
||||
|
||||
@@ -4718,7 +4788,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||
P_AddSpikeThinker(sec, (INT32)sec2num);
|
||||
}
|
||||
// Should this FOF have friction?
|
||||
else if(th->function == (actionf_p1)T_Friction)
|
||||
else if (th->function == (actionf_p1)T_Friction)
|
||||
{
|
||||
f = (friction_t *)th;
|
||||
|
||||
@@ -4726,7 +4796,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f
|
||||
Add_Friction(f->friction, f->movefactor, (INT32)(sec-sectors), f->affectee);
|
||||
}
|
||||
// Should this FOF have wind/current/pusher?
|
||||
else if(th->function == (actionf_p1)T_Pusher)
|
||||
else if (th->function == (actionf_p1)T_Pusher)
|
||||
{
|
||||
p = (pusher_t *)th;
|
||||
|
||||
@@ -5164,11 +5234,18 @@ void T_LaserFlash(laserthink_t *flash)
|
||||
if (thing->health <= 0)
|
||||
continue;
|
||||
|
||||
// thing is neither shootable nor an egg guard shield
|
||||
if (!(thing->flags & MF_SHOOTABLE) && (thing->type != MT_EGGSHIELD))
|
||||
continue;
|
||||
|
||||
top = P_GetSpecialTopZ(thing, sourcesec, sector);
|
||||
|
||||
if (thing->z >= top)
|
||||
continue;
|
||||
|
||||
bottom = P_GetSpecialBottomZ(thing, sourcesec, sector);
|
||||
|
||||
if (thing->z >= top
|
||||
|| thing->z + thing->height <= bottom)
|
||||
if (thing->z + thing->height <= bottom)
|
||||
continue;
|
||||
|
||||
if (thing->flags & MF_SHOOTABLE)
|
||||
@@ -5262,7 +5339,7 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
||||
continue;
|
||||
|
||||
// Process Section 1
|
||||
switch(GETSECSPECIAL(sector->special, 1))
|
||||
switch (GETSECSPECIAL(sector->special, 1))
|
||||
{
|
||||
case 5: // Spikes
|
||||
P_AddSpikeThinker(sector, (INT32)(sector-sectors));
|
||||
@@ -5274,7 +5351,7 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
||||
}
|
||||
|
||||
// Process Section 2
|
||||
switch(GETSECSPECIAL(sector->special, 2))
|
||||
switch (GETSECSPECIAL(sector->special, 2))
|
||||
{
|
||||
case 10: // Time for special stage
|
||||
sstimer = (sector->floorheight>>FRACBITS) * TICRATE + 6; // Time to finish
|
||||
@@ -5287,7 +5364,7 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
||||
}
|
||||
|
||||
// Process Section 4
|
||||
switch(GETSECSPECIAL(sector->special, 4))
|
||||
switch (GETSECSPECIAL(sector->special, 4))
|
||||
{
|
||||
case 10: // Circuit finish line
|
||||
if (G_RaceGametype())
|
||||
@@ -5323,11 +5400,13 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
||||
// Allocate each list, and then zero the count so we can use it to track
|
||||
// the end of the list as we add the thinkers
|
||||
for (i = 0; i < numsectors; i++)
|
||||
if(secthinkers[i].count > 0)
|
||||
{
|
||||
if (secthinkers[i].count > 0)
|
||||
{
|
||||
secthinkers[i].thinkers = Z_Malloc(secthinkers[i].count * sizeof(thinker_t *), PU_STATIC, NULL);
|
||||
secthinkers[i].count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Finally, populate the lists.
|
||||
for (th = thinkercap.next; th != &thinkercap; th = th->next)
|
||||
@@ -5979,7 +6058,7 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
||||
break;
|
||||
|
||||
case 259: // Make-Your-Own FOF!
|
||||
if (lines[i].sidenum[1] != 0xffff)
|
||||
if (lines[i].sidenum[1] != NO_INDEX)
|
||||
{
|
||||
UINT8 *data;
|
||||
UINT16 b;
|
||||
@@ -6426,15 +6505,19 @@ void T_Scroll(scroll_t *s)
|
||||
if (thing->flags2 & MF2_PUSHED) // Already pushed this tic by an exclusive pusher.
|
||||
continue;
|
||||
|
||||
height = P_GetSpecialBottomZ(thing, sec, psec);
|
||||
|
||||
if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z+thing->height != height)) // Thing must a) be non-floating and have z+height == height
|
||||
{
|
||||
// Move objects only if on floor
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
height = P_GetSpecialBottomZ(thing, sec, psec);
|
||||
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z+thing->height != height)) // Thing must a) be non-floating and have z+height == height
|
||||
{
|
||||
// Move objects only if on floor
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // end of for loop through touching_thinglist
|
||||
} // end of loop through sectors
|
||||
}
|
||||
@@ -6448,14 +6531,16 @@ void T_Scroll(scroll_t *s)
|
||||
if (thing->flags2 & MF2_PUSHED)
|
||||
continue;
|
||||
|
||||
height = P_GetSpecialBottomZ(thing, sec, sec);
|
||||
|
||||
if (!(thing->flags & MF_NOCLIP) &&
|
||||
(!(thing->flags & MF_NOGRAVITY || thing->z > height)))
|
||||
if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
height = P_GetSpecialBottomZ(thing, sec, sec);
|
||||
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z > height))
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6501,14 +6586,16 @@ void T_Scroll(scroll_t *s)
|
||||
if (thing->flags2 & MF2_PUSHED)
|
||||
continue;
|
||||
|
||||
height = P_GetSpecialTopZ(thing, sec, psec);
|
||||
|
||||
if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z != height))// Thing must a) be non-floating and have z == height
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
height = P_GetSpecialTopZ(thing, sec, psec);
|
||||
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z != height))// Thing must a) be non-floating and have z == height
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
}
|
||||
} // end of for loop through touching_thinglist
|
||||
} // end of loop through sectors
|
||||
@@ -6523,14 +6610,16 @@ void T_Scroll(scroll_t *s)
|
||||
if (thing->flags2 & MF2_PUSHED)
|
||||
continue;
|
||||
|
||||
height = P_GetSpecialTopZ(thing, sec, sec);
|
||||
|
||||
if (!(thing->flags & MF_NOCLIP) &&
|
||||
(!(thing->flags & MF_NOGRAVITY || thing->z+thing->height < height)))
|
||||
if (!(thing->flags & MF_NOCLIP)) // Thing must be clipped
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
height = P_GetSpecialTopZ(thing, sec, sec);
|
||||
|
||||
if (!(thing->flags & MF_NOGRAVITY || thing->z+thing->height < height))
|
||||
{
|
||||
// Move objects only if on floor or underwater,
|
||||
// non-floating, and clipped.
|
||||
P_DoScrollMove(thing, dx, dy, s->exclusive);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6698,7 +6787,7 @@ static void P_SpawnScrollers(void)
|
||||
case 506:
|
||||
s = lines[i].sidenum[1];
|
||||
|
||||
if (s != 0xffff)
|
||||
if (s != NO_INDEX)
|
||||
Add_Scroller(sc_side, -sides[s].textureoffset, sides[s].rowoffset, -1, lines[i].sidenum[0], accel, 0);
|
||||
else
|
||||
CONS_Debug(DBG_GAMELOGIC, "Line special 506 (line #%s) missing 2nd side!\n", sizeu1(i));
|
||||
@@ -6909,6 +6998,7 @@ static void P_SpawnFriction(void)
|
||||
INT32 movefactor; // applied to each player move to simulate inertia
|
||||
|
||||
for (i = 0; i < numlines; i++, l++)
|
||||
{
|
||||
if (l->special == 540)
|
||||
{
|
||||
//length = P_AproxDistance(l->dx, l->dy)>>FRACBITS;
|
||||
@@ -6942,6 +7032,7 @@ static void P_SpawnFriction(void)
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Friction(friction, movefactor, s, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -6990,9 +7081,10 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t *
|
||||
// "The right triangle of the square of the length of the hypotenuse is equal to the sum of the squares of the lengths of the other two sides."
|
||||
// "Bah! Stupid brains! Don't you know anything besides the Pythagorean Theorem?" - Earthworm Jim
|
||||
if (type == p_downcurrent || type == p_upcurrent || type == p_upwind || type == p_downwind)
|
||||
p->magnitude = P_AproxDistance(p->x_mag,p->y_mag)<<(FRACBITS-PUSH_FACTOR);
|
||||
p->magnitude = P_AproxDistance(p->x_mag, p->y_mag)<<(FRACBITS-PUSH_FACTOR);
|
||||
else
|
||||
p->magnitude = P_AproxDistance(p->x_mag,p->y_mag);
|
||||
p->magnitude = P_AproxDistance(p->x_mag, p->y_mag);
|
||||
|
||||
if (source) // point source exist?
|
||||
{
|
||||
// where force goes to zero
|
||||
@@ -7043,15 +7135,14 @@ static inline boolean PIT_PushThing(mobj_t *thing)
|
||||
|
||||
// don't fade wrt Z if health & 2 (mapthing has multi flag)
|
||||
if (tmpusher->source->health & 2)
|
||||
dist = P_AproxDistance(thing->x - sx,thing->y - sy);
|
||||
dist = P_AproxDistance(thing->x - sx, thing->y - sy);
|
||||
else
|
||||
{
|
||||
// Make sure the Z is in range
|
||||
if (thing->z < sz - tmpusher->radius || thing->z > sz + tmpusher->radius)
|
||||
return false;
|
||||
|
||||
dist = P_AproxDistance(P_AproxDistance(thing->x - sx, thing->y - sy),
|
||||
thing->z - sz);
|
||||
dist = P_AproxDistance(P_AproxDistance(thing->x - sx, thing->y - sy), thing->z - sz);
|
||||
}
|
||||
|
||||
speed = (tmpusher->magnitude - ((dist>>FRACBITS)>>1))<<(FRACBITS - PUSH_FACTOR - 1);
|
||||
@@ -7214,7 +7305,6 @@ void T_Pusher(pusher_t *p)
|
||||
|
||||
if (p->type == p_push)
|
||||
{
|
||||
|
||||
// Seek out all pushable things within the force radius of this
|
||||
// point pusher. Crosses sectors, so use blockmap.
|
||||
|
||||
@@ -7257,13 +7347,16 @@ void T_Pusher(pusher_t *p)
|
||||
if (thing->flags2 & MF2_PUSHED)
|
||||
continue;
|
||||
|
||||
if (thing->player && thing->player->pflags & PF_ROPEHANG)
|
||||
continue;
|
||||
if (thing->player)
|
||||
{
|
||||
if (thing->player->pflags & PF_ROPEHANG)
|
||||
continue;
|
||||
|
||||
if (thing->player && (thing->state == &states[thing->info->painstate])
|
||||
&& (thing->player->powers[pw_flashing] > (K_GetKartFlashing(thing->player)/4)*3
|
||||
&& thing->player->powers[pw_flashing] <= K_GetKartFlashing(thing->player)))
|
||||
continue;
|
||||
if ((thing->state == &states[thing->info->painstate])
|
||||
&& (thing->player->powers[pw_flashing] > (K_GetKartFlashing(thing->player)/4)*3
|
||||
&& thing->player->powers[pw_flashing] <= K_GetKartFlashing(thing->player)))
|
||||
continue;
|
||||
}
|
||||
|
||||
inFOF = touching = moved = false;
|
||||
|
||||
@@ -7393,7 +7486,7 @@ void T_Pusher(pusher_t *p)
|
||||
if (p->slider && thing->player)
|
||||
{
|
||||
boolean jumped = (thing->player->pflags & PF_JUMPED);
|
||||
P_ResetPlayer (thing->player);
|
||||
P_ResetPlayer(thing->player);
|
||||
|
||||
if (jumped)
|
||||
thing->player->pflags |= PF_JUMPED;
|
||||
@@ -7461,16 +7554,17 @@ static void P_SpawnPushers(void)
|
||||
mobj_t *thing;
|
||||
|
||||
for (i = 0; i < numlines; i++, l++)
|
||||
{
|
||||
switch (l->special)
|
||||
{
|
||||
case 541: // wind
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_wind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
case 544: // current
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_current, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
case 547: // push/pull
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
{
|
||||
@@ -7482,20 +7576,21 @@ static void P_SpawnPushers(void)
|
||||
case 545: // current up
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_upcurrent, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
case 546: // current down
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_downcurrent, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
case 542: // wind up
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_upwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
case 543: // wind down
|
||||
for (s = -1; (s = P_FindSectorFromLineTag(l, s)) >= 0 ;)
|
||||
Add_Pusher(p_downwind, l->dx, l->dy, NULL, s, -1, l->flags & ML_NOCLIMB, l->flags & ML_EFFECT4);
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void P_StartQuake(tic_t time, fixed_t intensity, fixed_t radius)
|
||||
|
||||
@@ -611,6 +611,15 @@ void P_Ticker(boolean run)
|
||||
#ifdef DEMO_COMPAT_100
|
||||
}
|
||||
#endif
|
||||
|
||||
// Lookback is normally handled inside G_BuildTiccmd, which isn't called in replays so we're doing that manually
|
||||
// idk if this is best place to handle this tho...
|
||||
for (i = 0; i <= splitscreen; ++i)
|
||||
{
|
||||
const boolean usejoystick = cv_usejoystick[i].value;
|
||||
INT32 axis = JoyAxis(AXISLOOKBACK, i+1);
|
||||
camspin[i] = (InputDown(gc_lookback, i+1) || (usejoystick && axis > 0));
|
||||
}
|
||||
}
|
||||
|
||||
ps_lua_mobjhooks.value.i = 0;
|
||||
@@ -637,7 +646,9 @@ void P_Ticker(boolean run)
|
||||
if (run)
|
||||
{
|
||||
// Dynamic slopeness
|
||||
#ifdef COMPAT_VANILLA
|
||||
if (midgamejoin) // only run here if we joined midgame to fix some desynchs
|
||||
#endif
|
||||
P_RunDynamicSlopes();
|
||||
|
||||
PS_START_TIMING(ps_thinkertime);
|
||||
|
||||
+25
-18
@@ -1122,22 +1122,26 @@ void P_SpawnShieldOrb(player_t *player)
|
||||
P_SetTarget(&ov->target, shieldobj);
|
||||
P_SetMobjState(ov, shieldobj->info->seestate);
|
||||
}
|
||||
|
||||
if (shieldobj->info->meleestate)
|
||||
{
|
||||
ov = P_SpawnMobj(shieldobj->x, shieldobj->y, shieldobj->z, MT_OVERLAY);
|
||||
P_SetTarget(&ov->target, shieldobj);
|
||||
P_SetMobjState(ov, shieldobj->info->meleestate);
|
||||
}
|
||||
|
||||
if (shieldobj->info->missilestate)
|
||||
{
|
||||
ov = P_SpawnMobj(shieldobj->x, shieldobj->y, shieldobj->z, MT_OVERLAY);
|
||||
P_SetTarget(&ov->target, shieldobj);
|
||||
P_SetMobjState(ov, shieldobj->info->missilestate);
|
||||
}
|
||||
|
||||
if (player->powers[pw_shield] & SH_FORCE)
|
||||
{
|
||||
//Copy and pasted from P_ShieldLook in p_mobj.c
|
||||
shieldobj->movecount = (player->powers[pw_shield] & 0xFF);
|
||||
|
||||
if (shieldobj->movecount < 1)
|
||||
{
|
||||
if (shieldobj->info->painstate)
|
||||
@@ -1569,10 +1573,12 @@ static void P_CheckBouncySectors(player_t *player)
|
||||
newmom = -8*FRACUNIT;
|
||||
}
|
||||
|
||||
if (newmom > P_GetPlayerHeight(player)/2)
|
||||
newmom = P_GetPlayerHeight(player)/2;
|
||||
else if (newmom < -P_GetPlayerHeight(player)/2)
|
||||
newmom = -P_GetPlayerHeight(player)/2;
|
||||
const fixed_t halfpheight = P_GetPlayerHeight(player)/2;
|
||||
|
||||
if (newmom > halfpheight)
|
||||
newmom = halfpheight;
|
||||
else if (newmom < -halfpheight)
|
||||
newmom = -halfpheight;
|
||||
|
||||
momentum.z = newmom*2;
|
||||
|
||||
@@ -1835,6 +1841,9 @@ void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range)
|
||||
if (!((mo2->flags & MF_SHOOTABLE && mo2->flags & MF_ENEMY) || mo2->type == MT_EGGGUARD || mo2->player))
|
||||
continue;
|
||||
|
||||
if (mo2->health <= 0)
|
||||
continue;
|
||||
|
||||
dist = P_AproxDistance(P_AproxDistance(player->mo->x-mo2->x, player->mo->y-mo2->y), player->mo->z-mo2->z);
|
||||
|
||||
if (range < dist)
|
||||
@@ -1843,15 +1852,12 @@ void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range)
|
||||
if (!P_CheckSight(player->mo, mo2))
|
||||
continue; // if your psychic powers can't "see" it don't bother
|
||||
|
||||
if (mo2->health > 0)
|
||||
{
|
||||
an = R_PointToAngle2(player->mo->x, player->mo->y, mo2->x, mo2->y);
|
||||
an = R_PointToAngle2(player->mo->x, player->mo->y, mo2->x, mo2->y);
|
||||
|
||||
P_Thrust(mo2, an, thrust);
|
||||
P_Thrust(mo2, an, thrust);
|
||||
|
||||
if (mo2->type == MT_GOLDBUZZ || mo2->type == MT_REDBUZZ)
|
||||
mo2->tics += 8;
|
||||
}
|
||||
if (mo2->type == MT_GOLDBUZZ || mo2->type == MT_REDBUZZ)
|
||||
mo2->tics += 8;
|
||||
}
|
||||
|
||||
//P_SpawnThokMobj(player);
|
||||
@@ -2355,7 +2361,7 @@ static void P_MovePlayer(player_t *player)
|
||||
if (onground && leveltime % 50 == 0 && player->kartstuff[k_drift] != 0)
|
||||
S_StartSound(player->mo, sfx_drift);
|
||||
// Leveltime being 50 might take a while at times. We'll start it up once, isntantly.
|
||||
else if (onground && !S_SoundPlaying(player->mo, sfx_drift) && player->kartstuff[k_drift] != 0)
|
||||
else if (onground && player->kartstuff[k_drift] != 0 && !S_SoundPlaying(player->mo, sfx_drift))
|
||||
S_StartSound(player->mo, sfx_drift);
|
||||
// Ok, we'll stop now.
|
||||
else if (player->kartstuff[k_drift] == 0 || !onground)
|
||||
@@ -2736,16 +2742,16 @@ boolean P_LookForEnemies(player_t *player)
|
||||
|| ((mo->z+mo->height < player->mo->z+player->mo->height-FixedMul(MAXSTEPMOVE, mapobjectscale)) && (player->mo->eflags & MFE_VERTICALFLIP))) // Reverse gravity check - Flame.
|
||||
continue; // Don't home upwards!
|
||||
|
||||
if (P_AproxDistance(P_AproxDistance(player->mo->x-mo->x, player->mo->y-mo->y),
|
||||
player->mo->z-mo->z) > FixedMul(RING_DIST, player->mo->scale))
|
||||
const fixed_t modist = P_AproxDistance(P_AproxDistance(player->mo->x-mo->x, player->mo->y-mo->y), player->mo->z-mo->z);
|
||||
|
||||
if (modist > FixedMul(RING_DIST, player->mo->scale))
|
||||
continue; // out of range
|
||||
|
||||
if (UNLIKELY((twodlevel || player->mo->flags2 & MF2_TWOD)
|
||||
&& abs(player->mo->y-mo->y) > player->mo->radius))
|
||||
continue; // not in your 2d plane
|
||||
|
||||
if (closestmo && P_AproxDistance(P_AproxDistance(player->mo->x-mo->x, player->mo->y-mo->y),
|
||||
player->mo->z-mo->z) > P_AproxDistance(P_AproxDistance(player->mo->x-closestmo->x,
|
||||
if (closestmo && modist > P_AproxDistance(P_AproxDistance(player->mo->x-closestmo->x,
|
||||
player->mo->y-closestmo->y), player->mo->z-closestmo->z))
|
||||
continue;
|
||||
|
||||
@@ -3149,8 +3155,8 @@ static ticcmd_t *P_CameraCmd(camera_t *cam, UINT8 num)
|
||||
cmd->angleturn = (INT16)(lang >> TICCMD_REDUCE);
|
||||
cmd->aiming = G_ClipAimingPitch(&laim);
|
||||
|
||||
const boolean analogjoystickmove = cv_usejoystick[num].value && !Joystick[num].bGamepadStyle;
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[num].value && Joystick[num].bGamepadStyle;
|
||||
const boolean analogjoystickmove = cv_usejoystick[num].value && !DigitalGamepadStyle(num);
|
||||
const boolean gamepadjoystickmove = cv_usejoystick[num].value && DigitalGamepadStyle(num);
|
||||
|
||||
usejoystick = (analogjoystickmove || gamepadjoystickmove);
|
||||
|
||||
@@ -4580,6 +4586,7 @@ void P_PlayerThink(player_t *player)
|
||||
{
|
||||
short int i;
|
||||
mo->flags |= MF_NOCLIPHEIGHT;
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
// Debug drawing
|
||||
|
||||
+18
-5
@@ -320,13 +320,20 @@ static void R_AddLine(seg_t *line)
|
||||
INT32 x1, x2;
|
||||
angle_t angle1, angle2, span, tspan;
|
||||
static sector_t tempsec;
|
||||
boolean bothfloorssky = false;
|
||||
boolean bothfloorssky = false;
|
||||
fixed_t v1x, v1y, v2x, v2y; // the seg's vertexes as fixed_t
|
||||
|
||||
g_portal = NULL;
|
||||
|
||||
v1x = line->v1->x;
|
||||
v1y = line->v1->y;
|
||||
|
||||
v2x = line->v2->x;
|
||||
v2y = line->v2->y;
|
||||
|
||||
// big room fix
|
||||
angle1 = R_PointToAngle64(line->v1->x, line->v1->y);
|
||||
angle2 = R_PointToAngle64(line->v2->x, line->v2->y);
|
||||
angle1 = R_PointToAngle64(v1x, v1y);
|
||||
angle2 = R_PointToAngle64(v2x, v2y);
|
||||
|
||||
curline = line;
|
||||
|
||||
@@ -519,6 +526,7 @@ static boolean R_CheckBBox(const fixed_t *bspcoord)
|
||||
angle_t angle1, angle2;
|
||||
INT32 sx1, sx2;
|
||||
const INT32* check;
|
||||
fixed_t x1, y1, x2, y2;
|
||||
|
||||
// Find the corners of the box
|
||||
// that define the edges from current viewpoint.
|
||||
@@ -532,9 +540,14 @@ static boolean R_CheckBBox(const fixed_t *bspcoord)
|
||||
|
||||
check = checkcoord[boxpos];
|
||||
|
||||
x1 = bspcoord[check[0]];
|
||||
y1 = bspcoord[check[1]];
|
||||
x2 = bspcoord[check[2]];
|
||||
y2 = bspcoord[check[3]];
|
||||
|
||||
// big room fix
|
||||
angle1 = R_PointToAngle64(bspcoord[check[0]], bspcoord[check[1]]) - viewangle;
|
||||
angle2 = R_PointToAngle64(bspcoord[check[2]], bspcoord[check[3]]) - viewangle;
|
||||
angle1 = R_PointToAngle64(x1, y1) - viewangle;
|
||||
angle2 = R_PointToAngle64(x2, y2) - viewangle;
|
||||
|
||||
// cph - replaced old code, which was unclear and badly commented
|
||||
// Much more efficient code now
|
||||
|
||||
+1
-1
@@ -430,7 +430,7 @@ typedef struct line_s
|
||||
INT16 tag;
|
||||
|
||||
// Visual appearance: sidedefs.
|
||||
UINT16 sidenum[2]; // sidenum[1] will be 0xffff if one-sided
|
||||
UINT16 sidenum[2]; // sidenum[1] will be NO_INDEX if one-sided
|
||||
fixed_t alpha; // translucency
|
||||
UINT8 blendmode; // blendmode
|
||||
|
||||
|
||||
+4
-4
@@ -387,10 +387,10 @@ void R_InterpolatePrecipMobjState(precipmobj_t *mobj, fixed_t frac, interpmobjst
|
||||
return;
|
||||
}
|
||||
|
||||
out->x = R_LerpFixed(mobj->old_x, mobj->x, frac);
|
||||
out->y = R_LerpFixed(mobj->old_y, mobj->y, frac);
|
||||
out->z = R_LerpFixed(mobj->old_z, mobj->z, frac);
|
||||
out->scale = mapobjectscale;
|
||||
out->x = R_LerpFixed(mobj->old_x, mobj->x, frac);
|
||||
out->y = R_LerpFixed(mobj->old_y, mobj->y, frac);
|
||||
out->z = R_LerpFixed(mobj->old_z, mobj->z, frac);
|
||||
out->scale = mapobjectscale;
|
||||
}
|
||||
|
||||
static levelinterpolator_t *CreateInterpolator(levelinterpolator_type_e type, thinker_t *thinker)
|
||||
|
||||
+1
-1
@@ -289,7 +289,7 @@ void R_ParseSPRTINFOLump(UINT16 wadNum, UINT16 lumpNum)
|
||||
sprinfoLumpLength = W_LumpLengthPwad(wadNum, lumpNum);
|
||||
sprinfoText = (char *)Z_Malloc((sprinfoLumpLength+1)*sizeof(char),PU_STATIC,NULL);
|
||||
// Now move the contents of the lump into this new location.
|
||||
memmove(sprinfoText,sprinfoLump,sprinfoLumpLength);
|
||||
memmove(sprinfoText, sprinfoLump, sprinfoLumpLength);
|
||||
// Make damn well sure the last character in our new memory location is \0.
|
||||
sprinfoText[sprinfoLumpLength] = '\0';
|
||||
// Finally, free up the memory from the first data load, because we really
|
||||
|
||||
+1
-1
@@ -2204,7 +2204,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||
topremap = (encoremap && !(curline->linedef->flags & ML_TFERLINE));
|
||||
|
||||
if ((linedef->flags & (ML_DONTPEGTOP) && (linedef->flags & ML_DONTPEGBOTTOM))
|
||||
&& linedef->sidenum[1] != 0xffff)
|
||||
&& linedef->sidenum[1] != NO_INDEX)
|
||||
{
|
||||
// Special case... use offsets from 2nd side but only if it has a texture.
|
||||
side_t *def = &sides[linedef->sidenum[1]];
|
||||
|
||||
+1
-1
@@ -712,7 +712,7 @@ void R_AddSkins(UINT16 wadnum, boolean local)
|
||||
// skip to end of this skin's frames
|
||||
lastlump = lump;
|
||||
|
||||
while (W_CheckNameForNumPwad(wadnum, lastlump) && memcmp(W_CheckNameForNumPwad(wadnum, lastlump), csprname,4)==0)
|
||||
while (W_CheckNameForNumPwad(wadnum, lastlump) && memcmp(W_CheckNameForNumPwad(wadnum, lastlump), csprname, 4) == 0)
|
||||
lastlump++;
|
||||
|
||||
// allocate (or replace) sprite frames, and set spritedef
|
||||
|
||||
+1
-1
@@ -131,7 +131,7 @@ void R_AddWallSplat(line_t *wallline, INT16 sectorside, const char *patchname, f
|
||||
// set the splat
|
||||
splat->patch = W_GetNumForName(patchname);
|
||||
sectorside ^= 1;
|
||||
if (wallline->sidenum[sectorside] != 0xffff)
|
||||
if (wallline->sidenum[sectorside] != NO_INDEX)
|
||||
{
|
||||
backsector = sides[wallline->sidenum[sectorside]].sector;
|
||||
|
||||
|
||||
+39
-28
@@ -182,15 +182,14 @@ static void R_InstallSpriteLump(UINT16 wad, // graphics patch
|
||||
UINT8 rightfactor = ((rotation == ROT_R) ? 4 : 0);
|
||||
|
||||
// the lump should be used for half of all rotations
|
||||
if (sprtemp[frame].rotate == SRF_SINGLE)
|
||||
if (sprtemp[frame].rotate == SRF_NONE)
|
||||
sprtemp[frame].rotate = SRF_SINGLE;
|
||||
else if (sprtemp[frame].rotate == SRF_SINGLE)
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has L/R rotations and a rot = 0 lump\n", spritename, cn);
|
||||
else if (sprtemp[frame].rotate == SRF_3D)
|
||||
CONS_Debug(DBG_SETUP, "R_InitSprites: Sprite %s frame %c has both L/R and 1-8 rotations\n", spritename, cn);
|
||||
// Let's not complain about multiple L/R rotations. It's not worth the effort.
|
||||
|
||||
if (sprtemp[frame].rotate == SRF_NONE)
|
||||
sprtemp[frame].rotate = SRF_SINGLE;
|
||||
|
||||
sprtemp[frame].rotate |= ((rotation == ROT_R) ? SRF_RIGHT : SRF_LEFT);
|
||||
|
||||
if (sprtemp[frame].rotate == (SRF_3D|SRF_2D))
|
||||
@@ -233,6 +232,7 @@ static void R_InstallSpriteLump(UINT16 wad, // graphics patch
|
||||
// when using sprites in pwad : the lumppat points the new graphics
|
||||
sprtemp[frame].lumppat[rotation] = lumppat;
|
||||
sprtemp[frame].lumpid[rotation] = lumpid;
|
||||
|
||||
if (flipped)
|
||||
sprtemp[frame].flip |= (1<<rotation);
|
||||
else
|
||||
@@ -261,9 +261,11 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
||||
softwarepatch_t patch;
|
||||
UINT8 numadded = 0;
|
||||
|
||||
memset(sprtemp,0xFF, sizeof (sprtemp));
|
||||
memset(sprtemp, 0xFF, sizeof(sprtemp));
|
||||
maxframe = (size_t)-1;
|
||||
|
||||
spritename = sprname;
|
||||
|
||||
// are we 'patching' a sprite already loaded ?
|
||||
// if so, it might patch only certain frames, not all
|
||||
if (spritedef->numframes) // (then spriteframes is not null)
|
||||
@@ -289,7 +291,7 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
||||
|
||||
if (frame >= 64 || !(R_ValidSpriteAngle(rotation))) // Give an actual NAME error -_-...
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Bad sprite name: %s\n"), W_CheckNameForNumPwad(wadnum,l));
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Bad sprite name: %s\n"), W_CheckNameForNumPwad(wadnum, l));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -315,6 +317,15 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
||||
{
|
||||
frame = R_Char2Frame(lumpinfo[l].name[6]);
|
||||
rotation = (UINT8)(lumpinfo[l].name[7] - '0');
|
||||
|
||||
/*
|
||||
if (frame >= 64 || !(R_ValidSpriteAngle(rotation))) // Give an actual NAME error -_-...
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Bad sprite name: %s\n"), W_CheckNameForNumPwad(wadnum, l));
|
||||
continue;
|
||||
}
|
||||
*/
|
||||
|
||||
R_InstallSpriteLump(wadnum, l, numspritelumps, frame, rotation, 1);
|
||||
}
|
||||
|
||||
@@ -363,30 +374,32 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
||||
switch (sprtemp[frame].rotate)
|
||||
{
|
||||
case SRF_NONE:
|
||||
// no rotations were found for that frame at all
|
||||
I_Error("R_AddSingleSpriteDef: No patches found for %.4s frame %c", sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
// no rotations were found for that frame at all
|
||||
I_Error("R_AddSingleSpriteDef: No patches found for %.4s frame %c", sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
|
||||
case SRF_SINGLE:
|
||||
// only the first rotation is needed
|
||||
break;
|
||||
// only the first rotation is needed
|
||||
break;
|
||||
|
||||
case SRF_2D: // both Left and Right rotations
|
||||
// we test to see whether the left and right slots are present
|
||||
if ((sprtemp[frame].lumppat[2] == LUMPERROR) || (sprtemp[frame].lumppat[6] == LUMPERROR))
|
||||
I_Error("R_AddSingleSpriteDef: Sprite %s frame %c is missing rotations",
|
||||
sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
// must have all 8 frames
|
||||
for (rotation = 0; rotation < 8; rotation++)
|
||||
// we test the patch lump, or the id lump whatever
|
||||
// if it was not loaded the two are LUMPERROR
|
||||
if (sprtemp[frame].lumppat[rotation] == LUMPERROR)
|
||||
I_Error("R_AddSingleSpriteDef: Sprite %.4s frame %c is missing rotations",
|
||||
sprname, R_Frame2Char(frame));
|
||||
break;
|
||||
// must have all 8 frames
|
||||
for (rotation = 0; rotation < 8; rotation++)
|
||||
{
|
||||
// we test the patch lump, or the id lump whatever
|
||||
// if it was not loaded the two are LUMPERROR
|
||||
if (sprtemp[frame].lumppat[rotation] == LUMPERROR)
|
||||
I_Error("R_AddSingleSpriteDef: Sprite %.4s frame %c is missing rotations",
|
||||
sprname, R_Frame2Char(frame));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -394,7 +407,6 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
||||
if (spritedef->numframes && // has been allocated
|
||||
spritedef->numframes < maxframe) // more frames are defined ?
|
||||
{
|
||||
|
||||
Z_Free(spritedef->spriteframes);
|
||||
spritedef->spriteframes = NULL;
|
||||
}
|
||||
@@ -451,12 +463,10 @@ void R_AddSpriteDefs(UINT16 wadnum)
|
||||
//
|
||||
for (i = 0; i < numsprites; i++)
|
||||
{
|
||||
spritename = sprnames[i];
|
||||
|
||||
if (spritename[4] && wadnum >= (UINT16)spritename[4])
|
||||
if (sprnames[i][4] && wadnum >= (UINT16)sprnames[i][4])
|
||||
continue;
|
||||
|
||||
if (R_AddSingleSpriteDef(spritename, &sprites[i], wadnum, start, end))
|
||||
if (R_AddSingleSpriteDef(sprnames[i], &sprites[i], wadnum, start, end))
|
||||
{
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
@@ -464,9 +474,7 @@ void R_AddSpriteDefs(UINT16 wadnum)
|
||||
#endif
|
||||
// if a new sprite was added (not just replaced)
|
||||
addsprites++;
|
||||
#ifndef ZDEBUG
|
||||
CONS_Debug(DBG_SETUP, "sprite %s set in pwad %d\n", spritename, wadnum);
|
||||
#endif
|
||||
CONS_Debug(DBG_SETUP, "sprite %s set in pwad %d\n", sprnames[i], wadnum);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -773,6 +781,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||
|
||||
R_SetColumnFunc(BASEDRAWFUNC); // hack: this isn't resetting properly somewhere.
|
||||
dc.colormap = vis->colormap;
|
||||
|
||||
if ((vis->mobj->flags & MF_BOSS) && (vis->mobj->flags2 & MF2_FRET) && (leveltime & 1)) // Bosses "flash"
|
||||
{
|
||||
R_SetColumnFunc(COLDRAWFUNC_TRANS); // translate certain pixels to white
|
||||
@@ -825,6 +834,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||
else
|
||||
dc.colormap = &vis->extra_colormap->colormap[dc.colormap - colormaps];
|
||||
}
|
||||
|
||||
if (!dc.colormap)
|
||||
dc.colormap = colormaps;
|
||||
|
||||
@@ -849,6 +859,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||
vis->xiscale = FixedDiv(vis->xiscale, this_scale);
|
||||
vis->isScaled = true;
|
||||
}
|
||||
|
||||
dc.texturemid = FixedDiv(dc.texturemid, this_scale);
|
||||
}
|
||||
|
||||
|
||||
+142
-129
@@ -477,6 +477,11 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
|
||||
{
|
||||
player_t *player = &players[displayplayers[i]];
|
||||
|
||||
if (!player)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (player->awayviewtics)
|
||||
{
|
||||
listenmobj[i] = player->awayviewmobj;
|
||||
@@ -535,79 +540,84 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
|
||||
|
||||
i = 0; // sensible default
|
||||
|
||||
// Check to see if it is audible, and if not, modify the params
|
||||
if (origin && !itsUs)
|
||||
{
|
||||
// Check to see if it is audible, and if not, modify the params
|
||||
if (origin && !itsUs)
|
||||
boolean audible = false;
|
||||
|
||||
if (splitscreen > 0)
|
||||
{
|
||||
boolean audible = false;
|
||||
if (splitscreen > 0)
|
||||
{
|
||||
fixed_t recdist = INT32_MAX;
|
||||
UINT8 j = 0;
|
||||
fixed_t recdist = INT32_MAX;
|
||||
UINT8 j = 0;
|
||||
|
||||
for (; j <= splitscreen; j++)
|
||||
for (; j <= splitscreen; j++)
|
||||
{
|
||||
fixed_t thisdist = INT32_MAX;
|
||||
|
||||
if (!listenmobj[j])
|
||||
{
|
||||
fixed_t thisdist = INT32_MAX;
|
||||
|
||||
if (!listenmobj[j])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y);
|
||||
|
||||
if (thisdist >= recdist)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
recdist = thisdist;
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (listenmobj[i])
|
||||
{
|
||||
audible = S_AdjustSoundParams(listenmobj[i], origin, &volume, &sep, sfx);
|
||||
}
|
||||
thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y);
|
||||
|
||||
if (!audible)
|
||||
{
|
||||
return;
|
||||
if (thisdist >= recdist)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
recdist = thisdist;
|
||||
i = j;
|
||||
}
|
||||
}
|
||||
|
||||
// This is supposed to handle the loading/caching.
|
||||
// For some odd reason, the caching is done nearly
|
||||
// each time the sound is needed?
|
||||
if (listenmobj[i])
|
||||
{
|
||||
audible = S_AdjustSoundParams(listenmobj[i], origin, &volume, &sep, sfx);
|
||||
}
|
||||
|
||||
if (!audible)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// This is supposed to handle the loading/caching.
|
||||
// For some odd reason, the caching is done nearly
|
||||
// each time the sound is needed?
|
||||
|
||||
// cache data if necessary
|
||||
// NOTE: set sfx->data NULL sfx->lump -1 to force a reload
|
||||
if (!sfx->data)
|
||||
{
|
||||
sfx->data = I_GetSfx(sfx);
|
||||
|
||||
// cache data if necessary
|
||||
// NOTE: set sfx->data NULL sfx->lump -1 to force a reload
|
||||
if (!sfx->data)
|
||||
{
|
||||
sfx->data = I_GetSfx(sfx);
|
||||
CONS_Alert(CONS_WARNING, "Tried to load invalid sfx_%s\n", sfx->name);
|
||||
return; /* don't play it */
|
||||
}
|
||||
|
||||
// Avoid channel reverse if surround
|
||||
if (reverse)
|
||||
{
|
||||
sep = (~sep) & 255;
|
||||
}
|
||||
|
||||
// At this point it is determined that a sound can and should be played, so find a free channel to play it on
|
||||
cnum = S_getChannel(origin, sfx);
|
||||
|
||||
if (cnum < 0)
|
||||
{
|
||||
return; // If there's no free channels, there won't be any for anymore players either
|
||||
}
|
||||
|
||||
// Now that we know we are going to play a sound, fill out this info
|
||||
channels[cnum].sfxinfo = sfx;
|
||||
channels[cnum].origin = origin;
|
||||
channels[cnum].volume = initial_volume;
|
||||
channels[cnum].handle = I_StartSound(sfx_id, volume, sep, cnum);
|
||||
}
|
||||
|
||||
// Avoid channel reverse if surround
|
||||
if (reverse)
|
||||
{
|
||||
sep = (~sep) & 255;
|
||||
}
|
||||
|
||||
// At this point it is determined that a sound can and should be played, so find a free channel to play it on
|
||||
cnum = S_getChannel(origin, sfx);
|
||||
|
||||
if (cnum < 0)
|
||||
{
|
||||
return; // If there's no free channels, there won't be any for anymore players either
|
||||
}
|
||||
|
||||
// Now that we know we are going to play a sound, fill out this info
|
||||
channels[cnum].sfxinfo = sfx;
|
||||
channels[cnum].origin = origin;
|
||||
channels[cnum].volume = initial_volume;
|
||||
channels[cnum].handle = I_StartSound(sfx_id, volume, sep, cnum);
|
||||
}
|
||||
|
||||
void S_StartSound(const void *origin, sfxenum_t sfx_id)
|
||||
@@ -728,6 +738,11 @@ void S_UpdateSounds(void)
|
||||
{
|
||||
player_t *player = &players[displayplayers[i]];
|
||||
|
||||
if (!player)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (player->awayviewtics)
|
||||
{
|
||||
listenmobj[i] = player->awayviewmobj;
|
||||
@@ -761,84 +776,83 @@ void S_UpdateSounds(void)
|
||||
{
|
||||
c = &channels[cnum];
|
||||
|
||||
if (c->sfxinfo)
|
||||
if (c->sfxinfo == NULL)
|
||||
continue;
|
||||
|
||||
// if channel is allocated but sound has stopped, free it
|
||||
if (!I_SoundIsPlaying(c->handle))
|
||||
{
|
||||
if (I_SoundIsPlaying(c->handle))
|
||||
S_StopChannel(cnum);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (c->origin == NULL)
|
||||
continue;
|
||||
|
||||
// initialize parameters
|
||||
volume = c->volume; // 8 bits internal volume precision
|
||||
sep = NORM_SEP;
|
||||
|
||||
// check non-local sounds for distance clipping
|
||||
// or modify their params
|
||||
boolean itsUs = false;
|
||||
|
||||
for (i = splitscreen; i >= 0; i--)
|
||||
{
|
||||
if (camera[i].freecam)
|
||||
continue;
|
||||
|
||||
if (c->origin != listenmobj[i])
|
||||
continue;
|
||||
|
||||
itsUs = true;
|
||||
}
|
||||
|
||||
if (itsUs == false)
|
||||
{
|
||||
const mobj_t *origin = c->origin;
|
||||
|
||||
i = 0;
|
||||
|
||||
if (splitscreen > 0)
|
||||
{
|
||||
// initialize parameters
|
||||
volume = c->volume; // 8 bits internal volume precision
|
||||
sep = NORM_SEP;
|
||||
fixed_t recdist = INT32_MAX;
|
||||
UINT8 j = 0;
|
||||
|
||||
// check non-local sounds for distance clipping
|
||||
// or modify their params
|
||||
if (c->origin)
|
||||
for (; j <= splitscreen; j++)
|
||||
{
|
||||
boolean itsUs = false;
|
||||
fixed_t thisdist = INT32_MAX;
|
||||
|
||||
for (i = splitscreen; i >= 0; i--)
|
||||
if (!listenmobj[j])
|
||||
{
|
||||
if (camera[i].freecam)
|
||||
continue;
|
||||
|
||||
if (c->origin != listenmobj[i])
|
||||
continue;
|
||||
|
||||
itsUs = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (itsUs == false)
|
||||
thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y);
|
||||
|
||||
if (thisdist >= recdist)
|
||||
{
|
||||
const mobj_t *origin = c->origin;
|
||||
|
||||
i = 0;
|
||||
|
||||
if (splitscreen > 0)
|
||||
{
|
||||
fixed_t recdist = INT32_MAX;
|
||||
UINT8 j = 0;
|
||||
|
||||
for (; j <= splitscreen; j++)
|
||||
{
|
||||
fixed_t thisdist = INT32_MAX;
|
||||
|
||||
if (!listenmobj[j])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y);
|
||||
|
||||
if (thisdist >= recdist)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
recdist = thisdist;
|
||||
i = j;
|
||||
}
|
||||
}
|
||||
|
||||
if (listenmobj[i])
|
||||
{
|
||||
audible = S_AdjustSoundParams(
|
||||
listenmobj[i], c->origin,
|
||||
&volume, &sep,
|
||||
c->sfxinfo
|
||||
);
|
||||
}
|
||||
|
||||
if (audible)
|
||||
I_UpdateSoundParams(c->handle, volume, sep);
|
||||
else
|
||||
S_StopChannel(cnum);
|
||||
continue;
|
||||
}
|
||||
|
||||
recdist = thisdist;
|
||||
i = j;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
if (listenmobj[i])
|
||||
{
|
||||
// if channel is allocated but sound has stopped, free it
|
||||
S_StopChannel(cnum);
|
||||
audible = S_AdjustSoundParams(
|
||||
listenmobj[i], c->origin,
|
||||
&volume, &sep,
|
||||
c->sfxinfo
|
||||
);
|
||||
}
|
||||
|
||||
if (audible)
|
||||
I_UpdateSoundParams(c->handle, volume, sep);
|
||||
else
|
||||
S_StopChannel(cnum);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -866,7 +880,6 @@ void S_ClearSfx(void)
|
||||
|
||||
static void S_StopChannel(INT32 cnum)
|
||||
{
|
||||
INT32 i;
|
||||
channel_t *c = &channels[cnum];
|
||||
|
||||
if (c->sfxinfo)
|
||||
@@ -875,12 +888,6 @@ static void S_StopChannel(INT32 cnum)
|
||||
if (I_SoundIsPlaying(c->handle))
|
||||
I_StopSound(c->handle);
|
||||
|
||||
// check to see
|
||||
// if other channels are playing the sound
|
||||
for (i = 0; i < numofchannels; i++)
|
||||
if (cnum != i && c->sfxinfo == channels[i].sfxinfo)
|
||||
break;
|
||||
|
||||
c->sfxinfo = NULL;
|
||||
}
|
||||
|
||||
@@ -1046,12 +1053,14 @@ static boolean S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source,
|
||||
INT32 S_OriginPlaying(void *origin)
|
||||
{
|
||||
INT32 cnum;
|
||||
|
||||
if (!origin)
|
||||
return false;
|
||||
|
||||
for (cnum = 0; cnum < numofchannels; cnum++)
|
||||
if (channels[cnum].origin == origin)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1064,6 +1073,7 @@ INT32 S_IdPlaying(sfxenum_t id)
|
||||
for (cnum = 0; cnum < numofchannels; cnum++)
|
||||
if ((size_t)(channels[cnum].sfxinfo - S_sfx) == (size_t)id)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1072,6 +1082,7 @@ INT32 S_IdPlaying(sfxenum_t id)
|
||||
INT32 S_SoundPlaying(void *origin, sfxenum_t id)
|
||||
{
|
||||
INT32 cnum;
|
||||
|
||||
if (!origin)
|
||||
return 0;
|
||||
|
||||
@@ -1081,6 +1092,7 @@ INT32 S_SoundPlaying(void *origin, sfxenum_t id)
|
||||
&& (size_t)(channels[cnum].sfxinfo - S_sfx) == (size_t)id)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1093,6 +1105,7 @@ static sfxenum_t newsounds[MAXNEWSOUNDS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
void S_StartSoundName(void *mo, const char *soundname)
|
||||
{
|
||||
INT32 i, soundnum = 0;
|
||||
|
||||
// Search existing sounds...
|
||||
for (i = sfx_None + 1; i < NUMSFX; i++)
|
||||
{
|
||||
|
||||
+1
-1
@@ -530,6 +530,6 @@ void SCR_DisplayLocalPing(void)
|
||||
if (cv_showping.value == 1 || (cv_showping.value == 2 && ping > servermaxping)) // only show 2 (warning) if our ping is at a bad level
|
||||
{
|
||||
INT32 dispy = (cv_ticrate.value == 1) ? 165 : ((cv_ticrate.value == 2 || cv_ticrate.value == 4) ? 172 : ((cv_ticrate.value == 3) ? 163 : 181)); // absolute buttpain
|
||||
HU_drawPlayerPing(308, dispy, consoleplayer, pingflags); // consoleplayer's ping is everyone's ping in a splitnetgame :P
|
||||
HU_drawLocalPlayerPing(308, dispy, pingflags); // consoleplayer's ping is everyone's ping in a splitnetgame :P
|
||||
}
|
||||
}
|
||||
@@ -743,26 +743,22 @@ INT32 numcontrollers = 0;
|
||||
//
|
||||
void I_JoyScale(void)
|
||||
{
|
||||
Joystick[0].bGamepadStyle = cv_joyscale[0].value == 0;
|
||||
JoyInfo[0].scale = Joystick[0].bGamepadStyle ? 1 : cv_joyscale[0].value;
|
||||
JoyInfo[0].scale = DigitalGamepadStyle(0) ? 1 : cv_joyscale[0].value;
|
||||
}
|
||||
|
||||
void I_JoyScale2(void)
|
||||
{
|
||||
Joystick[1].bGamepadStyle = cv_joyscale[1].value == 0;
|
||||
JoyInfo[1].scale = Joystick[1].bGamepadStyle ? 1 : cv_joyscale[1].value;
|
||||
JoyInfo[1].scale = DigitalGamepadStyle(1) ? 1 : cv_joyscale[1].value;
|
||||
}
|
||||
|
||||
void I_JoyScale3(void)
|
||||
{
|
||||
Joystick[2].bGamepadStyle = cv_joyscale[2].value == 0;
|
||||
JoyInfo[2].scale = Joystick[2].bGamepadStyle ? 1 : cv_joyscale[2].value;
|
||||
JoyInfo[2].scale = DigitalGamepadStyle(2) ? 1 : cv_joyscale[2].value;
|
||||
}
|
||||
|
||||
void I_JoyScale4(void)
|
||||
{
|
||||
Joystick[3].bGamepadStyle = cv_joyscale[3].value == 0;
|
||||
JoyInfo[3].scale = Joystick[3].bGamepadStyle ? 1 : cv_joyscale[3].value;
|
||||
JoyInfo[3].scale = DigitalGamepadStyle(3) ? 1 : cv_joyscale[3].value;
|
||||
}
|
||||
|
||||
// Cheat to get the device index for a joystick handle
|
||||
|
||||
+4
-1
@@ -454,7 +454,7 @@ static INT32 SDLJoyAxis(const Sint16 axis, evtype_t which)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (Joystick[pid].bGamepadStyle)
|
||||
if (DigitalGamepadStyle(pid))
|
||||
{
|
||||
// gamepad control type, on or off, live or die
|
||||
if (raxis < -(JOYAXISRANGE/2))
|
||||
@@ -1855,6 +1855,9 @@ void I_StartupGraphics(void)
|
||||
{
|
||||
word = strtok(line, " \n");
|
||||
|
||||
if (!word)
|
||||
continue;
|
||||
|
||||
if (rendermode == render_none)
|
||||
{
|
||||
if (fasticmp(word, "software"))
|
||||
|
||||
Binary file not shown.
@@ -945,7 +945,7 @@ UINT32 I_GetSongLength(void)
|
||||
|
||||
boolean I_SetSongLoopPoint(UINT32 looppoint)
|
||||
{
|
||||
if (!music|| !is_looping)
|
||||
if (!music || !is_looping)
|
||||
return false;
|
||||
|
||||
const musictype_t mustype = I_SongType();
|
||||
@@ -958,7 +958,7 @@ boolean I_SetSongLoopPoint(UINT32 looppoint)
|
||||
if (length > 0)
|
||||
looppoint %= length;
|
||||
|
||||
loop_point = max((float)(looppoint / 1000.0L), 0);
|
||||
loop_point = max((float)(looppoint / 1000.0L), 0.0f);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -975,7 +975,7 @@ sfxinfo_t S_sfx[NUMSFX] =
|
||||
char freeslotnames[sfx_freeslot0 + NUMSFXFREESLOTS + NUMSKINSFXSLOTS][7] = {};
|
||||
|
||||
// Prepare free sfx slots to add sfx at run time
|
||||
void S_InitRuntimeSounds (void)
|
||||
void S_InitRuntimeSounds(void)
|
||||
{
|
||||
sfxenum_t i;
|
||||
INT32 value;
|
||||
@@ -1040,6 +1040,7 @@ sfxenum_t S_AddSoundFx(const char *name, boolean singular, INT32 flags, boolean
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
I_Error("Out of Sound Freeslots while allocating \"%s\"\nLoad less addons to fix this.", name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+13
-3
@@ -423,9 +423,9 @@ static void ApplyPaletteDelta(const RGBA_t *pal_in, RGBA_t *pal_out, const INT16
|
||||
INT16 r = (INT16)pal_in[i].s.red + pal_delta[i][0];
|
||||
INT16 g = (INT16)pal_in[i].s.green + pal_delta[i][1];
|
||||
INT16 b = (INT16)pal_in[i].s.blue + pal_delta[i][2];
|
||||
pal_out[i].s.red = (UINT8)CLAMP(r, 0 , 255);
|
||||
pal_out[i].s.green = (UINT8)CLAMP(g, 0 , 255);
|
||||
pal_out[i].s.blue = (UINT8)CLAMP(b, 0 , 255);
|
||||
pal_out[i].s.red = (UINT8)CLAMP(r, 0, 255);
|
||||
pal_out[i].s.green = (UINT8)CLAMP(g, 0, 255);
|
||||
pal_out[i].s.blue = (UINT8)CLAMP(b, 0, 255);
|
||||
pal_out[i].s.alpha = 0xFF; // pal_in[i].s.alpha
|
||||
}
|
||||
}
|
||||
@@ -2203,6 +2203,7 @@ void V_DrawString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||
{
|
||||
if (!*ch)
|
||||
break;
|
||||
|
||||
if (*ch & 0x80) //color parsing -x 2.16.09
|
||||
{
|
||||
// manually set flags override color codes
|
||||
@@ -2213,6 +2214,7 @@ void V_DrawString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (*ch == '\n')
|
||||
{
|
||||
cx = x;
|
||||
@@ -2247,6 +2249,7 @@ void V_DrawString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||
|
||||
if (cx > scrwidth)
|
||||
break;
|
||||
|
||||
if (cx+left + w < 0) //left boundary check
|
||||
{
|
||||
cx += w;
|
||||
@@ -2304,6 +2307,7 @@ void V_DrawKartString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||
{
|
||||
if (!*ch)
|
||||
break;
|
||||
|
||||
if (*ch & 0x80) //color parsing -x 2.16.09
|
||||
{
|
||||
// manually set flags override color codes
|
||||
@@ -2314,6 +2318,7 @@ void V_DrawKartString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (*ch == '\n')
|
||||
{
|
||||
cx = x;
|
||||
@@ -2348,6 +2353,7 @@ void V_DrawKartString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||
|
||||
if (cx > scrwidth)
|
||||
break;
|
||||
|
||||
if (cx+left + w < 0) //left boundary check
|
||||
{
|
||||
cx += w;
|
||||
@@ -2422,6 +2428,7 @@ void V_DrawSmallString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||
{
|
||||
if (!*ch)
|
||||
break;
|
||||
|
||||
if (*ch & 0x80) //color parsing -x 2.16.09
|
||||
{
|
||||
// manually set flags override color codes
|
||||
@@ -2432,6 +2439,7 @@ void V_DrawSmallString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (*ch == '\n')
|
||||
{
|
||||
cx = x;
|
||||
@@ -2540,6 +2548,7 @@ void V_DrawThinString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||
{
|
||||
if (!*ch)
|
||||
break;
|
||||
|
||||
if (*ch & 0x80) //color parsing -x 2.16.09
|
||||
{
|
||||
// manually set flags override color codes
|
||||
@@ -2550,6 +2559,7 @@ void V_DrawThinString(INT32 x, INT32 y, INT32 option, const char *string)
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (*ch == '\n')
|
||||
{
|
||||
cx = x;
|
||||
|
||||
+1
-1
@@ -586,7 +586,7 @@ void Y_Ticker(void)
|
||||
|
||||
if (data.rankingsmode && intertic > sorttic+16+(2*TICRATE))
|
||||
{
|
||||
INT32 q=0,r=0;
|
||||
INT32 q = 0, r = 0;
|
||||
boolean kaching = true;
|
||||
|
||||
for (q = 0; q < data.numplayers; q++)
|
||||
|
||||
Reference in new issue
Block a user