From ff181d099c40ab3c649fea18ea2dee6449b5894f Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Fri, 29 May 2015 00:56:02 -0400 Subject: [PATCH 01/10] Add new player animations. Added drowning to all players, and several new Super animations for Sonic. Removed A_Fall from S_PLAY_DEAD and moved its effect into P_KillMobj for player avatars. --- src/dehacked.c | 10 +++++++- src/info.c | 70 ++++++++++++++++++++++++++++++++------------------ src/info.h | 20 +++++++++++++-- src/p_inter.c | 9 +++++-- src/p_mobj.c | 31 ++++++++++++---------- 5 files changed, 97 insertions(+), 43 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 227c48b69..394e12e0b 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -3747,6 +3747,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_PLAY_RUN", "S_PLAY_PAIN", "S_PLAY_DEAD", + "S_PLAY_DRWN", "S_PLAY_SPIN", "S_PLAY_GASP", "S_PLAY_JUMP", @@ -3767,8 +3768,15 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_PLAY_SUPER_STND", "S_PLAY_SUPER_WALK", "S_PLAY_SUPER_RUN", - "S_PLAY_SUPER_EDGE", "S_PLAY_SUPER_PAIN", + "S_PLAY_SUPER_DEAD", + "S_PLAY_SUPER_DRWN", + "S_PLAY_SUPER_SPIN", + "S_PLAY_SUPER_GASP", + "S_PLAY_SUPER_JUMP", + "S_PLAY_SUPER_FALL", + "S_PLAY_SUPER_EDGE", + "S_PLAY_SUPER_RIDE", // SF_SUPER "S_PLAY_SUPERTRANS1", diff --git a/src/info.c b/src/info.c index 775996092..137eabb08 100644 --- a/src/info.c +++ b/src/info.c @@ -64,6 +64,7 @@ char spr2names[NUMPLAYERSPRITES][5] = "RUN_", "PAIN", "DEAD", + "DRWN", "SPIN", "GASP", "JUMP", @@ -85,8 +86,15 @@ char spr2names[NUMPLAYERSPRITES][5] = "SSTD", "SWLK", "SRUN", + "SPAN", + "SDTH", + "SDRN", + "SSPN", + "SGSP", + "SJMP", + "SFAL", "SEDG", - "SHIT" + "SRID" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -114,32 +122,44 @@ state_t states[NUMSTATES] = {SPR_THOK, FF_TRANS50, 8, {NULL}, 0, 0, S_NULL}, // S_THOK // Player - {SPR_PLAY, SPR2_STND, 105, {NULL}, 0, 0, S_PLAY_WAIT}, // S_PLAY_STND - {SPR_PLAY, SPR2_WAIT, 16, {NULL}, 0, 0, S_PLAY_WAIT}, // S_PLAY_WAIT - {SPR_PLAY, SPR2_WALK, 4, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_WALK - {SPR_PLAY, SPR2_RUN , 2, {NULL}, 0, 0, S_PLAY_RUN}, // S_PLAY_RUN - {SPR_PLAY, SPR2_PAIN, 350, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_PAIN - {SPR_PLAY, SPR2_DEAD, 4, {A_Fall}, 0, 0, S_PLAY_DEAD}, // S_PLAY_DEAD - {SPR_PLAY, SPR2_SPIN, 1, {NULL}, 0, 0, S_PLAY_SPIN}, // S_PLAY_SPIN - {SPR_PLAY, SPR2_GASP, 14, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_GASP - {SPR_PLAY, SPR2_JUMP, -1, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_JUMP - {SPR_PLAY, SPR2_FALL, 2, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_FALL - {SPR_PLAY, SPR2_EDGE, 12, {NULL}, 0, 0, S_PLAY_EDGE}, // S_PLAY_EDGE - {SPR_PLAY, SPR2_RIDE, 4, {NULL}, 0, 0, S_PLAY_RIDE}, // S_PLAY_RIDE + {SPR_PLAY, SPR2_STND, 105, {NULL}, 0, 0, S_PLAY_WAIT}, // S_PLAY_STND + {SPR_PLAY, SPR2_WAIT, 16, {NULL}, 0, 0, S_PLAY_WAIT}, // S_PLAY_WAIT + {SPR_PLAY, SPR2_WALK, 4, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_WALK + {SPR_PLAY, SPR2_RUN , 2, {NULL}, 0, 0, S_PLAY_RUN}, // S_PLAY_RUN + {SPR_PLAY, SPR2_PAIN, 350, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_PAIN + {SPR_PLAY, SPR2_DEAD, 4, {NULL}, 0, 0, S_PLAY_DEAD}, // S_PLAY_DEAD + {SPR_PLAY, SPR2_DRWN, 4, {NULL}, 0, 0, S_PLAY_DRWN}, // S_PLAY_DRWN + {SPR_PLAY, SPR2_SPIN, 1, {NULL}, 0, 0, S_PLAY_SPIN}, // S_PLAY_SPIN + {SPR_PLAY, SPR2_GASP, 14, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_GASP + {SPR_PLAY, SPR2_JUMP, -1, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_JUMP + {SPR_PLAY, SPR2_FALL, 2, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_FALL + {SPR_PLAY, SPR2_EDGE, 12, {NULL}, 0, 0, S_PLAY_EDGE}, // S_PLAY_EDGE + {SPR_PLAY, SPR2_RIDE, 4, {NULL}, 0, 0, S_PLAY_RIDE}, // S_PLAY_RIDE - {SPR_PLAY, SPR2_FLY , 2, {NULL}, 0, 0, S_PLAY_FLY}, // S_PLAY_FLY - {SPR_PLAY, SPR2_TIRE, 12, {NULL}, 0, 0, S_PLAY_FLY_TIRED}, // S_PLAY_FLY_TIRED + // Tails abilities + {SPR_PLAY, SPR2_FLY , 2, {NULL}, 0, 0, S_PLAY_FLY}, // S_PLAY_FLY + {SPR_PLAY, SPR2_TIRE, 12, {NULL}, 0, 0, S_PLAY_FLY_TIRED}, // S_PLAY_FLY_TIRED - {SPR_PLAY, SPR2_GLID, 2, {NULL}, 0, 0, S_PLAY_GLIDE}, // S_PLAY_GLIDE - {SPR_PLAY, SPR2_CLNG, 6, {NULL}, 0, 0, S_PLAY_CLING}, // S_PLAY_CLING - {SPR_PLAY, SPR2_CLMB, 5, {NULL}, 0, 0, S_PLAY_CLIMB}, // S_PLAY_CLIMB + // Knuckles abilities + {SPR_PLAY, SPR2_GLID, 2, {NULL}, 0, 0, S_PLAY_GLIDE}, // S_PLAY_GLIDE + {SPR_PLAY, SPR2_CLNG, 6, {NULL}, 0, 0, S_PLAY_CLING}, // S_PLAY_CLING + {SPR_PLAY, SPR2_CLMB, 5, {NULL}, 0, 0, S_PLAY_CLIMB}, // S_PLAY_CLIMB - {SPR_PLAY, SPR2_SSTD, 7, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STND - {SPR_PLAY, SPR2_SWLK, 7, {NULL}, 0, 0, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_WALK - {SPR_PLAY, SPR2_SRUN, 7, {NULL}, 0, 0, S_PLAY_SUPER_RUN}, // S_PLAY_SUPER_RUN - {SPR_PLAY, SPR2_SEDG, 12, {NULL}, 0, 0, S_PLAY_SUPER_EDGE}, // S_PLAY_SUPER_EDGE - {SPR_PLAY, SPR2_SHIT, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_PAIN + // Super Sonic + {SPR_PLAY, SPR2_SSTD, 7, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STND + {SPR_PLAY, SPR2_SWLK, 7, {NULL}, 0, 0, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_WALK + {SPR_PLAY, SPR2_SRUN, 7, {NULL}, 0, 0, S_PLAY_SUPER_RUN}, // S_PLAY_SUPER_RUN + {SPR_PLAY, SPR2_SPAN, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_PAIN + {SPR_PLAY, SPR2_SDTH, 4, {NULL}, 0, 0, S_PLAY_SUPER_DEAD}, // S_PLAY_SUPER_DEAD + {SPR_PLAY, SPR2_SDRN, 4, {NULL}, 0, 0, S_PLAY_SUPER_DRWN}, // S_PLAY_SUPER_DRWN + {SPR_PLAY, SPR2_SSPN, 1, {NULL}, 0, 0, S_PLAY_SUPER_SPIN}, // S_PLAY_SUPER_SPIN + {SPR_PLAY, SPR2_SGSP, 14, {NULL}, 0, 0, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_GASP + {SPR_PLAY, SPR2_SJMP, -1, {NULL}, 0, 0, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_JUMP + {SPR_PLAY, SPR2_SFAL, 2, {NULL}, 0, 0, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_FALL + {SPR_PLAY, SPR2_SEDG, 12, {NULL}, 0, 0, S_PLAY_SUPER_EDGE}, // S_PLAY_SUPER_EDGE + {SPR_PLAY, SPR2_SRID, 4, {NULL}, 0, 0, S_PLAY_SUPER_RIDE}, // S_PLAY_SUPER_RIDE + // Transforming into Super {SPR_PLAY, SPR2_TRNS, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS2}, // S_PLAY_SUPER_TRANS {SPR_PLAY, SPR2_TRNS, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS3}, // S_PLAY_SUPER_TRANS2 {SPR_PLAY, SPR2_TRNS|FF_FULLBRIGHT, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS4}, // S_PLAY_SUPER_TRANS3 @@ -3130,8 +3150,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = sfx_None, // painsound S_NULL, // meleestate S_PLAY_SPIN, // missilestate - S_PLAY_DEAD, // deathstate - S_NULL, // xdeathstate + S_PLAY_DEAD, // deathstate + S_PLAY_DRWN, // xdeathstate sfx_None, // deathsound 1, // speed 16*FRACUNIT, // radius diff --git a/src/info.h b/src/info.h index 44a3dd012..c111ead4d 100644 --- a/src/info.h +++ b/src/info.h @@ -583,6 +583,7 @@ enum playersprite SPR2_RUN , SPR2_PAIN, SPR2_DEAD, + SPR2_DRWN, SPR2_SPIN, SPR2_GASP, SPR2_JUMP, @@ -604,8 +605,15 @@ enum playersprite SPR2_SSTD, SPR2_SWLK, SPR2_SRUN, + SPR2_SPAN, + SPR2_SDTH, + SPR2_SDRN, + SPR2_SSPN, + SPR2_SGSP, + SPR2_SJMP, + SPR2_SFAL, SPR2_SEDG, - SPR2_SHIT, + SPR2_SRID, NUMPLAYERSPRITES }; @@ -634,6 +642,7 @@ typedef enum state S_PLAY_RUN, S_PLAY_PAIN, S_PLAY_DEAD, + S_PLAY_DRWN, S_PLAY_SPIN, S_PLAY_GASP, S_PLAY_JUMP, @@ -654,8 +663,15 @@ typedef enum state S_PLAY_SUPER_STND, S_PLAY_SUPER_WALK, S_PLAY_SUPER_RUN, - S_PLAY_SUPER_EDGE, S_PLAY_SUPER_PAIN, + S_PLAY_SUPER_DEAD, + S_PLAY_SUPER_DRWN, + S_PLAY_SUPER_SPIN, + S_PLAY_SUPER_GASP, + S_PLAY_SUPER_JUMP, + S_PLAY_SUPER_FALL, + S_PLAY_SUPER_EDGE, + S_PLAY_SUPER_RIDE, // SF_SUPER S_PLAY_SUPER_TRANS, diff --git a/src/p_inter.c b/src/p_inter.c index d305cfc83..1c035268f 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1953,7 +1953,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget { target->flags &= ~(MF_SOLID|MF_SHOOTABLE); // does not block P_UnsetThingPosition(target); - target->flags |= MF_NOBLOCKMAP; + target->flags |= MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY; P_SetThingPosition(target); if (!target->player->bot && !G_IsSpecialStage(gamemap) @@ -2289,7 +2289,12 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget } } else if (target->player) - P_SetPlayerMobjState(target, target->info->deathstate); + { + if (damagetype == DMG_DROWNED || damagetype == DMG_SPACEDROWN) + P_SetPlayerMobjState(target, target->info->xdeathstate); + else + P_SetPlayerMobjState(target, target->info->deathstate); + } else #ifdef DEBUG_NULL_DEATHSTATE P_SetMobjState(target, S_NULL); diff --git a/src/p_mobj.c b/src/p_mobj.c index 9565648c2..412c05dd9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -142,24 +142,29 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) { case S_PLAY_STND: case S_PLAY_WAIT: - case S_PLAY_GASP: - P_SetPlayerMobjState(mobj, S_PLAY_SUPER_STND); - return true; - case S_PLAY_FALL: - case S_PLAY_JUMP: + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_STND); case S_PLAY_WALK: - P_SetPlayerMobjState(mobj, S_PLAY_SUPER_WALK); - return true; + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_WALK); case S_PLAY_RUN: - P_SetPlayerMobjState(mobj, S_PLAY_SUPER_RUN); - return true; - case S_PLAY_EDGE: - P_SetPlayerMobjState(mobj, S_PLAY_SUPER_EDGE); - return true; + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_RUN); + case S_PLAY_PAIN: + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_PAIN); + case S_PLAY_DEAD: + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_DEAD); + case S_PLAY_DRWN: + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_DRWN); case S_PLAY_SPIN: if (!(player->charflags & SF_SUPERSPIN)) return true; - break; + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_SPIN); + case S_PLAY_GASP: + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_GASP); + case S_PLAY_JUMP: + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_JUMP); + case S_PLAY_FALL: + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_FALL); + case S_PLAY_EDGE: + return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_EDGE); default: break; } From 98ba9ca14013cf7c7cc10d48c0b4e0ea3b234a39 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Fri, 29 May 2015 01:48:56 -0400 Subject: [PATCH 02/10] Updated player->panims. Added PA_JUMP and PA_RIDE to handle new Super jump and ride, and added new animations to panim finder. --- src/d_player.h | 4 +++- src/p_map.c | 4 ++-- src/p_mobj.c | 12 +++++++++++- src/p_user.c | 34 +++++++++++++++++++++++++++------- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index b9fcdef75..c62c8c566 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -164,8 +164,10 @@ typedef enum PA_WALK, PA_RUN, PA_ROLL, + PA_JUMP, PA_FALL, - PA_ABILITY + PA_ABILITY, + PA_RIDE } panim_t; typedef enum diff --git a/src/p_map.c b/src/p_map.c index 46e32e385..d0b349d77 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -121,7 +121,7 @@ void P_DoSpring(mobj_t *spring, mobj_t *object) /*Someone want to make these work like bumpers?*/ return; } - + object->eflags |= MFE_SPRUNG; // apply this flag asap! spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify @@ -1853,7 +1853,7 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) // Don't 'step up' while springing, // Only step up "if needed". - if (thing->state-states == S_PLAY_JUMP + if (thing->player->panim == PA_JUMP && P_MobjFlip(thing)*thing->momz > FixedMul(FRACUNIT, thing->scale)) maxstep = 0; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 412c05dd9..008949bf2 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -184,7 +184,6 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) case S_PLAY_STND: case S_PLAY_WAIT: case S_PLAY_EDGE: - case S_PLAY_RIDE: case S_PLAY_SUPER_STND: case S_PLAY_SUPER_EDGE: player->panim = PA_IDLE; @@ -198,15 +197,26 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) player->panim = PA_RUN; break; case S_PLAY_SPIN: + case S_PLAY_DASH: + case S_PLAY_SUPER_SPIN: player->panim = PA_ROLL; break; + case S_PLAY_JUMP: + case S_PLAY_SUPER_JUMP: + player->panim = PA_JUMP; + break; case S_PLAY_FALL: + case S_PLAY_SUPER_FALL: player->panim = PA_FALL; break; case S_PLAY_FLY: case S_PLAY_GLIDE: player->panim = PA_ABILITY; break; + case S_PLAY_RIDE: + case S_PLAY_SUPER_RIDE: + player->panim = PA_RIDE; + break; default: player->panim = PA_ETC; break; diff --git a/src/p_user.c b/src/p_user.c index 32dc8733f..487944d18 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3438,12 +3438,32 @@ static void P_DoSuperStuff(player_t *player) { if ((player->pflags & PF_JUMPED) || (player->pflags & PF_SPINNING)) P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); - else if (player->panim == PA_RUN) - P_SetPlayerMobjState(player->mo, S_PLAY_RUN); - else if (player->panim == PA_WALK) - P_SetPlayerMobjState(player->mo, S_PLAY_WALK); - else + else switch (player->mo->state-states) + { + default: P_SetPlayerMobjState(player->mo, S_PLAY_STND); + break; + case S_PLAY_DASH: + break; + case S_PLAY_SUPER_WALK: + P_SetPlayerMobjState(player->mo, S_PLAY_WALK); + break; + case S_PLAY_SUPER_RUN: + P_SetPlayerMobjState(player->mo, S_PLAY_RUN); + break; + case S_PLAY_SUPER_PAIN: + P_SetPlayerMobjState(player->mo, S_PLAY_PAIN); + break; + case S_PLAY_SUPER_JUMP: + P_SetPlayerMobjState(player->mo, S_PLAY_JUMP); + break; + case S_PLAY_SUPER_FALL: + P_SetPlayerMobjState(player->mo, S_PLAY_FALL); + break; + case S_PLAY_SUPER_RIDE: + P_SetPlayerMobjState(player->mo, S_PLAY_RIDE); + break; + } if (!player->exiting) { @@ -6429,10 +6449,10 @@ static void P_MovePlayer(player_t *player) P_SetPlayerMobjState(player->mo, S_PLAY_WALK); // If Springing, but travelling DOWNWARD, change back! - if (player->mo->state == &states[S_PLAY_JUMP] && P_MobjFlip(player->mo)*player->mo->momz < 0) + if (player->panim == PA_JUMP && P_MobjFlip(player->mo)*player->mo->momz < 0) P_SetPlayerMobjState(player->mo, S_PLAY_FALL); // If Springing but on the ground, change back! - else if (onground && (player->mo->state == &states[S_PLAY_JUMP] || player->panim == PA_FALL || player->mo->state == &states[S_PLAY_RIDE]) && !player->mo->momz) + else if (onground && (player->panim == PA_JUMP || player->panim == PA_FALL || player->panim == PA_RIDE) && !player->mo->momz) P_SetPlayerMobjState(player->mo, S_PLAY_STND); // If you are stopped and are still walking, stand still! From b88864c666646707c5d526cf7094c4fe4b4a93b4 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Fri, 29 May 2015 01:51:15 -0400 Subject: [PATCH 03/10] Add player JUMP animation Since PA_JUMP is used to determine when springing upwards now and the nextstate isn't used for falling, the jump state can now be properly animated. :) --- src/info.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/info.c b/src/info.c index 137eabb08..65c2ed74e 100644 --- a/src/info.c +++ b/src/info.c @@ -131,7 +131,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, SPR2_DRWN, 4, {NULL}, 0, 0, S_PLAY_DRWN}, // S_PLAY_DRWN {SPR_PLAY, SPR2_SPIN, 1, {NULL}, 0, 0, S_PLAY_SPIN}, // S_PLAY_SPIN {SPR_PLAY, SPR2_GASP, 14, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_GASP - {SPR_PLAY, SPR2_JUMP, -1, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_JUMP + {SPR_PLAY, SPR2_JUMP, 2, {NULL}, 0, 0, S_PLAY_JUMP}, // S_PLAY_JUMP {SPR_PLAY, SPR2_FALL, 2, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_FALL {SPR_PLAY, SPR2_EDGE, 12, {NULL}, 0, 0, S_PLAY_EDGE}, // S_PLAY_EDGE {SPR_PLAY, SPR2_RIDE, 4, {NULL}, 0, 0, S_PLAY_RIDE}, // S_PLAY_RIDE @@ -154,7 +154,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, SPR2_SDRN, 4, {NULL}, 0, 0, S_PLAY_SUPER_DRWN}, // S_PLAY_SUPER_DRWN {SPR_PLAY, SPR2_SSPN, 1, {NULL}, 0, 0, S_PLAY_SUPER_SPIN}, // S_PLAY_SUPER_SPIN {SPR_PLAY, SPR2_SGSP, 14, {NULL}, 0, 0, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_GASP - {SPR_PLAY, SPR2_SJMP, -1, {NULL}, 0, 0, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_JUMP + {SPR_PLAY, SPR2_SJMP, 2, {NULL}, 0, 0, S_PLAY_SUPER_JUMP}, // S_PLAY_SUPER_JUMP {SPR_PLAY, SPR2_SFAL, 2, {NULL}, 0, 0, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_FALL {SPR_PLAY, SPR2_SEDG, 12, {NULL}, 0, 0, S_PLAY_SUPER_EDGE}, // S_PLAY_SUPER_EDGE {SPR_PLAY, SPR2_SRID, 4, {NULL}, 0, 0, S_PLAY_SUPER_RIDE}, // S_PLAY_SUPER_RIDE From e9c17710172225b96176c35fbbe7009603f5b9f3 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Fri, 29 May 2015 01:52:42 -0400 Subject: [PATCH 04/10] Add new spindash animation. This adds SPR2_DASH, S_PLAY_DASH, and related p_user.c changes to give charging your spindash a unique animation. --- src/dehacked.c | 1 + src/info.c | 2 ++ src/info.h | 2 ++ src/p_user.c | 10 +++++++--- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 394e12e0b..16e1ad329 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -3749,6 +3749,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_PLAY_DEAD", "S_PLAY_DRWN", "S_PLAY_SPIN", + "S_PLAY_DASH", "S_PLAY_GASP", "S_PLAY_JUMP", "S_PLAY_FALL", diff --git a/src/info.c b/src/info.c index 65c2ed74e..8dc694b5e 100644 --- a/src/info.c +++ b/src/info.c @@ -66,6 +66,7 @@ char spr2names[NUMPLAYERSPRITES][5] = "DEAD", "DRWN", "SPIN", + "DASH", "GASP", "JUMP", "FALL", @@ -130,6 +131,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, SPR2_DEAD, 4, {NULL}, 0, 0, S_PLAY_DEAD}, // S_PLAY_DEAD {SPR_PLAY, SPR2_DRWN, 4, {NULL}, 0, 0, S_PLAY_DRWN}, // S_PLAY_DRWN {SPR_PLAY, SPR2_SPIN, 1, {NULL}, 0, 0, S_PLAY_SPIN}, // S_PLAY_SPIN + {SPR_PLAY, SPR2_DASH, 2, {NULL}, 0, 0, S_PLAY_DASH}, // S_PLAY_DASH {SPR_PLAY, SPR2_GASP, 14, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_GASP {SPR_PLAY, SPR2_JUMP, 2, {NULL}, 0, 0, S_PLAY_JUMP}, // S_PLAY_JUMP {SPR_PLAY, SPR2_FALL, 2, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_FALL diff --git a/src/info.h b/src/info.h index c111ead4d..585d8c745 100644 --- a/src/info.h +++ b/src/info.h @@ -585,6 +585,7 @@ enum playersprite SPR2_DEAD, SPR2_DRWN, SPR2_SPIN, + SPR2_DASH, SPR2_GASP, SPR2_JUMP, SPR2_FALL, @@ -644,6 +645,7 @@ typedef enum state S_PLAY_DEAD, S_PLAY_DRWN, S_PLAY_SPIN, + S_PLAY_DASH, S_PLAY_GASP, S_PLAY_JUMP, S_PLAY_FALL, diff --git a/src/p_user.c b/src/p_user.c index 487944d18..22644f6f5 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3436,7 +3436,8 @@ static void P_DoSuperStuff(player_t *player) if (player->mo->health > 0) { - if ((player->pflags & PF_JUMPED) || (player->pflags & PF_SPINNING)) + if ((player->pflags & PF_JUMPED || player->pflags & PF_SPINNING) + && player->mo->state-states != S_PLAY_DASH) P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); else switch (player->mo->state-states) { @@ -3699,7 +3700,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd) player->pflags |= PF_STARTDASH|PF_SPINNING; player->dashspeed = FixedMul(FRACUNIT, player->mo->scale); player->dashtime = 0; - P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); + P_SetPlayerMobjState(player->mo, S_PLAY_DASH); player->pflags |= PF_USEDOWN; } else if ((cmd->buttons & BT_USE) && (player->pflags & PF_STARTDASH)) @@ -3756,6 +3757,7 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd) player->pflags &= ~PF_STARTDASH; if (!((gametype == GT_RACE || gametype == GT_COMPETITION) && leveltime < 4*TICRATE)) { + P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); P_InstaThrust(player->mo, player->mo->angle, player->dashspeed); // catapult forward ho!! if (!player->spectator) S_StartSound(player->mo, sfx_zoom); @@ -3763,7 +3765,9 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd) player->dashspeed = 0; } - if (onground && (player->pflags & PF_SPINNING) && !(player->panim == PA_ROLL)) + if (onground && player->pflags & PF_STARTDASH && player->mo->state-states != S_PLAY_DASH) + P_SetPlayerMobjState(player->mo, S_PLAY_DASH); + else if (onground && player->pflags & PF_SPINNING && !(player->panim == PA_ROLL)) P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); } From d680cafc6e5b3fa9dfaca8f973c7003db843c8fd Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Fri, 29 May 2015 14:25:10 -0400 Subject: [PATCH 05/10] Add fallbacks for SPR2_ animations. Every SPR2_ except for SIGN and LIFE now has a proper fallback leading down to SPR2_STND. --- src/p_mobj.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/src/p_mobj.c b/src/p_mobj.c index 008949bf2..7eafec697 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -287,6 +287,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) // Player animations if (st->sprite == SPR_PLAY) { + boolean noalt = false; UINT8 spr2 = st->frame & FF_FRAMEMASK; UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1; if (mobj->sprite != SPR_PLAY) @@ -296,6 +297,99 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) } else if (mobj->sprite2 != spr2) frame = 0; + + while (&((skin_t *)mobj->skin)->sprites[spr2].numframes == 0 && spr2 != SPR2_STND) + { + switch(spr2) + { + case SPR2_RUN: + spr2 = SPR2_WALK; + break; + case SPR2_DRWN: + spr2 = SPR2_DEAD; + break; + case SPR2_DASH: + spr2 = SPR2_SPIN; + break; + case SPR2_GASP: + spr2 = SPR2_JUMP; + break; + case SPR2_JUMP: + spr2 = SPR2_FALL; + break; + case SPR2_FALL: + spr2 = SPR2_WALK; + break; + case SPR2_RIDE: + spr2 = SPR2_FALL; + break; + + case SPR2_FLY: + spr2 = SPR2_JUMP; + break; + case SPR2_TIRE: + spr2 = SPR2_FLY; + break; + + case SPR2_GLID: + spr2 = SPR2_FLY; + break; + case SPR2_CLMB: + spr2 = SPR2_WALK; + break; + case SPR2_CLNG: + spr2 = SPR2_CLMB; + break; + + case SPR2_SIGN: + case SPR2_LIFE: + noalt = true; + break; + + // Super sprites fallback to regular sprites + case SPR2_SWLK: + spr2 = SPR2_WALK; + break; + case SPR2_SRUN: + spr2 = SPR2_RUN; + break; + case SPR2_SPAN: + spr2 = SPR2_PAIN; + break; + case SPR2_SDTH: + spr2 = SPR2_DEAD; + break; + case SPR2_SDRN: + spr2 = SPR2_DRWN; + break; + case SPR2_SSPN: + spr2 = SPR2_SPIN; + break; + case SPR2_SGSP: + spr2 = SPR2_GASP; + break; + case SPR2_SJMP: + spr2 = SPR2_JUMP; + break; + case SPR2_SFAL: + spr2 = SPR2_FALL; + break; + case SPR2_SEDG: + spr2 = SPR2_EDGE; + break; + case SPR2_SRID: + spr2 = SPR2_RIDE; + break; + + // Dunno? Just go to standing then. + default: + spr2 = SPR2_STND; + break; + } + if (noalt) + break; + } + mobj->sprite2 = spr2; if (!mobj->skin || frame >= ((skin_t *)mobj->skin)->sprites[spr2].numframes) frame = 0; From d2ef4d3e3c532ba997eba458128949c8dfbf9002 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Fri, 29 May 2015 14:57:53 -0400 Subject: [PATCH 06/10] Add S_PLAY_SUPER_STUN and PA_PAIN For Super Missiles, the Super Sonic player has a seperate animation from normal pain. --- src/d_player.h | 1 + src/info.c | 1 + src/info.h | 2 ++ src/p_inter.c | 2 +- src/p_mobj.c | 10 +++++++++- 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index c62c8c566..9c8e7da59 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -163,6 +163,7 @@ typedef enum PA_IDLE, PA_WALK, PA_RUN, + PA_PAIN, PA_ROLL, PA_JUMP, PA_FALL, diff --git a/src/info.c b/src/info.c index 8dc694b5e..2a8f7d6a7 100644 --- a/src/info.c +++ b/src/info.c @@ -152,6 +152,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, SPR2_SWLK, 7, {NULL}, 0, 0, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_WALK {SPR_PLAY, SPR2_SRUN, 7, {NULL}, 0, 0, S_PLAY_SUPER_RUN}, // S_PLAY_SUPER_RUN {SPR_PLAY, SPR2_SPAN, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_PAIN + {SPR_PLAY, SPR2_SMSL, -1, {NULL}, 0, 0, S_PLAY_SUPER_STND}, // S_PLAY_SUPER_STUN {SPR_PLAY, SPR2_SDTH, 4, {NULL}, 0, 0, S_PLAY_SUPER_DEAD}, // S_PLAY_SUPER_DEAD {SPR_PLAY, SPR2_SDRN, 4, {NULL}, 0, 0, S_PLAY_SUPER_DRWN}, // S_PLAY_SUPER_DRWN {SPR_PLAY, SPR2_SSPN, 1, {NULL}, 0, 0, S_PLAY_SUPER_SPIN}, // S_PLAY_SUPER_SPIN diff --git a/src/info.h b/src/info.h index 585d8c745..836e87e21 100644 --- a/src/info.h +++ b/src/info.h @@ -607,6 +607,7 @@ enum playersprite SPR2_SWLK, SPR2_SRUN, SPR2_SPAN, + SPR2_SMSL, SPR2_SDTH, SPR2_SDRN, SPR2_SSPN, @@ -666,6 +667,7 @@ typedef enum state S_PLAY_SUPER_WALK, S_PLAY_SUPER_RUN, S_PLAY_SUPER_PAIN, + S_PLAY_SUPER_STUN, S_PLAY_SUPER_DEAD, S_PLAY_SUPER_DRWN, S_PLAY_SUPER_SPIN, diff --git a/src/p_inter.c b/src/p_inter.c index 1c035268f..2483cf17e 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2587,7 +2587,7 @@ static inline void P_SuperDamage(player_t *player, mobj_t *inflictor, mobj_t *so P_InstaThrust(player->mo, ang, fallbackspeed); if (player->charflags & SF_SUPERANIMS) - P_SetPlayerMobjState(player->mo, S_PLAY_SUPER_PAIN); + P_SetPlayerMobjState(player->mo, S_PLAY_SUPER_STUN); else P_SetPlayerMobjState(player->mo, player->mo->info->painstate); diff --git a/src/p_mobj.c b/src/p_mobj.c index 7eafec697..be16db9c6 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -196,6 +196,11 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) case S_PLAY_SUPER_RUN: player->panim = PA_RUN; break; + case S_PLAY_PAIN: + case S_PLAY_SUPER_PAIN: + case S_PLAY_SUPER_STUN: + player->panim = PA_PAIN; + break; case S_PLAY_SPIN: case S_PLAY_DASH: case S_PLAY_SUPER_SPIN: @@ -356,6 +361,9 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) case SPR2_SPAN: spr2 = SPR2_PAIN; break; + case SPR2_SMSL: + spr2 = SPR2_SPAN; + break; case SPR2_SDTH: spr2 = SPR2_DEAD; break; @@ -2165,7 +2173,7 @@ static void P_PlayerZMovement(mobj_t *mo) goto nightsdone; } // Get up if you fell. - if (mo->state == &states[mo->info->painstate] || mo->state-states == S_PLAY_SUPER_PAIN) + if (mo->player->panim == PA_PAIN) P_SetPlayerMobjState(mo, S_PLAY_STND); if (P_MobjFlip(mo)*mo->momz < 0) // falling From 8a261ea4672e20b8d6ed66164419006c523683b2 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Fri, 29 May 2015 15:40:24 -0400 Subject: [PATCH 07/10] Fix sprite2 fallbacks. It didn't work at all before, oops. :/ --- src/p_mobj.c | 18 ++++++++++-------- src/p_user.c | 9 ++++++--- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index be16db9c6..634af46ae 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -295,15 +295,9 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) boolean noalt = false; UINT8 spr2 = st->frame & FF_FRAMEMASK; UINT16 frame = (mobj->frame & FF_FRAMEMASK)+1; - if (mobj->sprite != SPR_PLAY) - { - mobj->sprite = SPR_PLAY; - frame = 0; - } - else if (mobj->sprite2 != spr2) - frame = 0; - while (&((skin_t *)mobj->skin)->sprites[spr2].numframes == 0 && spr2 != SPR2_STND) + while (((skin_t *)mobj->skin)->sprites[spr2].numframes <= 0 + && spr2 != SPR2_STND) { switch(spr2) { @@ -398,6 +392,14 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) break; } + if (mobj->sprite != SPR_PLAY) + { + mobj->sprite = SPR_PLAY; + frame = 0; + } + else if (mobj->sprite2 != spr2) + frame = 0; + mobj->sprite2 = spr2; if (!mobj->skin || frame >= ((skin_t *)mobj->skin)->sprites[spr2].numframes) frame = 0; diff --git a/src/p_user.c b/src/p_user.c index 22644f6f5..cad107c7f 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3713,9 +3713,12 @@ static void P_DoSpinDash(player_t *player, ticcmd_t *cmd) S_StartSound(player->mo, sfx_spndsh); // Make the rev sound! // Now spawn the color thok circle. - P_SpawnSpinMobj(player, player->revitem); - if (demorecording) - G_GhostAddRev(); + if (player->mo->sprite2 != SPR2_DASH) + { + P_SpawnSpinMobj(player, player->revitem); + if (demorecording) + G_GhostAddRev(); + } } } // If not moving up or down, and travelling faster than a speed of four while not holding From b17e39a7013a7e9cc08a6940e85bc59c660e1c0d Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Fri, 29 May 2015 15:52:38 -0400 Subject: [PATCH 08/10] Add missing string constants. --- src/dehacked.c | 4 ++++ src/info.c | 1 + 2 files changed, 5 insertions(+) diff --git a/src/dehacked.c b/src/dehacked.c index 16e1ad329..5b402a005 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -3770,6 +3770,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_PLAY_SUPER_WALK", "S_PLAY_SUPER_RUN", "S_PLAY_SUPER_PAIN", + "S_PLAY_SUPER_STUN", "S_PLAY_SUPER_DEAD", "S_PLAY_SUPER_DRWN", "S_PLAY_SUPER_SPIN", @@ -7666,9 +7667,12 @@ struct { {"PA_IDLE",PA_IDLE}, {"PA_WALK",PA_WALK}, {"PA_RUN",PA_RUN}, + {"PA_PAIN",PA_PAIN}, {"PA_ROLL",PA_ROLL}, + {"PA_JUMP",PA_JUMP}, {"PA_FALL",PA_FALL}, {"PA_ABILITY",PA_ABILITY}, + {"PA_RIDE",PA_RIDE}, // Current weapon {"WEP_AUTO",WEP_AUTO}, diff --git a/src/info.c b/src/info.c index 2a8f7d6a7..3a72f992a 100644 --- a/src/info.c +++ b/src/info.c @@ -88,6 +88,7 @@ char spr2names[NUMPLAYERSPRITES][5] = "SWLK", "SRUN", "SPAN", + "SMSL", "SDTH", "SDRN", "SSPN", From ffec58c09cadfb484f60ed590b786c9a0077a570 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Thu, 18 Jun 2015 11:36:08 -0400 Subject: [PATCH 09/10] Add PA_EDGE to handle Super teeter animation bug. States were being improperly checked where a panim would be more appropriate. --- src/d_player.h | 1 + src/dehacked.c | 1 + src/p_mobj.c | 6 ++++-- src/p_user.c | 6 +++--- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 9c8e7da59..e2a1081b0 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -161,6 +161,7 @@ typedef enum // Are animation frames playing? PA_ETC=0, PA_IDLE, + PA_EDGE, PA_WALK, PA_RUN, PA_PAIN, diff --git a/src/dehacked.c b/src/dehacked.c index 5b402a005..34b1a209c 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7665,6 +7665,7 @@ struct { // Player animation (panim_t) {"PA_ETC",PA_ETC}, {"PA_IDLE",PA_IDLE}, + {"PA_EDGE",PA_EDGE}, {"PA_WALK",PA_WALK}, {"PA_RUN",PA_RUN}, {"PA_PAIN",PA_PAIN}, diff --git a/src/p_mobj.c b/src/p_mobj.c index 634af46ae..9f8806053 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -183,11 +183,13 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) { case S_PLAY_STND: case S_PLAY_WAIT: - case S_PLAY_EDGE: case S_PLAY_SUPER_STND: - case S_PLAY_SUPER_EDGE: player->panim = PA_IDLE; break; + case S_PLAY_EDGE: + case S_PLAY_SUPER_EDGE: + player->panim = PA_EDGE; + break; case S_PLAY_WALK: case S_PLAY_SUPER_WALK: player->panim = PA_WALK; diff --git a/src/p_user.c b/src/p_user.c index cad107c7f..c359fff5b 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3078,10 +3078,10 @@ teeterdone: } if (teeter) { - if (player->panim == PA_IDLE && player->mo->state-states != S_PLAY_EDGE) + if (player->panim == PA_IDLE) P_SetPlayerMobjState(player->mo, S_PLAY_EDGE); } - else if (checkedforteeter && (player->mo->state-states == S_PLAY_EDGE || player->mo->state-states == S_PLAY_SUPER_EDGE)) + else if (checkedforteeter && player->panim == PA_EDGE) P_SetPlayerMobjState(player->mo, S_PLAY_STND); } @@ -6884,7 +6884,7 @@ static void P_MovePlayer(player_t *player) } // Make sure you're not teetering when you shouldn't be. - if ((player->mo->state-states == S_PLAY_EDGE || player->mo->state-states == S_PLAY_SUPER_EDGE) + if (player->panim == PA_EDGE && (player->mo->momx || player->mo->momy || player->mo->momz)) P_SetPlayerMobjState(player->mo, S_PLAY_STND); From 496662bec59f58045ad859f729cb545aaa75fc21 Mon Sep 17 00:00:00 2001 From: Yukita Mayako Date: Fri, 19 Jun 2015 01:30:06 -0400 Subject: [PATCH 10/10] Super float animation. When Super Sonic is "walking in the air", he has a unique animation for it now which is similar to how it looked in previous SRB2 versions. --- src/dehacked.c | 1 + src/info.c | 4 +++- src/info.h | 2 ++ src/p_mobj.c | 4 ++++ src/p_user.c | 17 +++++++++++++---- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 34b1a209c..96d346c1f 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -3779,6 +3779,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_PLAY_SUPER_FALL", "S_PLAY_SUPER_EDGE", "S_PLAY_SUPER_RIDE", + "S_PLAY_SUPER_FLOAT", // SF_SUPER "S_PLAY_SUPERTRANS1", diff --git a/src/info.c b/src/info.c index 3a72f992a..8d7c249ad 100644 --- a/src/info.c +++ b/src/info.c @@ -96,7 +96,8 @@ char spr2names[NUMPLAYERSPRITES][5] = "SJMP", "SFAL", "SEDG", - "SRID" + "SRID", + "SFLT" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -162,6 +163,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, SPR2_SFAL, 2, {NULL}, 0, 0, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_FALL {SPR_PLAY, SPR2_SEDG, 12, {NULL}, 0, 0, S_PLAY_SUPER_EDGE}, // S_PLAY_SUPER_EDGE {SPR_PLAY, SPR2_SRID, 4, {NULL}, 0, 0, S_PLAY_SUPER_RIDE}, // S_PLAY_SUPER_RIDE + {SPR_PLAY, SPR2_SFLT, 7, {NULL}, 0, 0, S_PLAY_SUPER_FLOAT}, // S_PLAY_SUPER_FLOAT // Transforming into Super {SPR_PLAY, SPR2_TRNS, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS2}, // S_PLAY_SUPER_TRANS diff --git a/src/info.h b/src/info.h index 836e87e21..e313526b9 100644 --- a/src/info.h +++ b/src/info.h @@ -616,6 +616,7 @@ enum playersprite SPR2_SFAL, SPR2_SEDG, SPR2_SRID, + SPR2_SFLT, NUMPLAYERSPRITES }; @@ -676,6 +677,7 @@ typedef enum state S_PLAY_SUPER_FALL, S_PLAY_SUPER_EDGE, S_PLAY_SUPER_RIDE, + S_PLAY_SUPER_FLOAT, // SF_SUPER S_PLAY_SUPER_TRANS, diff --git a/src/p_mobj.c b/src/p_mobj.c index 9f8806053..d6ba3866c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -192,6 +192,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) break; case S_PLAY_WALK: case S_PLAY_SUPER_WALK: + case S_PLAY_SUPER_FLOAT: player->panim = PA_WALK; break; case S_PLAY_RUN: @@ -384,6 +385,9 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state) case SPR2_SRID: spr2 = SPR2_RIDE; break; + case SPR2_SFLT: + spr2 = SPR2_SWLK; + break; // Dunno? Just go to standing then. default: diff --git a/src/p_user.c b/src/p_user.c index c359fff5b..acb07a435 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6438,13 +6438,17 @@ static void P_MovePlayer(player_t *player) // MOVEMENT ANIMATIONS // ///////////////////////// - if ((cmd->forwardmove != 0 || cmd->sidemove != 0) || (player->powers[pw_super] && player->mo->z > player->mo->floorz)) + if ((cmd->forwardmove != 0 || cmd->sidemove != 0) || (player->powers[pw_super] && !onground)) { // If the player is moving fast enough, // break into a run! if (player->speed >= runspd && player->panim == PA_WALK && !player->skidtime && (onground || player->powers[pw_super])) P_SetPlayerMobjState (player->mo, S_PLAY_RUN); + // Super floating at slow speeds has its own special animation. + else if (player->powers[pw_super] && player->panim == PA_IDLE && !onground) + P_SetPlayerMobjState (player->mo, S_PLAY_SUPER_FLOAT); + // Otherwise, just walk. else if ((player->rmomx || player->rmomy) && player->panim == PA_IDLE) P_SetPlayerMobjState (player->mo, S_PLAY_WALK); @@ -6453,7 +6457,12 @@ static void P_MovePlayer(player_t *player) // If your running animation is playing, and you're // going too slow, switch back to the walking frames. if (player->panim == PA_RUN && player->speed < runspd) - P_SetPlayerMobjState(player->mo, S_PLAY_WALK); + { + if (!onground && player->powers[pw_super]) + P_SetPlayerMobjState(player->mo, S_PLAY_SUPER_FLOAT); + else + P_SetPlayerMobjState(player->mo, S_PLAY_WALK); + } // If Springing, but travelling DOWNWARD, change back! if (player->panim == PA_JUMP && P_MobjFlip(player->mo)*player->mo->momz < 0) @@ -6824,8 +6833,8 @@ static void P_MovePlayer(player_t *player) if (player->charflags & SF_SUPER && player->powers[pw_super] && player->speed > FixedMul(5<mo->scale) && P_MobjFlip(player->mo)*player->mo->momz <= 0) { - if (player->panim == PA_ROLL || player->mo->state-states == S_PLAY_PAIN) - P_SetPlayerMobjState(player->mo, S_PLAY_SUPER_WALK); + if (player->panim == PA_ROLL || player->mo->state-states == S_PLAY_PAIN || player->panim == PA_WALK) + P_SetPlayerMobjState(player->mo, S_PLAY_SUPER_FLOAT); player->mo->momz = 0; player->pflags &= ~PF_SPINNING;