- handle all wp referencing actor->s().

This commit is contained in:
Christoph Oelckers 2021-12-24 20:03:38 +01:00
parent 1afb985291
commit 7bea7cdae1
3 changed files with 25 additions and 31 deletions

View file

@ -1949,7 +1949,7 @@ void CopySectorMatch(int match); // copysect.c
int DoWallMoveMatch(short match); // wallmove.c int DoWallMoveMatch(short match); // wallmove.c
int DoWallMove(DSWActor* sp); // wallmove.c int DoWallMove(DSWActor* sp); // wallmove.c
bool CanSeeWallMove(SPRITEp wp,short match); // wallmove.c bool CanSeeWallMove(DSWActor* wp,int match); // wallmove.c
void DoSpikeOperate(sectortype* sect); // spike.c void DoSpikeOperate(sectortype* sect); // spike.c
void SetSpikeActive(DSWActor*); // spike.c void SetSpikeActive(DSWActor*); // spike.c

View file

@ -159,7 +159,7 @@ int DoWallMove(DSWActor* actor)
return found; return found;
} }
bool CanSeeWallMove(SPRITEp wp, short match) bool CanSeeWallMove(DSWActor* caller, int match)
{ {
int i; int i;
bool found = false; bool found = false;
@ -174,7 +174,7 @@ bool CanSeeWallMove(SPRITEp wp, short match)
{ {
found = true; found = true;
if (cansee(wp->pos.X, wp->pos.Y, wp->pos.Z, wp->sector(), sp->pos.X, sp->pos.Y, sp->pos.Z, sp->sector())) if (cansee(caller->spr.pos.X, caller->spr.pos.Y, caller->spr.pos.Z, caller->spr.sector(), sp->pos.X, sp->pos.Y, sp->pos.Z, sp->sector()))
{ {
return true; return true;
} }

View file

@ -7105,7 +7105,6 @@ const char *DeathString(DSWActor* actor)
int DoDamageTest(DSWActor* actor) int DoDamageTest(DSWActor* actor)
{ {
auto wu = actor->u(); auto wu = actor->u();
SPRITEp wp = &actor->s();
USERp u; USERp u;
int i; int i;
@ -7121,7 +7120,7 @@ int DoDamageTest(DSWActor* actor)
u = itActor->u(); u = itActor->u();
DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, wp->pos.X, wp->pos.Y, dist, tx, ty, tmin); DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
if ((unsigned)dist > wu->Radius + u->Radius) if ((unsigned)dist > wu->Radius + u->Radius)
continue; continue;
@ -7135,7 +7134,7 @@ int DoDamageTest(DSWActor* actor)
// For speed's sake, try limiting check only to radius weapons! // For speed's sake, try limiting check only to radius weapons!
if (wu->Radius > 200) if (wu->Radius > 200)
{ {
if (!FAFcansee(itActor->spr.pos.X,itActor->spr.pos.Y, ActorUpperZ(actor), itActor->spr.sector(),wp->pos.X,wp->pos.Y,wp->pos.Z,wp->sector())) if (!FAFcansee(itActor->spr.pos.X,itActor->spr.pos.Y, ActorUpperZ(actor), itActor->spr.sector(),actor->spr.pos.X,actor->spr.pos.Y,actor->spr.pos.Z,actor->spr.sector()))
continue; continue;
} }
@ -7171,7 +7170,6 @@ static void DoHitscanDamage(DSWActor* weaponActor, DSWActor* hitActor)
int DoFlamesDamageTest(DSWActor* actor) int DoFlamesDamageTest(DSWActor* actor)
{ {
SPRITEp wp = &actor->s();
USERp wu = actor->u(); USERp wu = actor->u();
USERp u; USERp u;
@ -7198,7 +7196,7 @@ int DoFlamesDamageTest(DSWActor* actor)
continue; continue;
} }
DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, wp->pos.X, wp->pos.Y, dist, tx, ty, tmin); DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
if ((unsigned)dist > wu->Radius + u->Radius) if ((unsigned)dist > wu->Radius + u->Radius)
continue; continue;
@ -7209,12 +7207,12 @@ int DoFlamesDamageTest(DSWActor* actor)
if (!TEST(itActor->spr.cstat, CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN)) if (!TEST(itActor->spr.cstat, CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN))
continue; continue;
if (TEST(wp->cstat, CSTAT_SPRITE_INVISIBLE)) if (TEST(actor->spr.cstat, CSTAT_SPRITE_INVISIBLE))
continue; continue;
if (wu->Radius > 200) // Note: No weaps have bigger radius than 200 cept explosion stuff if (wu->Radius > 200) // Note: No weaps have bigger radius than 200 cept explosion stuff
{ {
if (FAFcansee(itActor->spr.pos.X,itActor->spr.pos.Y,GetSpriteZOfMiddle(wp),itActor->spr.sector(),wp->pos.X,wp->pos.Y,GetSpriteZOfMiddle(wp),wp->sector())) if (FAFcansee(itActor->spr.pos.X,itActor->spr.pos.Y,ActorZOfMiddle(actor),itActor->spr.sector(),actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->spr.sector()))
{ {
DoDamage(itActor, actor); DoDamage(itActor, actor);
} }
@ -7310,7 +7308,6 @@ void TraverseBreakableWalls(sectortype* start_sect, int x, int y, int z, short a
int DoExpDamageTest(DSWActor* actor) int DoExpDamageTest(DSWActor* actor)
{ {
auto wu = actor->u(); auto wu = actor->u();
SPRITEp wp = &actor->s();
USERp u; USERp u;
short i, stat; short i, stat;
@ -7331,7 +7328,7 @@ int DoExpDamageTest(DSWActor* actor)
max_stat = SIZ(StatDamageList); max_stat = SIZ(StatDamageList);
// don't check for mines if the weapon is a mine // don't check for mines if the weapon is a mine
if (wp->statnum == STAT_MINE_STUCK) if (actor->spr.statnum == STAT_MINE_STUCK)
max_stat--; max_stat--;
for (stat = 0; stat < max_stat; stat++) for (stat = 0; stat < max_stat; stat++)
@ -7341,7 +7338,7 @@ int DoExpDamageTest(DSWActor* actor)
{ {
u = itActor->u(); u = itActor->u();
DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, wp->pos.X, wp->pos.Y, dist, tx, ty, tmin); DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
if ((unsigned)dist > wu->Radius + u->Radius) if ((unsigned)dist > wu->Radius + u->Radius)
continue; continue;
@ -7355,7 +7352,7 @@ int DoExpDamageTest(DSWActor* actor)
} }
else else
{ {
if ((unsigned)FindDistance3D(itActor->spr.pos.X - wp->pos.X, itActor->spr.pos.Y - wp->pos.Y, itActor->spr.pos.Z - wp->pos.Z) > wu->Radius + u->Radius) if ((unsigned)FindDistance3D(itActor->spr.pos.X - actor->spr.pos.X, itActor->spr.pos.Y - actor->spr.pos.Y, itActor->spr.pos.Z - actor->spr.pos.Z) > wu->Radius + u->Radius)
continue; continue;
// added hitscan block because mines no long clip against actors/players // added hitscan block because mines no long clip against actors/players
@ -7364,8 +7361,8 @@ int DoExpDamageTest(DSWActor* actor)
// Second parameter MUST have blocking bits set or cansee won't work // Second parameter MUST have blocking bits set or cansee won't work
// added second check for FAF water - hitscans were hitting ceiling // added second check for FAF water - hitscans were hitting ceiling
if (!FAFcansee(wp->pos.X, wp->pos.Y, wp->pos.Z, wp->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ActorUpperZ(actor), itActor->spr.sector()) && if (!FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ActorUpperZ(actor), itActor->spr.sector()) &&
!FAFcansee(wp->pos.X, wp->pos.Y, wp->pos.Z, wp->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ActorLowerZ(actor), itActor->spr.sector())) !FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ActorLowerZ(actor), itActor->spr.sector()))
continue; continue;
DoDamage(itActor, actor); DoDamage(itActor, actor);
@ -7376,7 +7373,7 @@ int DoExpDamageTest(DSWActor* actor)
if (wu->ID == MUSHROOM_CLOUD) return 0; // Central Nuke doesn't break stuff if (wu->ID == MUSHROOM_CLOUD) return 0; // Central Nuke doesn't break stuff
// Only secondaries do that // Only secondaries do that
TraverseBreakableWalls(wp->sector(), wp->pos.X, wp->pos.Y, wp->pos.Z, wp->ang, wu->Radius); TraverseBreakableWalls(actor->spr.sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, wu->Radius);
break_count = 0; break_count = 0;
max_stat = SIZ(StatBreakList); max_stat = SIZ(StatBreakList);
@ -7388,15 +7385,15 @@ int DoExpDamageTest(DSWActor* actor)
{ {
u = itActor->u(); u = itActor->u();
DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, wp->pos.X, wp->pos.Y, dist, tx, ty, tmin); DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
if ((unsigned)dist > wu->Radius) if ((unsigned)dist > wu->Radius)
continue; continue;
dist = FindDistance3D(itActor->spr.pos.X - wp->pos.X, itActor->spr.pos.Y - wp->pos.Y, ActorZOfMiddle(itActor) - wp->pos.Z); dist = FindDistance3D(itActor->spr.pos.X - actor->spr.pos.X, itActor->spr.pos.Y - actor->spr.pos.Y, ActorZOfMiddle(itActor) - actor->spr.pos.Z);
if ((unsigned)dist > wu->Radius) if ((unsigned)dist > wu->Radius)
continue; continue;
if (!FAFcansee(itActor->spr.pos.X, itActor->spr.pos.Y, ActorZOfMiddle(itActor), itActor->spr.sector(), wp->pos.X, wp->pos.Y, wp->pos.Z, wp->sector())) if (!FAFcansee(itActor->spr.pos.X, itActor->spr.pos.Y, ActorZOfMiddle(itActor), itActor->spr.sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.sector()))
continue; continue;
if (TEST(itActor->spr.extra, SPRX_BREAKABLE)) if (TEST(itActor->spr.extra, SPRX_BREAKABLE))
@ -7416,14 +7413,14 @@ int DoExpDamageTest(DSWActor* actor)
SWStatIterator it(STAT_WALL_MOVE); SWStatIterator it(STAT_WALL_MOVE);
while (auto itActor = it.Next()) while (auto itActor = it.Next())
{ {
DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, wp->pos.X, wp->pos.Y, dist, tx, ty, tmin); DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
if ((unsigned)dist > wu->Radius/4) if ((unsigned)dist > wu->Radius/4)
continue; continue;
if (TEST_BOOL1(&actor->spr)) if (TEST_BOOL1(actor))
continue; continue;
if (!CanSeeWallMove(wp, SP_TAG2(actor))) if (!CanSeeWallMove(actor, SP_TAG2(actor)))
continue; continue;
if (dist < found_dist) if (dist < found_dist)
@ -7455,7 +7452,6 @@ int DoExpDamageTest(DSWActor* actor)
int DoMineExpMine(DSWActor* actor) int DoMineExpMine(DSWActor* actor)
{ {
auto wu = actor->u(); auto wu = actor->u();
SPRITEp wp = &actor->s();
USERp u; USERp u;
int i; int i;
@ -7468,7 +7464,7 @@ int DoMineExpMine(DSWActor* actor)
{ {
u = itActor->u(); u = itActor->u();
DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, wp->pos.X, wp->pos.Y, dist, tx, ty, tmin); DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
if ((unsigned)dist > wu->Radius + u->Radius) if ((unsigned)dist > wu->Radius + u->Radius)
continue; continue;
@ -7479,7 +7475,7 @@ int DoMineExpMine(DSWActor* actor)
continue; continue;
// Explosions are spherical, not planes, so let's check that way, well cylindrical at least. // Explosions are spherical, not planes, so let's check that way, well cylindrical at least.
zdist = abs(itActor->spr.pos.Z - wp->pos.Z)>>4; zdist = abs(itActor->spr.pos.Z - actor->spr.pos.Z)>>4;
if (SpriteOverlap(actor, itActor) || (unsigned)zdist < wu->Radius + u->Radius) if (SpriteOverlap(actor, itActor) || (unsigned)zdist < wu->Radius + u->Radius)
{ {
DoDamage(itActor, actor); DoDamage(itActor, actor);
@ -8762,8 +8758,6 @@ bool OwnerIsPlayer(DSWActor* actor)
int DoMineRangeTest(DSWActor* actor, int range) int DoMineRangeTest(DSWActor* actor, int range)
{ {
SPRITEp wp = &actor->s();
USERp u; USERp u;
unsigned stat; unsigned stat;
int dist, tx, ty; int dist, tx, ty;
@ -8779,7 +8773,7 @@ int DoMineRangeTest(DSWActor* actor, int range)
{ {
u = itActor->u(); u = itActor->u();
DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, wp->pos.X, wp->pos.Y, dist, tx, ty, tmin); DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
if (dist > range) if (dist > range)
continue; continue;
@ -8795,11 +8789,11 @@ int DoMineRangeTest(DSWActor* actor, int range)
if (u->ID == GIRLNINJA_RUN_R0 && !ownerisplayer) if (u->ID == GIRLNINJA_RUN_R0 && !ownerisplayer)
continue; continue;
dist = FindDistance3D(wp->pos.X - itActor->spr.pos.X, wp->pos.Y - itActor->spr.pos.Y, wp->pos.Z - itActor->spr.pos.Z); dist = FindDistance3D(actor->spr.pos.X - itActor->spr.pos.X, actor->spr.pos.Y - itActor->spr.pos.Y, actor->spr.pos.Z - itActor->spr.pos.Z);
if (dist > range) if (dist > range)
continue; continue;
if (!FAFcansee(itActor->spr.pos.X,itActor->spr.pos.Y,ActorUpperZ(actor),itActor->spr.sector(),wp->pos.X,wp->pos.Y,wp->pos.Z,wp->sector())) if (!FAFcansee(itActor->spr.pos.X,itActor->spr.pos.Y,ActorUpperZ(actor),itActor->spr.sector(),actor->spr.pos.X,actor->spr.pos.Y,actor->spr.pos.Z,actor->spr.sector()))
continue; continue;
return true; return true;