From 6e8e0ad0f54ba3d8c0c03211d8f7db4be95d1e09 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 20 May 2022 18:12:34 -0400 Subject: [PATCH] Lightning Shield fixs - Rename to Lightning Shield (it keeps fucking me up when I want to kartgiveitem it to myself) - Fix inflictors causing damage being considered damage hitlag. Fixes the player using Lightning Shield being in damage hitlag state (most notable in the DI branch because hurting someone with it lets you DI afterwards, which also fucks with your turning) - Rewrote attack function to use custom blockmap search instead of P_NukeEnemies. - It can no longer attack below you, only above & around you. - Increased the attack radius, so that it actually lines up with the sprites... - Fixed extremely inconsistent ring blockmap search by moving it to playerafterthink (don't ask me why) - Rings get joulsted by Lightning Shield when you pass by them without - Added MAXRADIUS to the blockmap checks for lightning shield & mines, to reduce blockmap inconsistencies --- src/d_netcmd.c | 2 +- src/d_netcmd.h | 2 +- src/d_player.h | 4 +- src/deh_tables.c | 56 +++++++++--------- src/info.c | 60 +++++++++---------- src/info.h | 50 ++++++++-------- src/k_botitem.c | 10 ++-- src/k_botsearch.c | 8 +-- src/k_collide.c | 87 ++++++++++++++++++++++++++-- src/k_collide.h | 1 + src/k_hud.c | 18 +++--- src/k_kart.c | 143 ++++++++++++++++++++++++++++++++-------------- src/m_menu.c | 2 +- src/p_enemy.c | 95 +++++++++++++++++++----------- src/p_mobj.c | 18 +++--- src/p_user.c | 2 +- 16 files changed, 362 insertions(+), 196 deletions(-) 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);