diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 51b6b97d6..14a0338ad 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -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); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 5dc3418b0..f6d172bcc 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -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; diff --git a/src/d_player.h b/src/d_player.h index 60ca7c4bd..e1943d557 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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 diff --git a/src/deh_tables.c b/src/deh_tables.c index faa5010ad..7ebc00b6b 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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", @@ -6711,7 +6711,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}, diff --git a/src/info.c b/src/info.c index bd1d60b03..643e8b6ca 100644 --- a/src/info.c +++ b/src/info.c @@ -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 diff --git a/src/info.h b/src/info.h index f8dbb90bd..06d60e792 100644 --- a/src/info.h +++ b/src/info.h @@ -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, diff --git a/src/k_botitem.c b/src/k_botitem.c index 6f8e82034..922029dc5 100644 --- a/src/k_botitem.c +++ b/src/k_botitem.c @@ -1021,9 +1021,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. @@ -1032,7 +1032,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) { @@ -1355,8 +1355,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); diff --git a/src/k_botsearch.c b/src/k_botsearch.c index 6e256a9e5..49f04ea5e 100644 --- a/src/k_botsearch.c +++ b/src/k_botsearch.c @@ -478,7 +478,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); } @@ -505,10 +505,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; diff --git a/src/k_collide.c b/src/k_collide.c index fbe6af02d..92c4bd7fd 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -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) diff --git a/src/k_collide.h b/src/k_collide.h index 49cc3fa08..cf1ee5dc7 100644 --- a/src/k_collide.h +++ b/src/k_collide.h @@ -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); diff --git a/src/k_hud.c b/src/k_hud.c index b7bf9c38d..00537f81b 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -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], diff --git a/src/k_kart.c b/src/k_kart.c index 4edb34b5c..b09b22274 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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; @@ -3361,7 +3362,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) @@ -5249,7 +5250,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; @@ -5258,7 +5264,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); @@ -5299,6 +5305,7 @@ static void K_DoThunderShield(player_t *player) } #undef THUNDERRADIUS +#undef THUNDERSPRITE static void K_FlameDashLeftoverSmoke(mobj_t *src) { @@ -5708,9 +5715,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; @@ -6988,39 +6995,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<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 } @@ -7032,15 +7085,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++) @@ -7462,12 +7518,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) @@ -7678,6 +7728,11 @@ void K_KartPlayerAfterThink(player_t *player) player->lastjawztarget = -1; player->jawztargetdelay = 0; } + + if (player->itemtype == KITEM_LIGHTNINGSHIELD) + { + K_LookForRings(player->mo); + } } /*-------------------------------------------------- @@ -9751,23 +9806,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: diff --git a/src/m_menu.c b/src/m_menu.c index c1c8c114d..6c7b79a50 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -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}, diff --git a/src/p_enemy.c b/src/p_enemy.c index 7b6d12983..65f00e116 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -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<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<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<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 } } } diff --git a/src/p_mobj.c b/src/p_mobj.c index c9f68b8f3..6d5950d98 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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); @@ -9338,10 +9339,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); } @@ -9668,7 +9672,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: diff --git a/src/p_user.c b/src/p_user.c index 51016d80e..bdad3adbd 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2507,7 +2507,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);