From 7e9a70c2eb5441c86c9be34484790d67d00cb1f4 Mon Sep 17 00:00:00 2001 From: Roman Fomin Date: Mon, 4 Nov 2024 13:13:46 +0700 Subject: [PATCH] fix MBF21 ripper weapons causing too much damage (#1977) * fix clang-tidy warnings * don't do "blockmapfix" for MF2_RIP projectiles --- src/p_enemy.c | 12 ++++----- src/p_map.c | 10 ++++---- src/p_maputl.c | 68 +++++++++++++++++++++++++------------------------- src/p_maputl.h | 3 ++- src/p_spec.c | 2 +- 5 files changed, 48 insertions(+), 47 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 428fd029..24753f28 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -957,20 +957,20 @@ static boolean P_LookForMonsters(mobj_t *actor, boolean allaround) // Search first in the immediate vicinity. - if (!P_BlockThingsIterator(x, y, PIT_FindTarget)) + if (!P_BlockThingsIterator(x, y, PIT_FindTarget, true)) return true; for (d=1; d<5; d++) { int i = 1 - d; do - if (!P_BlockThingsIterator(x+i, y-d, PIT_FindTarget) || - !P_BlockThingsIterator(x+i, y+d, PIT_FindTarget)) + if (!P_BlockThingsIterator(x+i, y-d, PIT_FindTarget, true) || + !P_BlockThingsIterator(x+i, y+d, PIT_FindTarget, true)) return true; while (++i < d); do - if (!P_BlockThingsIterator(x-d, y+i, PIT_FindTarget) || - !P_BlockThingsIterator(x+d, y+i, PIT_FindTarget)) + if (!P_BlockThingsIterator(x-d, y+i, PIT_FindTarget, true) || + !P_BlockThingsIterator(x+d, y+i, PIT_FindTarget, true)) return true; while (--i + d >= 0); } @@ -1726,7 +1726,7 @@ static boolean P_HealCorpse(mobj_t* actor, int radius, statenum_t healstate, sfx // Call PIT_VileCheck to check // whether object is a corpse // that canbe raised. - if (!P_BlockThingsIterator(bx,by,PIT_VileCheck)) + if (!P_BlockThingsIterator(bx, by, PIT_VileCheck, true)) { mobjinfo_t *info; diff --git a/src/p_map.c b/src/p_map.c index 4c1dc022..e8a1640c 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -295,7 +295,7 @@ boolean P_TeleportMove(mobj_t *thing, fixed_t x, fixed_t y, boolean boss) for (bx=xl ; bx<=xh ; bx++) for (by=yl ; by<=yh ; by++) - if (!P_BlockThingsIterator(bx,by,PIT_StompThing)) + if (!P_BlockThingsIterator(bx, by, PIT_StompThing, true)) return false; // the move is ok, @@ -637,7 +637,7 @@ static boolean PIT_CheckThing(mobj_t *thing) // killough 3/26/98: make static P_DamageMobj(thing, tmthing, tmthing->target, damage); numspechit = 0; - return (true); + return true; } // damage / explode @@ -809,7 +809,7 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y) for (bx=xl ; bx<=xh ; bx++) for (by=yl ; by<=yh ; by++) - if (!P_BlockThingsIterator(bx,by,PIT_CheckThing)) + if (!P_BlockThingsIterator(bx, by, PIT_CheckThing, !(tmthing->flags2 & MF2_RIP))) return false; // check lines @@ -2006,7 +2006,7 @@ void P_RadiusAttack(mobj_t *spot, mobj_t *source, int damage, int distance) for (y=yl ; y<=yh ; y++) for (x=xl ; x<=xh ; x++) - P_BlockThingsIterator(x, y, PIT_RadiusAttack); + P_BlockThingsIterator(x, y, PIT_RadiusAttack, false); } // @@ -2120,7 +2120,7 @@ boolean P_ChangeSector(sector_t *sector,boolean crunch) for (x=sector->blockbox[BOXLEFT] ; x<= sector->blockbox[BOXRIGHT] ; x++) for (y=sector->blockbox[BOXBOTTOM];y<= sector->blockbox[BOXTOP] ; y++) - P_BlockThingsIterator (x, y, PIT_ChangeSector); + P_BlockThingsIterator (x, y, PIT_ChangeSector, false); return nofit; } diff --git a/src/p_maputl.c b/src/p_maputl.c index 27504b68..18066f35 100644 --- a/src/p_maputl.c +++ b/src/p_maputl.c @@ -421,7 +421,8 @@ boolean P_BlockLinesIterator(int x, int y, boolean func(line_t*)) boolean blockmapfix; -boolean P_BlockThingsIterator(int x, int y, boolean func(mobj_t*)) +boolean P_BlockThingsIterator(int x, int y, boolean func(mobj_t*), + boolean do_blockmapfix) { mobj_t *mobj; @@ -435,15 +436,11 @@ boolean P_BlockThingsIterator(int x, int y, boolean func(mobj_t*)) // Blockmap bug fix by Terry Hearst // https://github.com/fabiangreffrath/crispy-doom/pull/723 // Add other mobjs from surrounding blocks that overlap this one - if (CRITICAL(blockmapfix)) + if (CRITICAL(blockmapfix) && do_blockmapfix) { if (demo_compatibility && overflow[emu_intercepts].enabled) return true; - // Don't do for explosions and crashers - if (func == PIT_RadiusAttack || func == PIT_ChangeSector) - return true; - // Unwrapped for least number of bounding box checks // (-1, -1) if (x > 0 && y > 0) @@ -710,8 +707,8 @@ boolean P_TraverseIntercepts(traverser_t func, fixed_t maxfrac) typedef struct { int len; - void *addr; boolean int16_array; + void *addr; } intercepts_overrun_t; // Intercepts memory table. This is where various variables are located @@ -724,29 +721,29 @@ typedef struct static intercepts_overrun_t intercepts_overrun[] = { - {4, NULL, false}, - {4, NULL, /* &earlyout, */ false}, - {4, NULL, /* &intercept_p, */ false}, - {4, &lowfloor, false}, - {4, &openbottom, false}, - {4, &opentop, false}, - {4, &openrange, false}, - {4, NULL, false}, - {120, NULL, /* &activeplats, */ false}, - {8, NULL, false}, - {4, &bulletslope, false}, - {4, NULL, /* &swingx, */ false}, - {4, NULL, /* &swingy, */ false}, - {4, NULL, false}, - {40, &playerstarts, true}, - {4, NULL, /* &blocklinks, */ false}, - {4, &bmapwidth, false}, - {4, NULL, /* &blockmap, */ false}, - {4, &bmaporgx, false}, - {4, &bmaporgy, false}, - {4, NULL, /* &blockmaplump, */ false}, - {4, &bmapheight, false}, - {0, NULL, false}, + {4, false, NULL, }, + {4, false, NULL, /* &earlyout, */ }, + {4, false, NULL, /* &intercept_p, */ }, + {4, false, &lowfloor, }, + {4, false, &openbottom, }, + {4, false, &opentop, }, + {4, false, &openrange, }, + {4, false, NULL, }, + {120, false, NULL, /* &activeplats, */ }, + {8, false, NULL, }, + {4, false, &bulletslope, }, + {4, false, NULL, /* &swingx, */ }, + {4, false, NULL, /* &swingy, */ }, + {4, false, NULL, }, + {40, true, &playerstarts, }, + {4, false, NULL, /* &blocklinks, */ }, + {4, false, &bmapwidth, }, + {4, false, NULL, /* &blockmap, */ }, + {4, false, &bmaporgx, }, + {4, false, &bmaporgy, }, + {4, false, NULL, /* &blockmaplump, */}, + {4, false, &bmapheight, }, + {0, false, NULL, }, }; // Overwrite a specific memory location with a value. @@ -924,11 +921,11 @@ boolean P_PathTraverse(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2, for (count = 0; count < 64; count++) { if (flags & PT_ADDLINES) - if (!P_BlockLinesIterator(mapx, mapy,PIT_AddLineIntercepts)) + if (!P_BlockLinesIterator(mapx, mapy, PIT_AddLineIntercepts)) return false; // early out if (flags & PT_ADDTHINGS) - if (!P_BlockThingsIterator(mapx, mapy,PIT_AddThingIntercepts)) + if (!P_BlockThingsIterator(mapx, mapy, PIT_AddThingIntercepts, true)) return false; // early out if (mapx == xt2 && mapy == yt2) @@ -1204,7 +1201,7 @@ static boolean P_SightTraverseIntercepts(void) // // go through in order // - in = 0; // shut up compiler warning + in = NULL; // shut up compiler warning while (count--) { @@ -1216,9 +1213,12 @@ static boolean P_SightTraverseIntercepts(void) in = scan; } - if (!PTR_SightTraverse(in)) + if (in) + { + if (!PTR_SightTraverse(in)) return false; // don't bother going farther in->frac = INT_MAX; + } } return true; // everything was traversed diff --git a/src/p_maputl.h b/src/p_maputl.h index e874aaae..175ea494 100644 --- a/src/p_maputl.h +++ b/src/p_maputl.h @@ -66,7 +66,8 @@ void P_LineOpening(struct line_s *linedef); void P_UnsetThingPosition(struct mobj_s *thing); void P_SetThingPosition(struct mobj_s *thing); boolean P_BlockLinesIterator (int x, int y, boolean func(struct line_s *)); -boolean P_BlockThingsIterator(int x, int y, boolean func(struct mobj_s *)); +boolean P_BlockThingsIterator(int x, int y, boolean func(struct mobj_s *), + boolean do_blockmapfix); boolean ThingIsOnLine(struct mobj_s *t, struct line_s *l); // killough 3/15/98 boolean P_PathTraverse(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2, int flags, boolean trav(intercept_t *)); diff --git a/src/p_spec.c b/src/p_spec.c index b4b52b1c..36ad1f41 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3314,7 +3314,7 @@ void T_Pusher(pusher_t *p) yh = (tmbbox[BOXTOP] - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT; for (bx=xl ; bx<=xh ; bx++) for (by=yl ; by<=yh ; by++) - P_BlockThingsIterator(bx,by,PIT_PushThing); + P_BlockThingsIterator(bx, by, PIT_PushThing, true); return; }