SF_MACHINE. Currently only changes drowning, but could do more.

* Electric sparks coming off entire body instead of bubbles coming out mouth
* Different sounds.
* Different icons.

These sprites are currently local only, but I'll be doing a lot of asset updating this evening since Rob asked me to so it won't be long until you can get them.
This commit is contained in:
toasterbabe 2016-07-16 22:43:49 +01:00
parent 0f79e9ea3b
commit f757fb3545
8 changed files with 114 additions and 31 deletions

View file

@ -43,7 +43,7 @@ typedef enum
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_NOMIDDLESTART = 1<<10, // Some animations can randomly start you halfway through. Disable this? SF_MACHINE = 1<<10, // Beep boop. Are you a robot?
} skinflags_t; } skinflags_t;
//Primary and secondary skin abilities //Primary and secondary skin abilities

View file

@ -5552,6 +5552,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_POP1", // Extra Large bubble goes POP! "S_POP1", // Extra Large bubble goes POP!
"S_WATERZAP",
"S_FOG1", "S_FOG1",
"S_FOG2", "S_FOG2",
"S_FOG3", "S_FOG3",
@ -5593,6 +5595,13 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_FOUR1", "S_FOUR1",
"S_FIVE1", "S_FIVE1",
"S_ZERO2",
"S_ONE2",
"S_TWO2",
"S_THREE2",
"S_FOUR2",
"S_FIVE2",
// Tag Sign // Tag Sign
"S_TTAG1", "S_TTAG1",
@ -6501,6 +6510,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_SMALLBUBBLE", // small bubble "MT_SMALLBUBBLE", // small bubble
"MT_MEDIUMBUBBLE", // medium bubble "MT_MEDIUMBUBBLE", // medium bubble
"MT_EXTRALARGEBUBBLE", // extra large bubble "MT_EXTRALARGEBUBBLE", // extra large bubble
"MT_WATERZAP",
"MT_TFOG", "MT_TFOG",
"MT_SEED", "MT_SEED",
"MT_PARTICLE", "MT_PARTICLE",
@ -7146,7 +7156,7 @@ struct {
{"SF_NOJUMPDAMAGE",SF_NOJUMPDAMAGE}, {"SF_NOJUMPDAMAGE",SF_NOJUMPDAMAGE},
{"SF_STOMPDAMAGE",SF_STOMPDAMAGE}, {"SF_STOMPDAMAGE",SF_STOMPDAMAGE},
{"SF_MARIODAMAGE",SF_MARIODAMAGE}, {"SF_MARIODAMAGE",SF_MARIODAMAGE},
{"SF_NOMIDDLESTART",SF_NOMIDDLESTART}, {"SF_MACHINE",SF_MACHINE},
// Character abilities! // Character abilities!
// Primary // Primary

View file

@ -387,6 +387,7 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_BUBN &lspr[NOLIGHT], // SPR_BUBN
&lspr[NOLIGHT], // SPR_BUBM &lspr[NOLIGHT], // SPR_BUBM
&lspr[NOLIGHT], // SPR_POPP &lspr[NOLIGHT], // SPR_POPP
&lspr[SUPERSPARK_L], // SPR_WZAP
&lspr[SUPERSPARK_L], // SPR_TFOG &lspr[SUPERSPARK_L], // SPR_TFOG
&lspr[NIGHTSLIGHT_L], // SPR_SEED // Sonic CD flower seed &lspr[NIGHTSLIGHT_L], // SPR_SEED // Sonic CD flower seed
&lspr[NOLIGHT], // SPR_PRTL &lspr[NOLIGHT], // SPR_PRTL

View file

@ -45,15 +45,15 @@ char sprnames[NUMSPRITES + 1][5] =
"ELEM","FORC","PITY","IVSP","SSPK","GOAL","BIRD","BUNY","MOUS","CHIC", "ELEM","FORC","PITY","IVSP","SSPK","GOAL","BIRD","BUNY","MOUS","CHIC",
"COWZ","RBRD","SPRY","SPRR","SPRB","YSPR","RSPR","SSWY","SSWR","SSWB", "COWZ","RBRD","SPRY","SPRR","SPRB","YSPR","RSPR","SSWY","SSWR","SSWB",
"RAIN","SNO1","SPLH","SPLA","SMOK","BUBP","BUBO","BUBN","BUBM","POPP", "RAIN","SNO1","SPLH","SPLA","SMOK","BUBP","BUBO","BUBN","BUBM","POPP",
"TFOG","SEED","PRTL","SCOR","DRWN","TTAG","GFLG","RRNG","RNGB","RNGR", "WZAP","TFOG","SEED","PRTL","SCOR","DRWN","TTAG","GFLG","RRNG","RNGB",
"RNGI","RNGA","RNGE","RNGS","RNGG","PIKB","PIKR","PIKA","PIKE","PIKS", "RNGR","RNGI","RNGA","RNGE","RNGS","RNGG","PIKB","PIKR","PIKA","PIKE",
"PIKG","TAUT","TGRE","TSCR","COIN","CPRK","GOOM","BGOM","FFWR","FBLL", "PIKS","PIKG","TAUT","TGRE","TSCR","COIN","CPRK","GOOM","BGOM","FFWR",
"SHLL","PUMA","HAMM","KOOP","BFLM","MAXE","MUS1","MUS2","TOAD","NDRN", "FBLL","SHLL","PUMA","HAMM","KOOP","BFLM","MAXE","MUS1","MUS2","TOAD",
"SUPE","SUPZ","NDRL","NSPK","NBMP","HOOP","NSCR","NPRU","CAPS","SUPT", "NDRN","SUPE","SUPZ","NDRL","NSPK","NBMP","HOOP","NSCR","NPRU","CAPS",
"SPRK","BOM1","BOM2","BOM3","BOM4","ROIA","ROIB","ROIC","ROID","ROIE", "SUPT","SPRK","BOM1","BOM2","BOM3","BOM4","ROIA","ROIB","ROIC","ROID",
"ROIF","ROIG","ROIH","ROII","ROIJ","ROIK","ROIL","ROIM","ROIN","ROIO", "ROIE","ROIF","ROIG","ROIH","ROII","ROIJ","ROIK","ROIL","ROIM","ROIN",
"ROIP","BBAL","GWLG","GWLR","SRBA","SRBB","SRBC","SRBD","SRBE","SRBF", "ROIO","ROIP","BBAL","GWLG","GWLR","SRBA","SRBB","SRBC","SRBD","SRBE",
"SRBG","SRBH","SRBI","SRBJ","SRBK","SRBL","SRBM","SRBN","SRBO", "SRBF","SRBG","SRBH","SRBI","SRBJ","SRBK","SRBL","SRBM","SRBN","SRBO",
}; };
char spr2names[NUMPLAYERSPRITES][5] = char spr2names[NUMPLAYERSPRITES][5] =
@ -1936,6 +1936,8 @@ state_t states[NUMSTATES] =
// Extra Large Bubble goes POP! // Extra Large Bubble goes POP!
{SPR_POPP, 0, 16, {NULL}, 0, 0, S_NULL}, // S_POP1 {SPR_POPP, 0, 16, {NULL}, 0, 0, S_NULL}, // S_POP1
{SPR_WZAP, FF_TRANS10|FF_ANIMATE|FF_MIDDLESTARTCHANCE, 4, {NULL}, 3, 2, S_NULL}, // S_WATERZAP
{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
@ -1978,6 +1980,13 @@ state_t states[NUMSTATES] =
{SPR_DRWN, 4, 40, {NULL}, 0, 0, S_NULL}, // S_FOUR1 {SPR_DRWN, 4, 40, {NULL}, 0, 0, S_NULL}, // S_FOUR1
{SPR_DRWN, 5, 40, {NULL}, 0, 0, S_NULL}, // S_FIVE1 {SPR_DRWN, 5, 40, {NULL}, 0, 0, S_NULL}, // S_FIVE1
{SPR_DRWN, 6, 40, {NULL}, 0, 0, S_NULL}, // S_ZERO2
{SPR_DRWN, 7, 40, {NULL}, 0, 0, S_NULL}, // S_ONE2
{SPR_DRWN, 8, 40, {NULL}, 0, 0, S_NULL}, // S_TWO2
{SPR_DRWN, 9, 40, {NULL}, 0, 0, S_NULL}, // S_THREE2
{SPR_DRWN, 10, 40, {NULL}, 0, 0, S_NULL}, // S_FOUR2
{SPR_DRWN, 11, 40, {NULL}, 0, 0, S_NULL}, // S_FIVE2
{SPR_TTAG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_TTAG1 {SPR_TTAG, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_NULL}, // S_TTAG1
// CTF Sign // CTF Sign
@ -10514,6 +10523,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_WATERZAP
-1, // doomednum
S_WATERZAP, // 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
8, // speed
4*FRACUNIT, // radius
4*FRACUNIT, // height
0, // display offset
16, // mass
0, // damage
sfx_None, // activesound
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_SCENERY, // flags
S_NULL // raisestate
},
{ // MT_TFOG { // MT_TFOG
-1, // doomednum -1, // doomednum
S_FOG1, // spawnstate S_FOG1, // spawnstate

View file

@ -463,6 +463,7 @@ typedef enum sprite
SPR_BUBN, // Large bubble SPR_BUBN, // Large bubble
SPR_BUBM, // Extra Large (would you like fries with that?) bubble SPR_BUBM, // Extra Large (would you like fries with that?) bubble
SPR_POPP, // Extra Large bubble goes POP! SPR_POPP, // Extra Large bubble goes POP!
SPR_WZAP,
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.)
@ -2434,6 +2435,8 @@ typedef enum state
S_POP1, // Extra Large bubble goes POP! S_POP1, // Extra Large bubble goes POP!
S_WATERZAP,
S_FOG1, S_FOG1,
S_FOG2, S_FOG2,
S_FOG3, S_FOG3,
@ -2475,6 +2478,13 @@ typedef enum state
S_FOUR1, S_FOUR1,
S_FIVE1, S_FIVE1,
S_ZERO2,
S_ONE2,
S_TWO2,
S_THREE2,
S_FOUR2,
S_FIVE2,
// Tag Sign // Tag Sign
S_TTAG1, S_TTAG1,
@ -3401,6 +3411,7 @@ typedef enum mobj_type
MT_SMALLBUBBLE, // small bubble MT_SMALLBUBBLE, // small bubble
MT_MEDIUMBUBBLE, // medium bubble MT_MEDIUMBUBBLE, // medium bubble
MT_EXTRALARGEBUBBLE, // extra large bubble MT_EXTRALARGEBUBBLE, // extra large bubble
MT_WATERZAP,
MT_TFOG, MT_TFOG,
MT_SEED, MT_SEED,
MT_PARTICLE, MT_PARTICLE,

View file

@ -2261,7 +2261,10 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
target->momx = target->momy = target->momz = 0; target->momx = target->momy = target->momz = 0;
if (damagetype == DMG_DROWNED) // drowned if (damagetype == DMG_DROWNED) // drowned
{ {
S_StartSound(target, sfx_drown); if (target->player->charflags & SF_MACHINE)
S_StartSound(target, sfx_fizzle);
else
S_StartSound(target, sfx_drown);
// Don't jump up when drowning // Don't jump up when drowning
} }
else else

View file

@ -489,7 +489,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
} }
else if (mobj->sprite2 != spr2) else if (mobj->sprite2 != spr2)
{ {
if ((st->frame & FF_MIDDLESTARTCHANCE) && !(player->charflags & SF_NOMIDDLESTART) && numframes && P_RandomChance(FRACUNIT/2)) if ((st->frame & FF_MIDDLESTARTCHANCE) && numframes && P_RandomChance(FRACUNIT/2))
frame = numframes/2; frame = numframes/2;
else else
frame = 0; frame = 0;
@ -609,7 +609,7 @@ boolean P_SetMobjState(mobj_t *mobj, statenum_t state)
} }
else if (mobj->sprite2 != spr2) else if (mobj->sprite2 != spr2)
{ {
if ((st->frame & FF_MIDDLESTARTCHANCE) && !(skin->flags & SF_NOMIDDLESTART) && numframes && P_RandomChance(FRACUNIT/2)) if ((st->frame & FF_MIDDLESTARTCHANCE) && numframes && P_RandomChance(FRACUNIT/2))
frame = numframes/2; frame = numframes/2;
else else
frame = 0; frame = 0;

View file

@ -2018,9 +2018,15 @@ static void P_CheckUnderwaterAndSpaceTimer(player_t *player)
mobj_t *numbermobj = P_SpawnMobj(player->mo->x, player->mo->y, height, MT_DROWNNUMBERS); mobj_t *numbermobj = P_SpawnMobj(player->mo->x, player->mo->y, height, MT_DROWNNUMBERS);
timeleft /= (2*TICRATE); // To be strictly accurate it'd need to be ((timeleft/TICRATE) - 1)/2, but integer division rounds down for us timeleft /= (2*TICRATE); // To be strictly accurate it'd need to be (((timeleft - 1)/TICRATE) - 1)/2, but integer division rounds down for us
S_StartSound(player->mo, sfx_dwnind); if (player->charflags & SF_MACHINE)
{
S_StartSound(player->mo, sfx_buzz1);
timeleft += 6;
}
else
S_StartSound(player->mo, sfx_dwnind);
if (timeleft) // Don't waste time setting the state if the time is 0. if (timeleft) // Don't waste time setting the state if the time is 0.
P_SetMobjState(numbermobj, numbermobj->info->spawnstate+timeleft); P_SetMobjState(numbermobj, numbermobj->info->spawnstate+timeleft);
@ -2059,11 +2065,9 @@ static void P_CheckUnderwaterAndSpaceTimer(player_t *player)
// Underwater audio cues // Underwater audio cues
if (P_IsLocalPlayer(player) && !player->bot) if (P_IsLocalPlayer(player) && !player->bot)
{ {
if (player->powers[pw_underwater] == 25*TICRATE + 1) if ((player->powers[pw_underwater] == 25*TICRATE + 1)
S_StartSound(NULL, sfx_wtrdng); || (player->powers[pw_underwater] == 20*TICRATE + 1)
else if (player->powers[pw_underwater] == 20*TICRATE + 1) || (player->powers[pw_underwater] == 15*TICRATE + 1))
S_StartSound(NULL, sfx_wtrdng);
else if (player->powers[pw_underwater] == 15*TICRATE + 1)
S_StartSound(NULL, sfx_wtrdng); S_StartSound(NULL, sfx_wtrdng);
if (player->powers[pw_underwater] == 11*TICRATE + 1 if (player->powers[pw_underwater] == 11*TICRATE + 1
@ -2141,21 +2145,39 @@ static void P_CheckInvincibilityTimer(player_t *player)
// //
static void P_DoBubbleBreath(player_t *player) static void P_DoBubbleBreath(player_t *player)
{ {
fixed_t zh; fixed_t x = player->mo->x;
fixed_t y = player->mo->y;
fixed_t z = player->mo->z;
mobj_t *bubble = NULL; mobj_t *bubble = NULL;
if (player->mo->eflags & MFE_VERTICALFLIP)
zh = player->mo->z + player->mo->height - FixedDiv(player->mo->height,5*(FRACUNIT/4));
else
zh = player->mo->z + FixedDiv(player->mo->height,5*(FRACUNIT/4));
if (!(player->mo->eflags & MFE_UNDERWATER) || ((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL && !(player->pflags & PF_NIGHTSMODE)) || player->spectator) if (!(player->mo->eflags & MFE_UNDERWATER) || ((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL && !(player->pflags & PF_NIGHTSMODE)) || player->spectator)
return; return;
if (P_RandomChance(FRACUNIT/16)) if (player->charflags & SF_MACHINE)
bubble = P_SpawnMobj(player->mo->x, player->mo->y, zh, MT_SMALLBUBBLE); {
else if (P_RandomChance(3*FRACUNIT/256)) if (P_RandomChance((128-(player->powers[pw_underwater]/4))*FRACUNIT/256))
bubble = P_SpawnMobj(player->mo->x, player->mo->y, zh, MT_MEDIUMBUBBLE); {
fixed_t rad = player->mo->radius>>FRACBITS;
x += (P_RandomRange(rad, -rad)<<FRACBITS);
y += (P_RandomRange(rad, -rad)<<FRACBITS);
z += (P_RandomKey(player->mo->height>>FRACBITS)<<FRACBITS);
bubble = P_SpawnMobj(x, y, z, MT_WATERZAP);
S_StartSound(bubble, sfx_beelec);
}
}
else
{
if (player->mo->eflags & MFE_VERTICALFLIP)
z += player->mo->height - FixedDiv(player->mo->height,5*(FRACUNIT/4));
else
z += FixedDiv(player->mo->height,5*(FRACUNIT/4));
if (P_RandomChance(FRACUNIT/16))
bubble = P_SpawnMobj(x, y, z, MT_SMALLBUBBLE);
else if (P_RandomChance(3*FRACUNIT/256))
bubble = P_SpawnMobj(x, y, z, MT_MEDIUMBUBBLE);
}
if (bubble) if (bubble)
{ {
bubble->threshold = 42; bubble->threshold = 42;