Added basic spindash dust
Also cleaned up some of the code in P_DoSpinAbility while I was at it
This commit is contained in:
parent
1b6c1a02c9
commit
ce97c1e986
|
@ -5566,6 +5566,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
|
|
||||||
"S_WATERZAP",
|
"S_WATERZAP",
|
||||||
|
|
||||||
|
// Spindash dust
|
||||||
|
"S_SPINDUST1",
|
||||||
|
"S_SPINDUST2",
|
||||||
|
"S_SPINDUST3",
|
||||||
|
"S_SPINDUST4",
|
||||||
|
|
||||||
"S_FOG1",
|
"S_FOG1",
|
||||||
"S_FOG2",
|
"S_FOG2",
|
||||||
"S_FOG3",
|
"S_FOG3",
|
||||||
|
@ -6376,6 +6382,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_MEDIUMBUBBLE", // medium bubble
|
"MT_MEDIUMBUBBLE", // medium bubble
|
||||||
"MT_EXTRALARGEBUBBLE", // extra large bubble
|
"MT_EXTRALARGEBUBBLE", // extra large bubble
|
||||||
"MT_WATERZAP",
|
"MT_WATERZAP",
|
||||||
|
"MT_SPINDUST", // Spindash dust
|
||||||
"MT_TFOG",
|
"MT_TFOG",
|
||||||
"MT_SEED",
|
"MT_SEED",
|
||||||
"MT_PARTICLE",
|
"MT_PARTICLE",
|
||||||
|
|
35
src/info.c
35
src/info.c
|
@ -274,6 +274,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
||||||
"SMOK",
|
"SMOK",
|
||||||
"BUBL", // Bubble
|
"BUBL", // Bubble
|
||||||
"WZAP",
|
"WZAP",
|
||||||
|
"DUST", // Spindash dust
|
||||||
"TFOG", // Teleport Fog
|
"TFOG", // Teleport Fog
|
||||||
"SEED", // Sonic CD flower seed
|
"SEED", // Sonic CD flower seed
|
||||||
"PRTL", // Particle (for fans, etc.)
|
"PRTL", // Particle (for fans, etc.)
|
||||||
|
@ -2279,6 +2280,13 @@ state_t states[NUMSTATES] =
|
||||||
|
|
||||||
{SPR_WZAP, FF_TRANS10|FF_ANIMATE|FF_RANDOMANIM, 4, {NULL}, 3, 2, S_NULL}, // S_WATERZAP
|
{SPR_WZAP, FF_TRANS10|FF_ANIMATE|FF_RANDOMANIM, 4, {NULL}, 3, 2, S_NULL}, // S_WATERZAP
|
||||||
|
|
||||||
|
// Spindash dust
|
||||||
|
// TODO: other spin dust types
|
||||||
|
{SPR_DUST, 0, 7, {NULL}, 0, 0, S_SPINDUST2}, // S_SPINDUST1
|
||||||
|
{SPR_DUST, 1, 6, {NULL}, 0, 0, S_SPINDUST3}, // S_SPINDUST2
|
||||||
|
{SPR_DUST, FF_TRANS30|2, 4, {NULL}, 0, 0, S_SPINDUST4}, // S_SPINDUST3
|
||||||
|
{SPR_DUST, FF_TRANS60|3, 3, {NULL}, 0, 0, S_NULL}, // S_SPINDUST4
|
||||||
|
|
||||||
{SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50, 2, {NULL}, 0, 0, S_FOG2}, // S_FOG1
|
{SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50, 2, {NULL}, 0, 0, S_FOG2}, // S_FOG1
|
||||||
{SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50|1, 2, {NULL}, 0, 0, S_FOG3}, // S_FOG2
|
{SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50|1, 2, {NULL}, 0, 0, S_FOG3}, // S_FOG2
|
||||||
{SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50|2, 2, {NULL}, 0, 0, S_FOG4}, // S_FOG3
|
{SPR_TFOG, FF_FULLBRIGHT|FF_TRANS50|2, 2, {NULL}, 0, 0, S_FOG4}, // S_FOG3
|
||||||
|
@ -10940,6 +10948,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_SPINDUST
|
||||||
|
-1, // doomednum
|
||||||
|
S_SPINDUST1, // 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
|
||||||
|
4*FRACUNIT, // speed
|
||||||
|
4*FRACUNIT, // radius
|
||||||
|
4*FRACUNIT, // height
|
||||||
|
0, // display offset
|
||||||
|
4, // mass
|
||||||
|
0, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIP, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
{ // MT_TFOG
|
{ // MT_TFOG
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_FOG1, // spawnstate
|
S_FOG1, // spawnstate
|
||||||
|
|
|
@ -466,6 +466,7 @@ typedef enum sprite
|
||||||
SPR_SMOK,
|
SPR_SMOK,
|
||||||
SPR_BUBL, // Bubble
|
SPR_BUBL, // Bubble
|
||||||
SPR_WZAP,
|
SPR_WZAP,
|
||||||
|
SPR_DUST, // Spindash dust
|
||||||
SPR_TFOG, // Teleport Fog
|
SPR_TFOG, // Teleport Fog
|
||||||
SPR_SEED, // Sonic CD flower seed
|
SPR_SEED, // Sonic CD flower seed
|
||||||
SPR_PRTL, // Particle (for fans, etc.)
|
SPR_PRTL, // Particle (for fans, etc.)
|
||||||
|
@ -2457,6 +2458,12 @@ typedef enum state
|
||||||
|
|
||||||
S_WATERZAP,
|
S_WATERZAP,
|
||||||
|
|
||||||
|
// Spindash dust
|
||||||
|
S_SPINDUST1,
|
||||||
|
S_SPINDUST2,
|
||||||
|
S_SPINDUST3,
|
||||||
|
S_SPINDUST4,
|
||||||
|
|
||||||
S_FOG1,
|
S_FOG1,
|
||||||
S_FOG2,
|
S_FOG2,
|
||||||
S_FOG3,
|
S_FOG3,
|
||||||
|
@ -3286,6 +3293,7 @@ typedef enum mobj_type
|
||||||
MT_MEDIUMBUBBLE, // medium bubble
|
MT_MEDIUMBUBBLE, // medium bubble
|
||||||
MT_EXTRALARGEBUBBLE, // extra large bubble
|
MT_EXTRALARGEBUBBLE, // extra large bubble
|
||||||
MT_WATERZAP,
|
MT_WATERZAP,
|
||||||
|
MT_SPINDUST, // Spindash dust
|
||||||
MT_TFOG,
|
MT_TFOG,
|
||||||
MT_SEED,
|
MT_SEED,
|
||||||
MT_PARTICLE,
|
MT_PARTICLE,
|
||||||
|
|
|
@ -7537,6 +7537,11 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
mobj->tracer->y, mobj->tracer->floorz, SPLATDRAWMODE_SHADE);
|
mobj->tracer->y, mobj->tracer->floorz, SPLATDRAWMODE_SHADE);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
case MT_SPINDUST: // Spindash dust
|
||||||
|
mobj->momx = FixedMul(mobj->momx, (3*FRACUNIT)/4); // originally 50000
|
||||||
|
mobj->momy = FixedMul(mobj->momy, (3*FRACUNIT)/4); // same
|
||||||
|
//mobj->momz = mobj->momz+P_MobjFlip(mobj)/3; // no meaningful change in value to be frank
|
||||||
|
break;
|
||||||
case MT_SPINFIRE:
|
case MT_SPINFIRE:
|
||||||
if (mobj->eflags & MFE_VERTICALFLIP)
|
if (mobj->eflags & MFE_VERTICALFLIP)
|
||||||
mobj->z = mobj->ceilingz - mobj->height;
|
mobj->z = mobj->ceilingz - mobj->height;
|
||||||
|
|
113
src/p_user.c
113
src/p_user.c
|
@ -3667,6 +3667,40 @@ void P_DoJump(player_t *player, boolean soundandstate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void P_DoSpinDashDust(player_t *player)
|
||||||
|
{
|
||||||
|
UINT32 i;
|
||||||
|
mobj_t *particle;
|
||||||
|
UINT32 prandom[3];
|
||||||
|
for (i = 0; i <= (leveltime%7)/2; i++) { // 1, 2, 3 or 4 particles
|
||||||
|
particle = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_SPINDUST);
|
||||||
|
|
||||||
|
if (player->powers[pw_shield] == SH_ELEMENTAL && !(player->mo->eflags & (MFE_TOUCHWATER|MFE_UNDERWATER))) {
|
||||||
|
//P_SetMobjState(particle, S_FIREDUST1);
|
||||||
|
//particle->bubble = false;
|
||||||
|
} else if (player->mo->eflags & (MFE_TOUCHWATER|MFE_UNDERWATER)) {
|
||||||
|
//P_SetMobjState(particle, S_BUBBLEDUST1);
|
||||||
|
//particle->bubble = true;
|
||||||
|
} else {
|
||||||
|
//P_SetMobjState(particle, S_SPINDUST1);
|
||||||
|
//particle->bubble = false;
|
||||||
|
}
|
||||||
|
P_SetTarget(&particle->target, player->mo);
|
||||||
|
particle->destscale = (2*player->mo->scale)/3;
|
||||||
|
P_SetScale(particle, particle->destscale);
|
||||||
|
if (player->mo->eflags & MFE_VERTICALFLIP) // readjust z position if needed
|
||||||
|
particle->z = player->mo->z + player->mo->height - particle->height;
|
||||||
|
prandom[0] = P_RandomFixed()<<2; // P_RandomByte()<<10
|
||||||
|
prandom[1] = P_RandomRange(-30, 30); // P_RandomRange(-ANG30/FRACUNIT, ANG30/FRACUNIT)*FRACUNIT
|
||||||
|
prandom[2] = P_RandomFixed()<<3; // P_RandomByte()<<11
|
||||||
|
P_SetObjectMomZ(particle, player->dashspeed/50 + prandom[0], false);
|
||||||
|
P_InstaThrust(particle,
|
||||||
|
player->mo->angle + (prandom[1]*ANG1),
|
||||||
|
-FixedMul(player->dashspeed/12 + FRACUNIT + prandom[2], player->mo->scale));
|
||||||
|
P_TryMove(particle, particle->x+particle->momx, particle->y+particle->momy, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_DoSpinAbility
|
// P_DoSpinAbility
|
||||||
//
|
//
|
||||||
|
@ -3674,6 +3708,7 @@ void P_DoJump(player_t *player, boolean soundandstate)
|
||||||
//
|
//
|
||||||
static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|
static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|
||||||
{
|
{
|
||||||
|
boolean canstand = true; // can we stand on the ground? (mostly relevant for slopes)
|
||||||
if (player->pflags & PF_STASIS)
|
if (player->pflags & PF_STASIS)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -3685,15 +3720,22 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Spinning and Spindashing
|
|
||||||
if ((player->charability2 == CA2_SPINDASH) && !(player->pflags & PF_SLIDING) && !player->exiting
|
|
||||||
&& !P_PlayerInPain(player)) // subsequent revs
|
|
||||||
{
|
|
||||||
if ((cmd->buttons & BT_USE) && player->speed < FixedMul(5<<FRACBITS, player->mo->scale) && !player->mo->momz && onground && !(player->pflags & PF_USEDOWN) && !(player->pflags & PF_SPINNING)
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
&& (!player->mo->standingslope || (player->mo->standingslope->flags & SL_NOPHYSICS) || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
canstand = (!player->mo->standingslope || (player->mo->standingslope->flags & SL_NOPHYSICS) || abs(player->mo->standingslope->zdelta) < FRACUNIT/2);
|
||||||
#endif
|
#endif
|
||||||
)
|
|
||||||
|
///////////////////////////////
|
||||||
|
// ability-specific behavior //
|
||||||
|
///////////////////////////////
|
||||||
|
if (!(player->pflags & PF_SLIDING) && !player->exiting && !P_PlayerInPain(player))
|
||||||
|
{
|
||||||
|
switch (player->charability2)
|
||||||
|
{
|
||||||
|
case CA2_SPINDASH: // Spinning and Spindashing
|
||||||
|
// Start revving
|
||||||
|
if ((cmd->buttons & BT_USE) && player->speed < FixedMul(5<<FRACBITS, player->mo->scale)
|
||||||
|
&& !player->mo->momz && onground && !(player->pflags & (PF_USEDOWN|PF_SPINNING))
|
||||||
|
&& canstand)
|
||||||
{
|
{
|
||||||
player->mo->momx = player->cmomx;
|
player->mo->momx = player->cmomx;
|
||||||
player->mo->momy = player->cmomy;
|
player->mo->momy = player->cmomy;
|
||||||
|
@ -3704,6 +3746,7 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|
||||||
if (!player->spectator)
|
if (!player->spectator)
|
||||||
S_StartSound(player->mo, sfx_s3kab); // Make the rev sound! Previously sfx_spndsh.
|
S_StartSound(player->mo, sfx_s3kab); // Make the rev sound! Previously sfx_spndsh.
|
||||||
}
|
}
|
||||||
|
// Revving
|
||||||
else if ((cmd->buttons & BT_USE) && (player->pflags & PF_STARTDASH))
|
else if ((cmd->buttons & BT_USE) && (player->pflags & PF_STARTDASH))
|
||||||
{
|
{
|
||||||
if (player->dashspeed < player->maxdash)
|
if (player->dashspeed < player->maxdash)
|
||||||
|
@ -3728,10 +3771,7 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|
||||||
// AKA Just go into a spin on the ground, you idiot. ;)
|
// AKA Just go into a spin on the ground, you idiot. ;)
|
||||||
else if ((cmd->buttons & BT_USE || ((twodlevel || (player->mo->flags2 & MF2_TWOD)) && cmd->forwardmove < -20))
|
else if ((cmd->buttons & BT_USE || ((twodlevel || (player->mo->flags2 & MF2_TWOD)) && cmd->forwardmove < -20))
|
||||||
&& !player->climbing && !player->mo->momz && onground && (player->speed > FixedMul(5<<FRACBITS, player->mo->scale)
|
&& !player->climbing && !player->mo->momz && onground && (player->speed > FixedMul(5<<FRACBITS, player->mo->scale)
|
||||||
#ifdef ESLOPE
|
|| !canstand) && !(player->pflags & (PF_USEDOWN|PF_SPINNING)))
|
||||||
|| (player->mo->standingslope && (!(player->mo->standingslope->flags & SL_NOPHYSICS)) && abs(player->mo->standingslope->zdelta) >= FRACUNIT/2)
|
|
||||||
#endif
|
|
||||||
) && !(player->pflags & PF_USEDOWN) && !(player->pflags & PF_SPINNING))
|
|
||||||
{
|
{
|
||||||
player->pflags |= PF_SPINNING;
|
player->pflags |= PF_SPINNING;
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
||||||
|
@ -3739,15 +3779,33 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|
||||||
S_StartSound(player->mo, sfx_spin);
|
S_StartSound(player->mo, sfx_spin);
|
||||||
player->pflags |= PF_USEDOWN;
|
player->pflags |= PF_USEDOWN;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case CA2_MELEE: // Melee attack
|
||||||
|
if (!(player->panim == PA_ABILITY2) && (cmd->buttons & BT_USE) && player->speed < FixedMul(10<<FRACBITS, player->mo->scale)
|
||||||
|
&& !player->mo->momz && onground && !(player->pflags & PF_USEDOWN)
|
||||||
|
&& canstand)
|
||||||
|
{
|
||||||
|
P_ResetPlayer(player);
|
||||||
|
player->mo->z += P_MobjFlip(player->mo);
|
||||||
|
player->mo->momx = player->cmomx = 0;
|
||||||
|
player->mo->momy = player->cmomy = 0;
|
||||||
|
P_SetObjectMomZ(player->mo, player->mindash, false);
|
||||||
|
P_InstaThrust(player->mo, player->mo->angle, FixedMul(player->maxdash, player->mo->scale));
|
||||||
|
P_SetPlayerMobjState(player->mo, S_PLAY_MELEE);
|
||||||
|
player->pflags |= PF_USEDOWN;
|
||||||
|
S_StartSound(player->mo, sfx_s3k8b);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
// general spinning behavior //
|
||||||
|
///////////////////////////////
|
||||||
|
|
||||||
// Rolling normally
|
// Rolling normally
|
||||||
if (onground && player->pflags & PF_SPINNING && !(player->pflags & PF_STARTDASH)
|
if (onground && player->pflags & PF_SPINNING && !(player->pflags & PF_STARTDASH)
|
||||||
&& player->speed < FixedMul(5*FRACUNIT,player->mo->scale)
|
&& player->speed < FixedMul(5*FRACUNIT,player->mo->scale) && canstand)
|
||||||
#ifdef ESLOPE
|
|
||||||
&& (!player->mo->standingslope || (player->mo->standingslope->flags & SL_NOPHYSICS) || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
if (GETSECSPECIAL(player->mo->subsector->sector->special, 4) == 7 || (player->mo->ceilingz - player->mo->floorz < P_GetPlayerHeight(player)))
|
if (GETSECSPECIAL(player->mo->subsector->sector->special, 4) == 7 || (player->mo->ceilingz - player->mo->floorz < P_GetPlayerHeight(player)))
|
||||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(10*FRACUNIT, player->mo->scale));
|
P_InstaThrust(player->mo, player->mo->angle, FixedMul(10*FRACUNIT, player->mo->scale));
|
||||||
|
@ -3792,29 +3850,12 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|
||||||
{
|
{
|
||||||
if (player->mo->state-states != S_PLAY_DASH)
|
if (player->mo->state-states != S_PLAY_DASH)
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_DASH);
|
P_SetPlayerMobjState(player->mo, S_PLAY_DASH);
|
||||||
|
// Spawn spin dash dust
|
||||||
|
if (!(player->mo->eflags & MFE_GOOWATER))
|
||||||
|
P_DoSpinDashDust(player);
|
||||||
}
|
}
|
||||||
else if (onground && player->pflags & PF_SPINNING && !(player->panim == PA_ROLL))
|
else if (onground && player->pflags & PF_SPINNING && !(player->panim == PA_ROLL))
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
||||||
|
|
||||||
// Melee attack
|
|
||||||
if ((player->charability2 == CA2_MELEE) && !(player->panim == PA_ABILITY2) && !player->exiting
|
|
||||||
&& !P_PlayerInPain(player) && (cmd->buttons & BT_USE) && player->speed < FixedMul(10<<FRACBITS, player->mo->scale)
|
|
||||||
&& !player->mo->momz && onground && !(player->pflags & PF_USEDOWN)
|
|
||||||
#ifdef ESLOPE
|
|
||||||
&& (!player->mo->standingslope || (player->mo->standingslope->flags & SL_NOPHYSICS) || abs(player->mo->standingslope->zdelta) < FRACUNIT/2)
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
|
||||||
P_ResetPlayer(player);
|
|
||||||
player->mo->z += P_MobjFlip(player->mo);
|
|
||||||
player->mo->momx = player->cmomx = 0;
|
|
||||||
player->mo->momy = player->cmomy = 0;
|
|
||||||
P_SetObjectMomZ(player->mo, player->mindash, false);
|
|
||||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(player->maxdash, player->mo->scale));
|
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_MELEE);
|
|
||||||
player->pflags |= PF_USEDOWN;
|
|
||||||
S_StartSound(player->mo, sfx_s3k8b);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in a new issue