- consolidated checkhitdefault functions.

This commit is contained in:
Christoph Oelckers 2023-01-01 16:08:12 +01:00
parent 6fd4368592
commit bfcceccc98
8 changed files with 144 additions and 239 deletions

View file

@ -324,16 +324,16 @@ void movetransports_d(void)
if (act->spr.pal == 0)
{
auto k = spawn(Owner, DukeTransporterBeamClass);
if (k) S_PlayActorSound(TELEPORTER, k);
auto beam = spawn(Owner, DukeTransporterBeamClass);
if (beam) S_PlayActorSound(TELEPORTER, beam);
}
break;
}
}
else if (!(sectlotag == 1 && ps[p].on_ground == 1)) break;
else if (!(sectlotag == ST_1_ABOVE_WATER && ps[p].on_ground == 1)) break;
if (onfloorz == 0 && abs(act->spr.pos.Z - ps[p].GetActor()->getOffsetZ()) < 24)
if (onfloorz == 0 && fabs(act->spr.pos.Z - ps[p].GetActor()->getOffsetZ()) < 24)
if ((ps[p].jetpack_on == 0) || (ps[p].jetpack_on && (PlayerInput(p, SB_JUMP) || ps[p].sync.uvel > 0)) ||
(ps[p].jetpack_on && (PlayerInput(p, SB_CROUCH) || ps[p].sync.uvel < 0)))
{
@ -426,7 +426,7 @@ void movetransports_d(void)
if ((krand() & 255) < 32)
spawn(act2, DukeWaterSplashClass);
if (sectlotag == 1)
if (sectlotag == ST_1_ABOVE_WATER)
for (int l = 0; l < 9; l++)
{
auto q = spawn(ps[p].GetActor(), DukeWaterBubbleClass);

View file

@ -236,37 +236,34 @@ int ifhitbyweapon_r(DDukeActor *actor)
void movetransports_r(void)
{
uint8_t warpdir = 0;
int k, p, sectlotag;
int onfloorz;
//Transporters
DukeStatIterator iti(STAT_TRANSPORT);
while (auto act = iti.Next())
{
auto sectp = act->sector();
sectlotag = sectp->lotag;
auto Owner = act->GetOwner();
if (Owner == act || Owner == nullptr)
{
continue;
}
onfloorz = act->temp_data[4];
auto sectp = act->sector();
int sectlotag = sectp->lotag;
int onfloorz = act->temp_data[4];
if (act->counter > 0) act->counter--;
DukeSectIterator itj(act->sector());
while (auto act2 = itj.Next())
while (auto act2 = itj.Next())
{
switch (act2->spr.statnum)
{
case STAT_PLAYER: // Player
case STAT_PLAYER:
if (act2->GetOwner())
{
p = act2->PlayerIndex();
int p = act2->PlayerIndex();
ps[p].on_warping_sector = 1;
@ -277,12 +274,12 @@ void movetransports_r(void)
spawn(act, DukeTransporterBeamClass);
S_PlayActorSound(TELEPORTER, act);
for (k = connecthead; k >= 0; k = connectpoint2[k])
if (ps[k].cursector == Owner->sector())
{
ps[k].frag_ps = p;
ps[k].GetActor()->spr.extra = 0;
}
for (int k = connecthead; k >= 0; k = connectpoint2[k])
if (ps[k].cursector == Owner->sector())
{
ps[k].frag_ps = p;
ps[k].GetActor()->spr.extra = 0;
}
ps[p].GetActor()->PrevAngles.Yaw = ps[p].GetActor()->spr.Angles.Yaw = Owner->spr.Angles.Yaw;
@ -326,7 +323,7 @@ void movetransports_r(void)
break;
}
k = 0;
int k = 0;
if (ud.mapflags & MFLAG_ALLSECTORTYPES)
{
@ -370,7 +367,7 @@ void movetransports_r(void)
{
FX_StopAllSounds();
}
S_PlayActorSound(DUKE_GASP, ps[p].GetActor());
S_PlayActorSound(DUKE_GASP, act2);
ps[p].GetActor()->spr.pos.Z = Owner->sector()->floorz - 7 + gs.playerheight;
ps[p].GetActor()->backupz();
@ -381,14 +378,14 @@ void movetransports_r(void)
ps[p].GetActor()->spr.pos.XY() += Owner->spr.pos.XY() - act->spr.pos.XY();
ps[p].GetActor()->backupvec2();
if (Owner->GetOwner() != Owner)
if (!Owner || Owner->GetOwner() != Owner)
ps[p].transporter_hold = -2;
ps[p].setCursector(Owner->sector());
ChangeActorSect(act2, Owner->sector());
if ((krand() & 255) < 32)
spawn(ps[p].GetActor(), DukeWaterSplashClass);
spawn(act2, DukeWaterSplashClass);
}
else if (k == 2)
{
@ -405,6 +402,8 @@ void movetransports_r(void)
break;
case STAT_ACTOR:
if ((act2->flags3 & SFLAG3_DONTDIVEALIVE) && act2->spr.extra > 0) continue;
[[fallthrough]];
case STAT_PROJECTILE:
case STAT_MISC:
case STAT_DUMMYPLAYER:

View file

@ -39,8 +39,6 @@ bool checkaccessswitch_d(int snum, int pal, DDukeActor *act, walltype* w);
bool checkaccessswitch_r(int snum, int pal, DDukeActor* act, walltype* w);
void activatebysector_d(sectortype* sect, DDukeActor* j);
void activatebysector_r(sectortype* sect, DDukeActor* j);
void checkhitdefault_d(DDukeActor* i, DDukeActor* sn);
void checkhitdefault_r(DDukeActor* i, DDukeActor* sn);
void checksectors_d(int snum);
void checksectors_r(int snum);
@ -81,7 +79,6 @@ void SetDispatcher()
initactorflags_d,
checkaccessswitch_d,
activatebysector_d,
checkhitdefault_d,
checksectors_d,
addweapon_d,
@ -105,7 +102,6 @@ void SetDispatcher()
initactorflags_r,
checkaccessswitch_r,
activatebysector_r,
checkhitdefault_r,
checksectors_r,
addweapon_r,

View file

@ -77,7 +77,6 @@ struct Dispatcher
void (*initactorflags)();
bool (*checkaccessswitch)(int snum, int switchpal, DDukeActor* act, walltype* w);
void (*activatebysector)(sectortype* sect, DDukeActor* j);
void (*checkhitdefault)(DDukeActor* i, DDukeActor* sn);
void (*checksectors)(int low);
void (*addweapon)(player_struct *p, int weapon, bool wswitch);

View file

@ -1376,6 +1376,125 @@ bool checkhitceiling(sectortype* sectp)
return false;
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void checkhitdefault(DDukeActor* targ, DDukeActor* proj)
{
if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && targ->spr.hitag == 0 && targ->spr.lotag == 0 && targ->spr.statnum == STAT_DEFAULT)
return;
if (((proj->flags3 & SFLAG3_CANHURTSHOOTER) || proj->GetOwner() != targ) && targ->spr.statnum != STAT_PROJECTILE)
{
if (badguy(targ))
{
if (targ->spr.scale.X < targ->FloatVar(NAME_minhitscale))
return;
if (proj->flags4 & SFLAG4_DOUBLEHITDAMAGE) proj->spr.extra <<= 1;
if (!(targ->flags3 & SFLAG3_NOHITJIBS) && !(proj->flags3 & SFLAG3_NOHITJIBS))
{
auto spawned = spawn(proj, DukeJibs6Class);
if (spawned)
{
if (proj->spr.pal == 6)
spawned->spr.pal = 6;
spawned->spr.pos.Z += 4;
spawned->vel.X = 1;
spawned->spr.scale = DVector2(0.375, 0.375);
spawned->spr.Angles.Yaw = DAngle22_5 / 4 - randomAngle(22.5 / 2);
}
}
auto Owner = proj->GetOwner();
if (Owner && Owner->isPlayer() && !(targ->flags3 & SFLAG3_NOSHOTGUNBLOOD))
if (ps[Owner->PlayerIndex()].curr_weapon == SHOTGUN_WEAPON)
{
shoot(targ, DukeBloodSplat3Class);
shoot(targ, DukeBloodSplat1Class);
shoot(targ, DukeBloodSplat2Class);
shoot(targ, DukeBloodSplat4Class);
}
if (!(targ->flags2 & SFLAG2_NODAMAGEPUSH))
{
if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_MASK) == 0)
targ->spr.Angles.Yaw = proj->spr.Angles.Yaw + DAngle180;
targ->vel.X = -proj->spr.extra * 0.25;
auto sp = targ->sector();
pushmove(targ->spr.pos, &sp, 8, 4, 4, CLIPMASK0);
if (sp != targ->sector() && sp != nullptr)
ChangeActorSect(targ, sp);
}
if (targ->spr.statnum == STAT_ZOMBIEACTOR)
{
ChangeActorStat(targ, STAT_ACTOR);
targ->timetosleep = SLEEPTIME;
}
if (!shrinkersizecheck(proj->GetClass(), targ)) return;
}
if (targ->spr.statnum != STAT_ZOMBIEACTOR)
{
if ((proj->flags2 & SFLAG2_FREEZEDAMAGE) && ((targ->isPlayer() && targ->spr.pal == 1) || (gs.freezerhurtowner == 0 && proj->GetOwner() == targ)))
return;
auto hitpic = static_cast<PClassActor*>(proj->GetClass());
auto Owner = proj->GetOwner();
if (Owner && Owner->isPlayer())
{
if (targ->isPlayer() && ud.coop != 0 && ud.ffire == 0)
return;
auto tOwner = targ->GetOwner();
if (hitpic == DukeFireballClass && tOwner && tOwner->GetClass() != DukeFireballClass) // hack alert! Even with damage types this special check needs to stay.
hitpic = DukeFlamethrowerFlameClass;
}
targ->attackertype = hitpic;
targ->hitextra += proj->spr.extra;
if (!(targ->flags4 & SFLAG4_NODAMAGETURN))
targ->hitang = proj->spr.Angles.Yaw;
targ->SetHitOwner(Owner);
}
if (targ->spr.statnum == STAT_PLAYER)
{
auto p = targ->PlayerIndex();
if (ps[p].newOwner != nullptr)
{
ps[p].newOwner = nullptr;
ps[p].GetActor()->restoreloc();
updatesector(ps[p].GetActor()->getPosWithOffsetZ(), &ps[p].cursector);
DukeStatIterator it(STAT_ACTOR);
while (auto itActor = it.Next())
{
if (itActor->flags2 & SFLAG2_CAMERA) itActor->spr.yint = 0;
}
}
if (!shrinkersizecheck(proj->GetClass(), targ))
return;
auto hitowner = targ->GetHitOwner();
if (!hitowner || !hitowner->isPlayer())
if (ud.player_skill >= 3)
proj->spr.extra += (proj->spr.extra >> 1);
}
}
}
//---------------------------------------------------------------------------
//
//

View file

@ -152,123 +152,6 @@ void checkplayerhurt_d(player_struct* p, const Collision& coll)
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void checkhitdefault_d(DDukeActor* targ, DDukeActor* proj)
{
if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && targ->spr.hitag == 0 && targ->spr.lotag == 0 && targ->spr.statnum == STAT_DEFAULT)
return;
if (((proj->flags3 & SFLAG3_CANHURTSHOOTER) || proj->GetOwner() != targ) && targ->spr.statnum != STAT_PROJECTILE)
{
if (badguy(targ))
{
if (targ->spr.scale.X < targ->FloatVar(NAME_minhitscale))
return;
if (proj->flags4 & SFLAG4_DOUBLEHITDAMAGE) proj->spr.extra <<= 1;
if (!(targ->flags3 & SFLAG3_NOHITJIBS) && !(proj->flags3 & SFLAG3_NOHITJIBS))
{
auto spawned = spawn(proj, DukeJibs6Class);
if (spawned)
{
if (proj->spr.pal == 6)
spawned->spr.pal = 6;
spawned->spr.pos.Z += 4;
spawned->vel.X = 1;
spawned->spr.scale = DVector2(0.375, 0.375);
spawned->spr.Angles.Yaw = DAngle22_5 / 4 - randomAngle(22.5 / 2);
}
}
auto Owner = proj->GetOwner();
if (Owner && Owner->isPlayer() && !(targ->flags3 & SFLAG3_NOSHOTGUNBLOOD))
if (ps[Owner->PlayerIndex()].curr_weapon == SHOTGUN_WEAPON)
{
shoot(targ, DukeBloodSplat3Class);
shoot(targ, DukeBloodSplat1Class);
shoot(targ, DukeBloodSplat2Class);
shoot(targ, DukeBloodSplat4Class);
}
if (!(targ->flags2 & SFLAG2_NODAMAGEPUSH)) // RR does not have this.
{
if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_MASK) == 0)
targ->spr.Angles.Yaw = proj->spr.Angles.Yaw + DAngle180;
targ->vel.X = -proj->spr.extra * 0.25;
auto sp = targ->sector();
pushmove(targ->spr.pos, &sp, 8, 4, 4, CLIPMASK0);
if (sp != targ->sector() && sp != nullptr)
ChangeActorSect(targ, sp);
}
if (targ->spr.statnum == STAT_ZOMBIEACTOR)
{
ChangeActorStat(targ, STAT_ACTOR);
targ->timetosleep = SLEEPTIME;
}
if (!shrinkersizecheck(proj->GetClass(), targ)) return;
}
if (targ->spr.statnum != STAT_ZOMBIEACTOR)
{
if ((proj->flags2 & SFLAG2_FREEZEDAMAGE) && ((targ->isPlayer() && targ->spr.pal == 1) || (gs.freezerhurtowner == 0 && proj->GetOwner() == targ)))
return;
auto hitpic = static_cast<PClassActor*>(proj->GetClass());
auto Owner = proj->GetOwner();
if (Owner && Owner->isPlayer())
{
if (targ->isPlayer() && ud.coop != 0 && ud.ffire == 0)
return;
auto tOwner = targ->GetOwner();
if (hitpic == DukeFireballClass && tOwner && tOwner->GetClass() != DukeFireballClass) // hack alert! Even with damage types this special check needs to stay.
hitpic = DukeFlamethrowerFlameClass;
}
targ->attackertype = hitpic;
targ->hitextra += proj->spr.extra;
targ->hitang = proj->spr.Angles.Yaw;
targ->SetHitOwner(Owner);
}
if (targ->spr.statnum == STAT_PLAYER)
{
auto p = targ->PlayerIndex();
if (ps[p].newOwner != nullptr)
{
ps[p].newOwner = nullptr;
ps[p].GetActor()->restoreloc();
updatesector(ps[p].GetActor()->getPosWithOffsetZ(), &ps[p].cursector);
DukeStatIterator it(STAT_ACTOR);
while (auto itActor = it.Next())
{
if (itActor->flags2 & SFLAG2_CAMERA) itActor->spr.yint = 0;
}
}
if (!shrinkersizecheck(proj->GetClass(), targ))
return;
auto hitowner = targ->GetHitOwner();
if (!hitowner || !hitowner->isPlayer())
if (ud.player_skill >= 3)
proj->spr.extra += (proj->spr.extra >> 1);
}
}
}
//---------------------------------------------------------------------------
//
// taken out of checksectors to eliminate some gotos.

View file

@ -158,92 +158,6 @@ void checkplayerhurt_r(player_struct* p, const Collision &coll)
//
//---------------------------------------------------------------------------
void checkhitdefault_r(DDukeActor* targ, DDukeActor* proj)
{
if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && targ->spr.hitag == 0 && targ->spr.lotag == 0 && targ->spr.statnum == 0)
return;
if (((proj->flags3 & SFLAG3_CANHURTSHOOTER) || proj->GetOwner() != targ) && targ->spr.statnum != STAT_PROJECTILE)
{
if (badguy(targ) == 1)
{
if (proj->flags4 & SFLAG4_DOUBLEHITDAMAGE) proj->spr.extra <<= 1;
if (!(targ->flags3 & SFLAG3_NOHITJIBS) && !(proj->flags3 & SFLAG3_NOHITJIBS))
{
auto spawned = spawn(proj, DukeJibs6Class);
if (spawned)
{
if (proj->spr.pal == 6)
spawned->spr.pal = 6;
spawned->spr.pos.Z += 4;
spawned->vel.X = 1;
spawned->spr.scale = DVector2(0.375, 0.375);
spawned->spr.Angles.Yaw = DAngle22_5 / 4 - randomAngle(22.5 / 2);
}
}
auto Owner = proj->GetOwner();
if (Owner && Owner->isPlayer() && !(targ->flags3 & SFLAG3_NOSHOTGUNBLOOD))
if (ps[Owner->PlayerIndex()].curr_weapon == SHOTGUN_WEAPON)
{
shoot(targ, DukeBloodSplat3Class);
shoot(targ, DukeBloodSplat1Class);
shoot(targ, DukeBloodSplat2Class);
shoot(targ, DukeBloodSplat4Class);
}
if (targ->spr.statnum == STAT_ZOMBIEACTOR)
{
ChangeActorStat(targ, STAT_ACTOR);
targ->timetosleep = SLEEPTIME;
}
}
if (targ->spr.statnum != STAT_ZOMBIEACTOR)
{
if ((proj->flags2 & SFLAG2_FREEZEDAMAGE) && ((targ->isPlayer() && targ->spr.pal == 1) || (gs.freezerhurtowner == 0 && proj->GetOwner() == targ)))
return;
targ->attackertype = static_cast<PClassActor*>(proj->GetClass());
targ->hitextra += proj->spr.extra;
if (!(targ->flags4 & SFLAG4_NODAMAGETURN))
targ->hitang = proj->spr.Angles.Yaw;
targ->SetHitOwner(proj->GetOwner());
}
if (targ->spr.statnum == STAT_PLAYER)
{
auto p = targ->PlayerIndex();
if (ps[p].newOwner != nullptr)
{
ps[p].newOwner = nullptr;
ps[p].GetActor()->restoreloc();
updatesector(ps[p].GetActor()->getPosWithOffsetZ(), &ps[p].cursector);
DukeStatIterator it(STAT_EFFECTOR);
while (auto act = it.Next())
{
if ((act->flags2 & SFLAG2_CAMERA)) act->spr.yint = 0;
}
}
auto Owner = targ->GetHitOwner();
if (!Owner || !Owner->isPlayer())
if (ud.player_skill >= 3)
proj->spr.extra += (proj->spr.extra >> 1);
}
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void checksectors_r(int snum)
{
player_struct* p;

View file

@ -575,16 +575,11 @@ DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, detonate, DukeActor_detonate)
return 0;
}
void DukeActor_checkhitdefault(DDukeActor* origin, DDukeActor* proj)
{
fi.checkhitdefault(origin, proj);
}
DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, checkhitdefault, DukeActor_checkhitdefault)
DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, checkhitdefault, checkhitdefault)
{
PARAM_SELF_PROLOGUE(DDukeActor);
PARAM_OBJECT(proj, DDukeActor);
DukeActor_checkhitdefault(self, proj);
checkhitdefault(self, proj);
return 0;
}