diff --git a/extras/conf/udb/Includes/Kart2_misc.cfg b/extras/conf/udb/Includes/Kart2_misc.cfg index 9291ba62f..cae1127b3 100644 --- a/extras/conf/udb/Includes/Kart2_misc.cfg +++ b/extras/conf/udb/Includes/Kart2_misc.cfg @@ -94,6 +94,9 @@ sectorflags gravityflip = "Flip Objects in Reverse Gravity"; heatwave = "Heat Wave"; noclipcamera = "Intangible to the Camera"; + ripple_floor = "Ripply Floor"; + ripple_ceiling = "Ripply Ceiling"; + invertencore = "Invert Encore Remap"; outerspace = "Space Countdown"; doublestepup = "Ramp Sector (double step-up/down)"; nostepdown = "Non-Ramp Sector (No step-down)"; diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index c86635319..21dc54e7d 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -2871,7 +2871,7 @@ static void HWR_AddPolyObjectPlanes(void) } else { - HWR_GetLevelFlat(&levelflats[polyobjsector->floorpic], R_NoEncore(polyobjsector, false)); + HWR_GetLevelFlat(&levelflats[polyobjsector->floorpic], R_NoEncore(polyobjsector, &levelflats[polyobjsector->floorpic], false)); HWR_RenderPolyObjectPlane(po_ptrs[i], false, polyobjsector->floorheight, PF_Occlude, (light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel), &levelflats[polyobjsector->floorpic], polyobjsector, 255, (light == -1 ? gl_frontsector->extra_colormap : *gl_frontsector->lightlist[light].extra_colormap)); @@ -2894,7 +2894,7 @@ static void HWR_AddPolyObjectPlanes(void) } else { - HWR_GetLevelFlat(&levelflats[polyobjsector->ceilingpic], R_NoEncore(polyobjsector, true)); + HWR_GetLevelFlat(&levelflats[polyobjsector->ceilingpic], R_NoEncore(polyobjsector, &levelflats[polyobjsector->ceilingpic], true)); HWR_RenderPolyObjectPlane(po_ptrs[i], true, polyobjsector->ceilingheight, PF_Occlude, (light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel), &levelflats[polyobjsector->ceilingpic], polyobjsector, 255, (light == -1 ? gl_frontsector->extra_colormap : *gl_frontsector->lightlist[light].extra_colormap)); @@ -3031,7 +3031,7 @@ static void HWR_Subsector(size_t num) { if (sub->validcount != validcount) { - HWR_GetLevelFlat(&levelflats[gl_frontsector->floorpic], R_NoEncore(gl_frontsector, false)); + HWR_GetLevelFlat(&levelflats[gl_frontsector->floorpic], R_NoEncore(gl_frontsector, &levelflats[gl_frontsector->floorpic], false)); HWR_RenderPlane(sub, &extrasubsectors[num], false, // Hack to make things continue to work around slopes. locFloorHeight == cullFloorHeight ? locFloorHeight : gl_frontsector->floorheight, @@ -3054,7 +3054,7 @@ static void HWR_Subsector(size_t num) { if (sub->validcount != validcount) { - HWR_GetLevelFlat(&levelflats[gl_frontsector->ceilingpic], R_NoEncore(gl_frontsector, true)); + HWR_GetLevelFlat(&levelflats[gl_frontsector->ceilingpic], R_NoEncore(gl_frontsector, &levelflats[gl_frontsector->ceilingpic], true)); HWR_RenderPlane(sub, &extrasubsectors[num], true, // Hack to make things continue to work around slopes. locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gl_frontsector->ceilingheight, @@ -3132,7 +3132,7 @@ static void HWR_Subsector(size_t num) } else { - HWR_GetLevelFlat(&levelflats[*rover->bottompic], R_NoEncore(gl_frontsector, false)); + HWR_GetLevelFlat(&levelflats[*rover->bottompic], R_NoEncore(gl_frontsector, &levelflats[*rover->bottompic], false)); light = R_GetPlaneLight(gl_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false) | PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, &levelflats[*rover->bottompic], rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap); @@ -3180,7 +3180,7 @@ static void HWR_Subsector(size_t num) } else { - HWR_GetLevelFlat(&levelflats[*rover->toppic], R_NoEncore(gl_frontsector, true)); + HWR_GetLevelFlat(&levelflats[*rover->toppic], R_NoEncore(gl_frontsector, &levelflats[*rover->toppic], true)); light = R_GetPlaneLight(gl_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, true) | PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, &levelflats[*rover->toppic], rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap); @@ -4886,7 +4886,7 @@ static void HWR_CreateDrawNodes(void) gl_frontsector = NULL; if (!(sortnode[sortindex[i]].plane->blend & PF_NoTexture)) - HWR_GetLevelFlat(sortnode[sortindex[i]].plane->levelflat, R_NoEncore(sortnode[sortindex[i]].plane->FOFSector, sortnode[sortindex[i]].plane->isceiling)); + HWR_GetLevelFlat(sortnode[sortindex[i]].plane->levelflat, R_NoEncore(sortnode[sortindex[i]].plane->FOFSector, sortnode[sortindex[i]].plane->levelflat, sortnode[sortindex[i]].plane->isceiling)); HWR_RenderPlane(NULL, sortnode[sortindex[i]].plane->xsub, sortnode[sortindex[i]].plane->isceiling, sortnode[sortindex[i]].plane->fixedheight, sortnode[sortindex[i]].plane->blend, sortnode[sortindex[i]].plane->lightlevel, sortnode[sortindex[i]].plane->levelflat, sortnode[sortindex[i]].plane->FOFSector, sortnode[sortindex[i]].plane->alpha, sortnode[sortindex[i]].plane->planecolormap); } @@ -4896,7 +4896,7 @@ static void HWR_CreateDrawNodes(void) gl_frontsector = NULL; if (!(sortnode[sortindex[i]].polyplane->blend & PF_NoTexture)) - HWR_GetLevelFlat(sortnode[sortindex[i]].polyplane->levelflat, R_NoEncore(sortnode[sortindex[i]].polyplane->FOFSector, sortnode[sortindex[i]].polyplane->isceiling)); + HWR_GetLevelFlat(sortnode[sortindex[i]].polyplane->levelflat, R_NoEncore(sortnode[sortindex[i]].polyplane->FOFSector, sortnode[sortindex[i]].polyplane->levelflat, sortnode[sortindex[i]].polyplane->isceiling)); HWR_RenderPolyObjectPlane(sortnode[sortindex[i]].polyplane->polysector, sortnode[sortindex[i]].polyplane->isceiling, sortnode[sortindex[i]].polyplane->fixedheight, sortnode[sortindex[i]].polyplane->blend, sortnode[sortindex[i]].polyplane->lightlevel, sortnode[sortindex[i]].polyplane->levelflat, sortnode[sortindex[i]].polyplane->FOFSector, sortnode[sortindex[i]].polyplane->alpha, sortnode[sortindex[i]].polyplane->planecolormap); } diff --git a/src/k_terrain.c b/src/k_terrain.c index 2d8f14d87..4f6367b3e 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -1486,7 +1486,7 @@ static void K_ParseTerrainParameter(size_t i, const char *param, const char *val } else if (stricmp(param, "offroad") == 0) { - terrain->offroad = (UINT8)get_number(val); // offroad strength enum? + terrain->offroad = FLOAT_TO_FIXED(atof(val)); } else if (stricmp(param, "damageType") == 0) { diff --git a/src/k_terrain.h b/src/k_terrain.h index 29ce0873e..399b6ba1c 100644 --- a/src/k_terrain.h +++ b/src/k_terrain.h @@ -111,7 +111,7 @@ typedef struct terrain_s size_t overlayID; // Overlay defintion ID. fixed_t friction; // The default friction of this texture. - UINT8 offroad; // The default offroad level of this texture. + fixed_t offroad; // The default offroad level of this texture. INT16 damageType; // The default damage type of this texture. (Negative means no damage). UINT8 trickPanel; // Trick panel strength fixed_t floorClip; // Offset for sprites on this ground diff --git a/src/p_setup.c b/src/p_setup.c index dec8ce107..a6642f3eb 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1494,6 +1494,8 @@ static void ParseTextmapSectorParameter(UINT32 i, const char *param, const char sectors[i].flags |= MSF_RIPPLE_FLOOR; else if (fastcmp(param, "ripple_ceiling") && fastcmp("true", val)) sectors[i].flags |= MSF_RIPPLE_CEILING; + else if (fastcmp(param, "invertencore") && fastcmp("true", val)) + sectors[i].flags |= MSF_INVERTENCORE; else if (fastcmp(param, "nostepup") && fastcmp("true", val)) sectors[i].specialflags |= SSF_NOSTEPUP; else if (fastcmp(param, "doublestepup") && fastcmp("true", val)) @@ -2325,6 +2327,8 @@ static void P_WriteTextmap(void) fprintf(f, "ripple_floor = true;\n"); if (wsectors[i].flags & MSF_RIPPLE_CEILING) fprintf(f, "ripple_ceiling = true;\n"); + if (wsectors[i].flags & MSF_INVERTENCORE) + fprintf(f, "invertencore = true;\n"); if (wsectors[i].specialflags & SSF_NOSTEPUP) fprintf(f, "nostepup = true;\n"); if (wsectors[i].specialflags & SSF_DOUBLESTEPUP) @@ -4026,7 +4030,6 @@ static void P_ConvertBinaryLinedefTypes(void) if (lines[i].flags & ML_DONTPEGTOP) sectors[s].flags |= MSF_RIPPLE_FLOOR; - if (lines[i].flags & ML_DONTPEGBOTTOM) sectors[s].flags |= MSF_RIPPLE_CEILING; } @@ -5788,18 +5791,23 @@ static void P_ConvertBinarySectorTypes(void) switch(GETSECSPECIAL(sectors[i].special, 1)) { case 1: //Damage - case 5: //Spikes sectors[i].damagetype = SD_GENERIC; break; case 2: //Offroad (Weak) + CONS_Alert(CONS_WARNING, "Offroad specials will be deprecated soon. Use the TERRAIN effect!\n"); sectors[i].offroad = FRACUNIT; break; case 3: //Offroad + CONS_Alert(CONS_WARNING, "Offroad specials will be deprecated soon. Use the TERRAIN effect!\n"); sectors[i].offroad = 2*FRACUNIT; break; case 4: //Offroad (Strong) + CONS_Alert(CONS_WARNING, "Offroad specials will be deprecated soon. Use the TERRAIN effect!\n"); sectors[i].offroad = 3*FRACUNIT; break; + case 5: //Spikes + sectors[i].damagetype = SD_GENERIC; + break; case 6: //Death pit (camera tilt) case 7: //Death pit (no camera tilt) sectors[i].damagetype = SD_DEATHPIT; @@ -5807,11 +5815,8 @@ static void P_ConvertBinarySectorTypes(void) case 8: //Instakill sectors[i].damagetype = SD_INSTAKILL; break; - case 11: //Special stage damage - //sectors[i].damagetype = SD_SPECIALSTAGE; - break; - case 12: //Space countdown - //sectors[i].specialflags |= SSF_OUTERSPACE; + case 12: //Wall sector + sectors[i].specialflags |= SSF_NOSTEPUP; break; case 13: //Ramp sector sectors[i].specialflags |= SSF_DOUBLESTEPUP; @@ -5853,12 +5858,19 @@ static void P_ConvertBinarySectorTypes(void) case 8: //Check for linedef executor on FOFs sectors[i].flags |= MSF_TRIGGERLINE_MOBJ; break; + case 15: //Invert Encore + sectors[i].flags |= MSF_INVERTENCORE; + break; default: break; } switch(GETSECSPECIAL(sectors[i].special, 3)) { + case 1: //Trick panel + case 3: + CONS_Alert(CONS_WARNING, "Trick Panel special is deprecated. Use the TERRAIN effect!\n"); + break; case 5: //Speed pad sectors[i].specialflags |= SSF_SPEEDPAD; break; @@ -5871,12 +5883,18 @@ static void P_ConvertBinarySectorTypes(void) case 1: //Star post activator sectors[i].specialflags |= SSF_STARPOSTACTIVATOR; break; - case 2: //Exit/Special Stage pit/Return flag + case 2: //Exit sectors[i].specialflags |= SSF_EXIT; break; case 5: //Fan sector sectors[i].specialflags |= SSF_FAN; break; + case 6: //Sneaker panel + CONS_Alert(CONS_WARNING, "Sneaker Panel special is deprecated. Use the TERRAIN effect!\n"); + break; + case 7: //Destroy items + sectors[i].specialflags |= SSF_DESTROYITEMS; + break; case 8: //Zoom tube start sectors[i].specialflags |= SSF_ZOOMTUBESTART; break; diff --git a/src/p_spec.c b/src/p_spec.c index b0c9584bb..7b09e8bb4 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4453,22 +4453,22 @@ static void P_ProcessSpeedPad(player_t *player, sector_t *sector, sector_t *rove static void P_ProcessExitSector(player_t *player, mtag_t sectag) { -#if 1 - (void)player; - (void)sectag; -#else INT32 lineindex; +#if 0 if (!(gametyperules & GTR_ALLOWEXIT)) return; +#endif // Exit (for FOF exits; others are handled in P_PlayerThink in p_user.c) P_DoPlayerFinish(player); P_SetupSignExit(player); +#if 0 if (!G_CoopGametype()) return; +#endif // Custom exit! // important: use sectag on next line instead of player->mo->subsector->tag @@ -4482,15 +4482,10 @@ static void P_ProcessExitSector(player_t *player, mtag_t sectag) return; } - // Special goodies depending on emeralds collected - if ((lines[lineindex].args[1] & TMEF_EMERALDCHECK) && ALLCHAOSEMERALDS(emeralds)) - nextmapoverride = (INT16)(udmf ? lines[lineindex].args[2] : lines[lineindex].frontsector->ceilingheight>>FRACBITS); - else - nextmapoverride = (INT16)(udmf ? lines[lineindex].args[0] : lines[lineindex].frontsector->floorheight>>FRACBITS); + nextmapoverride = (INT16)(udmf ? lines[lineindex].args[0] : lines[lineindex].frontsector->floorheight>>FRACBITS); if (lines[lineindex].args[1] & TMEF_SKIPTALLY) skipstats = 1; -#endif } static void P_ProcessZoomTube(player_t *player, mtag_t sectag, boolean end) diff --git a/src/r_bsp.c b/src/r_bsp.c index 5bed2eb0d..a40acdd08 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -41,31 +41,28 @@ drawseg_t *ds_p = NULL; // indicates doors closed wrt automap bugfix: INT32 doorclosed; -boolean R_NoEncore(sector_t *sector, boolean ceiling) +boolean R_NoEncore(sector_t *sector, levelflat_t *flat, boolean ceiling) { - // FIXME: UDMFify - /* - boolean invertencore = (GETSECSPECIAL(sector->special, 2) == 15); -#if 0 // perfect implementation - INT32 val = GETSECSPECIAL(sector->special, 3); - //if (val != 1 && val != 3 // spring panel -#else // optimised, see #define GETSECSPECIAL(i,j) ((i >> ((j-1)*4))&15) - if ((!(sector->special & (1<<8)) || (sector->special & ((4|8)<<8))) // spring panel -#endif - && GETSECSPECIAL(sector->special, 4) != 6) // sneaker panel - return invertencore; + const boolean invertEncore = (sector->flags & MSF_INVERTENCORE); + const terrain_t *terrain = (flat != NULL ? flat->terrain : NULL); - if (invertencore) + if ((terrain == NULL) + || (terrain->trickPanel <= 0 && !(terrain->flags & TRF_SNEAKERPANEL))) + { + return invertEncore; + } + + if (invertEncore) + { return false; + } if (ceiling) + { return ((boolean)(sector->flags & MSF_FLIPSPECIAL_CEILING)); - return ((boolean)(sector->flags & MSF_FLIPSPECIAL_FLOOR)); - */ + } - (void)sector; - (void)ceiling; - return false; + return ((boolean)(sector->flags & MSF_FLIPSPECIAL_FLOOR)); } boolean R_IsRipplePlane(sector_t *sector, ffloor_t *rover, int ceiling) @@ -953,7 +950,7 @@ static void R_Subsector(size_t num) frontsector->floorheight, frontsector->floorpic, floorlightlevel, frontsector->floor_xoffs, frontsector->floor_yoffs, frontsector->floorpic_angle, floorcolormap, NULL, NULL, frontsector->f_slope, - R_NoEncore(frontsector, false), + R_NoEncore(frontsector, &levelflats[frontsector->floorpic], false), R_IsRipplePlane(frontsector, NULL, false), false ); @@ -969,7 +966,7 @@ static void R_Subsector(size_t num) frontsector->ceilingheight, frontsector->ceilingpic, ceilinglightlevel, frontsector->ceiling_xoffs, frontsector->ceiling_yoffs, frontsector->ceilingpic_angle, ceilingcolormap, NULL, NULL, frontsector->c_slope, - R_NoEncore(frontsector, true), + R_NoEncore(frontsector, &levelflats[frontsector->ceilingpic], true), R_IsRipplePlane(frontsector, NULL, true), true ); @@ -1017,7 +1014,7 @@ static void R_Subsector(size_t num) *rover->bottomheight, *rover->bottompic, *frontsector->lightlist[light].lightlevel, *rover->bottomxoffs, *rover->bottomyoffs, *rover->bottomangle, *frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->b_slope, - R_NoEncore(rover->master->frontsector, true), + R_NoEncore(rover->master->frontsector, &levelflats[*rover->bottompic], true), R_IsRipplePlane(rover->master->frontsector, rover, true), true ); @@ -1051,7 +1048,7 @@ static void R_Subsector(size_t num) *rover->topheight, *rover->toppic, *frontsector->lightlist[light].lightlevel, *rover->topxoffs, *rover->topyoffs, *rover->topangle, *frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->t_slope, - R_NoEncore(rover->master->frontsector, false), + R_NoEncore(rover->master->frontsector, &levelflats[*rover->toppic], false), R_IsRipplePlane(rover->master->frontsector, rover, false), false ); @@ -1101,7 +1098,7 @@ static void R_Subsector(size_t num) polysec->floorpic_angle-po->angle, (light == -1 ? frontsector->extra_colormap : *frontsector->lightlist[light].extra_colormap), NULL, po, NULL, // will ffloors be slopable eventually? - R_NoEncore(polysec, false), + R_NoEncore(polysec, &levelflats[polysec->floorpic], false), false, /* TODO: wet polyobjects? */ true ); @@ -1130,7 +1127,7 @@ static void R_Subsector(size_t num) (light == -1 ? frontsector->lightlevel : *frontsector->lightlist[light].lightlevel), polysec->ceiling_xoffs, polysec->ceiling_yoffs, polysec->ceilingpic_angle-po->angle, (light == -1 ? frontsector->extra_colormap : *frontsector->lightlist[light].extra_colormap), NULL, po, NULL, // will ffloors be slopable eventually? - R_NoEncore(polysec, true), + R_NoEncore(polysec, &levelflats[polysec->ceilingpic], true), false, /* TODO: wet polyobjects? */ false ); diff --git a/src/r_bsp.h b/src/r_bsp.h index 48edd7caa..0c232d67b 100644 --- a/src/r_bsp.h +++ b/src/r_bsp.h @@ -42,7 +42,7 @@ void R_RenderBSPNode(INT32 bspnum); // determines when a given sector shouldn't abide by the encoremap's palette. // no longer a static since this is used for encore in hw_main.c as well now: -boolean R_NoEncore(sector_t *sector, boolean ceiling); +boolean R_NoEncore(sector_t *sector, levelflat_t *flat, boolean ceiling); boolean R_IsRipplePlane(sector_t *sector, ffloor_t *rover, int ceiling); diff --git a/src/r_defs.h b/src/r_defs.h index 3f801c197..f4aec08f4 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -345,6 +345,8 @@ typedef enum // water ripple MSF_RIPPLE_FLOOR = 1<<10, MSF_RIPPLE_CEILING = 1<<11, + // invert encore color remap status + MSF_INVERTENCORE = 1<<12, } sectorflags_t; typedef enum