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_BUBBLESHIELDTRAP7",
"S_BUBBLESHIELDTRAP8",
"S_BUBBLESHIELDWAVE1",
"S_BUBBLESHIELDWAVE2",
"S_BUBBLESHIELDWAVE3",
"S_BUBBLESHIELDWAVE4",
"S_BUBBLESHIELDWAVE5",
"S_BUBBLESHIELDWAVE6",
// Flame Shield
"S_FLAMESHIELD1",

View file

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

View file

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

View file

@ -6465,7 +6465,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->kartstuff[k_bubblecool] = TICRATE+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);
trap->destscale = (5*trap->destscale)>>2;
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)
return;
if (special->target->player && special->target->player->kartstuff[k_bubbleblowup]
&& !player->kartstuff[k_spinouttimer])
{
if (special->target->player && special->target->player->kartstuff[k_bubbleblowup])
K_SpinPlayer(player, special->target, 0, special, false);
if (player->kartstuff[k_spinouttimer]) // Successfully spun out
K_KartBouncing(toucher, special, false, true);
}
return;
case MT_BUBBLESHIELDTRAP:
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)
{
fixed_t floorz;
fixed_t floorz, rad;
next = mobj->hnext;
P_SetTarget(&mobj->hnext, NULL);
@ -6227,8 +6227,24 @@ void P_RunShadows(void)
|| (!(mobj->target->eflags & MFE_VERTICALFLIP) && mobj->target->z < floorz))
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
P_SetScale(mobj, FixedDiv(mobj->target->radius, mobj->info->radius));
P_SetScale(mobj, FixedDiv(mobj->target->radius, rad));
dest = mobj->target;
@ -6263,9 +6279,6 @@ void P_RunShadows(void)
break;
}
}
if (mobj->target->type == MT_FLOATINGITEM)
P_SetScale(mobj, mobj->scale/3);
}
P_SetTarget(&shadowcap, NULL);
}
@ -8422,6 +8435,7 @@ void P_MobjThinker(mobj_t *mobj)
if (curstate != S_BUBBLESHIELDBLOWUP)
P_SetMobjState(mobj, S_BUBBLESHIELDBLOWUP);
mobj->angle += ANGLE_22h;
mobj->flags2 &= ~MF2_SHADOW;
scale += (blow * (scale<<1)) / bubbletime;
@ -8436,10 +8450,37 @@ void P_MobjThinker(mobj_t *mobj)
else if ((mobj->extravalue1 > -4 && mobj->extravalue2 > blow)
|| (mobj->cvmem && mobj->extravalue1 > 0)) // Shrinking
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
{
mobj->cvmem = 0;
mobj->angle = mobj->target->angle;
if (curstate == S_BUBBLESHIELDBLOWUP)
{