Make the laser thinker find the FOF itself instead of storing it in the thinker struct
This commit is contained in:
parent
c1304e019d
commit
2a39265156
|
@ -1890,8 +1890,7 @@ static void SaveLaserThinker(const thinker_t *th, const UINT8 type)
|
||||||
{
|
{
|
||||||
const laserthink_t *ht = (const void *)th;
|
const laserthink_t *ht = (const void *)th;
|
||||||
WRITEUINT8(save_p, type);
|
WRITEUINT8(save_p, type);
|
||||||
WRITEUINT32(save_p, SaveSector(ht->sector));
|
WRITEINT16(save_p, ht->tag);
|
||||||
WRITEUINT32(save_p, SaveSector(ht->sec));
|
|
||||||
WRITEUINT32(save_p, SaveLine(ht->sourceline));
|
WRITEUINT32(save_p, SaveLine(ht->sourceline));
|
||||||
WRITEUINT8(save_p, ht->nobosses);
|
WRITEUINT8(save_p, ht->nobosses);
|
||||||
}
|
}
|
||||||
|
@ -3001,16 +3000,10 @@ static thinker_t* LoadPusherThinker(actionf_p1 thinker)
|
||||||
static inline thinker_t* LoadLaserThinker(actionf_p1 thinker)
|
static inline thinker_t* LoadLaserThinker(actionf_p1 thinker)
|
||||||
{
|
{
|
||||||
laserthink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL);
|
laserthink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL);
|
||||||
ffloor_t *rover = NULL;
|
|
||||||
ht->thinker.function.acp1 = thinker;
|
ht->thinker.function.acp1 = thinker;
|
||||||
ht->sector = LoadSector(READUINT32(save_p));
|
ht->tag = READINT16(save_p);
|
||||||
ht->sec = LoadSector(READUINT32(save_p));
|
|
||||||
ht->sourceline = LoadLine(READUINT32(save_p));
|
ht->sourceline = LoadLine(READUINT32(save_p));
|
||||||
ht->nobosses = READUINT8(save_p);
|
ht->nobosses = READUINT8(save_p);
|
||||||
for (rover = ht->sector->ffloors; rover; rover = rover->next)
|
|
||||||
if (rover->secnum == (size_t)(ht->sec - sectors)
|
|
||||||
&& rover->master == ht->sourceline)
|
|
||||||
ht->ffloor = rover;
|
|
||||||
return &ht->thinker;
|
return &ht->thinker;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
120
src/p_spec.c
120
src/p_spec.c
|
@ -6136,92 +6136,83 @@ static inline void P_AddCameraScanner(sector_t *sourcesec, sector_t *actionsecto
|
||||||
elevator->distance = FixedInt(AngleFixed(angle));
|
elevator->distance = FixedInt(AngleFixed(angle));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const ffloortype_e laserflags = FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT;
|
|
||||||
|
|
||||||
/** Flashes a laser block.
|
/** Flashes a laser block.
|
||||||
*
|
*
|
||||||
* \param flash Thinker structure for this laser.
|
* \param flash Thinker structure for this laser.
|
||||||
* \sa EV_AddLaserThinker
|
* \sa P_AddLaserThinker
|
||||||
* \author SSNTails <http://www.ssntails.org>
|
* \author SSNTails <http://www.ssntails.org>
|
||||||
*/
|
*/
|
||||||
void T_LaserFlash(laserthink_t *flash)
|
void T_LaserFlash(laserthink_t *flash)
|
||||||
{
|
{
|
||||||
msecnode_t *node;
|
msecnode_t *node;
|
||||||
mobj_t *thing;
|
mobj_t *thing;
|
||||||
sector_t *sourcesec;
|
INT32 s;
|
||||||
ffloor_t *fflr = flash->ffloor;
|
ffloor_t *fflr;
|
||||||
sector_t *sector = flash->sector;
|
sector_t *sector;
|
||||||
|
sector_t *sourcesec = flash->sourceline->frontsector;
|
||||||
fixed_t top, bottom;
|
fixed_t top, bottom;
|
||||||
|
|
||||||
if (!fflr || !(fflr->flags & FF_EXISTS))
|
for (s = -1; (s = P_FindSectorFromTag(flash->tag, s)) >= 0 ;)
|
||||||
return;
|
|
||||||
|
|
||||||
if (leveltime & 2)
|
|
||||||
//fflr->flags |= FF_RENDERALL;
|
|
||||||
fflr->alpha = 0xB0;
|
|
||||||
else
|
|
||||||
//fflr->flags &= ~FF_RENDERALL;
|
|
||||||
fflr->alpha = 0x90;
|
|
||||||
|
|
||||||
sourcesec = fflr->master->frontsector; // Less to type!
|
|
||||||
|
|
||||||
top = (*fflr->t_slope) ? P_GetZAt(*fflr->t_slope, sector->soundorg.x, sector->soundorg.y)
|
|
||||||
: *fflr->topheight;
|
|
||||||
bottom = (*fflr->b_slope) ? P_GetZAt(*fflr->b_slope, sector->soundorg.x, sector->soundorg.y)
|
|
||||||
: *fflr->bottomheight;
|
|
||||||
sector->soundorg.z = (top + bottom)/2;
|
|
||||||
S_StartSound(§or->soundorg, sfx_laser);
|
|
||||||
|
|
||||||
// Seek out objects to DESTROY! MUAHAHHAHAHAA!!!*cough*
|
|
||||||
for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_thinglist_next)
|
|
||||||
{
|
{
|
||||||
thing = node->m_thing;
|
sector = §ors[s];
|
||||||
|
for (fflr = sector->ffloors; fflr; fflr = fflr->next)
|
||||||
|
{
|
||||||
|
if (fflr->master != flash->sourceline)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (flash->nobosses && thing->flags & MF_BOSS)
|
if (!(fflr->flags & FF_EXISTS))
|
||||||
continue; // Don't hurt bosses
|
break;
|
||||||
|
|
||||||
// Don't endlessly kill egg guard shields (or anything else for that matter)
|
if (leveltime & 2)
|
||||||
if (thing->health <= 0)
|
//fflr->flags |= FF_RENDERALL;
|
||||||
continue;
|
fflr->alpha = 0xB0;
|
||||||
|
else
|
||||||
|
//fflr->flags &= ~FF_RENDERALL;
|
||||||
|
fflr->alpha = 0x90;
|
||||||
|
|
||||||
top = P_GetSpecialTopZ(thing, sourcesec, sector);
|
top = (*fflr->t_slope) ? P_GetZAt(*fflr->t_slope, sector->soundorg.x, sector->soundorg.y) : *fflr->topheight;
|
||||||
bottom = P_GetSpecialBottomZ(thing, sourcesec, sector);
|
bottom = (*fflr->b_slope) ? P_GetZAt(*fflr->b_slope, sector->soundorg.x, sector->soundorg.y) : *fflr->bottomheight;
|
||||||
|
sector->soundorg.z = (top + bottom)/2;
|
||||||
|
S_StartSound(§or->soundorg, sfx_laser);
|
||||||
|
|
||||||
if (thing->z >= top
|
// Seek out objects to DESTROY! MUAHAHHAHAHAA!!!*cough*
|
||||||
|| thing->z + thing->height <= bottom)
|
for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_thinglist_next)
|
||||||
continue;
|
{
|
||||||
|
thing = node->m_thing;
|
||||||
|
|
||||||
if (thing->flags & MF_SHOOTABLE)
|
if (flash->nobosses && thing->flags & MF_BOSS)
|
||||||
P_DamageMobj(thing, NULL, NULL, 1, 0);
|
continue; // Don't hurt bosses
|
||||||
else if (thing->type == MT_EGGSHIELD)
|
|
||||||
P_KillMobj(thing, NULL, NULL, 0);
|
// Don't endlessly kill egg guard shields (or anything else for that matter)
|
||||||
|
if (thing->health <= 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
top = P_GetSpecialTopZ(thing, sourcesec, sector);
|
||||||
|
bottom = P_GetSpecialBottomZ(thing, sourcesec, sector);
|
||||||
|
|
||||||
|
if (thing->z >= top
|
||||||
|
|| thing->z + thing->height <= bottom)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (thing->flags & MF_SHOOTABLE)
|
||||||
|
P_DamageMobj(thing, NULL, NULL, 1, 0);
|
||||||
|
else if (thing->type == MT_EGGSHIELD)
|
||||||
|
P_KillMobj(thing, NULL, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Adds a laser thinker to a 3Dfloor.
|
static inline void P_AddLaserThinker(INT16 tag, line_t *line, boolean nobosses)
|
||||||
*
|
|
||||||
* \param fflr 3Dfloor to turn into a laser block.
|
|
||||||
* \param sector Target sector.
|
|
||||||
* \param secthkiners Lists of thinkers sorted by sector. May be NULL.
|
|
||||||
* \sa T_LaserFlash
|
|
||||||
* \author SSNTails <http://www.ssntails.org>
|
|
||||||
*/
|
|
||||||
static inline void EV_AddLaserThinker(sector_t *sec, sector_t *sec2, line_t *line, thinkerlist_t *secthinkers, boolean nobosses)
|
|
||||||
{
|
{
|
||||||
laserthink_t *flash;
|
laserthink_t *flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL);
|
||||||
ffloor_t *fflr = P_AddFakeFloor(sec, sec2, line, laserflags, secthinkers);
|
|
||||||
|
|
||||||
if (!fflr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
flash = Z_Calloc(sizeof (*flash), PU_LEVSPEC, NULL);
|
|
||||||
|
|
||||||
P_AddThinker(THINK_MAIN, &flash->thinker);
|
P_AddThinker(THINK_MAIN, &flash->thinker);
|
||||||
|
|
||||||
flash->thinker.function.acp1 = (actionf_p1)T_LaserFlash;
|
flash->thinker.function.acp1 = (actionf_p1)T_LaserFlash;
|
||||||
flash->ffloor = fflr;
|
flash->tag = tag;
|
||||||
flash->sector = sec; // For finding mobjs
|
|
||||||
flash->sec = sec2;
|
|
||||||
flash->sourceline = line;
|
flash->sourceline = line;
|
||||||
flash->nobosses = nobosses;
|
flash->nobosses = nobosses;
|
||||||
}
|
}
|
||||||
|
@ -7030,11 +7021,8 @@ void P_SpawnSpecials(boolean fromnetsave)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 258: // Laser block
|
case 258: // Laser block
|
||||||
sec = sides[*lines[i].sidenum].sector - sectors;
|
P_AddLaserThinker(lines[i].tag, lines + i, !!(lines[i].flags & ML_EFFECT1));
|
||||||
|
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_RENDERALL|FF_NOSHADE|FF_EXTRA|FF_CUTEXTRA|FF_TRANSLUCENT, secthinkers);
|
||||||
// No longer totally disrupts netgames
|
|
||||||
for (s = -1; (s = P_FindSectorFromTag(lines[i].tag, s)) >= 0 ;)
|
|
||||||
EV_AddLaserThinker(§ors[s], §ors[sec], lines + i, secthinkers, !!(lines[i].flags & ML_EFFECT1));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 259: // Custom FOF
|
case 259: // Custom FOF
|
||||||
|
|
|
@ -104,9 +104,7 @@ typedef struct
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
thinker_t thinker; ///< Thinker structure for laser.
|
thinker_t thinker; ///< Thinker structure for laser.
|
||||||
ffloor_t *ffloor; ///< 3Dfloor that is a laser.
|
INT16 tag;
|
||||||
sector_t *sector; ///< Sector in which the effect takes place.
|
|
||||||
sector_t *sec;
|
|
||||||
line_t *sourceline;
|
line_t *sourceline;
|
||||||
UINT8 nobosses;
|
UINT8 nobosses;
|
||||||
} laserthink_t;
|
} laserthink_t;
|
||||||
|
|
Loading…
Reference in New Issue