mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-05-04 16:02:48 +00:00
Merge branch 'rewrite-lightning' into 'master'
Lightning Shield fixes See merge request KartKrew/Kart!589
This commit is contained in:
commit
8718d2c2f3
16 changed files with 364 additions and 198 deletions
|
|
@ -354,7 +354,7 @@ consvar_t cv_ballhog = CVAR_INIT ("ballhog", "On", CV_NETVAR|CV_CHEAT, CV
|
||||||
consvar_t cv_selfpropelledbomb = CVAR_INIT ("selfpropelledbomb", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
consvar_t cv_selfpropelledbomb = CVAR_INIT ("selfpropelledbomb", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||||
consvar_t cv_grow = CVAR_INIT ("grow", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
consvar_t cv_grow = CVAR_INIT ("grow", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||||
consvar_t cv_shrink = CVAR_INIT ("shrink", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
consvar_t cv_shrink = CVAR_INIT ("shrink", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||||
consvar_t cv_thundershield = CVAR_INIT ("thundershield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
consvar_t cv_lightningshield = CVAR_INIT ("lightningshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||||
consvar_t cv_bubbleshield = CVAR_INIT ("bubbleshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
consvar_t cv_bubbleshield = CVAR_INIT ("bubbleshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||||
consvar_t cv_flameshield = CVAR_INIT ("flameshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
consvar_t cv_flameshield = CVAR_INIT ("flameshield", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||||
consvar_t cv_hyudoro = CVAR_INIT ("hyudoro", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
consvar_t cv_hyudoro = CVAR_INIT ("hyudoro", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_res
|
||||||
extern consvar_t cv_superring, cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
|
extern consvar_t cv_superring, cv_sneaker, cv_rocketsneaker, cv_invincibility, cv_banana;
|
||||||
extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine, cv_landmine, cv_droptarget;
|
extern consvar_t cv_eggmanmonitor, cv_orbinaut, cv_jawz, cv_mine, cv_landmine, cv_droptarget;
|
||||||
extern consvar_t cv_ballhog, cv_selfpropelledbomb, cv_grow, cv_shrink;
|
extern consvar_t cv_ballhog, cv_selfpropelledbomb, cv_grow, cv_shrink;
|
||||||
extern consvar_t cv_thundershield, cv_bubbleshield, cv_flameshield;
|
extern consvar_t cv_lightningshield, cv_bubbleshield, cv_flameshield;
|
||||||
extern consvar_t cv_hyudoro, cv_pogospring, cv_kitchensink;
|
extern consvar_t cv_hyudoro, cv_pogospring, cv_kitchensink;
|
||||||
|
|
||||||
extern consvar_t cv_dualsneaker, cv_triplesneaker, cv_triplebanana, cv_decabanana;
|
extern consvar_t cv_dualsneaker, cv_triplesneaker, cv_triplebanana, cv_decabanana;
|
||||||
|
|
|
||||||
|
|
@ -145,7 +145,7 @@ Run this macro, then #undef FOREACH afterward
|
||||||
FOREACH (SPB, 11),\
|
FOREACH (SPB, 11),\
|
||||||
FOREACH (GROW, 12),\
|
FOREACH (GROW, 12),\
|
||||||
FOREACH (SHRINK, 13),\
|
FOREACH (SHRINK, 13),\
|
||||||
FOREACH (THUNDERSHIELD, 14),\
|
FOREACH (LIGHTNINGSHIELD, 14),\
|
||||||
FOREACH (BUBBLESHIELD, 15),\
|
FOREACH (BUBBLESHIELD, 15),\
|
||||||
FOREACH (FLAMESHIELD, 16),\
|
FOREACH (FLAMESHIELD, 16),\
|
||||||
FOREACH (HYUDORO, 17),\
|
FOREACH (HYUDORO, 17),\
|
||||||
|
|
@ -177,7 +177,7 @@ typedef enum
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
KSHIELD_NONE = 0,
|
KSHIELD_NONE = 0,
|
||||||
KSHIELD_THUNDER = 1,
|
KSHIELD_LIGHTNING = 1,
|
||||||
KSHIELD_BUBBLE = 2,
|
KSHIELD_BUBBLE = 2,
|
||||||
KSHIELD_FLAME = 3,
|
KSHIELD_FLAME = 3,
|
||||||
NUMKARTSHIELDS
|
NUMKARTSHIELDS
|
||||||
|
|
|
||||||
|
|
@ -3640,31 +3640,31 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
||||||
"S_SPB20",
|
"S_SPB20",
|
||||||
"S_SPB_DEAD",
|
"S_SPB_DEAD",
|
||||||
|
|
||||||
// Thunder Shield
|
// Lightning Shield
|
||||||
"S_THUNDERSHIELD1",
|
"S_LIGHTNINGSHIELD1",
|
||||||
"S_THUNDERSHIELD2",
|
"S_LIGHTNINGSHIELD2",
|
||||||
"S_THUNDERSHIELD3",
|
"S_LIGHTNINGSHIELD3",
|
||||||
"S_THUNDERSHIELD4",
|
"S_LIGHTNINGSHIELD4",
|
||||||
"S_THUNDERSHIELD5",
|
"S_LIGHTNINGSHIELD5",
|
||||||
"S_THUNDERSHIELD6",
|
"S_LIGHTNINGSHIELD6",
|
||||||
"S_THUNDERSHIELD7",
|
"S_LIGHTNINGSHIELD7",
|
||||||
"S_THUNDERSHIELD8",
|
"S_LIGHTNINGSHIELD8",
|
||||||
"S_THUNDERSHIELD9",
|
"S_LIGHTNINGSHIELD9",
|
||||||
"S_THUNDERSHIELD10",
|
"S_LIGHTNINGSHIELD10",
|
||||||
"S_THUNDERSHIELD11",
|
"S_LIGHTNINGSHIELD11",
|
||||||
"S_THUNDERSHIELD12",
|
"S_LIGHTNINGSHIELD12",
|
||||||
"S_THUNDERSHIELD13",
|
"S_LIGHTNINGSHIELD13",
|
||||||
"S_THUNDERSHIELD14",
|
"S_LIGHTNINGSHIELD14",
|
||||||
"S_THUNDERSHIELD15",
|
"S_LIGHTNINGSHIELD15",
|
||||||
"S_THUNDERSHIELD16",
|
"S_LIGHTNINGSHIELD16",
|
||||||
"S_THUNDERSHIELD17",
|
"S_LIGHTNINGSHIELD17",
|
||||||
"S_THUNDERSHIELD18",
|
"S_LIGHTNINGSHIELD18",
|
||||||
"S_THUNDERSHIELD19",
|
"S_LIGHTNINGSHIELD19",
|
||||||
"S_THUNDERSHIELD20",
|
"S_LIGHTNINGSHIELD20",
|
||||||
"S_THUNDERSHIELD21",
|
"S_LIGHTNINGSHIELD21",
|
||||||
"S_THUNDERSHIELD22",
|
"S_LIGHTNINGSHIELD22",
|
||||||
"S_THUNDERSHIELD23",
|
"S_LIGHTNINGSHIELD23",
|
||||||
"S_THUNDERSHIELD24",
|
"S_LIGHTNINGSHIELD24",
|
||||||
|
|
||||||
// Bubble Shield
|
// Bubble Shield
|
||||||
"S_BUBBLESHIELD1",
|
"S_BUBBLESHIELD1",
|
||||||
|
|
@ -4049,7 +4049,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
||||||
"S_BATTLEPOINT3H",
|
"S_BATTLEPOINT3H",
|
||||||
"S_BATTLEPOINT3I",
|
"S_BATTLEPOINT3I",
|
||||||
|
|
||||||
// Thunder shield use stuff;
|
// Lightning shield use stuff;
|
||||||
"S_KSPARK1", // Sparkling Radius
|
"S_KSPARK1", // Sparkling Radius
|
||||||
"S_KSPARK2",
|
"S_KSPARK2",
|
||||||
"S_KSPARK3",
|
"S_KSPARK3",
|
||||||
|
|
@ -5306,7 +5306,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
||||||
"MT_SPB", // Self-Propelled Bomb
|
"MT_SPB", // Self-Propelled Bomb
|
||||||
"MT_SPBEXPLOSION",
|
"MT_SPBEXPLOSION",
|
||||||
|
|
||||||
"MT_THUNDERSHIELD", // Shields
|
"MT_LIGHTNINGSHIELD", // Shields
|
||||||
"MT_BUBBLESHIELD",
|
"MT_BUBBLESHIELD",
|
||||||
"MT_FLAMESHIELD",
|
"MT_FLAMESHIELD",
|
||||||
"MT_FLAMESHIELDUNDERLAY",
|
"MT_FLAMESHIELDUNDERLAY",
|
||||||
|
|
@ -6709,7 +6709,7 @@ struct int_const_s const INT_CONST[] = {
|
||||||
|
|
||||||
// kartshields_t
|
// kartshields_t
|
||||||
{"KSHIELD_NONE",KSHIELD_NONE},
|
{"KSHIELD_NONE",KSHIELD_NONE},
|
||||||
{"KSHIELD_THUNDER",KSHIELD_THUNDER},
|
{"KSHIELD_LIGHTNING",KSHIELD_LIGHTNING},
|
||||||
{"KSHIELD_BUBBLE",KSHIELD_BUBBLE},
|
{"KSHIELD_BUBBLE",KSHIELD_BUBBLE},
|
||||||
{"KSHIELD_FLAME",KSHIELD_FLAME},
|
{"KSHIELD_FLAME",KSHIELD_FLAME},
|
||||||
{"NUMKARTSHIELDS",NUMKARTSHIELDS},
|
{"NUMKARTSHIELDS",NUMKARTSHIELDS},
|
||||||
|
|
|
||||||
60
src/info.c
60
src/info.c
|
|
@ -562,7 +562,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
||||||
"BHOG", // Ballhog
|
"BHOG", // Ballhog
|
||||||
"BHBM", // Ballhog BOOM
|
"BHBM", // Ballhog BOOM
|
||||||
"SPBM", // Self-Propelled Bomb
|
"SPBM", // Self-Propelled Bomb
|
||||||
"THNS", // Thunder Shield
|
"THNS", // Lightning Shield
|
||||||
"BUBS", // Bubble Shield (not Bubs)
|
"BUBS", // Bubble Shield (not Bubs)
|
||||||
"BWVE", // Bubble Shield waves
|
"BWVE", // Bubble Shield waves
|
||||||
"FLMS", // Flame Shield
|
"FLMS", // Flame Shield
|
||||||
|
|
@ -4197,30 +4197,30 @@ state_t states[NUMSTATES] =
|
||||||
{SPR_SPBM, 8, 1, {A_SPBChase}, 0, 0, S_SPB1}, // S_SPB20
|
{SPR_SPBM, 8, 1, {A_SPBChase}, 0, 0, S_SPB1}, // S_SPB20
|
||||||
{SPR_SPBM, 8, 175, {NULL}, 0, 0, S_NULL}, // S_SPB_DEAD
|
{SPR_SPBM, 8, 175, {NULL}, 0, 0, S_NULL}, // S_SPB_DEAD
|
||||||
|
|
||||||
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_THUNDERSHIELD2}, // S_THUNDERSHIELD1
|
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD2}, // S_LIGHTNINGSHIELD1
|
||||||
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_THUNDERSHIELD3}, // S_THUNDERSHIELD2
|
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD3}, // S_LIGHTNINGSHIELD2
|
||||||
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_THUNDERSHIELD4}, // S_THUNDERSHIELD3
|
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD4}, // S_LIGHTNINGSHIELD3
|
||||||
{SPR_THNS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_THUNDERSHIELD5}, // S_THUNDERSHIELD4
|
{SPR_THNS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD5}, // S_LIGHTNINGSHIELD4
|
||||||
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD6}, // S_THUNDERSHIELD5
|
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD6}, // S_LIGHTNINGSHIELD5
|
||||||
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_THUNDERSHIELD7}, // S_THUNDERSHIELD6
|
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD7}, // S_LIGHTNINGSHIELD6
|
||||||
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_THUNDERSHIELD8}, // S_THUNDERSHIELD7
|
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD8}, // S_LIGHTNINGSHIELD7
|
||||||
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_THUNDERSHIELD9}, // S_THUNDERSHIELD8
|
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD9}, // S_LIGHTNINGSHIELD8
|
||||||
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_THUNDERSHIELD10}, // S_THUNDERSHIELD9
|
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD10}, // S_LIGHTNINGSHIELD9
|
||||||
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_THUNDERSHIELD11}, // S_THUNDERSHIELD10
|
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD11}, // S_LIGHTNINGSHIELD10
|
||||||
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_THUNDERSHIELD12}, // S_THUNDERSHIELD11
|
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD12}, // S_LIGHTNINGSHIELD11
|
||||||
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_THUNDERSHIELD13}, // S_THUNDERSHIELD12
|
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD13}, // S_LIGHTNINGSHIELD12
|
||||||
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_THUNDERSHIELD14}, // S_THUNDERSHIELD13
|
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD14}, // S_LIGHTNINGSHIELD13
|
||||||
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_THUNDERSHIELD15}, // S_THUNDERSHIELD14
|
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD15}, // S_LIGHTNINGSHIELD14
|
||||||
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_THUNDERSHIELD16}, // S_THUNDERSHIELD15
|
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD16}, // S_LIGHTNINGSHIELD15
|
||||||
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_THUNDERSHIELD17}, // S_THUNDERSHIELD16
|
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD17}, // S_LIGHTNINGSHIELD16
|
||||||
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_THUNDERSHIELD18}, // S_THUNDERSHIELD17
|
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD18}, // S_LIGHTNINGSHIELD17
|
||||||
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_THUNDERSHIELD19}, // S_THUNDERSHIELD18
|
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD19}, // S_LIGHTNINGSHIELD18
|
||||||
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_THUNDERSHIELD20}, // S_THUNDERSHIELD19
|
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD20}, // S_LIGHTNINGSHIELD19
|
||||||
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_THUNDERSHIELD21}, // S_THUNDERSHIELD20
|
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD21}, // S_LIGHTNINGSHIELD20
|
||||||
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_THUNDERSHIELD22}, // S_THUNDERSHIELD21
|
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD22}, // S_LIGHTNINGSHIELD21
|
||||||
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_THUNDERSHIELD23}, // S_THUNDERSHIELD22
|
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD23}, // S_LIGHTNINGSHIELD22
|
||||||
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD24}, // S_THUNDERSHIELD23
|
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD24}, // S_LIGHTNINGSHIELD23
|
||||||
{SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_THUNDERSHIELD1}, // S_THUNDERSHIELD24
|
{SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD1}, // S_LIGHTNINGSHIELD24
|
||||||
|
|
||||||
{SPR_BUBS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_BUBBLESHIELD2}, // S_BUBBLESHIELD1
|
{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|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD3}, // S_BUBBLESHIELD2
|
||||||
|
|
@ -7562,7 +7562,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
MT_FLINGRING, // reactiontime
|
MT_FLINGRING, // reactiontime
|
||||||
sfx_None, // attacksound
|
sfx_None, // attacksound
|
||||||
S_NULL, // painstate
|
S_NULL, // painstate
|
||||||
0, // painchance
|
MT_RING, // painchance
|
||||||
sfx_None, // painsound
|
sfx_None, // painsound
|
||||||
S_NULL, // meleestate
|
S_NULL, // meleestate
|
||||||
S_NULL, // missilestate
|
S_NULL, // missilestate
|
||||||
|
|
@ -7613,10 +7613,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
1000, // spawnhealth
|
1000, // spawnhealth
|
||||||
S_NULL, // seestate
|
S_NULL, // seestate
|
||||||
sfx_None, // seesound
|
sfx_None, // seesound
|
||||||
MT_FLINGRING, // reactiontime
|
0, // reactiontime
|
||||||
sfx_None, // attacksound
|
sfx_None, // attacksound
|
||||||
S_NULL, // painstate
|
S_NULL, // painstate
|
||||||
MT_RING, // painchance
|
0, // painchance
|
||||||
sfx_None, // painsound
|
sfx_None, // painsound
|
||||||
S_NULL, // meleestate
|
S_NULL, // meleestate
|
||||||
S_NULL, // missilestate
|
S_NULL, // missilestate
|
||||||
|
|
@ -23716,9 +23716,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
{ // MT_THUNDERSHIELD
|
{ // MT_LIGHTNINGSHIELD
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_THUNDERSHIELD1, // spawnstate
|
S_LIGHTNINGSHIELD1, // spawnstate
|
||||||
1000, // spawnhealth
|
1000, // spawnhealth
|
||||||
S_NULL, // seestate
|
S_NULL, // seestate
|
||||||
sfx_None, // seesound
|
sfx_None, // seesound
|
||||||
|
|
|
||||||
50
src/info.h
50
src/info.h
|
|
@ -4626,30 +4626,30 @@ typedef enum state
|
||||||
S_SPB_DEAD,
|
S_SPB_DEAD,
|
||||||
|
|
||||||
// Thunder Shield
|
// Thunder Shield
|
||||||
S_THUNDERSHIELD1,
|
S_LIGHTNINGSHIELD1,
|
||||||
S_THUNDERSHIELD2,
|
S_LIGHTNINGSHIELD2,
|
||||||
S_THUNDERSHIELD3,
|
S_LIGHTNINGSHIELD3,
|
||||||
S_THUNDERSHIELD4,
|
S_LIGHTNINGSHIELD4,
|
||||||
S_THUNDERSHIELD5,
|
S_LIGHTNINGSHIELD5,
|
||||||
S_THUNDERSHIELD6,
|
S_LIGHTNINGSHIELD6,
|
||||||
S_THUNDERSHIELD7,
|
S_LIGHTNINGSHIELD7,
|
||||||
S_THUNDERSHIELD8,
|
S_LIGHTNINGSHIELD8,
|
||||||
S_THUNDERSHIELD9,
|
S_LIGHTNINGSHIELD9,
|
||||||
S_THUNDERSHIELD10,
|
S_LIGHTNINGSHIELD10,
|
||||||
S_THUNDERSHIELD11,
|
S_LIGHTNINGSHIELD11,
|
||||||
S_THUNDERSHIELD12,
|
S_LIGHTNINGSHIELD12,
|
||||||
S_THUNDERSHIELD13,
|
S_LIGHTNINGSHIELD13,
|
||||||
S_THUNDERSHIELD14,
|
S_LIGHTNINGSHIELD14,
|
||||||
S_THUNDERSHIELD15,
|
S_LIGHTNINGSHIELD15,
|
||||||
S_THUNDERSHIELD16,
|
S_LIGHTNINGSHIELD16,
|
||||||
S_THUNDERSHIELD17,
|
S_LIGHTNINGSHIELD17,
|
||||||
S_THUNDERSHIELD18,
|
S_LIGHTNINGSHIELD18,
|
||||||
S_THUNDERSHIELD19,
|
S_LIGHTNINGSHIELD19,
|
||||||
S_THUNDERSHIELD20,
|
S_LIGHTNINGSHIELD20,
|
||||||
S_THUNDERSHIELD21,
|
S_LIGHTNINGSHIELD21,
|
||||||
S_THUNDERSHIELD22,
|
S_LIGHTNINGSHIELD22,
|
||||||
S_THUNDERSHIELD23,
|
S_LIGHTNINGSHIELD23,
|
||||||
S_THUNDERSHIELD24,
|
S_LIGHTNINGSHIELD24,
|
||||||
|
|
||||||
// Bubble Shield
|
// Bubble Shield
|
||||||
S_BUBBLESHIELD1,
|
S_BUBBLESHIELD1,
|
||||||
|
|
@ -6328,7 +6328,7 @@ typedef enum mobj_type
|
||||||
MT_SPB, // SPB stuff
|
MT_SPB, // SPB stuff
|
||||||
MT_SPBEXPLOSION,
|
MT_SPBEXPLOSION,
|
||||||
|
|
||||||
MT_THUNDERSHIELD, // Shields
|
MT_LIGHTNINGSHIELD, // Shields
|
||||||
MT_BUBBLESHIELD,
|
MT_BUBBLESHIELD,
|
||||||
MT_FLAMESHIELD,
|
MT_FLAMESHIELD,
|
||||||
MT_FLAMESHIELDUNDERLAY,
|
MT_FLAMESHIELDUNDERLAY,
|
||||||
|
|
|
||||||
|
|
@ -1013,9 +1013,9 @@ static void K_BotItemJawz(player_t *player, ticcmd_t *cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------
|
/*--------------------------------------------------
|
||||||
static void K_BotItemThunder(player_t *player, ticcmd_t *cmd)
|
static void K_BotItemLightning(player_t *player, ticcmd_t *cmd)
|
||||||
|
|
||||||
Item usage for Thunder Shield.
|
Item usage for Lightning Shield.
|
||||||
|
|
||||||
Input Arguments:-
|
Input Arguments:-
|
||||||
player - Bot to do this for.
|
player - Bot to do this for.
|
||||||
|
|
@ -1024,7 +1024,7 @@ static void K_BotItemJawz(player_t *player, ticcmd_t *cmd)
|
||||||
Return:-
|
Return:-
|
||||||
None
|
None
|
||||||
--------------------------------------------------*/
|
--------------------------------------------------*/
|
||||||
static void K_BotItemThunder(player_t *player, ticcmd_t *cmd)
|
static void K_BotItemLightning(player_t *player, ticcmd_t *cmd)
|
||||||
{
|
{
|
||||||
if (K_BotUseItemNearPlayer(player, cmd, 192*player->mo->scale) == false)
|
if (K_BotUseItemNearPlayer(player, cmd, 192*player->mo->scale) == false)
|
||||||
{
|
{
|
||||||
|
|
@ -1347,8 +1347,8 @@ void K_BotItemUsage(player_t *player, ticcmd_t *cmd, INT16 turnamt)
|
||||||
K_BotItemDropTarget(player, cmd);
|
K_BotItemDropTarget(player, cmd);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KITEM_THUNDERSHIELD:
|
case KITEM_LIGHTNINGSHIELD:
|
||||||
K_BotItemThunder(player, cmd);
|
K_BotItemLightning(player, cmd);
|
||||||
break;
|
break;
|
||||||
case KITEM_BUBBLESHIELD:
|
case KITEM_BUBBLESHIELD:
|
||||||
K_BotItemBubble(player, cmd);
|
K_BotItemBubble(player, cmd);
|
||||||
|
|
|
||||||
|
|
@ -481,7 +481,7 @@ static boolean K_FindObjectsForNudging(mobj_t *thing)
|
||||||
if ((RINGTOTAL(globalsmuggle.botmo->player) < 20 && !(globalsmuggle.botmo->player->pflags & PF_RINGLOCK)
|
if ((RINGTOTAL(globalsmuggle.botmo->player) < 20 && !(globalsmuggle.botmo->player->pflags & PF_RINGLOCK)
|
||||||
&& P_CanPickupItem(globalsmuggle.botmo->player, 0))
|
&& P_CanPickupItem(globalsmuggle.botmo->player, 0))
|
||||||
&& !thing->extravalue1
|
&& !thing->extravalue1
|
||||||
&& (globalsmuggle.botmo->player->itemtype != KITEM_THUNDERSHIELD))
|
&& (globalsmuggle.botmo->player->itemtype != KITEM_LIGHTNINGSHIELD))
|
||||||
{
|
{
|
||||||
K_AddAttackObject(thing, side, (RINGTOTAL(globalsmuggle.botmo->player) < 3) ? 5 : 1);
|
K_AddAttackObject(thing, side, (RINGTOTAL(globalsmuggle.botmo->player) < 3) ? 5 : 1);
|
||||||
}
|
}
|
||||||
|
|
@ -508,10 +508,10 @@ static boolean K_FindObjectsForNudging(mobj_t *thing)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Thunder Shield
|
// Lightning Shield
|
||||||
else if (K_PlayerAttackSteer(thing, side, 20,
|
else if (K_PlayerAttackSteer(thing, side, 20,
|
||||||
globalsmuggle.botmo->player->itemtype == KITEM_THUNDERSHIELD,
|
globalsmuggle.botmo->player->itemtype == KITEM_LIGHTNINGSHIELD,
|
||||||
thing->player->itemtype == KITEM_THUNDERSHIELD
|
thing->player->itemtype == KITEM_LIGHTNINGSHIELD
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -352,10 +352,10 @@ void K_DoMineSearch(mobj_t *actor, fixed_t size)
|
||||||
explodedist = FixedMul(size, actor->scale);
|
explodedist = FixedMul(size, actor->scale);
|
||||||
grenade = actor;
|
grenade = actor;
|
||||||
|
|
||||||
yh = (unsigned)(actor->y + explodedist - bmaporgy)>>MAPBLOCKSHIFT;
|
yh = (unsigned)(actor->y + (explodedist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT;
|
||||||
yl = (unsigned)(actor->y - explodedist - bmaporgy)>>MAPBLOCKSHIFT;
|
yl = (unsigned)(actor->y - (explodedist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT;
|
||||||
xh = (unsigned)(actor->x + explodedist - bmaporgx)>>MAPBLOCKSHIFT;
|
xh = (unsigned)(actor->x + (explodedist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT;
|
||||||
xl = (unsigned)(actor->x - explodedist - bmaporgx)>>MAPBLOCKSHIFT;
|
xl = (unsigned)(actor->x - (explodedist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT;
|
||||||
|
|
||||||
BMBOUNDFIX (xl, xh, yl, yh);
|
BMBOUNDFIX (xl, xh, yl, yh);
|
||||||
|
|
||||||
|
|
@ -664,6 +664,85 @@ boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static mobj_t *lightningSource;
|
||||||
|
static fixed_t lightningDist;
|
||||||
|
|
||||||
|
static inline boolean PIT_LightningShieldAttack(mobj_t *thing)
|
||||||
|
{
|
||||||
|
if (lightningSource == NULL || P_MobjWasRemoved(lightningSource))
|
||||||
|
{
|
||||||
|
// Invalid?
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thing == lightningSource)
|
||||||
|
{
|
||||||
|
// Don't explode yourself!!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thing->health <= 0)
|
||||||
|
{
|
||||||
|
// Dead
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(thing->flags & MF_SHOOTABLE) || (thing->flags & MF_SCENERY))
|
||||||
|
{
|
||||||
|
// Not shootable
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thing->player && thing->player->spectator)
|
||||||
|
{
|
||||||
|
// Spectator
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((lightningSource->eflags & MFE_VERTICALFLIP)
|
||||||
|
? (thing->z > lightningSource->z + lightningSource->height)
|
||||||
|
: (thing->z + thing->height < lightningSource->z))
|
||||||
|
{
|
||||||
|
// Underneath
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (P_AproxDistance(thing->x - lightningSource->x, thing->y - lightningSource->y) > lightningDist + thing->radius)
|
||||||
|
{
|
||||||
|
// Too far away
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (P_CheckSight(lightningSource, thing) == false)
|
||||||
|
{
|
||||||
|
// Not in sight
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
P_DamageMobj(thing, lightningSource, lightningSource, 1, DMG_NORMAL|DMG_CANTHURTSELF|DMG_WOMBO);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void K_LightningShieldAttack(mobj_t *actor, fixed_t size)
|
||||||
|
{
|
||||||
|
INT32 bx, by, xl, xh, yl, yh;
|
||||||
|
|
||||||
|
lightningDist = FixedMul(size, actor->scale);
|
||||||
|
lightningSource = actor;
|
||||||
|
|
||||||
|
// Use blockmap to check for nearby shootables
|
||||||
|
yh = (unsigned)(actor->y + lightningDist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||||
|
yl = (unsigned)(actor->y - lightningDist - bmaporgy)>>MAPBLOCKSHIFT;
|
||||||
|
xh = (unsigned)(actor->x + lightningDist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||||
|
xl = (unsigned)(actor->x - lightningDist - bmaporgx)>>MAPBLOCKSHIFT;
|
||||||
|
|
||||||
|
BMBOUNDFIX (xl, xh, yl, yh);
|
||||||
|
|
||||||
|
for (by = yl; by <= yh; by++)
|
||||||
|
for (bx = xl; bx <= xh; bx++)
|
||||||
|
P_BlockThingsIterator(bx, by, PIT_LightningShieldAttack);
|
||||||
|
}
|
||||||
|
|
||||||
boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2)
|
boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2)
|
||||||
{
|
{
|
||||||
if (t2->type == MT_PLAYER)
|
if (t2->type == MT_PLAYER)
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ boolean K_LandMineCollide(mobj_t *t1, mobj_t *t2);
|
||||||
|
|
||||||
boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2);
|
boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2);
|
||||||
|
|
||||||
|
void K_LightningShieldAttack(mobj_t *actor, fixed_t size);
|
||||||
boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2);
|
boolean K_BubbleShieldCollide(mobj_t *t1, mobj_t *t2);
|
||||||
|
|
||||||
boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2);
|
boolean K_KitchenSinkCollide(mobj_t *t1, mobj_t *t2);
|
||||||
|
|
|
||||||
18
src/k_hud.c
18
src/k_hud.c
|
|
@ -126,7 +126,7 @@ static patch_t *kp_ballhog[2];
|
||||||
static patch_t *kp_selfpropelledbomb[2];
|
static patch_t *kp_selfpropelledbomb[2];
|
||||||
static patch_t *kp_grow[2];
|
static patch_t *kp_grow[2];
|
||||||
static patch_t *kp_shrink[2];
|
static patch_t *kp_shrink[2];
|
||||||
static patch_t *kp_thundershield[2];
|
static patch_t *kp_lightningshield[2];
|
||||||
static patch_t *kp_bubbleshield[2];
|
static patch_t *kp_bubbleshield[2];
|
||||||
static patch_t *kp_flameshield[2];
|
static patch_t *kp_flameshield[2];
|
||||||
static patch_t *kp_hyudoro[2];
|
static patch_t *kp_hyudoro[2];
|
||||||
|
|
@ -416,7 +416,7 @@ void K_LoadKartHUDGraphics(void)
|
||||||
HU_UpdatePatch(&kp_selfpropelledbomb[0], "K_ITSPB");
|
HU_UpdatePatch(&kp_selfpropelledbomb[0], "K_ITSPB");
|
||||||
HU_UpdatePatch(&kp_grow[0], "K_ITGROW");
|
HU_UpdatePatch(&kp_grow[0], "K_ITGROW");
|
||||||
HU_UpdatePatch(&kp_shrink[0], "K_ITSHRK");
|
HU_UpdatePatch(&kp_shrink[0], "K_ITSHRK");
|
||||||
HU_UpdatePatch(&kp_thundershield[0], "K_ITTHNS");
|
HU_UpdatePatch(&kp_lightningshield[0], "K_ITTHNS");
|
||||||
HU_UpdatePatch(&kp_bubbleshield[0], "K_ITBUBS");
|
HU_UpdatePatch(&kp_bubbleshield[0], "K_ITBUBS");
|
||||||
HU_UpdatePatch(&kp_flameshield[0], "K_ITFLMS");
|
HU_UpdatePatch(&kp_flameshield[0], "K_ITFLMS");
|
||||||
HU_UpdatePatch(&kp_hyudoro[0], "K_ITHYUD");
|
HU_UpdatePatch(&kp_hyudoro[0], "K_ITHYUD");
|
||||||
|
|
@ -467,7 +467,7 @@ void K_LoadKartHUDGraphics(void)
|
||||||
HU_UpdatePatch(&kp_selfpropelledbomb[1], "K_ISSPB");
|
HU_UpdatePatch(&kp_selfpropelledbomb[1], "K_ISSPB");
|
||||||
HU_UpdatePatch(&kp_grow[1], "K_ISGROW");
|
HU_UpdatePatch(&kp_grow[1], "K_ISGROW");
|
||||||
HU_UpdatePatch(&kp_shrink[1], "K_ISSHRK");
|
HU_UpdatePatch(&kp_shrink[1], "K_ISSHRK");
|
||||||
HU_UpdatePatch(&kp_thundershield[1], "K_ISTHNS");
|
HU_UpdatePatch(&kp_lightningshield[1], "K_ISTHNS");
|
||||||
HU_UpdatePatch(&kp_bubbleshield[1], "K_ISBUBS");
|
HU_UpdatePatch(&kp_bubbleshield[1], "K_ISBUBS");
|
||||||
HU_UpdatePatch(&kp_flameshield[1], "K_ISFLMS");
|
HU_UpdatePatch(&kp_flameshield[1], "K_ISFLMS");
|
||||||
HU_UpdatePatch(&kp_hyudoro[1], "K_ISHYUD");
|
HU_UpdatePatch(&kp_hyudoro[1], "K_ISHYUD");
|
||||||
|
|
@ -670,7 +670,7 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny)
|
||||||
return (tiny ? "K_ISGROW" : "K_ITGROW");
|
return (tiny ? "K_ISGROW" : "K_ITGROW");
|
||||||
case KITEM_SHRINK:
|
case KITEM_SHRINK:
|
||||||
return (tiny ? "K_ISSHRK" : "K_ITSHRK");
|
return (tiny ? "K_ISSHRK" : "K_ITSHRK");
|
||||||
case KITEM_THUNDERSHIELD:
|
case KITEM_LIGHTNINGSHIELD:
|
||||||
return (tiny ? "K_ISTHNS" : "K_ITTHNS");
|
return (tiny ? "K_ISTHNS" : "K_ITTHNS");
|
||||||
case KITEM_BUBBLESHIELD:
|
case KITEM_BUBBLESHIELD:
|
||||||
return (tiny ? "K_ISBUBS" : "K_ITBUBS");
|
return (tiny ? "K_ISBUBS" : "K_ITBUBS");
|
||||||
|
|
@ -1170,8 +1170,8 @@ static void K_drawKartItem(void)
|
||||||
localpatch = kp_ballhog[offset];
|
localpatch = kp_ballhog[offset];
|
||||||
//localcolor = SKINCOLOR_LILAC;
|
//localcolor = SKINCOLOR_LILAC;
|
||||||
break;
|
break;
|
||||||
case 13: // Thunder Shield
|
case 13: // Lightning Shield
|
||||||
localpatch = kp_thundershield[offset];
|
localpatch = kp_lightningshield[offset];
|
||||||
//localcolor = SKINCOLOR_CYAN;
|
//localcolor = SKINCOLOR_CYAN;
|
||||||
break;
|
break;
|
||||||
case 14: // Super Ring
|
case 14: // Super Ring
|
||||||
|
|
@ -1290,8 +1290,8 @@ static void K_drawKartItem(void)
|
||||||
case KITEM_SHRINK:
|
case KITEM_SHRINK:
|
||||||
localpatch = kp_shrink[offset];
|
localpatch = kp_shrink[offset];
|
||||||
break;
|
break;
|
||||||
case KITEM_THUNDERSHIELD:
|
case KITEM_LIGHTNINGSHIELD:
|
||||||
localpatch = kp_thundershield[offset];
|
localpatch = kp_lightningshield[offset];
|
||||||
localbg = kp_itembg[offset+1];
|
localbg = kp_itembg[offset+1];
|
||||||
break;
|
break;
|
||||||
case KITEM_BUBBLESHIELD:
|
case KITEM_BUBBLESHIELD:
|
||||||
|
|
@ -4578,7 +4578,7 @@ static void K_drawDistributionDebugger(void)
|
||||||
kp_selfpropelledbomb[1],
|
kp_selfpropelledbomb[1],
|
||||||
kp_grow[1],
|
kp_grow[1],
|
||||||
kp_shrink[1],
|
kp_shrink[1],
|
||||||
kp_thundershield[1],
|
kp_lightningshield[1],
|
||||||
kp_bubbleshield[1],
|
kp_bubbleshield[1],
|
||||||
kp_flameshield[1],
|
kp_flameshield[1],
|
||||||
kp_hyudoro[1],
|
kp_hyudoro[1],
|
||||||
|
|
|
||||||
147
src/k_kart.c
147
src/k_kart.c
|
|
@ -36,6 +36,7 @@
|
||||||
#include "k_hud.h"
|
#include "k_hud.h"
|
||||||
#include "k_terrain.h"
|
#include "k_terrain.h"
|
||||||
#include "k_director.h"
|
#include "k_director.h"
|
||||||
|
#include "k_collide.h"
|
||||||
|
|
||||||
// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
|
// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
|
||||||
// gamespeed is cc (0 for easy, 1 for normal, 2 for hard)
|
// gamespeed is cc (0 for easy, 1 for normal, 2 for hard)
|
||||||
|
|
@ -220,7 +221,7 @@ void K_RegisterKartStuff(void)
|
||||||
CV_RegisterVar(&cv_selfpropelledbomb);
|
CV_RegisterVar(&cv_selfpropelledbomb);
|
||||||
CV_RegisterVar(&cv_grow);
|
CV_RegisterVar(&cv_grow);
|
||||||
CV_RegisterVar(&cv_shrink);
|
CV_RegisterVar(&cv_shrink);
|
||||||
CV_RegisterVar(&cv_thundershield);
|
CV_RegisterVar(&cv_lightningshield);
|
||||||
CV_RegisterVar(&cv_bubbleshield);
|
CV_RegisterVar(&cv_bubbleshield);
|
||||||
CV_RegisterVar(&cv_flameshield);
|
CV_RegisterVar(&cv_flameshield);
|
||||||
CV_RegisterVar(&cv_hyudoro);
|
CV_RegisterVar(&cv_hyudoro);
|
||||||
|
|
@ -327,7 +328,7 @@ consvar_t *KartItemCVars[NUMKARTRESULTS-1] =
|
||||||
&cv_selfpropelledbomb,
|
&cv_selfpropelledbomb,
|
||||||
&cv_grow,
|
&cv_grow,
|
||||||
&cv_shrink,
|
&cv_shrink,
|
||||||
&cv_thundershield,
|
&cv_lightningshield,
|
||||||
&cv_bubbleshield,
|
&cv_bubbleshield,
|
||||||
&cv_flameshield,
|
&cv_flameshield,
|
||||||
&cv_hyudoro,
|
&cv_hyudoro,
|
||||||
|
|
@ -362,7 +363,7 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] =
|
||||||
/*Self-Propelled Bomb*/ { 0, 0, 0, 0, 0, 2, 4, 0 }, // Self-Propelled Bomb
|
/*Self-Propelled Bomb*/ { 0, 0, 0, 0, 0, 2, 4, 0 }, // Self-Propelled Bomb
|
||||||
/*Grow*/ { 0, 0, 0, 1, 2, 3, 0, 0 }, // Grow
|
/*Grow*/ { 0, 0, 0, 1, 2, 3, 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
|
/*Lightning Shield*/ { 1, 2, 0, 0, 0, 0, 0, 0 }, // Lightning Shield
|
||||||
/*Bubble Shield*/ { 0, 1, 2, 1, 0, 0, 0, 0 }, // Bubble Shield
|
/*Bubble Shield*/ { 0, 1, 2, 1, 0, 0, 0, 0 }, // Bubble Shield
|
||||||
/*Flame Shield*/ { 0, 0, 0, 0, 0, 1, 3, 5 }, // Flame Shield
|
/*Flame Shield*/ { 0, 0, 0, 0, 0, 1, 3, 5 }, // Flame Shield
|
||||||
/*Hyudoro*/ { 0, 0, 0, 1, 1, 0, 0, 0 }, // Hyudoro
|
/*Hyudoro*/ { 0, 0, 0, 1, 1, 0, 0, 0 }, // Hyudoro
|
||||||
|
|
@ -395,7 +396,7 @@ static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][2] =
|
||||||
/*Self-Propelled Bomb*/ { 0, 0 }, // Self-Propelled Bomb
|
/*Self-Propelled Bomb*/ { 0, 0 }, // Self-Propelled Bomb
|
||||||
/*Grow*/ { 2, 1 }, // Grow
|
/*Grow*/ { 2, 1 }, // Grow
|
||||||
/*Shrink*/ { 0, 0 }, // Shrink
|
/*Shrink*/ { 0, 0 }, // Shrink
|
||||||
/*Thunder Shield*/ { 4, 0 }, // Thunder Shield
|
/*Lightning Shield*/ { 4, 0 }, // Lightning Shield
|
||||||
/*Bubble Shield*/ { 1, 0 }, // Bubble Shield
|
/*Bubble Shield*/ { 1, 0 }, // Bubble Shield
|
||||||
/*Flame Shield*/ { 0, 0 }, // Flame Shield
|
/*Flame Shield*/ { 0, 0 }, // Flame Shield
|
||||||
/*Hyudoro*/ { 2, 0 }, // Hyudoro
|
/*Hyudoro*/ { 2, 0 }, // Hyudoro
|
||||||
|
|
@ -437,7 +438,7 @@ INT32 K_GetShieldFromItem(INT32 item)
|
||||||
{
|
{
|
||||||
switch (item)
|
switch (item)
|
||||||
{
|
{
|
||||||
case KITEM_THUNDERSHIELD: return KSHIELD_THUNDER;
|
case KITEM_LIGHTNINGSHIELD: return KSHIELD_LIGHTNING;
|
||||||
case KITEM_BUBBLESHIELD: return KSHIELD_BUBBLE;
|
case KITEM_BUBBLESHIELD: return KSHIELD_BUBBLE;
|
||||||
case KITEM_FLAMESHIELD: return KSHIELD_FLAME;
|
case KITEM_FLAMESHIELD: return KSHIELD_FLAME;
|
||||||
default: return KSHIELD_NONE;
|
default: return KSHIELD_NONE;
|
||||||
|
|
@ -733,7 +734,7 @@ INT32 K_KartGetItemOdds(
|
||||||
if (pingame-1 <= pexiting)
|
if (pingame-1 <= pexiting)
|
||||||
newodds = 0;
|
newodds = 0;
|
||||||
break;
|
break;
|
||||||
case KITEM_THUNDERSHIELD:
|
case KITEM_LIGHTNINGSHIELD:
|
||||||
cooldownOnStart = true;
|
cooldownOnStart = true;
|
||||||
powerItem = true;
|
powerItem = true;
|
||||||
|
|
||||||
|
|
@ -1759,9 +1760,9 @@ static void K_UpdateDraft(player_t *player)
|
||||||
UINT8 leniency;
|
UINT8 leniency;
|
||||||
UINT8 i;
|
UINT8 i;
|
||||||
|
|
||||||
if (player->itemtype == KITEM_FLAMESHIELD)
|
if (player->itemtype == KITEM_LIGHTNINGSHIELD)
|
||||||
{
|
{
|
||||||
// Flame Shield gets infinite draft distance as its passive effect.
|
// Lightning Shield gets infinite draft distance as its (other) passive effect.
|
||||||
draftdistance = 0;
|
draftdistance = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -3368,7 +3369,7 @@ void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fromDam
|
||||||
}
|
}
|
||||||
|
|
||||||
K_AddHitLag(mo1, finalTics, fromDamage);
|
K_AddHitLag(mo1, finalTics, fromDamage);
|
||||||
K_AddHitLag(mo2, finalTics, fromDamage);
|
K_AddHitLag(mo2, finalTics, false); // mo2 is the inflictor, so don't use the damage property.
|
||||||
}
|
}
|
||||||
|
|
||||||
void K_DoInstashield(player_t *player)
|
void K_DoInstashield(player_t *player)
|
||||||
|
|
@ -5261,7 +5262,12 @@ void K_PuntMine(mobj_t *origMine, mobj_t *punter)
|
||||||
|
|
||||||
#define THUNDERRADIUS 320
|
#define THUNDERRADIUS 320
|
||||||
|
|
||||||
static void K_DoThunderShield(player_t *player)
|
// Rough size of the outer-rim sprites, after scaling.
|
||||||
|
// (The hitbox is already pretty strict due to only 1 active frame,
|
||||||
|
// we don't need to have it disjointedly small too...)
|
||||||
|
#define THUNDERSPRITE 80
|
||||||
|
|
||||||
|
static void K_DoLightningShield(player_t *player)
|
||||||
{
|
{
|
||||||
mobj_t *mo;
|
mobj_t *mo;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
@ -5270,7 +5276,7 @@ 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);
|
||||||
P_NukeEnemies(player->mo, player->mo, RING_DIST/4);
|
K_LightningShieldAttack(player->mo, (THUNDERRADIUS + THUNDERSPRITE) * FRACUNIT);
|
||||||
|
|
||||||
// spawn vertical bolt
|
// spawn vertical bolt
|
||||||
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK);
|
mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THOK);
|
||||||
|
|
@ -5311,6 +5317,7 @@ static void K_DoThunderShield(player_t *player)
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef THUNDERRADIUS
|
#undef THUNDERRADIUS
|
||||||
|
#undef THUNDERSPRITE
|
||||||
|
|
||||||
static void K_FlameDashLeftoverSmoke(mobj_t *src)
|
static void K_FlameDashLeftoverSmoke(mobj_t *src)
|
||||||
{
|
{
|
||||||
|
|
@ -5720,9 +5727,9 @@ void K_DropHnextList(player_t *player, boolean keepshields)
|
||||||
|
|
||||||
if (shield != KSHIELD_NONE && !keepshields)
|
if (shield != KSHIELD_NONE && !keepshields)
|
||||||
{
|
{
|
||||||
if (shield == KSHIELD_THUNDER)
|
if (shield == KSHIELD_LIGHTNING)
|
||||||
{
|
{
|
||||||
K_DoThunderShield(player);
|
K_DoLightningShield(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
player->curshield = KSHIELD_NONE;
|
player->curshield = KSHIELD_NONE;
|
||||||
|
|
@ -7000,39 +7007,85 @@ void K_KartPlayerHUDUpdate(player_t *player)
|
||||||
// SRB2Kart: blockmap iterate for attraction shield users
|
// SRB2Kart: blockmap iterate for attraction shield users
|
||||||
static mobj_t *attractmo;
|
static mobj_t *attractmo;
|
||||||
static fixed_t attractdist;
|
static fixed_t attractdist;
|
||||||
|
static fixed_t attractzdist;
|
||||||
|
|
||||||
static inline boolean PIT_AttractingRings(mobj_t *thing)
|
static inline boolean PIT_AttractingRings(mobj_t *thing)
|
||||||
{
|
{
|
||||||
if (!attractmo || P_MobjWasRemoved(attractmo))
|
if (attractmo == NULL || P_MobjWasRemoved(attractmo) || attractmo->player == NULL)
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!attractmo->player)
|
if (thing == NULL || P_MobjWasRemoved(thing))
|
||||||
return false; // not a player
|
{
|
||||||
|
return true; // invalid
|
||||||
|
}
|
||||||
|
|
||||||
if (thing->health <= 0 || !thing)
|
if (thing == attractmo)
|
||||||
return true; // dead
|
{
|
||||||
|
return true; // invalid
|
||||||
|
}
|
||||||
|
|
||||||
if (thing->type != MT_RING && thing->type != MT_FLINGRING)
|
if (!(thing->type == MT_RING || thing->type == MT_FLINGRING))
|
||||||
|
{
|
||||||
return true; // not a ring
|
return true; // not a ring
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thing->health <= 0)
|
||||||
|
{
|
||||||
|
return true; // dead
|
||||||
|
}
|
||||||
|
|
||||||
if (thing->extravalue1)
|
if (thing->extravalue1)
|
||||||
|
{
|
||||||
return true; // in special ring animation
|
return true; // in special ring animation
|
||||||
|
}
|
||||||
|
|
||||||
if (thing->cusval)
|
if (thing->tracer != NULL && P_MobjWasRemoved(thing->tracer) == false)
|
||||||
|
{
|
||||||
return true; // already attracted
|
return true; // already attracted
|
||||||
|
}
|
||||||
|
|
||||||
// see if it went over / under
|
// see if it went over / under
|
||||||
if (attractmo->z - (attractdist>>2) > thing->z + thing->height)
|
if (attractmo->z - attractzdist > thing->z + thing->height)
|
||||||
|
{
|
||||||
return true; // overhead
|
return true; // overhead
|
||||||
if (attractmo->z + attractmo->height + (attractdist>>2) < thing->z)
|
}
|
||||||
|
|
||||||
|
if (attractmo->z + attractmo->height + attractzdist < thing->z)
|
||||||
|
{
|
||||||
return true; // underneath
|
return true; // underneath
|
||||||
|
}
|
||||||
|
|
||||||
if (P_AproxDistance(attractmo->x - thing->x, attractmo->y - thing->y) < attractdist)
|
if (P_AproxDistance(attractmo->x - thing->x, attractmo->y - thing->y) > attractdist + thing->radius)
|
||||||
|
{
|
||||||
return true; // Too far away
|
return true; // Too far away
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RINGTOTAL(attractmo->player) >= 20 || (attractmo->player->pflags & PF_RINGLOCK))
|
||||||
|
{
|
||||||
|
// Already reached max -- just joustle rings around.
|
||||||
|
|
||||||
|
// Regular ring -> fling ring
|
||||||
|
if (thing->info->reactiontime && thing->type != (mobjtype_t)thing->info->reactiontime)
|
||||||
|
{
|
||||||
|
thing->type = thing->info->reactiontime;
|
||||||
|
thing->info = &mobjinfo[thing->type];
|
||||||
|
thing->flags = thing->info->flags;
|
||||||
|
|
||||||
|
P_InstaThrust(thing, P_RandomRange(0,7) * ANGLE_45, 2 * thing->scale);
|
||||||
|
P_SetObjectMomZ(thing, 8<<FRACBITS, false);
|
||||||
|
thing->fuse = 120*TICRATE;
|
||||||
|
|
||||||
|
thing->cusval = 0; // Reset attraction flag
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// set target
|
||||||
|
P_SetTarget(&thing->tracer, attractmo);
|
||||||
|
}
|
||||||
|
|
||||||
// set target
|
|
||||||
P_SetTarget(&thing->tracer, attractmo);
|
|
||||||
// flag to show it's been attracted once before
|
|
||||||
thing->cusval = 1;
|
|
||||||
return true; // find other rings
|
return true; // find other rings
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7044,15 +7097,18 @@ static inline boolean PIT_AttractingRings(mobj_t *thing)
|
||||||
static void K_LookForRings(mobj_t *pmo)
|
static void K_LookForRings(mobj_t *pmo)
|
||||||
{
|
{
|
||||||
INT32 bx, by, xl, xh, yl, yh;
|
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;
|
attractmo = pmo;
|
||||||
|
attractdist = (400 * pmo->scale);
|
||||||
|
attractzdist = attractdist >> 2;
|
||||||
|
|
||||||
|
// Use blockmap to check for nearby rings
|
||||||
|
yh = (unsigned)(pmo->y + (attractdist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT;
|
||||||
|
yl = (unsigned)(pmo->y - (attractdist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT;
|
||||||
|
xh = (unsigned)(pmo->x + (attractdist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT;
|
||||||
|
xl = (unsigned)(pmo->x - (attractdist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT;
|
||||||
|
|
||||||
|
BMBOUNDFIX(xl, xh, yl, yh);
|
||||||
|
|
||||||
for (by = yl; by <= yh; by++)
|
for (by = yl; by <= yh; by++)
|
||||||
for (bx = xl; bx <= xh; bx++)
|
for (bx = xl; bx <= xh; bx++)
|
||||||
|
|
@ -7474,12 +7530,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->itemtype == KITEM_THUNDERSHIELD)
|
|
||||||
{
|
|
||||||
if (RINGTOTAL(player) < 20 && !(player->pflags & PF_RINGLOCK))
|
|
||||||
K_LookForRings(player->mo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player->itemtype == KITEM_BUBBLESHIELD)
|
if (player->itemtype == KITEM_BUBBLESHIELD)
|
||||||
{
|
{
|
||||||
if (player->bubblecool)
|
if (player->bubblecool)
|
||||||
|
|
@ -7690,6 +7740,11 @@ void K_KartPlayerAfterThink(player_t *player)
|
||||||
player->lastjawztarget = -1;
|
player->lastjawztarget = -1;
|
||||||
player->jawztargetdelay = 0;
|
player->jawztargetdelay = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (player->itemtype == KITEM_LIGHTNINGSHIELD)
|
||||||
|
{
|
||||||
|
K_LookForRings(player->mo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------
|
/*--------------------------------------------------
|
||||||
|
|
@ -9769,23 +9824,23 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
K_PlayPowerGloatSound(player->mo);
|
K_PlayPowerGloatSound(player->mo);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KITEM_THUNDERSHIELD:
|
case KITEM_LIGHTNINGSHIELD:
|
||||||
if (player->curshield != KSHIELD_THUNDER)
|
if (player->curshield != KSHIELD_LIGHTNING)
|
||||||
{
|
{
|
||||||
mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_THUNDERSHIELD);
|
mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_LIGHTNINGSHIELD);
|
||||||
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_s3k41);
|
S_StartSound(player->mo, sfx_s3k41);
|
||||||
player->curshield = KSHIELD_THUNDER;
|
player->curshield = KSHIELD_LIGHTNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
|
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
|
||||||
{
|
{
|
||||||
K_DoThunderShield(player);
|
K_DoLightningShield(player);
|
||||||
if (player->itemamount > 0)
|
if (player->itemamount > 0)
|
||||||
{
|
{
|
||||||
// Why is this a conditional?
|
// Why is this a conditional?
|
||||||
// Thunder shield: the only item that allows you to
|
// Lightning shield: the only item that allows you to
|
||||||
// activate a mine while you're out of its radius,
|
// activate a mine while you're out of its radius,
|
||||||
// the SAME tic it sets your itemamount to 0
|
// the SAME tic it sets your itemamount to 0
|
||||||
// ...:dumbestass:
|
// ...:dumbestass:
|
||||||
|
|
|
||||||
|
|
@ -1590,7 +1590,7 @@ static menuitem_t OP_MonitorToggleMenu[] =
|
||||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Invinciblity", {.routine = M_HandleMonitorToggles}, KITEM_INVINCIBILITY},
|
{IT_KEYHANDLER | IT_NOTHING, NULL, "Invinciblity", {.routine = M_HandleMonitorToggles}, KITEM_INVINCIBILITY},
|
||||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Grow", {.routine = M_HandleMonitorToggles}, KITEM_GROW},
|
{IT_KEYHANDLER | IT_NOTHING, NULL, "Grow", {.routine = M_HandleMonitorToggles}, KITEM_GROW},
|
||||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Shrink", {.routine = M_HandleMonitorToggles}, KITEM_SHRINK},
|
{IT_KEYHANDLER | IT_NOTHING, NULL, "Shrink", {.routine = M_HandleMonitorToggles}, KITEM_SHRINK},
|
||||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Thunder Shields", {.routine = M_HandleMonitorToggles}, KITEM_THUNDERSHIELD},
|
{IT_KEYHANDLER | IT_NOTHING, NULL, "Lightning Shields", {.routine = M_HandleMonitorToggles}, KITEM_LIGHTNINGSHIELD},
|
||||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Hyudoros", {.routine = M_HandleMonitorToggles}, KITEM_HYUDORO},
|
{IT_KEYHANDLER | IT_NOTHING, NULL, "Hyudoros", {.routine = M_HandleMonitorToggles}, KITEM_HYUDORO},
|
||||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Pogo Springs", {.routine = M_HandleMonitorToggles}, KITEM_POGOSPRING},
|
{IT_KEYHANDLER | IT_NOTHING, NULL, "Pogo Springs", {.routine = M_HandleMonitorToggles}, KITEM_POGOSPRING},
|
||||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "Super Rings", {.routine = M_HandleMonitorToggles}, KITEM_SUPERRING},
|
{IT_KEYHANDLER | IT_NOTHING, NULL, "Super Rings", {.routine = M_HandleMonitorToggles}, KITEM_SUPERRING},
|
||||||
|
|
|
||||||
|
|
@ -4044,57 +4044,76 @@ void A_AttractChase(mobj_t *actor)
|
||||||
actor->renderflags &= ~RF_DONTDRAW;
|
actor->renderflags &= ~RF_DONTDRAW;
|
||||||
|
|
||||||
// spilled rings get capped to a certain speed
|
// spilled rings get capped to a certain speed
|
||||||
if (actor->type == (mobjtype_t)actor->info->reactiontime)
|
if (actor->info->reactiontime && actor->type == (mobjtype_t)actor->info->reactiontime)
|
||||||
{
|
{
|
||||||
const fixed_t maxspeed = 4<<FRACBITS;
|
const fixed_t maxspeed = 4 * actor->scale;
|
||||||
fixed_t oldspeed = R_PointToDist2(0, 0, actor->momx, actor->momy);
|
fixed_t oldspeed = R_PointToDist2(0, 0, actor->momx, actor->momy);
|
||||||
|
|
||||||
if (oldspeed > maxspeed)
|
if (oldspeed > maxspeed)
|
||||||
{
|
{
|
||||||
fixed_t newspeed = max(maxspeed, oldspeed-FRACUNIT);
|
fixed_t newspeed = max(maxspeed, oldspeed - actor->scale);
|
||||||
actor->momx = FixedMul(FixedDiv(actor->momx, oldspeed), newspeed);
|
actor->momx = FixedMul(FixedDiv(actor->momx, oldspeed), newspeed);
|
||||||
actor->momy = FixedMul(FixedDiv(actor->momy, oldspeed), newspeed);
|
actor->momy = FixedMul(FixedDiv(actor->momy, oldspeed), newspeed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actor->tracer && actor->tracer->player && actor->tracer->health
|
if (actor->tracer != NULL && P_MobjWasRemoved(actor->tracer) == false)
|
||||||
//&& P_CheckSight(actor, actor->tracer)
|
|
||||||
&& actor->tracer->player->itemtype == KITEM_THUNDERSHIELD
|
|
||||||
&& RINGTOTAL(actor->tracer->player) < 20
|
|
||||||
&& !(actor->tracer->player->pflags & PF_RINGLOCK))
|
|
||||||
{
|
{
|
||||||
fixed_t dist;
|
// Set attraction flag
|
||||||
angle_t hang, vang;
|
actor->cusval = 1;
|
||||||
|
|
||||||
// If a flung ring gets attracted by a shield, change it into a normal ring.
|
if (
|
||||||
if (actor->type == (mobjtype_t)actor->info->reactiontime)
|
actor->tracer->player && actor->tracer->health
|
||||||
|
&& actor->tracer->player->itemtype == KITEM_LIGHTNINGSHIELD
|
||||||
|
&& RINGTOTAL(actor->tracer->player) < 20
|
||||||
|
&& !(actor->tracer->player->pflags & PF_RINGLOCK)
|
||||||
|
//&& P_CheckSight(actor, actor->tracer)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->painchance);
|
fixed_t dist;
|
||||||
P_RemoveMobj(actor);
|
angle_t hang, vang;
|
||||||
return;
|
|
||||||
|
// If a flung ring gets attracted by a shield, change it into a normal ring.
|
||||||
|
if (actor->info->painchance && actor->type != (mobjtype_t)actor->info->painchance)
|
||||||
|
{
|
||||||
|
#if 0 // old
|
||||||
|
P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->painchance);
|
||||||
|
P_RemoveMobj(actor);
|
||||||
|
return;
|
||||||
|
#else // new
|
||||||
|
actor->type = actor->info->painchance;
|
||||||
|
actor->info = &mobjinfo[actor->type];
|
||||||
|
actor->flags = actor->info->flags;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep stuff from going down inside floors and junk
|
||||||
|
actor->flags &= ~MF_NOCLIPHEIGHT;
|
||||||
|
|
||||||
|
// Let attracted rings move through walls and such.
|
||||||
|
actor->flags |= MF_NOCLIP;
|
||||||
|
|
||||||
|
// P_Attract is too "smart" for Kart; keep it simple, stupid!
|
||||||
|
dist = P_AproxDistance(P_AproxDistance(actor->x - actor->tracer->x, actor->y - actor->tracer->y), actor->z - actor->tracer->z);
|
||||||
|
hang = R_PointToAngle2(actor->x, actor->y, actor->tracer->x, actor->tracer->y);
|
||||||
|
vang = R_PointToAngle2(actor->z, 0, actor->tracer->z, dist);
|
||||||
|
|
||||||
|
actor->momx -= actor->momx>>4, actor->momy -= actor->momy>>4, actor->momz -= actor->momz>>4;
|
||||||
|
actor->momx += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINECOSINE(hang>>ANGLETOFINESHIFT), 4*actor->scale));
|
||||||
|
actor->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), 4*actor->scale));
|
||||||
|
actor->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), 4*actor->scale);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
P_SetTarget(&actor->tracer, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep stuff from going down inside floors and junk
|
|
||||||
actor->flags &= ~MF_NOCLIPHEIGHT;
|
|
||||||
|
|
||||||
// Let attracted rings move through walls and such.
|
|
||||||
actor->flags |= MF_NOCLIP;
|
|
||||||
|
|
||||||
// P_Attract is too "smart" for Kart; keep it simple, stupid!
|
|
||||||
dist = P_AproxDistance(P_AproxDistance(actor->x - actor->tracer->x, actor->y - actor->tracer->y), actor->z - actor->tracer->z);
|
|
||||||
hang = R_PointToAngle2(actor->x, actor->y, actor->tracer->x, actor->tracer->y);
|
|
||||||
vang = R_PointToAngle2(actor->z , 0, actor->tracer->z, dist);
|
|
||||||
|
|
||||||
actor->momx -= actor->momx>>4, actor->momy -= actor->momy>>4, actor->momz -= actor->momz>>4;
|
|
||||||
actor->momx += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINECOSINE(hang>>ANGLETOFINESHIFT), 4*actor->scale));
|
|
||||||
actor->momy += FixedMul(FINESINE(vang>>ANGLETOFINESHIFT), FixedMul(FINESINE(hang>>ANGLETOFINESHIFT), 4*actor->scale));
|
|
||||||
actor->momz += FixedMul(FINECOSINE(vang>>ANGLETOFINESHIFT), 4*actor->scale);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Turn rings back into flung rings if lost
|
// Turn rings back into flung rings if lost
|
||||||
if (actor->cusval && actor->info->reactiontime && actor->type != (mobjtype_t)actor->info->reactiontime)
|
if (actor->cusval && actor->info->reactiontime && actor->type != (mobjtype_t)actor->info->reactiontime)
|
||||||
{
|
{
|
||||||
|
#if 0 // old
|
||||||
mobj_t *newring;
|
mobj_t *newring;
|
||||||
newring = P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->reactiontime);
|
newring = P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->reactiontime);
|
||||||
P_InstaThrust(newring, P_RandomRange(0,7) * ANGLE_45, 2<<FRACBITS);
|
P_InstaThrust(newring, P_RandomRange(0,7) * ANGLE_45, 2<<FRACBITS);
|
||||||
|
|
@ -4102,10 +4121,18 @@ void A_AttractChase(mobj_t *actor)
|
||||||
newring->fuse = 120*TICRATE;
|
newring->fuse = 120*TICRATE;
|
||||||
P_RemoveMobj(actor);
|
P_RemoveMobj(actor);
|
||||||
return;
|
return;
|
||||||
|
#else // new
|
||||||
|
actor->type = actor->info->reactiontime;
|
||||||
|
actor->info = &mobjinfo[actor->type];
|
||||||
|
actor->flags = actor->info->flags;
|
||||||
|
|
||||||
|
P_InstaThrust(actor, P_RandomRange(0,7) * ANGLE_45, 2 * actor->scale);
|
||||||
|
P_SetObjectMomZ(actor, 8<<FRACBITS, false);
|
||||||
|
actor->fuse = 120*TICRATE;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/*else
|
|
||||||
P_LookForShield(actor);*/
|
actor->cusval = 0; // Reset attraction flag
|
||||||
// SRB2Kart: now it's the PLAYER'S job to use the blockmap to find rings, not the ring's.
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
18
src/p_mobj.c
18
src/p_mobj.c
|
|
@ -5904,8 +5904,8 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
||||||
mobj->tracer->frame = KITEM_BALLHOG;
|
mobj->tracer->frame = KITEM_BALLHOG;
|
||||||
//localcolor = SKINCOLOR_LILAC;
|
//localcolor = SKINCOLOR_LILAC;
|
||||||
break;
|
break;
|
||||||
case 13: // Thunder Shield
|
case 13: // Lightning Shield
|
||||||
mobj->tracer->frame = KITEM_THUNDERSHIELD;
|
mobj->tracer->frame = KITEM_LIGHTNINGSHIELD;
|
||||||
//localcolor = SKINCOLOR_CYAN;
|
//localcolor = SKINCOLOR_CYAN;
|
||||||
break;
|
break;
|
||||||
case 14: // Super Ring
|
case 14: // Super Ring
|
||||||
|
|
@ -6507,6 +6507,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
||||||
|
|
||||||
// No need to check water. Who cares?
|
// No need to check water. Who cares?
|
||||||
P_RingThinker(mobj);
|
P_RingThinker(mobj);
|
||||||
|
|
||||||
if (mobj->flags2 & MF2_NIGHTSPULL)
|
if (mobj->flags2 & MF2_NIGHTSPULL)
|
||||||
P_NightsItemChase(mobj);
|
P_NightsItemChase(mobj);
|
||||||
else
|
else
|
||||||
|
|
@ -7385,11 +7386,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
||||||
mobj->renderflags = (mobj->renderflags & ~RF_TRANSMASK)|(trans << RF_TRANSSHIFT);
|
mobj->renderflags = (mobj->renderflags & ~RF_TRANSMASK)|(trans << RF_TRANSSHIFT);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MT_THUNDERSHIELD:
|
case MT_LIGHTNINGSHIELD:
|
||||||
{
|
{
|
||||||
fixed_t destx, desty;
|
fixed_t destx, desty;
|
||||||
if (!mobj->target || !mobj->target->health || !mobj->target->player
|
if (!mobj->target || !mobj->target->health || !mobj->target->player
|
||||||
|| mobj->target->player->curshield != KSHIELD_THUNDER)
|
|| mobj->target->player->curshield != KSHIELD_LIGHTNING)
|
||||||
{
|
{
|
||||||
P_RemoveMobj(mobj);
|
P_RemoveMobj(mobj);
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -7408,7 +7409,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
||||||
else
|
else
|
||||||
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y);
|
viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y);
|
||||||
|
|
||||||
if (curstate > S_THUNDERSHIELD15 && curstate <= S_THUNDERSHIELD24)
|
if (curstate > S_LIGHTNINGSHIELD15 && curstate <= S_LIGHTNINGSHIELD24)
|
||||||
viewingangle += ANGLE_180;
|
viewingangle += ANGLE_180;
|
||||||
|
|
||||||
destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4);
|
destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4);
|
||||||
|
|
@ -9343,10 +9344,13 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
|| mobj->type == MT_FALLINGROCK
|
|| mobj->type == MT_FALLINGROCK
|
||||||
|| mobj->type == MT_ORBINAUT
|
|| mobj->type == MT_ORBINAUT
|
||||||
|| mobj->type == MT_JAWZ || mobj->type == MT_JAWZ_DUD
|
|| mobj->type == MT_JAWZ || mobj->type == MT_JAWZ_DUD
|
||||||
|| (mobj->type == MT_DROPTARGET && mobj->reactiontime)) {
|
|| (mobj->type == MT_DROPTARGET && mobj->reactiontime))
|
||||||
|
{
|
||||||
P_TryMove(mobj, mobj->x, mobj->y, true); // Sets mo->standingslope correctly
|
P_TryMove(mobj, mobj->x, mobj->y, true); // Sets mo->standingslope correctly
|
||||||
|
|
||||||
if (P_MobjWasRemoved(mobj)) // anything that calls checkposition can be lethal
|
if (P_MobjWasRemoved(mobj)) // anything that calls checkposition can be lethal
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//if (mobj->standingslope) CONS_Printf("slope physics on mobj\n");
|
//if (mobj->standingslope) CONS_Printf("slope physics on mobj\n");
|
||||||
P_ButteredSlope(mobj);
|
P_ButteredSlope(mobj);
|
||||||
}
|
}
|
||||||
|
|
@ -9673,7 +9677,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing)
|
||||||
thing->shadowscale = 5*FRACUNIT/4;
|
thing->shadowscale = 5*FRACUNIT/4;
|
||||||
thing->whiteshadow = true;
|
thing->whiteshadow = true;
|
||||||
break;
|
break;
|
||||||
case MT_THUNDERSHIELD:
|
case MT_LIGHTNINGSHIELD:
|
||||||
case MT_BUBBLESHIELD:
|
case MT_BUBBLESHIELD:
|
||||||
case MT_BUBBLESHIELDTRAP:
|
case MT_BUBBLESHIELDTRAP:
|
||||||
case MT_FLAMESHIELD:
|
case MT_FLAMESHIELD:
|
||||||
|
|
|
||||||
|
|
@ -2512,7 +2512,7 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius)
|
||||||
|
|
||||||
if (mo->flags & MF_BOSS) //don't OHKO bosses nor players!
|
if (mo->flags & MF_BOSS) //don't OHKO bosses nor players!
|
||||||
P_DamageMobj(mo, inflictor, source, 1, DMG_NORMAL|DMG_CANTHURTSELF);
|
P_DamageMobj(mo, inflictor, source, 1, DMG_NORMAL|DMG_CANTHURTSELF);
|
||||||
else if (mo->type == MT_PLAYER) // Thunder shield: Combo players.
|
else if (mo->type == MT_PLAYER) // Lightning shield: Combo players.
|
||||||
P_DamageMobj(mo, inflictor, source, 1, DMG_NORMAL|DMG_CANTHURTSELF|DMG_WOMBO);
|
P_DamageMobj(mo, inflictor, source, 1, DMG_NORMAL|DMG_CANTHURTSELF|DMG_WOMBO);
|
||||||
else
|
else
|
||||||
P_DamageMobj(mo, inflictor, source, 1000, DMG_NORMAL|DMG_CANTHURTSELF);
|
P_DamageMobj(mo, inflictor, source, 1000, DMG_NORMAL|DMG_CANTHURTSELF);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue