diff --git a/src/dehacked.c b/src/dehacked.c index 5de479c9e..2ed7a45c7 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -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", diff --git a/src/info.c b/src/info.c index f7d60dff3..deae2828a 100644 --- a/src/info.c +++ b/src/info.c @@ -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 diff --git a/src/info.h b/src/info.h index 000d2fb93..f6324c1d9 100644 --- a/src/info.h +++ b/src/info.h @@ -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, diff --git a/src/k_kart.c b/src/k_kart.c index c1c59986a..9e123e16c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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); diff --git a/src/p_inter.c b/src/p_inter.c index 760026944..941899c16 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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)) diff --git a/src/p_mobj.c b/src/p_mobj.c index 775af90e1..7b4bcc212 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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<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) {