It's 2am, I'll upload the exe and player.dta to the ftp later.

* Super sprites are now deliniated via an additional S_SUPER lump between S_START and S_END. Above are normal sprites, below are super sprites. Handled internally via FF_SPR2SUPER.
* Sprite2 numbers are now appropriately limited for the data type that stores them.
* SPR2_SPIN is now SPR2_ROLL, SPR2_DASH is now SPR2_SPIN and SPR2_PEEL is now SPR2_DASH. Makes more sense, right?
This commit is contained in:
toasterbabe 2017-03-11 02:09:01 +00:00
parent 8cdcb2c416
commit 75ac351940
12 changed files with 155 additions and 345 deletions

View file

@ -32,20 +32,19 @@
// Extra abilities/settings for skins (combinable stuff) // Extra abilities/settings for skins (combinable stuff)
typedef enum typedef enum
{ {
SF_SUPER = 1, // Can turn super in singleplayer/co-op mode. SF_SUPER = 1, // Can turn super in singleplayer/co-op mode?
SF_SUPERANIMS = 1<<1, // If super, use the super sonic animations SF_NOSUPERSPIN = 1<<1, // Should spin frames be played while super?
SF_SUPERSPIN = 1<<2, // Should spin frames be played while super? SF_NOSPINDASHDUST = 1<<2, // Spawn dust particles when charging a spindash?
SF_HIRES = 1<<3, // Draw the sprite 2x as small? SF_HIRES = 1<<3, // Draw the sprite at different size?
SF_NOSKID = 1<<4, // No skid particles etc SF_NOSKID = 1<<4, // No skid particles etc
SF_NOSPEEDADJUST = 1<<5, // Skin-specific version of disablespeedadjust SF_NOSPEEDADJUST = 1<<5, // Skin-specific version of disablespeedadjust
SF_RUNONWATER = 1<<6, // Run on top of water FOFs? SF_RUNONWATER = 1<<6, // Run on top of water FOFs?
SF_NOJUMPSPIN = 1<<7, // SPR2_JUMP defaults to SPR2_SPRG instead of SPR2_SPIN, falling states used, and player height is full when jumping? SF_NOJUMPSPIN = 1<<7, // SPR2_JUMP defaults to SPR2_SPRG instead of SPR2_ROLL, falling states used, and player height is full when jumping?
SF_NOJUMPDAMAGE = 1<<8, // Don't damage enemies, etc whilst jumping? SF_NOJUMPDAMAGE = 1<<8, // Don't damage enemies, etc whilst jumping?
SF_STOMPDAMAGE = 1<<9, // Always damage enemies, etc by landing on them, no matter your vunerability? SF_STOMPDAMAGE = 1<<9, // Always damage enemies, etc by landing on them, no matter your vunerability?
SF_MARIODAMAGE = SF_NOJUMPDAMAGE|SF_STOMPDAMAGE, // The Mario method of being able to damage enemies, etc. SF_MARIODAMAGE = SF_NOJUMPDAMAGE|SF_STOMPDAMAGE, // The Mario method of being able to damage enemies, etc.
SF_MACHINE = 1<<10, // Beep boop. Are you a robot? SF_MACHINE = 1<<10, // Beep boop. Are you a robot?
SF_NOSPINDASHDUST = 1<<11, // Don't spawn dust particles when charging a spindash SF_DASHMODE = 1<<11, // Sonic Advance 2 style top speed increase?
SF_DASHMODE = 1<<12, // Sonic Advance 2 style top speed increase?
// free up to and including 1<<31 // free up to and including 1<<31
} skinflags_t; } skinflags_t;
@ -175,7 +174,7 @@ typedef enum
PA_EDGE, PA_EDGE,
PA_WALK, PA_WALK,
PA_RUN, PA_RUN,
PA_PEEL, PA_DASH,
PA_PAIN, PA_PAIN,
PA_ROLL, PA_ROLL,
PA_JUMP, PA_JUMP,

View file

@ -3910,12 +3910,13 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_PLAY_WAIT", "S_PLAY_WAIT",
"S_PLAY_WALK", "S_PLAY_WALK",
"S_PLAY_RUN", "S_PLAY_RUN",
"S_PLAY_PEEL", "S_PLAY_DASH",
"S_PLAY_PAIN", "S_PLAY_PAIN",
"S_PLAY_STUN",
"S_PLAY_DEAD", "S_PLAY_DEAD",
"S_PLAY_DRWN", "S_PLAY_DRWN",
"S_PLAY_SPIN", "S_PLAY_ROLL",
"S_PLAY_DASH", "S_PLAY_SPINDASH",
"S_PLAY_GASP", "S_PLAY_GASP",
"S_PLAY_JUMP", "S_PLAY_JUMP",
"S_PLAY_SPRING", "S_PLAY_SPRING",
@ -3948,25 +3949,6 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_PLAY_MELEE", "S_PLAY_MELEE",
"S_PLAY_MELEE_FINISH", "S_PLAY_MELEE_FINISH",
// SF_SUPERANIMS
"S_PLAY_SUPER_STND",
"S_PLAY_SUPER_WALK",
"S_PLAY_SUPER_RUN",
"S_PLAY_SUPER_PEEL",
"S_PLAY_SUPER_PAIN",
"S_PLAY_SUPER_STUN",
"S_PLAY_SUPER_DEAD",
"S_PLAY_SUPER_DRWN",
"S_PLAY_SUPER_SPIN",
"S_PLAY_SUPER_GASP",
"S_PLAY_SUPER_JUMP",
"S_PLAY_SUPER_SPRING",
"S_PLAY_SUPER_FALL",
"S_PLAY_SUPER_EDGE",
"S_PLAY_SUPER_RIDE",
"S_PLAY_SUPER_FLOAT",
"S_PLAY_SUPER_FLOAT_RUN",
// SF_SUPER // SF_SUPER
"S_PLAY_SUPERTRANS1", "S_PLAY_SUPERTRANS1",
"S_PLAY_SUPERTRANS2", "S_PLAY_SUPERTRANS2",
@ -7245,6 +7227,7 @@ struct {
{"FF_FRAMEMASK",FF_FRAMEMASK}, {"FF_FRAMEMASK",FF_FRAMEMASK},
{"FF_VERTICALFLIP",FF_VERTICALFLIP}, {"FF_VERTICALFLIP",FF_VERTICALFLIP},
{"FF_PAPERSPRITE",FF_PAPERSPRITE}, {"FF_PAPERSPRITE",FF_PAPERSPRITE},
{"FF_SPR2SUPER",FF_SPR2SUPER},
{"FF_SPR2ENDSTATE",FF_SPR2ENDSTATE}, {"FF_SPR2ENDSTATE",FF_SPR2ENDSTATE},
{"FF_SPR2MIDSTART",FF_SPR2MIDSTART}, {"FF_SPR2MIDSTART",FF_SPR2MIDSTART},
{"FF_ANIMATE",FF_ANIMATE}, {"FF_ANIMATE",FF_ANIMATE},
@ -7389,8 +7372,8 @@ struct {
// Character flags (skinflags_t) // Character flags (skinflags_t)
{"SF_SUPER",SF_SUPER}, {"SF_SUPER",SF_SUPER},
{"SF_SUPERANIMS",SF_SUPERANIMS}, {"SF_NOSUPERSPIN",SF_NOSUPERSPIN},
{"SF_SUPERSPIN",SF_SUPERSPIN}, {"SF_NOSPINDASHDUST",SF_NOSPINDASHDUST},
{"SF_HIRES",SF_HIRES}, {"SF_HIRES",SF_HIRES},
{"SF_NOSKID",SF_NOSKID}, {"SF_NOSKID",SF_NOSKID},
{"SF_NOSPEEDADJUST",SF_NOSPEEDADJUST}, {"SF_NOSPEEDADJUST",SF_NOSPEEDADJUST},
@ -7400,7 +7383,6 @@ struct {
{"SF_STOMPDAMAGE",SF_STOMPDAMAGE}, {"SF_STOMPDAMAGE",SF_STOMPDAMAGE},
{"SF_MARIODAMAGE",SF_MARIODAMAGE}, {"SF_MARIODAMAGE",SF_MARIODAMAGE},
{"SF_MACHINE",SF_MACHINE}, {"SF_MACHINE",SF_MACHINE},
{"SF_NOSPINDASHDUST",SF_NOSPINDASHDUST},
{"SF_DASHMODE",SF_DASHMODE}, {"SF_DASHMODE",SF_DASHMODE},
// Character abilities! // Character abilities!
@ -7488,7 +7470,7 @@ struct {
{"PA_EDGE",PA_EDGE}, {"PA_EDGE",PA_EDGE},
{"PA_WALK",PA_WALK}, {"PA_WALK",PA_WALK},
{"PA_RUN",PA_RUN}, {"PA_RUN",PA_RUN},
{"PA_PEEL",PA_PEEL}, {"PA_DASH",PA_DASH},
{"PA_PAIN",PA_PAIN}, {"PA_PAIN",PA_PAIN},
{"PA_ROLL",PA_ROLL}, {"PA_ROLL",PA_ROLL},
{"PA_JUMP",PA_JUMP}, {"PA_JUMP",PA_JUMP},

View file

@ -390,12 +390,13 @@ char spr2names[NUMPLAYERSPRITES][5] =
"WAIT", "WAIT",
"WALK", "WALK",
"RUN_", "RUN_",
"PEEL", "DASH",
"PAIN", "PAIN",
"STUN",
"DEAD", "DEAD",
"DRWN", "DRWN",
"ROLL",
"SPIN", "SPIN",
"DASH",
"GASP", "GASP",
"JUMP", "JUMP",
"SPNG", "SPNG",
@ -403,9 +404,6 @@ char spr2names[NUMPLAYERSPRITES][5] =
"EDGE", "EDGE",
"RIDE", "RIDE",
"SIGN",
"LIFE",
"FLY_", "FLY_",
"SWIM", "SWIM",
"TIRE", "TIRE",
@ -425,23 +423,6 @@ char spr2names[NUMPLAYERSPRITES][5] =
"MLEE", "MLEE",
"TRNS", "TRNS",
"SSTD",
"SWLK",
"SRUN",
"SPEE",
"SPAN",
"SSTN",
"SDTH",
"SDRN",
"SSPN",
"SGSP",
"SJMP",
"SSPG",
"SFAL",
"SEDG",
"SRID",
"SFLT",
"SFRN",
"NTRN", "NTRN",
"NSTD", "NSTD",
@ -476,7 +457,10 @@ char spr2names[NUMPLAYERSPRITES][5] =
"DRL9", "DRL9",
"DRLA", "DRLA",
"DRLB", "DRLB",
"DRLC" "DRLC",
"SIGN",
"LIFE"
}; };
enum playersprite free_spr2 = SPR2_FIRSTFREESLOT; enum playersprite free_spr2 = SPR2_FIRSTFREESLOT;
@ -510,12 +494,13 @@ state_t states[NUMSTATES] =
{SPR_PLAY, SPR2_WAIT|FF_ANIMATE, -1, {NULL}, 0, 16, S_NULL}, // S_PLAY_WAIT {SPR_PLAY, SPR2_WAIT|FF_ANIMATE, -1, {NULL}, 0, 16, S_NULL}, // S_PLAY_WAIT
{SPR_PLAY, SPR2_WALK, 4, {NULL}, 0, 0, S_PLAY_WALK}, // S_PLAY_WALK {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_RUN , 2, {NULL}, 0, 0, S_PLAY_RUN}, // S_PLAY_RUN
{SPR_PLAY, SPR2_PEEL, 2, {NULL}, 0, 0, S_PLAY_PEEL}, // S_PLAY_PEEL {SPR_PLAY, SPR2_DASH, 2, {NULL}, 0, 0, S_PLAY_DASH}, // S_PLAY_DASH
{SPR_PLAY, SPR2_PAIN|FF_ANIMATE, 350, {NULL}, 0, 4, S_PLAY_FALL}, // S_PLAY_PAIN {SPR_PLAY, SPR2_PAIN|FF_ANIMATE, 350, {NULL}, 0, 4, S_PLAY_FALL}, // S_PLAY_PAIN
{SPR_PLAY, SPR2_STUN|FF_ANIMATE, 350, {NULL}, 0, 4, S_PLAY_FALL}, // S_PLAY_STUN
{SPR_PLAY, SPR2_DEAD|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_DEAD {SPR_PLAY, SPR2_DEAD|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_DEAD
{SPR_PLAY, SPR2_DRWN|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_DRWN {SPR_PLAY, SPR2_DRWN|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_DRWN
{SPR_PLAY, SPR2_SPIN, 1, {NULL}, 0, 0, S_PLAY_SPIN}, // S_PLAY_SPIN {SPR_PLAY, SPR2_ROLL, 1, {NULL}, 0, 0, S_PLAY_ROLL}, // S_PLAY_ROLL
{SPR_PLAY, SPR2_DASH, 2, {NULL}, 0, 0, S_PLAY_DASH}, // S_PLAY_DASH {SPR_PLAY, SPR2_SPIN, 2, {NULL}, 0, 0, S_PLAY_SPINDASH}, // S_PLAY_SPINDASH
{SPR_PLAY, SPR2_GASP|FF_ANIMATE, 14, {NULL}, 0, 4, S_PLAY_WALK}, // S_PLAY_GASP {SPR_PLAY, SPR2_GASP|FF_ANIMATE, 14, {NULL}, 0, 4, S_PLAY_WALK}, // S_PLAY_GASP
{SPR_PLAY, SPR2_JUMP, 1, {NULL}, 0, 0, S_PLAY_JUMP}, // S_PLAY_JUMP {SPR_PLAY, SPR2_JUMP, 1, {NULL}, 0, 0, S_PLAY_JUMP}, // S_PLAY_JUMP
{SPR_PLAY, SPR2_SPNG, 2, {NULL}, 0, 0, S_PLAY_SPRING}, // S_PLAY_SPRING {SPR_PLAY, SPR2_SPNG, 2, {NULL}, 0, 0, S_PLAY_SPRING}, // S_PLAY_SPRING
@ -548,25 +533,6 @@ state_t states[NUMSTATES] =
{SPR_PLAY, SPR2_MLEE|FF_SPR2ENDSTATE, 1, {NULL}, S_PLAY_MELEE_FINISH, 0, S_PLAY_MELEE}, // S_PLAY_MELEE {SPR_PLAY, SPR2_MLEE|FF_SPR2ENDSTATE, 1, {NULL}, S_PLAY_MELEE_FINISH, 0, S_PLAY_MELEE}, // S_PLAY_MELEE
{SPR_PLAY, SPR2_MLEE, 20, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_MELEE_FINISH {SPR_PLAY, SPR2_MLEE, 20, {NULL}, 0, 0, S_PLAY_FALL}, // S_PLAY_MELEE_FINISH
// SF_SUPERANIMS
{SPR_PLAY, SPR2_SSTD|FF_ANIMATE, -1, {NULL}, 0, 7, S_NULL}, // 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_SPEE, 7, {NULL}, 0, 0, S_PLAY_SUPER_PEEL}, // S_PLAY_SUPER_PEEL
{SPR_PLAY, SPR2_SPAN|FF_ANIMATE, 350, {NULL}, 0, 4, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_PAIN
{SPR_PLAY, SPR2_SSTN|FF_ANIMATE, 350, {NULL}, 0, 4, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_STUN
{SPR_PLAY, SPR2_SDTH|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_SUPER_DEAD
{SPR_PLAY, SPR2_SDRN|FF_ANIMATE, -1, {NULL}, 0, 4, S_NULL}, // S_PLAY_SUPER_DRWN
{SPR_PLAY, SPR2_SSPN, 1, {NULL}, 0, 0, S_PLAY_SUPER_SPIN}, // S_PLAY_SUPER_SPIN
{SPR_PLAY, SPR2_SGSP|FF_ANIMATE, 14, {NULL}, 0, 4, S_PLAY_SUPER_WALK}, // S_PLAY_SUPER_GASP
{SPR_PLAY, SPR2_SJMP, 1, {NULL}, 0, 0, S_PLAY_SUPER_JUMP}, // S_PLAY_SUPER_JUMP
{SPR_PLAY, SPR2_SSPG, 2, {NULL}, 0, 0, S_PLAY_SUPER_SPRING}, // S_PLAY_SUPER_SPRING
{SPR_PLAY, SPR2_SFAL, 2, {NULL}, 0, 0, S_PLAY_SUPER_FALL}, // S_PLAY_SUPER_FALL
{SPR_PLAY, SPR2_SEDG|FF_ANIMATE, -1, {NULL}, 0, 12, S_NULL}, // 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
{SPR_PLAY, SPR2_SFRN, 7, {NULL}, 0, 0, S_PLAY_SUPER_FLOAT_RUN}, // S_PLAY_SUPER_FLOAT_RUN
// SF_SUPER // SF_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_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, 4, {NULL}, 0, 0, S_PLAY_SUPER_TRANS3}, // S_PLAY_SUPER_TRANS2
@ -3078,7 +3044,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
MT_THOK, // painchance MT_THOK, // painchance
sfx_None, // painsound sfx_None, // painsound
S_NULL, // meleestate S_NULL, // meleestate
S_PLAY_SPIN, // missilestate S_PLAY_ROLL, // missilestate
S_PLAY_DEAD, // deathstate S_PLAY_DEAD, // deathstate
S_PLAY_DRWN, // xdeathstate S_PLAY_DRWN, // xdeathstate
sfx_None, // deathsound sfx_None, // deathsound

View file

@ -594,8 +594,8 @@ typedef enum sprite
NUMSPRITES NUMSPRITES
} spritenum_t; } spritenum_t;
// Make sure to be conscious of FF_FRAMEMASK whenever you change this table. // Make sure to be conscious of FF_FRAMEMASK and the fact sprite2 is stored as a UINT8 whenever you change this table.
// Currently, FF_FRAMEMASK is 0x1ff, or 511 - and NUMSPRITEFREESLOTS is 256. // Currently, FF_FRAMEMASK is 0x7f, or 127 - and the limitation of sprite2 storage is 255, so the second half is used by FF_SPR2SUPER.
// Since this is zero-based, there can be at most 256 different SPR2_'s without changing that. // Since this is zero-based, there can be at most 256 different SPR2_'s without changing that.
enum playersprite enum playersprite
{ {
@ -603,12 +603,13 @@ enum playersprite
SPR2_WAIT, SPR2_WAIT,
SPR2_WALK, SPR2_WALK,
SPR2_RUN , SPR2_RUN ,
SPR2_PEEL, SPR2_DASH,
SPR2_PAIN, SPR2_PAIN,
SPR2_STUN,
SPR2_DEAD, SPR2_DEAD,
SPR2_DRWN, // drown SPR2_DRWN, // drown
SPR2_SPIN, SPR2_ROLL,
SPR2_DASH, // spindash charge SPR2_SPIN, // spindash charge
SPR2_GASP, SPR2_GASP,
SPR2_JUMP, SPR2_JUMP,
SPR2_SPNG, // spring SPR2_SPNG, // spring
@ -616,9 +617,6 @@ enum playersprite
SPR2_EDGE, SPR2_EDGE,
SPR2_RIDE, SPR2_RIDE,
SPR2_SIGN, // end sign head
SPR2_LIFE, // life monitor icon
SPR2_FLY , SPR2_FLY ,
SPR2_SWIM, SPR2_SWIM,
SPR2_TIRE, // tired SPR2_TIRE, // tired
@ -638,23 +636,6 @@ enum playersprite
SPR2_MLEE, // melee SPR2_MLEE, // melee
SPR2_TRNS, // super transformation SPR2_TRNS, // super transformation
SPR2_SSTD, // super stand
SPR2_SWLK, // super walk
SPR2_SRUN, // super run
SPR2_SPEE, // super peelout
SPR2_SPAN, // super pain
SPR2_SSTN, // super stun
SPR2_SDTH, // super death
SPR2_SDRN, // super drown
SPR2_SSPN, // super spin
SPR2_SGSP, // super gasp
SPR2_SJMP, // super jump
SPR2_SSPG, // super spring
SPR2_SFAL, // super fall
SPR2_SEDG, // super edge
SPR2_SRID, // super ride
SPR2_SFLT, // super float
SPR2_SFRN, // super float run
SPR2_NTRN, // NiGHTS transformation SPR2_NTRN, // NiGHTS transformation
SPR2_NSTD, // NiGHTS stand SPR2_NSTD, // NiGHTS stand
@ -693,8 +674,11 @@ enum playersprite
SPR2_DRLB, SPR2_DRLB,
SPR2_DRLC, SPR2_DRLC,
SPR2_SIGN, // end sign head
SPR2_LIFE, // life monitor icon
SPR2_FIRSTFREESLOT, SPR2_FIRSTFREESLOT,
SPR2_LASTFREESLOT = SPR2_FIRSTFREESLOT + NUMSPRITEFREESLOTS - 1, SPR2_LASTFREESLOT = 0x7f,
NUMPLAYERSPRITES NUMPLAYERSPRITES
}; };
@ -720,12 +704,13 @@ typedef enum state
S_PLAY_WAIT, S_PLAY_WAIT,
S_PLAY_WALK, S_PLAY_WALK,
S_PLAY_RUN, S_PLAY_RUN,
S_PLAY_PEEL, S_PLAY_DASH,
S_PLAY_PAIN, S_PLAY_PAIN,
S_PLAY_STUN,
S_PLAY_DEAD, S_PLAY_DEAD,
S_PLAY_DRWN, S_PLAY_DRWN,
S_PLAY_SPIN, S_PLAY_ROLL,
S_PLAY_DASH, S_PLAY_SPINDASH,
S_PLAY_GASP, S_PLAY_GASP,
S_PLAY_JUMP, S_PLAY_JUMP,
S_PLAY_SPRING, S_PLAY_SPRING,
@ -758,25 +743,6 @@ typedef enum state
S_PLAY_MELEE, S_PLAY_MELEE,
S_PLAY_MELEE_FINISH, S_PLAY_MELEE_FINISH,
// SF_SUPERANIMS
S_PLAY_SUPER_STND,
S_PLAY_SUPER_WALK,
S_PLAY_SUPER_RUN,
S_PLAY_SUPER_PEEL,
S_PLAY_SUPER_PAIN,
S_PLAY_SUPER_STUN,
S_PLAY_SUPER_DEAD,
S_PLAY_SUPER_DRWN,
S_PLAY_SUPER_SPIN,
S_PLAY_SUPER_GASP,
S_PLAY_SUPER_JUMP,
S_PLAY_SUPER_SPRING,
S_PLAY_SUPER_FALL,
S_PLAY_SUPER_EDGE,
S_PLAY_SUPER_RIDE,
S_PLAY_SUPER_FLOAT,
S_PLAY_SUPER_FLOAT_RUN,
// SF_SUPER // SF_SUPER
S_PLAY_SUPER_TRANS, S_PLAY_SUPER_TRANS,
S_PLAY_SUPER_TRANS2, S_PLAY_SUPER_TRANS2,

View file

@ -352,7 +352,7 @@ static int lib_pIsValidSprite2(lua_State *L)
//HUDSAFE //HUDSAFE
if (!mobj) if (!mobj)
return LUA_ErrInvalid(L, "mobj_t"); return LUA_ErrInvalid(L, "mobj_t");
lua_pushboolean(L, (mobj->skin && (((skin_t *)mobj->skin)->sprites[spr2].numframes > 0))); lua_pushboolean(L, (mobj->skin && (((skin_t *)mobj->skin)->sprites[spr2].numframes)));
return 1; return 1;
} }

View file

@ -1472,7 +1472,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
{ {
player->powers[pw_carry] = CR_MACESPIN; player->powers[pw_carry] = CR_MACESPIN;
S_StartSound(toucher, sfx_spin); S_StartSound(toucher, sfx_spin);
P_SetPlayerMobjState(toucher, S_PLAY_SPIN); P_SetPlayerMobjState(toucher, S_PLAY_ROLL);
} }
else else
player->powers[pw_carry] = CR_GENERIC; player->powers[pw_carry] = CR_GENERIC;
@ -2829,10 +2829,7 @@ static inline void P_SuperDamage(player_t *player, mobj_t *inflictor, mobj_t *so
P_InstaThrust(player->mo, ang, fallbackspeed); P_InstaThrust(player->mo, ang, fallbackspeed);
if (player->charflags & SF_SUPERANIMS) P_SetPlayerMobjState(player->mo, S_PLAY_STUN);
P_SetPlayerMobjState(player->mo, S_PLAY_SUPER_STUN);
else
P_SetPlayerMobjState(player->mo, player->mo->info->painstate);
P_ResetPlayer(player); P_ResetPlayer(player);

View file

@ -187,32 +187,49 @@ static void P_CyclePlayerMobjState(mobj_t *mobj)
// //
// P_GetMobjSprite2 // P_GetMobjSprite2
// For non-super players, tries each sprite2's immediate predecessor until it finds one with a number of frames or ends up at standing.
// For super players, does the same as above - but tries the super equivalent for each sprite2 before the non-super version.
// //
UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2) UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
{ {
player_t *player = mobj->player; player_t *player = mobj->player;
skin_t *skin = ((skin_t *)mobj->skin); skin_t *skin = ((skin_t *)mobj->skin);
boolean super = false;
if (!skin) if (!skin)
return 0; return 0;
while ((skin->sprites[spr2].numframes <= 0) if ((super = (player // only manipulate output if player...
&& (player->powers[pw_super] // and (if they're super...
|| ((player->pflags & PF_NIGHTSMODE) && (skin->flags & SF_SUPER)))))) // or if they're in nights and are a skin that CAN go super...)
spr2 |= FF_SPR2SUPER;
while (!(skin->sprites[spr2].numframes)
&& spr2 != SPR2_STND) && spr2 != SPR2_STND)
{ {
if (spr2 & FF_SPR2SUPER)
{
spr2 &= ~FF_SPR2SUPER;
continue;
}
switch(spr2) switch(spr2)
{ {
case SPR2_PEEL: case SPR2_DASH:
spr2 = SPR2_RUN; spr2 = SPR2_RUN ;
break; break;
case SPR2_RUN: case SPR2_RUN:
spr2 = SPR2_WALK; spr2 = SPR2_WALK;
break; break;
case SPR2_STUN:
spr2 = SPR2_PAIN;
break;
case SPR2_DRWN: case SPR2_DRWN:
spr2 = SPR2_DEAD; spr2 = SPR2_DEAD;
break; break;
case SPR2_DASH: case SPR2_SPIN:
spr2 = SPR2_SPIN; spr2 = SPR2_ROLL;
break; break;
case SPR2_GASP: case SPR2_GASP:
spr2 = SPR2_SPNG; spr2 = SPR2_SPNG;
@ -221,7 +238,7 @@ UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
spr2 = ((player spr2 = ((player
? player->charflags ? player->charflags
: skin->flags) : skin->flags)
& SF_NOJUMPSPIN) ? SPR2_SPNG : SPR2_SPIN; & SF_NOJUMPSPIN) ? SPR2_SPNG : SPR2_ROLL;
break; break;
case SPR2_SPNG: // spring case SPR2_SPNG: // spring
spr2 = SPR2_FALL; spr2 = SPR2_FALL;
@ -247,7 +264,7 @@ UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
spr2 = SPR2_FLY; spr2 = SPR2_FLY;
break; break;
case SPR2_CLMB: case SPR2_CLMB:
spr2 = SPR2_SPIN; spr2 = SPR2_ROLL;
break; break;
case SPR2_CLNG: case SPR2_CLNG:
spr2 = SPR2_CLMB; spr2 = SPR2_CLMB;
@ -264,79 +281,26 @@ UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
spr2 = SPR2_FALL; spr2 = SPR2_FALL;
break; break;
case SPR2_BLND: case SPR2_BLND:
spr2 = SPR2_SPIN; spr2 = SPR2_ROLL;
break; break;
case SPR2_TWIN: case SPR2_TWIN:
spr2 = SPR2_SPIN; spr2 = SPR2_ROLL;
break; break;
case SPR2_MLEE: case SPR2_MLEE:
spr2 = SPR2_TWIN; spr2 = SPR2_TWIN;
break; break;
// Super sprites fallback to regular sprites
case SPR2_SWLK:
spr2 = SPR2_WALK;
break;
case SPR2_SRUN:
spr2 = SPR2_RUN;
break;
case SPR2_SPEE:
spr2 = SPR2_PEEL;
break;
case SPR2_SPAN:
spr2 = SPR2_PAIN;
break;
case SPR2_SSTN:
spr2 = SPR2_SPAN;
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 = ((player
? player->charflags
: skin->flags)
& SF_NOJUMPSPIN) ? SPR2_SSPG : SPR2_SSPN;
break;
case SPR2_SSPG:
spr2 = SPR2_SPNG;
break;
case SPR2_SFAL:
spr2 = SPR2_FALL;
break;
case SPR2_SEDG:
spr2 = SPR2_EDGE;
break;
case SPR2_SRID:
spr2 = SPR2_RIDE;
break;
case SPR2_SFLT:
spr2 = SPR2_SWLK;
break;
case SPR2_SFRN:
spr2 = SPR2_SRUN;
break;
// NiGHTS sprites. // NiGHTS sprites.
case SPR2_NTRN: case SPR2_NTRN:
spr2 = SPR2_TRNS; spr2 = SPR2_TRNS;
break; break;
case SPR2_NSTD: case SPR2_NSTD:
spr2 = SPR2_SSTD; spr2 = SPR2_STND;
break; break;
case SPR2_NFLT: case SPR2_NFLT:
spr2 = (skin->flags & SF_SUPERANIMS) ? SPR2_SFLT : SPR2_FALL; // This is skin-exclusive so the default NiGHTS skin changing system plays nice. spr2 = SPR2_FLT ;
break; break;
case SPR2_NPUL: case SPR2_NPUL:
spr2 = SPR2_NFLT; spr2 = SPR2_NFLT;
@ -345,10 +309,10 @@ UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
spr2 = SPR2_NPUL; spr2 = SPR2_NPUL;
break; break;
case SPR2_NATK: case SPR2_NATK:
spr2 = SPR2_SSPN; spr2 = SPR2_ROLL;
break; break;
/*case SPR2_NGT0: /*case SPR2_NGT0:
spr2 = SPR2_STND; spr2 = SPR2_NFLT;
break;*/ break;*/
case SPR2_NGT1: case SPR2_NGT1:
case SPR2_NGT7: case SPR2_NGT7:
@ -407,7 +371,11 @@ UINT8 P_GetMobjSprite2(mobj_t *mobj, UINT8 spr2)
spr2 = SPR2_STND; spr2 = SPR2_STND;
break; break;
} }
if (super)
spr2 |= FF_SPR2SUPER;
} }
return spr2; return spr2;
} }
@ -444,49 +412,12 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
else if (state == S_PLAY_SWIM && !(player->mo->eflags & MFE_UNDERWATER)) else if (state == S_PLAY_SWIM && !(player->mo->eflags & MFE_UNDERWATER))
return P_SetPlayerMobjState(player->mo, S_PLAY_FLY); return P_SetPlayerMobjState(player->mo, S_PLAY_FLY);
// Catch state changes for Super Sonic // Catch SF_NOSUPERSPIN jumps for Supers
if (player->powers[pw_super] && (player->charflags & SF_SUPERANIMS)) if (player->powers[pw_super])
{ {
switch (state) if ((player->charflags & SF_NOSUPERSPIN)
{ && (state == S_PLAY_ROLL || state == S_PLAY_JUMP))
case S_PLAY_STND:
case S_PLAY_WAIT:
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_STND);
case S_PLAY_WALK:
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_WALK);
case S_PLAY_RUN:
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_RUN);
case S_PLAY_PEEL:
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_PEEL);
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; return true;
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_SPIN);
case S_PLAY_GASP:
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_GASP);
case S_PLAY_JUMP:
if (!(player->charflags & SF_SUPERSPIN))
return true;
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_JUMP);
case S_PLAY_SPRING:
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_SPRING);
case S_PLAY_FALL:
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_FALL);
case S_PLAY_EDGE:
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_EDGE);
case S_PLAY_FLOAT:
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_FLOAT);
case S_PLAY_FLOAT_RUN:
return P_SetPlayerMobjState(mobj, S_PLAY_SUPER_FLOAT_RUN);
default:
break;
}
} }
// You were in pain state after taking a hit, and you're moving out of pain state now? // You were in pain state after taking a hit, and you're moving out of pain state now?
else if (mobj->state == &states[mobj->info->painstate] && player->powers[pw_flashing] == flashingtics && state != mobj->info->painstate) else if (mobj->state == &states[mobj->info->painstate] && player->powers[pw_flashing] == flashingtics && state != mobj->info->painstate)
@ -502,49 +433,37 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
{ {
case S_PLAY_STND: case S_PLAY_STND:
case S_PLAY_WAIT: case S_PLAY_WAIT:
case S_PLAY_SUPER_STND:
player->panim = PA_IDLE; player->panim = PA_IDLE;
break; break;
case S_PLAY_EDGE: case S_PLAY_EDGE:
case S_PLAY_SUPER_EDGE:
player->panim = PA_EDGE; player->panim = PA_EDGE;
break; break;
case S_PLAY_WALK: case S_PLAY_WALK:
case S_PLAY_FLOAT: case S_PLAY_FLOAT:
case S_PLAY_SUPER_WALK:
case S_PLAY_SUPER_FLOAT:
player->panim = PA_WALK; player->panim = PA_WALK;
break; break;
case S_PLAY_RUN: case S_PLAY_RUN:
case S_PLAY_FLOAT_RUN: case S_PLAY_FLOAT_RUN:
case S_PLAY_SUPER_RUN:
case S_PLAY_SUPER_FLOAT_RUN:
player->panim = PA_RUN; player->panim = PA_RUN;
break; break;
case S_PLAY_PEEL: case S_PLAY_DASH:
case S_PLAY_SUPER_PEEL: player->panim = PA_DASH;
player->panim = PA_PEEL;
break; break;
case S_PLAY_PAIN: case S_PLAY_PAIN:
case S_PLAY_SUPER_PAIN: case S_PLAY_STUN:
case S_PLAY_SUPER_STUN:
player->panim = PA_PAIN; player->panim = PA_PAIN;
break; break;
case S_PLAY_SPIN: case S_PLAY_ROLL:
//case S_PLAY_DASH: -- everyone can ROLL thanks to zoom tubes... //case S_PLAY_SPINDASH: -- everyone can ROLL thanks to zoom tubes...
case S_PLAY_SUPER_SPIN:
player->panim = PA_ROLL; player->panim = PA_ROLL;
break; break;
case S_PLAY_JUMP: case S_PLAY_JUMP:
case S_PLAY_SUPER_JUMP:
player->panim = PA_JUMP; player->panim = PA_JUMP;
break; break;
case S_PLAY_SPRING: case S_PLAY_SPRING:
case S_PLAY_SUPER_SPRING:
player->panim = PA_SPRING; player->panim = PA_SPRING;
break; break;
case S_PLAY_FALL: case S_PLAY_FALL:
case S_PLAY_SUPER_FALL:
player->panim = PA_FALL; player->panim = PA_FALL;
break; break;
case S_PLAY_FLY: case S_PLAY_FLY:
@ -555,13 +474,12 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
case S_PLAY_TWINSPIN: case S_PLAY_TWINSPIN:
player->panim = PA_ABILITY; player->panim = PA_ABILITY;
break; break;
case S_PLAY_DASH: // ...but the act of SPINDASHING is charability2 specific. case S_PLAY_SPINDASH: // ...but the act of SPINDASHING is charability2 specific.
case S_PLAY_MELEE: case S_PLAY_MELEE:
case S_PLAY_MELEE_FINISH: case S_PLAY_MELEE_FINISH:
player->panim = PA_ABILITY2; player->panim = PA_ABILITY2;
break; break;
case S_PLAY_RIDE: case S_PLAY_RIDE:
case S_PLAY_SUPER_RIDE:
player->panim = PA_RIDE; player->panim = PA_RIDE;
break; break;
default: default:
@ -635,7 +553,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
else else
mobj->tics = 4; mobj->tics = 4;
} }
else if ((player->panim == PA_RUN) || (player->panim == PA_PEEL)) else if ((player->panim == PA_RUN) || (player->panim == PA_DASH))
{ {
if (speed > 52<<FRACBITS) if (speed > 52<<FRACBITS)
mobj->tics = 1; mobj->tics = 1;
@ -3299,26 +3217,26 @@ static void P_PlayerZMovement(mobj_t *mo)
{ {
if (mo->player->cmomx || mo->player->cmomy) if (mo->player->cmomx || mo->player->cmomy)
{ {
if (mo->player->charflags & SF_DASHMODE && mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL) if (mo->player->charflags & SF_DASHMODE && mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_DASH)
P_SetPlayerMobjState(mo, S_PLAY_PEEL); P_SetPlayerMobjState(mo, S_PLAY_DASH);
else if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) else if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale)
&& (mo->player->panim != PA_RUN || mo->state-states == S_PLAY_FLOAT_RUN || mo->state-states == S_PLAY_SUPER_FLOAT_RUN)) && (mo->player->panim != PA_RUN || mo->state-states == S_PLAY_FLOAT_RUN || mo->sprite2 & FF_SPR2SUPER))
P_SetPlayerMobjState(mo, S_PLAY_RUN); P_SetPlayerMobjState(mo, S_PLAY_RUN);
else if ((mo->player->rmomx || mo->player->rmomy) else if ((mo->player->rmomx || mo->player->rmomy)
&& (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_FLOAT || mo->state-states == S_PLAY_SUPER_FLOAT)) && (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_FLOAT || mo->sprite2 & FF_SPR2SUPER))
P_SetPlayerMobjState(mo, S_PLAY_WALK); P_SetPlayerMobjState(mo, S_PLAY_WALK);
else if (!mo->player->rmomx && !mo->player->rmomy && mo->player->panim != PA_IDLE) else if (!mo->player->rmomx && !mo->player->rmomy && mo->player->panim != PA_IDLE)
P_SetPlayerMobjState(mo, S_PLAY_STND); P_SetPlayerMobjState(mo, S_PLAY_STND);
} }
else else
{ {
if (mo->player->charflags & SF_DASHMODE && mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_PEEL) if (mo->player->charflags & SF_DASHMODE && mo->player->dashmode >= 3*TICRATE && mo->player->panim != PA_DASH)
P_SetPlayerMobjState(mo, S_PLAY_PEEL); P_SetPlayerMobjState(mo, S_PLAY_DASH);
else if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale) else if (mo->player->speed >= FixedMul(mo->player->runspeed, mo->scale)
&& (mo->player->panim != PA_RUN || mo->state-states == S_PLAY_FLOAT_RUN || mo->state-states == S_PLAY_SUPER_FLOAT_RUN)) && (mo->player->panim != PA_RUN || mo->state-states == S_PLAY_FLOAT_RUN || mo->sprite2 & FF_SPR2SUPER))
P_SetPlayerMobjState(mo, S_PLAY_RUN); P_SetPlayerMobjState(mo, S_PLAY_RUN);
else if ((mo->momx || mo->momy) else if ((mo->momx || mo->momy)
&& (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_FLOAT || mo->state-states == S_PLAY_SUPER_FLOAT)) && (mo->player->panim != PA_WALK || mo->state-states == S_PLAY_FLOAT || mo->sprite2 & FF_SPR2SUPER))
P_SetPlayerMobjState(mo, S_PLAY_WALK); P_SetPlayerMobjState(mo, S_PLAY_WALK);
else if (!mo->momx && !mo->momy && mo->player->panim != PA_IDLE) else if (!mo->momx && !mo->momy && mo->player->panim != PA_IDLE)
P_SetPlayerMobjState(mo, S_PLAY_STND); P_SetPlayerMobjState(mo, S_PLAY_STND);
@ -3328,7 +3246,7 @@ static void P_PlayerZMovement(mobj_t *mo)
if ((mo->player->charability2 == CA2_SPINDASH) && !(mo->player->pflags & PF_THOKKED) && (mo->player->cmd.buttons & BT_USE) && (FixedHypot(mo->momx, mo->momy) > (5*mo->scale))) if ((mo->player->charability2 == CA2_SPINDASH) && !(mo->player->pflags & PF_THOKKED) && (mo->player->cmd.buttons & BT_USE) && (FixedHypot(mo->momx, mo->momy) > (5*mo->scale)))
{ {
mo->player->pflags |= PF_SPINNING; mo->player->pflags |= PF_SPINNING;
P_SetPlayerMobjState(mo, S_PLAY_SPIN); P_SetPlayerMobjState(mo, S_PLAY_ROLL);
S_StartSound(mo, sfx_spin); S_StartSound(mo, sfx_spin);
} }
else else

View file

@ -35,9 +35,11 @@
#pragma interface #pragma interface
#endif #endif
/// \brief Frame flags: only the frame number - 0 to 511 (Frames from 0 to 63, Sprite2 number uses full range) /// \brief Frame flags: only the frame number - 0 to 127 (Frames from 0 to 63, Sprite2 number uses full range)
#define FF_FRAMEMASK 0x1ff #define FF_FRAMEMASK 0x7f
/// \brief Frame flags - SPR2: Super sprite2
#define FF_SPR2SUPER 0x80
/// \brief Frame flags - SPR2: A change of state at the end of Sprite2 animation /// \brief Frame flags - SPR2: A change of state at the end of Sprite2 animation
#define FF_SPR2ENDSTATE 0x1000 #define FF_SPR2ENDSTATE 0x1000
/// \brief Frame flags - SPR2: 50% of starting in middle of Sprite2 animation /// \brief Frame flags - SPR2: 50% of starting in middle of Sprite2 animation

View file

@ -3747,7 +3747,7 @@ DoneSection2:
if (!(player->pflags & PF_SPINNING)) if (!(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_ROLL);
} }
player->powers[pw_flashing] = TICRATE/3; player->powers[pw_flashing] = TICRATE/3;
@ -3908,7 +3908,7 @@ DoneSection2:
if (!(player->pflags & PF_SPINNING) && P_IsObjectOnGround(player->mo) && (player->charability2 == CA2_SPINDASH)) if (!(player->pflags & PF_SPINNING) && P_IsObjectOnGround(player->mo) && (player->charability2 == CA2_SPINDASH))
{ {
player->pflags |= PF_SPINNING; player->pflags |= PF_SPINNING;
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
S_StartAttackSound(player->mo, sfx_spin); S_StartAttackSound(player->mo, sfx_spin);
if (abs(player->rmomx) < FixedMul(5*FRACUNIT, player->mo->scale) if (abs(player->rmomx) < FixedMul(5*FRACUNIT, player->mo->scale)
@ -3988,9 +3988,9 @@ DoneSection2:
player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY); player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
player->climbing = 0; player->climbing = 0;
if (player->mo->state-states != S_PLAY_SPIN) if (player->mo->state-states != S_PLAY_ROLL)
{ {
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
S_StartSound(player->mo, sfx_spin); S_StartSound(player->mo, sfx_spin);
} }
} }
@ -4068,9 +4068,9 @@ DoneSection2:
player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY); player->pflags &= ~(PF_JUMPED|PF_GLIDING|PF_SLIDING|PF_CANCARRY);
player->climbing = 0; player->climbing = 0;
if (player->mo->state-states != S_PLAY_SPIN) if (player->mo->state-states != S_PLAY_ROLL)
{ {
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
S_StartSound(player->mo, sfx_spin); S_StartSound(player->mo, sfx_spin);
} }
} }

View file

@ -3506,42 +3506,8 @@ static void P_DoSuperStuff(player_t *player)
if (gametype != GT_COOP) if (gametype != GT_COOP)
player->powers[pw_flashing] = flashingtics-1; player->powers[pw_flashing] = flashingtics-1;
if (player->mo->health > 0) if ((player->mo->health > 0) && (player->mo->sprite2 & FF_SPR2SUPER))
{ P_SetPlayerMobjState(player->mo, player->mo->state-states);
if (player->pflags & PF_JUMPED)
P_SetPlayerMobjState(player->mo, S_PLAY_JUMP);
else if (player->pflags & PF_SPINNING && player->mo->state-states != S_PLAY_DASH)
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
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_PEEL:
P_SetPlayerMobjState(player->mo, S_PLAY_PEEL);
break;
case S_PLAY_SUPER_PAIN:
P_SetPlayerMobjState(player->mo, S_PLAY_PAIN);
break;
case S_PLAY_SUPER_SPRING:
P_SetPlayerMobjState(player->mo, S_PLAY_SPRING);
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;
}
}
// Inform the netgame that the champion has fallen in the heat of battle. // Inform the netgame that the champion has fallen in the heat of battle.
if (gametype != GT_COOP) if (gametype != GT_COOP)
@ -3807,7 +3773,7 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
player->mo->momy = player->cmomy; player->mo->momy = player->cmomy;
player->pflags |= PF_STARTDASH|PF_SPINNING; player->pflags |= PF_STARTDASH|PF_SPINNING;
player->dashspeed = player->mindash; player->dashspeed = player->mindash;
P_SetPlayerMobjState(player->mo, S_PLAY_DASH); P_SetPlayerMobjState(player->mo, S_PLAY_SPINDASH);
player->pflags |= PF_USEDOWN; player->pflags |= PF_USEDOWN;
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.
@ -3840,7 +3806,7 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|| !canstand) && !(player->pflags & (PF_USEDOWN|PF_SPINNING))) || !canstand) && !(player->pflags & (PF_USEDOWN|PF_SPINNING)))
{ {
player->pflags |= PF_SPINNING; player->pflags |= PF_SPINNING;
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
if (!player->spectator) if (!player->spectator)
S_StartSound(player->mo, sfx_spin); S_StartSound(player->mo, sfx_spin);
player->pflags |= PF_USEDOWN; player->pflags |= PF_USEDOWN;
@ -3896,7 +3862,7 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
{ {
if (player->dashspeed) if (player->dashspeed)
{ {
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
P_InstaThrust(player->mo, player->mo->angle, FixedMul(player->dashspeed, player->mo->scale)); // catapult forward ho!! P_InstaThrust(player->mo, player->mo->angle, FixedMul(player->dashspeed, player->mo->scale)); // catapult forward ho!!
} }
else else
@ -3914,14 +3880,14 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
if (onground && player->pflags & PF_STARTDASH) if (onground && player->pflags & PF_STARTDASH)
{ {
if (player->mo->state-states != S_PLAY_DASH) if (player->mo->state-states != S_PLAY_SPINDASH)
P_SetPlayerMobjState(player->mo, S_PLAY_DASH); P_SetPlayerMobjState(player->mo, S_PLAY_SPINDASH);
// Spawn spin dash dust // Spawn spin dash dust
if (!(player->charflags & SF_NOSPINDASHDUST) && !(player->mo->eflags & MFE_GOOWATER)) if (!(player->charflags & SF_NOSPINDASHDUST) && !(player->mo->eflags & MFE_GOOWATER))
P_DoSpinDashDust(player); 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_ROLL);
} }
// //
@ -4281,7 +4247,7 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
if (!(player->pflags & PF_THOKKED) || player->charability2 == CA2_MULTIABILITY) if (!(player->pflags & PF_THOKKED) || player->charability2 == CA2_MULTIABILITY)
{ {
if (player->charflags & SF_DASHMODE && player->dashmode >= 3*TICRATE) if (player->charflags & SF_DASHMODE && player->dashmode >= 3*TICRATE)
P_SetPlayerMobjState(player->mo, S_PLAY_PEEL); P_SetPlayerMobjState(player->mo, S_PLAY_DASH);
else if (player->speed >= FixedMul(player->runspeed, player->mo->scale)) else if (player->speed >= FixedMul(player->runspeed, player->mo->scale))
P_SetPlayerMobjState(player->mo, S_PLAY_FLOAT_RUN); P_SetPlayerMobjState(player->mo, S_PLAY_FLOAT_RUN);
else else
@ -6721,7 +6687,7 @@ static void P_MovePlayer(player_t *player)
{ {
// If the player is in dashmode, here's their peelout. // If the player is in dashmode, here's their peelout.
if (player->charflags & SF_DASHMODE && player->dashmode >= 3*TICRATE && player->panim == PA_RUN && !player->skidtime && (onground || ((player->charability == CA_FLOAT || player->charability == CA_SLOWFALL) && player->secondjump == 1) || player->powers[pw_super])) if (player->charflags & SF_DASHMODE && player->dashmode >= 3*TICRATE && player->panim == PA_RUN && !player->skidtime && (onground || ((player->charability == CA_FLOAT || player->charability == CA_SLOWFALL) && player->secondjump == 1) || player->powers[pw_super]))
P_SetPlayerMobjState (player->mo, S_PLAY_PEEL); P_SetPlayerMobjState (player->mo, S_PLAY_DASH);
// If the player is moving fast enough, // If the player is moving fast enough,
// break into a run! // break into a run!
else if (player->speed >= runspd && player->panim == PA_WALK && !player->skidtime else if (player->speed >= runspd && player->panim == PA_WALK && !player->skidtime
@ -6744,7 +6710,7 @@ static void P_MovePlayer(player_t *player)
// If your peelout animation is playing, and you're // If your peelout animation is playing, and you're
// going too slow, switch back to the run. // going too slow, switch back to the run.
if (player->charflags & SF_DASHMODE && player->panim == PA_PEEL && player->dashmode < 3*TICRATE) if (player->charflags & SF_DASHMODE && player->panim == PA_DASH && player->dashmode < 3*TICRATE)
P_SetPlayerMobjState(player->mo, S_PLAY_RUN); P_SetPlayerMobjState(player->mo, S_PLAY_RUN);
// If your running animation is playing, and you're // If your running animation is playing, and you're
@ -7106,7 +7072,7 @@ static void P_MovePlayer(player_t *player)
#endif #endif
} }
// Otherwise, face the direction you're travelling. // Otherwise, face the direction you're travelling.
else if (player->panim == PA_WALK || player->panim == PA_RUN || player->panim == PA_PEEL || player->panim == PA_ROLL || player->panim == PA_JUMP else if (player->panim == PA_WALK || player->panim == PA_RUN || player->panim == PA_DASH || player->panim == PA_ROLL || player->panim == PA_JUMP
|| (player->panim == PA_ABILITY && player->mo->state-states == S_PLAY_GLIDE)) || (player->panim == PA_ABILITY && player->mo->state-states == S_PLAY_GLIDE))
player->mo->angle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy); player->mo->angle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy);
@ -7132,9 +7098,8 @@ static void P_MovePlayer(player_t *player)
&& (player->speed > 5*player->mo->scale) // FixedMul(5<<FRACBITS, player->mo->scale), but scale is FRACUNIT-based && (player->speed > 5*player->mo->scale) // FixedMul(5<<FRACBITS, player->mo->scale), but scale is FRACUNIT-based
&& (P_MobjFlip(player->mo)*player->mo->momz <= 0)) && (P_MobjFlip(player->mo)*player->mo->momz <= 0))
{ {
if (player->panim == PA_PAIN || player->panim == PA_JUMP || player->panim == PA_FALL if (player->panim != PA_RUN && player->mo->state-states != S_PLAY_FLOAT)
|| (player->panim == PA_WALK && player->mo->state-states != S_PLAY_SUPER_FLOAT)) P_SetPlayerMobjState(player->mo, S_PLAY_FLOAT);
P_SetPlayerMobjState(player->mo, S_PLAY_SUPER_FLOAT);
player->mo->momz = 0; player->mo->momz = 0;
player->pflags &= ~PF_SPINNING; player->pflags &= ~PF_SPINNING;
@ -7177,7 +7142,7 @@ static void P_MovePlayer(player_t *player)
if (P_LookForEnemies(player, false) && player->mo->tracer) if (P_LookForEnemies(player, false) && player->mo->tracer)
{ {
player->pflags |= PF_FORCEJUMPDAMAGE; player->pflags |= PF_FORCEJUMPDAMAGE;
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
S_StartSound(player->mo, sfx_s3k40); S_StartSound(player->mo, sfx_s3k40);
player->homing = 3*TICRATE; player->homing = 3*TICRATE;
} }
@ -7188,7 +7153,7 @@ static void P_MovePlayer(player_t *player)
case SH_ELEMENTAL: case SH_ELEMENTAL:
case SH_BUBBLEWRAP: case SH_BUBBLEWRAP:
player->pflags |= PF_FORCEJUMPDAMAGE|PF_THOKKED|PF_SHIELDABILITY; player->pflags |= PF_FORCEJUMPDAMAGE|PF_THOKKED|PF_SHIELDABILITY;
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
player->secondjump = 0; player->secondjump = 0;
player->mo->momx = player->mo->momy = 0; player->mo->momx = player->mo->momy = 0;
P_SetObjectMomZ(player->mo, -24*FRACUNIT, false); P_SetObjectMomZ(player->mo, -24*FRACUNIT, false);
@ -7306,7 +7271,7 @@ static void P_MovePlayer(player_t *player)
fixed_t oldheight = player->mo->height; fixed_t oldheight = player->mo->height;
// Less height while spinning. Good for spinning under things...? // Less height while spinning. Good for spinning under things...?
if ((player->mo->state == &states[player->mo->info->painstate] || player->mo->state == &states[S_PLAY_SUPER_PAIN]) if ((player->mo->state == &states[player->mo->info->painstate])
|| (!(player->charflags & SF_NOJUMPSPIN) && (player->pflags & PF_JUMPED)) || (!(player->charflags & SF_NOJUMPSPIN) && (player->pflags & PF_JUMPED))
|| (player->pflags & PF_SPINNING) || (player->pflags & PF_SPINNING)
|| player->powers[pw_tailsfly] || player->pflags & PF_GLIDING || player->powers[pw_tailsfly] || player->pflags & PF_GLIDING
@ -7326,7 +7291,7 @@ static void P_MovePlayer(player_t *player)
if ((player->charability2 == CA2_SPINDASH) && !(player->pflags & PF_SPINNING)) if ((player->charability2 == CA2_SPINDASH) && !(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_ROLL);
} }
else if (player->mo->ceilingz - player->mo->floorz < player->mo->height) else if (player->mo->ceilingz - player->mo->floorz < player->mo->height)
{ {
@ -9057,7 +9022,7 @@ void P_PlayerThink(player_t *player)
if (!(player->charflags & SF_NOJUMPSPIN)) if (!(player->charflags & SF_NOJUMPSPIN))
P_SetPlayerMobjState(player->mo, S_PLAY_JUMP); P_SetPlayerMobjState(player->mo, S_PLAY_JUMP);
else if (player->pflags & PF_FORCEJUMPDAMAGE) else if (player->pflags & PF_FORCEJUMPDAMAGE)
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
} }
if (player->flashcount) if (player->flashcount)
@ -9302,7 +9267,7 @@ void P_PlayerThink(player_t *player)
{ {
P_DoZoomTube(player); P_DoZoomTube(player);
if (!(player->panim == PA_ROLL)) if (!(player->panim == PA_ROLL))
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN); P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
} }
player->rmomx = player->rmomy = 0; // no actual momentum from your controls player->rmomx = player->rmomy = 0; // no actual momentum from your controls
P_ResetScore(player); P_ResetScore(player);

View file

@ -2899,8 +2899,8 @@ void R_AddSkins(UINT16 wadnum)
// these are uppercase so they can be concatenated with SF_ // these are uppercase so they can be concatenated with SF_
// 1, true, yes are all valid values // 1, true, yes are all valid values
GETFLAG(SUPER) GETFLAG(SUPER)
GETFLAG(SUPERANIMS) GETFLAG(NOSUPERSPIN)
GETFLAG(SUPERSPIN) GETFLAG(NOSPINDASHDUST)
GETFLAG(HIRES) GETFLAG(HIRES)
GETFLAG(NOSKID) GETFLAG(NOSKID)
GETFLAG(NOSPEEDADJUST) GETFLAG(NOSPEEDADJUST)
@ -2910,7 +2910,7 @@ void R_AddSkins(UINT16 wadnum)
GETFLAG(STOMPDAMAGE) GETFLAG(STOMPDAMAGE)
GETFLAG(MARIODAMAGE) GETFLAG(MARIODAMAGE)
GETFLAG(MACHINE) GETFLAG(MACHINE)
GETFLAG(NOSPINDASHDUST) GETFLAG(DASHMODE)
#undef GETFLAG #undef GETFLAG
else // let's check if it's a sound, otherwise error out else // let's check if it's a sound, otherwise error out
@ -2956,20 +2956,35 @@ next_token:
// Add sprites // Add sprites
{ {
UINT16 z; UINT16 newlastlump;
UINT8 sprite2; UINT8 sprite2;
lump++; // start after S_SKIN lump++; // start after S_SKIN
lastlump = W_CheckNumForNamePwad("S_END",wadnum,lump); // stop at S_END lastlump = W_CheckNumForNamePwad("S_END",wadnum,lump); // stop at S_END
// old wadding practices die hard -- stop at S_SKIN or S_START if they come before S_END.
z = W_CheckNumForNamePwad("S_SKIN",wadnum,lump);
if (z < lastlump) lastlump = z;
z = W_CheckNumForNamePwad("S_START",wadnum,lump);
if (z < lastlump) lastlump = z;
// load all sprite sets we are aware of. // old wadding practices die hard -- stop at S_SKIN or S_START if they come before S_END.
newlastlump = W_CheckNumForNamePwad("S_SKIN",wadnum,lump);
if (newlastlump < lastlump) lastlump = newlastlump;
newlastlump = W_CheckNumForNamePwad("S_START",wadnum,lump);
if (newlastlump < lastlump) lastlump = newlastlump;
// ...and let's handle super, too
newlastlump = W_CheckNumForNamePwad("S_SUPER",wadnum,lump);
if (newlastlump < lastlump)
{
newlastlump++;
// load all sprite sets we are aware of... for super!
for (sprite2 = 0; sprite2 < free_spr2; sprite2++)
R_AddSingleSpriteDef(spr2names[sprite2], &skin->sprites[FF_SPR2SUPER|sprite2], wadnum, newlastlump, lastlump);
newlastlump--;
lastlump = newlastlump; // okay, make the normal sprite set loading end there
}
// load all sprite sets we are aware of... for normal stuff.
for (sprite2 = 0; sprite2 < free_spr2; sprite2++) for (sprite2 = 0; sprite2 < free_spr2; sprite2++)
R_AddSingleSpriteDef(spr2names[sprite2], &skin->sprites[sprite2], wadnum, lump, lastlump); R_AddSingleSpriteDef(spr2names[sprite2], &skin->sprites[sprite2], wadnum, lump, lastlump);
} }
R_FlushTranslationColormapCache(); R_FlushTranslationColormapCache();

View file

@ -118,7 +118,7 @@ typedef struct
// specific sounds per skin // specific sounds per skin
sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table sfxenum_t soundsid[NUMSKINSOUNDS]; // sound # in S_sfx table
spritedef_t sprites[NUMPLAYERSPRITES]; spritedef_t sprites[NUMPLAYERSPRITES*2]; // contains super versions too
UINT8 availability; // lock? UINT8 availability; // lock?
} skin_t; } skin_t;