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;
|
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)
|
void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
||||||
{
|
{
|
||||||
mobjtype_t ringthing = MT_RING;
|
mobjtype_t ringthing = MT_RING;
|
||||||
|
@ -13075,266 +13184,18 @@ void P_SpawnHoopsAndRings(mapthing_t *mthing, boolean bonustime)
|
||||||
// NiGHTS hoop!
|
// NiGHTS hoop!
|
||||||
if (mthing->type == 1705)
|
if (mthing->type == 1705)
|
||||||
{
|
{
|
||||||
mobj_t *nextmobj = NULL;
|
|
||||||
mobj_t *hoopcenter;
|
|
||||||
INT16 spewangle;
|
|
||||||
|
|
||||||
z = mthing->z << FRACBITS;
|
z = mthing->z << FRACBITS;
|
||||||
|
P_SpawnHoop(mthing, x, y, z, sec, 24, 4*FRACUNIT);
|
||||||
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;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// CUSTOMIZABLE NiGHTS hoop!
|
// CUSTOMIZABLE NiGHTS hoop!
|
||||||
else if (mthing->type == 1713)
|
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
|
// Super happy fun time
|
||||||
// For each flag add 4 fracunits to the size
|
// For each flag add 16 fracunits to the size
|
||||||
// Default (0 flags) is 8 fracunits
|
// Default (0 flags) is 32 fracunits
|
||||||
hoopsize = 8 + (4 * (mthing->options & 0xF));
|
z = mthing->z << FRACBITS;
|
||||||
hoopplacement = hoopsize * (4*FRACUNIT);
|
P_SpawnHoop(mthing, x, y, z, sec, 8 + (4*(mthing->options & 0xF)), 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);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// ***
|
// ***
|
||||||
|
|
Loading…
Reference in a new issue