mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-21 19:31:26 +00:00
Merge branch 'spawn_z_refactor' into 'next'
(UDMF prereq.) Spawn Z refactor See merge request STJr/SRB2!536
This commit is contained in:
commit
4da57653eb
3 changed files with 169 additions and 210 deletions
|
@ -1106,7 +1106,7 @@ static mapthing_t *OP_CreateNewMapThing(player_t *player, UINT16 type, boolean c
|
|||
#else
|
||||
fixed_t cheight = sec->ceilingheight;
|
||||
#endif
|
||||
mt->options = (UINT16)((cheight - player->mo->z - player->mo->height)>>FRACBITS);
|
||||
mt->z = (UINT16)((cheight - player->mo->z - player->mo->height)>>FRACBITS);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1115,12 +1115,11 @@ static mapthing_t *OP_CreateNewMapThing(player_t *player, UINT16 type, boolean c
|
|||
#else
|
||||
fixed_t fheight = sec->floorheight;
|
||||
#endif
|
||||
mt->options = (UINT16)((player->mo->z - fheight)>>FRACBITS);
|
||||
mt->z = (UINT16)((player->mo->z - fheight)>>FRACBITS);
|
||||
}
|
||||
mt->options <<= ZSHIFT;
|
||||
mt->angle = (INT16)(FixedInt(AngleFixed(player->mo->angle)));
|
||||
|
||||
mt->options |= (UINT16)cv_opflags.value;
|
||||
mt->options = (mt->z << ZSHIFT) | (UINT16)cv_opflags.value;
|
||||
return mt;
|
||||
}
|
||||
|
||||
|
|
218
src/p_mobj.c
218
src/p_mobj.c
|
@ -11551,6 +11551,82 @@ void P_MovePlayerToStarpost(INT32 playernum)
|
|||
mapthing_t *huntemeralds[MAXHUNTEMERALDS];
|
||||
INT32 numhuntemeralds;
|
||||
|
||||
|
||||
static fixed_t P_GetMobjSpawnHeight(const mobjtype_t mobjtype, const mapthing_t* mthing, const fixed_t x, const fixed_t y)
|
||||
{
|
||||
const subsector_t *ss = R_PointInSubsector(x, y);
|
||||
fixed_t offset = mthing->z << FRACBITS;
|
||||
boolean flip = (!!(mobjinfo[mobjtype].flags & MF_SPAWNCEILING) ^ !!(mthing->options & MTF_OBJECTFLIP));
|
||||
|
||||
switch (mobjtype)
|
||||
{
|
||||
// Bumpers never spawn flipped.
|
||||
case MT_NIGHTSBUMPER:
|
||||
flip = false;
|
||||
break;
|
||||
|
||||
// Axis objects snap to the floor.
|
||||
case MT_AXIS:
|
||||
case MT_AXISTRANSFER:
|
||||
case MT_AXISTRANSFERLINE:
|
||||
return ONFLOORZ;
|
||||
|
||||
// Objects with a non-zero default height.
|
||||
case MT_CRAWLACOMMANDER:
|
||||
case MT_DETON:
|
||||
case MT_JETTBOMBER:
|
||||
case MT_JETTGUNNER:
|
||||
case MT_EGGMOBILE2:
|
||||
if (!offset)
|
||||
offset = 33*FRACUNIT;
|
||||
break;
|
||||
case MT_EGGMOBILE:
|
||||
if (!offset)
|
||||
offset = 128*FRACUNIT;
|
||||
break;
|
||||
case MT_GOLDBUZZ:
|
||||
case MT_REDBUZZ:
|
||||
if (!offset)
|
||||
offset = 288*FRACUNIT;
|
||||
break;
|
||||
|
||||
// Ring-like items, may float additional units with MTF_AMBUSH.
|
||||
case MT_SPIKEBALL:
|
||||
case MT_EMERALDSPAWN:
|
||||
case MT_TOKEN:
|
||||
case MT_EMBLEM:
|
||||
offset += mthing->options & MTF_AMBUSH ? 24*FRACUNIT : 0;
|
||||
break;
|
||||
|
||||
// Remaining objects.
|
||||
default:
|
||||
if (P_WeaponOrPanel(mobjtype))
|
||||
offset += mthing->options & MTF_AMBUSH ? 24 * FRACUNIT : 0;
|
||||
}
|
||||
|
||||
if (!offset) // Snap to the surfaces when there's no offset set.
|
||||
{
|
||||
if (flip)
|
||||
return ONCEILINGZ;
|
||||
else
|
||||
return ONFLOORZ;
|
||||
}
|
||||
|
||||
// Establish height.
|
||||
if (flip)
|
||||
return (
|
||||
#ifdef ESLOPE
|
||||
ss->sector->c_slope ? P_GetZAt(ss->sector->c_slope, x, y) :
|
||||
#endif
|
||||
ss->sector->ceilingheight) - offset - mobjinfo[mobjtype].height;
|
||||
else
|
||||
return (
|
||||
#ifdef ESLOPE
|
||||
ss->sector->f_slope ? P_GetZAt(ss->sector->f_slope, x, y) :
|
||||
#endif
|
||||
ss->sector->floorheight) + offset;
|
||||
}
|
||||
|
||||
//
|
||||
// P_SpawnMapThing
|
||||
// The fields of the mapthing should
|
||||
|
@ -11561,7 +11637,6 @@ void P_SpawnMapThing(mapthing_t *mthing)
|
|||
mobjtype_t i;
|
||||
mobj_t *mobj;
|
||||
fixed_t x, y, z;
|
||||
subsector_t *ss;
|
||||
boolean doangle = true;
|
||||
|
||||
if (!mthing->type)
|
||||
|
@ -11686,13 +11761,6 @@ You should think about modifying the deathmatch starts to take full advantage of
|
|||
if (gametype != GT_COOP)
|
||||
return;
|
||||
|
||||
ss = R_PointInSubsector(mthing->x << FRACBITS, mthing->y << FRACBITS);
|
||||
mthing->z = (INT16)(((
|
||||
#ifdef ESLOPE
|
||||
ss->sector->f_slope ? P_GetZAt(ss->sector->f_slope, mthing->x << FRACBITS, mthing->y << FRACBITS) :
|
||||
#endif
|
||||
ss->sector->floorheight)>>FRACBITS) + (mthing->options >> ZSHIFT));
|
||||
|
||||
if (numhuntemeralds < MAXHUNTEMERALDS)
|
||||
huntemeralds[numhuntemeralds++] = mthing;
|
||||
return;
|
||||
|
@ -11821,102 +11889,7 @@ You should think about modifying the deathmatch starts to take full advantage of
|
|||
// spawn it
|
||||
x = mthing->x << FRACBITS;
|
||||
y = mthing->y << FRACBITS;
|
||||
ss = R_PointInSubsector(x, y);
|
||||
|
||||
if (i == MT_NIGHTSBUMPER)
|
||||
z = (
|
||||
#ifdef ESLOPE
|
||||
ss->sector->f_slope ? P_GetZAt(ss->sector->f_slope, x, y) :
|
||||
#endif
|
||||
ss->sector->floorheight) + ((mthing->options >> ZSHIFT) << FRACBITS);
|
||||
else if (i == MT_AXIS || i == MT_AXISTRANSFER || i == MT_AXISTRANSFERLINE)
|
||||
z = ONFLOORZ;
|
||||
else if (i == MT_SPIKEBALL || P_WeaponOrPanel(i) || i == MT_EMERALDSPAWN || i == MT_TOKEN || i == MT_EMBLEM)
|
||||
{
|
||||
if (mthing->options & MTF_OBJECTFLIP)
|
||||
{
|
||||
z = (
|
||||
#ifdef ESLOPE
|
||||
ss->sector->c_slope ? P_GetZAt(ss->sector->c_slope, x, y) :
|
||||
#endif
|
||||
ss->sector->ceilingheight);
|
||||
|
||||
if (mthing->options & MTF_AMBUSH) // Special flag for rings
|
||||
z -= 24*FRACUNIT;
|
||||
if (mthing->options >> ZSHIFT)
|
||||
z -= (mthing->options >> ZSHIFT)*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);
|
||||
|
||||
if (mthing->options & MTF_AMBUSH) // Special flag for rings
|
||||
z += 24*FRACUNIT;
|
||||
if (mthing->options >> ZSHIFT)
|
||||
z += (mthing->options >> ZSHIFT)*FRACUNIT;
|
||||
}
|
||||
|
||||
if (z == ONFLOORZ)
|
||||
mthing->z = 0;
|
||||
else
|
||||
mthing->z = (INT16)(z>>FRACBITS);
|
||||
}
|
||||
else
|
||||
{
|
||||
fixed_t offset = 0;
|
||||
boolean flip = (!!(mobjinfo[i].flags & MF_SPAWNCEILING) ^ !!(mthing->options & MTF_OBJECTFLIP));
|
||||
|
||||
// base positions
|
||||
if (flip)
|
||||
z = (
|
||||
#ifdef ESLOPE
|
||||
ss->sector->c_slope ? P_GetZAt(ss->sector->c_slope, x, y) :
|
||||
#endif
|
||||
ss->sector->ceilingheight) - mobjinfo[i].height;
|
||||
else
|
||||
z = (
|
||||
#ifdef ESLOPE
|
||||
ss->sector->f_slope ? P_GetZAt(ss->sector->f_slope, x, y) :
|
||||
#endif
|
||||
ss->sector->floorheight);
|
||||
|
||||
// offsetting
|
||||
if (mthing->options >> ZSHIFT)
|
||||
offset = ((mthing->options >> ZSHIFT) << FRACBITS);
|
||||
else if (i == MT_CRAWLACOMMANDER || i == MT_DETON || i == MT_JETTBOMBER || i == MT_JETTGUNNER || i == MT_EGGMOBILE2)
|
||||
offset = 33*FRACUNIT;
|
||||
else if (i == MT_EGGMOBILE)
|
||||
offset = 128*FRACUNIT;
|
||||
else if (i == MT_GOLDBUZZ || i == MT_REDBUZZ)
|
||||
offset = 288*FRACUNIT;
|
||||
|
||||
// applying offsets! (if any)
|
||||
if (flip)
|
||||
{
|
||||
if (offset)
|
||||
z -= offset;
|
||||
else
|
||||
z = ONCEILINGZ;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (offset)
|
||||
z += offset;
|
||||
else
|
||||
z = ONFLOORZ;
|
||||
}
|
||||
|
||||
if (z == ONFLOORZ)
|
||||
mthing->z = 0;
|
||||
else
|
||||
mthing->z = (INT16)(z>>FRACBITS);
|
||||
}
|
||||
z = P_GetMobjSpawnHeight(i, mthing, x, y);
|
||||
|
||||
mobj = P_SpawnMobj(x, y, z, i);
|
||||
mobj->spawnpoint = mthing;
|
||||
|
@ -12020,7 +11993,7 @@ You should think about modifying the deathmatch starts to take full advantage of
|
|||
if (mthing->angle)
|
||||
mobj->health = mthing->angle;
|
||||
else
|
||||
mobj->health = FixedMul(ss->sector->ceilingheight-ss->sector->floorheight, 3*(FRACUNIT/4))>>FRACBITS;
|
||||
mobj->health = FixedMul(mobj->subsector->sector->ceilingheight - mobj->subsector->sector->floorheight, 3*(FRACUNIT/4))>>FRACBITS;
|
||||
break;
|
||||
case MT_METALSONIC_RACE:
|
||||
case MT_METALSONIC_BATTLE:
|
||||
|
@ -13106,7 +13079,7 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
mobj_t *hoopcenter;
|
||||
INT16 spewangle;
|
||||
|
||||
z = mthing->options << FRACBITS;
|
||||
z = mthing->z << FRACBITS;
|
||||
|
||||
hoopcenter = P_SpawnMobj(x, y, z, MT_HOOPCENTER);
|
||||
|
||||
|
@ -13246,8 +13219,7 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
INT32 hoopsize;
|
||||
INT32 hoopplacement;
|
||||
|
||||
// Save our flags!
|
||||
z = (mthing->options>>ZSHIFT) << FRACBITS;
|
||||
z = mthing->z << FRACBITS;
|
||||
|
||||
hoopcenter = P_SpawnMobj(x, y, z, MT_HOOPCENTER);
|
||||
hoopcenter->spawnpoint = mthing;
|
||||
|
@ -13389,8 +13361,8 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
sec->c_slope ? P_GetZAt(sec->c_slope, x, y) :
|
||||
#endif
|
||||
sec->ceilingheight) - mobjinfo[ringthing].height;
|
||||
if (mthing->options >> ZSHIFT)
|
||||
z -= ((mthing->options >> ZSHIFT) << FRACBITS);
|
||||
if (mthing->z)
|
||||
z -= (mthing->z << FRACBITS);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -13399,8 +13371,8 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
sec->f_slope ? P_GetZAt(sec->f_slope, x, y) :
|
||||
#endif
|
||||
sec->floorheight);
|
||||
if (mthing->options >> ZSHIFT)
|
||||
z += ((mthing->options >> ZSHIFT) << FRACBITS);
|
||||
if (mthing->z)
|
||||
z += (mthing->z << FRACBITS);
|
||||
}
|
||||
|
||||
for (r = 1; r <= 5; r++)
|
||||
|
@ -13449,8 +13421,8 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
sec->c_slope ? P_GetZAt(sec->c_slope, x, y) :
|
||||
#endif
|
||||
sec->ceilingheight) - mobjinfo[ringthing].height;
|
||||
if (mthing->options >> ZSHIFT)
|
||||
z -= ((mthing->options >> ZSHIFT) << FRACBITS);
|
||||
if (mthing->z)
|
||||
z -= (mthing->z << FRACBITS);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -13459,8 +13431,8 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
sec->f_slope ? P_GetZAt(sec->f_slope, x, y) :
|
||||
#endif
|
||||
sec->floorheight);
|
||||
if (mthing->options >> ZSHIFT)
|
||||
z += ((mthing->options >> ZSHIFT) << FRACBITS);
|
||||
if (mthing->z)
|
||||
z += (mthing->z << FRACBITS);
|
||||
}
|
||||
|
||||
for (r = 1; r <= iterations; r++)
|
||||
|
@ -13506,8 +13478,8 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
sec->f_slope ? P_GetZAt(sec->f_slope, x, y) :
|
||||
#endif
|
||||
sec->floorheight;
|
||||
if (mthing->options >> ZSHIFT)
|
||||
z += ((mthing->options >> ZSHIFT) << FRACBITS);
|
||||
if (mthing->z)
|
||||
z += (mthing->z << FRACBITS);
|
||||
|
||||
closestangle = FixedAngle(mthing->angle*FRACUNIT);
|
||||
|
||||
|
@ -13611,8 +13583,8 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
sec->c_slope ? P_GetZAt(sec->c_slope, x, y) :
|
||||
#endif
|
||||
sec->ceilingheight) - mobjinfo[ringthing].height;
|
||||
if (mthing->options >> ZSHIFT)
|
||||
z -= ((mthing->options >> ZSHIFT) << FRACBITS);
|
||||
if (mthing->z)
|
||||
z -= (mthing->z << FRACBITS);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -13621,8 +13593,8 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
sec->f_slope ? P_GetZAt(sec->f_slope, x, y) :
|
||||
#endif
|
||||
sec->floorheight;
|
||||
if (mthing->options >> ZSHIFT)
|
||||
z += ((mthing->options >> ZSHIFT) << FRACBITS);
|
||||
if (mthing->z)
|
||||
z += (mthing->z << FRACBITS);
|
||||
}
|
||||
|
||||
if (mthing->options & MTF_AMBUSH) // Special flag for rings
|
||||
|
@ -13633,8 +13605,6 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
z += 24*FRACUNIT;
|
||||
}
|
||||
|
||||
mthing->z = (INT16)(z>>FRACBITS);
|
||||
|
||||
mobj = P_SpawnMobj(x, y, z, ringthing);
|
||||
mobj->spawnpoint = mthing;
|
||||
|
||||
|
|
154
src/p_setup.c
154
src/p_setup.c
|
@ -906,10 +906,6 @@ void P_ReloadRings(void)
|
|||
{
|
||||
mt->mobj = NULL;
|
||||
|
||||
// Z for objects Tails 05-26-2002
|
||||
mt->z = (INT16)(R_PointInSubsector(mt->x << FRACBITS, mt->y << FRACBITS)
|
||||
->sector->floorheight>>FRACBITS);
|
||||
|
||||
P_SpawnHoopsAndRings(mt, true);
|
||||
}
|
||||
}
|
||||
|
@ -1013,13 +1009,11 @@ static void P_PrepareRawThings(UINT8 *data, size_t i)
|
|||
nummapthings = i / (5 * sizeof (INT16));
|
||||
mapthings = Z_Calloc(nummapthings * sizeof (*mapthings), PU_LEVEL, NULL);
|
||||
|
||||
// Spawn axis points first so they are
|
||||
// at the front of the list for fast searching.
|
||||
mt = mapthings;
|
||||
for (i = 0; i < nummapthings; i++, mt++)
|
||||
for (i = 0, mt = mapthings; i < nummapthings; i++, mt++)
|
||||
{
|
||||
mt->x = READINT16(data);
|
||||
mt->y = READINT16(data);
|
||||
|
||||
mt->angle = READINT16(data);
|
||||
mt->type = READUINT16(data);
|
||||
mt->options = READUINT16(data);
|
||||
|
@ -1027,6 +1021,73 @@ static void P_PrepareRawThings(UINT8 *data, size_t i)
|
|||
|
||||
mt->type &= 4095;
|
||||
|
||||
if (mt->type == 1705 || (mt->type == 750 && mt->extrainfo))
|
||||
mt->z = mt->options; // NiGHTS Hoops use the full flags bits to set the height.
|
||||
else
|
||||
mt->z = mt->options >> ZSHIFT;
|
||||
}
|
||||
}
|
||||
|
||||
static void P_PrepareThings(lumpnum_t lumpnum)
|
||||
{
|
||||
UINT8 *data = W_CacheLumpNum(lumpnum, PU_STATIC);
|
||||
P_PrepareRawThings(data, W_LumpLength(lumpnum));
|
||||
Z_Free(data);
|
||||
}
|
||||
|
||||
static void P_SpawnEmeraldHunt(void)
|
||||
{
|
||||
INT32 emer1, emer2, emer3;
|
||||
INT32 timeout = 0; // keeps from getting stuck
|
||||
|
||||
emer1 = emer2 = emer3 = 0;
|
||||
|
||||
//increment spawn numbers because zero is valid.
|
||||
emer1 = (P_RandomKey(numhuntemeralds)) + 1;
|
||||
while (timeout++ < 100)
|
||||
{
|
||||
emer2 = (P_RandomKey(numhuntemeralds)) + 1;
|
||||
|
||||
if (emer2 != emer1)
|
||||
break;
|
||||
}
|
||||
|
||||
timeout = 0;
|
||||
while (timeout++ < 100)
|
||||
{
|
||||
emer3 = (P_RandomKey(numhuntemeralds)) + 1;
|
||||
|
||||
if (emer3 != emer2 && emer3 != emer1)
|
||||
break;
|
||||
}
|
||||
|
||||
//decrement spawn values to the actual number because zero is valid.
|
||||
if (emer1--)
|
||||
P_SpawnMobj(huntemeralds[emer1]->x<<FRACBITS,
|
||||
huntemeralds[emer1]->y<<FRACBITS,
|
||||
huntemeralds[emer1]->z<<FRACBITS, MT_EMERHUNT);
|
||||
|
||||
if (emer2--)
|
||||
P_SetMobjStateNF(P_SpawnMobj(huntemeralds[emer2]->x<<FRACBITS,
|
||||
huntemeralds[emer2]->y<<FRACBITS,
|
||||
huntemeralds[emer2]->z<<FRACBITS, MT_EMERHUNT),
|
||||
mobjinfo[MT_EMERHUNT].spawnstate+1);
|
||||
|
||||
if (emer3--)
|
||||
P_SetMobjStateNF(P_SpawnMobj(huntemeralds[emer3]->x<<FRACBITS,
|
||||
huntemeralds[emer3]->y<<FRACBITS,
|
||||
huntemeralds[emer3]->z<<FRACBITS, MT_EMERHUNT),
|
||||
mobjinfo[MT_EMERHUNT].spawnstate+2);
|
||||
}
|
||||
|
||||
static void P_LoadThings(boolean loademblems)
|
||||
{
|
||||
size_t i;
|
||||
mapthing_t *mt;
|
||||
|
||||
// Spawn axis points first so they are at the front of the list for fast searching.
|
||||
for (i = 0, mt = mapthings; i < nummapthings; i++, mt++)
|
||||
{
|
||||
switch (mt->type)
|
||||
{
|
||||
case 1700: // MT_AXIS
|
||||
|
@ -1039,35 +1100,11 @@ static void P_PrepareRawThings(UINT8 *data, size_t i)
|
|||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void P_PrepareThings(lumpnum_t lumpnum)
|
||||
{
|
||||
UINT8 *data = W_CacheLumpNum(lumpnum, PU_STATIC);
|
||||
P_PrepareRawThings(data, W_LumpLength(lumpnum));
|
||||
Z_Free(data);
|
||||
}
|
||||
|
||||
static void P_LoadThings(boolean loademblems)
|
||||
{
|
||||
size_t i;
|
||||
mapthing_t *mt;
|
||||
|
||||
// Loading the things lump itself into memory is now handled in P_PrepareThings, above
|
||||
|
||||
mt = mapthings;
|
||||
numhuntemeralds = 0;
|
||||
for (i = 0; i < nummapthings; i++, mt++)
|
||||
|
||||
for (i = 0, mt = mapthings; i < nummapthings; i++, mt++)
|
||||
{
|
||||
sector_t *mtsector = R_PointInSubsector(mt->x << FRACBITS, mt->y << FRACBITS)->sector;
|
||||
|
||||
// Z for objects
|
||||
mt->z = (INT16)(
|
||||
#ifdef ESLOPE
|
||||
mtsector->f_slope ? P_GetZAt(mtsector->f_slope, mt->x << FRACBITS, mt->y << FRACBITS) :
|
||||
#endif
|
||||
mtsector->floorheight)>>FRACBITS;
|
||||
|
||||
if (mt->type == 1700 // MT_AXIS
|
||||
|| mt->type == 1701 // MT_AXISTRANSFER
|
||||
|| mt->type == 1702) // MT_AXISTRANSFERLINE
|
||||
|
@ -1082,49 +1119,7 @@ static void P_LoadThings(boolean loademblems)
|
|||
|
||||
// random emeralds for hunt
|
||||
if (numhuntemeralds)
|
||||
{
|
||||
INT32 emer1, emer2, emer3;
|
||||
INT32 timeout = 0; // keeps from getting stuck
|
||||
|
||||
emer1 = emer2 = emer3 = 0;
|
||||
|
||||
//increment spawn numbers because zero is valid.
|
||||
emer1 = (P_RandomKey(numhuntemeralds)) + 1;
|
||||
while (timeout++ < 100)
|
||||
{
|
||||
emer2 = (P_RandomKey(numhuntemeralds)) + 1;
|
||||
|
||||
if (emer2 != emer1)
|
||||
break;
|
||||
}
|
||||
|
||||
timeout = 0;
|
||||
while (timeout++ < 100)
|
||||
{
|
||||
emer3 = (P_RandomKey(numhuntemeralds)) + 1;
|
||||
|
||||
if (emer3 != emer2 && emer3 != emer1)
|
||||
break;
|
||||
}
|
||||
|
||||
//decrement spawn values to the actual number because zero is valid.
|
||||
if (emer1--)
|
||||
P_SpawnMobj(huntemeralds[emer1]->x<<FRACBITS,
|
||||
huntemeralds[emer1]->y<<FRACBITS,
|
||||
huntemeralds[emer1]->z<<FRACBITS, MT_EMERHUNT);
|
||||
|
||||
if (emer2--)
|
||||
P_SetMobjStateNF(P_SpawnMobj(huntemeralds[emer2]->x<<FRACBITS,
|
||||
huntemeralds[emer2]->y<<FRACBITS,
|
||||
huntemeralds[emer2]->z<<FRACBITS, MT_EMERHUNT),
|
||||
mobjinfo[MT_EMERHUNT].spawnstate+1);
|
||||
|
||||
if (emer3--)
|
||||
P_SetMobjStateNF(P_SpawnMobj(huntemeralds[emer3]->x<<FRACBITS,
|
||||
huntemeralds[emer3]->y<<FRACBITS,
|
||||
huntemeralds[emer3]->z<<FRACBITS, MT_EMERHUNT),
|
||||
mobjinfo[MT_EMERHUNT].spawnstate+2);
|
||||
}
|
||||
P_SpawnEmeraldHunt();
|
||||
|
||||
if (metalrecording) // Metal Sonic gets no rings to distract him.
|
||||
return;
|
||||
|
@ -1140,11 +1135,6 @@ static void P_LoadThings(boolean loademblems)
|
|||
|| mt->type == 1705 || mt->type == 1713) // hoops
|
||||
{
|
||||
mt->mobj = NULL;
|
||||
|
||||
// Z for objects Tails 05-26-2002
|
||||
mt->z = (INT16)(R_PointInSubsector(mt->x << FRACBITS, mt->y << FRACBITS)
|
||||
->sector->floorheight>>FRACBITS);
|
||||
|
||||
P_SpawnHoopsAndRings(mt, false);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue