Merge remote-tracking branch 'origin/next' into respawndelaygametyperule

This commit is contained in:
Jaime Passos 2019-12-30 12:09:45 -03:00
commit 7676f11112
19 changed files with 7543 additions and 872 deletions

6521
extras/conf/SRB2-22.cfg Normal file

File diff suppressed because it is too large Load Diff

View File

@ -8824,9 +8824,11 @@ static const char *const MOBJEFLAG_LIST[] = {
"JUSTSTEPPEDDOWN", // used for ramp sectors "JUSTSTEPPEDDOWN", // used for ramp sectors
"VERTICALFLIP", // Vertically flip sprite/allow upside-down physics "VERTICALFLIP", // Vertically flip sprite/allow upside-down physics
"GOOWATER", // Goo water "GOOWATER", // Goo water
"TOUCHLAVA", // The mobj is touching a lava block
"PUSHED", // Mobj was already pushed this tic "PUSHED", // Mobj was already pushed this tic
"SPRUNG", // Mobj was already sprung this tic "SPRUNG", // Mobj was already sprung this tic
"APPLYPMOMZ", // Platform movement "APPLYPMOMZ", // Platform movement
"TRACERANGLE", // Compute and trigger on mobj angle relative to tracer
NULL NULL
}; };

View File

@ -2493,7 +2493,7 @@ void F_StartTitleScreen(void)
camera.x = startpos->x << FRACBITS; camera.x = startpos->x << FRACBITS;
camera.y = startpos->y << FRACBITS; camera.y = startpos->y << FRACBITS;
camera.subsector = R_PointInSubsector(camera.x, camera.y); camera.subsector = R_PointInSubsector(camera.x, camera.y);
camera.z = camera.subsector->sector->floorheight + ((startpos->options >> ZSHIFT) << FRACBITS); camera.z = camera.subsector->sector->floorheight + (startpos->z << FRACBITS);
camera.angle = (startpos->angle % 360)*ANG1; camera.angle = (startpos->angle % 360)*ANG1;
camera.aiming = 0; camera.aiming = 0;
} }

View File

@ -2964,7 +2964,7 @@ void G_DoReborn(INT32 playernum)
} }
if (!countdowntimeup && (mapheaderinfo[gamemap-1]->levelflags & LF_NORELOAD)) if (!countdowntimeup && (mapheaderinfo[gamemap-1]->levelflags & LF_NORELOAD))
{ {
P_LoadThingsOnly(); P_RespawnThings();
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
@ -6922,23 +6922,20 @@ void G_AddGhost(char *defdemoname)
I_Assert(mthing); I_Assert(mthing);
{ // A bit more complex than P_SpawnPlayer because ghosts aren't solid and won't just push themselves out of the ceiling. { // A bit more complex than P_SpawnPlayer because ghosts aren't solid and won't just push themselves out of the ceiling.
fixed_t z,f,c; fixed_t z,f,c;
fixed_t offset = mthing->z << FRACBITS;
gh->mo = P_SpawnMobj(mthing->x << FRACBITS, mthing->y << FRACBITS, 0, MT_GHOST); gh->mo = P_SpawnMobj(mthing->x << FRACBITS, mthing->y << FRACBITS, 0, MT_GHOST);
gh->mo->angle = FixedAngle(mthing->angle*FRACUNIT); gh->mo->angle = FixedAngle(mthing->angle << FRACBITS);
f = gh->mo->floorz; f = gh->mo->floorz;
c = gh->mo->ceilingz - mobjinfo[MT_PLAYER].height; c = gh->mo->ceilingz - mobjinfo[MT_PLAYER].height;
if (!!(mthing->options & MTF_AMBUSH) ^ !!(mthing->options & MTF_OBJECTFLIP)) if (!!(mthing->options & MTF_AMBUSH) ^ !!(mthing->options & MTF_OBJECTFLIP))
{ {
z = c; z = c - offset;
if (mthing->options >> ZSHIFT)
z -= ((mthing->options >> ZSHIFT) << FRACBITS);
if (z < f) if (z < f)
z = f; z = f;
} }
else else
{ {
z = f; z = f + offset;
if (mthing->options >> ZSHIFT)
z += ((mthing->options >> ZSHIFT) << FRACBITS);
if (z > c) if (z > c)
z = c; z = c;
} }

View File

@ -2714,6 +2714,8 @@ static void HWR_AddLine(seg_t * line)
static sector_t tempsec; static sector_t tempsec;
fixed_t v1x, v1y, v2x, v2y; // the seg's vertexes as fixed_t fixed_t v1x, v1y, v2x, v2y; // the seg's vertexes as fixed_t
if (line->glseg)
return;
#ifdef POLYOBJECTS #ifdef POLYOBJECTS
if (line->polyseg && !(line->polyseg->flags & POF_RENDERSIDES)) if (line->polyseg && !(line->polyseg->flags & POF_RENDERSIDES))
return; return;

View File

@ -134,6 +134,7 @@ enum side_e {
side_toptexture, side_toptexture,
side_bottomtexture, side_bottomtexture,
side_midtexture, side_midtexture,
side_line,
side_sector, side_sector,
side_special, side_special,
side_repeatcnt, side_repeatcnt,
@ -869,6 +870,9 @@ static int side_get(lua_State *L)
case side_midtexture: case side_midtexture:
lua_pushinteger(L, side->midtexture); lua_pushinteger(L, side->midtexture);
return 1; return 1;
case side_line:
LUA_PushUserdata(L, side->line, META_LINE);
return 1;
case side_sector: case side_sector:
LUA_PushUserdata(L, side->sector, META_SECTOR); LUA_PushUserdata(L, side->sector, META_SECTOR);
return 1; return 1;
@ -902,6 +906,7 @@ static int side_set(lua_State *L)
switch(field) switch(field)
{ {
case side_valid: // valid case side_valid: // valid
case side_line:
case side_sector: case side_sector:
case side_special: case side_special:
case side_text: case side_text:

View File

@ -517,6 +517,7 @@ void Command_Teleport_f(void)
if (!starpostnum) // spawnpoints... if (!starpostnum) // spawnpoints...
{ {
mapthing_t *mt; mapthing_t *mt;
fixed_t offset;
if (starpostpath >= numcoopstarts) if (starpostpath >= numcoopstarts)
{ {
@ -527,6 +528,7 @@ void Command_Teleport_f(void)
mt = playerstarts[starpostpath]; // Given above check, should never be NULL. mt = playerstarts[starpostpath]; // Given above check, should never be NULL.
intx = mt->x<<FRACBITS; intx = mt->x<<FRACBITS;
inty = mt->y<<FRACBITS; inty = mt->y<<FRACBITS;
offset = mt->z<<FRACBITS;
ss = R_IsPointInSubsector(intx, inty); ss = R_IsPointInSubsector(intx, inty);
if (!ss || ss->sector->ceilingheight - ss->sector->floorheight < p->mo->height) if (!ss || ss->sector->ceilingheight - ss->sector->floorheight < p->mo->height)
@ -538,17 +540,9 @@ void Command_Teleport_f(void)
// Flagging a player's ambush will make them start on the ceiling // Flagging a player's ambush will make them start on the ceiling
// Objectflip inverts // Objectflip inverts
if (!!(mt->options & MTF_AMBUSH) ^ !!(mt->options & MTF_OBJECTFLIP)) if (!!(mt->options & MTF_AMBUSH) ^ !!(mt->options & MTF_OBJECTFLIP))
{ intz = ss->sector->ceilingheight - p->mo->height - offset;
intz = ss->sector->ceilingheight - p->mo->height;
if (mt->options >> ZSHIFT)
intz -= ((mt->options >> ZSHIFT) << FRACBITS);
}
else else
{ intz = ss->sector->floorheight + offset;
intz = ss->sector->floorheight;
if (mt->options >> ZSHIFT)
intz += ((mt->options >> ZSHIFT) << FRACBITS);
}
if (mt->options & MTF_OBJECTFLIP) // flip the player! if (mt->options & MTF_OBJECTFLIP) // flip the player!
{ {
@ -1193,14 +1187,14 @@ void OP_NightsObjectplace(player_t *player)
if (cmd->buttons & BT_TOSSFLAG) if (cmd->buttons & BT_TOSSFLAG)
{ {
UINT16 vertangle = (UINT16)(player->anotherflyangle % 360); UINT16 vertangle = (UINT16)(player->anotherflyangle % 360);
UINT16 newflags, newz; UINT16 newflags;
player->pflags |= PF_ATTACKDOWN; player->pflags |= PF_ATTACKDOWN;
if (!OP_HeightOkay(player, false)) if (!OP_HeightOkay(player, false))
return; return;
mt = OP_CreateNewMapThing(player, (UINT16)mobjinfo[MT_NIGHTSBUMPER].doomednum, false); mt = OP_CreateNewMapThing(player, (UINT16)mobjinfo[MT_NIGHTSBUMPER].doomednum, false);
newz = min((mt->options >> ZSHIFT) - (mobjinfo[MT_NIGHTSBUMPER].height/4), 0); mt->z = min(mt->z - (mobjinfo[MT_NIGHTSBUMPER].height/4), 0);
// height offset: from P_TouchSpecialThing case MT_NIGHTSBUMPER // height offset: from P_TouchSpecialThing case MT_NIGHTSBUMPER
// clockwise // clockwise
@ -1231,7 +1225,7 @@ void OP_NightsObjectplace(player_t *player)
else // forward else // forward
newflags = 0; newflags = 0;
mt->options = (newz << ZSHIFT) | newflags; mt->options = (mt->z << ZSHIFT) | newflags;
// if NiGHTS is facing backwards, orient the Thing angle forwards so that the sprite angle // if NiGHTS is facing backwards, orient the Thing angle forwards so that the sprite angle
// displays correctly. Backwards movement via the Thing flags is unaffected. // displays correctly. Backwards movement via the Thing flags is unaffected.
@ -1439,7 +1433,7 @@ void OP_ObjectplaceMovement(player_t *player)
else else
P_SpawnMapThing(mt); P_SpawnMapThing(mt);
CONS_Printf(M_GetText("Placed object type %d at %d, %d, %d, %d\n"), mt->type, mt->x, mt->y, mt->options>>ZSHIFT, mt->angle); CONS_Printf(M_GetText("Placed object type %d at %d, %d, %d, %d\n"), mt->type, mt->x, mt->y, mt->z, mt->angle);
} }
} }

View File

@ -2474,6 +2474,8 @@ int M_PathParts(const char *path)
int n; int n;
const char *p; const char *p;
const char *t; const char *t;
if (path == NULL)
return 0;
for (n = 0, p = path ;; ++n) for (n = 0, p = path ;; ++n)
{ {
t = p; t = p;

View File

@ -14225,7 +14225,7 @@ void A_SaloonDoorSpawn(mobj_t *actor)
fixed_t c = FINECOSINE(fa)*locvar2; fixed_t c = FINECOSINE(fa)*locvar2;
fixed_t s = FINESINE(fa)*locvar2; fixed_t s = FINESINE(fa)*locvar2;
mobj_t *door; mobj_t *door;
mobjflag2_t ambush = (actor->flags & MF2_AMBUSH); mobjflag2_t ambush = (actor->flags2 & MF2_AMBUSH);
#ifdef HAVE_BLUA #ifdef HAVE_BLUA
if (LUA_CallAction("A_SaloonDoorSpawn", actor)) if (LUA_CallAction("A_SaloonDoorSpawn", actor))

View File

@ -995,7 +995,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (thing->type == MT_SALOONDOOR && tmthing->player) if (thing->type == MT_SALOONDOOR && tmthing->player)
{ {
mobj_t *ref = (tmthing->player->powers[pw_carry] == CR_MINECART && tmthing->tracer && !P_MobjWasRemoved(tmthing->tracer)) ? tmthing->tracer : tmthing; mobj_t *ref = (tmthing->player->powers[pw_carry] == CR_MINECART && tmthing->tracer && !P_MobjWasRemoved(tmthing->tracer)) ? tmthing->tracer : tmthing;
if ((thing->flags & MF2_AMBUSH) || ref != tmthing) if ((thing->flags2 & MF2_AMBUSH) || ref != tmthing)
{ {
fixed_t dm = min(FixedHypot(ref->momx, ref->momy), 16*FRACUNIT); fixed_t dm = min(FixedHypot(ref->momx, ref->momy), 16*FRACUNIT);
angle_t ang = R_PointToAngle2(0, 0, ref->momx, ref->momy) - thing->angle; angle_t ang = R_PointToAngle2(0, 0, ref->momx, ref->momy) - thing->angle;
@ -1008,7 +1008,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (thing->type == MT_SALOONDOORCENTER && tmthing->player) if (thing->type == MT_SALOONDOORCENTER && tmthing->player)
{ {
if ((thing->flags & MF2_AMBUSH) || (tmthing->player->powers[pw_carry] == CR_MINECART && tmthing->tracer && !P_MobjWasRemoved(tmthing->tracer))) if ((thing->flags2 & MF2_AMBUSH) || (tmthing->player->powers[pw_carry] == CR_MINECART && tmthing->tracer && !P_MobjWasRemoved(tmthing->tracer)))
return true; return true;
} }

View File

@ -9903,19 +9903,12 @@ static void P_FlagFuseThink(mobj_t *mobj)
x = mobj->spawnpoint->x << FRACBITS; x = mobj->spawnpoint->x << FRACBITS;
y = mobj->spawnpoint->y << FRACBITS; y = mobj->spawnpoint->y << FRACBITS;
z = mobj->spawnpoint->z << FRACBITS;
ss = R_PointInSubsector(x, y); ss = R_PointInSubsector(x, y);
if (mobj->spawnpoint->options & MTF_OBJECTFLIP) if (mobj->spawnpoint->options & MTF_OBJECTFLIP)
{ z = ss->sector->ceilingheight - mobjinfo[mobj->type].height - z;
z = ss->sector->ceilingheight - mobjinfo[mobj->type].height;
if (mobj->spawnpoint->options >> ZSHIFT)
z -= (mobj->spawnpoint->options >> ZSHIFT) << FRACBITS;
}
else else
{ z = ss->sector->floorheight + z;
z = ss->sector->floorheight;
if (mobj->spawnpoint->options >> ZSHIFT)
z += (mobj->spawnpoint->options >> ZSHIFT) << FRACBITS;
}
flagmo = P_SpawnMobj(x, y, z, mobj->type); flagmo = P_SpawnMobj(x, y, z, mobj->type);
flagmo->spawnpoint = mobj->spawnpoint; flagmo->spawnpoint = mobj->spawnpoint;
if (mobj->spawnpoint->options & MTF_OBJECTFLIP) if (mobj->spawnpoint->options & MTF_OBJECTFLIP)
@ -11289,9 +11282,6 @@ static mobjtype_t P_GetMobjtype(UINT16 mthingtype)
// //
void P_RespawnSpecials(void) void P_RespawnSpecials(void)
{ {
fixed_t x, y, z;
subsector_t *ss;
mobj_t *mo = NULL;
mapthing_t *mthing = NULL; mapthing_t *mthing = NULL;
// only respawn items when cv_itemrespawn is on // only respawn items when cv_itemrespawn is on
@ -11321,63 +11311,8 @@ void P_RespawnSpecials(void)
#endif #endif
if (mthing) if (mthing)
{ P_SpawnMapThing(mthing);
mobjtype_t i = P_GetMobjtype(mthing->type);
x = mthing->x << FRACBITS;
y = mthing->y << FRACBITS;
ss = R_PointInSubsector(x, y);
if (i == MT_UNKNOWN) // prevent creation of objects with this type -- Monster Iestyn 17/12/17
{
// 3D Mode start Thing is unlikely to be added to the que,
// so don't bother checking for that specific type
CONS_Alert(CONS_WARNING, M_GetText("P_RespawnSpecials: Unknown thing type %d attempted to respawn at (%d, %d)\n"), mthing->type, mthing->x, mthing->y);
// pull it from the que
iquetail = (iquetail+1)&(ITEMQUESIZE-1);
return;
}
//CTF rings should continue to respawn as normal rings outside of CTF.
if (!(gametyperules & GTR_TEAMFLAGS))
{
if (i == MT_REDTEAMRING || i == MT_BLUETEAMRING)
i = MT_RING;
}
if (mthing->options & MTF_OBJECTFLIP)
{
z = (
#ifdef ESLOPE
ss->sector->c_slope ? P_GetZAt(ss->sector->c_slope, x, y) :
#endif
ss->sector->ceilingheight) - (mthing->options >> ZSHIFT) * FRACUNIT;
if (mthing->options & MTF_AMBUSH
&& (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN || i == MT_NIGHTSSTAR || P_WeaponOrPanel(i)))
z -= 24*FRACUNIT;
z -= mobjinfo[i].height; // Don't forget the height!
}
else
{
z = (
#ifdef ESLOPE
ss->sector->f_slope ? P_GetZAt(ss->sector->f_slope, x, y) :
#endif
ss->sector->floorheight) + (mthing->options >> ZSHIFT) * FRACUNIT;
if (mthing->options & MTF_AMBUSH
&& (i == MT_RING || i == MT_REDTEAMRING || i == MT_BLUETEAMRING || i == MT_COIN || i == MT_NIGHTSSTAR || P_WeaponOrPanel(i)))
z += 24*FRACUNIT;
}
mo = P_SpawnMobj(x, y, z, i);
mo->spawnpoint = mthing;
mo->angle = ANGLE_45 * (mthing->angle/45);
if (mthing->options & MTF_OBJECTFLIP)
{
mo->eflags |= MFE_VERTICALFLIP;
mo->flags2 |= MF2_OBJECTFLIP;
}
}
// pull it from the que // pull it from the que
iquetail = (iquetail+1)&(ITEMQUESIZE-1); iquetail = (iquetail+1)&(ITEMQUESIZE-1);
} }
@ -11563,7 +11498,7 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing)
fixed_t z; fixed_t z;
sector_t *sector; sector_t *sector;
fixed_t floor, ceiling; fixed_t floor, ceiling, ceilingspawn;
player_t *p = &players[playernum]; player_t *p = &players[playernum];
mobj_t *mobj = p->mo; mobj_t *mobj = p->mo;
@ -11590,23 +11525,18 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing)
sector->c_slope ? P_GetZAt(sector->c_slope, x, y) : sector->c_slope ? P_GetZAt(sector->c_slope, x, y) :
#endif #endif
sector->ceilingheight; sector->ceilingheight;
ceilingspawn = ceiling - mobjinfo[MT_PLAYER].height;
if (mthing) if (mthing)
{ {
fixed_t offset = mthing->z << FRACBITS;
// Flagging a player's ambush will make them start on the ceiling // Flagging a player's ambush will make them start on the ceiling
// Objectflip inverts // Objectflip inverts
if (!!(mthing->options & MTF_AMBUSH) ^ !!(mthing->options & MTF_OBJECTFLIP)) if (!!(mthing->options & MTF_AMBUSH) ^ !!(mthing->options & MTF_OBJECTFLIP))
{ z = ceilingspawn - offset;
z = ceiling - mobjinfo[MT_PLAYER].height;
if (mthing->options >> ZSHIFT)
z -= ((mthing->options >> ZSHIFT) << FRACBITS);
}
else else
{ z = floor + offset;
z = floor;
if (mthing->options >> ZSHIFT)
z += ((mthing->options >> ZSHIFT) << FRACBITS);
}
if (mthing->options & MTF_OBJECTFLIP) // flip the player! if (mthing->options & MTF_OBJECTFLIP) // flip the player!
{ {
@ -11623,8 +11553,8 @@ void P_MovePlayerToSpawn(INT32 playernum, mapthing_t *mthing)
if (z < floor) if (z < floor)
z = floor; z = floor;
else if (z > ceiling - mobjinfo[MT_PLAYER].height) else if (z > ceilingspawn)
z = ceiling - mobjinfo[MT_PLAYER].height; z = ceilingspawn;
mobj->floorz = floor; mobj->floorz = floor;
mobj->ceilingz = ceiling; mobj->ceilingz = ceiling;
@ -12465,7 +12395,7 @@ static boolean P_SetupParticleGen(mapthing_t *mthing, mobj_t *mobj)
|| (ticcount = (sides[lines[line].sidenum[1]].textureoffset >> FRACBITS)) < 1) || (ticcount = (sides[lines[line].sidenum[1]].textureoffset >> FRACBITS)) < 1)
ticcount = 3; ticcount = 3;
numdivisions = (mthing->options >> ZSHIFT); numdivisions = mthing->z;
if (numdivisions) if (numdivisions)
{ {

View File

@ -400,6 +400,8 @@ static void Polyobj_findSegs(polyobj_t *po, seg_t *seg)
// Find backfacings // Find backfacings
for (s = 0; s < numsegs; s++) for (s = 0; s < numsegs; s++)
{ {
if (segs[s].glseg)
continue;
if (segs[s].linedef == seg->linedef if (segs[s].linedef == seg->linedef
&& segs[s].side == 1) && segs[s].side == 1)
{ {
@ -436,6 +438,8 @@ newseg:
// seg's ending vertex. // seg's ending vertex.
for (i = 0; i < numsegs; ++i) for (i = 0; i < numsegs; ++i)
{ {
if (segs[i].glseg)
continue;
if (segs[i].side != 0) // needs to be frontfacing if (segs[i].side != 0) // needs to be frontfacing
continue; continue;
if (segs[i].v1->x == seg->v2->x && segs[i].v1->y == seg->v2->y) if (segs[i].v1->x == seg->v2->x && segs[i].v1->y == seg->v2->y)
@ -460,6 +464,9 @@ newseg:
// Find backfacings // Find backfacings
for (q = 0; q < numsegs; q++) for (q = 0; q < numsegs; q++)
{ {
if (segs[q].glseg)
continue;
if (segs[q].linedef == segs[i].linedef if (segs[q].linedef == segs[i].linedef
&& segs[q].side == 1) && segs[q].side == 1)
{ {
@ -606,6 +613,9 @@ static void Polyobj_spawnPolyObj(INT32 num, mobj_t *spawnSpot, INT32 id)
INT32 poflags = POF_SOLID|POF_TESTHEIGHT|POF_RENDERSIDES; INT32 poflags = POF_SOLID|POF_TESTHEIGHT|POF_RENDERSIDES;
INT32 parentID = 0, potrans = 0; INT32 parentID = 0, potrans = 0;
if (seg->glseg)
continue;
if (seg->side != 0) // needs to be frontfacing if (seg->side != 0) // needs to be frontfacing
continue; continue;

File diff suppressed because it is too large Load Diff

View File

@ -96,7 +96,7 @@ void P_SetupLevelSky(INT32 skynum, boolean global);
#ifdef SCANTHINGS #ifdef SCANTHINGS
void P_ScanThings(INT16 mapnum, INT16 wadnum, INT16 lumpnum); void P_ScanThings(INT16 mapnum, INT16 wadnum, INT16 lumpnum);
#endif #endif
void P_LoadThingsOnly(void); void P_RespawnThings(void);
boolean P_LoadLevel(boolean fromnetsave); boolean P_LoadLevel(boolean fromnetsave);
boolean P_AddWadFile(const char *wadfilename); boolean P_AddWadFile(const char *wadfilename);
boolean P_RunSOC(const char *socfilename); boolean P_RunSOC(const char *socfilename);

View File

@ -445,10 +445,9 @@ 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); I_Error("MakeViaMapthings: Slope vertex %s (for linedef tag %d) not found!", sizeu1(i), tag1);
vx[i].x = mt->x << FRACBITS; vx[i].x = mt->x << FRACBITS;
vx[i].y = mt->y << FRACBITS; vx[i].y = mt->y << FRACBITS;
if (mt->extrainfo) vx[i].z = mt->z << FRACBITS;
vx[i].z = mt->options << FRACBITS; if (!mt->extrainfo)
else vx[i].z += R_PointInSubsector(vx[i].x, vx[i].y)->sector->floorheight;
vx[i].z = (R_PointInSubsector(mt->x << FRACBITS, mt->y << FRACBITS)->sector->floorheight) + ((mt->options >> ZSHIFT) << FRACBITS);
} }
ReconfigureViaVertexes(ret, vx[0], vx[1], vx[2]); ReconfigureViaVertexes(ret, vx[0], vx[1], vx[2]);

View File

@ -6433,7 +6433,6 @@ void P_SpawnSpecials(boolean fromnetsave)
INT32 j; INT32 j;
thinkerlist_t *secthinkers; thinkerlist_t *secthinkers;
thinker_t *th; thinker_t *th;
virtres_t* virt = NULL;
// This used to be used, and *should* be used in the future, // This used to be used, and *should* be used in the future,
// but currently isn't. // but currently isn't.
(void)fromnetsave; (void)fromnetsave;
@ -7179,38 +7178,14 @@ void P_SpawnSpecials(boolean fromnetsave)
EV_AddLaserThinker(&sectors[s], &sectors[sec], lines + i, secthinkers); EV_AddLaserThinker(&sectors[s], &sectors[sec], lines + i, secthinkers);
break; break;
case 259: // Make-Your-Own FOF! case 259: // Custom FOF
if (lines[i].sidenum[1] != 0xffff) if (lines[i].sidenum[1] != 0xffff)
{ {
UINT8 *data; ffloortype_e fofflags = sides[lines[i].sidenum[1]].toptexture;
UINT16 b; P_AddFakeFloorsByLine(i, fofflags, secthinkers);
if (!virt)
virt = vres_GetMap(lastloadedmaplumpnum);
data = (UINT8*) vres_Find(virt, "SIDEDEFS")->data;
for (b = 0; b < (INT16)numsides; b++)
{
register mapsidedef_t *msd = (mapsidedef_t *)data + b;
if (b == lines[i].sidenum[1])
{
if ((msd->toptexture[0] >= '0' && msd->toptexture[0] <= '9')
|| (msd->toptexture[0] >= 'A' && msd->toptexture[0] <= 'F'))
{
ffloortype_e FOF_Flags = axtoi(msd->toptexture);
P_AddFakeFloorsByLine(i, FOF_Flags, secthinkers);
break;
}
else
I_Error("Make-Your-Own-FOF (tag %d) needs a value in the linedef's second side upper texture field.", lines[i].tag);
}
}
} }
else else
I_Error("Make-Your-Own FOF (tag %d) found without a 2nd linedef side!", lines[i].tag); I_Error("Custom FOF (tag %d) found without a linedef back side!", lines[i].tag);
break; break;
case 300: // Linedef executor (combines with sector special 974/975) and commands case 300: // Linedef executor (combines with sector special 974/975) and commands
@ -7433,9 +7408,6 @@ void P_SpawnSpecials(boolean fromnetsave)
} }
} }
if (virt)
vres_Free(virt);
// Allocate each list // Allocate each list
for (i = 0; i < numsectors; i++) for (i = 0; i < numsectors; i++)
if(secthinkers[i].thinkers) if(secthinkers[i].thinkers)

View File

@ -1169,9 +1169,11 @@ static void R_Subsector(size_t num)
while (count--) while (count--)
{ {
// CONS_Debug(DBG_GAMELOGIC, "Adding normal line %d...(%d)\n", line->linedef-lines, leveltime); // CONS_Debug(DBG_GAMELOGIC, "Adding normal line %d...(%d)\n", line->linedef-lines, leveltime);
if (!line->glseg
#ifdef POLYOBJECTS #ifdef POLYOBJECTS
if (!line->polyseg) // ignore segs that belong to polyobjects && !line->polyseg // ignore segs that belong to polyobjects
#endif #endif
)
R_AddLine(line); R_AddLine(line);
line++; line++;
curline = NULL; /* cph 2001/11/18 - must clear curline now we're done with it, so stuff doesn't try using it for other things */ curline = NULL; /* cph 2001/11/18 - must clear curline now we're done with it, so stuff doesn't try using it for other things */

View File

@ -436,14 +436,10 @@ typedef struct line_s
polyobj_t *polyobj; // Belongs to a polyobject? polyobj_t *polyobj; // Belongs to a polyobject?
#endif #endif
char *text; // a concatination of all front and back texture names, for linedef specials that require a string. char *text; // a concatenation 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 INT16 callcount; // no. of calls left before triggering, for the "X calls" linedef specials, defaults to 0
} line_t; } line_t;
//
// The SideDef.
//
typedef struct typedef struct
{ {
// add this to the calculated texture column // add this to the calculated texture column
@ -456,13 +452,16 @@ typedef struct
// We do not maintain names here. // We do not maintain names here.
INT32 toptexture, bottomtexture, midtexture; INT32 toptexture, bottomtexture, midtexture;
// Sector the SideDef is facing. // Linedef the sidedef belongs to
line_t *line;
// Sector the sidedef is facing.
sector_t *sector; sector_t *sector;
INT16 special; // the special of the linedef this side belongs to INT16 special; // the special of the linedef this side belongs to
INT16 repeatcnt; // # of times to repeat midtexture INT16 repeatcnt; // # of times to repeat midtexture
char *text; // a concatination of all top, bottom, and mid texture names, for linedef specials that require a string. char *text; // a concatenation of all top, bottom, and mid texture names, for linedef specials that require a string.
extracolormap_t *colormap_data; // storage for colormaps; not applied to sectors. extracolormap_t *colormap_data; // storage for colormaps; not applied to sectors.
} side_t; } side_t;
@ -587,6 +586,7 @@ typedef struct seg_s
polyobj_t *polyseg; polyobj_t *polyseg;
boolean dontrenderme; boolean dontrenderme;
#endif #endif
boolean glseg;
} seg_t; } seg_t;
// //

View File

@ -308,6 +308,10 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
// for horizontal / vertical / diagonal. Diagonal? // for horizontal / vertical / diagonal. Diagonal?
// OPTIMIZE: get rid of LIGHTSEGSHIFT globally // OPTIMIZE: get rid of LIGHTSEGSHIFT globally
curline = ds->curline; curline = ds->curline;
if (curline->glseg)
return;
frontsector = curline->frontsector; frontsector = curline->frontsector;
backsector = curline->backsector; backsector = curline->backsector;
texnum = R_GetTextureNum(curline->sidedef->midtexture); texnum = R_GetTextureNum(curline->sidedef->midtexture);