mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-18 23:42:11 +00:00
Merge branch 'hoop_refactor' into 'next'
Make both NiGHTS hoop types use the same spawning code. See merge request STJr/SRB2!560
This commit is contained in:
commit
7e0152f37b
1 changed files with 114 additions and 253 deletions
367
src/p_mobj.c
367
src/p_mobj.c
|
@ -13056,6 +13056,115 @@ ML_EFFECT5 : Don't stop thinking when too far away
|
|||
mthing->mobj = mobj;
|
||||
}
|
||||
|
||||
static void P_SpawnHoop(mapthing_t* mthing, fixed_t x, fixed_t y, fixed_t z, sector_t* sec, INT32 hoopsize, fixed_t sizefactor)
|
||||
{
|
||||
mobj_t *mobj = NULL;
|
||||
mobj_t *nextmobj = NULL;
|
||||
mobj_t *hoopcenter;
|
||||
TMatrix *pitchmatrix, *yawmatrix;
|
||||
fixed_t radius = hoopsize*sizefactor;
|
||||
INT32 i;
|
||||
angle_t fa;
|
||||
TVector v, *res;
|
||||
|
||||
z +=
|
||||
#ifdef ESLOPE
|
||||
sec->f_slope ? P_GetZAt(sec->f_slope, x, y) :
|
||||
#endif
|
||||
sec->floorheight;
|
||||
|
||||
hoopcenter = P_SpawnMobj(x, y, z, MT_HOOPCENTER);
|
||||
hoopcenter->spawnpoint = mthing;
|
||||
hoopcenter->z -= hoopcenter->height/2;
|
||||
|
||||
P_UnsetThingPosition(hoopcenter);
|
||||
hoopcenter->x = x;
|
||||
hoopcenter->y = y;
|
||||
P_SetThingPosition(hoopcenter);
|
||||
|
||||
// Scale 0-255 to 0-359 =(
|
||||
hoopcenter->movedir = ((mthing->angle & 255)*360)/256; // Pitch
|
||||
pitchmatrix = RotateXMatrix(FixedAngle(hoopcenter->movedir << FRACBITS));
|
||||
hoopcenter->movecount = (((UINT16)mthing->angle >> 8)*360)/256; // Yaw
|
||||
yawmatrix = RotateZMatrix(FixedAngle(hoopcenter->movecount << FRACBITS));
|
||||
|
||||
// For the hoop when it flies away
|
||||
hoopcenter->extravalue1 = hoopsize;
|
||||
hoopcenter->extravalue2 = radius/12;
|
||||
|
||||
// Create the hoop!
|
||||
for (i = 0; i < hoopsize; i++)
|
||||
{
|
||||
fa = i*(FINEANGLES/hoopsize);
|
||||
v[0] = FixedMul(FINECOSINE(fa), radius);
|
||||
v[1] = 0;
|
||||
v[2] = FixedMul(FINESINE(fa), radius);
|
||||
v[3] = FRACUNIT;
|
||||
|
||||
res = VectorMatrixMultiply(v, *pitchmatrix);
|
||||
M_Memcpy(&v, res, sizeof(v));
|
||||
res = VectorMatrixMultiply(v, *yawmatrix);
|
||||
M_Memcpy(&v, res, sizeof(v));
|
||||
|
||||
mobj = P_SpawnMobj(x + v[0], y + v[1], z + v[2], MT_HOOP);
|
||||
mobj->z -= mobj->height/2;
|
||||
|
||||
if (maptol & TOL_XMAS)
|
||||
P_SetMobjState(mobj, mobj->info->seestate + (i & 1));
|
||||
|
||||
P_SetTarget(&mobj->target, hoopcenter); // Link the sprite to the center.
|
||||
mobj->fuse = 0;
|
||||
|
||||
// Link all the sprites in the hoop together
|
||||
if (nextmobj)
|
||||
{
|
||||
P_SetTarget(&mobj->hprev, nextmobj);
|
||||
P_SetTarget(&mobj->hprev->hnext, mobj);
|
||||
}
|
||||
else
|
||||
P_SetTarget(&mobj->hprev, P_SetTarget(&mobj->hnext, NULL));
|
||||
|
||||
nextmobj = mobj;
|
||||
}
|
||||
|
||||
// Create the collision detectors!
|
||||
// Create them until the size is less than 8
|
||||
// But always create at least ONE set of collision detectors
|
||||
do
|
||||
{
|
||||
if (hoopsize >= 32)
|
||||
hoopsize -= 16;
|
||||
else
|
||||
hoopsize /= 2;
|
||||
|
||||
radius = hoopsize*sizefactor;
|
||||
|
||||
for (i = 0; i < hoopsize; i++)
|
||||
{
|
||||
fa = i*(FINEANGLES/hoopsize);
|
||||
v[0] = FixedMul(FINECOSINE(fa), radius);
|
||||
v[1] = 0;
|
||||
v[2] = FixedMul(FINESINE(fa), radius);
|
||||
v[3] = FRACUNIT;
|
||||
|
||||
res = VectorMatrixMultiply(v, *pitchmatrix);
|
||||
M_Memcpy(&v, res, sizeof(v));
|
||||
res = VectorMatrixMultiply(v, *yawmatrix);
|
||||
M_Memcpy(&v, res, sizeof(v));
|
||||
|
||||
mobj = P_SpawnMobj(x + v[0], y + v[1], z + v[2], MT_HOOPCOLLIDE);
|
||||
mobj->z -= mobj->height/2;
|
||||
|
||||
// Link all the collision sprites together.
|
||||
P_SetTarget(&mobj->hnext, NULL);
|
||||
P_SetTarget(&mobj->hprev, nextmobj);
|
||||
P_SetTarget(&mobj->hprev->hnext, mobj);
|
||||
|
||||
nextmobj = mobj;
|
||||
}
|
||||
} while (hoopsize >= 8);
|
||||
}
|
||||
|
||||
void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
||||
{
|
||||
mobjtype_t ringthing = MT_RING;
|
||||
|
@ -13075,266 +13184,18 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
|||
// NiGHTS hoop!
|
||||
if (mthing->type == 1705)
|
||||
{
|
||||
mobj_t *nextmobj = NULL;
|
||||
mobj_t *hoopcenter;
|
||||
INT16 spewangle;
|
||||
|
||||
z = mthing->z << FRACBITS;
|
||||
|
||||
hoopcenter = P_SpawnMobj(x, y, z, MT_HOOPCENTER);
|
||||
|
||||
hoopcenter->spawnpoint = mthing;
|
||||
|
||||
// Screw these damn hoops, I need this thinker.
|
||||
//hoopcenter->flags |= MF_NOTHINK;
|
||||
|
||||
z +=
|
||||
#ifdef ESLOPE
|
||||
sec->f_slope ? P_GetZAt(sec->f_slope, x, y) :
|
||||
#endif
|
||||
sec->floorheight;
|
||||
|
||||
hoopcenter->z = z - hoopcenter->height/2;
|
||||
|
||||
P_UnsetThingPosition(hoopcenter);
|
||||
hoopcenter->x = x;
|
||||
hoopcenter->y = y;
|
||||
P_SetThingPosition(hoopcenter);
|
||||
|
||||
// Scale 0-255 to 0-359 =(
|
||||
closestangle = FixedAngle(FixedMul((mthing->angle>>8)*FRACUNIT,
|
||||
360*(FRACUNIT/256)));
|
||||
|
||||
hoopcenter->movedir = FixedInt(FixedMul((mthing->angle&255)*FRACUNIT,
|
||||
360*(FRACUNIT/256)));
|
||||
hoopcenter->movecount = FixedInt(AngleFixed(closestangle));
|
||||
|
||||
// For the hoop when it flies away
|
||||
hoopcenter->extravalue1 = 32;
|
||||
hoopcenter->extravalue2 = 8 * FRACUNIT;
|
||||
|
||||
spewangle = (INT16)hoopcenter->movedir;
|
||||
|
||||
// Create the hoop!
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
fa = i*(FINEANGLES/32);
|
||||
v[0] = FixedMul(FINECOSINE(fa),96*FRACUNIT);
|
||||
v[1] = 0;
|
||||
v[2] = FixedMul(FINESINE(fa),96*FRACUNIT);
|
||||
v[3] = FRACUNIT;
|
||||
|
||||
res = VectorMatrixMultiply(v, *RotateXMatrix(FixedAngle(spewangle*FRACUNIT)));
|
||||
M_Memcpy(&v, res, sizeof (v));
|
||||
res = VectorMatrixMultiply(v, *RotateZMatrix(closestangle));
|
||||
M_Memcpy(&v, res, sizeof (v));
|
||||
|
||||
finalx = x + v[0];
|
||||
finaly = y + v[1];
|
||||
finalz = z + v[2];
|
||||
|
||||
mobj = P_SpawnMobj(finalx, finaly, finalz, MT_HOOP);
|
||||
|
||||
if (maptol & TOL_XMAS)
|
||||
P_SetMobjState(mobj, mobj->info->seestate + (i & 1));
|
||||
|
||||
mobj->z -= mobj->height/2;
|
||||
P_SetTarget(&mobj->target, hoopcenter); // Link the sprite to the center.
|
||||
mobj->fuse = 0;
|
||||
|
||||
// Link all the sprites in the hoop together
|
||||
if (nextmobj)
|
||||
{
|
||||
P_SetTarget(&mobj->hprev, nextmobj);
|
||||
P_SetTarget(&mobj->hprev->hnext, mobj);
|
||||
}
|
||||
else
|
||||
P_SetTarget(&mobj->hprev, P_SetTarget(&mobj->hnext, NULL));
|
||||
|
||||
nextmobj = mobj;
|
||||
}
|
||||
|
||||
// Create the collision detectors!
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
fa = i*FINEANGLES/16;
|
||||
v[0] = FixedMul(FINECOSINE(fa),32*FRACUNIT);
|
||||
v[1] = 0;
|
||||
v[2] = FixedMul(FINESINE(fa),32*FRACUNIT);
|
||||
v[3] = FRACUNIT;
|
||||
res = VectorMatrixMultiply(v, *RotateXMatrix(FixedAngle(spewangle*FRACUNIT)));
|
||||
M_Memcpy(&v, res, sizeof (v));
|
||||
res = VectorMatrixMultiply(v, *RotateZMatrix(closestangle));
|
||||
M_Memcpy(&v, res, sizeof (v));
|
||||
|
||||
finalx = x + v[0];
|
||||
finaly = y + v[1];
|
||||
finalz = z + v[2];
|
||||
|
||||
mobj = P_SpawnMobj(finalx, finaly, finalz, MT_HOOPCOLLIDE);
|
||||
mobj->z -= mobj->height/2;
|
||||
|
||||
// Link all the collision sprites together.
|
||||
P_SetTarget(&mobj->hnext, NULL);
|
||||
P_SetTarget(&mobj->hprev, nextmobj);
|
||||
P_SetTarget(&mobj->hprev->hnext, mobj);
|
||||
|
||||
nextmobj = mobj;
|
||||
}
|
||||
// Create the collision detectors!
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
fa = i*FINEANGLES/16;
|
||||
v[0] = FixedMul(FINECOSINE(fa),64*FRACUNIT);
|
||||
v[1] = 0;
|
||||
v[2] = FixedMul(FINESINE(fa),64*FRACUNIT);
|
||||
v[3] = FRACUNIT;
|
||||
res = VectorMatrixMultiply(v, *RotateXMatrix(FixedAngle(spewangle*FRACUNIT)));
|
||||
M_Memcpy(&v, res, sizeof (v));
|
||||
res = VectorMatrixMultiply(v, *RotateZMatrix(closestangle));
|
||||
M_Memcpy(&v, res, sizeof (v));
|
||||
|
||||
finalx = x + v[0];
|
||||
finaly = y + v[1];
|
||||
finalz = z + v[2];
|
||||
|
||||
mobj = P_SpawnMobj(finalx, finaly, finalz, MT_HOOPCOLLIDE);
|
||||
mobj->z -= mobj->height/2;
|
||||
|
||||
// Link all the collision sprites together.
|
||||
P_SetTarget(&mobj->hnext, NULL);
|
||||
P_SetTarget(&mobj->hprev, nextmobj);
|
||||
P_SetTarget(&mobj->hprev->hnext, mobj);
|
||||
|
||||
nextmobj = mobj;
|
||||
}
|
||||
P_SpawnHoop(mthing, x, y, z, sec, 24, 4*FRACUNIT);
|
||||
return;
|
||||
}
|
||||
// CUSTOMIZABLE NiGHTS hoop!
|
||||
else if (mthing->type == 1713)
|
||||
{
|
||||
mobj_t *nextmobj = NULL;
|
||||
mobj_t *hoopcenter;
|
||||
INT16 spewangle;
|
||||
INT32 hoopsize;
|
||||
INT32 hoopplacement;
|
||||
|
||||
z = mthing->z << FRACBITS;
|
||||
|
||||
hoopcenter = P_SpawnMobj(x, y, z, MT_HOOPCENTER);
|
||||
hoopcenter->spawnpoint = mthing;
|
||||
|
||||
z +=
|
||||
#ifdef ESLOPE
|
||||
sec->f_slope ? P_GetZAt(sec->f_slope, x, y) :
|
||||
#endif
|
||||
sec->floorheight;
|
||||
hoopcenter->z = z - hoopcenter->height/2;
|
||||
|
||||
P_UnsetThingPosition(hoopcenter);
|
||||
hoopcenter->x = x;
|
||||
hoopcenter->y = y;
|
||||
P_SetThingPosition(hoopcenter);
|
||||
|
||||
// Scale 0-255 to 0-359 =(
|
||||
closestangle = FixedAngle(FixedMul((mthing->angle>>8)*FRACUNIT,
|
||||
360*(FRACUNIT/256)));
|
||||
|
||||
hoopcenter->movedir = FixedInt(FixedMul((mthing->angle&255)*FRACUNIT,
|
||||
360*(FRACUNIT/256)));
|
||||
hoopcenter->movecount = FixedInt(AngleFixed(closestangle));
|
||||
|
||||
spewangle = (INT16)hoopcenter->movedir;
|
||||
|
||||
// Super happy fun time
|
||||
// For each flag add 4 fracunits to the size
|
||||
// Default (0 flags) is 8 fracunits
|
||||
hoopsize = 8 + (4 * (mthing->options & 0xF));
|
||||
hoopplacement = hoopsize * (4*FRACUNIT);
|
||||
|
||||
// For the hoop when it flies away
|
||||
hoopcenter->extravalue1 = hoopsize;
|
||||
hoopcenter->extravalue2 = FixedDiv(hoopplacement, 12*FRACUNIT);
|
||||
|
||||
// Create the hoop!
|
||||
for (i = 0; i < hoopsize; i++)
|
||||
{
|
||||
fa = i*(FINEANGLES/hoopsize);
|
||||
v[0] = FixedMul(FINECOSINE(fa), hoopplacement);
|
||||
v[1] = 0;
|
||||
v[2] = FixedMul(FINESINE(fa), hoopplacement);
|
||||
v[3] = FRACUNIT;
|
||||
|
||||
res = VectorMatrixMultiply(v, *RotateXMatrix(FixedAngle(spewangle*FRACUNIT)));
|
||||
M_Memcpy(&v, res, sizeof (v));
|
||||
res = VectorMatrixMultiply(v, *RotateZMatrix(closestangle));
|
||||
M_Memcpy(&v, res, sizeof (v));
|
||||
|
||||
finalx = x + v[0];
|
||||
finaly = y + v[1];
|
||||
finalz = z + v[2];
|
||||
|
||||
mobj = P_SpawnMobj(finalx, finaly, finalz, MT_HOOP);
|
||||
|
||||
if (maptol & TOL_XMAS)
|
||||
P_SetMobjState(mobj, mobj->info->seestate + (i & 1));
|
||||
|
||||
mobj->z -= mobj->height/2;
|
||||
P_SetTarget(&mobj->target, hoopcenter); // Link the sprite to the center.
|
||||
mobj->fuse = 0;
|
||||
|
||||
// Link all the sprites in the hoop together
|
||||
if (nextmobj)
|
||||
{
|
||||
P_SetTarget(&mobj->hprev, nextmobj);
|
||||
P_SetTarget(&mobj->hprev->hnext, mobj);
|
||||
}
|
||||
else
|
||||
P_SetTarget(&mobj->hprev, P_SetTarget(&mobj->hnext, NULL));
|
||||
|
||||
nextmobj = mobj;
|
||||
}
|
||||
|
||||
// Create the collision detectors!
|
||||
// Create them until the size is less than 8
|
||||
// But always create at least ONE set of collision detectors
|
||||
do
|
||||
{
|
||||
if (hoopsize >= 32)
|
||||
hoopsize -= 16;
|
||||
else
|
||||
hoopsize /= 2;
|
||||
|
||||
hoopplacement = hoopsize * (4*FRACUNIT);
|
||||
|
||||
for (i = 0; i < hoopsize; i++)
|
||||
{
|
||||
fa = i*FINEANGLES/hoopsize;
|
||||
v[0] = FixedMul(FINECOSINE(fa), hoopplacement);
|
||||
v[1] = 0;
|
||||
v[2] = FixedMul(FINESINE(fa), hoopplacement);
|
||||
v[3] = FRACUNIT;
|
||||
res = VectorMatrixMultiply(v, *RotateXMatrix(FixedAngle(spewangle*FRACUNIT)));
|
||||
M_Memcpy(&v, res, sizeof (v));
|
||||
res = VectorMatrixMultiply(v, *RotateZMatrix(closestangle));
|
||||
M_Memcpy(&v, res, sizeof (v));
|
||||
|
||||
finalx = x + v[0];
|
||||
finaly = y + v[1];
|
||||
finalz = z + v[2];
|
||||
|
||||
mobj = P_SpawnMobj(finalx, finaly, finalz, MT_HOOPCOLLIDE);
|
||||
mobj->z -= mobj->height/2;
|
||||
|
||||
// Link all the collision sprites together.
|
||||
P_SetTarget(&mobj->hnext, NULL);
|
||||
P_SetTarget(&mobj->hprev, nextmobj);
|
||||
P_SetTarget(&mobj->hprev->hnext, mobj);
|
||||
|
||||
nextmobj = mobj;
|
||||
}
|
||||
} while (hoopsize >= 8);
|
||||
|
||||
// For each flag add 16 fracunits to the size
|
||||
// Default (0 flags) is 32 fracunits
|
||||
z = mthing->z << FRACBITS;
|
||||
P_SpawnHoop(mthing, x, y, z, sec, 8 + (4*(mthing->options & 0xF)), 4*FRACUNIT);
|
||||
return;
|
||||
}
|
||||
// ***
|
||||
|
|
Loading…
Reference in a new issue