From b564a169d80a0ff6db33de6e03f505803d8f05cf Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Wed, 17 Jun 2015 21:00:10 +0100 Subject: [PATCH 001/467] Starting work for getting sector.lines in Lua: it WORKS at the least, but I have no way to determine the size of the array itself as of yet --- src/lua_libs.h | 1 + src/lua_maplib.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/lua_libs.h b/src/lua_libs.h index d19ad8857..25552eacb 100644 --- a/src/lua_libs.h +++ b/src/lua_libs.h @@ -42,6 +42,7 @@ extern lua_State *gL; #define META_CVAR "CONSVAR_T*" +#define META_SECTORLINES "SECTOR_T*LINES" #define META_SIDENUM "LINE_T*SIDENUM" #define META_HUDINFO "HUDINFO_T*" diff --git a/src/lua_maplib.c b/src/lua_maplib.c index e5cc30c12..40acc6dff 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -37,6 +37,7 @@ enum sector_e { sector_thinglist, sector_heightsec, sector_camsec, + sector_lines, sector_ffloors }; @@ -52,6 +53,7 @@ static const char *const sector_opt[] = { "thinglist", "heightsec", "camsec", + "lines", "ffloors", NULL}; @@ -260,6 +262,49 @@ static int sector_iterate(lua_State *L) return 3; } +// sector.lines, i -> sector.lines[i] +// sector.lines.valid, for validity checking +static int sectorlines_get(lua_State *L) +{ + line_t **seclines = *((line_t ***)luaL_checkudata(L, 1, META_SECTORLINES)); + size_t i; + //size_t numoflines; + lua_settop(L, 2); + if (!lua_isnumber(L, 2)) + { + int field = luaL_checkoption(L, 2, NULL, valid_opt); + if (!seclines) + { + if (field == 0) { + lua_pushboolean(L, 0); + return 1; + } + return luaL_error(L, "accessed sector_t doesn't exist anymore."); + } else if (field == 0) { + lua_pushboolean(L, 1); + return 1; + } + } + + /* \TODO: figure out how to find size of seclines array, rather than the size of a pointer! + Testing for sectors[0].lines in GFZ1 with a test Lua script: + sizeof(seclines) returns 4 + sizeof(*seclines) returns 4 + sizeof(**seclines) returns 84, presumably the size of line_t + You can probably see why I haven't been successful yet, hopefully + //CONS_Printf("sizeof(seclines): %d\n", sizeof(seclines)); + //CONS_Printf("sizeof(seclines[0]): %d\n", sizeof(seclines[0]));*/ + + /*numoflines = sizeof(seclines) / sizeof(seclines[0]); + if (!numoflines) + return luaL_error(L, "no lines found!");*/ + i = (size_t)lua_tointeger(L, 2); + /*if (i > numoflines) + return 0;*/ + LUA_PushUserdata(L, seclines[i], META_LINE); + return 1; +} + static int sector_get(lua_State *L) { sector_t *sector = *((sector_t **)luaL_checkudata(L, 1, META_SECTOR)); @@ -325,6 +370,9 @@ static int sector_get(lua_State *L) return 0; LUA_PushUserdata(L, §ors[sector->camsec], META_SECTOR); return 1; + case sector_lines: // lines + LUA_PushUserdata(L, sector->lines, META_SECTORLINES); + return 1; case sector_ffloors: // ffloors lua_pushcfunction(L, lib_iterateSectorFFloors); LUA_PushUserdata(L, sector->ffloors, META_FFLOOR); @@ -1178,6 +1226,11 @@ static int mapheaderinfo_get(lua_State *L) int LUA_MapLib(lua_State *L) { + luaL_newmetatable(L, META_SECTORLINES); + lua_pushcfunction(L, sectorlines_get); + lua_setfield(L, -2, "__index"); + lua_pop(L, 1); + luaL_newmetatable(L, META_SECTOR); lua_pushcfunction(L, sector_get); lua_setfield(L, -2, "__index"); From cc3d3a67e6d3bcf21d3c13f196786837a875c0ed Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sun, 26 Jul 2015 20:14:47 +0100 Subject: [PATCH 002/467] Colour Changing MD2s I don't know how I can move my old branch over so I've just created a new one. --- src/hardware/hw_md2.c | 314 +++++++++++++++++++++++++++++++++++++++++- src/hardware/hw_md2.h | 1 + 2 files changed, 312 insertions(+), 3 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 02f505351..8953b3a88 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -41,6 +41,7 @@ #include "../r_things.h" #include "hw_main.h" +#include "../v_video.h" #ifdef HAVE_PNG #ifndef _MSC_VER @@ -881,6 +882,59 @@ static void md2_loadTexture(md2_t *model) HWR_UnlockCachedPatch(grpatch); } +// -----------------+ +// md2_loadBlendTexture : Download a pcx or png texture for blending MD2 models +// -----------------+ +static void md2_loadBlendTexture(md2_t *model) +{ + GLPatch_t *grpatch; + char *filename = Z_Malloc(strlen(model->filename)+7, PU_STATIC, NULL); + strcpy(filename, model->filename); + + FIL_ForceExtension(filename, "_blend.png"); + + if (model->blendgrpatch) + { + grpatch = model->blendgrpatch; + Z_Free(grpatch->mipmap.grInfo.data); + } + else + grpatch = Z_Calloc(sizeof *grpatch, PU_HWRPATCHINFO, + &(model->blendgrpatch)); + + if (!grpatch->mipmap.downloaded && !grpatch->mipmap.grInfo.data) + { + int w = 0, h = 0; +#ifdef HAVE_PNG + grpatch->mipmap.grInfo.format = PNG_Load(filename, &w, &h, grpatch); + if (grpatch->mipmap.grInfo.format == 0) +#endif + grpatch->mipmap.grInfo.format = PCX_Load(filename, &w, &h, grpatch); + if (grpatch->mipmap.grInfo.format == 0) + { + Z_Free(filename); + return; + } + + grpatch->mipmap.downloaded = 0; + grpatch->mipmap.flags = 0; + + grpatch->width = (INT16)w; + grpatch->height = (INT16)h; + grpatch->mipmap.width = (UINT16)w; + grpatch->mipmap.height = (UINT16)h; + + // not correct! + grpatch->mipmap.grInfo.smallLodLog2 = GR_LOD_LOG2_256; + grpatch->mipmap.grInfo.largeLodLog2 = GR_LOD_LOG2_256; + grpatch->mipmap.grInfo.aspectRatioLog2 = GR_ASPECT_LOG2_1x1; + } + HWD.pfnSetTexture(&grpatch->mipmap); // We do need to do this so that it can be cleared and knows to recreate it when necessary + HWR_UnlockCachedPatch(grpatch); + + Z_Free(filename); +} + // Don't spam the console, or the OS with fopen requests! static boolean nomd2s = false; @@ -1058,6 +1112,248 @@ void HWR_AddSpriteMD2(size_t spritenum) // For MD2s that were added after startu fclose(f); } +static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, skincolors_t color) +{ + UINT16 w = gpatch->width, h = gpatch->height; + UINT32 size = w*h; + RGBA_t *image, *blendimage, *cur, blendcolor; + + if (grmip->width == 0) + { + + grmip->width = gpatch->width; + grmip->height = gpatch->height; + + // no wrap around, no chroma key + grmip->flags = 0; + // setup the texture info + grmip->grInfo.format = GR_RGBA; + } + + Z_Free(grmip->grInfo.data); + grmip->grInfo.data = NULL; + + cur = Z_Malloc(size*4, PU_HWRCACHE, &grmip->grInfo.data); + memset(cur, 0x00, size*4); + + image = gpatch->mipmap.grInfo.data; + blendimage = blendgpatch->mipmap.grInfo.data; + + switch (color) + { + case SKINCOLOR_WHITE: + blendcolor = V_GetColor(3); + break; + case SKINCOLOR_SILVER: + blendcolor = V_GetColor(11); + break; + case SKINCOLOR_GREY: + blendcolor = V_GetColor(23); + break; + case SKINCOLOR_BLACK: + blendcolor = V_GetColor(27); + break; + case SKINCOLOR_CYAN: + blendcolor = V_GetColor(216); + break; + case SKINCOLOR_TEAL: + blendcolor = V_GetColor(220); + break; + case SKINCOLOR_STEELBLUE: + blendcolor = V_GetColor(204); + break; + case SKINCOLOR_BLUE: + blendcolor = V_GetColor(234); + break; + case SKINCOLOR_PEACH: + blendcolor = V_GetColor(73); + break; + case SKINCOLOR_TAN: + blendcolor = V_GetColor(49); + break; + case SKINCOLOR_PINK: + blendcolor = V_GetColor(146); + break; + case SKINCOLOR_LAVENDER: + blendcolor = V_GetColor(252); + break; + case SKINCOLOR_PURPLE: + blendcolor = V_GetColor(195); + break; + case SKINCOLOR_ORANGE: + blendcolor = V_GetColor(87); + break; + case SKINCOLOR_ROSEWOOD: + blendcolor = V_GetColor(94); + break; + case SKINCOLOR_BEIGE: + blendcolor = V_GetColor(40); + break; + case SKINCOLOR_BROWN: + blendcolor = V_GetColor(57); + break; + case SKINCOLOR_RED: + blendcolor = V_GetColor(130); + break; + case SKINCOLOR_DARKRED: + blendcolor = V_GetColor(139); + break; + case SKINCOLOR_NEONGREEN: + blendcolor = V_GetColor(184); + break; + case SKINCOLOR_GREEN: + blendcolor = V_GetColor(170); + break; + case SKINCOLOR_ZIM: + blendcolor = V_GetColor(180); + break; + case SKINCOLOR_OLIVE: + blendcolor = V_GetColor(108); + break; + case SKINCOLOR_YELLOW: + blendcolor = V_GetColor(104); + break; + case SKINCOLOR_GOLD: + blendcolor = V_GetColor(115); + break; + + case SKINCOLOR_SUPER1: + blendcolor = V_GetColor(101); + break; + case SKINCOLOR_SUPER2: + blendcolor = V_GetColor(113); + break; + case SKINCOLOR_SUPER3: + blendcolor = V_GetColor(114); + break; + case SKINCOLOR_SUPER4: + blendcolor = V_GetColor(116); + break; + case SKINCOLOR_SUPER5: + blendcolor = V_GetColor(119); + break; + + case SKINCOLOR_TSUPER1: + blendcolor = V_GetColor(80); + break; + case SKINCOLOR_TSUPER2: + blendcolor = V_GetColor(82); + break; + case SKINCOLOR_TSUPER3: + blendcolor = V_GetColor(84); + break; + case SKINCOLOR_TSUPER4: + blendcolor = V_GetColor(85); + break; + case SKINCOLOR_TSUPER5: + blendcolor = V_GetColor(87); + break; + + case SKINCOLOR_KSUPER1: + blendcolor = V_GetColor(122); + break; + case SKINCOLOR_KSUPER2: + blendcolor = V_GetColor(123); + break; + case SKINCOLOR_KSUPER3: + blendcolor = V_GetColor(124); + break; + case SKINCOLOR_KSUPER4: + blendcolor = V_GetColor(125); + break; + case SKINCOLOR_KSUPER5: + blendcolor = V_GetColor(126); + break; + default: + blendcolor = V_GetColor(247); + break; + } + + while (size--) + { + if (blendimage->s.alpha == 0) + { + // Don't bother with blending the pixel if the alpha of the blend pixel is 0 + cur->rgba = image->rgba; + } + else + { + INT32 tempcolor; + INT16 tempmult, tempalpha; + tempalpha = -(abs(blendimage->s.red-127)-127)*2; + if (tempalpha > 255) + tempalpha = 255; + else if (tempalpha < 0) + tempalpha = 0; + + tempmult = (blendimage->s.red-127)*2; + if (tempmult > 255) + tempmult = 255; + else if (tempmult < 0) + tempmult = 0; + + tempcolor = (image->s.red*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.red)/255)) * blendimage->s.alpha)/255; + cur->s.red = (UINT8)tempcolor; + tempcolor = (image->s.green*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.green)/255)) * blendimage->s.alpha)/255; + cur->s.green = (UINT8)tempcolor; + tempcolor = (image->s.blue*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.blue)/255)) * blendimage->s.alpha)/255; + cur->s.blue = (UINT8)tempcolor; + cur->s.alpha = image->s.alpha; + } + + cur++; image++; blendimage++; + } + + return; +} + +static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, const UINT8 *colormap, skincolors_t color) +{ + // mostly copied from HWR_GetMappedPatch, hence the similarities and comment + GLMipmap_t *grmip, *newmip; + + if (colormap == colormaps || colormap == NULL) + { + // Don't do any blending + HWD.pfnSetTexture(&gpatch->mipmap); + return; + } + + // search for the mimmap + // skip the first (no colormap translated) + for (grmip = &gpatch->mipmap; grmip->nextcolormap; ) + { + grmip = grmip->nextcolormap; + if (grmip->colormap == colormap) + { + if (grmip->downloaded && grmip->grInfo.data) + { + HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture + Z_ChangeTag(grmip->grInfo.data, PU_HWRCACHE_UNLOCKED); + return; + } + } + } + + // If here, the blended texture has not been created + // So we create it + + //BP: WARNING: don't free it manually without clearing the cache of harware renderer + // (it have a liste of mipmap) + // this malloc is cleared in HWR_FreeTextureCache + // (...) unfortunately z_malloc fragment alot the memory :(so malloc is better + newmip = calloc(1, sizeof (*newmip)); + if (newmip == NULL) + I_Error("%s: Out of memory", "HWR_GetMappedPatch"); + grmip->nextcolormap = newmip; + newmip->colormap = colormap; + + HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, color); + + HWD.pfnSetTexture(newmip); + Z_ChangeTag(newmip->grInfo.data, PU_HWRCACHE_UNLOCKED); +} + // -----------------+ // HWR_DrawMD2 : Draw MD2 @@ -1194,13 +1490,25 @@ void HWR_DrawMD2(gr_vissprite_t *spr) gpatch = md2->grpatch; if (!gpatch || !gpatch->mipmap.grInfo.format || !gpatch->mipmap.downloaded) md2_loadTexture(md2); - gpatch = md2->grpatch; // Load it again, because it isn't being loaded into gpatch after md2_loadtexture... + if ((gpatch && gpatch->mipmap.grInfo.format) // don't load the blend texture if the base texture isn't available + && (!md2->blendgrpatch || !((GLPatch_t *)md2->blendgrpatch)->mipmap.grInfo.format || !((GLPatch_t *)md2->blendgrpatch)->mipmap.downloaded)) + md2_loadBlendTexture(md2); + if (gpatch && gpatch->mipmap.grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture { - // This is safe, since we know the texture has been downloaded - HWD.pfnSetTexture(&gpatch->mipmap); + if ((skincolors_t)spr->mobj->color != SKINCOLOR_NONE && + md2->blendgrpatch && ((GLPatch_t *)md2->blendgrpatch)->mipmap.grInfo.format + && gpatch->width == ((GLPatch_t *)md2->blendgrpatch)->width && gpatch->height == ((GLPatch_t *)md2->blendgrpatch)->height) + { + HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, spr->colormap, (skincolors_t)spr->mobj->color); + } + else + { + // This is safe, since we know the texture has been downloaded + HWD.pfnSetTexture(&gpatch->mipmap); + } } else { diff --git a/src/hardware/hw_md2.h b/src/hardware/hw_md2.h index 0fb486ea0..36078268b 100644 --- a/src/hardware/hw_md2.h +++ b/src/hardware/hw_md2.h @@ -120,6 +120,7 @@ typedef struct float offset; md2_model_t *model; void *grpatch; + void *blendgrpatch; boolean notfound; INT32 skin; } md2_t; From d050a60f3600eea067c2476f8d8461309ec2b515 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Mon, 3 Aug 2015 02:01:56 +0100 Subject: [PATCH 003/467] Change a few colours. --- src/hardware/hw_md2.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 8953b3a88..e4b839b68 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1145,37 +1145,37 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, blendcolor = V_GetColor(3); break; case SKINCOLOR_SILVER: - blendcolor = V_GetColor(11); + blendcolor = V_GetColor(10); break; case SKINCOLOR_GREY: - blendcolor = V_GetColor(23); + blendcolor = V_GetColor(15); break; case SKINCOLOR_BLACK: blendcolor = V_GetColor(27); break; case SKINCOLOR_CYAN: - blendcolor = V_GetColor(216); + blendcolor = V_GetColor(215); break; case SKINCOLOR_TEAL: - blendcolor = V_GetColor(220); + blendcolor = V_GetColor(221); break; case SKINCOLOR_STEELBLUE: - blendcolor = V_GetColor(204); + blendcolor = V_GetColor(203); break; case SKINCOLOR_BLUE: - blendcolor = V_GetColor(234); + blendcolor = V_GetColor(232); break; case SKINCOLOR_PEACH: - blendcolor = V_GetColor(73); + blendcolor = V_GetColor(71); break; case SKINCOLOR_TAN: - blendcolor = V_GetColor(49); + blendcolor = V_GetColor(79); break; case SKINCOLOR_PINK: - blendcolor = V_GetColor(146); + blendcolor = V_GetColor(147); break; case SKINCOLOR_LAVENDER: - blendcolor = V_GetColor(252); + blendcolor = V_GetColor(251); break; case SKINCOLOR_PURPLE: blendcolor = V_GetColor(195); @@ -1202,7 +1202,7 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, blendcolor = V_GetColor(184); break; case SKINCOLOR_GREEN: - blendcolor = V_GetColor(170); + blendcolor = V_GetColor(166); break; case SKINCOLOR_ZIM: blendcolor = V_GetColor(180); @@ -1218,23 +1218,23 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, break; case SKINCOLOR_SUPER1: - blendcolor = V_GetColor(101); + blendcolor = V_GetColor(97); break; case SKINCOLOR_SUPER2: - blendcolor = V_GetColor(113); + blendcolor = V_GetColor(100); break; case SKINCOLOR_SUPER3: - blendcolor = V_GetColor(114); + blendcolor = V_GetColor(103); break; case SKINCOLOR_SUPER4: - blendcolor = V_GetColor(116); + blendcolor = V_GetColor(113); break; case SKINCOLOR_SUPER5: - blendcolor = V_GetColor(119); + blendcolor = V_GetColor(116); break; case SKINCOLOR_TSUPER1: - blendcolor = V_GetColor(80); + blendcolor = V_GetColor(81); break; case SKINCOLOR_TSUPER2: blendcolor = V_GetColor(82); From 071006bcb0fd4513d26ca1ffeed659ff552f43bd Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sat, 16 Jan 2016 11:35:34 -0800 Subject: [PATCH 004/467] Makefile can run comptime.bat from src\ too --- comptime.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/comptime.bat b/comptime.bat index 119b3bb5c..9e127f001 100644 --- a/comptime.bat +++ b/comptime.bat @@ -6,6 +6,7 @@ copy nul: /b +%1\comptime.c tmp.$$$ > nul move tmp.$$$ %1\comptime.c > nul if exist .git goto gitrev +if exist ..\.git goto gitrev if exist .svn goto svnrev goto filwri From 6fd3036112cfc0edf02eaa51016dc7ed552855fa Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sat, 16 Jan 2016 11:35:34 -0800 Subject: [PATCH 005/467] Makefile can run comptime.bat from src\ too --- comptime.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/comptime.bat b/comptime.bat index 119b3bb5c..9e127f001 100644 --- a/comptime.bat +++ b/comptime.bat @@ -6,6 +6,7 @@ copy nul: /b +%1\comptime.c tmp.$$$ > nul move tmp.$$$ %1\comptime.c > nul if exist .git goto gitrev +if exist ..\.git goto gitrev if exist .svn goto svnrev goto filwri From af3c4755dc1c26c003d595474799560eba83b964 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 17 Jan 2016 19:43:26 +0000 Subject: [PATCH 006/467] All lumps with the "SOC_" prefix in their names are now read as SOCs. --- src/w_wad.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/w_wad.c b/src/w_wad.c index 9d6a11fb5..39bde4bb1 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -147,6 +147,16 @@ static inline void W_LoadDehackedLumps(UINT16 wadnum) } #endif + { + lumpinfo_t *lump_p = wadfiles[wadnum]->lumpinfo; + for (lump = 0; lump < wadfiles[wadnum]->numlumps; lump++, lump_p++) + if (memcmp(lump_p->name,"SOC_",4)==0) + { + CONS_Printf(M_GetText("Loading SOC from %s\n"), wadfiles[wadnum]->filename); + DEH_LoadDehackedLumpPwad(wadnum, lump); + } + } + // Check for MAINCFG for (lump = 0;lump != INT16_MAX;lump++) { From c6a2bde7d97aef3ebfbc82678e5c37a22379a323 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 18 Jan 2016 19:46:00 +0000 Subject: [PATCH 007/467] Use modulo, not bitwise AND. My fault once again, whoops. The point here is ColorOpposite(MAXSKINCOLORS) would have given an actual result of its own since MAXSKINCOLORS & MAXSKINCOLORS is still MAXSKINCOLORS. This shouldn't happen though, as both Color_Opposite[MAXSKINCOLORS*2] and Color_Opposite[MAXSKINCOLOR*2+1] aren't defined. --- src/lua_mathlib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lua_mathlib.c b/src/lua_mathlib.c index f4b5ca5fe..fd00180d5 100644 --- a/src/lua_mathlib.c +++ b/src/lua_mathlib.c @@ -166,7 +166,7 @@ static int lib_all7emeralds(lua_State *L) // Returns both color and frame numbers! static int lib_coloropposite(lua_State *L) { - int colornum = ((int)luaL_checkinteger(L, 1)) & MAXSKINCOLORS; + int colornum = ((int)luaL_checkinteger(L, 1)) % MAXSKINCOLORS; lua_pushinteger(L, Color_Opposite[colornum*2]); // push color lua_pushinteger(L, Color_Opposite[colornum*2+1]); // push frame return 2; From 96913c4a479ad642d7759590d652b56a482ee2ee Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 20 Jan 2016 01:13:21 -0800 Subject: [PATCH 008/467] objectplace stability fix Objectplace reallocates the mapthings list to add one more mapthing. By itself there's no problem with this. But, mobj->spawnpoint is a pointer to the mapthing's location in the mapthings list. So by reallocating the mapthings list, all references to mobj->spawnpoints point to freed memory. ... Oops. Now when objectplace reallocates the mapthings list it actually corrects the locations of all mobj's spawnpoints to point to the new list. Hooray, you can use NiGHTS objectplace again if you really want to. --- src/m_cheat.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/m_cheat.c b/src/m_cheat.c index 4da9b3ba7..6eaf31c4a 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -880,12 +880,33 @@ static boolean OP_HeightOkay(player_t *player, UINT8 ceiling) static mapthing_t *OP_CreateNewMapThing(player_t *player, UINT16 type, boolean ceiling) { - mapthing_t *mt; + mapthing_t *mt = mapthings; + #ifdef HAVE_BLUA LUA_InvalidateMapthings(); #endif mapthings = Z_Realloc(mapthings, ++nummapthings * sizeof (*mapthings), PU_LEVEL, NULL); + + // as Z_Realloc can relocate mapthings, quickly go through thinker list and correct + // the spawnpoints of any objects that have them to the new location + if (mt != mapthings) + { + thinker_t *th; + mobj_t *mo; + + for (th = thinkercap.next; th != &thinkercap; th = th->next) + { + if (th->function.acp1 != (actionf_p1)P_MobjThinker) + continue; + + mo = (mobj_t *)th; + // get offset from mt, which points to old mapthings, then add new location + if (mo->spawnpoint) + mo->spawnpoint = (mo->spawnpoint - mt) + mapthings; + } + } + mt = (mapthings+nummapthings-1); mt->type = type; From 55f0e5cab5fe13bef38d7ad67c2f80226128769d Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 20 Jan 2016 01:13:21 -0800 Subject: [PATCH 009/467] objectplace stability fix Objectplace reallocates the mapthings list to add one more mapthing. By itself there's no problem with this. But, mobj->spawnpoint is a pointer to the mapthing's location in the mapthings list. So by reallocating the mapthings list, all references to mobj->spawnpoints point to freed memory. ... Oops. Now when objectplace reallocates the mapthings list it actually corrects the locations of all mobj's spawnpoints to point to the new list. Hooray, you can use NiGHTS objectplace again if you really want to. --- src/m_cheat.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/m_cheat.c b/src/m_cheat.c index bc32e6cfa..473fbbf75 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -880,12 +880,33 @@ static boolean OP_HeightOkay(player_t *player, UINT8 ceiling) static mapthing_t *OP_CreateNewMapThing(player_t *player, UINT16 type, boolean ceiling) { - mapthing_t *mt; + mapthing_t *mt = mapthings; + #ifdef HAVE_BLUA LUA_InvalidateMapthings(); #endif mapthings = Z_Realloc(mapthings, ++nummapthings * sizeof (*mapthings), PU_LEVEL, NULL); + + // as Z_Realloc can relocate mapthings, quickly go through thinker list and correct + // the spawnpoints of any objects that have them to the new location + if (mt != mapthings) + { + thinker_t *th; + mobj_t *mo; + + for (th = thinkercap.next; th != &thinkercap; th = th->next) + { + if (th->function.acp1 != (actionf_p1)P_MobjThinker) + continue; + + mo = (mobj_t *)th; + // get offset from mt, which points to old mapthings, then add new location + if (mo->spawnpoint) + mo->spawnpoint = (mo->spawnpoint - mt) + mapthings; + } + } + mt = (mapthings+nummapthings-1); mt->type = type; From 79e3e2351d17f4f223d75295635122257219242d Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Wed, 20 Jan 2016 14:56:52 +0000 Subject: [PATCH 010/467] Finally bothered to add in a method to obtain sector.lines' size internally to prevent going out of bounds. Admittedly I knew of this particular method from the start but wanted to avoid it in favour of a less-hacky looking method of getting sector.lines' size ...but there was none to be found at all. --- src/lua_maplib.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 1307540fb..77651b209 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -268,7 +268,7 @@ static int sectorlines_get(lua_State *L) { line_t **seclines = *((line_t ***)luaL_checkudata(L, 1, META_SECTORLINES)); size_t i; - //size_t numoflines; + size_t numoflines = 0; lua_settop(L, 2); if (!lua_isnumber(L, 2)) { @@ -286,21 +286,22 @@ static int sectorlines_get(lua_State *L) } } - /* \TODO: figure out how to find size of seclines array, rather than the size of a pointer! - Testing for sectors[0].lines in GFZ1 with a test Lua script: - sizeof(seclines) returns 4 - sizeof(*seclines) returns 4 - sizeof(**seclines) returns 84, presumably the size of line_t - You can probably see why I haven't been successful yet, hopefully - //CONS_Printf("sizeof(seclines): %d\n", sizeof(seclines)); - //CONS_Printf("sizeof(seclines[0]): %d\n", sizeof(seclines[0]));*/ + // check first linedef to figure which of its sectors owns this sector->lines pointer + // then check that sector's linecount to get a maximum index + //if (!seclines[0]) + //return luaL_error(L, "no lines found!"); // no first linedef????? + if (seclines[0]->frontsector->lines == seclines) + numoflines = seclines[0]->frontsector->linecount; + else if (seclines[0]->backsector && seclines[0]->backsector->lines == seclines) // check backsector exists first + numoflines = seclines[0]->backsector->linecount; + //if neither sector has it then ??? - /*numoflines = sizeof(seclines) / sizeof(seclines[0]); if (!numoflines) - return luaL_error(L, "no lines found!");*/ + return luaL_error(L, "no lines found!"); + i = (size_t)lua_tointeger(L, 2); - /*if (i > numoflines) - return 0;*/ + if (i >= numoflines) + return 0; LUA_PushUserdata(L, seclines[i], META_LINE); return 1; } From 7d914913dd94400ad3369b152aa02d845774bd4b Mon Sep 17 00:00:00 2001 From: Sean Ryder Date: Wed, 20 Jan 2016 15:55:32 +0000 Subject: [PATCH 011/467] Tabbing --- src/hardware/hw_md2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index e4b839b68..0745b9a00 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1115,8 +1115,8 @@ void HWR_AddSpriteMD2(size_t spritenum) // For MD2s that were added after startu static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, skincolors_t color) { UINT16 w = gpatch->width, h = gpatch->height; - UINT32 size = w*h; - RGBA_t *image, *blendimage, *cur, blendcolor; + UINT32 size = w*h; + RGBA_t *image, *blendimage, *cur, blendcolor; if (grmip->width == 0) { From 5abdb08a25da14e1378adb937a4418e92dfcc609 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Wed, 20 Jan 2016 16:03:17 +0000 Subject: [PATCH 012/467] #sector.lines now returns the number of linedefs in the sector --- src/lua_maplib.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 77651b209..d585c479f 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -306,6 +306,23 @@ static int sectorlines_get(lua_State *L) return 1; } +static int sectorlines_num(lua_State *L) +{ + line_t **seclines = *((line_t ***)luaL_checkudata(L, 1, META_SECTORLINES)); + size_t numoflines = 0; + // check first linedef to figure which of its sectors owns this sector->lines pointer + // then check that sector's linecount to get a maximum index + //if (!seclines[0]) + //return luaL_error(L, "no lines found!"); // no first linedef????? + if (seclines[0]->frontsector->lines == seclines) + numoflines = seclines[0]->frontsector->linecount; + else if (seclines[0]->backsector && seclines[0]->backsector->lines == seclines) // check backsector exists first + numoflines = seclines[0]->backsector->linecount; + //if neither sector has it then ??? + lua_pushinteger(L, numoflines); + return 1; +} + static int sector_get(lua_State *L) { sector_t *sector = *((sector_t **)luaL_checkudata(L, 1, META_SECTOR)); @@ -1282,6 +1299,9 @@ int LUA_MapLib(lua_State *L) luaL_newmetatable(L, META_SECTORLINES); lua_pushcfunction(L, sectorlines_get); lua_setfield(L, -2, "__index"); + + lua_pushcfunction(L, sectorlines_num); + lua_setfield(L, -2, "__len"); lua_pop(L, 1); luaL_newmetatable(L, META_SECTOR); From 7d6dc3a5bb64e1ad8fe1ac091fbcff8c11ef7bcf Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 20 Jan 2016 09:25:28 -0800 Subject: [PATCH 013/467] fix bad lstring usage in map header lua This is not how you use pushlstring! This is actually sending uninitialized memory to Lua, which is making scripts have inconsistent results (duh?) c/o JTE: "Tell Red they're a doofus." --- src/lua_maplib.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 0a12478ca..85c3b094c 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -1162,9 +1162,9 @@ static int mapheaderinfo_get(lua_State *L) //for (i = 0; i < 21; i++) // if (!header->lvlttl[i]) // break; - lua_pushlstring(L, header->lvlttl, 21); + lua_pushstring(L, header->lvlttl); } else if (fastcmp(field,"subttl")) - lua_pushlstring(L, header->subttl, 32); + lua_pushstring(L, header->subttl); else if (fastcmp(field,"actnum")) lua_pushinteger(L, header->actnum); else if (fastcmp(field,"typeoflevel")) @@ -1176,7 +1176,7 @@ static int mapheaderinfo_get(lua_State *L) else if (fastcmp(field,"musicslottrack")) lua_pushinteger(L, header->musicslottrack); else if (fastcmp(field,"forcecharacter")) - lua_pushlstring(L, header->forcecharacter, 16); + lua_pushstring(L, header->forcecharacter); else if (fastcmp(field,"weather")) lua_pushinteger(L, header->weather); else if (fastcmp(field,"skynum")) @@ -1188,11 +1188,11 @@ static int mapheaderinfo_get(lua_State *L) else if (fastcmp(field,"skybox_scalez")) lua_pushinteger(L, header->skybox_scalez); else if (fastcmp(field,"interscreen")) - lua_pushlstring(L, header->interscreen, 8); + lua_pushstring(L, header->interscreen); else if (fastcmp(field,"runsoc")) - lua_pushlstring(L, header->runsoc, 32); + lua_pushstring(L, header->runsoc); else if (fastcmp(field,"scriptname")) - lua_pushlstring(L, header->scriptname, 32); + lua_pushstring(L, header->scriptname); else if (fastcmp(field,"precutscenenum")) lua_pushinteger(L, header->precutscenenum); else if (fastcmp(field,"cutscenenum")) @@ -1221,7 +1221,7 @@ static int mapheaderinfo_get(lua_State *L) for (;i < header->numCustomOptions && !fastcmp(field, header->customopts[i].option); ++i); if(i < header->numCustomOptions) - lua_pushlstring(L, header->customopts[i].value, 255); + lua_pushstring(L, header->customopts[i].value); else lua_pushnil(L); } From 9d5718760dd287947392b09abe7ce5b2520ebce6 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 20 Jan 2016 09:42:35 -0800 Subject: [PATCH 014/467] interscreen is a lump name and thus needs lstring ... not just lstring though, but the behavior with i that is used elsewhere. --- src/lua_maplib.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 85c3b094c..6f28997ac 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -1157,13 +1157,10 @@ static int mapheaderinfo_get(lua_State *L) { mapheader_t *header = *((mapheader_t **)luaL_checkudata(L, 1, META_MAPHEADER)); const char *field = luaL_checkstring(L, 2); - //INT16 i; - if (fastcmp(field,"lvlttl")) { - //for (i = 0; i < 21; i++) - // if (!header->lvlttl[i]) - // break; + INT16 i; + if (fastcmp(field,"lvlttl")) lua_pushstring(L, header->lvlttl); - } else if (fastcmp(field,"subttl")) + else if (fastcmp(field,"subttl")) lua_pushstring(L, header->subttl); else if (fastcmp(field,"actnum")) lua_pushinteger(L, header->actnum); @@ -1187,9 +1184,12 @@ static int mapheaderinfo_get(lua_State *L) lua_pushinteger(L, header->skybox_scaley); else if (fastcmp(field,"skybox_scalez")) lua_pushinteger(L, header->skybox_scalez); - else if (fastcmp(field,"interscreen")) - lua_pushstring(L, header->interscreen); - else if (fastcmp(field,"runsoc")) + else if (fastcmp(field,"interscreen")) { + for (i = 0; i < 8; i++) + if (!header->interscreen[i]) + break; + lua_pushlstring(L, header->interscreen, i); + } else if (fastcmp(field,"runsoc")) lua_pushstring(L, header->runsoc); else if (fastcmp(field,"scriptname")) lua_pushstring(L, header->scriptname); From c33d20acff6b712acc293bc97327b3021786a184 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 21 Jan 2016 13:50:05 -0500 Subject: [PATCH 015/467] whitespace cleanup --- src/r_bsp.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/r_bsp.c b/src/r_bsp.c index badf8bdac..c547713be 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -935,14 +935,14 @@ static void R_Subsector(size_t num) ffloor[numffloors].plane = NULL; ffloor[numffloors].polyobj = NULL; - - floorcenterz = + + floorcenterz = #ifdef ESLOPE frontsector->f_slope ? P_GetZAt(frontsector->f_slope, frontsector->soundorg.x, frontsector->soundorg.y) : #endif frontsector->floorheight; - - ceilingcenterz = + + ceilingcenterz = #ifdef ESLOPE frontsector->c_slope ? P_GetZAt(frontsector->c_slope, frontsector->soundorg.x, frontsector->soundorg.y) : #endif @@ -953,8 +953,8 @@ static void R_Subsector(size_t num) *rover->b_slope ? P_GetZAt(*rover->b_slope, viewx, viewy) : #endif *rover->bottomheight; - - planecenterz = + + planecenterz = #ifdef ESLOPE *rover->b_slope ? P_GetZAt(*rover->b_slope, frontsector->soundorg.x, frontsector->soundorg.y) : #endif @@ -966,7 +966,7 @@ static void R_Subsector(size_t num) { light = R_GetPlaneLight(frontsector, planecenterz, viewz < *rover->bottomheight); - + ffloor[numffloors].plane = R_FindPlane(*rover->bottomheight, *rover->bottompic, *frontsector->lightlist[light].lightlevel, *rover->bottomxoffs, *rover->bottomyoffs, *rover->bottomangle, frontsector->lightlist[light].extra_colormap, rover @@ -1002,8 +1002,8 @@ static void R_Subsector(size_t num) *rover->t_slope ? P_GetZAt(*rover->t_slope, viewx, viewy) : #endif *rover->topheight; - - planecenterz = + + planecenterz = #ifdef ESLOPE *rover->t_slope ? P_GetZAt(*rover->t_slope, frontsector->soundorg.x, frontsector->soundorg.y) : #endif @@ -1014,7 +1014,7 @@ static void R_Subsector(size_t num) || (viewz < heightcheck && (rover->flags & FF_BOTHPLANES)))) { light = R_GetPlaneLight(frontsector, planecenterz, viewz < *rover->topheight); - + ffloor[numffloors].plane = R_FindPlane(*rover->topheight, *rover->toppic, *frontsector->lightlist[light].lightlevel, *rover->topxoffs, *rover->topyoffs, *rover->topangle, frontsector->lightlist[light].extra_colormap, rover From 6189d1a2cafcc6a9651151991f62aa07e5f8b585 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 21 Jan 2016 13:50:05 -0500 Subject: [PATCH 016/467] whitespace cleanup --- src/r_bsp.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/r_bsp.c b/src/r_bsp.c index badf8bdac..c547713be 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -935,14 +935,14 @@ static void R_Subsector(size_t num) ffloor[numffloors].plane = NULL; ffloor[numffloors].polyobj = NULL; - - floorcenterz = + + floorcenterz = #ifdef ESLOPE frontsector->f_slope ? P_GetZAt(frontsector->f_slope, frontsector->soundorg.x, frontsector->soundorg.y) : #endif frontsector->floorheight; - - ceilingcenterz = + + ceilingcenterz = #ifdef ESLOPE frontsector->c_slope ? P_GetZAt(frontsector->c_slope, frontsector->soundorg.x, frontsector->soundorg.y) : #endif @@ -953,8 +953,8 @@ static void R_Subsector(size_t num) *rover->b_slope ? P_GetZAt(*rover->b_slope, viewx, viewy) : #endif *rover->bottomheight; - - planecenterz = + + planecenterz = #ifdef ESLOPE *rover->b_slope ? P_GetZAt(*rover->b_slope, frontsector->soundorg.x, frontsector->soundorg.y) : #endif @@ -966,7 +966,7 @@ static void R_Subsector(size_t num) { light = R_GetPlaneLight(frontsector, planecenterz, viewz < *rover->bottomheight); - + ffloor[numffloors].plane = R_FindPlane(*rover->bottomheight, *rover->bottompic, *frontsector->lightlist[light].lightlevel, *rover->bottomxoffs, *rover->bottomyoffs, *rover->bottomangle, frontsector->lightlist[light].extra_colormap, rover @@ -1002,8 +1002,8 @@ static void R_Subsector(size_t num) *rover->t_slope ? P_GetZAt(*rover->t_slope, viewx, viewy) : #endif *rover->topheight; - - planecenterz = + + planecenterz = #ifdef ESLOPE *rover->t_slope ? P_GetZAt(*rover->t_slope, frontsector->soundorg.x, frontsector->soundorg.y) : #endif @@ -1014,7 +1014,7 @@ static void R_Subsector(size_t num) || (viewz < heightcheck && (rover->flags & FF_BOTHPLANES)))) { light = R_GetPlaneLight(frontsector, planecenterz, viewz < *rover->topheight); - + ffloor[numffloors].plane = R_FindPlane(*rover->topheight, *rover->toppic, *frontsector->lightlist[light].lightlevel, *rover->topxoffs, *rover->topyoffs, *rover->topangle, frontsector->lightlist[light].extra_colormap, rover From 3bfc4022413c3bad189f9ac3f55232a80785331e Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 21 Jan 2016 13:52:45 -0500 Subject: [PATCH 017/467] whitespace cleanup --- src/console.c | 1 - src/dehacked.c | 1 - src/doomdef.h | 1 - src/hardware/hw_defs.h | 1 - src/m_menu.c | 1 - src/r_draw.c | 5 ++--- src/r_draw8.c | 1 - 7 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/console.c b/src/console.c index fe447b10a..ae95f161c 100644 --- a/src/console.c +++ b/src/console.c @@ -1472,4 +1472,3 @@ void CON_Drawer(void) else if (gamestate == GS_LEVEL || gamestate == GS_INTERMISSION || gamestate == GS_CUTSCENE || gamestate == GS_CREDITS) CON_DrawHudlines(); } - diff --git a/src/dehacked.c b/src/dehacked.c index 4222b4f7c..241a523f8 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8824,4 +8824,3 @@ void LUA_SetActionByName(void *state, const char *actiontocompare) } #endif // HAVE_BLUA - diff --git a/src/doomdef.h b/src/doomdef.h index 3fd24b0ae..757277865 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -506,4 +506,3 @@ extern const char *compdate, *comptime, *comprevision, *compbranch; //#define REDSANALOG #endif // __DOOMDEF__ - diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 5a39fead1..52110121b 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -229,4 +229,3 @@ enum hwdfiltermode #endif //_HWR_DEFS_ - diff --git a/src/m_menu.c b/src/m_menu.c index 439950049..1010db909 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -7409,4 +7409,3 @@ static void M_HandleFogColor(INT32 choice) } } #endif - diff --git a/src/r_draw.c b/src/r_draw.c index 4cc70b795..d1673c9a6 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -347,7 +347,7 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + i - 3); } break; - + case SKINCOLOR_PEACH: // 11 colors for (i = 0; i < SKIN_RAMP_LENGTH; i++) @@ -362,7 +362,7 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + i - 7); // Darkest } break; - + case SKINCOLOR_RED: // 16 colors for (i = 0; i < SKIN_RAMP_LENGTH; i++) @@ -957,4 +957,3 @@ void R_DrawViewBorder(void) // ========================================================================== #include "r_draw16.c" - diff --git a/src/r_draw8.c b/src/r_draw8.c index d3f6e18d6..c42f5d869 100644 --- a/src/r_draw8.c +++ b/src/r_draw8.c @@ -1388,4 +1388,3 @@ void R_DrawColumnShadowed_8(void) if (dc_yl <= realyh) walldrawerfunc(); // R_DrawWallColumn_8 for the appropriate architecture } - From ccb0abb853233e414a1734bf2556f556d4580320 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Thu, 21 Jan 2016 20:19:43 +0000 Subject: [PATCH 018/467] Diagonal ring springs should now be able to face any angle --- src/p_mobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 0f25a8655..25ae8815a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9696,7 +9696,7 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing) // Diagonal rings (handles both types) else if (mthing->type == 602 || mthing->type == 603) // Diagonal rings (5) { - angle_t angle = ANGLE_45 * (mthing->angle/45); + angle_t angle = FixedAngle(mthing->angle*FRACUNIT); mobjtype_t ringthing = MT_RING; INT32 iterations = 5; if (mthing->type == 603) From 674ff5115392fea76bd757e39d6312924f70739d Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Thu, 21 Jan 2016 20:27:35 +0000 Subject: [PATCH 019/467] Fix shadowing in mapheaderinfo_get --- src/lua_maplib.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 6f28997ac..38920c223 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -1217,11 +1217,11 @@ static int mapheaderinfo_get(lua_State *L) else { // Read custom vars now // (note: don't include the "LUA." in your lua scripts!) - UINT8 i = 0; - for (;i < header->numCustomOptions && !fastcmp(field, header->customopts[i].option); ++i); + UINT8 j = 0; + for (;j < header->numCustomOptions && !fastcmp(field, header->customopts[j].option); ++j); - if(i < header->numCustomOptions) - lua_pushstring(L, header->customopts[i].value); + if(j < header->numCustomOptions) + lua_pushstring(L, header->customopts[j].value); else lua_pushnil(L); } From 181c875016a74a2e6161daaad089b45f6f2dd325 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 14 Jan 2016 12:32:04 -0500 Subject: [PATCH 020/467] SDL: config.h.in is pre source tree, config.h for each cmake build --- src/sdl/i_system.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 4b45c373c..da4111538 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -21,7 +21,7 @@ /// \brief SRB2 system stuff for SDL #ifdef CMAKECONFIG -#include "../config.h" +#include "config.h" #else #include "../config.h.in" #endif From 80fb282334435ff7ee566e4ff08e46d4833b2b2a Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 23 Jan 2016 18:59:17 +0000 Subject: [PATCH 021/467] Fixed math for calculating current texture in texture animations --- src/p_spec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index cac822ac8..81994d46c 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4671,11 +4671,11 @@ void P_UpdateSpecials(void) // ANIMATE TEXTURES for (anim = anims; anim < lastanim; anim++) { - for (i = anim->basepic; i < anim->basepic + anim->numpics; i++) + for (i = 0; i < anim->numpics; i++) { pic = anim->basepic + ((leveltime/anim->speed + i) % anim->numpics); if (anim->istexture) - texturetranslation[i] = pic; + texturetranslation[anim->basepic+i] = pic; } } From 3db1a1fe9f6a93bf6b1f37439c73bb28c9903fb4 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Tue, 26 Jan 2016 23:30:53 -0500 Subject: [PATCH 022/467] add/test appveyor build --- appveyor.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 appveyor.yml diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..cf7fb8507 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,4 @@ +version: 1.0.{build} +os: MinGW +build_script: +- cmd: make -C src MINGW=1 \ No newline at end of file From b8cafea40aebd5680d0d3808dc8f9f2e05277efc Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Tue, 26 Jan 2016 23:56:22 -0500 Subject: [PATCH 023/467] appveyor: full path to make binary and no asm or png support --- appveyor.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index cf7fb8507..871e13195 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,5 @@ version: 1.0.{build} os: MinGW build_script: -- cmd: make -C src MINGW=1 \ No newline at end of file +- cmd: C:\MinGW\bin\make.exe -C src MINGW=1 NOASM=1 NOPNG=1 + From 21c30a396c692915cea33d1b964bd9b3c250560c Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 27 Jan 2016 00:11:54 -0500 Subject: [PATCH 024/467] appveyor: allow one to RDP to system to debug build system --- .gitattributes | 2 ++ appveyor.yml | 3 +++ 2 files changed, 5 insertions(+) diff --git a/.gitattributes b/.gitattributes index 777bf189a..ef775b912 100644 --- a/.gitattributes +++ b/.gitattributes @@ -29,4 +29,6 @@ /libs/zlib/nintendods/README -whitespace /libs/zlib/watcom/watcom_f.mak -crlf -whitespace /libs/zlib/watcom/watcom_l.mak -crlf -whitespace +#Appveyor +/appveyor.yml -crlf -whitespace # Other diff --git a/appveyor.yml b/appveyor.yml index 871e13195..ee6e3e97f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,8 @@ version: 1.0.{build} os: MinGW + build_script: - cmd: C:\MinGW\bin\make.exe -C src MINGW=1 NOASM=1 NOPNG=1 +on_finish: +-ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 289b5506bff6b1a45aa8e54a044204e9c2e04d16 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 27 Jan 2016 00:15:09 -0500 Subject: [PATCH 025/467] appveyor: whitespace? --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index ee6e3e97f..cf84de502 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,3 +6,4 @@ build_script: on_finish: -ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) + From cbd85e6baff8608ad1a9044ce3d95bf91c47f7e2 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 27 Jan 2016 00:27:28 -0500 Subject: [PATCH 026/467] appveyor: spacing --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index cf84de502..e871bb3e8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,5 +5,5 @@ build_script: - cmd: C:\MinGW\bin\make.exe -C src MINGW=1 NOASM=1 NOPNG=1 on_finish: --ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 8ad8533880232163d96d7ed34593035717ad6c3c Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 27 Jan 2016 01:09:51 -0500 Subject: [PATCH 027/467] appveyor: found mingw64 32-bit target, do not build with UPX --- appveyor.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index e871bb3e8..6c5317987 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,9 +1,14 @@ version: 1.0.{build} os: MinGW +install: +- set PATH=C:\mingw64\bin;%PATH% +- set CC=i686-w64-mingw32-gcc +- set WINDRES=windres + build_script: -- cmd: C:\MinGW\bin\make.exe -C src MINGW=1 NOASM=1 NOPNG=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 on_finish: -- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 113a3cd6fc53736ddb90960a88ee71ecc51ddb1e Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 27 Jan 2016 01:16:42 -0500 Subject: [PATCH 028/467] appveyor: try again --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 6c5317987..b965a1130 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,12 +1,12 @@ -version: 1.0.{build} +version: 2.1.14.{branch}-{build} os: MinGW install: -- set PATH=C:\mingw64\bin;%PATH% - set CC=i686-w64-mingw32-gcc - set WINDRES=windres build_script: +- set Path=C:\mingw64\bin;%Path% - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 on_finish: From 85de668d1a4ea54f9fcb0c183206f562f8c80419 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 27 Jan 2016 01:21:29 -0500 Subject: [PATCH 029/467] appveyor: move set to before_build, and drop gcc and make version --- appveyor.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index b965a1130..69d4be7e4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,8 +5,12 @@ install: - set CC=i686-w64-mingw32-gcc - set WINDRES=windres +before_build: +- set Path=c:\mingw64\bin;%Path% +- i686-w64-mingw32-gcc --version +- mingw32-make --version + build_script: -- set Path=C:\mingw64\bin;%Path% - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 on_finish: From 6e1b9549fc9739f863d8c70c02df05c9fef5392d Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 27 Jan 2016 01:24:32 -0500 Subject: [PATCH 030/467] appveyor: fullpath to binaries --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 69d4be7e4..81f71cc8c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,8 +7,8 @@ install: before_build: - set Path=c:\mingw64\bin;%Path% -- i686-w64-mingw32-gcc --version -- mingw32-make --version +- c:\mingw64\bin\i686-w64-mingw32-gcc --version +- c:\mingw64\bin\mingw32-make --version build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 From 443562c3c01cfb96f3fa10e29f125e81e5b3954a Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 27 Jan 2016 01:26:36 -0500 Subject: [PATCH 031/467] appveyor: why is this failing --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 81f71cc8c..20644c556 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,5 +14,5 @@ build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 on_finish: -#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 1a72f2f1db9220e21fafd38114e0864056065008 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 27 Jan 2016 01:32:53 -0500 Subject: [PATCH 032/467] appveyor: wrong path... --- appveyor.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 20644c556..a0cbfae47 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,13 +6,13 @@ install: - set WINDRES=windres before_build: -- set Path=c:\mingw64\bin;%Path% -- c:\mingw64\bin\i686-w64-mingw32-gcc --version -- c:\mingw64\bin\mingw32-make --version +- set Path=c:\msys64\mingw32\bin;%Path% +- i686-w64-mingw32-gcc --version +- mingw32-make --version build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 on_finish: -- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From d0ce9170da8b6b4b2598883ec3938fb8016fd6d2 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 27 Jan 2016 01:39:12 -0500 Subject: [PATCH 033/467] appveyor: build for GCC 5.2 --- appveyor.yml | 2 +- src/Makefile.cfg | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index a0cbfae47..6c727568b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,7 +11,7 @@ before_build: - mingw32-make --version build_script: -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 on_finish: #- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) diff --git a/src/Makefile.cfg b/src/Makefile.cfg index 1ea96df92..d6af0d8a7 100644 --- a/src/Makefile.cfg +++ b/src/Makefile.cfg @@ -7,6 +7,22 @@ # and other things # +ifdef GCC53 +GCC52=1 +endif + +ifdef GCC52 +GCC51=1 +endif + +ifdef GCC51 +GCC49=1 +endif + +ifdef GCC49 +GCC48=1 +endif + ifdef GCC48 GCC47=1 endif From 24da82f02640dd55bc3e4f2d31ceb33357619dfc Mon Sep 17 00:00:00 2001 From: yellowtd Date: Sat, 16 Jan 2016 23:10:38 -0500 Subject: [PATCH 034/467] Begin work on OGL slope support unfinished --- src/hardware/hw_main.c | 210 ++++++++++++++++++++++++++++++++++------- 1 file changed, 175 insertions(+), 35 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 7d6caa049..63936b178 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -39,7 +39,9 @@ #include "../st_stuff.h" #include "../i_system.h" #include "../m_cheat.h" - +#ifdef ESLOPE +#include "../p_slopes.h" +#endif #include "hw_md2.h" #define R_FAKEFLOORS @@ -535,6 +537,9 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi angle_t angle = 0; FSurfaceInfo Surf; fixed_t tempxsow, tempytow; +#ifdef ESLOPE + pslope_t *slope = NULL; +#endif static FOutVector *planeVerts = NULL; static UINT16 numAllocedPlaneVerts = 0; @@ -543,6 +548,30 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi if (!xsub->planepoly) return; +#ifdef ESLOPE + // Get the slope pointer to simplify future code + if (sector) + { + // Yes this fixedheight check is needed again here + if (sector->f_slope && sector->floorheight == fixedheight) + slope = sector->f_slope; + else if (sector->c_slope && sector->ceilingheight == fixedheight) + slope = sector->c_slope; + } + else if (FOFsector) + { + // Yes this fixedheight check is needed again here + if (FOFsector->f_slope && FOFsector->floorheight == fixedheight) + slope = FOFsector->f_slope; + else if (FOFsector->c_slope && FOFsector->ceilingheight == fixedheight) + slope = FOFsector->c_slope; + } + + // Set fixedheight to the slope's height from our viewpoint, if we have a slope + if (slope) + fixedheight = P_GetZAt(slope, viewx, viewy); +#endif + height = FIXED_TO_FLOAT(fixedheight); pv = xsub->planepoly->pts; @@ -608,7 +637,12 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi if (FOFsector != NULL) { +#ifdef ESLOPE + if ((slope && slope == FOFsector->f_slope) + || fixedheight == FOFsector->floorheight) // it's a floor +#else if (fixedheight == FOFsector->floorheight) // it's a floor +#endif { scrollx = FIXED_TO_FLOAT(FOFsector->floor_xoffs)/fflatsize; scrolly = FIXED_TO_FLOAT(FOFsector->floor_yoffs)/fflatsize; @@ -678,24 +712,13 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi v3d->x = pv->x; v3d->y = height; v3d->z = pv->y; -#ifdef SLOPENESS - if (sector && sector->special == 65535) - { - size_t q; - for (q = 0; q < sector->linecount; q++) - { - if (v3d->x == sector->lines[q]->v1->x>>FRACBITS) - { - if (v3d->z == sector->lines[q]->v1->y>>FRACBITS) - { - v3d->y += sector->lines[q]->v1->z>>FRACBITS; - break; - } - } - } - } -#else - (void)sector; + +#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 } @@ -714,6 +737,11 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi { 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; @@ -1321,6 +1349,11 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) fixed_t worldtop, worldbottom; fixed_t worldhigh = 0, worldlow = 0; +#ifdef ESLOPE + fixed_t worldtopslope, worldbottomslope; + fixed_t worldhighslope = 0, worldlowslope = 0; + fixed_t v1x, v1y, v2x, v2y; +#endif GLTexture_t *grTex = NULL; float cliplow = 0.0f, cliphigh = 0.0f; @@ -1337,22 +1370,56 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) gr_sidedef = gr_curline->sidedef; gr_linedef = gr_curline->linedef; - if (gr_frontsector->heightsec != -1) - { - worldtop = sectors[gr_frontsector->heightsec].ceilingheight; - worldbottom = sectors[gr_frontsector->heightsec].floorheight; - } - else - { - worldtop = gr_frontsector->ceilingheight; - worldbottom = gr_frontsector->floorheight; - } - vs.x = ((polyvertex_t *)gr_curline->v1)->x; vs.y = ((polyvertex_t *)gr_curline->v1)->y; ve.x = ((polyvertex_t *)gr_curline->v2)->x; ve.y = ((polyvertex_t *)gr_curline->v2)->y; +#ifdef ESLOPE + v1x = FLOAT_TO_FIXED(vs.x); + v1y = FLOAT_TO_FIXED(vs.y); + v2x = FLOAT_TO_FIXED(ve.x); + v2y = FLOAT_TO_FIXED(ve.y); +#endif + + if (gr_frontsector->heightsec != -1) + { +#ifdef ESLOPE + worldtop = worldtopslope = sectors[gr_frontsector->heightsec].ceilingheight; + worldbottom = worldbottomslope = sectors[gr_frontsector->heightsec].floorheight; +#else + worldtop = sectors[gr_frontsector->heightsec].ceilingheight; + worldbottom = sectors[gr_frontsector->heightsec].floorheight; +#endif + } + else + { +#ifdef ESLOPE + if (gr_frontsector->c_slope) + { + worldtop = P_GetZAt(gr_frontsector->c_slope, v1x, v1y); + worldtopslope = P_GetZAt(gr_frontsector->c_slope, v2x, v2y); + } + else + { + worldtop = worldtopslope = gr_frontsector->ceilingheight; + } + + if (gr_frontsector->f_slope) + { + worldbottom = P_GetZAt(gr_frontsector->f_slope, v1x, v1y); + worldbottomslope = P_GetZAt(gr_frontsector->f_slope, v2x, v2y); + } + else + { + worldbottom = worldbottomslope = gr_frontsector->floorheight; + } +#else + worldtop = gr_frontsector->ceilingheight; + worldbottom = gr_frontsector->floorheight; +#endif + } + // remember vertices ordering // 3--2 // | /| @@ -1396,13 +1463,40 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) // two sided line if (gr_backsector->heightsec != -1) { +#ifdef ESLOPE + worldhigh = worldhighslope = sectors[gr_backsector->heightsec].ceilingheight; + worldlow = worldlowslope = sectors[gr_backsector->heightsec].floorheight; +#else worldhigh = sectors[gr_backsector->heightsec].ceilingheight; worldlow = sectors[gr_backsector->heightsec].floorheight; +#endif } else { +#ifdef ESLOPE + if (gr_backsector->c_slope) + { + worldhigh = P_GetZAt(gr_backsector->c_slope, v1x, v1y); + worldhighslope = P_GetZAt(gr_backsector->c_slope, v2x, v2y); + } + else + { + worldhigh = worldhighslope = gr_backsector->ceilingheight; + } + + if (gr_backsector->f_slope) + { + worldlow = P_GetZAt(gr_backsector->f_slope, v1x, v1y); + worldlowslope = P_GetZAt(gr_backsector->f_slope, v2x, v2y); + } + else + { + worldlow = worldlowslope = gr_backsector->floorheight; + } +#else worldhigh = gr_backsector->ceilingheight; worldlow = gr_backsector->floorheight; +#endif } // hack to allow height changes in outdoor areas @@ -1411,10 +1505,18 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) gr_backsector->ceilingpic == skyflatnum) { worldtop = worldhigh; +#ifdef ESLOPE + worldtopslope = worldhighslope; +#endif } // check TOP TEXTURE - if (worldhigh < worldtop && texturetranslation[gr_sidedef->toptexture]) + if (( +#ifdef ESLOPE + worldhighslope < worldtopslope || +#endif + worldhigh < worldtop + ) && texturetranslation[gr_sidedef->toptexture]) { if (drawtextured) { @@ -1425,8 +1527,15 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) // PEGGING if (gr_linedef->flags & ML_DONTPEGTOP) texturevpegtop = 0; - else +#ifdef ESLOPE + else if (gr_linedef->flags & ML_EFFECT1) texturevpegtop = worldhigh + textureheight[gr_sidedef->toptexture] - worldtop; + else + texturevpegtop = gr_backsector->ceilingheight + textureheight[gr_sidedef->toptexture] - gr_frontsector->ceilingheight; +#else + else + texturevpegtop = worldhigh + textureheight[gr_sidedef->toptexture] - worldtop; +#endif texturevpegtop += gr_sidedef->rowoffset; @@ -1434,14 +1543,34 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) texturevpegtop %= SHORT(textures[texturetranslation[gr_sidedef->toptexture]]->height)<scaleY; - wallVerts[0].t = wallVerts[1].t = (texturevpegtop + worldtop - worldhigh) * grTex->scaleY; + wallVerts[0].t = wallVerts[1].t = (texturevpegtop + gr_frontsector->ceilingheight - gr_backsector->ceilingheight) * grTex->scaleY; wallVerts[0].s = wallVerts[3].s = cliplow * grTex->scaleX; wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX; + +#ifdef ESLOPE + // Adjust t value for sloped walls + if (!(gr_linedef->flags & ML_EFFECT1)) + { + // Unskewed + wallVerts[3].t += worldtop - gr_frontsector->ceilingheight; + wallVerts[2].t += worldtopslope - gr_frontsector->ceilingheight; + wallVerts[0].t += worldhigh - gr_backsector->ceilingheight; + wallVerts[1].t += worldhighslope - gr_backsector->ceilingheight; + } + +#endif } // set top/bottom coords +#ifdef ESLOPE + wallVerts[3].y = FIXED_TO_FLOAT(worldtop); + wallVerts[0].y = FIXED_TO_FLOAT(worldhigh); + wallVerts[2].y = FIXED_TO_FLOAT(worldtopslope); + wallVerts[1].y = FIXED_TO_FLOAT(worldhighslope); +#else wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(worldtop); wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(worldhigh); +#endif if (gr_frontsector->numlights) HWR_SplitWall(gr_frontsector, wallVerts, texturetranslation[gr_sidedef->toptexture], &Surf, FF_CUTSOLIDS); @@ -1452,7 +1581,11 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) } // check BOTTOM TEXTURE - if (worldlow > worldbottom && texturetranslation[gr_sidedef->bottomtexture]) //only if VISIBLE!!! + if (( +#ifdef ESLOPE + worldlowslope > worldbottomslope || +#endif + worldlow > worldbottom) && texturetranslation[gr_sidedef->bottomtexture]) //only if VISIBLE!!! { if (drawtextured) { @@ -1478,8 +1611,15 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) } // set top/bottom coords +#ifdef ESLOPE + wallVerts[3].y = FIXED_TO_FLOAT(worldlow); + wallVerts[0].y = FIXED_TO_FLOAT(worldbottom); + wallVerts[2].y = FIXED_TO_FLOAT(worldlowslope); + wallVerts[1].y = FIXED_TO_FLOAT(worldbottomslope); +#else wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(worldlow); wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(worldbottom); +#endif if (gr_frontsector->numlights) HWR_SplitWall(gr_frontsector, wallVerts, texturetranslation[gr_sidedef->bottomtexture], &Surf, FF_CUTSOLIDS); @@ -4544,7 +4684,7 @@ static void HWR_ProjectSprite(mobj_t *thing) tz = (tr_x * gr_viewcos) + (tr_y * gr_viewsin); // thing is behind view plane? - if (tz < ZCLIP_PLANE) + if (tz < ZCLIP_PLANE && md2_models[thing->sprite].notfound == true) //Yellow: Only MD2's dont disappear return; tx = (tr_x * gr_viewsin) - (tr_y * gr_viewcos); From 52ae3f2875220d67301c203814b704014f8f8131 Mon Sep 17 00:00:00 2001 From: yellowtd Date: Sun, 24 Jan 2016 03:41:30 -0500 Subject: [PATCH 035/467] GL slope walls and fixed plane culling --- src/hardware/hw_main.c | 173 +++++++++++++++++++++++++++++++++-------- 1 file changed, 139 insertions(+), 34 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 63936b178..34223457f 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -521,7 +521,7 @@ static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color, UINT32 fadecolor) // L // -----------------+ // HWR_RenderPlane : Render a floor or ceiling convex polygon // -----------------+ -static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fixedheight, +static void HWR_RenderPlane(sector_t *shittyUnusedVariable, extrasubsector_t *xsub, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, boolean fogplane, extracolormap_t *planecolormap) { polyvertex_t * pv; @@ -550,22 +550,21 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi #ifdef ESLOPE // Get the slope pointer to simplify future code - if (sector) + if (FOFsector) { - // Yes this fixedheight check is needed again here - if (sector->f_slope && sector->floorheight == fixedheight) - slope = sector->f_slope; - else if (sector->c_slope && sector->ceilingheight == fixedheight) - slope = sector->c_slope; - } - else if (FOFsector) - { - // Yes this fixedheight check is needed again here if (FOFsector->f_slope && FOFsector->floorheight == fixedheight) slope = FOFsector->f_slope; else if (FOFsector->c_slope && FOFsector->ceilingheight == fixedheight) slope = FOFsector->c_slope; } + else + { + // Use fixedheight to determine whether to check floor or ceiling because I hate my life + if (gr_frontsector->f_slope && gr_frontsector->floorheight == fixedheight) + slope = gr_frontsector->f_slope; + else if (gr_frontsector->c_slope && gr_frontsector->ceilingheight == fixedheight) + slope = gr_frontsector->c_slope; + } // Set fixedheight to the slope's height from our viewpoint, if we have a slope if (slope) @@ -657,7 +656,12 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi } else if (gr_frontsector) { +#ifdef ESLOPE + if ((slope && slope == gr_frontsector->f_slope) + || fixedheight == gr_frontsector->floorheight) // it's a floor +#else if (fixedheight < dup_viewz) // it's a floor +#endif { scrollx = FIXED_TO_FLOAT(gr_frontsector->floor_xoffs)/fflatsize; scrolly = FIXED_TO_FLOAT(gr_frontsector->floor_yoffs)/fflatsize; @@ -1552,12 +1556,24 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) if (!(gr_linedef->flags & ML_EFFECT1)) { // Unskewed - wallVerts[3].t += worldtop - gr_frontsector->ceilingheight; - wallVerts[2].t += worldtopslope - gr_frontsector->ceilingheight; - wallVerts[0].t += worldhigh - gr_backsector->ceilingheight; - wallVerts[1].t += worldhighslope - gr_backsector->ceilingheight; + wallVerts[3].t -= (worldtop - gr_frontsector->ceilingheight) * grTex->scaleY; + wallVerts[2].t -= (worldtopslope - gr_frontsector->ceilingheight) * grTex->scaleY; + wallVerts[0].t -= (worldhigh - gr_backsector->ceilingheight) * grTex->scaleY; + wallVerts[1].t -= (worldhighslope - gr_backsector->ceilingheight) * grTex->scaleY; + } + else if (gr_linedef->flags & ML_DONTPEGTOP) + { + // Skewed by top + wallVerts[0].t = (texturevpegtop + worldtop - worldhigh) * grTex->scaleY; + wallVerts[1].t = (texturevpegtop + worldtopslope - worldhighslope) * grTex->scaleY; + } + else + { + // Skewed by bottom + wallVerts[0].t = (texturevpegtop + worldhigh - worldtop) * grTex->scaleY; + wallVerts[2].t = wallVerts[3].t - (worldhighslope - worldhigh) * grTex->scaleY; + wallVerts[1].t = wallVerts[2].t - (worldhighslope - worldtopslope) * grTex->scaleY; } - #endif } @@ -1594,10 +1610,19 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) grTex = HWR_GetTexture(texturetranslation[gr_sidedef->bottomtexture]); // PEGGING - if (gr_linedef->flags & ML_DONTPEGBOTTOM) +#ifdef ESLOPE + if (!(gr_linedef->flags & ML_DONTPEGBOTTOM)) + texturevpegbottom = 0; + else if (gr_linedef->flags & ML_EFFECT1) texturevpegbottom = worldtop - worldlow; else - texturevpegbottom = 0; + texturevpegbottom = gr_frontsector->ceilingheight - gr_backsector->floorheight; +#else + if (gr_linedef->flags & ML_DONTPEGBOTTOM) + texturevpegbottom = worldtop - worldlow; + else + texturevpegbottom = 0; +#endif texturevpegbottom += gr_sidedef->rowoffset; @@ -1605,9 +1630,34 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) texturevpegbottom %= SHORT(textures[texturetranslation[gr_sidedef->bottomtexture]]->height)<scaleY; - wallVerts[0].t = wallVerts[1].t = (texturevpegbottom + worldlow - worldbottom) * grTex->scaleY; + wallVerts[0].t = wallVerts[1].t = (texturevpegbottom + gr_backsector->floorheight - gr_frontsector->floorheight) * grTex->scaleY; wallVerts[0].s = wallVerts[3].s = cliplow * grTex->scaleX; wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX; + +#ifdef ESLOPE + // Adjust t value for sloped walls + if (!(gr_linedef->flags & ML_EFFECT1)) + { + // Unskewed + wallVerts[0].t -= (worldbottom - gr_frontsector->floorheight) * grTex->scaleY; + wallVerts[1].t -= (worldbottomslope - gr_frontsector->floorheight) * grTex->scaleY; + wallVerts[3].t -= (worldlow - gr_backsector->floorheight) * grTex->scaleY; + wallVerts[2].t -= (worldlowslope - gr_backsector->floorheight) * grTex->scaleY; + } + else if (gr_linedef->flags & ML_DONTPEGBOTTOM) + { + // Skewed by bottom + wallVerts[0].t = (texturevpegbottom + worldlow - worldbottom) * grTex->scaleY; + wallVerts[2].t = wallVerts[3].t - (worldlowslope - worldlow) * grTex->scaleY; + wallVerts[1].t = wallVerts[2].t - (worldbottomslope - worldlowslope) * grTex->scaleY; + } + else + { + // Skewed by top + wallVerts[0].t = (texturevpegbottom + worldlow - worldbottom) * grTex->scaleY; + wallVerts[1].t = (texturevpegbottom + worldlowslope - worldbottomslope) * grTex->scaleY; + } +#endif } // set top/bottom coords @@ -1925,6 +1975,11 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { fixed_t texturevpeg; // PEGGING +#ifdef ESLOPE + if ((gr_linedef->flags & (ML_DONTPEGBOTTOM|ML_EFFECT2)) == (ML_DONTPEGBOTTOM|ML_EFFECT2)) + texturevpeg = gr_frontsector->floorheight + textureheight[gr_sidedef->midtexture] - gr_frontsector->ceilingheight + gr_sidedef->rowoffset; + else +#endif if (gr_linedef->flags & ML_DONTPEGBOTTOM) texturevpeg = worldbottom + textureheight[gr_sidedef->midtexture] - worldtop + gr_sidedef->rowoffset; else @@ -1934,14 +1989,38 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) grTex = HWR_GetTexture(gr_midtexture); wallVerts[3].t = wallVerts[2].t = texturevpeg * grTex->scaleY; - wallVerts[0].t = wallVerts[1].t = (texturevpeg + worldtop - worldbottom) * grTex->scaleY; + wallVerts[0].t = wallVerts[1].t = (texturevpeg + gr_frontsector->ceilingheight - gr_frontsector->floorheight) * grTex->scaleY; wallVerts[0].s = wallVerts[3].s = cliplow * grTex->scaleX; wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX; + +#ifdef ESLOPE + // Texture correction for slopes + if (gr_linedef->flags & ML_EFFECT2) { + wallVerts[3].t += (gr_frontsector->ceilingheight - worldtop) * grTex->scaleY; + wallVerts[2].t += (gr_frontsector->ceilingheight - worldtopslope) * grTex->scaleY; + wallVerts[0].t += (gr_frontsector->floorheight - worldbottom) * grTex->scaleY; + wallVerts[1].t += (gr_frontsector->floorheight - worldbottomslope) * grTex->scaleY; + } else if (gr_linedef->flags & ML_DONTPEGBOTTOM) { + wallVerts[3].t = wallVerts[0].t + (worldbottom-worldtop) * grTex->scaleY; + wallVerts[2].t = wallVerts[1].t + (worldbottomslope-worldtopslope) * grTex->scaleY; + } else { + wallVerts[0].t = wallVerts[3].t - (worldbottom-worldtop) * grTex->scaleY; + wallVerts[1].t = wallVerts[2].t - (worldbottomslope-worldtopslope) * grTex->scaleY; + } +#endif } +#ifdef ESLOPE + //Set textures properly on single sided walls that are sloped + wallVerts[3].y = FIXED_TO_FLOAT(worldtop); + wallVerts[0].y = FIXED_TO_FLOAT(worldbottom); + wallVerts[2].y = FIXED_TO_FLOAT(worldtopslope); + wallVerts[1].y = FIXED_TO_FLOAT(worldbottomslope); + +#else // set top/bottom coords wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(worldtop); wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(worldbottom); - +#endif // I don't think that solid walls can use translucent linedef types... if (gr_frontsector->numlights) HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_CUTSOLIDS); @@ -1974,6 +2053,8 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) INT32 texnum; line_t * newline = NULL; // Multi-Property FOF + ///TODO add slope support (fixing cutoffs, proper wall clipping) - maybe just disable highcut/lowcut if either sector or FOF has a slope + /// to allow fun plane intersecting in OGL? But then people would abuse that and make software look bad. :C highcut = gr_frontsector->ceilingheight < gr_backsector->ceilingheight ? gr_frontsector->ceilingheight : gr_backsector->ceilingheight; lowcut = gr_frontsector->floorheight > gr_backsector->floorheight ? gr_frontsector->floorheight : gr_backsector->floorheight; @@ -3006,6 +3087,7 @@ static void HWR_Subsector(size_t num) INT32 floorlightlevel; INT32 ceilinglightlevel; INT32 locFloorHeight, locCeilingHeight; + INT32 cullFloorHeight, cullCeilingHeight; INT32 light = 0; fixed_t wh; extracolormap_t *floorcolormap; @@ -3063,26 +3145,41 @@ static void HWR_Subsector(size_t num) // ----- for special tricks with HW renderer ----- if (gr_frontsector->pseudoSector) { - locFloorHeight = gr_frontsector->virtualFloorheight; - locCeilingHeight = gr_frontsector->virtualCeilingheight; + cullFloorHeight = locFloorHeight = gr_frontsector->virtualFloorheight; + cullCeilingHeight = locCeilingHeight = gr_frontsector->virtualCeilingheight; } else if (gr_frontsector->virtualFloor) { - locFloorHeight = gr_frontsector->virtualFloorheight; + ///@TODO Is this whole virtualFloor mess even useful? I don't think it even triggers ever. + cullFloorHeight = locFloorHeight = gr_frontsector->virtualFloorheight; if (gr_frontsector->virtualCeiling) - locCeilingHeight = gr_frontsector->virtualCeilingheight; + cullCeilingHeight = locCeilingHeight = gr_frontsector->virtualCeilingheight; else - locCeilingHeight = gr_frontsector->ceilingheight; + cullCeilingHeight = locCeilingHeight = gr_frontsector->ceilingheight; } else if (gr_frontsector->virtualCeiling) { - locCeilingHeight = gr_frontsector->virtualCeilingheight; - locFloorHeight = gr_frontsector->floorheight; + cullCeilingHeight = locCeilingHeight = gr_frontsector->virtualCeilingheight; + cullFloorHeight = locFloorHeight = gr_frontsector->floorheight; } else { - locFloorHeight = gr_frontsector->floorheight; - locCeilingHeight = gr_frontsector->ceilingheight; + cullFloorHeight = locFloorHeight = gr_frontsector->floorheight; + cullCeilingHeight = locCeilingHeight = gr_frontsector->ceilingheight; + +#ifdef ESLOPE + if (gr_frontsector->f_slope) + { + cullFloorHeight = P_GetZAt(gr_frontsector->f_slope, viewx, viewy); + locFloorHeight = P_GetZAt(gr_frontsector->f_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); + } + + if (gr_frontsector->c_slope) + { + cullCeilingHeight = P_GetZAt(gr_frontsector->c_slope, viewx, viewy); + locCeilingHeight = P_GetZAt(gr_frontsector->c_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); + } +#endif } // ----- end special tricks ----- @@ -3113,14 +3210,18 @@ static void HWR_Subsector(size_t num) // render floor ? #ifdef DOPLANES // yeah, easy backface cull! :) - if (locFloorHeight < dup_viewz) + if (cullFloorHeight < dup_viewz) { if (gr_frontsector->floorpic != skyflatnum) { if (sub->validcount != validcount) { HWR_GetFlat(levelflats[gr_frontsector->floorpic].lumpnum); - HWR_RenderPlane(gr_frontsector, &extrasubsectors[num], locFloorHeight, PF_Occlude, floorlightlevel, levelflats[gr_frontsector->floorpic].lumpnum, NULL, 255, false, floorcolormap); + HWR_RenderPlane(gr_frontsector, &extrasubsectors[num], + // Hack to make things continue to work around slopes. + locFloorHeight == cullFloorHeight ? locFloorHeight : gr_frontsector->floorheight, + // We now return you to your regularly scheduled rendering. + PF_Occlude, floorlightlevel, levelflats[gr_frontsector->floorpic].lumpnum, NULL, 255, false, floorcolormap); } } else @@ -3131,14 +3232,18 @@ static void HWR_Subsector(size_t num) } } - if (locCeilingHeight > dup_viewz) + if (cullCeilingHeight > dup_viewz) { if (gr_frontsector->ceilingpic != skyflatnum) { if (sub->validcount != validcount) { HWR_GetFlat(levelflats[gr_frontsector->ceilingpic].lumpnum); - HWR_RenderPlane(NULL, &extrasubsectors[num], locCeilingHeight, PF_Occlude, ceilinglightlevel, levelflats[gr_frontsector->ceilingpic].lumpnum,NULL, 255, false, ceilingcolormap); + HWR_RenderPlane(NULL, &extrasubsectors[num], + // Hack to make things continue to work around slopes. + locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gr_frontsector->ceilingheight, + // We now return you to your regularly scheduled rendering. + PF_Occlude, ceilinglightlevel, levelflats[gr_frontsector->ceilingpic].lumpnum,NULL, 255, false, ceilingcolormap); } } else From e6235d4d6bddead7804facc24b2616e6f6404964 Mon Sep 17 00:00:00 2001 From: yellowtd Date: Mon, 25 Jan 2016 00:57:53 -0500 Subject: [PATCH 036/467] Fix FOF slope rendering in ogl should work as well as software if not better now --- src/hardware/hw_main.c | 107 +++++++++++++++++++++++++++++++++++------ 1 file changed, 92 insertions(+), 15 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 34223457f..5cd3b5931 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1363,6 +1363,9 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) float cliplow = 0.0f, cliphigh = 0.0f; INT32 gr_midtexture; fixed_t h, l; // 3D sides and 2s middle textures +#ifdef ESLOPE + fixed_t hS, lS; +#endif FUINT lightnum = 0; // shut up compiler extracolormap_t *colormap; @@ -2076,6 +2079,26 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) texnum = texturetranslation[sides[newline->sidenum[0]].midtexture]; } +#ifdef ESLOPE + h = *rover->t_slope ? P_GetZAt(*rover->t_slope, v1x, v1y) : *rover->topheight; + hS = *rover->t_slope ? P_GetZAt(*rover->t_slope, v2x, v2y) : *rover->topheight; + l = *rover->b_slope ? P_GetZAt(*rover->b_slope, v1x, v1y) : *rover->bottomheight; + lS = *rover->b_slope ? P_GetZAt(*rover->b_slope, v2x, v2y) : *rover->bottomheight; + if (!(*rover->t_slope) && !gr_frontsector->c_slope && !gr_backsector->c_slope && h > highcut) + h = hS = highcut; + if (!(*rover->b_slope) && !gr_frontsector->f_slope && !gr_backsector->f_slope && l < lowcut) + l = lS = lowcut; + //Hurdler: HW code starts here + //FIXME: check if peging is correct + // set top/bottom coords + + wallVerts[3].y = FIXED_TO_FLOAT(h); + wallVerts[2].y = FIXED_TO_FLOAT(hS); + wallVerts[0].y = FIXED_TO_FLOAT(l); + wallVerts[1].y = FIXED_TO_FLOAT(lS); + + +#else h = *rover->topheight; l = *rover->bottomheight; if (h > highcut) @@ -2087,6 +2110,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) // set top/bottom coords wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(h); wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(l); +#endif if (rover->flags & FF_FOG) { wallVerts[3].t = wallVerts[2].t = 0; @@ -2096,6 +2120,15 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) } else if (drawtextured) { +#ifdef ESLOPE // P.S. this is better-organized than the old version + fixed_t offs = sides[(newline ?: rover->master)->sidenum[0]].rowoffset; + grTex = HWR_GetTexture(texnum); + + wallVerts[3].t = (*rover->topheight - h + offs) * grTex->scaleY; + wallVerts[2].t = (*rover->topheight - hS + offs) * grTex->scaleY; + wallVerts[0].t = (*rover->topheight - l + offs) * grTex->scaleY; + wallVerts[1].t = (*rover->topheight - lS + offs) * grTex->scaleY; +#else grTex = HWR_GetTexture(texnum); if (newline) @@ -2108,6 +2141,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) wallVerts[3].t = wallVerts[2].t = (*rover->topheight - h + sides[rover->master->sidenum[0]].rowoffset) * grTex->scaleY; wallVerts[0].t = wallVerts[1].t = (h - l + (*rover->topheight - h + sides[rover->master->sidenum[0]].rowoffset)) * grTex->scaleY; } +#endif wallVerts[0].s = wallVerts[3].s = cliplow * grTex->scaleX; wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX; @@ -2180,7 +2214,26 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) newline = rover->master->frontsector->lines[0] + linenum; texnum = texturetranslation[sides[newline->sidenum[0]].midtexture]; } +#ifdef ESLOPE //backsides + h = *rover->t_slope ? P_GetZAt(*rover->t_slope, v1x, v1y) : *rover->topheight; + hS = *rover->t_slope ? P_GetZAt(*rover->t_slope, v2x, v2y) : *rover->topheight; + l = *rover->b_slope ? P_GetZAt(*rover->b_slope, v1x, v1y) : *rover->bottomheight; + lS = *rover->b_slope ? P_GetZAt(*rover->b_slope, v2x, v2y) : *rover->bottomheight; + if (!(*rover->t_slope) && !gr_frontsector->c_slope && !gr_backsector->c_slope && h > highcut) + h = hS = highcut; + if (!(*rover->b_slope) && !gr_frontsector->f_slope && !gr_backsector->f_slope && l < lowcut) + l = lS = lowcut; + //Hurdler: HW code starts here + //FIXME: check if peging is correct + // set top/bottom coords + wallVerts[3].y = FIXED_TO_FLOAT(h); + wallVerts[2].y = FIXED_TO_FLOAT(hS); + wallVerts[0].y = FIXED_TO_FLOAT(l); + wallVerts[1].y = FIXED_TO_FLOAT(lS); + + +#else h = *rover->topheight; l = *rover->bottomheight; if (h > highcut) @@ -2192,7 +2245,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) // set top/bottom coords wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(h); wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(l); - +#endif if (rover->flags & FF_FOG) { wallVerts[3].t = wallVerts[2].t = 0; @@ -3272,22 +3325,34 @@ static void HWR_Subsector(size_t num) for (rover = gr_frontsector->ffloors; rover; rover = rover->next) { + fixed_t cullHeight, centerHeight; + + // bottom plane +#ifdef ESLOPE + if (*rover->b_slope) + { + cullHeight = P_GetZAt(*rover->b_slope, viewx, viewy); + centerHeight = P_GetZAt(*rover->b_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); + } + else +#endif + cullHeight = centerHeight = *rover->bottomheight; if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERPLANES)) continue; if (sub->validcount == validcount) continue; - if (*rover->bottomheight <= gr_frontsector->ceilingheight && - *rover->bottomheight >= gr_frontsector->floorheight && - ((dup_viewz < *rover->bottomheight && !(rover->flags & FF_INVERTPLANES)) || - (dup_viewz > *rover->bottomheight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES)))) + if (centerHeight <= locCeilingHeight && + centerHeight >= locFloorHeight && + ((dup_viewz < cullHeight && !(rover->flags & FF_INVERTPLANES)) || + (dup_viewz > cullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES)))) { if (rover->flags & FF_FOG) { UINT8 alpha; - light = R_GetPlaneLight(gr_frontsector, *rover->bottomheight, dup_viewz < *rover->bottomheight ? true : false); + light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); if (rover->master->frontsector->extra_colormap) alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba, rover->master->frontsector->extra_colormap->fadergba); @@ -3303,7 +3368,7 @@ static void HWR_Subsector(size_t num) } else if (rover->flags & FF_TRANSLUCENT) // SoM: Flags are more efficient { - light = R_GetPlaneLight(gr_frontsector, *rover->bottomheight, dup_viewz < *rover->bottomheight ? true : false); + light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); #ifndef SORTING HWR_Add3DWater(levelflats[*rover->bottompic].lumpnum, &extrasubsectors[num], @@ -3322,21 +3387,33 @@ static void HWR_Subsector(size_t num) else { HWR_GetFlat(levelflats[*rover->bottompic].lumpnum); - light = R_GetPlaneLight(gr_frontsector, *rover->bottomheight, dup_viewz < *rover->bottomheight ? true : false); + light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); HWR_RenderPlane(NULL, &extrasubsectors[num], *rover->bottomheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum, rover->master->frontsector, 255, false, gr_frontsector->lightlist[light].extra_colormap); } } - if (*rover->topheight >= gr_frontsector->floorheight && - *rover->topheight <= gr_frontsector->ceilingheight && - ((dup_viewz > *rover->topheight && !(rover->flags & FF_INVERTPLANES)) || - (dup_viewz < *rover->topheight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES)))) + + // top plane +#ifdef ESLOPE + if (*rover->t_slope) + { + cullHeight = P_GetZAt(*rover->t_slope, viewx, viewy); + centerHeight = P_GetZAt(*rover->t_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); + } + else +#endif + cullHeight = centerHeight = *rover->topheight; + + if (centerHeight >= locFloorHeight && + centerHeight <= locCeilingHeight && + ((dup_viewz > cullHeight && !(rover->flags & FF_INVERTPLANES)) || + (dup_viewz < cullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES)))) { if (rover->flags & FF_FOG) { UINT8 alpha; - light = R_GetPlaneLight(gr_frontsector, *rover->topheight, dup_viewz < *rover->topheight ? true : false); + light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); if (rover->master->frontsector->extra_colormap) alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba, rover->master->frontsector->extra_colormap->fadergba); @@ -3352,7 +3429,7 @@ static void HWR_Subsector(size_t num) } else if (rover->flags & FF_TRANSLUCENT) { - light = R_GetPlaneLight(gr_frontsector, *rover->topheight, dup_viewz < *rover->topheight ? true : false); + light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); #ifndef SORTING HWR_Add3DWater(levelflats[*rover->toppic].lumpnum, &extrasubsectors[num], @@ -3372,7 +3449,7 @@ static void HWR_Subsector(size_t num) else { HWR_GetFlat(levelflats[*rover->toppic].lumpnum); - light = R_GetPlaneLight(gr_frontsector, *rover->topheight, dup_viewz < *rover->topheight ? true : false); + light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); HWR_RenderPlane(NULL, &extrasubsectors[num], *rover->topheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum, rover->master->frontsector, 255, false, gr_frontsector->lightlist[light].extra_colormap); } From b3fbc37c943201e85212b145427ee17dde96e941 Mon Sep 17 00:00:00 2001 From: yellowtd Date: Wed, 27 Jan 2016 01:00:15 -0500 Subject: [PATCH 037/467] Midtextures, lights, and culling fixes for ogl slopes There's a weird issue with lights that's hard to diagnose but otherwise this is ready to go I think --- src/hardware/hw_main.c | 203 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 185 insertions(+), 18 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 5cd3b5931..52be99219 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1082,23 +1082,47 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, lightlist. This may also include leaving out parts of the wall that can't be seen */ GLTexture_t * glTex; + float realtop, realbot, top, bot; float pegt, pegb, pegmul; float height = 0.0f, bheight = 0.0f; + +#ifdef ESLOPE + float endrealtop, endrealbot, endtop, endbot; + float endpegt, endpegb, endpegmul; + float endheight = 0.0f, endbheight = 0.0f; + + fixed_t v1x = FLOAT_TO_FIXED(wallVerts[0].x); + fixed_t v1y = FLOAT_TO_FIXED(wallVerts[0].y); + fixed_t v2x = FLOAT_TO_FIXED(wallVerts[1].x); + fixed_t v2y = FLOAT_TO_FIXED(wallVerts[1].y); +#endif + INT32 solid, i; lightlist_t * list = sector->lightlist; const UINT8 alpha = Surf->FlatColor.s.alpha; FUINT lightnum; extracolormap_t *colormap; - realtop = top = wallVerts[2].y; + realtop = top = wallVerts[3].y; realbot = bot = wallVerts[0].y; - pegt = wallVerts[2].t; + pegt = wallVerts[3].t; pegb = wallVerts[0].t; pegmul = (pegb - pegt) / (top - bot); +#ifdef ESLOPE + endrealtop = endtop = wallVerts[2].y; + endrealbot = endbot = wallVerts[1].y; + endpegt = wallVerts[2].t; + endpegb = wallVerts[1].t; + endpegmul = (endpegb - endpegt) / (endtop - endbot); +#endif + for (i = 1; i < sector->numlights; i++) { +#ifdef ESLOPE + if (endtop < endrealbot) +#endif if (top < realbot) return; @@ -1131,14 +1155,39 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, if (cutflag == FF_CUTSOLIDS) // These are regular walls sent in from StoreWallRange, they shouldn't be cut from this solid = false; +#ifdef ESLOPE + if (list[i].slope) + { + height = FIXED_TO_FLOAT(P_GetZAt(list[i].slope, v1x, v1y)); + endheight = FIXED_TO_FLOAT(P_GetZAt(list[i].slope, v2x, v2y)); + } + else + height = endheight = FIXED_TO_FLOAT(list[i].height); + if (solid) + if (*list[i].caster->b_slope) + { + bheight = FIXED_TO_FLOAT(P_GetZAt(*list[i].caster->b_slope, v1x, v1y)); + endbheight = FIXED_TO_FLOAT(P_GetZAt(*list[i].caster->b_slope, v2x, v2y)); + } + else + bheight = endbheight = FIXED_TO_FLOAT(*list[i].caster->bottomheight); +#else height = FIXED_TO_FLOAT(list[i].height); if (solid) bheight = FIXED_TO_FLOAT(*list[i].caster->bottomheight); +#endif +#ifdef ESLOPE + if (endheight >= endtop) +#endif if (height >= top) { if (solid && top > bheight) top = bheight; +#ifdef ESLOPE + if (solid && endtop > endbheight) + endtop = endbheight; +#endif continue; } @@ -1148,6 +1197,13 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, if (bot < realbot) bot = realbot; +#ifdef ESLOPE + endbot = endheight; + + if (endbot < endrealbot) + endbot = endrealbot; +#endif + // colormap test if (list[i-1].caster) { @@ -1162,13 +1218,25 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, Surf->FlatColor.s.alpha = alpha; +#ifdef ESLOPE + wallVerts[3].t = pegt + ((realtop - top) * pegmul); + wallVerts[2].t = endpegt + ((endrealtop - endtop) * endpegmul); + wallVerts[0].t = pegt + ((realtop - bot) * pegmul); + wallVerts[1].t = endpegt + ((endrealtop - endbot) * endpegmul); + // set top/bottom coords + wallVerts[3].y = top; + wallVerts[2].y = endtop; + wallVerts[0].y = bot; + wallVerts[1].y = endbot; +#else wallVerts[3].t = wallVerts[2].t = pegt + ((realtop - top) * pegmul); wallVerts[0].t = wallVerts[1].t = pegt + ((realtop - bot) * pegmul); // set top/bottom coords wallVerts[2].y = wallVerts[3].y = top; wallVerts[0].y = wallVerts[1].y = bot; +#endif glTex = HWR_GetTexture(texnum); if (cutflag & FF_TRANSLUCENT) @@ -1182,9 +1250,19 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, top = bheight; else top = height; +#ifdef ESLOPE + if (solid) + endtop = endbheight; + else + endtop = endheight; +#endif } bot = realbot; +#ifdef ESLOPE + endbot = endrealbot; + if (endtop <= endrealbot) +#endif if (top <= realbot) return; @@ -1200,12 +1278,25 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, } Surf->FlatColor.s.alpha = alpha; - wallVerts[3].t = wallVerts[2].t = pegt + ((realtop - top) * pegmul); - wallVerts[0].t = wallVerts[1].t = pegt + ((realtop - bot) * pegmul); +#ifdef ESLOPE + wallVerts[3].t = pegt + ((realtop - top) * pegmul); + wallVerts[2].t = endpegt + ((endrealtop - endtop) * endpegmul); + wallVerts[0].t = pegt + ((realtop - bot) * pegmul); + wallVerts[1].t = endpegt + ((endrealtop - endbot) * endpegmul); - // set top/bottom coords - wallVerts[2].y = wallVerts[3].y = top; - wallVerts[0].y = wallVerts[1].y = bot; + // set top/bottom coords + wallVerts[3].y = top; + wallVerts[2].y = endtop; + wallVerts[0].y = bot; + wallVerts[1].y = endbot; +#else + wallVerts[3].t = wallVerts[2].t = pegt + ((realtop - top) * pegmul); + wallVerts[0].t = wallVerts[1].t = pegt + ((realtop - bot) * pegmul); + + // set top/bottom coords + wallVerts[2].y = wallVerts[3].y = top; + wallVerts[0].y = wallVerts[1].y = bot; +#endif glTex = HWR_GetTexture(texnum); if (cutflag & FF_TRANSLUCENT) @@ -1739,14 +1830,36 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) popentop = back->ceilingheight; popenbottom = back->floorheight; } -#endif else - { - popentop = front->ceilingheight < back->ceilingheight ? front->ceilingheight : back->ceilingheight; - popenbottom = front->floorheight > back->floorheight ? front->floorheight : back->floorheight; +#endif + { +#ifdef ESLOPE + popentop = min(worldtop, worldhigh); + popenbottom = max(worldbottom, worldlow); +#else + popentop = min(front->ceilingheight, back->ceilingheight); + popenbottom = max(front->floorheight, back->floorheight); +#endif } - if (gr_linedef->flags & ML_DONTPEGBOTTOM) +#ifdef ESLOPE + if (gr_linedef->flags & ML_EFFECT2) + { + if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) + { + polybottom = max(front->floorheight, back->floorheight) + gr_sidedef->rowoffset; + polytop = polybottom + textureheight[gr_midtexture]*repeats; + } + else + { + polytop = min(front->ceilingheight, back->ceilingheight) + gr_sidedef->rowoffset; + polybottom = polytop - textureheight[gr_midtexture]*repeats; + } + } + else if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) +#else + if (gr_linedef->flags & ML_DONTPEGBOTTOM) +#endif { polybottom = popenbottom + gr_sidedef->rowoffset; polytop = polybottom + textureheight[gr_midtexture]*repeats; @@ -1769,17 +1882,21 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) else { // The cut-off values of a linedef can always be constant, since every line has an absoulute front and or back sector - lowcut = front->floorheight > back->floorheight ? front->floorheight : back->floorheight; - highcut = front->ceilingheight < back->ceilingheight ? front->ceilingheight : back->ceilingheight; + lowcut = popenbottom; + highcut = popentop; } - h = polytop > highcut ? highcut : polytop; - l = polybottom < lowcut ? lowcut : polybottom; + h = min(highcut, polytop); + l = max(polybottom, lowcut); if (drawtextured) { // PEGGING +#ifdef ESLOPE + if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) +#else if (gr_linedef->flags & ML_DONTPEGBOTTOM) +#endif texturevpeg = textureheight[gr_sidedef->midtexture]*repeats - h + polybottom; else texturevpeg = polytop - h; @@ -1798,6 +1915,52 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(h); wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(l); +#ifdef ESLOPE + // Correct to account for slopes + { + fixed_t midtextureslant; + + if (gr_linedef->flags & ML_EFFECT2) + midtextureslant = 0; + else if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) + midtextureslant = worldlow < worldbottom + ? worldbottomslope-worldbottom + : worldlowslope-worldlow; + else + midtextureslant = worldtop < worldhigh + ? worldtopslope-worldtop + : worldhighslope-worldhigh; + + polytop += midtextureslant; + polybottom += midtextureslant; + + highcut += worldtop < worldhigh + ? worldtopslope-worldtop + : worldhighslope-worldhigh; + lowcut += worldlow < worldbottom + ? worldbottomslope-worldbottom + : worldlowslope-worldlow; + + // Texture stuff + h = min(highcut, polytop); + l = max(polybottom, lowcut); + + if (drawtextured) + { + // PEGGING + if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) + texturevpeg = textureheight[gr_sidedef->midtexture]*repeats - h + polybottom; + else + texturevpeg = polytop - h; + wallVerts[2].t = texturevpeg * grTex->scaleY; + wallVerts[1].t = (h - l + texturevpeg) * grTex->scaleY; + } + + wallVerts[2].y = FIXED_TO_FLOAT(h); + wallVerts[1].y = FIXED_TO_FLOAT(l); + } +#endif + // set alpha for transparent walls (new boom and legacy linedef types) // ooops ! this do not work at all because render order we should render it in backtofront order switch (gr_linedef->special) @@ -2739,10 +2902,14 @@ static void HWR_AddLine(seg_t * line) // and no middle texture. if ( #ifdef POLYOBJECTS - !line->polyseg + !line->polyseg && #endif - && gr_backsector->ceilingpic == gr_frontsector->ceilingpic + gr_backsector->ceilingpic == gr_frontsector->ceilingpic && gr_backsector->floorpic == gr_frontsector->floorpic +#ifdef ESLOPE + && gr_backsector->f_slope == gr_frontsector->f_slope + && gr_backsector->c_slope == gr_frontsector->c_slope +#endif && gr_backsector->lightlevel == gr_frontsector->lightlevel && gr_curline->sidedef->midtexture == 0 && !gr_backsector->ffloors && !gr_frontsector->ffloors) From 5bf43171aeaec30e2ff4b2f6b697e2c4051d44d4 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 10:29:02 -0500 Subject: [PATCH 038/467] appveyor: let try SDL2 builds --- appveyor.yml | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 6c727568b..ccd9d5770 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,18 +1,36 @@ version: 2.1.14.{branch}-{build} os: MinGW +cache: + SDL2-devel-2.0.4-mingw.tar.gz + +environment: + CC=i686-w64-mingw32-gcc + WINDRES=windres + MINGW_SDK=c:\msys64\mingw32 + SDL2_URL=http://libsdl.org/release/SDL2-devel-2.0.4-mingw.tar.gz + SDL2_ARCHIVE=SDL2-devel-2.0.4-mingw.tar.gz + SDL2_MOVE=SDL2-2.0.4\i686-w64-mingw32 + install: -- set CC=i686-w64-mingw32-gcc -- set WINDRES=windres +- if not exist "%SDL2_ARCHIVE%" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%" +- 7z x -y "%MINGW_ARCHIVE%" -o%TMP% > nul +- robocopy /S %TMP%\%SDL2_MOVE% %MINGW_SDK% +- ps: (Get-Content %TMP%\%SDL2_MOVE%\bin\sdl2-config) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\bin\sdl2-config +- ps: (Get-Content %TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake +- ps: (Get-Content %TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\lib\pkgconfig\sdl2.pc before_build: -- set Path=c:\msys64\mingw32\bin;%Path% +- set Path=%MINGW_SDK%\bin;%Path% - i686-w64-mingw32-gcc --version - mingw32-make --version build_script: -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 DEBUGMODE=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOMIXER=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOMIXER=1 DEBUGMODE=1 on_finish: -#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 9422b994e4b0fc4612c3b6d8d05ce4f3f21eaf80 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 10:30:35 -0500 Subject: [PATCH 039/467] appveyor: fixup env block --- appveyor.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index ccd9d5770..0236459ab 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,12 +5,12 @@ cache: SDL2-devel-2.0.4-mingw.tar.gz environment: - CC=i686-w64-mingw32-gcc - WINDRES=windres - MINGW_SDK=c:\msys64\mingw32 - SDL2_URL=http://libsdl.org/release/SDL2-devel-2.0.4-mingw.tar.gz - SDL2_ARCHIVE=SDL2-devel-2.0.4-mingw.tar.gz - SDL2_MOVE=SDL2-2.0.4\i686-w64-mingw32 + CC: i686-w64-mingw32-gcc + WINDRES: windres + MINGW_SDK: c:\msys64\mingw32 + SDL2_URL: http://libsdl.org/release/SDL2-devel-2.0.4-mingw.tar.gz + SDL2_ARCHIVE: SDL2-devel-2.0.4-mingw.tar.gz + SDL2_MOVE: SDL2-2.0.4\i686-w64-mingw32 install: - if not exist "%SDL2_ARCHIVE%" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%" From e5dbd3cb9dc5cf2f8bbcb0e4ae291343c60ec717 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 10:40:28 -0500 Subject: [PATCH 040/467] appveyor: copy and paste mistake on extracting archive comannd --- appveyor.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 0236459ab..a8eb76a2d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,7 +14,7 @@ environment: install: - if not exist "%SDL2_ARCHIVE%" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%" -- 7z x -y "%MINGW_ARCHIVE%" -o%TMP% > nul +- 7z x -y "%SDL2_ARCHIVE%" -o%TMP% >null - robocopy /S %TMP%\%SDL2_MOVE% %MINGW_SDK% - ps: (Get-Content %TMP%\%SDL2_MOVE%\bin\sdl2-config) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\bin\sdl2-config - ps: (Get-Content %TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake @@ -32,5 +32,6 @@ build_script: #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOMIXER=1 DEBUGMODE=1 on_finish: +- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 9e1ba2e972057f6032c629dff4e6762b4f93d938 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 10:44:52 -0500 Subject: [PATCH 041/467] appvenyor: self note only --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index a8eb76a2d..5c596d40a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -32,6 +32,6 @@ build_script: #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOMIXER=1 DEBUGMODE=1 on_finish: -- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: +#- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 46f9e4a9615807084e5657ea638f5e69c4c0f0fa Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 10:52:40 -0500 Subject: [PATCH 042/467] appveyor: we need to run 7zip twice --- appveyor.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 5c596d40a..c4fcb64ed 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,12 +9,13 @@ environment: WINDRES: windres MINGW_SDK: c:\msys64\mingw32 SDL2_URL: http://libsdl.org/release/SDL2-devel-2.0.4-mingw.tar.gz - SDL2_ARCHIVE: SDL2-devel-2.0.4-mingw.tar.gz + SDL2_ARCHIVE: SDL2-devel-2.0.4-mingw.tar SDL2_MOVE: SDL2-2.0.4\i686-w64-mingw32 install: -- if not exist "%SDL2_ARCHIVE%" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%" -- 7z x -y "%SDL2_ARCHIVE%" -o%TMP% >null +- if not exist "%SDL2_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%.gz" +- 7z x -y "%SDL2_ARCHIVE%,gz" -o%TMP% >null +- 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null - robocopy /S %TMP%\%SDL2_MOVE% %MINGW_SDK% - ps: (Get-Content %TMP%\%SDL2_MOVE%\bin\sdl2-config) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\bin\sdl2-config - ps: (Get-Content %TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake From ffe193ca3ead0af14f87695b4a4bdd5a193a94ff Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 10:55:38 -0500 Subject: [PATCH 043/467] appveyor: mistakes are easy to make --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index c4fcb64ed..766894ba5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,7 +14,7 @@ environment: install: - if not exist "%SDL2_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%.gz" -- 7z x -y "%SDL2_ARCHIVE%,gz" -o%TMP% >null +- 7z x -y "%SDL2_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null - robocopy /S %TMP%\%SDL2_MOVE% %MINGW_SDK% - ps: (Get-Content %TMP%\%SDL2_MOVE%\bin\sdl2-config) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\bin\sdl2-config From 53aa9322071bedd59876ed3870e4e99a68f54a36 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 11:03:08 -0500 Subject: [PATCH 044/467] appveyor: ingore robocopy errorcode --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 766894ba5..001b14a89 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -16,7 +16,7 @@ install: - if not exist "%SDL2_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%.gz" - 7z x -y "%SDL2_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null -- robocopy /S %TMP%\%SDL2_MOVE% %MINGW_SDK% +- robocopy /S /xx /ns /nc /nfl /ndl /np %TMP%\%SDL2_MOVE% %MINGW_SDK% && exit 0 - ps: (Get-Content %TMP%\%SDL2_MOVE%\bin\sdl2-config) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\bin\sdl2-config - ps: (Get-Content %TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake - ps: (Get-Content %TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\lib\pkgconfig\sdl2.pc From e0f373381938d957c65598ae24556eb71815ab99 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 11:05:09 -0500 Subject: [PATCH 045/467] appveyor: hehe, OR --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 001b14a89..db27725da 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -16,7 +16,7 @@ install: - if not exist "%SDL2_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%.gz" - 7z x -y "%SDL2_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null -- robocopy /S /xx /ns /nc /nfl /ndl /np %TMP%\%SDL2_MOVE% %MINGW_SDK% && exit 0 +- robocopy /S /xx /ns /nc /nfl /ndl /np %TMP%\%SDL2_MOVE% %MINGW_SDK% || exit 0 - ps: (Get-Content %TMP%\%SDL2_MOVE%\bin\sdl2-config) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\bin\sdl2-config - ps: (Get-Content %TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake - ps: (Get-Content %TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\lib\pkgconfig\sdl2.pc From d76e21b54660c2efec99384538ed90b28eb513e3 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 28 Jan 2016 08:15:34 -0800 Subject: [PATCH 046/467] fix bind out of bounds / keystring misreading --- src/console.c | 2 +- src/g_input.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/console.c b/src/console.c index e77c400b3..fcac0e6de 100644 --- a/src/console.c +++ b/src/console.c @@ -202,7 +202,7 @@ static void CONS_Bind_f(void) } key = G_KeyStringtoNum(COM_Argv(1)); - if (!key) + if (key <= 0 || key >= NUMINPUTS) { CONS_Alert(CONS_NOTICE, M_GetText("Invalid key name\n")); return; diff --git a/src/g_input.c b/src/g_input.c index f12ddb711..79e6fb94b 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1042,13 +1042,13 @@ INT32 G_KeyStringtoNum(const char *keystr) if (!keystr[1] && keystr[0] > ' ' && keystr[0] <= 'z') return keystr[0]; + if (!strncmp(keystr, "KEY", 3) && keystr[3] >= '0' && keystr[3] <= '9') + return atoi(&keystr[3]); + for (j = 0; j < NUMKEYNAMES; j++) if (!stricmp(keynames[j].name, keystr)) return keynames[j].keynum; - if (strlen(keystr) > 3) - return atoi(&keystr[3]); - return 0; } From 5ace352e71fcbb95eb55fd398b250b515916f88b Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 11:16:24 -0500 Subject: [PATCH 047/467] appveyor: manually set SDL flags --- appveyor.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index db27725da..c1e5e1082 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -16,12 +16,14 @@ install: - if not exist "%SDL2_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%.gz" - 7z x -y "%SDL2_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null -- robocopy /S /xx /ns /nc /nfl /ndl /np %TMP%\%SDL2_MOVE% %MINGW_SDK% || exit 0 -- ps: (Get-Content %TMP%\%SDL2_MOVE%\bin\sdl2-config) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\bin\sdl2-config -- ps: (Get-Content %TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake -- ps: (Get-Content %TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", "%MINGW_SDK%" } | Set-Content %MINGW_SDK%\lib\pkgconfig\sdl2.pc +#- robocopy /S /xx /ns /nc /nfl /ndl /np %TMP%\%SDL2_MOVE% %MINGW_SDK% || exit 0 +#- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\bin\sdl2-config")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\bin\sdl2-config") +#- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake") +#- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\sdl2.pc") before_build: +- set SDL_CFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -Dmain=SDL_main +- set SDL_LDFLAGS=-L%TMP%\%SDL2_MOVE%\lib -lmingw32 -lSDL2main -lSDL2 -mwindows - set Path=%MINGW_SDK%\bin;%Path% - i686-w64-mingw32-gcc --version - mingw32-make --version From 89786ff7fd396b3fbe37823222bb4a591f19c6da Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 11:22:46 -0500 Subject: [PATCH 048/467] appveyor: include the SDL header in depend step: --- appveyor.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index c1e5e1082..5bac1b656 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -22,6 +22,7 @@ install: #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\sdl2.pc") before_build: +- set CPPFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 - set SDL_CFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -Dmain=SDL_main - set SDL_LDFLAGS=-L%TMP%\%SDL2_MOVE%\lib -lmingw32 -lSDL2main -lSDL2 -mwindows - set Path=%MINGW_SDK%\bin;%Path% @@ -36,5 +37,5 @@ build_script: on_finish: #- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: -- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From f0842d2200a91d9d1744df70a27da9c4089d2fe6 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 11:33:36 -0500 Subject: [PATCH 049/467] appveyor: add debug and sdl mixer --- appveyor.yml | 17 ++++++++++++----- src/Makefile | 8 ++++---- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 5bac1b656..848755cb4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,6 +3,7 @@ os: MinGW cache: SDL2-devel-2.0.4-mingw.tar.gz + SDL2_mixer-devel-2.0.1-mingw.tar.gz environment: CC: i686-w64-mingw32-gcc @@ -11,20 +12,26 @@ environment: SDL2_URL: http://libsdl.org/release/SDL2-devel-2.0.4-mingw.tar.gz SDL2_ARCHIVE: SDL2-devel-2.0.4-mingw.tar SDL2_MOVE: SDL2-2.0.4\i686-w64-mingw32 + SDL2_MIXER_URL=https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-2.0.1-mingw.tar.gz + SDL2_MIXER_ARCHIVE: SDL2_mixer-devel-2.0.1-mingw.tar + SDL2_MIXER_MOVE: SDL2_mixer-2.0.1/i686-w64-mingw32 install: - if not exist "%SDL2_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%.gz" +- if not exist "%SDL2_MIXER_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_MIXER_URL%" -FileName "%SDL2_MIXER_ARCHIVE%.gz" - 7z x -y "%SDL2_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null +- 7z x -y "%SDL2_MIXER_ARCHIVE%.gz" -o%TMP% >null +- 7z x -y "%TMP%\%SSDL2_MIXER_ARCHIVE%" -o%TMP% >null #- robocopy /S /xx /ns /nc /nfl /ndl /np %TMP%\%SDL2_MOVE% %MINGW_SDK% || exit 0 #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\bin\sdl2-config")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\bin\sdl2-config") #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake") #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\sdl2.pc") before_build: -- set CPPFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -- set SDL_CFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -Dmain=SDL_main -- set SDL_LDFLAGS=-L%TMP%\%SDL2_MOVE%\lib -lmingw32 -lSDL2main -lSDL2 -mwindows +- set CPPFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -I%TMP%\%SDL2_MIXER_MOVE%\include\SDL2 +- set SDL_CFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -Dmain=SDL_main -I%TMP%\%SDL2_MIXER_MOVE%\include\SDL2 +- set SDL_LDFLAGS=-L%TMP%\%SDL2_MOVE%\lib -lmingw32 -lSDL2main -lSDL2 -mwindows -L%TMP%\%SDL2_MIXER_MOVE%\lib - set Path=%MINGW_SDK%\bin;%Path% - i686-w64-mingw32-gcc --version - mingw32-make --version @@ -32,8 +39,8 @@ before_build: build_script: #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 DEBUGMODE=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOMIXER=1 -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOMIXER=1 DEBUGMODE=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 on_finish: #- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: diff --git a/src/Makefile b/src/Makefile index d4cc64a4b..8474a7e87 100644 --- a/src/Makefile +++ b/src/Makefile @@ -703,13 +703,13 @@ $(OBJDIR)/depend.dep: @echo "Creating dependency file, depend.dep" @echo > comptime.h -$(MKDIR) $(OBJDIR) - $(CC) $(CFLAGS) -MM *.c > $(OBJDIR)/depend.ped - $(CC) $(CFLAGS) -MM $(INTERFACE)/*.c >> $(OBJDIR)/depend.ped + $(CC) $(CPPFLAGS) $(CFLAGS) -MM *.c > $(OBJDIR)/depend.ped + $(CC) $(CPPFLAGS) $(CFLAGS) -MM $(INTERFACE)/*.c >> $(OBJDIR)/depend.ped ifndef NOHW - $(CC) $(CFLAGS) -MM hardware/*.c >> $(OBJDIR)/depend.ped + $(CC) $(CPPFLAGS) $(CFLAGS) -MM hardware/*.c >> $(OBJDIR)/depend.ped endif ifndef NO_LUA - $(CC) $(CFLAGS) -MM blua/*.c >> $(OBJDIR)/depend.ped + $(CC) $(CPPFLAGS) $(CFLAGS) -MM blua/*.c >> $(OBJDIR)/depend.ped endif @sed -e 's,\(.*\)\.o: ,$(subst /,\/,$(OBJDIR))\/&,g' < $(OBJDIR)/depend.ped > $(OBJDIR)/depend.dep $(REMOVE) $(OBJDIR)/depend.ped From 50846880a61e4f6392bb4444bbf00fa9a1cd6497 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 11:34:19 -0500 Subject: [PATCH 050/467] appveyor: not = for envs --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 848755cb4..f55741afe 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,7 +12,7 @@ environment: SDL2_URL: http://libsdl.org/release/SDL2-devel-2.0.4-mingw.tar.gz SDL2_ARCHIVE: SDL2-devel-2.0.4-mingw.tar SDL2_MOVE: SDL2-2.0.4\i686-w64-mingw32 - SDL2_MIXER_URL=https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-2.0.1-mingw.tar.gz + SDL2_MIXER_URL: https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-2.0.1-mingw.tar.gz SDL2_MIXER_ARCHIVE: SDL2_mixer-devel-2.0.1-mingw.tar SDL2_MIXER_MOVE: SDL2_mixer-2.0.1/i686-w64-mingw32 From 4230225a0c570b239c4f128940f3d53e49987cfa Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 11:36:51 -0500 Subject: [PATCH 051/467] appveor: SDL, not SSDL --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index f55741afe..81f27df45 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -22,7 +22,7 @@ install: - 7z x -y "%SDL2_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null - 7z x -y "%SDL2_MIXER_ARCHIVE%.gz" -o%TMP% >null -- 7z x -y "%TMP%\%SSDL2_MIXER_ARCHIVE%" -o%TMP% >null +- 7z x -y "%TMP%\%SDL2_MIXER_ARCHIVE%" -o%TMP% >null #- robocopy /S /xx /ns /nc /nfl /ndl /np %TMP%\%SDL2_MOVE% %MINGW_SDK% || exit 0 #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\bin\sdl2-config")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\bin\sdl2-config") #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake") From 7a09a82489c1e8c292ef456cbfb83c1e6d362c63 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 11:41:02 -0500 Subject: [PATCH 052/467] new flags: DEPFLAGS, to tell the depend step where are the headers --- appveyor.yml | 2 +- src/Makefile | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 81f27df45..f7af70272 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -29,7 +29,7 @@ install: #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\sdl2.pc") before_build: -- set CPPFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -I%TMP%\%SDL2_MIXER_MOVE%\include\SDL2 +- set DEPFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -I%TMP%\%SDL2_MIXER_MOVE%\include\SDL2 - set SDL_CFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -Dmain=SDL_main -I%TMP%\%SDL2_MIXER_MOVE%\include\SDL2 - set SDL_LDFLAGS=-L%TMP%\%SDL2_MOVE%\lib -lmingw32 -lSDL2main -lSDL2 -mwindows -L%TMP%\%SDL2_MIXER_MOVE%\lib - set Path=%MINGW_SDK%\bin;%Path% diff --git a/src/Makefile b/src/Makefile index 8474a7e87..2c1de64d5 100644 --- a/src/Makefile +++ b/src/Makefile @@ -703,13 +703,13 @@ $(OBJDIR)/depend.dep: @echo "Creating dependency file, depend.dep" @echo > comptime.h -$(MKDIR) $(OBJDIR) - $(CC) $(CPPFLAGS) $(CFLAGS) -MM *.c > $(OBJDIR)/depend.ped - $(CC) $(CPPFLAGS) $(CFLAGS) -MM $(INTERFACE)/*.c >> $(OBJDIR)/depend.ped + $(CC) $(DEPFLAGS) $(CFLAGS) -MM *.c > $(OBJDIR)/depend.ped + $(CC) $(DEPFLAGS) $(CFLAGS) -MM $(INTERFACE)/*.c >> $(OBJDIR)/depend.ped ifndef NOHW - $(CC) $(CPPFLAGS) $(CFLAGS) -MM hardware/*.c >> $(OBJDIR)/depend.ped + $(CC) $(DEPFLAGS) $(CFLAGS) -MM hardware/*.c >> $(OBJDIR)/depend.ped endif ifndef NO_LUA - $(CC) $(CPPFLAGS) $(CFLAGS) -MM blua/*.c >> $(OBJDIR)/depend.ped + $(CC) $(DEPFLAGS) $(CFLAGS) -MM blua/*.c >> $(OBJDIR)/depend.ped endif @sed -e 's,\(.*\)\.o: ,$(subst /,\/,$(OBJDIR))\/&,g' < $(OBJDIR)/depend.ped > $(OBJDIR)/depend.dep $(REMOVE) $(OBJDIR)/depend.ped From 2176b21e62f0fd82ada5f4fb4d5e7afbea749b89 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 11:49:23 -0500 Subject: [PATCH 053/467] ignore noreturns --- src/Makefile.cfg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Makefile.cfg b/src/Makefile.cfg index d6af0d8a7..0e38a05c0 100644 --- a/src/Makefile.cfg +++ b/src/Makefile.cfg @@ -159,6 +159,9 @@ ifndef MINGW ifdef GCC45 WFLAGS+=-Wunsuffixed-float-constants endif +ifdef GCC46 +WFLAGS+=-Wno-suggest-attribute=noreturn +endif endif ifdef NOLDWARNING LDFLAGS+=-Wl,--as-needed @@ -171,6 +174,7 @@ ifdef GCC43 endif WFLAGS+=$(OLDWFLAGS) + #indicate platform and what interface use with ifndef WINCE ifndef XBOX From d762c4023ed4b1b1127c0960313c03c61c54b201 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 11:52:33 -0500 Subject: [PATCH 054/467] appveyor: show us all the commands --- appveyor.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index f7af70272..9f37a5f12 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -37,10 +37,10 @@ before_build: - mingw32-make --version build_script: -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 DEBUGMODE=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 ECHO=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 DEBUGMODE=1 ECHO=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ECHO=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 ECHO=1 on_finish: #- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: From 3c35ed60d3d9310077c3ebbde9e1595f025d7bb3 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 12:03:56 -0500 Subject: [PATCH 055/467] appveyor: fixup cache list --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 9f37a5f12..eb2db8b86 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,8 +2,8 @@ version: 2.1.14.{branch}-{build} os: MinGW cache: - SDL2-devel-2.0.4-mingw.tar.gz - SDL2_mixer-devel-2.0.1-mingw.tar.gz +- SDL2-devel-2.0.4-mingw.tar.gz +- SDL2_mixer-devel-2.0.1-mingw.tar.gz environment: CC: i686-w64-mingw32-gcc From 7fdb5cfcfb045e6bfc2c3e4421adcdeca589bc82 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 12:06:00 -0500 Subject: [PATCH 056/467] move disabled warning out of mingw --- src/Makefile.cfg | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Makefile.cfg b/src/Makefile.cfg index 0e38a05c0..fa8896a7c 100644 --- a/src/Makefile.cfg +++ b/src/Makefile.cfg @@ -155,13 +155,14 @@ WFLAGS+=-Wformat-security ifndef GCC29 #WFLAGS+=-Winit-self endif +ifdef GCC46 +WFLAGS+=-Wno-suggest-attribute=noreturn +endif + ifndef MINGW ifdef GCC45 WFLAGS+=-Wunsuffixed-float-constants endif -ifdef GCC46 -WFLAGS+=-Wno-suggest-attribute=noreturn -endif endif ifdef NOLDWARNING LDFLAGS+=-Wl,--as-needed From 10e1aaaf856c40282d646d04c3b9d3c61cd91b26 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 12:08:08 -0500 Subject: [PATCH 057/467] appveyor: no need for DEPFLAGS --- appveyor.yml | 1 - src/Makefile | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index eb2db8b86..51411d45e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -29,7 +29,6 @@ install: #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\sdl2.pc") before_build: -- set DEPFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -I%TMP%\%SDL2_MIXER_MOVE%\include\SDL2 - set SDL_CFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -Dmain=SDL_main -I%TMP%\%SDL2_MIXER_MOVE%\include\SDL2 - set SDL_LDFLAGS=-L%TMP%\%SDL2_MOVE%\lib -lmingw32 -lSDL2main -lSDL2 -mwindows -L%TMP%\%SDL2_MIXER_MOVE%\lib - set Path=%MINGW_SDK%\bin;%Path% diff --git a/src/Makefile b/src/Makefile index 2c1de64d5..d4cc64a4b 100644 --- a/src/Makefile +++ b/src/Makefile @@ -703,13 +703,13 @@ $(OBJDIR)/depend.dep: @echo "Creating dependency file, depend.dep" @echo > comptime.h -$(MKDIR) $(OBJDIR) - $(CC) $(DEPFLAGS) $(CFLAGS) -MM *.c > $(OBJDIR)/depend.ped - $(CC) $(DEPFLAGS) $(CFLAGS) -MM $(INTERFACE)/*.c >> $(OBJDIR)/depend.ped + $(CC) $(CFLAGS) -MM *.c > $(OBJDIR)/depend.ped + $(CC) $(CFLAGS) -MM $(INTERFACE)/*.c >> $(OBJDIR)/depend.ped ifndef NOHW - $(CC) $(DEPFLAGS) $(CFLAGS) -MM hardware/*.c >> $(OBJDIR)/depend.ped + $(CC) $(CFLAGS) -MM hardware/*.c >> $(OBJDIR)/depend.ped endif ifndef NO_LUA - $(CC) $(DEPFLAGS) $(CFLAGS) -MM blua/*.c >> $(OBJDIR)/depend.ped + $(CC) $(CFLAGS) -MM blua/*.c >> $(OBJDIR)/depend.ped endif @sed -e 's,\(.*\)\.o: ,$(subst /,\/,$(OBJDIR))\/&,g' < $(OBJDIR)/depend.ped > $(OBJDIR)/depend.dep $(REMOVE) $(OBJDIR)/depend.ped From 4d0e1a8a1c76dfb9aeb9fd7817de3d0bf190540a Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 12:12:04 -0500 Subject: [PATCH 058/467] appveyor: do not echo the full command --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 51411d45e..f58a242d5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -38,8 +38,8 @@ before_build: build_script: #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 ECHO=1 #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 DEBUGMODE=1 ECHO=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ECHO=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 ECHO=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 on_finish: #- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: From 67b6d618a48e40082e40d04b12fdfa84710f79d1 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 12:15:42 -0500 Subject: [PATCH 059/467] appveyor: build with/without the mixer and with/without OpenGL --- appveyor.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index f58a242d5..a9dae4fb4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,10 +36,23 @@ before_build: - mingw32-make --version build_script: -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 ECHO=1 -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 DEBUGMODE=1 ECHO=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOMIXER=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 NOMIXER=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 clean +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 clean +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 clean +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 clean +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 NOMIXER=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 NOMIXER=1 + on_finish: #- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: From 0d327c7c16a0d4a8521911d4a16f10dfd2d00a6a Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 21:15:51 -0500 Subject: [PATCH 060/467] kill logical-not-parentheses warning in g_game.c g_game.c: In function 'G_CheckDemoStatus': g_game.c:5588:22: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses] if (!modeattacking == ATTACKING_RECORD) ^ --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index c59f23c07..de3b26f0a 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -5585,7 +5585,7 @@ boolean G_CheckDemoStatus(void) free(demobuffer); demorecording = false; - if (!modeattacking == ATTACKING_RECORD) + if (modeattacking != ATTACKING_RECORD) { if (saved) CONS_Printf(M_GetText("Demo %s recorded\n"), demoname); From 050ce857c439bf0726de978e43a2dce2496f3d0e Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 21:31:18 -0500 Subject: [PATCH 061/467] let not care for main() being noreturn --- src/sdl/i_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sdl/i_main.c b/src/sdl/i_main.c index 976f7eb35..489ee4c06 100644 --- a/src/sdl/i_main.c +++ b/src/sdl/i_main.c @@ -240,8 +240,8 @@ int main(int argc, char **argv) #endif // return to OS -#ifndef __GNUC__ +//#ifndef __GNUC__ return 0; -#endif +//#endif } #endif From c47ff7b3c6f22710e1478d789bd9399b6026690a Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 28 Jan 2016 21:37:41 -0500 Subject: [PATCH 062/467] let make the main() entry point noreturns --- src/sdl/i_main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sdl/i_main.c b/src/sdl/i_main.c index 489ee4c06..d3f94f13d 100644 --- a/src/sdl/i_main.c +++ b/src/sdl/i_main.c @@ -141,8 +141,10 @@ void XBoxStartup() myargv = NULL; #else #ifdef FORCESDLMAIN +FUNCNORETURN int SDL_main(int argc, char **argv) #else +FUNCNORETURN int main(int argc, char **argv) #endif { @@ -240,8 +242,8 @@ int main(int argc, char **argv) #endif // return to OS -//#ifndef __GNUC__ +#ifndef __GNUC__ return 0; -//#endif +#endif } #endif From e8cf4cdaac49f81adc420cf25e1db0a8ec4ef556 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 00:33:11 -0500 Subject: [PATCH 063/467] SDL2: compile SDL with SDL_main for Win32 --- src/sdl/i_main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sdl/i_main.c b/src/sdl/i_main.c index d3f94f13d..c157a6be7 100644 --- a/src/sdl/i_main.c +++ b/src/sdl/i_main.c @@ -55,6 +55,10 @@ PSP_MAIN_THREAD_STACK_SIZE_KB(256); #include "i_ttf.h" #endif +#if defined (_WIN32) && !defined (main) +#define SDLMAIN +#endif + #ifdef SDLMAIN #include "SDL_main.h" #elif defined(FORCESDLMAIN) @@ -132,7 +136,6 @@ static inline VOID MakeCodeWritable(VOID) \return int */ -FUNCNORETURN #if defined (_XBOX) && defined (__GNUC__) void XBoxStartup() { From b5af756c22e2c74daead4fb81c18bfb0a1be1f95 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 00:53:34 -0500 Subject: [PATCH 064/467] appveyor: let stop build the whole mess --- appveyor.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index a9dae4fb4..b589bc209 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,22 +36,22 @@ before_build: - mingw32-make --version build_script: -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ECHO=1 clean +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOMIXER=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 NOMIXER=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 NOMIXER=1 -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 NOMIXER=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOMIXER=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 NOMIXER=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 clean +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 clean +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 clean +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 clean +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 NOMIXER=1 +#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 NOMIXER=1 on_finish: From 0728bc6de28771014d815e95b3bbe3d82a1d5f60 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 00:58:40 -0500 Subject: [PATCH 065/467] appveyor: errormode for all --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index b589bc209..43275c8b4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,9 +36,9 @@ before_build: - mingw32-make --version build_script: -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ECHO=1 clean +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ECHO=1 cleandep >nul|| exit 0 #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean From c7503b35b83bb9daa63758161d8b63ffffcb2462 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 01:05:41 -0500 Subject: [PATCH 066/467] appveyor: need to see what the depend step is not working --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 43275c8b4..41f5fb3d1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,7 +36,7 @@ before_build: - mingw32-make --version build_script: -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ECHO=1 cleandep >nul|| exit 0 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ECHO=1 clean #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 From 13866a5b7ec0b2a02126aff7fa48643d092dcbc7 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 01:23:26 -0500 Subject: [PATCH 067/467] appveyor: fixup SDL2_MIXER_MOVE --- appveyor.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 41f5fb3d1..cd09e2c84 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,7 +14,7 @@ environment: SDL2_MOVE: SDL2-2.0.4\i686-w64-mingw32 SDL2_MIXER_URL: https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-2.0.1-mingw.tar.gz SDL2_MIXER_ARCHIVE: SDL2_mixer-devel-2.0.1-mingw.tar - SDL2_MIXER_MOVE: SDL2_mixer-2.0.1/i686-w64-mingw32 + SDL2_MIXER_MOVE: SDL2_mixer-2.0.1\i686-w64-mingw32 install: - if not exist "%SDL2_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%.gz" @@ -23,6 +23,7 @@ install: - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null - 7z x -y "%SDL2_MIXER_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_MIXER_ARCHIVE%" -o%TMP% >null + #- robocopy /S /xx /ns /nc /nfl /ndl /np %TMP%\%SDL2_MOVE% %MINGW_SDK% || exit 0 #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\bin\sdl2-config")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\bin\sdl2-config") #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake") From f30dae216274e82efddc4151f930a169697e7a52 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 01:33:37 -0500 Subject: [PATCH 068/467] appveyor: need a copy of sed --- appveyor.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index cd09e2c84..054dc0cc6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,15 +23,15 @@ install: - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null - 7z x -y "%SDL2_MIXER_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_MIXER_ARCHIVE%" -o%TMP% >null - -#- robocopy /S /xx /ns /nc /nfl /ndl /np %TMP%\%SDL2_MOVE% %MINGW_SDK% || exit 0 +#- robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs %TMP%\%SDL2_MOVE% %MINGW_SDK% | exit 0 +#- robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs %TMP%\%SDL2_MIXER_MOVE% %MINGW_SDK% || exit 0 #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\bin\sdl2-config")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\bin\sdl2-config") #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake") #- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\sdl2.pc") before_build: -- set SDL_CFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -Dmain=SDL_main -I%TMP%\%SDL2_MIXER_MOVE%\include\SDL2 -- set SDL_LDFLAGS=-L%TMP%\%SDL2_MOVE%\lib -lmingw32 -lSDL2main -lSDL2 -mwindows -L%TMP%\%SDL2_MIXER_MOVE%\lib +#- set SDL_CFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -Dmain=SDL_main -I%TMP%\%SDL2_MIXER_MOVE%\include\SDL2 +#- set SDL_LDFLAGS=-L%TMP%\%SDL2_MOVE%\lib -lmingw32 -lSDL2main -lSDL2 -mwindows -L%TMP%\%SDL2_MIXER_MOVE%\lib - set Path=%MINGW_SDK%\bin;%Path% - i686-w64-mingw32-gcc --version - mingw32-make --version @@ -57,5 +57,5 @@ build_script: on_finish: #- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: -#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From ca34268a13e9a3157a2f0159923c1274067bf2dd Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 01:52:55 -0500 Subject: [PATCH 069/467] appveyor: let instal the SDL2 and SDL2_mixer to the Mingw toolchain --- appveyor.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 054dc0cc6..9f46a8b2d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,15 +23,15 @@ install: - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null - 7z x -y "%SDL2_MIXER_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_MIXER_ARCHIVE%" -o%TMP% >null -#- robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs %TMP%\%SDL2_MOVE% %MINGW_SDK% | exit 0 -#- robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs %TMP%\%SDL2_MIXER_MOVE% %MINGW_SDK% || exit 0 -#- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\bin\sdl2-config")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\bin\sdl2-config") -#- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake") -#- ps: (Get-Content [System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc")) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%") } | Set-Content [System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\sdl2.pc") +- robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs %TMP%\%SDL2_MOVE% %MINGW_SDK% || exit 0 +- robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs %TMP%\%SDL2_MIXER_MOVE% %MINGW_SDK% || exit 0 +- ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\bin\sdl2-config"))) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\bin\sdl2-config")) +- ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake"))) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake")) +- ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc"))) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\sdl2.pc")) +- ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MIXER_MOVE%\lib\pkgconfig\SDL2_mixer.pc")))| ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\SDL2_mixer.pc")) before_build: -#- set SDL_CFLAGS=-I%TMP%\%SDL2_MOVE%\include\SDL2 -Dmain=SDL_main -I%TMP%\%SDL2_MIXER_MOVE%\include\SDL2 -#- set SDL_LDFLAGS=-L%TMP%\%SDL2_MOVE%\lib -lmingw32 -lSDL2main -lSDL2 -mwindows -L%TMP%\%SDL2_MIXER_MOVE%\lib +- set SDL_PKGCONFIG=sdl2.pc - set Path=%MINGW_SDK%\bin;%Path% - i686-w64-mingw32-gcc --version - mingw32-make --version @@ -57,5 +57,5 @@ build_script: on_finish: #- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: -- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 0e483fc17b09dfca77941e41d248cd96b9ea910d Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 01:55:39 -0500 Subject: [PATCH 070/467] appveyor: or not? --- appveyor.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 9f46a8b2d..d3747af94 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -31,7 +31,7 @@ install: - ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MIXER_MOVE%\lib\pkgconfig\SDL2_mixer.pc")))| ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\SDL2_mixer.pc")) before_build: -- set SDL_PKGCONFIG=sdl2.pc +- set SDL_PKGCONFIG=%MINGW_SDK%\lib\pkgconfig\sdl2.pc - set Path=%MINGW_SDK%\bin;%Path% - i686-w64-mingw32-gcc --version - mingw32-make --version @@ -57,5 +57,4 @@ build_script: on_finish: #- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: -#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) - +- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 62702edebe4e42105f066c542b348076538a2e4b Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 01:57:57 -0500 Subject: [PATCH 071/467] appveyor: I hope I do not need to debug this build xml again --- appveyor.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index d3747af94..858794439 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -18,16 +18,17 @@ environment: install: - if not exist "%SDL2_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%.gz" -- if not exist "%SDL2_MIXER_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_MIXER_URL%" -FileName "%SDL2_MIXER_ARCHIVE%.gz" - 7z x -y "%SDL2_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null -- 7z x -y "%SDL2_MIXER_ARCHIVE%.gz" -o%TMP% >null -- 7z x -y "%TMP%\%SDL2_MIXER_ARCHIVE%" -o%TMP% >null - robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs %TMP%\%SDL2_MOVE% %MINGW_SDK% || exit 0 -- robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs %TMP%\%SDL2_MIXER_MOVE% %MINGW_SDK% || exit 0 - ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\bin\sdl2-config"))) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\bin\sdl2-config")) - ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake"))) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake")) - ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc"))) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\sdl2.pc")) + +- if not exist "%SDL2_MIXER_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_MIXER_URL%" -FileName "%SDL2_MIXER_ARCHIVE%.gz" +- 7z x -y "%SDL2_MIXER_ARCHIVE%.gz" -o%TMP% >null +- 7z x -y "%TMP%\%SDL2_MIXER_ARCHIVE%" -o%TMP% >null +- robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs %TMP%\%SDL2_MIXER_MOVE% %MINGW_SDK% || exit 0 - ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MIXER_MOVE%\lib\pkgconfig\SDL2_mixer.pc")))| ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\SDL2_mixer.pc")) before_build: @@ -37,7 +38,7 @@ before_build: - mingw32-make --version build_script: -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ECHO=1 clean +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 #- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 @@ -57,4 +58,4 @@ build_script: on_finish: #- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:: -- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) From 94d36fbe5bf017663d048504661f2bba0e0f817c Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 02:07:36 -0500 Subject: [PATCH 072/467] apveyor: no debug dump --- appveyor.yml | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 858794439..cfc9edf32 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -39,21 +39,7 @@ before_build: build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 clean -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOMIXER=1 -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 DEBUGMODE=1 NOMIXER=1 -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 clean -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 clean -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 clean -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 clean -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 NOMIXER=1 -#- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOHW=1 DEBUGMODE=1 NOMIXER=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOOBJDUMP=1 ERRORMODE=1 on_finish: From d7925104b95a196aa14a6b1e7c3218fd4a87bb55 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 11:09:46 -0500 Subject: [PATCH 073/467] appveyor: push build to FTP server --- appveyor.yml | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index cfc9edf32..74add4148 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,10 +1,6 @@ version: 2.1.14.{branch}-{build} os: MinGW -cache: -- SDL2-devel-2.0.4-mingw.tar.gz -- SDL2_mixer-devel-2.0.1-mingw.tar.gz - environment: CC: i686-w64-mingw32-gcc WINDRES: windres @@ -16,7 +12,12 @@ environment: SDL2_MIXER_ARCHIVE: SDL2_mixer-devel-2.0.1-mingw.tar SDL2_MIXER_MOVE: SDL2_mixer-2.0.1\i686-w64-mingw32 +cache: +- SDL2-devel-2.0.4-mingw.tar.gz +- SDL2_mixer-devel-2.0.1-mingw.tar.gz + install: +#Download SDL2 - if not exist "%SDL2_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_URL%" -FileName "%SDL2_ARCHIVE%.gz" - 7z x -y "%SDL2_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_ARCHIVE%" -o%TMP% >null @@ -24,7 +25,7 @@ install: - ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\bin\sdl2-config"))) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\bin\sdl2-config")) - ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\cmake\SDL2\sdl2-config.cmake"))) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\cmake\SDL2\sdl2-config.cmake")) - ps: (Get-Content ([System.Environment]::ExpandEnvironmentVariables("%TMP%\%SDL2_MOVE%\lib\pkgconfig\sdl2.pc"))) | ForEach-Object { $_ -replace "/usr/local/cross-tools/i686-w64-mingw32", ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%")) } | Set-Content ([System.Environment]::ExpandEnvironmentVariables("%MINGW_SDK%\lib\pkgconfig\sdl2.pc")) - +#Download SDL2_Mixer - if not exist "%SDL2_MIXER_ARCHIVE%.gz" appveyor DownloadFile "%SDL2_MIXER_URL%" -FileName "%SDL2_MIXER_ARCHIVE%.gz" - 7z x -y "%SDL2_MIXER_ARCHIVE%.gz" -o%TMP% >null - 7z x -y "%TMP%\%SDL2_MIXER_ARCHIVE%" -o%TMP% >null @@ -39,7 +40,25 @@ before_build: build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 NOOBJDUMP=1 ERRORMODE=1 +- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 + +test: off + +artifacts: + - path: bin\Mingw\$(configuration) + +deploy: + - provider: FTP + protocol: ftps + host: + secure: NsLJEPIBvmwCOj8Tg8RoRQ== + username: + secure: z/r81kkL3Mm6wxjuN0sW1w== + password: + secure: Hbn6Uy3lT0YZ88yFJ3aW4w== + folder: + application: + active_mode: false on_finish: From 4b8167d823ed180af310d3db05e0733fe5a200cb Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 11:27:33 -0500 Subject: [PATCH 074/467] appveyor: let push a 7z in the after build step --- appveyor.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 74add4148..ad0ca9e13 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -42,10 +42,11 @@ build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 -test: off +after_build: +- cmd: 7z a Build.7z -w bin\Mingw\Release +- appveyor PushArtifact Build.7z -artifacts: - - path: bin\Mingw\$(configuration) +test: off deploy: - provider: FTP From 5582d715d49e340512b19ce5fcfba4e8496820cf Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 11:39:16 -0500 Subject: [PATCH 075/467] appveyor: let have the build bot have the right username --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index ad0ca9e13..a26082484 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -54,7 +54,7 @@ deploy: host: secure: NsLJEPIBvmwCOj8Tg8RoRQ== username: - secure: z/r81kkL3Mm6wxjuN0sW1w== + secure: ejxi5mvk7oLYu7QtbYojajEPigMy0mokaKhuEVuDZcA= password: secure: Hbn6Uy3lT0YZ88yFJ3aW4w== folder: From ba1cb80ff7b610bcb5c12ae34f1eefad2d8d13da Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 11:42:40 -0500 Subject: [PATCH 076/467] appveyor: name each 7z by version" --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index a26082484..09ea7cec6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,8 +43,8 @@ build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 after_build: -- cmd: 7z a Build.7z -w bin\Mingw\Release -- appveyor PushArtifact Build.7z +- cmd: 7z a $(appveyor_build_version).7z bin\Mingw\Release -x!.gitignore +- appveyor PushArtifact $(appveyor_build_version).7z test: off From 343c8a949857bb20d5cffb7f012688dae374cced Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 11:55:00 -0500 Subject: [PATCH 077/467] appveyor: or not, let try this naming --- appveyor.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 09ea7cec6..7105a64bc 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,8 +43,8 @@ build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 after_build: -- cmd: 7z a $(appveyor_build_version).7z bin\Mingw\Release -x!.gitignore -- appveyor PushArtifact $(appveyor_build_version).7z +- cmd: 7z a Build-{build}.7z bin\Mingw\Release -x!.gitignore +- appveyor PushArtifact Build-{build}.7z test: off @@ -57,7 +57,7 @@ deploy: secure: ejxi5mvk7oLYu7QtbYojajEPigMy0mokaKhuEVuDZcA= password: secure: Hbn6Uy3lT0YZ88yFJ3aW4w== - folder: + folder: {branch} application: active_mode: false From 38952028612041228141f511c75489de012ba04a Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 12:00:05 -0500 Subject: [PATCH 078/467] appveyor: let include the commit id --- appveyor.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 7105a64bc..2f35afadc 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,8 +43,8 @@ build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 after_build: -- cmd: 7z a Build-{build}.7z bin\Mingw\Release -x!.gitignore -- appveyor PushArtifact Build-{build}.7z +- cmd: 7z a %APPVEYOR_REPO_BRANCH%-%APPVEYOR_REPO_COMMIT%.7z bin\Mingw\Release -x!.gitignore +- appveyor PushArtifact %APPVEYOR_REPO_BRANCH%-%APPVEYOR_REPO_COMMIT%.7z test: off @@ -57,7 +57,7 @@ deploy: secure: ejxi5mvk7oLYu7QtbYojajEPigMy0mokaKhuEVuDZcA= password: secure: Hbn6Uy3lT0YZ88yFJ3aW4w== - folder: {branch} + folder: appveyor application: active_mode: false From 01f2f4d444f0276e9c62991dd24e962043e2de31 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 12:08:41 -0500 Subject: [PATCH 079/467] appveyor: move naming of 7z to env block --- appveyor.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 2f35afadc..581c628fb 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,6 +11,7 @@ environment: SDL2_MIXER_URL: https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-2.0.1-mingw.tar.gz SDL2_MIXER_ARCHIVE: SDL2_mixer-devel-2.0.1-mingw.tar SDL2_MIXER_MOVE: SDL2_mixer-2.0.1\i686-w64-mingw32 + BUILD_ARCHIVE: %APPVEYOR_REPO_BRANCH%-%APPVEYOR_REPO_COMMIT%.7z cache: - SDL2-devel-2.0.4-mingw.tar.gz @@ -43,8 +44,8 @@ build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 after_build: -- cmd: 7z a %APPVEYOR_REPO_BRANCH%-%APPVEYOR_REPO_COMMIT%.7z bin\Mingw\Release -x!.gitignore -- appveyor PushArtifact %APPVEYOR_REPO_BRANCH%-%APPVEYOR_REPO_COMMIT%.7z +- cmd: 7z a %BUILD_ARCHIVE% bin\Mingw\Release -x!.gitignore +- appveyor PushArtifact %BUILD_ARCHIVE% test: off From b3ee8591f2e3afd6a67594706207eddca1066ada Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 12:36:48 -0500 Subject: [PATCH 080/467] appveyor: ok, let set the var in after build step --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 581c628fb..bd695fdea 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,7 +11,6 @@ environment: SDL2_MIXER_URL: https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-2.0.1-mingw.tar.gz SDL2_MIXER_ARCHIVE: SDL2_mixer-devel-2.0.1-mingw.tar SDL2_MIXER_MOVE: SDL2_mixer-2.0.1\i686-w64-mingw32 - BUILD_ARCHIVE: %APPVEYOR_REPO_BRANCH%-%APPVEYOR_REPO_COMMIT%.7z cache: - SDL2-devel-2.0.4-mingw.tar.gz @@ -44,6 +43,7 @@ build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 after_build: +- set BUILD_ARCHIVE=%APPVEYOR_REPO_BRANCH%-%APPVEYOR_REPO_COMMIT%.7 - cmd: 7z a %BUILD_ARCHIVE% bin\Mingw\Release -x!.gitignore - appveyor PushArtifact %BUILD_ARCHIVE% From 0f83c2aeb521f1d2fc0cffe289d14c49379535f1 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 12:53:39 -0500 Subject: [PATCH 081/467] appveyor: 7z, not 7 --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index bd695fdea..adc57d483 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,7 +43,7 @@ build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 after_build: -- set BUILD_ARCHIVE=%APPVEYOR_REPO_BRANCH%-%APPVEYOR_REPO_COMMIT%.7 +- set BUILD_ARCHIVE=%APPVEYOR_REPO_BRANCH%-%APPVEYOR_REPO_COMMIT%.7z - cmd: 7z a %BUILD_ARCHIVE% bin\Mingw\Release -x!.gitignore - appveyor PushArtifact %BUILD_ARCHIVE% From deca16f923a0cd801c32b59e1d977906e66ad876 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 29 Jan 2016 18:38:41 -0500 Subject: [PATCH 082/467] appveyor: let use short commits --- appveyor.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index adc57d483..70f186667 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,8 +43,10 @@ build_script: - cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 after_build: -- set BUILD_ARCHIVE=%APPVEYOR_REPO_BRANCH%-%APPVEYOR_REPO_COMMIT%.7z -- cmd: 7z a %BUILD_ARCHIVE% bin\Mingw\Release -x!.gitignore +- cmd: git rev-parse --short %APPVEYOR_REPO_COMMIT%>%TMP%/gitshort.txt +- cmd: set /P GITSHORT=<%TMP%/gitshort.txt +- set BUILD_ARCHIVE=%APPVEYOR_REPO_BRANCH%-%GITSHORT%.7z +- cmd: 7z a %BUILD_ARCHIVE% bin\Mingw\Release -xr!.gitignore - appveyor PushArtifact %BUILD_ARCHIVE% test: off From f50098669278de89d00198916a16717e53117f3d Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Fri, 29 Jan 2016 16:01:05 -0800 Subject: [PATCH 083/467] use RGB for screen texture, not RGBA the screen texture does not need an alpha channel. the fact that it had one made OGL copy the topmost pixel of the screen texture's alpha channel. which, naturally results in the screen becoming partially transparent and letting you see the working texture in the background. --- src/hardware/r_opengl/r_opengl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 76543e259..a407a9e45 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -2364,7 +2364,7 @@ EXPORT void HWRAPI(MakeScreenTexture) (void) Clamp2D(GL_TEXTURE_WRAP_S); Clamp2D(GL_TEXTURE_WRAP_T); #ifndef KOS_GL_COMPATIBILITY - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, texsize, texsize, 0); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); #endif tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now @@ -2392,7 +2392,7 @@ EXPORT void HWRAPI(MakeScreenFinalTexture) (void) Clamp2D(GL_TEXTURE_WRAP_S); Clamp2D(GL_TEXTURE_WRAP_T); #ifndef KOS_GL_COMPATIBILITY - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, texsize, texsize, 0); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); #endif tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now From cd198d6809d171ac242b0bfe7db768a04e135003 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 30 Jan 2016 17:19:05 +0000 Subject: [PATCH 084/467] merge SOC_****, MAINCFG and OBJCTCFG searches into one big search for any of them This makes it so that it doesn't matter what order you place SOC lumps within a WAD... relative to other SOC lumps at least, anyway --- src/w_wad.c | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/src/w_wad.c b/src/w_wad.c index 39bde4bb1..dc994e848 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -150,31 +150,21 @@ static inline void W_LoadDehackedLumps(UINT16 wadnum) { lumpinfo_t *lump_p = wadfiles[wadnum]->lumpinfo; for (lump = 0; lump < wadfiles[wadnum]->numlumps; lump++, lump_p++) - if (memcmp(lump_p->name,"SOC_",4)==0) + if (memcmp(lump_p->name,"SOC_",4)==0) // Check for generic SOC lump { CONS_Printf(M_GetText("Loading SOC from %s\n"), wadfiles[wadnum]->filename); DEH_LoadDehackedLumpPwad(wadnum, lump); } - } - - // Check for MAINCFG - for (lump = 0;lump != INT16_MAX;lump++) - { - lump = W_CheckNumForNamePwad("MAINCFG", wadnum, lump); - if (lump == INT16_MAX) - break; - CONS_Printf(M_GetText("Loading main config from %s\n"), wadfiles[wadnum]->filename); - DEH_LoadDehackedLumpPwad(wadnum, lump); - } - - // Check for OBJCTCFG - for (lump = 0;lump < INT16_MAX;lump++) - { - lump = W_CheckNumForNamePwad("OBJCTCFG", wadnum, lump); - if (lump == INT16_MAX) - break; - CONS_Printf(M_GetText("Loading object config from %s\n"), wadfiles[wadnum]->filename); - DEH_LoadDehackedLumpPwad(wadnum, lump); + else if (memcmp(lump_p->name,"MAINCFG",8)==0) // Check for MAINCFG + { + CONS_Printf(M_GetText("Loading main config from %s\n"), wadfiles[wadnum]->filename); + DEH_LoadDehackedLumpPwad(wadnum, lump); + } + else if (memcmp(lump_p->name,"OBJCTCFG",8)==0) // Check for OBJCTCFG + { + CONS_Printf(M_GetText("Loading object config from %s\n"), wadfiles[wadnum]->filename); + DEH_LoadDehackedLumpPwad(wadnum, lump); + } } #ifdef SCANTHINGS From 8b56cd76c747e8fb2b708755d39a302d95ad7ec6 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 31 Jan 2016 15:08:16 +0000 Subject: [PATCH 085/467] doomtype.h tweaks some of the mess in here really bothers me (cherry-picking this commit of mine from next since it only fixes a small oversight with compiling and adds a comment) --- src/doomtype.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/doomtype.h b/src/doomtype.h index ff4199775..8e7da6881 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -100,11 +100,13 @@ typedef long ssize_t; #if defined (_MSC_VER) || defined (__OS2__) // Microsoft VisualC++ +#ifdef _MSC_VER #if (_MSC_VER <= 1800) // MSVC 2013 and back #define snprintf _snprintf #if (_MSC_VER <= 1200) // MSVC 2012 and back #define vsnprintf _vsnprintf #endif +#endif #endif #define strncasecmp strnicmp #define strcasecmp stricmp @@ -177,6 +179,8 @@ size_t strlcpy(char *dst, const char *src, size_t siz); // not the number of bytes in the buffer. #define STRBUFCPY(dst,src) strlcpy(dst, src, sizeof dst) +// \note __BYTEBOOL__ used to be set above if "macintosh" was defined, +// if macintosh's version of boolean type isn't needed anymore, then isn't this macro pointless now? #ifndef __BYTEBOOL__ #define __BYTEBOOL__ @@ -193,7 +197,6 @@ size_t strlcpy(char *dst, const char *src, size_t siz); #else typedef enum {false, true} boolean; #endif - //#endif // __cplusplus #endif // __BYTEBOOL__ /* 7.18.2.1 Limits of exact-width integer types */ From 9e29b69a290841205c75680c4cc92e2fe670272b Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 31 Jan 2016 16:49:04 +0000 Subject: [PATCH 086/467] Remove unused "firstnewseg" variable --- src/r_bsp.c | 1 - src/r_bsp.h | 1 - src/r_segs.c | 2 -- 3 files changed, 4 deletions(-) diff --git a/src/r_bsp.c b/src/r_bsp.c index e967e28ce..acb0630c3 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -31,7 +31,6 @@ sector_t *backsector; // 896 drawsegs! So too bad here's a limit removal a-la-Boom drawseg_t *drawsegs = NULL; drawseg_t *ds_p = NULL; -drawseg_t *firstnewseg = NULL; // indicates doors closed wrt automap bugfix: INT32 doorclosed; diff --git a/src/r_bsp.h b/src/r_bsp.h index 20a80d89a..14b11ea77 100644 --- a/src/r_bsp.h +++ b/src/r_bsp.h @@ -30,7 +30,6 @@ extern INT32 checkcoord[12][4]; extern drawseg_t *drawsegs; extern drawseg_t *ds_p; -extern drawseg_t *firstnewseg; extern INT32 doorclosed; typedef void (*drawfunc_t)(INT32 start, INT32 stop); diff --git a/src/r_segs.c b/src/r_segs.c index 7467f5324..3171bced6 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1407,13 +1407,11 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (ds_p == drawsegs+maxdrawsegs) { size_t pos = ds_p - drawsegs; - size_t pos2 = firstnewseg - drawsegs; size_t newmax = maxdrawsegs ? maxdrawsegs*2 : 128; if (firstseg) firstseg = (drawseg_t *)(firstseg - drawsegs); drawsegs = Z_Realloc(drawsegs, newmax*sizeof (*drawsegs), PU_STATIC, NULL); ds_p = drawsegs + pos; - firstnewseg = drawsegs + pos2; maxdrawsegs = newmax; if (firstseg) firstseg = drawsegs + (size_t)firstseg; From deb958a79632840fba16ee1fc590ba9164210d5f Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 31 Jan 2016 17:06:03 +0000 Subject: [PATCH 087/467] Remove unused "INVERSECOLORMAP" macro --- src/p_user.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 6844d2cba..d527c29c9 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -51,9 +51,6 @@ #include "hardware/hw_main.h" #endif -// Index of the special effects (INVUL inverse) map. -#define INVERSECOLORMAP 32 - #if 0 static void P_NukeAllPlayers(player_t *player); #endif From 2d94b2a85fd3def4d70140f068f898a9981a132b Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 31 Jan 2016 17:10:57 +0000 Subject: [PATCH 088/467] keys.h doesn't need to be included twice here lol --- src/g_input.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/g_input.c b/src/g_input.c index f12ddb711..fd6354b26 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -16,7 +16,6 @@ #include "g_input.h" #include "keys.h" #include "hu_stuff.h" // need HUFONT start & end -#include "keys.h" #include "d_net.h" #include "console.h" From 2e58f6c4d9728569b8e66ac04444fc225fe4ec3a Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 23 Jan 2016 19:58:57 +0000 Subject: [PATCH 089/467] Fixed that odd bug where PolyObjects sometimes leave a vertex or two in their control sectors Turns out the seg-searching code falsely assumed it'd find frontfacing segs first, who knew? --- src/p_polyobj.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/p_polyobj.c b/src/p_polyobj.c index f790fa768..23e7092be 100644 --- a/src/p_polyobj.c +++ b/src/p_polyobj.c @@ -427,6 +427,8 @@ newseg: // seg's ending vertex. for (i = 0; i < numsegs; ++i) { + if (segs[i].side != 0) // needs to be frontfacing + continue; if (segs[i].v1->x == seg->v2->x && segs[i].v1->y == seg->v2->y) { // Make sure you didn't already add this seg... @@ -593,6 +595,9 @@ static void Polyobj_spawnPolyObj(INT32 num, mobj_t *spawnSpot, INT32 id) seg_t *seg = &segs[i]; INT32 polyID, parentID; + if (seg->side != 0) // needs to be frontfacing + continue; + if (seg->linedef->special != POLYOBJ_START_LINE) continue; From dafe0ccd11b321546dbf5728d510c98f51db2ce0 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 31 Jan 2016 21:53:14 +0000 Subject: [PATCH 090/467] Added v.width(), v.height() and v.renderer() to Lua's drawer/video library --- src/lua_hudlib.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index 5a83d95b5..fa15b9be7 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -16,7 +16,9 @@ #include "r_local.h" #include "st_stuff.h" // hudinfo[] #include "g_game.h" +#include "i_video.h" // rendermode #include "p_local.h" // camera_t +#include "screen.h" // screen width/height #include "v_video.h" #include "w_wad.h" #include "z_zone.h" @@ -510,6 +512,30 @@ static int libd_getColormap(lua_State *L) return 1; } +static int libd_width(lua_State *L) +{ + HUDONLY + lua_pushinteger(L, vid.width); // push screen width + return 1; +} + +static int libd_height(lua_State *L) +{ + HUDONLY + lua_pushinteger(L, vid.height); // push screen height + return 1; +} + +static int libd_renderer(lua_State *L) +{ + HUDONLY + if (rendermode == render_opengl) // OpenGL renderer + lua_pushliteral(L, "opengl"); + else // Software renderer + lua_pushliteral(L, "software"); + return 1; +} + static luaL_Reg lib_draw[] = { {"patchExists", libd_patchExists}, {"cachePatch", libd_cachePatch}, @@ -521,6 +547,9 @@ static luaL_Reg lib_draw[] = { {"drawString", libd_drawString}, {"stringWidth", libd_stringWidth}, {"getColormap", libd_getColormap}, + {"width", libd_width}, + {"height", libd_height}, + {"renderer", libd_renderer}, {NULL, NULL} }; From 04528eb3e64e931588e33c48d58a2c3201875e00 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 31 Jan 2016 22:15:17 +0000 Subject: [PATCH 091/467] MonsterIestyn: what about render_none? --- src/lua_hudlib.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index fa15b9be7..0ba7b3d25 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -529,10 +529,11 @@ static int libd_height(lua_State *L) static int libd_renderer(lua_State *L) { HUDONLY - if (rendermode == render_opengl) // OpenGL renderer - lua_pushliteral(L, "opengl"); - else // Software renderer - lua_pushliteral(L, "software"); + switch (rendermode) { + case render_opengl: lua_pushliteral(L, "opengl"); break; // OpenGL renderer + case render_soft: lua_pushliteral(L, "software"); break; // Software renderer + default: lua_pushliteral(L, "none"); break; // render_none (for dedicated), in case there's any reason this should be run + } return 1; } From d1b89c9320f98cfe2bf514fe7dbd1890c4f21403 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 31 Jan 2016 22:52:02 +0000 Subject: [PATCH 092/467] Quick fix for another drawer lib function while I'm here, cough --- src/lua_hudlib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index 0ba7b3d25..325f00b01 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -488,7 +488,7 @@ static int libd_getColormap(lua_State *L) INT32 skinnum = TC_DEFAULT; skincolors_t color = luaL_optinteger(L, 2, 0); UINT8* colormap = NULL; - //HUDSAFE + HUDONLY if (lua_isnoneornil(L, 1)) ; // defaults to TC_DEFAULT else if (lua_type(L, 1) == LUA_TNUMBER) // skin number From 937c8f936b3dadd94568e2c4d496a5516c4695e2 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Sun, 31 Jan 2016 20:15:10 -0500 Subject: [PATCH 093/467] appveyor: updated to GCC 5.3 --- appveyor.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 70f186667..1ce41a817 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -37,10 +37,11 @@ before_build: - set Path=%MINGW_SDK%\bin;%Path% - i686-w64-mingw32-gcc --version - mingw32-make --version +- set SRB2_MFLAGS="-C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC53=1" build_script: -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 clean -- cmd: mingw32-make.exe -C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC52=1 SDL=1 ERRORMODE=1 +- cmd: mingw32-make.exe %SRB2_MFLAGS% SDL=1 clean +- cmd: mingw32-make.exe %SRB2_MFLAGS% SDL=1 ERRORMODE=1 after_build: - cmd: git rev-parse --short %APPVEYOR_REPO_COMMIT%>%TMP%/gitshort.txt From 2b41a40076492cb31962ca8b4b2de4fa3edf446f Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Sun, 31 Jan 2016 20:25:32 -0500 Subject: [PATCH 094/467] appveyor: no quote? --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 1ce41a817..4edcd7a7f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -37,7 +37,7 @@ before_build: - set Path=%MINGW_SDK%\bin;%Path% - i686-w64-mingw32-gcc --version - mingw32-make --version -- set SRB2_MFLAGS="-C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC53=1" +- set SRB2_MFLAGS=-C src MINGW=1 WARNINGMODE=1 NOASM=1 NOUPX=1 GCC53=1 build_script: - cmd: mingw32-make.exe %SRB2_MFLAGS% SDL=1 clean From 0455b572dc456331ad9bd397664773966f412d52 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Thu, 28 Jan 2016 18:06:20 +0000 Subject: [PATCH 095/467] Removed weird test for water planes in HWR_Subsector It crashes when you try to test it anyway, lol --- src/hardware/hw_main.c | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index db812c0df..b0186049a 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -2856,7 +2856,6 @@ static void HWR_AddPolyObjectPlanes(void) // : Draw one or more line segments. // Notes : Sets gr_cursectorlight to the light of the parent sector, to modulate wall textures // -----------------+ -static lumpnum_t doomwaterflat; //set by R_InitFlats hack static void HWR_Subsector(size_t num) { INT16 count; @@ -2867,7 +2866,6 @@ static void HWR_Subsector(size_t num) INT32 ceilinglightlevel; INT32 locFloorHeight, locCeilingHeight; INT32 light = 0; - fixed_t wh; extracolormap_t *floorcolormap; extracolormap_t *ceilingcolormap; @@ -3193,26 +3191,6 @@ static void HWR_Subsector(size_t num) } } -//20/08/99: Changed by Hurdler (taken from faB's code) -#ifdef DOPLANES - // -------------------- WATER IN DEV. TEST ------------------------ - //dck hack : use abs(tag) for waterheight - //ilag : Since we changed to UINT16 for sector tags, simulate INT16 - if (gr_frontsector->tag > 32767) - { - wh = ((65535-gr_frontsector->tag) < gr_frontsector->floorheight && - wh < gr_frontsector->ceilingheight) - { - HWR_GetFlat(doomwaterflat); - HWR_RenderPlane(gr_frontsector, - &extrasubsectors[num], wh, PF_Translucent, - gr_frontsector->lightlevel, doomwaterflat, - NULL, 255, false, gr_frontsector->lightlist[light].extra_colormap); - } - } - // -------------------- WATER IN DEV. TEST ------------------------ -#endif sub->validcount = validcount; } @@ -5513,11 +5491,6 @@ void HWR_Startup(void) HWR_AddEngineCommands(); HWR_InitTextureCache(); - // for test water translucent surface - doomwaterflat = W_CheckNumForName("FWATER1"); - if (doomwaterflat == LUMPERROR) // if FWATER1 not found (in doom shareware) - doomwaterflat = W_GetNumForName("WATER0"); - HWR_InitMD2(); #ifdef ALAM_LIGHTING From 9973bedd5f3711773b5b5f2e276e400893398b99 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Fri, 5 Feb 2016 16:38:33 +0000 Subject: [PATCH 096/467] Free the memory of all clipping arrays for each portal properly Not the actual fix I'm intending to make with this branch, but it's needed anyway --- src/r_main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/r_main.c b/src/r_main.c index a4e72cba9..ccaa14b8e 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1360,6 +1360,9 @@ void R_RenderPlayerView(player_t *player) // okay done. free it. portalcullsector = NULL; // Just in case... portal_base = portal->next; + Z_Free(portal->ceilingclip); + Z_Free(portal->floorclip); + Z_Free(portal->frontscale); Z_Free(portal); } // END PORTAL RENDERING From 662d40511d56fe1514524547376a86647bc2c0a5 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 18:02:36 -0500 Subject: [PATCH 097/467] travis: let start building with travis --- .travis.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..e69de29bb From 69937b41d25decffa67850ec5ff82881e44d0898 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 18:39:06 -0500 Subject: [PATCH 098/467] travis: simple build config --- .travis.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/.travis.yml b/.travis.yml index e69de29bb..a1052d7db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -0,0 +1,25 @@ +language: c + +os: + - linux + #- osx + +compiler: + - gcc + - clang + +addons: + apt: + packages: + - libsdl-mixer2-dev + - libpng-dev + - libglu1-dev + +before_install: + - $(CC) --version + - cmake --version + +before_script: + - mkdir build + - cd build + - cmake .. From 0003cea547eb9f47e81c1c236c0ab82acd05b597 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 18:43:18 -0500 Subject: [PATCH 099/467] travis-ci: we need sudo --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index a1052d7db..b1cd1f401 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: c +sudo: required + os: - linux #- osx From 14440675608a10518293d080deca55a2ab0e78b0 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 18:50:02 -0500 Subject: [PATCH 100/467] travis: use the correct packages --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b1cd1f401..f25a67cc5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,12 +13,11 @@ compiler: addons: apt: packages: - - libsdl-mixer2-dev + - libsdl2-mixer-dev - libpng-dev - - libglu1-dev + - ibgl1-mesa-dev before_install: - - $(CC) --version - cmake --version before_script: From 522d2049de962411e29d171fe29987f7ed40804b Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 19:08:02 -0500 Subject: [PATCH 101/467] travis: add cmake 3.x package --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index f25a67cc5..f8052143f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,11 @@ compiler: addons: apt: + sources: + - george-edison55-precise-backports packages: + - cmake + - cmake-data - libsdl2-mixer-dev - libpng-dev - ibgl1-mesa-dev From 45b181f889fe750b3c84772e2b93368d8f79cc66 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 19:26:59 -0500 Subject: [PATCH 102/467] travis: switch to trusty for linux os --- .travis.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f8052143f..4711df7d4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,10 @@ language: c -sudo: required +matrix: + include: + - os: linux + dist: trusty + sudo: required os: - linux @@ -19,7 +23,7 @@ addons: - cmake-data - libsdl2-mixer-dev - libpng-dev - - ibgl1-mesa-dev + - libgl1-mesa-dev before_install: - cmake --version From 0bd16a5a0c6cdbfc011f098ea609f95038b09657 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 19:30:03 -0500 Subject: [PATCH 103/467] travis: drop osx --- .travis.yml | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4711df7d4..524c44720 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,5 @@ -language: c - -matrix: - include: - - os: linux - dist: trusty - sudo: required - -os: - - linux - #- osx +sudo: required +dist: trusty compiler: - gcc From 5e5c73fe18a8a30c97b9b54e0f3119dae18d3a6b Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 20:50:35 -0500 Subject: [PATCH 104/467] travis: add SRB2 2.1.14 files --- .travis.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 524c44720..6ce5cb083 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,19 +7,25 @@ compiler: addons: apt: - sources: - - george-edison55-precise-backports packages: - - cmake - - cmake-data - libsdl2-mixer-dev - libpng-dev - libgl1-mesa-dev + - p7zip before_install: - cmake --version before_script: + - curl http://rosenthalcastle.org/srb2/SRB2-v2114-Installer.exe -o cache/SRB2-v2114-Installer.exe + - 7z x cache/SRB2-v2114-Installer.exe -o assets - mkdir build - cd build - cmake .. + +install: false + +cache: + - ccache + directories: + - cache From a743f155ac62663d333f8a3ddfee3af0e943885b Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 21:00:46 -0500 Subject: [PATCH 105/467] travis: addd libgme to list --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6ce5cb083..e077597ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ addons: - libsdl2-mixer-dev - libpng-dev - libgl1-mesa-dev + - libgme-dev - p7zip before_install: From b6cc13fd2e8955a248985061b11901a3b70c5edd Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 21:07:46 -0500 Subject: [PATCH 106/467] travis: drop test --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e077597ee..cf3a03f7c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,8 +24,6 @@ before_script: - cd build - cmake .. -install: false - cache: - ccache directories: From 152c106cbda0db3fa9381a643539e568ba1e882e Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 21:09:14 -0500 Subject: [PATCH 107/467] travis: restore language --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index cf3a03f7c..ab5cdea9a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ +language: c + sudo: required dist: trusty @@ -24,6 +26,8 @@ before_script: - cd build - cmake .. +install: false + cache: - ccache directories: From 59d111b17d443b3be5cc4bc8534cf4b327b930e8 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 21:11:00 -0500 Subject: [PATCH 108/467] travis: restore missing config? --- .travis.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index ab5cdea9a..8feb76d79 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,9 +26,3 @@ before_script: - cd build - cmake .. -install: false - -cache: - - ccache - directories: - - cache From e913ca0ca6ea332177a83aa4af8f14ab54e16690 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 21:15:32 -0500 Subject: [PATCH 109/467] travis: use wget and create cache folder --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8feb76d79..987565745 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,13 +14,14 @@ addons: - libpng-dev - libgl1-mesa-dev - libgme-dev - - p7zip + - p7zip-full before_install: - cmake --version before_script: - - curl http://rosenthalcastle.org/srb2/SRB2-v2114-Installer.exe -o cache/SRB2-v2114-Installer.exe + - make cache + - wget http://rosenthalcastle.org/srb2/SRB2-v2114-Installer.exe -c -O cache/SRB2-v2114-Installer.exe - 7z x cache/SRB2-v2114-Installer.exe -o assets - mkdir build - cd build From ae75e3ee61922527f778adde2b6650e64e11212e Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 21:21:28 -0500 Subject: [PATCH 110/467] travis: mkdir , not make and cache the cccahe --- .travis.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 987565745..fdcb52477 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,10 +20,14 @@ before_install: - cmake --version before_script: - - make cache + - mkdir cache - wget http://rosenthalcastle.org/srb2/SRB2-v2114-Installer.exe -c -O cache/SRB2-v2114-Installer.exe - 7z x cache/SRB2-v2114-Installer.exe -o assets - mkdir build - cd build - cmake .. +cache: + directories: + - $HOME/.ccache + - cache From a979e37586e083ac987e9ecfcdfa36b525ac9340 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 21:28:19 -0500 Subject: [PATCH 111/467] travis: no space on 7z command --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fdcb52477..264429170 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,7 @@ before_install: before_script: - mkdir cache - wget http://rosenthalcastle.org/srb2/SRB2-v2114-Installer.exe -c -O cache/SRB2-v2114-Installer.exe - - 7z x cache/SRB2-v2114-Installer.exe -o assets + - 7z x cache/SRB2-v2114-Installer.exe -oassets - mkdir build - cd build - cmake .. From 4d5f16330acbd98d17dbaf21a146be2ebe5f9691 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 21:33:00 -0500 Subject: [PATCH 112/467] travis: just run make --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 264429170..896b7a786 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,6 +27,8 @@ before_script: - cd build - cmake .. +script: make + cache: directories: - $HOME/.ccache From 864baeda050c9f8650b2e0b0fe27c831aad24529 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 21:49:24 -0500 Subject: [PATCH 113/467] cmake: fixed up to handle Clang and AppleClang --- src/CMakeLists.txt | 6 +++--- src/sdl/CMakeLists.txt | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6859e27c3..3405e85d4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -166,7 +166,7 @@ set(SRB2_CORE_GAME_SOURCES p_tick.h ) -if(NOT CLANG) +if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) set(SRB2_CORE_SOURCES ${SRB2_CORE_SOURCES} string.c) endif() @@ -404,7 +404,7 @@ endif() # Compatibility flag with later versions of GCC # We should really fix our code to not need this -if(NOT CLANG AND NOT MSVC) +if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -mno-ms-bitfields) endif() @@ -429,4 +429,4 @@ endif() if(NOT ${SRB2_SDL2_AVAILABLE} AND NOT ${SRB2_WIN32_AVAILABLE}) message(FATAL_ERROR "There are no targets available to build an SRB2 executable. :(") -endif() \ No newline at end of file +endif() diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index b3fa5390c..eb832797e 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -117,7 +117,7 @@ if(${SDL2_FOUND}) add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32 ${SRB2_SDL2_TOTAL_SOURCES}) set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME ${SRB2_SDL2_EXE_NAME}) - if(CLANG) + if((CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")) add_framework(CoreFoundation SRB2SDL2) add_framework(SDL2 SRB2SDL2) add_framework(SDL2_mixer SRB2SDL2) @@ -224,7 +224,7 @@ if(${SDL2_FOUND}) endif() #### Installation #### - if (CLANG) + if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") install(TARGETS SRB2SDL2 BUNDLE DESTINATION . ) @@ -265,7 +265,7 @@ if(${SDL2_FOUND}) # Mac bundle fixup - if(CLANG) + if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") install(CODE " include(BundleUtilities) fixup_bundle(\"${CMAKE_INSTALL_PREFIX}/Sonic Robo Blast 2.app\" @@ -279,4 +279,4 @@ if(${SDL2_FOUND}) else() message(WARNING "SDL2 was not found, so the SDL2 target will not be available.") set(SRB2_SDL2_AVAILABLE NO PARENT_SCOPE) -endif() \ No newline at end of file +endif() From f4886657c1e4cbbe29b472c4a088ec71e3ade6d7 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 22:12:12 -0500 Subject: [PATCH 114/467] clang: fixup a few clang warnings --- src/info.c | 2 +- src/m_menu.c | 2 +- src/p_enemy.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/info.c b/src/info.c index fb30258c3..17384086a 100644 --- a/src/info.c +++ b/src/info.c @@ -4225,7 +4225,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = MT_GOOP, // painchance sfx_dmpain, // painsound S_EGGMOBILE2_PAIN2, // meleestate - MT_EGGMOBILE2_POGO, // missilestate + (mobjtype_t)MT_EGGMOBILE2_POGO, // missilestate S_EGGMOBILE2_DIE1, // deathstate S_EGGMOBILE2_FLEE1,// xdeathstate sfx_cybdth, // deathsound diff --git a/src/m_menu.c b/src/m_menu.c index c7a9fcc16..1e7745535 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -6071,7 +6071,7 @@ static void M_RoomMenu(INT32 choice) for (i = 0; room_list[i].header.buffer[0]; i++) { - if(room_list[i].name != '\0') + if(*room_list[i].name != '\0') { MP_RoomMenu[i+1].text = room_list[i].name; roomIds[i] = room_list[i].id; diff --git a/src/p_enemy.c b/src/p_enemy.c index 18a4ec5ff..6ac4e8968 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -6352,7 +6352,7 @@ void A_Boss2PogoTarget(mobj_t *actor) if (actor->info->missilestate) // spawn the pogo stick collision box { - mobj_t *pogo = P_SpawnMobj(actor->x, actor->y, actor->z - mobjinfo[actor->info->missilestate].height, actor->info->missilestate); + mobj_t *pogo = P_SpawnMobj(actor->x, actor->y, actor->z - mobjinfo[actor->info->missilestate].height, (mobjtype_t)actor->info->missilestate); pogo->target = actor; } From 68054a49e344af2e4854da344408c8daf08f675f Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 22:32:14 -0500 Subject: [PATCH 115/467] clang: cleanup --- src/f_finale.c | 2 +- src/info.c | 2 +- src/m_misc.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index f541995d4..466e208a5 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -603,7 +603,7 @@ static void F_IntroDrawScene(void) if (finalecount-84 < 58) { // Pure Fat is driving up! int ftime = (finalecount-84); - x = (-189<lvlttl) + if (gamestate == GS_LEVEL && mapheaderinfo[gamemap-1]->lvlttl[0] != '\0') snprintf(lvlttltext, 48, "%s%s%s", mapheaderinfo[gamemap-1]->lvlttl, (mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE", From 07fc74eaf50ce8ce47e0b48bc522f5ab0a3c4639 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 22:38:40 -0500 Subject: [PATCH 116/467] clang: fixup a few clang warnings --- CMakeLists.txt | 3 --- src/CMakeLists.txt | 4 ++++ src/b_bot.c | 2 +- src/p_map.c | 4 ++-- src/p_user.c | 4 ++-- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0fb5cb28f..8deeb37e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,10 +80,7 @@ endif() if(${CMAKE_SYSTEM} MATCHES "Darwin") add_definitions(-DMACOSX) - if(${CMAKE_C_COMPILER_ID} MATCHES "Clang") - set(CLANG ON) endif() -endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3405e85d4..d9e25dbb8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -408,6 +408,10 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -mno-ms-bitfields) endif() +if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -Wno-absolute-value) +endif() + add_definitions(-DCMAKECONFIG) #add_library(SRB2Core STATIC diff --git a/src/b_bot.c b/src/b_bot.c index 5e62e58e6..3072b1d75 100644 --- a/src/b_bot.c +++ b/src/b_bot.c @@ -49,7 +49,7 @@ static inline void B_BuildTailsTiccmd(mobj_t *sonic, mobj_t *tails, ticcmd_t *cm if (sonic->player->pflags & (PF_MACESPIN|PF_ITEMHANG)) { cmd->forwardmove = sonic->player->cmd.forwardmove; - cmd->angleturn = abs(tails->angle - sonic->angle)>>16; + cmd->angleturn = abs((tails->angle - sonic->angle))>>16; if (sonic->angle < tails->angle) cmd->angleturn = -cmd->angleturn; } else if (dist > FixedMul(512*FRACUNIT, tails->scale)) diff --git a/src/p_map.c b/src/p_map.c index 62cbf7b77..1aa8bc391 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2507,8 +2507,8 @@ isblocking: climbangle += (ANGLE_90 * (whichside ? -1 : 1)); - if (((!slidemo->player->climbing && abs(slidemo->angle - ANGLE_90 - climbline) < ANGLE_45) - || (slidemo->player->climbing == 1 && abs(slidemo->angle - climbline) < ANGLE_135)) + if (((!slidemo->player->climbing && abs((slidemo->angle - ANGLE_90 - climbline)) < ANGLE_45) + || (slidemo->player->climbing == 1 && abs((slidemo->angle - climbline)) < ANGLE_135)) && P_IsClimbingValid(slidemo->player, climbangle)) { slidemo->angle = climbangle; diff --git a/src/p_user.c b/src/p_user.c index 6844d2cba..dacef733b 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7902,9 +7902,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (player == &players[consoleplayer]) { if (focusangle >= localangle) - localangle += abs(focusangle - localangle)>>5; + localangle += abs((focusangle - localangle))>>5; else - localangle -= abs(focusangle - localangle)>>5; + localangle -= abs((focusangle - localangle))>>5; } } else if (P_AnalogMove(player)) // Analog From 7c1f1d9c8e52b80500221ec8e0cf28b55a8abb16 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 22:54:50 -0500 Subject: [PATCH 117/467] travis: compile with warnings as errors, skip absolute-value warnings --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 896b7a786..dfc1aef89 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,9 @@ language: c sudo: required dist: trusty +env: +- CFLAGS=-Wno-absolute-value -Werror + compiler: - gcc - clang From 6d26a60cbefc20b53cc0daf65181ac998cd27582 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 23:19:38 -0500 Subject: [PATCH 118/467] travis: cache 7z SFX --- .travis.yml | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index dfc1aef89..7a9c7c372 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ language: c - sudo: required dist: trusty @@ -10,6 +9,10 @@ compiler: - gcc - clang +cache: + directories: + - $HOME/srb2_cache + addons: apt: packages: @@ -19,20 +22,12 @@ addons: - libgme-dev - p7zip-full -before_install: - - cmake --version - before_script: - mkdir cache - - wget http://rosenthalcastle.org/srb2/SRB2-v2114-Installer.exe -c -O cache/SRB2-v2114-Installer.exe - - 7z x cache/SRB2-v2114-Installer.exe -oassets + - wget http://rosenthalcastle.org/srb2/SRB2-v2114-Installer.exe -c -O $HOME/srb2_cache/SRB2-v2114-Installer.exe + - 7z x $HOME/srb2_cache/SRB2-v2114-Installer.exe -oassets - mkdir build - cd build - cmake .. script: make - -cache: - directories: - - $HOME/.ccache - - cache From e9048aec4845c9e2d7c30cf93977c38ecf629ada Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 5 Feb 2016 23:22:06 -0500 Subject: [PATCH 119/467] travis: premake the cache folder --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7a9c7c372..c6a3ce799 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ addons: - p7zip-full before_script: - - mkdir cache + - mkdir $HOME/srb2_cache - wget http://rosenthalcastle.org/srb2/SRB2-v2114-Installer.exe -c -O $HOME/srb2_cache/SRB2-v2114-Installer.exe - 7z x $HOME/srb2_cache/SRB2-v2114-Installer.exe -oassets - mkdir build From bac39b1bc037d4075ee0c0fc687f2980f6d223ee Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Sat, 6 Feb 2016 12:31:37 -0500 Subject: [PATCH 120/467] debian: untested update for Debian packages --- {bin/Resources => assets}/debian/README.Debian | 0 {bin/Resources => assets}/debian/README.source | 0 {bin/Resources => assets}/debian/changelog | 6 ++++++ {bin/Resources => assets}/debian/compat | 0 {bin/Resources => assets}/debian/control | 0 {bin/Resources => assets}/debian/copyright | 0 {bin/Resources => assets}/debian/rules | 4 ++-- {bin/Resources => assets}/debian/source/format | 0 debian/control | 14 ++++++++++---- debian/rules | 2 +- 10 files changed, 19 insertions(+), 7 deletions(-) rename {bin/Resources => assets}/debian/README.Debian (100%) rename {bin/Resources => assets}/debian/README.source (100%) rename {bin/Resources => assets}/debian/changelog (51%) rename {bin/Resources => assets}/debian/compat (100%) rename {bin/Resources => assets}/debian/control (100%) rename {bin/Resources => assets}/debian/copyright (100%) rename {bin/Resources => assets}/debian/rules (95%) rename {bin/Resources => assets}/debian/source/format (100%) diff --git a/bin/Resources/debian/README.Debian b/assets/debian/README.Debian similarity index 100% rename from bin/Resources/debian/README.Debian rename to assets/debian/README.Debian diff --git a/bin/Resources/debian/README.source b/assets/debian/README.source similarity index 100% rename from bin/Resources/debian/README.source rename to assets/debian/README.source diff --git a/bin/Resources/debian/changelog b/assets/debian/changelog similarity index 51% rename from bin/Resources/debian/changelog rename to assets/debian/changelog index 0c514d4d2..05c29fffe 100644 --- a/bin/Resources/debian/changelog +++ b/assets/debian/changelog @@ -1,3 +1,9 @@ +srb2-data (2.1.14~1) unstable; urgency=low + + * Updated for SRB2 v2.1.14 + + -- Alam Arias Sat, 06 Feb 2016 11:00:00 +0500 + srb2-data (2.0.6-2) maverick; urgency=high * Initial proper release.. diff --git a/bin/Resources/debian/compat b/assets/debian/compat similarity index 100% rename from bin/Resources/debian/compat rename to assets/debian/compat diff --git a/bin/Resources/debian/control b/assets/debian/control similarity index 100% rename from bin/Resources/debian/control rename to assets/debian/control diff --git a/bin/Resources/debian/copyright b/assets/debian/copyright similarity index 100% rename from bin/Resources/debian/copyright rename to assets/debian/copyright diff --git a/bin/Resources/debian/rules b/assets/debian/rules similarity index 95% rename from bin/Resources/debian/rules rename to assets/debian/rules index 514d8e07c..d86f92af2 100755 --- a/bin/Resources/debian/rules +++ b/assets/debian/rules @@ -37,7 +37,7 @@ RM := rm -rf DIR := $(shell pwd) PACKAGE := $(shell cat $(DIR)/debian/control | grep 'Package:' | sed -e 's/Package: //g') -DATAFILES := drill.dta music.dta soar.dta zones.dta player.dta rings.wpn srb2.wad +DATAFILES := srb2.srb zones.dta player.dta rings.dta music.dta DATADIR := usr/games/SRB2 RESOURCEDIR := . @@ -48,7 +48,7 @@ build: # This will need to be updated every time SRB2 official version is # Copy data files to their install locations, and add data files to include-binaries for file in $(DATAFILES); do \ - $(WGET) http://alam.srb2.org/SRB2/2.0.6-Final/Resources/$$file; \ + $(WGET) http://alam.srb2.org/SRB2/2.1.14-Final/Resources/$$file; \ if test "$$file" = "srb2.wad"; then \ $(INSTALL) $(RESOURCEDIR)/$$file $(DIR)/debian/tmp/$(DATADIR)/srb2.srb; \ else \ diff --git a/bin/Resources/debian/source/format b/assets/debian/source/format similarity index 100% rename from bin/Resources/debian/source/format rename to assets/debian/source/format diff --git a/debian/control b/debian/control index c64a85c48..b3e95b587 100644 --- a/debian/control +++ b/debian/control @@ -4,13 +4,19 @@ Source: srb2 Section: games Priority: extra Maintainer: Callum Dickinson -Build-Depends: debhelper (>= 7.0.50~), libsdl1.2-dev (>= 1.2.7), libsdl-mixer1.2-dev (>= 1.2.7), libpng12-dev (>= 1.2.7), libglu1-dev | libglu-dev, libosmesa6-dev | libgl-dev, nasm [i386] +Build-Depends: debhelper (>= 7.0.50~), + libsdl2-dev, + libsdl2-mixer-dev, + libpng12-dev (>= 1.2.7), + libglu1-dev | libglu-dev, + libosmesa6-dev | libgl-dev, + nasm [i386] Standards-Version: 3.8.4 Homepage: http://www.srb2.org Package: srb2 Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.0.6) +Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.4) Description: A cross-platform 3D Sonic fangame Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog fangame built using a modified version of the Doom Legacy @@ -22,8 +28,8 @@ Description: A cross-platform 3D Sonic fangame Package: srb2-dbg Architecture: any -# FIXME: should be Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.0.6), srb2 but dh_shlibdeps is being an asshat -Depends: libc6, ${misc:Depends}, srb2-data (= 2.0.6), srb2 +# FIXME: should be Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.4), srb2 but dh_shlibdeps is being an asshat +Depends: libc6, ${misc:Depends}, srb2-data (= 2.1.4), srb2 Description: A cross-platform 3D Sonic fangame Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog fangame built using a modified version of the Doom Legacy diff --git a/debian/rules b/debian/rules index 33ade54c8..50572f1da 100755 --- a/debian/rules +++ b/debian/rules @@ -62,7 +62,7 @@ DBGDIR = usr/lib/debug/$(PKGDIR) PREFIX = $(shell test "$(CROSS_COMPILE_BUILD)" != "$(CROSS_COMPILE_HOST)" && echo "PREFIX=$(CROSS_COMPILE_HOST)") OS = LINUX=1 NONX86 = $(shell test "`echo $(CROSS_COMPILE_HOST) | grep 'i[3-6]86'`" || echo "NONX86=1") -MAKEARGS = $(OS) $(NONX86) $(PREFIX) EXENAME=$(EXENAME) DBGNAME=$(DBGNAME) SDL_PKGCONFIG=sdl PNG_PKGCONFIG=libpng NOOBJDUMP=1 +MAKEARGS = $(OS) $(NONX86) $(PREFIX) EXENAME=$(EXENAME) DBGNAME=$(DBGNAME) SDL_PKGCONFIG=sdl2 PNG_PKGCONFIG=libpng NOOBJDUMP=1 MENUFILE1 = ?package($(PACKAGE)):needs="X11" section="$(SECTION)" MENUFILE2 = title="$(TITLE)" command="/$(PKGDIR)/$(PACKAGE)" # FIXME pkg-config dir hacks From 166fafd71708553539c753783b924496387ba4d0 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 6 Feb 2016 18:57:26 +0000 Subject: [PATCH 121/467] Fixed div-by-zero crash relating to portals, drawsegs and midtextures Had to remove Red's scale hack in order to do so, because it utterly fails when the drawseg doesn't actually belong to the portal in the first place. --- src/r_bsp.c | 4 +++- src/r_bsp.h | 1 + src/r_defs.h | 2 ++ src/r_main.c | 11 +---------- src/r_segs.c | 5 +++++ src/r_things.c | 3 +++ 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/r_bsp.c b/src/r_bsp.c index c87d8baa7..52be9a0e3 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -26,6 +26,7 @@ side_t *sidedef; line_t *linedef; sector_t *frontsector; sector_t *backsector; +boolean portalline; // is curline a portal seg? // very ugly realloc() of drawsegs at run-time, I upped it to 512 // instead of 256.. and someone managed to send me a level with @@ -378,6 +379,7 @@ static void R_AddLine(seg_t *line) return; curline = line; + portalline = false; // OPTIMIZE: quickly reject orthogonal back sides. angle1 = R_PointToAngle(line->v1->x, line->v1->y); @@ -431,7 +433,7 @@ static void R_AddLine(seg_t *line) backsector = line->backsector; // Portal line - if (line->linedef->special == 40 && P_PointOnLineSide(viewx, viewy, line->linedef) == 0) + if (line->linedef->special == 40 && line->side == 0) { if (portalrender < cv_maxportals.value) { diff --git a/src/r_bsp.h b/src/r_bsp.h index 14b11ea77..3d0429fec 100644 --- a/src/r_bsp.h +++ b/src/r_bsp.h @@ -23,6 +23,7 @@ extern side_t *sidedef; extern line_t *linedef; extern sector_t *frontsector; extern sector_t *backsector; +extern boolean portalline; // is curline a portal seg? // drawsegs are allocated on the fly... see r_segs.c diff --git a/src/r_defs.h b/src/r_defs.h index f18410fe8..a982a598b 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -675,6 +675,8 @@ typedef struct drawseg_s INT32 numthicksides; fixed_t frontscale[MAXVIDWIDTH]; + UINT8 portalpass; // if > 0 and == portalrender, do not clip sprites + #ifdef ESLOPE fixed_t maskedtextureheight[MAXVIDWIDTH]; // For handling sloped midtextures diff --git a/src/r_main.c b/src/r_main.c index ccaa14b8e..a6b13302e 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -91,7 +91,6 @@ typedef struct portal_pair INT16 *ceilingclip; INT16 *floorclip; fixed_t *frontscale; - size_t seg; } portal_pair; portal_pair *portal_base, *portal_cap; line_t *portalclipline; @@ -1230,7 +1229,7 @@ void R_AddPortal(INT32 line1, INT32 line2, INT32 x1, INT32 x2) portal->start = x1; portal->end = x2; - portal->seg = ds_p-drawsegs; + portalline = true; // this tells R_StoreWallRange that curline is a portal seg portal->viewx = viewx; portal->viewy = viewy; @@ -1344,14 +1343,6 @@ void R_RenderPlayerView(player_t *player) validcount++; - if (portal->seg) - { - // Push the portal's old drawseg out of the way so it isn't interfering with sprite clipping. -Red - drawseg_t *seg = drawsegs+portal->seg; - seg->scale1 = 0; - seg->scale2 = 0; - } - R_RenderBSPNode((INT32)numnodes - 1); R_ClipSprites(); //R_DrawPlanes(); diff --git a/src/r_segs.c b/src/r_segs.c index 04873b29c..0106a1bac 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -2887,6 +2887,11 @@ void R_StoreWallRange(INT32 start, INT32 stop) R_RenderSegLoop(); colfunc = wallcolfunc; + if (portalline) // if curline is a portal, set portalrender for drawseg + ds_p->portalpass = portalrender+1; + else + ds_p->portalpass = 0; + // save sprite clipping info if (((ds_p->silhouette & SIL_TOP) || maskedtexture) && !ds_p->sprtopclip) { diff --git a/src/r_things.c b/src/r_things.c index 2a3f8e771..667a26e0f 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2058,6 +2058,9 @@ void R_ClipSprites(void) continue; } + if (ds->portalpass > 0 && ds->portalpass == portalrender) + continue; // is a portal + r1 = ds->x1 < spr->x1 ? spr->x1 : ds->x1; r2 = ds->x2 > spr->x2 ? spr->x2 : ds->x2; From 5d5956b650e8779a32da839170d06ff08eeb294e Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Sat, 6 Feb 2016 14:42:02 -0500 Subject: [PATCH 122/467] debian: depend on srb2-data 2.1.14, not 2.1.4 --- debian/control | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/debian/control b/debian/control index b3e95b587..63b075f17 100644 --- a/debian/control +++ b/debian/control @@ -16,7 +16,7 @@ Homepage: http://www.srb2.org Package: srb2 Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.4) +Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14) Description: A cross-platform 3D Sonic fangame Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog fangame built using a modified version of the Doom Legacy @@ -28,8 +28,8 @@ Description: A cross-platform 3D Sonic fangame Package: srb2-dbg Architecture: any -# FIXME: should be Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.4), srb2 but dh_shlibdeps is being an asshat -Depends: libc6, ${misc:Depends}, srb2-data (= 2.1.4), srb2 +# FIXME: should be Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14), srb2 but dh_shlibdeps is being an asshat +Depends: libc6, ${misc:Depends}, srb2-data (= 2.1.14), srb2 Description: A cross-platform 3D Sonic fangame Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog fangame built using a modified version of the Doom Legacy From 5c09c31584a1b7355652da288a8fe8bd726c3ba2 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Sat, 6 Feb 2016 14:56:16 -0500 Subject: [PATCH 123/467] Debian: only just make srb2 depend on srb2-data (2.1.14-1)) --- debian/control | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/debian/control b/debian/control index 63b075f17..ecc4829cf 100644 --- a/debian/control +++ b/debian/control @@ -16,7 +16,7 @@ Homepage: http://www.srb2.org Package: srb2 Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14) +Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14-1) Description: A cross-platform 3D Sonic fangame Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog fangame built using a modified version of the Doom Legacy @@ -28,8 +28,8 @@ Description: A cross-platform 3D Sonic fangame Package: srb2-dbg Architecture: any -# FIXME: should be Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14), srb2 but dh_shlibdeps is being an asshat -Depends: libc6, ${misc:Depends}, srb2-data (= 2.1.14), srb2 +# FIXME: should be Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14-1), srb2 but dh_shlibdeps is being an asshat +Depends: libc6, ${misc:Depends}, srb2-data (= 2.1.14-1), srb2 Description: A cross-platform 3D Sonic fangame Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog fangame built using a modified version of the Doom Legacy From ae2b1e8ea1ba860107d036e316011f0427ec329d Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 6 Feb 2016 21:06:52 +0000 Subject: [PATCH 124/467] Use <= instead of ==, so that sprites for second-tier portals and beyond still display thx Red for spotting this --- src/r_defs.h | 2 +- src/r_things.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/r_defs.h b/src/r_defs.h index a982a598b..107b8a83f 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -675,7 +675,7 @@ typedef struct drawseg_s INT32 numthicksides; fixed_t frontscale[MAXVIDWIDTH]; - UINT8 portalpass; // if > 0 and == portalrender, do not clip sprites + UINT8 portalpass; // if > 0 and <= portalrender, do not affect sprite clipping #ifdef ESLOPE fixed_t maskedtextureheight[MAXVIDWIDTH]; // For handling sloped midtextures diff --git a/src/r_things.c b/src/r_things.c index 667a26e0f..3767b02be 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2058,7 +2058,7 @@ void R_ClipSprites(void) continue; } - if (ds->portalpass > 0 && ds->portalpass == portalrender) + if (ds->portalpass > 0 && ds->portalpass <= portalrender) continue; // is a portal r1 = ds->x1 < spr->x1 ? spr->x1 : ds->x1; From f9d23370b6b3a763d0ed1cc41389088257aa293f Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Sat, 6 Feb 2016 17:10:55 -0500 Subject: [PATCH 125/467] debian: the data package should be native --- assets/debian/changelog | 3 ++- assets/debian/source/format | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/assets/debian/changelog b/assets/debian/changelog index 05c29fffe..f9ba9b5ed 100644 --- a/assets/debian/changelog +++ b/assets/debian/changelog @@ -2,7 +2,8 @@ srb2-data (2.1.14~1) unstable; urgency=low * Updated for SRB2 v2.1.14 - -- Alam Arias Sat, 06 Feb 2016 11:00:00 +0500 + -- Alam Arias Sat, 6 Jan 2016 11:00:00 -0500 + srb2-data (2.0.6-2) maverick; urgency=high diff --git a/assets/debian/source/format b/assets/debian/source/format index 163aaf8d8..89ae9db8f 100644 --- a/assets/debian/source/format +++ b/assets/debian/source/format @@ -1 +1 @@ -3.0 (quilt) +3.0 (native) From 5d32ccffcfa80bd70272b4a4340a868a58efb57c Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 17:25:27 -0500 Subject: [PATCH 126/467] fix pkgconfig path for Debian Jessie --- debian/rules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/rules b/debian/rules index 50572f1da..59d9a954e 100755 --- a/debian/rules +++ b/debian/rules @@ -66,9 +66,9 @@ MAKEARGS = $(OS) $(NONX86) $(PREFIX) EXENAME=$(EXENAME) DBGNAME=$(DBGNAME) SDL_P MENUFILE1 = ?package($(PACKAGE)):needs="X11" section="$(SECTION)" MENUFILE2 = title="$(TITLE)" command="/$(PKGDIR)/$(PACKAGE)" # FIXME pkg-config dir hacks -export PKG_CONFIG_LIBDIR = /usr/$(CROSS_COMPILE_HOST)/lib/pkgconfig +export PKG_CONFIG_LIBDIR = /usr/lib/$(CROSS_COMPILE_HOST)/pkgconfig BINDIR := $(DIR)/bin/Linux/Release -LDFLAGS += "-Wl,-rpath=/usr/$(CROSS_COMPILE_HOST)/lib/" +LDFLAGS += "-Wl,-rpath=/usr/lib/$(CROSS_COMPILE_HOST)" build: $(MKDIR) $(BINDIR)/debug From b6203d0412ae5a0953de91915ddc644e7d7f535f Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 17:26:09 -0500 Subject: [PATCH 127/467] Create srb2 --- debian/srb2 | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 debian/srb2 diff --git a/debian/srb2 b/debian/srb2 new file mode 100644 index 000000000..26928ee99 --- /dev/null +++ b/debian/srb2 @@ -0,0 +1,7 @@ +Name=Sonic Robo Blast 2 +Exec=srb2 +Comment=SRB2 +Icon=/usr/share/pixmaps/srb2.png +Terminal=false +Type=Application +Categories=games;application; From c8e7cffa1d31d8d393a577511597201cf8109a4d Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 17:33:27 -0500 Subject: [PATCH 128/467] try install of banner image --- debian/rules | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/rules b/debian/rules index 59d9a954e..996d19d4b 100755 --- a/debian/rules +++ b/debian/rules @@ -100,6 +100,7 @@ binary: binary-arch dh_installdocs # dh_installexamples dh_install --sourcedir=$(DIR)/debian/tmp + dh_install --sourcedir=$(DIR)/srb2.png /usr/share/pixmaps/ dh_installmenu # dh_installdebconf # dh_installlogrotate From 4f59bf53033b380d1b1a382a60dbae3cb344cbe8 Mon Sep 17 00:00:00 2001 From: ProfessorKaos64 Date: Sat, 6 Feb 2016 17:36:21 -0500 Subject: [PATCH 129/467] add artwork for BPM --- srb2.png | Bin 0 -> 156839 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 srb2.png diff --git a/srb2.png b/srb2.png new file mode 100644 index 0000000000000000000000000000000000000000..9c13eae9a5d1ca26167abfe56486e2e7a642cd6c GIT binary patch literal 156839 zcmXt;Ra9Hu7KMRQ+=>==EgoEpyHniV-QC?iNYLQ!QlPlITY=)miaXr=4|ill&UrXF zvi9C{errZ6D@vgv5gi>pFGK~F+{uOPrdJ~O+GZ6IH8CUR2ZP#^!j3cAZu zA$t&=q_th4ppdctdqYEI=YECkgm;rskbwXF2?2)!yU*F(vJHFrm(}54JBR?;1e$Kq;T|F=t z5NomqHjC~cdw6`V1W za=3e*&%;`D#m>3{z}SpTnc6%WlD1RtKBHvK6&g4?3`pj9tRrpqvAUXFVWEC5LdGJV zq#%FeY{nl^b1a=xS@BCwF3dHBdDZL!MsDZociVdVzTtD|t;4=1HOy(D z-`^4H8T;Nn2H!oxmJjttNGkt)Mw3ZvYT?_Njb^wa8@OWZ4;Wq_haxZNhR@vI`mP0I z-1jV-A26b4TJgu}RvoAJ%;lv8ttBGzT#F8@rHc=BxEYy{Nsmn&(VdnTpG2iWhiFMs zW7>tQ6|!{)EsC(-#TH<+kcH}XupkC{$>wdcLX$H?6l*yQm(dh z?%xieIvAcS=b)|jV7cz9<_T!pZQ;+`9_jh42sjIaR}|N_(Z&D@9fvMf9U;rvTT@96 zfIep?MNn0fPw_}Wrt9t)eLd`(hA5`Y`U@KX`LhjbK0miF%1erCBKN8uDiFl-2j1x% z%$33P?^Di`n8a(yKue~MR>IKko;ebAjD*j5aqG>A%h@L# zFxm`j?VMyY*zp}fkS%Kp$So%$pqmz)gDPktT-c1Zy6n^a%`cI`(7F;4HbBIY>+ctH zZ!mfPj6vOZ$4KJSF4C4)?>rH=w0EgR_80u$h5c5FiojLsotSJOtn(OE8+%R0TEh5 zGEPiPFf!vlzF!7LXd2d-Zoq7`IupUKxF5Uaa-ZQ6UiyVx@w!>b*?tK%5Tzsf_PJ(mJy(D?x&5-$bv(*6e8z`cW2|6=zBhad=t(n7SWX(w<`}O~he;q}6Y0D9o7=TNyGi17 zlg=gj9ehac8h(yow<0O)B$y+Rjsm~KbJ+bHKM=SA>;ErG4AWv%U8S~5ogk=DOZQ~K znzn$Pjt5&7O_d?WoD^s&O%D|w#VKnYMomMDXTsrpE5ZsdlCeKHkXu|JlpIYIAm4IJq8C8uwfA$Kd zQDSfYBx|EL!{;0DCnH+Y?SneW7=mL``5U(m+t}R3hywT&6xX#vV?(YUTc+ zgC&Y_r}|fogxlcMl)v7uRMvFZ(xYN@JzmJWG)gS`bYs6m@*7Po9IAB|);(ZZ6FX5* zx3rry)f}mY{4ZGA8phCle4uga@Boh}ZP87a-e89;tYcet%Jiw5)8J{5B)l<{v|YUn zc8+YI6;{^fk8)@bC2iH2J<8ffg0>#BN@eF+ZDiO0ig3NvCGZIQo_*N?tz4l);5Ea$ zHn2AOR2xn#q_Gwwur&{kM%N37EPqV3sjS3M5oIOyu zXKsN@<(osULRZ1zmmsKa>e;Pe>G>Vge6dvES{+M@*H?EhepICX zW6MIc;==XWB=kN&p5SP+XMM;8791mIKWw=w*Wq6?0URkC+sj>c7(8Wh7a1^h1WMYj zZXjuQ;X7ZQ@Bsi^GInfMV09${*}~l~l_Yigy+dntPa|mrN9_#@hr>qk_GL1?$#Zsx zue*@}87|%+n>(rm*Y}>G?nd_gJyOS%(wz2-!2Rn3lA9Ze!$XE#o`%tr1$UvxzG8VL zJl=p;gq2#Rh0|zmR5I1K2Y8rV*^Hbw5TkZmMbPM$*xt z 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�IrtfIllM)_D963UEmlCzjBsFx)fw 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 bk8A!v$wO)E=fNMA00000NkvXXu0mjfyU|>T literal 0 HcmV?d00001 From 5c1dff79748681e118bf76b9e053e670f4309d58 Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 17:41:53 -0500 Subject: [PATCH 130/467] Next attempt at install banner/desktop shortcut --- debian/rules | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/rules b/debian/rules index 996d19d4b..95140ce10 100755 --- a/debian/rules +++ b/debian/rules @@ -83,6 +83,9 @@ binary-arch: $(MKDIR) $(DIR)/debian/tmp/$(PKGDIR) $(DIR)/debian/tmp/$(DBGDIR) $(INSTALL) $(BINDIR)/$(EXENAME) $(DIR)/debian/tmp/$(PKGDIR)/$(PACKAGE) $(INSTALL) $(BINDIR)/$(DBGNAME) $(DIR)/debian/tmp/$(DBGDIR)/$(PACKAGE) + # Install desktop file and banner image + $(INSTALL) $(DIR)/srb2.png $(DIR)/debian/tmp/usr/share/pixmaps + $(INSTALL) $(DIR)/debian/srb2.desktop $(DIR)/debian/tmp/usr/share/applications # add compiled binaries to include-binaries echo $(BINDIR)/$(EXENAME) >> $(DIR)/debian/source/include-binaries echo $(BINDIR)/$(EXENAME) >> $(DIR)/debian/source/include-binaries @@ -100,7 +103,6 @@ binary: binary-arch dh_installdocs # dh_installexamples dh_install --sourcedir=$(DIR)/debian/tmp - dh_install --sourcedir=$(DIR)/srb2.png /usr/share/pixmaps/ dh_installmenu # dh_installdebconf # dh_installlogrotate From 7768ec821adba9971caf6242fe483d241f3fa048 Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 18:08:53 -0500 Subject: [PATCH 131/467] add missing dirs --- debian/rules | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/rules b/debian/rules index 95140ce10..30315e4f8 100755 --- a/debian/rules +++ b/debian/rules @@ -59,6 +59,8 @@ DBGNAME = debug/$(EXENAME) PKGDIR = usr/games DBGDIR = usr/lib/debug/$(PKGDIR) +PIXMAPS_DIR = usr/share/pixmaps +DESKTOP_DIR = usr/share/applications PREFIX = $(shell test "$(CROSS_COMPILE_BUILD)" != "$(CROSS_COMPILE_HOST)" && echo "PREFIX=$(CROSS_COMPILE_HOST)") OS = LINUX=1 NONX86 = $(shell test "`echo $(CROSS_COMPILE_HOST) | grep 'i[3-6]86'`" || echo "NONX86=1") @@ -80,7 +82,11 @@ binary-indep: echo "no need to do any arch-independent stuff" binary-arch: + # create ddirs $(MKDIR) $(DIR)/debian/tmp/$(PKGDIR) $(DIR)/debian/tmp/$(DBGDIR) + $(MKDIR) $(DIR)/debian/tmp/$(PKGDIR) $(DIR)/debian/tmp/$(DESKTOP_DIR) + $(MKDIR) $(DIR)/debian/tmp/$(PKGDIR) $(DIR)/debian/tmp/$(PIXMAPS_DIR) + # install main binaries $(INSTALL) $(BINDIR)/$(EXENAME) $(DIR)/debian/tmp/$(PKGDIR)/$(PACKAGE) $(INSTALL) $(BINDIR)/$(DBGNAME) $(DIR)/debian/tmp/$(DBGDIR)/$(PACKAGE) # Install desktop file and banner image From d213791054cfa50ca3adf57b0b8f7d0628e110ed Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 18:13:14 -0500 Subject: [PATCH 132/467] Rename srb2 to srb2.desktop --- debian/{srb2 => srb2.desktop} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename debian/{srb2 => srb2.desktop} (100%) diff --git a/debian/srb2 b/debian/srb2.desktop similarity index 100% rename from debian/srb2 rename to debian/srb2.desktop From 40dff2c123f746eb765f40609af31fd97dc908df Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 22:00:59 -0500 Subject: [PATCH 133/467] missing space for "proper" Debian formatting --- assets/debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/debian/changelog b/assets/debian/changelog index f9ba9b5ed..a316b7df7 100644 --- a/assets/debian/changelog +++ b/assets/debian/changelog @@ -9,4 +9,4 @@ srb2-data (2.0.6-2) maverick; urgency=high * Initial proper release.. - -- Callum Dickinson Sat, 29 Jan 2011 01:18:42 +1300 + -- Callum Dickinson Sat, 29 Jan 2011 01:18:42 +1300 From 3ae9892064744ee715e27ee6aa243d020f8df843 Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 22:08:32 -0500 Subject: [PATCH 134/467] missing install section for new desktop/png file --- debian/rules | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/rules b/debian/rules index 30315e4f8..97ec70c55 100755 --- a/debian/rules +++ b/debian/rules @@ -97,6 +97,8 @@ binary-arch: echo $(BINDIR)/$(EXENAME) >> $(DIR)/debian/source/include-binaries # Generate install folder files echo $(PKGDIR) > $(DIR)/debian/$(PACKAGE).install + echo $(DESKTOP_DIR) > $(DIR)/debian/$(PACKAGE).install + echo $(PIXMAPS_DIR) > $(DIR)/debian/$(PACKAGE).install echo $(DBGDIR) > $(DIR)/debian/$(DBGPKG).install binary: binary-arch From 1082ae6ba5f811b5bb09d43eeae2a7c99e55e2ee Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 22:17:14 -0500 Subject: [PATCH 135/467] Missing append, --- debian/rules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/rules b/debian/rules index 97ec70c55..e49784a0f 100755 --- a/debian/rules +++ b/debian/rules @@ -97,8 +97,8 @@ binary-arch: echo $(BINDIR)/$(EXENAME) >> $(DIR)/debian/source/include-binaries # Generate install folder files echo $(PKGDIR) > $(DIR)/debian/$(PACKAGE).install - echo $(DESKTOP_DIR) > $(DIR)/debian/$(PACKAGE).install - echo $(PIXMAPS_DIR) > $(DIR)/debian/$(PACKAGE).install + echo $(DESKTOP_DIR) >> $(DIR)/debian/$(PACKAGE).install + echo $(PIXMAPS_DIR) >> $(DIR)/debian/$(PACKAGE).install echo $(DBGDIR) > $(DIR)/debian/$(DBGPKG).install binary: binary-arch From c8ae630dfe98e921a8590a57af0ef61fdbba5ea0 Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 22:29:01 -0500 Subject: [PATCH 136/467] Fix desktop file --- debian/srb2.desktop | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/debian/srb2.desktop b/debian/srb2.desktop index 26928ee99..661832b93 100644 --- a/debian/srb2.desktop +++ b/debian/srb2.desktop @@ -1,7 +1,10 @@ +[Desktop Entry] Name=Sonic Robo Blast 2 +Comment=A free 3D Sonic the Hedgehog fan-game built using a modified ver. of the Doom Legacy source port +Encoding=UTF-8 Exec=srb2 -Comment=SRB2 Icon=/usr/share/pixmaps/srb2.png Terminal=false Type=Application -Categories=games;application; +StartupNotify=false +Categories=Application;Game; From 865676d34183268330e03aee28ec9a88baf4359e Mon Sep 17 00:00:00 2001 From: mikeyd Date: Sat, 6 Feb 2016 22:46:52 -0500 Subject: [PATCH 137/467] loose the revision, pkgs switched to native format --- debian/control | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/debian/control b/debian/control index ecc4829cf..63b075f17 100644 --- a/debian/control +++ b/debian/control @@ -16,7 +16,7 @@ Homepage: http://www.srb2.org Package: srb2 Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14-1) +Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14) Description: A cross-platform 3D Sonic fangame Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog fangame built using a modified version of the Doom Legacy @@ -28,8 +28,8 @@ Description: A cross-platform 3D Sonic fangame Package: srb2-dbg Architecture: any -# FIXME: should be Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14-1), srb2 but dh_shlibdeps is being an asshat -Depends: libc6, ${misc:Depends}, srb2-data (= 2.1.14-1), srb2 +# FIXME: should be Depends: ${shlibs:Depends}, ${misc:Depends}, srb2-data (= 2.1.14), srb2 but dh_shlibdeps is being an asshat +Depends: libc6, ${misc:Depends}, srb2-data (= 2.1.14), srb2 Description: A cross-platform 3D Sonic fangame Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog fangame built using a modified version of the Doom Legacy From 6b626f1b27162d6d553a3e8053d56e13bac70f60 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Sun, 7 Feb 2016 20:53:27 -0500 Subject: [PATCH 138/467] build: cmake is messly --- src/sdl/Makefile.cfg | 6 ++++++ src/sdl/i_main.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sdl/Makefile.cfg b/src/sdl/Makefile.cfg index 3b92a9fb8..b54f7057c 100644 --- a/src/sdl/Makefile.cfg +++ b/src/sdl/Makefile.cfg @@ -119,6 +119,12 @@ ifdef SDL_NET SDL_LDFLAGS+=-lSDL2_net endif +ifdef MINGW +ifndef NOSDLMAIN + SDLMAIN=1 +endif +endif + ifdef SDLMAIN OPTS+=-DSDLMAIN else diff --git a/src/sdl/i_main.c b/src/sdl/i_main.c index c157a6be7..74b61339b 100644 --- a/src/sdl/i_main.c +++ b/src/sdl/i_main.c @@ -56,7 +56,7 @@ PSP_MAIN_THREAD_STACK_SIZE_KB(256); #endif #if defined (_WIN32) && !defined (main) -#define SDLMAIN +//#define SDLMAIN #endif #ifdef SDLMAIN From 914c6c9d9807569be1d33e48ec3c3837e3132c3b Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Sun, 7 Feb 2016 21:45:16 -0500 Subject: [PATCH 139/467] Whitespace cleanup. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8deeb37e5..59557ef42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,7 +80,7 @@ endif() if(${CMAKE_SYSTEM} MATCHES "Darwin") add_definitions(-DMACOSX) - endif() +endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") From 66175d87b89ee2ef919ad1ef66872f3b96683c16 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 8 Feb 2016 20:10:32 +0000 Subject: [PATCH 140/467] removed unused macros from doomdef.h --- src/doomdef.h | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index 4a6d6e576..e4b426ebc 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -206,13 +206,6 @@ extern FILE *logstream; // Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1". #define MODVERSION 19 - - - - -// some tests, enable or disable it if it run or not -#define SPLITSCREEN - // ========================================================================= // The maximum number of players, multiplayer/networking. @@ -348,11 +341,7 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...) FUNCDEBUG; #include "m_swap.h" // Things that used to be in dstrings.h -#define DEVMAPS "devmaps" -#define DEVDATA "devdata" - #define SAVEGAMENAME "srb2sav" - char savegamename[256]; // m_misc.h From 1bdd4cf641a1116097c7081f365962c80b8bf3a3 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Tue, 9 Feb 2016 02:39:16 -0800 Subject: [PATCH 141/467] backport state-animations from internal master to public next most other code in the branch did not come along for the ride. --- src/dehacked.c | 614 +++-------------------------------- src/info.c | 802 ++++++++-------------------------------------- src/info.h | 613 +++-------------------------------- src/lua_mobjlib.c | 8 + src/p_local.h | 1 + src/p_mobj.c | 159 +++++---- src/p_mobj.h | 4 +- src/p_pspr.h | 6 +- src/p_saveg.c | 11 + src/p_tick.c | 2 + 10 files changed, 341 insertions(+), 1879 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 44ef998ac..a29f3875e 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -4588,30 +4588,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_MSSHIELD_F12", // Ring - "S_RING1", - "S_RING2", - "S_RING3", - "S_RING4", - "S_RING5", - "S_RING6", - "S_RING7", - "S_RING8", - "S_RING9", - "S_RING10", - "S_RING11", - "S_RING12", - "S_RING13", - "S_RING14", - "S_RING15", - "S_RING16", - "S_RING17", - "S_RING18", - "S_RING19", - "S_RING20", - "S_RING21", - "S_RING22", - "S_RING23", - "S_RING24", + "S_RING", // Blue Sphere for special stages "S_BLUEBALL", @@ -4627,39 +4604,10 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_GRAVWELLRED3", // Individual Team Rings - "S_TEAMRING1", - "S_TEAMRING2", - "S_TEAMRING3", - "S_TEAMRING4", - "S_TEAMRING5", - "S_TEAMRING6", - "S_TEAMRING7", - "S_TEAMRING8", - "S_TEAMRING9", - "S_TEAMRING10", - "S_TEAMRING11", - "S_TEAMRING12", - "S_TEAMRING13", - "S_TEAMRING14", - "S_TEAMRING15", - "S_TEAMRING16", - "S_TEAMRING17", - "S_TEAMRING18", - "S_TEAMRING19", - "S_TEAMRING20", - "S_TEAMRING21", - "S_TEAMRING22", - "S_TEAMRING23", - "S_TEAMRING24", + "S_TEAMRING", // Special Stage Token - "S_EMMY1", - "S_EMMY2", - "S_EMMY3", - "S_EMMY4", - "S_EMMY5", - "S_EMMY6", - "S_EMMY7", + "S_EMMY", // Special Stage Token "S_TOKEN", @@ -4813,40 +4761,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_SPIKED2", // Starpost - "S_STARPOST1", - "S_STARPOST2", - "S_STARPOST3", - "S_STARPOST4", - "S_STARPOST5", - "S_STARPOST6", - "S_STARPOST7", - "S_STARPOST8", - "S_STARPOST9", - "S_STARPOST10", - "S_STARPOST11", - "S_STARPOST12", - "S_STARPOST13", - "S_STARPOST14", - "S_STARPOST15", - "S_STARPOST16", - "S_STARPOST17", - "S_STARPOST18", - "S_STARPOST19", - "S_STARPOST20", - "S_STARPOST21", - "S_STARPOST22", - "S_STARPOST23", - "S_STARPOST24", - "S_STARPOST25", - "S_STARPOST26", - "S_STARPOST27", - "S_STARPOST28", - "S_STARPOST29", - "S_STARPOST30", - "S_STARPOST31", - "S_STARPOST32", - "S_STARPOST33", - "S_STARPOST34", + "S_STARPOST_IDLE", + "S_STARPOST_FLASH", + "S_STARPOST_SPIN", // Big floating mine "S_BIGMINE1", @@ -5454,38 +5371,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_PITY10", // Invincibility Sparkles - "S_IVSP1", - "S_IVSP2", - "S_IVSP3", - "S_IVSP4", - "S_IVSP5", - "S_IVSP6", - "S_IVSP7", - "S_IVSP8", - "S_IVSP9", - "S_IVSP10", - "S_IVSP11", - "S_IVSP12", - "S_IVSP13", - "S_IVSP14", - "S_IVSP15", - "S_IVSP16", - "S_IVSP17", - "S_IVSP18", - "S_IVSP19", - "S_IVSP20", - "S_IVSP21", - "S_IVSP22", - "S_IVSP23", - "S_IVSP24", - "S_IVSP25", - "S_IVSP26", - "S_IVSP27", - "S_IVSP28", - "S_IVSP29", - "S_IVSP30", - "S_IVSP31", - "S_IVSP32", + "S_IVSP", // Super Sonic Spark "S_SSPK1", @@ -5672,283 +5558,17 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_RRNG6", "S_RRNG7", - // Bounce Ring - "S_BOUNCERING1", - "S_BOUNCERING2", - "S_BOUNCERING3", - "S_BOUNCERING4", - "S_BOUNCERING5", - "S_BOUNCERING6", - "S_BOUNCERING7", - "S_BOUNCERING8", - "S_BOUNCERING9", - "S_BOUNCERING10", - "S_BOUNCERING11", - "S_BOUNCERING12", - "S_BOUNCERING13", - "S_BOUNCERING14", - "S_BOUNCERING15", - "S_BOUNCERING16", - "S_BOUNCERING17", - "S_BOUNCERING18", - "S_BOUNCERING19", - "S_BOUNCERING20", - "S_BOUNCERING21", - "S_BOUNCERING22", - "S_BOUNCERING23", - "S_BOUNCERING24", - "S_BOUNCERING25", - "S_BOUNCERING26", - "S_BOUNCERING27", - "S_BOUNCERING28", - "S_BOUNCERING29", - "S_BOUNCERING30", - "S_BOUNCERING31", - "S_BOUNCERING32", - "S_BOUNCERING33", - "S_BOUNCERING34", - "S_BOUNCERING35", - - // Rail Ring - "S_RAILRING1", - "S_RAILRING2", - "S_RAILRING3", - "S_RAILRING4", - "S_RAILRING5", - "S_RAILRING6", - "S_RAILRING7", - "S_RAILRING8", - "S_RAILRING9", - "S_RAILRING10", - "S_RAILRING11", - "S_RAILRING12", - "S_RAILRING13", - "S_RAILRING14", - "S_RAILRING15", - "S_RAILRING16", - "S_RAILRING17", - "S_RAILRING18", - "S_RAILRING19", - "S_RAILRING20", - "S_RAILRING21", - "S_RAILRING22", - "S_RAILRING23", - "S_RAILRING24", - "S_RAILRING25", - "S_RAILRING26", - "S_RAILRING27", - "S_RAILRING28", - "S_RAILRING29", - "S_RAILRING30", - "S_RAILRING31", - "S_RAILRING32", - "S_RAILRING33", - "S_RAILRING34", - "S_RAILRING35", - - // Infinity ring - "S_INFINITYRING1", - "S_INFINITYRING2", - "S_INFINITYRING3", - "S_INFINITYRING4", - "S_INFINITYRING5", - "S_INFINITYRING6", - "S_INFINITYRING7", - "S_INFINITYRING8", - "S_INFINITYRING9", - "S_INFINITYRING10", - "S_INFINITYRING11", - "S_INFINITYRING12", - "S_INFINITYRING13", - "S_INFINITYRING14", - "S_INFINITYRING15", - "S_INFINITYRING16", - "S_INFINITYRING17", - "S_INFINITYRING18", - "S_INFINITYRING19", - "S_INFINITYRING20", - "S_INFINITYRING21", - "S_INFINITYRING22", - "S_INFINITYRING23", - "S_INFINITYRING24", - "S_INFINITYRING25", - "S_INFINITYRING26", - "S_INFINITYRING27", - "S_INFINITYRING28", - "S_INFINITYRING29", - "S_INFINITYRING30", - "S_INFINITYRING31", - "S_INFINITYRING32", - "S_INFINITYRING33", - "S_INFINITYRING34", - "S_INFINITYRING35", - - // Automatic Ring - "S_AUTOMATICRING1", - "S_AUTOMATICRING2", - "S_AUTOMATICRING3", - "S_AUTOMATICRING4", - "S_AUTOMATICRING5", - "S_AUTOMATICRING6", - "S_AUTOMATICRING7", - "S_AUTOMATICRING8", - "S_AUTOMATICRING9", - "S_AUTOMATICRING10", - "S_AUTOMATICRING11", - "S_AUTOMATICRING12", - "S_AUTOMATICRING13", - "S_AUTOMATICRING14", - "S_AUTOMATICRING15", - "S_AUTOMATICRING16", - "S_AUTOMATICRING17", - "S_AUTOMATICRING18", - "S_AUTOMATICRING19", - "S_AUTOMATICRING20", - "S_AUTOMATICRING21", - "S_AUTOMATICRING22", - "S_AUTOMATICRING23", - "S_AUTOMATICRING24", - "S_AUTOMATICRING25", - "S_AUTOMATICRING26", - "S_AUTOMATICRING27", - "S_AUTOMATICRING28", - "S_AUTOMATICRING29", - "S_AUTOMATICRING30", - "S_AUTOMATICRING31", - "S_AUTOMATICRING32", - "S_AUTOMATICRING33", - "S_AUTOMATICRING34", - "S_AUTOMATICRING35", - - // Explosion Ring - "S_EXPLOSIONRING1", - "S_EXPLOSIONRING2", - "S_EXPLOSIONRING3", - "S_EXPLOSIONRING4", - "S_EXPLOSIONRING5", - "S_EXPLOSIONRING6", - "S_EXPLOSIONRING7", - "S_EXPLOSIONRING8", - "S_EXPLOSIONRING9", - "S_EXPLOSIONRING10", - "S_EXPLOSIONRING11", - "S_EXPLOSIONRING12", - "S_EXPLOSIONRING13", - "S_EXPLOSIONRING14", - "S_EXPLOSIONRING15", - "S_EXPLOSIONRING16", - "S_EXPLOSIONRING17", - "S_EXPLOSIONRING18", - "S_EXPLOSIONRING19", - "S_EXPLOSIONRING20", - "S_EXPLOSIONRING21", - "S_EXPLOSIONRING22", - "S_EXPLOSIONRING23", - "S_EXPLOSIONRING24", - "S_EXPLOSIONRING25", - "S_EXPLOSIONRING26", - "S_EXPLOSIONRING27", - "S_EXPLOSIONRING28", - "S_EXPLOSIONRING29", - "S_EXPLOSIONRING30", - "S_EXPLOSIONRING31", - "S_EXPLOSIONRING32", - "S_EXPLOSIONRING33", - "S_EXPLOSIONRING34", - "S_EXPLOSIONRING35", - - // Scatter Ring - "S_SCATTERRING1", - "S_SCATTERRING2", - "S_SCATTERRING3", - "S_SCATTERRING4", - "S_SCATTERRING5", - "S_SCATTERRING6", - "S_SCATTERRING7", - "S_SCATTERRING8", - "S_SCATTERRING9", - "S_SCATTERRING10", - "S_SCATTERRING11", - "S_SCATTERRING12", - "S_SCATTERRING13", - "S_SCATTERRING14", - "S_SCATTERRING15", - "S_SCATTERRING16", - "S_SCATTERRING17", - "S_SCATTERRING18", - "S_SCATTERRING19", - "S_SCATTERRING20", - "S_SCATTERRING21", - "S_SCATTERRING22", - "S_SCATTERRING23", - "S_SCATTERRING24", - "S_SCATTERRING25", - "S_SCATTERRING26", - "S_SCATTERRING27", - "S_SCATTERRING28", - "S_SCATTERRING29", - "S_SCATTERRING30", - "S_SCATTERRING31", - "S_SCATTERRING32", - "S_SCATTERRING33", - "S_SCATTERRING34", - "S_SCATTERRING35", - - // Grenade Ring - "S_GRENADERING1", - "S_GRENADERING2", - "S_GRENADERING3", - "S_GRENADERING4", - "S_GRENADERING5", - "S_GRENADERING6", - "S_GRENADERING7", - "S_GRENADERING8", - "S_GRENADERING9", - "S_GRENADERING10", - "S_GRENADERING11", - "S_GRENADERING12", - "S_GRENADERING13", - "S_GRENADERING14", - "S_GRENADERING15", - "S_GRENADERING16", - "S_GRENADERING17", - "S_GRENADERING18", - "S_GRENADERING19", - "S_GRENADERING20", - "S_GRENADERING21", - "S_GRENADERING22", - "S_GRENADERING23", - "S_GRENADERING24", - "S_GRENADERING25", - "S_GRENADERING26", - "S_GRENADERING27", - "S_GRENADERING28", - "S_GRENADERING29", - "S_GRENADERING30", - "S_GRENADERING31", - "S_GRENADERING32", - "S_GRENADERING33", - "S_GRENADERING34", - "S_GRENADERING35", + // Weapon Ring Ammo + "S_BOUNCERINGAMMO", + "S_RAILRINGAMMO", + "S_INFINITYRINGAMMO", + "S_AUTOMATICRINGAMMO", + "S_EXPLOSIONRINGAMMO", + "S_SCATTERRINGAMMO", + "S_GRENADERINGAMMO", // Weapon pickup - "S_BOUNCEPICKUP1", - "S_BOUNCEPICKUP2", - "S_BOUNCEPICKUP3", - "S_BOUNCEPICKUP4", - "S_BOUNCEPICKUP5", - "S_BOUNCEPICKUP6", - "S_BOUNCEPICKUP7", - "S_BOUNCEPICKUP8", - "S_BOUNCEPICKUP9", - "S_BOUNCEPICKUP10", - "S_BOUNCEPICKUP11", - "S_BOUNCEPICKUP12", - "S_BOUNCEPICKUP13", - "S_BOUNCEPICKUP14", - "S_BOUNCEPICKUP15", - "S_BOUNCEPICKUP16", - + "S_BOUNCEPICKUP", "S_BOUNCEPICKUPFADE1", "S_BOUNCEPICKUPFADE2", "S_BOUNCEPICKUPFADE3", @@ -5958,23 +5578,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_BOUNCEPICKUPFADE7", "S_BOUNCEPICKUPFADE8", - "S_RAILPICKUP1", - "S_RAILPICKUP2", - "S_RAILPICKUP3", - "S_RAILPICKUP4", - "S_RAILPICKUP5", - "S_RAILPICKUP6", - "S_RAILPICKUP7", - "S_RAILPICKUP8", - "S_RAILPICKUP9", - "S_RAILPICKUP10", - "S_RAILPICKUP11", - "S_RAILPICKUP12", - "S_RAILPICKUP13", - "S_RAILPICKUP14", - "S_RAILPICKUP15", - "S_RAILPICKUP16", - + "S_RAILPICKUP", "S_RAILPICKUPFADE1", "S_RAILPICKUPFADE2", "S_RAILPICKUPFADE3", @@ -5984,23 +5588,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_RAILPICKUPFADE7", "S_RAILPICKUPFADE8", - "S_AUTOPICKUP1", - "S_AUTOPICKUP2", - "S_AUTOPICKUP3", - "S_AUTOPICKUP4", - "S_AUTOPICKUP5", - "S_AUTOPICKUP6", - "S_AUTOPICKUP7", - "S_AUTOPICKUP8", - "S_AUTOPICKUP9", - "S_AUTOPICKUP10", - "S_AUTOPICKUP11", - "S_AUTOPICKUP12", - "S_AUTOPICKUP13", - "S_AUTOPICKUP14", - "S_AUTOPICKUP15", - "S_AUTOPICKUP16", - + "S_AUTOPICKUP", "S_AUTOPICKUPFADE1", "S_AUTOPICKUPFADE2", "S_AUTOPICKUPFADE3", @@ -6010,23 +5598,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_AUTOPICKUPFADE7", "S_AUTOPICKUPFADE8", - "S_EXPLODEPICKUP1", - "S_EXPLODEPICKUP2", - "S_EXPLODEPICKUP3", - "S_EXPLODEPICKUP4", - "S_EXPLODEPICKUP5", - "S_EXPLODEPICKUP6", - "S_EXPLODEPICKUP7", - "S_EXPLODEPICKUP8", - "S_EXPLODEPICKUP9", - "S_EXPLODEPICKUP10", - "S_EXPLODEPICKUP11", - "S_EXPLODEPICKUP12", - "S_EXPLODEPICKUP13", - "S_EXPLODEPICKUP14", - "S_EXPLODEPICKUP15", - "S_EXPLODEPICKUP16", - + "S_EXPLODEPICKUP", "S_EXPLODEPICKUPFADE1", "S_EXPLODEPICKUPFADE2", "S_EXPLODEPICKUPFADE3", @@ -6036,23 +5608,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_EXPLODEPICKUPFADE7", "S_EXPLODEPICKUPFADE8", - "S_SCATTERPICKUP1", - "S_SCATTERPICKUP2", - "S_SCATTERPICKUP3", - "S_SCATTERPICKUP4", - "S_SCATTERPICKUP5", - "S_SCATTERPICKUP6", - "S_SCATTERPICKUP7", - "S_SCATTERPICKUP8", - "S_SCATTERPICKUP9", - "S_SCATTERPICKUP10", - "S_SCATTERPICKUP11", - "S_SCATTERPICKUP12", - "S_SCATTERPICKUP13", - "S_SCATTERPICKUP14", - "S_SCATTERPICKUP15", - "S_SCATTERPICKUP16", - + "S_SCATTERPICKUP", "S_SCATTERPICKUPFADE1", "S_SCATTERPICKUPFADE2", "S_SCATTERPICKUPFADE3", @@ -6062,23 +5618,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_SCATTERPICKUPFADE7", "S_SCATTERPICKUPFADE8", - "S_GRENADEPICKUP1", - "S_GRENADEPICKUP2", - "S_GRENADEPICKUP3", - "S_GRENADEPICKUP4", - "S_GRENADEPICKUP5", - "S_GRENADEPICKUP6", - "S_GRENADEPICKUP7", - "S_GRENADEPICKUP8", - "S_GRENADEPICKUP9", - "S_GRENADEPICKUP10", - "S_GRENADEPICKUP11", - "S_GRENADEPICKUP12", - "S_GRENADEPICKUP13", - "S_GRENADEPICKUP14", - "S_GRENADEPICKUP15", - "S_GRENADEPICKUP16", - + "S_GRENADEPICKUP", "S_GRENADEPICKUPFADE1", "S_GRENADEPICKUPFADE2", "S_GRENADEPICKUPFADE3", @@ -6459,101 +5999,22 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_ROCKSPAWN", - "S_ROCKCRUMBLEA1", - "S_ROCKCRUMBLEA2", - "S_ROCKCRUMBLEA3", - "S_ROCKCRUMBLEA4", - "S_ROCKCRUMBLEA5", - - "S_ROCKCRUMBLEB1", - "S_ROCKCRUMBLEB2", - "S_ROCKCRUMBLEB3", - "S_ROCKCRUMBLEB4", - "S_ROCKCRUMBLEB5", - - "S_ROCKCRUMBLEC1", - "S_ROCKCRUMBLEC2", - "S_ROCKCRUMBLEC3", - "S_ROCKCRUMBLEC4", - "S_ROCKCRUMBLEC5", - - "S_ROCKCRUMBLED1", - "S_ROCKCRUMBLED2", - "S_ROCKCRUMBLED3", - "S_ROCKCRUMBLED4", - "S_ROCKCRUMBLED5", - - "S_ROCKCRUMBLEE1", - "S_ROCKCRUMBLEE2", - "S_ROCKCRUMBLEE3", - "S_ROCKCRUMBLEE4", - "S_ROCKCRUMBLEE5", - - "S_ROCKCRUMBLEF1", - "S_ROCKCRUMBLEF2", - "S_ROCKCRUMBLEF3", - "S_ROCKCRUMBLEF4", - "S_ROCKCRUMBLEF5", - - "S_ROCKCRUMBLEG1", - "S_ROCKCRUMBLEG2", - "S_ROCKCRUMBLEG3", - "S_ROCKCRUMBLEG4", - "S_ROCKCRUMBLEG5", - - "S_ROCKCRUMBLEH1", - "S_ROCKCRUMBLEH2", - "S_ROCKCRUMBLEH3", - "S_ROCKCRUMBLEH4", - "S_ROCKCRUMBLEH5", - - "S_ROCKCRUMBLEI1", - "S_ROCKCRUMBLEI2", - "S_ROCKCRUMBLEI3", - "S_ROCKCRUMBLEI4", - "S_ROCKCRUMBLEI5", - - "S_ROCKCRUMBLEJ1", - "S_ROCKCRUMBLEJ2", - "S_ROCKCRUMBLEJ3", - "S_ROCKCRUMBLEJ4", - "S_ROCKCRUMBLEJ5", - - "S_ROCKCRUMBLEK1", - "S_ROCKCRUMBLEK2", - "S_ROCKCRUMBLEK3", - "S_ROCKCRUMBLEK4", - "S_ROCKCRUMBLEK5", - - "S_ROCKCRUMBLEL1", - "S_ROCKCRUMBLEL2", - "S_ROCKCRUMBLEL3", - "S_ROCKCRUMBLEL4", - "S_ROCKCRUMBLEL5", - - "S_ROCKCRUMBLEM1", - "S_ROCKCRUMBLEM2", - "S_ROCKCRUMBLEM3", - "S_ROCKCRUMBLEM4", - "S_ROCKCRUMBLEM5", - - "S_ROCKCRUMBLEN1", - "S_ROCKCRUMBLEN2", - "S_ROCKCRUMBLEN3", - "S_ROCKCRUMBLEN4", - "S_ROCKCRUMBLEN5", - - "S_ROCKCRUMBLEO1", - "S_ROCKCRUMBLEO2", - "S_ROCKCRUMBLEO3", - "S_ROCKCRUMBLEO4", - "S_ROCKCRUMBLEO5", - - "S_ROCKCRUMBLEP1", - "S_ROCKCRUMBLEP2", - "S_ROCKCRUMBLEP3", - "S_ROCKCRUMBLEP4", - "S_ROCKCRUMBLEP5", + "S_ROCKCRUMBLEA", + "S_ROCKCRUMBLEB", + "S_ROCKCRUMBLEC", + "S_ROCKCRUMBLED", + "S_ROCKCRUMBLEE", + "S_ROCKCRUMBLEF", + "S_ROCKCRUMBLEG", + "S_ROCKCRUMBLEH", + "S_ROCKCRUMBLEI", + "S_ROCKCRUMBLEJ", + "S_ROCKCRUMBLEK", + "S_ROCKCRUMBLEL", + "S_ROCKCRUMBLEM", + "S_ROCKCRUMBLEN", + "S_ROCKCRUMBLEO", + "S_ROCKCRUMBLEP", "S_SRB1_CRAWLA1", "S_SRB1_CRAWLA2", @@ -7484,6 +6945,7 @@ struct { // Frame settings {"FF_FRAMEMASK",FF_FRAMEMASK}, + {"FF_ANIMATE",FF_ANIMATE}, {"FF_FULLBRIGHT",FF_FULLBRIGHT}, {"FF_TRANSMASK",FF_TRANSMASK}, {"FF_TRANSSHIFT",FF_TRANSSHIFT}, diff --git a/src/info.c b/src/info.c index 9e04b4e34..9f75f188d 100644 --- a/src/info.c +++ b/src/info.c @@ -60,6 +60,7 @@ char sprnames[NUMSPRITES + 1][5] = state_t states[NUMSTATES] = { // frame is masked through FF_FRAMEMASK + // FF_ANIMATE (0x4000) makes simple state animations (var1 #frames, var2 tic delay) // FF_FULLBRIGHT (0x8000) activates the fullbright colormap // use FF_TRANS10 - FF_TRANS90 for easy translucency // (or tr_trans10<frame); break; + case mobj_anim_duration: + lua_pushinteger(L, mo->anim_duration); + break; case mobj_touching_sectorlist: return UNIMPLEMENTED; case mobj_subsector: @@ -406,6 +411,9 @@ static int mobj_set(lua_State *L) case mobj_frame: mo->frame = (UINT32)luaL_checkinteger(L, 3); break; + case mobj_anim_duration: + mo->anim_duration = (UINT16)luaL_checkinteger(L, 3); + break; case mobj_touching_sectorlist: return UNIMPLEMENTED; case mobj_subsector: diff --git a/src/p_local.h b/src/p_local.h index 97b8865d4..d035925c8 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -212,6 +212,7 @@ void P_RemoveSavegameMobj(mobj_t *th); boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state); boolean P_SetMobjState(mobj_t *mobj, statenum_t state); void P_RunShields(void); +void P_RunOverlays(void); void P_MobjThinker(mobj_t *mobj); boolean P_RailThinker(mobj_t *mobj); void P_PushableThinker(mobj_t *mobj); diff --git a/src/p_mobj.c b/src/p_mobj.c index 25ae8815a..323e5ce95 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -79,11 +79,33 @@ void P_AddCachedAction(mobj_t *mobj, INT32 statenum) actioncachehead.prev = newaction; } +// +// P_CycleStateAnimation +// +FUNCINLINE static ATTRINLINE void P_CycleStateAnimation(mobj_t *mobj) +{ + // var2 determines delay between animation frames + if (!(mobj->frame & FF_ANIMATE) || --mobj->anim_duration != 0) + return; + mobj->anim_duration = (UINT16)mobj->state->var2; + + // compare the current sprite frame to the one we started from + // if more than var1 away from it, swap back to the original + // else just advance by one + if ((mobj->frame & FF_FRAMEMASK) - (mobj->state->frame & FF_FRAMEMASK) < (UINT32)mobj->state->var1) + ++mobj->frame; + else + mobj->frame = (mobj->state->frame & FF_FRAMEMASK) | (mobj->frame & ~FF_FRAMEMASK); +} + // // P_CycleMobjState // static void P_CycleMobjState(mobj_t *mobj) { + // state animations + P_CycleStateAnimation(mobj); + // cycle through states, // calling action functions at transitions if (mobj->tics != -1) @@ -102,6 +124,9 @@ static void P_CycleMobjState(mobj_t *mobj) // static void P_CyclePlayerMobjState(mobj_t *mobj) { + // state animations + P_CycleStateAnimation(mobj); + // cycle through states, // calling action functions at transitions if (mobj->tics != -1) @@ -279,6 +304,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) mobj->sprite = st->sprite; mobj->frame = st->frame; + mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set // Modified handling. // Call action functions when the state is set @@ -346,6 +372,7 @@ boolean P_SetMobjState(mobj_t *mobj, statenum_t state) mobj->tics = st->tics; mobj->sprite = st->sprite; mobj->frame = st->frame; + mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set // Modified handling. // Call action functions when the state is set @@ -399,6 +426,8 @@ boolean P_SetMobjStateNF(mobj_t *mobj, statenum_t state) mobj->tics = st->tics; mobj->sprite = st->sprite; mobj->frame = st->frame; + mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set + return true; } @@ -416,6 +445,8 @@ static boolean P_SetPrecipMobjState(precipmobj_t *mobj, statenum_t state) mobj->tics = st->tics; mobj->sprite = st->sprite; mobj->frame = st->frame; + mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set + return true; } @@ -3716,6 +3747,8 @@ void P_NullPrecipThinker(precipmobj_t *mobj) void P_SnowThinker(precipmobj_t *mobj) { + P_CycleStateAnimation((mobj_t *)mobj); + // adjust height if ((mobj->z += mobj->momz) <= mobj->floorz) mobj->z = mobj->ceilingz; @@ -3723,6 +3756,8 @@ void P_SnowThinker(precipmobj_t *mobj) void P_RainThinker(precipmobj_t *mobj) { + P_CycleStateAnimation((mobj_t *)mobj); + if (mobj->state != &states[S_RAIN1]) { // cycle through states, @@ -5833,8 +5868,6 @@ INT32 numshields = 0; void P_RunShields(void) { INT32 i; - mobj_t *mo, *next; - fixed_t destx,desty,zoffs; // run shields for (i = 0; i < numshields; i++) @@ -5843,60 +5876,6 @@ void P_RunShields(void) P_SetTarget(&shields[i], NULL); } numshields = 0; - - // run overlays - next = NULL; - for (mo = overlaycap; mo; mo = next) - { - I_Assert(!P_MobjWasRemoved(mo)); - - // grab next in chain, then unset the chain target - next = mo->hnext; - P_SetTarget(&mo->hnext, NULL); - - if (!mo->target) - continue; - if (!splitscreen /*&& rendermode != render_soft*/) - { - angle_t viewingangle; - - if (players[displayplayer].awayviewtics) - viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, players[displayplayer].awayviewmobj->x, players[displayplayer].awayviewmobj->y); - else if (!camera.chase && players[displayplayer].mo) - viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, players[displayplayer].mo->x, players[displayplayer].mo->y); - else - viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, camera.x, camera.y); - - if (mo->state->var1) - viewingangle += ANGLE_180; - destx = mo->target->x + P_ReturnThrustX(mo->target, viewingangle, FixedMul(FRACUNIT/4, mo->scale)); - desty = mo->target->y + P_ReturnThrustY(mo->target, viewingangle, FixedMul(FRACUNIT/4, mo->scale)); - } - else - { - destx = mo->target->x; - desty = mo->target->y; - } - - mo->eflags = (mo->eflags & ~MFE_VERTICALFLIP) | (mo->target->eflags & MFE_VERTICALFLIP); - mo->scale = mo->destscale = mo->target->scale; - zoffs = FixedMul(((signed)mo->state->var2)*FRACUNIT, mo->scale); - mo->angle = mo->target->angle; - - P_UnsetThingPosition(mo); - mo->x = destx; - mo->y = desty; - if (mo->eflags & MFE_VERTICALFLIP) - mo->z = (mo->target->z + mo->target->height - mo->height) - zoffs; - else - mo->z = mo->target->z + zoffs; - if (mo->state->var1) - P_SetUnderlayPosition(mo); - else - P_SetThingPosition(mo); - P_CheckPosition(mo, mo->x, mo->y); - } - P_SetTarget(&overlaycap, NULL); } static boolean P_AddShield(mobj_t *thing) @@ -5933,6 +5912,71 @@ static boolean P_AddShield(mobj_t *thing) return true; } +void P_RunOverlays(void) +{ + // run overlays + mobj_t *mo, *next = NULL; + fixed_t destx,desty,zoffs; + + for (mo = overlaycap; mo; mo = next) + { + I_Assert(!P_MobjWasRemoved(mo)); + + // grab next in chain, then unset the chain target + next = mo->hnext; + P_SetTarget(&mo->hnext, NULL); + + if (!mo->target) + continue; + if (!splitscreen /*&& rendermode != render_soft*/) + { + angle_t viewingangle; + + if (players[displayplayer].awayviewtics) + viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, players[displayplayer].awayviewmobj->x, players[displayplayer].awayviewmobj->y); + else if (!camera.chase && players[displayplayer].mo) + viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, players[displayplayer].mo->x, players[displayplayer].mo->y); + else + viewingangle = R_PointToAngle2(mo->target->x, mo->target->y, camera.x, camera.y); + + if (!(mo->state->frame & FF_ANIMATE) && mo->state->var1) + viewingangle += ANGLE_180; + destx = mo->target->x + P_ReturnThrustX(mo->target, viewingangle, FixedMul(FRACUNIT/4, mo->scale)); + desty = mo->target->y + P_ReturnThrustY(mo->target, viewingangle, FixedMul(FRACUNIT/4, mo->scale)); + } + else + { + destx = mo->target->x; + desty = mo->target->y; + } + + mo->eflags = (mo->eflags & ~MFE_VERTICALFLIP) | (mo->target->eflags & MFE_VERTICALFLIP); + mo->scale = mo->destscale = mo->target->scale; + mo->angle = mo->target->angle; + + if (!(mo->state->frame & FF_ANIMATE)) + zoffs = FixedMul(((signed)mo->state->var2)*FRACUNIT, mo->scale); + // if you're using FF_ANIMATE on an overlay, + // then you're on your own. + else + zoffs = 0; + + P_UnsetThingPosition(mo); + mo->x = destx; + mo->y = desty; + if (mo->eflags & MFE_VERTICALFLIP) + mo->z = (mo->target->z + mo->target->height - mo->height) - zoffs; + else + mo->z = mo->target->z + zoffs; + if (mo->state->var1) + P_SetUnderlayPosition(mo); + else + P_SetThingPosition(mo); + P_CheckPosition(mo, mo->x, mo->y); + } + P_SetTarget(&overlaycap, NULL); +} + // Called only when MT_OVERLAY thinks. static void P_AddOverlay(mobj_t *thing) { @@ -7502,6 +7546,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->tics = st->tics; mobj->sprite = st->sprite; mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits.. + mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set + mobj->friction = ORIG_FRICTION; mobj->movefactor = ORIG_FRICTION_FACTOR; @@ -7727,6 +7773,7 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype mobj->tics = st->tics; mobj->sprite = st->sprite; mobj->frame = st->frame; // FF_FRAMEMASK for frame, and other bits.. + mobj->anim_duration = (UINT16)st->var2; // only used if FF_ANIMATE is set // set subsector and/or block links P_SetPrecipitationThingPosition(mobj); diff --git a/src/p_mobj.h b/src/p_mobj.h index 224a8ca5b..6198f5bec 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -270,6 +270,7 @@ typedef struct mobj_s angle_t angle; // orientation spritenum_t sprite; // used to find patch_t and flip value UINT32 frame; // frame number, plus bits see p_pspr.h + UINT16 anim_duration; // for FF_ANIMATE states struct msecnode_s *touching_sectorlist; // a linked list of sectors where this object appears @@ -383,7 +384,8 @@ typedef struct precipmobj_s // More drawing info: to determine current sprite. angle_t angle; // orientation spritenum_t sprite; // used to find patch_t and flip value - INT32 frame; // frame number, plus bits see p_pspr.h + UINT32 frame; // frame number, plus bits see p_pspr.h + UINT16 anim_duration; // for FF_ANIMATE states struct mprecipsecnode_s *touching_sectorlist; // a linked list of sectors where this object appears diff --git a/src/p_pspr.h b/src/p_pspr.h index e0b57675c..53ad30abd 100644 --- a/src/p_pspr.h +++ b/src/p_pspr.h @@ -36,9 +36,11 @@ #endif /// \brief Frame flags: only the frame number -#define FF_FRAMEMASK 0x7fff +#define FF_FRAMEMASK 0x3fff +/// \brief Frame flags: Simple stateless animation +#define FF_ANIMATE 0x4000 /// \brief Frame flags: frame always appears full bright -#define FF_FULLBRIGHT 0x8000 // +#define FF_FULLBRIGHT 0x8000 /// \brief Frame flags: 0 = no trans(opaque), 1-15 = transl. table #define FF_TRANSMASK 0xf0000 /// \brief shift for FF_TRANSMASK diff --git a/src/p_saveg.c b/src/p_saveg.c index 61f51e497..565ff0bd0 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1058,6 +1058,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) diff |= MD_SPRITE; if (mobj->frame != mobj->state->frame) diff |= MD_FRAME; + if (mobj->anim_duration != (UINT16)mobj->state->var2) + diff |= MD_FRAME; if (mobj->eflags) diff |= MD_EFLAGS; if (mobj->player) @@ -1178,7 +1180,10 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) if (diff & MD_SPRITE) WRITEUINT16(save_p, mobj->sprite); if (diff & MD_FRAME) + { WRITEUINT32(save_p, mobj->frame); + WRITEUINT16(save_p, mobj->anim_duration); + } if (diff & MD_EFLAGS) WRITEUINT16(save_p, mobj->eflags); if (diff & MD_PLAYER) @@ -2004,9 +2009,15 @@ static void LoadMobjThinker(actionf_p1 thinker) else mobj->sprite = mobj->state->sprite; if (diff & MD_FRAME) + { mobj->frame = READUINT32(save_p); + mobj->anim_duration = READUINT16(save_p); + } else + { mobj->frame = mobj->state->frame; + mobj->anim_duration = (UINT16)mobj->state->var2; + } if (diff & MD_EFLAGS) mobj->eflags = READUINT16(save_p); if (diff & MD_PLAYER) diff --git a/src/p_tick.c b/src/p_tick.c index 2973505f3..c72ab5b67 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -631,6 +631,7 @@ void P_Ticker(boolean run) // Run shield positioning P_RunShields(); + P_RunOverlays(); P_UpdateSpecials(); P_RespawnSpecials(); @@ -742,6 +743,7 @@ void P_PreTicker(INT32 frames) // Run shield positioning P_RunShields(); + P_RunOverlays(); P_UpdateSpecials(); P_RespawnSpecials(); From 58e685353a3575e71869f691de6a2e793cb1ec1e Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Tue, 5 Jan 2016 05:03:00 -0800 Subject: [PATCH 142/467] Attempt 2 at special stage fades. More basic in execution. --- src/dehacked.c | 12 ++++++++++-- src/f_finale.h | 3 ++- src/f_wipe.c | 1 + src/p_setup.c | 51 +++++++++++++++++++++++++++++++++++++------------- 4 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 44ef998ac..f7ec8ed51 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -3187,6 +3187,12 @@ static void readwipes(MYFILE *f) else if (fastcmp(pword, "FINAL")) wipeoffset = wipe_gameend_final; } + else if (fastncmp(word, "SPECLEVEL_", 10)) + { + pword = word + 10; + if (fastcmp(pword, "TOWHITE")) + wipeoffset = wipe_speclevel_towhite; + } if (wipeoffset < 0) { @@ -3194,9 +3200,11 @@ static void readwipes(MYFILE *f) continue; } - if (value == UINT8_MAX // Cannot disable non-toblack wipes (or the level toblack wipe) - && (wipeoffset <= wipe_level_toblack || wipeoffset >= wipe_level_final)) + if (value == UINT8_MAX + && (wipeoffset <= wipe_level_toblack || wipeoffset >= wipe_speclevel_towhite)) { + // Cannot disable non-toblack wipes + // (or the level toblack wipe, or the special towhite wipe) deh_warning("Wipes: can't disable wipe of type '%s'", word); continue; } diff --git a/src/f_finale.h b/src/f_finale.h index 97a26f4c4..e263a3797 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -90,6 +90,7 @@ enum // custom intermissions wipe_specinter_toblack, wipe_multinter_toblack, + wipe_speclevel_towhite, wipe_level_final, wipe_intermission_final, @@ -108,7 +109,7 @@ enum NUMWIPEDEFS }; -#define WIPEFINALSHIFT 12 +#define WIPEFINALSHIFT 13 extern UINT8 wipedefs[NUMWIPEDEFS]; #endif diff --git a/src/f_wipe.c b/src/f_wipe.c index 6f14e577a..e0578949e 100644 --- a/src/f_wipe.c +++ b/src/f_wipe.c @@ -58,6 +58,7 @@ UINT8 wipedefs[NUMWIPEDEFS] = { 0, // wipe_specinter_toblack 0, // wipe_multinter_toblack + 0, // wipe_speclevel_towhite 0, // wipe_level_final 0, // wipe_intermission_final diff --git a/src/p_setup.c b/src/p_setup.c index 3491669c7..dc0e4ffd5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2369,7 +2369,7 @@ boolean P_SetupLevel(boolean skipprecip) // use gamemap to get map number. // 99% of the things already did, so. // Map header should always be in place at this point - INT32 i, loadprecip = 1; + INT32 i, loadprecip = 1, ranspecialwipe = 0; INT32 loademblems = 1; INT32 fromnetsave = 0; boolean loadedbm = false; @@ -2442,6 +2442,28 @@ boolean P_SetupLevel(boolean skipprecip) // will be set by player think. players[consoleplayer].viewz = 1; + // Special stage fade to white + // This is handled BEFORE sounds are stopped. + if (rendermode != render_none && G_IsSpecialStage(gamemap)) + { + tic_t starttime = I_GetTime(); + tic_t endtime = starttime + (3*TICRATE)/2; + + S_StartSound(NULL, sfx_s3kaf); + + F_WipeStartScreen(); + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 0); + + F_WipeEndScreen(); + F_RunWipe(wipedefs[wipe_speclevel_towhite], false); + + // Hold on white for extra effect. + while (I_GetTime() < endtime) + I_Sleep(); + + ranspecialwipe = 1; + } + // Make sure all sounds are stopped before Z_FreeTags. S_StopSounds(); S_ClearSfx(); @@ -2451,25 +2473,28 @@ boolean P_SetupLevel(boolean skipprecip) S_Start(); // Let's fade to black here - if (rendermode != render_none) + // But only if we didn't do the special stage wipe + if (rendermode != render_none && !ranspecialwipe) { F_WipeStartScreen(); V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); F_WipeEndScreen(); F_RunWipe(wipedefs[wipe_level_toblack], false); + } + // Print "SPEEDING OFF TO [ZONE] [ACT 1]..." + if (rendermode != render_none) + { // Don't include these in the fade! - { - char tx[64]; - V_DrawSmallString(1, 191, V_ALLOWLOWERCASE, M_GetText("Speeding off to...")); - snprintf(tx, 63, "%s%s%s", - mapheaderinfo[gamemap-1]->lvlttl, - (mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE", - (mapheaderinfo[gamemap-1]->actnum > 0) ? va(", Act %d",mapheaderinfo[gamemap-1]->actnum) : ""); - V_DrawSmallString(1, 195, V_ALLOWLOWERCASE, tx); - I_UpdateNoVsync(); - } + char tx[64]; + V_DrawSmallString(1, 191, V_ALLOWLOWERCASE, M_GetText("Speeding off to...")); + snprintf(tx, 63, "%s%s%s", + mapheaderinfo[gamemap-1]->lvlttl, + (mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE", + (mapheaderinfo[gamemap-1]->actnum > 0) ? va(", Act %d",mapheaderinfo[gamemap-1]->actnum) : ""); + V_DrawSmallString(1, 195, V_ALLOWLOWERCASE, tx); + I_UpdateNoVsync(); } #ifdef HAVE_BLUA @@ -2767,7 +2792,7 @@ boolean P_SetupLevel(boolean skipprecip) // Remove the loading shit from the screen if (rendermode != render_none) - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (ranspecialwipe) ? 0 : 31); if (precache || dedicated) R_PrecacheLevel(); From 8c17dac589215ad71d501a52aaff96b57f26021f Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 7 Jan 2016 19:48:20 -0800 Subject: [PATCH 143/467] The concept of "music slots" doesn't exist anymore. Use whatever names you want for your music. So long as you prefix the lumps with O_ or D_, it doesn't matter anymore. DISCLAIMER: Linedef type 413 (change music) and Lua scripting is not tested. (cherry picked from commit 025ca413a2a01a8ec7c104748c2f510e350aa457) # Conflicts: # src/p_user.c --- src/d_netcmd.c | 47 +- src/dehacked.c | 97 ++-- src/doomstat.h | 22 +- src/f_finale.c | 22 +- src/g_game.c | 17 +- src/lua_baselib.c | 7 +- src/lua_maplib.c | 8 +- src/m_menu.c | 16 +- src/p_enemy.c | 8 +- src/p_inter.c | 4 +- src/p_saveg.c | 2 +- src/p_setup.c | 31 +- src/p_spec.c | 17 +- src/p_user.c | 26 +- src/s_sound.c | 562 ++++++++++----------- src/s_sound.h | 16 +- src/sdl/mixer_sound.c | 1 + src/sounds.c | 1061 ---------------------------------------- src/sounds.h | 1086 ----------------------------------------- src/y_inter.c | 8 +- 20 files changed, 431 insertions(+), 2627 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 02bc464e6..9916e524f 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1854,10 +1854,10 @@ static void Got_Pause(UINT8 **cp, INT32 playernum) if (paused) { if (!menuactive || netgame) - S_PauseSound(); + S_PauseAudio(); } else - S_ResumeSound(); + S_ResumeAudio(); } } @@ -3761,46 +3761,53 @@ static void Command_Displayplayer_f(void) static void Command_Tunes_f(void) { const char *tunearg; - UINT16 tune, track = 0; + UINT16 tunenum, track = 0; const size_t argc = COM_Argc(); if (argc < 2) //tunes slot ... { - CONS_Printf("tunes :\n"); + CONS_Printf("tunes :\n"); CONS_Printf(M_GetText("Play a music slot at a set speed (\"1\" being normal speed).\n")); CONS_Printf(M_GetText("If the format supports multiple songs, you can specify which one to play.\n")); - CONS_Printf(M_GetText("The current tune is: %d\nThe current track is: %d\n"), - (mapmusic & MUSIC_SONGMASK), ((mapmusic & MUSIC_TRACKMASK) >> MUSIC_TRACKSHIFT)); + CONS_Printf(M_GetText("The current tune is: %s\nThe current track is: %d\n"), + mapmusname, (mapmusflags & MUSIC_TRACKMASK)); return; } tunearg = COM_Argv(1); - tune = (UINT16)atoi(tunearg); + tunenum = (UINT16)atoi(tunearg); track = 0; - if (!strcasecmp(tunearg, "default")) + if (!strcasecmp(tunearg, "none")) { - tune = mapheaderinfo[gamemap-1]->musicslot; - track = mapheaderinfo[gamemap-1]->musicslottrack; + S_StopMusic(); + return; } - else if (toupper(tunearg[0]) >= 'A' && toupper(tunearg[0]) <= 'Z') - tune = (UINT16)M_MapNumber(tunearg[0], tunearg[1]); - - if (tune >= NUMMUSIC) + else if (!strcasecmp(tunearg, "default")) { - CONS_Alert(CONS_NOTICE, M_GetText("Valid slots are 1 to %d, or 0 to stop music\n"), NUMMUSIC - 1); + tunearg = mapheaderinfo[gamemap-1]->musname; + track = mapheaderinfo[gamemap-1]->mustrack; + } + else if (tunearg[3] == 0 && toupper(tunearg[0]) >= 'A' && toupper(tunearg[0]) <= 'Z') + tunenum = (UINT16)M_MapNumber(tunearg[0], tunearg[1]); + + if (tunenum && tunenum >= 1036) + { + CONS_Alert(CONS_NOTICE, M_GetText("Valid music slots are 1 to 1035.\n")); return; } if (argc > 3) track = (UINT16)atoi(COM_Argv(3))-1; - mapmusic = tune | (track << MUSIC_TRACKSHIFT); - - if (tune == mus_None) - S_StopMusic(); + if (tunenum) + snprintf(mapmusname, 7, "%sM", G_BuildMapName(tunenum)); else - S_ChangeMusic(mapmusic, true); + strncpy(mapmusname, tunearg, 7); + mapmusname[6] = 0; + mapmusflags = (track & MUSIC_TRACKMASK); + + S_ChangeMusic(mapmusname, mapmusflags, true); if (argc > 2) { diff --git a/src/dehacked.c b/src/dehacked.c index 44ef998ac..6f07ce8e0 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -65,7 +65,6 @@ static mobjtype_t get_mobjtype(const char *word); static statenum_t get_state(const char *word); static spritenum_t get_sprite(const char *word); static sfxenum_t get_sfx(const char *word); -static UINT16 get_mus(const char *word); static hudnum_t get_huditem(const char *word); #ifndef HAVE_BLUA static powertype_t get_power(const char *word); @@ -1164,19 +1163,34 @@ static void readlevelheader(MYFILE *f, INT32 num) mapheaderinfo[num-1]->typeoflevel = tol; } } - else if (fastcmp(word, "MUSICSLOT")) + else if (fastcmp(word, "MUSIC")) { + if (fastcmp(word2, "NONE")) + mapheaderinfo[num-1]->musname[0] = 0; // becomes empty string + else + { + deh_strlcpy(mapheaderinfo[num-1]->musname, word2, + sizeof(mapheaderinfo[num-1]->musname), va("Level header %d: music", num)); + } + } + else if (fastcmp(word, "MUSICSLOT")) + { // Backwards compatibility? // Convert to map number if (word2[0] >= 'A' && word2[0] <= 'Z' && word2[2] == '\0') i = M_MapNumber(word2[0], word2[1]); - if (i) // it's just a number - mapheaderinfo[num-1]->musicslot = (UINT16)i; - else // No? Okay, now we'll get technical. - mapheaderinfo[num-1]->musicslot = get_mus(word2); // accepts all of O_CHRSEL, mus_chrsel, or just plain ChrSel + if (!i) + mapheaderinfo[num-1]->musname[0] = 0; // becomes empty string + else if (i > 1035) + deh_warning("Level header %d: musicslot out of range (0 - 1035)\n", num); + else // it's just a number + { + snprintf(mapheaderinfo[num-1]->musname, 7, va("%sM", G_BuildMapName(i))); + mapheaderinfo[num-1]->musname[6] = 0; + } } - else if (fastcmp(word, "MUSICSLOTTRACK")) - mapheaderinfo[num-1]->musicslottrack = ((UINT16)i - 1); + else if (fastcmp(word, "MUSICTRACK")) + mapheaderinfo[num-1]->mustrack = ((UINT16)i - 1); else if (fastcmp(word, "FORCECHARACTER")) { strlcpy(mapheaderinfo[num-1]->forcecharacter, word2, SKINNAMESIZE+1); @@ -1443,10 +1457,16 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum) else deh_warning("CutSceneScene %d: unknown word '%s'", num, word); } - else if (fastcmp(word, "MUSICSLOT")) + else if (fastcmp(word, "MUSIC")) { - DEH_WriteUndoline(word, va("%u", cutscenes[num]->scene[scenenum].musicslot), UNDO_NONE); - cutscenes[num]->scene[scenenum].musicslot = get_mus(word2); // accepts all of O_MAP01M, mus_map01m, or just plain MAP01M + DEH_WriteUndoline(word, cutscenes[num]->scene[scenenum].musswitch, UNDO_NONE); + strncpy(cutscenes[num]->scene[scenenum].musswitch, word2, 7); + cutscenes[num]->scene[scenenum].musswitch[6] = 0; + } + else if (fastcmp(word, "MUSICTRACK")) + { + DEH_WriteUndoline(word, va("%u", cutscenes[num]->scene[scenenum].musswitchflags), UNDO_NONE); + cutscenes[num]->scene[scenenum].musswitchflags = ((UINT16)i) & MUSIC_TRACKMASK; } else if (fastcmp(word, "MUSICLOOP")) { @@ -7958,22 +7978,6 @@ static sfxenum_t get_sfx(const char *word) return sfx_None; } -static UINT16 get_mus(const char *word) -{ // Returns the value of SFX_ enumerations - UINT16 i; - if (*word >= '0' && *word <= '9') - return atoi(word); - if (fastncmp("MUS_",word,4)) - word += 4; // take off the MUS_ - else if (fastncmp("O_",word,2) || fastncmp("D_",word,2)) - word += 2; // take off the O_ or D_ - for (i = 0; i < NUMMUSIC; i++) - if (S_music[i].name && fasticmp(word, S_music[i].name)) - return i; - deh_warning("Couldn't find music named 'MUS_%s'",word); - return mus_None; -} - static hudnum_t get_huditem(const char *word) { // Returns the value of HUD_ enumerations hudnum_t i; @@ -8172,11 +8176,6 @@ static fixed_t find_const(const char **rword) free(word); return r; } - else if (fastncmp("MUS_",word,4) || fastncmp("O_",word,2)) { - r = get_mus(word); - free(word); - return r; - } else if (fastncmp("PW_",word,3)) { r = get_power(word); free(word); @@ -8546,33 +8545,6 @@ static inline int lib_getenum(lua_State *L) if (mathlib) return luaL_error(L, "sfx '%s' could not be found.\n", word); return 0; } - else if (!mathlib && fastncmp("mus_",word,4)) { - p = word+4; - for (i = 0; i < NUMMUSIC; i++) - if (S_music[i].name && fastcmp(p, S_music[i].name)) { - lua_pushinteger(L, i); - return 1; - } - return 0; - } - else if (mathlib && fastncmp("MUS_",word,4)) { // SOCs are ALL CAPS! - p = word+4; - for (i = 0; i < NUMMUSIC; i++) - if (S_music[i].name && fasticmp(p, S_music[i].name)) { - lua_pushinteger(L, i); - return 1; - } - return luaL_error(L, "music '%s' could not be found.\n", word); - } - else if (mathlib && (fastncmp("O_",word,2) || fastncmp("D_",word,2))) { - p = word+2; - for (i = 0; i < NUMMUSIC; i++) - if (S_music[i].name && fasticmp(p, S_music[i].name)) { - lua_pushinteger(L, i); - return 1; - } - return luaL_error(L, "music '%s' could not be found.\n", word); - } else if (!mathlib && fastncmp("pw_",word,3)) { p = word+3; for (i = 0; i < NUMPOWERS; i++) @@ -8724,8 +8696,11 @@ static inline int lib_getenum(lua_State *L) } else if (fastcmp(word,"globallevelskynum")) { lua_pushinteger(L, globallevelskynum); return 1; - } else if (fastcmp(word,"mapmusic")) { - lua_pushinteger(L, mapmusic); + } else if (fastcmp(word,"mapmusname")) { + lua_pushstring(L, mapmusname); + return 1; + } else if (fastcmp(word,"mapmusflags")) { + lua_pushinteger(L, mapmusflags); return 1; } else if (fastcmp(word,"server")) { if ((!multiplayer || !netgame) && !playeringame[serverplayer]) diff --git a/src/doomstat.h b/src/doomstat.h index 44cf6feaa..ffdbcaecd 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -31,15 +31,11 @@ // Selected by user. extern INT16 gamemap; - -// ----------------xxxxxxxxxxxxxxxx = music slot -// -xxxxxxxxxxxxxxx---------------- = track slot -// x------------------------------- = reset music bit -extern UINT32 mapmusic; -#define MUSIC_TRACKSHIFT 16 -#define MUSIC_SONGMASK 0x0000FFFF -#define MUSIC_TRACKMASK 0x7FFF0000 -#define MUSIC_RELOADRESET 0x80000000 +extern char mapmusname[7]; +extern UINT16 mapmusflags; +#define MUSIC_TRACKMASK 0x0FFF // ----************ +#define MUSIC_RELOADRESET 0x8000 // *--------------- +// Use other bits if necessary. extern INT16 maptol; extern UINT8 globalweather; @@ -146,11 +142,13 @@ typedef struct UINT16 xcoord[8]; UINT16 ycoord[8]; UINT16 picduration[8]; - UINT16 musicslot; UINT8 musicloop; UINT16 textxpos; UINT16 textypos; + char musswitch[7]; + UINT16 musswitchflags; + UINT8 fadecolor; // Color number for fade, 0 means don't do the first fade UINT8 fadeinid; // ID of the first fade, to a color -- ignored if fadecolor is 0 UINT8 fadeoutid; // ID of the second fade, to the new screen @@ -218,8 +216,8 @@ typedef struct UINT8 actnum; ///< Act number or 0 for none. UINT16 typeoflevel; ///< Combination of typeoflevel flags. INT16 nextlevel; ///< Map number of next level, or 1100-1102 to end. - UINT16 musicslot; ///< Music slot number to play. 0 for no music. - UINT16 musicslottrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore. + char musname[7]; ///< Music track to play. "" for no music. + UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore. char forcecharacter[17]; ///< (SKINNAMESIZE+1) Skin to switch to or "" to disable. UINT8 weather; ///< 0 = sunny day, 1 = storm, 2 = snow, 3 = rain, 4 = blank, 5 = thunder w/o rain, 6 = rain w/o lightning, 7 = heat wave. INT16 skynum; ///< Sky number to use. diff --git a/src/f_finale.c b/src/f_finale.c index a85fd11cb..efe39f294 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -559,7 +559,7 @@ static void F_IntroDrawScene(void) if (finalecount < 4) S_StopMusic(); if (finalecount == 4) - S_ChangeMusic(mus_stjr, false); + S_ChangeMusicInternal("stjr", false); x = (BASEVIDWIDTH<scene[scenenum].xcoord[picnum]; picypos = cutscenes[cutnum]->scene[scenenum].ycoord[picnum]; - if (cutscenes[cutnum]->scene[scenenum].musicslot != 0) - S_ChangeMusic(cutscenes[cutnum]->scene[scenenum].musicslot, cutscenes[cutnum]->scene[scenenum].musicloop); + if (cutscenes[cutnum]->scene[scenenum].musswitch[0]) + S_ChangeMusic(cutscenes[cutnum]->scene[scenenum].musswitch, + cutscenes[cutnum]->scene[scenenum].musswitchflags, + cutscenes[cutnum]->scene[scenenum].musicloop); // Fade to the next dofadenow = true; @@ -1774,8 +1776,10 @@ void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean reset animtimer = cutscenes[cutnum]->scene[0].picduration[0]; // Picture duration stoptimer = 0; - if (cutscenes[cutnum]->scene[scenenum].musicslot != 0) - S_ChangeMusic(cutscenes[cutnum]->scene[scenenum].musicslot, cutscenes[cutnum]->scene[scenenum].musicloop); + if (cutscenes[cutnum]->scene[0].musswitch[0]) + S_ChangeMusic(cutscenes[cutnum]->scene[0].musswitch, + cutscenes[cutnum]->scene[0].musswitchflags, + cutscenes[cutnum]->scene[0].musicloop); else S_StopMusic(); } diff --git a/src/g_game.c b/src/g_game.c index 72cfe4a57..088536436 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -69,8 +69,10 @@ static void G_DoStartContinue(void); static void G_DoContinued(void); static void G_DoWorldDone(void); +char mapmusname[7]; // Music name +UINT16 mapmusflags; // Track and reset bit + INT16 gamemap = 1; -UINT32 mapmusic; // music, track, and reset bit INT16 maptol; UINT8 globalweather = 0; INT32 curWeather = PRECIP_NONE; @@ -2182,12 +2184,13 @@ void G_PlayerReborn(INT32 player) if (p-players == consoleplayer) { - if (mapmusic & MUSIC_RELOADRESET) // TODO: Might not need this here + if (mapmusflags & MUSIC_RELOADRESET) { - mapmusic = mapheaderinfo[gamemap-1]->musicslot - | (mapheaderinfo[gamemap-1]->musicslottrack << MUSIC_TRACKSHIFT); + strncpy(mapmusname, mapheaderinfo[gamemap-1]->musname, 7); + mapmusname[6] = 0; + mapmusflags = mapheaderinfo[gamemap-1]->mustrack & MUSIC_TRACKMASK; } - S_ChangeMusic(mapmusic, true); + S_ChangeMusic(mapmusname, mapmusflags, true); } if (gametype == GT_COOP) @@ -3521,7 +3524,7 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean if (paused) { paused = false; - S_ResumeSound(); + S_ResumeAudio(); } if (netgame || multiplayer) // Nice try, haxor. @@ -3595,7 +3598,7 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean globalweather = mapheaderinfo[gamemap-1]->weather; // Don't carry over custom music change to another map. - mapmusic |= MUSIC_RELOADRESET; + mapmusflags |= MUSIC_RELOADRESET; ultimatemode = pultmode; playerdeadview = false; diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 5e2d31b10..386270959 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1636,9 +1636,10 @@ static int lib_sStopSound(lua_State *L) static int lib_sChangeMusic(lua_State *L) { - UINT32 music_num = (UINT32)luaL_checkinteger(L, 1); + const char *music_name = luaL_checkstring(L, 1); boolean looping = (boolean)lua_opttrueboolean(L, 2); player_t *player = NULL; + UINT16 music_flags = 0; NOHUD if (!lua_isnone(L, 3) && lua_isuserdata(L, 3)) { @@ -1646,8 +1647,10 @@ static int lib_sChangeMusic(lua_State *L) if (!player) return LUA_ErrInvalid(L, "player_t"); } + music_flags = (UINT16)luaL_optinteger(L, 4, 0); + if (!player || P_IsLocalPlayer(player)) - S_ChangeMusic(music_num, looping); + S_ChangeMusic(music_name, music_flags, looping); return 0; } diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 38920c223..5f77b2b5c 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -1168,10 +1168,10 @@ static int mapheaderinfo_get(lua_State *L) lua_pushinteger(L, header->typeoflevel); else if (fastcmp(field,"nextlevel")) lua_pushinteger(L, header->nextlevel); - else if (fastcmp(field,"musicslot")) - lua_pushinteger(L, header->musicslot); - else if (fastcmp(field,"musicslottrack")) - lua_pushinteger(L, header->musicslottrack); + else if (fastcmp(field,"musname")) + lua_pushlstring(L, header->musname, 6); + else if (fastcmp(field,"mustrack")) + lua_pushinteger(L, header->mustrack); else if (fastcmp(field,"forcecharacter")) lua_pushstring(L, header->forcecharacter); else if (fastcmp(field,"weather")) diff --git a/src/m_menu.c b/src/m_menu.c index 65ea1cfe7..e53b32582 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4751,7 +4751,7 @@ static void M_SetupChoosePlayer(INT32 choice) if (Playing() == false) { S_StopMusic(); - S_ChangeMusic(mus_chrsel, true); + S_ChangeMusicInternal("chrsel", true); } SP_PlayerDef.prevMenu = currentMenu; @@ -5202,7 +5202,7 @@ void M_DrawTimeAttackMenu(void) lumpnum_t lumpnum; char beststr[40]; - S_ChangeMusic(mus_racent, true); // Eww, but needed for when user hits escape during demo playback + S_ChangeMusicInternal("racent", true); // Eww, but needed for when user hits escape during demo playback V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE)); @@ -5365,7 +5365,7 @@ static void M_TimeAttack(INT32 choice) itemOn = tastart; // "Start" is selected. G_SetGamestate(GS_TIMEATTACK); - S_ChangeMusic(mus_racent, true); + S_ChangeMusicInternal("racent", true); } // Drawing function for Nights Attack @@ -5375,7 +5375,7 @@ void M_DrawNightsAttackMenu(void) lumpnum_t lumpnum; char beststr[40]; - S_ChangeMusic(mus_racent, true); // Eww, but needed for when user hits escape during demo playback + S_ChangeMusicInternal("racent", true); // Eww, but needed for when user hits escape during demo playback V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE)); @@ -5498,7 +5498,7 @@ static void M_NightsAttack(INT32 choice) itemOn = nastart; // "Start" is selected. G_SetGamestate(GS_TIMEATTACK); - S_ChangeMusic(mus_racent, true); + S_ChangeMusicInternal("racent", true); } // Player has selected the "START" from the nights attack screen @@ -5732,7 +5732,7 @@ static void M_ModeAttackEndGame(INT32 choice) itemOn = currentMenu->lastOn; G_SetGamestate(GS_TIMEATTACK); modeattacking = ATTACKING_NONE; - S_ChangeMusic(mus_racent, true); + S_ChangeMusicInternal("racent", true); // Update replay availability. CV_AddValue(&cv_nextmap, 1); CV_AddValue(&cv_nextmap, -1); @@ -6944,7 +6944,7 @@ static void M_ToggleDigital(void) if (nodigimusic) return; S_Init(cv_soundvolume.value, cv_digmusicvolume.value, cv_midimusicvolume.value); S_StopMusic(); - S_ChangeMusic(mus_lclear, false); + S_ChangeMusicInternal("lclear", false); M_StartMessage(M_GetText("Digital Music Enabled\n"), NULL, MM_NOTHING); } else @@ -6971,7 +6971,7 @@ static void M_ToggleMIDI(void) I_InitMIDIMusic(); if (nomidimusic) return; S_Init(cv_soundvolume.value, cv_digmusicvolume.value, cv_midimusicvolume.value); - S_ChangeMusic(mus_lclear, false); + S_ChangeMusicInternal("lclear", false); M_StartMessage(M_GetText("MIDI Music Enabled\n"), NULL, MM_NOTHING); } else diff --git a/src/p_enemy.c b/src/p_enemy.c index df5297271..101760642 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3063,12 +3063,8 @@ void A_Invincibility(mobj_t *actor) { S_StopMusic(); if (mariomode) - { - S_ChangeMusic(mus_minvnc, false); G_GhostAddColor(GHC_INVINCIBLE); - } - else - S_ChangeMusic(mus_invinc, false); + S_ChangeMusicInternal((mariomode) ? "minvnc" : "invinc", false); } } @@ -3104,7 +3100,7 @@ void A_SuperSneakers(mobj_t *actor) else { S_StopMusic(); - S_ChangeMusic(mus_shoes, false); + S_ChangeMusicInternal("shoes", false); } } } diff --git a/src/p_inter.c b/src/p_inter.c index 709e0e2be..61d397d6c 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2073,7 +2073,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) if (P_IsLocalPlayer(target->player) && target->player == &players[consoleplayer]) { S_StopMusic(); // Stop the Music! Tails 03-14-2000 - S_ChangeMusic(mus_gmover, false); // Yousa dead now, Okieday? Tails 03-14-2000 + S_ChangeMusicInternal("gmover", false); // Yousa dead now, Okieday? Tails 03-14-2000 } } } @@ -2461,7 +2461,7 @@ static inline void P_NiGHTSDamage(mobj_t *target, mobj_t *source) && player->nightstime < 10*TICRATE) { //S_StartSound(NULL, sfx_timeup); // that creepy "out of time" music from NiGHTS. Dummied out, as some on the dev team thought it wasn't Sonic-y enough (Mystic, notably). Uncomment to restore. -SH - S_ChangeMusic(mus_drown,false); + S_ChangeMusicInternal("drown",false); } } } diff --git a/src/p_saveg.c b/src/p_saveg.c index 61f51e497..67c66cb6c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3192,7 +3192,7 @@ static inline boolean P_NetUnArchiveMisc(void) // tell the sound code to reset the music since we're skipping what // normally sets this flag - mapmusic |= MUSIC_RELOADRESET; + mapmusflags |= MUSIC_RELOADRESET; G_SetGamestate(READINT16(save_p)); diff --git a/src/p_setup.c b/src/p_setup.c index 3491669c7..3a51d90b3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -180,10 +180,11 @@ static void P_ClearSingleMapHeaderInfo(INT16 i) mapheaderinfo[num]->typeoflevel = 0; DEH_WriteUndoline("NEXTLEVEL", va("%d", mapheaderinfo[num]->nextlevel), UNDO_NONE); mapheaderinfo[num]->nextlevel = (INT16)(i + 1); - DEH_WriteUndoline("MUSICSLOT", va("%d", mapheaderinfo[num]->musicslot), UNDO_NONE); - mapheaderinfo[num]->musicslot = mus_map01m + num; - DEH_WriteUndoline("MUSICSLOTTRACK", va("%d", mapheaderinfo[num]->musicslottrack), UNDO_NONE); - mapheaderinfo[num]->musicslottrack = 0; + DEH_WriteUndoline("MUSIC", mapheaderinfo[num]->musname, UNDO_NONE); + snprintf(mapheaderinfo[num]->musname, 7, va("%sM", G_BuildMapName(i))); + mapheaderinfo[num]->musname[6] = 0; + DEH_WriteUndoline("MUSICTRACK", va("%d", mapheaderinfo[num]->mustrack), UNDO_NONE); + mapheaderinfo[num]->mustrack = 0; DEH_WriteUndoline("FORCECHARACTER", va("%d", mapheaderinfo[num]->forcecharacter), UNDO_NONE); mapheaderinfo[num]->forcecharacter[0] = '\0'; DEH_WriteUndoline("WEATHER", va("%d", mapheaderinfo[num]->weather), UNDO_NONE); @@ -1439,6 +1440,21 @@ static void P_LoadSideDefs2(lumpnum_t lumpnum) #endif case 413: // Change music + { + char process[8+1]; + + sd->toptexture = sd->midtexture = sd->bottomtexture = 0; + if (msd->bottomtexture[0] != '-' || msd->bottomtexture[1] != '\0') + { + M_Memcpy(process,msd->bottomtexture,8); + process[8] = '\0'; + sd->bottomtexture = get_number(process)-1; + } + M_Memcpy(process,msd->toptexture,8); + sd->text = Z_Malloc(strlen(process)+1, PU_LEVEL, NULL); + M_Memcpy(sd->text, process, strlen(process)+1); + break; + } case 414: // Play SFX { sd->toptexture = sd->midtexture = sd->bottomtexture = 0; @@ -1449,13 +1465,6 @@ static void P_LoadSideDefs2(lumpnum_t lumpnum) process[8] = '\0'; sd->toptexture = get_number(process); } - if (sd->special == 413 && (msd->bottomtexture[0] != '-' || msd->bottomtexture[1] != '\0')) - { - char process[8+1]; - M_Memcpy(process,msd->bottomtexture,8); - process[8] = '\0'; - sd->bottomtexture = get_number(process)-1; - } break; } diff --git a/src/p_spec.c b/src/p_spec.c index 81994d46c..ef3425e04 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2390,20 +2390,19 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // console player only unless NOCLIMB is set if ((line->flags & ML_NOCLIMB) || (mo && mo->player && P_IsLocalPlayer(mo->player))) { - UINT16 musicnum = (UINT16)sides[line->sidenum[0]].toptexture; //P_AproxDistance(line->dx, line->dy)>>FRACBITS; UINT16 tracknum = (UINT16)sides[line->sidenum[0]].bottomtexture; - mapmusic = musicnum | (tracknum << MUSIC_TRACKSHIFT); - if (!(line->flags & ML_BLOCKMONSTERS)) - mapmusic |= MUSIC_RELOADRESET; + strncpy(mapmusname, line->text, 7); + mapmusname[6] = 0; - if (musicnum >= NUMMUSIC || musicnum == mus_None) - S_StopMusic(); - else - S_ChangeMusic(mapmusic, !(line->flags & ML_EFFECT4)); + mapmusflags = tracknum & MUSIC_TRACKMASK; + if (!(line->flags & ML_BLOCKMONSTERS)) + mapmusflags |= MUSIC_RELOADRESET; + + S_ChangeMusic(mapmusname, mapmusflags, !(line->flags & ML_EFFECT4)); // Except, you can use the ML_BLOCKMONSTERS flag to change this behavior. - // if (mapmusic & MUSIC_RELOADRESET) then it will reset the music in G_PlayerReborn. + // if (mapmusflags & MUSIC_RELOADRESET) then it will reset the music in G_PlayerReborn. } break; diff --git a/src/p_user.c b/src/p_user.c index f015c17f4..ef281406f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -962,7 +962,7 @@ void P_DoSuperTransformation(player_t *player, boolean giverings) if (!(mapheaderinfo[gamemap-1]->levelflags & LF_NOSSMUSIC) && P_IsLocalPlayer(player)) { S_StopMusic(); - S_ChangeMusic(mus_supers, true); + S_ChangeMusicInternal("supers", true); } S_StartSound(NULL, sfx_supert); //let all players hear it -mattw_cfi @@ -1098,7 +1098,7 @@ void P_PlayLivesJingle(player_t *player) if (player) player->powers[pw_extralife] = extralifetics + 1; S_StopMusic(); // otherwise it won't restart if this is done twice in a row - S_ChangeMusic(mus_xtlife, false); + S_ChangeMusicInternal("xtlife", false); } } @@ -1116,21 +1116,21 @@ void P_RestoreMusic(player_t *player) return; S_SpeedMusic(1.0f); if (player->powers[pw_super] && !(mapheaderinfo[gamemap-1]->levelflags & LF_NOSSMUSIC)) - S_ChangeMusic(mus_supers, true); + S_ChangeMusicInternal("supers", true); else if (player->powers[pw_invulnerability] > 1) - S_ChangeMusic((mariomode) ? mus_minvnc : mus_invinc, false); + S_ChangeMusicInternal((mariomode) ? "minvnc" : "invinc", false); else if (player->powers[pw_sneakers] > 1 && !player->powers[pw_super]) { if (mapheaderinfo[gamemap-1]->levelflags & LF_SPEEDMUSIC) { S_SpeedMusic(1.4f); - S_ChangeMusic(mapmusic, true); + S_ChangeMusic(mapmusname, mapmusflags, true); } else - S_ChangeMusic(mus_shoes, true); + S_ChangeMusicInternal("shoes", true); } else - S_ChangeMusic(mapmusic, true); + S_ChangeMusic(mapmusname, mapmusflags, true); } // @@ -2039,7 +2039,7 @@ static void P_CheckUnderwaterAndSpaceTimer(player_t *player) mobj_t *killer; if ((netgame || multiplayer) && P_IsLocalPlayer(player)) - S_ChangeMusic(mapmusic, true); + S_ChangeMusic(mapmusname, mapmusflags, true); killer = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_NULL); killer->threshold = 42; // Special flag that it was drowning which killed you. @@ -2048,7 +2048,7 @@ static void P_CheckUnderwaterAndSpaceTimer(player_t *player) else if (player->powers[pw_spacetime] == 1) { if ((netgame || multiplayer) && P_IsLocalPlayer(player)) - S_ChangeMusic(mapmusic, true); + S_ChangeMusic(mapmusname, mapmusflags, true); P_DamageMobj(player->mo, NULL, NULL, 10000); } @@ -2083,7 +2083,7 @@ static void P_CheckUnderwaterAndSpaceTimer(player_t *player) && player == &players[consoleplayer]) { S_StopMusic(); - S_ChangeMusic(mus_drown, false); + S_ChangeMusicInternal("drown", false); } if (player->powers[pw_underwater] == 25*TICRATE + 1) @@ -5592,7 +5592,7 @@ static void P_NiGHTSMovement(player_t *player) } else if (P_IsLocalPlayer(player) && player->nightstime == 10*TICRATE) // S_StartSound(NULL, sfx_timeup); // that creepy "out of time" music from NiGHTS. Dummied out, as some on the dev team thought it wasn't Sonic-y enough (Mystic, notably). Uncomment to restore. -SH - S_ChangeMusic(mus_drown,false); + S_ChangeMusicInternal("drown",false); if (player->mo->z < player->mo->floorz) @@ -7731,7 +7731,7 @@ static void P_DeathThink(player_t *player) // Return to level music if (netgame && player->deadtimer == gameovertics && P_IsLocalPlayer(player)) - S_ChangeMusic(mapmusic, true); + S_ChangeMusic(mapmusname, mapmusflags, true); } if (!player->mo) @@ -8717,7 +8717,7 @@ void P_PlayerThink(player_t *player) if (countdown == 11*TICRATE - 1) { if (P_IsLocalPlayer(player)) - S_ChangeMusic(mus_drown, false); + S_ChangeMusicInternal("drown", false); } // If you've hit the countdown and you haven't made diff --git a/src/s_sound.c b/src/s_sound.c index 14a8cc425..1e5f79aa0 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -141,14 +141,6 @@ typedef struct static channel_t *channels = NULL; static INT32 numofchannels = 0; -// whether songs are mus_paused -static boolean mus_paused = 0; - -// music currently being played -musicinfo_t *mus_playing = 0; - -static INT32 nextcleanup; - // // Internals. // @@ -307,47 +299,6 @@ static void SetChannelsNum(void) channels[i].sfxinfo = 0; } -// -// Initializes sound stuff, including volume -// Sets channels, SFX and music volume, -// allocates channel buffer, sets S_sfx lookup. -// -void S_Init(INT32 sfxVolume, INT32 digMusicVolume, INT32 midiMusicVolume) -{ - INT32 i; - - if (dedicated) - return; - - S_SetSfxVolume(sfxVolume); - S_SetDigMusicVolume(digMusicVolume); - S_SetMIDIMusicVolume(midiMusicVolume); - - SetChannelsNum(); - - // no sounds are playing, and they are not mus_paused - mus_paused = 0; - - // Note that sounds have not been cached (yet). - for (i = 1; i < NUMSFX; i++) - { - S_sfx[i].usefulness = -1; // for I_GetSfx() - S_sfx[i].lumpnum = LUMPERROR; - } - - // precache sounds if requested by cmdline, or precachesound var true - if (!nosound && (M_CheckParm("-precachesound") || precachesound.value)) - { - // Initialize external data (all sounds) at start, keep static. - CONS_Printf(M_GetText("Loading sounds... ")); - - for (i = 1; i < NUMSFX; i++) - if (S_sfx[i].name) - S_sfx[i].data = I_GetSfx(&S_sfx[i]); - - CONS_Printf(M_GetText(" pre-cached all sound data\n")); - } -} // Retrieve the lump number of sfx // @@ -371,12 +322,6 @@ lumpnum_t S_GetSfxLumpNum(sfxinfo_t *sfx) return W_GetNumForName("dsthok"); } -// -// Per level startup code. -// Kills playing sounds at start of level, -// determines music if any, changes music. -// - // Stop all sounds, load level info, THEN start sounds. void S_StopSounds(void) { @@ -442,22 +387,6 @@ void S_StopSoundByNum(sfxenum_t sfxnum) } } -void S_Start(void) -{ - if (mapmusic & MUSIC_RELOADRESET) - { - mapmusic = mapheaderinfo[gamemap-1]->musicslot - | (mapheaderinfo[gamemap-1]->musicslottrack << MUSIC_TRACKSHIFT); - } - - mus_paused = 0; - - if (cv_resetmusic.value) - S_StopMusic(); - S_ChangeMusic(mapmusic, true); - nextcleanup = 15; -} - void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) { INT32 sep, pitch, priority, cnum; @@ -745,43 +674,6 @@ void S_StopSound(void *origin) } } -// -// Stop and resume music, during game PAUSE. -// -void S_PauseSound(void) -{ - if (!nodigimusic) - I_PauseSong(0); - - if (mus_playing && !mus_paused) - { - I_PauseSong(mus_playing->handle); - mus_paused = true; - } - - // pause cd music -#if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) - I_PauseCD(); -#else - I_StopCD(); -#endif -} - -void S_ResumeSound(void) -{ - if (!nodigimusic) - I_ResumeSong(0); - else - if (mus_playing && mus_paused) - { - I_ResumeSong(mus_playing->handle); - mus_paused = false; - } - - // resume cd music - I_ResumeCD(); -} - // // Updates music & sounds // @@ -883,38 +775,6 @@ void S_UpdateSounds(void) } } - // Clean up unused data. -#if 0 - { - static tic_t nextcleanup = 0; - size_t i; - sfxinfo_t *sfx; - - if (!gametic) nextcleanup = 0; - if (gametic > nextcleanup) - { - for (i = 1; i < NUMSFX; i++) - { - if (S_sfx[i].usefulness == 0) - { - S_sfx[i].usefulness--; - - // don't forget to unlock it !!! - // __dmpi_unlock_.... - //Z_ChangeTag(S_sfx[i].data, PU_CACHE); - I_FreeSfx(S_sfx+i); - //S_sfx[i].data = 0; - - CONS_Debug(DBG_GAMELOGIC, "flushed sfx %.6s\n", S_sfx[i].name); - } - } - nextcleanup = gametic + 15; - } - } -#endif - - // FIXTHIS: nextcleanup is probably unused - for (cnum = 0; cnum < numofchannels; cnum++) { c = &channels[cnum]; @@ -984,37 +844,6 @@ void S_UpdateSounds(void) I_UpdateSound(); } -void S_SetDigMusicVolume(INT32 volume) -{ - if (volume < 0 || volume > 31) - CONS_Alert(CONS_WARNING, "musicvolume should be between 0-31\n"); - - CV_SetValue(&cv_digmusicvolume, volume&31); - actualdigmusicvolume = cv_digmusicvolume.value; //check for change of var - -#ifdef DJGPPDOS - I_SetDigMusicVolume(31); // Trick for buggy dos drivers. Win32 doesn't need this. -#endif - - if (!nodigimusic) - I_SetDigMusicVolume(volume&31); -} - -void S_SetMIDIMusicVolume(INT32 volume) -{ - if (volume < 0 || volume > 31) - CONS_Alert(CONS_WARNING, "musicvolume should be between 0-31\n"); - - CV_SetValue(&cv_midimusicvolume, volume&0x1f); - actualmidimusicvolume = cv_midimusicvolume.value; //check for change of var - -#ifdef DJGPPDOS - I_SetMIDIMusicVolume(31); // Trick for buggy dos drivers. Win32 doesn't need this. -#endif - - I_SetMIDIMusicVolume(volume&0x1f); -} - void S_SetSfxVolume(INT32 volume) { if (volume < 0 || volume > 31) @@ -1031,137 +860,6 @@ void S_SetSfxVolume(INT32 volume) #endif } -static boolean S_MIDIMusic(musicinfo_t *music, boolean looping) -{ - if (nomidimusic) - return true; // no error - - if (music_disabled) - return true; // no error - - // get lumpnum if neccessary - if (!music->lumpnum) - { - if (W_CheckNumForName(va("d_%s", music->name)) == LUMPERROR) - return false; - music->lumpnum = W_GetNumForName(va("d_%s", music->name)); - } - - // load & register it - music->data = W_CacheLumpNum(music->lumpnum, PU_MUSIC); -#if defined (macintosh) && !defined (HAVE_SDL) - music->handle = I_RegisterSong(music_num); -#else - music->handle = I_RegisterSong(music->data, W_LumpLength(music->lumpnum)); -#endif - -#ifdef MUSSERV - if (msg_id != -1) - { - struct musmsg msg_buffer; - - msg_buffer.msg_type = 6; - memset(msg_buffer.msg_text, 0, sizeof (msg_buffer.msg_text)); - sprintf(msg_buffer.msg_text, "d_%s", music->name); - msgsnd(msg_id, (struct msgbuf*)&msg_buffer, sizeof (msg_buffer.msg_text), IPC_NOWAIT); - } -#endif - - // play it - if (!I_PlaySong(music->handle, looping)) - return false; - - mus_playing = music; - return true; -} - -static boolean S_DigMusic(musicinfo_t *music, boolean looping) -{ - if (nodigimusic) - return false; // try midi - - if (digital_disabled) - return false; // try midi - - if (!I_StartDigSong(music->name, looping)) - return false; - - mus_playing = music; - return true; -} - -void S_ChangeMusic(UINT32 mslotnum, boolean looping) -{ - musicinfo_t *music; - musicenum_t music_num = (signed)(mslotnum & MUSIC_SONGMASK); - INT32 track_num = (mslotnum & MUSIC_TRACKMASK) >> MUSIC_TRACKSHIFT; - -#if defined (DC) || defined (_WIN32_WCE) || defined (PSP) || defined(GP2X) - S_ClearSfx(); -#endif - - if (nomidimusic && nodigimusic) - return; - - if (music_disabled && digital_disabled) - return; - - // No Music - if (music_num == mus_None) - { - S_StopMusic(); - return; - } - - if (music_num >= NUMMUSIC) - { - CONS_Alert(CONS_ERROR, "Bad music number %d\n", music_num); - return; - } - else - music = &S_music[music_num]; - - if (mus_playing != music) - { - S_StopMusic(); // shutdown old music - if (!S_DigMusic(music, looping) && !S_MIDIMusic(music, looping)) - { - CONS_Alert(CONS_ERROR, M_GetText("Music lump %.6s not found!\n"), music->name); - return; - } - } - I_SetSongTrack(track_num); -} - -boolean S_SpeedMusic(float speed) -{ - return I_SetSongSpeed(speed); -} - -void S_StopMusic(void) -{ - if (!mus_playing) - return; - - if (mus_paused) - I_ResumeSong(mus_playing->handle); - - if (!nodigimusic) - I_StopDigSong(); - - S_SpeedMusic(1.0f); - I_StopSong(mus_playing->handle); - I_UnRegisterSong(mus_playing->handle); - -#ifndef HAVE_SDL //SDL uses RWOPS - Z_ChangeTag(mus_playing->data, PU_CACHE); -#endif - - mus_playing->data = NULL; - mus_playing = NULL; - -} - void S_ClearSfx(void) { #ifndef DJGPPDOS @@ -1452,3 +1150,263 @@ void S_StartSoundName(void *mo, const char *soundname) S_StartSound(mo, soundnum); } + +/// ------------------------ +/// Music +/// ------------------------ + +#define music_playing (music_name[0]) // String is empty if no music is playing + +static char music_name[7]; // up to 6-character name +static lumpnum_t music_lumpnum; // lump number of music (used??) +static void *music_data; // music raw data +static INT32 music_handle; // once registered, the handle for the music + +static boolean mus_paused = 0; // whether songs are mus_paused + +static boolean S_MIDIMusic(const char *mname, boolean looping) +{ + lumpnum_t mlumpnum; + void *mdata; + INT32 mhandle; + + if (nomidimusic || music_disabled) + return false; // didn't search. + + if (W_CheckNumForName(va("d_%s", mname)) == LUMPERROR) + return false; + mlumpnum = W_GetNumForName(va("d_%s", mname)); + + // load & register it + mdata = W_CacheLumpNum(mlumpnum, PU_MUSIC); + mhandle = I_RegisterSong(mdata, W_LumpLength(mlumpnum)); + +#ifdef MUSSERV + if (msg_id != -1) + { + struct musmsg msg_buffer; + + msg_buffer.msg_type = 6; + memset(msg_buffer.msg_text, 0, sizeof (msg_buffer.msg_text)); + sprintf(msg_buffer.msg_text, "d_%s", mname); + msgsnd(msg_id, (struct msgbuf*)&msg_buffer, sizeof (msg_buffer.msg_text), IPC_NOWAIT); + } +#endif + + // play it + if (!I_PlaySong(mhandle, looping)) + return false; + + strncpy(music_name, mname, 7); + music_name[6] = 0; + music_lumpnum = mlumpnum; + music_data = mdata; + music_handle = mhandle; + return true; +} + +static boolean S_DigMusic(const char *mname, boolean looping) +{ + if (nodigimusic || digital_disabled) + return false; // try midi + + if (!I_StartDigSong(mname, looping)) + return false; + + strncpy(music_name, mname, 7); + music_name[6] = 0; + music_lumpnum = LUMPERROR; + music_data = NULL; + music_handle = 0; + return true; +} + +void S_ChangeMusic(const char *mmusic, UINT16 mflags, boolean looping) +{ +#if defined (DC) || defined (_WIN32_WCE) || defined (PSP) || defined(GP2X) + S_ClearSfx(); +#endif + + if ((nomidimusic || music_disabled) && (nodigimusic || digital_disabled)) + return; + + // No Music (empty string) + if (mmusic[0] == 0) + { + S_StopMusic(); + return; + } + + if (strncmp(music_name, mmusic, 6)) + { + S_StopMusic(); // shutdown old music + if (!S_DigMusic(mmusic, looping) && !S_MIDIMusic(mmusic, looping)) + { + CONS_Alert(CONS_ERROR, M_GetText("Music lump %.6s not found!\n"), mmusic); + return; + } + } + I_SetSongTrack(mflags & MUSIC_TRACKMASK); +} + +boolean S_SpeedMusic(float speed) +{ + return I_SetSongSpeed(speed); +} + +void S_StopMusic(void) +{ + if (!music_playing) + return; + + if (mus_paused) + I_ResumeSong(music_handle); + + if (!nodigimusic) + I_StopDigSong(); + + S_SpeedMusic(1.0f); + I_StopSong(music_handle); + I_UnRegisterSong(music_handle); + +#ifndef HAVE_SDL //SDL uses RWOPS + Z_ChangeTag(music_data, PU_CACHE); +#endif + + music_data = NULL; + music_name[0] = 0; +} + +void S_SetDigMusicVolume(INT32 volume) +{ + if (volume < 0 || volume > 31) + CONS_Alert(CONS_WARNING, "musicvolume should be between 0-31\n"); + + CV_SetValue(&cv_digmusicvolume, volume&31); + actualdigmusicvolume = cv_digmusicvolume.value; //check for change of var + +#ifdef DJGPPDOS + I_SetDigMusicVolume(31); // Trick for buggy dos drivers. Win32 doesn't need this. +#endif + if (!nodigimusic) + I_SetDigMusicVolume(volume&31); +} + +void S_SetMIDIMusicVolume(INT32 volume) +{ + if (volume < 0 || volume > 31) + CONS_Alert(CONS_WARNING, "musicvolume should be between 0-31\n"); + + CV_SetValue(&cv_midimusicvolume, volume&0x1f); + actualmidimusicvolume = cv_midimusicvolume.value; //check for change of var + +#ifdef DJGPPDOS + I_SetMIDIMusicVolume(31); // Trick for buggy dos drivers. Win32 doesn't need this. +#endif + I_SetMIDIMusicVolume(volume&0x1f); +} + +/// ------------------------ +/// Init & Others +/// ------------------------ + +// +// Initializes sound stuff, including volume +// Sets channels, SFX and music volume, +// allocates channel buffer, sets S_sfx lookup. +// +void S_Init(INT32 sfxVolume, INT32 digMusicVolume, INT32 midiMusicVolume) +{ + INT32 i; + + if (dedicated) + return; + + S_SetSfxVolume(sfxVolume); + S_SetDigMusicVolume(digMusicVolume); + S_SetMIDIMusicVolume(midiMusicVolume); + + SetChannelsNum(); + + // no sounds are playing, and they are not mus_paused + mus_paused = 0; + + // Note that sounds have not been cached (yet). + for (i = 1; i < NUMSFX; i++) + { + S_sfx[i].usefulness = -1; // for I_GetSfx() + S_sfx[i].lumpnum = LUMPERROR; + } + + // precache sounds if requested by cmdline, or precachesound var true + if (!nosound && (M_CheckParm("-precachesound") || precachesound.value)) + { + // Initialize external data (all sounds) at start, keep static. + CONS_Printf(M_GetText("Loading sounds... ")); + + for (i = 1; i < NUMSFX; i++) + if (S_sfx[i].name) + S_sfx[i].data = I_GetSfx(&S_sfx[i]); + + CONS_Printf(M_GetText(" pre-cached all sound data\n")); + } +} + + +// +// Per level startup code. +// Kills playing sounds at start of level, +// determines music if any, changes music. +// +void S_Start(void) +{ + if (mapmusflags & MUSIC_RELOADRESET) + { + strncpy(mapmusname, mapheaderinfo[gamemap-1]->musname, 7); + mapmusname[6] = 0; + mapmusflags = (mapheaderinfo[gamemap-1]->mustrack & MUSIC_TRACKMASK); + } + + mus_paused = 0; + + if (cv_resetmusic.value) + S_StopMusic(); + S_ChangeMusic(mapmusname, mapmusflags, true); +} + +// +// Stop and resume music, during game PAUSE. +// +void S_PauseAudio(void) +{ + if (!nodigimusic) + I_PauseSong(0); + + if (music_playing && !mus_paused) + { + I_PauseSong(music_handle); + mus_paused = true; + } + + // pause cd music +#if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) + I_PauseCD(); +#else + I_StopCD(); +#endif +} + +void S_ResumeAudio(void) +{ + if (!nodigimusic) + I_ResumeSong(0); + else + if (music_playing && mus_paused) + { + I_ResumeSong(music_handle); + mus_paused = false; + } + + // resume cd music + I_ResumeCD(); +} diff --git a/src/s_sound.h b/src/s_sound.h index 6589ca598..12787536b 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -48,9 +48,6 @@ typedef enum extern consvar_t play_mode; #endif -//in case you're wondering why: I need to define this as extern so P_RestoreMusic can get to it so we don't do stupid song/speed changes -extern musicinfo_t *mus_playing; - typedef enum { SF_TOTALLYSINGLE = 1, // Only play one of these sounds at a time...GLOBALLY @@ -100,11 +97,12 @@ void S_StartSoundAtVolume(const void *origin, sfxenum_t sound_id, INT32 volume); // Stop sound for thing at void S_StopSound(void *origin); -// Start music using from sounds.h, and set whether looping -// note: music slot is first 16 bits for songnum, -// next 15 bits for tracknum (gme, other formats with more than one track) +// Start music track, arbitrary, given its name, and set whether looping +// note: music flags 12 bits for tracknum (gme, other formats with more than one track) +// 13-15 aren't used yet // and the last bit we ignore (internal game flag for resetting music on reload) -void S_ChangeMusic(UINT32 mslotnum, boolean looping); +#define S_ChangeMusicInternal(a,b) S_ChangeMusic(a,0,b) +void S_ChangeMusic(const char *mmusic, UINT16 mflags, boolean looping); // Set Speed of Music boolean S_SpeedMusic(float speed); @@ -113,8 +111,8 @@ boolean S_SpeedMusic(float speed); void S_StopMusic(void); // Stop and resume music, during game PAUSE. -void S_PauseSound(void); -void S_ResumeSound(void); +void S_PauseAudio(void); +void S_ResumeAudio(void); // // Updates music & sounds diff --git a/src/sdl/mixer_sound.c b/src/sdl/mixer_sound.c index 71969209c..2ce546153 100644 --- a/src/sdl/mixer_sound.c +++ b/src/sdl/mixer_sound.c @@ -374,6 +374,7 @@ void I_FreeSfx(sfxinfo_t *sfx) if (sfx->data) Mix_FreeChunk(sfx->data); sfx->data = NULL; + sfx->lumpnum = LUMPERROR; } INT32 I_StartSound(sfxenum_t id, UINT8 vol, UINT8 sep, UINT8 pitch, UINT8 priority) diff --git a/src/sounds.c b/src/sounds.c index 1ec86e7bc..97bdf23ec 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -20,1067 +20,6 @@ #include "w_wad.h" #include "lua_script.h" -// -// Information about all the music -// - -musicinfo_t S_music[NUMMUSIC] = -{ - {NULL, 0, NULL, -1}, - {"map01m", 0, NULL, -1}, - {"map02m", 0, NULL, -1}, - {"map03m", 0, NULL, -1}, - {"map04m", 0, NULL, -1}, - {"map05m", 0, NULL, -1}, - {"map06m", 0, NULL, -1}, - {"map07m", 0, NULL, -1}, - {"map08m", 0, NULL, -1}, - {"map09m", 0, NULL, -1}, - {"map10m", 0, NULL, -1}, - {"map11m", 0, NULL, -1}, - {"map12m", 0, NULL, -1}, - {"map13m", 0, NULL, -1}, - {"map14m", 0, NULL, -1}, - {"map15m", 0, NULL, -1}, - {"map16m", 0, NULL, -1}, - {"map17m", 0, NULL, -1}, - {"map18m", 0, NULL, -1}, - {"map19m", 0, NULL, -1}, - {"map20m", 0, NULL, -1}, - {"map21m", 0, NULL, -1}, - {"map22m", 0, NULL, -1}, - {"map23m", 0, NULL, -1}, - {"map24m", 0, NULL, -1}, - {"map25m", 0, NULL, -1}, - {"map26m", 0, NULL, -1}, - {"map27m", 0, NULL, -1}, - {"map28m", 0, NULL, -1}, - {"map29m", 0, NULL, -1}, - {"map30m", 0, NULL, -1}, - {"map31m", 0, NULL, -1}, - {"map32m", 0, NULL, -1}, - {"map33m", 0, NULL, -1}, - {"map34m", 0, NULL, -1}, - {"map35m", 0, NULL, -1}, - {"map36m", 0, NULL, -1}, - {"map37m", 0, NULL, -1}, - {"map38m", 0, NULL, -1}, - {"map39m", 0, NULL, -1}, - {"map40m", 0, NULL, -1}, - {"map41m", 0, NULL, -1}, - {"map42m", 0, NULL, -1}, - {"map43m", 0, NULL, -1}, - {"map44m", 0, NULL, -1}, - {"map45m", 0, NULL, -1}, - {"map46m", 0, NULL, -1}, - {"map47m", 0, NULL, -1}, - {"map48m", 0, NULL, -1}, - {"map49m", 0, NULL, -1}, - {"map50m", 0, NULL, -1}, - {"map51m", 0, NULL, -1}, - {"map52m", 0, NULL, -1}, - {"map53m", 0, NULL, -1}, - {"map54m", 0, NULL, -1}, - {"map55m", 0, NULL, -1}, - {"map56m", 0, NULL, -1}, - {"map57m", 0, NULL, -1}, - {"map58m", 0, NULL, -1}, - {"map59m", 0, NULL, -1}, - {"map60m", 0, NULL, -1}, - {"map61m", 0, NULL, -1}, - {"map62m", 0, NULL, -1}, - {"map63m", 0, NULL, -1}, - {"map64m", 0, NULL, -1}, - {"map65m", 0, NULL, -1}, - {"map66m", 0, NULL, -1}, - {"map67m", 0, NULL, -1}, - {"map68m", 0, NULL, -1}, - {"map69m", 0, NULL, -1}, - {"map70m", 0, NULL, -1}, - {"map71m", 0, NULL, -1}, - {"map72m", 0, NULL, -1}, - {"map73m", 0, NULL, -1}, - {"map74m", 0, NULL, -1}, - {"map75m", 0, NULL, -1}, - {"map76m", 0, NULL, -1}, - {"map77m", 0, NULL, -1}, - {"map78m", 0, NULL, -1}, - {"map79m", 0, NULL, -1}, - {"map80m", 0, NULL, -1}, - {"map81m", 0, NULL, -1}, - {"map82m", 0, NULL, -1}, - {"map83m", 0, NULL, -1}, - {"map84m", 0, NULL, -1}, - {"map85m", 0, NULL, -1}, - {"map86m", 0, NULL, -1}, - {"map87m", 0, NULL, -1}, - {"map88m", 0, NULL, -1}, - {"map89m", 0, NULL, -1}, - {"map90m", 0, NULL, -1}, - {"map91m", 0, NULL, -1}, - {"map92m", 0, NULL, -1}, - {"map93m", 0, NULL, -1}, - {"map94m", 0, NULL, -1}, - {"map95m", 0, NULL, -1}, - {"map96m", 0, NULL, -1}, - {"map97m", 0, NULL, -1}, - {"map98m", 0, NULL, -1}, - {"map99m", 0, NULL, -1}, - {"mapa0m", 0, NULL, -1}, - {"mapa1m", 0, NULL, -1}, - {"mapa2m", 0, NULL, -1}, - {"mapa3m", 0, NULL, -1}, - {"mapa4m", 0, NULL, -1}, - {"mapa5m", 0, NULL, -1}, - {"mapa6m", 0, NULL, -1}, - {"mapa7m", 0, NULL, -1}, - {"mapa8m", 0, NULL, -1}, - {"mapa9m", 0, NULL, -1}, - {"mapaam", 0, NULL, -1}, - {"mapabm", 0, NULL, -1}, - {"mapacm", 0, NULL, -1}, - {"mapadm", 0, NULL, -1}, - {"mapaem", 0, NULL, -1}, - {"mapafm", 0, NULL, -1}, - {"mapagm", 0, NULL, -1}, - {"mapahm", 0, NULL, -1}, - {"mapaim", 0, NULL, -1}, - {"mapajm", 0, NULL, -1}, - {"mapakm", 0, NULL, -1}, - {"mapalm", 0, NULL, -1}, - {"mapamm", 0, NULL, -1}, - {"mapanm", 0, NULL, -1}, - {"mapaom", 0, NULL, -1}, - {"mapapm", 0, NULL, -1}, - {"mapaqm", 0, NULL, -1}, - {"maparm", 0, NULL, -1}, - {"mapasm", 0, NULL, -1}, - {"mapatm", 0, NULL, -1}, - {"mapaum", 0, NULL, -1}, - {"mapavm", 0, NULL, -1}, - {"mapawm", 0, NULL, -1}, - {"mapaxm", 0, NULL, -1}, - {"mapaym", 0, NULL, -1}, - {"mapazm", 0, NULL, -1}, - {"mapb0m", 0, NULL, -1}, - {"mapb1m", 0, NULL, -1}, - {"mapb2m", 0, NULL, -1}, - {"mapb3m", 0, NULL, -1}, - {"mapb4m", 0, NULL, -1}, - {"mapb5m", 0, NULL, -1}, - {"mapb6m", 0, NULL, -1}, - {"mapb7m", 0, NULL, -1}, - {"mapb8m", 0, NULL, -1}, - {"mapb9m", 0, NULL, -1}, - {"mapbam", 0, NULL, -1}, - {"mapbbm", 0, NULL, -1}, - {"mapbcm", 0, NULL, -1}, - {"mapbdm", 0, NULL, -1}, - {"mapbem", 0, NULL, -1}, - {"mapbfm", 0, NULL, -1}, - {"mapbgm", 0, NULL, -1}, - {"mapbhm", 0, NULL, -1}, - {"mapbim", 0, NULL, -1}, - {"mapbjm", 0, NULL, -1}, - {"mapbkm", 0, NULL, -1}, - {"mapblm", 0, NULL, -1}, - {"mapbmm", 0, NULL, -1}, - {"mapbnm", 0, NULL, -1}, - {"mapbom", 0, NULL, -1}, - {"mapbpm", 0, NULL, -1}, - {"mapbqm", 0, NULL, -1}, - {"mapbrm", 0, NULL, -1}, - {"mapbsm", 0, NULL, -1}, - {"mapbtm", 0, NULL, -1}, - {"mapbum", 0, NULL, -1}, - {"mapbvm", 0, NULL, -1}, - {"mapbwm", 0, NULL, -1}, - {"mapbxm", 0, NULL, -1}, - {"mapbym", 0, NULL, -1}, - {"mapbzm", 0, NULL, -1}, - {"mapc0m", 0, NULL, -1}, - {"mapc1m", 0, NULL, -1}, - {"mapc2m", 0, NULL, -1}, - {"mapc3m", 0, NULL, -1}, - {"mapc4m", 0, NULL, -1}, - {"mapc5m", 0, NULL, -1}, - {"mapc6m", 0, NULL, -1}, - {"mapc7m", 0, NULL, -1}, - {"mapc8m", 0, NULL, -1}, - {"mapc9m", 0, NULL, -1}, - {"mapcam", 0, NULL, -1}, - {"mapcbm", 0, NULL, -1}, - {"mapccm", 0, NULL, -1}, - {"mapcdm", 0, NULL, -1}, - {"mapcem", 0, NULL, -1}, - {"mapcfm", 0, NULL, -1}, - {"mapcgm", 0, NULL, -1}, - {"mapchm", 0, NULL, -1}, - {"mapcim", 0, NULL, -1}, - {"mapcjm", 0, NULL, -1}, - {"mapckm", 0, NULL, -1}, - {"mapclm", 0, NULL, -1}, - {"mapcmm", 0, NULL, -1}, - {"mapcnm", 0, NULL, -1}, - {"mapcom", 0, NULL, -1}, - {"mapcpm", 0, NULL, -1}, - {"mapcqm", 0, NULL, -1}, - {"mapcrm", 0, NULL, -1}, - {"mapcsm", 0, NULL, -1}, - {"mapctm", 0, NULL, -1}, - {"mapcum", 0, NULL, -1}, - {"mapcvm", 0, NULL, -1}, - {"mapcwm", 0, NULL, -1}, - {"mapcxm", 0, NULL, -1}, - {"mapcym", 0, NULL, -1}, - {"mapczm", 0, NULL, -1}, - {"mapd0m", 0, NULL, -1}, - {"mapd1m", 0, NULL, -1}, - {"mapd2m", 0, NULL, -1}, - {"mapd3m", 0, NULL, -1}, - {"mapd4m", 0, NULL, -1}, - {"mapd5m", 0, NULL, -1}, - {"mapd6m", 0, NULL, -1}, - {"mapd7m", 0, NULL, -1}, - {"mapd8m", 0, NULL, -1}, - {"mapd9m", 0, NULL, -1}, - {"mapdam", 0, NULL, -1}, - {"mapdbm", 0, NULL, -1}, - {"mapdcm", 0, NULL, -1}, - {"mapddm", 0, NULL, -1}, - {"mapdem", 0, NULL, -1}, - {"mapdfm", 0, NULL, -1}, - {"mapdgm", 0, NULL, -1}, - {"mapdhm", 0, NULL, -1}, - {"mapdim", 0, NULL, -1}, - {"mapdjm", 0, NULL, -1}, - {"mapdkm", 0, NULL, -1}, - {"mapdlm", 0, NULL, -1}, - {"mapdmm", 0, NULL, -1}, - {"mapdnm", 0, NULL, -1}, - {"mapdom", 0, NULL, -1}, - {"mapdpm", 0, NULL, -1}, - {"mapdqm", 0, NULL, -1}, - {"mapdrm", 0, NULL, -1}, - {"mapdsm", 0, NULL, -1}, - {"mapdtm", 0, NULL, -1}, - {"mapdum", 0, NULL, -1}, - {"mapdvm", 0, NULL, -1}, - {"mapdwm", 0, NULL, -1}, - {"mapdxm", 0, NULL, -1}, - {"mapdym", 0, NULL, -1}, - {"mapdzm", 0, NULL, -1}, - {"mape0m", 0, NULL, -1}, - {"mape1m", 0, NULL, -1}, - {"mape2m", 0, NULL, -1}, - {"mape3m", 0, NULL, -1}, - {"mape4m", 0, NULL, -1}, - {"mape5m", 0, NULL, -1}, - {"mape6m", 0, NULL, -1}, - {"mape7m", 0, NULL, -1}, - {"mape8m", 0, NULL, -1}, - {"mape9m", 0, NULL, -1}, - {"mapeam", 0, NULL, -1}, - {"mapebm", 0, NULL, -1}, - {"mapecm", 0, NULL, -1}, - {"mapedm", 0, NULL, -1}, - {"mapeem", 0, NULL, -1}, - {"mapefm", 0, NULL, -1}, - {"mapegm", 0, NULL, -1}, - {"mapehm", 0, NULL, -1}, - {"mapeim", 0, NULL, -1}, - {"mapejm", 0, NULL, -1}, - {"mapekm", 0, NULL, -1}, - {"mapelm", 0, NULL, -1}, - {"mapemm", 0, NULL, -1}, - {"mapenm", 0, NULL, -1}, - {"mapeom", 0, NULL, -1}, - {"mapepm", 0, NULL, -1}, - {"mapeqm", 0, NULL, -1}, - {"maperm", 0, NULL, -1}, - {"mapesm", 0, NULL, -1}, - {"mapetm", 0, NULL, -1}, - {"mapeum", 0, NULL, -1}, - {"mapevm", 0, NULL, -1}, - {"mapewm", 0, NULL, -1}, - {"mapexm", 0, NULL, -1}, - {"mapeym", 0, NULL, -1}, - {"mapezm", 0, NULL, -1}, - {"mapf0m", 0, NULL, -1}, - {"mapf1m", 0, NULL, -1}, - {"mapf2m", 0, NULL, -1}, - {"mapf3m", 0, NULL, -1}, - {"mapf4m", 0, NULL, -1}, - {"mapf5m", 0, NULL, -1}, - {"mapf6m", 0, NULL, -1}, - {"mapf7m", 0, NULL, -1}, - {"mapf8m", 0, NULL, -1}, - {"mapf9m", 0, NULL, -1}, - {"mapfam", 0, NULL, -1}, - {"mapfbm", 0, NULL, -1}, - {"mapfcm", 0, NULL, -1}, - {"mapfdm", 0, NULL, -1}, - {"mapfem", 0, NULL, -1}, - {"mapffm", 0, NULL, -1}, - {"mapfgm", 0, NULL, -1}, - {"mapfhm", 0, NULL, -1}, - {"mapfim", 0, NULL, -1}, - {"mapfjm", 0, NULL, -1}, - {"mapfkm", 0, NULL, -1}, - {"mapflm", 0, NULL, -1}, - {"mapfmm", 0, NULL, -1}, - {"mapfnm", 0, NULL, -1}, - {"mapfom", 0, NULL, -1}, - {"mapfpm", 0, NULL, -1}, - {"mapfqm", 0, NULL, -1}, - {"mapfrm", 0, NULL, -1}, - {"mapfsm", 0, NULL, -1}, - {"mapftm", 0, NULL, -1}, - {"mapfum", 0, NULL, -1}, - {"mapfvm", 0, NULL, -1}, - {"mapfwm", 0, NULL, -1}, - {"mapfxm", 0, NULL, -1}, - {"mapfym", 0, NULL, -1}, - {"mapfzm", 0, NULL, -1}, - {"mapg0m", 0, NULL, -1}, - {"mapg1m", 0, NULL, -1}, - {"mapg2m", 0, NULL, -1}, - {"mapg3m", 0, NULL, -1}, - {"mapg4m", 0, NULL, -1}, - {"mapg5m", 0, NULL, -1}, - {"mapg6m", 0, NULL, -1}, - {"mapg7m", 0, NULL, -1}, - {"mapg8m", 0, NULL, -1}, - {"mapg9m", 0, NULL, -1}, - {"mapgam", 0, NULL, -1}, - {"mapgbm", 0, NULL, -1}, - {"mapgcm", 0, NULL, -1}, - {"mapgdm", 0, NULL, -1}, - {"mapgem", 0, NULL, -1}, - {"mapgfm", 0, NULL, -1}, - {"mapggm", 0, NULL, -1}, - {"mapghm", 0, NULL, -1}, - {"mapgim", 0, NULL, -1}, - {"mapgjm", 0, NULL, -1}, - {"mapgkm", 0, NULL, -1}, - {"mapglm", 0, NULL, -1}, - {"mapgmm", 0, NULL, -1}, - {"mapgnm", 0, NULL, -1}, - {"mapgom", 0, NULL, -1}, - {"mapgpm", 0, NULL, -1}, - {"mapgqm", 0, NULL, -1}, - {"mapgrm", 0, NULL, -1}, - {"mapgsm", 0, NULL, -1}, - {"mapgtm", 0, NULL, -1}, - {"mapgum", 0, NULL, -1}, - {"mapgvm", 0, NULL, -1}, - {"mapgwm", 0, NULL, -1}, - {"mapgxm", 0, NULL, -1}, - {"mapgym", 0, NULL, -1}, - {"mapgzm", 0, NULL, -1}, - {"maph0m", 0, NULL, -1}, - {"maph1m", 0, NULL, -1}, - {"maph2m", 0, NULL, -1}, - {"maph3m", 0, NULL, -1}, - {"maph4m", 0, NULL, -1}, - {"maph5m", 0, NULL, -1}, - {"maph6m", 0, NULL, -1}, - {"maph7m", 0, NULL, -1}, - {"maph8m", 0, NULL, -1}, - {"maph9m", 0, NULL, -1}, - {"mapham", 0, NULL, -1}, - {"maphbm", 0, NULL, -1}, - {"maphcm", 0, NULL, -1}, - {"maphdm", 0, NULL, -1}, - {"maphem", 0, NULL, -1}, - {"maphfm", 0, NULL, -1}, - {"maphgm", 0, NULL, -1}, - {"maphhm", 0, NULL, -1}, - {"maphim", 0, NULL, -1}, - {"maphjm", 0, NULL, -1}, - {"maphkm", 0, NULL, -1}, - {"maphlm", 0, NULL, -1}, - {"maphmm", 0, NULL, -1}, - {"maphnm", 0, NULL, -1}, - {"maphom", 0, NULL, -1}, - {"maphpm", 0, NULL, -1}, - {"maphqm", 0, NULL, -1}, - {"maphrm", 0, NULL, -1}, - {"maphsm", 0, NULL, -1}, - {"maphtm", 0, NULL, -1}, - {"maphum", 0, NULL, -1}, - {"maphvm", 0, NULL, -1}, - {"maphwm", 0, NULL, -1}, - {"maphxm", 0, NULL, -1}, - {"maphym", 0, NULL, -1}, - {"maphzm", 0, NULL, -1}, - {"mapi0m", 0, NULL, -1}, - {"mapi1m", 0, NULL, -1}, - {"mapi2m", 0, NULL, -1}, - {"mapi3m", 0, NULL, -1}, - {"mapi4m", 0, NULL, -1}, - {"mapi5m", 0, NULL, -1}, - {"mapi6m", 0, NULL, -1}, - {"mapi7m", 0, NULL, -1}, - {"mapi8m", 0, NULL, -1}, - {"mapi9m", 0, NULL, -1}, - {"mapiam", 0, NULL, -1}, - {"mapibm", 0, NULL, -1}, - {"mapicm", 0, NULL, -1}, - {"mapidm", 0, NULL, -1}, - {"mapiem", 0, NULL, -1}, - {"mapifm", 0, NULL, -1}, - {"mapigm", 0, NULL, -1}, - {"mapihm", 0, NULL, -1}, - {"mapiim", 0, NULL, -1}, - {"mapijm", 0, NULL, -1}, - {"mapikm", 0, NULL, -1}, - {"mapilm", 0, NULL, -1}, - {"mapimm", 0, NULL, -1}, - {"mapinm", 0, NULL, -1}, - {"mapiom", 0, NULL, -1}, - {"mapipm", 0, NULL, -1}, - {"mapiqm", 0, NULL, -1}, - {"mapirm", 0, NULL, -1}, - {"mapism", 0, NULL, -1}, - {"mapitm", 0, NULL, -1}, - {"mapium", 0, NULL, -1}, - {"mapivm", 0, NULL, -1}, - {"mapiwm", 0, NULL, -1}, - {"mapixm", 0, NULL, -1}, - {"mapiym", 0, NULL, -1}, - {"mapizm", 0, NULL, -1}, - {"mapj0m", 0, NULL, -1}, - {"mapj1m", 0, NULL, -1}, - {"mapj2m", 0, NULL, -1}, - {"mapj3m", 0, NULL, -1}, - {"mapj4m", 0, NULL, -1}, - {"mapj5m", 0, NULL, -1}, - {"mapj6m", 0, NULL, -1}, - {"mapj7m", 0, NULL, -1}, - {"mapj8m", 0, NULL, -1}, - {"mapj9m", 0, NULL, -1}, - {"mapjam", 0, NULL, -1}, - {"mapjbm", 0, NULL, -1}, - {"mapjcm", 0, NULL, -1}, - {"mapjdm", 0, NULL, -1}, - {"mapjem", 0, NULL, -1}, - {"mapjfm", 0, NULL, -1}, - {"mapjgm", 0, NULL, -1}, - {"mapjhm", 0, NULL, -1}, - {"mapjim", 0, NULL, -1}, - {"mapjjm", 0, NULL, -1}, - {"mapjkm", 0, NULL, -1}, - {"mapjlm", 0, NULL, -1}, - {"mapjmm", 0, NULL, -1}, - {"mapjnm", 0, NULL, -1}, - {"mapjom", 0, NULL, -1}, - {"mapjpm", 0, NULL, -1}, - {"mapjqm", 0, NULL, -1}, - {"mapjrm", 0, NULL, -1}, - {"mapjsm", 0, NULL, -1}, - {"mapjtm", 0, NULL, -1}, - {"mapjum", 0, NULL, -1}, - {"mapjvm", 0, NULL, -1}, - {"mapjwm", 0, NULL, -1}, - {"mapjxm", 0, NULL, -1}, - {"mapjym", 0, NULL, -1}, - {"mapjzm", 0, NULL, -1}, - {"mapk0m", 0, NULL, -1}, - {"mapk1m", 0, NULL, -1}, - {"mapk2m", 0, NULL, -1}, - {"mapk3m", 0, NULL, -1}, - {"mapk4m", 0, NULL, -1}, - {"mapk5m", 0, NULL, -1}, - {"mapk6m", 0, NULL, -1}, - {"mapk7m", 0, NULL, -1}, - {"mapk8m", 0, NULL, -1}, - {"mapk9m", 0, NULL, -1}, - {"mapkam", 0, NULL, -1}, - {"mapkbm", 0, NULL, -1}, - {"mapkcm", 0, NULL, -1}, - {"mapkdm", 0, NULL, -1}, - {"mapkem", 0, NULL, -1}, - {"mapkfm", 0, NULL, -1}, - {"mapkgm", 0, NULL, -1}, - {"mapkhm", 0, NULL, -1}, - {"mapkim", 0, NULL, -1}, - {"mapkjm", 0, NULL, -1}, - {"mapkkm", 0, NULL, -1}, - {"mapklm", 0, NULL, -1}, - {"mapkmm", 0, NULL, -1}, - {"mapknm", 0, NULL, -1}, - {"mapkom", 0, NULL, -1}, - {"mapkpm", 0, NULL, -1}, - {"mapkqm", 0, NULL, -1}, - {"mapkrm", 0, NULL, -1}, - {"mapksm", 0, NULL, -1}, - {"mapktm", 0, NULL, -1}, - {"mapkum", 0, NULL, -1}, - {"mapkvm", 0, NULL, -1}, - {"mapkwm", 0, NULL, -1}, - {"mapkxm", 0, NULL, -1}, - {"mapkym", 0, NULL, -1}, - {"mapkzm", 0, NULL, -1}, - {"mapl0m", 0, NULL, -1}, - {"mapl1m", 0, NULL, -1}, - {"mapl2m", 0, NULL, -1}, - {"mapl3m", 0, NULL, -1}, - {"mapl4m", 0, NULL, -1}, - {"mapl5m", 0, NULL, -1}, - {"mapl6m", 0, NULL, -1}, - {"mapl7m", 0, NULL, -1}, - {"mapl8m", 0, NULL, -1}, - {"mapl9m", 0, NULL, -1}, - {"maplam", 0, NULL, -1}, - {"maplbm", 0, NULL, -1}, - {"maplcm", 0, NULL, -1}, - {"mapldm", 0, NULL, -1}, - {"maplem", 0, NULL, -1}, - {"maplfm", 0, NULL, -1}, - {"maplgm", 0, NULL, -1}, - {"maplhm", 0, NULL, -1}, - {"maplim", 0, NULL, -1}, - {"mapljm", 0, NULL, -1}, - {"maplkm", 0, NULL, -1}, - {"mapllm", 0, NULL, -1}, - {"maplmm", 0, NULL, -1}, - {"maplnm", 0, NULL, -1}, - {"maplom", 0, NULL, -1}, - {"maplpm", 0, NULL, -1}, - {"maplqm", 0, NULL, -1}, - {"maplrm", 0, NULL, -1}, - {"maplsm", 0, NULL, -1}, - {"mapltm", 0, NULL, -1}, - {"maplum", 0, NULL, -1}, - {"maplvm", 0, NULL, -1}, - {"maplwm", 0, NULL, -1}, - {"maplxm", 0, NULL, -1}, - {"maplym", 0, NULL, -1}, - {"maplzm", 0, NULL, -1}, - {"mapm0m", 0, NULL, -1}, - {"mapm1m", 0, NULL, -1}, - {"mapm2m", 0, NULL, -1}, - {"mapm3m", 0, NULL, -1}, - {"mapm4m", 0, NULL, -1}, - {"mapm5m", 0, NULL, -1}, - {"mapm6m", 0, NULL, -1}, - {"mapm7m", 0, NULL, -1}, - {"mapm8m", 0, NULL, -1}, - {"mapm9m", 0, NULL, -1}, - {"mapmam", 0, NULL, -1}, - {"mapmbm", 0, NULL, -1}, - {"mapmcm", 0, NULL, -1}, - {"mapmdm", 0, NULL, -1}, - {"mapmem", 0, NULL, -1}, - {"mapmfm", 0, NULL, -1}, - {"mapmgm", 0, NULL, -1}, - {"mapmhm", 0, NULL, -1}, - {"mapmim", 0, NULL, -1}, - {"mapmjm", 0, NULL, -1}, - {"mapmkm", 0, NULL, -1}, - {"mapmlm", 0, NULL, -1}, - {"mapmmm", 0, NULL, -1}, - {"mapmnm", 0, NULL, -1}, - {"mapmom", 0, NULL, -1}, - {"mapmpm", 0, NULL, -1}, - {"mapmqm", 0, NULL, -1}, - {"mapmrm", 0, NULL, -1}, - {"mapmsm", 0, NULL, -1}, - {"mapmtm", 0, NULL, -1}, - {"mapmum", 0, NULL, -1}, - {"mapmvm", 0, NULL, -1}, - {"mapmwm", 0, NULL, -1}, - {"mapmxm", 0, NULL, -1}, - {"mapmym", 0, NULL, -1}, - {"mapmzm", 0, NULL, -1}, - {"mapn0m", 0, NULL, -1}, - {"mapn1m", 0, NULL, -1}, - {"mapn2m", 0, NULL, -1}, - {"mapn3m", 0, NULL, -1}, - {"mapn4m", 0, NULL, -1}, - {"mapn5m", 0, NULL, -1}, - {"mapn6m", 0, NULL, -1}, - {"mapn7m", 0, NULL, -1}, - {"mapn8m", 0, NULL, -1}, - {"mapn9m", 0, NULL, -1}, - {"mapnam", 0, NULL, -1}, - {"mapnbm", 0, NULL, -1}, - {"mapncm", 0, NULL, -1}, - {"mapndm", 0, NULL, -1}, - {"mapnem", 0, NULL, -1}, - {"mapnfm", 0, NULL, -1}, - {"mapngm", 0, NULL, -1}, - {"mapnhm", 0, NULL, -1}, - {"mapnim", 0, NULL, -1}, - {"mapnjm", 0, NULL, -1}, - {"mapnkm", 0, NULL, -1}, - {"mapnlm", 0, NULL, -1}, - {"mapnmm", 0, NULL, -1}, - {"mapnnm", 0, NULL, -1}, - {"mapnom", 0, NULL, -1}, - {"mapnpm", 0, NULL, -1}, - {"mapnqm", 0, NULL, -1}, - {"mapnrm", 0, NULL, -1}, - {"mapnsm", 0, NULL, -1}, - {"mapntm", 0, NULL, -1}, - {"mapnum", 0, NULL, -1}, - {"mapnvm", 0, NULL, -1}, - {"mapnwm", 0, NULL, -1}, - {"mapnxm", 0, NULL, -1}, - {"mapnym", 0, NULL, -1}, - {"mapnzm", 0, NULL, -1}, - {"mapo0m", 0, NULL, -1}, - {"mapo1m", 0, NULL, -1}, - {"mapo2m", 0, NULL, -1}, - {"mapo3m", 0, NULL, -1}, - {"mapo4m", 0, NULL, -1}, - {"mapo5m", 0, NULL, -1}, - {"mapo6m", 0, NULL, -1}, - {"mapo7m", 0, NULL, -1}, - {"mapo8m", 0, NULL, -1}, - {"mapo9m", 0, NULL, -1}, - {"mapoam", 0, NULL, -1}, - {"mapobm", 0, NULL, -1}, - {"mapocm", 0, NULL, -1}, - {"mapodm", 0, NULL, -1}, - {"mapoem", 0, NULL, -1}, - {"mapofm", 0, NULL, -1}, - {"mapogm", 0, NULL, -1}, - {"mapohm", 0, NULL, -1}, - {"mapoim", 0, NULL, -1}, - {"mapojm", 0, NULL, -1}, - {"mapokm", 0, NULL, -1}, - {"mapolm", 0, NULL, -1}, - {"mapomm", 0, NULL, -1}, - {"maponm", 0, NULL, -1}, - {"mapoom", 0, NULL, -1}, - {"mapopm", 0, NULL, -1}, - {"mapoqm", 0, NULL, -1}, - {"maporm", 0, NULL, -1}, - {"maposm", 0, NULL, -1}, - {"mapotm", 0, NULL, -1}, - {"mapoum", 0, NULL, -1}, - {"mapovm", 0, NULL, -1}, - {"mapowm", 0, NULL, -1}, - {"mapoxm", 0, NULL, -1}, - {"mapoym", 0, NULL, -1}, - {"mapozm", 0, NULL, -1}, - {"mapp0m", 0, NULL, -1}, - {"mapp1m", 0, NULL, -1}, - {"mapp2m", 0, NULL, -1}, - {"mapp3m", 0, NULL, -1}, - {"mapp4m", 0, NULL, -1}, - {"mapp5m", 0, NULL, -1}, - {"mapp6m", 0, NULL, -1}, - {"mapp7m", 0, NULL, -1}, - {"mapp8m", 0, NULL, -1}, - {"mapp9m", 0, NULL, -1}, - {"mappam", 0, NULL, -1}, - {"mappbm", 0, NULL, -1}, - {"mappcm", 0, NULL, -1}, - {"mappdm", 0, NULL, -1}, - {"mappem", 0, NULL, -1}, - {"mappfm", 0, NULL, -1}, - {"mappgm", 0, NULL, -1}, - {"mapphm", 0, NULL, -1}, - {"mappim", 0, NULL, -1}, - {"mappjm", 0, NULL, -1}, - {"mappkm", 0, NULL, -1}, - {"mapplm", 0, NULL, -1}, - {"mappmm", 0, NULL, -1}, - {"mappnm", 0, NULL, -1}, - {"mappom", 0, NULL, -1}, - {"mapppm", 0, NULL, -1}, - {"mappqm", 0, NULL, -1}, - {"mapprm", 0, NULL, -1}, - {"mappsm", 0, NULL, -1}, - {"mapptm", 0, NULL, -1}, - {"mappum", 0, NULL, -1}, - {"mappvm", 0, NULL, -1}, - {"mappwm", 0, NULL, -1}, - {"mappxm", 0, NULL, -1}, - {"mappym", 0, NULL, -1}, - {"mappzm", 0, NULL, -1}, - {"mapq0m", 0, NULL, -1}, - {"mapq1m", 0, NULL, -1}, - {"mapq2m", 0, NULL, -1}, - {"mapq3m", 0, NULL, -1}, - {"mapq4m", 0, NULL, -1}, - {"mapq5m", 0, NULL, -1}, - {"mapq6m", 0, NULL, -1}, - {"mapq7m", 0, NULL, -1}, - {"mapq8m", 0, NULL, -1}, - {"mapq9m", 0, NULL, -1}, - {"mapqam", 0, NULL, -1}, - {"mapqbm", 0, NULL, -1}, - {"mapqcm", 0, NULL, -1}, - {"mapqdm", 0, NULL, -1}, - {"mapqem", 0, NULL, -1}, - {"mapqfm", 0, NULL, -1}, - {"mapqgm", 0, NULL, -1}, - {"mapqhm", 0, NULL, -1}, - {"mapqim", 0, NULL, -1}, - {"mapqjm", 0, NULL, -1}, - {"mapqkm", 0, NULL, -1}, - {"mapqlm", 0, NULL, -1}, - {"mapqmm", 0, NULL, -1}, - {"mapqnm", 0, NULL, -1}, - {"mapqom", 0, NULL, -1}, - {"mapqpm", 0, NULL, -1}, - {"mapqqm", 0, NULL, -1}, - {"mapqrm", 0, NULL, -1}, - {"mapqsm", 0, NULL, -1}, - {"mapqtm", 0, NULL, -1}, - {"mapqum", 0, NULL, -1}, - {"mapqvm", 0, NULL, -1}, - {"mapqwm", 0, NULL, -1}, - {"mapqxm", 0, NULL, -1}, - {"mapqym", 0, NULL, -1}, - {"mapqzm", 0, NULL, -1}, - {"mapr0m", 0, NULL, -1}, - {"mapr1m", 0, NULL, -1}, - {"mapr2m", 0, NULL, -1}, - {"mapr3m", 0, NULL, -1}, - {"mapr4m", 0, NULL, -1}, - {"mapr5m", 0, NULL, -1}, - {"mapr6m", 0, NULL, -1}, - {"mapr7m", 0, NULL, -1}, - {"mapr8m", 0, NULL, -1}, - {"mapr9m", 0, NULL, -1}, - {"mapram", 0, NULL, -1}, - {"maprbm", 0, NULL, -1}, - {"maprcm", 0, NULL, -1}, - {"maprdm", 0, NULL, -1}, - {"maprem", 0, NULL, -1}, - {"maprfm", 0, NULL, -1}, - {"maprgm", 0, NULL, -1}, - {"maprhm", 0, NULL, -1}, - {"maprim", 0, NULL, -1}, - {"maprjm", 0, NULL, -1}, - {"maprkm", 0, NULL, -1}, - {"maprlm", 0, NULL, -1}, - {"maprmm", 0, NULL, -1}, - {"maprnm", 0, NULL, -1}, - {"maprom", 0, NULL, -1}, - {"maprpm", 0, NULL, -1}, - {"maprqm", 0, NULL, -1}, - {"maprrm", 0, NULL, -1}, - {"maprsm", 0, NULL, -1}, - {"maprtm", 0, NULL, -1}, - {"maprum", 0, NULL, -1}, - {"maprvm", 0, NULL, -1}, - {"maprwm", 0, NULL, -1}, - {"maprxm", 0, NULL, -1}, - {"maprym", 0, NULL, -1}, - {"maprzm", 0, NULL, -1}, - {"maps0m", 0, NULL, -1}, - {"maps1m", 0, NULL, -1}, - {"maps2m", 0, NULL, -1}, - {"maps3m", 0, NULL, -1}, - {"maps4m", 0, NULL, -1}, - {"maps5m", 0, NULL, -1}, - {"maps6m", 0, NULL, -1}, - {"maps7m", 0, NULL, -1}, - {"maps8m", 0, NULL, -1}, - {"maps9m", 0, NULL, -1}, - {"mapsam", 0, NULL, -1}, - {"mapsbm", 0, NULL, -1}, - {"mapscm", 0, NULL, -1}, - {"mapsdm", 0, NULL, -1}, - {"mapsem", 0, NULL, -1}, - {"mapsfm", 0, NULL, -1}, - {"mapsgm", 0, NULL, -1}, - {"mapshm", 0, NULL, -1}, - {"mapsim", 0, NULL, -1}, - {"mapsjm", 0, NULL, -1}, - {"mapskm", 0, NULL, -1}, - {"mapslm", 0, NULL, -1}, - {"mapsmm", 0, NULL, -1}, - {"mapsnm", 0, NULL, -1}, - {"mapsom", 0, NULL, -1}, - {"mapspm", 0, NULL, -1}, - {"mapsqm", 0, NULL, -1}, - {"mapsrm", 0, NULL, -1}, - {"mapssm", 0, NULL, -1}, - {"mapstm", 0, NULL, -1}, - {"mapsum", 0, NULL, -1}, - {"mapsvm", 0, NULL, -1}, - {"mapswm", 0, NULL, -1}, - {"mapsxm", 0, NULL, -1}, - {"mapsym", 0, NULL, -1}, - {"mapszm", 0, NULL, -1}, - {"mapt0m", 0, NULL, -1}, - {"mapt1m", 0, NULL, -1}, - {"mapt2m", 0, NULL, -1}, - {"mapt3m", 0, NULL, -1}, - {"mapt4m", 0, NULL, -1}, - {"mapt5m", 0, NULL, -1}, - {"mapt6m", 0, NULL, -1}, - {"mapt7m", 0, NULL, -1}, - {"mapt8m", 0, NULL, -1}, - {"mapt9m", 0, NULL, -1}, - {"maptam", 0, NULL, -1}, - {"maptbm", 0, NULL, -1}, - {"maptcm", 0, NULL, -1}, - {"maptdm", 0, NULL, -1}, - {"maptem", 0, NULL, -1}, - {"maptfm", 0, NULL, -1}, - {"maptgm", 0, NULL, -1}, - {"mapthm", 0, NULL, -1}, - {"maptim", 0, NULL, -1}, - {"maptjm", 0, NULL, -1}, - {"maptkm", 0, NULL, -1}, - {"maptlm", 0, NULL, -1}, - {"maptmm", 0, NULL, -1}, - {"maptnm", 0, NULL, -1}, - {"maptom", 0, NULL, -1}, - {"maptpm", 0, NULL, -1}, - {"maptqm", 0, NULL, -1}, - {"maptrm", 0, NULL, -1}, - {"maptsm", 0, NULL, -1}, - {"mapttm", 0, NULL, -1}, - {"maptum", 0, NULL, -1}, - {"maptvm", 0, NULL, -1}, - {"maptwm", 0, NULL, -1}, - {"maptxm", 0, NULL, -1}, - {"maptym", 0, NULL, -1}, - {"maptzm", 0, NULL, -1}, - {"mapu0m", 0, NULL, -1}, - {"mapu1m", 0, NULL, -1}, - {"mapu2m", 0, NULL, -1}, - {"mapu3m", 0, NULL, -1}, - {"mapu4m", 0, NULL, -1}, - {"mapu5m", 0, NULL, -1}, - {"mapu6m", 0, NULL, -1}, - {"mapu7m", 0, NULL, -1}, - {"mapu8m", 0, NULL, -1}, - {"mapu9m", 0, NULL, -1}, - {"mapuam", 0, NULL, -1}, - {"mapubm", 0, NULL, -1}, - {"mapucm", 0, NULL, -1}, - {"mapudm", 0, NULL, -1}, - {"mapuem", 0, NULL, -1}, - {"mapufm", 0, NULL, -1}, - {"mapugm", 0, NULL, -1}, - {"mapuhm", 0, NULL, -1}, - {"mapuim", 0, NULL, -1}, - {"mapujm", 0, NULL, -1}, - {"mapukm", 0, NULL, -1}, - {"mapulm", 0, NULL, -1}, - {"mapumm", 0, NULL, -1}, - {"mapunm", 0, NULL, -1}, - {"mapuom", 0, NULL, -1}, - {"mapupm", 0, NULL, -1}, - {"mapuqm", 0, NULL, -1}, - {"mapurm", 0, NULL, -1}, - {"mapusm", 0, NULL, -1}, - {"maputm", 0, NULL, -1}, - {"mapuum", 0, NULL, -1}, - {"mapuvm", 0, NULL, -1}, - {"mapuwm", 0, NULL, -1}, - {"mapuxm", 0, NULL, -1}, - {"mapuym", 0, NULL, -1}, - {"mapuzm", 0, NULL, -1}, - {"mapv0m", 0, NULL, -1}, - {"mapv1m", 0, NULL, -1}, - {"mapv2m", 0, NULL, -1}, - {"mapv3m", 0, NULL, -1}, - {"mapv4m", 0, NULL, -1}, - {"mapv5m", 0, NULL, -1}, - {"mapv6m", 0, NULL, -1}, - {"mapv7m", 0, NULL, -1}, - {"mapv8m", 0, NULL, -1}, - {"mapv9m", 0, NULL, -1}, - {"mapvam", 0, NULL, -1}, - {"mapvbm", 0, NULL, -1}, - {"mapvcm", 0, NULL, -1}, - {"mapvdm", 0, NULL, -1}, - {"mapvem", 0, NULL, -1}, - {"mapvfm", 0, NULL, -1}, - {"mapvgm", 0, NULL, -1}, - {"mapvhm", 0, NULL, -1}, - {"mapvim", 0, NULL, -1}, - {"mapvjm", 0, NULL, -1}, - {"mapvkm", 0, NULL, -1}, - {"mapvlm", 0, NULL, -1}, - {"mapvmm", 0, NULL, -1}, - {"mapvnm", 0, NULL, -1}, - {"mapvom", 0, NULL, -1}, - {"mapvpm", 0, NULL, -1}, - {"mapvqm", 0, NULL, -1}, - {"mapvrm", 0, NULL, -1}, - {"mapvsm", 0, NULL, -1}, - {"mapvtm", 0, NULL, -1}, - {"mapvum", 0, NULL, -1}, - {"mapvvm", 0, NULL, -1}, - {"mapvwm", 0, NULL, -1}, - {"mapvxm", 0, NULL, -1}, - {"mapvym", 0, NULL, -1}, - {"mapvzm", 0, NULL, -1}, - {"mapw0m", 0, NULL, -1}, - {"mapw1m", 0, NULL, -1}, - {"mapw2m", 0, NULL, -1}, - {"mapw3m", 0, NULL, -1}, - {"mapw4m", 0, NULL, -1}, - {"mapw5m", 0, NULL, -1}, - {"mapw6m", 0, NULL, -1}, - {"mapw7m", 0, NULL, -1}, - {"mapw8m", 0, NULL, -1}, - {"mapw9m", 0, NULL, -1}, - {"mapwam", 0, NULL, -1}, - {"mapwbm", 0, NULL, -1}, - {"mapwcm", 0, NULL, -1}, - {"mapwdm", 0, NULL, -1}, - {"mapwem", 0, NULL, -1}, - {"mapwfm", 0, NULL, -1}, - {"mapwgm", 0, NULL, -1}, - {"mapwhm", 0, NULL, -1}, - {"mapwim", 0, NULL, -1}, - {"mapwjm", 0, NULL, -1}, - {"mapwkm", 0, NULL, -1}, - {"mapwlm", 0, NULL, -1}, - {"mapwmm", 0, NULL, -1}, - {"mapwnm", 0, NULL, -1}, - {"mapwom", 0, NULL, -1}, - {"mapwpm", 0, NULL, -1}, - {"mapwqm", 0, NULL, -1}, - {"mapwrm", 0, NULL, -1}, - {"mapwsm", 0, NULL, -1}, - {"mapwtm", 0, NULL, -1}, - {"mapwum", 0, NULL, -1}, - {"mapwvm", 0, NULL, -1}, - {"mapwwm", 0, NULL, -1}, - {"mapwxm", 0, NULL, -1}, - {"mapwym", 0, NULL, -1}, - {"mapwzm", 0, NULL, -1}, - {"mapx0m", 0, NULL, -1}, - {"mapx1m", 0, NULL, -1}, - {"mapx2m", 0, NULL, -1}, - {"mapx3m", 0, NULL, -1}, - {"mapx4m", 0, NULL, -1}, - {"mapx5m", 0, NULL, -1}, - {"mapx6m", 0, NULL, -1}, - {"mapx7m", 0, NULL, -1}, - {"mapx8m", 0, NULL, -1}, - {"mapx9m", 0, NULL, -1}, - {"mapxam", 0, NULL, -1}, - {"mapxbm", 0, NULL, -1}, - {"mapxcm", 0, NULL, -1}, - {"mapxdm", 0, NULL, -1}, - {"mapxem", 0, NULL, -1}, - {"mapxfm", 0, NULL, -1}, - {"mapxgm", 0, NULL, -1}, - {"mapxhm", 0, NULL, -1}, - {"mapxim", 0, NULL, -1}, - {"mapxjm", 0, NULL, -1}, - {"mapxkm", 0, NULL, -1}, - {"mapxlm", 0, NULL, -1}, - {"mapxmm", 0, NULL, -1}, - {"mapxnm", 0, NULL, -1}, - {"mapxom", 0, NULL, -1}, - {"mapxpm", 0, NULL, -1}, - {"mapxqm", 0, NULL, -1}, - {"mapxrm", 0, NULL, -1}, - {"mapxsm", 0, NULL, -1}, - {"mapxtm", 0, NULL, -1}, - {"mapxum", 0, NULL, -1}, - {"mapxvm", 0, NULL, -1}, - {"mapxwm", 0, NULL, -1}, - {"mapxxm", 0, NULL, -1}, - {"mapxym", 0, NULL, -1}, - {"mapxzm", 0, NULL, -1}, - {"mapy0m", 0, NULL, -1}, - {"mapy1m", 0, NULL, -1}, - {"mapy2m", 0, NULL, -1}, - {"mapy3m", 0, NULL, -1}, - {"mapy4m", 0, NULL, -1}, - {"mapy5m", 0, NULL, -1}, - {"mapy6m", 0, NULL, -1}, - {"mapy7m", 0, NULL, -1}, - {"mapy8m", 0, NULL, -1}, - {"mapy9m", 0, NULL, -1}, - {"mapyam", 0, NULL, -1}, - {"mapybm", 0, NULL, -1}, - {"mapycm", 0, NULL, -1}, - {"mapydm", 0, NULL, -1}, - {"mapyem", 0, NULL, -1}, - {"mapyfm", 0, NULL, -1}, - {"mapygm", 0, NULL, -1}, - {"mapyhm", 0, NULL, -1}, - {"mapyim", 0, NULL, -1}, - {"mapyjm", 0, NULL, -1}, - {"mapykm", 0, NULL, -1}, - {"mapylm", 0, NULL, -1}, - {"mapymm", 0, NULL, -1}, - {"mapynm", 0, NULL, -1}, - {"mapyom", 0, NULL, -1}, - {"mapypm", 0, NULL, -1}, - {"mapyqm", 0, NULL, -1}, - {"mapyrm", 0, NULL, -1}, - {"mapysm", 0, NULL, -1}, - {"mapytm", 0, NULL, -1}, - {"mapyum", 0, NULL, -1}, - {"mapyvm", 0, NULL, -1}, - {"mapywm", 0, NULL, -1}, - {"mapyxm", 0, NULL, -1}, - {"mapyym", 0, NULL, -1}, - {"mapyzm", 0, NULL, -1}, - {"mapz0m", 0, NULL, -1}, - {"mapz1m", 0, NULL, -1}, - {"mapz2m", 0, NULL, -1}, - {"mapz3m", 0, NULL, -1}, - {"mapz4m", 0, NULL, -1}, - {"mapz5m", 0, NULL, -1}, - {"mapz6m", 0, NULL, -1}, - {"mapz7m", 0, NULL, -1}, - {"mapz8m", 0, NULL, -1}, - {"mapz9m", 0, NULL, -1}, - {"mapzam", 0, NULL, -1}, - {"mapzbm", 0, NULL, -1}, - {"mapzcm", 0, NULL, -1}, - {"mapzdm", 0, NULL, -1}, - {"mapzem", 0, NULL, -1}, - {"mapzfm", 0, NULL, -1}, - {"mapzgm", 0, NULL, -1}, - {"mapzhm", 0, NULL, -1}, - {"mapzim", 0, NULL, -1}, - {"mapzjm", 0, NULL, -1}, - {"mapzkm", 0, NULL, -1}, - {"mapzlm", 0, NULL, -1}, - {"mapzmm", 0, NULL, -1}, - {"mapznm", 0, NULL, -1}, - {"mapzom", 0, NULL, -1}, - {"mapzpm", 0, NULL, -1}, - {"mapzqm", 0, NULL, -1}, - {"mapzrm", 0, NULL, -1}, - {"mapzsm", 0, NULL, -1}, - {"mapztm", 0, NULL, -1}, - {"mapzum", 0, NULL, -1}, - {"mapzvm", 0, NULL, -1}, - {"mapzwm", 0, NULL, -1}, - {"mapzxm", 0, NULL, -1}, - {"mapzym", 0, NULL, -1}, - {"mapzzm", 0, NULL, -1}, - - {"titles", 0, NULL, -1}, // Title screen - {"read_m", 0, NULL, -1}, // Intro - {"lclear", 0, NULL, -1}, // Level clear - {"invinc", 0, NULL, -1}, // Invincibility - {"shoes", 0, NULL, -1}, // Super sneakers - {"minvnc", 0, NULL, -1}, // Mario invincibility - {"drown", 0, NULL, -1}, // Drowning - {"gmover", 0, NULL, -1}, // Game over - {"xtlife", 0, NULL, -1}, // Extra life - {"contsc", 0, NULL, -1}, // Continue screen - {"supers", 0, NULL, -1}, // Super Sonic - {"chrsel", 0, NULL, -1}, // Character select - {"credit", 0, NULL, -1}, // Credits - {"racent", 0, NULL, -1}, // Race Results - {"stjr", 0, NULL, -1}, // Sonic Team Jr. Presents -}; - - // // Information about all the sfx // diff --git a/src/sounds.h b/src/sounds.h index c5851a346..4388d02cf 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -86,1095 +86,9 @@ struct sfxinfo_struct lumpnum_t lumpnum; }; -// -// MusicInfo struct. -// -typedef struct -{ - // up to 6-character name - const char *name; - - // lump number of music - lumpnum_t lumpnum; - - // music data - void *data; - - // music handle once registered - INT32 handle; -} musicinfo_t; - // the complete set of sound effects extern sfxinfo_t S_sfx[]; -// the complete set of music -extern musicinfo_t S_music[]; - -// -// Identifiers for all music in game. -// - -// Music list (don't edit this comment!) -typedef enum -{ - mus_None, - mus_map01m, - mus_map02m, - mus_map03m, - mus_map04m, - mus_map05m, - mus_map06m, - mus_map07m, - mus_map08m, - mus_map09m, - mus_map10m, - mus_map11m, - mus_map12m, - mus_map13m, - mus_map14m, - mus_map15m, - mus_map16m, - mus_map17m, - mus_map18m, - mus_map19m, - mus_map20m, - mus_map21m, - mus_map22m, - mus_map23m, - mus_map24m, - mus_map25m, - mus_map26m, - mus_map27m, - mus_map28m, - mus_map29m, - mus_map30m, - mus_map31m, - mus_map32m, - mus_map33m, - mus_map34m, - mus_map35m, - mus_map36m, - mus_map37m, - mus_map38m, - mus_map39m, - mus_map40m, - mus_map41m, - mus_map42m, - mus_map43m, - mus_map44m, - mus_map45m, - mus_map46m, - mus_map47m, - mus_map48m, - mus_map49m, - mus_map50m, - mus_map51m, - mus_map52m, - mus_map53m, - mus_map54m, - mus_map55m, - mus_map56m, - mus_map57m, - mus_map58m, - mus_map59m, - mus_map60m, - mus_map61m, - mus_map62m, - mus_map63m, - mus_map64m, - mus_map65m, - mus_map66m, - mus_map67m, - mus_map68m, - mus_map69m, - mus_map70m, - mus_map71m, - mus_map72m, - mus_map73m, - mus_map74m, - mus_map75m, - mus_map76m, - mus_map77m, - mus_map78m, - mus_map79m, - mus_map80m, - mus_map81m, - mus_map82m, - mus_map83m, - mus_map84m, - mus_map85m, - mus_map86m, - mus_map87m, - mus_map88m, - mus_map89m, - mus_map90m, - mus_map91m, - mus_map92m, - mus_map93m, - mus_map94m, - mus_map95m, - mus_map96m, - mus_map97m, - mus_map98m, - mus_map99m, - mus_mapa0m, - mus_mapa1m, - mus_mapa2m, - mus_mapa3m, - mus_mapa4m, - mus_mapa5m, - mus_mapa6m, - mus_mapa7m, - mus_mapa8m, - mus_mapa9m, - mus_mapaam, - mus_mapabm, - mus_mapacm, - mus_mapadm, - mus_mapaem, - mus_mapafm, - mus_mapagm, - mus_mapahm, - mus_mapaim, - mus_mapajm, - mus_mapakm, - mus_mapalm, - mus_mapamm, - mus_mapanm, - mus_mapaom, - mus_mapapm, - mus_mapaqm, - mus_maparm, - mus_mapasm, - mus_mapatm, - mus_mapaum, - mus_mapavm, - mus_mapawm, - mus_mapaxm, - mus_mapaym, - mus_mapazm, - mus_mapb0m, - mus_mapb1m, - mus_mapb2m, - mus_mapb3m, - mus_mapb4m, - mus_mapb5m, - mus_mapb6m, - mus_mapb7m, - mus_mapb8m, - mus_mapb9m, - mus_mapbam, - mus_mapbbm, - mus_mapbcm, - mus_mapbdm, - mus_mapbem, - mus_mapbfm, - mus_mapbgm, - mus_mapbhm, - mus_mapbim, - mus_mapbjm, - mus_mapbkm, - mus_mapblm, - mus_mapbmm, - mus_mapbnm, - mus_mapbom, - mus_mapbpm, - mus_mapbqm, - mus_mapbrm, - mus_mapbsm, - mus_mapbtm, - mus_mapbum, - mus_mapbvm, - mus_mapbwm, - mus_mapbxm, - mus_mapbym, - mus_mapbzm, - mus_mapc0m, - mus_mapc1m, - mus_mapc2m, - mus_mapc3m, - mus_mapc4m, - mus_mapc5m, - mus_mapc6m, - mus_mapc7m, - mus_mapc8m, - mus_mapc9m, - mus_mapcam, - mus_mapcbm, - mus_mapccm, - mus_mapcdm, - mus_mapcem, - mus_mapcfm, - mus_mapcgm, - mus_mapchm, - mus_mapcim, - mus_mapcjm, - mus_mapckm, - mus_mapclm, - mus_mapcmm, - mus_mapcnm, - mus_mapcom, - mus_mapcpm, - mus_mapcqm, - mus_mapcrm, - mus_mapcsm, - mus_mapctm, - mus_mapcum, - mus_mapcvm, - mus_mapcwm, - mus_mapcxm, - mus_mapcym, - mus_mapczm, - mus_mapd0m, - mus_mapd1m, - mus_mapd2m, - mus_mapd3m, - mus_mapd4m, - mus_mapd5m, - mus_mapd6m, - mus_mapd7m, - mus_mapd8m, - mus_mapd9m, - mus_mapdam, - mus_mapdbm, - mus_mapdcm, - mus_mapddm, - mus_mapdem, - mus_mapdfm, - mus_mapdgm, - mus_mapdhm, - mus_mapdim, - mus_mapdjm, - mus_mapdkm, - mus_mapdlm, - mus_mapdmm, - mus_mapdnm, - mus_mapdom, - mus_mapdpm, - mus_mapdqm, - mus_mapdrm, - mus_mapdsm, - mus_mapdtm, - mus_mapdum, - mus_mapdvm, - mus_mapdwm, - mus_mapdxm, - mus_mapdym, - mus_mapdzm, - mus_mape0m, - mus_mape1m, - mus_mape2m, - mus_mape3m, - mus_mape4m, - mus_mape5m, - mus_mape6m, - mus_mape7m, - mus_mape8m, - mus_mape9m, - mus_mapeam, - mus_mapebm, - mus_mapecm, - mus_mapedm, - mus_mapeem, - mus_mapefm, - mus_mapegm, - mus_mapehm, - mus_mapeim, - mus_mapejm, - mus_mapekm, - mus_mapelm, - mus_mapemm, - mus_mapenm, - mus_mapeom, - mus_mapepm, - mus_mapeqm, - mus_maperm, - mus_mapesm, - mus_mapetm, - mus_mapeum, - mus_mapevm, - mus_mapewm, - mus_mapexm, - mus_mapeym, - mus_mapezm, - mus_mapf0m, - mus_mapf1m, - mus_mapf2m, - mus_mapf3m, - mus_mapf4m, - mus_mapf5m, - mus_mapf6m, - mus_mapf7m, - mus_mapf8m, - mus_mapf9m, - mus_mapfam, - mus_mapfbm, - mus_mapfcm, - mus_mapfdm, - mus_mapfem, - mus_mapffm, - mus_mapfgm, - mus_mapfhm, - mus_mapfim, - mus_mapfjm, - mus_mapfkm, - mus_mapflm, - mus_mapfmm, - mus_mapfnm, - mus_mapfom, - mus_mapfpm, - mus_mapfqm, - mus_mapfrm, - mus_mapfsm, - mus_mapftm, - mus_mapfum, - mus_mapfvm, - mus_mapfwm, - mus_mapfxm, - mus_mapfym, - mus_mapfzm, - mus_mapg0m, - mus_mapg1m, - mus_mapg2m, - mus_mapg3m, - mus_mapg4m, - mus_mapg5m, - mus_mapg6m, - mus_mapg7m, - mus_mapg8m, - mus_mapg9m, - mus_mapgam, - mus_mapgbm, - mus_mapgcm, - mus_mapgdm, - mus_mapgem, - mus_mapgfm, - mus_mapggm, - mus_mapghm, - mus_mapgim, - mus_mapgjm, - mus_mapgkm, - mus_mapglm, - mus_mapgmm, - mus_mapgnm, - mus_mapgom, - mus_mapgpm, - mus_mapgqm, - mus_mapgrm, - mus_mapgsm, - mus_mapgtm, - mus_mapgum, - mus_mapgvm, - mus_mapgwm, - mus_mapgxm, - mus_mapgym, - mus_mapgzm, - mus_maph0m, - mus_maph1m, - mus_maph2m, - mus_maph3m, - mus_maph4m, - mus_maph5m, - mus_maph6m, - mus_maph7m, - mus_maph8m, - mus_maph9m, - mus_mapham, - mus_maphbm, - mus_maphcm, - mus_maphdm, - mus_maphem, - mus_maphfm, - mus_maphgm, - mus_maphhm, - mus_maphim, - mus_maphjm, - mus_maphkm, - mus_maphlm, - mus_maphmm, - mus_maphnm, - mus_maphom, - mus_maphpm, - mus_maphqm, - mus_maphrm, - mus_maphsm, - mus_maphtm, - mus_maphum, - mus_maphvm, - mus_maphwm, - mus_maphxm, - mus_maphym, - mus_maphzm, - mus_mapi0m, - mus_mapi1m, - mus_mapi2m, - mus_mapi3m, - mus_mapi4m, - mus_mapi5m, - mus_mapi6m, - mus_mapi7m, - mus_mapi8m, - mus_mapi9m, - mus_mapiam, - mus_mapibm, - mus_mapicm, - mus_mapidm, - mus_mapiem, - mus_mapifm, - mus_mapigm, - mus_mapihm, - mus_mapiim, - mus_mapijm, - mus_mapikm, - mus_mapilm, - mus_mapimm, - mus_mapinm, - mus_mapiom, - mus_mapipm, - mus_mapiqm, - mus_mapirm, - mus_mapism, - mus_mapitm, - mus_mapium, - mus_mapivm, - mus_mapiwm, - mus_mapixm, - mus_mapiym, - mus_mapizm, - mus_mapj0m, - mus_mapj1m, - mus_mapj2m, - mus_mapj3m, - mus_mapj4m, - mus_mapj5m, - mus_mapj6m, - mus_mapj7m, - mus_mapj8m, - mus_mapj9m, - mus_mapjam, - mus_mapjbm, - mus_mapjcm, - mus_mapjdm, - mus_mapjem, - mus_mapjfm, - mus_mapjgm, - mus_mapjhm, - mus_mapjim, - mus_mapjjm, - mus_mapjkm, - mus_mapjlm, - mus_mapjmm, - mus_mapjnm, - mus_mapjom, - mus_mapjpm, - mus_mapjqm, - mus_mapjrm, - mus_mapjsm, - mus_mapjtm, - mus_mapjum, - mus_mapjvm, - mus_mapjwm, - mus_mapjxm, - mus_mapjym, - mus_mapjzm, - mus_mapk0m, - mus_mapk1m, - mus_mapk2m, - mus_mapk3m, - mus_mapk4m, - mus_mapk5m, - mus_mapk6m, - mus_mapk7m, - mus_mapk8m, - mus_mapk9m, - mus_mapkam, - mus_mapkbm, - mus_mapkcm, - mus_mapkdm, - mus_mapkem, - mus_mapkfm, - mus_mapkgm, - mus_mapkhm, - mus_mapkim, - mus_mapkjm, - mus_mapkkm, - mus_mapklm, - mus_mapkmm, - mus_mapknm, - mus_mapkom, - mus_mapkpm, - mus_mapkqm, - mus_mapkrm, - mus_mapksm, - mus_mapktm, - mus_mapkum, - mus_mapkvm, - mus_mapkwm, - mus_mapkxm, - mus_mapkym, - mus_mapkzm, - mus_mapl0m, - mus_mapl1m, - mus_mapl2m, - mus_mapl3m, - mus_mapl4m, - mus_mapl5m, - mus_mapl6m, - mus_mapl7m, - mus_mapl8m, - mus_mapl9m, - mus_maplam, - mus_maplbm, - mus_maplcm, - mus_mapldm, - mus_maplem, - mus_maplfm, - mus_maplgm, - mus_maplhm, - mus_maplim, - mus_mapljm, - mus_maplkm, - mus_mapllm, - mus_maplmm, - mus_maplnm, - mus_maplom, - mus_maplpm, - mus_maplqm, - mus_maplrm, - mus_maplsm, - mus_mapltm, - mus_maplum, - mus_maplvm, - mus_maplwm, - mus_maplxm, - mus_maplym, - mus_maplzm, - mus_mapm0m, - mus_mapm1m, - mus_mapm2m, - mus_mapm3m, - mus_mapm4m, - mus_mapm5m, - mus_mapm6m, - mus_mapm7m, - mus_mapm8m, - mus_mapm9m, - mus_mapmam, - mus_mapmbm, - mus_mapmcm, - mus_mapmdm, - mus_mapmem, - mus_mapmfm, - mus_mapmgm, - mus_mapmhm, - mus_mapmim, - mus_mapmjm, - mus_mapmkm, - mus_mapmlm, - mus_mapmmm, - mus_mapmnm, - mus_mapmom, - mus_mapmpm, - mus_mapmqm, - mus_mapmrm, - mus_mapmsm, - mus_mapmtm, - mus_mapmum, - mus_mapmvm, - mus_mapmwm, - mus_mapmxm, - mus_mapmym, - mus_mapmzm, - mus_mapn0m, - mus_mapn1m, - mus_mapn2m, - mus_mapn3m, - mus_mapn4m, - mus_mapn5m, - mus_mapn6m, - mus_mapn7m, - mus_mapn8m, - mus_mapn9m, - mus_mapnam, - mus_mapnbm, - mus_mapncm, - mus_mapndm, - mus_mapnem, - mus_mapnfm, - mus_mapngm, - mus_mapnhm, - mus_mapnim, - mus_mapnjm, - mus_mapnkm, - mus_mapnlm, - mus_mapnmm, - mus_mapnnm, - mus_mapnom, - mus_mapnpm, - mus_mapnqm, - mus_mapnrm, - mus_mapnsm, - mus_mapntm, - mus_mapnum, - mus_mapnvm, - mus_mapnwm, - mus_mapnxm, - mus_mapnym, - mus_mapnzm, - mus_mapo0m, - mus_mapo1m, - mus_mapo2m, - mus_mapo3m, - mus_mapo4m, - mus_mapo5m, - mus_mapo6m, - mus_mapo7m, - mus_mapo8m, - mus_mapo9m, - mus_mapoam, - mus_mapobm, - mus_mapocm, - mus_mapodm, - mus_mapoem, - mus_mapofm, - mus_mapogm, - mus_mapohm, - mus_mapoim, - mus_mapojm, - mus_mapokm, - mus_mapolm, - mus_mapomm, - mus_maponm, - mus_mapoom, - mus_mapopm, - mus_mapoqm, - mus_maporm, - mus_maposm, - mus_mapotm, - mus_mapoum, - mus_mapovm, - mus_mapowm, - mus_mapoxm, - mus_mapoym, - mus_mapozm, - mus_mapp0m, - mus_mapp1m, - mus_mapp2m, - mus_mapp3m, - mus_mapp4m, - mus_mapp5m, - mus_mapp6m, - mus_mapp7m, - mus_mapp8m, - mus_mapp9m, - mus_mappam, - mus_mappbm, - mus_mappcm, - mus_mappdm, - mus_mappem, - mus_mappfm, - mus_mappgm, - mus_mapphm, - mus_mappim, - mus_mappjm, - mus_mappkm, - mus_mapplm, - mus_mappmm, - mus_mappnm, - mus_mappom, - mus_mapppm, - mus_mappqm, - mus_mapprm, - mus_mappsm, - mus_mapptm, - mus_mappum, - mus_mappvm, - mus_mappwm, - mus_mappxm, - mus_mappym, - mus_mappzm, - mus_mapq0m, - mus_mapq1m, - mus_mapq2m, - mus_mapq3m, - mus_mapq4m, - mus_mapq5m, - mus_mapq6m, - mus_mapq7m, - mus_mapq8m, - mus_mapq9m, - mus_mapqam, - mus_mapqbm, - mus_mapqcm, - mus_mapqdm, - mus_mapqem, - mus_mapqfm, - mus_mapqgm, - mus_mapqhm, - mus_mapqim, - mus_mapqjm, - mus_mapqkm, - mus_mapqlm, - mus_mapqmm, - mus_mapqnm, - mus_mapqom, - mus_mapqpm, - mus_mapqqm, - mus_mapqrm, - mus_mapqsm, - mus_mapqtm, - mus_mapqum, - mus_mapqvm, - mus_mapqwm, - mus_mapqxm, - mus_mapqym, - mus_mapqzm, - mus_mapr0m, - mus_mapr1m, - mus_mapr2m, - mus_mapr3m, - mus_mapr4m, - mus_mapr5m, - mus_mapr6m, - mus_mapr7m, - mus_mapr8m, - mus_mapr9m, - mus_mapram, - mus_maprbm, - mus_maprcm, - mus_maprdm, - mus_maprem, - mus_maprfm, - mus_maprgm, - mus_maprhm, - mus_maprim, - mus_maprjm, - mus_maprkm, - mus_maprlm, - mus_maprmm, - mus_maprnm, - mus_maprom, - mus_maprpm, - mus_maprqm, - mus_maprrm, - mus_maprsm, - mus_maprtm, - mus_maprum, - mus_maprvm, - mus_maprwm, - mus_maprxm, - mus_maprym, - mus_maprzm, - mus_maps0m, - mus_maps1m, - mus_maps2m, - mus_maps3m, - mus_maps4m, - mus_maps5m, - mus_maps6m, - mus_maps7m, - mus_maps8m, - mus_maps9m, - mus_mapsam, - mus_mapsbm, - mus_mapscm, - mus_mapsdm, - mus_mapsem, - mus_mapsfm, - mus_mapsgm, - mus_mapshm, - mus_mapsim, - mus_mapsjm, - mus_mapskm, - mus_mapslm, - mus_mapsmm, - mus_mapsnm, - mus_mapsom, - mus_mapspm, - mus_mapsqm, - mus_mapsrm, - mus_mapssm, - mus_mapstm, - mus_mapsum, - mus_mapsvm, - mus_mapswm, - mus_mapsxm, - mus_mapsym, - mus_mapszm, - mus_mapt0m, - mus_mapt1m, - mus_mapt2m, - mus_mapt3m, - mus_mapt4m, - mus_mapt5m, - mus_mapt6m, - mus_mapt7m, - mus_mapt8m, - mus_mapt9m, - mus_maptam, - mus_maptbm, - mus_maptcm, - mus_maptdm, - mus_maptem, - mus_maptfm, - mus_maptgm, - mus_mapthm, - mus_maptim, - mus_maptjm, - mus_maptkm, - mus_maptlm, - mus_maptmm, - mus_maptnm, - mus_maptom, - mus_maptpm, - mus_maptqm, - mus_maptrm, - mus_maptsm, - mus_mapttm, - mus_maptum, - mus_maptvm, - mus_maptwm, - mus_maptxm, - mus_maptym, - mus_maptzm, - mus_mapu0m, - mus_mapu1m, - mus_mapu2m, - mus_mapu3m, - mus_mapu4m, - mus_mapu5m, - mus_mapu6m, - mus_mapu7m, - mus_mapu8m, - mus_mapu9m, - mus_mapuam, - mus_mapubm, - mus_mapucm, - mus_mapudm, - mus_mapuem, - mus_mapufm, - mus_mapugm, - mus_mapuhm, - mus_mapuim, - mus_mapujm, - mus_mapukm, - mus_mapulm, - mus_mapumm, - mus_mapunm, - mus_mapuom, - mus_mapupm, - mus_mapuqm, - mus_mapurm, - mus_mapusm, - mus_maputm, - mus_mapuum, - mus_mapuvm, - mus_mapuwm, - mus_mapuxm, - mus_mapuym, - mus_mapuzm, - mus_mapv0m, - mus_mapv1m, - mus_mapv2m, - mus_mapv3m, - mus_mapv4m, - mus_mapv5m, - mus_mapv6m, - mus_mapv7m, - mus_mapv8m, - mus_mapv9m, - mus_mapvam, - mus_mapvbm, - mus_mapvcm, - mus_mapvdm, - mus_mapvem, - mus_mapvfm, - mus_mapvgm, - mus_mapvhm, - mus_mapvim, - mus_mapvjm, - mus_mapvkm, - mus_mapvlm, - mus_mapvmm, - mus_mapvnm, - mus_mapvom, - mus_mapvpm, - mus_mapvqm, - mus_mapvrm, - mus_mapvsm, - mus_mapvtm, - mus_mapvum, - mus_mapvvm, - mus_mapvwm, - mus_mapvxm, - mus_mapvym, - mus_mapvzm, - mus_mapw0m, - mus_mapw1m, - mus_mapw2m, - mus_mapw3m, - mus_mapw4m, - mus_mapw5m, - mus_mapw6m, - mus_mapw7m, - mus_mapw8m, - mus_mapw9m, - mus_mapwam, - mus_mapwbm, - mus_mapwcm, - mus_mapwdm, - mus_mapwem, - mus_mapwfm, - mus_mapwgm, - mus_mapwhm, - mus_mapwim, - mus_mapwjm, - mus_mapwkm, - mus_mapwlm, - mus_mapwmm, - mus_mapwnm, - mus_mapwom, - mus_mapwpm, - mus_mapwqm, - mus_mapwrm, - mus_mapwsm, - mus_mapwtm, - mus_mapwum, - mus_mapwvm, - mus_mapwwm, - mus_mapwxm, - mus_mapwym, - mus_mapwzm, - mus_mapx0m, - mus_mapx1m, - mus_mapx2m, - mus_mapx3m, - mus_mapx4m, - mus_mapx5m, - mus_mapx6m, - mus_mapx7m, - mus_mapx8m, - mus_mapx9m, - mus_mapxam, - mus_mapxbm, - mus_mapxcm, - mus_mapxdm, - mus_mapxem, - mus_mapxfm, - mus_mapxgm, - mus_mapxhm, - mus_mapxim, - mus_mapxjm, - mus_mapxkm, - mus_mapxlm, - mus_mapxmm, - mus_mapxnm, - mus_mapxom, - mus_mapxpm, - mus_mapxqm, - mus_mapxrm, - mus_mapxsm, - mus_mapxtm, - mus_mapxum, - mus_mapxvm, - mus_mapxwm, - mus_mapxxm, - mus_mapxym, - mus_mapxzm, - mus_mapy0m, - mus_mapy1m, - mus_mapy2m, - mus_mapy3m, - mus_mapy4m, - mus_mapy5m, - mus_mapy6m, - mus_mapy7m, - mus_mapy8m, - mus_mapy9m, - mus_mapyam, - mus_mapybm, - mus_mapycm, - mus_mapydm, - mus_mapyem, - mus_mapyfm, - mus_mapygm, - mus_mapyhm, - mus_mapyim, - mus_mapyjm, - mus_mapykm, - mus_mapylm, - mus_mapymm, - mus_mapynm, - mus_mapyom, - mus_mapypm, - mus_mapyqm, - mus_mapyrm, - mus_mapysm, - mus_mapytm, - mus_mapyum, - mus_mapyvm, - mus_mapywm, - mus_mapyxm, - mus_mapyym, - mus_mapyzm, - mus_mapz0m, - mus_mapz1m, - mus_mapz2m, - mus_mapz3m, - mus_mapz4m, - mus_mapz5m, - mus_mapz6m, - mus_mapz7m, - mus_mapz8m, - mus_mapz9m, - mus_mapzam, - mus_mapzbm, - mus_mapzcm, - mus_mapzdm, - mus_mapzem, - mus_mapzfm, - mus_mapzgm, - mus_mapzhm, - mus_mapzim, - mus_mapzjm, - mus_mapzkm, - mus_mapzlm, - mus_mapzmm, - mus_mapznm, - mus_mapzom, - mus_mapzpm, - mus_mapzqm, - mus_mapzrm, - mus_mapzsm, - mus_mapztm, - mus_mapzum, - mus_mapzvm, - mus_mapzwm, - mus_mapzxm, - mus_mapzym, - mus_mapzzm, - - mus_titles, // title screen - mus_read_m, // intro - mus_lclear, // level clear - mus_invinc, // invincibility - mus_shoes, // super sneakers - mus_minvnc, // Mario invincibility - mus_drown, // drowning - mus_gmover, // game over - mus_xtlife, // extra life - mus_contsc, // continue screen - mus_supers, // Super Sonic - mus_chrsel, // character select - mus_credit, // credits - mus_racent, // Race Results - mus_stjr, // Sonic Team Jr. Presents - - NUMMUSIC -} musicenum_t; -// Note: song number should be a UINT16, as mapmusic only uses 16 bits for music slot number. -// (the rest is track number and an internal reload flag) - // // Identifiers for all sfx in game. // diff --git a/src/y_inter.c b/src/y_inter.c index 2f2edf7ca..104c1004d 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -632,7 +632,7 @@ void Y_Ticker(void) boolean anybonuses = false; if (!intertic) // first time only - S_ChangeMusic(mus_lclear, false); // don't loop it + S_ChangeMusicInternal("lclear", false); // don't loop it if (intertic < TICRATE) // one second pause before tally begins return; @@ -693,7 +693,7 @@ void Y_Ticker(void) if (!intertic) // first time only { - S_ChangeMusic(mus_lclear, false); // don't loop it + S_ChangeMusicInternal("lclear", false); // don't loop it tallydonetic = 0; } @@ -754,7 +754,7 @@ void Y_Ticker(void) else if (intertype == int_match || intertype == int_ctf || intertype == int_teammatch) // match { if (!intertic) // first time only - S_ChangeMusic(mus_racent, true); // loop it + S_ChangeMusicInternal("racent", true); // loop it // If a player has left or joined, recalculate scores. if (data.match.numplayers != D_NumPlayers()) @@ -763,7 +763,7 @@ void Y_Ticker(void) else if (intertype == int_race || intertype == int_classicrace) // race { if (!intertic) // first time only - S_ChangeMusic(mus_racent, true); // loop it + S_ChangeMusicInternal("racent", true); // loop it // Don't bother recalcing for race. It doesn't make as much sense. } From caab150c9240a37925f38ae4d34f4278ca7c35d2 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 7 Jan 2016 20:41:58 -0800 Subject: [PATCH 144/467] Fixed LD413 (cherry picked from commit 1e4c2f8aad3d2d48eb408f400fde8e259b40fe18) --- src/p_setup.c | 12 ++++++++++-- src/p_spec.c | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 3a51d90b3..000a3a65c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1451,8 +1451,16 @@ static void P_LoadSideDefs2(lumpnum_t lumpnum) sd->bottomtexture = get_number(process)-1; } M_Memcpy(process,msd->toptexture,8); - sd->text = Z_Malloc(strlen(process)+1, PU_LEVEL, NULL); - M_Memcpy(sd->text, process, strlen(process)+1); + process[8] = '\0'; + sd->text = Z_Malloc(7, PU_LEVEL, NULL); + + // If they type in O_ or D_ and their music name, just shrug, + // then copy the rest instead. + if ((process[0] == 'O' || process[0] == 'D') && process[7]) + M_Memcpy(sd->text, process+2, 6); + else // Assume it's a proper music name. + M_Memcpy(sd->text, process, 6); + sd->text[6] = 0; break; } case 414: // Play SFX diff --git a/src/p_spec.c b/src/p_spec.c index ef3425e04..99029d9b0 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2392,7 +2392,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) { UINT16 tracknum = (UINT16)sides[line->sidenum[0]].bottomtexture; - strncpy(mapmusname, line->text, 7); + strncpy(mapmusname, sides[line->sidenum[0]].text, 7); mapmusname[6] = 0; mapmusflags = tracknum & MUSIC_TRACKMASK; From 1203b0aa73dad58cf411a4349504a3701290c680 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 7 Jan 2016 23:48:19 -0800 Subject: [PATCH 145/467] Fix crash on game clear (No, game, you can't allocate a map header for the credits, why were you doing that before and how did it not break anything??) (cherry picked from commit e1f9a012297d5220dcdd9395265467621a170e32) --- src/g_game.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 088536436..7941c33d7 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2874,7 +2874,8 @@ static void G_DoCompleted(void) // We are committed to this map now. // We may as well allocate its header if it doesn't exist - if(!mapheaderinfo[nextmap]) + // (That is, if it's a real map) + if (nextmap < NUMMAPS && !mapheaderinfo[nextmap]) P_AllocMapHeader(nextmap); if (skipstats) From 04d112276e1ed1b2dd576f829d801e163ffab040 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Fri, 8 Jan 2016 03:23:05 -0800 Subject: [PATCH 146/467] Fixed some oddities with TUNES. (cherry picked from commit a4d05350f711db76676e9b48c36d88bd7dbec274) --- src/d_netcmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 9916e524f..7197def78 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3788,7 +3788,7 @@ static void Command_Tunes_f(void) tunearg = mapheaderinfo[gamemap-1]->musname; track = mapheaderinfo[gamemap-1]->mustrack; } - else if (tunearg[3] == 0 && toupper(tunearg[0]) >= 'A' && toupper(tunearg[0]) <= 'Z') + else if (!tunearg[2] && toupper(tunearg[0]) >= 'A' && toupper(tunearg[0]) <= 'Z') tunenum = (UINT16)M_MapNumber(tunearg[0], tunearg[1]); if (tunenum && tunenum >= 1036) From 8fc484cea9360403644a2624656c8431937471e5 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 4 Feb 2016 17:27:55 -0800 Subject: [PATCH 147/467] Just a few more changes to TUNES, nothing special (cherry picked from commit 63a9c66317c263124567234897ed6240b5e34f9e) --- src/d_netcmd.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 7197def78..5eb352834 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3766,11 +3766,12 @@ static void Command_Tunes_f(void) if (argc < 2) //tunes slot ... { - CONS_Printf("tunes :\n"); - CONS_Printf(M_GetText("Play a music slot at a set speed (\"1\" being normal speed).\n")); - CONS_Printf(M_GetText("If the format supports multiple songs, you can specify which one to play.\n")); - CONS_Printf(M_GetText("The current tune is: %s\nThe current track is: %d\n"), - mapmusname, (mapmusflags & MUSIC_TRACKMASK)); + CONS_Printf("tunes [track] [speed] / <-show> / <-default> / <-none>:\n"); + CONS_Printf(M_GetText("Play an arbitrary music lump. If a map number is used, 'MAP##M' is played.\n")); + CONS_Printf(M_GetText("If the format supports multiple songs, you can specify which one to play.\n\n")); + CONS_Printf(M_GetText("* With \"-show\", shows the currently playing tune and track.\n")); + CONS_Printf(M_GetText("* With \"-default\", returns to the default music for the map.\n")); + CONS_Printf(M_GetText("* With \"-none\", any music playing will be stopped.\n")); return; } @@ -3778,12 +3779,18 @@ static void Command_Tunes_f(void) tunenum = (UINT16)atoi(tunearg); track = 0; - if (!strcasecmp(tunearg, "none")) + if (!strcasecmp(tunearg, "-show")) + { + CONS_Printf(M_GetText("The current tune is: %s [track %d]\n"), + mapmusname, (mapmusflags & MUSIC_TRACKMASK)); + return; + } + if (!strcasecmp(tunearg, "-none")) { S_StopMusic(); return; } - else if (!strcasecmp(tunearg, "default")) + else if (!strcasecmp(tunearg, "-default")) { tunearg = mapheaderinfo[gamemap-1]->musname; track = mapheaderinfo[gamemap-1]->mustrack; @@ -3796,9 +3803,11 @@ static void Command_Tunes_f(void) CONS_Alert(CONS_NOTICE, M_GetText("Valid music slots are 1 to 1035.\n")); return; } + if (!tunenum && strlen(tunearg) > 6) // This is automatic -- just show the error just in case + CONS_Alert(CONS_NOTICE, M_GetText("Music name too long - truncated to six characters.\n")); - if (argc > 3) - track = (UINT16)atoi(COM_Argv(3))-1; + if (argc > 2) + track = (UINT16)atoi(COM_Argv(2))-1; if (tunenum) snprintf(mapmusname, 7, "%sM", G_BuildMapName(tunenum)); @@ -3809,9 +3818,9 @@ static void Command_Tunes_f(void) S_ChangeMusic(mapmusname, mapmusflags, true); - if (argc > 2) + if (argc > 3) { - float speed = (float)atof(COM_Argv(2)); + float speed = (float)atof(COM_Argv(3)); if (speed > 0.0f) S_SpeedMusic(speed); } From b7ebb8186d3555ef8f2cbd102d755e7dfba75147 Mon Sep 17 00:00:00 2001 From: Sean Ryder Date: Tue, 9 Feb 2016 16:20:18 +0000 Subject: [PATCH 148/467] Fix MD2 interpolation for FF_ANIMATE states --- src/hardware/hw_md2.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 77795ccc0..b092ac32e 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1195,16 +1195,37 @@ void HWR_DrawMD2(gr_vissprite_t *spr) HWR_GetMappedPatch(gpatch, spr->colormap); } + if (spr->mobj->frame & FF_ANIMATE) + { + // set duration and tics to be the correct values for FF_ANIMATE states + durs = spr->mobj->state->var2; + tics = spr->mobj->anim_duration; + } + //FIXME: this is not yet correct frame = (spr->mobj->frame & FF_FRAMEMASK) % md2->model->header.numFrames; buff = md2->model->glCommandBuffer; curr = &md2->model->frames[frame]; - if (cv_grmd2.value == 1 - && spr->mobj->state->nextstate != S_NULL && states[spr->mobj->state->nextstate].sprite != SPR_NULL - && !(spr->mobj->player && (spr->mobj->state->nextstate == S_PLAY_TAP1 || spr->mobj->state->nextstate == S_PLAY_TAP2) && spr->mobj->state == &states[S_PLAY_STND])) + if (cv_grmd2.value == 1) { - const INT32 nextframe = (states[spr->mobj->state->nextstate].frame & FF_FRAMEMASK) % md2->model->header.numFrames; - next = &md2->model->frames[nextframe]; + // frames are handled differently for states with FF_ANIMATE, so get the next frame differently for the interpolation + if (spr->mobj->frame & FF_ANIMATE) + { + UINT32 nextframe = (spr->mobj->frame & FF_FRAMEMASK) + 1; + if (nextframe >= (UINT32)spr->mobj->state->var1) + nextframe = (spr->mobj->state->frame & FF_FRAMEMASK); + nextframe %= md2->model->header.numFrames; + next = &md2->model->frames[nextframe]; + } + else + { + if (spr->mobj->state->nextstate != S_NULL && states[spr->mobj->state->nextstate].sprite != SPR_NULL + && !(spr->mobj->player && (spr->mobj->state->nextstate == S_PLAY_TAP1 || spr->mobj->state->nextstate == S_PLAY_TAP2) && spr->mobj->state == &states[S_PLAY_STND])) + { + const UINT32 nextframe = (states[spr->mobj->state->nextstate].frame & FF_FRAMEMASK) % md2->model->header.numFrames; + next = &md2->model->frames[nextframe]; + } + } } //Hurdler: it seems there is still a small problem with mobj angle From 31deecc51c0c920ee00dc98b5a1ba952622a9a98 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sun, 26 Jul 2015 20:14:47 +0100 Subject: [PATCH 149/467] Colour Changing MD2s I don't know how I can move my old branch over so I've just created a new one. --- src/hardware/hw_md2.c | 314 +++++++++++++++++++++++++++++++++++++++++- src/hardware/hw_md2.h | 1 + 2 files changed, 312 insertions(+), 3 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 77795ccc0..e15af506f 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -41,6 +41,7 @@ #include "../r_things.h" #include "hw_main.h" +#include "../v_video.h" #ifdef HAVE_PNG #ifndef _MSC_VER @@ -881,6 +882,59 @@ static void md2_loadTexture(md2_t *model) HWR_UnlockCachedPatch(grpatch); } +// -----------------+ +// md2_loadBlendTexture : Download a pcx or png texture for blending MD2 models +// -----------------+ +static void md2_loadBlendTexture(md2_t *model) +{ + GLPatch_t *grpatch; + char *filename = Z_Malloc(strlen(model->filename)+7, PU_STATIC, NULL); + strcpy(filename, model->filename); + + FIL_ForceExtension(filename, "_blend.png"); + + if (model->blendgrpatch) + { + grpatch = model->blendgrpatch; + Z_Free(grpatch->mipmap.grInfo.data); + } + else + grpatch = Z_Calloc(sizeof *grpatch, PU_HWRPATCHINFO, + &(model->blendgrpatch)); + + if (!grpatch->mipmap.downloaded && !grpatch->mipmap.grInfo.data) + { + int w = 0, h = 0; +#ifdef HAVE_PNG + grpatch->mipmap.grInfo.format = PNG_Load(filename, &w, &h, grpatch); + if (grpatch->mipmap.grInfo.format == 0) +#endif + grpatch->mipmap.grInfo.format = PCX_Load(filename, &w, &h, grpatch); + if (grpatch->mipmap.grInfo.format == 0) + { + Z_Free(filename); + return; + } + + grpatch->mipmap.downloaded = 0; + grpatch->mipmap.flags = 0; + + grpatch->width = (INT16)w; + grpatch->height = (INT16)h; + grpatch->mipmap.width = (UINT16)w; + grpatch->mipmap.height = (UINT16)h; + + // not correct! + grpatch->mipmap.grInfo.smallLodLog2 = GR_LOD_LOG2_256; + grpatch->mipmap.grInfo.largeLodLog2 = GR_LOD_LOG2_256; + grpatch->mipmap.grInfo.aspectRatioLog2 = GR_ASPECT_LOG2_1x1; + } + HWD.pfnSetTexture(&grpatch->mipmap); // We do need to do this so that it can be cleared and knows to recreate it when necessary + HWR_UnlockCachedPatch(grpatch); + + Z_Free(filename); +} + // Don't spam the console, or the OS with fopen requests! static boolean nomd2s = false; @@ -1050,6 +1104,248 @@ spritemd2found: fclose(f); } +static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, skincolors_t color) +{ + UINT16 w = gpatch->width, h = gpatch->height; + UINT32 size = w*h; + RGBA_t *image, *blendimage, *cur, blendcolor; + + if (grmip->width == 0) + { + + grmip->width = gpatch->width; + grmip->height = gpatch->height; + + // no wrap around, no chroma key + grmip->flags = 0; + // setup the texture info + grmip->grInfo.format = GR_RGBA; + } + + Z_Free(grmip->grInfo.data); + grmip->grInfo.data = NULL; + + cur = Z_Malloc(size*4, PU_HWRCACHE, &grmip->grInfo.data); + memset(cur, 0x00, size*4); + + image = gpatch->mipmap.grInfo.data; + blendimage = blendgpatch->mipmap.grInfo.data; + + switch (color) + { + case SKINCOLOR_WHITE: + blendcolor = V_GetColor(3); + break; + case SKINCOLOR_SILVER: + blendcolor = V_GetColor(11); + break; + case SKINCOLOR_GREY: + blendcolor = V_GetColor(23); + break; + case SKINCOLOR_BLACK: + blendcolor = V_GetColor(27); + break; + case SKINCOLOR_CYAN: + blendcolor = V_GetColor(216); + break; + case SKINCOLOR_TEAL: + blendcolor = V_GetColor(220); + break; + case SKINCOLOR_STEELBLUE: + blendcolor = V_GetColor(204); + break; + case SKINCOLOR_BLUE: + blendcolor = V_GetColor(234); + break; + case SKINCOLOR_PEACH: + blendcolor = V_GetColor(73); + break; + case SKINCOLOR_TAN: + blendcolor = V_GetColor(49); + break; + case SKINCOLOR_PINK: + blendcolor = V_GetColor(146); + break; + case SKINCOLOR_LAVENDER: + blendcolor = V_GetColor(252); + break; + case SKINCOLOR_PURPLE: + blendcolor = V_GetColor(195); + break; + case SKINCOLOR_ORANGE: + blendcolor = V_GetColor(87); + break; + case SKINCOLOR_ROSEWOOD: + blendcolor = V_GetColor(94); + break; + case SKINCOLOR_BEIGE: + blendcolor = V_GetColor(40); + break; + case SKINCOLOR_BROWN: + blendcolor = V_GetColor(57); + break; + case SKINCOLOR_RED: + blendcolor = V_GetColor(130); + break; + case SKINCOLOR_DARKRED: + blendcolor = V_GetColor(139); + break; + case SKINCOLOR_NEONGREEN: + blendcolor = V_GetColor(184); + break; + case SKINCOLOR_GREEN: + blendcolor = V_GetColor(170); + break; + case SKINCOLOR_ZIM: + blendcolor = V_GetColor(180); + break; + case SKINCOLOR_OLIVE: + blendcolor = V_GetColor(108); + break; + case SKINCOLOR_YELLOW: + blendcolor = V_GetColor(104); + break; + case SKINCOLOR_GOLD: + blendcolor = V_GetColor(115); + break; + + case SKINCOLOR_SUPER1: + blendcolor = V_GetColor(101); + break; + case SKINCOLOR_SUPER2: + blendcolor = V_GetColor(113); + break; + case SKINCOLOR_SUPER3: + blendcolor = V_GetColor(114); + break; + case SKINCOLOR_SUPER4: + blendcolor = V_GetColor(116); + break; + case SKINCOLOR_SUPER5: + blendcolor = V_GetColor(119); + break; + + case SKINCOLOR_TSUPER1: + blendcolor = V_GetColor(80); + break; + case SKINCOLOR_TSUPER2: + blendcolor = V_GetColor(82); + break; + case SKINCOLOR_TSUPER3: + blendcolor = V_GetColor(84); + break; + case SKINCOLOR_TSUPER4: + blendcolor = V_GetColor(85); + break; + case SKINCOLOR_TSUPER5: + blendcolor = V_GetColor(87); + break; + + case SKINCOLOR_KSUPER1: + blendcolor = V_GetColor(122); + break; + case SKINCOLOR_KSUPER2: + blendcolor = V_GetColor(123); + break; + case SKINCOLOR_KSUPER3: + blendcolor = V_GetColor(124); + break; + case SKINCOLOR_KSUPER4: + blendcolor = V_GetColor(125); + break; + case SKINCOLOR_KSUPER5: + blendcolor = V_GetColor(126); + break; + default: + blendcolor = V_GetColor(247); + break; + } + + while (size--) + { + if (blendimage->s.alpha == 0) + { + // Don't bother with blending the pixel if the alpha of the blend pixel is 0 + cur->rgba = image->rgba; + } + else + { + INT32 tempcolor; + INT16 tempmult, tempalpha; + tempalpha = -(abs(blendimage->s.red-127)-127)*2; + if (tempalpha > 255) + tempalpha = 255; + else if (tempalpha < 0) + tempalpha = 0; + + tempmult = (blendimage->s.red-127)*2; + if (tempmult > 255) + tempmult = 255; + else if (tempmult < 0) + tempmult = 0; + + tempcolor = (image->s.red*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.red)/255)) * blendimage->s.alpha)/255; + cur->s.red = (UINT8)tempcolor; + tempcolor = (image->s.green*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.green)/255)) * blendimage->s.alpha)/255; + cur->s.green = (UINT8)tempcolor; + tempcolor = (image->s.blue*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.blue)/255)) * blendimage->s.alpha)/255; + cur->s.blue = (UINT8)tempcolor; + cur->s.alpha = image->s.alpha; + } + + cur++; image++; blendimage++; + } + + return; +} + +static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, const UINT8 *colormap, skincolors_t color) +{ + // mostly copied from HWR_GetMappedPatch, hence the similarities and comment + GLMipmap_t *grmip, *newmip; + + if (colormap == colormaps || colormap == NULL) + { + // Don't do any blending + HWD.pfnSetTexture(&gpatch->mipmap); + return; + } + + // search for the mimmap + // skip the first (no colormap translated) + for (grmip = &gpatch->mipmap; grmip->nextcolormap; ) + { + grmip = grmip->nextcolormap; + if (grmip->colormap == colormap) + { + if (grmip->downloaded && grmip->grInfo.data) + { + HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture + Z_ChangeTag(grmip->grInfo.data, PU_HWRCACHE_UNLOCKED); + return; + } + } + } + + // If here, the blended texture has not been created + // So we create it + + //BP: WARNING: don't free it manually without clearing the cache of harware renderer + // (it have a liste of mipmap) + // this malloc is cleared in HWR_FreeTextureCache + // (...) unfortunately z_malloc fragment alot the memory :(so malloc is better + newmip = calloc(1, sizeof (*newmip)); + if (newmip == NULL) + I_Error("%s: Out of memory", "HWR_GetMappedPatch"); + grmip->nextcolormap = newmip; + newmip->colormap = colormap; + + HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, color); + + HWD.pfnSetTexture(newmip); + Z_ChangeTag(newmip->grInfo.data, PU_HWRCACHE_UNLOCKED); +} + // -----------------+ // HWR_DrawMD2 : Draw MD2 @@ -1180,13 +1476,25 @@ void HWR_DrawMD2(gr_vissprite_t *spr) gpatch = md2->grpatch; if (!gpatch || !gpatch->mipmap.grInfo.format || !gpatch->mipmap.downloaded) md2_loadTexture(md2); - gpatch = md2->grpatch; // Load it again, because it isn't being loaded into gpatch after md2_loadtexture... + if ((gpatch && gpatch->mipmap.grInfo.format) // don't load the blend texture if the base texture isn't available + && (!md2->blendgrpatch || !((GLPatch_t *)md2->blendgrpatch)->mipmap.grInfo.format || !((GLPatch_t *)md2->blendgrpatch)->mipmap.downloaded)) + md2_loadBlendTexture(md2); + if (gpatch && gpatch->mipmap.grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture { - // This is safe, since we know the texture has been downloaded - HWD.pfnSetTexture(&gpatch->mipmap); + if ((skincolors_t)spr->mobj->color != SKINCOLOR_NONE && + md2->blendgrpatch && ((GLPatch_t *)md2->blendgrpatch)->mipmap.grInfo.format + && gpatch->width == ((GLPatch_t *)md2->blendgrpatch)->width && gpatch->height == ((GLPatch_t *)md2->blendgrpatch)->height) + { + HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, spr->colormap, (skincolors_t)spr->mobj->color); + } + else + { + // This is safe, since we know the texture has been downloaded + HWD.pfnSetTexture(&gpatch->mipmap); + } } else { diff --git a/src/hardware/hw_md2.h b/src/hardware/hw_md2.h index 0fb486ea0..36078268b 100644 --- a/src/hardware/hw_md2.h +++ b/src/hardware/hw_md2.h @@ -120,6 +120,7 @@ typedef struct float offset; md2_model_t *model; void *grpatch; + void *blendgrpatch; boolean notfound; INT32 skin; } md2_t; From 6b8c438e583ac5d895e0b4004dec4abca1d0ab40 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Mon, 3 Aug 2015 02:01:56 +0100 Subject: [PATCH 150/467] Change a few colours. --- src/hardware/hw_md2.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index e15af506f..c336e7bb3 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1137,37 +1137,37 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, blendcolor = V_GetColor(3); break; case SKINCOLOR_SILVER: - blendcolor = V_GetColor(11); + blendcolor = V_GetColor(10); break; case SKINCOLOR_GREY: - blendcolor = V_GetColor(23); + blendcolor = V_GetColor(15); break; case SKINCOLOR_BLACK: blendcolor = V_GetColor(27); break; case SKINCOLOR_CYAN: - blendcolor = V_GetColor(216); + blendcolor = V_GetColor(215); break; case SKINCOLOR_TEAL: - blendcolor = V_GetColor(220); + blendcolor = V_GetColor(221); break; case SKINCOLOR_STEELBLUE: - blendcolor = V_GetColor(204); + blendcolor = V_GetColor(203); break; case SKINCOLOR_BLUE: - blendcolor = V_GetColor(234); + blendcolor = V_GetColor(232); break; case SKINCOLOR_PEACH: - blendcolor = V_GetColor(73); + blendcolor = V_GetColor(71); break; case SKINCOLOR_TAN: - blendcolor = V_GetColor(49); + blendcolor = V_GetColor(79); break; case SKINCOLOR_PINK: - blendcolor = V_GetColor(146); + blendcolor = V_GetColor(147); break; case SKINCOLOR_LAVENDER: - blendcolor = V_GetColor(252); + blendcolor = V_GetColor(251); break; case SKINCOLOR_PURPLE: blendcolor = V_GetColor(195); @@ -1194,7 +1194,7 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, blendcolor = V_GetColor(184); break; case SKINCOLOR_GREEN: - blendcolor = V_GetColor(170); + blendcolor = V_GetColor(166); break; case SKINCOLOR_ZIM: blendcolor = V_GetColor(180); @@ -1210,23 +1210,23 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, break; case SKINCOLOR_SUPER1: - blendcolor = V_GetColor(101); + blendcolor = V_GetColor(97); break; case SKINCOLOR_SUPER2: - blendcolor = V_GetColor(113); + blendcolor = V_GetColor(100); break; case SKINCOLOR_SUPER3: - blendcolor = V_GetColor(114); + blendcolor = V_GetColor(103); break; case SKINCOLOR_SUPER4: - blendcolor = V_GetColor(116); + blendcolor = V_GetColor(113); break; case SKINCOLOR_SUPER5: - blendcolor = V_GetColor(119); + blendcolor = V_GetColor(116); break; case SKINCOLOR_TSUPER1: - blendcolor = V_GetColor(80); + blendcolor = V_GetColor(81); break; case SKINCOLOR_TSUPER2: blendcolor = V_GetColor(82); From ddb5652ab63c7d8720e1544af364b3252e0c1a9f Mon Sep 17 00:00:00 2001 From: Sean Ryder Date: Wed, 20 Jan 2016 15:55:32 +0000 Subject: [PATCH 151/467] Tabbing --- src/hardware/hw_md2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index c336e7bb3..6a315d881 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1107,8 +1107,8 @@ spritemd2found: static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, skincolors_t color) { UINT16 w = gpatch->width, h = gpatch->height; - UINT32 size = w*h; - RGBA_t *image, *blendimage, *cur, blendcolor; + UINT32 size = w*h; + RGBA_t *image, *blendimage, *cur, blendcolor; if (grmip->width == 0) { From 5d1c8d29685831ac9693f9654a4f135715c1c7fe Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Tue, 9 Feb 2016 19:35:04 +0000 Subject: [PATCH 152/467] My cherry picking somehow lead to these functions being doubled ...whoops --- src/hardware/hw_md2.c | 242 ------------------------------------------ 1 file changed, 242 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index b71cfb661..6a315d881 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1346,248 +1346,6 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, con Z_ChangeTag(newmip->grInfo.data, PU_HWRCACHE_UNLOCKED); } -static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, skincolors_t color) -{ - UINT16 w = gpatch->width, h = gpatch->height; - UINT32 size = w*h; - RGBA_t *image, *blendimage, *cur, blendcolor; - - if (grmip->width == 0) - { - - grmip->width = gpatch->width; - grmip->height = gpatch->height; - - // no wrap around, no chroma key - grmip->flags = 0; - // setup the texture info - grmip->grInfo.format = GR_RGBA; - } - - Z_Free(grmip->grInfo.data); - grmip->grInfo.data = NULL; - - cur = Z_Malloc(size*4, PU_HWRCACHE, &grmip->grInfo.data); - memset(cur, 0x00, size*4); - - image = gpatch->mipmap.grInfo.data; - blendimage = blendgpatch->mipmap.grInfo.data; - - switch (color) - { - case SKINCOLOR_WHITE: - blendcolor = V_GetColor(3); - break; - case SKINCOLOR_SILVER: - blendcolor = V_GetColor(10); - break; - case SKINCOLOR_GREY: - blendcolor = V_GetColor(15); - break; - case SKINCOLOR_BLACK: - blendcolor = V_GetColor(27); - break; - case SKINCOLOR_CYAN: - blendcolor = V_GetColor(215); - break; - case SKINCOLOR_TEAL: - blendcolor = V_GetColor(221); - break; - case SKINCOLOR_STEELBLUE: - blendcolor = V_GetColor(203); - break; - case SKINCOLOR_BLUE: - blendcolor = V_GetColor(232); - break; - case SKINCOLOR_PEACH: - blendcolor = V_GetColor(71); - break; - case SKINCOLOR_TAN: - blendcolor = V_GetColor(79); - break; - case SKINCOLOR_PINK: - blendcolor = V_GetColor(147); - break; - case SKINCOLOR_LAVENDER: - blendcolor = V_GetColor(251); - break; - case SKINCOLOR_PURPLE: - blendcolor = V_GetColor(195); - break; - case SKINCOLOR_ORANGE: - blendcolor = V_GetColor(87); - break; - case SKINCOLOR_ROSEWOOD: - blendcolor = V_GetColor(94); - break; - case SKINCOLOR_BEIGE: - blendcolor = V_GetColor(40); - break; - case SKINCOLOR_BROWN: - blendcolor = V_GetColor(57); - break; - case SKINCOLOR_RED: - blendcolor = V_GetColor(130); - break; - case SKINCOLOR_DARKRED: - blendcolor = V_GetColor(139); - break; - case SKINCOLOR_NEONGREEN: - blendcolor = V_GetColor(184); - break; - case SKINCOLOR_GREEN: - blendcolor = V_GetColor(166); - break; - case SKINCOLOR_ZIM: - blendcolor = V_GetColor(180); - break; - case SKINCOLOR_OLIVE: - blendcolor = V_GetColor(108); - break; - case SKINCOLOR_YELLOW: - blendcolor = V_GetColor(104); - break; - case SKINCOLOR_GOLD: - blendcolor = V_GetColor(115); - break; - - case SKINCOLOR_SUPER1: - blendcolor = V_GetColor(97); - break; - case SKINCOLOR_SUPER2: - blendcolor = V_GetColor(100); - break; - case SKINCOLOR_SUPER3: - blendcolor = V_GetColor(103); - break; - case SKINCOLOR_SUPER4: - blendcolor = V_GetColor(113); - break; - case SKINCOLOR_SUPER5: - blendcolor = V_GetColor(116); - break; - - case SKINCOLOR_TSUPER1: - blendcolor = V_GetColor(81); - break; - case SKINCOLOR_TSUPER2: - blendcolor = V_GetColor(82); - break; - case SKINCOLOR_TSUPER3: - blendcolor = V_GetColor(84); - break; - case SKINCOLOR_TSUPER4: - blendcolor = V_GetColor(85); - break; - case SKINCOLOR_TSUPER5: - blendcolor = V_GetColor(87); - break; - - case SKINCOLOR_KSUPER1: - blendcolor = V_GetColor(122); - break; - case SKINCOLOR_KSUPER2: - blendcolor = V_GetColor(123); - break; - case SKINCOLOR_KSUPER3: - blendcolor = V_GetColor(124); - break; - case SKINCOLOR_KSUPER4: - blendcolor = V_GetColor(125); - break; - case SKINCOLOR_KSUPER5: - blendcolor = V_GetColor(126); - break; - default: - blendcolor = V_GetColor(247); - break; - } - - while (size--) - { - if (blendimage->s.alpha == 0) - { - // Don't bother with blending the pixel if the alpha of the blend pixel is 0 - cur->rgba = image->rgba; - } - else - { - INT32 tempcolor; - INT16 tempmult, tempalpha; - tempalpha = -(abs(blendimage->s.red-127)-127)*2; - if (tempalpha > 255) - tempalpha = 255; - else if (tempalpha < 0) - tempalpha = 0; - - tempmult = (blendimage->s.red-127)*2; - if (tempmult > 255) - tempmult = 255; - else if (tempmult < 0) - tempmult = 0; - - tempcolor = (image->s.red*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.red)/255)) * blendimage->s.alpha)/255; - cur->s.red = (UINT8)tempcolor; - tempcolor = (image->s.green*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.green)/255)) * blendimage->s.alpha)/255; - cur->s.green = (UINT8)tempcolor; - tempcolor = (image->s.blue*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.blue)/255)) * blendimage->s.alpha)/255; - cur->s.blue = (UINT8)tempcolor; - cur->s.alpha = image->s.alpha; - } - - cur++; image++; blendimage++; - } - - return; -} - -static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, const UINT8 *colormap, skincolors_t color) -{ - // mostly copied from HWR_GetMappedPatch, hence the similarities and comment - GLMipmap_t *grmip, *newmip; - - if (colormap == colormaps || colormap == NULL) - { - // Don't do any blending - HWD.pfnSetTexture(&gpatch->mipmap); - return; - } - - // search for the mimmap - // skip the first (no colormap translated) - for (grmip = &gpatch->mipmap; grmip->nextcolormap; ) - { - grmip = grmip->nextcolormap; - if (grmip->colormap == colormap) - { - if (grmip->downloaded && grmip->grInfo.data) - { - HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture - Z_ChangeTag(grmip->grInfo.data, PU_HWRCACHE_UNLOCKED); - return; - } - } - } - - // If here, the blended texture has not been created - // So we create it - - //BP: WARNING: don't free it manually without clearing the cache of harware renderer - // (it have a liste of mipmap) - // this malloc is cleared in HWR_FreeTextureCache - // (...) unfortunately z_malloc fragment alot the memory :(so malloc is better - newmip = calloc(1, sizeof (*newmip)); - if (newmip == NULL) - I_Error("%s: Out of memory", "HWR_GetMappedPatch"); - grmip->nextcolormap = newmip; - newmip->colormap = colormap; - - HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, color); - - HWD.pfnSetTexture(newmip); - Z_ChangeTag(newmip->grInfo.data, PU_HWRCACHE_UNLOCKED); -} - // -----------------+ // HWR_DrawMD2 : Draw MD2 From 4e37964336e136ecead04d30d50579bb862eb454 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 11 Feb 2016 13:20:13 -0500 Subject: [PATCH 153/467] TRUE is not a vaild boolean under non Windows system --- src/m_cheat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_cheat.c b/src/m_cheat.c index 6eaf31c4a..68bc56b21 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -108,7 +108,7 @@ static UINT8 cheatf_devmode(void) G_SetGameModified(false); for (i = 0; i < MAXUNLOCKABLES; i++) unlockables[i].unlocked = true; - devparm = TRUE; + devparm = true; cv_debug |= 0x8000; // Refresh secrets menu existing. From 9470fc5567baf0ed3c73bdebac1b5fbc7751d3d1 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 11 Feb 2016 13:20:35 -0500 Subject: [PATCH 154/467] use sizeu#() on size_t printing --- src/r_things.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_things.c b/src/r_things.c index b94db488e..a5f795e0b 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1105,7 +1105,7 @@ static void R_ProjectSprite(mobj_t *thing) { sprdef = &((skin_t *)thing->skin)->sprites[thing->sprite2]; if (rot >= sprdef->numframes) { - CONS_Alert(CONS_ERROR, M_GetText("R_ProjectSprite: invalid skins[\"%s\"].sprites[SPR2_%s] frame %d\n"), ((skin_t *)thing->skin)->name, spr2names[thing->sprite2], rot); + CONS_Alert(CONS_ERROR, M_GetText("R_ProjectSprite: invalid skins[\"%s\"].sprites[SPR2_%s] frame %s\n"), ((skin_t *)thing->skin)->name, spr2names[thing->sprite2], sizeu5(rot)); thing->sprite = states[S_UNKNOWN].sprite; thing->frame = states[S_UNKNOWN].frame; sprdef = &sprites[thing->sprite]; From 01c78c16beafce5aeae7f6e3fdff4b6692b5287e Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Thu, 11 Feb 2016 13:46:30 -0500 Subject: [PATCH 155/467] fix md2 blendcolors for reduced palette --- src/hardware/hw_md2.c | 148 ++++++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 79 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index e9b387601..4eaed1259 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1145,119 +1145,109 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, case SKINCOLOR_BLACK: blendcolor = V_GetColor(27); break; - case SKINCOLOR_CYAN: - blendcolor = V_GetColor(215); - break; - case SKINCOLOR_TEAL: - blendcolor = V_GetColor(221); - break; - case SKINCOLOR_STEELBLUE: - blendcolor = V_GetColor(203); - break; - case SKINCOLOR_BLUE: - blendcolor = V_GetColor(232); + case SKINCOLOR_BEIGE: + blendcolor = V_GetColor(247); break; case SKINCOLOR_PEACH: - blendcolor = V_GetColor(71); - break; - case SKINCOLOR_TAN: - blendcolor = V_GetColor(79); - break; - case SKINCOLOR_PINK: - blendcolor = V_GetColor(147); - break; - case SKINCOLOR_LAVENDER: - blendcolor = V_GetColor(251); - break; - case SKINCOLOR_PURPLE: - blendcolor = V_GetColor(195); - break; - case SKINCOLOR_ORANGE: - blendcolor = V_GetColor(87); - break; - case SKINCOLOR_ROSEWOOD: - blendcolor = V_GetColor(94); - break; - case SKINCOLOR_BEIGE: - blendcolor = V_GetColor(40); + blendcolor = V_GetColor(218); break; case SKINCOLOR_BROWN: - blendcolor = V_GetColor(57); + blendcolor = V_GetColor(234); break; case SKINCOLOR_RED: - blendcolor = V_GetColor(130); + blendcolor = V_GetColor(38); break; - case SKINCOLOR_DARKRED: - blendcolor = V_GetColor(139); + case SKINCOLOR_CRIMSON: + blendcolor = V_GetColor(45); break; - case SKINCOLOR_NEONGREEN: - blendcolor = V_GetColor(184); + case SKINCOLOR_ORANGE: + blendcolor = V_GetColor(54); break; - case SKINCOLOR_GREEN: - blendcolor = V_GetColor(166); - break; - case SKINCOLOR_ZIM: - blendcolor = V_GetColor(180); - break; - case SKINCOLOR_OLIVE: - blendcolor = V_GetColor(108); - break; - case SKINCOLOR_YELLOW: - blendcolor = V_GetColor(104); + case SKINCOLOR_RUST: + blendcolor = V_GetColor(60); break; case SKINCOLOR_GOLD: - blendcolor = V_GetColor(115); + blendcolor = V_GetColor(67); + break; + case SKINCOLOR_YELLOW: + blendcolor = V_GetColor(73); + break; + case SKINCOLOR_TAN: + blendcolor = V_GetColor(85); + break; + case SKINCOLOR_MOSS: + blendcolor = V_GetColor(92); + break; + case SKINCOLOR_PERIDOT: + blendcolor = V_GetColor(188); + break; + case SKINCOLOR_GREEN: + blendcolor = V_GetColor(101); + break; + case SKINCOLOR_EMERALD: + blendcolor = V_GetColor(112); + break; + case SKINCOLOR_AQUA: + blendcolor = V_GetColor(122); + break; + case SKINCOLOR_TEAL: + blendcolor = V_GetColor(141); + break; + case SKINCOLOR_CYAN: + blendcolor = V_GetColor(131); + break; + case SKINCOLOR_BLUE: + blendcolor = V_GetColor(152); + break; + case SKINCOLOR_AZURE: + blendcolor = V_GetColor(171); + break; + case SKINCOLOR_PASTEL: + blendcolor = V_GetColor(161); + break; + case SKINCOLOR_PURPLE: + blendcolor = V_GetColor(165); + break; + case SKINCOLOR_LAVENDER: + blendcolor = V_GetColor(195); + break; + case SKINCOLOR_MAGENTA: + blendcolor = V_GetColor(183); + break; + case SKINCOLOR_PINK: + blendcolor = V_GetColor(211); + break; + case SKINCOLOR_ROSY: + blendcolor = V_GetColor(202); break; - case SKINCOLOR_SUPER1: - blendcolor = V_GetColor(97); + blendcolor = V_GetColor(80); break; case SKINCOLOR_SUPER2: - blendcolor = V_GetColor(100); + blendcolor = V_GetColor(83); break; case SKINCOLOR_SUPER3: - blendcolor = V_GetColor(103); + blendcolor = V_GetColor(73); break; case SKINCOLOR_SUPER4: - blendcolor = V_GetColor(113); + blendcolor = V_GetColor(64); break; case SKINCOLOR_SUPER5: - blendcolor = V_GetColor(116); + blendcolor = V_GetColor(67); break; case SKINCOLOR_TSUPER1: - blendcolor = V_GetColor(81); - break; case SKINCOLOR_TSUPER2: - blendcolor = V_GetColor(82); - break; case SKINCOLOR_TSUPER3: - blendcolor = V_GetColor(84); - break; case SKINCOLOR_TSUPER4: - blendcolor = V_GetColor(85); - break; case SKINCOLOR_TSUPER5: - blendcolor = V_GetColor(87); - break; - case SKINCOLOR_KSUPER1: - blendcolor = V_GetColor(122); - break; case SKINCOLOR_KSUPER2: - blendcolor = V_GetColor(123); - break; case SKINCOLOR_KSUPER3: - blendcolor = V_GetColor(124); - break; case SKINCOLOR_KSUPER4: - blendcolor = V_GetColor(125); - break; case SKINCOLOR_KSUPER5: - blendcolor = V_GetColor(126); - break; default: - blendcolor = V_GetColor(247); + blendcolor = V_GetColor(255); break; } From f59c8d20e526b8f3f58acacbf4d6fd911aca1ab5 Mon Sep 17 00:00:00 2001 From: toasterbabe Date: Thu, 11 Feb 2016 13:46:30 -0500 Subject: [PATCH 156/467] fix md2 blendcolors for reduced palette --- src/hardware/hw_md2.c | 148 ++++++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 79 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index e9b387601..4eaed1259 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1145,119 +1145,109 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, case SKINCOLOR_BLACK: blendcolor = V_GetColor(27); break; - case SKINCOLOR_CYAN: - blendcolor = V_GetColor(215); - break; - case SKINCOLOR_TEAL: - blendcolor = V_GetColor(221); - break; - case SKINCOLOR_STEELBLUE: - blendcolor = V_GetColor(203); - break; - case SKINCOLOR_BLUE: - blendcolor = V_GetColor(232); + case SKINCOLOR_BEIGE: + blendcolor = V_GetColor(247); break; case SKINCOLOR_PEACH: - blendcolor = V_GetColor(71); - break; - case SKINCOLOR_TAN: - blendcolor = V_GetColor(79); - break; - case SKINCOLOR_PINK: - blendcolor = V_GetColor(147); - break; - case SKINCOLOR_LAVENDER: - blendcolor = V_GetColor(251); - break; - case SKINCOLOR_PURPLE: - blendcolor = V_GetColor(195); - break; - case SKINCOLOR_ORANGE: - blendcolor = V_GetColor(87); - break; - case SKINCOLOR_ROSEWOOD: - blendcolor = V_GetColor(94); - break; - case SKINCOLOR_BEIGE: - blendcolor = V_GetColor(40); + blendcolor = V_GetColor(218); break; case SKINCOLOR_BROWN: - blendcolor = V_GetColor(57); + blendcolor = V_GetColor(234); break; case SKINCOLOR_RED: - blendcolor = V_GetColor(130); + blendcolor = V_GetColor(38); break; - case SKINCOLOR_DARKRED: - blendcolor = V_GetColor(139); + case SKINCOLOR_CRIMSON: + blendcolor = V_GetColor(45); break; - case SKINCOLOR_NEONGREEN: - blendcolor = V_GetColor(184); + case SKINCOLOR_ORANGE: + blendcolor = V_GetColor(54); break; - case SKINCOLOR_GREEN: - blendcolor = V_GetColor(166); - break; - case SKINCOLOR_ZIM: - blendcolor = V_GetColor(180); - break; - case SKINCOLOR_OLIVE: - blendcolor = V_GetColor(108); - break; - case SKINCOLOR_YELLOW: - blendcolor = V_GetColor(104); + case SKINCOLOR_RUST: + blendcolor = V_GetColor(60); break; case SKINCOLOR_GOLD: - blendcolor = V_GetColor(115); + blendcolor = V_GetColor(67); + break; + case SKINCOLOR_YELLOW: + blendcolor = V_GetColor(73); + break; + case SKINCOLOR_TAN: + blendcolor = V_GetColor(85); + break; + case SKINCOLOR_MOSS: + blendcolor = V_GetColor(92); + break; + case SKINCOLOR_PERIDOT: + blendcolor = V_GetColor(188); + break; + case SKINCOLOR_GREEN: + blendcolor = V_GetColor(101); + break; + case SKINCOLOR_EMERALD: + blendcolor = V_GetColor(112); + break; + case SKINCOLOR_AQUA: + blendcolor = V_GetColor(122); + break; + case SKINCOLOR_TEAL: + blendcolor = V_GetColor(141); + break; + case SKINCOLOR_CYAN: + blendcolor = V_GetColor(131); + break; + case SKINCOLOR_BLUE: + blendcolor = V_GetColor(152); + break; + case SKINCOLOR_AZURE: + blendcolor = V_GetColor(171); + break; + case SKINCOLOR_PASTEL: + blendcolor = V_GetColor(161); + break; + case SKINCOLOR_PURPLE: + blendcolor = V_GetColor(165); + break; + case SKINCOLOR_LAVENDER: + blendcolor = V_GetColor(195); + break; + case SKINCOLOR_MAGENTA: + blendcolor = V_GetColor(183); + break; + case SKINCOLOR_PINK: + blendcolor = V_GetColor(211); + break; + case SKINCOLOR_ROSY: + blendcolor = V_GetColor(202); break; - case SKINCOLOR_SUPER1: - blendcolor = V_GetColor(97); + blendcolor = V_GetColor(80); break; case SKINCOLOR_SUPER2: - blendcolor = V_GetColor(100); + blendcolor = V_GetColor(83); break; case SKINCOLOR_SUPER3: - blendcolor = V_GetColor(103); + blendcolor = V_GetColor(73); break; case SKINCOLOR_SUPER4: - blendcolor = V_GetColor(113); + blendcolor = V_GetColor(64); break; case SKINCOLOR_SUPER5: - blendcolor = V_GetColor(116); + blendcolor = V_GetColor(67); break; case SKINCOLOR_TSUPER1: - blendcolor = V_GetColor(81); - break; case SKINCOLOR_TSUPER2: - blendcolor = V_GetColor(82); - break; case SKINCOLOR_TSUPER3: - blendcolor = V_GetColor(84); - break; case SKINCOLOR_TSUPER4: - blendcolor = V_GetColor(85); - break; case SKINCOLOR_TSUPER5: - blendcolor = V_GetColor(87); - break; - case SKINCOLOR_KSUPER1: - blendcolor = V_GetColor(122); - break; case SKINCOLOR_KSUPER2: - blendcolor = V_GetColor(123); - break; case SKINCOLOR_KSUPER3: - blendcolor = V_GetColor(124); - break; case SKINCOLOR_KSUPER4: - blendcolor = V_GetColor(125); - break; case SKINCOLOR_KSUPER5: - blendcolor = V_GetColor(126); - break; default: - blendcolor = V_GetColor(247); + blendcolor = V_GetColor(255); break; } From dabc4415af553ec8a1bc14e381635e7d9879d279 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 13 Feb 2016 18:11:50 +0000 Subject: [PATCH 157/467] Fix crash caused by drawing scaled, mirrored sprites semi-covered on the left side by portal edge I suspect this crash was possible even outside the context of portals, but whatever --- src/r_things.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index 3767b02be..87879a415 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -839,10 +839,10 @@ static void R_DrawVisSprite(vissprite_t *vis) dc_texturemid = FixedDiv(dc_texturemid,this_scale); //Oh lordy, mercy me. Don't freak out if sprites go offscreen! - if (vis->xiscale > 0) + /*if (vis->xiscale > 0) frac = FixedDiv(frac, this_scale); else if (vis->x1 <= 0) - frac = (vis->x1 - vis->x2) * vis->xiscale; + frac = (vis->x1 - vis->x2) * vis->xiscale;*/ sprtopscreen = centeryfrac - FixedMul(dc_texturemid, spryscale); //dc_hires = 1; @@ -1306,7 +1306,7 @@ static void R_ProjectSprite(mobj_t *thing) } if (vis->x1 > x1) - vis->startfrac += vis->xiscale*(vis->x1-x1); + vis->startfrac += FixedDiv(vis->xiscale, this_scale)*(vis->x1-x1); //Fab: lumppat is the lump number of the patch to use, this is different // than lumpid for sprites-in-pwad : the graphics are patched From e43f21cdda4a75dd5ab089316680cdba32c27c33 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Sat, 13 Feb 2016 17:30:07 -0600 Subject: [PATCH 158/467] Fix dead MF_PAIN objects hurting the player Fixes #12 --- src/p_map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 7ff913a86..61d57dcd1 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -503,7 +503,7 @@ static boolean PIT_CheckThing(mobj_t *thing) return true; // overhead if (thing->z + thing->height < tmthing->z) return true; // underneath - if (tmthing->player && tmthing->flags & MF_SHOOTABLE) + if (tmthing->player && tmthing->flags & MF_SHOOTABLE && thing->health > 0) P_DamageMobj(tmthing, thing, thing, 1); return true; } @@ -514,7 +514,7 @@ static boolean PIT_CheckThing(mobj_t *thing) return true; // overhead if (tmthing->z + tmthing->height < thing->z) return true; // underneath - if (thing->player && thing->flags & MF_SHOOTABLE) + if (thing->player && thing->flags & MF_SHOOTABLE && tmthing->health > 0) P_DamageMobj(thing, tmthing, tmthing, 1); return true; } From db3797fd35da9dfde3dcef754b48ac47d9ea602d Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Sun, 14 Feb 2016 05:19:40 -0600 Subject: [PATCH 159/467] Add PlayerSpawn hook --- src/lua_hook.h | 2 ++ src/lua_hooklib.c | 1 + src/p_mobj.c | 6 ++++++ 3 files changed, 9 insertions(+) diff --git a/src/lua_hook.h b/src/lua_hook.h index da2dcdc38..f3af7f304 100644 --- a/src/lua_hook.h +++ b/src/lua_hook.h @@ -42,6 +42,7 @@ enum hook { hook_LinedefExecute, hook_PlayerMsg, hook_HurtMsg, + hook_PlayerSpawn, hook_MAX // last hook }; @@ -75,5 +76,6 @@ boolean LUAh_BotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd); // Hook for B_B boolean LUAh_LinedefExecute(line_t *line, mobj_t *mo, sector_t *sector); // Hook for linedef executors boolean LUAh_PlayerMsg(int source, int target, int flags, char *msg); // Hook for chat messages boolean LUAh_HurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source); // Hook for hurt messages +#define LUAh_PlayerSpawn(player) LUAh_PlayerHook(player, hook_PlayerSpawn) // Hook for P_SpawnPlayer #endif diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 0415d23e6..dfd6d703c 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -53,6 +53,7 @@ const char *const hookNames[hook_MAX+1] = { "LinedefExecute", "PlayerMsg", "HurtMsg", + "PlayerSpawn", NULL }; diff --git a/src/p_mobj.c b/src/p_mobj.c index 25ae8815a..4916dbfdf 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8294,6 +8294,12 @@ void P_SpawnPlayer(INT32 playernum) // Spawn with a pity shield if necessary. P_DoPityCheck(p); + +#ifdef HAVE_BLUA + if (LUAh_PlayerSpawn(p)) // Lua hook for player spawning :) + ; +#endif + } void P_AfterPlayerSpawn(INT32 playernum) From 7c5adacc6f25b19474e56764553f3e6b4523e27d Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sun, 14 Feb 2016 12:28:03 -0800 Subject: [PATCH 160/467] Fixed chain launching In the process, the stasis flags work like you'd expect them to. You can now set them in Lua or code and they'll actually do something. --- src/p_inter.c | 3 +++ src/p_user.c | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 709e0e2be..55d36a1de 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1339,6 +1339,9 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } else player->pflags |= PF_ITEMHANG; + + // Can't jump first frame + player->pflags |= PF_JUMPSTASIS; return; case MT_BIGMINE: case MT_BIGAIRMINE: diff --git a/src/p_user.c b/src/p_user.c index 96841d7e0..da65b7cb4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6340,8 +6340,7 @@ static void P_MovePlayer(player_t *player) if (!(player->powers[pw_nocontrol] & (1<<15))) player->pflags |= PF_JUMPSTASIS; } - else - player->pflags &= ~PF_FULLSTASIS; + // note: don't unset stasis here if (!player->spectator && G_TagGametype()) { @@ -8928,6 +8927,11 @@ void P_PlayerThink(player_t *player) if (!player->mo) return; // P_MovePlayer removed player->mo. + // Unset statis flags after moving. + // In other words, if you manually set stasis via code, + // it lasts for one tic. + player->pflags &= ~PF_FULLSTASIS; + #ifdef POLYOBJECTS if (player->onconveyor == 1) player->cmomy = player->cmomx = 0; From 000ec9ac67c47c1c16489f35987fe2c87caaab81 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Sun, 14 Feb 2016 15:22:13 -0600 Subject: [PATCH 161/467] Call LUAh_PlayerSpawn instead of checking for it --- src/p_mobj.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 4916dbfdf..367a3a7d0 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8296,8 +8296,7 @@ void P_SpawnPlayer(INT32 playernum) P_DoPityCheck(p); #ifdef HAVE_BLUA - if (LUAh_PlayerSpawn(p)) // Lua hook for player spawning :) - ; + LUAh_PlayerSpawn(p); // Lua hook for player spawning :) #endif } From ef6430c23eaadca8a78285d82fa7a53b0e2495a1 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 15 Feb 2016 20:34:53 +0000 Subject: [PATCH 162/467] Fix respawning rings on slopes --- src/p_mobj.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 25ae8815a..f240c40f2 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8171,7 +8171,11 @@ void P_RespawnSpecials(void) if (mthing->options & MTF_OBJECTFLIP) { - z = ss->sector->ceilingheight - (mthing->options >> ZSHIFT) * FRACUNIT; + z = ( +#ifdef ESLOPE + ss->sector->c_slope ? P_GetZAt(ss->sector->c_slope, x, y) : +#endif + ss->sector->ceilingheight) - (mthing->options >> ZSHIFT) * FRACUNIT; if (mthing->options & MTF_AMBUSH && (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN || P_WeaponOrPanel(i))) z -= 24*FRACUNIT; @@ -8179,7 +8183,11 @@ void P_RespawnSpecials(void) } else { - z = ss->sector->floorheight + (mthing->options >> ZSHIFT) * FRACUNIT; + z = ( +#ifdef ESLOPE + ss->sector->f_slope ? P_GetZAt(ss->sector->f_slope, x, y) : +#endif + ss->sector->floorheight) + (mthing->options >> ZSHIFT) * FRACUNIT; if (mthing->options & MTF_AMBUSH && (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN || P_WeaponOrPanel(i))) z += 24*FRACUNIT; From b5673ed101741b44562e4466f1369558c16b5d54 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 15 Feb 2016 20:46:56 +0000 Subject: [PATCH 163/467] Fix player spawning on slopes --- src/p_mobj.c | 60 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index f240c40f2..30c061d1e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8357,7 +8357,7 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing) fixed_t z; sector_t *sector; - + fixed_t floor, ceiling; player_t *p = &players[playernum]; mobj_t *mobj = p->mo; @@ -8373,19 +8373,31 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing) // set Z height sector = R_PointInSubsector(x, y)->sector; + + floor = +#ifdef ESLOPE + sector->f_slope ? P_GetZAt(sector->f_slope, x, y) : +#endif + sector->floorheight; + ceiling = +#ifdef ESLOPE + sector->c_slope ? P_GetZAt(sector->c_slope, x, y) : +#endif + sector->ceilingheight; + if (mthing) { // Flagging a player's ambush will make them start on the ceiling // Objectflip inverts if (!!(mthing->options & MTF_AMBUSH) ^ !!(mthing->options & MTF_OBJECTFLIP)) { - z = sector->ceilingheight - mobjinfo[MT_PLAYER].height; + z = ceiling - mobjinfo[MT_PLAYER].height; if (mthing->options >> ZSHIFT) z -= ((mthing->options >> ZSHIFT) << FRACBITS); } else { - z = sector->floorheight; + z = floor; if (mthing->options >> ZSHIFT) z += ((mthing->options >> ZSHIFT) << FRACBITS); } @@ -8397,15 +8409,15 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing) } } else - z = sector->floorheight; + z = floor; - if (z < sector->floorheight) - z = sector->floorheight; - else if (z > sector->ceilingheight - mobjinfo[MT_PLAYER].height) - z = sector->ceilingheight - mobjinfo[MT_PLAYER].height; + if (z < floor) + z = floor; + else if (z > ceiling - mobjinfo[MT_PLAYER].height) + z = ceiling - mobjinfo[MT_PLAYER].height; - mobj->floorz = sector->floorheight; - mobj->ceilingz = sector->ceilingheight; + mobj->floorz = floor; + mobj->ceilingz = ceiling; P_UnsetThingPosition(mobj); mobj->x = x; @@ -8413,7 +8425,7 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing) P_SetThingPosition(mobj); mobj->z = z; - if (mobj->z == sector->floorheight) + if (mobj->z == mobj->floorz) mobj->eflags |= MFE_ONGROUND; mobj->angle = angle; @@ -8425,6 +8437,7 @@ void P_MovePlayerToStarpost(INT32 playernum) { fixed_t z; sector_t *sector; + fixed_t floor, ceiling; player_t *p = &players[playernum]; mobj_t *mobj = p->mo; @@ -8436,14 +8449,25 @@ void P_MovePlayerToStarpost(INT32 playernum) P_SetThingPosition(mobj); sector = R_PointInSubsector(mobj->x, mobj->y)->sector; - z = p->starpostz << FRACBITS; - if (z < sector->floorheight) - z = sector->floorheight; - else if (z > sector->ceilingheight - mobjinfo[MT_PLAYER].height) - z = sector->ceilingheight - mobjinfo[MT_PLAYER].height; + floor = +#ifdef ESLOPE + sector->f_slope ? P_GetZAt(sector->f_slope, x, y) : +#endif + sector->floorheight; + ceiling = +#ifdef ESLOPE + sector->c_slope ? P_GetZAt(sector->c_slope, x, y) : +#endif + sector->ceilingheight; - mobj->floorz = sector->floorheight; - mobj->ceilingz = sector->ceilingheight; + z = p->starpostz << FRACBITS; + if (z < floor) + z = floor; + else if (z > ceiling - mobjinfo[MT_PLAYER].height) + z = ceiling - mobjinfo[MT_PLAYER].height; + + mobj->floorz = floor; + mobj->ceilingz = ceiling; mobj->z = z; if (mobj->z == mobj->floorz) From fa1bc5a09bb4ea7e69fc602d56b91d2ae685a651 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 15 Feb 2016 20:55:57 +0000 Subject: [PATCH 164/467] Whoops forgot this for last commit --- src/p_mobj.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 30c061d1e..65b5f9a09 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8451,12 +8451,12 @@ void P_MovePlayerToStarpost(INT32 playernum) floor = #ifdef ESLOPE - sector->f_slope ? P_GetZAt(sector->f_slope, x, y) : + sector->f_slope ? P_GetZAt(sector->f_slope, mobj->x, mobj->y) : #endif sector->floorheight; ceiling = #ifdef ESLOPE - sector->c_slope ? P_GetZAt(sector->c_slope, x, y) : + sector->c_slope ? P_GetZAt(sector->c_slope, mobj->x, mobj->y) : #endif sector->ceilingheight; From 03470118cd8214d75f220e009b14375051a7e4ea Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 15 Feb 2016 20:57:35 +0000 Subject: [PATCH 165/467] Added missing ESLOPE ifdef from when I first did these fixes for slope compiling --- src/r_segs.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/r_segs.c b/src/r_segs.c index 04873b29c..591242693 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1479,9 +1479,11 @@ void R_StoreWallRange(INT32 start, INT32 stop) maskedtextureheight = NULL; +#ifdef ESLOPE //initialize segleft and segright memset(&segleft, 0x00, sizeof(segleft)); memset(&segright, 0x00, sizeof(segright)); +#endif if (ds_p == drawsegs+maxdrawsegs) { From 3058648fdc1f0ec8723a0e2a273d66b067c575f2 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Tue, 16 Feb 2016 17:58:08 +0000 Subject: [PATCH 166/467] Fix elemental flame trails not spawning when going up slopes --- src/p_user.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/p_user.c b/src/p_user.c index 96841d7e0..d5ff80f6e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6193,6 +6193,14 @@ void P_ElementalFireTrail(player_t *player) { newx = player->mo->x + P_ReturnThrustX(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(24*FRACUNIT, player->mo->scale)); newy = player->mo->y + P_ReturnThrustY(player->mo, travelangle + ((i&1) ? -1 : 1)*ANGLE_135, FixedMul(24*FRACUNIT, player->mo->scale)); +#ifdef ESLOPE + if (player->mo->standingslope) + { + ground = P_GetZAt(player->mo->standingslope, newx, newy); + if (player->mo->eflags & MFE_VERTICALFLIP) + ground -= FixedMul(mobjinfo[MT_SPINFIRE].height, player->mo->scale); + } +#endif flame = P_SpawnMobj(newx, newy, ground, MT_SPINFIRE); P_SetTarget(&flame->target, player->mo); flame->angle = travelangle; From f87f1b7b1a9ad9b91d816316b5a0ab40a40cdfd0 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Thu, 28 Jan 2016 13:56:23 +0000 Subject: [PATCH 167/467] Fixed compiler errors as well as a ton of tab spaces (apparently it's a common problem in this file anyway but whatever) --- src/hardware/hw_main.c | 556 +++++++++++++++++++++-------------------- 1 file changed, 281 insertions(+), 275 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 52be99219..ddab53a04 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -538,37 +538,39 @@ static void HWR_RenderPlane(sector_t *shittyUnusedVariable, extrasubsector_t *xs FSurfaceInfo Surf; fixed_t tempxsow, tempytow; #ifdef ESLOPE - pslope_t *slope = NULL; + pslope_t *slope = NULL; #endif static FOutVector *planeVerts = NULL; static UINT16 numAllocedPlaneVerts = 0; + (void)shittyUnusedVariable; ///@TODO remove shitty unused variable + // no convex poly were generated for this subsector if (!xsub->planepoly) return; #ifdef ESLOPE - // Get the slope pointer to simplify future code - if (FOFsector) - { - if (FOFsector->f_slope && FOFsector->floorheight == fixedheight) - slope = FOFsector->f_slope; - else if (FOFsector->c_slope && FOFsector->ceilingheight == fixedheight) - slope = FOFsector->c_slope; - } - else - { - // Use fixedheight to determine whether to check floor or ceiling because I hate my life - if (gr_frontsector->f_slope && gr_frontsector->floorheight == fixedheight) - slope = gr_frontsector->f_slope; - else if (gr_frontsector->c_slope && gr_frontsector->ceilingheight == fixedheight) - slope = gr_frontsector->c_slope; - } + // Get the slope pointer to simplify future code + if (FOFsector) + { + if (FOFsector->f_slope && FOFsector->floorheight == fixedheight) + slope = FOFsector->f_slope; + else if (FOFsector->c_slope && FOFsector->ceilingheight == fixedheight) + slope = FOFsector->c_slope; + } + else + { + // Use fixedheight to determine whether to check floor or ceiling because I hate my life + if (gr_frontsector->f_slope && gr_frontsector->floorheight == fixedheight) + slope = gr_frontsector->f_slope; + else if (gr_frontsector->c_slope && gr_frontsector->ceilingheight == fixedheight) + slope = gr_frontsector->c_slope; + } - // Set fixedheight to the slope's height from our viewpoint, if we have a slope - if (slope) - fixedheight = P_GetZAt(slope, viewx, viewy); + // Set fixedheight to the slope's height from our viewpoint, if we have a slope + if (slope) + fixedheight = P_GetZAt(slope, viewx, viewy); #endif height = FIXED_TO_FLOAT(fixedheight); @@ -638,7 +640,7 @@ static void HWR_RenderPlane(sector_t *shittyUnusedVariable, extrasubsector_t *xs { #ifdef ESLOPE if ((slope && slope == FOFsector->f_slope) - || fixedheight == FOFsector->floorheight) // it's a floor + || fixedheight == FOFsector->floorheight) // it's a floor #else if (fixedheight == FOFsector->floorheight) // it's a floor #endif @@ -658,7 +660,7 @@ static void HWR_RenderPlane(sector_t *shittyUnusedVariable, extrasubsector_t *xs { #ifdef ESLOPE if ((slope && slope == gr_frontsector->f_slope) - || fixedheight == gr_frontsector->floorheight) // it's a floor + || fixedheight == gr_frontsector->floorheight) // it's a floor #else if (fixedheight < dup_viewz) // it's a floor #endif @@ -718,11 +720,11 @@ static void HWR_RenderPlane(sector_t *shittyUnusedVariable, extrasubsector_t *xs 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); - } + if (slope) + { + fixedheight = P_GetZAt(slope, FLOAT_TO_FIXED(pv->x), FLOAT_TO_FIXED(pv->y)); + v3d->y = FIXED_TO_FLOAT(fixedheight); + } #endif } @@ -742,8 +744,8 @@ static void HWR_RenderPlane(sector_t *shittyUnusedVariable, extrasubsector_t *xs sector_t *psector = gr_frontsector; #ifdef ESLOPE - if (slope) - fixedheight = P_GetZAt(slope, psector->soundorg.x, psector->soundorg.y); + if (slope) + fixedheight = P_GetZAt(slope, psector->soundorg.x, psector->soundorg.y); #endif if (psector->ffloors) @@ -1096,6 +1098,9 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, fixed_t v1y = FLOAT_TO_FIXED(wallVerts[0].y); fixed_t v2x = FLOAT_TO_FIXED(wallVerts[1].x); fixed_t v2y = FLOAT_TO_FIXED(wallVerts[1].y); + // compiler complains when P_GetZAt is used in FLOAT_TO_FIXED directly + // use this as a temp var to store P_GetZAt's return value each time + fixed_t temp; #endif INT32 solid, i; @@ -1156,21 +1161,27 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, solid = false; #ifdef ESLOPE - if (list[i].slope) - { - height = FIXED_TO_FLOAT(P_GetZAt(list[i].slope, v1x, v1y)); - endheight = FIXED_TO_FLOAT(P_GetZAt(list[i].slope, v2x, v2y)); - } - else - height = endheight = FIXED_TO_FLOAT(list[i].height); + if (list[i].slope) + { + temp = P_GetZAt(list[i].slope, v1x, v1y); + height = FIXED_TO_FLOAT(temp); + temp = P_GetZAt(list[i].slope, v2x, v2y); + endheight = FIXED_TO_FLOAT(temp); + } + else + height = endheight = FIXED_TO_FLOAT(list[i].height); if (solid) - if (*list[i].caster->b_slope) - { - bheight = FIXED_TO_FLOAT(P_GetZAt(*list[i].caster->b_slope, v1x, v1y)); - endbheight = FIXED_TO_FLOAT(P_GetZAt(*list[i].caster->b_slope, v2x, v2y)); - } - else - bheight = endbheight = FIXED_TO_FLOAT(*list[i].caster->bottomheight); + { + if (*list[i].caster->b_slope) + { + temp = P_GetZAt(*list[i].caster->b_slope, v1x, v1y); + bheight = FIXED_TO_FLOAT(temp); + temp = P_GetZAt(*list[i].caster->b_slope, v2x, v2y); + endbheight = FIXED_TO_FLOAT(temp); + } + else + bheight = endbheight = FIXED_TO_FLOAT(*list[i].caster->bottomheight); + } #else height = FIXED_TO_FLOAT(list[i].height); if (solid) @@ -1178,15 +1189,15 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, #endif #ifdef ESLOPE - if (endheight >= endtop) + if (endheight >= endtop) #endif if (height >= top) { if (solid && top > bheight) top = bheight; #ifdef ESLOPE - if (solid && endtop > endbheight) - endtop = endbheight; + if (solid && endtop > endbheight) + endtop = endbheight; #endif continue; } @@ -1198,10 +1209,10 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, bot = realbot; #ifdef ESLOPE - endbot = endheight; + endbot = endheight; - if (endbot < endrealbot) - endbot = endrealbot; + if (endbot < endrealbot) + endbot = endrealbot; #endif // colormap test @@ -1228,7 +1239,7 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, wallVerts[3].y = top; wallVerts[2].y = endtop; wallVerts[0].y = bot; - wallVerts[1].y = endbot; + wallVerts[1].y = endbot; #else wallVerts[3].t = wallVerts[2].t = pegt + ((realtop - top) * pegmul); wallVerts[0].t = wallVerts[1].t = pegt + ((realtop - bot) * pegmul); @@ -1260,8 +1271,8 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, bot = realbot; #ifdef ESLOPE - endbot = endrealbot; - if (endtop <= endrealbot) + endbot = endrealbot; + if (endtop <= endrealbot) #endif if (top <= realbot) return; @@ -1279,16 +1290,16 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, Surf->FlatColor.s.alpha = alpha; #ifdef ESLOPE - wallVerts[3].t = pegt + ((realtop - top) * pegmul); - wallVerts[2].t = endpegt + ((endrealtop - endtop) * endpegmul); - wallVerts[0].t = pegt + ((realtop - bot) * pegmul); - wallVerts[1].t = endpegt + ((endrealtop - endbot) * endpegmul); + wallVerts[3].t = pegt + ((realtop - top) * pegmul); + wallVerts[2].t = endpegt + ((endrealtop - endtop) * endpegmul); + wallVerts[0].t = pegt + ((realtop - bot) * pegmul); + wallVerts[1].t = endpegt + ((endrealtop - endbot) * endpegmul); - // set top/bottom coords - wallVerts[3].y = top; - wallVerts[2].y = endtop; - wallVerts[0].y = bot; - wallVerts[1].y = endbot; + // set top/bottom coords + wallVerts[3].y = top; + wallVerts[2].y = endtop; + wallVerts[0].y = bot; + wallVerts[1].y = endbot; #else wallVerts[3].t = wallVerts[2].t = pegt + ((realtop - top) * pegmul); wallVerts[0].t = wallVerts[1].t = pegt + ((realtop - bot) * pegmul); @@ -1455,7 +1466,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) INT32 gr_midtexture; fixed_t h, l; // 3D sides and 2s middle textures #ifdef ESLOPE - fixed_t hS, lS; + fixed_t hS, lS; #endif FUINT lightnum = 0; // shut up compiler @@ -1474,10 +1485,10 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) ve.y = ((polyvertex_t *)gr_curline->v2)->y; #ifdef ESLOPE - v1x = FLOAT_TO_FIXED(vs.x); - v1y = FLOAT_TO_FIXED(vs.y); - v2x = FLOAT_TO_FIXED(ve.x); - v2y = FLOAT_TO_FIXED(ve.y); + v1x = FLOAT_TO_FIXED(vs.x); + v1y = FLOAT_TO_FIXED(vs.y); + v2x = FLOAT_TO_FIXED(ve.x); + v2y = FLOAT_TO_FIXED(ve.y); #endif if (gr_frontsector->heightsec != -1) @@ -1493,25 +1504,25 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) else { #ifdef ESLOPE - if (gr_frontsector->c_slope) - { - worldtop = P_GetZAt(gr_frontsector->c_slope, v1x, v1y); - worldtopslope = P_GetZAt(gr_frontsector->c_slope, v2x, v2y); - } - else - { - worldtop = worldtopslope = gr_frontsector->ceilingheight; - } + if (gr_frontsector->c_slope) + { + worldtop = P_GetZAt(gr_frontsector->c_slope, v1x, v1y); + worldtopslope = P_GetZAt(gr_frontsector->c_slope, v2x, v2y); + } + else + { + worldtop = worldtopslope = gr_frontsector->ceilingheight; + } - if (gr_frontsector->f_slope) - { - worldbottom = P_GetZAt(gr_frontsector->f_slope, v1x, v1y); - worldbottomslope = P_GetZAt(gr_frontsector->f_slope, v2x, v2y); - } - else - { - worldbottom = worldbottomslope = gr_frontsector->floorheight; - } + if (gr_frontsector->f_slope) + { + worldbottom = P_GetZAt(gr_frontsector->f_slope, v1x, v1y); + worldbottomslope = P_GetZAt(gr_frontsector->f_slope, v2x, v2y); + } + else + { + worldbottom = worldbottomslope = gr_frontsector->floorheight; + } #else worldtop = gr_frontsector->ceilingheight; worldbottom = gr_frontsector->floorheight; @@ -1572,25 +1583,25 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) else { #ifdef ESLOPE - if (gr_backsector->c_slope) - { - worldhigh = P_GetZAt(gr_backsector->c_slope, v1x, v1y); - worldhighslope = P_GetZAt(gr_backsector->c_slope, v2x, v2y); - } - else - { - worldhigh = worldhighslope = gr_backsector->ceilingheight; - } + if (gr_backsector->c_slope) + { + worldhigh = P_GetZAt(gr_backsector->c_slope, v1x, v1y); + worldhighslope = P_GetZAt(gr_backsector->c_slope, v2x, v2y); + } + else + { + worldhigh = worldhighslope = gr_backsector->ceilingheight; + } - if (gr_backsector->f_slope) - { - worldlow = P_GetZAt(gr_backsector->f_slope, v1x, v1y); - worldlowslope = P_GetZAt(gr_backsector->f_slope, v2x, v2y); - } - else - { - worldlow = worldlowslope = gr_backsector->floorheight; - } + if (gr_backsector->f_slope) + { + worldlow = P_GetZAt(gr_backsector->f_slope, v1x, v1y); + worldlowslope = P_GetZAt(gr_backsector->f_slope, v2x, v2y); + } + else + { + worldlow = worldlowslope = gr_backsector->floorheight; + } #else worldhigh = gr_backsector->ceilingheight; worldlow = gr_backsector->floorheight; @@ -1604,14 +1615,14 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { worldtop = worldhigh; #ifdef ESLOPE - worldtopslope = worldhighslope; + worldtopslope = worldhighslope; #endif } // check TOP TEXTURE if (( #ifdef ESLOPE - worldhighslope < worldtopslope || + worldhighslope < worldtopslope || #endif worldhigh < worldtop ) && texturetranslation[gr_sidedef->toptexture]) @@ -1646,28 +1657,28 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX; #ifdef ESLOPE - // Adjust t value for sloped walls - if (!(gr_linedef->flags & ML_EFFECT1)) - { - // Unskewed - wallVerts[3].t -= (worldtop - gr_frontsector->ceilingheight) * grTex->scaleY; - wallVerts[2].t -= (worldtopslope - gr_frontsector->ceilingheight) * grTex->scaleY; - wallVerts[0].t -= (worldhigh - gr_backsector->ceilingheight) * grTex->scaleY; - wallVerts[1].t -= (worldhighslope - gr_backsector->ceilingheight) * grTex->scaleY; - } - else if (gr_linedef->flags & ML_DONTPEGTOP) - { - // Skewed by top - wallVerts[0].t = (texturevpegtop + worldtop - worldhigh) * grTex->scaleY; - wallVerts[1].t = (texturevpegtop + worldtopslope - worldhighslope) * grTex->scaleY; - } - else - { - // Skewed by bottom - wallVerts[0].t = (texturevpegtop + worldhigh - worldtop) * grTex->scaleY; - wallVerts[2].t = wallVerts[3].t - (worldhighslope - worldhigh) * grTex->scaleY; - wallVerts[1].t = wallVerts[2].t - (worldhighslope - worldtopslope) * grTex->scaleY; - } + // Adjust t value for sloped walls + if (!(gr_linedef->flags & ML_EFFECT1)) + { + // Unskewed + wallVerts[3].t -= (worldtop - gr_frontsector->ceilingheight) * grTex->scaleY; + wallVerts[2].t -= (worldtopslope - gr_frontsector->ceilingheight) * grTex->scaleY; + wallVerts[0].t -= (worldhigh - gr_backsector->ceilingheight) * grTex->scaleY; + wallVerts[1].t -= (worldhighslope - gr_backsector->ceilingheight) * grTex->scaleY; + } + else if (gr_linedef->flags & ML_DONTPEGTOP) + { + // Skewed by top + wallVerts[0].t = (texturevpegtop + worldtop - worldhigh) * grTex->scaleY; + wallVerts[1].t = (texturevpegtop + worldtopslope - worldhighslope) * grTex->scaleY; + } + else + { + // Skewed by bottom + wallVerts[0].t = (texturevpegtop + worldhigh - worldtop) * grTex->scaleY; + wallVerts[2].t = wallVerts[3].t - (worldhighslope - worldhigh) * grTex->scaleY; + wallVerts[1].t = wallVerts[2].t - (worldhighslope - worldtopslope) * grTex->scaleY; + } #endif } @@ -1693,7 +1704,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) // check BOTTOM TEXTURE if (( #ifdef ESLOPE - worldlowslope > worldbottomslope || + worldlowslope > worldbottomslope || #endif worldlow > worldbottom) && texturetranslation[gr_sidedef->bottomtexture]) //only if VISIBLE!!! { @@ -1729,28 +1740,28 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX; #ifdef ESLOPE - // Adjust t value for sloped walls - if (!(gr_linedef->flags & ML_EFFECT1)) - { - // Unskewed - wallVerts[0].t -= (worldbottom - gr_frontsector->floorheight) * grTex->scaleY; - wallVerts[1].t -= (worldbottomslope - gr_frontsector->floorheight) * grTex->scaleY; - wallVerts[3].t -= (worldlow - gr_backsector->floorheight) * grTex->scaleY; - wallVerts[2].t -= (worldlowslope - gr_backsector->floorheight) * grTex->scaleY; - } - else if (gr_linedef->flags & ML_DONTPEGBOTTOM) - { - // Skewed by bottom - wallVerts[0].t = (texturevpegbottom + worldlow - worldbottom) * grTex->scaleY; - wallVerts[2].t = wallVerts[3].t - (worldlowslope - worldlow) * grTex->scaleY; - wallVerts[1].t = wallVerts[2].t - (worldbottomslope - worldlowslope) * grTex->scaleY; - } - else - { - // Skewed by top - wallVerts[0].t = (texturevpegbottom + worldlow - worldbottom) * grTex->scaleY; - wallVerts[1].t = (texturevpegbottom + worldlowslope - worldbottomslope) * grTex->scaleY; - } + // Adjust t value for sloped walls + if (!(gr_linedef->flags & ML_EFFECT1)) + { + // Unskewed + wallVerts[0].t -= (worldbottom - gr_frontsector->floorheight) * grTex->scaleY; + wallVerts[1].t -= (worldbottomslope - gr_frontsector->floorheight) * grTex->scaleY; + wallVerts[3].t -= (worldlow - gr_backsector->floorheight) * grTex->scaleY; + wallVerts[2].t -= (worldlowslope - gr_backsector->floorheight) * grTex->scaleY; + } + else if (gr_linedef->flags & ML_DONTPEGBOTTOM) + { + // Skewed by bottom + wallVerts[0].t = (texturevpegbottom + worldlow - worldbottom) * grTex->scaleY; + wallVerts[2].t = wallVerts[3].t - (worldlowslope - worldlow) * grTex->scaleY; + wallVerts[1].t = wallVerts[2].t - (worldbottomslope - worldlowslope) * grTex->scaleY; + } + else + { + // Skewed by top + wallVerts[0].t = (texturevpegbottom + worldlow - worldbottom) * grTex->scaleY; + wallVerts[1].t = (texturevpegbottom + worldlowslope - worldbottomslope) * grTex->scaleY; + } #endif } @@ -1843,20 +1854,20 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) } #ifdef ESLOPE - if (gr_linedef->flags & ML_EFFECT2) - { - if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) - { - polybottom = max(front->floorheight, back->floorheight) + gr_sidedef->rowoffset; - polytop = polybottom + textureheight[gr_midtexture]*repeats; - } - else - { - polytop = min(front->ceilingheight, back->ceilingheight) + gr_sidedef->rowoffset; - polybottom = polytop - textureheight[gr_midtexture]*repeats; - } - } - else if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) + if (gr_linedef->flags & ML_EFFECT2) + { + if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) + { + polybottom = max(front->floorheight, back->floorheight) + gr_sidedef->rowoffset; + polytop = polybottom + textureheight[gr_midtexture]*repeats; + } + else + { + polytop = min(front->ceilingheight, back->ceilingheight) + gr_sidedef->rowoffset; + polybottom = polytop - textureheight[gr_midtexture]*repeats; + } + } + else if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) #else if (gr_linedef->flags & ML_DONTPEGBOTTOM) #endif @@ -1893,7 +1904,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { // PEGGING #ifdef ESLOPE - if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) + if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) #else if (gr_linedef->flags & ML_DONTPEGBOTTOM) #endif @@ -1916,49 +1927,49 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(l); #ifdef ESLOPE - // Correct to account for slopes - { - fixed_t midtextureslant; + // Correct to account for slopes + { + fixed_t midtextureslant; - if (gr_linedef->flags & ML_EFFECT2) - midtextureslant = 0; - else if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) - midtextureslant = worldlow < worldbottom - ? worldbottomslope-worldbottom - : worldlowslope-worldlow; - else - midtextureslant = worldtop < worldhigh - ? worldtopslope-worldtop - : worldhighslope-worldhigh; + if (gr_linedef->flags & ML_EFFECT2) + midtextureslant = 0; + else if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) + midtextureslant = worldlow < worldbottom + ? worldbottomslope-worldbottom + : worldlowslope-worldlow; + else + midtextureslant = worldtop < worldhigh + ? worldtopslope-worldtop + : worldhighslope-worldhigh; - polytop += midtextureslant; - polybottom += midtextureslant; + polytop += midtextureslant; + polybottom += midtextureslant; - highcut += worldtop < worldhigh - ? worldtopslope-worldtop - : worldhighslope-worldhigh; - lowcut += worldlow < worldbottom - ? worldbottomslope-worldbottom - : worldlowslope-worldlow; + highcut += worldtop < worldhigh + ? worldtopslope-worldtop + : worldhighslope-worldhigh; + lowcut += worldlow < worldbottom + ? worldbottomslope-worldbottom + : worldlowslope-worldlow; - // Texture stuff - h = min(highcut, polytop); - l = max(polybottom, lowcut); + // Texture stuff + h = min(highcut, polytop); + l = max(polybottom, lowcut); - if (drawtextured) - { - // PEGGING - if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) - texturevpeg = textureheight[gr_sidedef->midtexture]*repeats - h + polybottom; - else - texturevpeg = polytop - h; - wallVerts[2].t = texturevpeg * grTex->scaleY; - wallVerts[1].t = (h - l + texturevpeg) * grTex->scaleY; - } + if (drawtextured) + { + // PEGGING + if (!!(gr_linedef->flags & ML_DONTPEGBOTTOM) ^ !!(gr_linedef->flags & ML_EFFECT3)) + texturevpeg = textureheight[gr_sidedef->midtexture]*repeats - h + polybottom; + else + texturevpeg = polytop - h; + wallVerts[2].t = texturevpeg * grTex->scaleY; + wallVerts[1].t = (h - l + texturevpeg) * grTex->scaleY; + } - wallVerts[2].y = FIXED_TO_FLOAT(h); - wallVerts[1].y = FIXED_TO_FLOAT(l); - } + wallVerts[2].y = FIXED_TO_FLOAT(h); + wallVerts[1].y = FIXED_TO_FLOAT(l); + } #endif // set alpha for transparent walls (new boom and legacy linedef types) @@ -2142,9 +2153,9 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) fixed_t texturevpeg; // PEGGING #ifdef ESLOPE - if ((gr_linedef->flags & (ML_DONTPEGBOTTOM|ML_EFFECT2)) == (ML_DONTPEGBOTTOM|ML_EFFECT2)) + if ((gr_linedef->flags & (ML_DONTPEGBOTTOM|ML_EFFECT2)) == (ML_DONTPEGBOTTOM|ML_EFFECT2)) texturevpeg = gr_frontsector->floorheight + textureheight[gr_sidedef->midtexture] - gr_frontsector->ceilingheight + gr_sidedef->rowoffset; - else + else #endif if (gr_linedef->flags & ML_DONTPEGBOTTOM) texturevpeg = worldbottom + textureheight[gr_sidedef->midtexture] - worldtop + gr_sidedef->rowoffset; @@ -2160,28 +2171,27 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) wallVerts[2].s = wallVerts[1].s = cliphigh * grTex->scaleX; #ifdef ESLOPE - // Texture correction for slopes - if (gr_linedef->flags & ML_EFFECT2) { - wallVerts[3].t += (gr_frontsector->ceilingheight - worldtop) * grTex->scaleY; - wallVerts[2].t += (gr_frontsector->ceilingheight - worldtopslope) * grTex->scaleY; - wallVerts[0].t += (gr_frontsector->floorheight - worldbottom) * grTex->scaleY; - wallVerts[1].t += (gr_frontsector->floorheight - worldbottomslope) * grTex->scaleY; - } else if (gr_linedef->flags & ML_DONTPEGBOTTOM) { - wallVerts[3].t = wallVerts[0].t + (worldbottom-worldtop) * grTex->scaleY; - wallVerts[2].t = wallVerts[1].t + (worldbottomslope-worldtopslope) * grTex->scaleY; - } else { - wallVerts[0].t = wallVerts[3].t - (worldbottom-worldtop) * grTex->scaleY; - wallVerts[1].t = wallVerts[2].t - (worldbottomslope-worldtopslope) * grTex->scaleY; - } + // Texture correction for slopes + if (gr_linedef->flags & ML_EFFECT2) { + wallVerts[3].t += (gr_frontsector->ceilingheight - worldtop) * grTex->scaleY; + wallVerts[2].t += (gr_frontsector->ceilingheight - worldtopslope) * grTex->scaleY; + wallVerts[0].t += (gr_frontsector->floorheight - worldbottom) * grTex->scaleY; + wallVerts[1].t += (gr_frontsector->floorheight - worldbottomslope) * grTex->scaleY; + } else if (gr_linedef->flags & ML_DONTPEGBOTTOM) { + wallVerts[3].t = wallVerts[0].t + (worldbottom-worldtop) * grTex->scaleY; + wallVerts[2].t = wallVerts[1].t + (worldbottomslope-worldtopslope) * grTex->scaleY; + } else { + wallVerts[0].t = wallVerts[3].t - (worldbottom-worldtop) * grTex->scaleY; + wallVerts[1].t = wallVerts[2].t - (worldbottomslope-worldtopslope) * grTex->scaleY; + } #endif } #ifdef ESLOPE - //Set textures properly on single sided walls that are sloped + //Set textures properly on single sided walls that are sloped wallVerts[3].y = FIXED_TO_FLOAT(worldtop); wallVerts[0].y = FIXED_TO_FLOAT(worldbottom); wallVerts[2].y = FIXED_TO_FLOAT(worldtopslope); wallVerts[1].y = FIXED_TO_FLOAT(worldbottomslope); - #else // set top/bottom coords wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(worldtop); @@ -2255,12 +2265,10 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) //FIXME: check if peging is correct // set top/bottom coords - wallVerts[3].y = FIXED_TO_FLOAT(h); - wallVerts[2].y = FIXED_TO_FLOAT(hS); - wallVerts[0].y = FIXED_TO_FLOAT(l); - wallVerts[1].y = FIXED_TO_FLOAT(lS); - - + wallVerts[3].y = FIXED_TO_FLOAT(h); + wallVerts[2].y = FIXED_TO_FLOAT(hS); + wallVerts[0].y = FIXED_TO_FLOAT(l); + wallVerts[1].y = FIXED_TO_FLOAT(lS); #else h = *rover->topheight; l = *rover->bottomheight; @@ -2284,13 +2292,13 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) else if (drawtextured) { #ifdef ESLOPE // P.S. this is better-organized than the old version - fixed_t offs = sides[(newline ?: rover->master)->sidenum[0]].rowoffset; + fixed_t offs = sides[(newline ?: rover->master)->sidenum[0]].rowoffset; grTex = HWR_GetTexture(texnum); - wallVerts[3].t = (*rover->topheight - h + offs) * grTex->scaleY; - wallVerts[2].t = (*rover->topheight - hS + offs) * grTex->scaleY; - wallVerts[0].t = (*rover->topheight - l + offs) * grTex->scaleY; - wallVerts[1].t = (*rover->topheight - lS + offs) * grTex->scaleY; + wallVerts[3].t = (*rover->topheight - h + offs) * grTex->scaleY; + wallVerts[2].t = (*rover->topheight - hS + offs) * grTex->scaleY; + wallVerts[0].t = (*rover->topheight - l + offs) * grTex->scaleY; + wallVerts[1].t = (*rover->topheight - lS + offs) * grTex->scaleY; #else grTex = HWR_GetTexture(texnum); @@ -2390,12 +2398,10 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) //FIXME: check if peging is correct // set top/bottom coords - wallVerts[3].y = FIXED_TO_FLOAT(h); - wallVerts[2].y = FIXED_TO_FLOAT(hS); - wallVerts[0].y = FIXED_TO_FLOAT(l); - wallVerts[1].y = FIXED_TO_FLOAT(lS); - - + wallVerts[3].y = FIXED_TO_FLOAT(h); + wallVerts[2].y = FIXED_TO_FLOAT(hS); + wallVerts[0].y = FIXED_TO_FLOAT(l); + wallVerts[1].y = FIXED_TO_FLOAT(lS); #else h = *rover->topheight; l = *rover->bottomheight; @@ -2902,17 +2908,17 @@ static void HWR_AddLine(seg_t * line) // and no middle texture. if ( #ifdef POLYOBJECTS - !line->polyseg && + !line->polyseg && #endif - gr_backsector->ceilingpic == gr_frontsector->ceilingpic - && gr_backsector->floorpic == gr_frontsector->floorpic + gr_backsector->ceilingpic == gr_frontsector->ceilingpic + && gr_backsector->floorpic == gr_frontsector->floorpic #ifdef ESLOPE - && gr_backsector->f_slope == gr_frontsector->f_slope - && gr_backsector->c_slope == gr_frontsector->c_slope + && gr_backsector->f_slope == gr_frontsector->f_slope + && gr_backsector->c_slope == gr_frontsector->c_slope #endif && gr_backsector->lightlevel == gr_frontsector->lightlevel - && gr_curline->sidedef->midtexture == 0 - && !gr_backsector->ffloors && !gr_frontsector->ffloors) + && gr_curline->sidedef->midtexture == 0 + && !gr_backsector->ffloors && !gr_frontsector->ffloors) // SoM: For 3D sides... Boris, would you like to take a // crack at rendering 3D sides? You would need to add the // above check and add code to HWR_StoreWallRange... @@ -3307,7 +3313,7 @@ static void HWR_Subsector(size_t num) INT32 floorlightlevel; INT32 ceilinglightlevel; INT32 locFloorHeight, locCeilingHeight; - INT32 cullFloorHeight, cullCeilingHeight; + INT32 cullFloorHeight, cullCeilingHeight; INT32 light = 0; fixed_t wh; extracolormap_t *floorcolormap; @@ -3370,7 +3376,7 @@ static void HWR_Subsector(size_t num) } else if (gr_frontsector->virtualFloor) { - ///@TODO Is this whole virtualFloor mess even useful? I don't think it even triggers ever. + ///@TODO Is this whole virtualFloor mess even useful? I don't think it even triggers ever. cullFloorHeight = locFloorHeight = gr_frontsector->virtualFloorheight; if (gr_frontsector->virtualCeiling) cullCeilingHeight = locCeilingHeight = gr_frontsector->virtualCeilingheight; @@ -3388,17 +3394,17 @@ static void HWR_Subsector(size_t num) cullCeilingHeight = locCeilingHeight = gr_frontsector->ceilingheight; #ifdef ESLOPE - if (gr_frontsector->f_slope) - { - cullFloorHeight = P_GetZAt(gr_frontsector->f_slope, viewx, viewy); - locFloorHeight = P_GetZAt(gr_frontsector->f_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); - } + if (gr_frontsector->f_slope) + { + cullFloorHeight = P_GetZAt(gr_frontsector->f_slope, viewx, viewy); + locFloorHeight = P_GetZAt(gr_frontsector->f_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); + } - if (gr_frontsector->c_slope) - { - cullCeilingHeight = P_GetZAt(gr_frontsector->c_slope, viewx, viewy); - locCeilingHeight = P_GetZAt(gr_frontsector->c_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); - } + if (gr_frontsector->c_slope) + { + cullCeilingHeight = P_GetZAt(gr_frontsector->c_slope, viewx, viewy); + locCeilingHeight = P_GetZAt(gr_frontsector->c_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); + } #endif } // ----- end special tricks ----- @@ -3438,10 +3444,10 @@ static void HWR_Subsector(size_t num) { HWR_GetFlat(levelflats[gr_frontsector->floorpic].lumpnum); HWR_RenderPlane(gr_frontsector, &extrasubsectors[num], - // Hack to make things continue to work around slopes. - locFloorHeight == cullFloorHeight ? locFloorHeight : gr_frontsector->floorheight, - // We now return you to your regularly scheduled rendering. - PF_Occlude, floorlightlevel, levelflats[gr_frontsector->floorpic].lumpnum, NULL, 255, false, floorcolormap); + // Hack to make things continue to work around slopes. + locFloorHeight == cullFloorHeight ? locFloorHeight : gr_frontsector->floorheight, + // We now return you to your regularly scheduled rendering. + PF_Occlude, floorlightlevel, levelflats[gr_frontsector->floorpic].lumpnum, NULL, 255, false, floorcolormap); } } else @@ -3460,10 +3466,10 @@ static void HWR_Subsector(size_t num) { HWR_GetFlat(levelflats[gr_frontsector->ceilingpic].lumpnum); HWR_RenderPlane(NULL, &extrasubsectors[num], - // Hack to make things continue to work around slopes. - locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gr_frontsector->ceilingheight, - // We now return you to your regularly scheduled rendering. - PF_Occlude, ceilinglightlevel, levelflats[gr_frontsector->ceilingpic].lumpnum,NULL, 255, false, ceilingcolormap); + // Hack to make things continue to work around slopes. + locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gr_frontsector->ceilingheight, + // We now return you to your regularly scheduled rendering. + PF_Occlude, ceilinglightlevel, levelflats[gr_frontsector->ceilingpic].lumpnum,NULL, 255, false, ceilingcolormap); } } else @@ -3492,16 +3498,16 @@ static void HWR_Subsector(size_t num) for (rover = gr_frontsector->ffloors; rover; rover = rover->next) { - fixed_t cullHeight, centerHeight; + fixed_t cullHeight, centerHeight; // bottom plane #ifdef ESLOPE - if (*rover->b_slope) - { - cullHeight = P_GetZAt(*rover->b_slope, viewx, viewy); - centerHeight = P_GetZAt(*rover->b_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); - } - else + if (*rover->b_slope) + { + cullHeight = P_GetZAt(*rover->b_slope, viewx, viewy); + centerHeight = P_GetZAt(*rover->b_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); + } + else #endif cullHeight = centerHeight = *rover->bottomheight; @@ -3562,12 +3568,12 @@ static void HWR_Subsector(size_t num) // top plane #ifdef ESLOPE - if (*rover->t_slope) - { - cullHeight = P_GetZAt(*rover->t_slope, viewx, viewy); - centerHeight = P_GetZAt(*rover->t_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); - } - else + if (*rover->t_slope) + { + cullHeight = P_GetZAt(*rover->t_slope, viewx, viewy); + centerHeight = P_GetZAt(*rover->t_slope, gr_frontsector->soundorg.x, gr_frontsector->soundorg.y); + } + else #endif cullHeight = centerHeight = *rover->topheight; From ce793dfe282c748ca53dd2d5dbb4a8af7c7f1d25 Mon Sep 17 00:00:00 2001 From: RedEnchilada Date: Sun, 21 Feb 2016 22:32:38 -0600 Subject: [PATCH 168/467] Fix vissprite-related crashing in OGL --- 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 ddab53a04..d62683206 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5039,7 +5039,7 @@ static void HWR_ProjectSprite(mobj_t *thing) tz = (tr_x * gr_viewcos) + (tr_y * gr_viewsin); // thing is behind view plane? - if (tz < ZCLIP_PLANE && md2_models[thing->sprite].notfound == true) //Yellow: Only MD2's dont disappear + if (tz < ZCLIP_PLANE && (!cv_grmd2.value || md2_models[thing->sprite].notfound == true)) //Yellow: Only MD2's dont disappear return; tx = (tr_x * gr_viewsin) - (tr_y * gr_viewcos); From bcd05b1c6328419c8b90278729f8b649494a40f0 Mon Sep 17 00:00:00 2001 From: RedEnchilada Date: Sun, 21 Feb 2016 23:02:09 -0600 Subject: [PATCH 169/467] Also fixed it for MD2s --- src/hardware/hw_main.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index d62683206..529c2603c 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4520,11 +4520,10 @@ static void HWR_SortVisSprites(void) gr_vsprsortedhead.next = gr_vsprsortedhead.prev = &gr_vsprsortedhead; for (i = 0; i < gr_visspritecount; i++) { - bestdist = ZCLIP_PLANE-1; - bestdispoffset = INT32_MAX; + best = NULL; for (ds = unsorted.next; ds != &unsorted; ds = ds->next) { - if (ds->tz > bestdist) + if (!best || ds->tz > bestdist) { bestdist = ds->tz; bestdispoffset = ds->dispoffset; From b258b9b5035252dfbef8f2b7b79ddfdbdf9885cd Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Mon, 22 Feb 2016 01:33:10 -0800 Subject: [PATCH 170/467] remove cpuaffinity code from SDL still exists in DD (while it exists) but no longer saves. No reason whatsoever for affinity to be settable by the game itself. --- src/sdl/i_system.c | 53 ++------------------------------------------- src/win32/win_sys.c | 2 +- 2 files changed, 3 insertions(+), 52 deletions(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index da4111538..f239dd036 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -45,9 +45,6 @@ typedef DWORD (WINAPI *p_timeGetTime) (void); typedef UINT (WINAPI *p_timeEndPeriod) (UINT); typedef HANDLE (WINAPI *p_OpenFileMappingA) (DWORD, BOOL, LPCSTR); typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T); -typedef HANDLE (WINAPI *p_GetCurrentProcess) (VOID); -typedef BOOL (WINAPI *p_GetProcessAffinityMask) (HANDLE, PDWORD_PTR, PDWORD_PTR); -typedef BOOL (WINAPI *p_SetProcessAffinityMask) (HANDLE, DWORD_PTR); #endif #endif #include @@ -3070,52 +3067,6 @@ const CPUInfoFlags *I_CPUInfo(void) #endif } -#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) -static void CPUAffinity_OnChange(void); -static consvar_t cv_cpuaffinity = {"cpuaffinity", "-1", CV_SAVE | CV_CALL, NULL, CPUAffinity_OnChange, 0, NULL, NULL, 0, 0, NULL}; - -static p_GetCurrentProcess pfnGetCurrentProcess = NULL; -static p_GetProcessAffinityMask pfnGetProcessAffinityMask = NULL; -static p_SetProcessAffinityMask pfnSetProcessAffinityMask = NULL; - -static inline VOID GetAffinityFuncs(VOID) -{ - HMODULE h = GetModuleHandleA("kernel32.dll"); - pfnGetCurrentProcess = (p_GetCurrentProcess)GetProcAddress(h, "GetCurrentProcess"); - pfnGetProcessAffinityMask = (p_GetProcessAffinityMask)GetProcAddress(h, "GetProcessAffinityMask"); - pfnSetProcessAffinityMask = (p_SetProcessAffinityMask)GetProcAddress(h, "SetProcessAffinityMask"); -} - -static void CPUAffinity_OnChange(void) -{ - DWORD_PTR dwProcMask, dwSysMask; - HANDLE selfpid; - - if (!pfnGetCurrentProcess || !pfnGetProcessAffinityMask || !pfnSetProcessAffinityMask) - return; - else - selfpid = pfnGetCurrentProcess(); - - pfnGetProcessAffinityMask(selfpid, &dwProcMask, &dwSysMask); - - /* If resulting mask is zero, don't change anything and fall back to - * actual mask. - */ - if(dwSysMask & cv_cpuaffinity.value) - { - pfnSetProcessAffinityMask(selfpid, dwSysMask & cv_cpuaffinity.value); - CV_StealthSetValue(&cv_cpuaffinity, (INT32)(dwSysMask & cv_cpuaffinity.value)); - } - else - CV_StealthSetValue(&cv_cpuaffinity, (INT32)dwProcMask); -} -#endif - -void I_RegisterSysCommands(void) -{ -#if (defined (_WIN32) && !defined (_WIN32_WCE)) && !defined (_XBOX) - GetAffinityFuncs(); - CV_RegisterVar(&cv_cpuaffinity); -#endif -} +// note CPUAFFINITY code used to reside here +void I_RegisterSysCommands(void) {} #endif diff --git a/src/win32/win_sys.c b/src/win32/win_sys.c index efb0be463..2babb57b9 100644 --- a/src/win32/win_sys.c +++ b/src/win32/win_sys.c @@ -3656,7 +3656,7 @@ const CPUInfoFlags *I_CPUInfo(void) } static void CPUAffinity_OnChange(void); -static consvar_t cv_cpuaffinity = {"cpuaffinity", "1", CV_SAVE | CV_CALL, NULL, CPUAffinity_OnChange, 0, NULL, NULL, 0, 0, NULL}; +static consvar_t cv_cpuaffinity = {"cpuaffinity", "-1", CV_CALL, NULL, CPUAffinity_OnChange, 0, NULL, NULL, 0, 0, NULL}; typedef HANDLE (WINAPI *p_GetCurrentProcess) (VOID); static p_GetCurrentProcess pfnGetCurrentProcess = NULL; From 6dda71bef7d99c9a5fe6184b739c9f79788733a4 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Mon, 22 Feb 2016 23:05:36 -0800 Subject: [PATCH 171/467] I guess this is becoming the "try to make SDL_mixer work" branch Move InitSubSystem calls into proper places, don't use AUDIO_S16LSB (bad according to SDL_mixer docs) Add error checking --- src/sdl/i_video.c | 16 +++------------- src/sdl/mixer_sound.c | 27 ++++++++++++++++++++++++--- src/sdl/sdl_sound.c | 10 ++++++++++ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index dbb97f093..963310a26 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1701,21 +1701,11 @@ void I_StartupGraphics(void) keyboard_started = true; #if !defined(HAVE_TTF) -#ifdef _WIN32 // Initialize Audio as well, otherwise Win32's DirectX can not use audio - if (SDL_InitSubSystem(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0) -#else //SDL_OpenAudio will do SDL_InitSubSystem(SDL_INIT_AUDIO) + // Previously audio was init here for questionable reasons? if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) -#endif { -#ifdef _WIN32 - if (SDL_WasInit(SDL_INIT_AUDIO)==0) - CONS_Printf(M_GetText("Couldn't initialize SDL's Audio System with Video System: %s\n"), SDL_GetError()); - if (SDL_WasInit(SDL_INIT_VIDEO)==0) -#endif - { - CONS_Printf(M_GetText("Couldn't initialize SDL's Video System: %s\n"), SDL_GetError()); - return; - } + CONS_Printf(M_GetText("Couldn't initialize SDL's Video System: %s\n"), SDL_GetError()); + return; } #endif { diff --git a/src/sdl/mixer_sound.c b/src/sdl/mixer_sound.c index 71969209c..50e501394 100644 --- a/src/sdl/mixer_sound.c +++ b/src/sdl/mixer_sound.c @@ -77,7 +77,16 @@ static INT32 current_track; void I_StartupSound(void) { I_Assert(!sound_started); - sound_started = true; + + // EE inits audio first so we're following along. + if (SDL_WasInit(SDL_INIT_AUDIO) == SDL_INIT_AUDIO) + CONS_Printf("SDL Audio already started\n"); + else if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) + { + CONS_Alert(CONS_ERROR, "Error initializing SDL Audio: %s\n", SDL_GetError()); + // call to start audio failed -- we do not have it + return; + } midimode = false; music = NULL; @@ -86,19 +95,31 @@ void I_StartupSound(void) #if SDL_MIXER_VERSION_ATLEAST(1,2,11) Mix_Init(MIX_INIT_FLAC|MIX_INIT_MOD|MIX_INIT_MP3|MIX_INIT_OGG); #endif - Mix_OpenAudio(44100, AUDIO_S16LSB, 2, 2048); + + if (Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 2048) < 0) + { + CONS_Alert(CONS_ERROR, "Error starting SDL_Mixer: %s\n", Mix_GetError()); + // call to start audio failed -- we do not have it + return; + } + + sound_started = true; Mix_AllocateChannels(256); } void I_ShutdownSound(void) { - I_Assert(sound_started); + if (!sound_started) + return; // not an error condition sound_started = false; Mix_CloseAudio(); #if SDL_MIXER_VERSION_ATLEAST(1,2,11) Mix_Quit(); #endif + + SDL_QuitSubSystem(SDL_INIT_AUDIO); + #ifdef HAVE_LIBGME if (gme) gme_delete(gme); diff --git a/src/sdl/sdl_sound.c b/src/sdl/sdl_sound.c index 5d6c007b5..0face92e2 100644 --- a/src/sdl/sdl_sound.c +++ b/src/sdl/sdl_sound.c @@ -1213,6 +1213,16 @@ void I_StartupSound(void) // Configure sound device CONS_Printf("I_StartupSound:\n"); + // EE inits audio first so we're following along. + if (SDL_WasInit(SDL_INIT_AUDIO) == SDL_INIT_AUDIO) + CONS_Printf("SDL Audio already started\n"); + else if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) + { + CONS_Alert(CONS_ERROR, "Error initializing SDL Audio: %s\n", SDL_GetError()); + // call to start audio failed -- we do not have it + return; + } + // Open the audio device if (M_CheckParm ("-freq") && M_IsNextParm()) { From 3802ec33de3738426a48f751205240314de36a51 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Tue, 23 Feb 2016 22:53:24 +0000 Subject: [PATCH 172/467] Fixed how dying players who were standing on slopes just jump off to the side --- src/p_map.c | 29 +++++++++++++++++------------ src/p_mobj.c | 14 ++++++++++++-- src/p_slopes.c | 3 +++ 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 7ff913a86..dff5c5bef 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2051,21 +2051,26 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) thing->ceilingz = tmceilingz; #ifdef ESLOPE - // Assign thing's standingslope if needed - if (thing->z <= tmfloorz && !(thing->eflags & MFE_VERTICALFLIP)) { - if (!startingonground && tmfloorslope) - P_HandleSlopeLanding(thing, tmfloorslope); + if (!(thing->flags & MF_NOCLIPHEIGHT)) + { + // Assign thing's standingslope if needed + if (thing->z <= tmfloorz && !(thing->eflags & MFE_VERTICALFLIP)) { + if (!startingonground && tmfloorslope) + P_HandleSlopeLanding(thing, tmfloorslope); - if (thing->momz <= 0) - thing->standingslope = tmfloorslope; - } - else if (thing->z+thing->height >= tmceilingz && (thing->eflags & MFE_VERTICALFLIP)) { - if (!startingonground && tmceilingslope) - P_HandleSlopeLanding(thing, tmceilingslope); + if (thing->momz <= 0) + thing->standingslope = tmfloorslope; + } + else if (thing->z+thing->height >= tmceilingz && (thing->eflags & MFE_VERTICALFLIP)) { + if (!startingonground && tmceilingslope) + P_HandleSlopeLanding(thing, tmceilingslope); - if (thing->momz >= 0) - thing->standingslope = tmceilingslope; + if (thing->momz >= 0) + thing->standingslope = tmceilingslope; + } } + else // don't set standingslope if you're not going to clip against it + thing->standingslope = NULL; #endif thing->x = x; diff --git a/src/p_mobj.c b/src/p_mobj.c index 65b5f9a09..155d985e9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2077,8 +2077,13 @@ static boolean P_ZMovement(mobj_t *mo) I_Assert(!P_MobjWasRemoved(mo)); #ifdef ESLOPE - if (mo->standingslope && !P_IsObjectOnGround(mo)) + if (mo->standingslope) + { + if (mo->flags & MF_NOCLIPHEIGHT) + mo->standingslope = NULL; + else if (!P_IsObjectOnGround(mo)) P_SlopeLaunch(mo); + } #endif // Intercept the stupid 'fall through 3dfloors' bug @@ -2561,8 +2566,13 @@ static void P_PlayerZMovement(mobj_t *mo) return; #ifdef ESLOPE - if (mo->standingslope && !P_IsObjectOnGround(mo)) + if (mo->standingslope) + { + if (mo->flags & MF_NOCLIPHEIGHT) + mo->standingslope = NULL; + else if (!P_IsObjectOnGround(mo)) P_SlopeLaunch(mo); + } #endif // clip movement diff --git a/src/p_slopes.c b/src/p_slopes.c index 2d55cf194..797fe46b4 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -1099,6 +1099,9 @@ void P_ButteredSlope(mobj_t *mo) if (!mo->standingslope) return; + if (mo->flags & (MF_NOCLIPHEIGHT|MF_NOGRAVITY)) + return; // don't slide down slopes if you can't touch them or you're not affected by gravity + if (mo->player) { if (abs(mo->standingslope->zdelta) < FRACUNIT/4 && !(mo->player->pflags & PF_SPINNING)) return; // Don't slide on non-steep slopes unless spinning From f10279d61bf2a79bcd031ab1f625368cd5bf6ebc Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 25 Feb 2016 14:35:05 -0800 Subject: [PATCH 173/467] Very minor performance improvement. --- src/p_mobj.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 323e5ce95..d2454f267 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -92,9 +92,7 @@ FUNCINLINE static ATTRINLINE void P_CycleStateAnimation(mobj_t *mobj) // compare the current sprite frame to the one we started from // if more than var1 away from it, swap back to the original // else just advance by one - if ((mobj->frame & FF_FRAMEMASK) - (mobj->state->frame & FF_FRAMEMASK) < (UINT32)mobj->state->var1) - ++mobj->frame; - else + if (((++mobj->frame) & FF_FRAMEMASK) - (mobj->state->frame & FF_FRAMEMASK) > (UINT32)mobj->state->var1) mobj->frame = (mobj->state->frame & FF_FRAMEMASK) | (mobj->frame & ~FF_FRAMEMASK); } From 8a369d969bc90e4d81adfeb27742f757050f786a Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 25 Feb 2016 18:28:48 -0500 Subject: [PATCH 174/467] whitespace clean --- CMakeLists.txt | 14 +++++++------- cmake/Modules/FindSDL2.cmake | 2 +- cmake/Modules/FindSDL2_main.cmake | 2 +- cmake/Modules/FindSDL2_mixer.cmake | 2 +- cmake/Modules/LibFindMacros.cmake | 8 ++++---- src/sdl/CMakeLists.txt | 2 +- src/sdl/i_system.c | 7 +++---- 7 files changed, 18 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59557ef42..a735be000 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,13 +23,13 @@ endfunction() # Macro to add OSX framework macro(add_framework fwname appname) find_library(FRAMEWORK_${fwname} - NAMES ${fwname} - PATHS ${CMAKE_OSX_SYSROOT}/System/Library - ${CMAKE_OSX_SYSROOT}/Library - /System/Library - /Library - PATH_SUFFIXES Frameworks - NO_DEFAULT_PATH) + NAMES ${fwname} + PATHS ${CMAKE_OSX_SYSROOT}/System/Library + ${CMAKE_OSX_SYSROOT}/Library + /System/Library + /Library + ATH_SUFFIXES Frameworks + NO_DEFAULT_PATH) if( ${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND) MESSAGE(ERROR ": Framework ${fwname} not found") else() diff --git a/cmake/Modules/FindSDL2.cmake b/cmake/Modules/FindSDL2.cmake index faa556a88..ec9f38359 100644 --- a/cmake/Modules/FindSDL2.cmake +++ b/cmake/Modules/FindSDL2.cmake @@ -1,6 +1,6 @@ # Find SDL2 # Once done, this will define -# +# # SDL2_FOUND - system has SDL2 # SDL2_INCLUDE_DIRS - SDL2 include directories # SDL2_LIBRARIES - link libraries diff --git a/cmake/Modules/FindSDL2_main.cmake b/cmake/Modules/FindSDL2_main.cmake index 280e51e2e..d4cbdeb11 100644 --- a/cmake/Modules/FindSDL2_main.cmake +++ b/cmake/Modules/FindSDL2_main.cmake @@ -1,6 +1,6 @@ # Find SDL2 # Once done, this will define -# +# # SDL2_MAIN_FOUND - system has SDL2 # SDL2_MAIN_INCLUDE_DIRS - SDL2 include directories # SDL2_MAIN_LIBRARIES - link libraries diff --git a/cmake/Modules/FindSDL2_mixer.cmake b/cmake/Modules/FindSDL2_mixer.cmake index 59b4823ed..9af3e26dd 100644 --- a/cmake/Modules/FindSDL2_mixer.cmake +++ b/cmake/Modules/FindSDL2_mixer.cmake @@ -1,6 +1,6 @@ # Find SDL2 # Once done, this will define -# +# # SDL2_MIXER_FOUND - system has SDL2 # SDL2_MIXER_INCLUDE_DIRS - SDL2 include directories # SDL2_MIXER_LIBRARIES - link libraries diff --git a/cmake/Modules/LibFindMacros.cmake b/cmake/Modules/LibFindMacros.cmake index f6800aa7b..81fef7d8e 100644 --- a/cmake/Modules/LibFindMacros.cmake +++ b/cmake/Modules/LibFindMacros.cmake @@ -123,7 +123,7 @@ function (libfind_process PREFIX) set(includeopts ${${PREFIX}_PROCESS_INCLUDES}) set(libraryopts ${${PREFIX}_PROCESS_LIBS}) - # Process deps to add to + # Process deps to add to foreach (i ${PREFIX} ${${PREFIX}_DEPENDENCIES}) if (DEFINED ${i}_INCLUDE_OPTS OR DEFINED ${i}_LIBRARY_OPTS) # The package seems to export option lists that we can use, woohoo! @@ -146,11 +146,11 @@ function (libfind_process PREFIX) endif() endif() endforeach() - + if (includeopts) list(REMOVE_DUPLICATES includeopts) endif() - + if (libraryopts) list(REMOVE_DUPLICATES libraryopts) endif() @@ -215,7 +215,7 @@ function (libfind_process PREFIX) set (${PREFIX}_LIBRARIES ${libs} PARENT_SCOPE) set (${PREFIX}_FOUND TRUE PARENT_SCOPE) endif() - return() + return() endif() # Format messages for debug info and the type of error diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index eb832797e..b3d734521 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -57,7 +57,7 @@ if(${SDL2_FOUND}) ${SRB2_SDL2_SOURCES} ${SRB2_SDL2_HEADERS} ) - + source_group("Main" FILES ${SRB2_CORE_SOURCES} ${SRB2_CORE_HEADERS}) source_group("Renderer" FILES ${SRB2_CORE_RENDER_SOURCES}) source_group("Game" FILES ${SRB2_CORE_GAME_SOURCES}) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index f239dd036..2e9ebbede 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2756,8 +2756,8 @@ static const char *locateWad(void) if (isWadPathOk(returnWadPath)) return NULL; #endif - - + + #ifdef CMAKECONFIG #ifndef NDEBUG I_OutputMsg(","CMAKE_ASSETS_DIR); @@ -2768,7 +2768,7 @@ static const char *locateWad(void) } #endif #endif - + #ifdef __APPLE__ OSX_GetResourcesPath(returnWadPath); I_OutputMsg(",%s", returnWadPath); @@ -2776,7 +2776,6 @@ static const char *locateWad(void) { return returnWadPath; } - #endif // examine default dirs From 5c9aaf2fe4ae3d93dfe50028634e0b70d4ac598f Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Thu, 25 Feb 2016 22:28:19 -0600 Subject: [PATCH 175/467] Move hook into G_SpawnPlayer --- src/g_game.c | 6 ++++++ src/lua_hook.h | 2 +- src/p_mobj.c | 5 ----- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 72cfe4a57..3329e8eff 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2328,6 +2328,12 @@ void G_SpawnPlayer(INT32 playernum, boolean starpost) } } P_MovePlayerToSpawn(playernum, spawnpoint); + +#ifdef HAVE_BLUA + player_t *p = &players[playernum]; + LUAh_PlayerSpawn(p); // Lua hook for player spawning :) +#endif + } mapthing_t *G_FindCTFStart(INT32 playernum) diff --git a/src/lua_hook.h b/src/lua_hook.h index f3af7f304..4eb083780 100644 --- a/src/lua_hook.h +++ b/src/lua_hook.h @@ -76,6 +76,6 @@ boolean LUAh_BotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd); // Hook for B_B boolean LUAh_LinedefExecute(line_t *line, mobj_t *mo, sector_t *sector); // Hook for linedef executors boolean LUAh_PlayerMsg(int source, int target, int flags, char *msg); // Hook for chat messages boolean LUAh_HurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source); // Hook for hurt messages -#define LUAh_PlayerSpawn(player) LUAh_PlayerHook(player, hook_PlayerSpawn) // Hook for P_SpawnPlayer +#define LUAh_PlayerSpawn(player) LUAh_PlayerHook(player, hook_PlayerSpawn) // Hook for G_SpawnPlayer #endif diff --git a/src/p_mobj.c b/src/p_mobj.c index 367a3a7d0..25ae8815a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8294,11 +8294,6 @@ void P_SpawnPlayer(INT32 playernum) // Spawn with a pity shield if necessary. P_DoPityCheck(p); - -#ifdef HAVE_BLUA - LUAh_PlayerSpawn(p); // Lua hook for player spawning :) -#endif - } void P_AfterPlayerSpawn(INT32 playernum) From 8f0abb267edd493b58e875a08083af9c36ea3870 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Thu, 25 Feb 2016 22:47:52 -0600 Subject: [PATCH 176/467] Don't mix declarations and code --- src/g_game.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 3329e8eff..219b276ec 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2330,8 +2330,7 @@ void G_SpawnPlayer(INT32 playernum, boolean starpost) P_MovePlayerToSpawn(playernum, spawnpoint); #ifdef HAVE_BLUA - player_t *p = &players[playernum]; - LUAh_PlayerSpawn(p); // Lua hook for player spawning :) + LUAh_PlayerSpawn(&players[playernum]); // Lua hook for player spawning :) #endif } From 9b55244dc32400a38d2fbbf33aaf7f8ac9446436 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 26 Feb 2016 01:39:08 -0500 Subject: [PATCH 177/467] travis: use SRB2-v2114-assets.7z --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c6a3ce799..de3085828 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,8 +24,8 @@ addons: before_script: - mkdir $HOME/srb2_cache - - wget http://rosenthalcastle.org/srb2/SRB2-v2114-Installer.exe -c -O $HOME/srb2_cache/SRB2-v2114-Installer.exe - - 7z x $HOME/srb2_cache/SRB2-v2114-Installer.exe -oassets + - wget http://rosenthalcastle.org/srb2/SRB2-v2114-assets.7z -c -O $HOME/srb2_cache/SRB2-v2114-assets.7z + - 7z x $HOME/srb2_cache/SRB2-v2114-assets.7z -oassets - mkdir build - cd build - cmake .. From 41f8b25c36037270229343316d1ed26edd19c3c6 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 26 Feb 2016 01:48:11 -0500 Subject: [PATCH 178/467] travis: add verbose and server-response to wget --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index de3085828..db44edb5d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ compiler: cache: directories: - - $HOME/srb2_cache + - $HOME/srb2_cache addons: apt: @@ -24,7 +24,7 @@ addons: before_script: - mkdir $HOME/srb2_cache - - wget http://rosenthalcastle.org/srb2/SRB2-v2114-assets.7z -c -O $HOME/srb2_cache/SRB2-v2114-assets.7z + - wget --verbose --server-response -c http://rosenthalcastle.org/srb2/SRB2-v2114-assets.7z -O $HOME/srb2_cache/SRB2-v2114-assets.7z - 7z x $HOME/srb2_cache/SRB2-v2114-assets.7z -oassets - mkdir build - cd build From f5ba192f0b7c3501950e81d3d29958610ad28cf2 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 25 Feb 2016 23:31:48 -0800 Subject: [PATCH 179/467] remove extraneous va() calls --- src/dehacked.c | 2 +- src/p_setup.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 6f07ce8e0..b022d51e7 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1185,7 +1185,7 @@ static void readlevelheader(MYFILE *f, INT32 num) deh_warning("Level header %d: musicslot out of range (0 - 1035)\n", num); else // it's just a number { - snprintf(mapheaderinfo[num-1]->musname, 7, va("%sM", G_BuildMapName(i))); + snprintf(mapheaderinfo[num-1]->musname, 7, "%sM", G_BuildMapName(i)); mapheaderinfo[num-1]->musname[6] = 0; } } diff --git a/src/p_setup.c b/src/p_setup.c index 000a3a65c..00bb4a634 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -181,7 +181,7 @@ static void P_ClearSingleMapHeaderInfo(INT16 i) DEH_WriteUndoline("NEXTLEVEL", va("%d", mapheaderinfo[num]->nextlevel), UNDO_NONE); mapheaderinfo[num]->nextlevel = (INT16)(i + 1); DEH_WriteUndoline("MUSIC", mapheaderinfo[num]->musname, UNDO_NONE); - snprintf(mapheaderinfo[num]->musname, 7, va("%sM", G_BuildMapName(i))); + snprintf(mapheaderinfo[num]->musname, 7, "%sM", G_BuildMapName(i)); mapheaderinfo[num]->musname[6] = 0; DEH_WriteUndoline("MUSICTRACK", va("%d", mapheaderinfo[num]->mustrack), UNDO_NONE); mapheaderinfo[num]->mustrack = 0; From c7ba1d15321531fe2d5ba01e6854760305e98f63 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Fri, 26 Feb 2016 18:11:12 +0000 Subject: [PATCH 180/467] Make sure target sector's lightlist is reset whenever FOF flags are changed. This fixes how removing certain flags (such as FF_EXISTS) from FOFs can cause HOMs on walls bordering their target sectors. Also fixes how the force-FOF-to-vanish linedef special can leave behind the FOF's shadow --- src/lua_maplib.c | 6 +++++- src/p_spec.c | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 38920c223..16d05dacd 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -1111,9 +1111,13 @@ static int ffloor_set(lua_State *L) case ffloor_bottompic: *ffloor->bottompic = P_AddLevelFlatRuntime(luaL_checkstring(L, 3)); break; - case ffloor_flags: + case ffloor_flags: { + ffloortype_e oldflags = ffloor->flags; // store FOF's old flags ffloor->flags = luaL_checkinteger(L, 3); + if (ffloor->flags != oldflags) + ffloor->target->moved = true; // reset target sector's lightlist break; + } case ffloor_alpha: ffloor->alpha = (INT32)luaL_checkinteger(L, 3); break; diff --git a/src/p_spec.c b/src/p_spec.c index 81994d46c..2c471fa9e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3039,6 +3039,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) INT16 foftag = (INT16)(sides[line->sidenum[0]].rowoffset>>FRACBITS); sector_t *sec; // Sector that the FOF is visible (or not visible) in ffloor_t *rover; // FOF to vanish/un-vanish + ffloortype_e oldflags; // store FOF's old flags for (secnum = -1; (secnum = P_FindSectorFromTag(sectag, secnum)) >= 0 ;) { @@ -3062,11 +3063,17 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) return; } + oldflags = rover->flags; + // Abracadabra! if (line->flags & ML_NOCLIMB) rover->flags |= FF_EXISTS; else rover->flags &= ~FF_EXISTS; + + // if flags changed, reset sector's light list + if (rover->flags != oldflags) + sec->moved = true; } } break; From 753ee4e42a9e3ca4383d190dd36c89c37a4c1e6e Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Sat, 27 Feb 2016 14:13:49 -0600 Subject: [PATCH 181/467] Update names in credits Add me and toaster's names, change Shane's by request, and fix Randi Heit's name --- src/f_finale.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 507616f3c..c89c39cf3 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -977,6 +977,7 @@ static const char *credits[] = { "\"Monster\" Iestyn Jealous", "Ronald \"Furyhunter\" Kinard", // The SDL2 port "John \"JTE\" Muniz", + "Ehab \"Wolfy\" Saeed", "\"SSNTails\"", "Matthew \"Inuyasha\" Walsh", "", @@ -985,6 +986,7 @@ static const char *credits[] = { "\"chi.miru\"", // Red's secret weapon, the REAL reason slopes exist (also helped port drawing code from ZDoom) "Andrew \"orospakr\" Clunis", "Gregor \"Oogaland\" Dick", + "Vivian \"toaster\" Grannell", "Julio \"Chaos Zero 64\" Guir", "\"Kalaron\"", // Coded some of Sryder13's collection of OpenGL fixes, especially fog "Matthew \"Shuffle\" Marsalko", @@ -1001,6 +1003,7 @@ static const char *credits[] = { "Desmond \"Blade\" DesJardins", "Sherman \"CoatRack\" DesJardins", "Andrew \"Senku Niola\" Moran", + "Vivian \"toaster\" Grannell", "David \"Instant Sonic\" Spencer Jr.", "\"SSNTails\"", "", @@ -1020,7 +1023,7 @@ static const char *credits[] = { "\"Monster\" Iestyn Jealous", "Jarel \"Arrow\" Jones", "Stefan \"Stuf\" Rimalia", - "Shane Strife", + "Shane Mychal Sexton", "\"Spazzo\"", "David \"Big Wave Dave\" Spencer Sr.", "David \"Instant Sonic\" Spencer Jr.", @@ -1033,6 +1036,7 @@ static const char *credits[] = { "Sherman \"CoatRack\" DesJardins", "Ben \"Mystic\" Geyer", "Nathan \"Jazz\" Giroux", + "Vivian \"toaster\" Grannell", "Dan \"Blitzzo\" Hagerstrand", "Kepa \"Nev3r\" Iceta", "Thomas \"Shadow Hog\" Igoe", @@ -1069,7 +1073,7 @@ static const char *credits[] = { "iD Software", "Alex \"MistaED\" Fuller", "FreeDoom Project", // Used some of the mancubus and rocket launcher sprites for Brak - "Randy Heit ()", // For his MSPaint sprite that we nicked + "Randi Heit ()", // For their MSPaint sprite that we nicked "", "\1Produced By", "Sonic Team Junior", From c3166e40b0010fa9c6748875c8e1bfc9551cbc2f Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Sat, 27 Feb 2016 14:27:14 -0600 Subject: [PATCH 182/467] Update names in credits Same as the commit in internal, minus toaster's name (by request, of course.) --- src/f_finale.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 507616f3c..2a1e5cce2 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -977,6 +977,7 @@ static const char *credits[] = { "\"Monster\" Iestyn Jealous", "Ronald \"Furyhunter\" Kinard", // The SDL2 port "John \"JTE\" Muniz", + "Ehab \"Wolfy\" Saeed", "\"SSNTails\"", "Matthew \"Inuyasha\" Walsh", "", @@ -1020,7 +1021,7 @@ static const char *credits[] = { "\"Monster\" Iestyn Jealous", "Jarel \"Arrow\" Jones", "Stefan \"Stuf\" Rimalia", - "Shane Strife", + "Shane Mychal Sexton", "\"Spazzo\"", "David \"Big Wave Dave\" Spencer Sr.", "David \"Instant Sonic\" Spencer Jr.", @@ -1069,7 +1070,7 @@ static const char *credits[] = { "iD Software", "Alex \"MistaED\" Fuller", "FreeDoom Project", // Used some of the mancubus and rocket launcher sprites for Brak - "Randy Heit ()", // For his MSPaint sprite that we nicked + "Randi Heit ()", // For their MSPaint sprite that we nicked "", "\1Produced By", "Sonic Team Junior", From 4b447b3d0db33c92ca1e542cc6a955af3dec45ea Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 28 Feb 2016 18:30:29 +0000 Subject: [PATCH 183/467] Don't add polyobjects to a mobj's sector nodes list. This causes the player to teeter whenever they are above the polyobject's bottom, whether or not it is solid Also, a minor tweak for the teetering code itself, though it looks a right mess and probably should be redone in the future --- src/p_map.c | 6 ++++++ src/p_user.c | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 61d57dcd1..760252c8b 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3712,6 +3712,9 @@ static inline boolean PIT_GetSectors(line_t *ld) if (P_BoxOnLineSide(tmbbox, ld) != -1) return true; + if (ld->polyobj) // line belongs to a polyobject, don't add it + return true; + // This line crosses through the object. // Collect the sector(s) from the line and add to the @@ -3744,6 +3747,9 @@ static inline boolean PIT_GetPrecipSectors(line_t *ld) if (P_BoxOnLineSide(preciptmbbox, ld) != -1) return true; + if (ld->polyobj) // line belongs to a polyobject, don't add it + return true; + // This line crosses through the object. // Collect the sector(s) from the line and add to the diff --git a/src/p_user.c b/src/p_user.c index da65b7cb4..b3ba5f61f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3087,7 +3087,7 @@ static void P_DoTeeter(player_t *player) } if (polybottom > player->mo->z + player->mo->height + tiptop - || (polybottom < player->mo->z + || (polytop < player->mo->z && player->mo->z + player->mo->height < player->mo->ceilingz - tiptop)) teeter = true; else @@ -3105,7 +3105,7 @@ static void P_DoTeeter(player_t *player) } if (polytop < player->mo->z - tiptop - || (polytop > player->mo->z + player->mo->height + || (polybottom > player->mo->z + player->mo->height && player->mo->z > player->mo->floorz + tiptop)) teeter = true; else From fdb4ac5c2e7b7b0aed0cc8abf9fb5713a9d24595 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sun, 28 Feb 2016 18:19:46 -0800 Subject: [PATCH 184/467] Super color code cleaning, speed 50%, nothing special --- src/g_game.c | 6 ++---- src/p_user.c | 23 +++++------------------ 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index e2ed1e792..f27da994b 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4336,10 +4336,8 @@ void G_GhostTicker(void) switch(g->color) { case GHC_SUPER: // Super Sonic (P_DoSuperStuff) - if (leveltime % 9 < 5) - g->mo->color = SKINCOLOR_SUPER1 + leveltime % 9; - else - g->mo->color = SKINCOLOR_SUPER1 + 9 - leveltime % 9; + g->mo->color = SKINCOLOR_SUPER1; + g->mo->color += abs( ( ( leveltime >> 1 ) % 9) - 4); break; case GHC_INVINCIBLE: // Mario invincibility (P_CheckInvincibilityTimer) g->mo->color = (UINT8)(leveltime % MAXSKINCOLORS); diff --git a/src/p_user.c b/src/p_user.c index 530a6068e..96907fe51 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3437,27 +3437,14 @@ static void P_DoSuperStuff(player_t *player) player->mo->health--; } + // future todo: a skin option for this, and possibly more colors switch (player->skin) { - case 1: // Golden orange supertails. - if (leveltime % 9 < 5) - player->mo->color = SKINCOLOR_TSUPER1 + leveltime % 9; - else - player->mo->color = SKINCOLOR_TSUPER1 + 9 - leveltime % 9; - break; - case 2: // Pink superknux. - if (leveltime % 9 < 5) - player->mo->color = SKINCOLOR_KSUPER1 + leveltime % 9; - else - player->mo->color = SKINCOLOR_KSUPER1 + 9 - leveltime % 9; - break; - default: // Yousa yellow now! - if (leveltime % 9 < 5) - player->mo->color = SKINCOLOR_SUPER1 + leveltime % 9; - else - player->mo->color = SKINCOLOR_SUPER1 + 9 - leveltime % 9; - break; + case 1: /* Tails */ player->mo->color = SKINCOLOR_TSUPER1; break; + case 2: /* Knux */ player->mo->color = SKINCOLOR_KSUPER1; break; + default: /* everyone */ player->mo->color = SKINCOLOR_SUPER1; break; } + player->mo->color += abs( ( ( leveltime >> 1 ) % 9) - 4); if ((cmd->forwardmove != 0 || cmd->sidemove != 0 || player->pflags & (PF_CARRIED|PF_ROPEHANG|PF_ITEMHANG|PF_MACESPIN)) && !(leveltime % TICRATE) && (player->mo->momx || player->mo->momy)) From e2b3adc04f73663659afad9a8b42b87a9778055d Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sun, 28 Feb 2016 18:21:37 -0800 Subject: [PATCH 185/467] Randy Heit -> Randi Heit --- src/f_finale.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/f_finale.c b/src/f_finale.c index 466e208a5..9c3da5a68 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1068,7 +1068,7 @@ static const char *credits[] = { "iD Software", "Alex \"MistaED\" Fuller", "FreeDoom Project", // Used some of the mancubus and rocket launcher sprites for Brak - "Randy Heit ()", // For his MSPaint sprite that we nicked + "Randi Heit ()", // For their MSPaint sprite that we nicked "", "\1Produced By", "Sonic Team Junior", From 3a045c4cc94460a059048c5d6acf3d98d844bb9e Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sun, 28 Feb 2016 23:30:52 -0800 Subject: [PATCH 186/467] Fix the green text after reduced pal changes --- src/console.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/console.c b/src/console.c index a6919c0f0..a07aeea39 100644 --- a/src/console.c +++ b/src/console.c @@ -310,7 +310,7 @@ static void CON_SetupBackColormap(void) yellowmap[9] = (UINT8)66; purplemap[3] = (UINT8)184; purplemap[9] = (UINT8)186; - lgreenmap[3] = (UINT8)102; + lgreenmap[3] = (UINT8)98; lgreenmap[9] = (UINT8)106; bluemap[3] = (UINT8)147; bluemap[9] = (UINT8)158; From ffa9a4e056a7ad2117eca8155285931f92f13cd4 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Fri, 2 Oct 2015 13:45:51 +0100 Subject: [PATCH 187/467] Removed the removal of SF_SUPER from skins other than Sonic # Conflicts: # src/r_things.c --- src/r_things.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index 2a3f8e771..bdc6c4760 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2698,9 +2698,6 @@ next_token: } free(buf2); - // Not in vanilla, you don't. - skin->flags &= ~SF_SUPER; - lump++; // if no sprite defined use spirte just after this one if (skin->sprite[0] == '\0') { From fc35c8557e97e64c17718f5ceee7d8f0190b9246 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sun, 28 Feb 2016 18:19:46 -0800 Subject: [PATCH 188/467] Super color code cleaning, speed 50%, nothing special --- src/g_game.c | 6 ++---- src/p_user.c | 23 +++++------------------ 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 72cfe4a57..dda8793bb 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4326,10 +4326,8 @@ void G_GhostTicker(void) switch(g->color) { case GHC_SUPER: // Super Sonic (P_DoSuperStuff) - if (leveltime % 9 < 5) - g->mo->color = SKINCOLOR_SUPER1 + leveltime % 9; - else - g->mo->color = SKINCOLOR_SUPER1 + 9 - leveltime % 9; + g->mo->color = SKINCOLOR_SUPER1; + g->mo->color += abs( ( ( leveltime >> 1 ) % 9) - 4); break; case GHC_INVINCIBLE: // Mario invincibility (P_CheckInvincibilityTimer) g->mo->color = (UINT8)(leveltime % MAXSKINCOLORS); diff --git a/src/p_user.c b/src/p_user.c index da65b7cb4..89b530c35 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3442,27 +3442,14 @@ static void P_DoSuperStuff(player_t *player) player->mo->health--; } + // future todo: a skin option for this, and possibly more colors switch (player->skin) { - case 1: // Golden orange supertails. - if (leveltime % 9 < 5) - player->mo->color = SKINCOLOR_TSUPER1 + leveltime % 9; - else - player->mo->color = SKINCOLOR_TSUPER1 + 9 - leveltime % 9; - break; - case 2: // Pink superknux. - if (leveltime % 9 < 5) - player->mo->color = SKINCOLOR_KSUPER1 + leveltime % 9; - else - player->mo->color = SKINCOLOR_KSUPER1 + 9 - leveltime % 9; - break; - default: // Yousa yellow now! - if (leveltime % 9 < 5) - player->mo->color = SKINCOLOR_SUPER1 + leveltime % 9; - else - player->mo->color = SKINCOLOR_SUPER1 + 9 - leveltime % 9; - break; + case 1: /* Tails */ player->mo->color = SKINCOLOR_TSUPER1; break; + case 2: /* Knux */ player->mo->color = SKINCOLOR_KSUPER1; break; + default: /* everyone */ player->mo->color = SKINCOLOR_SUPER1; break; } + player->mo->color += abs( ( ( leveltime >> 1 ) % 9) - 4); if ((cmd->forwardmove != 0 || cmd->sidemove != 0 || player->pflags & (PF_CARRIED|PF_ROPEHANG|PF_ITEMHANG|PF_MACESPIN)) && !(leveltime % TICRATE) && (player->mo->momx || player->mo->momy)) From 98fd5ca63b32f9060bdb3e117edc6297c544aea0 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Tue, 1 Mar 2016 19:55:13 +0000 Subject: [PATCH 189/467] Made some FOF-related seg code account for slopes, as requested by some TODOs The funny thing is you really can't see ANY change here unless you have a sloped FOF intersecting a sector floor/ceiling (and a second FOF on the other side), which has other problems anyway lol --- src/r_segs.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/r_segs.c b/src/r_segs.c index 591242693..ccf70338e 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -2121,8 +2121,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) for (r2 = frontsector->ffloors; r2; r2 = r2->next) { - if (!(r2->flags & FF_EXISTS) || !(r2->flags & FF_RENDERSIDES) - || *r2->topheight < lowcut || *r2->bottomheight > highcut) ///TODO: make these account for slopes -Red + if (!(r2->flags & FF_EXISTS) || !(r2->flags & FF_RENDERSIDES)) continue; if (r2->norender == leveltime) @@ -2154,9 +2153,13 @@ void R_StoreWallRange(INT32 start, INT32 stop) } else low2 = lowslope2 = *r2->bottomheight; + if ((high2 < lowcut && highslope2 < lowcutslope) || (low2 > highcut && lowslope2 > highcutslope)) + continue; if ((high1 > high2 && highslope1 > highslope2) || (low1 < low2 && lowslope1 < lowslope2)) continue; #else + if (*r2->topheight < lowcut || *r2->bottomheight > highcut) + continue; if (*rover->topheight > *r2->topheight || *rover->bottomheight < *r2->bottomheight) continue; #endif @@ -2201,8 +2204,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) for (r2 = backsector->ffloors; r2; r2 = r2->next) { - if (!(r2->flags & FF_EXISTS) || !(r2->flags & FF_RENDERSIDES) - || *r2->topheight < lowcut || *r2->bottomheight > highcut) ///TODO: make these account for slopes -Red + if (!(r2->flags & FF_EXISTS) || !(r2->flags & FF_RENDERSIDES)) continue; if (r2->norender == leveltime) @@ -2234,9 +2236,13 @@ void R_StoreWallRange(INT32 start, INT32 stop) } else low2 = lowslope2 = *r2->bottomheight; + if ((high2 < lowcut && highslope2 < lowcutslope) || (low2 > highcut && lowslope2 > highcutslope)) + continue; if ((high1 > high2 && highslope1 > highslope2) || (low1 < low2 && lowslope1 < lowslope2)) continue; #else + if (*r2->topheight < lowcut || *r2->bottomheight > highcut) + continue; if (*rover->topheight > *r2->topheight || *rover->bottomheight < *r2->bottomheight) continue; #endif From ab288a7d1a76f2d79ea7136024902891b7b8c328 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Tue, 1 Mar 2016 17:48:10 -0600 Subject: [PATCH 190/467] Allow Lua to read VERSION, SUBVERSION, and VERSIONSTRING constants --- src/dehacked.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dehacked.c b/src/dehacked.c index d6a1881e6..955937983 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6941,6 +6941,8 @@ struct { {"PUSHACCEL",PUSHACCEL}, {"MODID",MODID}, // I don't know, I just thought it would be cool for a wad to potentially know what mod it was loaded into. {"CODEBASE",CODEBASE}, // or what release of SRB2 this is. + {"VERSION",VERSION}, // Grab the game's version! + {"SUBVERSION",SUBVERSION}, // more precise version number // Special linedef executor tag numbers! {"LE_PINCHPHASE",LE_PINCHPHASE}, // A boss entered pinch phase (and, in most cases, is preparing their pinch phase attack!) @@ -8213,6 +8215,9 @@ static inline int lib_getenum(lua_State *L) } else if (fastcmp(word,"gravity")) { lua_pushinteger(L, gravity); return 1; + } else if (fastcmp(word,"VERSIONSTRING")) { + lua_pushstring(L, VERSIONSTRING); + return 1; } return 0; From 668cc85d7b3f828ef723289939ac134b57ce191d Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Wed, 2 Mar 2016 20:31:04 +0000 Subject: [PATCH 191/467] P_ClosestPointOnLine can now (optionally) take custom coordinates that you want to make up your line --- src/lua_baselib.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 5e2d31b10..be06982f3 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -140,14 +140,38 @@ static int lib_pAproxDistance(lua_State *L) static int lib_pClosestPointOnLine(lua_State *L) { + int n = lua_gettop(L); fixed_t x = luaL_checkfixed(L, 1); fixed_t y = luaL_checkfixed(L, 2); - line_t *line = *((line_t **)luaL_checkudata(L, 3, META_LINE)); vertex_t result; //HUDSAFE - if (!line) - return LUA_ErrInvalid(L, "line_t"); - P_ClosestPointOnLine(x, y, line, &result); + if (lua_isuserdata(L, 3)) // use a real linedef to get our points + { + line_t *line = *((line_t **)luaL_checkudata(L, 3, META_LINE)); + if (!line) + return LUA_ErrInvalid(L, "line_t"); + P_ClosestPointOnLine(x, y, line, &result); + } + else // use custom coordinates of our own! + { + vertex_t v1, v2; // fake vertexes + line_t junk; // fake linedef + + if (n < 6) + return luaL_error(L, "arguments 3 to 6 not all given (expected 4 fixed-point integers)"); + + v1.x = luaL_checkfixed(L, 3); + v1.y = luaL_checkfixed(L, 4); + v2.x = luaL_checkfixed(L, 5); + v2.y = luaL_checkfixed(L, 6); + + junk.v1 = &v1; + junk.v2 = &v2; + junk.dx = v2.x - v1.x; + junk.dy = v2.y - v1.y; + P_ClosestPointOnLine(x, y, &junk, &result); + } + lua_pushfixed(L, result.x); lua_pushfixed(L, result.y); return 2; From 7349cbdbc0c16fe1e6d572de70244bb458633654 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 3 Mar 2016 02:54:07 -0800 Subject: [PATCH 192/467] Backwards compatibility. A test WAD for all possible use cases I can think of can be found here: https://dl.dropboxusercontent.com/u/3518218/21/secret/bc_test.wad --- src/dehacked.c | 110 ++++++++++++++++++++++++++++++++++++++++------ src/doomdef.h | 4 ++ src/lua_baselib.c | 42 ++++++++++++++++++ src/s_sound.c | 22 ++++++++++ src/s_sound.h | 6 +++ 5 files changed, 171 insertions(+), 13 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index b022d51e7..3ab377065 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -65,6 +65,9 @@ static mobjtype_t get_mobjtype(const char *word); static statenum_t get_state(const char *word); static spritenum_t get_sprite(const char *word); static sfxenum_t get_sfx(const char *word); +#ifdef MUSICSLOT_COMPATIBILITY +static UINT16 get_mus(const char *word, UINT8 dehacked_mode); +#endif static hudnum_t get_huditem(const char *word); #ifndef HAVE_BLUA static powertype_t get_power(const char *word); @@ -1173,22 +1176,19 @@ static void readlevelheader(MYFILE *f, INT32 num) sizeof(mapheaderinfo[num-1]->musname), va("Level header %d: music", num)); } } +#ifdef MUSICSLOT_COMPATIBILITY else if (fastcmp(word, "MUSICSLOT")) - { // Backwards compatibility? - // Convert to map number - if (word2[0] >= 'A' && word2[0] <= 'Z' && word2[2] == '\0') - i = M_MapNumber(word2[0], word2[1]); - - if (!i) - mapheaderinfo[num-1]->musname[0] = 0; // becomes empty string - else if (i > 1035) - deh_warning("Level header %d: musicslot out of range (0 - 1035)\n", num); - else // it's just a number - { + { + i = get_mus(word2, true); + if (i && i <= 1035) snprintf(mapheaderinfo[num-1]->musname, 7, "%sM", G_BuildMapName(i)); - mapheaderinfo[num-1]->musname[6] = 0; - } + else if (i && i <= 1050) + strncpy(mapheaderinfo[num-1]->musname, compat_special_music_slots[i - 1036], 7); + else + mapheaderinfo[num-1]->musname[0] = 0; // becomes empty string + mapheaderinfo[num-1]->musname[6] = 0; } +#endif else if (fastcmp(word, "MUSICTRACK")) mapheaderinfo[num-1]->mustrack = ((UINT16)i - 1); else if (fastcmp(word, "FORCECHARACTER")) @@ -1463,6 +1463,20 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum) strncpy(cutscenes[num]->scene[scenenum].musswitch, word2, 7); cutscenes[num]->scene[scenenum].musswitch[6] = 0; } +#ifdef MUSICSLOT_COMPATIBILITY + else if (fastcmp(word, "MUSICSLOT")) + { + DEH_WriteUndoline(word, cutscenes[num]->scene[scenenum].musswitch, UNDO_NONE); + 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 else if (fastcmp(word, "MUSICTRACK")) { DEH_WriteUndoline(word, va("%u", cutscenes[num]->scene[scenenum].musswitchflags), UNDO_NONE); @@ -7978,6 +7992,46 @@ static sfxenum_t get_sfx(const char *word) return sfx_None; } +#ifdef MUSICSLOT_COMPATIBILITY +static UINT16 get_mus(const char *word, UINT8 dehacked_mode) +{ // Returns the value of MUS_ enumerations + UINT16 i; + char lumptmp[4]; + + if (*word >= '0' && *word <= '9') + return atoi(word); + if (!word[2] && toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z') + return (UINT16)M_MapNumber(word[0], word[1]); + + if (fastncmp("MUS_",word,4)) + word += 4; // take off the MUS_ + 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)) + { + word += 3; + if (toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z') + return (UINT16)M_MapNumber(word[0], word[1]); + else if ((i = atoi(word))) + return i; + + word -= 3; + if (dehacked_mode) + deh_warning("Couldn't find music named 'MUS_%s'",word); + return 0; + } + for (i = 0; compat_special_music_slots[i][0]; ++i) + if (fasticmp(word, compat_special_music_slots[i])) + return i + 1036; + if (dehacked_mode) + deh_warning("Couldn't find music named 'MUS_%s'",word); + return 0; +} +#endif + static hudnum_t get_huditem(const char *word) { // Returns the value of HUD_ enumerations hudnum_t i; @@ -8176,6 +8230,13 @@ static fixed_t find_const(const char **rword) free(word); return r; } +#ifdef MUSICSLOT_COMPATIBILITY + else if (fastncmp("MUS_",word,4) || fastncmp("O_",word,2)) { + r = get_mus(word, true); + free(word); + return r; + } +#endif else if (fastncmp("PW_",word,3)) { r = get_power(word); free(word); @@ -8545,6 +8606,29 @@ static inline int lib_getenum(lua_State *L) if (mathlib) return luaL_error(L, "sfx '%s' could not be found.\n", word); return 0; } +#ifdef MUSICSLOT_COMPATIBILITY + else if (!mathlib && fastncmp("mus_",word,4)) { + p = word+4; + if ((i = get_mus(p, false)) == 0) + return 0; + lua_pushinteger(L, i); + return 1; + } + else if (mathlib && fastncmp("MUS_",word,4)) { // SOCs are ALL CAPS! + p = word+4; + if ((i = get_mus(p, false)) == 0) + return luaL_error(L, "music '%s' could not be found.\n", word); + lua_pushinteger(L, i); + return 1; + } + else if (mathlib && (fastncmp("O_",word,2) || fastncmp("D_",word,2))) { + p = word+2; + if ((i = get_mus(p, false)) == 0) + return luaL_error(L, "music '%s' could not be found.\n", word); + lua_pushinteger(L, i); + return 1; + } +#endif else if (!mathlib && fastncmp("pw_",word,3)) { p = word+3; for (i = 0; i < NUMPOWERS; i++) diff --git a/src/doomdef.h b/src/doomdef.h index 8935eb117..0fc4a1fea 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -490,4 +490,8 @@ extern const char *compdate, *comptime, *comprevision, *compbranch; /// Experimental tweaks to analog mode. (Needs a lot of work before it's ready for primetime.) //#define REDSANALOG +/// Backwards compatibility with musicslots. +/// \note You should leave this enabled unless you're working with a future SRB2 version. +#define MUSICSLOT_COMPATIBILITY + #endif // __DOOMDEF__ diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 386270959..c415eecb8 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1636,17 +1636,59 @@ static int lib_sStopSound(lua_State *L) static int lib_sChangeMusic(lua_State *L) { +#ifdef MUSICSLOT_COMPATIBILITY + const char *music_name; + UINT32 music_num; + char music_compat_name[7]; + + boolean looping; + player_t *player = NULL; + UINT16 music_flags = 0; + NOHUD + + if (lua_isnumber(L, 1)) + { + music_num = (UINT32)luaL_checkinteger(L, 1); + music_flags = (UINT16)(music_num & 0x0000FFFF); + if (music_flags && music_flags <= 1035) + snprintf(music_compat_name, 7, "%sM", G_BuildMapName((INT32)music_flags)); + else if (music_flags && music_flags <= 1050) + strncpy(music_compat_name, compat_special_music_slots[music_flags - 1036], 7); + else + music_compat_name[0] = 0; // becomes empty string + music_compat_name[6] = 0; + music_name = (const char *)&music_compat_name; + music_flags = 0; + } + else + { + music_num = 0; + music_name = luaL_checkstring(L, 1); + } + + + looping = (boolean)lua_opttrueboolean(L, 2); + +#else const char *music_name = luaL_checkstring(L, 1); boolean looping = (boolean)lua_opttrueboolean(L, 2); player_t *player = NULL; UINT16 music_flags = 0; NOHUD + +#endif if (!lua_isnone(L, 3) && lua_isuserdata(L, 3)) { player = *((player_t **)luaL_checkudata(L, 3, META_PLAYER)); if (!player) return LUA_ErrInvalid(L, "player_t"); } + +#ifdef MUSICSLOT_COMPATIBILITY + if (music_num) + music_flags = (UINT16)((music_num & 0x7FFF0000) >> 16); + else +#endif music_flags = (UINT16)luaL_optinteger(L, 4, 0); if (!player || P_IsLocalPlayer(player)) diff --git a/src/s_sound.c b/src/s_sound.c index 1e5f79aa0..49373d94c 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1155,6 +1155,28 @@ void S_StartSoundName(void *mo, const char *soundname) /// Music /// ------------------------ +#ifdef MUSICSLOT_COMPATIBILITY +const char *compat_special_music_slots[16] = +{ + "titles", // 1036 title screen + "read_m", // 1037 intro + "lclear", // 1038 level clear + "invinc", // 1039 invincibility + "shoes", // 1040 super sneakers + "minvnc", // 1041 Mario invincibility + "drown", // 1042 drowning + "gmover", // 1043 game over + "xtlife", // 1044 extra life + "contsc", // 1045 continue screen + "supers", // 1046 Super Sonic + "chrsel", // 1047 character select + "credit", // 1048 credits + "racent", // 1049 Race Results + "stjr", // 1050 Sonic Team Jr. Presents + "" +}; +#endif + #define music_playing (music_name[0]) // String is empty if no music is playing static char music_name[7]; // up to 6-character name diff --git a/src/s_sound.h b/src/s_sound.h index 12787536b..d5cf3570d 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -139,4 +139,10 @@ void S_StopSoundByNum(sfxenum_t sfxnum); #define S_StartScreamSound S_StartSound #endif +#ifdef MUSICSLOT_COMPATIBILITY +// For compatibility with code/scripts relying on older versions +// This is a list of all the "special" slot names and their associated numbers +const char *compat_special_music_slots[16]; +#endif + #endif From 61a0d1bcd162062e43d35a87b8ba539c27187e3c Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 3 Mar 2016 03:09:35 -0800 Subject: [PATCH 193/467] don't use lstring you have space for a null terminator there... --- src/lua_maplib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 5f77b2b5c..e7801d773 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -1169,7 +1169,7 @@ static int mapheaderinfo_get(lua_State *L) else if (fastcmp(field,"nextlevel")) lua_pushinteger(L, header->nextlevel); else if (fastcmp(field,"musname")) - lua_pushlstring(L, header->musname, 6); + lua_pushstring(L, header->musname); else if (fastcmp(field,"mustrack")) lua_pushinteger(L, header->mustrack); else if (fastcmp(field,"forcecharacter")) From 4f9bb15e4db743221622b421a5ee7828229e9917 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Thu, 3 Mar 2016 18:31:17 +0000 Subject: [PATCH 194/467] "Loading SOC from" console message now also displays the name of the SOC_ lump --- src/w_wad.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/w_wad.c b/src/w_wad.c index dc994e848..132df8fcb 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -32,6 +32,7 @@ #include "w_wad.h" #include "z_zone.h" +#include "fastcmp.h" #include "i_video.h" // rendermode #include "d_netfil.h" @@ -151,8 +152,16 @@ static inline void W_LoadDehackedLumps(UINT16 wadnum) lumpinfo_t *lump_p = wadfiles[wadnum]->lumpinfo; for (lump = 0; lump < wadfiles[wadnum]->numlumps; lump++, lump_p++) if (memcmp(lump_p->name,"SOC_",4)==0) // Check for generic SOC lump - { - CONS_Printf(M_GetText("Loading SOC from %s\n"), wadfiles[wadnum]->filename); + { // shameless copy+paste of code from LUA_LoadLump + char *name = malloc(strlen(wadfiles[wadnum]->filename)+10); + strcpy(name, wadfiles[wadnum]->filename); + if (!fasticmp(&name[strlen(name) - 4], ".soc")) { + // If it's not a .soc file, copy the lump name in too. + name[strlen(wadfiles[wadnum]->filename)] = '|'; + M_Memcpy(name+strlen(wadfiles[wadnum]->filename)+1, lump_p->name, 8); + name[strlen(wadfiles[wadnum]->filename)+9] = '\0'; + } + CONS_Printf(M_GetText("Loading SOC from %s\n"), name); DEH_LoadDehackedLumpPwad(wadnum, lump); } else if (memcmp(lump_p->name,"MAINCFG",8)==0) // Check for MAINCFG From 0b704ba6188ee47763ab682c64b0d43138152846 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Thu, 3 Mar 2016 17:07:05 -0500 Subject: [PATCH 195/467] Updated NetArchiveHook to lua_hooklib.c Fixes I_Assert failure crash due to hooks working differently now. --- src/lua_hooklib.c | 24 ++++++++++++++++++++++++ src/lua_script.c | 28 +++------------------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 0415d23e6..4a3325cf1 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -768,4 +768,28 @@ boolean LUAh_HurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source) return hooked; } +void LUAh_NetArchiveHook(lua_CFunction archFunc) +{ + hook_p hookp; + + if (!gL || !(hooksAvailable[hook_NetVars/8] & (1<<(hook_NetVars%8)))) + return; + + // stack: tables + I_Assert(lua_gettop(gL) > 0); + I_Assert(lua_istable(gL, -1)); + + for (hookp = roothook; hookp; hookp = hookp->next) + if (hookp->type == hook_NetVars) + { + lua_pushfstring(gL, FMT_HOOKID, hookp->id); + lua_gettable(gL, LUA_REGISTRYINDEX); + lua_pushvalue(gL, -2); // tables + LUA_Call(gL, 1); + } + + // pop tables + lua_pop(gL, 1); +} + #endif diff --git a/src/lua_script.c b/src/lua_script.c index a7315ad62..2e076b024 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -915,29 +915,7 @@ static void UnArchiveTables(void) } } -static void NetArchiveHook(lua_CFunction archFunc) -{ - int TABLESINDEX; - - if (!gL) - return; - - TABLESINDEX = lua_gettop(gL); - lua_getfield(gL, LUA_REGISTRYINDEX, "hook"); - I_Assert(lua_istable(gL, -1)); - lua_rawgeti(gL, -1, hook_NetVars); - lua_remove(gL, -2); - I_Assert(lua_istable(gL, -1)); - - lua_pushvalue(gL, TABLESINDEX); - lua_pushcclosure(gL, archFunc, 1); - lua_pushnil(gL); - while (lua_next(gL, -3) != 0) { - lua_pushvalue(gL, -3); // function - LUA_Call(gL, 1); - } - lua_pop(gL, 2); -} +void LUAh_NetArchiveHook(lua_CFunction archFunc); void LUA_Step(void) { @@ -972,7 +950,7 @@ void LUA_Archive(void) } WRITEUINT32(save_p, UINT32_MAX); // end of mobjs marker, replaces mobjnum. - NetArchiveHook(NetArchive); // call the NetArchive hook in archive mode + LUAh_NetArchiveHook(NetArchive); // call the NetArchive hook in archive mode ArchiveTables(); if (gL) @@ -1003,7 +981,7 @@ void LUA_UnArchive(void) UnArchiveExtVars(th); // apply variables } while(mobjnum != UINT32_MAX); // repeat until end of mobjs marker. - NetArchiveHook(NetUnArchive); // call the NetArchive hook in unarchive mode + LUAh_NetArchiveHook(NetUnArchive); // call the NetArchive hook in unarchive mode UnArchiveTables(); if (gL) From 7ae871c7f860d2d76294a3c78379a1124d8af0e2 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Thu, 3 Mar 2016 17:19:21 -0500 Subject: [PATCH 196/467] Fix errenous stack pop. This function is intended to leave the stack in the same state it recieved it. --- src/lua_hooklib.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 4a3325cf1..01d4314c8 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -788,8 +788,7 @@ void LUAh_NetArchiveHook(lua_CFunction archFunc) LUA_Call(gL, 1); } - // pop tables - lua_pop(gL, 1); + // stack: tables } #endif From 0bdc976d50038db25386290339eb1c959d43dd04 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Thu, 3 Mar 2016 17:19:35 -0500 Subject: [PATCH 197/467] Shut up compiler warning. --- src/lua_hooklib.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 01d4314c8..48c6df6d2 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -24,6 +24,8 @@ #include "lua_hook.h" #include "lua_hud.h" // hud_running errors +void LUAh_NetArchiveHook(lua_CFunction archFunc); + static UINT8 hooksAvailable[(hook_MAX/8)+1]; const char *const hookNames[hook_MAX+1] = { From 9d6e75ae4f625cb5330b627b1777ef279e0344d9 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Thu, 3 Mar 2016 17:30:10 -0500 Subject: [PATCH 198/467] Cleanup LUAh_NetArchiveHook prototype mess. --- src/lua_hooklib.c | 2 -- src/lua_script.c | 2 -- src/lua_script.h | 1 + 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 48c6df6d2..01d4314c8 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -24,8 +24,6 @@ #include "lua_hook.h" #include "lua_hud.h" // hud_running errors -void LUAh_NetArchiveHook(lua_CFunction archFunc); - static UINT8 hooksAvailable[(hook_MAX/8)+1]; const char *const hookNames[hook_MAX+1] = { diff --git a/src/lua_script.c b/src/lua_script.c index 2e076b024..9925bac02 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -915,8 +915,6 @@ static void UnArchiveTables(void) } } -void LUAh_NetArchiveHook(lua_CFunction archFunc); - void LUA_Step(void) { if (!gL) diff --git a/src/lua_script.h b/src/lua_script.h index 292160a0b..ec67703c3 100644 --- a/src/lua_script.h +++ b/src/lua_script.h @@ -55,6 +55,7 @@ void Got_Luacmd(UINT8 **cp, INT32 playernum); // lua_consolelib.c void LUA_CVarChanged(const char *name); // lua_consolelib.c int Lua_optoption(lua_State *L, int narg, const char *def, const char *const lst[]); +void LUAh_NetArchiveHook(lua_CFunction archFunc); // Console wrapper void COM_Lua_f(void); From b368936b03b3e65e7cb8c5fdf417660806fc05cc Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Thu, 3 Mar 2016 17:30:46 -0500 Subject: [PATCH 199/467] Fix bad logic in LUAh_NetArchiveHook rewrite... Argh, I knew I was forgetting something! archFunc is the argument to be passed to the hooks, not tables! --- src/lua_hooklib.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 01d4314c8..5230886a8 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -779,15 +779,21 @@ void LUAh_NetArchiveHook(lua_CFunction archFunc) I_Assert(lua_gettop(gL) > 0); I_Assert(lua_istable(gL, -1)); + // tables becomes an upvalue of archFunc + lua_pushvalue(gL, -1); + lua_pushcclosure(gL, archFunc, 1); + // stack: tables, archFunc + for (hookp = roothook; hookp; hookp = hookp->next) if (hookp->type == hook_NetVars) { lua_pushfstring(gL, FMT_HOOKID, hookp->id); lua_gettable(gL, LUA_REGISTRYINDEX); - lua_pushvalue(gL, -2); // tables + lua_pushvalue(gL, -2); // archFunc LUA_Call(gL, 1); } + lua_pop(gL, 1); // pop archFunc // stack: tables } From b96de7705018251e7c213ab50bfd100cab1641d1 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Thu, 3 Mar 2016 20:54:19 -0600 Subject: [PATCH 200/467] Fix sorting on toaster's name --- src/f_finale.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/f_finale.c b/src/f_finale.c index c89c39cf3..d47b8e988 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1002,8 +1002,8 @@ static const char *credits[] = { "Jim \"MotorRoach\" DeMello", "Desmond \"Blade\" DesJardins", "Sherman \"CoatRack\" DesJardins", - "Andrew \"Senku Niola\" Moran", "Vivian \"toaster\" Grannell", + "Andrew \"Senku Niola\" Moran", "David \"Instant Sonic\" Spencer Jr.", "\"SSNTails\"", "", From 099e25824fcb3cbda74256e0d16e0255475b0176 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 5 Mar 2016 16:29:25 +0000 Subject: [PATCH 201/467] First person view now should correctly take the skybox centerpoint's angle into account --- src/r_main.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/r_main.c b/src/r_main.c index a4e72cba9..b1a2036cc 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -972,14 +972,42 @@ void R_SkyboxFrame(player_t *player) { if (skyboxmo[1]) { + fixed_t x = 0, y = 0; if (mh->skybox_scalex > 0) - viewx += (player->mo->x - skyboxmo[1]->x) / mh->skybox_scalex; + x = (player->mo->x - skyboxmo[1]->x) / mh->skybox_scalex; else if (mh->skybox_scalex < 0) - viewx += (player->mo->x - skyboxmo[1]->x) * -mh->skybox_scalex; + x = (player->mo->x - skyboxmo[1]->x) * -mh->skybox_scalex; if (mh->skybox_scaley > 0) - viewy += (player->mo->y - skyboxmo[1]->y) / mh->skybox_scaley; + y = (player->mo->y - skyboxmo[1]->y) / mh->skybox_scaley; else if (mh->skybox_scaley < 0) - viewy += (player->mo->y - skyboxmo[1]->y) * -mh->skybox_scaley; + y = (player->mo->y - skyboxmo[1]->y) * -mh->skybox_scaley; + + if (viewmobj->angle == 0) + { + viewx += x; + viewy += y; + } + else if (viewmobj->angle == ANGLE_90) + { + viewx -= y; + viewy += x; + } + else if (viewmobj->angle == ANGLE_180) + { + viewx -= x; + viewy -= y; + } + else if (viewmobj->angle == ANGLE_270) + { + viewx += y; + viewy -= x; + } + else + { + angle_t ang = viewmobj->angle>>ANGLETOFINESHIFT; + viewx += FixedMul(x,FINECOSINE(ang)) - FixedMul(y, FINESINE(ang)); + viewy += FixedMul(x, FINESINE(ang)) + FixedMul(y,FINECOSINE(ang)); + } } if (mh->skybox_scalez > 0) viewz += player->viewz / mh->skybox_scalez; From 4ab2c336e7e19c73a1a287802dc0e1f0969a55b8 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sun, 6 Mar 2016 19:32:07 +0000 Subject: [PATCH 202/467] Possibly fixed the issues with LibGME mentioned in issue #14. Not even the HAVE_LIBGME macro was defined apparently, huh. --- cmake/Modules/FindGME.cmake | 8 ++++---- src/CMakeLists.txt | 1 + src/sdl/CMakeLists.txt | 3 +++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cmake/Modules/FindGME.cmake b/cmake/Modules/FindGME.cmake index 3b0c68de7..ea80af454 100644 --- a/cmake/Modules/FindGME.cmake +++ b/cmake/Modules/FindGME.cmake @@ -6,16 +6,16 @@ find_path(GME_INCLUDE_DIR NAMES gme.h PATHS ${GME_PKGCONF_INCLUDE_DIRS} - /usr/include/gme - /usr/local/include/gme + "/usr/include/gme" + "/usr/local/include/gme" ) find_library(GME_LIBRARY NAMES gme PATHS ${GME_PKGCONF_LIBRARY_DIRS} - /usr/lib - /usr/local/lib + "/usr/lib" + "/usr/local/lib" ) set(GME_PROCESS_INCLUDES GME_INCLUDE_DIR) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d9e25dbb8..6ec8f2d71 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -314,6 +314,7 @@ if(${SRB2_CONFIG_HAVE_GME}) find_package(GME) if(${GME_FOUND}) set(SRB2_HAVE_GME ON) + add_definitions(-DHAVE_LIBGME) else() message(WARNING "You have specified that GME is available but it was not found.") endif() diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index b3d734521..7190efaac 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -122,6 +122,7 @@ if(${SDL2_FOUND}) add_framework(SDL2 SRB2SDL2) add_framework(SDL2_mixer SRB2SDL2) target_link_libraries(SRB2SDL2 PRIVATE + ${GME_LIBRARIES} ${PNG_LIBRARIES} ${ZLIB_LIBRARIES} ${OPENGL_LIBRARIES} @@ -131,6 +132,7 @@ if(${SDL2_FOUND}) target_link_libraries(SRB2SDL2 PRIVATE ${SDL2_LIBRARIES} ${SDL2_MIXER_LIBRARIES} + ${GME_LIBRARIES} ${PNG_LIBRARIES} ${ZLIB_LIBRARIES} ${OPENGL_LIBRARIES} @@ -198,6 +200,7 @@ if(${SDL2_FOUND}) target_include_directories(SRB2SDL2 PRIVATE ${SDL2_INCLUDE_DIRS} ${SDL2_MIXER_INCLUDE_DIRS} + ${GME_INCLUDE_DIRS} ${PNG_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS} From 2f539a4df98b43c318a7382e8664dc88e1751c9a Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 7 Mar 2016 20:42:25 +0000 Subject: [PATCH 203/467] R_RenderThickSideRange now checks for slopes in the front sector's lightlist This appears to fix a few holes that have been known to appear with FOF slopes sometimes, dunno how they actually came about exactly but this apparently sorts them out --- src/r_segs.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/src/r_segs.c b/src/r_segs.c index ccf70338e..8222a7268 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -673,7 +673,9 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) fixed_t offsetvalue = 0; lightlist_t *light; r_lightlist_t *rlight; +#ifndef ESLOPE fixed_t lheight; +#endif line_t *newline = NULL; #ifdef ESLOPE // Render FOF sides kinda like normal sides, with the frac and step and everything @@ -751,9 +753,49 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) for (i = p = 0; i < dc_numlights; i++) { +#ifdef ESLOPE + fixed_t leftheight, rightheight; + fixed_t pfloorleft, pfloorright; +#endif light = &frontsector->lightlist[i]; rlight = &dc_lightlist[p]; +#ifdef ESLOPE + if (light->slope) { + leftheight = P_GetZAt(light->slope, ds->leftpos.x, ds->leftpos.y); + rightheight = P_GetZAt(light->slope, ds->rightpos.x, ds->rightpos.y); + } else + leftheight = rightheight = light->height; + if (*pfloor->b_slope) { + pfloorleft = P_GetZAt(*pfloor->b_slope, ds->leftpos.x, ds->leftpos.y); + pfloorright = P_GetZAt(*pfloor->b_slope, ds->rightpos.x, ds->rightpos.y); + } else + pfloorleft = pfloorright = *pfloor->bottomheight; + + if (leftheight < pfloorleft && rightheight < pfloorright) + continue; + + if (*pfloor->t_slope) { + pfloorleft = P_GetZAt(*pfloor->t_slope, ds->leftpos.x, ds->leftpos.y); + pfloorright = P_GetZAt(*pfloor->t_slope, ds->rightpos.x, ds->rightpos.y); + } else + pfloorleft = pfloorright = *pfloor->topheight; + + if (leftheight > pfloorleft && rightheight > pfloorright && i+1 < dc_numlights) + { + lightlist_t *nextlight = &frontsector->lightlist[i+1]; + if (nextlight->slope ? P_GetZAt(nextlight->slope, ds->leftpos.x, ds->leftpos.y) : nextlight->height > pfloorleft + && nextlight->slope ? P_GetZAt(nextlight->slope, ds->rightpos.x, ds->rightpos.y) : nextlight->height > pfloorright) + continue; + } + + leftheight -= viewz; + rightheight -= viewz; + rlight->height = (centeryfrac) - FixedMul(leftheight, ds->scale1); + rlight->heightstep = (centeryfrac) - FixedMul(rightheight, ds->scale2); + rlight->heightstep = (rlight->heightstep-rlight->height)/(ds->x2-ds->x1+1); + rlight->height -= rlight->heightstep; +#else if (light->height < *pfloor->bottomheight) continue; @@ -763,13 +805,29 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) lheight = light->height;// > *pfloor->topheight ? *pfloor->topheight + FRACUNIT : light->height; rlight->heightstep = -FixedMul (rw_scalestep, (lheight - viewz)); rlight->height = (centeryfrac) - FixedMul((lheight - viewz), spryscale) - rlight->heightstep; +#endif rlight->flags = light->flags; - if (light->flags & FF_CUTLEVEL) { +#ifdef ESLOPE + if (*light->caster->b_slope) { + leftheight = P_GetZAt(*light->caster->b_slope, ds->leftpos.x, ds->leftpos.y); + rightheight = P_GetZAt(*light->caster->b_slope, ds->rightpos.x, ds->rightpos.y); + } else + leftheight = rightheight = light->caster->bottomheight; + + leftheight -= viewz; + rightheight -= viewz; + + rlight->botheight = (centeryfrac) - FixedMul(leftheight, ds->scale1); + rlight->botheightstep = (centeryfrac) - FixedMul(rightheight, ds->scale2); + rlight->botheightstep = (rlight->botheightstep-rlight->botheight)/(ds->x2-ds->x1+1); + rlight->botheight -= rlight->botheightstep; +#else lheight = *light->caster->bottomheight;// > *pfloor->topheight ? *pfloor->topheight + FRACUNIT : *light->caster->bottomheight; rlight->botheightstep = -FixedMul (rw_scalestep, (lheight - viewz)); rlight->botheight = (centeryfrac) - FixedMul((lheight - viewz), spryscale) - rlight->botheightstep; +#endif } rlight->lightlevel = *light->lightlevel; From 60ea2ecb77b4bb0926169d7bf879b2dfbf387a50 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 7 Mar 2016 21:02:35 +0000 Subject: [PATCH 204/467] Whoops, forgot these --- src/r_segs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_segs.c b/src/r_segs.c index 8222a7268..e31d570b6 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -814,7 +814,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) leftheight = P_GetZAt(*light->caster->b_slope, ds->leftpos.x, ds->leftpos.y); rightheight = P_GetZAt(*light->caster->b_slope, ds->rightpos.x, ds->rightpos.y); } else - leftheight = rightheight = light->caster->bottomheight; + leftheight = rightheight = *light->caster->bottomheight; leftheight -= viewz; rightheight -= viewz; From c7b18207f5d338a6d3155844092dcb77de52a6e0 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Mon, 7 Mar 2016 16:06:04 -0500 Subject: [PATCH 205/467] travis: do not error on making cache folder, if it already restored from cache --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index db44edb5d..c652584f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ addons: - p7zip-full before_script: - - mkdir $HOME/srb2_cache + - mkdir -p $HOME/srb2_cache - wget --verbose --server-response -c http://rosenthalcastle.org/srb2/SRB2-v2114-assets.7z -O $HOME/srb2_cache/SRB2-v2114-assets.7z - 7z x $HOME/srb2_cache/SRB2-v2114-assets.7z -oassets - mkdir build From eab51414f348470edfb7b84e2157db7d9b1af39d Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 7 Mar 2016 21:16:02 +0000 Subject: [PATCH 206/467] Fix typo in A_ChangeAngleAbsolute --- src/p_enemy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 367d5714a..ffb690822 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -7223,7 +7223,7 @@ void A_ChangeAngleAbsolute(mobj_t *actor) //const angle_t amin = FixedAngle(locvar1*FRACUNIT); //const angle_t amax = FixedAngle(locvar2*FRACUNIT); #ifdef HAVE_BLUA - if (LUA_CallAction("A_ChangeAngelAbsolute", actor)) + if (LUA_CallAction("A_ChangeAngleAbsolute", actor)) return; #endif From 694220155e26e63af242fa9ff457d34261425ca3 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Tue, 8 Mar 2016 21:30:12 -0800 Subject: [PATCH 207/467] Revert "MF2_PUSHED is now MFE_PUSHED, for the simple reason that it makes more sense as an eflags object flag than a flags2 object flag!" This reverts commit c8c7878005f79e87f7c0cfa5e0a2f42a53d68758. # Conflicts: # src/dehacked.c # src/p_mobj.c # src/p_mobj.h --- src/dehacked.c | 2 +- src/p_mobj.c | 3 ++- src/p_mobj.h | 38 +++++++++++++++++++------------------- src/p_spec.c | 18 +++++++++--------- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index c21e8fb99..60f3b0592 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6684,6 +6684,7 @@ static const char *const MOBJFLAG2_LIST[] = { "EXPLOSION", // Thrown ring has explosive properties "SCATTER", // Thrown ring has scatter properties "BEYONDTHEGRAVE",// Source of this missile has died and has since respawned. + "PUSHED", // Mobj was already pushed this tic "SLIDEPUSH", // MF_PUSHABLE that pushes continuously. "CLASSICPUSH", // Drops straight down when object has negative Z. "STANDONME", // While not pushable, stand on me anyway. @@ -6712,7 +6713,6 @@ static const char *const MOBJEFLAG_LIST[] = { "JUSTSTEPPEDDOWN", // used for ramp sectors "VERTICALFLIP", // Vertically flip sprite/allow upside-down physics "GOOWATER", // Goo water - "PUSHED", // Mobj was already pushed this tic "SPRUNG", // Mobj was already sprung this tic "APPLYPMOMZ", // Platform movement NULL diff --git a/src/p_mobj.c b/src/p_mobj.c index d2454f267..cb9bc775a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6083,7 +6083,8 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->tracer && P_MobjWasRemoved(mobj->tracer)) P_SetTarget(&mobj->tracer, NULL); - mobj->eflags &= ~(MFE_PUSHED|MFE_SPRUNG); + mobj->flags2 &= ~MF2_PUSHED; + mobj->eflags &= ~MFE_SPRUNG; tmfloorthing = tmhitthing = NULL; diff --git a/src/p_mobj.h b/src/p_mobj.h index 6198f5bec..e24b09652 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -175,23 +175,24 @@ typedef enum MF2_EXPLOSION = 1<<7, // Thrown ring has explosive properties MF2_SCATTER = 1<<8, // Thrown ring has scatter properties MF2_BEYONDTHEGRAVE = 1<<9, // Source of this missile has died and has since respawned. - MF2_SLIDEPUSH = 1<<10, // MF_PUSHABLE that pushes continuously. - MF2_CLASSICPUSH = 1<<11, // Drops straight down when object has negative Z. - MF2_STANDONME = 1<<12, // While not pushable, stand on me anyway. - MF2_INFLOAT = 1<<13, // Floating to a height for a move, don't auto float to target's height. - MF2_DEBRIS = 1<<14, // Splash ring from explosion ring - MF2_NIGHTSPULL = 1<<15, // Attracted from a paraloop - MF2_JUSTATTACKED = 1<<16, // can be pushed by other moving mobjs - MF2_FIRING = 1<<17, // turret fire - MF2_SUPERFIRE = 1<<18, // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it. - MF2_SHADOW = 1<<19, // Fuzzy draw, makes targeting harder. - MF2_STRONGBOX = 1<<20, // Flag used for "strong" random monitors. - MF2_OBJECTFLIP = 1<<21, // Flag for objects that always have flipped gravity. - MF2_SKULLFLY = 1<<22, // Special handling: skull in flight. - MF2_FRET = 1<<23, // Flashing from a previous hit - MF2_BOSSNOTRAP = 1<<24, // No Egg Trap after boss - MF2_BOSSFLEE = 1<<25, // Boss is fleeing! - MF2_BOSSDEAD = 1<<26, // Boss is dead! (Not necessarily fleeing, if a fleeing point doesn't exist.) + MF2_PUSHED = 1<<10, // Mobj was already pushed this tic + MF2_SLIDEPUSH = 1<<11, // MF_PUSHABLE that pushes continuously. + MF2_CLASSICPUSH = 1<<12, // Drops straight down when object has negative Z. + MF2_STANDONME = 1<<13, // While not pushable, stand on me anyway. + MF2_INFLOAT = 1<<14, // Floating to a height for a move, don't auto float to target's height. + MF2_DEBRIS = 1<<15, // Splash ring from explosion ring + MF2_NIGHTSPULL = 1<<16, // Attracted from a paraloop + MF2_JUSTATTACKED = 1<<17, // can be pushed by other moving mobjs + MF2_FIRING = 1<<18, // turret fire + MF2_SUPERFIRE = 1<<19, // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it. + MF2_SHADOW = 1<<20, // Fuzzy draw, makes targeting harder. + MF2_STRONGBOX = 1<<21, // Flag used for "strong" random monitors. + MF2_OBJECTFLIP = 1<<22, // Flag for objects that always have flipped gravity. + MF2_SKULLFLY = 1<<23, // Special handling: skull in flight. + MF2_FRET = 1<<24, // Flashing from a previous hit + MF2_BOSSNOTRAP = 1<<25, // No Egg Trap after boss + MF2_BOSSFLEE = 1<<26, // Boss is fleeing! + MF2_BOSSDEAD = 1<<27, // Boss is dead! (Not necessarily fleeing, if a fleeing point doesn't exist.) // free: to and including 1<<31 } mobjflag2_t; @@ -231,8 +232,7 @@ typedef enum MFE_VERTICALFLIP = 1<<5, // Goo water MFE_GOOWATER = 1<<6, - // Mobj was already pushed this tic - MFE_PUSHED = 1<<7, + // free: to and including 1<<7 // Mobj was already sprung this tic MFE_SPRUNG = 1<<8, // Platform movement diff --git a/src/p_spec.c b/src/p_spec.c index f9fa5f1f1..34b779068 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6468,7 +6468,7 @@ static void P_DoScrollMove(mobj_t *thing, fixed_t dx, fixed_t dy, INT32 exclusiv thing->momy += dy; if (exclusive) - thing->eflags |= MFE_PUSHED; + thing->flags2 |= MF2_PUSHED; } /** Processes an active scroller. @@ -6572,7 +6572,7 @@ void T_Scroll(scroll_t *s) { thing = node->m_thing; - if (thing->eflags & MFE_PUSHED) // Already pushed this tic by an exclusive pusher. + if (thing->flags2 & MF2_PUSHED) // Already pushed this tic by an exclusive pusher. continue; height = P_GetSpecialBottomZ(thing, sec, psec); @@ -6594,7 +6594,7 @@ void T_Scroll(scroll_t *s) { thing = node->m_thing; - if (thing->eflags & MFE_PUSHED) + if (thing->flags2 & MF2_PUSHED) continue; height = P_GetSpecialBottomZ(thing, sec, sec); @@ -6635,7 +6635,7 @@ void T_Scroll(scroll_t *s) { thing = node->m_thing; - if (thing->eflags & MFE_PUSHED) + if (thing->flags2 & MF2_PUSHED) continue; height = P_GetSpecialTopZ(thing, sec, psec); @@ -6657,7 +6657,7 @@ void T_Scroll(scroll_t *s) { thing = node->m_thing; - if (thing->eflags & MFE_PUSHED) + if (thing->flags2 & MF2_PUSHED) continue; height = P_GetSpecialTopZ(thing, sec, sec); @@ -7140,7 +7140,7 @@ static pusher_t *tmpusher; // pusher structure for blockmap searches */ static inline boolean PIT_PushThing(mobj_t *thing) { - if (thing->eflags & MFE_PUSHED) + if (thing->flags2 & MF2_PUSHED) return false; if (thing->player && thing->player->pflags & PF_ROPEHANG) @@ -7270,7 +7270,7 @@ static inline boolean PIT_PushThing(mobj_t *thing) } if (tmpusher->exclusive) - thing->eflags |= MFE_PUSHED; + thing->flags2 |= MF2_PUSHED; return true; } @@ -7373,7 +7373,7 @@ void T_Pusher(pusher_t *p) || thing->type == MT_BIGTUMBLEWEED)) continue; - if (thing->eflags & MFE_PUSHED) + if (thing->flags2 & MF2_PUSHED) continue; if (thing->player && thing->player->pflags & PF_ROPEHANG) @@ -7540,7 +7540,7 @@ void T_Pusher(pusher_t *p) } if (p->exclusive) - thing->eflags |= MFE_PUSHED; + thing->flags2 |= MF2_PUSHED; } } } From cfcd7ce0d3959bcce0e8e00cc504b1354451cb50 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Tue, 8 Mar 2016 22:15:26 -0800 Subject: [PATCH 208/467] Readded EvalMath to Lua. There is a caveat to this: The first time EvalMath is used, a deprecated function warning will be shown to the user that tells them to use _G[] instead. This reverts commit 9d36cf37bd6fc1e5e0e9770031925db3a92a9929. --- src/lua_baselib.c | 9 +++++++++ src/lua_script.h | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index c415eecb8..2cc79db47 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -85,6 +85,14 @@ static int lib_print(lua_State *L) return 0; } +static int lib_evalMath(lua_State *L) +{ + const char *word = luaL_checkstring(L, 1); + LUA_Deprecated(L, "EvalMath(string)", "_G[string]"); + lua_pushinteger(L, LUA_EvalMath(word)); + return 1; +} + // M_RANDOM ////////////// @@ -1899,6 +1907,7 @@ static int lib_gTicsToMilliseconds(lua_State *L) static luaL_Reg lib[] = { {"print", lib_print}, + {"EvalMath", lib_evalMath}, // m_random {"P_Random",lib_pRandom}, diff --git a/src/lua_script.h b/src/lua_script.h index ec67703c3..96f832e2c 100644 --- a/src/lua_script.h +++ b/src/lua_script.h @@ -70,4 +70,15 @@ void COM_Lua_f(void); #define LUA_ErrInvalid(L, type) luaL_error(L, "accessed " type " doesn't exist anymore, please check 'valid' before using " type "."); +// Deprecation warnings +// Shows once upon use. Then doesn't show again. +#define LUA_Deprecated(L,this_func,use_instead)\ +{\ + static UINT8 seen = 0;\ + if (!seen) {\ + seen = 1;\ + CONS_Alert(CONS_WARNING,"\"%s\" is deprecated and will be removed.\nUse \"%s\" instead.\n", this_func, use_instead);\ + }\ +} + #endif From 7ae87cc2c66de2e3a23490bb090caa9febec43f8 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Tue, 8 Mar 2016 22:22:30 -0800 Subject: [PATCH 209/467] Revert "No more stupidity for No More Enemies special plz" This reverts commit 474ad01b46ddfc1983203ed006532eed403b6fa2. --- src/p_floor.c | 66 ++++++++++++++++++--------------------------------- src/p_spec.c | 1 - 2 files changed, 23 insertions(+), 44 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index b8d3f7b5e..cacaadf81 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1973,71 +1973,51 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies) { size_t i; fixed_t upperbound, lowerbound; - sector_t *sec = NULL; - sector_t *targetsec = NULL; - INT32 secnum = -1; + INT32 s; + sector_t *checksector; msecnode_t *node; mobj_t *thing; - boolean FOFsector = false; + boolean exists = false; - while ((secnum = P_FindSectorFromLineTag(nobaddies->sourceline, secnum)) >= 0) + for (i = 0; i < nobaddies->sector->linecount; i++) { - sec = §ors[secnum]; - - FOFsector = false; - - // Check the lines of this sector, to see if it is a FOF control sector. - for (i = 0; i < sec->linecount; i++) + if (nobaddies->sector->lines[i]->special == 223) { - INT32 targetsecnum = -1; - if (sec->lines[i]->special < 100 || sec->lines[i]->special >= 300) - continue; + upperbound = nobaddies->sector->ceilingheight; + lowerbound = nobaddies->sector->floorheight; - FOFsector = true; - - while ((targetsecnum = P_FindSectorFromLineTag(sec->lines[i], targetsecnum)) >= 0) + for (s = -1; (s = P_FindSectorFromLineTag(nobaddies->sector->lines[i], s)) >= 0 ;) { - targetsec = §ors[targetsecnum]; + checksector = §ors[s]; - upperbound = targetsec->ceilingheight; - lowerbound = targetsec->floorheight; - node = targetsec->touching_thinglist; // things touching this sector + node = checksector->touching_thinglist; // things touching this sector while (node) { thing = node->m_thing; if ((thing->flags & (MF_ENEMY|MF_BOSS)) && thing->health > 0 - && thing->z < upperbound && thing->z+thing->height > lowerbound) - return; + && thing->z < upperbound && thing->z+thing->height > lowerbound) + { + exists = true; + goto foundenemy; + } node = node->m_snext; } } } - - if (!FOFsector) - { - upperbound = sec->ceilingheight; - lowerbound = sec->floorheight; - node = sec->touching_thinglist; // things touching this sector - while (node) - { - thing = node->m_thing; - - if ((thing->flags & (MF_ENEMY|MF_BOSS)) && thing->health > 0 - && thing->z < upperbound && thing->z+thing->height > lowerbound) - return; - - node = node->m_snext; - } - } } +foundenemy: + if (exists) + return; - CONS_Debug(DBG_GAMELOGIC, "Running no-more-enemies exec with tag of %d\n", nobaddies->sourceline->tag); + s = P_AproxDistance(nobaddies->sourceline->dx, nobaddies->sourceline->dy)>>FRACBITS; - // No enemies found, run the linedef exec and terminate this thinker - P_RunTriggerLinedef(nobaddies->sourceline, NULL, NULL); + CONS_Debug(DBG_GAMELOGIC, "Running no-more-enemies exec with tag of %d\n", s); + + // Otherwise, run the linedef exec and terminate this thinker + P_LinedefExecute((INT16)s, NULL, NULL); P_RemoveThinker(&nobaddies->thinker); } diff --git a/src/p_spec.c b/src/p_spec.c index 34b779068..285da0e7f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1891,7 +1891,6 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller || specialtype == 304 // Ring count - Once || specialtype == 307 // Character ability - Once || specialtype == 308 // Race only - Once - || specialtype == 313 // No More Enemies - Once || specialtype == 315 // No of pushables - Once || specialtype == 318 // Unlockable trigger - Once || specialtype == 320 // Unlockable - Once From 436bcdf19aa9da266e421326e7129a848dd036a6 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Tue, 8 Mar 2016 23:43:43 -0800 Subject: [PATCH 210/467] Objectplace handles slopes. Sorry MI, I'm hijacking your branch for a bit. --- src/m_cheat.c | 85 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 15 deletions(-) diff --git a/src/m_cheat.c b/src/m_cheat.c index 473fbbf75..51b414df3 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -31,6 +31,7 @@ #include "v_video.h" #include "z_zone.h" +#include "p_slopes.h" #include "lua_script.h" #include "lua_hook.h" @@ -857,9 +858,19 @@ static void OP_CycleThings(INT32 amt) static boolean OP_HeightOkay(player_t *player, UINT8 ceiling) { + sector_t *sec = player->mo->subsector->sector; + if (ceiling) { - if (((player->mo->subsector->sector->ceilingheight - player->mo->z - player->mo->height)>>FRACBITS) >= (1 << (16-ZSHIFT))) +#ifdef ESLOPE + // Truncate position to match where mapthing would be when spawned + // (this applies to every further P_GetZAt call as well) + fixed_t cheight = sec->c_slope ? P_GetZAt(sec->c_slope, player->mo->x & 0xFFFF0000, player->mo->y & 0xFFFF0000) : sec->ceilingheight; +#else + fixed_t cheight = sec->ceilingheight; +#endif + + if (((cheight - player->mo->z - player->mo->height)>>FRACBITS) >= (1 << (16-ZSHIFT))) { CONS_Printf(M_GetText("Sorry, you're too %s to place this object (max: %d %s).\n"), M_GetText("low"), (1 << (16-ZSHIFT)), M_GetText("below top ceiling")); @@ -868,7 +879,12 @@ static boolean OP_HeightOkay(player_t *player, UINT8 ceiling) } else { - if (((player->mo->z - player->mo->subsector->sector->floorheight)>>FRACBITS) >= (1 << (16-ZSHIFT))) +#ifdef ESLOPE + fixed_t fheight = sec->f_slope ? P_GetZAt(sec->f_slope, player->mo->x & 0xFFFF0000, player->mo->y & 0xFFFF0000) : sec->floorheight; +#else + fixed_t fheight = sec->floorheight; +#endif + if (((player->mo->z - fheight)>>FRACBITS) >= (1 << (16-ZSHIFT))) { CONS_Printf(M_GetText("Sorry, you're too %s to place this object (max: %d %s).\n"), M_GetText("high"), (1 << (16-ZSHIFT)), M_GetText("above bottom floor")); @@ -881,6 +897,7 @@ static boolean OP_HeightOkay(player_t *player, UINT8 ceiling) static mapthing_t *OP_CreateNewMapThing(player_t *player, UINT16 type, boolean ceiling) { mapthing_t *mt = mapthings; + sector_t *sec = player->mo->subsector->sector; #ifdef HAVE_BLUA LUA_InvalidateMapthings(); @@ -913,9 +930,23 @@ static mapthing_t *OP_CreateNewMapThing(player_t *player, UINT16 type, boolean c mt->x = (INT16)(player->mo->x>>FRACBITS); mt->y = (INT16)(player->mo->y>>FRACBITS); if (ceiling) - mt->options = (UINT16)((player->mo->subsector->sector->ceilingheight - player->mo->z - player->mo->height)>>FRACBITS); + { +#ifdef ESLOPE + fixed_t cheight = sec->c_slope ? P_GetZAt(sec->c_slope, mt->x << FRACBITS, mt->y << FRACBITS) : sec->ceilingheight; +#else + fixed_t cheight = sec->ceilingheight; +#endif + mt->options = (UINT16)((cheight - player->mo->z - player->mo->height)>>FRACBITS); + } else - mt->options = (UINT16)((player->mo->z - player->mo->subsector->sector->floorheight)>>FRACBITS); + { +#ifdef ESLOPE + fixed_t fheight = sec->f_slope ? P_GetZAt(sec->f_slope, mt->x << FRACBITS, mt->y << FRACBITS) : sec->floorheight; +#else + fixed_t fheight = sec->floorheight; +#endif + mt->options = (UINT16)((player->mo->z - fheight)>>FRACBITS); + } mt->options <<= ZSHIFT; mt->angle = (INT16)(FixedInt(AngleFixed(player->mo->angle))); @@ -969,6 +1000,13 @@ void OP_NightsObjectplace(player_t *player) { UINT16 angle = (UINT16)(player->anotherflyangle % 360); INT16 temp = (INT16)FixedInt(AngleFixed(player->mo->angle)); // Traditional 2D Angle + sector_t *sec = player->mo->subsector->sector; +#ifdef ESLOPE + fixed_t fheight = sec->f_slope ? P_GetZAt(sec->f_slope, player->mo->x & 0xFFFF0000, player->mo->y & 0xFFFF0000) : sec->floorheight; +#else + fixed_t fheight = sec->floorheight; +#endif + player->pflags |= PF_ATTACKDOWN; @@ -983,7 +1021,7 @@ void OP_NightsObjectplace(player_t *player) temp += 90; temp %= 360; - mt->options = (UINT16)((player->mo->z - player->mo->subsector->sector->floorheight)>>FRACBITS); + mt->options = (UINT16)((player->mo->z - fheight)>>FRACBITS); mt->angle = (INT16)(mt->angle+(INT16)((FixedInt(FixedDiv(temp*FRACUNIT, 360*(FRACUNIT/256))))<<8)); P_SpawnHoopsAndRings(mt); @@ -1117,6 +1155,33 @@ void OP_ObjectplaceMovement(player_t *player) else player->viewz = player->mo->z + player->viewheight; + // Display flag information + // Moved up so it always updates. + { + sector_t *sec = player->mo->subsector->sector; + + if (!!(mobjinfo[op_currentthing].flags & MF_SPAWNCEILING) ^ !!(cv_opflags.value & MTF_OBJECTFLIP)) + { +#ifdef ESLOPE + fixed_t cheight = sec->c_slope ? P_GetZAt(sec->c_slope, player->mo->x & 0xFFFF0000, player->mo->y & 0xFFFF0000) : sec->ceilingheight; +#else + fixed_t cheight = sec->ceilingheight; +#endif + op_displayflags = (UINT16)((cheight - player->mo->z - mobjinfo[op_currentthing].height)>>FRACBITS); + } + else + { +#ifdef ESLOPE + fixed_t fheight = sec->f_slope ? P_GetZAt(sec->f_slope, player->mo->x & 0xFFFF0000, player->mo->y & 0xFFFF0000) : sec->floorheight; +#else + fixed_t fheight = sec->floorheight; +#endif + op_displayflags = (UINT16)((player->mo->z - fheight)>>FRACBITS); + } + op_displayflags <<= ZSHIFT; + op_displayflags |= (UINT16)cv_opflags.value; + } + if (player->pflags & PF_ATTACKDOWN) { // Are ANY objectplace buttons pressed? If no, remove flag. @@ -1182,16 +1247,6 @@ void OP_ObjectplaceMovement(player_t *player) CONS_Printf(M_GetText("Placed object type %d at %d, %d, %d, %d\n"), mt->type, mt->x, mt->y, mt->options>>ZSHIFT, mt->angle); } - - // Display flag information - { - if (!!(mobjinfo[op_currentthing].flags & MF_SPAWNCEILING) ^ !!(cv_opflags.value & MTF_OBJECTFLIP)) - op_displayflags = (UINT16)((player->mo->subsector->sector->ceilingheight - player->mo->z - mobjinfo[op_currentthing].height)>>FRACBITS); - else - op_displayflags = (UINT16)((player->mo->z - player->mo->subsector->sector->floorheight)>>FRACBITS); - op_displayflags <<= ZSHIFT; - op_displayflags |= (UINT16)cv_opflags.value; - } } // From 6aa708b5afdfd84da47d78c1f548b8ee4175dbd5 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 9 Mar 2016 00:49:35 -0800 Subject: [PATCH 211/467] I don't think we need the BLUE_SPHERES define anymore... --- src/dehacked.c | 2 -- src/doomdef.h | 4 ---- src/info.c | 2 -- src/info.h | 2 -- src/p_inter.c | 7 +------ src/p_mobj.c | 18 ------------------ src/p_user.c | 5 +---- 7 files changed, 2 insertions(+), 38 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 60f3b0592..926c3a488 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6229,9 +6229,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s // Collectible Items "MT_RING", "MT_FLINGRING", // Lost ring -#ifdef BLUE_SPHERES "MT_BLUEBALL", // Blue sphere replacement for special stages -#endif "MT_REDTEAMRING", //Rings collectable by red team. "MT_BLUETEAMRING", //Rings collectable by blue team. "MT_EMMY", // emerald token for special stage diff --git a/src/doomdef.h b/src/doomdef.h index 0fc4a1fea..4fd50e927 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -449,10 +449,6 @@ extern const char *compdate, *comptime, *comprevision, *compbranch; /// Polyobject fake flat code #define POLYOBJECTS_PLANES -/// Blue spheres for future use. -/// \todo Remove this define. -#define BLUE_SPHERES // Blue spheres for future use. - /// Improved way of dealing with ping values and a ping limit. #define NEWPING diff --git a/src/info.c b/src/info.c index fb19fa2b4..0eda41770 100644 --- a/src/info.c +++ b/src/info.c @@ -4569,7 +4569,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, -#ifdef BLUE_SPHERES { // MT_BLUEBALL -1, // doomednum S_BLUEBALL, // spawnstate @@ -4596,7 +4595,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = MF_SLIDEME|MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags S_NULL // raisestate }, -#endif { // MT_REDTEAMRING 308, // doomednum diff --git a/src/info.h b/src/info.h index 9596f0384..6e14448f4 100644 --- a/src/info.h +++ b/src/info.h @@ -3049,9 +3049,7 @@ typedef enum mobj_type // Collectible Items MT_RING, MT_FLINGRING, // Lost ring -#ifdef BLUE_SPHERES MT_BLUEBALL, // Blue sphere replacement for special stages -#endif MT_REDTEAMRING, //Rings collectable by red team. MT_BLUETEAMRING, //Rings collectable by blue team. MT_EMMY, // emerald token for special stage diff --git a/src/p_inter.c b/src/p_inter.c index 6ab6aaf40..b8101f12b 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -405,7 +405,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if ((maptol & TOL_NIGHTS) && special->type != MT_FLINGCOIN) P_DoNightsScore(player); break; -#ifdef BLUE_SPHERES case MT_BLUEBALL: if (!(P_CanPickupItem(player, false))) return; @@ -422,7 +421,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (maptol & TOL_NIGHTS) P_DoNightsScore(player); break; -#endif case MT_AUTOPICKUP: case MT_BOUNCEPICKUP: case MT_SCATTERPICKUP: @@ -766,10 +764,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } if (!(mo2->type == MT_NIGHTSWING || mo2->type == MT_RING || mo2->type == MT_COIN -#ifdef BLUE_SPHERES - || mo2->type == MT_BLUEBALL -#endif - )) + || mo2->type == MT_BLUEBALL)) continue; // Yay! The thing's in reach! Pull it in! diff --git a/src/p_mobj.c b/src/p_mobj.c index cb9bc775a..4e60ad612 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2188,9 +2188,7 @@ static boolean P_ZMovement(mobj_t *mo) case MT_RING: // Ignore still rings case MT_COIN: -#ifdef BLUE_SPHERES case MT_BLUEBALL: -#endif case MT_REDTEAMRING: case MT_BLUETEAMRING: case MT_FLINGRING: @@ -6479,14 +6477,12 @@ void P_MobjThinker(mobj_t *mobj) else if (mobj->health <= 0) // Dead things think differently than the living. switch (mobj->type) { -#ifdef BLUE_SPHERES case MT_BLUEBALL: if ((mobj->tics>>2)+1 > 0 && (mobj->tics>>2)+1 <= tr_trans60) // tr_trans50 through tr_trans90, shifting once every second frame mobj->frame = (NUMTRANSMAPS-((mobj->tics>>2)+1))<frame = tr_trans60<z <= mobj->floorz) { @@ -6944,9 +6940,7 @@ void P_MobjThinker(mobj_t *mobj) break; case MT_RING: case MT_COIN: -#ifdef BLUE_SPHERES case MT_BLUEBALL: -#endif case MT_REDTEAMRING: case MT_BLUETEAMRING: // No need to check water. Who cares? @@ -7712,9 +7706,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) break; case MT_RING: case MT_COIN: -#ifdef BLUE_SPHERES case MT_BLUEBALL: -#endif nummaprings++; default: break; @@ -7840,9 +7832,7 @@ void P_RemoveMobj(mobj_t *mobj) if (mobj->spawnpoint && (mobj->type == MT_RING || mobj->type == MT_COIN -#ifdef BLUE_SPHERES || mobj->type == MT_BLUEBALL -#endif || mobj->type == MT_REDTEAMRING || mobj->type == MT_BLUETEAMRING || P_WeaponOrPanel(mobj->type)) @@ -9628,11 +9618,9 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing) ringthing = (gametype == GT_CTF) ? MT_BLUETEAMRING : MT_RING; break; default: -#ifdef BLUE_SPHERES // Spawn rings as blue spheres in special stages, ala S3+K. if (G_IsSpecialStage(gamemap) && useNightsSS) ringthing = MT_BLUEBALL; -#endif break; } @@ -9697,11 +9685,9 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing) if (ultimatemode && !(G_IsSpecialStage(gamemap) || maptol & TOL_NIGHTS)) return; -#ifdef BLUE_SPHERES // Spawn rings as blue spheres in special stages, ala S3+K. if (G_IsSpecialStage(gamemap) && useNightsSS) ringthing = MT_BLUEBALL; -#endif for (r = 1; r <= 5; r++) { @@ -9752,11 +9738,9 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing) if (ultimatemode && !(G_IsSpecialStage(gamemap) || maptol & TOL_NIGHTS)) return; -#ifdef BLUE_SPHERES // Spawn rings as blue spheres in special stages, ala S3+K. if (G_IsSpecialStage(gamemap) && useNightsSS) ringthing = MT_BLUEBALL; -#endif angle >>= ANGLETOFINESHIFT; @@ -9849,11 +9833,9 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing) if (ultimatemode && !(G_IsSpecialStage(gamemap) || (maptol & TOL_NIGHTS))) continue; -#ifdef BLUE_SPHERES // Spawn rings as blue spheres in special stages, ala S3+K. if (G_IsSpecialStage(gamemap) && useNightsSS) itemToSpawn = MT_BLUEBALL; -#endif } fa = i*FINEANGLES/numitems; diff --git a/src/p_user.c b/src/p_user.c index 463937290..03b2c1dd8 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8857,10 +8857,7 @@ void P_PlayerThink(player_t *player) mo2 = (mobj_t *)th; if (!(mo2->type == MT_NIGHTSWING || mo2->type == MT_RING || mo2->type == MT_COIN -#ifdef BLUE_SPHERES - || mo2->type == MT_BLUEBALL -#endif - )) + || mo2->type == MT_BLUEBALL)) continue; if (P_AproxDistance(P_AproxDistance(mo2->x - x, mo2->y - y), mo2->z - z) > FixedMul(128*FRACUNIT, player->mo->scale)) From 5a38088623fceb0d31c43d79ab8cb42b85a635ff Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 9 Mar 2016 01:09:21 -0800 Subject: [PATCH 212/467] Well, we don't need "experimental" slopes anymore either Not when we have properly working ones! --- src/doomdef.h | 3 --- src/hardware/hw_glob.h | 2 -- src/hardware/hw_main.c | 21 ++------------------- src/p_spec.c | 25 ------------------------- src/r_defs.h | 8 -------- 5 files changed, 2 insertions(+), 57 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index 4fd50e927..a44fe4779 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -427,9 +427,6 @@ extern const char *compdate, *comptime, *comprevision, *compbranch; /// \note obsoleted by cv_maxportals //#define PORTAL_LIMIT 8 -/// Fun experimental slope stuff! -//#define SLOPENESS - /// Kalaron/Eternity Engine slope code (SRB2CB ported) #define ESLOPE diff --git a/src/hardware/hw_glob.h b/src/hardware/hw_glob.h index 83dff02f8..94eef1d3e 100644 --- a/src/hardware/hw_glob.h +++ b/src/hardware/hw_glob.h @@ -36,9 +36,7 @@ typedef struct { float x; float y; -//#ifdef SLOPENESS float z; -//#endif } polyvertex_t; #ifdef _MSC_VER diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 409900b98..58e4e87f2 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -539,6 +539,8 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi static FOutVector *planeVerts = NULL; static UINT16 numAllocedPlaneVerts = 0; + (void)sector; + // no convex poly were generated for this subsector if (!xsub->planepoly) return; @@ -678,25 +680,6 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, fixed_t fi v3d->x = pv->x; v3d->y = height; v3d->z = pv->y; -#ifdef SLOPENESS - if (sector && sector->special == 65535) - { - size_t q; - for (q = 0; q < sector->linecount; q++) - { - if (v3d->x == sector->lines[q]->v1->x>>FRACBITS) - { - if (v3d->z == sector->lines[q]->v1->y>>FRACBITS) - { - v3d->y += sector->lines[q]->v1->z>>FRACBITS; - break; - } - } - } - } -#else - (void)sector; -#endif } // only useful for flat coloured triangles diff --git a/src/p_spec.c b/src/p_spec.c index 285da0e7f..277fe19eb 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6028,31 +6028,6 @@ void P_SpawnSpecials(INT32 fromnetsave) P_AddRaiseThinker(lines[i].frontsector, &lines[i]); break; -#ifdef SLOPENESS - case 999: - sec = sides[*lines[i].sidenum].sector-sectors; - for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;) - { - size_t counting; - - sectors[s].floorangle = ANGLE_45; - for (counting = 0; counting < sectors[s].linecount/2; counting++) - { - sectors[s].lines[counting]->v1->z = sectors[sec].floorheight; - CONS_Debug(DBG_GAMELOGIC, "Set it to %d\n", sectors[s].lines[counting]->v1->z>>FRACBITS); - } - - for (counting = sectors[s].linecount/2; counting < sectors[s].linecount; counting++) - { - sectors[s].lines[counting]->v1->z = sectors[sec].ceilingheight; - CONS_Debug(DBG_GAMELOGIC, "Set it to %d\n", sectors[s].lines[counting]->v1->z>>FRACBITS); - } - sectors[s].special = 65535; - CONS_Debug(DBG_GAMELOGIC, "Found & Set slope!\n"); - } - break; -#endif - case 200: // Double light effect P_AddFakeFloorsByLine(i, FF_EXISTS|FF_CUTSPRITES|FF_DOUBLESHADOW, secthinkers); break; diff --git a/src/r_defs.h b/src/r_defs.h index f18410fe8..2915b9259 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -369,14 +369,6 @@ typedef struct sector_s double lineoutLength; #endif // ----- end special tricks ----- - // ZDoom C++ to Legacy C conversion (for slopes) - // store floor and ceiling planes instead of heights - //secplane_t floorplane, ceilingplane; -#ifdef SLOPENESS - //fixed_t floortexz, ceilingtexz; // [RH] used for wall texture mapping - angle_t floorangle; -#endif - // This points to the master's floorheight, so it can be changed in realtime! fixed_t *gravity; // per-sector gravity boolean verticalflip; // If gravity < 0, then allow flipped physics From b229cac57a997ed4617d4bae8d12989f79e2dbd1 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 9 Mar 2016 01:24:13 -0800 Subject: [PATCH 213/467] Revert "Revert "No more stupidity for No More Enemies special plz"" This reverts commit 7ae87cc2c66de2e3a23490bb090caa9febec43f8. --- src/p_floor.c | 66 +++++++++++++++++++++++++++++++++------------------ src/p_spec.c | 1 + 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 73c5281fa..ec52abeb9 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1971,51 +1971,71 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies) { size_t i; fixed_t upperbound, lowerbound; - INT32 s; - sector_t *checksector; + sector_t *sec = NULL; + sector_t *targetsec = NULL; + INT32 secnum = -1; msecnode_t *node; mobj_t *thing; - boolean exists = false; + boolean FOFsector = false; - for (i = 0; i < nobaddies->sector->linecount; i++) + while ((secnum = P_FindSectorFromLineTag(nobaddies->sourceline, secnum)) >= 0) { - if (nobaddies->sector->lines[i]->special == 223) + sec = §ors[secnum]; + + FOFsector = false; + + // Check the lines of this sector, to see if it is a FOF control sector. + for (i = 0; i < sec->linecount; i++) { + INT32 targetsecnum = -1; - upperbound = nobaddies->sector->ceilingheight; - lowerbound = nobaddies->sector->floorheight; + if (sec->lines[i]->special < 100 || sec->lines[i]->special >= 300) + continue; - for (s = -1; (s = P_FindSectorFromLineTag(nobaddies->sector->lines[i], s)) >= 0 ;) + FOFsector = true; + + while ((targetsecnum = P_FindSectorFromLineTag(sec->lines[i], targetsecnum)) >= 0) { - checksector = §ors[s]; + targetsec = §ors[targetsecnum]; - node = checksector->touching_thinglist; // things touching this sector + upperbound = targetsec->ceilingheight; + lowerbound = targetsec->floorheight; + node = targetsec->touching_thinglist; // things touching this sector while (node) { thing = node->m_thing; if ((thing->flags & (MF_ENEMY|MF_BOSS)) && thing->health > 0 - && thing->z < upperbound && thing->z+thing->height > lowerbound) - { - exists = true; - goto foundenemy; - } + && thing->z < upperbound && thing->z+thing->height > lowerbound) + return; node = node->m_snext; } } } + + if (!FOFsector) + { + upperbound = sec->ceilingheight; + lowerbound = sec->floorheight; + node = sec->touching_thinglist; // things touching this sector + while (node) + { + thing = node->m_thing; + + if ((thing->flags & (MF_ENEMY|MF_BOSS)) && thing->health > 0 + && thing->z < upperbound && thing->z+thing->height > lowerbound) + return; + + node = node->m_snext; + } + } } -foundenemy: - if (exists) - return; - s = P_AproxDistance(nobaddies->sourceline->dx, nobaddies->sourceline->dy)>>FRACBITS; + CONS_Debug(DBG_GAMELOGIC, "Running no-more-enemies exec with tag of %d\n", nobaddies->sourceline->tag); - CONS_Debug(DBG_GAMELOGIC, "Running no-more-enemies exec with tag of %d\n", s); - - // Otherwise, run the linedef exec and terminate this thinker - P_LinedefExecute((INT16)s, NULL, NULL); + // No enemies found, run the linedef exec and terminate this thinker + P_RunTriggerLinedef(nobaddies->sourceline, NULL, NULL); P_RemoveThinker(&nobaddies->thinker); } diff --git a/src/p_spec.c b/src/p_spec.c index fdbbbfdcb..7860ec59d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1891,6 +1891,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller || specialtype == 304 // Ring count - Once || specialtype == 307 // Character ability - Once || specialtype == 308 // Race only - Once + || specialtype == 313 // No More Enemies - Once || specialtype == 315 // No of pushables - Once || specialtype == 318 // Unlockable trigger - Once || specialtype == 320 // Unlockable - Once From 62b2e5c17e3e0d7ac42c2f160d96e04a42e75247 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 9 Mar 2016 01:29:58 -0800 Subject: [PATCH 214/467] Revert "Readded EvalMath to Lua." This partially reverts commit cfcd7ce0d3959bcce0e8e00cc504b1354451cb50. --- src/lua_baselib.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 640e9ac3b..807403389 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -85,14 +85,6 @@ static int lib_print(lua_State *L) return 0; } -static int lib_evalMath(lua_State *L) -{ - const char *word = luaL_checkstring(L, 1); - LUA_Deprecated(L, "EvalMath(string)", "_G[string]"); - lua_pushinteger(L, LUA_EvalMath(word)); - return 1; -} - // M_RANDOM ////////////// @@ -1911,7 +1903,6 @@ static int lib_gTicsToMilliseconds(lua_State *L) static luaL_Reg lib[] = { {"print", lib_print}, - {"EvalMath", lib_evalMath}, // m_random {"P_Random",lib_pRandom}, From b61959051ea2f1b96c525163e6c51704a8874fac Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 9 Mar 2016 01:30:52 -0800 Subject: [PATCH 215/467] Revert "Revert "MF2_PUSHED is now MFE_PUSHED..."" This reverts commit 694220155e26e63af242fa9ff457d34261425ca3. --- src/dehacked.c | 2 +- src/p_mobj.c | 3 +-- src/p_mobj.h | 38 +++++++++++++++++++------------------- src/p_spec.c | 18 +++++++++--------- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 8f654bc4c..6747f2c59 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6680,7 +6680,6 @@ static const char *const MOBJFLAG2_LIST[] = { "EXPLOSION", // Thrown ring has explosive properties "SCATTER", // Thrown ring has scatter properties "BEYONDTHEGRAVE",// Source of this missile has died and has since respawned. - "PUSHED", // Mobj was already pushed this tic "SLIDEPUSH", // MF_PUSHABLE that pushes continuously. "CLASSICPUSH", // Drops straight down when object has negative Z. "STANDONME", // While not pushable, stand on me anyway. @@ -6709,6 +6708,7 @@ static const char *const MOBJEFLAG_LIST[] = { "JUSTSTEPPEDDOWN", // used for ramp sectors "VERTICALFLIP", // Vertically flip sprite/allow upside-down physics "GOOWATER", // Goo water + "PUSHED", // Mobj was already pushed this tic "SPRUNG", // Mobj was already sprung this tic "APPLYPMOMZ", // Platform movement NULL diff --git a/src/p_mobj.c b/src/p_mobj.c index 414c91970..6ee6e5ae1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6256,8 +6256,7 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->tracer && P_MobjWasRemoved(mobj->tracer)) P_SetTarget(&mobj->tracer, NULL); - mobj->flags2 &= ~MF2_PUSHED; - mobj->eflags &= ~MFE_SPRUNG; + mobj->eflags &= ~(MFE_PUSHED|MFE_SPRUNG); tmfloorthing = tmhitthing = NULL; diff --git a/src/p_mobj.h b/src/p_mobj.h index 5cf64feb5..1dba10e4b 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -175,24 +175,23 @@ typedef enum MF2_EXPLOSION = 1<<7, // Thrown ring has explosive properties MF2_SCATTER = 1<<8, // Thrown ring has scatter properties MF2_BEYONDTHEGRAVE = 1<<9, // Source of this missile has died and has since respawned. - MF2_PUSHED = 1<<10, // Mobj was already pushed this tic - MF2_SLIDEPUSH = 1<<11, // MF_PUSHABLE that pushes continuously. - MF2_CLASSICPUSH = 1<<12, // Drops straight down when object has negative Z. - MF2_STANDONME = 1<<13, // While not pushable, stand on me anyway. - MF2_INFLOAT = 1<<14, // Floating to a height for a move, don't auto float to target's height. - MF2_DEBRIS = 1<<15, // Splash ring from explosion ring - MF2_NIGHTSPULL = 1<<16, // Attracted from a paraloop - MF2_JUSTATTACKED = 1<<17, // can be pushed by other moving mobjs - MF2_FIRING = 1<<18, // turret fire - MF2_SUPERFIRE = 1<<19, // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it. - MF2_SHADOW = 1<<20, // Fuzzy draw, makes targeting harder. - MF2_STRONGBOX = 1<<21, // Flag used for "strong" random monitors. - MF2_OBJECTFLIP = 1<<22, // Flag for objects that always have flipped gravity. - MF2_SKULLFLY = 1<<23, // Special handling: skull in flight. - MF2_FRET = 1<<24, // Flashing from a previous hit - MF2_BOSSNOTRAP = 1<<25, // No Egg Trap after boss - MF2_BOSSFLEE = 1<<26, // Boss is fleeing! - MF2_BOSSDEAD = 1<<27, // Boss is dead! (Not necessarily fleeing, if a fleeing point doesn't exist.) + MF2_SLIDEPUSH = 1<<10, // MF_PUSHABLE that pushes continuously. + MF2_CLASSICPUSH = 1<<11, // Drops straight down when object has negative Z. + MF2_STANDONME = 1<<12, // While not pushable, stand on me anyway. + MF2_INFLOAT = 1<<13, // Floating to a height for a move, don't auto float to target's height. + MF2_DEBRIS = 1<<14, // Splash ring from explosion ring + MF2_NIGHTSPULL = 1<<15, // Attracted from a paraloop + MF2_JUSTATTACKED = 1<<16, // can be pushed by other moving mobjs + MF2_FIRING = 1<<17, // turret fire + MF2_SUPERFIRE = 1<<18, // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it. + MF2_SHADOW = 1<<19, // Fuzzy draw, makes targeting harder. + MF2_STRONGBOX = 1<<20, // Flag used for "strong" random monitors. + MF2_OBJECTFLIP = 1<<21, // Flag for objects that always have flipped gravity. + MF2_SKULLFLY = 1<<22, // Special handling: skull in flight. + MF2_FRET = 1<<23, // Flashing from a previous hit + MF2_BOSSNOTRAP = 1<<24, // No Egg Trap after boss + MF2_BOSSFLEE = 1<<25, // Boss is fleeing! + MF2_BOSSDEAD = 1<<26, // Boss is dead! (Not necessarily fleeing, if a fleeing point doesn't exist.) // free: to and including 1<<31 } mobjflag2_t; @@ -232,7 +231,8 @@ typedef enum MFE_VERTICALFLIP = 1<<5, // Goo water MFE_GOOWATER = 1<<6, - // free: to and including 1<<7 + // Mobj was already pushed this tic + MFE_PUSHED = 1<<7, // Mobj was already sprung this tic MFE_SPRUNG = 1<<8, // Platform movement diff --git a/src/p_spec.c b/src/p_spec.c index 7860ec59d..c039a8672 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6443,7 +6443,7 @@ static void P_DoScrollMove(mobj_t *thing, fixed_t dx, fixed_t dy, INT32 exclusiv thing->momy += dy; if (exclusive) - thing->flags2 |= MF2_PUSHED; + thing->eflags |= MFE_PUSHED; } /** Processes an active scroller. @@ -6547,7 +6547,7 @@ void T_Scroll(scroll_t *s) { thing = node->m_thing; - if (thing->flags2 & MF2_PUSHED) // Already pushed this tic by an exclusive pusher. + if (thing->eflags & MFE_PUSHED) // Already pushed this tic by an exclusive pusher. continue; height = P_GetSpecialBottomZ(thing, sec, psec); @@ -6569,7 +6569,7 @@ void T_Scroll(scroll_t *s) { thing = node->m_thing; - if (thing->flags2 & MF2_PUSHED) + if (thing->eflags & MFE_PUSHED) continue; height = P_GetSpecialBottomZ(thing, sec, sec); @@ -6610,7 +6610,7 @@ void T_Scroll(scroll_t *s) { thing = node->m_thing; - if (thing->flags2 & MF2_PUSHED) + if (thing->eflags & MFE_PUSHED) continue; height = P_GetSpecialTopZ(thing, sec, psec); @@ -6632,7 +6632,7 @@ void T_Scroll(scroll_t *s) { thing = node->m_thing; - if (thing->flags2 & MF2_PUSHED) + if (thing->eflags & MFE_PUSHED) continue; height = P_GetSpecialTopZ(thing, sec, sec); @@ -7115,7 +7115,7 @@ static pusher_t *tmpusher; // pusher structure for blockmap searches */ static inline boolean PIT_PushThing(mobj_t *thing) { - if (thing->flags2 & MF2_PUSHED) + if (thing->eflags & MFE_PUSHED) return false; if (thing->player && thing->player->pflags & PF_ROPEHANG) @@ -7245,7 +7245,7 @@ static inline boolean PIT_PushThing(mobj_t *thing) } if (tmpusher->exclusive) - thing->flags2 |= MF2_PUSHED; + thing->eflags |= MFE_PUSHED; return true; } @@ -7348,7 +7348,7 @@ void T_Pusher(pusher_t *p) || thing->type == MT_BIGTUMBLEWEED)) continue; - if (thing->flags2 & MF2_PUSHED) + if (thing->eflags & MFE_PUSHED) continue; if (thing->player && thing->player->pflags & PF_ROPEHANG) @@ -7515,7 +7515,7 @@ void T_Pusher(pusher_t *p) } if (p->exclusive) - thing->flags2 |= MF2_PUSHED; + thing->eflags |= MFE_PUSHED; } } } From 54f95eb3877ce02eeab87cad1bf1ccd835990c83 Mon Sep 17 00:00:00 2001 From: JTE Date: Wed, 20 May 2015 23:54:04 -0400 Subject: [PATCH 216/467] Revert "Change angle_t handling in Lua." This partially reverts commit ef0e61fc3357fc8fb5367b522dd738edc96b2a7a. --- src/dehacked.c | 60 ++++++++++++++++++++++++------------------------ src/lua_script.h | 6 ++--- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index c21e8fb99..47c87eefc 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7267,36 +7267,36 @@ struct { {"FF_GOOWATER",FF_GOOWATER}, ///< Used with ::FF_SWIMMABLE. Makes thick bouncey goop. // Angles - {"ANG1",ANG1>>16}, - {"ANG2",ANG2>>16}, - {"ANG10",ANG10>>16}, - {"ANG15",ANG15>>16}, - {"ANG20",ANG20>>16}, - {"ANG30",ANG30>>16}, - {"ANG60",ANG60>>16}, - {"ANG64h",ANG64h>>16}, - {"ANG105",ANG105>>16}, - {"ANG210",ANG210>>16}, - {"ANG255",ANG255>>16}, - {"ANG340",ANG340>>16}, - {"ANG350",ANG350>>16}, - {"ANGLE_11hh",ANGLE_11hh>>16}, - {"ANGLE_22h",ANGLE_22h>>16}, - {"ANGLE_45",ANGLE_45>>16}, - {"ANGLE_67h",ANGLE_67h>>16}, - {"ANGLE_90",ANGLE_90>>16}, - {"ANGLE_112h",ANGLE_112h>>16}, - {"ANGLE_135",ANGLE_135>>16}, - {"ANGLE_157h",ANGLE_157h>>16}, - {"ANGLE_180",ANGLE_180>>16}, - {"ANGLE_202h",ANGLE_202h>>16}, - {"ANGLE_225",ANGLE_225>>16}, - {"ANGLE_247h",ANGLE_247h>>16}, - {"ANGLE_270",ANGLE_270>>16}, - {"ANGLE_292h",ANGLE_292h>>16}, - {"ANGLE_315",ANGLE_315>>16}, - {"ANGLE_337h",ANGLE_337h>>16}, - {"ANGLE_MAX",ANGLE_MAX>>16}, + {"ANG1",ANG1}, + {"ANG2",ANG2}, + {"ANG10",ANG10}, + {"ANG15",ANG15}, + {"ANG20",ANG20}, + {"ANG30",ANG30}, + {"ANG60",ANG60}, + {"ANG64h",ANG64h}, + {"ANG105",ANG105}, + {"ANG210",ANG210}, + {"ANG255",ANG255}, + {"ANG340",ANG340}, + {"ANG350",ANG350}, + {"ANGLE_11hh",ANGLE_11hh}, + {"ANGLE_22h",ANGLE_22h}, + {"ANGLE_45",ANGLE_45}, + {"ANGLE_67h",ANGLE_67h}, + {"ANGLE_90",ANGLE_90}, + {"ANGLE_112h",ANGLE_112h}, + {"ANGLE_135",ANGLE_135}, + {"ANGLE_157h",ANGLE_157h}, + {"ANGLE_180",ANGLE_180}, + {"ANGLE_202h",ANGLE_202h}, + {"ANGLE_225",ANGLE_225}, + {"ANGLE_247h",ANGLE_247h}, + {"ANGLE_270",ANGLE_270}, + {"ANGLE_292h",ANGLE_292h}, + {"ANGLE_315",ANGLE_315}, + {"ANGLE_337h",ANGLE_337h}, + {"ANGLE_MAX",ANGLE_MAX}, // P_Chase directions (dirtype_t) {"DI_NODIR",DI_NODIR}, diff --git a/src/lua_script.h b/src/lua_script.h index ec67703c3..b4b668ce7 100644 --- a/src/lua_script.h +++ b/src/lua_script.h @@ -30,9 +30,9 @@ #define lua_pushfixed(L, f) lua_pushinteger(L, f) // angle_t casting -// we reduce the angle to a fixed point between 0.0 and 1.0 -#define luaL_checkangle(L, i) (((angle_t)(luaL_checkfixed(L, i)&0xFFFF))<<16) -#define lua_pushangle(L, a) lua_pushfixed(L, a>>16) +// TODO deal with signedness +#define luaL_checkangle(L, i) ((angle_t)luaL_checkinteger(L, i)) +#define lua_pushangle(L, a) lua_pushinteger(L, a) #ifdef _DEBUG void LUA_ClearExtVars(void); From 280e932f02c64a8ac3d01bd89e5e578938d32363 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Wed, 9 Mar 2016 13:38:30 +0000 Subject: [PATCH 217/467] Shifted down the last few mobj eflags to close gap left by MF2_PUSHED -> MFE_PUSHED undo --- src/p_mobj.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/p_mobj.h b/src/p_mobj.h index e24b09652..44b3ceeec 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -232,11 +232,10 @@ typedef enum MFE_VERTICALFLIP = 1<<5, // Goo water MFE_GOOWATER = 1<<6, - // free: to and including 1<<7 // Mobj was already sprung this tic - MFE_SPRUNG = 1<<8, + MFE_SPRUNG = 1<<7, // Platform movement - MFE_APPLYPMOMZ = 1<<9, + MFE_APPLYPMOMZ = 1<<8, // free: to and including 1<<15 } mobjeflag_t; From bf415b8618c51f7826cb76ab91fe4a0003c3d238 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Wed, 9 Mar 2016 13:59:10 +0000 Subject: [PATCH 218/467] Revert "Shifted down the last few mobj eflags to close gap left by MF2_PUSHED -> MFE_PUSHED undo" This reverts commit 280e932f02c64a8ac3d01bd89e5e578938d32363. --- src/p_mobj.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.h b/src/p_mobj.h index 44b3ceeec..e24b09652 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -232,10 +232,11 @@ typedef enum MFE_VERTICALFLIP = 1<<5, // Goo water MFE_GOOWATER = 1<<6, + // free: to and including 1<<7 // Mobj was already sprung this tic - MFE_SPRUNG = 1<<7, + MFE_SPRUNG = 1<<8, // Platform movement - MFE_APPLYPMOMZ = 1<<8, + MFE_APPLYPMOMZ = 1<<9, // free: to and including 1<<15 } mobjeflag_t; From 4625118ee863b43a3c8828c79879f92ff649b850 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Wed, 9 Mar 2016 14:03:20 +0000 Subject: [PATCH 219/467] MFE_DUMMY now exists to fill the slot where MFE_PUSHED was, bleh --- src/dehacked.c | 1 + src/p_mobj.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index 926c3a488..31cf37636 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6711,6 +6711,7 @@ static const char *const MOBJEFLAG_LIST[] = { "JUSTSTEPPEDDOWN", // used for ramp sectors "VERTICALFLIP", // Vertically flip sprite/allow upside-down physics "GOOWATER", // Goo water + "DUMMY", // free: 1<<7 "SPRUNG", // Mobj was already sprung this tic "APPLYPMOMZ", // Platform movement NULL diff --git a/src/p_mobj.h b/src/p_mobj.h index e24b09652..3979b1304 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -232,7 +232,8 @@ typedef enum MFE_VERTICALFLIP = 1<<5, // Goo water MFE_GOOWATER = 1<<6, - // free: to and including 1<<7 + // free: 1<<7 + MFE_DUMMY = 1<<7, // Mobj was already sprung this tic MFE_SPRUNG = 1<<8, // Platform movement From f40cfb0271a5945a736c6edafd012174b09f71e8 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 9 Mar 2016 06:22:40 -0800 Subject: [PATCH 220/467] Revert "MFE_DUMMY now exists to fill the slot where MFE_PUSHED was, bleh" This reverts commit 4625118ee863b43a3c8828c79879f92ff649b850. --- src/dehacked.c | 1 - src/p_mobj.h | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 31cf37636..926c3a488 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6711,7 +6711,6 @@ static const char *const MOBJEFLAG_LIST[] = { "JUSTSTEPPEDDOWN", // used for ramp sectors "VERTICALFLIP", // Vertically flip sprite/allow upside-down physics "GOOWATER", // Goo water - "DUMMY", // free: 1<<7 "SPRUNG", // Mobj was already sprung this tic "APPLYPMOMZ", // Platform movement NULL diff --git a/src/p_mobj.h b/src/p_mobj.h index 3979b1304..e24b09652 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -232,8 +232,7 @@ typedef enum MFE_VERTICALFLIP = 1<<5, // Goo water MFE_GOOWATER = 1<<6, - // free: 1<<7 - MFE_DUMMY = 1<<7, + // free: to and including 1<<7 // Mobj was already sprung this tic MFE_SPRUNG = 1<<8, // Platform movement From a7cb049b65ddd126c1532d4a5f13dbba35942947 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 9 Mar 2016 06:23:57 -0800 Subject: [PATCH 221/467] leave a dummy string in dehacked, nothing more. a courtesy fuck you to gitlab for making me have to keep the previous screwed up bullshit in this branch. --- src/dehacked.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dehacked.c b/src/dehacked.c index 926c3a488..61bccb4f6 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6711,6 +6711,7 @@ static const char *const MOBJEFLAG_LIST[] = { "JUSTSTEPPEDDOWN", // used for ramp sectors "VERTICALFLIP", // Vertically flip sprite/allow upside-down physics "GOOWATER", // Goo water + "\x01", // free: 1<<7 (name un-matchable) "SPRUNG", // Mobj was already sprung this tic "APPLYPMOMZ", // Platform movement NULL From 83e9eb6df4a0e75b3dbc958d4d0f482a7059e314 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 9 Mar 2016 18:30:11 -0800 Subject: [PATCH 222/467] patch.dta officially in use. Version number updated. --- src/config.h.in | 8 ++++++++ src/d_main.c | 18 +++++++++++++----- src/doomdef.h | 12 ++++++++---- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/config.h.in b/src/config.h.in index 5cd75fa5a..eef4fec13 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -15,7 +15,9 @@ #define ASSET_HASH_PLAYER_DTA "${SRB2_ASSET_player.dta_HASH}" #define ASSET_HASH_RINGS_DTA "${SRB2_ASSET_rings.dta_HASH}" #define ASSET_HASH_ZONES_DTA "${SRB2_ASSET_zones.dta_HASH}" +#ifdef USE_PATCH_DTA #define ASSET_HASH_PATCH_DTA "${SRB2_ASSET_patch.dta_HASH}" +#endif #define SRB2_COMP_REVISION "${SRB2_COMP_REVISION}" #define SRB2_COMP_BRANCH "${SRB2_COMP_BRANCH}" @@ -26,10 +28,16 @@ #else +/* Manually defined asset hashes for non-CMake builds + * Last updated 2000 / 00 / 00 + */ #define ASSET_HASH_SRB2_SRB "c1b9577687f8a795104aef4600720ea7" #define ASSET_HASH_ZONES_DTA "303838c6c534d9540288360fa49cca60" #define ASSET_HASH_PLAYER_DTA "cfca0f1c73023cbbd8f844f45480f799" #define ASSET_HASH_RINGS_DTA "85901ad4bf94637e5753d2ac2c03ea26" +#ifdef USE_PATCH_DTA +#define ASSET_HASH_PATCH_DTA "0c66790502e648bfce90fdc5bb15722e" +#endif #endif #endif diff --git a/src/d_main.c b/src/d_main.c index 3918d8118..1349a64e4 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -841,8 +841,10 @@ static void IdentifyVersion(void) // Add the weapons D_AddFile(va(pandf,srb2waddir,"rings.dta")); +#ifdef USE_PATCH_DTA // Add our crappy patches to fix our bugs - // D_AddFile(va(pandf,srb2waddir,"patch.dta")); + D_AddFile(va(pandf,srb2waddir,"patch.dta")); +#endif #if !defined (HAVE_SDL) || defined (HAVE_MIXER) { @@ -1133,12 +1135,18 @@ void D_SRB2Main(void) W_VerifyFileMD5(1, ASSET_HASH_ZONES_DTA); // zones.dta W_VerifyFileMD5(2, ASSET_HASH_PLAYER_DTA); // player.dta W_VerifyFileMD5(3, ASSET_HASH_RINGS_DTA); // rings.dta - //W_VerifyFileMD5(4, "0c66790502e648bfce90fdc5bb15722e"); // patch.dta - // don't check music.dta because people like to modify it, and it doesn't matter if they do - // ...except it does if they slip maps in there, and that's what W_VerifyNMUSlumps is for. +#ifdef USE_PATCH_DTA + W_VerifyFileMD5(4, ASSET_HASH_PATCH_DTA); // patch.dta #endif - mainwads = 4; // there are 5 wads not to unload + // don't check music.dta because people like to modify it, and it doesn't matter if they do + // ...except it does if they slip maps in there, and that's what W_VerifyNMUSlumps is for. +#endif //ifndef DEVELOP + + mainwads = 4; // there are 4 wads not to unload +#ifdef USE_PATCH_DTA + ++mainwads; // patch.dta adds one more +#endif cht_Init(); diff --git a/src/doomdef.h b/src/doomdef.h index a44fe4779..c3a0bfa6e 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -148,13 +148,17 @@ extern FILE *logstream; // we use comprevision and compbranch instead. #else #define VERSION 201 // Game version -#define SUBVERSION 14 // more precise version number -#define VERSIONSTRING "v2.1.14" -#define VERSIONSTRINGW L"v2.1.14" +#define SUBVERSION 15 // more precise version number +#define VERSIONSTRING "v2.1.15" +#define VERSIONSTRINGW L"v2.1.15" // Hey! If you change this, add 1 to the MODVERSION below! // Otherwise we can't force updates! #endif +// Does this version require an added patch file? +// Comment or uncomment this as necessary. +#define USE_PATCH_DTA + // Modification options // If you want to take advantage of the Master Server's ability to force clients to update // to the latest version, fill these out. Otherwise, just comment out UPDATE_ALERT and leave @@ -208,7 +212,7 @@ extern FILE *logstream; // it's only for detection of the version the player is using so the MS can alert them of an update. // Only set it higher, not lower, obviously. // Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1". -#define MODVERSION 19 +#define MODVERSION 20 // ========================================================================= From 5b89164cf7e4ada2ac999ed41d163059c2a1ec76 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Thu, 10 Mar 2016 20:50:54 +0000 Subject: [PATCH 223/467] Fix camera going nuts around intangible polyobjects --- src/p_map.c | 2 +- src/p_user.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 61d57dcd1..5c5d9cdfd 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1616,7 +1616,7 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam) po->validcount = validcount; - if (!P_PointInsidePolyobj(po, x, y)) + if (!P_PointInsidePolyobj(po, x, y) || !(po->flags & POF_SOLID)) { plink = (polymaplink_t *)(plink->link.next); continue; diff --git a/src/p_user.c b/src/p_user.c index 03b2c1dd8..c08eea5c6 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8163,7 +8163,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall po->validcount = validcount; - if (!P_PointInsidePolyobj(po, x, y)) + if (!P_PointInsidePolyobj(po, x, y) || !(po->flags & POF_SOLID)) { plink = (polymaplink_t *)(plink->link.next); continue; From 509516f59f2711856c0edbbacbf6f3fa11de8b36 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Thu, 10 Mar 2016 16:38:06 -0500 Subject: [PATCH 224/467] travis: enable apt and ccache cache --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index c652584f8..5815e711f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,8 @@ compiler: - clang cache: + apt: true + ccache: true directories: - $HOME/srb2_cache From c67683eb0af0351396a93120b3f14199964ac983 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 12 Mar 2016 19:59:32 +0000 Subject: [PATCH 225/467] Fixed slope walls displaying sprites through them if they weren't completely above you Sadly this does not fix ALL sprite issues, but just some of them at the least --- src/r_segs.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/r_segs.c b/src/r_segs.c index e31d570b6..fdae62d50 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1859,7 +1859,10 @@ void R_StoreWallRange(INT32 start, INT32 stop) { ds_p->silhouette = SIL_BOTTOM; #ifdef ESLOPE - ds_p->bsilheight = (frontsector->f_slope ? INT32_MAX : frontsector->floorheight); + if ((backsector->f_slope ? P_GetZAt(backsector->f_slope, viewx, viewy) : backsector->floorheight) > viewz) + ds_p->bsilheight = INT32_MAX; + else + ds_p->bsilheight = (frontsector->f_slope ? INT32_MAX : frontsector->floorheight); #else ds_p->bsilheight = frontsector->floorheight; #endif @@ -1883,7 +1886,10 @@ void R_StoreWallRange(INT32 start, INT32 stop) { ds_p->silhouette |= SIL_TOP; #ifdef ESLOPE - ds_p->tsilheight = (frontsector->c_slope ? INT32_MIN : frontsector->ceilingheight); + if ((backsector->c_slope ? P_GetZAt(backsector->c_slope, viewx, viewy) : backsector->ceilingheight) < viewz) + ds_p->tsilheight = INT32_MIN; + else + ds_p->tsilheight = (frontsector->c_slope ? INT32_MIN : frontsector->ceilingheight); #else ds_p->tsilheight = frontsector->ceilingheight; #endif From accab7da6a05f79f5ea0e3d2db4a76ff4052f8da Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 12 Mar 2016 23:03:56 +0000 Subject: [PATCH 226/467] Fixed precipitation not checking for slopes --- src/p_mobj.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index f074917bf..90a7daa9b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3710,10 +3710,15 @@ static void CalculatePrecipFloor(precipmobj_t *mobj) mobjsecsubsec = mobj->subsector->sector; else return; - mobj->floorz = mobjsecsubsec->floorheight; + mobj->floorz = +#ifdef ESLOPE + mobjsecsubsec->f_slope ? P_GetZAt(mobjsecsubsec->f_slope, mobj->x, mobj->y) : +#endif + mobjsecsubsec->floorheight; if (mobjsecsubsec->ffloors) { ffloor_t *rover; + fixed_t topheight; for (rover = mobjsecsubsec->ffloors; rover; rover = rover->next) { @@ -3724,8 +3729,15 @@ static void CalculatePrecipFloor(precipmobj_t *mobj) if (!(rover->flags & FF_BLOCKOTHERS) && !(rover->flags & FF_SWIMMABLE)) continue; - if (*rover->topheight > mobj->floorz) - mobj->floorz = *rover->topheight; +#ifdef ESLOPE + if (*rover->t_slope) + topheight = P_GetZAt(*rover->t_slope, mobj->x, mobj->y); + else +#endif + topheight = *rover->topheight; + + if (topheight > mobj->floorz) + mobj->floorz = topheight; } } } @@ -7768,6 +7780,7 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype { state_t *st; precipmobj_t *mobj = Z_Calloc(sizeof (*mobj), PU_LEVEL, NULL); + fixed_t starting_floorz; mobj->x = x; mobj->y = y; @@ -7786,8 +7799,16 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype // set subsector and/or block links P_SetPrecipitationThingPosition(mobj); - mobj->floorz = mobj->subsector->sector->floorheight; - mobj->ceilingz = mobj->subsector->sector->ceilingheight; + mobj->floorz = starting_floorz = +#ifdef ESLOPE + mobj->subsector->sector->f_slope ? P_GetZAt(mobj->subsector->sector->f_slope, x, y) : +#endif + mobj->subsector->sector->floorheight; + mobj->ceilingz = +#ifdef ESLOPE + mobj->subsector->sector->c_slope ? P_GetZAt(mobj->subsector->sector->c_slope, x, y) : +#endif + mobj->subsector->sector->ceilingheight; mobj->z = z; mobj->momz = mobjinfo[type].speed; @@ -7797,7 +7818,7 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype CalculatePrecipFloor(mobj); - if (mobj->floorz != mobj->subsector->sector->floorheight) + if (mobj->floorz != starting_floorz) mobj->precipflags |= PCF_FOF; else if (GETSECSPECIAL(mobj->subsector->sector->special, 1) == 7 || GETSECSPECIAL(mobj->subsector->sector->special, 1) == 6 From f9949a3026a7ac965c036a2e7c12bbc9f5627a4b Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Mon, 14 Mar 2016 12:24:51 -0400 Subject: [PATCH 227/467] dropping NOVERSION, you will not build SRB2 without a SCM --- src/Makefile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Makefile b/src/Makefile index d4cc64a4b..8520d8d5e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -262,9 +262,7 @@ else OBJS+=$(OBJDIR)/hw3sound.o endif -ifndef NOVERSION OPTS += -DCOMPVERSION -endif ifndef NONX86 ifndef GCC29 @@ -550,9 +548,6 @@ cleandep: $(REMOVE) comptime.h pre-build: -ifdef NOVERSION - -@touch comptime.c -else ifdef WINDOWSHELL -..\comptime.bat . else From f5b56f2a076e89a59ad6fdcdb6e4c2e26f02c3e1 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Mon, 14 Mar 2016 12:28:22 -0400 Subject: [PATCH 228/467] fixup --- src/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index 8520d8d5e..701cdcfb1 100644 --- a/src/Makefile +++ b/src/Makefile @@ -553,7 +553,6 @@ ifdef WINDOWSHELL else -@../comptime.sh . endif -endif clean: $(REMOVE) *~ *.flc From 2ecdd9e6f9ea891c7cead7f3331b1b626df2681b Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 14 Jan 2016 04:31:48 -0800 Subject: [PATCH 229/467] Branch and revision information in builds Also makes comptime.bat work with git if able. Development builds will now show the branch and the SHA1 hash of the revision. Also been tested to work with subversion, where it displays "Subversion r####". You know, just in case. --- comptime.bat | 28 ++++++++++++++++++++++++---- comptime.sh | 10 +++++++--- src/comptime.c | 2 ++ src/d_netcmd.c | 4 ++++ src/doomdef.h | 7 +++++-- src/m_menu.c | 9 ++++++--- src/m_misc.c | 10 ++++------ 7 files changed, 52 insertions(+), 18 deletions(-) diff --git a/comptime.bat b/comptime.bat index 23ee7ea55..b8450ff64 100644 --- a/comptime.bat +++ b/comptime.bat @@ -1,10 +1,30 @@ @ECHO OFF -set REV=Unknown +set BRA=Unknown +set REV=illegal + copy nul: /b +%1\comptime.c tmp.$$$ > nul move tmp.$$$ %1\comptime.c > nul -SET REV=illegal -FOR /F "usebackq" %%s IN (`svnversion %1`) DO @SET REV=%%s + +if exist .git goto gitrev +if exist .svn goto svnrev +goto filwri + +:gitrev +set GIT=%2 +if "%GIT%"=="" set GIT=git +FOR /F "usebackq" %%s IN (`%GIT% rev-parse --abbrev-ref HEAD`) DO @SET BRA=%%s +FOR /F "usebackq" %%s IN (`%GIT% rev-parse HEAD`) DO @SET REV=%%s +set REV=%REV:~0,8% +goto filwri + +:svnrev +set BRA=Subversion +FOR /F "usebackq" %%s IN (`svnversion .`) DO @SET REV=%%s +goto filwri + +:filwri ECHO // Do not edit! This file was autogenerated > %1\comptime.h ECHO // by the %0 batch file >> %1\comptime.h ECHO // >> %1\comptime.h -ECHO const char* comprevision = "r%REV%"; >> %1\comptime.h +ECHO const char* compbranch = "%BRA%"; >> %1\comptime.h +ECHO const char* comprevision = "%REV%"; >> %1\comptime.h diff --git a/comptime.sh b/comptime.sh index 703bb2d35..71c5f08aa 100755 --- a/comptime.sh +++ b/comptime.sh @@ -5,13 +5,15 @@ if [ x"$1" != x ]; then fi versiongit() { - gitversion=`git describe` + gitbranch=`git rev-parse --abbrev-ref HEAD` + gitversion=`git rev-parse HEAD` cat < $path/comptime.h // Do not edit! This file was autogenerated -// by the $0 script with git svn +// by the $0 script with git // -const char* comprevision = "$gitversion"; +const char* compbranch = "$gitbranch"; +const char* comprevision = "${gitversion:0:8}"; EOF exit 0 } @@ -23,6 +25,7 @@ versionsvn() { // Do not edit! This file was autogenerated // by the $0 script with subversion // +const char* compbranch = "Subversion"; const char* comprevision = "r$svnrevision"; EOF exit 0 @@ -34,6 +37,7 @@ versionfake() { // Do not edit! This file was autogenerated // by the $0 script with an unknown or nonexist SCM // +const char* compbranch = "Unknown"; const char* comprevision = "illegal"; EOF } diff --git a/src/comptime.c b/src/comptime.c index a4dc5b0f9..9f1fe2f71 100644 --- a/src/comptime.c +++ b/src/comptime.c @@ -9,12 +9,14 @@ #if (defined(CMAKECONFIG)) #include "config.h" +const char *compbranch = ""; // hell if I know what to do with cmake const char *comprevision = SRB2_COMP_REVISION; #elif (defined(COMPVERSION)) #include "comptime.h" #else +const char *compbranch = "Unknown"; const char *comprevision = "illegal"; #endif diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 266161c7c..30208422f 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3179,7 +3179,11 @@ static void Command_ListWADS_f(void) */ static void Command_Version_f(void) { +#ifdef DEVELOP + CONS_Printf("Sonic Robo Blast 2 %s-%s (%s %s)\n", compbranch, comprevision, compdate, comptime); +#else CONS_Printf("Sonic Robo Blast 2 %s (%s %s %s)\n", VERSIONSTRING, compdate, comptime, comprevision); +#endif } #ifdef UPDATE_ALERT diff --git a/src/doomdef.h b/src/doomdef.h index e4b426ebc..fe7fad8ae 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -141,7 +141,10 @@ extern FILE *logstream; #if 0 #define VERSION 0 // Game version #define SUBVERSION 0 // more precise version number -#define VERSIONSTRING "Trunk" +#define VERSIONSTRING "Development EXE" +#define VERSIONSTRINGW L"Development EXE" +// most interface strings are ignored in development mode. +// we use comprevision and compbranch instead. #else #define VERSION 201 // Game version #define SUBVERSION 14 // more precise version number @@ -413,7 +416,7 @@ INT32 I_GetKey(void); #endif // Compile date and time and revision. -extern const char *compdate, *comptime, *comprevision; +extern const char *compdate, *comptime, *comprevision, *compbranch; // Disabled code and code under testing // None of these that are disabled in the normal build are guaranteed to work perfectly diff --git a/src/m_menu.c b/src/m_menu.c index 1e7745535..780de7ad5 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2463,11 +2463,14 @@ void M_Drawer(void) V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, customversionstring); } else -#if VERSION > 0 || SUBVERSION > 0 + { +#ifdef DEVELOP // Development -- show revision / branch info + V_DrawThinString(vid.dupx, vid.height - 17*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, compbranch); + V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, comprevision); +#else // Regular build V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s", VERSIONSTRING)); -#else // Trunk build, show revision info - V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s (%s)", VERSIONSTRING, comprevision)); #endif + } } } diff --git a/src/m_misc.c b/src/m_misc.c index 21728792f..22effdddf 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -1800,16 +1800,14 @@ UINT8 M_HighestBit(UINT32 num) const char *GetRevisionString(void) { - INT32 vinfo; - static char rev[8] = {0}; + static char rev[9] = {0}; if (rev[0]) return rev; - vinfo = atoi(&comprevision[1]); - if (vinfo) - snprintf(rev, 7, "r%d", vinfo); + if (comprevision[0] == 'r') + strncpy(rev, comprevision, 7); else - strcpy(rev, "rNULL"); + snprintf(rev, 7, "r%s", comprevision); rev[7] = '\0'; return rev; From 7e174290d7e2ade1a3dde14a77e9ab6e6a48bec0 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 14 Jan 2016 04:36:27 -0800 Subject: [PATCH 230/467] SVN needs the revision prefixed with 'r' --- comptime.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/comptime.bat b/comptime.bat index b8450ff64..119b3bb5c 100644 --- a/comptime.bat +++ b/comptime.bat @@ -20,6 +20,7 @@ goto filwri :svnrev set BRA=Subversion FOR /F "usebackq" %%s IN (`svnversion .`) DO @SET REV=%%s +set REV=r%REV% goto filwri :filwri From 2f21c24d7703732a3e9a209991240d3850300484 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sat, 16 Jan 2016 11:35:34 -0800 Subject: [PATCH 231/467] Makefile can run comptime.bat from src\ too --- comptime.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/comptime.bat b/comptime.bat index 119b3bb5c..9e127f001 100644 --- a/comptime.bat +++ b/comptime.bat @@ -6,6 +6,7 @@ copy nul: /b +%1\comptime.c tmp.$$$ > nul move tmp.$$$ %1\comptime.c > nul if exist .git goto gitrev +if exist ..\.git goto gitrev if exist .svn goto svnrev goto filwri From 873fa10fe192ffc4a545b4fa129153f13ca311c4 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Mon, 14 Mar 2016 17:47:02 -0400 Subject: [PATCH 232/467] comptime.bat: Windows 8.1 sucks --- comptime.bat | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/comptime.bat b/comptime.bat index 9e127f001..9028e2888 100644 --- a/comptime.bat +++ b/comptime.bat @@ -1,4 +1,3 @@ -@ECHO OFF set BRA=Unknown set REV=illegal @@ -13,20 +12,20 @@ goto filwri :gitrev set GIT=%2 if "%GIT%"=="" set GIT=git -FOR /F "usebackq" %%s IN (`%GIT% rev-parse --abbrev-ref HEAD`) DO @SET BRA=%%s -FOR /F "usebackq" %%s IN (`%GIT% rev-parse HEAD`) DO @SET REV=%%s +for /f "usebackq" %%s in (`%GIT% rev-parse --abbrev-ref HEAD`) do @set BRA=%%s +for /f "usebackq" %%s in (`%GIT% rev-parse HEAD`) do @set REV=%%s set REV=%REV:~0,8% goto filwri :svnrev set BRA=Subversion -FOR /F "usebackq" %%s IN (`svnversion .`) DO @SET REV=%%s +for /f "usebackq" %%s in (`svnversion .`) do @set REV=%%s set REV=r%REV% goto filwri :filwri -ECHO // Do not edit! This file was autogenerated > %1\comptime.h -ECHO // by the %0 batch file >> %1\comptime.h -ECHO // >> %1\comptime.h -ECHO const char* compbranch = "%BRA%"; >> %1\comptime.h -ECHO const char* comprevision = "%REV%"; >> %1\comptime.h +echo // Do not edit! This file was autogenerated > %1\comptime.h +echo // by the %0 batch file >> %1\comptime.h +echo // >> %1\comptime.h +echo const char* compbranch = "%BRA%"; >> %1\comptime.h +echo const char* comprevision = "%REV%"; >> %1\comptime.h From bbe93a6d31d9d9f7ac1c77c60800e9c2f2f5d810 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Mon, 14 Mar 2016 20:36:37 -0500 Subject: [PATCH 233/467] comptime.bat: Put @echo off back in --- comptime.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/comptime.bat b/comptime.bat index 9028e2888..0c7ea06d6 100644 --- a/comptime.bat +++ b/comptime.bat @@ -1,3 +1,4 @@ +@echo off set BRA=Unknown set REV=illegal From c4e54d52e704ae16835237b039253c3428295547 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Mon, 14 Mar 2016 21:54:53 -0400 Subject: [PATCH 234/467] comptime.bat: restore echo off --- comptime.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/comptime.bat b/comptime.bat index 9028e2888..0c7ea06d6 100644 --- a/comptime.bat +++ b/comptime.bat @@ -1,3 +1,4 @@ +@echo off set BRA=Unknown set REV=illegal From 5dd0e533b37e980c273901d137f17061c70ec6dd Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Tue, 15 Mar 2016 21:18:25 +0000 Subject: [PATCH 235/467] Removed unused "supdate" variable --- src/d_main.c | 2 -- src/d_main.h | 1 - 2 files changed, 3 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index a959a8632..0a3fae3b5 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -509,7 +509,6 @@ static void D_Display(void) // ========================================================================= tic_t rendergametic; -boolean supdate; void D_SRB2Loop(void) { @@ -600,7 +599,6 @@ void D_SRB2Loop(void) // Update display, next frame, with current state. D_Display(); - supdate = false; if (moviemode) M_SaveFrame(); diff --git a/src/d_main.h b/src/d_main.h index 800b61f53..c5ce19ef4 100644 --- a/src/d_main.h +++ b/src/d_main.h @@ -17,7 +17,6 @@ #include "d_event.h" #include "w_wad.h" // for MAX_WADFILES -extern boolean supdate; extern boolean advancedemo; // make sure not to write back the config until it's been correctly loaded From e941687d4c0ebe229415da976c9a830ef0413f70 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Fri, 18 Mar 2016 20:33:16 +0000 Subject: [PATCH 236/467] R_RenderMaskedSegRange now checks for slopes in the sector lightlist in other words, midtexture rendering should now correctly account for slopes from FOFs that could affect lighting/colormap --- src/r_segs.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/r_segs.c b/src/r_segs.c index fdae62d50..72315982d 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -360,10 +360,30 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) for (i = 0; i < dc_numlights; i++) { +#ifdef ESLOPE + fixed_t leftheight, rightheight; +#endif light = &frontsector->lightlist[i]; rlight = &dc_lightlist[i]; +#ifdef ESLOPE + if (light->slope) { + leftheight = P_GetZAt(light->slope, ds->leftpos.x, ds->leftpos.y); + rightheight = P_GetZAt(light->slope, ds->rightpos.x, ds->rightpos.y); + } else + leftheight = rightheight = light->height; + + leftheight -= viewz; + rightheight -= viewz; + + rlight->height = (centeryfrac) - FixedMul(leftheight, ds->scale1); + rlight->heightstep = (centeryfrac) - FixedMul(rightheight, ds->scale2); + rlight->heightstep = (rlight->heightstep-rlight->height)/(ds->x2-ds->x1+1); + //if (x1 > ds->x1) + //rlight->height -= (x1 - ds->x1)*rlight->heightstep; +#else rlight->height = (centeryfrac) - FixedMul((light->height - viewz), spryscale); rlight->heightstep = -FixedMul(rw_scalestep, (light->height - viewz)); +#endif rlight->lightlevel = *light->lightlevel; rlight->extra_colormap = light->extra_colormap; rlight->flags = light->flags; From 6623a9148e98ecdbeb6d0abff2ea80b728dd8f07 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Fri, 18 Mar 2016 23:58:58 +0000 Subject: [PATCH 237/467] Fix HOMs by actually bothering to check if either side of a seg has slopes for height-checking code --- src/r_bsp.c | 72 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/src/r_bsp.c b/src/r_bsp.c index c87d8baa7..cd32b7863 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -460,26 +460,64 @@ static void R_AddLine(seg_t *line) // Closed door. #ifdef ESLOPE - // Just don't bother checking this if one side is sloped. This is probably inefficient, but it's better than - // random renderer stopping around slopes... - if (!(frontsector->f_slope || frontsector->c_slope || backsector->f_slope || backsector->c_slope)) -#endif - if (backsector->ceilingheight <= frontsector->floorheight - || backsector->floorheight >= frontsector->ceilingheight) + if (frontsector->f_slope || frontsector->c_slope || backsector->f_slope || backsector->c_slope) { - goto clipsolid; + fixed_t frontf1,frontf2, frontc1, frontc2; // front floor/ceiling ends + fixed_t backf1, backf2, backc1, backc2; // back floor ceiling ends +#define SLOPEPARAMS(slope, end1, end2, normalheight) \ + if (slope) { \ + end1 = P_GetZAt(slope, line->v1->x, line->v1->y); \ + end2 = P_GetZAt(slope, line->v2->x, line->v2->y); \ + } else \ + end1 = end2 = normalheight; + + SLOPEPARAMS(frontsector->f_slope, frontf1, frontf2, frontsector->floorheight) + SLOPEPARAMS(frontsector->c_slope, frontc1, frontc2, frontsector->ceilingheight) + SLOPEPARAMS( backsector->f_slope, backf1, backf2, backsector->floorheight) + SLOPEPARAMS( backsector->c_slope, backc1, backc2, backsector->ceilingheight) +#undef SLOPEPARAMS + if ((backc1 <= frontf1 && backc2 <= frontf2) + || (backf1 >= frontc1 && backf2 >= frontc2)) + { + goto clipsolid; + } + + // Check for automap fix. Store in doorclosed for r_segs.c + doorclosed = (backc1 <= backf1 && backc2 <= backf2 + && ((backc1 >= frontc1 && backc2 >= frontc2) || curline->sidedef->toptexture) + && ((backf1 <= frontf1 && backf2 >= frontf2) || curline->sidedef->bottomtexture) + && (backsector->ceilingpic != skyflatnum || frontsector->ceilingpic != skyflatnum)); + + if (doorclosed) + goto clipsolid; + + // Window. + if (backc1 != frontc1 || backc2 != frontc2 + || backf1 != frontf1 || backf2 != frontf2) + { + goto clippass; + } } - - // Check for automap fix. Store in doorclosed for r_segs.c - doorclosed = R_DoorClosed(); - if (doorclosed) - goto clipsolid; - - // Window. - if (backsector->ceilingheight != frontsector->ceilingheight - || backsector->floorheight != frontsector->floorheight) + else +#endif { - goto clippass; + if (backsector->ceilingheight <= frontsector->floorheight + || backsector->floorheight >= frontsector->ceilingheight) + { + goto clipsolid; + } + + // Check for automap fix. Store in doorclosed for r_segs.c + doorclosed = R_DoorClosed(); + if (doorclosed) + goto clipsolid; + + // Window. + if (backsector->ceilingheight != frontsector->ceilingheight + || backsector->floorheight != frontsector->floorheight) + { + goto clippass; + } } // Reject empty lines used for triggers and special events. From a82c19adb1cb68e78f7eeb12e09e2c58d99f0cb1 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 19 Mar 2016 16:19:58 +0000 Subject: [PATCH 238/467] Fix sprites displaying behind "closed doors" when slopes are present. For the record, thok barriers count as "closed doors" in SRB2 level contexts --- src/r_segs.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/r_segs.c b/src/r_segs.c index 72315982d..9ecb7708e 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1947,21 +1947,25 @@ void R_StoreWallRange(INT32 start, INT32 stop) ds_p->silhouette |= SIL_TOP; } -#ifdef ESLOPE - // This causes issues with slopes. - if (!(frontsector->f_slope || frontsector->c_slope || backsector->f_slope || backsector->c_slope)) -#endif //SoM: 3/25/2000: This code fixes an automap bug that didn't check // frontsector->ceiling and backsector->floor to see if a door was closed. // Without the following code, sprites get displayed behind closed doors. { +#ifdef ESLOPE + if (doorclosed || (worldhigh <= worldbottom && worldhighslope <= worldbottomslope)) +#else if (doorclosed || backsector->ceilingheight <= frontsector->floorheight) +#endif { ds_p->sprbottomclip = negonearray; ds_p->bsilheight = INT32_MAX; ds_p->silhouette |= SIL_BOTTOM; } +#ifdef ESLOPE + if (doorclosed || (worldlow >= worldtop && worldlowslope >= worldtopslope)) +#else if (doorclosed || backsector->floorheight >= frontsector->ceilingheight) +#endif { // killough 1/17/98, 2/8/98 ds_p->sprtopclip = screenheightarray; ds_p->tsilheight = INT32_MIN; From 28631c30b70f89e337f8bd0a4ca9c0d5e3de59a7 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 19 Mar 2016 22:25:49 +0000 Subject: [PATCH 239/467] Fix maskedtextureheight being set outside of ESLOPE code --- src/r_segs.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/r_segs.c b/src/r_segs.c index 9ecb7708e..9689f43df 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1555,9 +1555,8 @@ void R_StoreWallRange(INT32 start, INT32 stop) #endif static size_t maxdrawsegs = 0; - maskedtextureheight = NULL; - #ifdef ESLOPE + maskedtextureheight = NULL; //initialize segleft and segright memset(&segleft, 0x00, sizeof(segleft)); memset(&segright, 0x00, sizeof(segright)); From ec5b272fa6ea8641b7d6d5d32c80f58cea74ea80 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Sat, 19 Mar 2016 23:19:05 +0000 Subject: [PATCH 240/467] Unless I'm mistaken, scalesteps/heightsteps should be divided by stop-start, not stop-start+1. Revert this commit if that was intentional. --- src/r_segs.c | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/r_segs.c b/src/r_segs.c index 9689f43df..02b243d4d 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -288,6 +288,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) line_t *ldef; sector_t *front, *back; INT32 times, repeats; + INT32 range; // Calculate light table. // Use different light tables @@ -334,6 +335,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) colfunc = fuzzcolfunc; } + range = max(ds->x2-ds->x1, 1); rw_scalestep = ds->scalestep; spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep; @@ -377,7 +379,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) rlight->height = (centeryfrac) - FixedMul(leftheight, ds->scale1); rlight->heightstep = (centeryfrac) - FixedMul(rightheight, ds->scale2); - rlight->heightstep = (rlight->heightstep-rlight->height)/(ds->x2-ds->x1+1); + rlight->heightstep = (rlight->heightstep-rlight->height)/(range); //if (x1 > ds->x1) //rlight->height -= (x1 - ds->x1)*rlight->heightstep; #else @@ -693,6 +695,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) fixed_t offsetvalue = 0; lightlist_t *light; r_lightlist_t *rlight; + INT32 range; #ifndef ESLOPE fixed_t lheight; #endif @@ -757,6 +760,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) else if (pfloor->flags & FF_FOG) colfunc = R_DrawFogColumn_8; + range = max(ds->x2-ds->x1, 1); //SoM: Moved these up here so they are available for my lightlist calculations rw_scalestep = ds->scalestep; spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep; @@ -813,7 +817,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) rightheight -= viewz; rlight->height = (centeryfrac) - FixedMul(leftheight, ds->scale1); rlight->heightstep = (centeryfrac) - FixedMul(rightheight, ds->scale2); - rlight->heightstep = (rlight->heightstep-rlight->height)/(ds->x2-ds->x1+1); + rlight->heightstep = (rlight->heightstep-rlight->height)/(range); rlight->height -= rlight->heightstep; #else if (light->height < *pfloor->bottomheight) @@ -841,7 +845,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) rlight->botheight = (centeryfrac) - FixedMul(leftheight, ds->scale1); rlight->botheightstep = (centeryfrac) - FixedMul(rightheight, ds->scale2); - rlight->botheightstep = (rlight->botheightstep-rlight->botheight)/(ds->x2-ds->x1+1); + rlight->botheightstep = (rlight->botheightstep-rlight->botheight)/(range); rlight->botheight -= rlight->botheightstep; #else lheight = *light->caster->bottomheight;// > *pfloor->topheight ? *pfloor->topheight + FRACUNIT : *light->caster->bottomheight; @@ -951,8 +955,8 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) top_step = centeryfrac - FixedMul(right_top, ds->scale2); bottom_step = centeryfrac - FixedMul(right_bottom, ds->scale2); - top_step = (top_step-top_frac)/(ds->x2-ds->x1+1); - bottom_step = (bottom_step-bottom_frac)/(ds->x2-ds->x1+1); + top_step = (top_step-top_frac)/(range); + bottom_step = (bottom_step-bottom_frac)/(range); top_frac += top_step * (x1 - ds->x1); bottom_frac += bottom_step * (x1 - ds->x1); @@ -1549,6 +1553,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) INT32 i, p; lightlist_t *light; r_lightlist_t *rlight; + INT32 range; #ifdef ESLOPE vertex_t segleft, segright; fixed_t ceilingfrontslide, floorfrontslide, ceilingbackslide, floorbackslide; @@ -1633,7 +1638,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (stop > start) { ds_p->scale2 = R_ScaleFromGlobalAngle(viewangle + xtoviewangle[stop]); - ds_p->scalestep = rw_scalestep = (ds_p->scale2 - rw_scale) / (stop-start); + range = stop-start; } else { @@ -1654,8 +1659,11 @@ void R_StoreWallRange(INT32 start, INT32 stop) } #endif ds_p->scale2 = ds_p->scale1; + range = 1; } + ds_p->scalestep = rw_scalestep = (ds_p->scale2 - rw_scale) / (range); + // calculate texture boundaries // and decide if floor / ceiling marks are needed #ifdef ESLOPE @@ -2531,11 +2539,11 @@ void R_StoreWallRange(INT32 start, INT32 stop) #ifdef ESLOPE if (frontsector->c_slope) { fixed_t topfracend = (centeryfrac>>4) - FixedMul (worldtopslope, ds_p->scale2); - topstep = (topfracend-topfrac)/(stop-start+1); + topstep = (topfracend-topfrac)/(range); } if (frontsector->f_slope) { fixed_t bottomfracend = (centeryfrac>>4) - FixedMul (worldbottomslope, ds_p->scale2); - bottomstep = (bottomfracend-bottomfrac)/(stop-start+1); + bottomstep = (bottomfracend-bottomfrac)/(range); } #endif @@ -2596,7 +2604,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) #ifdef ESLOPE rlight->height = (centeryfrac>>4) - FixedMul(leftheight, rw_scale); rlight->heightstep = (centeryfrac>>4) - FixedMul(rightheight, ds_p->scale2); - rlight->heightstep = (rlight->heightstep-rlight->height)/(stop-start+1); + rlight->heightstep = (rlight->heightstep-rlight->height)/(range); #else rlight->height = (centeryfrac>>4) - FixedMul((light->height - viewz) >> 4, rw_scale); rlight->heightstep = -FixedMul (rw_scalestep, (light->height - viewz) >> 4); @@ -2623,7 +2631,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) rlight->botheight = (centeryfrac>>4) - FixedMul(leftheight, rw_scale); rlight->botheightstep = (centeryfrac>>4) - FixedMul(rightheight, ds_p->scale2); - rlight->botheightstep = (rlight->botheightstep-rlight->botheight)/(stop-start+1); + rlight->botheightstep = (rlight->botheightstep-rlight->botheight)/(range); #else rlight->botheight = (centeryfrac >> 4) - FixedMul((*light->caster->bottomheight - viewz) >> 4, rw_scale); @@ -2652,7 +2660,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) #ifdef ESLOPE ffloor[i].f_pos_slope >>= 4; ffloor[i].f_frac = (centeryfrac>>4) - FixedMul(ffloor[i].f_pos, rw_scale); - ffloor[i].f_step = ((centeryfrac>>4) - FixedMul(ffloor[i].f_pos_slope, ds_p->scale2) - ffloor[i].f_frac)/(stop-start+1); + ffloor[i].f_step = ((centeryfrac>>4) - FixedMul(ffloor[i].f_pos_slope, ds_p->scale2) - ffloor[i].f_frac)/(range); #else ffloor[i].f_step = FixedMul(-rw_scalestep, ffloor[i].f_pos); ffloor[i].f_frac = (centeryfrac>>4) - FixedMul(ffloor[i].f_pos, rw_scale); @@ -2681,7 +2689,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) #ifdef ESLOPE if (backsector->c_slope) { fixed_t topfracend = (centeryfrac>>4) - FixedMul (worldhighslope, ds_p->scale2); - pixhighstep = (topfracend-pixhigh)/(stop-start+1); + pixhighstep = (topfracend-pixhigh)/(range); } #endif } @@ -2697,7 +2705,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) #ifdef ESLOPE if (backsector->f_slope) { fixed_t bottomfracend = (centeryfrac>>4) - FixedMul (worldlowslope, ds_p->scale2); - pixlowstep = (bottomfracend-pixlow)/(stop-start+1); + pixlowstep = (bottomfracend-pixlow)/(range); } #endif } @@ -2739,7 +2747,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) ffloor[i].b_pos_slope >>= 4; ffloor[i].b_frac = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos, rw_scale); ffloor[i].b_step = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos_slope, ds_p->scale2); - ffloor[i].b_step = (ffloor[i].b_step-ffloor[i].b_frac)/(stop-start+1); + ffloor[i].b_step = (ffloor[i].b_step-ffloor[i].b_frac)/(range); i++; } @@ -2761,7 +2769,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) ffloor[i].b_pos_slope >>= 4; ffloor[i].b_frac = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos, rw_scale); ffloor[i].b_step = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos_slope, ds_p->scale2); - ffloor[i].b_step = (ffloor[i].b_step-ffloor[i].b_frac)/(stop-start+1); + ffloor[i].b_step = (ffloor[i].b_step-ffloor[i].b_frac)/(range); i++; } #else @@ -2824,7 +2832,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) ffloor[i].b_pos_slope >>= 4; ffloor[i].b_frac = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos, rw_scale); ffloor[i].b_step = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos_slope, ds_p->scale2); - ffloor[i].b_step = (ffloor[i].b_step-ffloor[i].b_frac)/(stop-start+1); + ffloor[i].b_step = (ffloor[i].b_step-ffloor[i].b_frac)/(range); i++; } @@ -2846,7 +2854,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) ffloor[i].b_pos_slope >>= 4; ffloor[i].b_frac = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos, rw_scale); ffloor[i].b_step = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos_slope, ds_p->scale2); - ffloor[i].b_step = (ffloor[i].b_step-ffloor[i].b_frac)/(stop-start+1); + ffloor[i].b_step = (ffloor[i].b_step-ffloor[i].b_frac)/(range); i++; } #else From 76d71bda926d11eb1315bf1e0fe36fa39d87ec59 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Fri, 25 Mar 2016 19:43:17 +0000 Subject: [PATCH 241/467] destend now scales the added-on patch width properly if needed --- src/v_video.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/v_video.c b/src/v_video.c index df81ac6d6..3eb71bb06 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -477,7 +477,16 @@ void V_DrawFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t } deststart = desttop; - destend = desttop + SHORT(patch->width) * dupx; + if (pscale != FRACUNIT) // scale width properly + { + fixed_t pwidth = SHORT(patch->width)<>= FRACBITS; + destend = desttop + pwidth; + } + else + destend = desttop + SHORT(patch->width) * dupx; for (col = 0; (col>>FRACBITS) < SHORT(patch->width); col += colfrac, ++x, desttop++) { From 3698c2583d36a0d302e2b005cea221d838ad80af Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Fri, 25 Mar 2016 20:04:49 +0000 Subject: [PATCH 242/467] wrap prevention code now takes flipped patches into account --- src/v_video.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/v_video.c b/src/v_video.c index 3eb71bb06..b9bdb271f 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -336,6 +336,8 @@ void V_DrawFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t const column_t *column; UINT8 *desttop, *dest, *deststart, *destend; const UINT8 *source, *deststop; + fixed_t pwidth; // patch width + fixed_t offx = 0; // x offset if (rendermode == render_none) return; @@ -476,25 +478,36 @@ void V_DrawFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t } } - deststart = desttop; if (pscale != FRACUNIT) // scale width properly { - fixed_t pwidth = SHORT(patch->width)<width)<>= FRACBITS; - destend = desttop + pwidth; } else - destend = desttop + SHORT(patch->width) * dupx; + pwidth = SHORT(patch->width) * dupx; - for (col = 0; (col>>FRACBITS) < SHORT(patch->width); col += colfrac, ++x, desttop++) + deststart = desttop; + destend = desttop + pwidth; + + for (col = 0; (col>>FRACBITS) < SHORT(patch->width); col += colfrac, ++offx, desttop++) { INT32 topdelta, prevdelta = -1; - if (x < 0) // don't draw off the left of the screen (WRAP PREVENTION) - continue; - if (x >= vid.width) // don't draw off the right of the screen (WRAP PREVENTION) - break; + if (flip) // offx is measured from right edge instead of left + { + if (x+pwidth-offx < 0) // don't draw off the left of the screen (WRAP PREVENTION) + break; + if (x+pwidth-offx >= vid.width) // don't draw off the right of the screen (WRAP PREVENTION) + continue; + } + else + { + if (x+offx < 0) // don't draw off the left of the screen (WRAP PREVENTION) + continue; + if (x+offx >= vid.width) // don't draw off the right of the screen (WRAP PREVENTION) + break; + } column = (const column_t *)((const UINT8 *)(patch) + LONG(patch->columnofs[col>>FRACBITS])); while (column->topdelta != 0xff) From 0953c9430b18bc8380aaf00f6871309a75c31a07 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 19:16:35 -0400 Subject: [PATCH 243/467] travis-ci: try osx building --- .travis.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5815e711f..e58f09513 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,11 @@ language: c -sudo: required -dist: trusty + +matrix: + include: + - os: linux + dist: trusty + sudo: required + - os: osx env: - CFLAGS=-Wno-absolute-value -Werror From 73dd5cd8035c368d7858ee45fe0eeb1e24166766 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 19:48:39 -0400 Subject: [PATCH 244/467] travis-ci: add brew packages --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index e58f09513..049d465a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,4 +37,8 @@ before_script: - cd build - cmake .. +before_install: + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install sdl2_mixer libsdl game-music-emu p7zip ; fi + script: make From 8d36a77e42c092f8108248a17ccca20f6af9110f Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 19:53:13 -0400 Subject: [PATCH 245/467] travis-ci: libpng, not libsdl --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 049d465a1..d70e1dc9a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,10 @@ language: c +sudo: required matrix: include: - os: linux dist: trusty - sudo: required - os: osx env: @@ -39,6 +39,6 @@ before_script: before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install sdl2_mixer libsdl game-music-emu p7zip ; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install sdl2_mixer libpng game-music-emu p7zip ; fi script: make From dfa41ed8782ea24485bcfa2f3d4066bc14b6d2c9 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 19:56:05 -0400 Subject: [PATCH 246/467] travis-ci: drop libpng for osx --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d70e1dc9a..bc5489308 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,6 +39,6 @@ before_script: before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install sdl2_mixer libpng game-music-emu p7zip ; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install sdl2_mixer game-music-emu p7zip ; fi script: make From 9162e7da9d59f869bf99691a2f381f405ae0629d Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 19:56:51 -0400 Subject: [PATCH 247/467] travis-ci: move dist setting to top --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bc5489308..d131a82b2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,10 @@ language: c sudo: required +dist: trusty matrix: include: - os: linux - dist: trusty - os: osx env: From 23c9892fea6af16054f82d8eb3f295f590c11448 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 20:02:57 -0400 Subject: [PATCH 248/467] travis-ci: fixup os list --- .travis.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index d131a82b2..4ebef34a0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,10 +2,9 @@ language: c sudo: required dist: trusty -matrix: - include: - - os: linux - - os: osx +os: + - linux + - osx env: - CFLAGS=-Wno-absolute-value -Werror From 0c9081f762dd5d4cbcdcfe3871bcc599fbefc316 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 20:10:14 -0400 Subject: [PATCH 249/467] cmake: try to fixup mac build --- src/sdl/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index 7190efaac..f44e3dee5 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -117,7 +117,7 @@ if(${SDL2_FOUND}) add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32 ${SRB2_SDL2_TOTAL_SOURCES}) set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME ${SRB2_SDL2_EXE_NAME}) - if((CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")) + if(${CMAKE_SYSTEM} MATCHES Darwin) add_framework(CoreFoundation SRB2SDL2) add_framework(SDL2 SRB2SDL2) add_framework(SDL2_mixer SRB2SDL2) @@ -227,7 +227,7 @@ if(${SDL2_FOUND}) endif() #### Installation #### - if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + if(${CMAKE_SYSTEM} MATCHES Darwin) install(TARGETS SRB2SDL2 BUNDLE DESTINATION . ) @@ -268,7 +268,7 @@ if(${SDL2_FOUND}) # Mac bundle fixup - if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + if(${CMAKE_SYSTEM} MATCHES Darwin) install(CODE " include(BundleUtilities) fixup_bundle(\"${CMAKE_INSTALL_PREFIX}/Sonic Robo Blast 2.app\" From dadf8e1260a83125089f43ba2a6ddb119f2a474a Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 20:21:56 -0400 Subject: [PATCH 250/467] cmake: remove fixed HWRENDER define --- src/doomtype.h | 1 - src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/doomtype.h b/src/doomtype.h index 8e7da6881..d833176f7 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -94,7 +94,6 @@ typedef long ssize_t; #ifdef __APPLE_CC__ #define DIRECTFULLSCREEN #define DEBUG_LOG -#define HWRENDER #define NOIPX #endif diff --git a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj index 98599fb60..c3f0d3b38 100644 --- a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj +++ b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj @@ -1270,6 +1270,7 @@ HAVE_BLUA, LUA_USE_POSIX, COMPVERSION, + HWRENDER, ); GCC_THREADSAFE_STATICS = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; @@ -1392,6 +1393,7 @@ HAVE_BLUA, LUA_USE_POSIX, COMPVERSION, + HWRENDER, ); GCC_THREADSAFE_STATICS = NO; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; From 2165c6806661ccdc3d854dae3e528a5e9ed339f3 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 20:25:52 -0400 Subject: [PATCH 251/467] travis: add -Wno-unknown-warning-option --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4ebef34a0..c7e8b66b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ os: - osx env: -- CFLAGS=-Wno-absolute-value -Werror +- CFLAGS=-Wno-absolute-value -Wno-unknown-warning-option -Werror compiler: - gcc From 18f51b343b17d0ce70b271a3c6a832ab9cf9028a Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 20:37:14 -0400 Subject: [PATCH 252/467] build: more mac fixes --- .travis.yml | 2 ++ src/md5.c | 2 +- src/string.c | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c7e8b66b0..e781c46e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,9 @@ dist: trusty os: - linux + env: CFLAGS=-Wno-absolute-value -Werror - osx + env: CFLAGS=--Werror env: - CFLAGS=-Wno-absolute-value -Wno-unknown-warning-option -Werror diff --git a/src/md5.c b/src/md5.c index aeaac2cde..ba89c499b 100644 --- a/src/md5.c +++ b/src/md5.c @@ -36,7 +36,7 @@ #include #else #ifndef HAVE_MEMCPY - #if !((defined (_WIN32) || defined (_WIN32_WCE)) && !defined (__CYGWIN__)) + #if !((defined (_WIN32) || defined (_WIN32_WCE)) && !defined (__CYGWIN__)) && !defined (__APPLE__) #define memcpy(d, s, n) bcopy ((s), (d), (n)) #endif #endif diff --git a/src/string.c b/src/string.c index 436757309..19540547c 100644 --- a/src/string.c +++ b/src/string.c @@ -15,6 +15,8 @@ #include #include "doomdef.h" +#if !defined (__APPLE__) + // Like the OpenBSD version, but it doesn't check for src not being a valid // C string. size_t strlcat(char *dst, const char *src, size_t siz) @@ -46,3 +48,5 @@ size_t strlcpy(char *dst, const char *src, size_t siz) dst[0] = '\0'; return strlcat(dst, src, siz); } + +#endif From fc1d71454b0c7ccdf3071a34e586ab27918c5c4d Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 20:56:04 -0400 Subject: [PATCH 253/467] travis: fixup xml --- .travis.yml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index e781c46e3..88d47d485 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,14 +2,11 @@ language: c sudo: required dist: trusty -os: - - linux - env: CFLAGS=-Wno-absolute-value -Werror - - osx - env: CFLAGS=--Werror - -env: -- CFLAGS=-Wno-absolute-value -Wno-unknown-warning-option -Werror +matrix: + include: + - os: linux + env: CFLAGS=Wno-absolute-value -Werror + - osx compiler: - gcc From 7122908560818ff3d36d862243983fa28c07e652 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 20:57:57 -0400 Subject: [PATCH 254/467] travis: matrix is not correct --- .travis.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 88d47d485..c378e9ef8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,11 +2,9 @@ language: c sudo: required dist: trusty -matrix: - include: - - os: linux - env: CFLAGS=Wno-absolute-value -Werror - - osx +os: + - linux + - osx compiler: - gcc From 9bc6ce3d85b3d353a4d14df9b78d292c65de602e Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 21:43:17 -0400 Subject: [PATCH 255/467] travis: steal SDL2 dmg for Mac build --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index c378e9ef8..84bf5dea1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,5 +36,7 @@ before_script: before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install sdl2_mixer game-music-emu p7zip ; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl -O -L https://www.libsdl.org/release/SDL2-2.0.4.dmg; hdiutil attach SDL2-2.0.4.dmg; sudo cp -a /Volumes/SDL2/SDL2.framework /Library/Frameworks/; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl -O -L https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.1.dmg; hdiutil attach SDL2_mixer-2.0.1.dmg; sudo cp -a /Volumes/SDL2_mixer/SDL2_mixer.framework /Library/Frameworks/; fi script: make From 2c4a27c7c6c2262debab568f5b0c466bf740b4c8 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 22:07:34 -0400 Subject: [PATCH 256/467] macosx: let fix linking to SDL frameworks --- .travis.yml | 2 +- src/sdl/CMakeLists.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 84bf5dea1..df89593c4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,6 +37,6 @@ before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install sdl2_mixer game-music-emu p7zip ; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl -O -L https://www.libsdl.org/release/SDL2-2.0.4.dmg; hdiutil attach SDL2-2.0.4.dmg; sudo cp -a /Volumes/SDL2/SDL2.framework /Library/Frameworks/; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl -O -L https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.1.dmg; hdiutil attach SDL2_mixer-2.0.1.dmg; sudo cp -a /Volumes/SDL2_mixer/SDL2_mixer.framework /Library/Frameworks/; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl -O -L https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.1.dmg; hdiutil attach SDL2_mixer-2.0.1.dmg; sudo cp -a /Volumes/SDL2_mixer/SDL2_mixer.framework /Library/Frameworks/; fi script: make diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index f44e3dee5..f57aa2c1f 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -118,10 +118,10 @@ if(${SDL2_FOUND}) set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME ${SRB2_SDL2_EXE_NAME}) if(${CMAKE_SYSTEM} MATCHES Darwin) - add_framework(CoreFoundation SRB2SDL2) - add_framework(SDL2 SRB2SDL2) - add_framework(SDL2_mixer SRB2SDL2) target_link_libraries(SRB2SDL2 PRIVATE + CoreFoundation + SDL2 + SDL2_mixer ${GME_LIBRARIES} ${PNG_LIBRARIES} ${ZLIB_LIBRARIES} From 077781cc567d1b7b6bee96abbba652fea0b121da Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 22:11:39 -0400 Subject: [PATCH 257/467] macosx: drop CoreFoundation linking --- src/sdl/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index f57aa2c1f..26448cb69 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -119,7 +119,6 @@ if(${SDL2_FOUND}) if(${CMAKE_SYSTEM} MATCHES Darwin) target_link_libraries(SRB2SDL2 PRIVATE - CoreFoundation SDL2 SDL2_mixer ${GME_LIBRARIES} From 0f853640e219bda4a2af3406d1fdade541be88ad Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Fri, 25 Mar 2016 22:23:47 -0400 Subject: [PATCH 258/467] macosx: We need CoreFoudation for SDLMain --- src/sdl/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index 26448cb69..7f6771262 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -118,7 +118,9 @@ if(${SDL2_FOUND}) set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME ${SRB2_SDL2_EXE_NAME}) if(${CMAKE_SYSTEM} MATCHES Darwin) + find_library(CORE_LIB CoreFoundation) target_link_libraries(SRB2SDL2 PRIVATE + ${CORE_LIB} SDL2 SDL2_mixer ${GME_LIBRARIES} From 6bda1a57a57f0367a97f13b21d38c4ddc37427a5 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Tue, 29 Mar 2016 15:40:01 +0100 Subject: [PATCH 259/467] Fix FOF plane light underside checks --- src/r_bsp.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/r_bsp.c b/src/r_bsp.c index cd32b7863..7f64e0cbd 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -1002,7 +1002,7 @@ static void R_Subsector(size_t num) || (viewz > heightcheck && (rover->flags & FF_BOTHPLANES)))) { light = R_GetPlaneLight(frontsector, planecenterz, - viewz < *rover->bottomheight); + viewz < heightcheck); ffloor[numffloors].plane = R_FindPlane(*rover->bottomheight, *rover->bottompic, *frontsector->lightlist[light].lightlevel, *rover->bottomxoffs, @@ -1020,12 +1020,7 @@ static void R_Subsector(size_t num) frontsector->hasslope = true; #endif - ffloor[numffloors].height = -#ifdef ESLOPE - *rover->b_slope ? P_GetZAt(*rover->b_slope, viewx, viewy) : -#endif - *rover->bottomheight; - + ffloor[numffloors].height = heightcheck; ffloor[numffloors].ffloor = rover; numffloors++; } @@ -1050,7 +1045,7 @@ static void R_Subsector(size_t num) && ((viewz > heightcheck && !(rover->flags & FF_INVERTPLANES)) || (viewz < heightcheck && (rover->flags & FF_BOTHPLANES)))) { - light = R_GetPlaneLight(frontsector, planecenterz, viewz < *rover->topheight); + light = R_GetPlaneLight(frontsector, planecenterz, viewz < heightcheck); ffloor[numffloors].plane = R_FindPlane(*rover->topheight, *rover->toppic, *frontsector->lightlist[light].lightlevel, *rover->topxoffs, *rover->topyoffs, *rover->topangle, @@ -1068,12 +1063,7 @@ static void R_Subsector(size_t num) frontsector->hasslope = true; #endif - ffloor[numffloors].height = -#ifdef ESLOPE - *rover->t_slope ? P_GetZAt(*rover->t_slope, viewx, viewy) : -#endif - *rover->topheight; - + ffloor[numffloors].height = heightcheck; ffloor[numffloors].ffloor = rover; numffloors++; } From ef832dd8b815ec6a8753cf5515f3a72c9ba3a3ac Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Tue, 29 Mar 2016 18:59:56 +0100 Subject: [PATCH 260/467] Fixed how two adjacent FOFs can prevent each others' walls from displaying if they're at least partially covered Also some miscellaneous tweaks and changes to account for slopes properly --- src/r_segs.c | 58 ++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/r_segs.c b/src/r_segs.c index 02b243d4d..1f5477ecf 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -2248,9 +2248,9 @@ void R_StoreWallRange(INT32 start, INT32 stop) } else low2 = lowslope2 = *r2->bottomheight; - if ((high2 < lowcut && highslope2 < lowcutslope) || (low2 > highcut && lowslope2 > highcutslope)) + if ((high2 < lowcut || highslope2 < lowcutslope) || (low2 > highcut || lowslope2 > highcutslope)) continue; - if ((high1 > high2 && highslope1 > highslope2) || (low1 < low2 && lowslope1 < lowslope2)) + if ((high1 > high2 || highslope1 > highslope2) || (low1 < low2 || lowslope1 < lowslope2)) continue; #else if (*r2->topheight < lowcut || *r2->bottomheight > highcut) @@ -2331,9 +2331,9 @@ void R_StoreWallRange(INT32 start, INT32 stop) } else low2 = lowslope2 = *r2->bottomheight; - if ((high2 < lowcut && highslope2 < lowcutslope) || (low2 > highcut && lowslope2 > highcutslope)) + if ((high2 < lowcut || highslope2 < lowcutslope) || (low2 > highcut || lowslope2 > highcutslope)) continue; - if ((high1 > high2 && highslope1 > highslope2) || (low1 < low2 && lowslope1 < lowslope2)) + if ((high1 > high2 || highslope1 > highslope2) || (low1 < low2 || lowslope1 < lowslope2)) continue; #else if (*r2->topheight < lowcut || *r2->bottomheight > highcut) @@ -2679,7 +2679,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (worldhigh < worldtop #ifdef ESLOPE - || worldhighslope <= worldtopslope + || worldhighslope < worldtopslope #endif ) { @@ -2696,7 +2696,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (worldlow > worldbottom #ifdef ESLOPE - || worldlowslope >= worldbottomslope + || worldlowslope > worldbottomslope #endif ) { @@ -2713,7 +2713,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) { ffloor_t * rover; #ifdef ESLOPE - fixed_t rovertest; + fixed_t roverleft, roverright; fixed_t planevistest; #endif i = 0; @@ -2732,17 +2732,18 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (*rover->b_slope || *rover->t_slope) backsector->hasslope = true; - rovertest = (*rover->b_slope ? P_GetZAt(*rover->b_slope, backsector->soundorg.x, backsector->soundorg.y) : *rover->bottomheight) - viewz; + roverleft = (*rover->b_slope ? P_GetZAt(*rover->b_slope, segleft.x, segleft.y) : *rover->bottomheight) - viewz; + roverright = (*rover->b_slope ? P_GetZAt(*rover->b_slope, segright.x, segright.y) : *rover->bottomheight) - viewz; planevistest = (*rover->b_slope ? P_GetZAt(*rover->b_slope, viewx, viewy) : *rover->bottomheight); - if (rovertest>>4 <= worldhigh && - rovertest>>4 >= worldlow && + if ((roverleft>>4 <= worldhigh || roverright>>4 <= worldhighslope) && + (roverleft>>4 >= worldlow || roverright>>4 >= worldlowslope) && ((viewz < planevistest && !(rover->flags & FF_INVERTPLANES)) || (viewz > planevistest && (rover->flags & FF_BOTHPLANES)))) { //ffloor[i].slope = *rover->b_slope; - ffloor[i].b_pos = (*rover->b_slope ? P_GetZAt(*rover->b_slope, segleft.x, segleft.y) : *rover->bottomheight) - viewz; - ffloor[i].b_pos_slope = (*rover->b_slope ? P_GetZAt(*rover->b_slope, segright.x, segright.y) : *rover->bottomheight) - viewz; + ffloor[i].b_pos = roverleft; + ffloor[i].b_pos_slope = roverright; ffloor[i].b_pos >>= 4; ffloor[i].b_pos_slope >>= 4; ffloor[i].b_frac = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos, rw_scale); @@ -2754,17 +2755,18 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (i >= MAXFFLOORS) break; - rovertest = (*rover->t_slope ? P_GetZAt(*rover->t_slope, backsector->soundorg.x, backsector->soundorg.y) : *rover->topheight) - viewz; + roverleft = (*rover->t_slope ? P_GetZAt(*rover->t_slope, segleft.x, segleft.y) : *rover->topheight) - viewz; + roverright = (*rover->t_slope ? P_GetZAt(*rover->t_slope, segright.x, segright.y) : *rover->topheight) - viewz; planevistest = (*rover->t_slope ? P_GetZAt(*rover->t_slope, viewx, viewy) : *rover->topheight); - if (rovertest>>4 <= worldhigh && - rovertest>>4 >= worldlow && + if ((roverleft>>4 <= worldhigh || roverright>>4 <= worldhighslope) && + (roverleft>>4 >= worldlow || roverright>>4 >= worldlowslope) && ((viewz > planevistest && !(rover->flags & FF_INVERTPLANES)) || (viewz < planevistest && (rover->flags & FF_BOTHPLANES)))) { //ffloor[i].slope = *rover->t_slope; - ffloor[i].b_pos = (*rover->t_slope ? P_GetZAt(*rover->t_slope, segleft.x, segleft.y) : *rover->topheight) - viewz; - ffloor[i].b_pos_slope = (*rover->t_slope ? P_GetZAt(*rover->t_slope, segright.x, segright.y) : *rover->topheight) - viewz; + ffloor[i].b_pos = roverleft; + ffloor[i].b_pos_slope = roverright; ffloor[i].b_pos >>= 4; ffloor[i].b_pos_slope >>= 4; ffloor[i].b_frac = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos, rw_scale); @@ -2817,17 +2819,18 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (*rover->b_slope || *rover->t_slope) frontsector->hasslope = true; - rovertest = (*rover->b_slope ? P_GetZAt(*rover->b_slope, frontsector->soundorg.x, frontsector->soundorg.y) : *rover->bottomheight) - viewz; + roverleft = (*rover->b_slope ? P_GetZAt(*rover->b_slope, segleft.x, segleft.y) : *rover->bottomheight) - viewz; + roverright = (*rover->b_slope ? P_GetZAt(*rover->b_slope, segright.x, segright.y) : *rover->bottomheight) - viewz; planevistest = (*rover->b_slope ? P_GetZAt(*rover->b_slope, viewx, viewy) : *rover->bottomheight); - if (rovertest>>4 <= worldtop && - rovertest>>4 >= worldbottom && + if ((roverleft>>4 <= worldhigh || roverright>>4 <= worldhighslope) && + (roverleft>>4 >= worldlow || roverright>>4 >= worldlowslope) && ((viewz < planevistest && !(rover->flags & FF_INVERTPLANES)) || (viewz > planevistest && (rover->flags & FF_BOTHPLANES)))) { //ffloor[i].slope = *rover->b_slope; - ffloor[i].b_pos = (*rover->b_slope ? P_GetZAt(*rover->b_slope, segleft.x, segleft.y) : *rover->bottomheight) - viewz; - ffloor[i].b_pos_slope = (*rover->b_slope ? P_GetZAt(*rover->b_slope, segright.x, segright.y) : *rover->bottomheight) - viewz; + ffloor[i].b_pos = roverleft; + ffloor[i].b_pos_slope = roverright; ffloor[i].b_pos >>= 4; ffloor[i].b_pos_slope >>= 4; ffloor[i].b_frac = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos, rw_scale); @@ -2839,17 +2842,18 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (i >= MAXFFLOORS) break; - rovertest = (*rover->t_slope ? P_GetZAt(*rover->t_slope, frontsector->soundorg.x, frontsector->soundorg.y) : *rover->topheight) - viewz; + roverleft = (*rover->t_slope ? P_GetZAt(*rover->t_slope, segleft.x, segleft.y) : *rover->topheight) - viewz; + roverright = (*rover->t_slope ? P_GetZAt(*rover->t_slope, segright.x, segright.y) : *rover->topheight) - viewz; planevistest = (*rover->t_slope ? P_GetZAt(*rover->t_slope, viewx, viewy) : *rover->topheight); - if (rovertest>>4 <= worldtop && - rovertest>>4 >= worldbottom && + if ((roverleft>>4 <= worldhigh || roverright>>4 <= worldhighslope) && + (roverleft>>4 >= worldlow || roverright>>4 >= worldlowslope) && ((viewz > planevistest && !(rover->flags & FF_INVERTPLANES)) || (viewz < planevistest && (rover->flags & FF_BOTHPLANES)))) { //ffloor[i].slope = *rover->t_slope; - ffloor[i].b_pos = (*rover->t_slope ? P_GetZAt(*rover->t_slope, segleft.x, segleft.y) : *rover->topheight) - viewz; - ffloor[i].b_pos_slope = (*rover->t_slope ? P_GetZAt(*rover->t_slope, segright.x, segright.y) : *rover->topheight) - viewz; + ffloor[i].b_pos = roverleft; + ffloor[i].b_pos_slope = roverright; ffloor[i].b_pos >>= 4; ffloor[i].b_pos_slope >>= 4; ffloor[i].b_frac = (centeryfrac >> 4) - FixedMul(ffloor[i].b_pos, rw_scale); From ee00da6a74a62c74a56722b7b70fc50aa45c7f05 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Tue, 29 Mar 2016 22:32:09 +0100 Subject: [PATCH 261/467] Another thing that probably needed to check for slopes --- src/r_segs.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/r_segs.c b/src/r_segs.c index 1f5477ecf..66413c588 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -2032,8 +2032,13 @@ void R_StoreWallRange(INT32 start, INT32 stop) markceiling = false; } +#ifdef ESLOPE + if ((worldhigh <= worldbottom && worldhighslope <= worldbottomslope) + || (worldlow >= worldtop && worldlowslope >= worldtopslope)) +#else if (backsector->ceilingheight <= frontsector->floorheight || backsector->floorheight >= frontsector->ceilingheight) +#endif { // closed door markceiling = markfloor = true; From 1108a52959780c51201c2808d8ec35ee5e204bfe Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Tue, 29 Mar 2016 22:44:16 +0100 Subject: [PATCH 262/467] Check change in ceilinglightsec for markceiling code, not floorlightsec --- src/r_segs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_segs.c b/src/r_segs.c index 04873b29c..2820262e0 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1922,7 +1922,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) || backsector->ceilingpic_angle != frontsector->ceilingpic_angle //SoM: 3/22/2000: Prevents bleeding. || (frontsector->heightsec != -1 && frontsector->ceilingpic != skyflatnum) - || backsector->floorlightsec != frontsector->floorlightsec + || backsector->ceilinglightsec != frontsector->ceilinglightsec //SoM: 4/3/2000: Check for colormaps || frontsector->extra_colormap != backsector->extra_colormap || (frontsector->ffloors != backsector->ffloors && frontsector->tag != backsector->tag)) From ce2c2de58a38c5a6f7270eabb80ae37c9084d590 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sat, 26 Mar 2016 15:48:12 -0700 Subject: [PATCH 263/467] P_Random now using a variant of xorshift This actually passes most diehard tests, as opposed to the old RNG. It's also similarly fast. Internally the PRNG generates a fixed point number from [0,1) now, which makes P_RandomKey and P_RandomRange much easier to calculate. P_Random is just a simple shift, as well. Also, the lack of floating point math in P_RandomKey and P_RandomRange now is probably for the best. --- src/m_random.c | 106 +++++++++++++++++++++++++++++++++---------------- src/m_random.h | 14 ++++--- src/st_stuff.c | 6 ++- 3 files changed, 85 insertions(+), 41 deletions(-) diff --git a/src/m_random.c b/src/m_random.c index fce65b88a..eab45a3ed 100644 --- a/src/m_random.c +++ b/src/m_random.c @@ -10,7 +10,7 @@ // See the 'LICENSE' file for more details. //----------------------------------------------------------------------------- /// \file m_random.c -/// \brief LCG PRNG originally created for XMOD +/// \brief RNG for client effects and PRNG for game actions #include "doomdef.h" #include "doomtype.h" @@ -42,7 +42,7 @@ UINT8 M_Random(void) */ INT32 M_SignedRandom(void) { - return M_Random() - 128; + return (rand() & 255) - 128; } /** Provides a random number in between 0 and the given number - 1. @@ -80,12 +80,29 @@ static UINT32 randomseed = 0; static UINT32 initialseed = 0; /** - * Provides a random byte and sets the seed appropriately. - * The nature of this PRNG allows it to cycle through about two million numbers - * before it finally starts repeating numeric sequences. - * That's more than good enough for our purposes. + * Provides a random fixed point number. + * This is a variant of an xorshift PRNG; state fits in a 32 bit integer structure. * - * \return A random byte, 0 to 255. + * \return A random fixed point number from [0,1). + */ +ATTRINLINE static fixed_t FUNCINLINE __internal_prng__(void) +{ + randomseed += 7069; + randomseed ^= randomseed << 17; + randomseed ^= randomseed >> 9; + randomseed *= 373; + randomseed ^= randomseed << 21; + randomseed ^= randomseed >> 15; + return (randomseed&((FRACUNIT-1)<<9))>>9; +} + +/** Provides a random integer from 0 to 255. + * Distribution is uniform. + * If you're curious, (&0xFF00) >> 8 gives the same result + * as a fixed point multiplication by 256. + * + * \return Random integer from [0, 255]. + * \sa __internal_prng__ */ #ifndef DEBUGRANDOM UINT8 P_Random(void) @@ -95,15 +112,14 @@ UINT8 P_RandomD(const char *rfile, INT32 rline) { CONS_Printf("P_Random() at: %sp %d\n", rfile, rline); #endif - randomseed = (randomseed*746151647)+48205429; - return (UINT8)((randomseed >> 17)&255); + return (UINT8)((__internal_prng__()&0xFF00)>>8); } -/** Provides a random number from -128 to 127. +/** Provides a random integer from -128 to 127. * Distribution is uniform. * - * \return Random number from -128 to 127. - * \sa P_Random + * \return Random integer from [-128, 127]. + * \sa __internal_prng__ */ #ifndef DEBUGRANDOM INT32 P_SignedRandom(void) @@ -113,15 +129,31 @@ INT32 P_SignedRandomD(const char *rfile, INT32 rline) { CONS_Printf("P_SignedRandom() at: %sp %d\n", rfile, rline); #endif - return P_Random() - 128; + return (INT32)((__internal_prng__()&0xFF00)>>8) - 128; } -/** Provides a random number in between 0 and the given number - 1. - * Distribution is uniform, also calls for two numbers for bigger output range. - * Use for picking random elements from an array. +/** + * Provides a random fixed point number. + * Literally a wrapper for the internal PRNG function. * - * \return A random number, 0 to arg1-1. - * \sa P_Random + * \return A random fixed point number from [0,1). + */ +#ifndef DEBUGRANDOM +fixed_t P_RandomFixed(void) +{ +#else +UINT8 P_RandomFixedD(const char *rfile, INT32 rline) +{ + CONS_Printf("P_Random() at: %sp %d\n", rfile, rline); +#endif + return __internal_prng__(); +} + +/** Provides a random integer for picking random elements from an array. + * Distribution is uniform. + * + * \return A random integer from [0,a). + * \sa __internal_prng__ */ #ifndef DEBUGRANDOM INT32 P_RandomKey(INT32 a) @@ -131,16 +163,14 @@ INT32 P_RandomKeyD(const char *rfile, INT32 rline, INT32 a) { CONS_Printf("P_RandomKey() at: %sp %d\n", rfile, rline); #endif - INT32 prandom = P_Random(); // note: forcing explicit function call order - prandom |= P_Random() << 8; // (function call order is not strictly defined) - return (INT32)((prandom/65536.0f)*a); + return (INT32)((__internal_prng__() * a) >> FRACBITS); } -/** Provides a random number in between a specific range. - * Distribution is uniform, also calls for two numbers for bigger output range. +/** Provides a random integer in a given range. + * Distribution is uniform. * - * \return A random number, arg1 to arg2. - * \sa P_Random + * \return A random integer from [a,b].P_Random + * \sa __internal_prng__ */ #ifndef DEBUGRANDOM INT32 P_RandomRange(INT32 a, INT32 b) @@ -150,21 +180,27 @@ INT32 P_RandomRangeD(const char *rfile, INT32 rline, INT32 a, INT32 b) { CONS_Printf("P_RandomRange() at: %sp %d\n", rfile, rline); #endif - INT32 prandom = P_Random(); // note: forcing explicit function call order - prandom |= P_Random() << 8; // (function call order is not strictly defined) - return (INT32)((prandom/65536.0f)*(b-a+1))+a; + return (INT32)((__internal_prng__() * (b-a+1)) >> FRACBITS) + a; } -/** Provides a random byte without saving what the seed would be. - * Used just to debug the PRNG. + + +// ---------------------- +// PRNG seeds & debugging +// ---------------------- + +/** Peeks to see what the next result from the PRNG will be. + * Used for debugging. * - * \return A 'random' byte, 0 to 255. - * \sa P_Random + * \return A 'random' fixed point number from [0,1). + * \sa __internal_prng__ */ -UINT8 P_RandomPeek(void) +fixed_t P_RandomPeek(void) { - UINT32 r = (randomseed*746151647)+48205429; - return (UINT8)((r >> 17)&255); + UINT32 r = randomseed; + fixed_t ret = __internal_prng__(); + randomseed = r; + return ret; } /** Gets the current random seed. Used by netgame savegames. diff --git a/src/m_random.h b/src/m_random.h index 42c871608..91348365b 100644 --- a/src/m_random.h +++ b/src/m_random.h @@ -20,8 +20,9 @@ //#define DEBUGRANDOM + // M_Random functions pull random numbers of various types that aren't network synced. -// P_Random functions pulls random bytes from a LCG PRNG that is network synced. +// P_Random functions pulls random bytes from a PRNG that is network synced. // RNG functions UINT8 M_Random(void); @@ -31,21 +32,24 @@ INT32 M_RandomRange(INT32 a, INT32 b); // PRNG functions #ifdef DEBUGRANDOM -#define P_Random() P_RandomD(__FILE__, __LINE__) -#define P_SignedRandom() P_SignedRandomD(__FILE__, __LINE__) -#define P_RandomKey(c) P_RandomKeyD(__FILE__, __LINE__, c) +#define P_Random() P_RandomD(__FILE__, __LINE__) +#define P_SignedRandom() P_SignedRandomD(__FILE__, __LINE__) +#define P_RandomFixed() P_RandomFixedD(__FILE__, __LINE__) +#define P_RandomKey(c) P_RandomKeyD(__FILE__, __LINE__, c) #define P_RandomRange(c, d) P_RandomRangeD(__FILE__, __LINE__, c, d) UINT8 P_RandomD(const char *rfile, INT32 rline); INT32 P_SignedRandomD(const char *rfile, INT32 rline); +fixed_t P_RandomFixedD(const char *rfile, INT32 rline); INT32 P_RandomKeyD(const char *rfile, INT32 rline, INT32 a); INT32 P_RandomRangeD(const char *rfile, INT32 rline, INT32 a, INT32 b); #else UINT8 P_Random(void); INT32 P_SignedRandom(void); +fixed_t P_RandomFixed(void); INT32 P_RandomKey(INT32 a); INT32 P_RandomRange(INT32 a, INT32 b); #endif -UINT8 P_RandomPeek(void); +fixed_t P_RandomPeek(void); // Working with the seed for PRNG #ifdef DEBUGRANDOM diff --git a/src/st_stuff.c b/src/st_stuff.c index 585db0c87..47eac22f4 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -592,9 +592,13 @@ static void ST_drawDebugInfo(void) if (cv_debug & DBG_RANDOMIZER) // randomizer testing { + fixed_t peekres = P_RandomPeek(); + peekres *= 10000; // Change from fixed point + peekres >>= FRACBITS; // to displayable decimal + V_DrawRightAlignedString(320, height - 16, V_MONOSPACE, va("Init: %08x", P_GetInitSeed())); V_DrawRightAlignedString(320, height - 8, V_MONOSPACE, va("Seed: %08x", P_GetRandSeed())); - V_DrawRightAlignedString(320, height, V_MONOSPACE, va("== : %8d", P_RandomPeek())); + V_DrawRightAlignedString(320, height, V_MONOSPACE, va("== : .%04d", peekres)); height -= 32; } From ac03ce39c8d681d915ecb1809ce9651aab5a91da Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sun, 27 Mar 2016 07:33:15 -0700 Subject: [PATCH 264/467] *_Random is now *_RandomByte. P_RandomChance is now a macro for something that should happen a certain percentage of time. P_SignedRandom was moved to a macro. Nobody cared. # Conflicts: # src/p_inter.c --- src/d_netcmd.c | 6 +- src/g_game.c | 10 +-- src/hardware/hw3sound.c | 6 +- src/hardware/hw_light.c | 4 +- src/lua_baselib.c | 39 ++++++++++-- src/m_cheat.c | 6 +- src/m_random.c | 110 +++++++++++++++------------------ src/m_random.h | 34 ++++++----- src/p_enemy.c | 132 +++++++++++++++++++--------------------- src/p_inter.c | 28 +++------ src/p_lights.c | 4 +- src/p_mobj.c | 70 ++++++++++----------- src/p_spec.c | 2 +- src/p_tick.c | 4 +- src/p_user.c | 10 +-- src/v_video.c | 2 +- 16 files changed, 233 insertions(+), 234 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5eb352834..c62ff8fe1 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -808,7 +808,7 @@ static boolean IsNameGood(char *name, INT32 playernum) else if (len == 1) // Agh! { // Last ditch effort... - sprintf(name, "%d", M_Random() & 7); + sprintf(name, "%d", M_RandomKey(10)); if (!IsNameGood (name, playernum)) return false; } @@ -3583,7 +3583,7 @@ retryscramble: for (i = 0; i < playercount; i++) { if (repick) - newteam = (INT16)((M_Random() % 2) + 1); + newteam = (INT16)((M_RandomByte() % 2) + 1); // One team has the most players they can get, assign the rest to the other team. if (red == maxcomposition || blue == maxcomposition) @@ -3628,7 +3628,7 @@ retryscramble: { if (repick) { - newteam = (INT16)((M_Random() % 2) + 1); + newteam = (INT16)((M_RandomByte() % 2) + 1); repick = false; } else diff --git a/src/g_game.c b/src/g_game.c index 3b7ef158f..71171fd74 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2331,8 +2331,8 @@ void G_SpawnPlayer(INT32 playernum, boolean starpost) } } P_MovePlayerToSpawn(playernum, spawnpoint); - -#ifdef HAVE_BLUA + +#ifdef HAVE_BLUA LUAh_PlayerSpawn(&players[playernum]); // Lua hook for player spawning :) #endif @@ -2349,7 +2349,7 @@ mapthing_t *G_FindCTFStart(INT32 playernum) return NULL; } - if ((!players[playernum].ctfteam && numredctfstarts && (!numbluectfstarts || P_Random() & 1)) || players[playernum].ctfteam == 1) //red + if ((!players[playernum].ctfteam && numredctfstarts && (!numbluectfstarts || P_RandomChance(FRACUNIT/2))) || players[playernum].ctfteam == 1) //red { if (!numredctfstarts) { @@ -5487,7 +5487,7 @@ ATTRNORETURN void FUNCNORETURN G_StopMetalRecording(void) UINT8 i; WRITEUINT8(demo_p, DEMOMARKER); // add the demo end marker for (i = 0; i < 16; i++, p++) - *p = P_Random(); // This MD5 was chosen by fair dice roll and most likely < 50% correct. + *p = P_RandomByte(); // This MD5 was chosen by fair dice roll and most likely < 50% correct. #else WRITEUINT8(demo_p, DEMOMARKER); // add the demo end marker md5_buffer((char *)p+16, demo_p - (p+16), (void *)p); // make a checksum of everything after the checksum in the file. @@ -5569,7 +5569,7 @@ boolean G_CheckDemoStatus(void) UINT8 i; WRITEUINT8(demo_p, DEMOMARKER); // add the demo end marker for (i = 0; i < 16; i++, p++) - *p = P_Random(); // This MD5 was chosen by fair dice roll and most likely < 50% correct. + *p = P_RandomByte(); // This MD5 was chosen by fair dice roll and most likely < 50% correct. #else WRITEUINT8(demo_p, DEMOMARKER); // add the demo end marker md5_buffer((char *)p+16, demo_p - (p+16), p); // make a checksum of everything after the checksum in the file. diff --git a/src/hardware/hw3sound.c b/src/hardware/hw3sound.c index efc1d247b..c68430921 100644 --- a/src/hardware/hw3sound.c +++ b/src/hardware/hw3sound.c @@ -384,12 +384,12 @@ INT32 HW3S_I_StartSound(const void *origin_p, source3D_data_t *source_parm, chan /*if (gamemode != heretic) { if (sfx_id >= sfx_sawup && sfx_id <= sfx_sawhit) - pitch += 8 - (M_Random()&15); + pitch += 8 - (M_RandomByte()&15); else if (sfx_id != sfx_itemup && sfx_id != sfx_tink) - pitch += 16 - (M_Random()&31); + pitch += 16 - (M_RandomByte()&31); } else*/ - pitch = 128 + (M_Random() & 7) - (M_Random() & 7); + pitch = 128 + (M_RandomByte() & 7) - (M_RandomByte() & 7); } #endif diff --git a/src/hardware/hw_light.c b/src/hardware/hw_light.c index fb369387f..a93e96dc3 100644 --- a/src/hardware/hw_light.c +++ b/src/hardware/hw_light.c @@ -871,7 +871,7 @@ void HWR_DoCoronasLighting(FOutVector *outVerts, gr_vissprite_t *spr) size = p_lspr->corona_radius * ((outVerts[0].z+120.0f)/950.0f); // d'ou vienne ces constante ? break; case ROCKET_SPR: - p_lspr->corona_color = (((M_Random()>>1)&0xff)<<24)|0x0040ff; + p_lspr->corona_color = (((M_RandomByte()>>1)&0xff)<<24)|0x0040ff; // don't need a break case CORONA_SPR: size = p_lspr->corona_radius * ((outVerts[0].z+60.0f)/100.0f); // d'ou vienne ces constante ? @@ -974,7 +974,7 @@ void HWR_DrawCoronas(void) size = p_lspr->corona_radius * ((cz+120.0f)/950.0f); // d'ou vienne ces constante ? break; case ROCKET_SPR: - Surf.FlatColor.s.alpha = (UINT8)((M_Random()>>1)&0xff); + Surf.FlatColor.s.alpha = (UINT8)((M_RandomByte()>>1)&0xff); // don't need a break case CORONA_SPR: size = p_lspr->corona_radius * ((cz+60.0f)/100.0f); // d'ou vienne ces constante ? diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 2cc79db47..45f18627e 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -96,17 +96,17 @@ static int lib_evalMath(lua_State *L) // M_RANDOM ////////////// -static int lib_pRandom(lua_State *L) +static int lib_pRandomFixed(lua_State *L) { NOHUD - lua_pushinteger(L, P_Random()); + lua_pushfixed(L, P_RandomFixed()); return 1; } -static int lib_pSignedRandom(lua_State *L) +static int lib_pRandomByte(lua_State *L) { NOHUD - lua_pushinteger(L, P_SignedRandom()); + lua_pushinteger(L, P_RandomByte()); return 1; } @@ -134,6 +134,30 @@ static int lib_pRandomRange(lua_State *L) return 1; } +// Deprecated, macros, etc. +static int lib_pRandom(lua_State *L) +{ + NOHUD + LUA_Deprecated(L, "P_Random", "P_RandomByte"); + lua_pushinteger(L, P_RandomByte()); + return 1; +} + +static int lib_pSignedRandom(lua_State *L) +{ + NOHUD + lua_pushinteger(L, P_SignedRandom()); + return 1; +} + +static int lib_pRandomChance(lua_State *L) +{ + fixed_t p = luaL_checkfixed(L, 1); + NOHUD + lua_pushboolean(L, P_RandomChance(p)); + return 1; +} + // P_MAPUTIL /////////////// @@ -1910,10 +1934,13 @@ static luaL_Reg lib[] = { {"EvalMath", lib_evalMath}, // m_random - {"P_Random",lib_pRandom}, - {"P_SignedRandom",lib_pSignedRandom}, + {"P_RandomFixed",lib_pRandomFixed}, + {"P_RandomByte",lib_pRandomByte}, {"P_RandomKey",lib_pRandomKey}, {"P_RandomRange",lib_pRandomRange}, + {"P_Random",lib_pRandom}, // DEPRECATED + {"P_SignedRandom",lib_pSignedRandom}, // MACRO + {"P_RandomChance",lib_pRandomChance}, // MACRO // p_maputil {"P_AproxDistance",lib_pAproxDistance}, diff --git a/src/m_cheat.c b/src/m_cheat.c index 473fbbf75..6ed8d286a 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -618,9 +618,9 @@ void Command_CauseCfail_f(void) } P_UnsetThingPosition(players[consoleplayer].mo); - P_Random(); - P_Random(); - P_Random(); + P_RandomFixed(); + P_RandomByte(); + P_RandomFixed(); players[consoleplayer].mo->x = 0; players[consoleplayer].mo->y = 123311; //cfail cansuled kthxbye players[consoleplayer].mo->z = 123311; diff --git a/src/m_random.c b/src/m_random.c index eab45a3ed..caf4d5174 100644 --- a/src/m_random.c +++ b/src/m_random.c @@ -19,48 +19,51 @@ #include "m_random.h" #include "m_fixed.h" + + // --------------------------- // RNG functions (not synched) // --------------------------- -/** Provides a random byte. - * Used outside the p_xxx game code and not synchronized in netgames. This is - * for anything that doesn't need to be synced, e.g. precipitation. +/** Provides a random fixed point number. Distribution is uniform. + * As with all M_Random functions, not synched in netgames. * - * \return A random byte, 0 to 255. + * \return A random fixed point number from [0,1). */ -UINT8 M_Random(void) +fixed_t M_RandomFixed(void) { - return (rand() & 255); + return (rand() & 0xFFFF); } -/** Provides a random signed byte. Distribution is uniform. - * As with all M_*Random functions, not synched in netgames. +/** Provides a random byte. Distribution is uniform. + * As with all M_Random functions, not synched in netgames. * - * \return A random byte, -128 to 127. - * \sa M_Random + * \return A random integer from [0, 255]. */ -INT32 M_SignedRandom(void) +UINT8 M_RandomByte(void) { - return (rand() & 255) - 128; + return (rand() & 0xFF); } -/** Provides a random number in between 0 and the given number - 1. - * Distribution is uniform. Use for picking random elements from an array. - * As with all M_*Random functions, not synched in netgames. +/** Provides a random integer for picking random elements from an array. + * Distribution is uniform. + * As with all M_Random functions, not synched in netgames. * - * \return A random number, 0 to arg1-1. + * \param a Number of items in array. + * \return A random integer from [0,a). */ INT32 M_RandomKey(INT32 a) { return (INT32)((rand()/((unsigned)RAND_MAX+1.0f))*a); } -/** Provides a random number in between a specific range. +/** Provides a random integer in a given range. * Distribution is uniform. - * As with all M_*Random functions, not synched in netgames. + * As with all M_Random functions, not synched in netgames. * - * \return A random number, arg1 to arg2. + * \param a Lower bound. + * \param b Upper bound. + * \return A random integer from [a,b]. */ INT32 M_RandomRange(INT32 a, INT32 b) { @@ -79,8 +82,7 @@ static UINT32 randomseed = 0; // Holds the INITIAL seed value. Used for demos, possibly other debugging. static UINT32 initialseed = 0; -/** - * Provides a random fixed point number. +/** Provides a random fixed point number. * This is a variant of an xorshift PRNG; state fits in a 32 bit integer structure. * * \return A random fixed point number from [0,1). @@ -96,44 +98,7 @@ ATTRINLINE static fixed_t FUNCINLINE __internal_prng__(void) return (randomseed&((FRACUNIT-1)<<9))>>9; } -/** Provides a random integer from 0 to 255. - * Distribution is uniform. - * If you're curious, (&0xFF00) >> 8 gives the same result - * as a fixed point multiplication by 256. - * - * \return Random integer from [0, 255]. - * \sa __internal_prng__ - */ -#ifndef DEBUGRANDOM -UINT8 P_Random(void) -{ -#else -UINT8 P_RandomD(const char *rfile, INT32 rline) -{ - CONS_Printf("P_Random() at: %sp %d\n", rfile, rline); -#endif - return (UINT8)((__internal_prng__()&0xFF00)>>8); -} - -/** Provides a random integer from -128 to 127. - * Distribution is uniform. - * - * \return Random integer from [-128, 127]. - * \sa __internal_prng__ - */ -#ifndef DEBUGRANDOM -INT32 P_SignedRandom(void) -{ -#else -INT32 P_SignedRandomD(const char *rfile, INT32 rline) -{ - CONS_Printf("P_SignedRandom() at: %sp %d\n", rfile, rline); -#endif - return (INT32)((__internal_prng__()&0xFF00)>>8) - 128; -} - -/** - * Provides a random fixed point number. +/** Provides a random fixed point number. Distribution is uniform. * Literally a wrapper for the internal PRNG function. * * \return A random fixed point number from [0,1). @@ -144,14 +109,34 @@ fixed_t P_RandomFixed(void) #else UINT8 P_RandomFixedD(const char *rfile, INT32 rline) { - CONS_Printf("P_Random() at: %sp %d\n", rfile, rline); + CONS_Printf("P_RandomFixed() at: %sp %d\n", rfile, rline); #endif return __internal_prng__(); } +/** Provides a random byte. Distribution is uniform. + * If you're curious, (&0xFF00) >> 8 gives the same result + * as a fixed point multiplication by 256. + * + * \return Random integer from [0, 255]. + * \sa __internal_prng__ + */ +#ifndef DEBUGRANDOM +UINT8 P_RandomByte(void) +{ +#else +UINT8 P_RandomByteD(const char *rfile, INT32 rline) +{ + CONS_Printf("P_RandomByte() at: %sp %d\n", rfile, rline); +#endif + return (UINT8)((__internal_prng__()&0xFF00)>>8); +} + /** Provides a random integer for picking random elements from an array. * Distribution is uniform. + * NOTE: Maximum range is 65536. * + * \param a Number of items in array. * \return A random integer from [0,a). * \sa __internal_prng__ */ @@ -168,8 +153,11 @@ INT32 P_RandomKeyD(const char *rfile, INT32 rline, INT32 a) /** Provides a random integer in a given range. * Distribution is uniform. + * NOTE: Maximum range is 65536. * - * \return A random integer from [a,b].P_Random + * \param a Lower bound. + * \param b Upper bound. + * \return A random integer from [a,b]. * \sa __internal_prng__ */ #ifndef DEBUGRANDOM diff --git a/src/m_random.h b/src/m_random.h index 91348365b..90784a5d0 100644 --- a/src/m_random.h +++ b/src/m_random.h @@ -25,30 +25,36 @@ // P_Random functions pulls random bytes from a PRNG that is network synced. // RNG functions -UINT8 M_Random(void); -INT32 M_SignedRandom(void); -INT32 M_RandomKey(INT32 a); -INT32 M_RandomRange(INT32 a, INT32 b); +fixed_t M_RandomFixed(void); +UINT8 M_RandomByte(void); +INT32 M_RandomKey(INT32 a); +INT32 M_RandomRange(INT32 a, INT32 b); // PRNG functions #ifdef DEBUGRANDOM -#define P_Random() P_RandomD(__FILE__, __LINE__) -#define P_SignedRandom() P_SignedRandomD(__FILE__, __LINE__) #define P_RandomFixed() P_RandomFixedD(__FILE__, __LINE__) +#define P_RandomByte() P_RandomByteD(__FILE__, __LINE__) #define P_RandomKey(c) P_RandomKeyD(__FILE__, __LINE__, c) #define P_RandomRange(c, d) P_RandomRangeD(__FILE__, __LINE__, c, d) -UINT8 P_RandomD(const char *rfile, INT32 rline); -INT32 P_SignedRandomD(const char *rfile, INT32 rline); fixed_t P_RandomFixedD(const char *rfile, INT32 rline); -INT32 P_RandomKeyD(const char *rfile, INT32 rline, INT32 a); -INT32 P_RandomRangeD(const char *rfile, INT32 rline, INT32 a, INT32 b); +UINT8 P_RandomByteD(const char *rfile, INT32 rline); +INT32 P_RandomKeyD(const char *rfile, INT32 rline, INT32 a); +INT32 P_RandomRangeD(const char *rfile, INT32 rline, INT32 a, INT32 b); #else -UINT8 P_Random(void); -INT32 P_SignedRandom(void); fixed_t P_RandomFixed(void); -INT32 P_RandomKey(INT32 a); -INT32 P_RandomRange(INT32 a, INT32 b); +UINT8 P_RandomByte(void); +INT32 P_RandomKey(INT32 a); +INT32 P_RandomRange(INT32 a, INT32 b); #endif + +// Macros for other functions +#define M_SignedRandom() ((INT32)M_RandomByte() - 128) // [-128, 127] signed byte, originally a +#define P_SignedRandom() ((INT32)P_RandomByte() - 128) // function of its own, moved to a macro + +#define M_RandomChance(p) (M_RandomFixed() < p) // given fixed point probability, p, between 0 (0%) +#define P_RandomChance(p) (P_RandomFixed() < p) // and FRACUNIT (100%), returns true p% of the time + +// Debugging fixed_t P_RandomPeek(void); // Working with the seed for PRNG diff --git a/src/p_enemy.c b/src/p_enemy.c index 367d5714a..b8737810c 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -386,7 +386,7 @@ boolean P_CheckMissileRange(mobj_t *actor) if (actor->type == MT_EGGMOBILE && dist > 160) dist = 160; - if (P_Random() < dist) + if (P_RandomByte() < dist) return false; return true; @@ -486,7 +486,7 @@ static boolean P_TryWalk(mobj_t *actor) { if (!P_Move(actor, actor->info->speed)) return false; - actor->movecount = P_Random() & 15; + actor->movecount = P_RandomByte() & 15; return true; } @@ -539,7 +539,7 @@ void P_NewChaseDir(mobj_t *actor) } // try other directions - if (P_Random() > 200 || abs(deltay) > abs(deltax)) + if (P_RandomChance(25*FRACUNIT/32) || abs(deltay) > abs(deltax)) { tdir = d[1]; d[1] = d[2]; @@ -577,7 +577,7 @@ void P_NewChaseDir(mobj_t *actor) } // randomly determine direction of search - if (P_Random() & 1) + if (P_RandomChance(FRACUNIT/2)) { for (tdir = DI_EAST; tdir <= DI_SOUTHEAST; tdir++) { @@ -632,7 +632,7 @@ boolean P_LookForPlayers(mobj_t *actor, boolean allaround, boolean tracer, fixed // BP: first time init, this allow minimum lastlook changes if (actor->lastlook < 0) - actor->lastlook = P_Random(); + actor->lastlook = P_RandomByte(); actor->lastlook %= MAXPLAYERS; @@ -707,7 +707,7 @@ static boolean P_LookForShield(mobj_t *actor) // BP: first time init, this allow minimum lastlook changes if (actor->lastlook < 0) - actor->lastlook = P_Random(); + actor->lastlook = P_RandomByte(); actor->lastlook %= MAXPLAYERS; @@ -2293,12 +2293,7 @@ void A_SkullAttack(mobj_t *actor) if (locvar1 == 1) actor->angle += ANGLE_180; else if (locvar1 == 2) - { - if (P_Random() & 1) - actor->angle += ANGLE_90; - else - actor->angle -= ANGLE_90; - } + actor->angle += (P_RandomChance(FRACUNIT/2)) ? ANGLE_90 : -ANGLE_90; an = actor->angle >> ANGLETOFINESHIFT; @@ -2398,9 +2393,9 @@ void A_BossScream(mobj_t *actor) explodetype = (mobjtype_t)locvar2; if (actor->eflags & MFE_VERTICALFLIP) - z = actor->z + actor->height - mobjinfo[explodetype].height - FixedMul((P_Random()<<(FRACBITS-2)) - 8*FRACUNIT, actor->scale); + z = actor->z + actor->height - mobjinfo[explodetype].height - FixedMul((P_RandomByte()<<(FRACBITS-2)) - 8*FRACUNIT, actor->scale); else - z = actor->z + FixedMul((P_Random()<<(FRACBITS-2)) - 8*FRACUNIT, actor->scale); + z = actor->z + FixedMul((P_RandomByte()<<(FRACBITS-2)) - 8*FRACUNIT, actor->scale); mo = P_SpawnMobj(x, y, z, explodetype); if (actor->eflags & MFE_VERTICALFLIP) @@ -3461,7 +3456,7 @@ void A_BubbleSpawn(mobj_t *actor) return; // don't make bubble! } - prandom = P_Random(); + prandom = P_RandomByte(); if (leveltime % (3*TICRATE) < 8) bubble = P_SpawnMobj(actor->x, actor->y, actor->z + (actor->height / 2), MT_EXTRALARGEBUBBLE); @@ -3509,7 +3504,7 @@ void A_FanBubbleSpawn(mobj_t *actor) return; // don't make bubble! } - prandom = P_Random(); + prandom = P_RandomByte(); if ((prandom & 0x7) == 0x7) bubble = P_SpawnMobj(actor->x, actor->y, hz, MT_SMALLBUBBLE); @@ -3550,7 +3545,7 @@ void A_BubbleRise(mobj_t *actor) // Move around slightly to make it look like it's bending around the water if (!locvar1) { - UINT8 prandom = P_Random(); + UINT8 prandom = P_RandomByte(); if (!(prandom & 0x7)) // *****000 { P_InstaThrust(actor, prandom & 0x70 ? actor->angle + ANGLE_90 : actor->angle, @@ -3833,7 +3828,7 @@ void A_ThrownRing(mobj_t *actor) // first time init, this allow minimum lastlook changes if (actor->lastlook < 0) - actor->lastlook = P_Random(); + actor->lastlook = P_RandomByte(); actor->lastlook %= MAXPLAYERS; @@ -3913,7 +3908,7 @@ void A_SetSolidSteam(mobj_t *actor) #endif actor->flags &= ~MF_NOCLIP; actor->flags |= MF_SOLID; - if (!(P_Random() & 7)) + if (P_RandomChance(FRACUNIT/8)) { if (actor->info->deathsound) S_StartSound(actor, actor->info->deathsound); // Hiss! @@ -4055,7 +4050,7 @@ void A_JetChase(mobj_t *actor) if (actor->reactiontime) actor->reactiontime--; - if (P_Random() % 32 == 1) + if (P_RandomChance(FRACUNIT/32)) { actor->momx = actor->momx / 2; actor->momy = actor->momy / 2; @@ -4416,7 +4411,7 @@ void A_JetgThink(mobj_t *actor) if (actor->target) { - if (P_Random() <= 32 && !actor->reactiontime) + if (P_RandomChance(FRACUNIT/8) && !actor->reactiontime) P_SetMobjState(actor, actor->info->missilestate); else A_JetChase (actor); @@ -4469,10 +4464,10 @@ void A_MouseThink(mobj_t *actor) { if (twodlevel || actor->flags2 & MF2_TWOD) { - if (P_Random() & 1) + if (P_RandomChance(FRACUNIT/2)) actor->angle += ANGLE_180; } - else if (P_Random() & 1) + else if (P_RandomChance(FRACUNIT/2)) actor->angle += ANGLE_90; else actor->angle -= ANGLE_90; @@ -4878,7 +4873,7 @@ void A_RockSpawn(mobj_t *actor) type = MT_ROCKCRUMBLE1 + (sides[line->sidenum[0]].rowoffset >> FRACBITS); if (line->flags & ML_NOCLIMB) - randomoomph = P_Random() * (FRACUNIT/32); + randomoomph = P_RandomByte() * (FRACUNIT/32); else randomoomph = 0; @@ -5172,7 +5167,7 @@ void A_CrawlaCommanderThink(mobj_t *actor) if (locvar1) { - if (actor->health < 2 && P_Random() < 2) + if (actor->health < 2 && P_RandomChance(FRACUNIT/128)) P_SpawnMissile(actor, actor->target, locvar1); } @@ -5187,8 +5182,8 @@ void A_CrawlaCommanderThink(mobj_t *actor) actor->threshold = 0; // Roam around, somewhat in the player's direction. - actor->angle += (P_Random()<<10); - actor->angle -= (P_Random()<<10); + actor->angle += (P_RandomByte()<<10); + actor->angle -= (P_RandomByte()<<10); if (actor->health > 1) P_InstaThrust(actor, actor->angle, FixedMul(10*FRACUNIT, actor->scale)); @@ -5204,7 +5199,7 @@ void A_CrawlaCommanderThink(mobj_t *actor) actor->threshold = 1; } } - actor->reactiontime = 2*TICRATE + P_Random()/2; + actor->reactiontime = 2*TICRATE + P_RandomByte()/2; } if (actor->health == 1) @@ -5222,8 +5217,8 @@ void A_CrawlaCommanderThink(mobj_t *actor) } else { - UINT8 prandom = P_Random(); - actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y) + (P_Random() & 1 ? -prandom : +prandom); + UINT8 prandom = P_RandomByte(); + actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y) + (P_RandomChance(FRACUNIT/2) ? -prandom : +prandom); P_InstaThrust(actor, actor->angle, FixedDiv(FixedMul(locvar2, actor->scale), 3*FRACUNIT/2)); actor->momz = FixedMul(locvar2, actor->scale); // Bounce up in air } @@ -5552,7 +5547,7 @@ void A_MixUp(mobj_t *actor) { if (counter > 255) // fail-safe to avoid endless loop break; - prandom = P_Random(); + prandom = P_RandomByte(); prandom %= numplayers; // I love modular arithmetic, don't you? if (prandom) // Make sure it's not a useless mix break; @@ -5701,7 +5696,7 @@ void A_RecyclePowers(mobj_t *actor) { UINT8 tempint; - i = j + ((P_Random() + leveltime) % (numplayers - j)); + i = j + ((P_RandomByte() + leveltime) % (numplayers - j)); tempint = postscramble[j]; postscramble[j] = postscramble[i]; postscramble[i] = tempint; @@ -5814,7 +5809,7 @@ void A_Boss1Chase(mobj_t *actor) { if (actor->health > actor->info->damage) { - if (P_Random() & 1) + if (P_RandomChance(FRACUNIT/2)) P_SetMobjState(actor, actor->info->missilestate); else P_SetMobjState(actor, actor->info->meleestate); @@ -5833,7 +5828,7 @@ void A_Boss1Chase(mobj_t *actor) // ? nomissile: // possibly choose another target - if (multiplayer && P_Random() < 2) + if (multiplayer && P_RandomChance(FRACUNIT/128)) { if (P_LookForPlayers(actor, true, false, 0)) return; // got a new target @@ -5871,7 +5866,7 @@ nomissile: deltay = actor->target->y - actor->y; actor->movedir = diags[((deltay < 0)<<1) + (deltax > 0)]; - actor->movecount = P_Random() & 15; + actor->movecount = P_RandomByte() & 15; } } @@ -5897,13 +5892,13 @@ void A_Boss2Chase(mobj_t *actor) // Startup randomness if (actor->reactiontime <= -666) - actor->reactiontime = 2*TICRATE + P_Random(); + actor->reactiontime = 2*TICRATE + P_RandomByte(); // When reactiontime hits zero, he will go the other way if (--actor->reactiontime <= 0) { reverse = true; - actor->reactiontime = 2*TICRATE + P_Random(); + actor->reactiontime = 2*TICRATE + P_RandomByte(); } P_SetTarget(&actor->target, P_GetClosestAxis(actor)); @@ -5990,12 +5985,12 @@ void A_Boss2Chase(mobj_t *actor) if (actor->info->attacksound) S_StartAttackSound(actor, actor->info->attacksound); - if (P_Random() & 1) + if (P_RandomChance(FRACUNIT/2)) { goop->momx *= 2; goop->momy *= 2; } - else if (P_Random() > 128) + else if (P_RandomChance(129*FRACUNIT/256)) { goop->momx *= 3; goop->momy *= 3; @@ -6153,7 +6148,7 @@ void A_Boss7Chase(mobj_t *actor) { A_FaceTarget(actor); P_SetMobjState(actor, S_BLACKEGG_SHOOT1); - actor->movecount = TICRATE + P_Random()/2; + actor->movecount = TICRATE + P_RandomByte()/2; return; } @@ -6162,7 +6157,7 @@ void A_Boss7Chase(mobj_t *actor) if (actor->reactiontime <= 0 && actor->z == actor->floorz) { - // Here, we'll call P_Random() and decide what kind of attack to do + // Here, we'll call P_RandomByte() and decide what kind of attack to do switch(actor->threshold) { case 0: // Lob cannon balls @@ -6170,7 +6165,7 @@ void A_Boss7Chase(mobj_t *actor) { A_FaceTarget(actor); P_SetMobjState(actor, actor->info->xdeathstate); - actor->movecount = 7*TICRATE + P_Random(); + actor->movecount = 7*TICRATE + P_RandomByte(); break; } actor->threshold++; @@ -6180,9 +6175,9 @@ void A_Boss7Chase(mobj_t *actor) P_SetMobjState(actor, S_BLACKEGG_SHOOT1); if (actor->health > actor->info->damage) - actor->movecount = TICRATE + P_Random()/3; + actor->movecount = TICRATE + P_RandomByte()/3; else - actor->movecount = TICRATE + P_Random()/2; + actor->movecount = TICRATE + P_RandomByte()/2; break; case 2: // Homing Missile A_FaceTarget(actor); @@ -6266,8 +6261,8 @@ void A_Boss2PogoSFX(mobj_t *actor) } else { - UINT8 prandom = P_Random(); - actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y) + (P_Random() & 1 ? -prandom : +prandom); + UINT8 prandom = P_RandomByte(); + actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y) + (P_RandomChance(FRACUNIT/2) ? -prandom : +prandom); P_InstaThrust(actor, actor->angle, FixedMul(FixedMul(actor->info->speed,(locvar2)), actor->scale)); } if (actor->info->activesound) S_StartSound(actor, actor->info->activesound); @@ -6307,10 +6302,10 @@ void A_Boss2PogoTarget(mobj_t *actor) // Target hit, retreat! if (actor->target->player->powers[pw_flashing] > TICRATE || actor->flags2 & MF2_FRET) { - UINT8 prandom = P_Random(); + UINT8 prandom = P_RandomByte(); actor->z++; // unstick from the floor actor->momz = FixedMul(locvar1, actor->scale); // Bounce up in air - actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y) + (P_Random() & 1 ? -prandom : +prandom); // Pick a direction, and randomize it. + actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y) + (P_RandomChance(FRACUNIT/2) ? -prandom : +prandom); // Pick a direction, and randomize it. P_InstaThrust(actor, actor->angle+ANGLE_180, FixedMul(FixedMul(actor->info->speed,(locvar2)), actor->scale)); // Move at wandering speed } // Try to land on top of the player. @@ -6347,10 +6342,10 @@ void A_Boss2PogoTarget(mobj_t *actor) // Wander semi-randomly towards the player to get closer. else { - UINT8 prandom = P_Random(); + UINT8 prandom = P_RandomByte(); actor->z++; // unstick from the floor actor->momz = FixedMul(locvar1, actor->scale); // Bounce up in air - actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y) + (P_Random() & 1 ? -prandom : +prandom); // Pick a direction, and randomize it. + actor->angle = R_PointToAngle2(actor->x, actor->y, actor->target->x, actor->target->y) + (P_RandomChance(FRACUNIT/2) ? -prandom : +prandom); // Pick a direction, and randomize it. P_InstaThrust(actor, actor->angle, FixedMul(FixedMul(actor->info->speed,(locvar2)), actor->scale)); // Move at wandering speed } // Boing! @@ -7084,7 +7079,7 @@ void A_SmokeTrailer(mobj_t *actor) P_SetObjectMomZ(th, FRACUNIT, false); th->destscale = actor->scale; P_SetScale(th, actor->scale); - th->tics -= P_Random() & 3; + th->tics -= P_RandomByte() & 3; if (th->tics < 1) th->tics = 1; } @@ -7183,7 +7178,7 @@ void A_ChangeAngleRelative(mobj_t *actor) // rather than the ranges, so <0 and >360 work as possible values. -Red INT32 locvar1 = var1; INT32 locvar2 = var2; - //angle_t angle = (P_Random()+1)<<24; + //angle_t angle = (P_RandomByte()+1)<<24; const fixed_t amin = locvar1*FRACUNIT; const fixed_t amax = locvar2*FRACUNIT; //const angle_t amin = FixedAngle(locvar1*FRACUNIT); @@ -7217,7 +7212,7 @@ void A_ChangeAngleAbsolute(mobj_t *actor) { INT32 locvar1 = var1; INT32 locvar2 = var2; - //angle_t angle = (P_Random()+1)<<24; + //angle_t angle = (P_RandomByte()+1)<<24; const fixed_t amin = locvar1*FRACUNIT; const fixed_t amax = locvar2*FRACUNIT; //const angle_t amin = FixedAngle(locvar1*FRACUNIT); @@ -7825,7 +7820,7 @@ void A_RandomState(mobj_t *actor) return; #endif - P_SetMobjState(actor, P_Random()&1 ? locvar1 : locvar2); + P_SetMobjState(actor, P_RandomChance(FRACUNIT/2) ? locvar1 : locvar2); } // Function: A_RandomStateRange @@ -8516,34 +8511,29 @@ void A_SearchForPlayers(mobj_t *actor) // Function: A_CheckRandom // -// Description: Calls a state by chance (around 1/var1). +// Description: Calls a state by chance. // -// var1 = denominator (can't exceed 100) +// var1: +// lower 16 bits = denominator +// upper 16 bits = numerator (defaults to 1 if zero) // var2 = state number // void A_CheckRandom(mobj_t *actor) { INT32 locvar1 = var1; INT32 locvar2 = var2; - INT32 i, chance; - INT32 rndadd = 0; + fixed_t chance = FRACUNIT; + #ifdef HAVE_BLUA if (LUA_CallAction("A_CheckRandom", actor)) return; #endif + // The PRNG doesn't suck anymore, OK? + if (locvar1 >> 16) + chance *= (locvar1 >> 16); + chance /= (locvar1 & 0xFFFF); - if(locvar1 > 100) - locvar1 = 100; - - for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i]) - rndadd += abs((int)players[i].mo->x) + abs((int)players[i].mo->y) + abs((int)players[i].mo->z); - - rndadd = rndadd % 10000; //additional component to enlarge random number - - chance = (P_Random() + rndadd) % locvar1; - - if (chance == 0) + if (P_RandomChance(chance)) P_SetMobjState(actor, locvar2); } @@ -9890,7 +9880,7 @@ void A_BrakChase(mobj_t *actor) S_StartSound(actor, (sfxenum_t)locvar2); // make active sound - if (actor->type != MT_CYBRAKDEMON && actor->info->activesound && P_Random() < 3) + if (actor->type != MT_CYBRAKDEMON && actor->info->activesound && P_RandomChance(3*FRACUNIT/256)) { S_StartSound(actor, actor->info->activesound); } diff --git a/src/p_inter.c b/src/p_inter.c index b8101f12b..128b50721 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1236,7 +1236,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (special->target && special->target->state == &states[S_BLACKEGG_SHOOT1]) { - if (special->target->health <= 2 && (P_Random() & 1)) + if (special->target->health <= 2 && P_RandomChance(FRACUNIT/2)) P_SetMobjState(special->target, special->target->info->missilestate); else P_SetMobjState(special->target, special->target->info->raisestate); @@ -2186,29 +2186,17 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source) default: if (target->info->doomednum) + prandom = target->info->doomednum%5; // "Random" animal for new enemies. + else + prandom = P_RandomKey(5); // No placable object, just use a random number. + + switch(prandom) { - switch(target->info->doomednum%5) - { default: item = MT_BUNNY; break; case 1: item = MT_BIRD; break; case 2: item = MT_MOUSE; break; case 3: item = MT_COW; break; case 4: item = MT_CHICKEN; break; - } - } - else - { - prandom = P_Random(); - if (prandom < 51) - item = MT_BUNNY; - else if (prandom < 102) - item = MT_BIRD; - else if (prandom < 153) - item = MT_MOUSE; - else if (prandom < 204) - item = MT_COW; - else - item = MT_CHICKEN; } break; } @@ -3086,7 +3074,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da // Killing dead. Just for kicks. // Require source and inflictor be player. Don't hurt for firing rings. - if (cv_killingdead.value && (source && source->player) && (inflictor && inflictor->player) && P_Random() < 80) + if (cv_killingdead.value && (source && source->player) && (inflictor && inflictor->player) && P_RandomChance(5*FRACUNIT/16)) P_DamageMobj(source, target, target, 1); // do the damage @@ -3600,7 +3588,7 @@ void P_PlayerFlagBurst(player_t *player, boolean toss) P_InstaThrust(flag, player->mo->angle, FixedMul(6*FRACUNIT, player->mo->scale)); else { - angle_t fa = P_Random()*FINEANGLES/256; + angle_t fa = P_RandomByte()*FINEANGLES/256; flag->momx = FixedMul(FINECOSINE(fa), FixedMul(6*FRACUNIT, player->mo->scale)); if (!(twodlevel || (player->mo->flags2 & MF2_TWOD))) flag->momy = FixedMul(FINESINE(fa), FixedMul(6*FRACUNIT, player->mo->scale)); diff --git a/src/p_lights.c b/src/p_lights.c index 2dfe006dc..a9758c723 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -51,7 +51,7 @@ void T_FireFlicker(fireflicker_t *flick) if (--flick->count) return; - amount = (INT16)((UINT8)(P_Random() & 3) * 16); + amount = (INT16)((UINT8)(P_RandomByte() & 3) * 16); if (flick->sector->lightlevel - amount < flick->minlight) flick->sector->lightlevel = (INT16)flick->minlight; @@ -235,7 +235,7 @@ strobe_t *P_SpawnAdjustableStrobeFlash(sector_t *minsector, sector_t *maxsector, flash->minlight = 0; if (!inSync) - flash->count = (P_Random() & 7) + 1; + flash->count = (P_RandomByte() & 7) + 1; else flash->count = 1; diff --git a/src/p_mobj.c b/src/p_mobj.c index 4e60ad612..150af1e08 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -652,9 +652,9 @@ void P_EmeraldManager(void) break; if (leveltime < TICRATE) // Start of map - spawnpoints[j]->threshold = 60*TICRATE + P_Random() * (TICRATE/5); + spawnpoints[j]->threshold = 60*TICRATE + P_RandomByte() * (TICRATE/5); else - spawnpoints[j]->threshold = P_Random() * (TICRATE/5); + spawnpoints[j]->threshold = P_RandomByte() * (TICRATE/5); break; } @@ -683,26 +683,26 @@ void P_ExplodeMissile(mobj_t *mo) explodemo = P_SpawnMobj(mo->x, mo->y, mo->z, MT_EXPLODE); P_SetScale(explodemo, mo->scale); explodemo->destscale = mo->destscale; - explodemo->momx += (P_Random() % 32) * FixedMul(FRACUNIT/8, explodemo->scale); - explodemo->momy += (P_Random() % 32) * FixedMul(FRACUNIT/8, explodemo->scale); + explodemo->momx += (P_RandomByte() % 32) * FixedMul(FRACUNIT/8, explodemo->scale); + explodemo->momy += (P_RandomByte() % 32) * FixedMul(FRACUNIT/8, explodemo->scale); S_StartSound(explodemo, sfx_pop); explodemo = P_SpawnMobj(mo->x, mo->y, mo->z, MT_EXPLODE); P_SetScale(explodemo, mo->scale); explodemo->destscale = mo->destscale; - explodemo->momx += (P_Random() % 64) * FixedMul(FRACUNIT/8, explodemo->scale); - explodemo->momy -= (P_Random() % 64) * FixedMul(FRACUNIT/8, explodemo->scale); + explodemo->momx += (P_RandomByte() % 64) * FixedMul(FRACUNIT/8, explodemo->scale); + explodemo->momy -= (P_RandomByte() % 64) * FixedMul(FRACUNIT/8, explodemo->scale); S_StartSound(explodemo, sfx_dmpain); explodemo = P_SpawnMobj(mo->x, mo->y, mo->z, MT_EXPLODE); P_SetScale(explodemo, mo->scale); explodemo->destscale = mo->destscale; - explodemo->momx -= (P_Random() % 128) * FixedMul(FRACUNIT/8, explodemo->scale); - explodemo->momy += (P_Random() % 128) * FixedMul(FRACUNIT/8, explodemo->scale); + explodemo->momx -= (P_RandomByte() % 128) * FixedMul(FRACUNIT/8, explodemo->scale); + explodemo->momy += (P_RandomByte() % 128) * FixedMul(FRACUNIT/8, explodemo->scale); S_StartSound(explodemo, sfx_pop); explodemo = P_SpawnMobj(mo->x, mo->y, mo->z, MT_EXPLODE); P_SetScale(explodemo, mo->scale); explodemo->destscale = mo->destscale; - explodemo->momx -= (P_Random() % 96) * FixedMul(FRACUNIT/8, explodemo->scale); - explodemo->momy -= (P_Random() % 96) * FixedMul(FRACUNIT/8, explodemo->scale); + explodemo->momx -= (P_RandomByte() % 96) * FixedMul(FRACUNIT/8, explodemo->scale); + explodemo->momy -= (P_RandomByte() % 96) * FixedMul(FRACUNIT/8, explodemo->scale); S_StartSound(explodemo, sfx_cybdth); // Hack: Release an animal. @@ -2405,12 +2405,12 @@ static boolean P_ZMovement(mobj_t *mo) // If deafed, give the tumbleweed another random kick if it runs out of steam. mom.z += P_MobjFlip(mo)*FixedMul(6*FRACUNIT, mo->scale); - if (P_Random() & 1) + if (P_RandomChance(FRACUNIT/2)) mom.x += FixedMul(6*FRACUNIT, mo->scale); else mom.x -= FixedMul(6*FRACUNIT, mo->scale); - if (P_Random() & 1) + if (P_RandomChance(FRACUNIT/2)) mom.y += FixedMul(6*FRACUNIT, mo->scale); else mom.y -= FixedMul(6*FRACUNIT, mo->scale); @@ -2886,7 +2886,7 @@ static boolean P_SceneryZMovement(mobj_t *mo) for (i = 0; i < 4; ++i) // split into four { - prandom = P_Random(); + prandom = P_RandomByte(); explodemo = P_SpawnMobj(mo->x, mo->y, mo->z, MT_SMALLBUBBLE); explodemo->momx += ((prandom & 0x0F) << (FRACBITS-2)) * (i & 2 ? -1 : 1); explodemo->momy += ((prandom & 0xF0) << (FRACBITS-6)) * (i & 1 ? -1 : 1); @@ -3218,13 +3218,13 @@ void P_MobjCheckWater(mobj_t *mobj) // Create tons of bubbles for (i = 0; i < bubblecount; i++) { - // P_Random()s are called individually to allow consistency + // P_RandomByte()s are called individually to allow consistency // across various compilers, since the order of function calls // in C is not part of the ANSI specification. - prandom[0] = P_Random(); - prandom[1] = P_Random(); - prandom[2] = P_Random(); - prandom[3] = P_Random(); + prandom[0] = P_RandomByte(); + prandom[1] = P_RandomByte(); + prandom[2] = P_RandomByte(); + prandom[3] = P_RandomByte(); bubbletype = MT_SMALLBUBBLE; if (!(prandom[0] & 0x3)) // medium bubble chance up to 64 from 32 @@ -3826,7 +3826,7 @@ boolean P_BossTargetPlayer(mobj_t *actor, boolean closest) // first time init, this allow minimum lastlook changes if (actor->lastlook < 0) - actor->lastlook = P_Random(); + actor->lastlook = P_RandomByte(); actor->lastlook &= PLAYERSMASK; for( ; ; actor->lastlook = (actor->lastlook+1) & PLAYERSMASK) @@ -4707,7 +4707,7 @@ static void P_Boss7Thinker(mobj_t *mobj) if (mobj->state == &states[S_BLACKEGG_STND] && mobj->tics == mobj->state->tics) { - mobj->reactiontime += P_Random(); + mobj->reactiontime += P_RandomByte(); if (mobj->health <= mobj->info->damage) mobj->reactiontime /= 4; @@ -4901,7 +4901,7 @@ static void P_Boss7Thinker(mobj_t *mobj) if (mobj->tracer && mobj->tracer->type == MT_BOSS3WAYPOINT && mobj->tracer->spawnpoint && (mobj->tracer->spawnpoint->options & 7) == waypointNum) { - if (P_Random() & 1) + if (P_RandomChance(FRACUNIT/2)) waypointNum++; else waypointNum--; @@ -4913,7 +4913,7 @@ static void P_Boss7Thinker(mobj_t *mobj) } if (waypointNum == 0 && mobj->health <= mobj->info->damage) - waypointNum = 1 + (P_Random() & 1); + waypointNum = 1 + (P_RandomFixed() & 1); // scan the thinkers to find // the waypoint to use @@ -5013,7 +5013,7 @@ static void P_Boss7Thinker(mobj_t *mobj) P_SetMobjState(mobj, mobj->info->spawnstate); } else if (mobj->state == &states[mobj->info->deathstate] && mobj->tics == mobj->state->tics) - S_StartSound(0, sfx_bedie1 + (P_Random() & 1)); + S_StartSound(0, sfx_bedie1 + (P_RandomFixed() & 1)); } @@ -5440,7 +5440,7 @@ static void P_Boss9Thinker(mobj_t *mobj) // An incoming attack is detected! What should we do?! // Go into vector form! mobj->movedir = ANGLE_11hh - FixedAngle(FixedMul(AngleFixed(ANGLE_11hh), FixedDiv((mobj->info->spawnhealth - mobj->health)<info->spawnhealth-1)<movedir = InvAngle(mobj->movedir); mobj->threshold = 6 + (FixedMul(24<info->spawnhealth - mobj->health)<info->spawnhealth-1)<>FRACBITS); if (mobj->info->activesound) @@ -6042,20 +6042,20 @@ static void P_KoopaThinker(mobj_t *koopa) P_XYMovement(koopa); - if (P_Random() < 8 && koopa->z <= koopa->floorz) + if (P_RandomChance(FRACUNIT/32) && koopa->z <= koopa->floorz) koopa->momz = FixedMul(5*FRACUNIT, koopa->scale); if (koopa->z > koopa->floorz) koopa->momz += FixedMul(FRACUNIT/4, koopa->scale); - if (P_Random() < 4) + if (P_RandomChance(FRACUNIT/64)) { mobj_t *flame; - flame = P_SpawnMobj(koopa->x - koopa->radius + FixedMul(5*FRACUNIT, koopa->scale), koopa->y, koopa->z + (P_Random()<<(FRACBITS-2)), MT_KOOPAFLAME); + flame = P_SpawnMobj(koopa->x - koopa->radius + FixedMul(5*FRACUNIT, koopa->scale), koopa->y, koopa->z + (P_RandomByte()<<(FRACBITS-2)), MT_KOOPAFLAME); flame->momx = -FixedMul(flame->info->speed, flame->scale); S_StartSound(flame, sfx_koopfr); } - else if (P_Random() > 250) + else if (P_RandomChance(5*FRACUNIT/256)) { mobj_t *hammer; hammer = P_SpawnMobj(koopa->x - koopa->radius, koopa->y, koopa->z + koopa->height, MT_HAMMER); @@ -6499,11 +6499,11 @@ void P_MobjThinker(mobj_t *mobj) fixed_t ns; mobj_t *mo2; - i = P_Random(); - z = mobj->subsector->sector->floorheight + ((P_Random()&63)*FRACUNIT); + i = P_RandomByte(); + z = mobj->subsector->sector->floorheight + ((P_RandomByte()&63)*FRACUNIT); for (j = 0; j < 2; j++) { - const angle_t fa = (P_Random()*FINEANGLES/16) & FINEMASK; + const angle_t fa = (P_RandomByte()*FINEANGLES/16) & FINEMASK; ns = 64 * FRACUNIT; x = mobj->x + FixedMul(FINESINE(fa),ns); y = mobj->y + FixedMul(FINECOSINE(fa),ns); @@ -6513,7 +6513,7 @@ void P_MobjThinker(mobj_t *mobj) mo2->momx = FixedMul(FINESINE(fa),ns); mo2->momy = FixedMul(FINECOSINE(fa),ns); - i = P_Random(); + i = P_RandomByte(); if (i % 5 == 0) P_SpawnMobj(x, y, z, MT_CHICKEN); @@ -7997,7 +7997,7 @@ void P_SpawnPrecipitation(void) continue; rainmo = P_SpawnSnowMobj(x, y, height, MT_SNOWFLAKE); - mrand = M_Random(); + mrand = M_RandomByte(); if (mrand < 64) P_SetPrecipMobjState(rainmo, S_SNOW3); else if (mrand < 144) @@ -9166,12 +9166,12 @@ ML_NOCLIMB : Direction not controllable { mobj->momz += FixedMul(16*FRACUNIT, mobj->scale); - if (P_Random() & 1) + if (P_RandomChance(FRACUNIT/2)) mobj->momx += FixedMul(16*FRACUNIT, mobj->scale); else mobj->momx -= FixedMul(16*FRACUNIT, mobj->scale); - if (P_Random() & 1) + if (P_RandomChance(FRACUNIT/2)) mobj->momy += FixedMul(16*FRACUNIT, mobj->scale); else mobj->momy -= FixedMul(16*FRACUNIT,mobj->scale); diff --git a/src/p_spec.c b/src/p_spec.c index 277fe19eb..415e1be01 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2057,7 +2057,7 @@ void P_SwitchWeather(INT32 weathernum) precipmobj = (precipmobj_t *)think; precipmobj->flags = mobjinfo[MT_SNOWFLAKE].flags; - z = M_Random(); + z = M_RandomByte(); if (z < 64) z = 2; diff --git a/src/p_tick.c b/src/p_tick.c index c72ab5b67..d45f58821 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -363,7 +363,7 @@ static void P_DoAutobalanceTeams(void) { if (totalred > totalblue) { - i = M_Random() % red; + i = M_RandomKey(red); NetPacket.packet.newteam = 2; NetPacket.packet.playernum = redarray[i]; NetPacket.packet.verification = true; @@ -375,7 +375,7 @@ static void P_DoAutobalanceTeams(void) if (totalblue > totalred) { - i = M_Random() % blue; + i = M_RandomKey(blue); NetPacket.packet.newteam = 1; NetPacket.packet.playernum = bluearray[i]; NetPacket.packet.verification = true; diff --git a/src/p_user.c b/src/p_user.c index 03b2c1dd8..380ac9804 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2172,9 +2172,9 @@ static void P_DoBubbleBreath(player_t *player) if (!(player->mo->eflags & MFE_UNDERWATER) || ((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL && !(player->pflags & PF_NIGHTSMODE)) || player->spectator) return; - if (!(P_Random() % 16)) + if (P_RandomChance(FRACUNIT/16)) bubble = P_SpawnMobj(player->mo->x, player->mo->y, zh, MT_SMALLBUBBLE); - else if (!(P_Random() % 96)) + else if (P_RandomChance(3*FRACUNIT/256)) bubble = P_SpawnMobj(player->mo->x, player->mo->y, zh, MT_MEDIUMBUBBLE); if (bubble) { @@ -6620,7 +6620,7 @@ static void P_MovePlayer(player_t *player) // Little water sound while touching water - just a nicety. if ((player->mo->eflags & MFE_TOUCHWATER) && !(player->mo->eflags & MFE_UNDERWATER) && !player->spectator) { - if (P_Random() & 1 && leveltime % TICRATE == 0) + if (P_RandomChance(FRACUNIT/2) && leveltime % TICRATE == 0) S_StartSound(player->mo, sfx_floush); } @@ -8423,7 +8423,7 @@ static boolean P_SpectatorJoinGame(player_t *player) else if (redscore > bluescore) changeto = 2; else - changeto = (P_Random() & 1) + 1; + changeto = (P_RandomFixed() & 1) + 1; if (player->mo) { @@ -8674,7 +8674,7 @@ void P_PlayerThink(player_t *player) // Add some extra randomization. if (cmd->forwardmove) - P_Random(); + P_RandomFixed(); #ifdef PARANOIA if (player->playerstate == PST_REBORN) diff --git a/src/v_video.c b/src/v_video.c index df81ac6d6..02c67a24e 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -1967,7 +1967,7 @@ Unoptimized version for (y = 0; y < height; y++) { - if (M_Random() < 32) + if (M_RandomChance(FRACUNIT/8)) // 12.5% heatshifter[y] = true; } From a3e940fe65a85b3423b6918b21b795e962fdd63d Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Sun, 27 Mar 2016 15:57:50 -0700 Subject: [PATCH 265/467] Compensate for insufficient RAND_MAX values. --- src/m_random.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/m_random.c b/src/m_random.c index caf4d5174..97b654c1c 100644 --- a/src/m_random.c +++ b/src/m_random.c @@ -32,7 +32,13 @@ */ fixed_t M_RandomFixed(void) { +#if RAND_MAX < 65535 + // Compensate for insufficient randomness. + fixed_t rndv = (rand()&1)<<15; + return rand()^rndv; +#else return (rand() & 0xFFFF); +#endif } /** Provides a random byte. Distribution is uniform. @@ -246,5 +252,5 @@ void P_SetRandSeedD(const char *rfile, INT32 rline, UINT32 seed) */ UINT32 M_RandomizedSeed(void) { - return ((totalplaytime & 0xFFFF) << 16)|(rand() & 0xFFFF); + return ((totalplaytime & 0xFFFF) << 16)|M_RandomFixed(); } From 3dc4cfc2290e99f0c77f8b661d04c9e6a8669ca6 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Tue, 29 Mar 2016 06:14:31 -0700 Subject: [PATCH 266/467] Simplicity is a virute... don't overcomplicate things. --- src/m_random.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/m_random.c b/src/m_random.c index 97b654c1c..d3d3f98ca 100644 --- a/src/m_random.c +++ b/src/m_random.c @@ -95,13 +95,10 @@ static UINT32 initialseed = 0; */ ATTRINLINE static fixed_t FUNCINLINE __internal_prng__(void) { - randomseed += 7069; - randomseed ^= randomseed << 17; - randomseed ^= randomseed >> 9; - randomseed *= 373; + randomseed ^= randomseed >> 13; + randomseed ^= randomseed >> 11; randomseed ^= randomseed << 21; - randomseed ^= randomseed >> 15; - return (randomseed&((FRACUNIT-1)<<9))>>9; + return ( (randomseed*36548569) >> 4) & (FRACUNIT-1); } /** Provides a random fixed point number. Distribution is uniform. From 480f9be51f9c38ef0f8ce61fc5c014564cd38b54 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Tue, 29 Mar 2016 06:20:26 -0700 Subject: [PATCH 267/467] gotta start compensating for xorshift's needs --- src/m_random.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/m_random.c b/src/m_random.c index d3d3f98ca..79f3af113 100644 --- a/src/m_random.c +++ b/src/m_random.c @@ -83,10 +83,10 @@ INT32 M_RandomRange(INT32 a, INT32 b) // ------------------------ // Holds the current seed. -static UINT32 randomseed = 0; +static UINT32 randomseed = 0xBADE4404; // Holds the INITIAL seed value. Used for demos, possibly other debugging. -static UINT32 initialseed = 0; +static UINT32 initialseed = 0xBADE4404; /** Provides a random fixed point number. * This is a variant of an xorshift PRNG; state fits in a 32 bit integer structure. @@ -240,6 +240,9 @@ void P_SetRandSeedD(const char *rfile, INT32 rline, UINT32 seed) { CONS_Printf("P_SetRandSeed() at: %sp %d\n", rfile, rline); #endif + // xorshift requires a nonzero seed + // this should never happen, but just in case it DOES, we check + if (!seed) seed = 0xBADE4404; randomseed = initialseed = seed; } From 0fe6ee533990adbd50da7abef36e54d76e9bf70d Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 30 Mar 2016 00:22:12 -0400 Subject: [PATCH 268/467] cleanup abs warnings --- src/b_bot.c | 2 +- src/lua_hudlib.c | 2 +- src/p_map.c | 4 ++-- src/p_user.c | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/b_bot.c b/src/b_bot.c index 3072b1d75..5e128bff1 100644 --- a/src/b_bot.c +++ b/src/b_bot.c @@ -49,7 +49,7 @@ static inline void B_BuildTailsTiccmd(mobj_t *sonic, mobj_t *tails, ticcmd_t *cm if (sonic->player->pflags & (PF_MACESPIN|PF_ITEMHANG)) { cmd->forwardmove = sonic->player->cmd.forwardmove; - cmd->angleturn = abs((tails->angle - sonic->angle))>>16; + cmd->angleturn = (angle_t)((tails->angle - sonic->angle))>>16; if (sonic->angle < tails->angle) cmd->angleturn = -cmd->angleturn; } else if (dist > FixedMul(512*FRACUNIT, tails->scale)) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index 19390d50d..d5947489a 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -408,7 +408,7 @@ static int libd_drawPaddedNum(lua_State *L) HUDONLY x = luaL_checkinteger(L, 1); y = luaL_checkinteger(L, 2); - num = abs(luaL_checkinteger(L, 3)); + num = labs(luaL_checkinteger(L, 3)); digits = luaL_optinteger(L, 4, 2); flags = luaL_optinteger(L, 5, 0); flags &= ~V_PARAMMASK; // Don't let crashes happen. diff --git a/src/p_map.c b/src/p_map.c index 1aa8bc391..09f49423b 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2507,8 +2507,8 @@ isblocking: climbangle += (ANGLE_90 * (whichside ? -1 : 1)); - if (((!slidemo->player->climbing && abs((slidemo->angle - ANGLE_90 - climbline)) < ANGLE_45) - || (slidemo->player->climbing == 1 && abs((slidemo->angle - climbline)) < ANGLE_135)) + if (((!slidemo->player->climbing && (angle_t)((slidemo->angle - ANGLE_90 - climbline)) < ANGLE_45) + || (slidemo->player->climbing == 1 && (angle_t)((slidemo->angle - climbline)) < ANGLE_135)) && P_IsClimbingValid(slidemo->player, climbangle)) { slidemo->angle = climbangle; diff --git a/src/p_user.c b/src/p_user.c index ce68e2d61..34d2d4bae 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7899,9 +7899,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (player == &players[consoleplayer]) { if (focusangle >= localangle) - localangle += abs((focusangle - localangle))>>5; + localangle += (angle_t)((focusangle - localangle))>>5; else - localangle -= abs((focusangle - localangle))>>5; + localangle -= (angle_t)((focusangle - localangle))>>5; } } else if (P_AnalogMove(player)) // Analog From 7e07d2d77a660139244a3dea823cf4d020dc0672 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 30 Mar 2016 00:23:28 -0400 Subject: [PATCH 269/467] travis-ci: reenable -Werror --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index df89593c4..c15cc6795 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,9 @@ language: c sudo: required dist: trusty +env: +- CFLAGS=-Werror + os: - linux - osx From 9cec9093bb20cbdad7c25da4f4644c7ea1fa3b03 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Wed, 30 Mar 2016 06:20:57 -0700 Subject: [PATCH 270/467] denom of A_CheckRandom can't be zero, that would be bad --- src/p_enemy.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/p_enemy.c b/src/p_enemy.c index c32e2be8c..82391a748 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8528,6 +8528,9 @@ void A_CheckRandom(mobj_t *actor) if (LUA_CallAction("A_CheckRandom", actor)) return; #endif + if ((locvar1 & 0xFFFF) == 0) + return; + // The PRNG doesn't suck anymore, OK? if (locvar1 >> 16) chance *= (locvar1 >> 16); From b169529dfde93925add91bd6b4dd0486a327492d Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 30 Mar 2016 11:47:27 -0400 Subject: [PATCH 271/467] switich to do the angle math in signed, then run it thur abs() --- src/b_bot.c | 2 +- src/p_map.c | 4 ++-- src/p_user.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/b_bot.c b/src/b_bot.c index 5e128bff1..e9b00497e 100644 --- a/src/b_bot.c +++ b/src/b_bot.c @@ -49,7 +49,7 @@ static inline void B_BuildTailsTiccmd(mobj_t *sonic, mobj_t *tails, ticcmd_t *cm if (sonic->player->pflags & (PF_MACESPIN|PF_ITEMHANG)) { cmd->forwardmove = sonic->player->cmd.forwardmove; - cmd->angleturn = (angle_t)((tails->angle - sonic->angle))>>16; + cmd->angleturn = abs((signed)(tails->angle - sonic->angle))>>16; if (sonic->angle < tails->angle) cmd->angleturn = -cmd->angleturn; } else if (dist > FixedMul(512*FRACUNIT, tails->scale)) diff --git a/src/p_map.c b/src/p_map.c index 09f49423b..bcb3c08a9 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2507,8 +2507,8 @@ isblocking: climbangle += (ANGLE_90 * (whichside ? -1 : 1)); - if (((!slidemo->player->climbing && (angle_t)((slidemo->angle - ANGLE_90 - climbline)) < ANGLE_45) - || (slidemo->player->climbing == 1 && (angle_t)((slidemo->angle - climbline)) < ANGLE_135)) + if (((!slidemo->player->climbing && abs((signed)(slidemo->angle - ANGLE_90 - climbline)) < ANGLE_45) + || (slidemo->player->climbing == 1 && abs((signed)(slidemo->angle - climbline)) < ANGLE_135)) && P_IsClimbingValid(slidemo->player, climbangle)) { slidemo->angle = climbangle; diff --git a/src/p_user.c b/src/p_user.c index 34d2d4bae..6053ad1e5 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7899,9 +7899,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (player == &players[consoleplayer]) { if (focusangle >= localangle) - localangle += (angle_t)((focusangle - localangle))>>5; + localangle += abs((signed)(focusangle - localangle))>>5; else - localangle -= (angle_t)((focusangle - localangle))>>5; + localangle -= abs((signed)(focusangle - localangle))>>5; } } else if (P_AnalogMove(player)) // Analog From 10cc421fae6095dc6151700b9cd9006164cc0d3c Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 30 Mar 2016 12:58:00 -0400 Subject: [PATCH 272/467] travis: add all/extra warnings --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c15cc6795..54c5901d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ sudo: required dist: trusty env: -- CFLAGS=-Werror +- CFLAGS=-Wall -W -Werror os: - linux From d90536967d6cd05b1e454f45d252723909bf3d10 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 30 Mar 2016 14:05:07 -0400 Subject: [PATCH 273/467] removed/remline ununsed code --- src/am_map.c | 33 -------- src/hardware/hw_main.c | 6 -- src/hardware/hw_md2.c | 185 ----------------------------------------- src/m_cheat.c | 20 ----- src/mserv.c | 27 ------ src/p_maputl.c | 15 ---- src/p_spec.c | 6 +- src/r_things.c | 5 -- src/sdl/i_video.c | 13 --- 9 files changed, 5 insertions(+), 305 deletions(-) diff --git a/src/am_map.c b/src/am_map.c index 70714facb..97b7c5164 100644 --- a/src/am_map.c +++ b/src/am_map.c @@ -30,9 +30,7 @@ static const UINT8 REDRANGE = 16; static const UINT8 GRAYS = (1*16); static const UINT8 GRAYSRANGE = 16; static const UINT8 BROWNS = (3*16); -static const UINT8 BROWNRANGE = 16; static const UINT8 YELLOWS = (7*16); -static const UINT8 YELLOWRANGE = 8; static const UINT8 GREENS = (10*16); static const UINT8 GREENRANGE = 16; static const UINT8 DBLACK = 31; @@ -41,11 +39,8 @@ static const UINT8 DWHITE = 0; static const UINT8 NOCLIMBREDS = 248; static const UINT8 NOCLIMBREDRANGE = 8; static const UINT8 NOCLIMBGRAYS = 204; -static const UINT8 NOCLIMBGRAYSRANGE = 4; static const UINT8 NOCLIMBBROWNS = (2*16); -static const UINT8 NOCLIMBBROWNRANGE = 16; static const UINT8 NOCLIMBYELLOWS = (11*16); -static const UINT8 NOCLIMBYELLOWRANGE = 8; #ifdef _NDS @@ -67,15 +62,10 @@ static const UINT8 NOCLIMBYELLOWRANGE = 8; #define TSWALLCOLORS GRAYS #define TSWALLRANGE GRAYSRANGE #define NOCLIMBTSWALLCOLORS NOCLIMBGRAYS -#define NOCLIMBTSWALLRANGE NOCLIMBGRAYSRANGE #define FDWALLCOLORS BROWNS -#define FDWALLRANGE BROWNRANGE #define NOCLIMBFDWALLCOLORS NOCLIMBBROWNS -#define NOCLIMBFDWALLRANGE NOCLIMBBROWNRANGE #define CDWALLCOLORS YELLOWS -#define CDWALLRANGE YELLOWRANGE #define NOCLIMBCDWALLCOLORS NOCLIMBYELLOWS -#define NOCLIMBCDWALLRANGE NOCLIMBYELLOWRANGE #define THINGCOLORS GREENS #define THINGRANGE GREENRANGE #define SECRETWALLCOLORS WALLCOLORS @@ -255,29 +245,6 @@ static AMDRAWFLINEFUNC AM_drawFline; static void AM_drawFline_soft(const fline_t *fl, INT32 color); -/** Calculates the slope and slope according to the x-axis of a line - * segment in map coordinates (with the upright y-axis and all) so - * that it can be used with the braindead drawing stuff. - * - * \param ml The line segment. - * \param is Holds the result. - */ -static inline void AM_getIslope(const mline_t *ml, islope_t *is) -{ - INT32 dx, dy; - - dy = ml->a.y - ml->b.y; - dx = ml->b.x - ml->a.x; - if (!dy) - is->islp = (dx < 0 ? -INT32_MAX : INT32_MAX); - else - is->islp = FixedDiv(dx, dy); - if (!dx) - is->slp = (dy < 0 ? -INT32_MAX : INT32_MAX); - else - is->slp = FixedDiv(dy, dx); -} - static void AM_activateNewScale(void) { m_x += m_w/2; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b0186049a..ae26b8deb 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3404,12 +3404,6 @@ static void HWR_ClearSprites(void) gr_visspritecount = 0; } -static inline void HWR_ResetVisSpriteChunks(void) -{ - memset(gr_visspritechunks, 0, sizeof(gr_visspritechunks)); -} - - // -------------------------------------------------------------------------- // HWR_NewVisSprite // -------------------------------------------------------------------------- diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 0745b9a00..a160be67b 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -406,191 +406,6 @@ static md2_model_t *md2_readModel(const char *filename) return model; } -/* - * center model - */ -static inline void md2_getBoundingBox (md2_model_t *model, float *minmax) -{ - size_t i; - float minx, maxx; - float miny, maxy; - float minz, maxz; - - minx = miny = minz = 999999.0f; - maxx = maxy = maxz = -999999.0f; - - /* get bounding box */ - for (i = 0; i < model->header.numVertices; i++) - { - md2_triangleVertex_t *v = &model->frames[0].vertices[i]; - - if (v->vertex[0] < minx) - minx = v->vertex[0]; - else if (v->vertex[0] > maxx) - maxx = v->vertex[0]; - - if (v->vertex[1] < miny) - miny = v->vertex[1]; - else if (v->vertex[1] > maxy) - maxy = v->vertex[1]; - - if (v->vertex[2] < minz) - minz = v->vertex[2]; - else if (v->vertex[2] > maxz) - maxz = v->vertex[2]; - } - - minmax[0] = minx; - minmax[1] = maxx; - minmax[2] = miny; - minmax[3] = maxy; - minmax[4] = minz; - minmax[5] = maxz; -} - -static inline INT32 md2_getAnimationCount(md2_model_t *model) -{ - size_t i, pos; - INT32 j = 0, count; - char name[16], last[16]; - - strcpy(last, model->frames[0].name); - pos = strlen(last) - 1; - while (last[pos] >= '0' && last[pos] <= '9' && j < 2) - { - pos--; - j++; - } - last[pos + 1] = '\0'; - - count = 0; - - for (i = 0; i <= model->header.numFrames; i++) - { - if (i == model->header.numFrames) - strcpy(name, ""); // some kind of a sentinel - else - strcpy(name, model->frames[i].name); - pos = strlen(name) - 1; - j = 0; - while (name[pos] >= '0' && name[pos] <= '9' && j < 2) - { - pos--; - j++; - } - name[pos + 1] = '\0'; - - if (strcmp(last, name)) - { - strcpy(last, name); - count++; - } - } - - return count; -} - -static inline const char * md2_getAnimationName (md2_model_t *model, INT32 animation) -{ - size_t i, pos; - INT32 j = 0, count; - static char last[32]; - char name[32]; - - strcpy(last, model->frames[0].name); - pos = strlen(last) - 1; - while (last[pos] >= '0' && last[pos] <= '9' && j < 2) - { - pos--; - j++; - } - last[pos + 1] = '\0'; - - count = 0; - - for (i = 0; i <= model->header.numFrames; i++) - { - if (i == model->header.numFrames) - strcpy(name, ""); // some kind of a sentinel - else - strcpy(name, model->frames[i].name); - pos = strlen(name) - 1; - j = 0; - while (name[pos] >= '0' && name[pos] <= '9' && j < 2) - { - pos--; - j++; - } - name[pos + 1] = '\0'; - - if (strcmp(last, name)) - { - if (count == animation) - return last; - - strcpy(last, name); - count++; - } - } - - return 0; -} - -static inline void md2_getAnimationFrames(md2_model_t *model, - INT32 animation, INT32 *startFrame, INT32 *endFrame) -{ - size_t i, pos; - INT32 j = 0, count, numFrames, frameCount; - char name[16], last[16]; - - strcpy(last, model->frames[0].name); - pos = strlen(last) - 1; - while (last[pos] >= '0' && last[pos] <= '9' && j < 2) - { - pos--; - j++; - } - last[pos + 1] = '\0'; - - count = 0; - numFrames = 0; - frameCount = 0; - - for (i = 0; i <= model->header.numFrames; i++) - { - if (i == model->header.numFrames) - strcpy(name, ""); // some kind of a sentinel - else - strcpy(name, model->frames[i].name); - pos = strlen(name) - 1; - j = 0; - while (name[pos] >= '0' && name[pos] <= '9' && j < 2) - { - pos--; - j++; - } - name[pos + 1] = '\0'; - - if (strcmp(last, name)) - { - strcpy(last, name); - - if (count == animation) - { - *startFrame = frameCount - numFrames; - *endFrame = frameCount - 1; - return; - } - - count++; - numFrames = 0; - } - frameCount++; - numFrames++; - } - *startFrame = *endFrame = 0; -} - static inline void md2_printModelInfo (md2_model_t *model) { #if 0 diff --git a/src/m_cheat.c b/src/m_cheat.c index 8cea4c6ae..c8a19666b 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -161,26 +161,6 @@ static UINT8 cht_CheckCheat(cheatseq_t *cht, char key) return rc; } -static inline void cht_GetParam(cheatseq_t *cht, char *buffer) -{ - UINT8 *p; - UINT8 c; - - p = cht->sequence; - while (*(p++) != 1) - ; - - do - { - c = *p; - *(buffer++) = c; - *(p++) = 0; - } while (c && *p != 0xff); - - if (*p == 0xff) - *buffer = 0; -} - boolean cht_Responder(event_t *ev) { UINT8 ret = 0, ch = 0; diff --git a/src/mserv.c b/src/mserv.c index 568474d73..c47d149ee 100644 --- a/src/mserv.c +++ b/src/mserv.c @@ -351,33 +351,6 @@ static INT32 GetServersList(void) } #endif -/** Get the MOTD from the master server. - */ -static inline INT32 GetMSMOTD(void) -{ - msg_t msg; - INT32 count = 0; - - msg.type = GET_MOTD_MSG; - msg.length = 0; - if (MS_Write(&msg) < 0) - return MS_WRITE_ERROR; - - while (MS_Read(&msg) >= 0) - { - if (!msg.length) - { - if (!count) - CONS_Alert(CONS_NOTICE, M_GetText("No servers currently running.\n")); - return MS_NO_ERROR; - } - count++; - CONS_Printf("%s",msg.buffer); - } - - return MS_READ_ERROR; -} - // // MS_Connect() // diff --git a/src/p_maputl.c b/src/p_maputl.c index 48dd54e8d..2aa667811 100644 --- a/src/p_maputl.c +++ b/src/p_maputl.c @@ -34,21 +34,6 @@ fixed_t P_AproxDistance(fixed_t dx, fixed_t dy) return dx + dy - (dy>>1); } -// -// P_PartialDistance -// Useful only for iterations finding the 'closest point' -// -FUNCMATH static inline fixed_t P_PartialDistance(fixed_t dx, fixed_t dy) -{ - dx >>= FRACBITS; - dy >>= FRACBITS; - - dx *= dx; - dy *= dy; - - return dx + dy; -} - // // P_ClosestPointOnLine // Finds the closest point on a given line to the supplied point diff --git a/src/p_spec.c b/src/p_spec.c index 8228c60b3..a292a8bb0 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -102,7 +102,7 @@ static void Add_Pusher(pushertype_e type, fixed_t x_mag, fixed_t y_mag, mobj_t * static void Add_MasterDisappearer(tic_t appeartime, tic_t disappeartime, tic_t offset, INT32 line, INT32 sourceline); static void P_AddBlockThinker(sector_t *sec, line_t *sourceline); static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline); -static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); +//static void P_AddBridgeThinker(line_t *sourceline, sector_t *sec); static void P_AddFakeFloorsByLine(size_t line, ffloortype_e ffloorflags, thinkerlist_t *secthinkers); static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec); static void Add_Friction(INT32 friction, INT32 movefactor, INT32 affectee, INT32 referrer); @@ -593,6 +593,7 @@ void P_SetupLevelFlatAnims(void) // UTILITIES // +#if 0 /** Gets a side from a sector line. * * \param currentSector Sector the line is in. @@ -632,6 +633,7 @@ static inline boolean twoSided(INT32 sector, INT32 line) { return (sectors[sector].lines[line])->sidenum[1] != 0xffff; } +#endif /** Finds sector next to current. * @@ -5050,6 +5052,7 @@ static void P_AddFloatThinker(sector_t *sec, INT32 tag, line_t *sourceline) * \sa P_SpawnSpecials, T_BridgeThinker * \author SSNTails */ +/* static inline void P_AddBridgeThinker(line_t *sourceline, sector_t *sec) { levelspecthink_t *bridge; @@ -5072,6 +5075,7 @@ static inline void P_AddBridgeThinker(line_t *sourceline, sector_t *sec) bridge->vars[4] = sourceline->tag; // Start tag bridge->vars[5] = (sides[sourceline->sidenum[0]].textureoffset>>FRACBITS); // End tag } +*/ /** Adds a Mario block thinker, which changes the block's texture between blank * and ? depending on whether it has contents. diff --git a/src/r_things.c b/src/r_things.c index 9a8b1319b..c5f3c5245 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -550,11 +550,6 @@ void R_ClearSprites(void) visspritecount = clippedvissprites = 0; } -static inline void R_ResetVisSpriteChunks(void) -{ - memset(visspritechunks, 0, sizeof(visspritechunks)); -} - // // R_NewVisSprite // diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 963310a26..0f9fa58a8 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -126,8 +126,6 @@ static Uint8 BitsPerPixel = 16; #endif Uint16 realwidth = BASEVIDWIDTH; Uint16 realheight = BASEVIDHEIGHT; -static const Uint32 surfaceFlagsW = 0/*|SDL_RESIZABLE*/; -static const Uint32 surfaceFlagsF = 0; static SDL_bool mousegrabok = SDL_TRUE; #define HalfWarpMouse(x,y) SDL_WarpMouseInWindow(window, (Uint16)(x/2),(Uint16)(y/2)) static SDL_bool videoblitok = SDL_FALSE; @@ -1252,17 +1250,6 @@ static inline boolean I_SkipFrame(void) } } -static inline SDL_bool SDLmatchVideoformat(void) -{ - const SDL_PixelFormat *vidformat = vidSurface->format; - const INT32 vfBPP = vidformat?vidformat->BitsPerPixel:0; - return (((vfBPP == 8 && vid.bpp == 1 && - !vidformat->Rmask && !vidformat->Gmask && !vidformat->Bmask) || - (vfBPP == 15 && vid.bpp == 2 && vidformat->Rmask == 0x7C00 && - vidformat->Gmask == 0x03E0 && vidformat->Bmask == 0x001F )) && - !vidformat->Amask && (vidSurface->flags & SDL_RLEACCEL) == 0); -} - // // I_FinishUpdate // From 75f65c4d44d07e3b7538cafc65141b0e0c7f6016 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 30 Mar 2016 20:17:09 -0400 Subject: [PATCH 274/467] using abs() on unsigned have no effect --- src/g_game.c | 2 +- src/p_user.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 3b7ef158f..9ea51ebab 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4336,7 +4336,7 @@ void G_GhostTicker(void) { case GHC_SUPER: // Super Sonic (P_DoSuperStuff) g->mo->color = SKINCOLOR_SUPER1; - g->mo->color += abs( ( ( leveltime >> 1 ) % 9) - 4); + g->mo->color += ( ( ( leveltime >> 1 ) % 9) - 4); break; case GHC_INVINCIBLE: // Mario invincibility (P_CheckInvincibilityTimer) g->mo->color = (UINT8)(leveltime % MAXSKINCOLORS); diff --git a/src/p_user.c b/src/p_user.c index 45f860115..72b08db9c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3449,7 +3449,7 @@ static void P_DoSuperStuff(player_t *player) case 2: /* Knux */ player->mo->color = SKINCOLOR_KSUPER1; break; default: /* everyone */ player->mo->color = SKINCOLOR_SUPER1; break; } - player->mo->color += abs( ( ( leveltime >> 1 ) % 9) - 4); + player->mo->color += ( ( ( leveltime >> 1 ) % 9) - 4); if ((cmd->forwardmove != 0 || cmd->sidemove != 0 || player->pflags & (PF_CARRIED|PF_ROPEHANG|PF_ITEMHANG|PF_MACESPIN)) && !(leveltime % TICRATE) && (player->mo->momx || player->mo->momy)) From de630d0c33ed786fe33a0e3fc5b1492812c02c2e Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Wed, 30 Mar 2016 20:30:24 -0400 Subject: [PATCH 275/467] appveyor: let check warnings as well --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 4edcd7a7f..3ddec6dfb 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,6 +11,7 @@ environment: SDL2_MIXER_URL: https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-2.0.1-mingw.tar.gz SDL2_MIXER_ARCHIVE: SDL2_mixer-devel-2.0.1-mingw.tar SDL2_MIXER_MOVE: SDL2_mixer-2.0.1\i686-w64-mingw32 + CFLAGS: -Wall -W -Werror cache: - SDL2-devel-2.0.4-mingw.tar.gz From 3812b6bc20c313b6eed1471f837f70485d73a0bd Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 31 Mar 2016 06:48:08 -0700 Subject: [PATCH 276/467] the abs() is necessary; force unsigned shift and signed result --- src/g_game.c | 2 +- src/p_user.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 9ea51ebab..9578cbf8f 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4336,7 +4336,7 @@ void G_GhostTicker(void) { case GHC_SUPER: // Super Sonic (P_DoSuperStuff) g->mo->color = SKINCOLOR_SUPER1; - g->mo->color += ( ( ( leveltime >> 1 ) % 9) - 4); + g->mo->color += abs( ( (signed)( (unsigned)leveltime >> 1 ) % 9) - 4); break; case GHC_INVINCIBLE: // Mario invincibility (P_CheckInvincibilityTimer) g->mo->color = (UINT8)(leveltime % MAXSKINCOLORS); diff --git a/src/p_user.c b/src/p_user.c index 72b08db9c..518321197 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3449,7 +3449,7 @@ static void P_DoSuperStuff(player_t *player) case 2: /* Knux */ player->mo->color = SKINCOLOR_KSUPER1; break; default: /* everyone */ player->mo->color = SKINCOLOR_SUPER1; break; } - player->mo->color += ( ( ( leveltime >> 1 ) % 9) - 4); + player->mo->color += abs( ( (signed)( (unsigned)leveltime >> 1 ) % 9) - 4); if ((cmd->forwardmove != 0 || cmd->sidemove != 0 || player->pflags & (PF_CARRIED|PF_ROPEHANG|PF_ITEMHANG|PF_MACESPIN)) && !(leveltime % TICRATE) && (player->mo->momx || player->mo->momy)) From 690b65b47fe996b2f325eca1846b23b13fcdcad1 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 31 Mar 2016 06:51:04 -0700 Subject: [PATCH 277/467] "Sonic can now become Super Sonic" exists again Fixed an off-by-one array error in the process --- src/y_inter.c | 86 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 12 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index 104c1004d..32a722612 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -77,10 +77,14 @@ typedef union struct { - char passed1[13]; // KNUCKLES GOT - char passed2[16]; // A CHAOS EMERALD + char passed1[SKINNAMESIZE+1]; // KNUCKLES GOT / CRAWLA HONCHO + char passed2[17]; // A CHAOS EMERALD / GOT THEM ALL! + char passed3[15]; // CAN NOW BECOME + char passed4[SKINNAMESIZE+7]; // SUPER CRAWLA HONCHO INT32 passedx1; INT32 passedx2; + INT32 passedx3; + INT32 passedx4; y_bonus_t bonus; patch_t *bonuspatch; @@ -250,19 +254,62 @@ void Y_IntermissionDrawer(void) } else if (intertype == int_spec) { - // draw the header -/* if (endtic != -1 && ALL7EMERALDS(emeralds) && data.spec.nowsuper != NULL) - V_DrawScaledPatch(48, 32, 0, data.spec.nowsuper); - else - V_DrawScaledPatch(data.spec.headx, 26, 0, data.spec.cemerald); */ + static tic_t animatetic = 0; + INT32 ttheight = 16; + INT32 xoffset1 = 0; // Line 1 x offset + INT32 xoffset2 = 0; // Line 2 x offset + INT32 xoffset3 = 0; // Line 3 x offset + UINT8 drawsection = 0; - if (data.spec.passed1[0] != '\0') + // draw the header + if (intertic <= TICRATE) + animatetic = 0; + else if (!animatetic && data.spec.bonus.points == 0 && data.spec.passed3[0] != '\0') + animatetic = intertic; + + if (animatetic) { - V_DrawLevelTitle(data.spec.passedx1, 24, 0, data.spec.passed1); - V_DrawLevelTitle(data.spec.passedx2, 24+V_LevelNameHeight(data.spec.passed2)+2, 0, data.spec.passed2); + INT32 animatetimer = (intertic - animatetic); + if (animatetimer <= 8) + { + xoffset1 = -(animatetimer * 40); + xoffset2 = -((animatetimer-2) * 40); + if (xoffset2 > 0) xoffset2 = 0; + } + else if (animatetimer <= 19) + { + drawsection = 1; + xoffset1 = (16-animatetimer) * 40; + xoffset2 = (18-animatetimer) * 40; + xoffset3 = (20-animatetimer) * 40; + if (xoffset1 < 0) xoffset1 = 0; + if (xoffset2 < 0) xoffset2 = 0; + } + else + drawsection = 1; + } + + if (drawsection == 1) + { + ttheight = 16; + V_DrawLevelTitle(data.spec.passedx1 + xoffset1, ttheight, 0, data.spec.passed1); + ttheight += V_LevelNameHeight(data.spec.passed3) + 2; + V_DrawLevelTitle(data.spec.passedx3 + xoffset2, ttheight, 0, data.spec.passed3); + ttheight += V_LevelNameHeight(data.spec.passed4) + 2; + V_DrawLevelTitle(data.spec.passedx4 + xoffset3, ttheight, 0, data.spec.passed4); + } + else if (data.spec.passed1[0] != '\0') + { + ttheight = 24; + V_DrawLevelTitle(data.spec.passedx1 + xoffset1, ttheight, 0, data.spec.passed1); + ttheight += V_LevelNameHeight(data.spec.passed2) + 2; + V_DrawLevelTitle(data.spec.passedx2 + xoffset2, ttheight, 0, data.spec.passed2); } else - V_DrawLevelTitle(data.spec.passedx2, 24+(V_LevelNameHeight(data.spec.passed2)/2)+2, 0, data.spec.passed2); + { + ttheight = 24 + (V_LevelNameHeight(data.spec.passed2)/2) + 2; + V_DrawLevelTitle(data.spec.passedx2 + xoffset1, ttheight, 0, data.spec.passed2); + } // draw the emeralds if (intertic & 1) @@ -1098,6 +1145,10 @@ void Y_StartIntermission(void) data.spec.nowsuper = NULL; } */ + // Super form stuff (normally blank) + data.spec.passed3[0] = '\0'; + data.spec.passed4[0] = '\0'; + // set up the "got through act" message according to skin name if (stagefailed) { @@ -1111,10 +1162,19 @@ void Y_StartIntermission(void) skins[players[consoleplayer].skin].realname); data.spec.passed1[sizeof data.spec.passed1 - 1] = '\0'; strcpy(data.spec.passed2, "GOT THEM ALL!"); + + if (skins[players[consoleplayer].skin].flags & SF_SUPER) + { + strcpy(data.spec.passed3, "CAN NOW BECOME"); + snprintf(data.spec.passed4, + sizeof data.spec.passed4, "SUPER %s", + skins[players[consoleplayer].skin].realname); + data.spec.passed4[sizeof data.spec.passed4 - 1] = '\0'; + } } else { - if (strlen(skins[players[consoleplayer].skin].realname) <= 8) + if (strlen(skins[players[consoleplayer].skin].realname) <= SKINNAMESIZE-5) { snprintf(data.spec.passed1, sizeof data.spec.passed1, "%s GOT", @@ -1127,6 +1187,8 @@ void Y_StartIntermission(void) } data.spec.passedx1 = (BASEVIDWIDTH - V_LevelNameWidth(data.spec.passed1))/2; data.spec.passedx2 = (BASEVIDWIDTH - V_LevelNameWidth(data.spec.passed2))/2; + data.spec.passedx3 = (BASEVIDWIDTH - V_LevelNameWidth(data.spec.passed3))/2; + data.spec.passedx4 = (BASEVIDWIDTH - V_LevelNameWidth(data.spec.passed4))/2; break; } From fc8e7728cd79afa6edba40333378ebf3ab90faf5 Mon Sep 17 00:00:00 2001 From: Inuyasha Date: Thu, 31 Mar 2016 06:57:11 -0700 Subject: [PATCH 278/467] I meant to extend this to 4 seconds but forgot --- src/y_inter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index 32a722612..71e72122c 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -755,7 +755,7 @@ void Y_Ticker(void) { if (intertic > tallydonetic) { - endtic = intertic + 4*TICRATE; // 4 second pause after end of tally for sound + endtic = intertic + 4*TICRATE; // 4 second pause after end of tally S_StartSound(NULL, sfx_flgcap); // cha-ching! } return; @@ -775,7 +775,7 @@ void Y_Ticker(void) if (data.spec.continues & 0x80) // don't set endtic yet! tallydonetic = intertic + (3*TICRATE)/2; else // okay we're good. - endtic = intertic + 3*TICRATE; // 3 second pause after end of tally + endtic = intertic + 4*TICRATE; // 4 second pause after end of tally S_StartSound(NULL, sfx_chchng); // cha-ching! From e34da95c4c2bbfa8e706e52fc764859405eb49ad Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Thu, 31 Mar 2016 16:32:25 +0100 Subject: [PATCH 279/467] DEVMODE's automap now supports slopes --- src/am_map.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/am_map.c b/src/am_map.c index 97b7c5164..847e517fb 100644 --- a/src/am_map.c +++ b/src/am_map.c @@ -15,6 +15,7 @@ #include "am_map.h" #include "g_input.h" #include "p_local.h" +#include "p_slopes.h" #include "v_video.h" #include "i_video.h" #include "r_state.h" @@ -996,6 +997,10 @@ static inline void AM_drawWalls(void) { size_t i; static mline_t l; +#ifdef ESLOPE + fixed_t frontf1,frontf2, frontc1, frontc2; // front floor/ceiling ends + fixed_t backf1, backf2, backc1, backc2; // back floor ceiling ends +#endif for (i = 0; i < numlines; i++) { @@ -1003,6 +1008,22 @@ static inline void AM_drawWalls(void) l.a.y = lines[i].v1->y; l.b.x = lines[i].v2->x; l.b.y = lines[i].v2->y; +#ifdef ESLOPE +#define SLOPEPARAMS(slope, end1, end2, normalheight) \ + if (slope) { \ + end1 = P_GetZAt(slope, l.a.x, l.a.y); \ + end2 = P_GetZAt(slope, l.b.x, l.b.y); \ + } else \ + end1 = end2 = normalheight; + + SLOPEPARAMS(lines[i].frontsector->f_slope, frontf1, frontf2, lines[i].frontsector->floorheight) + SLOPEPARAMS(lines[i].frontsector->c_slope, frontc1, frontc2, lines[i].frontsector->ceilingheight) + if (lines[i].backsector) { + SLOPEPARAMS(lines[i].backsector->f_slope, backf1, backf2, lines[i].backsector->floorheight) + SLOPEPARAMS(lines[i].backsector->c_slope, backc1, backc2, lines[i].backsector->ceilingheight) + } +#undef SLOPEPARAMS +#endif // AM_drawMline(&l, GRAYS + 3); // Old, everything-is-gray automap if (!lines[i].backsector) // 1-sided @@ -1016,11 +1037,19 @@ static inline void AM_drawWalls(void) AM_drawMline(&l, WALLCOLORS+lightlev); } } +#ifdef ESLOPE + else if ((backf1 == backc1 && backf2 == backc2) // Back is thok barrier + || (frontf1 == frontc1 && frontf2 == frontc2)) // Front is thok barrier + { + if (backf1 == backc1 && backf2 == backc2 + && frontf1 == frontc1 && frontf2 == frontc2) // BOTH are thok barriers +#else else if (lines[i].backsector->floorheight == lines[i].backsector->ceilingheight // Back is thok barrier || lines[i].frontsector->floorheight == lines[i].frontsector->ceilingheight) // Front is thok barrier { if (lines[i].backsector->floorheight == lines[i].backsector->ceilingheight && lines[i].frontsector->floorheight == lines[i].frontsector->ceilingheight) // BOTH are thok barriers +#endif { if (lines[i].flags & ML_NOCLIMB) { @@ -1046,12 +1075,20 @@ static inline void AM_drawWalls(void) else { if (lines[i].flags & ML_NOCLIMB) { +#ifdef ESLOPE + if (backf1 != frontf1 || backf2 != frontf2) { +#else if (lines[i].backsector->floorheight != lines[i].frontsector->floorheight) { +#endif AM_drawMline(&l, NOCLIMBFDWALLCOLORS + lightlev); // floor level change } +#ifdef ESLOPE + else if (backc1 != frontc1 || backc2 != frontc2) { +#else else if (lines[i].backsector->ceilingheight != lines[i].frontsector->ceilingheight) { +#endif AM_drawMline(&l, NOCLIMBCDWALLCOLORS+lightlev); // ceiling level change } else { @@ -1060,12 +1097,20 @@ static inline void AM_drawWalls(void) } else { +#ifdef ESLOPE + if (backf1 != frontf1 || backf2 != frontf2) { +#else if (lines[i].backsector->floorheight != lines[i].frontsector->floorheight) { +#endif AM_drawMline(&l, FDWALLCOLORS + lightlev); // floor level change } +#ifdef ESLOPE + else if (backc1 != frontc1 || backc2 != frontc2) { +#else else if (lines[i].backsector->ceilingheight != lines[i].frontsector->ceilingheight) { +#endif AM_drawMline(&l, CDWALLCOLORS+lightlev); // ceiling level change } else { From f3f2c5962255b2f731c6acefd1067bb49b03c980 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Thu, 31 Mar 2016 20:42:01 -0500 Subject: [PATCH 280/467] Remove p_fab.c --- src/CMakeLists.txt | 1 - src/Makefile | 1 - src/p_fab.c | 15 --------------- 3 files changed, 17 deletions(-) delete mode 100644 src/p_fab.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 13d3312dd..035b46556 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -139,7 +139,6 @@ set(SRB2_CORE_RENDER_SOURCES set(SRB2_CORE_GAME_SOURCES p_ceilng.c p_enemy.c - p_fab.c p_floor.c p_inter.c p_lights.c diff --git a/src/Makefile b/src/Makefile index 449b4065d..0c034143d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -437,7 +437,6 @@ OBJS:=$(i_main_o) \ $(OBJDIR)/info.o \ $(OBJDIR)/p_ceilng.o \ $(OBJDIR)/p_enemy.o \ - $(OBJDIR)/p_fab.o \ $(OBJDIR)/p_floor.o \ $(OBJDIR)/p_inter.o \ $(OBJDIR)/p_lights.o \ diff --git a/src/p_fab.c b/src/p_fab.c deleted file mode 100644 index 7ccb93a94..000000000 --- a/src/p_fab.c +++ /dev/null @@ -1,15 +0,0 @@ -// SONIC ROBO BLAST 2 -//----------------------------------------------------------------------------- -// Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2014 by Sonic Team Junior. -// -// This program is free software distributed under the -// terms of the GNU General Public License, version 2. -// See the 'LICENSE' file for more details. -//----------------------------------------------------------------------------- -/// \file p_fab.c -/// \brief some new action routines, separated from the original doom -/// sources, so that you can include it or remove it easy. - -/// \todo -/// This file is now unused, please remove at some point From 033090b2c883f9f6df1de1555f1e0037ab06bd1f Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Thu, 31 Mar 2016 20:47:57 -0500 Subject: [PATCH 281/467] Remove p_fab.c from Code::Blocks project --- SRB2.cbp | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/SRB2.cbp b/SRB2.cbp index 5a03955b8..43696ee2e 100644 --- a/SRB2.cbp +++ b/SRB2.cbp @@ -3293,23 +3293,6 @@ HW3SOUND for 3D hardware sound support