Adapt polyobject translucency fade linedef to UDMF

This commit is contained in:
MascaraSnake 2021-07-04 19:28:14 +02:00
parent 6d007f388a
commit 7e88db938d
4 changed files with 74 additions and 27 deletions

View file

@ -2800,13 +2800,9 @@ udmf
}
arg2
{
title = "Set/add?";
title = "Set/Add?";
type = 11;
enum
{
0 = "Set";
1 = "Add";
}
enum = "setadd";
}
}
}
@ -3012,6 +3008,38 @@ udmf
enum = "setadd";
}
}
492
{
title = "Fade Translucency";
prefix = "(492)";
arg0
{
title = "PolyObject ID";
type = 14;
}
arg1
{
title = "Translucency level";
}
arg2
{
title = "Fading speed";
}
arg3
{
title = "Flags";
type = 12;
enum
{
1 = "Add to current translucency";
2 = "Interrupt ongoing fades";
4 = "Speed is duration";
8 = "Don't change collision";
16 = "No collision during fade";
}
}
}
}
scrollpush

View file

@ -349,6 +349,15 @@ typedef struct polyflagdata_s
fixed_t momx;
} polyflagdata_t;
typedef enum
{
TMPF_RELATIVE = 1,
TMPF_OVERRIDE = 1<<1,
TMPF_TICBASED = 1<<2,
TMPF_IGNORECOLLISION = 1<<3,
TMPF_GHOSTFADE = 1<<4,
} textmappolyfade_t;
typedef struct polyfadedata_s
{
INT32 polyObjNum;

View file

@ -3750,6 +3750,28 @@ static void P_ConvertBinaryMap(void)
lines[i].args[1] /= 100;
lines[i].args[2] = !!(lines[i].flags & ML_EFFECT3);
break;
case 492: //Polyobject - fade translucency
lines[i].args[0] = tag;
// If Front X Offset is specified, use that. Else, use floorheight.
lines[i].args[1] = (sides[lines[i].sidenum[0]].textureoffset ? sides[lines[i].sidenum[0]].textureoffset : lines[i].frontsector->floorheight) >> FRACBITS;
// If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000.
if (!(lines[i].flags & ML_DONTPEGBOTTOM))
lines[i].args[1] /= 100;
// allow Back Y Offset to be consistent with other fade specials
lines[i].args[2] = (lines[i].sidenum[1] != 0xffff && !sides[lines[i].sidenum[0]].rowoffset) ?
abs(sides[lines[i].sidenum[1]].rowoffset >> FRACBITS)
: abs(sides[lines[i].sidenum[0]].rowoffset >> FRACBITS);
if (lines[i].flags & ML_EFFECT3)
lines[i].args[3] |= TMPF_RELATIVE;
if (lines[i].flags & ML_EFFECT5)
lines[i].args[3] |= TMPF_OVERRIDE;
if (lines[i].flags & ML_EFFECT4)
lines[i].args[3] |= TMPF_TICBASED;
if (lines[i].flags & ML_BOUNCY)
lines[i].args[3] |= TMPF_IGNORECOLLISION;
if (lines[i].flags & ML_EFFECT1)
lines[i].args[3] |= TMPF_GHOSTFADE;
break;
case 500: //Scroll front wall left
case 501: //Scroll front wall right
lines[i].args[0] = 0;

View file

@ -1090,10 +1090,9 @@ static void PolyTranslucency(line_t *line)
// Makes a polyobject translucency fade and applies tangibility
static boolean PolyFade(line_t *line)
{
INT32 polyObjNum = Tag_FGet(&line->tags);
INT32 polyObjNum = line->args[0];
polyobj_t *po;
polyfadedata_t pfd;
INT32 value;
if (!(po = Polyobj_GetForNum(polyObjNum)))
{
@ -1106,7 +1105,7 @@ static boolean PolyFade(line_t *line)
return 0;
// Prevent continuous execs from interfering on an existing fade
if (!(line->flags & ML_EFFECT5)
if (!(line->args[3] & TMPF_OVERRIDE)
&& po->thinker
&& po->thinker->function.acp1 == (actionf_p1)T_PolyObjFade)
{
@ -1116,17 +1115,10 @@ static boolean PolyFade(line_t *line)
pfd.polyObjNum = polyObjNum;
// If Front X Offset is specified, use that. Else, use floorheight.
value = (sides[line->sidenum[0]].textureoffset ? sides[line->sidenum[0]].textureoffset : line->frontsector->floorheight) >> FRACBITS;
// If DONTPEGBOTTOM, specify raw translucency value. Else, take it out of 1000.
if (!(line->flags & ML_DONTPEGBOTTOM))
value /= 100;
if (line->flags & ML_EFFECT3) // relative calc
pfd.destvalue = po->translucency + value;
if (line->args[3] & TMPF_RELATIVE) // relative calc
pfd.destvalue = po->translucency + line->args[1];
else
pfd.destvalue = value;
pfd.destvalue = line->args[1];
pfd.destvalue = max(min(pfd.destvalue, NUMTRANSMAPS), 0);
@ -1134,15 +1126,11 @@ static boolean PolyFade(line_t *line)
if (po->translucency == pfd.destvalue)
return 1;
pfd.docollision = !(line->flags & ML_BOUNCY); // do not handle collision flags
pfd.doghostfade = (line->flags & ML_EFFECT1); // do ghost fade (no collision flags during fade)
pfd.ticbased = (line->flags & ML_EFFECT4); // Speed = Tic Duration
// allow Back Y Offset to be consistent with other fade specials
pfd.speed = (line->sidenum[1] != 0xFFFF && !sides[line->sidenum[0]].rowoffset) ?
abs(sides[line->sidenum[1]].rowoffset>>FRACBITS)
: abs(sides[line->sidenum[0]].rowoffset>>FRACBITS);
pfd.docollision = !(line->args[3] & TMPF_IGNORECOLLISION); // do not handle collision flags
pfd.doghostfade = (line->args[3] & TMPF_GHOSTFADE); // do ghost fade (no collision flags during fade)
pfd.ticbased = (line->args[3] & TMPF_TICBASED); // Speed = Tic Duration
pfd.speed = line->args[2];
return EV_DoPolyObjFade(&pfd);
}