Merge pull request #6 from WumboSpasm/deathanim
Improve death animation. Thanks Wumbo!
This commit is contained in:
commit
ca91f93e9d
7 changed files with 143 additions and 9 deletions
|
|
@ -407,6 +407,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
// technically the player goes here but it's an infinite tic state
|
||||
"S_OBJPLACE_DUMMY",
|
||||
|
||||
"S_KART_LEFTOVER",
|
||||
"S_KART_TIRE",
|
||||
|
||||
// Blue Crawla
|
||||
"S_POSS_STND",
|
||||
"S_POSS_RUN1",
|
||||
|
|
@ -4389,6 +4392,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
"MT_THOK", // Thok! mobj
|
||||
"MT_SHADOW", // Linkdraw Shadow (for invisible objects)
|
||||
"MT_PLAYER",
|
||||
"MT_KART_LEFTOVER",
|
||||
"MT_KART_TIRE",
|
||||
|
||||
// Enemies
|
||||
"MT_BLUECRAWLA", // Crawla (Blue)
|
||||
|
|
|
|||
57
src/info.c
57
src/info.c
|
|
@ -876,6 +876,9 @@ state_t states[NUMSTATES] =
|
|||
|
||||
{SPR_NULL, 0, -1, {NULL}, 0, 0, S_OBJPLACE_DUMMY}, // S_OBJPLACE_DUMMY
|
||||
|
||||
{SPR_KART, 0, 1, {A_DeathSpin}, ANG15, 0, S_KART_LEFTOVER}, // S_KART_LEFTOVER
|
||||
{SPR_TIRE, 0, 1, {A_DeathSpin}, ANG30, 0, S_KART_TIRE}, // S_KART_TIRE
|
||||
|
||||
// Blue Crawla
|
||||
{SPR_POSS, 0, 5, {A_Look}, 0, 0, S_POSS_STND}, // S_POSS_STND
|
||||
{SPR_POSS, 0, 3, {A_Chase}, 0, 0, S_POSS_RUN2}, // S_POSS_RUN1
|
||||
|
|
@ -5113,6 +5116,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
(statenum_t)MT_THOK // raisestate
|
||||
},
|
||||
|
||||
{ // MT_KART_LEFTOVER
|
||||
4095, // doomednum
|
||||
S_KART_LEFTOVER, // spawnstate
|
||||
1, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // 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
|
||||
1, // speed
|
||||
16*FRACUNIT, // radius
|
||||
48*FRACUNIT, // height
|
||||
-1, // display offset
|
||||
1000, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP|MF_APPLYTERRAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_KART_TIRE
|
||||
-1, // doomednum
|
||||
S_KART_TIRE, // spawnstate
|
||||
1, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // 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
|
||||
1, // speed
|
||||
6*FRACUNIT, // radius
|
||||
12*FRACUNIT, // height
|
||||
-1, // display offset
|
||||
1000, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP|MF_APPLYTERRAIN, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_BLUECRAWLA
|
||||
100, // doomednum
|
||||
S_POSS_STND, // spawnstate
|
||||
|
|
|
|||
|
|
@ -563,6 +563,7 @@ void A_ReaperThinker();
|
|||
void A_MementosTPParticles();
|
||||
void A_FlameShieldPaper();
|
||||
void A_InvincSparkleRotate();
|
||||
void A_DeathSpin();
|
||||
|
||||
extern boolean actionsoverridden[NUMACTIONS];
|
||||
|
||||
|
|
@ -1376,6 +1377,9 @@ typedef enum state
|
|||
// technically the player goes here but it's an infinite tic state
|
||||
S_OBJPLACE_DUMMY,
|
||||
|
||||
S_KART_LEFTOVER,
|
||||
S_KART_TIRE,
|
||||
|
||||
// Blue Crawla
|
||||
S_POSS_STND,
|
||||
S_POSS_RUN1,
|
||||
|
|
@ -5396,6 +5400,9 @@ typedef enum mobj_type
|
|||
MT_THOK, // Thok! mobj
|
||||
MT_SHADOW, // Linkdraw Shadow (for invisible objects)
|
||||
MT_PLAYER,
|
||||
MT_KART_LEFTOVER,
|
||||
MT_KART_TIRE,
|
||||
|
||||
// Enemies
|
||||
MT_BLUECRAWLA, // Crawla (Blue)
|
||||
MT_REDCRAWLA, // Crawla (Red)
|
||||
|
|
|
|||
|
|
@ -1198,6 +1198,14 @@ fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against)
|
|||
break;
|
||||
weight = K_PlayerWeight(mobj, against);
|
||||
break;
|
||||
case MT_KART_LEFTOVER:
|
||||
weight = 5*FRACUNIT/2;
|
||||
|
||||
if (mobj->extravalue1 > 0)
|
||||
{
|
||||
weight = mobj->extravalue1 * (FRACUNIT >> 1);
|
||||
}
|
||||
break;
|
||||
case MT_BUBBLESHIELD:
|
||||
weight = K_PlayerWeight(mobj->target, against);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -325,6 +325,7 @@ void A_ReaperThinker(mobj_t *actor);
|
|||
void A_MementosTPParticles(mobj_t *actor);
|
||||
void A_FlameShieldPaper(mobj_t *actor);
|
||||
void A_InvincSparkleRotate(mobj_t *actor);
|
||||
void A_DeathSpin(mobj_t *actor);
|
||||
|
||||
//for p_enemy.c
|
||||
|
||||
|
|
@ -14323,3 +14324,9 @@ void A_InvincSparkleRotate(mobj_t *actor)
|
|||
ghost->fuse = 4;
|
||||
}
|
||||
}
|
||||
|
||||
void A_DeathSpin(mobj_t *actor)
|
||||
{
|
||||
INT32 locvar1 = var1;
|
||||
actor->angle += locvar1;
|
||||
}
|
||||
|
|
@ -1284,34 +1284,79 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
case MT_PLAYER:
|
||||
if (damagetype != DMG_SPECTATOR)
|
||||
{
|
||||
angle_t flingAngle;
|
||||
mobj_t *kart;
|
||||
|
||||
target->fuse = TICRATE*3; // timer before mobj disappears from view (even if not an actual player)
|
||||
target->fuse = 2*TICRATE; // timer before mobj disappears from view (even if not an actual player)
|
||||
target->momx = target->momy = target->momz = 0;
|
||||
|
||||
angle_t playerFlingAngle;
|
||||
angle_t kartFlingAngle;
|
||||
|
||||
if (source && !P_MobjWasRemoved(source))
|
||||
{
|
||||
flingAngle = R_PointToAngle2(
|
||||
playerFlingAngle = kartFlingAngle = R_PointToAngle2(
|
||||
source->x - source->momx, source->y - source->momy,
|
||||
target->x, target->y
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
flingAngle = target->angle + ANGLE_180;
|
||||
kartFlingAngle = target->angle;
|
||||
|
||||
if (P_RandomByte() & 1)
|
||||
{
|
||||
flingAngle -= ANGLE_45;
|
||||
kartFlingAngle -= ANGLE_45;
|
||||
}
|
||||
else
|
||||
{
|
||||
flingAngle += ANGLE_45;
|
||||
kartFlingAngle += ANGLE_45;
|
||||
}
|
||||
|
||||
playerFlingAngle = kartFlingAngle + ANGLE_180;
|
||||
}
|
||||
|
||||
// Spawn kart frame
|
||||
mobj_t *kart = P_SpawnMobjFromMobj(target, 0, 0, 0, MT_KART_LEFTOVER);
|
||||
|
||||
if (kart && !P_MobjWasRemoved(kart))
|
||||
{
|
||||
kart->angle = target->angle;
|
||||
kart->color = target->color;
|
||||
kart->extravalue1 = target->player->kartweight;
|
||||
kart->fuse = 2*TICRATE;
|
||||
|
||||
// Copy interp data
|
||||
kart->old_angle = target->old_angle;
|
||||
kart->old_x = target->old_x;
|
||||
kart->old_y = target->old_y;
|
||||
kart->old_z = target->old_z;
|
||||
|
||||
P_InstaThrust(kart, kartFlingAngle, 1 * kart->scale);
|
||||
P_SetObjectMomZ(kart, 10*FRACUNIT, false);
|
||||
|
||||
const fixed_t tireOffset = 32;
|
||||
const angle_t aOffset = ANGLE_22h;
|
||||
|
||||
UINT8 i;
|
||||
angle_t tireAngle;
|
||||
mobj_t *tire;
|
||||
|
||||
// Spawn tires
|
||||
tireAngle = kartFlingAngle - ANGLE_90 - ANGLE_22h;
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (i == 2) tireAngle += ANGLE_90;
|
||||
|
||||
tire = P_SpawnMobjFromMobj(kart, 0, 0, 0, MT_KART_TIRE);
|
||||
tire->fuse = 2*TICRATE;
|
||||
|
||||
P_InitAngle(tire, tireAngle);
|
||||
P_InstaThrust(tire, tireAngle, 3 * tire->scale);
|
||||
P_SetObjectMomZ(tire, 10*FRACUNIT, false);
|
||||
|
||||
tireAngle += (aOffset * 2);
|
||||
}
|
||||
}
|
||||
|
||||
P_InstaThrust(target, flingAngle, 14 * target->scale);
|
||||
P_InstaThrust(target, playerFlingAngle, 4 * target->scale);
|
||||
P_SetObjectMomZ(target, 14*FRACUNIT, false);
|
||||
|
||||
P_PlayDeathSound(target);
|
||||
|
|
|
|||
|
|
@ -9554,6 +9554,8 @@ static void P_DefaultMobjShadowScale(mobj_t *thing)
|
|||
switch (thing->type)
|
||||
{
|
||||
case MT_PLAYER:
|
||||
thing->shadowscale = FRACUNIT;
|
||||
break;
|
||||
case MT_SMALLMACE:
|
||||
case MT_BIGMACE:
|
||||
case MT_PUMA:
|
||||
|
|
@ -9887,6 +9889,9 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
case MT_POGOSPRING:
|
||||
P_SetScale(mobj, (mobj->destscale = 3 * mobj->destscale / 2));
|
||||
break;
|
||||
case MT_KART_LEFTOVER:
|
||||
mobj->color = SKINCOLOR_RED;
|
||||
break;
|
||||
case MT_EGGROBO1:
|
||||
mobj->movecount = P_RandomKey(13);
|
||||
mobj->color = FIRSTRAINBOWCOLOR + P_RandomKey(FIRSTSUPERCOLOR - FIRSTRAINBOWCOLOR);
|
||||
|
|
|
|||
Loading…
Reference in a new issue