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

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_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_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_dualsneaker, cv_triplesneaker, cv_triplebanana, cv_decabanana;

View file

@ -145,7 +145,7 @@ Run this macro, then #undef FOREACH afterward
FOREACH (SPB, 11),\
FOREACH (GROW, 12),\
FOREACH (SHRINK, 13),\
FOREACH (THUNDERSHIELD, 14),\
FOREACH (LIGHTNINGSHIELD, 14),\
FOREACH (BUBBLESHIELD, 15),\
FOREACH (FLAMESHIELD, 16),\
FOREACH (HYUDORO, 17),\
@ -177,7 +177,7 @@ typedef enum
typedef enum
{
KSHIELD_NONE = 0,
KSHIELD_THUNDER = 1,
KSHIELD_LIGHTNING = 1,
KSHIELD_BUBBLE = 2,
KSHIELD_FLAME = 3,
NUMKARTSHIELDS

View file

@ -3640,31 +3640,31 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_SPB20",
"S_SPB_DEAD",
// Thunder Shield
"S_THUNDERSHIELD1",
"S_THUNDERSHIELD2",
"S_THUNDERSHIELD3",
"S_THUNDERSHIELD4",
"S_THUNDERSHIELD5",
"S_THUNDERSHIELD6",
"S_THUNDERSHIELD7",
"S_THUNDERSHIELD8",
"S_THUNDERSHIELD9",
"S_THUNDERSHIELD10",
"S_THUNDERSHIELD11",
"S_THUNDERSHIELD12",
"S_THUNDERSHIELD13",
"S_THUNDERSHIELD14",
"S_THUNDERSHIELD15",
"S_THUNDERSHIELD16",
"S_THUNDERSHIELD17",
"S_THUNDERSHIELD18",
"S_THUNDERSHIELD19",
"S_THUNDERSHIELD20",
"S_THUNDERSHIELD21",
"S_THUNDERSHIELD22",
"S_THUNDERSHIELD23",
"S_THUNDERSHIELD24",
// Lightning Shield
"S_LIGHTNINGSHIELD1",
"S_LIGHTNINGSHIELD2",
"S_LIGHTNINGSHIELD3",
"S_LIGHTNINGSHIELD4",
"S_LIGHTNINGSHIELD5",
"S_LIGHTNINGSHIELD6",
"S_LIGHTNINGSHIELD7",
"S_LIGHTNINGSHIELD8",
"S_LIGHTNINGSHIELD9",
"S_LIGHTNINGSHIELD10",
"S_LIGHTNINGSHIELD11",
"S_LIGHTNINGSHIELD12",
"S_LIGHTNINGSHIELD13",
"S_LIGHTNINGSHIELD14",
"S_LIGHTNINGSHIELD15",
"S_LIGHTNINGSHIELD16",
"S_LIGHTNINGSHIELD17",
"S_LIGHTNINGSHIELD18",
"S_LIGHTNINGSHIELD19",
"S_LIGHTNINGSHIELD20",
"S_LIGHTNINGSHIELD21",
"S_LIGHTNINGSHIELD22",
"S_LIGHTNINGSHIELD23",
"S_LIGHTNINGSHIELD24",
// Bubble Shield
"S_BUBBLESHIELD1",
@ -4049,7 +4049,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_BATTLEPOINT3H",
"S_BATTLEPOINT3I",
// Thunder shield use stuff;
// Lightning shield use stuff;
"S_KSPARK1", // Sparkling Radius
"S_KSPARK2",
"S_KSPARK3",
@ -5306,7 +5306,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_SPB", // Self-Propelled Bomb
"MT_SPBEXPLOSION",
"MT_THUNDERSHIELD", // Shields
"MT_LIGHTNINGSHIELD", // Shields
"MT_BUBBLESHIELD",
"MT_FLAMESHIELD",
"MT_FLAMESHIELDUNDERLAY",
@ -6709,7 +6709,7 @@ struct int_const_s const INT_CONST[] = {
// kartshields_t
{"KSHIELD_NONE",KSHIELD_NONE},
{"KSHIELD_THUNDER",KSHIELD_THUNDER},
{"KSHIELD_LIGHTNING",KSHIELD_LIGHTNING},
{"KSHIELD_BUBBLE",KSHIELD_BUBBLE},
{"KSHIELD_FLAME",KSHIELD_FLAME},
{"NUMKARTSHIELDS",NUMKARTSHIELDS},

View file

@ -562,7 +562,7 @@ char sprnames[NUMSPRITES + 1][5] =
"BHOG", // Ballhog
"BHBM", // Ballhog BOOM
"SPBM", // Self-Propelled Bomb
"THNS", // Thunder Shield
"THNS", // Lightning Shield
"BUBS", // Bubble Shield (not Bubs)
"BWVE", // Bubble Shield waves
"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, 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|10, 2, {NULL}, 0, 0, S_THUNDERSHIELD3}, // S_THUNDERSHIELD2
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_THUNDERSHIELD4}, // S_THUNDERSHIELD3
{SPR_THNS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_THUNDERSHIELD5}, // S_THUNDERSHIELD4
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD6}, // S_THUNDERSHIELD5
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_THUNDERSHIELD7}, // S_THUNDERSHIELD6
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_THUNDERSHIELD8}, // S_THUNDERSHIELD7
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_THUNDERSHIELD9}, // S_THUNDERSHIELD8
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_THUNDERSHIELD10}, // S_THUNDERSHIELD9
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_THUNDERSHIELD11}, // S_THUNDERSHIELD10
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_THUNDERSHIELD12}, // S_THUNDERSHIELD11
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_THUNDERSHIELD13}, // S_THUNDERSHIELD12
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_THUNDERSHIELD14}, // S_THUNDERSHIELD13
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_THUNDERSHIELD15}, // S_THUNDERSHIELD14
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_THUNDERSHIELD16}, // S_THUNDERSHIELD15
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_THUNDERSHIELD17}, // S_THUNDERSHIELD16
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_THUNDERSHIELD18}, // S_THUNDERSHIELD17
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_THUNDERSHIELD19}, // S_THUNDERSHIELD18
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_THUNDERSHIELD20}, // S_THUNDERSHIELD19
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_THUNDERSHIELD21}, // S_THUNDERSHIELD20
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_THUNDERSHIELD22}, // S_THUNDERSHIELD21
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_THUNDERSHIELD23}, // S_THUNDERSHIELD22
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_THUNDERSHIELD24}, // S_THUNDERSHIELD23
{SPR_THNS, FF_FULLBRIGHT|0, 2, {NULL}, 0, 0, S_THUNDERSHIELD1}, // S_THUNDERSHIELD24
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD2}, // S_LIGHTNINGSHIELD1
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD3}, // S_LIGHTNINGSHIELD2
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD4}, // S_LIGHTNINGSHIELD3
{SPR_THNS, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD5}, // S_LIGHTNINGSHIELD4
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD6}, // S_LIGHTNINGSHIELD5
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD7}, // S_LIGHTNINGSHIELD6
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD8}, // S_LIGHTNINGSHIELD7
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD9}, // S_LIGHTNINGSHIELD8
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD10}, // S_LIGHTNINGSHIELD9
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD11}, // S_LIGHTNINGSHIELD10
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD12}, // S_LIGHTNINGSHIELD11
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD13}, // S_LIGHTNINGSHIELD12
{SPR_THNS, FF_FULLBRIGHT|9, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD14}, // S_LIGHTNINGSHIELD13
{SPR_THNS, FF_FULLBRIGHT|10, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD15}, // S_LIGHTNINGSHIELD14
{SPR_THNS, FF_FULLBRIGHT|11, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD16}, // S_LIGHTNINGSHIELD15
{SPR_THNS, FF_FULLBRIGHT|8, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD17}, // S_LIGHTNINGSHIELD16
{SPR_THNS, FF_FULLBRIGHT|7, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD18}, // S_LIGHTNINGSHIELD17
{SPR_THNS, FF_FULLBRIGHT|6, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD19}, // S_LIGHTNINGSHIELD18
{SPR_THNS, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD20}, // S_LIGHTNINGSHIELD19
{SPR_THNS, FF_FULLBRIGHT|4, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD21}, // S_LIGHTNINGSHIELD20
{SPR_THNS, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD22}, // S_LIGHTNINGSHIELD21
{SPR_THNS, FF_FULLBRIGHT|2, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD23}, // S_LIGHTNINGSHIELD22
{SPR_THNS, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_LIGHTNINGSHIELD24}, // S_LIGHTNINGSHIELD23
{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|13, 2, {NULL}, 0, 0, S_BUBBLESHIELD3}, // S_BUBBLESHIELD2
@ -7562,7 +7562,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
MT_FLINGRING, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
MT_RING, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
@ -7613,10 +7613,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
MT_FLINGRING, // reactiontime
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
MT_RING, // painchance
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
@ -23716,9 +23716,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_THUNDERSHIELD
{ // MT_LIGHTNINGSHIELD
-1, // doomednum
S_THUNDERSHIELD1, // spawnstate
S_LIGHTNINGSHIELD1, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound

View file

@ -4626,30 +4626,30 @@ typedef enum state
S_SPB_DEAD,
// Thunder Shield
S_THUNDERSHIELD1,
S_THUNDERSHIELD2,
S_THUNDERSHIELD3,
S_THUNDERSHIELD4,
S_THUNDERSHIELD5,
S_THUNDERSHIELD6,
S_THUNDERSHIELD7,
S_THUNDERSHIELD8,
S_THUNDERSHIELD9,
S_THUNDERSHIELD10,
S_THUNDERSHIELD11,
S_THUNDERSHIELD12,
S_THUNDERSHIELD13,
S_THUNDERSHIELD14,
S_THUNDERSHIELD15,
S_THUNDERSHIELD16,
S_THUNDERSHIELD17,
S_THUNDERSHIELD18,
S_THUNDERSHIELD19,
S_THUNDERSHIELD20,
S_THUNDERSHIELD21,
S_THUNDERSHIELD22,
S_THUNDERSHIELD23,
S_THUNDERSHIELD24,
S_LIGHTNINGSHIELD1,
S_LIGHTNINGSHIELD2,
S_LIGHTNINGSHIELD3,
S_LIGHTNINGSHIELD4,
S_LIGHTNINGSHIELD5,
S_LIGHTNINGSHIELD6,
S_LIGHTNINGSHIELD7,
S_LIGHTNINGSHIELD8,
S_LIGHTNINGSHIELD9,
S_LIGHTNINGSHIELD10,
S_LIGHTNINGSHIELD11,
S_LIGHTNINGSHIELD12,
S_LIGHTNINGSHIELD13,
S_LIGHTNINGSHIELD14,
S_LIGHTNINGSHIELD15,
S_LIGHTNINGSHIELD16,
S_LIGHTNINGSHIELD17,
S_LIGHTNINGSHIELD18,
S_LIGHTNINGSHIELD19,
S_LIGHTNINGSHIELD20,
S_LIGHTNINGSHIELD21,
S_LIGHTNINGSHIELD22,
S_LIGHTNINGSHIELD23,
S_LIGHTNINGSHIELD24,
// Bubble Shield
S_BUBBLESHIELD1,
@ -6328,7 +6328,7 @@ typedef enum mobj_type
MT_SPB, // SPB stuff
MT_SPBEXPLOSION,
MT_THUNDERSHIELD, // Shields
MT_LIGHTNINGSHIELD, // Shields
MT_BUBBLESHIELD,
MT_FLAMESHIELD,
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:-
player - Bot to do this for.
@ -1024,7 +1024,7 @@ static void K_BotItemJawz(player_t *player, ticcmd_t *cmd)
Return:-
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)
{
@ -1347,8 +1347,8 @@ void K_BotItemUsage(player_t *player, ticcmd_t *cmd, INT16 turnamt)
K_BotItemDropTarget(player, cmd);
}
break;
case KITEM_THUNDERSHIELD:
K_BotItemThunder(player, cmd);
case KITEM_LIGHTNINGSHIELD:
K_BotItemLightning(player, cmd);
break;
case KITEM_BUBBLESHIELD:
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)
&& P_CanPickupItem(globalsmuggle.botmo->player, 0))
&& !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);
}
@ -508,10 +508,10 @@ static boolean K_FindObjectsForNudging(mobj_t *thing)
{
break;
}
// Thunder Shield
// Lightning Shield
else if (K_PlayerAttackSteer(thing, side, 20,
globalsmuggle.botmo->player->itemtype == KITEM_THUNDERSHIELD,
thing->player->itemtype == KITEM_THUNDERSHIELD
globalsmuggle.botmo->player->itemtype == KITEM_LIGHTNINGSHIELD,
thing->player->itemtype == KITEM_LIGHTNINGSHIELD
))
{
break;

View file

@ -352,10 +352,10 @@ void K_DoMineSearch(mobj_t *actor, fixed_t size)
explodedist = FixedMul(size, actor->scale);
grenade = actor;
yh = (unsigned)(actor->y + explodedist - bmaporgy)>>MAPBLOCKSHIFT;
yl = (unsigned)(actor->y - explodedist - bmaporgy)>>MAPBLOCKSHIFT;
xh = (unsigned)(actor->x + explodedist - bmaporgx)>>MAPBLOCKSHIFT;
xl = (unsigned)(actor->x - explodedist - bmaporgx)>>MAPBLOCKSHIFT;
yh = (unsigned)(actor->y + (explodedist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT;
yl = (unsigned)(actor->y - (explodedist + MAXRADIUS) - bmaporgy)>>MAPBLOCKSHIFT;
xh = (unsigned)(actor->x + (explodedist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT;
xl = (unsigned)(actor->x - (explodedist + MAXRADIUS) - bmaporgx)>>MAPBLOCKSHIFT;
BMBOUNDFIX (xl, xh, yl, yh);
@ -664,6 +664,85 @@ boolean K_DropTargetCollide(mobj_t *t1, mobj_t *t2)
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)
{
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);
void K_LightningShieldAttack(mobj_t *actor, fixed_t size);
boolean K_BubbleShieldCollide(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_grow[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_flameshield[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_grow[0], "K_ITGROW");
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_flameshield[0], "K_ITFLMS");
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_grow[1], "K_ISGROW");
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_flameshield[1], "K_ISFLMS");
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");
case KITEM_SHRINK:
return (tiny ? "K_ISSHRK" : "K_ITSHRK");
case KITEM_THUNDERSHIELD:
case KITEM_LIGHTNINGSHIELD:
return (tiny ? "K_ISTHNS" : "K_ITTHNS");
case KITEM_BUBBLESHIELD:
return (tiny ? "K_ISBUBS" : "K_ITBUBS");
@ -1170,8 +1170,8 @@ static void K_drawKartItem(void)
localpatch = kp_ballhog[offset];
//localcolor = SKINCOLOR_LILAC;
break;
case 13: // Thunder Shield
localpatch = kp_thundershield[offset];
case 13: // Lightning Shield
localpatch = kp_lightningshield[offset];
//localcolor = SKINCOLOR_CYAN;
break;
case 14: // Super Ring
@ -1290,8 +1290,8 @@ static void K_drawKartItem(void)
case KITEM_SHRINK:
localpatch = kp_shrink[offset];
break;
case KITEM_THUNDERSHIELD:
localpatch = kp_thundershield[offset];
case KITEM_LIGHTNINGSHIELD:
localpatch = kp_lightningshield[offset];
localbg = kp_itembg[offset+1];
break;
case KITEM_BUBBLESHIELD:
@ -4578,7 +4578,7 @@ static void K_drawDistributionDebugger(void)
kp_selfpropelledbomb[1],
kp_grow[1],
kp_shrink[1],
kp_thundershield[1],
kp_lightningshield[1],
kp_bubbleshield[1],
kp_flameshield[1],
kp_hyudoro[1],

View file

@ -36,6 +36,7 @@
#include "k_hud.h"
#include "k_terrain.h"
#include "k_director.h"
#include "k_collide.h"
// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
// 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_grow);
CV_RegisterVar(&cv_shrink);
CV_RegisterVar(&cv_thundershield);
CV_RegisterVar(&cv_lightningshield);
CV_RegisterVar(&cv_bubbleshield);
CV_RegisterVar(&cv_flameshield);
CV_RegisterVar(&cv_hyudoro);
@ -327,7 +328,7 @@ consvar_t *KartItemCVars[NUMKARTRESULTS-1] =
&cv_selfpropelledbomb,
&cv_grow,
&cv_shrink,
&cv_thundershield,
&cv_lightningshield,
&cv_bubbleshield,
&cv_flameshield,
&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
/*Grow*/ { 0, 0, 0, 1, 2, 3, 0, 0 }, // Grow
/*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
/*Flame Shield*/ { 0, 0, 0, 0, 0, 1, 3, 5 }, // Flame Shield
/*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
/*Grow*/ { 2, 1 }, // Grow
/*Shrink*/ { 0, 0 }, // Shrink
/*Thunder Shield*/ { 4, 0 }, // Thunder Shield
/*Lightning Shield*/ { 4, 0 }, // Lightning Shield
/*Bubble Shield*/ { 1, 0 }, // Bubble Shield
/*Flame Shield*/ { 0, 0 }, // Flame Shield
/*Hyudoro*/ { 2, 0 }, // Hyudoro
@ -437,7 +438,7 @@ INT32 K_GetShieldFromItem(INT32 item)
{
switch (item)
{
case KITEM_THUNDERSHIELD: return KSHIELD_THUNDER;
case KITEM_LIGHTNINGSHIELD: return KSHIELD_LIGHTNING;
case KITEM_BUBBLESHIELD: return KSHIELD_BUBBLE;
case KITEM_FLAMESHIELD: return KSHIELD_FLAME;
default: return KSHIELD_NONE;
@ -733,7 +734,7 @@ INT32 K_KartGetItemOdds(
if (pingame-1 <= pexiting)
newodds = 0;
break;
case KITEM_THUNDERSHIELD:
case KITEM_LIGHTNINGSHIELD:
cooldownOnStart = true;
powerItem = true;
@ -1759,9 +1760,9 @@ static void K_UpdateDraft(player_t *player)
UINT8 leniency;
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;
}
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(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)
@ -5261,7 +5262,12 @@ void K_PuntMine(mobj_t *origMine, mobj_t *punter)
#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;
int i = 0;
@ -5270,7 +5276,7 @@ static void K_DoThunderShield(player_t *player)
angle_t an;
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
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 THUNDERSPRITE
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_THUNDER)
if (shield == KSHIELD_LIGHTNING)
{
K_DoThunderShield(player);
K_DoLightningShield(player);
}
player->curshield = KSHIELD_NONE;
@ -7000,39 +7007,85 @@ void K_KartPlayerHUDUpdate(player_t *player)
// SRB2Kart: blockmap iterate for attraction shield users
static mobj_t *attractmo;
static fixed_t attractdist;
static fixed_t attractzdist;
static inline boolean PIT_AttractingRings(mobj_t *thing)
{
if (!attractmo || P_MobjWasRemoved(attractmo))
if (attractmo == NULL || P_MobjWasRemoved(attractmo) || attractmo->player == NULL)
{
return false;
}
if (!attractmo->player)
return false; // not a player
if (thing == NULL || P_MobjWasRemoved(thing))
{
return true; // invalid
}
if (thing->health <= 0 || !thing)
return true; // dead
if (thing == attractmo)
{
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
}
if (thing->health <= 0)
{
return true; // dead
}
if (thing->extravalue1)
{
return true; // in special ring animation
}
if (thing->cusval)
if (thing->tracer != NULL && P_MobjWasRemoved(thing->tracer) == false)
{
return true; // already attracted
}
// 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
if (attractmo->z + attractmo->height + (attractdist>>2) < thing->z)
}
if (attractmo->z + attractmo->height + attractzdist < thing->z)
{
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
}
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
}
@ -7044,15 +7097,18 @@ static inline boolean PIT_AttractingRings(mobj_t *thing)
static void K_LookForRings(mobj_t *pmo)
{
INT32 bx, by, xl, xh, yl, yh;
attractdist = FixedMul(RING_DIST, pmo->scale)>>2;
// Use blockmap to check for nearby rings
yh = (unsigned)(pmo->y + attractdist - bmaporgy)>>MAPBLOCKSHIFT;
yl = (unsigned)(pmo->y - attractdist - bmaporgy)>>MAPBLOCKSHIFT;
xh = (unsigned)(pmo->x + attractdist - bmaporgx)>>MAPBLOCKSHIFT;
xl = (unsigned)(pmo->x - attractdist - bmaporgx)>>MAPBLOCKSHIFT;
attractmo = pmo;
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 (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->bubblecool)
@ -7690,6 +7740,11 @@ void K_KartPlayerAfterThink(player_t *player)
player->lastjawztarget = -1;
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);
}
break;
case KITEM_THUNDERSHIELD:
if (player->curshield != KSHIELD_THUNDER)
case KITEM_LIGHTNINGSHIELD:
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_SetTarget(&shield->target, player->mo);
S_StartSound(player->mo, sfx_s3k41);
player->curshield = KSHIELD_THUNDER;
player->curshield = KSHIELD_LIGHTNING;
}
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
{
K_DoThunderShield(player);
K_DoLightningShield(player);
if (player->itemamount > 0)
{
// 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,
// the SAME tic it sets your itemamount to 0
// ...: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, "Grow", {.routine = M_HandleMonitorToggles}, KITEM_GROW},
{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, "Pogo Springs", {.routine = M_HandleMonitorToggles}, KITEM_POGOSPRING},
{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;
// 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);
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->momy = FixedMul(FixedDiv(actor->momy, oldspeed), newspeed);
}
}
if (actor->tracer && actor->tracer->player && actor->tracer->health
//&& P_CheckSight(actor, actor->tracer)
&& actor->tracer->player->itemtype == KITEM_THUNDERSHIELD
&& RINGTOTAL(actor->tracer->player) < 20
&& !(actor->tracer->player->pflags & PF_RINGLOCK))
if (actor->tracer != NULL && P_MobjWasRemoved(actor->tracer) == false)
{
fixed_t dist;
angle_t hang, vang;
// Set attraction flag
actor->cusval = 1;
// If a flung ring gets attracted by a shield, change it into a normal ring.
if (actor->type == (mobjtype_t)actor->info->reactiontime)
if (
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);
P_RemoveMobj(actor);
return;
fixed_t dist;
angle_t hang, vang;
// 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
{
// Turn rings back into flung rings if lost
if (actor->cusval && actor->info->reactiontime && actor->type != (mobjtype_t)actor->info->reactiontime)
{
#if 0 // old
mobj_t *newring;
newring = P_SpawnMobj(actor->x, actor->y, actor->z, actor->info->reactiontime);
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;
P_RemoveMobj(actor);
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);*/
// SRB2Kart: now it's the PLAYER'S job to use the blockmap to find rings, not the ring's.
actor->cusval = 0; // Reset attraction flag
}
}
}

View file

@ -5904,8 +5904,8 @@ static void P_MobjSceneryThink(mobj_t *mobj)
mobj->tracer->frame = KITEM_BALLHOG;
//localcolor = SKINCOLOR_LILAC;
break;
case 13: // Thunder Shield
mobj->tracer->frame = KITEM_THUNDERSHIELD;
case 13: // Lightning Shield
mobj->tracer->frame = KITEM_LIGHTNINGSHIELD;
//localcolor = SKINCOLOR_CYAN;
break;
case 14: // Super Ring
@ -6507,6 +6507,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
// No need to check water. Who cares?
P_RingThinker(mobj);
if (mobj->flags2 & MF2_NIGHTSPULL)
P_NightsItemChase(mobj);
else
@ -7385,11 +7386,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
mobj->renderflags = (mobj->renderflags & ~RF_TRANSMASK)|(trans << RF_TRANSSHIFT);
}
break;
case MT_THUNDERSHIELD:
case MT_LIGHTNINGSHIELD:
{
fixed_t destx, desty;
if (!mobj->target || !mobj->target->health || !mobj->target->player
|| mobj->target->player->curshield != KSHIELD_THUNDER)
|| mobj->target->player->curshield != KSHIELD_LIGHTNING)
{
P_RemoveMobj(mobj);
return false;
@ -7408,7 +7409,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
else
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;
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_ORBINAUT
|| 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
if (P_MobjWasRemoved(mobj)) // anything that calls checkposition can be lethal
return;
//if (mobj->standingslope) CONS_Printf("slope physics on mobj\n");
P_ButteredSlope(mobj);
}
@ -9673,7 +9677,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing)
thing->shadowscale = 5*FRACUNIT/4;
thing->whiteshadow = true;
break;
case MT_THUNDERSHIELD:
case MT_LIGHTNINGSHIELD:
case MT_BUBBLESHIELD:
case MT_BUBBLESHIELDTRAP:
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!
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);
else
P_DamageMobj(mo, inflictor, source, 1000, DMG_NORMAL|DMG_CANTHURTSELF);