Use Parameter on slope anchors as a tag

This makes FOF sloping over other slopes possible!

Had to remove the absolute height function though.
This commit is contained in:
James R 2020-09-24 03:18:31 -07:00
parent 388d56a5f8
commit 1403c49f50

View file

@ -118,11 +118,6 @@ anchor_height
const mapthing_t * a, const mapthing_t * a,
const sector_t * s const sector_t * s
){ ){
if (a->extrainfo)
{
return a->options;
}
else
{ {
INT16 z = ( a->options >> ZSHIFT ); INT16 z = ( a->options >> ZSHIFT );
@ -194,6 +189,7 @@ get_anchor
mapthing_t ** anchors, mapthing_t ** anchors,
fixed_t distances[3], fixed_t distances[3],
const struct anchor_list * list, const struct anchor_list * list,
const INT16 tag,
const vertex_t * v const vertex_t * v
){ ){
size_t i; size_t i;
@ -202,7 +198,7 @@ get_anchor
for (i = 0; i < list->count; ++i) for (i = 0; i < list->count; ++i)
{ {
if (list->points[i] == v) if (list->points[i] == v && list->anchors[i]->extrainfo == tag)
{ {
for (k = 0; k < 3; ++k) for (k = 0; k < 3; ++k)
{ {
@ -243,14 +239,15 @@ get_sector_anchors
mapthing_t ** anchors, mapthing_t ** anchors,
fixed_t distances[3], fixed_t distances[3],
const struct anchor_list * list, const struct anchor_list * list,
const INT16 tag,
const sector_t * sector const sector_t * sector
){ ){
size_t i; size_t i;
for (i = 0; i < sector->linecount; ++i) for (i = 0; i < sector->linecount; ++i)
{ {
get_anchor(anchors, distances, list, sector->lines[i]->v1); get_anchor(anchors, distances, list, tag, sector->lines[i]->v1);
get_anchor(anchors, distances, list, sector->lines[i]->v2); get_anchor(anchors, distances, list, tag, sector->lines[i]->v2);
} }
} }
@ -258,7 +255,8 @@ static mapthing_t **
find_closest_anchors find_closest_anchors
( (
const sector_t * sector, const sector_t * sector,
const struct anchor_list * list const struct anchor_list * list,
const INT16 tag
){ ){
fixed_t distances[3] = { INT32_MAX, INT32_MAX, INT32_MAX }; fixed_t distances[3] = { INT32_MAX, INT32_MAX, INT32_MAX };
@ -280,12 +278,12 @@ find_closest_anchors
for (i = 0; i < sector->numattached; ++i) for (i = 0; i < sector->numattached; ++i)
{ {
get_sector_anchors get_sector_anchors
(anchors, distances, list, &sectors[sector->attached[i]]); (anchors, distances, list, tag, &sectors[sector->attached[i]]);
} }
} }
else else
{ {
get_sector_anchors(anchors, distances, list, sector); get_sector_anchors(anchors, distances, list, tag, sector);
} }
if (distances[2] < INT32_MAX) if (distances[2] < INT32_MAX)
@ -311,12 +309,13 @@ find_closest_anchors
I_Error( I_Error(
"(Control Sector #%s)" "(Control Sector #%s)"
" Slope requires anchors near 3 of its target sectors' vertices" " Slope requires anchors (with Parameter %d)"
" (%d found)" " near 3 of its target sectors' vertices (%d found)"
"\n\nCheck the log to see which sectors were searched.", "\n\nCheck the log to see which sectors were searched.",
sizeu1 (sector - sectors), sizeu1 (sector - sectors),
tag,
last last
); );
} }
@ -324,9 +323,11 @@ find_closest_anchors
{ {
I_Error( I_Error(
"(Sector #%s)" "(Sector #%s)"
" Slope requires anchors near 3 of its vertices (%d found)", " Slope requires anchors (with Parameter %d)"
" near 3 of its vertices (%d found)",
sizeu1 (sector - sectors), sizeu1 (sector - sectors),
tag,
last last
); );
} }
@ -367,6 +368,24 @@ new_vertex_slope
return slope; return slope;
} }
static void
slope_sector
(
pslope_t ** slope,
sector_t * sector,
const INT16 flags,
const struct anchor_list * list,
const INT16 tag
){
mapthing_t ** anchors = find_closest_anchors(sector, list, tag);
if (anchors != NULL)
{
(*slope) = new_vertex_slope(anchors, flags);
sector->hasslope = true;
}
}
static void static void
make_anchored_slope make_anchored_slope
( (
@ -384,7 +403,6 @@ make_anchored_slope
const int side = ( flags & ML_NOCLIMB ) != 0; const int side = ( flags & ML_NOCLIMB ) != 0;
sector_t * sector; sector_t * sector;
mapthing_t ** anchors;
if (side == 0 || flags & ML_TWOSIDED) if (side == 0 || flags & ML_TWOSIDED)
{ {
@ -392,17 +410,15 @@ make_anchored_slope
if (plane & FLOOR) if (plane & FLOOR)
{ {
anchors = find_closest_anchors(sector, &floor_anchors); slope_sector
sector->f_slope = new_vertex_slope(anchors, flags); (&sector->f_slope, sector, flags, &floor_anchors, line->tag);
} }
if (plane & CEILING) if (plane & CEILING)
{ {
anchors = find_closest_anchors(sector, &ceiling_anchors); slope_sector
sector->c_slope = new_vertex_slope(anchors, flags); (&sector->c_slope, sector, flags, &ceiling_anchors, line->tag);
} }
sector->hasslope = true;
} }
} }