mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Bubble Shield, Flame Shield changes
This commit is contained in:
parent
52bd194c69
commit
99ed66ac46
10 changed files with 597 additions and 103 deletions
|
|
@ -300,21 +300,22 @@ typedef enum
|
||||||
k_itemtype, // KITEM_ constant for item number
|
k_itemtype, // KITEM_ constant for item number
|
||||||
k_itemamount, // Amount of said item
|
k_itemamount, // Amount of said item
|
||||||
k_itemheld, // Are you holding an item?
|
k_itemheld, // Are you holding an item?
|
||||||
|
k_holdready, // Hold button-style item is ready to activate
|
||||||
|
|
||||||
// Some items use timers for their duration or effects
|
// Some items use timers for their duration or effects
|
||||||
//k_thunderanim, // Duration of Thunder Shield's use animation
|
|
||||||
k_curshield, // 0 = no shield, 1 = thunder shield
|
k_curshield, // 0 = no shield, 1 = thunder shield
|
||||||
k_hyudorotimer, // Duration of the Hyudoro offroad effect itself
|
k_hyudorotimer, // Duration of the Hyudoro offroad effect itself
|
||||||
k_stealingtimer, // You are stealing an item, this is your timer
|
k_stealingtimer, // You are stealing an item, this is your timer
|
||||||
k_stolentimer, // You are being stolen from, this is your timer
|
k_stolentimer, // You are being stolen from, this is your timer
|
||||||
k_superring, // Spawn rings on top of you every tic!
|
k_superring, // Spawn rings on top of you every tic!
|
||||||
k_sneakertimer, // Duration of the Sneaker Boost itself
|
k_sneakertimer, // Duration of the Sneaker Boost itself
|
||||||
k_levelbooster, // Duration of a level booster's boost (same as sneaker, but separated for )
|
k_levelbooster, // Duration of a level booster's boost (same as sneaker, but separated for boost stacking)
|
||||||
k_growshrinktimer, // > 0 = Big, < 0 = small
|
k_growshrinktimer, // > 0 = Big, < 0 = small
|
||||||
k_squishedtimer, // Squished frame timer
|
k_squishedtimer, // Squished frame timer
|
||||||
k_rocketsneakertimer, // Rocket Sneaker duration timer
|
k_rocketsneakertimer, // Rocket Sneaker duration timer
|
||||||
k_invincibilitytimer, // Invincibility timer
|
k_invincibilitytimer, // Invincibility timer
|
||||||
k_flameready, // Flame Shield dash ready to activate
|
k_bubblecool, // Bubble Shield use cooldown
|
||||||
|
k_bubbleblowup, // Bubble Shield usage blowup
|
||||||
k_flamedash, // Flame Shield dash power
|
k_flamedash, // Flame Shield dash power
|
||||||
k_eggmanheld, // Eggman monitor held, separate from k_itemheld so it doesn't stop you from getting items
|
k_eggmanheld, // Eggman monitor held, separate from k_itemheld so it doesn't stop you from getting items
|
||||||
k_eggmanexplode, // Fake item recieved, explode in a few seconds
|
k_eggmanexplode, // Fake item recieved, explode in a few seconds
|
||||||
|
|
|
||||||
|
|
@ -6634,6 +6634,35 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
"S_THUNDERSHIELD23",
|
"S_THUNDERSHIELD23",
|
||||||
"S_THUNDERSHIELD24",
|
"S_THUNDERSHIELD24",
|
||||||
|
|
||||||
|
// Bubble Shield
|
||||||
|
"S_BUBBLESHIELD1",
|
||||||
|
"S_BUBBLESHIELD2",
|
||||||
|
"S_BUBBLESHIELD3",
|
||||||
|
"S_BUBBLESHIELD4",
|
||||||
|
"S_BUBBLESHIELD5",
|
||||||
|
"S_BUBBLESHIELD6",
|
||||||
|
"S_BUBBLESHIELD7",
|
||||||
|
"S_BUBBLESHIELD8",
|
||||||
|
"S_BUBBLESHIELD9",
|
||||||
|
"S_BUBBLESHIELD10",
|
||||||
|
"S_BUBBLESHIELD11",
|
||||||
|
"S_BUBBLESHIELD12",
|
||||||
|
"S_BUBBLESHIELD13",
|
||||||
|
"S_BUBBLESHIELD14",
|
||||||
|
"S_BUBBLESHIELD15",
|
||||||
|
"S_BUBBLESHIELD16",
|
||||||
|
"S_BUBBLESHIELD17",
|
||||||
|
"S_BUBBLESHIELD18",
|
||||||
|
"S_BUBBLESHIELDBLOWUP",
|
||||||
|
"S_BUBBLESHIELDTRAP1",
|
||||||
|
"S_BUBBLESHIELDTRAP2",
|
||||||
|
"S_BUBBLESHIELDTRAP3",
|
||||||
|
"S_BUBBLESHIELDTRAP4",
|
||||||
|
"S_BUBBLESHIELDTRAP5",
|
||||||
|
"S_BUBBLESHIELDTRAP6",
|
||||||
|
"S_BUBBLESHIELDTRAP7",
|
||||||
|
"S_BUBBLESHIELDTRAP8",
|
||||||
|
|
||||||
// Flame Shield
|
// Flame Shield
|
||||||
"S_FLAMESHIELD1",
|
"S_FLAMESHIELD1",
|
||||||
"S_FLAMESHIELD2",
|
"S_FLAMESHIELD2",
|
||||||
|
|
@ -7792,6 +7821,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_THUNDERSHIELD", // Shields
|
"MT_THUNDERSHIELD", // Shields
|
||||||
"MT_BUBBLESHIELD",
|
"MT_BUBBLESHIELD",
|
||||||
"MT_FLAMESHIELD",
|
"MT_FLAMESHIELD",
|
||||||
|
"MT_BUBBLESHIELDTRAP",
|
||||||
|
|
||||||
"MT_SINK", // Kitchen Sink Stuff
|
"MT_SINK", // Kitchen Sink Stuff
|
||||||
"MT_SINK_SHIELD",
|
"MT_SINK_SHIELD",
|
||||||
|
|
@ -8463,6 +8493,7 @@ static const char *const KARTSTUFF_LIST[] = {
|
||||||
"ITEMTYPE",
|
"ITEMTYPE",
|
||||||
"ITEMAMOUNT",
|
"ITEMAMOUNT",
|
||||||
"ITEMHELD",
|
"ITEMHELD",
|
||||||
|
"HOLDREADY",
|
||||||
|
|
||||||
"CURSHIELD",
|
"CURSHIELD",
|
||||||
"HYUDOROTIMER",
|
"HYUDOROTIMER",
|
||||||
|
|
@ -8475,7 +8506,8 @@ static const char *const KARTSTUFF_LIST[] = {
|
||||||
"SQUISHEDTIMER",
|
"SQUISHEDTIMER",
|
||||||
"ROCKETSNEAKERTIMER",
|
"ROCKETSNEAKERTIMER",
|
||||||
"INVINCIBILITYTIMER",
|
"INVINCIBILITYTIMER",
|
||||||
"FLAMEREADY",
|
"BUBBLECOOL",
|
||||||
|
"BUBBLEBLOWUP",
|
||||||
"FLAMEDASH",
|
"FLAMEDASH",
|
||||||
"EGGMANHELD",
|
"EGGMANHELD",
|
||||||
"EGGMANEXPLODE",
|
"EGGMANEXPLODE",
|
||||||
|
|
|
||||||
|
|
@ -433,6 +433,7 @@ extern INT32 hyudorotime;
|
||||||
extern INT32 stealtime;
|
extern INT32 stealtime;
|
||||||
extern INT32 sneakertime;
|
extern INT32 sneakertime;
|
||||||
extern INT32 itemtime;
|
extern INT32 itemtime;
|
||||||
|
extern INT32 bubbletime;
|
||||||
extern INT32 comebacktime;
|
extern INT32 comebacktime;
|
||||||
extern INT32 bumptime;
|
extern INT32 bumptime;
|
||||||
extern INT32 wipeoutslowtime;
|
extern INT32 wipeoutslowtime;
|
||||||
|
|
|
||||||
|
|
@ -214,6 +214,7 @@ INT32 hyudorotime = 7*TICRATE;
|
||||||
INT32 stealtime = TICRATE/2;
|
INT32 stealtime = TICRATE/2;
|
||||||
INT32 sneakertime = TICRATE + (TICRATE/3);
|
INT32 sneakertime = TICRATE + (TICRATE/3);
|
||||||
INT32 itemtime = 8*TICRATE;
|
INT32 itemtime = 8*TICRATE;
|
||||||
|
INT32 bubbletime = TICRATE/2;
|
||||||
INT32 comebacktime = 10*TICRATE;
|
INT32 comebacktime = 10*TICRATE;
|
||||||
INT32 bumptime = 6;
|
INT32 bumptime = 6;
|
||||||
INT32 wipeoutslowtime = 20;
|
INT32 wipeoutslowtime = 20;
|
||||||
|
|
|
||||||
58
src/info.c
58
src/info.c
|
|
@ -2850,6 +2850,34 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD24}, // S_THUNDERSHIELD23
|
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD24}, // S_THUNDERSHIELD23
|
||||||
{SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_THUNDERSHIELD1}, // S_THUNDERSHIELD24
|
{SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_THUNDERSHIELD1}, // S_THUNDERSHIELD24
|
||||||
|
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_BUBBLESHIELD2}, // S_BUBBLESHIELD1
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD3}, // S_BUBBLESHIELD2
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_BUBBLESHIELD4}, // S_BUBBLESHIELD3
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD5}, // S_BUBBLESHIELD4
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_BUBBLESHIELD6}, // S_BUBBLESHIELD5
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD7}, // S_BUBBLESHIELD6
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_BUBBLESHIELD8}, // S_BUBBLESHIELD7
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD9}, // S_BUBBLESHIELD8
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_BUBBLESHIELD10}, // S_BUBBLESHIELD9
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD11}, // S_BUBBLESHIELD10
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_BUBBLESHIELD12}, // S_BUBBLESHIELD11
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD13}, // S_BUBBLESHIELD12
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_BUBBLESHIELD14}, // S_BUBBLESHIELD13
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD15}, // S_BUBBLESHIELD14
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_BUBBLESHIELD16}, // S_BUBBLESHIELD15
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD17}, // S_BUBBLESHIELD16
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_BUBBLESHIELD18}, // S_BUBBLESHIELD17
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD1}, // S_BUBBLESHIELD18
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, -1, {NULL}, 0, 0, S_BUBBLESHIELDBLOWUP}, // S_BUBBLESHIELDBLOWUP
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP2}, // S_BUBBLESHIELDTRAP1
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|14, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP3}, // S_BUBBLESHIELDTRAP2
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|15, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP4}, // S_BUBBLESHIELDTRAP3
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|14, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP5}, // S_BUBBLESHIELDTRAP4
|
||||||
|
{SPR_BUBS, FF_FULLBRIGHT|13, 2, {NULL}, 0, 0, S_BUBBLESHIELDTRAP6}, // S_BUBBLESHIELDTRAP5
|
||||||
|
{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_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
|
||||||
{SPR_FLMS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_FLAMESHIELD4}, // S_FLAMESHIELD3
|
{SPR_FLMS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_FLAMESHIELD4}, // S_FLAMESHIELD3
|
||||||
|
|
@ -15957,7 +15985,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
|
|
||||||
{ // MT_BUBBLESHIELD
|
{ // MT_BUBBLESHIELD
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_THUNDERSHIELD1, // spawnstate
|
S_BUBBLESHIELD1, // spawnstate
|
||||||
1000, // spawnhealth
|
1000, // spawnhealth
|
||||||
S_NULL, // seestate
|
S_NULL, // seestate
|
||||||
sfx_None, // seesound
|
sfx_None, // seesound
|
||||||
|
|
@ -15978,7 +16006,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
16, // mass
|
16, // mass
|
||||||
0, // damage
|
0, // damage
|
||||||
sfx_None, // activesound
|
sfx_None, // activesound
|
||||||
MF_NOBLOCKMAP|MF_NOCLIP|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags
|
MF_SPECIAL|MF_NOCLIP|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -16009,6 +16037,32 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_BUBBLESHIELDTRAP
|
||||||
|
-1, // doomednum
|
||||||
|
S_BUBBLESHIELDTRAP1, // 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
|
||||||
|
20*FRACUNIT, // radius
|
||||||
|
56*FRACUNIT, // height
|
||||||
|
1, // display offset
|
||||||
|
16, // mass
|
||||||
|
0, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_SPECIAL|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
{ // MT_SINK
|
{ // MT_SINK
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
|
|
|
||||||
30
src/info.h
30
src/info.h
|
|
@ -3518,6 +3518,35 @@ typedef enum state
|
||||||
S_THUNDERSHIELD23,
|
S_THUNDERSHIELD23,
|
||||||
S_THUNDERSHIELD24,
|
S_THUNDERSHIELD24,
|
||||||
|
|
||||||
|
// Bubble Shield
|
||||||
|
S_BUBBLESHIELD1,
|
||||||
|
S_BUBBLESHIELD2,
|
||||||
|
S_BUBBLESHIELD3,
|
||||||
|
S_BUBBLESHIELD4,
|
||||||
|
S_BUBBLESHIELD5,
|
||||||
|
S_BUBBLESHIELD6,
|
||||||
|
S_BUBBLESHIELD7,
|
||||||
|
S_BUBBLESHIELD8,
|
||||||
|
S_BUBBLESHIELD9,
|
||||||
|
S_BUBBLESHIELD10,
|
||||||
|
S_BUBBLESHIELD11,
|
||||||
|
S_BUBBLESHIELD12,
|
||||||
|
S_BUBBLESHIELD13,
|
||||||
|
S_BUBBLESHIELD14,
|
||||||
|
S_BUBBLESHIELD15,
|
||||||
|
S_BUBBLESHIELD16,
|
||||||
|
S_BUBBLESHIELD17,
|
||||||
|
S_BUBBLESHIELD18,
|
||||||
|
S_BUBBLESHIELDBLOWUP,
|
||||||
|
S_BUBBLESHIELDTRAP1,
|
||||||
|
S_BUBBLESHIELDTRAP2,
|
||||||
|
S_BUBBLESHIELDTRAP3,
|
||||||
|
S_BUBBLESHIELDTRAP4,
|
||||||
|
S_BUBBLESHIELDTRAP5,
|
||||||
|
S_BUBBLESHIELDTRAP6,
|
||||||
|
S_BUBBLESHIELDTRAP7,
|
||||||
|
S_BUBBLESHIELDTRAP8,
|
||||||
|
|
||||||
// Flame Shield
|
// Flame Shield
|
||||||
S_FLAMESHIELD1,
|
S_FLAMESHIELD1,
|
||||||
S_FLAMESHIELD2,
|
S_FLAMESHIELD2,
|
||||||
|
|
@ -4708,6 +4737,7 @@ typedef enum mobj_type
|
||||||
MT_THUNDERSHIELD, // Shields
|
MT_THUNDERSHIELD, // Shields
|
||||||
MT_BUBBLESHIELD,
|
MT_BUBBLESHIELD,
|
||||||
MT_FLAMESHIELD,
|
MT_FLAMESHIELD,
|
||||||
|
MT_BUBBLESHIELDTRAP,
|
||||||
|
|
||||||
MT_SINK, // Kitchen Sink Stuff
|
MT_SINK, // Kitchen Sink Stuff
|
||||||
MT_SINK_SHIELD,
|
MT_SINK_SHIELD,
|
||||||
|
|
|
||||||
238
src/k_kart.c
238
src/k_kart.c
|
|
@ -697,7 +697,7 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] =
|
||||||
/*Grow*/ { 0, 0, 0, 1, 1, 2, 0, 0 }, // Grow
|
/*Grow*/ { 0, 0, 0, 1, 1, 2, 0, 0 }, // Grow
|
||||||
/*Shrink*/ { 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink
|
/*Shrink*/ { 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink
|
||||||
/*Thunder Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield
|
/*Thunder Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield
|
||||||
/*Bubble Shield*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Bubble Shield
|
/*Bubble Shield*/ { 0, 0, 0, 1, 2, 0, 0, 0 }, // Bubble Shield
|
||||||
/*Flame Shield*/ { 0, 0, 0, 0, 0, 0, 1, 2 }, // Flame Shield
|
/*Flame Shield*/ { 0, 0, 0, 0, 0, 0, 1, 2 }, // Flame Shield
|
||||||
/*Hyudoro*/ { 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro
|
/*Hyudoro*/ { 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro
|
||||||
/*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring
|
/*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring
|
||||||
|
|
@ -1304,8 +1304,11 @@ static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against)
|
||||||
case MT_PLAYER:
|
case MT_PLAYER:
|
||||||
if (!mobj->player)
|
if (!mobj->player)
|
||||||
break;
|
break;
|
||||||
if (against->player && !against->player->kartstuff[k_spinouttimer] && mobj->player->kartstuff[k_spinouttimer])
|
if (against->player
|
||||||
weight = 0; // Do not bump
|
&& ((!against->player->kartstuff[k_spinouttimer] && mobj->player->kartstuff[k_spinouttimer])
|
||||||
|
|| (against->player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD && mobj->player->kartstuff[k_itemtype] != KITEM_BUBBLESHIELD)
|
||||||
|
|| (against->type == MT_BUBBLESHIELD)))
|
||||||
|
weight = 0; // This player does not cause any bump action
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
weight = (mobj->player->kartweight) * mobj->scale;
|
weight = (mobj->player->kartweight) * mobj->scale;
|
||||||
|
|
@ -3856,7 +3859,6 @@ static void K_DoThunderShield(player_t *player)
|
||||||
angle_t an;
|
angle_t an;
|
||||||
|
|
||||||
S_StartSound(player->mo, sfx_zio3);
|
S_StartSound(player->mo, sfx_zio3);
|
||||||
//player->kartstuff[k_thunderanim] = 35;
|
|
||||||
P_NukeEnemies(player->mo, player->mo, RING_DIST/4);
|
P_NukeEnemies(player->mo, player->mo, RING_DIST/4);
|
||||||
|
|
||||||
// spawn vertical bolt
|
// spawn vertical bolt
|
||||||
|
|
@ -4221,14 +4223,20 @@ void K_DropHnextList(player_t *player)
|
||||||
K_DoThunderShield(player);
|
K_DoThunderShield(player);
|
||||||
player->kartstuff[k_itemtype] = KITEM_NONE;
|
player->kartstuff[k_itemtype] = KITEM_NONE;
|
||||||
player->kartstuff[k_itemamount] = 0;
|
player->kartstuff[k_itemamount] = 0;
|
||||||
player->kartstuff[k_curshield] = 0;
|
player->kartstuff[k_curshield] = KSHIELD_NONE;
|
||||||
|
}
|
||||||
|
else if (player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD)
|
||||||
|
{
|
||||||
|
player->kartstuff[k_itemtype] = KITEM_NONE;
|
||||||
|
player->kartstuff[k_itemamount] = 0;
|
||||||
|
player->kartstuff[k_curshield] = KSHIELD_NONE;
|
||||||
}
|
}
|
||||||
else if (player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)
|
else if (player->kartstuff[k_itemtype] == KITEM_FLAMESHIELD)
|
||||||
{
|
{
|
||||||
//K_PopFlameShield(player);
|
K_FlameShieldPop(player->mo);
|
||||||
player->kartstuff[k_itemtype] = KITEM_NONE;
|
player->kartstuff[k_itemtype] = KITEM_NONE;
|
||||||
player->kartstuff[k_itemamount] = 0;
|
player->kartstuff[k_itemamount] = 0;
|
||||||
player->kartstuff[k_curshield] = 0;
|
player->kartstuff[k_curshield] = KSHIELD_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
nextwork = work->hnext;
|
nextwork = work->hnext;
|
||||||
|
|
@ -5043,6 +5051,68 @@ void K_KartPlayerHUDUpdate(player_t *player)
|
||||||
|
|
||||||
#undef RINGANIM_DELAYMAX
|
#undef RINGANIM_DELAYMAX
|
||||||
|
|
||||||
|
// SRB2Kart: blockmap iterate for attraction shield users
|
||||||
|
static mobj_t *attractmo;
|
||||||
|
static fixed_t attractdist;
|
||||||
|
static inline boolean PIT_AttractingRings(mobj_t *thing)
|
||||||
|
{
|
||||||
|
if (!attractmo || P_MobjWasRemoved(attractmo))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!attractmo->player)
|
||||||
|
return false; // not a player
|
||||||
|
|
||||||
|
if (thing->health <= 0 || !thing)
|
||||||
|
return true; // dead
|
||||||
|
|
||||||
|
if (thing->type != MT_RING && thing->type != MT_FLINGRING)
|
||||||
|
return true; // not a ring
|
||||||
|
|
||||||
|
if (thing->extravalue1)
|
||||||
|
return true; // in special ring animation
|
||||||
|
|
||||||
|
if (thing->cusval)
|
||||||
|
return true; // already attracted
|
||||||
|
|
||||||
|
// see if it went over / under
|
||||||
|
if (attractmo->z - (attractdist>>2) > thing->z + thing->height)
|
||||||
|
return true; // overhead
|
||||||
|
if (attractmo->z + attractmo->height + (attractdist>>2) < thing->z)
|
||||||
|
return true; // underneath
|
||||||
|
|
||||||
|
if (P_AproxDistance(attractmo->x - thing->x, attractmo->y - thing->y) < attractdist)
|
||||||
|
return true; // Too far away
|
||||||
|
|
||||||
|
// set target
|
||||||
|
P_SetTarget(&thing->tracer, attractmo);
|
||||||
|
// flag to show it's been attracted once before
|
||||||
|
thing->cusval = 1;
|
||||||
|
return true; // find other rings
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Looks for rings near a player in the blockmap.
|
||||||
|
*
|
||||||
|
* \param pmo Player object looking for rings to attract
|
||||||
|
* \sa A_AttractChase
|
||||||
|
*/
|
||||||
|
static void K_LookForRings(mobj_t *pmo)
|
||||||
|
{
|
||||||
|
INT32 bx, by, xl, xh, yl, yh;
|
||||||
|
attractdist = FixedMul(RING_DIST, pmo->scale)>>2;
|
||||||
|
|
||||||
|
// Use blockmap to check for nearby rings
|
||||||
|
yh = (unsigned)(pmo->y + attractdist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||||
|
yl = (unsigned)(pmo->y - attractdist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||||
|
xh = (unsigned)(pmo->x + attractdist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||||
|
xl = (unsigned)(pmo->x - attractdist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||||
|
|
||||||
|
attractmo = pmo;
|
||||||
|
|
||||||
|
for (by = yl; by <= yh; by++)
|
||||||
|
for (bx = xl; bx <= xh; bx++)
|
||||||
|
P_BlockThingsIterator(bx, by, PIT_AttractingRings);
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c
|
/** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c
|
||||||
|
|
||||||
\param player player object passed from P_PlayerThink
|
\param player player object passed from P_PlayerThink
|
||||||
|
|
@ -5192,6 +5262,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
||||||
player->mo->colorized = false;
|
player->mo->colorized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (player->kartstuff[k_itemtype] == KITEM_NONE)
|
||||||
|
player->kartstuff[k_holdready] = 0;
|
||||||
|
|
||||||
// DKR style camera for boosting
|
// DKR style camera for boosting
|
||||||
if (player->karthud[khud_boostcam] != 0 || player->karthud[khud_destboostcam] != 0)
|
if (player->karthud[khud_boostcam] != 0 || player->karthud[khud_destboostcam] != 0)
|
||||||
{
|
{
|
||||||
|
|
@ -5382,6 +5455,31 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD)
|
||||||
|
{
|
||||||
|
if (RINGTOTAL(player) < 20 && !player->kartstuff[k_ringlock])
|
||||||
|
K_LookForRings(player->mo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player->kartstuff[k_itemtype] == KITEM_BUBBLESHIELD)
|
||||||
|
{
|
||||||
|
if (player->kartstuff[k_bubblecool])
|
||||||
|
player->kartstuff[k_bubblecool]--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player->kartstuff[k_bubbleblowup] = 0;
|
||||||
|
player->kartstuff[k_bubblecool] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD
|
||||||
|
|| player->exiting || player->kartstuff[k_spinouttimer] || player->kartstuff[k_squishedtimer])
|
||||||
|
{
|
||||||
|
if (player->kartstuff[k_flamedash])
|
||||||
|
K_FlameShieldPop(player->mo);
|
||||||
|
player->kartstuff[k_flamedash] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// ???
|
// ???
|
||||||
/*
|
/*
|
||||||
if (player->kartstuff[k_jmp] > 1 && onground)
|
if (player->kartstuff[k_jmp] > 1 && onground)
|
||||||
|
|
@ -5890,8 +5988,7 @@ void K_StripItems(player_t *player)
|
||||||
player->kartstuff[k_stealingtimer] = 0;
|
player->kartstuff[k_stealingtimer] = 0;
|
||||||
player->kartstuff[k_stolentimer] = 0;
|
player->kartstuff[k_stolentimer] = 0;
|
||||||
|
|
||||||
player->kartstuff[k_curshield] = 0;
|
player->kartstuff[k_curshield] = KSHIELD_NONE;
|
||||||
//player->kartstuff[k_thunderanim] = 0;
|
|
||||||
player->kartstuff[k_bananadrag] = 0;
|
player->kartstuff[k_bananadrag] = 0;
|
||||||
|
|
||||||
player->kartstuff[k_sadtimer] = 0;
|
player->kartstuff[k_sadtimer] = 0;
|
||||||
|
|
@ -5914,68 +6011,6 @@ void K_StripOther(player_t *player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SRB2Kart: blockmap iterate for attraction shield users
|
|
||||||
static mobj_t *attractmo;
|
|
||||||
static fixed_t attractdist;
|
|
||||||
static inline boolean PIT_AttractingRings(mobj_t *thing)
|
|
||||||
{
|
|
||||||
if (!attractmo || P_MobjWasRemoved(attractmo))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!attractmo->player)
|
|
||||||
return false; // not a player
|
|
||||||
|
|
||||||
if (thing->health <= 0 || !thing)
|
|
||||||
return true; // dead
|
|
||||||
|
|
||||||
if (thing->type != MT_RING && thing->type != MT_FLINGRING)
|
|
||||||
return true; // not a ring
|
|
||||||
|
|
||||||
if (thing->extravalue1)
|
|
||||||
return true; // in special ring animation
|
|
||||||
|
|
||||||
if (thing->cusval)
|
|
||||||
return true; // already attracted
|
|
||||||
|
|
||||||
// see if it went over / under
|
|
||||||
if (attractmo->z - (attractdist>>2) > thing->z + thing->height)
|
|
||||||
return true; // overhead
|
|
||||||
if (attractmo->z + attractmo->height + (attractdist>>2) < thing->z)
|
|
||||||
return true; // underneath
|
|
||||||
|
|
||||||
if (P_AproxDistance(attractmo->x - thing->x, attractmo->y - thing->y) < attractdist)
|
|
||||||
return true; // Too far away
|
|
||||||
|
|
||||||
// set target
|
|
||||||
P_SetTarget(&thing->tracer, attractmo);
|
|
||||||
// flag to show it's been attracted once before
|
|
||||||
thing->cusval = 1;
|
|
||||||
return true; // find other rings
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Looks for rings near a player in the blockmap.
|
|
||||||
*
|
|
||||||
* \param pmo Player object looking for rings to attract
|
|
||||||
* \sa A_AttractChase
|
|
||||||
*/
|
|
||||||
static void K_LookForRings(mobj_t *pmo)
|
|
||||||
{
|
|
||||||
INT32 bx, by, xl, xh, yl, yh;
|
|
||||||
attractdist = FixedMul(RING_DIST, pmo->scale)>>2;
|
|
||||||
|
|
||||||
// Use blockmap to check for nearby rings
|
|
||||||
yh = (unsigned)(pmo->y + attractdist - bmaporgy)>>MAPBLOCKSHIFT;
|
|
||||||
yl = (unsigned)(pmo->y - attractdist - bmaporgy)>>MAPBLOCKSHIFT;
|
|
||||||
xh = (unsigned)(pmo->x + attractdist - bmaporgx)>>MAPBLOCKSHIFT;
|
|
||||||
xl = (unsigned)(pmo->x - attractdist - bmaporgx)>>MAPBLOCKSHIFT;
|
|
||||||
|
|
||||||
attractmo = pmo;
|
|
||||||
|
|
||||||
for (by = yl; by <= yh; by++)
|
|
||||||
for (bx = xl; bx <= xh; bx++)
|
|
||||||
P_BlockThingsIterator(bx, by, PIT_AttractingRings);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// K_MoveKartPlayer
|
// K_MoveKartPlayer
|
||||||
//
|
//
|
||||||
|
|
@ -6408,12 +6443,44 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
case KITEM_BUBBLESHIELD:
|
case KITEM_BUBBLESHIELD:
|
||||||
if (player->kartstuff[k_curshield] != KSHIELD_BUBBLE)
|
if (player->kartstuff[k_curshield] != KSHIELD_BUBBLE)
|
||||||
{
|
{
|
||||||
//mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BUBBLESHIELD);
|
mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BUBBLESHIELD);
|
||||||
//P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2));
|
P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2));
|
||||||
//P_SetTarget(&shield->target, player->mo);
|
P_SetTarget(&shield->target, player->mo);
|
||||||
S_StartSound(player->mo, sfx_s3k3f);
|
S_StartSound(player->mo, sfx_s3k3f);
|
||||||
player->kartstuff[k_curshield] = KSHIELD_BUBBLE;
|
player->kartstuff[k_curshield] = KSHIELD_BUBBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!HOLDING_ITEM && NO_HYUDORO)
|
||||||
|
{
|
||||||
|
if (cmd->buttons & BT_ATTACK)
|
||||||
|
{
|
||||||
|
if (player->kartstuff[k_holdready])
|
||||||
|
{
|
||||||
|
if (player->kartstuff[k_bubbleblowup] == 0)
|
||||||
|
K_PlayAttackTaunt(player->mo);
|
||||||
|
player->kartstuff[k_bubbleblowup]++;
|
||||||
|
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);
|
||||||
|
P_SetScale(trap, (5*trap->destscale)>>1);
|
||||||
|
trap->destscale = (5*trap->destscale)>>2;
|
||||||
|
P_SetTarget(&trap->target, player->mo);
|
||||||
|
trap->threshold = 10;
|
||||||
|
S_StartSound(player->mo, sfx_s3k44);
|
||||||
|
|
||||||
|
player->kartstuff[k_bubbleblowup] = 0;
|
||||||
|
player->kartstuff[k_itemamount]--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (player->kartstuff[k_bubbleblowup])
|
||||||
|
player->kartstuff[k_bubbleblowup]--;
|
||||||
|
player->kartstuff[k_holdready] = (player->kartstuff[k_bubblecool] ? 0 : 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case KITEM_FLAMESHIELD:
|
case KITEM_FLAMESHIELD:
|
||||||
if (player->kartstuff[k_curshield] != KSHIELD_FLAME)
|
if (player->kartstuff[k_curshield] != KSHIELD_FLAME)
|
||||||
|
|
@ -6429,7 +6496,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
{
|
{
|
||||||
if (cmd->buttons & BT_ATTACK)
|
if (cmd->buttons & BT_ATTACK)
|
||||||
{
|
{
|
||||||
if (player->kartstuff[k_flameready])
|
if (player->kartstuff[k_holdready])
|
||||||
{
|
{
|
||||||
if (player->kartstuff[k_flamedash] == 0)
|
if (player->kartstuff[k_flamedash] == 0)
|
||||||
K_PlayBoostTaunt(player->mo);
|
K_PlayBoostTaunt(player->mo);
|
||||||
|
|
@ -6438,7 +6505,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
{
|
{
|
||||||
K_FlameShieldPop(player->mo);
|
K_FlameShieldPop(player->mo);
|
||||||
player->kartstuff[k_flamedash] = 0;
|
player->kartstuff[k_flamedash] = 0;
|
||||||
player->kartstuff[k_flameready] = 0;
|
player->kartstuff[k_holdready] = 0;
|
||||||
player->kartstuff[k_itemamount]--;
|
player->kartstuff[k_itemamount]--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6449,13 +6516,13 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
{
|
{
|
||||||
K_FlameShieldPop(player->mo);
|
K_FlameShieldPop(player->mo);
|
||||||
player->kartstuff[k_flamedash] = 0;
|
player->kartstuff[k_flamedash] = 0;
|
||||||
player->kartstuff[k_flameready] = 0;
|
player->kartstuff[k_holdready] = 0;
|
||||||
player->kartstuff[k_itemamount]--;
|
player->kartstuff[k_itemamount]--;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
player->kartstuff[k_flamedash] = 0;
|
player->kartstuff[k_flamedash] = 0;
|
||||||
player->kartstuff[k_flameready] = 1;
|
player->kartstuff[k_holdready] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6535,21 +6602,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
if (spbplace == -1 || player->kartstuff[k_position] != spbplace)
|
if (spbplace == -1 || player->kartstuff[k_position] != spbplace)
|
||||||
player->kartstuff[k_ringlock] = 0; // reset ring lock
|
player->kartstuff[k_ringlock] = 0; // reset ring lock
|
||||||
|
|
||||||
if (player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD)
|
|
||||||
{
|
|
||||||
if (RINGTOTAL(player) < 20 && !player->kartstuff[k_ringlock])
|
|
||||||
K_LookForRings(player->mo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD
|
|
||||||
|| player->exiting || player->kartstuff[k_spinouttimer] || player->kartstuff[k_squishedtimer])
|
|
||||||
{
|
|
||||||
if (player->kartstuff[k_flamedash])
|
|
||||||
K_FlameShieldPop(player->mo);
|
|
||||||
player->kartstuff[k_flamedash] = 0;
|
|
||||||
player->kartstuff[k_flameready] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (K_GetShieldFromItem(player->kartstuff[k_itemtype]) == KSHIELD_NONE)
|
if (K_GetShieldFromItem(player->kartstuff[k_itemtype]) == KSHIELD_NONE)
|
||||||
player->kartstuff[k_curshield] = KSHIELD_NONE; // RESET shield type
|
player->kartstuff[k_curshield] = KSHIELD_NONE; // RESET shield type
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -595,11 +595,12 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
{
|
{
|
||||||
mobj_t *spbexplode;
|
mobj_t *spbexplode;
|
||||||
|
|
||||||
if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0)
|
if (player->kartstuff[k_bubbleblowup] > 0)
|
||||||
{
|
{
|
||||||
//player->powers[pw_flashing] = 0;
|
|
||||||
K_DropHnextList(player);
|
K_DropHnextList(player);
|
||||||
K_StripItems(player);
|
special->extravalue1 = 2; // WAIT...
|
||||||
|
special->extravalue2 = 52; // Slightly over the respawn timer length
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
S_StopSound(special); // Don't continue playing the gurgle or the siren
|
S_StopSound(special); // Don't continue playing the gurgle or the siren
|
||||||
|
|
@ -675,6 +676,59 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
case MT_BALLOON: // SRB2kart
|
case MT_BALLOON: // SRB2kart
|
||||||
P_SetObjectMomZ(toucher, 20<<FRACBITS, false);
|
P_SetObjectMomZ(toucher, 20<<FRACBITS, false);
|
||||||
break;
|
break;
|
||||||
|
case MT_BUBBLESHIELD:
|
||||||
|
if (special->target == toucher)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (special->health <= 0 || toucher->health <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (player->spectator)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (special->target->player && special->target->player->kartstuff[k_bubbleblowup]
|
||||||
|
&& !player->kartstuff[k_spinouttimer])
|
||||||
|
{
|
||||||
|
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))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (special->tracer && !P_MobjWasRemoved(special->tracer))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (special->health <= 0 || toucher->health <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!player->mo || player->spectator)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// kill
|
||||||
|
/*if (player->kartstuff[k_invincibilitytimer] > 0
|
||||||
|
|| player->kartstuff[k_growshrinktimer] > 0
|
||||||
|
|| player->kartstuff[k_flamedash] > 0)
|
||||||
|
{
|
||||||
|
P_KillMobj(special, toucher, toucher);
|
||||||
|
return;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
// no interaction
|
||||||
|
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_hyudorotimer] > 0
|
||||||
|
|| player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// attach to player!
|
||||||
|
P_SetTarget(&special->tracer, toucher);
|
||||||
|
toucher->flags |= MF_NOGRAVITY;
|
||||||
|
toucher->momx = (4*toucher->momx)/5; // Huge initial speed cut
|
||||||
|
toucher->momy = (4*toucher->momy)/5;
|
||||||
|
toucher->momz = (8*toucher->scale) * P_MobjFlip(toucher);
|
||||||
|
//S_StartSound(special, sfx_s1a2);
|
||||||
|
return;
|
||||||
|
|
||||||
// ***************************************** //
|
// ***************************************** //
|
||||||
// Rings, coins, spheres, weapon panels, etc //
|
// Rings, coins, spheres, weapon panels, etc //
|
||||||
|
|
|
||||||
112
src/p_map.c
112
src/p_map.c
|
|
@ -750,6 +750,29 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
if (thing->player && thing->player->kartstuff[k_hyudorotimer])
|
if (thing->player && thing->player->kartstuff[k_hyudorotimer])
|
||||||
return true; // no interaction
|
return true; // no interaction
|
||||||
|
|
||||||
|
if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup])
|
||||||
|
|| (thing->player && thing->player->kartstuff[k_bubbleblowup]))
|
||||||
|
{
|
||||||
|
if (!tmthing->threshold)
|
||||||
|
{
|
||||||
|
if (!tmthing->momx && !tmthing->momy)
|
||||||
|
{
|
||||||
|
tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmthing->momx = -tmthing->momx;
|
||||||
|
tmthing->momy = -tmthing->momy;
|
||||||
|
tmthing->momz = -tmthing->momz;
|
||||||
|
}
|
||||||
|
if (tmthing->type == MT_JAWZ)
|
||||||
|
P_SetTarget(&tmthing->tracer, tmthing->target); // Back to the source!
|
||||||
|
tmthing->threshold = 10;
|
||||||
|
S_StartSound(tmthing, sfx_s3k44);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (thing->type == MT_PLAYER)
|
if (thing->type == MT_PLAYER)
|
||||||
{
|
{
|
||||||
// Player Damage
|
// Player Damage
|
||||||
|
|
@ -851,6 +874,27 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
if (thing->player && thing->player->powers[pw_flashing])
|
if (thing->player && thing->player->powers[pw_flashing])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup])
|
||||||
|
|| (thing->player && thing->player->kartstuff[k_bubbleblowup]))
|
||||||
|
{
|
||||||
|
if (!tmthing->threshold)
|
||||||
|
{
|
||||||
|
if (!tmthing->momx && !tmthing->momy)
|
||||||
|
{
|
||||||
|
tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmthing->momx = -tmthing->momx;
|
||||||
|
tmthing->momy = -tmthing->momy;
|
||||||
|
tmthing->momz = -tmthing->momz;
|
||||||
|
}
|
||||||
|
tmthing->threshold = 10;
|
||||||
|
S_StartSound(tmthing, sfx_s3k44);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (thing->type == MT_PLAYER)
|
if (thing->type == MT_PLAYER)
|
||||||
{
|
{
|
||||||
S_StartSound(NULL, sfx_bsnipe); //let all players hear it.
|
S_StartSound(NULL, sfx_bsnipe); //let all players hear it.
|
||||||
|
|
@ -913,6 +957,27 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
if (thing->player && thing->player->powers[pw_flashing])
|
if (thing->player && thing->player->powers[pw_flashing])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup])
|
||||||
|
|| (thing->player && thing->player->kartstuff[k_bubbleblowup]))
|
||||||
|
{
|
||||||
|
if (!tmthing->threshold)
|
||||||
|
{
|
||||||
|
if (!tmthing->momx && !tmthing->momy)
|
||||||
|
{
|
||||||
|
tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmthing->momx = -tmthing->momx;
|
||||||
|
tmthing->momy = -tmthing->momy;
|
||||||
|
tmthing->momz = -tmthing->momz;
|
||||||
|
}
|
||||||
|
tmthing->threshold = 10;
|
||||||
|
S_StartSound(tmthing, sfx_s3k44);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (thing->type == MT_PLAYER)
|
if (thing->type == MT_PLAYER)
|
||||||
{
|
{
|
||||||
// Banana snipe!
|
// Banana snipe!
|
||||||
|
|
@ -985,6 +1050,28 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
if (thing->player && thing->player->powers[pw_flashing])
|
if (thing->player && thing->player->powers[pw_flashing])
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// Bubble Shield reflect
|
||||||
|
if ((thing->type == MT_BUBBLESHIELD && thing->target->player && thing->target->player->kartstuff[k_bubbleblowup])
|
||||||
|
|| (thing->player && thing->player->kartstuff[k_bubbleblowup]))
|
||||||
|
{
|
||||||
|
if (!tmthing->threshold)
|
||||||
|
{
|
||||||
|
if (!tmthing->momx && !tmthing->momy)
|
||||||
|
{
|
||||||
|
tmthing->momz = (32*tmthing->scale) * P_MobjFlip(tmthing);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmthing->momx = -tmthing->momx;
|
||||||
|
tmthing->momy = -tmthing->momy;
|
||||||
|
tmthing->momz = -tmthing->momz;
|
||||||
|
}
|
||||||
|
tmthing->threshold = 10;
|
||||||
|
S_StartSound(tmthing, sfx_s3k44);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (thing->type == MT_PLAYER)
|
if (thing->type == MT_PLAYER)
|
||||||
{
|
{
|
||||||
// Bomb punting
|
// Bomb punting
|
||||||
|
|
@ -1036,6 +1123,31 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
if (tmthing->player && tmthing->player->kartstuff[k_hyudorotimer]) // I thought about doing this for just the objects below but figured it should apply to everything.
|
if (tmthing->player && tmthing->player->kartstuff[k_hyudorotimer]) // I thought about doing this for just the objects below but figured it should apply to everything.
|
||||||
return true; // no interaction
|
return true; // no interaction
|
||||||
|
|
||||||
|
// Bubble Shield reflect
|
||||||
|
if (((tmthing->type == MT_BUBBLESHIELD && tmthing->target->player && tmthing->target->player->kartstuff[k_bubbleblowup])
|
||||||
|
|| (tmthing->player && tmthing->player->kartstuff[k_bubbleblowup]))
|
||||||
|
&& (thing->type != MT_MINEEXPLOSION))
|
||||||
|
{
|
||||||
|
if (!thing->threshold)
|
||||||
|
{
|
||||||
|
if (!thing->momx && !thing->momy)
|
||||||
|
{
|
||||||
|
thing->momz = (32*thing->scale) * P_MobjFlip(thing);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
thing->momx = -thing->momx;
|
||||||
|
thing->momy = -thing->momy;
|
||||||
|
thing->momz = -thing->momz;
|
||||||
|
}
|
||||||
|
if (thing->type == MT_JAWZ)
|
||||||
|
P_SetTarget(&thing->tracer, thing->target); // Back to the source!
|
||||||
|
thing->threshold = 10;
|
||||||
|
S_StartSound(thing, sfx_s3k44);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (thing->type == MT_ORBINAUT_SHIELD || thing->type == MT_JAWZ_SHIELD
|
if (thing->type == MT_ORBINAUT_SHIELD || thing->type == MT_JAWZ_SHIELD
|
||||||
|| thing->type == MT_ORBINAUT || thing->type == MT_JAWZ || thing->type == MT_JAWZ_DUD)
|
|| thing->type == MT_ORBINAUT || thing->type == MT_JAWZ || thing->type == MT_JAWZ_DUD)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
159
src/p_mobj.c
159
src/p_mobj.c
|
|
@ -8399,6 +8399,100 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
P_TeleportMove(mobj, destx, desty, mobj->target->z);
|
P_TeleportMove(mobj, destx, desty, mobj->target->z);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MT_BUBBLESHIELD:
|
||||||
|
{
|
||||||
|
fixed_t destx, desty;
|
||||||
|
fixed_t scale;
|
||||||
|
statenum_t curstate;
|
||||||
|
|
||||||
|
if (!mobj->target || !mobj->target->health || !mobj->target->player
|
||||||
|
|| mobj->target->player->kartstuff[k_curshield] != KSHIELD_BUBBLE)
|
||||||
|
{
|
||||||
|
P_RemoveMobj(mobj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
scale = (5*mobj->target->destscale)>>2;
|
||||||
|
curstate = ((mobj->tics == 1) ? (mobj->state->nextstate) : ((statenum_t)(mobj->state-states)));
|
||||||
|
|
||||||
|
if (mobj->target->player->kartstuff[k_bubbleblowup])
|
||||||
|
{
|
||||||
|
INT32 blow = mobj->target->player->kartstuff[k_bubbleblowup];
|
||||||
|
|
||||||
|
if (curstate != S_BUBBLESHIELDBLOWUP)
|
||||||
|
P_SetMobjState(mobj, S_BUBBLESHIELDBLOWUP);
|
||||||
|
|
||||||
|
mobj->flags2 &= ~MF2_SHADOW;
|
||||||
|
scale += (blow * (scale<<1)) / bubbletime;
|
||||||
|
|
||||||
|
mobj->frame = (states[S_BUBBLESHIELDBLOWUP].frame + mobj->extravalue1);
|
||||||
|
|
||||||
|
if (mobj->extravalue1 < 4 && mobj->extravalue2 < blow && !mobj->cvmem && (leveltime & 1)) // Growing
|
||||||
|
{
|
||||||
|
mobj->extravalue1++;
|
||||||
|
if (mobj->extravalue1 >= 4)
|
||||||
|
mobj->cvmem = 1; // shrink back down
|
||||||
|
}
|
||||||
|
else if ((mobj->extravalue1 > -4 && mobj->extravalue2 > blow)
|
||||||
|
|| (mobj->cvmem && mobj->extravalue1 > 0)) // Shrinking
|
||||||
|
mobj->extravalue1--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mobj->cvmem = 0;
|
||||||
|
|
||||||
|
if (curstate == S_BUBBLESHIELDBLOWUP)
|
||||||
|
{
|
||||||
|
if (mobj->extravalue1 != 0)
|
||||||
|
{
|
||||||
|
mobj->frame = (states[S_BUBBLESHIELDBLOWUP].frame + mobj->extravalue1);
|
||||||
|
|
||||||
|
if (mobj->extravalue1 < 0 && (leveltime & 1))
|
||||||
|
mobj->extravalue1++;
|
||||||
|
else if (mobj->extravalue1 > 0)
|
||||||
|
mobj->extravalue1--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
P_SetMobjState(mobj, S_BUBBLESHIELD1);
|
||||||
|
mobj->extravalue1 = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (mobj->target->player->kartstuff[k_bubblecool] && ((curstate-S_BUBBLESHIELD1) & 1))
|
||||||
|
mobj->flags2 |= MF2_SHADOW;
|
||||||
|
else
|
||||||
|
mobj->flags2 &= ~MF2_SHADOW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mobj->extravalue2 = mobj->target->player->kartstuff[k_bubbleblowup];
|
||||||
|
P_SetScale(mobj, (mobj->destscale = scale));
|
||||||
|
|
||||||
|
if (!splitscreen /*&& rendermode != render_soft*/)
|
||||||
|
{
|
||||||
|
angle_t viewingangle;
|
||||||
|
|
||||||
|
if (players[displayplayers[0]].awayviewtics)
|
||||||
|
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayviewmobj->x, players[displayplayers[0]].awayviewmobj->y);
|
||||||
|
else if (!camera[0].chase && players[displayplayers[0]].mo)
|
||||||
|
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y);
|
||||||
|
else
|
||||||
|
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y);
|
||||||
|
|
||||||
|
destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4);
|
||||||
|
desty = mobj->target->y + P_ReturnThrustY(mobj->target, viewingangle, mobj->scale>>4);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
destx = mobj->target->x;
|
||||||
|
desty = mobj->target->y;
|
||||||
|
}
|
||||||
|
|
||||||
|
P_TeleportMove(mobj, destx, desty, mobj->target->z);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MT_FLAMESHIELD:
|
case MT_FLAMESHIELD:
|
||||||
{
|
{
|
||||||
fixed_t destx, desty;
|
fixed_t destx, desty;
|
||||||
|
|
@ -9122,6 +9216,69 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MT_BUBBLESHIELDTRAP:
|
||||||
|
if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->player)
|
||||||
|
{
|
||||||
|
player_t *player = mobj->tracer->player;
|
||||||
|
|
||||||
|
mobj->extravalue1 = 1;
|
||||||
|
|
||||||
|
P_TeleportMove(mobj,
|
||||||
|
mobj->tracer->x + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<<FRACBITS),
|
||||||
|
mobj->tracer->y + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<<FRACBITS),
|
||||||
|
mobj->tracer->z + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<<FRACBITS));
|
||||||
|
|
||||||
|
mobj->cvmem /= 2;
|
||||||
|
mobj->momz = 0;
|
||||||
|
mobj->destscale = (5*mobj->tracer->scale)>>2;
|
||||||
|
|
||||||
|
mobj->tracer->momx = (31*mobj->tracer->momx)/32;
|
||||||
|
mobj->tracer->momy = (31*mobj->tracer->momy)/32;
|
||||||
|
mobj->tracer->momz = (8*mobj->tracer->scale) * P_MobjFlip(mobj->tracer);
|
||||||
|
|
||||||
|
if (mobj->movecount > 8*TICRATE)
|
||||||
|
{
|
||||||
|
S_StartSound(mobj->tracer, sfx_s3k77);
|
||||||
|
mobj->tracer->flags &= ~MF_NOGRAVITY;
|
||||||
|
P_KillMobj(mobj, mobj->tracer, mobj->tracer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (abs(player->cmd.driftturn) > 100)
|
||||||
|
{
|
||||||
|
INT32 lastsign = 0;
|
||||||
|
if (mobj->lastlook > 0)
|
||||||
|
lastsign = 1;
|
||||||
|
else if (mobj->lastlook < 0)
|
||||||
|
lastsign = -1;
|
||||||
|
|
||||||
|
if ((player->cmd.driftturn > 0 && lastsign < 0)
|
||||||
|
|| (player->cmd.driftturn < 0 && lastsign > 0))
|
||||||
|
{
|
||||||
|
mobj->movecount += (TICRATE/2);
|
||||||
|
mobj->cvmem = 8*lastsign;
|
||||||
|
S_StartSound(mobj, sfx_s3k7a);
|
||||||
|
}
|
||||||
|
|
||||||
|
mobj->lastlook = player->cmd.driftturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
mobj->movecount++;
|
||||||
|
}
|
||||||
|
else if (mobj->extravalue1) // lost your player somehow, DIE
|
||||||
|
{
|
||||||
|
mobj->tracer->flags &= ~MF_NOGRAVITY;
|
||||||
|
P_KillMobj(mobj, NULL, NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mobj->momz = 0;
|
||||||
|
mobj->destscale = (5*mapobjectscale)>>2;
|
||||||
|
if (mobj->threshold > 0)
|
||||||
|
mobj->threshold--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case MT_KARMAFIREWORK:
|
case MT_KARMAFIREWORK:
|
||||||
if (mobj->momz == 0)
|
if (mobj->momz == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -10179,7 +10336,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
||||||
case MT_SSMINE: case MT_SSMINE_SHIELD:
|
case MT_SSMINE: case MT_SSMINE_SHIELD:
|
||||||
case MT_BALLHOG: case MT_SINK:
|
case MT_BALLHOG: case MT_SINK:
|
||||||
case MT_THUNDERSHIELD: case MT_BUBBLESHIELD: case MT_FLAMESHIELD:
|
case MT_THUNDERSHIELD: case MT_BUBBLESHIELD: case MT_FLAMESHIELD:
|
||||||
case MT_ROCKETSNEAKER:
|
case MT_ROCKETSNEAKER: case MT_BUBBLESHIELDTRAP:
|
||||||
case MT_SPB:
|
case MT_SPB:
|
||||||
P_SpawnShadowMobj(mobj);
|
P_SpawnShadowMobj(mobj);
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue