Update executors 400, 403, 405, and 429 for ACS

This commit is contained in:
Sally Coolatta 2022-12-27 07:32:59 -05:00
parent 87a0f81b61
commit 7d177a9157
4 changed files with 140 additions and 51 deletions

View file

@ -1622,7 +1622,6 @@ void EV_DoFloor(mtag_t tag, line_t *line, floor_e floortype)
case crushFloorOnce:
EV_DoCrushFloorOnce(
tag,
line->frontsector->ceilingheight,
line->args[2] << (FRACBITS - 2)
);
break;
@ -1850,7 +1849,7 @@ void EV_DoBounceFloor(mtag_t tag, boolean crush, fixed_t crushHeight, fixed_t cr
}
}
void EV_DoCrushFloorOnce(mtag_t tag, fixed_t height, fixed_t speed)
void EV_DoCrushFloorOnce(mtag_t tag, fixed_t speed)
{
INT32 secnum = -1;
sector_t *sec;
@ -1870,7 +1869,7 @@ void EV_DoCrushFloorOnce(mtag_t tag, fixed_t height, fixed_t speed)
dofloor->type = crushFloorOnce;
dofloor->speed = dofloor->origspeed = speed;
dofloor->floordestheight = height;
dofloor->floordestheight = sec->ceilingheight - FRACUNIT;
if (dofloor->floordestheight >= sec->floorheight)
dofloor->direction = 1; // up

View file

@ -4515,7 +4515,7 @@ static void P_ConvertBinaryLinedefTypes(void)
lines[i].args[3] |= TMFA_SPLAT;
lines[i].special = 220;
break;
break;
case 250: //FOF: Mario block
lines[i].args[0] = tag;
if (lines[i].flags & ML_NOCLIMB)
@ -4860,11 +4860,12 @@ static void P_ConvertBinaryLinedefTypes(void)
lines[i].args[2] = TMC_EQUAL;
lines[i].special = 340;
break;
case 400: //Set tagged sector's floor height/texture
case 401: //Set tagged sector's ceiling height/texture
lines[i].args[0] = tag;
lines[i].args[1] = lines[i].special - 400;
lines[i].args[2] = !(lines[i].flags & ML_NOCLIMB);
case 400: //Copy tagged sector's floor height/texture
case 401: //Copy tagged sector's ceiling height/texture
lines[i].args[0] = 0;
lines[i].args[1] = tag;
lines[i].args[2] = lines[i].special - 400;
lines[i].args[3] = !(lines[i].flags & ML_NOCLIMB);
lines[i].special = 400;
break;
case 402: //Copy light level
@ -4872,13 +4873,14 @@ static void P_ConvertBinaryLinedefTypes(void)
lines[i].args[1] = tag;
lines[i].args[2] = 0;
break;
case 403: //Move tagged sector's floor
case 404: //Move tagged sector's ceiling
lines[i].args[0] = tag;
lines[i].args[1] = lines[i].special - 403;
lines[i].args[2] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS;
lines[i].args[3] = (lines[i].flags & ML_BLOCKPLAYERS) ? sides[lines[i].sidenum[0]].textureoffset >> FRACBITS : 0;
lines[i].args[4] = !!(lines[i].flags & ML_NOCLIMB);
case 403: //Copy-move tagged sector's floor height/texture
case 404: //Copy-move tagged sector's ceiling height/texture
lines[i].args[0] = 0;
lines[i].args[1] = tag;
lines[i].args[2] = lines[i].special - 403;
lines[i].args[3] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS;
lines[i].args[4] = (lines[i].flags & ML_BLOCKPLAYERS) ? sides[lines[i].sidenum[0]].textureoffset >> FRACBITS : 0;
lines[i].args[5] = !!(lines[i].flags & ML_NOCLIMB);
lines[i].special = 403;
break;
case 405: //Move floor according to front texture offsets
@ -4890,12 +4892,12 @@ static void P_ConvertBinaryLinedefTypes(void)
lines[i].args[4] = !!(lines[i].flags & ML_NOCLIMB);
lines[i].special = 405;
break;
case 408: //Set flats
case 408: //Copy flats
lines[i].args[0] = 0;
lines[i].args[1] = tag;
if ((lines[i].flags & (ML_NOCLIMB|ML_MIDSOLID)) == (ML_NOCLIMB|ML_MIDSOLID))
{
CONS_Alert(CONS_WARNING, M_GetText("Set flats linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), tag);
CONS_Alert(CONS_WARNING, M_GetText("Copy flats linedef (tag %d) doesn't have anything to do.\nConsider changing the linedef's flag configuration or removing it entirely.\n"), tag);
lines[i].special = 0;
}
else if (lines[i].flags & ML_NOCLIMB)

View file

@ -2261,16 +2261,48 @@ void P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, char *
// note: only commands with linedef types >= 400 && < 500 can be used
switch (special)
{
case 400: // Set tagged sector's heights/flats
if (line == NULL)
case 400: // Copy tagged sector's heights/flats
{
break; // TODO
}
sector_t *copySector = NULL;
if (args[1] != TMP_CEILING)
EV_DoFloor(args[0], line, instantMoveFloorByFrontSector);
if (args[1] != TMP_FLOOR)
EV_DoCeiling(args[0], line, instantMoveCeilingByFrontSector);
if (args[0] == 0)
{
if (line == NULL)
{
CONS_Debug(DBG_GAMELOGIC, "Special type 400 Executor: No frontsector to copy planes from!\n");
return;
}
copySector = line->frontsector;
}
else
{
INT32 destsec = Tag_Iterate_Sectors(args[0], 0);
if (destsec == -1)
{
CONS_Debug(DBG_GAMELOGIC, "Special type 400 Executor: No sector to copy planes from (tag %d)!\n", args[0]);
return;
}
copySector = &sectors[destsec];
}
if (args[2] != TMP_CEILING)
{
EV_DoInstantMoveFloorByHeight(
args[1],
copySector->floorheight,
args[3] ? copySector->floorpic : -1
);
}
if (args[2] != TMP_FLOOR)
{
EV_DoInstantMoveCeilingByHeight(
args[1],
copySector->ceilingheight,
args[3] ? copySector->ceilingpic : -1
);
}
}
break;
case 402: // Copy light level to tagged sectors
@ -2339,31 +2371,77 @@ void P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, char *
}
break;
case 403: // Move planes by front sector
if (line == NULL)
case 403: // Copy-move tagged sector's heights/flats
{
break; // TODO
}
sector_t *copySector = NULL;
if (args[1] != TMP_CEILING)
EV_DoFloor(args[0], line, moveFloorByFrontSector);
if (args[1] != TMP_FLOOR)
EV_DoCeiling(args[0], line, moveCeilingByFrontSector);
if (args[0] == 0)
{
if (line == NULL)
{
CONS_Debug(DBG_GAMELOGIC, "Special type 403 Executor: No frontsector to copy planes from!\n");
return;
}
copySector = line->frontsector;
}
else
{
INT32 destsec = Tag_Iterate_Sectors(args[0], 0);
if (destsec == -1)
{
CONS_Debug(DBG_GAMELOGIC, "Special type 403 Executor: No sector to copy planes from (tag %d)!\n", args[0]);
return;
}
copySector = &sectors[destsec];
}
if (args[2] != TMP_CEILING)
{
EV_DoMoveFloorByHeight(
args[1],
copySector->floorheight,
args[3] << (FRACBITS - 3),
args[4],
args[5] ? copySector->floorpic : -1
);
}
if (args[2] != TMP_FLOOR)
{
EV_DoMoveCeilingByHeight(
args[1],
copySector->floorheight,
args[3] << (FRACBITS - 3),
args[4],
args[5] ? copySector->floorpic : -1
);
}
}
break;
case 405: // Move planes by distance
if (line == NULL)
case 405: // Move planes by offsets
if (args[1] != TMP_CEILING)
{
break; // TODO
EV_DoMoveFloorByDistance(
args[0],
args[2] << FRACBITS,
args[3] << (FRACBITS - 3),
args[4]
);
}
if (args[1] != TMP_CEILING)
EV_DoFloor(args[0], line, moveFloorByDistance);
if (args[1] != TMP_FLOOR)
EV_DoCeiling(args[0], line, moveCeilingByDistance);
{
EV_DoMoveCeilingByDistance(
args[0],
args[2] << FRACBITS,
args[3] << (FRACBITS - 3),
args[4]
);
}
break;
case 408: // Set flats
case 408: // Copy flats
{
sector_t *copySector = NULL;
@ -2762,17 +2840,27 @@ void P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, char *
break;
case 429: // Crush planes once
if (line == NULL)
{
break; // TODO
}
if (args[1] == TMP_FLOOR)
EV_DoFloor(args[0], line, crushFloorOnce);
else if (line->args[1] == TMP_CEILING)
EV_DoCrush(args[0], line, crushCeilOnce);
{
EV_DoCrushFloorOnce(
args[0],
args[2] << (FRACBITS - 2)
);
}
else if (args[1] == TMP_CEILING)
{
EV_DoCrushCeilingOnce(
args[0],
args[2] << (FRACBITS - 2)
);
}
else
EV_DoCrush(args[0], line, crushBothOnce);
{
EV_DoCrushBothOnce(
args[0],
args[2] << (FRACBITS - 2)
);
}
break;
case 433: // Flip/flop gravity. Works on pushables, too!

View file

@ -984,7 +984,7 @@ void EV_DoInstantMoveFloorByHeight(mtag_t tag, fixed_t height, INT32 texture);
void EV_DoMoveFloorByHeight(mtag_t tag, fixed_t height, fixed_t speed, mtag_t chain, INT32 texture);
void EV_DoMoveFloorByDistance(mtag_t tag, fixed_t distance, fixed_t speed, boolean instant);
void EV_DoBounceFloor(mtag_t tag, boolean crush, fixed_t crushHeight, fixed_t crushSpeed, fixed_t returnHeight, fixed_t returnSpeed, INT32 delayInit, INT32 delay);
void EV_DoCrushFloorOnce(mtag_t tag, fixed_t height, fixed_t speed);
void EV_DoCrushFloorOnce(mtag_t tag, fixed_t speed);
void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype);
void EV_CrumbleChain(sector_t *sec, ffloor_t *rover);