From d1dcdf88c7ad407f43f0132e986ba5f2844903ca Mon Sep 17 00:00:00 2001 From: fickleheart Date: Sun, 23 Feb 2020 18:44:22 -0600 Subject: [PATCH 01/15] Fix MD2 rollangle in reverse gravity --- src/hardware/hw_md2.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 5c3cd40a6..c9b78bc79 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1478,7 +1478,7 @@ boolean HWR_DrawModel(gr_vissprite_t *spr) // rotation pivot p.centerx = FIXED_TO_FLOAT(spr->mobj->radius/2); - p.centery = FIXED_TO_FLOAT(spr->mobj->height/2); + p.centery = FIXED_TO_FLOAT(spr->mobj->height/(flip ? -2 : 2)); // rotation axis if (sprinfo->available) @@ -1490,6 +1490,9 @@ boolean HWR_DrawModel(gr_vissprite_t *spr) p.rollflip = 1; else if ((sprframe->rotate & SRF_LEFT) && (ang >= ANGLE_180)) // See from left p.rollflip = -1; + + if (flip) + p.rollflip *= -1; } p.anglex = 0.0f; From 1f8dbd1b8c64dd51736679c195c2b258e69a78e8 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Mon, 24 Feb 2020 11:44:27 -0600 Subject: [PATCH 02/15] Allow using lump names in ExecCfg --- src/dehacked.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index dea0289b9..38330606a 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -3889,7 +3889,26 @@ static void readmaincfg(MYFILE *f) value = atoi(word2); // used for numerical settings if (fastcmp(word, "EXECCFG")) - COM_BufAddText(va("exec %s\n", word2)); + { + if (strchr(word2, '.')) + COM_BufAddText(va("exec %s\n", word2)); + else + { + lumpnum_t lumpnum; + char newname[9]; + + strncpy(newname, word2, 8); + + newname[8] = '\0'; + + lumpnum = W_CheckNumForName(newname); + + if (lumpnum == LUMPERROR || W_LumpLength(lumpnum) == 0) + CONS_Debug(DBG_SETUP, "SOC Error: script lump %s not found/not valid.\n", newname); + else + COM_BufInsertText(W_CacheLumpNum(lumpnum, PU_CACHE)); + } + } else if (fastcmp(word, "SPSTAGE_START")) { @@ -7477,7 +7496,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit // Got Flag Sign "S_GOTFLAG", - + // Finish flag "S_FINISHFLAG", From f8408f3c99c515efac228d33f689aa77bd3b2946 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Mon, 24 Feb 2020 11:44:45 -0600 Subject: [PATCH 03/15] Fix ExecCfg not working on files added via command line --- src/d_main.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 904ab3bf1..1af7857ee 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1152,6 +1152,12 @@ void D_SRB2Main(void) if (M_CheckParm("-password") && M_IsNextParm()) D_SetPassword(M_GetNextParm()); + CONS_Printf("Z_Init(): Init zone memory allocation daemon. \n"); + Z_Init(); + + // Do this up here so that WADs loaded through the command line can use ExecCfg + COM_Init(); + // add any files specified on the command line with -file wadfile // to the wad list if (!(M_CheckParm("-connect") && !M_CheckParm("-server"))) @@ -1179,9 +1185,6 @@ void D_SRB2Main(void) if (M_CheckParm("-server") || dedicated) netgame = server = true; - CONS_Printf("Z_Init(): Init zone memory allocation daemon. \n"); - Z_Init(); - // adapt tables to SRB2's needs, including extra slots for dehacked file support P_PatchInfoTables(); @@ -1253,7 +1256,6 @@ void D_SRB2Main(void) CONS_Printf("HU_Init(): Setting up heads up display.\n"); HU_Init(); - COM_Init(); CON_Init(); D_RegisterServerCommands(); From b66be478d991bb3038bb28b892ce7b059b235595 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Mon, 24 Feb 2020 11:45:22 -0600 Subject: [PATCH 04/15] Increase COM_BUF_SIZE The config file is starting to get close to the old max, so this should be enough headroom for a while... --- src/command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/command.c b/src/command.c index d1eea6052..abe6bcedf 100644 --- a/src/command.c +++ b/src/command.c @@ -80,7 +80,7 @@ static boolean joyaxis2_default = false; static INT32 joyaxis_count = 0; static INT32 joyaxis2_count = 0; -#define COM_BUF_SIZE 8192 // command buffer size +#define COM_BUF_SIZE (32<<10) // command buffer size #define MAX_ALIAS_RECURSION 100 // max recursion allowed for aliases static INT32 com_wait; // one command per frame (for cmd sequences) From feb18208cbb6fbe0c380d96713af2278aa4119cb Mon Sep 17 00:00:00 2001 From: fickleheart Date: Sat, 21 Mar 2020 01:36:39 -0500 Subject: [PATCH 05/15] Add support for srb2:// URL handler (server links) --- src/d_main.c | 27 +++++++++++++++++++++++++-- src/i_tcp.c | 9 ++++++--- src/m_argv.c | 18 ++++++++++++++++++ src/m_argv.h | 3 +++ 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 3840e77a0..d954fa4d1 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -889,6 +889,29 @@ static void IdentifyVersion(void) char *srb2wad; const char *srb2waddir = NULL; + // URL handlers are opened by web browsers (at least Firefox) from the browser's working directory, not the game's stored directory, + // so chdir to that directory unless overridden. + if (M_GetUrlProtocolArg() != NULL && !M_CheckParm("-nochdir")) + { + size_t i; + + CONS_Printf("srb2:// connect links load game files from the SRB2 application's stored directory. Switching to "); + strlcpy(srb2path, myargv[0], sizeof(srb2path)); + + // Get just the directory, minus the EXE name + for (i = strlen(srb2path)-1; i > 0; i--) + { + if (srb2path[i] == '/' || srb2path[i] == '\\') + { + srb2path[i] = '\0'; + break; + } + } + + CONS_Printf("%s\n", srb2path); + chdir(srb2path); + } + #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) // change to the directory where 'srb2.pk3' is found srb2waddir = I_LocateWad(); @@ -1152,7 +1175,7 @@ void D_SRB2Main(void) // add any files specified on the command line with -file wadfile // to the wad list - if (!(M_CheckParm("-connect") && !M_CheckParm("-server"))) + if (!((M_GetUrlProtocolArg() || M_CheckParm("-connect")) && !M_CheckParm("-server"))) { if (M_CheckParm("-file")) { @@ -1187,7 +1210,7 @@ void D_SRB2Main(void) M_InitMenuPresTables(); // init title screen display params - if (M_CheckParm("-connect")) + if (M_GetUrlProtocolArg() || M_CheckParm("-connect")) F_InitMenuPresValues(); //---------------------------------------------------- READY TIME diff --git a/src/i_tcp.c b/src/i_tcp.c index 34cad1765..373ea1bd0 100644 --- a/src/i_tcp.c +++ b/src/i_tcp.c @@ -1423,6 +1423,7 @@ static void SOCK_ClearBans(void) boolean I_InitTcpNetwork(void) { char serverhostname[255]; + const char *urlparam = NULL; boolean ret = false; // initilize the OS's TCP/IP stack if (!I_InitTcpDriver()) @@ -1476,10 +1477,12 @@ boolean I_InitTcpNetwork(void) ret = true; } - else if (M_CheckParm("-connect")) + else if ((urlparam = M_GetUrlProtocolArg()) != NULL || M_CheckParm("-connect")) { - if (M_IsNextParm()) - strcpy(serverhostname, M_GetNextParm()); + if (urlparam != NULL) + strlcpy(serverhostname, urlparam, sizeof(serverhostname)); + else if (M_IsNextParm()) + strlcpy(serverhostname, M_GetNextParm(), sizeof(serverhostname)); else serverhostname[0] = 0; // assuming server in the LAN, use broadcast to detect it diff --git a/src/m_argv.c b/src/m_argv.c index acb74cff4..d7d1f4463 100644 --- a/src/m_argv.c +++ b/src/m_argv.c @@ -34,6 +34,24 @@ boolean myargmalloc = false; */ static INT32 found; +/** \brief Parses a server URL (such as srb2://127.0.0.1) as may be passed to the game via a web browser, etc. + + \return the contents of the URL after the protocol (a server to join), or NULL if not found +*/ +const char *M_GetUrlProtocolArg(void) +{ + INT32 i; + + for (i = 1; i < myargc; i++) + { + if (!strnicmp(myargv[i], "srb2://", 7)) + { + return &myargv[i][7]; + } + } + + return NULL; +} /** \brief The M_CheckParm function diff --git a/src/m_argv.h b/src/m_argv.h index ca97d9b12..92770f4e9 100644 --- a/src/m_argv.h +++ b/src/m_argv.h @@ -21,6 +21,9 @@ extern INT32 myargc; extern char **myargv; extern boolean myargmalloc; +// Looks for an srb2:// (or similar) URL passed in as an argument and returns the IP to connect to if found. +const char *M_GetUrlProtocolArg(void); + // Returns the position of the given parameter in the arg list (0 if not found). INT32 M_CheckParm(const char *check); From f32ab5918ec39181e238ebf5333499718f73e4b5 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Sat, 21 Mar 2020 07:47:29 -0500 Subject: [PATCH 06/15] Define SERVER_URL_PROTOCOL const for easy reconfiguration --- src/d_main.c | 2 +- src/doomdef.h | 3 +++ src/m_argv.c | 5 +++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index d954fa4d1..ec63242b8 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -895,7 +895,7 @@ static void IdentifyVersion(void) { size_t i; - CONS_Printf("srb2:// connect links load game files from the SRB2 application's stored directory. Switching to "); + CONS_Printf("%s connect links load game files from the SRB2 application's stored directory. Switching to ", SERVER_URL_PROTOCOL); strlcpy(srb2path, myargv[0], sizeof(srb2path)); // Get just the directory, minus the EXE name diff --git a/src/doomdef.h b/src/doomdef.h index 71c885019..5a5c933e3 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -150,6 +150,9 @@ extern char logfilename[1024]; // Otherwise we can't force updates! #endif +/* A custom URL protocol for server links. */ +#define SERVER_URL_PROTOCOL "srb2://" + // Does this version require an added patch file? // Comment or uncomment this as necessary. #define USE_PATCH_DTA diff --git a/src/m_argv.c b/src/m_argv.c index d7d1f4463..7d43d96bc 100644 --- a/src/m_argv.c +++ b/src/m_argv.c @@ -41,12 +41,13 @@ static INT32 found; const char *M_GetUrlProtocolArg(void) { INT32 i; + const size_t len = strlen(SERVER_URL_PROTOCOL); for (i = 1; i < myargc; i++) { - if (!strnicmp(myargv[i], "srb2://", 7)) + if (strlen(myargv[i]) > len && !strnicmp(myargv[i], SERVER_URL_PROTOCOL, len)) { - return &myargv[i][7]; + return &myargv[i][len]; } } From deff1565dc5945f56d9e45478e684dd868d27856 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Sun, 22 Mar 2020 12:13:59 -0500 Subject: [PATCH 07/15] GL horizon lines --- src/hardware/hw_main.c | 172 ++++++++++++++++++++++------------------- 1 file changed, 92 insertions(+), 80 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index efed9b602..a3a1ba692 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -20,6 +20,7 @@ #include "../doomstat.h" +#define HWRENDER #ifdef HWRENDER #include "hw_glob.h" #include "hw_light.h" @@ -469,7 +470,7 @@ static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color) // Let's see if this c // -----------------+ // HWR_RenderPlane : Render a floor or ceiling convex polygon // -----------------+ -static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, +static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, levelflat_t *levelflat, sector_t *FOFsector, UINT8 alpha, boolean fogplane, extracolormap_t *planecolormap) { polyvertex_t * pv; @@ -493,8 +494,6 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is static FOutVector *planeVerts = NULL; static UINT16 numAllocedPlaneVerts = 0; - (void)sector; ///@TODO remove shitty unused variable - // no convex poly were generated for this subsector if (!xsub->planepoly) return; @@ -593,8 +592,6 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is flatyref = (float)(((fixed_t)pv->y & (~flatflag)) / fflatheight); // transform - v3d = planeVerts; - if (FOFsector != NULL) { if (!isceiling) // it's a floor @@ -637,46 +634,43 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is flatyref = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle)))); } - for (i = 0; i < nrPlaneVerts; i++,v3d++,pv++) - { - // Hurdler: add scrolling texture on floor/ceiling - if (texflat) - { - v3d->sow = (float)(pv->x / fflatwidth) + scrollx; - v3d->tow = -(float)(pv->y / fflatheight) + scrolly; - } - else - { - v3d->sow = (float)((pv->x / fflatwidth) - flatxref + scrollx); - v3d->tow = (float)(flatyref - (pv->y / fflatheight) + scrolly); - } +#define SETUP3DVERT(vert, vx, vy) {\ + /* Hurdler: add scrolling texture on floor/ceiling */\ + if (texflat)\ + {\ + vert->sow = (float)((vx) / fflatwidth) + scrollx;\ + vert->tow = -(float)((vy) / fflatheight) + scrolly;\ + }\ + else\ + {\ + vert->sow = (float)(((vx) / fflatwidth) - flatxref + scrollx);\ + vert->tow = (float)(flatyref - ((vy) / fflatheight) + scrolly);\ + }\ +\ + /* Need to rotate before translate */\ + if (angle) /* Only needs to be done if there's an altered angle */\ + {\ + tempxsow = FLOAT_TO_FIXED(vert->sow);\ + tempytow = FLOAT_TO_FIXED(vert->tow);\ + if (texflat)\ + tempytow = -tempytow;\ + vert->sow = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINECOSINE(angle)) - FixedMul(tempytow, FINESINE(angle))));\ + vert->tow = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle))));\ + }\ +\ + vert->x = (vx);\ + vert->y = height;\ + vert->z = (vy);\ +\ + if (slope)\ + {\ + fixedheight = P_GetZAt(slope, FLOAT_TO_FIXED((vx)), FLOAT_TO_FIXED((vy)));\ + vert->y = FIXED_TO_FLOAT(fixedheight);\ + }\ +} - // Need to rotate before translate - if (angle) // Only needs to be done if there's an altered angle - { - tempxsow = FLOAT_TO_FIXED(v3d->sow); - tempytow = FLOAT_TO_FIXED(v3d->tow); - if (texflat) - tempytow = -tempytow; - v3d->sow = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINECOSINE(angle)) - FixedMul(tempytow, FINESINE(angle)))); - v3d->tow = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle)))); - } - - //v3d->sow = (float)(v3d->sow - flatxref + scrollx); - //v3d->tow = (float)(flatyref - v3d->tow + scrolly); - - v3d->x = pv->x; - v3d->y = height; - v3d->z = pv->y; - -#ifdef ESLOPE - if (slope) - { - fixedheight = P_GetZAt(slope, FLOAT_TO_FIXED(pv->x), FLOAT_TO_FIXED(pv->y)); - v3d->y = FIXED_TO_FLOAT(fixedheight); - } -#endif - } + for (i = 0, v3d = planeVerts; i < nrPlaneVerts; i++,v3d++,pv++) + SETUP3DVERT(v3d, pv->x, pv->y); // only useful for flat coloured triangles //Surf.FlatColor = 0xff804020; @@ -687,38 +681,6 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is Surf.FlatColor.s.red = Surf.FlatColor.s.green = Surf.FlatColor.s.blue = LightLevelToLum(lightlevel); // Don't take from the frontsector, or the game will crash -#if 0 // no colormap test - // colormap test - if (gr_frontsector) - { - sector_t *psector = gr_frontsector; - -#ifdef ESLOPE - if (slope) - fixedheight = P_GetZAt(slope, psector->soundorg.x, psector->soundorg.y); -#endif - - if (psector->ffloors) - { - ffloor_t *caster = psector->lightlist[R_GetPlaneLight(psector, fixedheight, false)].caster; - psector = caster ? §ors[caster->secnum] : psector; - - if (caster) - { - lightlevel = psector->lightlevel; - Surf.FlatColor.s.red = Surf.FlatColor.s.green = Surf.FlatColor.s.blue = LightLevelToLum(lightlevel); - } - } - if (psector->extra_colormap) - Surf.FlatColor.rgba = HWR_Lighting(lightlevel,psector->extra_colormap->rgba,psector->extra_colormap->fadergba, false, true); - else - Surf.FlatColor.rgba = HWR_Lighting(lightlevel,NORMALFOG,FADEFOG, false, true); - } - else - Surf.FlatColor.rgba = HWR_Lighting(lightlevel,NORMALFOG,FADEFOG, false, true); - -#endif // NOPE - if (planecolormap) { if (fogplane) @@ -744,6 +706,56 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is HWD.pfnDrawPolygon(&Surf, planeVerts, nrPlaneVerts, PolyFlags); + if (subsector) + { + // Horizon lines + FOutVector horizonpts[5]; + float dist, vx, vy; + const float renderdist = 60000.0f; // Well past the Z cutoff plane, but needed to fill out to that point at a wider angle + + seg_t *line = &segs[subsector->firstline]; + + for (i = 0; i < subsector->numlines; i++, line++) + { + if (!line->glseg && line->linedef->special == HORIZONSPECIAL && R_PointOnSegSide(dup_viewx, dup_viewy, line) == 0) + { + //SETUP3DVERT(horizonpts[1], FIXED_TO_FLOAT(line->v1->x), FIXED_TO_FLOAT(line->v1->y)); + //SETUP3DVERT(horizonpts[2], FIXED_TO_FLOAT(line->v2->x), FIXED_TO_FLOAT(line->v2->y)); + + // Left side + vx = ((polyvertex_t *)line->pv1)->x; + vy = ((polyvertex_t *)line->pv1)->y; + SETUP3DVERT((&horizonpts[1]), vx, vy); + + dist = sqrtf(powf(vx - gr_viewx, 2) + powf(vy - gr_viewy, 2)); + vx = (vx - gr_viewx) * renderdist / dist + gr_viewx; + vy = (vy - gr_viewy) * renderdist / dist + gr_viewy; + SETUP3DVERT((&horizonpts[0]), vx, vy); + + // Right side + vx = ((polyvertex_t *)line->pv2)->x; + vy = ((polyvertex_t *)line->pv2)->y; + SETUP3DVERT((&horizonpts[2]), vx, vy); + + dist = sqrtf(powf(vx - gr_viewx, 2) + powf(vy - gr_viewy, 2)); + vx = (vx - gr_viewx) * renderdist / dist + gr_viewx; + vy = (vy - gr_viewy) * renderdist / dist + gr_viewy; + SETUP3DVERT((&horizonpts[3]), vx, vy); + + // Midpoint for better filling + vx = (horizonpts[0].x + horizonpts[3].x)/2; + vy = (horizonpts[0].z + horizonpts[3].z)/2; + dist = sqrtf(powf(vx - gr_viewx, 2) + powf(vy - gr_viewy, 2)); + vx = (vx - gr_viewx) * renderdist / dist + gr_viewx; + vy = (vy - gr_viewy) * renderdist / dist + gr_viewy; + SETUP3DVERT((&horizonpts[4]), vx, vy); + + // Draw + HWD.pfnDrawPolygon(&Surf, horizonpts, 5, PolyFlags); + } + } + } + #ifdef ALAM_LIGHTING // add here code for dynamic lighting on planes HWR_PlaneLighting(planeVerts, nrPlaneVerts); @@ -3561,7 +3573,7 @@ static void HWR_Subsector(size_t num) if (sub->validcount != validcount) { HWR_GetLevelFlat(&levelflats[gr_frontsector->floorpic]); - HWR_RenderPlane(gr_frontsector, &extrasubsectors[num], false, + HWR_RenderPlane(sub, &extrasubsectors[num], false, // Hack to make things continue to work around slopes. locFloorHeight == cullFloorHeight ? locFloorHeight : gr_frontsector->floorheight, // We now return you to your regularly scheduled rendering. @@ -3583,7 +3595,7 @@ static void HWR_Subsector(size_t num) if (sub->validcount != validcount) { HWR_GetLevelFlat(&levelflats[gr_frontsector->ceilingpic]); - HWR_RenderPlane(NULL, &extrasubsectors[num], true, + HWR_RenderPlane(sub, &extrasubsectors[num], true, // Hack to make things continue to work around slopes. locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gr_frontsector->ceilingheight, // We now return you to your regularly scheduled rendering. @@ -3677,7 +3689,7 @@ static void HWR_Subsector(size_t num) { HWR_GetLevelFlat(&levelflats[*rover->bottompic]); light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); - HWR_RenderPlane(NULL, &extrasubsectors[num], false, *rover->bottomheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, &levelflats[*rover->bottompic], + HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, &levelflats[*rover->bottompic], rover->master->frontsector, 255, false, *gr_frontsector->lightlist[light].extra_colormap); } } @@ -3741,7 +3753,7 @@ static void HWR_Subsector(size_t num) { HWR_GetLevelFlat(&levelflats[*rover->toppic]); light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); - HWR_RenderPlane(NULL, &extrasubsectors[num], true, *rover->topheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, &levelflats[*rover->toppic], + HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, &levelflats[*rover->toppic], rover->master->frontsector, 255, false, *gr_frontsector->lightlist[light].extra_colormap); } } From 14d6a012928443ba8699f1a2834800193bb70c1f Mon Sep 17 00:00:00 2001 From: fickleheart Date: Sun, 22 Mar 2020 12:20:26 -0500 Subject: [PATCH 08/15] Distort far edges to viewz for a flat horizon line --- src/hardware/hw_main.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index a3a1ba692..253deb282 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -709,9 +709,10 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool if (subsector) { // Horizon lines - FOutVector horizonpts[5]; + FOutVector horizonpts[6]; float dist, vx, vy; - const float renderdist = 60000.0f; // Well past the Z cutoff plane, but needed to fill out to that point at a wider angle + const float renderdist = 30000.0f; // How far out to properly render the plane + const float farrenderdist = 32768.0f; // From here, raise plane to horizon level to fill in the line with some texture distortion seg_t *line = &segs[subsector->firstline]; @@ -742,16 +743,19 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool vy = (vy - gr_viewy) * renderdist / dist + gr_viewy; SETUP3DVERT((&horizonpts[3]), vx, vy); - // Midpoint for better filling - vx = (horizonpts[0].x + horizonpts[3].x)/2; - vy = (horizonpts[0].z + horizonpts[3].z)/2; - dist = sqrtf(powf(vx - gr_viewx, 2) + powf(vy - gr_viewy, 2)); - vx = (vx - gr_viewx) * renderdist / dist + gr_viewx; - vy = (vy - gr_viewy) * renderdist / dist + gr_viewy; + // Horizon fills + vx = (horizonpts[0].x - gr_viewx) * farrenderdist / renderdist + gr_viewx; + vy = (horizonpts[0].z - gr_viewy) * farrenderdist / renderdist + gr_viewy; + SETUP3DVERT((&horizonpts[5]), vx, vy); + horizonpts[5].y = gr_viewz; + + vx = (horizonpts[3].x - gr_viewx) * farrenderdist / renderdist + gr_viewx; + vy = (horizonpts[3].z - gr_viewy) * farrenderdist / renderdist + gr_viewy; SETUP3DVERT((&horizonpts[4]), vx, vy); + horizonpts[4].y = gr_viewz; // Draw - HWD.pfnDrawPolygon(&Surf, horizonpts, 5, PolyFlags); + HWD.pfnDrawPolygon(&Surf, horizonpts, 6, PolyFlags); } } } From f9027ccaebcabed8b7b3de12b1c0efa0d098e22d Mon Sep 17 00:00:00 2001 From: fickleheart Date: Sun, 22 Mar 2020 12:52:17 -0500 Subject: [PATCH 09/15] Split horizon lines for minimal distortion --- src/hardware/hw_main.c | 78 ++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 253deb282..9a0805d57 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -20,7 +20,6 @@ #include "../doomstat.h" -#define HWRENDER #ifdef HWRENDER #include "hw_glob.h" #include "hw_light.h" @@ -711,6 +710,10 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool // Horizon lines FOutVector horizonpts[6]; float dist, vx, vy; + float x1, y1, xd, yd; + UINT8 numplanes, j; + vertex_t v; // For determining the closest distance from the line to the camera, to split render planes for minimum distortion; + const float renderdist = 30000.0f; // How far out to properly render the plane const float farrenderdist = 32768.0f; // From here, raise plane to horizon level to fill in the line with some texture distortion @@ -720,42 +723,57 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool { if (!line->glseg && line->linedef->special == HORIZONSPECIAL && R_PointOnSegSide(dup_viewx, dup_viewy, line) == 0) { - //SETUP3DVERT(horizonpts[1], FIXED_TO_FLOAT(line->v1->x), FIXED_TO_FLOAT(line->v1->y)); - //SETUP3DVERT(horizonpts[2], FIXED_TO_FLOAT(line->v2->x), FIXED_TO_FLOAT(line->v2->y)); + P_ClosestPointOnLine(viewx, viewy, line->linedef, &v); + dist = FIXED_TO_FLOAT(R_PointToDist(v.x, v.y)); - // Left side - vx = ((polyvertex_t *)line->pv1)->x; - vy = ((polyvertex_t *)line->pv1)->y; - SETUP3DVERT((&horizonpts[1]), vx, vy); + x1 = ((polyvertex_t *)line->pv1)->x; + y1 = ((polyvertex_t *)line->pv1)->y; + xd = ((polyvertex_t *)line->pv2)->x - x1; + yd = ((polyvertex_t *)line->pv2)->y - y1; - dist = sqrtf(powf(vx - gr_viewx, 2) + powf(vy - gr_viewy, 2)); - vx = (vx - gr_viewx) * renderdist / dist + gr_viewx; - vy = (vy - gr_viewy) * renderdist / dist + gr_viewy; - SETUP3DVERT((&horizonpts[0]), vx, vy); + // Based on the seg length and the distance from the line, split horizon into multiple poly sets to reduce distortion + dist = sqrtf((xd*xd) + (yd*yd)) / dist / 16.0f; + if (dist > 100.0f) + numplanes = 100; + else + numplanes = (UINT8)dist + 1; - // Right side - vx = ((polyvertex_t *)line->pv2)->x; - vy = ((polyvertex_t *)line->pv2)->y; - SETUP3DVERT((&horizonpts[2]), vx, vy); + for (j = 0; j < numplanes; j++) + { + // Left side + vx = x1 + xd * j / numplanes; + vy = y1 + yd * j / numplanes; + SETUP3DVERT((&horizonpts[1]), vx, vy); - dist = sqrtf(powf(vx - gr_viewx, 2) + powf(vy - gr_viewy, 2)); - vx = (vx - gr_viewx) * renderdist / dist + gr_viewx; - vy = (vy - gr_viewy) * renderdist / dist + gr_viewy; - SETUP3DVERT((&horizonpts[3]), vx, vy); + dist = sqrtf(powf(vx - gr_viewx, 2) + powf(vy - gr_viewy, 2)); + vx = (vx - gr_viewx) * renderdist / dist + gr_viewx; + vy = (vy - gr_viewy) * renderdist / dist + gr_viewy; + SETUP3DVERT((&horizonpts[0]), vx, vy); - // Horizon fills - vx = (horizonpts[0].x - gr_viewx) * farrenderdist / renderdist + gr_viewx; - vy = (horizonpts[0].z - gr_viewy) * farrenderdist / renderdist + gr_viewy; - SETUP3DVERT((&horizonpts[5]), vx, vy); - horizonpts[5].y = gr_viewz; + // Right side + vx = x1 + xd * (j+1) / numplanes; + vy = y1 + yd * (j+1) / numplanes; + SETUP3DVERT((&horizonpts[2]), vx, vy); - vx = (horizonpts[3].x - gr_viewx) * farrenderdist / renderdist + gr_viewx; - vy = (horizonpts[3].z - gr_viewy) * farrenderdist / renderdist + gr_viewy; - SETUP3DVERT((&horizonpts[4]), vx, vy); - horizonpts[4].y = gr_viewz; + dist = sqrtf(powf(vx - gr_viewx, 2) + powf(vy - gr_viewy, 2)); + vx = (vx - gr_viewx) * renderdist / dist + gr_viewx; + vy = (vy - gr_viewy) * renderdist / dist + gr_viewy; + SETUP3DVERT((&horizonpts[3]), vx, vy); - // Draw - HWD.pfnDrawPolygon(&Surf, horizonpts, 6, PolyFlags); + // Horizon fills + vx = (horizonpts[0].x - gr_viewx) * farrenderdist / renderdist + gr_viewx; + vy = (horizonpts[0].z - gr_viewy) * farrenderdist / renderdist + gr_viewy; + SETUP3DVERT((&horizonpts[5]), vx, vy); + horizonpts[5].y = gr_viewz; + + vx = (horizonpts[3].x - gr_viewx) * farrenderdist / renderdist + gr_viewx; + vy = (horizonpts[3].z - gr_viewy) * farrenderdist / renderdist + gr_viewy; + SETUP3DVERT((&horizonpts[4]), vx, vy); + horizonpts[4].y = gr_viewz; + + // Draw + HWD.pfnDrawPolygon(&Surf, horizonpts, 6, PolyFlags); + } } } } From 719f29d27e828c14eb4454ddbceaa056a66c3217 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Mon, 23 Mar 2020 08:23:36 -0500 Subject: [PATCH 10/15] Reduce near renderdist to lessen visible texture distortion --- src/hardware/hw_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 9a0805d57..62464c951 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -714,7 +714,7 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool UINT8 numplanes, j; vertex_t v; // For determining the closest distance from the line to the camera, to split render planes for minimum distortion; - const float renderdist = 30000.0f; // How far out to properly render the plane + const float renderdist = 27000.0f; // How far out to properly render the plane const float farrenderdist = 32768.0f; // From here, raise plane to horizon level to fill in the line with some texture distortion seg_t *line = &segs[subsector->firstline]; From da86c17ee112b833c6fe29192105e192be548656 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 26 Mar 2020 20:16:44 +0000 Subject: [PATCH 11/15] Disable continues outside of no-save/Ultimate by default, but allow SOC to re-enable them globally. Please look at the merge request description for a full explanation, since I know the vanilla team has been hashing this out and I don't want to add fuel to the fire without at least presenting a solid case. --- src/dehacked.c | 4 +++ src/doomstat.h | 2 ++ src/f_finale.c | 6 ++-- src/g_game.c | 4 ++- src/m_cheat.c | 6 ++++ src/m_menu.c | 84 +++++++++++++++++++++++++++++++++++++------------- src/m_menu.h | 2 +- src/p_inter.c | 5 ++- src/p_user.c | 6 ++-- src/y_inter.c | 2 +- 10 files changed, 90 insertions(+), 31 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 20d23d680..6d6fdf838 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -4122,6 +4122,10 @@ static void readmaincfg(MYFILE *f) { maxXtraLife = (UINT8)get_number(word2); } + else if (fastcmp(word, "USECONTINUES")) + { + useContinues = (UINT8)(value || word2[0] == 'T' || word2[0] == 'Y'); + } else if (fastcmp(word, "GAMEDATA")) { diff --git a/src/doomstat.h b/src/doomstat.h index 893514b32..aedb120ff 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -575,6 +575,8 @@ extern UINT8 creditscutscene; extern UINT8 use1upSound; extern UINT8 maxXtraLife; // Max extra lives from rings +extern UINT8 useContinues; +#define continuesInSession (!multiplayer && (useContinues || ultimatemode || !(cursaveslot > 0))) extern mobj_t *hunt1, *hunt2, *hunt3; // Emerald hunt locations diff --git a/src/f_finale.c b/src/f_finale.c index 95535a7ea..825f646b0 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -3618,7 +3618,7 @@ void F_StartContinue(void) { I_Assert(!netgame && !multiplayer); - if (players[consoleplayer].continues <= 0) + if (continuesInSession && players[consoleplayer].continues <= 0) { Command_ExitGame_f(); return; @@ -3725,7 +3725,9 @@ void F_ContinueDrawer(void) } // Draw the continue markers! Show continues. - if (ncontinues > 10) + if (!continuesInSession) + ; + else if (ncontinues > 10) { if (!(continuetime & 1) || continuetime > 17) V_DrawContinueIcon(x, 68, 0, players[consoleplayer].skin, players[consoleplayer].skincolor); diff --git a/src/g_game.c b/src/g_game.c index 6dba6045a..92d71fbae 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -219,6 +219,7 @@ UINT8 ammoremovaltics = 2*TICRATE; UINT8 use1upSound = 0; UINT8 maxXtraLife = 2; // Max extra lives from rings +UINT8 useContinues = 0; // Set to 1 to enable continues outside of no-save scenarioes UINT8 introtoplay; UINT8 creditscutscene; @@ -3859,7 +3860,8 @@ static void G_DoContinued(void) I_Assert(!netgame && !multiplayer); I_Assert(pl->continues > 0); - pl->continues--; + if (pl->continues) + pl->continues--; // Reset score pl->score = 0; diff --git a/src/m_cheat.c b/src/m_cheat.c index 4a1a4fb58..f6fdb63e9 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -934,6 +934,12 @@ void Command_Setcontinues_f(void) REQUIRE_NOULTIMATE; REQUIRE_PANDORA; + if (!continuesInSession) + { + CONS_Printf(M_GetText("This session does not use continues.\n")); + return; + } + if (COM_Argc() > 1) { INT32 numcontinues = atoi(COM_Argv(1)); diff --git a/src/m_menu.c b/src/m_menu.c index f8240d403..a08b40909 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -6724,6 +6724,7 @@ static void M_PandorasBox(INT32 choice) else CV_StealthSetValue(&cv_dummylives, max(players[consoleplayer].lives, 1)); CV_StealthSetValue(&cv_dummycontinues, players[consoleplayer].continues); + SR_PandorasBox[3].status = (continuesInSession) ? (IT_STRING | IT_CVAR) : (IT_GRAYEDOUT); SR_PandorasBox[6].status = (players[consoleplayer].charflags & SF_SUPER) ? (IT_GRAYEDOUT) : (IT_STRING | IT_CALL); SR_PandorasBox[7].status = (emeralds == ((EMERALD7)*2)-1) ? (IT_GRAYEDOUT) : (IT_STRING | IT_CALL); M_SetupNextMenu(&SR_PandoraDef); @@ -6740,7 +6741,7 @@ static boolean M_ExitPandorasBox(void) } if (cv_dummylives.value != players[consoleplayer].lives) COM_ImmedExecute(va("setlives %d", cv_dummylives.value)); - if (cv_dummycontinues.value != players[consoleplayer].continues) + if (continuesInSession && cv_dummycontinues.value != players[consoleplayer].continues) COM_ImmedExecute(va("setcontinues %d", cv_dummycontinues.value)); return true; } @@ -8251,9 +8252,19 @@ static void M_DrawLoadGameData(void) V_DrawRightAlignedThinString(x + 79, y, V_YELLOWMAP, savegameinfo[savetodraw].levelname); } - if ((savegameinfo[savetodraw].lives == -42) - || (savegameinfo[savetodraw].lives == -666)) + if (savegameinfo[savetodraw].lives == -42) + { + if (!useContinues) + V_DrawRightAlignedThinString(x + 80, y+1+60+16, V_GRAYMAP, "00000000"); continue; + } + + if (savegameinfo[savetodraw].lives == -666) + { + if (!useContinues) + V_DrawRightAlignedThinString(x + 80, y+1+60+16, V_REDMAP, "????????"); + continue; + } y += 64; @@ -8270,7 +8281,7 @@ static void M_DrawLoadGameData(void) y -= 4; - // character heads, lives, and continues + // character heads, lives, and continues/score { spritedef_t *sprdef; spriteframe_t *sprframe; @@ -8321,10 +8332,14 @@ skipbot: skipsign: y += 16; - tempx = x + 10; - if (savegameinfo[savetodraw].lives != INFLIVES - && savegameinfo[savetodraw].lives > 9) - tempx -= 4; + tempx = x; + if (useContinues) + { + tempx += 10; + if (savegameinfo[savetodraw].lives != INFLIVES + && savegameinfo[savetodraw].lives > 9) + tempx -= 4; + } if (!charskin) // shut up compiler goto skiplife; @@ -8354,22 +8369,45 @@ skiplife: else V_DrawString(tempx, y, 0, va("%d", savegameinfo[savetodraw].lives)); - tempx = x + 47; - if (savegameinfo[savetodraw].continues > 9) - tempx -= 4; - - // continues - if (savegameinfo[savetodraw].continues > 0) + if (!useContinues) { - V_DrawSmallScaledPatch(tempx, y, 0, W_CachePatchName("CONTSAVE", PU_PATCH)); - V_DrawScaledPatch(tempx + 9, y + 2, 0, patch); - V_DrawString(tempx + 16, y, 0, va("%d", savegameinfo[savetodraw].continues)); + INT32 workingscorenum = savegameinfo[savetodraw].continuescore; + char workingscorestr[11] = " 000000000\0"; + SINT8 j = 9; + // Change the above two lines if MAXSCORE ever changes from 8 digits long. + workingscorestr[0] = '\x86'; // done here instead of in initialiser 'cuz compiler complains + if (!workingscorenum) + j--; // just so ONE digit is not greyed out + else + { + while (workingscorenum) + { + workingscorestr[j--] = '0' + (workingscorenum % 10); + workingscorenum /= 10; + } + } + workingscorestr[j] = (savegameinfo[savetodraw].continuescore == MAXSCORE) ? '\x83' : '\x80'; + V_DrawRightAlignedThinString(x + 80, y+1, 0, workingscorestr); } else { - V_DrawSmallScaledPatch(tempx, y, 0, W_CachePatchName("CONTNONE", PU_PATCH)); - V_DrawScaledPatch(tempx + 9, y + 2, 0, W_CachePatchName("STNONEX", PU_PATCH)); - V_DrawString(tempx + 16, y, V_GRAYMAP, "0"); + tempx = x + 47; + if (savegameinfo[savetodraw].continuescore > 9) + tempx -= 4; + + // continues + if (savegameinfo[savetodraw].continuescore > 0) + { + V_DrawSmallScaledPatch(tempx, y, 0, W_CachePatchName("CONTSAVE", PU_PATCH)); + V_DrawScaledPatch(tempx + 9, y + 2, 0, patch); + V_DrawString(tempx + 16, y, 0, va("%d", savegameinfo[savetodraw].continuescore)); + } + else + { + V_DrawSmallScaledPatch(tempx, y, 0, W_CachePatchName("CONTNONE", PU_PATCH)); + V_DrawScaledPatch(tempx + 9, y + 2, 0, W_CachePatchName("STNONEX", PU_PATCH)); + V_DrawString(tempx + 16, y, V_GRAYMAP, "0"); + } } } } @@ -8502,9 +8540,11 @@ static void M_ReadSavegameInfo(UINT32 slot) CHECKPOS savegameinfo[slot].lives = READSINT8(save_p); // lives CHECKPOS - (void)READINT32(save_p); // Score + savegameinfo[slot].continuescore = READINT32(save_p); // score CHECKPOS - savegameinfo[slot].continues = READINT32(save_p); // continues + fake = READINT32(save_p); // continues + if (useContinues) + savegameinfo[slot].continuescore = fake; // File end marker check CHECKPOS diff --git a/src/m_menu.h b/src/m_menu.h index e7270380d..eeda9cc58 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -397,7 +397,7 @@ typedef struct UINT8 numemeralds; UINT8 numgameovers; INT32 lives; - INT32 continues; + INT32 continuescore; INT32 gamemap; } saveinfo_t; diff --git a/src/p_inter.c b/src/p_inter.c index 67d197375..b568fb359 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -633,7 +633,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (ALL7EMERALDS(emeralds)) // Got all 7 { - if (!(netgame || multiplayer)) + if (continuesInSession) { player->continues += 1; player->gotcontinue = true; @@ -643,7 +643,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) S_StartSound(toucher, sfx_chchng); } else + { + P_GiveCoopLives(player, 1, true); // if continues are disabled, a life is a reasonable substitute S_StartSound(toucher, sfx_chchng); + } } else { diff --git a/src/p_user.c b/src/p_user.c index 612e31cbc..5ceaa45fb 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1388,7 +1388,7 @@ void P_AddPlayerScore(player_t *player, UINT32 amount) // Continues are worthless in netgames. // If that stops being the case uncomment this. -/* if (!ultimatemode && players[i].marescore > 50000 +/* if (!ultimatemode && continuesInSession && players[i].marescore > 50000 && oldscore < 50000) { players[i].continues += 1; @@ -1408,7 +1408,7 @@ void P_AddPlayerScore(player_t *player, UINT32 amount) else player->marescore = MAXSCORE; - if (!ultimatemode && !(netgame || multiplayer) && G_IsSpecialStage(gamemap) + if (!ultimatemode && continuesInSession && G_IsSpecialStage(gamemap) && player->marescore >= 50000 && oldscore < 50000) { player->continues += 1; @@ -9539,7 +9539,7 @@ static void P_DeathThink(player_t *player) // continue logic if (!(netgame || multiplayer) && player->lives <= 0) { - if (player->deadtimer > (3*TICRATE) && (cmd->buttons & BT_USE || cmd->buttons & BT_JUMP) && player->continues > 0) + if (player->deadtimer > (3*TICRATE) && (cmd->buttons & BT_USE || cmd->buttons & BT_JUMP) && (!continuesInSession || player->continues > 0)) G_UseContinue(); else if (player->deadtimer >= gameovertics) G_UseContinue(); // Even if we don't have one this handles ending the game diff --git a/src/y_inter.c b/src/y_inter.c index 94a289817..f1764a816 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -564,7 +564,7 @@ dontdrawbg: V_DrawTallNum(BASEVIDWIDTH + xoffset4 - 68, 125+yoffset, 0, data.spec.score); // Draw continues! - if (!multiplayer /* && (data.spec.continues & 0x80) */) // Always draw outside of netplay + if (continuesInSession /* && (data.spec.continues & 0x80) */) // Always draw when continues are a thing { UINT8 continues = data.spec.continues & 0x7F; From 6845aca6e5cf2292b5586dbf01ea0be80c9225af Mon Sep 17 00:00:00 2001 From: fickleheart Date: Thu, 9 Apr 2020 20:52:23 -0500 Subject: [PATCH 12/15] Make chdir usage consistent with other source usage --- src/d_main.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/d_main.c b/src/d_main.c index 8519e6281..80f075cb1 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -909,7 +909,13 @@ static void IdentifyVersion(void) } CONS_Printf("%s\n", srb2path); - chdir(srb2path); + +#if defined (_WIN32) + SetCurrentDirectoryA(srb2path); +#else + if (chdir(srb2path) == -1) + I_OutputMsg("Couldn't change working directory\n"); +#endif } #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) From be07a23e5265aceea62f18acce09c1e7cdda31af Mon Sep 17 00:00:00 2001 From: fickleheart Date: Thu, 9 Apr 2020 20:56:27 -0500 Subject: [PATCH 13/15] Make a separate function instead of clogging up IdentifyVersion --- src/d_main.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 80f075cb1..a0672bb4e 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -880,15 +880,10 @@ static inline void D_CleanFile(void) } } -// ========================================================================== -// Identify the SRB2 version, and IWAD file to use. -// ========================================================================== - -static void IdentifyVersion(void) +///\brief Checks if a netgame URL is being handled, and changes working directory to the EXE's if so. +/// Done because browsers (at least, Firefox on Windows) launch the game from the browser's directory, which causes problems. +static void ChangeDirForUrlHandler(void) { - char *srb2wad; - const char *srb2waddir = NULL; - // URL handlers are opened by web browsers (at least Firefox) from the browser's working directory, not the game's stored directory, // so chdir to that directory unless overridden. if (M_GetUrlProtocolArg() != NULL && !M_CheckParm("-nochdir")) @@ -917,6 +912,16 @@ static void IdentifyVersion(void) I_OutputMsg("Couldn't change working directory\n"); #endif } +} + +// ========================================================================== +// Identify the SRB2 version, and IWAD file to use. +// ========================================================================== + +static void IdentifyVersion(void) +{ + char *srb2wad; + const char *srb2waddir = NULL; #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) // change to the directory where 'srb2.pk3' is found @@ -1097,6 +1102,9 @@ void D_SRB2Main(void) // Test Dehacked lists DEH_Check(); + // Netgame URL special case: change working dir to EXE folder. + ChangeDirForUrlHandler(); + // identify the main IWAD file to use IdentifyVersion(); From 4214397679c70a7910c82126783b434f0d10343e Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 12 Apr 2020 17:05:18 -0700 Subject: [PATCH 14/15] Make the PACKETVERSION rule easier --- src/d_clisrv.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 10a1d714d..2ddebadba 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -20,12 +20,9 @@ #include "d_player.h" /* -The 'packet version' may be used with packets whose -format is expected to change between versions. - -This version is independent of the mod name, and standard -version and subversion. It should only account for the -basic fields of the packet, and change infrequently. +The 'packet version' is used to distinguish packet formats. +This version is independent of VERSION and SUBVERSION. Different +applications may follow different packet versions. */ #define PACKETVERSION 2 From 01b28b66a6d47c604457561e01dd33ac7693ec84 Mon Sep 17 00:00:00 2001 From: sphere Date: Mon, 13 Apr 2020 17:10:25 +0200 Subject: [PATCH 15/15] Make linedef type 461 able to set object angle, using the line's angle. --- extras/conf/SRB2-22.cfg | 3 ++- src/p_spec.c | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index ec030b32f..a59771b2d 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -15,7 +15,7 @@ * Oogaland * Rob * Shadow Hog - * Spherallic + * sphere * SRB2-Playah * SSNTails * SteelT @@ -2214,6 +2214,7 @@ linedeftypes title = "Spawn Object"; prefix = "(461)"; flags8text = "[3] Set delay by backside sector"; + flags32text = "[5] Use line angle for object"; flags64text = "[6] Spawn inside a range"; } diff --git a/src/p_spec.c b/src/p_spec.c index 50b767535..13280f3fe 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4027,7 +4027,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) mobj = P_SpawnMobj(x, y, z, type); if (mobj) + { + if (line->flags & ML_EFFECT1) + mobj->angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); CONS_Debug(DBG_GAMELOGIC, "Linedef Type %d - Spawn Object: %d spawned at (%d, %d, %d)\n", line->special, mobj->type, mobj->x>>FRACBITS, mobj->y>>FRACBITS, mobj->z>>FRACBITS); //TODO: Convert mobj->type to a string somehow. + } else CONS_Alert(CONS_ERROR,"Linedef Type %d - Spawn Object: Object did not spawn!\n", line->special); }