New invincibility effect, grow/shrink stuff

Whenever grow/shrink effects get made, I'll remove the Mario-style
stuttered growth and whatever else needs doing beyond that
This commit is contained in:
TehRealSalt 2018-02-10 01:19:33 -05:00
parent 819d370fb3
commit 2889687d1d
13 changed files with 233 additions and 96 deletions

View File

@ -336,8 +336,8 @@ consvar_t cv_jawz = {"jawz", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0
consvar_t cv_mine = {"mine", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_ballhog = {"ballhog", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_selfpropelledbomb = {"selfpropelledbomb", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_sizeup = {"sizeup", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_sizedown = {"sizedown", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grow = {"grow", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_shrink = {"shrink", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_lightningshield = {"lightningshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_hyudoro = {"hyudoro", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_pogospring = {"pogospring", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};

View File

@ -111,7 +111,7 @@ extern consvar_t cv_recycler;*/
// SRB2kart items
extern consvar_t cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
extern consvar_t cv_fakeitem, cv_orbinaut, cv_jawz, cv_mine;
extern consvar_t cv_ballhog, cv_selfpropelledbomb, cv_sizeup, cv_sizedown;
extern consvar_t cv_ballhog, cv_selfpropelledbomb, cv_grow, cv_shrink;
extern consvar_t cv_lightningshield, cv_hyudoro, cv_pogospring;
extern consvar_t cv_triplesneaker, cv_triplebanana, cv_tripleorbinaut, cv_dualjawz;

View File

@ -244,8 +244,8 @@ typedef enum
KITEM_MINE,
KITEM_BALLHOG,
KITEM_SPB,
KITEM_SIZEUP,
KITEM_SIZEDOWN,
KITEM_GROW,
KITEM_SHRINK,
KITEM_LIGHTNINGSHIELD,
KITEM_HYUDORO,
KITEM_POGOSPRING,
@ -309,7 +309,7 @@ typedef enum
k_fakeitem, // Fake item held, separate from itemtype so it doesn't stop you from getting items
k_spinouttimer, // Spin-out from a banana peel or oil slick (was "pw_bananacam")
k_justbumped, // Prevent players from endlessly bumping into each other
k_poweritemtimer, // Battle mode, how long before you're allowed another power item (Invincibility, Size Up)
k_poweritemtimer, // Battle mode, how long before you're allowed another power item (Invincibility, Grow)
k_comebacktimer, // Battle mode, how long before you become a bomb after death
k_sadtimer, // How long you've been sad

View File

@ -6258,6 +6258,25 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_KARTFIRE7",
"S_KARTFIRE8",
// Invincibility Sparks
"S_KARTINVULN_SMALL1",
"S_KARTINVULN_SMALL2",
"S_KARTINVULN_SMALL3",
"S_KARTINVULN_SMALL4",
"S_KARTINVULN_SMALL5",
"S_KARTINVULN_LARGE1",
"S_KARTINVULN_LARGE2",
"S_KARTINVULN_LARGE3",
"S_KARTINVULN_LARGE4",
"S_KARTINVULN_LARGE5",
// Invincibility flash overlay
"S_INVULNFLASH1",
"S_INVULNFLASH2",
"S_INVULNFLASH3",
"S_INVULNFLASH4",
//{ Fake Item
"S_FAKEITEM1",
"S_FAKEITEM2",
@ -6395,7 +6414,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_BLUELIGHTNING4",
"S_BLUEEXPLODE",
// Size Down
// Grow/shrink beams
"S_LIGHTNING1",
"S_LIGHTNING2",
"S_LIGHTNING3",
@ -6457,7 +6476,7 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_PLAYERARROW_BALLHOG",
"S_PLAYERARROW_ORBINAUT",
"S_PLAYERARROW_INVINCIBILITY",
"S_PLAYERARROW_SIZEUP",
"S_PLAYERARROW_GROW",
"S_PLAYERARROW_KITCHENSINK",
"S_PLAYERARROW_EMPTY",
"S_PLAYERARROW_ROULETTE",
@ -6984,6 +7003,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_RANDOMITEMPOP",
"MT_SNEAKERTRAIL",
"MT_SPARKLETRAIL",
"MT_DRIFT",
"MT_DRIFTSMOKE",
@ -7010,7 +7030,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
"MT_SMOLDERING", // New explosion
"MT_BOOMPARTICLE",
"MT_BLUELIGHTNING", // Size Down stuff
"MT_BLUELIGHTNING", // Grow/shrink stuff
"MT_BLUEEXPLOSION",
"MT_LIGHTNING",

View File

@ -55,10 +55,10 @@ char sprnames[NUMSPRITES + 1][5] =
"GWLR","SRBA","SRBB","SRBC","SRBD","SRBE","SRBF","SRBG","SRBH","SRBI",
"SRBJ","SRBK","SRBL","SRBM","SRBN","SRBO",
//SRB2kart Sprites
"SPRG","BSPR","RNDM","KFRE","DRIF","DSMO","FITM","BANA","GSHE","RSHE",
"SSMN","KRBM","BLIG","LIGH","SINK","SITR","KBLN","LAKI","POKE","AUDI",
"DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO","CRAB","SHAD",
"BUMP","FLEN","CLAS","PSHW","ARRO","PBOM"
"SPRG","BSPR","RNDM","KFRE","KINV","KINF","DRIF","DSMO","FITM","BANA",
"GSHE","RSHE","SSMN","KRBM","BLIG","LIGH","SINK","SITR","KBLN","LAKI",
"POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO",
"CRAB","SHAD","BUMP","FLEN","CLAS","PSHW","ARRO","PBOM"
};
// Doesn't work with g++, needs actionf_p1 (don't modify this comment)
@ -2592,6 +2592,23 @@ state_t states[NUMSTATES] =
{SPR_KFRE, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_KARTFIRE8}, // S_KARTFIRE7
{SPR_KFRE, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_NULL}, // S_KARTFIRE8
{SPR_KINV, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARTINVULN_SMALL2}, // S_KARTINVULN_SMALL1
{SPR_KINV, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_KARTINVULN_SMALL3}, // S_KARTINVULN_SMALL2
{SPR_KINV, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_KARTINVULN_SMALL4}, // S_KARTINVULN_SMALL3
{SPR_KINV, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_KARTINVULN_SMALL5}, // S_KARTINVULN_SMALL4
{SPR_KINV, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVULN_SMALL5
{SPR_KINV, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_KARTINVULN_LARGE2}, // S_KARTINVULN_LARGE1
{SPR_KINV, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_KARTINVULN_LARGE3}, // S_KARTINVULN_LARGE2
{SPR_KINV, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_KARTINVULN_LARGE4}, // S_KARTINVULN_LARGE3
{SPR_KINV, FF_FULLBRIGHT|6, 1, {NULL}, 0, 0, S_KARTINVULN_LARGE5}, // S_KARTINVULN_LARGE4
{SPR_KINV, FF_FULLBRIGHT|7, 1, {NULL}, 0, 0, S_NULL}, // S_KARTINVULN_LARGE5
{SPR_KINF, FF_FULLBRIGHT|FF_TRANS80, 1, {NULL}, 0, 0, S_INVULNFLASH2}, // S_INVULNFLASH1
{SPR_NULL, FF_FULLBRIGHT|FF_TRANS80, 1, {NULL}, 0, 0, S_INVULNFLASH3}, // S_INVULNFLASH2
{SPR_KINF, FF_FULLBRIGHT|FF_TRANS80|1, 1, {NULL}, 0, 0, S_INVULNFLASH4}, // S_INVULNFLASH3
{SPR_NULL, FF_FULLBRIGHT|FF_TRANS80, 1, {NULL}, 0, 0, S_INVULNFLASH1}, // S_INVULNFLASH4
{SPR_FITM, 0, 3, {NULL}, 0, 0, S_FAKEITEM2}, // S_FAKEITEM1
{SPR_FITM, 1, 3, {NULL}, 0, 0, S_FAKEITEM3}, // S_FAKEITEM2
{SPR_FITM, 2, 3, {NULL}, 0, 0, S_FAKEITEM4}, // S_FAKEITEM3
@ -2899,7 +2916,7 @@ state_t states[NUMSTATES] =
{SPR_ARRO, FF_FULLBRIGHT|9, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_BALLHOG
{SPR_ARRO, FF_FULLBRIGHT|10, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_ORBINAUT
{SPR_ARRO, FF_FULLBRIGHT|13, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_INVINCIBILITY
{SPR_ARRO, FF_FULLBRIGHT|14, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_SIZEUP
{SPR_ARRO, FF_FULLBRIGHT|14, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_GROW
{SPR_ARRO, FF_FULLBRIGHT|15, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_KITCHENSINK
{SPR_ARRO, FF_FULLBRIGHT|16, -1, {NULL}, 0, 0, S_NULL}, // S_PLAYERARROW_EMPTY
{SPR_ARRO, FF_FULLBRIGHT|FF_ANIMATE|1, -1, {NULL}, 5, 3, S_NULL}, // S_PLAYERARROW_ROULETTE
@ -14352,6 +14369,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_SPARKLETRAIL
-1, // doomednum
S_KARTINVULN_SMALL1, // spawnstate
1, // 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
14*FRACUNIT, // radius
14*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags
S_NULL // raisestate
},
{ // MT_DRIFT
-1, // doomednum
S_DRIFTSPARK1, // spawnstate

View File

@ -580,6 +580,8 @@ typedef enum sprite
SPR_RNDM, // Random Item Box
SPR_KFRE, // Sneaker fire trail
SPR_KINV, // Invincibility sparkle trail
SPR_KINF, // Invincibility flash
SPR_DRIF, // Drift Sparks
SPR_DSMO, // Drift Smoke
@ -591,7 +593,7 @@ typedef enum sprite
SPR_SSMN, // SS Mine
SPR_KRBM, // SS Mine BOOM
SPR_BLIG, // Self-Propelled Bomb
SPR_LIGH, // Size Up/Down beams (Metallic Maddness)
SPR_LIGH, // Grow/shrink beams (Metallic Maddness)
SPR_SINK, // Kitchen Sink
SPR_SITR, // Kitchen Sink Trail
SPR_KBLN, // Battle Mode Balloon
@ -3091,6 +3093,25 @@ typedef enum state
S_KARTFIRE7,
S_KARTFIRE8,
// Invincibility Sparks
S_KARTINVULN_SMALL1,
S_KARTINVULN_SMALL2,
S_KARTINVULN_SMALL3,
S_KARTINVULN_SMALL4,
S_KARTINVULN_SMALL5,
S_KARTINVULN_LARGE1,
S_KARTINVULN_LARGE2,
S_KARTINVULN_LARGE3,
S_KARTINVULN_LARGE4,
S_KARTINVULN_LARGE5,
// Invincibility flash
S_INVULNFLASH1,
S_INVULNFLASH2,
S_INVULNFLASH3,
S_INVULNFLASH4,
//{ Fake Item
S_FAKEITEM1,
S_FAKEITEM2,
@ -3417,7 +3438,7 @@ typedef enum state
S_PLAYERARROW_BALLHOG,
S_PLAYERARROW_ORBINAUT,
S_PLAYERARROW_INVINCIBILITY,
S_PLAYERARROW_SIZEUP,
S_PLAYERARROW_GROW,
S_PLAYERARROW_KITCHENSINK,
S_PLAYERARROW_EMPTY,
S_PLAYERARROW_ROULETTE,
@ -3961,6 +3982,7 @@ typedef enum mobj_type
MT_RANDOMITEMPOP,
MT_SNEAKERTRAIL,
MT_SPARKLETRAIL,
MT_DRIFT,
MT_DRIFTSMOKE,
@ -3986,7 +4008,7 @@ typedef enum mobj_type
MT_SMOLDERING, // New explosion
MT_BOOMPARTICLE,
MT_BLUELIGHTNING, // Size Down stuff
MT_BLUELIGHTNING, // Grow/shrink stuff
MT_BLUEEXPLOSION,
MT_LIGHTNING,

View File

@ -303,8 +303,8 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_mine);
CV_RegisterVar(&cv_ballhog);
CV_RegisterVar(&cv_selfpropelledbomb);
CV_RegisterVar(&cv_sizeup);
CV_RegisterVar(&cv_sizedown);
CV_RegisterVar(&cv_grow);
CV_RegisterVar(&cv_shrink);
CV_RegisterVar(&cv_lightningshield);
CV_RegisterVar(&cv_hyudoro);
CV_RegisterVar(&cv_pogospring);
@ -352,8 +352,8 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTRESULTS][9] =
/*Mine*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Mine
/*Ballhog*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Ballhog
/*Self-Propelled Bomb*/ { 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // Self-Propelled Bomb
/*Size Up*/ { 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Size Up
/*Size Down*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0 }, // Size Down
/*Grow*/ { 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Grow
/*Shrink*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0 }, // Shrink
/*Lightning Shield*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Lightning Shield
/*Hyudoro*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Hyudoro
/*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring
@ -378,8 +378,8 @@ static INT32 K_KartItemOddsBalloons[NUMKARTRESULTS][5] =
/*Mine*/ { 0, 3, 3, 0, 0 }, // Mine
/*Ballhog*/ { 0, 3, 3, 0, 0 }, // Ballhog
/*Self-Propelled Bomb*/ { 0, 0, 0, 0, 0 }, // Self-Propelled Bomb
/*Size Up*/ { 1, 1, 0, 0, 0 }, // Size Up
/*Size Down*/ { 0, 0, 0, 0, 0 }, // Size Down
/*Grow*/ { 1, 1, 0, 0, 0 }, // Grow
/*Shrink*/ { 0, 0, 0, 0, 0 }, // Shrink
/*Lightning Shield*/ { 0, 0, 0, 0, 0 }, // Lightning Shield
/*Hyudoro*/ { 0, 1, 1, 1, 0 }, // Hyudoro
/*Pogo Spring*/ { 0, 0, 3, 2, 1 }, // Pogo Spring
@ -490,13 +490,13 @@ static INT32 K_KartGetItemOdds(UINT8 pos, INT8 item, player_t *player)
if (franticitems) newodds *= 2;
if (!cv_selfpropelledbomb.value || pexiting <= 0) newodds = 0;
break;
case KITEM_SIZEUP:
case KITEM_GROW:
if (franticitems) newodds *= 2;
if (!cv_sizeup.value || player->kartstuff[k_poweritemtimer]) newodds = 0;
if (!cv_grow.value || player->kartstuff[k_poweritemtimer]) newodds = 0;
break;
case KITEM_SIZEDOWN:
case KITEM_SHRINK:
if (franticitems) newodds *= 2;
if (!cv_sizedown.value || pingame-1 <= pexiting) newodds = 0;
if (!cv_shrink.value || pingame-1 <= pexiting) newodds = 0;
break;
case KITEM_LIGHTNINGSHIELD:
if (franticitems) newodds *= 2;
@ -696,8 +696,8 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd)
SETITEMRESULT(useodds, KITEM_MINE); // Mine
SETITEMRESULT(useodds, KITEM_BALLHOG); // Ballhog
SETITEMRESULT(useodds, KITEM_SPB); // Self-Propelled Bomb
SETITEMRESULT(useodds, KITEM_SIZEUP); // Size Up
SETITEMRESULT(useodds, KITEM_SIZEDOWN); // Size Down
SETITEMRESULT(useodds, KITEM_GROW); // Grow
SETITEMRESULT(useodds, KITEM_SHRINK); // Shrink
SETITEMRESULT(useodds, KITEM_LIGHTNINGSHIELD); // Lightning Shield
SETITEMRESULT(useodds, KITEM_HYUDORO); // Hyudoro
SETITEMRESULT(useodds, KITEM_POGOSPRING); // Pogo Spring
@ -912,7 +912,7 @@ static void K_UpdateOffroad(player_t *player)
// A higher kart weight means you can stay offroad for longer without losing speed
offroad = (1872 + 5*156 - kartweight*156)*offroadstrength;
//if (player->kartstuff[k_growshrinktimer] > 1) // sizeup slows down half as fast
//if (player->kartstuff[k_growshrinktimer] > 1) // grow slows down half as fast
// offroad /= 2;
player->kartstuff[k_offroad] += offroad;
@ -1206,7 +1206,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
S_StopSoundByID(player->mo, sfx_star); // Stop it
}
// And the same for the size up SFX
// And the same for the grow SFX
if (!(player->mo->health > 0 && player->mo->player->kartstuff[k_growshrinktimer] > 0)) // If you aren't big
{
if (S_SoundPlaying(player->mo, sfx_mega)) // But the sound is playing
@ -1290,7 +1290,7 @@ static fixed_t K_GetKartBoostPower(player_t *player, boolean speed)
if (player->kartstuff[k_growshrinktimer] > 1
&& (player->kartstuff[k_growshrinktimer] > ((itemtime + TICRATE*2) - 25)
|| player->kartstuff[k_growshrinktimer] <= 26))
{ // Size Up - Mid-size
{ // Grow - Mid-size
if (speed)
{
boostvalue = max(boostvalue, FRACUNIT/8); // + 12.5%
@ -1298,7 +1298,7 @@ static fixed_t K_GetKartBoostPower(player_t *player, boolean speed)
}
if (player->kartstuff[k_growshrinktimer] < ((itemtime + TICRATE*2) - 25)
&& player->kartstuff[k_growshrinktimer] > 26)
{ // Size Up
{ // Grow
if (speed)
{
boostvalue = max(boostvalue, FRACUNIT/5); // + 20%
@ -1967,6 +1967,38 @@ void K_SpawnDriftTrail(player_t *player)
}
}
void K_SpawnSparkleTrail(player_t *player)
{
const INT32 rad = (player->mo->radius*2)>>FRACBITS;
fixed_t newx, newy, newz;
mobj_t *sparkle;
INT32 i;
I_Assert(player != NULL);
I_Assert(player->mo != NULL);
I_Assert(!P_MobjWasRemoved(player->mo));
for (i = 0; i < 3; i++)
{
newx = player->mo->x + player->mo->momx + (P_RandomRange(-rad, rad)<<FRACBITS);
newy = player->mo->y + player->mo->momy + (P_RandomRange(-rad, rad)<<FRACBITS);
newz = player->mo->z + player->mo->momz + (P_RandomRange(0, player->mo->height>>FRACBITS)<<FRACBITS);
sparkle = P_SpawnMobj(newx, newy, newz, MT_SPARKLETRAIL);
if (i == 0)
P_SetMobjState(sparkle, S_KARTINVULN_LARGE1);
P_SetTarget(&sparkle->target, player->mo);
//sparkle->fuse = 10;
sparkle->destscale = player->mo->scale;
P_SetScale(sparkle, player->mo->scale);
sparkle->eflags = (sparkle->eflags & ~MFE_VERTICALFLIP)|(player->mo->eflags & MFE_VERTICALFLIP);
sparkle->color = player->mo->color;
sparkle->colorized = player->mo->colorized;
}
}
static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, INT32 defaultDir, boolean minethrow)
{
mobj_t *mo;
@ -2218,7 +2250,7 @@ void K_DoSneaker(player_t *player, boolean doPFlag, boolean startboost)
player->kartstuff[k_sounds] = 50;
}
static void K_DoSizeDown(player_t *player, boolean spb)
static void K_DoShrink(player_t *player, boolean spb)
{
mobj_t *mo;
thinker_t *think;
@ -2239,7 +2271,8 @@ static void K_DoSizeDown(player_t *player, boolean spb)
mo = (mobj_t *)think;
if (mo->type == MT_PLAYER)
if (mo->player && !mo->player->spectator
&& mo->player->kartstuff[k_position] > player->kartstuff[k_position])
P_DamageMobj(mo, player->mo, player->mo, spb ? 65 : 64);
else
continue;
@ -2723,6 +2756,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
S_ChangeMusicInternal("minvnc", true);
if (!cv_kartstarsfx.value && !P_IsLocalPlayer(player))
S_StartSound(player->mo, sfx_star);
if (!player->kartstuff[k_invincibilitytimer])
{
mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_OVERLAY);
P_SetTarget(&overlay->target, player->mo);
P_SetMobjState(overlay, S_INVULNFLASH1);
}
player->kartstuff[k_invincibilitytimer] = itemtime; // Activate it
K_PlayTauntSound(player->mo);
player->kartstuff[k_itemamount]--;
@ -2996,13 +3035,13 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
case KITEM_SPB:
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
{
K_DoSizeDown(player, true);
K_DoShrink(player, true);
player->kartstuff[k_itemamount]--;
}
break;
case KITEM_SIZEUP:
case KITEM_GROW:
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO
&& player->kartstuff[k_growshrinktimer] <= 0) // Size Up holds the item box hostage
&& player->kartstuff[k_growshrinktimer] <= 0) // Grow holds the item box hostage
{
if (P_IsLocalPlayer(player) && !player->exiting)
S_ChangeMusicInternal("mega", true);
@ -3017,10 +3056,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->kartstuff[k_poweritemtimer] = 10*TICRATE;
}
break;
case KITEM_SIZEDOWN:
case KITEM_SHRINK:
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
{
K_DoSizeDown(player, false);
K_DoShrink(player, false);
player->kartstuff[k_itemamount]--;
}
break;
@ -3078,7 +3117,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
else if (player->kartstuff[k_sneakertimer] == 0 && player->kartstuff[k_boosting] == 1)
player->kartstuff[k_boosting] = 0;
// Size Up - Make the player grow!
// Grow - Make the player grow!
if (player->kartstuff[k_growshrinktimer] > ((itemtime + TICRATE*2) - 25))
{
if (leveltime & 2)
@ -3089,7 +3128,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
else if (player->kartstuff[k_growshrinktimer] > 26
&& player->kartstuff[k_growshrinktimer] <= ((itemtime + TICRATE*2) - 25))
player->mo->destscale = (mapheaderinfo[gamemap-1]->mobj_scale)*3/2;
// Size Up - Back to normal...
// Grow - Back to normal...
else if (player->kartstuff[k_growshrinktimer] > 1
&& player->kartstuff[k_growshrinktimer] <= 26)
{
@ -3103,7 +3142,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
if ((gametype != GT_RACE)
&& (player->kartstuff[k_itemtype] == KITEM_INVINCIBILITY
|| player->kartstuff[k_itemtype] == KITEM_SIZEUP
|| player->kartstuff[k_itemtype] == KITEM_GROW
|| player->kartstuff[k_invincibilitytimer]
|| player->kartstuff[k_growshrinktimer] > 0))
player->kartstuff[k_poweritemtimer] = 10*TICRATE;
@ -3212,7 +3251,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
}
// Squishing
// If a Size Up player or a Thwomp crushes you, get flattened instead of being killed.
// If a Grow player or a Thwomp crushes you, get flattened instead of being killed.
if (player->kartstuff[k_squishedtimer] <= 0)
{
@ -3364,20 +3403,15 @@ static patch_t *kp_jawz;
static patch_t *kp_mine;
static patch_t *kp_ballhog;
static patch_t *kp_selfpropelledbomb;
static patch_t *kp_sizeup;
static patch_t *kp_sizedown;
static patch_t *kp_grow;
static patch_t *kp_shrink;
static patch_t *kp_lightningshield;
static patch_t *kp_hyudoro;
static patch_t *kp_pogospring;
static patch_t *kp_kitchensink;
static patch_t *kp_sadface;
static patch_t *kp_check;
static patch_t *kp_checkw;
static patch_t *kp_checkinvuln;
static patch_t *kp_checkinvulnw;
static patch_t *kp_checksizeup;
static patch_t *kp_checksizeupw;
static patch_t *kp_check[6];
void K_LoadKartHUDGraphics(void)
{
@ -3486,8 +3520,8 @@ void K_LoadKartHUDGraphics(void)
kp_mine = W_CachePatchName("K_ITMINE", PU_HUDGFX);
kp_ballhog = W_CachePatchName("K_ITBHOG", PU_HUDGFX);
kp_selfpropelledbomb = W_CachePatchName("K_ITSPB", PU_HUDGFX);
kp_sizeup = W_CachePatchName("K_ITSUP", PU_HUDGFX);
kp_sizedown = W_CachePatchName("K_ITSDWN", PU_HUDGFX);
kp_grow = W_CachePatchName("K_ITGROW", PU_HUDGFX);
kp_shrink = W_CachePatchName("K_ITSHRK", PU_HUDGFX);
kp_lightningshield = W_CachePatchName("K_ITLITS", PU_HUDGFX);
kp_hyudoro = W_CachePatchName("K_ITHYUD", PU_HUDGFX);
kp_pogospring = W_CachePatchName("K_ITPOGO", PU_HUDGFX);
@ -3495,12 +3529,11 @@ void K_LoadKartHUDGraphics(void)
kp_sadface = W_CachePatchName("K_ITSAD", PU_HUDGFX);
// CHECK indicators
kp_check = W_CachePatchName("K_CHECK1", PU_HUDGFX);
kp_checkw = W_CachePatchName("K_CHECK2", PU_HUDGFX);
kp_checkinvuln = W_CachePatchName("K_CHECK3", PU_HUDGFX);
kp_checkinvulnw = W_CachePatchName("K_CHECK4", PU_HUDGFX);
kp_checksizeup = W_CachePatchName("K_CHECK5", PU_HUDGFX);
kp_checksizeupw = W_CachePatchName("K_CHECK6", PU_HUDGFX);
for (i = 0; i < 6; i++)
{
sprintf(buffer, "K_CHECK%d", i+1);
kp_check[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX);
}
}
//}
@ -3672,12 +3705,12 @@ static void K_drawKartItem(void)
case 1: localpatch = kp_banana; break; // Banana
case 2: localpatch = kp_orbinaut; break; // Orbinaut
case 3: localpatch = kp_mine; break; // Mine
case 4: localpatch = kp_sizeup; break; // Size Up
case 4: localpatch = kp_grow; break; // Grow
case 5: localpatch = kp_hyudoro; break; // Hyudoro
case 6: localpatch = kp_rocketsneaker; break; // Rocket Sneaker
case 7: localpatch = kp_jawz; break; // Jawz
case 8: localpatch = kp_selfpropelledbomb; break; // Self-Propelled Bomb
case 9: localpatch = kp_sizedown; break; // Size Down
case 9: localpatch = kp_shrink; break; // Shrink
case 10: localpatch = localinv; break; // Invincibility
case 11: localpatch = kp_fakeitem; break; // Fake Item
case 12: localpatch = kp_ballhog; break; // Ballhog
@ -3710,7 +3743,7 @@ static void K_drawKartItem(void)
else if (stplyr->kartstuff[k_growshrinktimer] > 1)
{
if (leveltime & 1)
localpatch = kp_sizeup;
localpatch = kp_grow;
else if (!(leveltime & 1))
localpatch = kp_nodraw;
}
@ -3738,8 +3771,8 @@ static void K_drawKartItem(void)
case KITEM_MINE: localpatch = kp_mine; break;
case KITEM_BALLHOG: localpatch = kp_ballhog; break;
case KITEM_SPB: localpatch = kp_selfpropelledbomb; break;
case KITEM_SIZEUP: localpatch = kp_sizeup; break;
case KITEM_SIZEDOWN: localpatch = kp_sizedown; break;
case KITEM_GROW: localpatch = kp_grow; break;
case KITEM_SHRINK: localpatch = kp_shrink; break;
case KITEM_LIGHTNINGSHIELD: localpatch = kp_lightningshield; break;
case KITEM_HYUDORO: localpatch = kp_hyudoro; break;
case KITEM_POGOSPRING: localpatch = kp_pogospring; break;
@ -4183,11 +4216,11 @@ static void K_drawKartPlayerCheck(void)
INT32 i;
UINT8 *colormap;
INT32 x;
patch_t *localpatch;
UINT8 pnum = 0;
INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM);
if (!(stplyr->mo))
if (!stplyr->mo || stplyr->spectator)
return;
if (stplyr->awayviewtics)
@ -4200,27 +4233,18 @@ static void K_drawKartPlayerCheck(void)
{
if (&players[i] == stplyr)
continue;
if (!(players[i].mo))
if (!playeringame[i] || players[i].spectator)
continue;
if (!players[i].mo)
continue;
if ((players[i].kartstuff[k_invincibilitytimer] <= 0) && (leveltime & 2))
{
if (players[i].kartstuff[k_itemtype] == KITEM_SIZEUP || players[i].kartstuff[k_growshrinktimer] > 0)
localpatch = kp_checksizeupw;
else if (players[i].kartstuff[k_itemtype] == KITEM_INVINCIBILITY || players[i].kartstuff[k_invincibilitytimer])
localpatch = kp_checkinvulnw;
else
localpatch = kp_checkw;
}
else
{
if (players[i].kartstuff[k_itemtype] == KITEM_SIZEUP || players[i].kartstuff[k_growshrinktimer] > 0)
localpatch = kp_checksizeup;
else if (players[i].kartstuff[k_itemtype] == KITEM_INVINCIBILITY || players[i].kartstuff[k_invincibilitytimer])
localpatch = kp_checkinvuln;
else
localpatch = kp_check;
}
pnum++; // white frames
if (players[i].kartstuff[k_itemtype] == KITEM_GROW || players[i].kartstuff[k_growshrinktimer] > 0)
pnum += 4;
else if (players[i].kartstuff[k_itemtype] == KITEM_INVINCIBILITY || players[i].kartstuff[k_invincibilitytimer])
pnum += 2;
x = K_FindCheckX(stplyr->mo->x, stplyr->mo->y, stplyr->mo->angle, players[i].mo->x, players[i].mo->y);
if (x <= 320 && x >= 0)
@ -4231,7 +4255,7 @@ static void K_drawKartPlayerCheck(void)
x = 306;
colormap = R_GetTranslationColormap(TC_DEFAULT, players[i].mo->color, 0);
V_DrawMappedPatch(x, CHEK_Y, V_HUDTRANS|splitflags, localpatch, colormap);
V_DrawMappedPatch(x, CHEK_Y, V_HUDTRANS|splitflags, kp_check[pnum], colormap);
}
}
}

View File

@ -29,6 +29,7 @@ void K_StealBalloon(player_t *player, player_t *victim, boolean force);
void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32 number, mobjtype_t type, angle_t rotangle, boolean spawncenter, boolean ghostit, mobj_t *source);
void K_SpawnMineExplosion(mobj_t *source, UINT8 color);
void K_SpawnDriftTrail(player_t *player);
void K_SpawnSparkleTrail(player_t *player);
void K_DoSneaker(player_t *player, boolean doPFlag, boolean startboost);
void K_DoBouncePad(mobj_t *mo, fixed_t vertispeed);
boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y);

View File

@ -2090,6 +2090,16 @@ static int lib_kSpawnDriftTrail(lua_State *L)
return 0;
}
static int lib_kSpawnSparkleTrail(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
NOHUD
if (!player)
return LUA_ErrInvalid(L, "player_t");
K_SpawnDriftTrail(player);
return 0;
}
static int lib_kDoSneaker(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@ -2336,6 +2346,7 @@ static luaL_Reg lib[] = {
{"K_StealBalloon",lib_kStealBalloon},
{"K_SpawnKartExplosion",lib_kSpawnKartExplosion},
{"K_SpawnDriftTrail",lib_kSpawnDriftTrail},
{"K_SpawnSparkleTrail",lib_kSpawnSparkleTrail},
{"K_DoSneaker",lib_kDoSneaker},
{"K_DoBouncePad",lib_kDoBouncePad},
{"K_MomentumToFacing",lib_kMomentumToFacing},

View File

@ -1512,8 +1512,8 @@ static menuitem_t OP_MonitorToggleMenu[] =
{IT_STRING | IT_CVAR, NULL, "Mines", &cv_mine, 98},
{IT_STRING | IT_CVAR, NULL, "Ballhogs", &cv_ballhog, 106},
{IT_STRING | IT_CVAR, NULL, "Self-Propelled Bombs",&cv_selfpropelledbomb,114},
{IT_STRING | IT_CVAR, NULL, "Size Up", &cv_sizeup, 122},
{IT_STRING | IT_CVAR, NULL, "Size Down", &cv_sizedown, 130},
{IT_STRING | IT_CVAR, NULL, "Grow", &cv_grow, 122},
{IT_STRING | IT_CVAR, NULL, "Shrink", &cv_shrink, 130},
{IT_STRING | IT_CVAR, NULL, "Lightning Shields", &cv_lightningshield, 138},
{IT_STRING | IT_CVAR, NULL, "Hyudoros", &cv_hyudoro, 146},
{IT_STRING | IT_CVAR, NULL, "Pogo Springs", &cv_pogospring, 154},

View File

@ -3138,7 +3138,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
player->mo->destscale = 6*FRACUNIT/8;
player->kartstuff[k_growshrinktimer] -= (100+20*(16-(player->kartstuff[k_position])));
}
// Size Up? Let's take that away.
// Grow? Let's take that away.
if (player->kartstuff[k_growshrinktimer] > 0)
{
player->kartstuff[k_growshrinktimer] = 2;

View File

@ -6117,7 +6117,7 @@ static boolean P_AddShield(mobj_t *thing)
}
if (shield != SH_FORCE)
{ // Regular shields check for themselves only
{ // Regular shields check for themselves only
if ((shieldtype_t)(thing->target->player->powers[pw_shield] & SH_NOSTACK) != shield)
{
P_RemoveMobj(thing);
@ -6154,6 +6154,7 @@ void P_RunOverlays(void)
if (!mo->target)
continue;
if (!splitscreen /*&& rendermode != render_soft*/)
{
angle_t viewingangle;
@ -6487,7 +6488,10 @@ void P_MobjThinker(mobj_t *mobj)
// Don't touch my fuse!
return;
case MT_OVERLAY:
if (!mobj->target)
if ((!mobj->target)
|| ((mobj->state == &states[S_INVULNFLASH1] || mobj->state == &states[S_INVULNFLASH2] // SRB2kart: BAD HACK X_X
|| mobj->state == &states[S_INVULNFLASH3] || mobj->state == &states[S_INVULNFLASH4])
&& mobj->target->player && mobj->target->player->kartstuff[k_invincibilitytimer] == 0))
{
P_RemoveMobj(mobj);
return;
@ -6852,7 +6856,7 @@ void P_MobjThinker(mobj_t *mobj)
switch(mobj->target->player->kartstuff[k_itemtype])
{
case KITEM_KITCHENSINK: P_SetMobjState(mobj, S_PLAYERARROW_KITCHENSINK); break;
case KITEM_SIZEUP: P_SetMobjState(mobj, S_PLAYERARROW_SIZEUP); break;
case KITEM_GROW: P_SetMobjState(mobj, S_PLAYERARROW_GROW); break;
case KITEM_INVINCIBILITY: P_SetMobjState(mobj, S_PLAYERARROW_INVINCIBILITY); break;
case KITEM_ORBINAUT: P_SetMobjState(mobj, S_PLAYERARROW_ORBINAUT); break;
case KITEM_BALLHOG: P_SetMobjState(mobj, S_PLAYERARROW_BALLHOG); break;
@ -6868,7 +6872,7 @@ void P_MobjThinker(mobj_t *mobj)
}
if (mobj->target->player->kartstuff[k_growshrinktimer] > 1 && (leveltime & 1))
P_SetMobjState(mobj, S_PLAYERARROW_SIZEUP);
P_SetMobjState(mobj, S_PLAYERARROW_GROW);
else if (mobj->target->player->kartstuff[k_growshrinktimer] > 1 && !(leveltime & 1))
P_SetMobjState(mobj, S_PLAYERARROW_EMPTY); // S_INVISIBLE
@ -8016,6 +8020,15 @@ void P_MobjThinker(mobj_t *mobj)
mobj->tracer->y, mobj->tracer->floorz, SPLATDRAWMODE_SHADE);
#endif
break;
/*case MT_SPARKLETRAIL:
if (!mobj->target)
{
P_RemoveMobj(mobj);
return;
}
mobj->color = mobj->target->color;
mobj->colorized = mobj->target->colorized;
break;*/
case MT_SPINFIRE:
case MT_SNEAKERTRAIL:
if (mobj->eflags & MFE_VERTICALFLIP)

View File

@ -1134,7 +1134,7 @@ void P_RestoreMusic(player_t *player)
// SRB2kart - We have some different powers than vanilla, some of which tweak the music.
if (!player->exiting)
{
// Item - Size Up
// Item - Grow
if (player->kartstuff[k_growshrinktimer] > 1)
S_ChangeMusicInternal("mega", true);
@ -2268,12 +2268,12 @@ static void P_CheckInvincibilityTimer(player_t *player)
//if (mariomode && !player->powers[pw_super]) // SRB2kart
player->mo->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1)));
if (leveltime % (TICRATE/7) == 0)
/*if (leveltime % (TICRATE/7) == 0)
{
mobj_t *sparkle = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_IVSP);
sparkle->destscale = player->mo->scale;
P_SetScale(sparkle, player->mo->scale);
}
}*/
// Resume normal music stuff.
if (player->powers[pw_invulnerability] == 1 || player->kartstuff[k_invincibilitytimer] == 1)
@ -7074,6 +7074,8 @@ static void P_MovePlayer(player_t *player)
// SRB2kart - Drifting smoke and fire
if ((player->kartstuff[k_drift] != 0 || player->kartstuff[k_sneakertimer] > 0) && onground && (leveltime & 1))
K_SpawnDriftTrail(player);
if (player->kartstuff[k_invincibilitytimer] > 0)
K_SpawnSparkleTrail(player);
/* // SRB2kart - nadah
// If the player isn't on the ground, make sure they aren't in a "starting dash" position.