From 4bbfd36999fcc593437b140171ac53c2da2312c3 Mon Sep 17 00:00:00 2001 From: Nev3r Date: Sun, 15 Dec 2019 21:33:25 +0100 Subject: [PATCH] Does what the previous commit says it did, as I failed to commit the changes properly: "Add line args; add map conversion function; convert slope specials." --- src/p_setup.c | 11 ++-- src/p_slopes.c | 150 ++++++++++++++++++++++++++++++++----------------- src/p_spec.c | 92 ++++++++++++++++++++++++++++++ src/p_spec.h | 1 + src/r_defs.h | 6 ++ 5 files changed, 205 insertions(+), 55 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 878a23d97..a613835c8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -729,7 +729,7 @@ static void P_LoadRawNodes(UINT8 *data) static void GeneralDefaults(void) { UINT32 i; -// UINT32 j; + UINT32 j; line_t *ld; side_t *sd; @@ -752,12 +752,12 @@ static void GeneralDefaults(void) #endif // Defaults. /* - ld->alpha = FRACUNIT; + ld->alpha = FRACUNIT;*/ for (j = 0; j < NUMLINEARGS; j++) ld->args[j] = 0; - ld->executordelay = 0; +/* ld->executordelay = 0; ld->udmfflags = 0;*/ } @@ -1165,7 +1165,6 @@ static void TextmapLine(UINT32 i, char *param) lines[i].sidenum[0] = atol(M_GetToken(NULL)); else if (fastcmp(param, "sideback")) lines[i].sidenum[1] = atol(M_GetToken(NULL)); - #ifdef ADVUDMF else if (fastncmp(param, "arg", 3) && strlen(param) > 3) { if (fastcmp(param + 4, "str")) @@ -1191,10 +1190,12 @@ static void TextmapLine(UINT32 i, char *param) lines[i].args[argnum] = atol(M_GetToken(NULL)); } } + #ifdef ADVUDMF else if (fastcmp(param, "alpha")) lines[i].alpha = FLOAT_TO_FIXED(atof(M_GetToken(NULL))); else if (fastcmp(param, "executordelay")) lines[i].executordelay = atol(M_GetToken(NULL)); + #endif // Flags else if (fastcmp(param, "blocking") && fastcmp("true", M_GetToken(NULL))) @@ -2577,7 +2578,6 @@ static boolean LoadMapBSP (const virtres_t* virt) { case NT_BINARY: { - numsubsectors = virtssectors->size/ sizeof (mapsubsector_t); numnodes = virtnodes->size / sizeof (mapnode_t); numsegs = virtsegs->size / sizeof (mapseg_t); @@ -2910,6 +2910,7 @@ static boolean LoadMapData (const virtres_t* virt) SetupLines(); P_LoadRawSideDefs2(virtsidedefs->data); P_PrepareRawThings(virtthings->data); + P_ConvertBinaryLinedefs(); } R_ClearTextureNumCache(true); diff --git a/src/p_slopes.c b/src/p_slopes.c index 64f11eb72..52a056549 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -247,22 +247,16 @@ static void line_SpawnViaLine(const int linenum, const boolean spawnthinker) // because checking to see if a slope had changed will waste more memory than // if the slope was just updated when called line_t *line = lines + linenum; - INT16 special = line->special; pslope_t *fslope = NULL, *cslope = NULL; vector3_t origin, point; vector2_t direction; fixed_t nx, ny, dz, extent; - boolean frontfloor = (special == 700 || special == 702 || special == 703); - boolean backfloor = (special == 710 || special == 712 || special == 713); - boolean frontceil = (special == 701 || special == 702 || special == 713); - boolean backceil = (special == 711 || special == 712 || special == 703); - - UINT8 flags = 0; // Slope flags - if (line->flags & ML_NETONLY) - flags |= SL_NOPHYSICS; - if (line->flags & ML_NONET) - flags |= SL_DYNAMIC; + boolean frontfloor = line->args[0] == 1; + boolean backfloor = line->args[0] == 2; + boolean frontceil = line->args[1] == 1; + boolean backceil = line->args[1] == 2; + UINT8 flags = line->args[2]; // Slope flags if(!frontfloor && !backfloor && !frontceil && !backceil) { @@ -445,10 +439,10 @@ static pslope_t *MakeViaMapthings(INT16 tag1, INT16 tag2, INT16 tag3, UINT8 flag I_Error("MakeViaMapthings: Slope vertex %s (for linedef tag %d) not found!", sizeu1(i), tag1); vx[i].x = mt->x << FRACBITS; vx[i].y = mt->y << FRACBITS; - if (mt->extrainfo) - vx[i].z = mt->options << FRACBITS; - else - vx[i].z = (R_PointInSubsector(mt->x << FRACBITS, mt->y << FRACBITS)->sector->floorheight) + ((mt->options >> ZSHIFT) << FRACBITS); + vx[i].z = mt->z << FRACBITS; + + if (!mt->extrainfo) + vx[i].z += R_PointInSubsector(mt->x << FRACBITS, mt->y << FRACBITS)->sector->floorheight; } ReconfigureViaVertexes(ret, vx[0], vx[1], vx[2]); @@ -465,45 +459,29 @@ static void line_SpawnViaVertexes(const int linenum, const boolean spawnthinker) line_t *line = lines + linenum; side_t *side; pslope_t **slopetoset; - UINT16 tag1, tag2, tag3; - UINT8 flags = 0; - if (line->flags & ML_NETONLY) - flags |= SL_NOPHYSICS; - if (line->flags & ML_NONET) - flags |= SL_DYNAMIC; - - switch(line->special) + switch(line->args[0]) { - case 704: + case 0: slopetoset = &line->frontsector->f_slope; side = &sides[line->sidenum[0]]; break; - case 705: + case 1: slopetoset = &line->frontsector->c_slope; side = &sides[line->sidenum[0]]; break; - case 714: + case 2: slopetoset = &line->backsector->f_slope; side = &sides[line->sidenum[1]]; break; - case 715: + case 3: slopetoset = &line->backsector->c_slope; side = &sides[line->sidenum[1]]; default: return; } - if (line->flags & ML_EFFECT6) - { - tag1 = line->tag; - tag2 = side->textureoffset >> FRACBITS; - tag3 = side->rowoffset >> FRACBITS; - } - else - tag1 = tag2 = tag3 = line->tag; - - *slopetoset = MakeViaMapthings(tag1, tag2, tag3, flags, spawnthinker); + *slopetoset = MakeViaMapthings(line->args[1], line->args[2], line->args[3], line->args[4], spawnthinker); side->sector->hasslope = true; } @@ -567,25 +545,97 @@ void SpawnVertexSlopes (void) void P_CopySectorSlope(line_t *line) { sector_t *fsec = line->frontsector; - int i, special = line->special; + sector_t *bsec = line->backsector; + int i; + // Check for copy linedefs - for (i = -1; (i = P_FindSectorFromLineTag(line, i)) >= 0;) + if (line->args[0]) { - sector_t *srcsec = sectors + i; - - if ((special - 719) & 1 && !fsec->f_slope && srcsec->f_slope) - fsec->f_slope = srcsec->f_slope; //P_CopySlope(srcsec->f_slope); - if ((special - 719) & 2 && !fsec->c_slope && srcsec->c_slope) - fsec->c_slope = srcsec->c_slope; //P_CopySlope(srcsec->c_slope); + for (i = -1; (i = P_FindSectorFromTag(line->args[0], i)) >= 0;) + { + sector_t *srcsec = sectors + i; + if (!fsec->f_slope && srcsec->f_slope) + { + fsec->f_slope = srcsec->f_slope; + fsec->hasslope = true; + } + } + } + if (line->args[1]) + { + for (i = -1; (i = P_FindSectorFromTag(line->args[1], i)) >= 0;) + { + sector_t *srcsec = sectors + i; + if (!fsec->c_slope && srcsec->c_slope) + { + fsec->c_slope = srcsec->c_slope; + fsec->hasslope = true; + } + } } - fsec->hasslope = true; + if (bsec) + { + if (line->args[2]) + { + for (i = -1; (i = P_FindSectorFromTag(line->args[2], i)) >= 0;) + { + sector_t *srcsec = sectors + i; + if (!bsec->f_slope && srcsec->f_slope) + { + bsec->f_slope = srcsec->f_slope; + bsec->hasslope = true; + } + } + } + if (line->args[3]) + { + for (i = -1; (i = P_FindSectorFromTag(line->args[3], i)) >= 0;) + { + sector_t *srcsec = sectors + i; + if (!bsec->c_slope && srcsec->c_slope) + { + bsec->c_slope = srcsec->c_slope; + bsec->hasslope = true; + } + } + } - // if this is an FOF control sector, make sure any target sectors also are marked as having slopes - if (fsec->numattached) - for (i = 0; i < (int)fsec->numattached; i++) - sectors[fsec->attached[i]].hasslope = true; + //Share slopes between front and back side + if (line->args[4] & 1) + { + if (!bsec->f_slope && fsec->f_slope) + { + bsec->f_slope = fsec->f_slope; + bsec->hasslope = true; + } + } + if (line->args[4] & 2) + { + if (!fsec->f_slope && bsec->f_slope) + { + fsec->f_slope = bsec->f_slope; + fsec->hasslope = true; + } + } + if (line->args[4] & 4) + { + if (!bsec->c_slope && fsec->c_slope) + { + bsec->c_slope = fsec->c_slope; + bsec->hasslope = true; + } + } + if (line->args[4] & 8) + { + if (!fsec->c_slope && bsec->c_slope) + { + fsec->c_slope = bsec->c_slope; + fsec->hasslope = true; + } + } + } line->special = 0; // Linedef was use to set slopes, it finished its job, so now make it a normal linedef } diff --git a/src/p_spec.c b/src/p_spec.c index 5e5d9a29e..323321016 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6398,6 +6398,98 @@ static void P_RunLevelLoadExecutors(void) } } +//For maps in binary format, converts linedef specials to the setup used by UDMF. +//\todo unfinished +void P_ConvertBinaryLinedefs(void) +{ + size_t i; + for (i = 0; i < numlines; i++) + { + switch (lines[i].special) + { + case 700: //Slope front sector floor + case 701: //Slope front sector ceiling + case 702: //Slope front sector floor and ceiling + case 703: //Slope front sector floor and back sector ceiling + case 710: //Slope back sector floor + case 711: //Slope back sector ceiling + case 712: //Slope back sector floor and ceiling + case 713: //Slope back sector floor and front sector ceiling + { + boolean frontfloor = (lines[i].special == 700 || lines[i].special == 702 || lines[i].special == 703); + boolean backfloor = (lines[i].special == 710 || lines[i].special == 712 || lines[i].special == 713); + boolean frontceil = (lines[i].special == 701 || lines[i].special == 702 || lines[i].special == 713); + boolean backceil = (lines[i].special == 711 || lines[i].special == 712 || lines[i].special == 703); + + lines[i].args[0] = backfloor ? 2 : (frontfloor ? 1 : 0); + lines[i].args[1] = backceil ? 2 : (frontceil ? 1 : 0); + + if (lines[i].flags & ML_NETONLY) + lines[i].args[2] |= SL_NOPHYSICS; + if (lines[i].flags & ML_NONET) + lines[i].args[2] |= SL_DYNAMIC; + + lines[i].special = 700; + break; + } + case 704: //Slope front sector floor by 3 tagged vertices + case 705: //Slope front sector ceiling by 3 tagged vertices + case 714: //Slope back sector floor by 3 tagged vertices + case 715: //Slope back sector ceiling by 3 tagged vertices + { + if (lines[i].special == 704) + lines[i].args[0] = 0; + else if (lines[i].special == 705) + lines[i].args[0] = 1; + else if (lines[i].special == 714) + lines[i].args[0] = 2; + else if (lines[i].special == 715) + lines[i].args[0] = 3; + + lines[i].args[1] = lines[i].tag; + + if (lines[i].flags & ML_EFFECT6) + { + UINT8 side = lines[i].special >= 714; + + if (side == 1 && lines[i].sidenum[1] == 0xffff) + CONS_Debug(DBG_GAMELOGIC, "Line special %d (line #%s) missing 2nd side!\n", lines[i].special, sizeu1(i)); + else + { + lines[i].args[2] = sides[lines[i].sidenum[side]].textureoffset >> FRACBITS; + lines[i].args[3] = sides[lines[i].sidenum[side]].rowoffset >> FRACBITS; + } + } + else + { + lines[i].args[2] = lines[i].args[1]; + lines[i].args[3] = lines[i].args[1]; + } + + lines[i].args[4] = 0; + if (lines[i].flags & ML_NETONLY) + lines[i].args[4] |= SL_NOPHYSICS; + if (lines[i].flags & ML_NONET) + lines[i].args[4] |= SL_DYNAMIC; + + lines[i].special = 704; + break; + } + case 720: //Copy front side floor slope + case 721: //Copy front side ceiling slope + case 722: //Copy front side floor and ceiling slope + if (lines[i].special != 721) + lines[i].args[0] = lines[i].tag; + if (lines[i].special != 720) + lines[i].args[1] = lines[i].tag; + lines[i].special = 720; + break; + default: + break; + } + } +} + /** Before things are loaded, initialises certain stuff in case they're needed * by P_ResetDynamicSlopes or P_LoadThings. This was split off from * P_SpawnSpecials, in case you couldn't tell. diff --git a/src/p_spec.h b/src/p_spec.h index 14d3ebb59..dcf03cbd1 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -34,6 +34,7 @@ void P_InitPicAnims(void); void P_SetupLevelFlatAnims(void); // at map load +void P_ConvertBinaryLinedefs(void); void P_InitSpecials(void); void P_SpawnSpecials(INT32 fromnetsave); diff --git a/src/r_defs.h b/src/r_defs.h index 2a2cb15e7..c0116fbc8 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -373,6 +373,7 @@ typedef struct sector_s // This points to the master's floorheight, so it can be changed in realtime! fixed_t *gravity; // per-sector gravity + fixed_t *gravityptr; // For binary format: Read gravity from floor height of master sector boolean verticalflip; // If gravity < 0, then allow flipped physics sectorflags_t flags; @@ -413,6 +414,8 @@ typedef enum #define HORIZONSPECIAL 41 +#define NUMLINEARGS 6 +#define NUMLINESTRINGARGS 2 typedef struct line_s { // Vertices, from v1 to v2. @@ -451,6 +454,9 @@ typedef struct line_s char *text; // a concatination of all front and back texture names, for linedef specials that require a string. INT16 callcount; // no. of calls left before triggering, for the "X calls" linedef specials, defaults to 0 + + int args[NUMLINEARGS]; + char *stringargs[NUMLINESTRINGARGS]; } line_t; //