diff --git a/src/deh_tables.c b/src/deh_tables.c index 8e15ef2f1..c7130ecac 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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", diff --git a/src/info.c b/src/info.c index 749b2a6af..99f88652f 100644 --- a/src/info.c +++ b/src/info.c @@ -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<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;