- switched checkhitwall interface to actors.

This commit is contained in:
Christoph Oelckers 2020-10-24 07:22:44 +02:00
parent 4258c27248
commit 7e29be7569
10 changed files with 67 additions and 56 deletions

View file

@ -388,7 +388,7 @@ void hitradius_d(DDukeActor* actor, int r, int hp1, int hp2, int hp3, int h
y1 = (((wal->y + wall[wal->point2].y) >> 1) + spri->y) >> 1;
updatesector(x1, y1, &sect);
if (sect >= 0 && cansee(x1, y1, spri->z, sect, spri->x, spri->y, spri->z, spri->sectnum))
fi.checkhitwall(actor->GetIndex(), x, wal->x, wal->y, spri->z, spri->picnum);
fi.checkhitwall(actor, x, wal->x, wal->y, spri->z, spri->picnum);
}
} while (sectcnt < sectend);
}
@ -1691,7 +1691,7 @@ static bool weaponhitwall(DDukeActor *proj, int j, const vec3_t &oldpos)
else
{
setsprite(proj, oldpos);
fi.checkhitwall(proj->GetIndex(), j, s->x, s->y, s->z, s->picnum);
fi.checkhitwall(proj, j, s->x, s->y, s->z, s->picnum);
if (s->picnum == FREEZEBLAST)
{
@ -2809,7 +2809,7 @@ static void flamethrowerflame(DDukeActor *actor)
else if (coll.type == kHitWall)
{
setsprite(actor, dax, day, daz);
fi.checkhitwall(actor->GetIndex(), coll.index, s->x, s->y, s->z, s->picnum);
fi.checkhitwall(actor, coll.index, s->x, s->y, s->z, s->picnum);
}
else if (coll.type == kHitSector)
{
@ -2939,7 +2939,7 @@ static void heavyhbomb(DDukeActor *actor)
if (coll.type== kHitWall)
{
int j = coll.index;
fi.checkhitwall(actor->GetIndex(), j, s->x, s->y, s->z, s->picnum);
fi.checkhitwall(actor, j, s->x, s->y, s->z, s->picnum);
int k = getangle(
wall[wall[j].point2].x - wall[j].x,

View file

@ -267,7 +267,7 @@ void hitradius_r(DDukeActor* actor, int r, int hp1, int hp2, int hp3, int h
y1 = (((wal->y + wall[wal->point2].y) >> 1) + spri->y) >> 1;
updatesector(x1, y1, &sect);
if (sect >= 0 && cansee(x1, y1, spri->z, sect, spri->x, spri->y, spri->z, spri->sectnum))
fi.checkhitwall(actor->GetIndex(), x, wal->x, wal->y, spri->z, spri->picnum);
fi.checkhitwall(actor, x, wal->x, wal->y, spri->z, spri->picnum);
}
} while (sectcnt < sectend);
@ -1249,7 +1249,7 @@ static bool weaponhitwall(DDukeActor *proj, int wal, const vec3_t& oldpos)
else
{
setsprite(proj, oldpos);
fi.checkhitwall(proj->GetIndex(), wal, s->x, s->y, s->z, s->picnum);
fi.checkhitwall(proj, wal, s->x, s->y, s->z, s->picnum);
if (!isRRRA() && s->picnum == FREEZEBLAST)
{
@ -2650,7 +2650,7 @@ static void heavyhbomb(DDukeActor *actor)
if (coll.type == kHitWall)
{
int j = coll.index;
fi.checkhitwall(actor->GetIndex(), j, s->x, s->y, s->z, s->picnum);
fi.checkhitwall(actor, j, s->x, s->y, s->z, s->picnum);
int k = getangle(
wall[wall[j].point2].x - wall[j].x,

View file

@ -47,8 +47,8 @@ bool checkhitswitch_d(int snum, int w, int switchtype);
bool checkhitswitch_r(int snum, int w, int switchtype);
void activatebysector_d(int sect, int j);
void activatebysector_r(int sect, int j);
void checkhitwall_d(int spr, int dawallnum, int x, int y, int z, int atwith);
void checkhitwall_r(int spr, int dawallnum, int x, int y, int z, int atwith);
void checkhitwall_d(DDukeActor* spr, int dawallnum, int x, int y, int z, int atwith);
void checkhitwall_r(DDukeActor* spr, int dawallnum, int x, int y, int z, int atwith);
void checkplayerhurt_d(struct player_struct* p, int j);
void checkplayerhurt_r(struct player_struct* p, int j);
bool checkhitceiling_d(int sn);

View file

@ -78,7 +78,7 @@ struct Dispatcher
void (*operateforcefields)(int s, int low);
bool (*checkhitswitch)(int snum, int w, int switchtype);
void (*activatebysector)(int sect, int j);
void (*checkhitwall)(int spr, int dawallnum, int x, int y, int z, int atwith);
void (*checkhitwall)(DDukeActor* spr, int dawallnum, int x, int y, int z, int atwith);
void (*checkplayerhurt)(struct player_struct* p, int j);
bool (*checkhitceiling)(int sn);
void (*checkhitsprite)(DDukeActor* i, DDukeActor* sn);

View file

@ -137,7 +137,7 @@ int madenoise(int playerNum);
int haskey(int sect, int snum);
void shootbloodsplat(DDukeActor* i, int p, int sx, int sy, int sz, int sa, int atwith, int BIGFORCE, int OOZFILTER, int NEWBEAST);
void breakwall(short newpn, short spr, short dawallnum);
void breakwall(short newpn, DDukeActor* spr, short dawallnum);
int callsound(int sectnum,DDukeActor* snum);
int hitasprite(DDukeActor* snum,DDukeActor **hitSprite);
int findplayer(const DDukeActor* s, int* dist);

View file

@ -289,7 +289,7 @@ static void shootknee(DDukeActor* actor, int p, int sx, int sy, int sz, int sa)
if (hitwall >= 0 && wall[hitwall].picnum != ACCESSSWITCH && wall[hitwall].picnum != ACCESSSWITCH2)
{
fi.checkhitwall(knee->GetIndex(), hitwall, hitx, hity, hitz, KNEE);
fi.checkhitwall(knee, hitwall, hitx, hity, hitz, KNEE);
if (p >= 0) fi.checkhitswitch(p, hitwall, 0);
}
}
@ -526,7 +526,7 @@ static void shootweapon(DDukeActor *actor, int p, int sx, int sy, int sz, int sa
if (hitz >= (sector[wall[hitwall].nextsector].floorz))
hitwall = wall[hitwall].nextwall;
fi.checkhitwall(spark->GetIndex(), hitwall, hitx, hity, hitz, SHOTSPARK1);
fi.checkhitwall(spark, hitwall, hitx, hity, hitz, SHOTSPARK1);
}
}
else
@ -542,7 +542,7 @@ static void shootweapon(DDukeActor *actor, int p, int sx, int sy, int sz, int sa
else spark->s.xrepeat = spark->s.yrepeat = 0;
}
else if (hitwall >= 0)
fi.checkhitwall(spark->GetIndex(), hitwall, hitx, hity, hitz, SHOTSPARK1);
fi.checkhitwall(spark, hitwall, hitx, hity, hitz, SHOTSPARK1);
}
if ((krand() & 255) < 4)
@ -983,7 +983,7 @@ static void shootgrowspark(DDukeActor* actor, int p, int sx, int sy, int sz, int
else if (hitsprt != nullptr) fi.checkhitsprite(hitsprt, spark);
else if (hitwall >= 0 && wall[hitwall].picnum != ACCESSSWITCH && wall[hitwall].picnum != ACCESSSWITCH2)
{
fi.checkhitwall(spark->GetIndex(), hitwall, hitx, hity, hitz, GROWSPARK);
fi.checkhitwall(spark, hitwall, hitx, hity, hitz, GROWSPARK);
}
}

View file

@ -186,7 +186,7 @@ static void shootmelee(DDukeActor *actor, int p, int sx, int sy, int sz, int sa,
if (hitwall >= 0 && wall[hitwall].picnum != ACCESSSWITCH && wall[hitwall].picnum != ACCESSSWITCH2)
{
fi.checkhitwall(wpn->GetIndex(), hitwall, hitx, hity, hitz, atwith);
fi.checkhitwall(wpn, hitwall, hitx, hity, hitz, atwith);
if (p >= 0) fi.checkhitswitch(p, hitwall, 0);
}
}
@ -431,7 +431,7 @@ static void shootweapon(DDukeActor* actor, int p, int sx, int sy, int sz, int sa
if (hitz >= (sector[wall[hitwall].nextsector].floorz))
hitwall = wall[hitwall].nextwall;
fi.checkhitwall(spark->GetIndex(), hitwall, hitx, hity, hitz, SHOTSPARK1);
fi.checkhitwall(spark, hitwall, hitx, hity, hitz, SHOTSPARK1);
}
}
else
@ -447,7 +447,7 @@ static void shootweapon(DDukeActor* actor, int p, int sx, int sy, int sz, int sa
else spark->s.xrepeat = spark->s.yrepeat = 0;
}
else if (hitwall >= 0)
fi.checkhitwall(spark->GetIndex(), hitwall, hitx, hity, hitz, SHOTSPARK1);
fi.checkhitwall(spark, hitwall, hitx, hity, hitz, SHOTSPARK1);
}
if ((krand() & 255) < 10)

View file

@ -1205,7 +1205,7 @@ void operateforcefields_common(DDukeActor *effector, int low, const std::initial
//
//---------------------------------------------------------------------------
void breakwall(short newpn, short spr, short dawallnum)
void breakwall(short newpn, DDukeActor* spr, short dawallnum)
{
wall[dawallnum].picnum = newpn;
S_PlayActorSound(VENT_BUST, spr);

View file

@ -639,9 +639,9 @@ void activatebysector_d(int sect, int j)
//
//---------------------------------------------------------------------------
void checkhitwall_d(int spr, int dawallnum, int x, int y, int z, int atwith)
void checkhitwall_d(DDukeActor* spr, int dawallnum, int x, int y, int z, int atwith)
{
short j, i, sn = -1, darkestwall;
short j, sn = -1, darkestwall;
walltype* wal;
wal = &wall[dawallnum];
@ -675,26 +675,26 @@ void checkhitwall_d(int spr, int dawallnum, int x, int y, int z, int atwith)
case W_FORCEFIELD + 2:
wal->extra = 1; // tell the forces to animate
case BIGFORCE:
{
updatesector(x, y, &sn);
if (sn < 0) return;
DDukeActor* spawned;
if (atwith == -1)
i = EGS(sn, x, y, z, FORCERIPPLE, -127, 8, 8, 0, 0, 0, spr, 5);
spawned = EGS(sn, x, y, z, FORCERIPPLE, -127, 8, 8, 0, 0, 0, spr, 5);
else
{
if (atwith == CHAINGUN)
i = EGS(sn, x, y, z, FORCERIPPLE, -127, 16 + sprite[spr].xrepeat, 16 + sprite[spr].yrepeat, 0, 0, 0, spr, 5);
else i = EGS(sn, x, y, z, FORCERIPPLE, -127, 32, 32, 0, 0, 0, spr, 5);
spawned = EGS(sn, x, y, z, FORCERIPPLE, -127, 16 + spr->s.xrepeat, 16 + spr->s.yrepeat, 0, 0, 0, spr, 5);
else spawned = EGS(sn, x, y, z, FORCERIPPLE, -127, 32, 32, 0, 0, 0, spr, 5);
}
sprite[i].cstat |= 18 + 128;
sprite[i].ang = getangle(wal->x - wall[wal->point2].x,
wal->y - wall[wal->point2].y) - 512;
spawned->s.cstat |= 18 + 128;
spawned->s.ang = getangle(wal->x - wall[wal->point2].x, wal->y - wall[wal->point2].y) - 512;
S_PlayActorSound(SOMETHINGHITFORCE, i);
S_PlayActorSound(SOMETHINGHITFORCE, spawned);
return;
}
case FANSPRITE:
wal->overpicnum = FANSPRITEBROKE;
wal->cstat &= 65535 - 65;
@ -708,6 +708,7 @@ void checkhitwall_d(int spr, int dawallnum, int x, int y, int z, int atwith)
return;
case GLASS:
{
updatesector(x, y, &sn); if (sn < 0) return;
wal->overpicnum = GLASS2;
lotsofglass(spr, dawallnum, 10);
@ -716,13 +717,16 @@ void checkhitwall_d(int spr, int dawallnum, int x, int y, int z, int atwith)
if (wal->nextwall >= 0)
wall[wal->nextwall].cstat = 0;
i = EGS(sn, x, y, z, SECTOREFFECTOR, 0, 0, 0, ps[0].angle.ang.asbuild(), 0, 0, spr, 3);
sprite[i].lotag = 128; hittype[i].temp_data[1] = 5; hittype[i].temp_data[2] = dawallnum;
S_PlayActorSound(GLASS_BREAKING, i);
auto spawned = EGS(sn, x, y, z, SECTOREFFECTOR, 0, 0, 0, ps[0].angle.ang.asbuild(), 0, 0, spr, 3);
spawned->s.lotag = 128;
spawned->temp_data[1] = 5;
spawned->temp_data[2] = dawallnum;
S_PlayActorSound(GLASS_BREAKING, spawned);
return;
}
case STAINGLASS1:
updatesector(x, y, &sn); if (sn < 0) return;
lotsofcolourglass(spr, dawallnum, 80);
lotsofcolourglass(spr->GetIndex(), dawallnum, 80);
wal->cstat = 0;
if (wal->nextwall >= 0)
wall[wal->nextwall].cstat = 0;
@ -816,7 +820,7 @@ void checkhitwall_d(int spr, int dawallnum, int x, int y, int z, int atwith)
case ATM:
wal->picnum = ATMBROKE;
fi.lotsofmoney(&hittype[spr], 1 + (krand() & 7));
fi.lotsofmoney(spr, 1 + (krand() & 7));
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
break;
@ -857,19 +861,19 @@ void checkhitwall_d(int spr, int dawallnum, int x, int y, int z, int atwith)
darkestwall = 0;
wal = &wall[sector[sn].wallptr];
for (i = sector[sn].wallnum; i > 0; i--, wal++)
for (int i = sector[sn].wallnum; i > 0; i--, wal++)
if (wal->shade > darkestwall)
darkestwall = wal->shade;
j = krand() & 1;
StatIterator it(STAT_EFFECTOR);
while ((i = it.NextIndex()) >= 0)
DukeStatIterator it(STAT_EFFECTOR);
while (auto effector = it.Next())
{
if (sprite[i].hitag == wall[dawallnum].lotag && sprite[i].lotag == 3)
if (effector->s.hitag == wall[dawallnum].lotag && effector->s.lotag == 3)
{
hittype[i].temp_data[2] = j;
hittype[i].temp_data[3] = darkestwall;
hittype[i].temp_data[4] = 1;
effector->temp_data[2] = j;
effector->temp_data[3] = darkestwall;
effector->temp_data[4] = 1;
}
}
break;
@ -921,7 +925,7 @@ void checkplayerhurt_d(struct player_struct* p, int j)
p->posyv = -(sintable[(p->angle.ang.asbuild()) & 2047] << 8);
S_PlayActorSound(DUKE_LONGTERM_PAIN, p->i);
fi.checkhitwall(p->i, j,
fi.checkhitwall(p->GetActor(), j,
p->posx + (sintable[(p->angle.ang.asbuild() + 512) & 2047] >> 9),
p->posy + (sintable[p->angle.ang.asbuild() & 2047] >> 9),
p->posz, -1);
@ -930,7 +934,7 @@ void checkplayerhurt_d(struct player_struct* p, int j)
case BIGFORCE:
p->hurt_delay = 26;
fi.checkhitwall(p->i, j,
fi.checkhitwall(p->GetActor(), j,
p->posx + (sintable[(p->angle.ang.asbuild() + 512) & 2047] >> 9),
p->posy + (sintable[p->angle.ang.asbuild() & 2047] >> 9),
p->posz, -1);

View file

@ -971,7 +971,7 @@ static void lotsofpopcorn(short i, short wallnum, short n)
//
//---------------------------------------------------------------------------
void checkhitwall_r(int spr, int dawallnum, int x, int y, int z, int atwith)
void checkhitwall_r(DDukeActor* spr, int dawallnum, int x, int y, int z, int atwith)
{
short j, i, sn = -1, darkestwall;
walltype* wal;
@ -1018,20 +1018,24 @@ void checkhitwall_r(int spr, int dawallnum, int x, int y, int z, int atwith)
return;
case RRTILE1973:
{
updatesector(x, y, &sn); if (sn < 0) return;
wal->overpicnum = GLASS2;
lotsofpopcorn(spr, dawallnum, 64);
lotsofpopcorn(spr->GetIndex(), dawallnum, 64);
wal->cstat = 0;
if (wal->nextwall >= 0)
wall[wal->nextwall].cstat = 0;
i = EGS(sn, x, y, z, SECTOREFFECTOR, 0, 0, 0, ps[0].angle.ang.asbuild(), 0, 0, spr, 3);
sprite[i].lotag = 128; hittype[i].temp_data[1] = 2; hittype[i].temp_data[2] = dawallnum;
S_PlayActorSound(GLASS_BREAKING, i);
auto spawned = EGS(sn, x, y, z, SECTOREFFECTOR, 0, 0, 0, ps[0].angle.ang.asbuild(), 0, 0, spr, 3);
spawned->s.lotag = 128;
spawned->temp_data[1] = 2;
spawned->temp_data[2] = dawallnum;
S_PlayActorSound(GLASS_BREAKING, spawned);
return;
}
case GLASS:
{
updatesector(x, y, &sn); if (sn < 0) return;
wal->overpicnum = GLASS2;
lotsofglass(spr, dawallnum, 10);
@ -1040,13 +1044,16 @@ void checkhitwall_r(int spr, int dawallnum, int x, int y, int z, int atwith)
if (wal->nextwall >= 0)
wall[wal->nextwall].cstat = 0;
i = EGS(sn, x, y, z, SECTOREFFECTOR, 0, 0, 0, ps[0].angle.ang.asbuild(), 0, 0, spr, 3);
sprite[i].lotag = 128; hittype[i].temp_data[1] = 2; hittype[i].temp_data[2] = dawallnum;
S_PlayActorSound(GLASS_BREAKING, i);
auto spawned = EGS(sn, x, y, z, SECTOREFFECTOR, 0, 0, 0, ps[0].angle.ang.asbuild(), 0, 0, spr, 3);
spawned->s.lotag = 128;
spawned->temp_data[1] = 2;
spawned->temp_data[2] = dawallnum;
S_PlayActorSound(GLASS_BREAKING, spawned);
return;
}
case STAINGLASS1:
updatesector(x, y, &sn); if (sn < 0) return;
lotsofcolourglass(spr, dawallnum, 80);
lotsofcolourglass(spr->GetIndex(), dawallnum, 80);
wal->cstat = 0;
if (wal->nextwall >= 0)
wall[wal->nextwall].cstat = 0;
@ -1245,7 +1252,7 @@ void checkhitwall_r(int spr, int dawallnum, int x, int y, int z, int atwith)
case ATM:
wal->picnum = ATMBROKE;
fi.lotsofmoney(&hittype[spr], 1 + (krand() & 7));
fi.lotsofmoney(spr, 1 + (krand() & 7));
S_PlayActorSound(GLASS_HEAVYBREAK, spr);
break;
@ -1407,7 +1414,7 @@ void checkplayerhurt_r(struct player_struct* p, int j)
{
case BIGFORCE:
p->hurt_delay = 26;
fi.checkhitwall(p->i, j,
fi.checkhitwall(p->GetActor(), j,
p->posx + (sintable[(p->angle.ang.asbuild() + 512) & 2047] >> 9),
p->posy + (sintable[p->angle.ang.asbuild() & 2047] >> 9),
p->posz, -1);