Bubble Shield waves

This commit is contained in:
TehRealSalt 2019-05-21 15:46:42 -04:00
parent f26deae97c
commit 02bd05ff2b
6 changed files with 83 additions and 28 deletions

View file

@ -6662,6 +6662,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
"S_BUBBLESHIELDTRAP6", "S_BUBBLESHIELDTRAP6",
"S_BUBBLESHIELDTRAP7", "S_BUBBLESHIELDTRAP7",
"S_BUBBLESHIELDTRAP8", "S_BUBBLESHIELDTRAP8",
"S_BUBBLESHIELDWAVE1",
"S_BUBBLESHIELDWAVE2",
"S_BUBBLESHIELDWAVE3",
"S_BUBBLESHIELDWAVE4",
"S_BUBBLESHIELDWAVE5",
"S_BUBBLESHIELDWAVE6",
// Flame Shield // Flame Shield
"S_FLAMESHIELD1", "S_FLAMESHIELD1",

View file

@ -57,19 +57,19 @@ char sprnames[NUMSPRITES + 1][5] =
//SRB2kart Sprites //SRB2kart Sprites
"SPRG","BSPR","RNDM","RPOP","SGNS","FAST","DSHR","BOST","BOSM","KFRE", "SPRG","BSPR","RNDM","RPOP","SGNS","FAST","DSHR","BOST","BOSM","KFRE",
"KINV","KINF","WIPD","DRIF","BDRF","DUST","RSHE","FITM","BANA","ORBN", "KINV","KINF","WIPD","DRIF","BDRF","DUST","RSHE","FITM","BANA","ORBN",
"JAWZ","SSMN","KRBM","BHOG","BHBM","SPBM","THNS","BUBS","FLMS","SINK", "JAWZ","SSMN","KRBM","BHOG","BHBM","SPBM","THNS","BUBS","BWVE","FLMS",
"SITR","KBLN","DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS", "SINK","SITR","KBLN","DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS",
"BUZB","CHOM","SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW", "SPRS","BUZB","CHOM","SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS",
"ISTA","ISTB","ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","HIT1", "PSHW","ISTA","ISTB","ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM",
"HIT2","HIT3","RETI","AIDU","KSPK","LZI1","LZI2","KLIT","FZSM","FZBM", "HIT1","HIT2","HIT3","RETI","AIDU","KSPK","LZI1","LZI2","KLIT","FZSM",
"FPRT","SBUS","MARB","FUFO","RUST","BLON","VAPE","HTZA","HTZB","SGVA", "FZBM","FPRT","SBUS","MARB","FUFO","RUST","BLON","VAPE","HTZA","HTZB",
"SGVB","SGVC","PGTR","PGF1","PGF2","PGF3","PGBH","DPLR","SPTL","ENM1", "SGVA","SGVB","SGVC","PGTR","PGF1","PGF2","PGF3","PGBH","DPLR","SPTL",
"GARU","MARR","REAP","JITB","CDMO","CDBU","PINE","PPLR","DPPT","AATR", "ENM1","GARU","MARR","REAP","JITB","CDMO","CDBU","PINE","PPLR","DPPT",
"COCO","BDST","FROG","CBRA","HOLE","BBRA","EGFG","SMKP","MTYM","THWP", "AATR","COCO","BDST","FROG","CBRA","HOLE","BBRA","EGFG","SMKP","MTYM",
"SNOB","ICEB","CNDL","DOCH","DUCK","GTRE","CHES","CHIM","DRGN","LZMN", "THWP","SNOB","ICEB","CNDL","DOCH","DUCK","GTRE","CHES","CHIM","DRGN",
"PGSS","ZTCH","MKMA","MKMP","RTCH","BOWL","BOWH","BRRL","BRRR","HRSE", "LZMN","PGSS","ZTCH","MKMA","MKMP","RTCH","BOWL","BOWH","BRRL","BRRR",
"TOAH","BFRT","OFRT","RFRT","PFRT","ASPK","HBST","HBSO","HBSF","WBLZ", "HRSE","TOAH","BFRT","OFRT","RFRT","PFRT","ASPK","HBST","HBSO","HBSF",
"WBLN","FWRK","MXCL","RGSP","DRAF","XMS4","XMS5","VIEW" "WBLZ","WBLN","FWRK","MXCL","RGSP","DRAF","XMS4","XMS5","VIEW"
}; };
// Doesn't work with g++, needs actionf_p1 (don't modify this comment) // Doesn't work with g++, needs actionf_p1 (don't modify this comment)
@ -2877,6 +2877,12 @@ state_t states[NUMSTATES] =
{SPR_BUBS, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP7}, // S_BUBBLESHIELDTRAP6 {SPR_BUBS, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP7}, // S_BUBBLESHIELDTRAP6
{SPR_BUBS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP8}, // S_BUBBLESHIELDTRAP7 {SPR_BUBS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP8}, // S_BUBBLESHIELDTRAP7
{SPR_BUBS, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP1}, // S_BUBBLESHIELDTRAP8 {SPR_BUBS, FF_FULLBRIGHT|12, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP1}, // S_BUBBLESHIELDTRAP8
{SPR_BWVE, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_BUBBLESHIELDWAVE2}, // S_BUBBLESHIELDWAVE1
{SPR_BWVE, FF_FULLBRIGHT|1, 1, {NULL}, 0, 0, S_BUBBLESHIELDWAVE3}, // S_BUBBLESHIELDWAVE2
{SPR_BWVE, FF_FULLBRIGHT|2, 1, {NULL}, 0, 0, S_BUBBLESHIELDWAVE4}, // S_BUBBLESHIELDWAVE3
{SPR_BWVE, FF_FULLBRIGHT|3, 1, {NULL}, 0, 0, S_BUBBLESHIELDWAVE5}, // S_BUBBLESHIELDWAVE4
{SPR_BWVE, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_BUBBLESHIELDWAVE6}, // S_BUBBLESHIELDWAVE5
{SPR_BWVE, FF_FULLBRIGHT|5, 1, {NULL}, 0, 0, S_NULL}, // S_BUBBLESHIELDWAVE6
{SPR_FLMS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_FLAMESHIELD2}, // S_FLAMESHIELD1 {SPR_FLMS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_FLAMESHIELD2}, // S_FLAMESHIELD1
{SPR_FLMS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_FLAMESHIELD3}, // S_FLAMESHIELD2 {SPR_FLMS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_FLAMESHIELD3}, // S_FLAMESHIELD2
@ -15973,7 +15979,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL, // xdeathstate S_NULL, // xdeathstate
sfx_None, // deathsound sfx_None, // deathsound
8, // speed 8, // speed
20*FRACUNIT, // radius 28*FRACUNIT, // radius
56*FRACUNIT, // height 56*FRACUNIT, // height
1, // display offset 1, // display offset
16, // mass 16, // mass
@ -16000,7 +16006,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL, // xdeathstate S_NULL, // xdeathstate
sfx_None, // deathsound sfx_None, // deathsound
8, // speed 8, // speed
20*FRACUNIT, // radius 28*FRACUNIT, // radius
56*FRACUNIT, // height 56*FRACUNIT, // height
1, // display offset 1, // display offset
16, // mass 16, // mass
@ -16027,7 +16033,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL, // xdeathstate S_NULL, // xdeathstate
sfx_None, // deathsound sfx_None, // deathsound
8, // speed 8, // speed
20*FRACUNIT, // radius 28*FRACUNIT, // radius
56*FRACUNIT, // height 56*FRACUNIT, // height
1, // display offset 1, // display offset
16, // mass 16, // mass

View file

@ -618,6 +618,7 @@ typedef enum sprite
SPR_SPBM, // Self-Propelled Bomb SPR_SPBM, // Self-Propelled Bomb
SPR_THNS, // Thunder Shield SPR_THNS, // Thunder Shield
SPR_BUBS, // Bubble Shield (not Bubs) SPR_BUBS, // Bubble Shield (not Bubs)
SPR_BWVE, // Bubble Shield waves
SPR_FLMS, // Flame Shield SPR_FLMS, // Flame Shield
SPR_SINK, // Kitchen Sink SPR_SINK, // Kitchen Sink
SPR_SITR, // Kitchen Sink Trail SPR_SITR, // Kitchen Sink Trail
@ -3546,6 +3547,12 @@ typedef enum state
S_BUBBLESHIELDTRAP6, S_BUBBLESHIELDTRAP6,
S_BUBBLESHIELDTRAP7, S_BUBBLESHIELDTRAP7,
S_BUBBLESHIELDTRAP8, S_BUBBLESHIELDTRAP8,
S_BUBBLESHIELDWAVE1,
S_BUBBLESHIELDWAVE2,
S_BUBBLESHIELDWAVE3,
S_BUBBLESHIELDWAVE4,
S_BUBBLESHIELDWAVE5,
S_BUBBLESHIELDWAVE6,
// Flame Shield // Flame Shield
S_FLAMESHIELD1, S_FLAMESHIELD1,

View file

@ -6465,7 +6465,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->kartstuff[k_bubblecool] = TICRATE+bubbletime; player->kartstuff[k_bubblecool] = TICRATE+bubbletime;
if (player->kartstuff[k_bubbleblowup] > bubbletime) if (player->kartstuff[k_bubbleblowup] > bubbletime)
{ {
mobj_t *trap = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BUBBLESHIELDTRAP); mobj_t *trap = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy, player->mo->z + player->mo->momz, MT_BUBBLESHIELDTRAP);
P_SetScale(trap, (5*trap->destscale)>>1); P_SetScale(trap, (5*trap->destscale)>>1);
trap->destscale = (5*trap->destscale)>>2; trap->destscale = (5*trap->destscale)>>2;
P_SetTarget(&trap->target, player->mo); P_SetTarget(&trap->target, player->mo);

View file

@ -686,13 +686,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
if (player->spectator) if (player->spectator)
return; return;
if (special->target->player && special->target->player->kartstuff[k_bubbleblowup] if (special->target->player && special->target->player->kartstuff[k_bubbleblowup])
&& !player->kartstuff[k_spinouttimer])
{
K_SpinPlayer(player, special->target, 0, special, false); K_SpinPlayer(player, special->target, 0, special, false);
if (player->kartstuff[k_spinouttimer]) // Successfully spun out
K_KartBouncing(toucher, special, false, true);
}
return; return;
case MT_BUBBLESHIELDTRAP: case MT_BUBBLESHIELDTRAP:
if ((special->target == toucher || special->target == toucher->target) && (special->threshold > 0)) if ((special->target == toucher || special->target == toucher->target) && (special->threshold > 0))

View file

@ -6205,7 +6205,7 @@ void P_RunShadows(void)
for (mobj = shadowcap; mobj; mobj = next) for (mobj = shadowcap; mobj; mobj = next)
{ {
fixed_t floorz; fixed_t floorz, rad;
next = mobj->hnext; next = mobj->hnext;
P_SetTarget(&mobj->hnext, NULL); P_SetTarget(&mobj->hnext, NULL);
@ -6227,8 +6227,24 @@ void P_RunShadows(void)
|| (!(mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z < floorz)) || (!(mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z < floorz))
mobj->flags2 |= MF2_DONTDRAW; mobj->flags2 |= MF2_DONTDRAW;
rad = mobj->info->radius;
switch (mobj->type)
{
case MT_FLOATINGITEM:
rad /= 3;
break;
case MT_THUNDERSHIELD:
case MT_BUBBLESHIELD:
case MT_FLAMESHIELD:
rad = 10<<FRACBITS;
break;
default:
break;
}
// First scale to the same radius // First scale to the same radius
P_SetScale(mobj, FixedDiv(mobj->target->radius, mobj->info->radius)); P_SetScale(mobj, FixedDiv(mobj->target->radius, rad));
dest = mobj->target; dest = mobj->target;
@ -6263,9 +6279,6 @@ void P_RunShadows(void)
break; break;
} }
} }
if (mobj->target->type == MT_FLOATINGITEM)
P_SetScale(mobj, mobj->scale/3);
} }
P_SetTarget(&shadowcap, NULL); P_SetTarget(&shadowcap, NULL);
} }
@ -8422,6 +8435,7 @@ void P_MobjThinker(mobj_t *mobj)
if (curstate != S_BUBBLESHIELDBLOWUP) if (curstate != S_BUBBLESHIELDBLOWUP)
P_SetMobjState(mobj, S_BUBBLESHIELDBLOWUP); P_SetMobjState(mobj, S_BUBBLESHIELDBLOWUP);
mobj->angle += ANGLE_22h;
mobj->flags2 &= ~MF2_SHADOW; mobj->flags2 &= ~MF2_SHADOW;
scale += (blow * (scale<<1)) / bubbletime; scale += (blow * (scale<<1)) / bubbletime;
@ -8436,10 +8450,37 @@ void P_MobjThinker(mobj_t *mobj)
else if ((mobj->extravalue1 > -4 && mobj->extravalue2 > blow) else if ((mobj->extravalue1 > -4 && mobj->extravalue2 > blow)
|| (mobj->cvmem && mobj->extravalue1 > 0)) // Shrinking || (mobj->cvmem && mobj->extravalue1 > 0)) // Shrinking
mobj->extravalue1--; mobj->extravalue1--;
if (P_IsObjectOnGround(mobj->target))
{
mobj_t *wave;
wave = P_SpawnMobj(
mobj->target->x + P_ReturnThrustX(NULL, mobj->angle, mobj->radius),
mobj->target->y + P_ReturnThrustY(NULL, mobj->angle, mobj->radius),
mobj->target->z, MT_THOK);
wave->flags &= ~(MF_NOCLIPHEIGHT|MF_NOGRAVITY);
wave->momx = mobj->target->momx;
wave->momy = mobj->target->momy;
wave->momz = mobj->target->momz;
P_SetMobjState(wave, S_BUBBLESHIELDWAVE1);
// same thing, but + ANGLE_180
wave = P_SpawnMobj(
mobj->target->x + P_ReturnThrustX(NULL, mobj->angle + ANGLE_180, mobj->radius),
mobj->target->y + P_ReturnThrustY(NULL, mobj->angle + ANGLE_180, mobj->radius),
mobj->target->z, MT_THOK);
wave->flags &= ~(MF_NOCLIPHEIGHT|MF_NOGRAVITY);
wave->momx = mobj->target->momx;
wave->momy = mobj->target->momy;
wave->momz = mobj->target->momz;
P_SetMobjState(wave, S_BUBBLESHIELDWAVE1);
}
} }
else else
{ {
mobj->cvmem = 0; mobj->cvmem = 0;
mobj->angle = mobj->target->angle;
if (curstate == S_BUBBLESHIELDBLOWUP) if (curstate == S_BUBBLESHIELDBLOWUP)
{ {