Implement the Sunbeam Palm decoration

- Randomised tilt
- Randomised leaf angles
- Technically specifiable number of leaves, but the default of 5 is sane enough
This commit is contained in:
toaster 2023-07-25 18:01:07 +01:00
parent ddf55d4040
commit f040523b19
4 changed files with 121 additions and 0 deletions

View file

@ -4449,6 +4449,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_LIZARDMAN",
"S_LIONMAN",
"S_SUNBEAMPALM_STEM",
"S_SUNBEAMPALM_LEAF",
"S_KARMAFIREWORK1",
"S_KARMAFIREWORK2",
"S_KARMAFIREWORK3",
@ -5735,6 +5738,9 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_LIZARDMAN",
"MT_LIONMAN",
"MT_SUNBEAMPALM_STEM",
"MT_SUNBEAMPALM_LEAF",
"MT_KARMAFIREWORK",
"MT_RINGSPARKS",
"MT_GAINAX",

View file

@ -818,6 +818,9 @@ char sprnames[NUMSPRITES + 1][5] =
"WBLZ",
"WBLN",
"TUST",
"TULE",
"FWRK",
"MXCL",
"RGSP",
@ -5155,6 +5158,9 @@ state_t states[NUMSTATES] =
{SPR_WBLZ, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIZARDMAN
{SPR_WBLN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIONMAN
{SPR_TUST, FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_SUNBEAMPALM_STEM
{SPR_TULE, FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_SUNBEAMPALM_LEAF
{SPR_FWRK, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_KARMAFIREWORK2}, // S_KARMAFIREWORK1
{SPR_FWRK, 1|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_KARMAFIREWORK3}, // S_KARMAFIREWORK2
{SPR_FWRK, 2|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_KARMAFIREWORK4}, // S_KARMAFIREWORK3
@ -29293,6 +29299,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_SUNBEAMPALM_STEM
2697, // doomednum
S_SUNBEAMPALM_STEM, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
90<<FRACBITS, // radius
420<<FRACBITS, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING, // flags
S_NULL // raisestate
},
{ // MT_SUNBEAMPALM_LEAF
-1, // doomednum
S_SUNBEAMPALM_LEAF, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
96<<FRACBITS, // radius
128<<FRACBITS, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT, // flags
S_NULL // raisestate
},
{ // MT_KARMAFIREWORK
-1, // doomednum
S_KARMAFIREWORK1, // spawnstate

View file

@ -1369,6 +1369,9 @@ typedef enum sprite
SPR_WBLZ,
SPR_WBLN,
SPR_TUST,
SPR_TULE,
SPR_FWRK,
SPR_MXCL,
SPR_RGSP,
@ -5595,6 +5598,9 @@ typedef enum state
S_LIZARDMAN,
S_LIONMAN,
S_SUNBEAMPALM_STEM,
S_SUNBEAMPALM_LEAF,
S_KARMAFIREWORK1,
S_KARMAFIREWORK2,
S_KARMAFIREWORK3,
@ -6900,6 +6906,9 @@ typedef enum mobj_type
MT_LIZARDMAN,
MT_LIONMAN,
MT_SUNBEAMPALM_STEM,
MT_SUNBEAMPALM_LEAF,
MT_KARMAFIREWORK,
MT_RINGSPARKS,
MT_GAINAX,

View file

@ -13350,6 +13350,52 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj)
P_RemoveMobj(mobj); // Don't need this helper obj anymore
return false;
}
case MT_SUNBEAMPALM_STEM:
{
UINT8 i;
const UINT8 numleaves = max(4, (abs(mthing->args[0])+1 % 6) + 4);
const fixed_t pivot = P_RandomRange(PR_DECORATION, -40, 20) * FRACUNIT;
mobj->rollangle = FixedAngle(pivot);
const fixed_t temptop = FixedDiv(mobj->height, mobj->scale);
const fixed_t tempside = mobj->info->radius * 2;
const fixed_t top = P_ReturnThrustX(mobj, mobj->rollangle, temptop) + P_ReturnThrustY(mobj, mobj->rollangle, tempside);
const fixed_t side = P_ReturnThrustX(mobj, mobj->rollangle, tempside) - P_ReturnThrustY(mobj, mobj->rollangle, temptop);
const fixed_t basex = P_ReturnThrustX(mobj, mobj->angle, side);
const fixed_t basey = P_ReturnThrustY(mobj, mobj->angle, side);
const angle_t divideangle = FixedAngle((360*FRACUNIT)/numleaves);
angle_t leafangle = P_RandomKey(PR_DECORATION, 360)*ANG1;
const fixed_t dist = mobjinfo[MT_SUNBEAMPALM_LEAF].radius;
// Spawn all of the papersprite leaves
for (i = 0; i < numleaves; i++, leafangle += divideangle)
{
mobj_t *leaf;
leaf = P_SpawnMobjFromMobj(
mobj,
basex + P_ReturnThrustX(mobj, leafangle, dist),
basey + P_ReturnThrustY(mobj, leafangle, dist),
top,
MT_SUNBEAMPALM_LEAF
);
if (P_MobjWasRemoved(leaf))
continue;
leaf->angle = leafangle;
leaf->frame |= P_RandomKey(PR_DECORATION, 5);
}
break;
}
case MT_BATTLECAPSULE:
{
sector_t *sec = R_PointInSubsector(mobj->x, mobj->y)->sector;