mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-21 19:31:26 +00:00
Allow P_SpawnItemCircle to spawn arbitrary mobjtypes (will be used in UDMF)
This commit is contained in:
parent
2dac47a54c
commit
72a1571937
1 changed files with 45 additions and 68 deletions
113
src/p_mobj.c
113
src/p_mobj.c
|
@ -13269,97 +13269,66 @@ static void P_SpawnItemRow(mapthing_t *mthing, mobjtype_t itemtype, INT32 numite
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void P_SpawnItemCircle(mapthing_t *mthing, fixed_t x, fixed_t y, fixed_t z, INT32 numitems, fixed_t size, boolean bonustime)
|
static void P_SpawnItemCircle(mapthing_t *mthing, mobjtype_t *itemtypes, UINT8 numitemtypes, INT32 numitems, fixed_t size, boolean bonustime)
|
||||||
{
|
{
|
||||||
mobjtype_t ringthing = MT_RING;
|
mapthing_t dummything;
|
||||||
mobj_t *mobj = NULL;
|
mobj_t* mobj = NULL;
|
||||||
fixed_t finalx, finaly, finalz;
|
fixed_t x = mthing->x << FRACBITS;
|
||||||
angle_t closestangle, fa;
|
fixed_t y = mthing->y << FRACBITS;
|
||||||
|
fixed_t z = mthing->z << FRACBITS;
|
||||||
|
angle_t angle = FixedAngle(mthing->angle << FRACBITS);
|
||||||
|
angle_t fa;
|
||||||
INT32 i;
|
INT32 i;
|
||||||
TVector v, *res;
|
TVector v, *res;
|
||||||
|
|
||||||
if (metalrecording)
|
for (i = 0; i < numitemtypes; i++)
|
||||||
return;
|
|
||||||
|
|
||||||
z = P_GetMobjSpawnHeight(ringthing, x, y, z, false);
|
|
||||||
|
|
||||||
closestangle = FixedAngle(mthing->angle << FRACBITS);
|
|
||||||
|
|
||||||
switch (mthing->type)
|
|
||||||
{
|
{
|
||||||
case 604:
|
dummything = *mthing;
|
||||||
case 605:
|
dummything.type = mobjinfo[itemtypes[i]].doomednum;
|
||||||
if (ultimatemode)
|
// Skip all returning/substitution code in objectplace.
|
||||||
return; // No rings in Ultimate!
|
if (!objectplacing)
|
||||||
if (nightsreplace)
|
{
|
||||||
ringthing = MT_NIGHTSSTAR;
|
if (!P_AllowMobjSpawn(&dummything, itemtypes[i]))
|
||||||
break;
|
{
|
||||||
case 608:
|
itemtypes[i] = MT_NULL;
|
||||||
case 609:
|
continue;
|
||||||
/*ringthing = (i & 1) ? MT_RING : MT_BLUESPHERE; -- i == 0 is bluesphere
|
}
|
||||||
break;*/
|
|
||||||
case 606:
|
itemtypes[i] = P_GetMobjtypeSubstitute(&dummything, itemtypes[i]);
|
||||||
case 607:
|
}
|
||||||
ringthing = (nightsreplace) ? MT_NIGHTSCHIP : MT_BLUESPHERE;
|
}
|
||||||
break;
|
z = P_GetMobjSpawnHeight(itemtypes[0], x, y, z, false);
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the hoop!
|
|
||||||
for (i = 0; i < numitems; i++)
|
for (i = 0; i < numitems; i++)
|
||||||
{
|
{
|
||||||
if (mthing->type == 608 || mthing->type == 609)
|
mobjtype_t itemtype = itemtypes[i % numitemtypes];
|
||||||
{
|
if (itemtype == MT_NULL)
|
||||||
if (i & 1)
|
continue;
|
||||||
{
|
dummything.type = mobjinfo[itemtype].doomednum;
|
||||||
if (ultimatemode)
|
|
||||||
continue; // No rings in Ultimate!
|
|
||||||
ringthing = (nightsreplace) ? MT_NIGHTSSTAR : MT_RING;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ringthing = (nightsreplace) ? MT_NIGHTSCHIP : MT_BLUESPHERE;
|
|
||||||
}
|
|
||||||
|
|
||||||
fa = i * FINEANGLES/numitems;
|
fa = i*FINEANGLES/numitems;
|
||||||
v[0] = FixedMul(FINECOSINE(fa), size);
|
v[0] = FixedMul(FINECOSINE(fa), size);
|
||||||
v[1] = 0;
|
v[1] = 0;
|
||||||
v[2] = FixedMul(FINESINE(fa), size);
|
v[2] = FixedMul(FINESINE(fa), size);
|
||||||
v[3] = FRACUNIT;
|
v[3] = FRACUNIT;
|
||||||
|
|
||||||
res = VectorMatrixMultiply(v, *RotateZMatrix(closestangle));
|
res = VectorMatrixMultiply(v, *RotateZMatrix(angle));
|
||||||
M_Memcpy(&v, res, sizeof(v));
|
M_Memcpy(&v, res, sizeof(v));
|
||||||
|
|
||||||
finalx = x + v[0];
|
mobj = P_SpawnMobjFromMapThing(&dummything, x + v[0], y + v[1], z + v[2], itemtype);
|
||||||
finaly = y + v[1];
|
|
||||||
finalz = z + v[2];
|
if (!mobj)
|
||||||
|
continue;
|
||||||
|
|
||||||
mobj = P_SpawnMobj(finalx, finaly, finalz, ringthing);
|
|
||||||
mobj->z -= mobj->height/2;
|
mobj->z -= mobj->height/2;
|
||||||
|
mobj->spawnpoint = NULL;
|
||||||
if (mthing->options & MTF_OBJECTFLIP)
|
if (bonustime && (mobj->type == MT_BLUESPHERE || mobj->type == MT_NIGHTSCHIP))
|
||||||
{
|
|
||||||
mobj->eflags |= MFE_VERTICALFLIP;
|
|
||||||
mobj->flags2 |= MF2_OBJECTFLIP;
|
|
||||||
}
|
|
||||||
|
|
||||||
mobj->angle = closestangle;
|
|
||||||
if (mthing->options & MTF_AMBUSH)
|
|
||||||
mobj->flags2 |= MF2_AMBUSH;
|
|
||||||
|
|
||||||
if (bonustime && (ringthing == MT_BLUESPHERE || ringthing == MT_NIGHTSCHIP))
|
|
||||||
P_SetMobjState(mobj, mobj->info->raisestate);
|
P_SetMobjState(mobj, mobj->info->raisestate);
|
||||||
else if ((maptol & TOL_XMAS) && (ringthing == MT_NIGHTSSTAR))
|
|
||||||
P_SetMobjState(mobj, mobj->info->seestate);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void P_SpawnItemPattern(mapthing_t *mthing, boolean bonustime)
|
void P_SpawnItemPattern(mapthing_t *mthing, boolean bonustime)
|
||||||
{
|
{
|
||||||
fixed_t x = mthing->x << FRACBITS;
|
|
||||||
fixed_t y = mthing->y << FRACBITS;
|
|
||||||
fixed_t z = mthing->z << FRACBITS;
|
|
||||||
|
|
||||||
switch (mthing->type)
|
switch (mthing->type)
|
||||||
{
|
{
|
||||||
// Special placement patterns
|
// Special placement patterns
|
||||||
|
@ -13379,12 +13348,20 @@ void P_SpawnItemPattern(mapthing_t *mthing, boolean bonustime)
|
||||||
case 605: // Circle of rings (16 items)
|
case 605: // Circle of rings (16 items)
|
||||||
case 606: // Circle of blue spheres (8 items)
|
case 606: // Circle of blue spheres (8 items)
|
||||||
case 607: // Circle of blue spheres (16 items)
|
case 607: // Circle of blue spheres (16 items)
|
||||||
|
{
|
||||||
|
INT32 numitems = (mthing->type & 1) ? 16 : 8;
|
||||||
|
fixed_t size = (mthing->type & 1) ? 192*FRACUNIT : 96*FRACUNIT;
|
||||||
|
mobjtype_t itemtypes[1] = { (mthing->type & 1) ? MT_RING : MT_BLUESPHERE };
|
||||||
|
P_SpawnItemCircle(mthing, itemtypes, 1, numitems, size, bonustime);
|
||||||
|
return;
|
||||||
|
}
|
||||||
case 608: // Circle of rings and blue spheres (8 items)
|
case 608: // Circle of rings and blue spheres (8 items)
|
||||||
case 609: // Circle of rings and blue spheres (16 items)
|
case 609: // Circle of rings and blue spheres (16 items)
|
||||||
{
|
{
|
||||||
INT32 numitems = (mthing->type & 1) ? 16 : 8;
|
INT32 numitems = (mthing->type & 1) ? 16 : 8;
|
||||||
fixed_t size = (mthing->type & 1) ? 192*FRACUNIT : 96*FRACUNIT;
|
fixed_t size = (mthing->type & 1) ? 192*FRACUNIT : 96*FRACUNIT;
|
||||||
P_SpawnItemCircle(mthing, x, y, z, numitems, size, bonustime);
|
mobjtype_t itemtypes[2] = { MT_RING, MT_BLUESPHERE };
|
||||||
|
P_SpawnItemCircle(mthing, itemtypes, 2, numitems, size, bonustime);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in a new issue