Merge branch 'rewrite-lightning' into 'master'

Lightning Shield fixes

See merge request KartKrew/Kart!589
This commit is contained in:
James R 2022-05-21 09:13:17 +00:00
commit 8718d2c2f3
16 changed files with 364 additions and 198 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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},

View file

@ -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

View file

@ -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,

View file

@ -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);

View file

@ -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;

View file

@ -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)

View file

@ -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);

View file

@ -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],

View file

@ -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:

View file

@ -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},

View file

@ -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.
} }
} }
} }

View file

@ -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:

View file

@ -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);