- added a new sprite flag for those types which can trigger respawn actions.

This commit is contained in:
Christoph Oelckers 2022-11-30 14:29:34 +01:00
parent 4397e65443
commit 5358b3d98c
17 changed files with 67 additions and 78 deletions

View file

@ -51,6 +51,24 @@ BEGIN_DUKE_NS
double adjustfall(DDukeActor* actor, double c);
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void respawnhitag(DDukeActor* actor)
{
if (actorflag(actor, SFLAG2_TRIGGERRESPAWN))
{
if (actor->spr.yint) operaterespawns(actor->spr.yint);
}
else
{
if (actor->spr.hitag >= 0) operaterespawns(actor->spr.hitag);
}
}
//---------------------------------------------------------------------------
//
// this was once a macro

View file

@ -2641,31 +2641,6 @@ bool spawnweapondebris_d(int picnum)
return picnum == BLIMP;
}
void respawnhitag_d(DDukeActor* actor)
{
switch (actor->spr.picnum)
{
case FEM1:
case FEM2:
case FEM3:
case FEM4:
case FEM5:
case FEM6:
case FEM7:
case FEM8:
case FEM9:
case FEM10:
case PODFEM1:
case NAKED1:
case STATUE:
if (actor->spr.yint) operaterespawns(actor->spr.yint);
break;
default:
if (actor->spr.hitag >= 0) operaterespawns(actor->spr.hitag);
break;
}
}
//---------------------------------------------------------------------------
//
//

View file

@ -2663,21 +2663,6 @@ bool spawnweapondebris_r(int picnum)
return true;
}
void respawnhitag_r(DDukeActor *actor)
{
switch (actor->spr.picnum)
{
case FEM10:
case NAKED1:
case STATUE:
if (actor->spr.yint) operaterespawns(actor->spr.yint);
break;
default:
if (actor->spr.hitag >= 0) operaterespawns(actor->spr.hitag);
break;
}
}
//---------------------------------------------------------------------------
//
//

View file

@ -381,6 +381,7 @@ enum sflags2_t
SFLAG2_MIRRORREFLECT = 0x08000000,
SFLAG2_ALTPROJECTILESPRITE = 0x10000000, // yet another shooter flag. :(
SFLAG2_UNDERWATERSLOWDOWN = 0x20000000,
SFLAG2_TRIGGERRESPAWN = 0x40000000,
};

View file

@ -68,8 +68,6 @@ void fall_d(DDukeActor* i, int g_p);
void fall_r(DDukeActor* i, int g_p);
bool spawnweapondebris_d(int picnum);
bool spawnweapondebris_r(int picnum);
void respawnhitag_d(DDukeActor* g_sp);
void respawnhitag_r(DDukeActor* g_sp);
void move_d(DDukeActor* i, int g_p, int g_x);
void move_r(DDukeActor* i, int g_p, int g_x);
void incur_damage_d(player_struct* p);
@ -124,7 +122,6 @@ void SetDispatcher()
ifhitbyweapon_d,
fall_d,
spawnweapondebris_d,
respawnhitag_d,
move_d,
incur_damage_d,
@ -163,7 +160,6 @@ void SetDispatcher()
ifhitbyweapon_r,
fall_r,
spawnweapondebris_r,
respawnhitag_r,
move_r,
incur_damage_r,

View file

@ -94,7 +94,6 @@ struct Dispatcher
int (*ifhitbyweapon)(DDukeActor* sectnum);
void (*fall)(DDukeActor* actor, int g_p);
bool (*spawnweapondebris)(int picnum);
void (*respawnhitag)(DDukeActor* g_sp);
void (*move)(DDukeActor* i, int g_p, int g_x);
// player

View file

@ -197,6 +197,24 @@ void initactorflags_d()
TRIPBOMB
});
setflag(SFLAG2_TRIGGERRESPAWN, {
FEM1,
FEM2,
FEM3,
FEM4,
FEM5,
FEM6,
FEM7,
FEM8,
FEM9,
FEM10,
PODFEM1,
NAKED1,
STATUE,
TOUGHGAL
});
// The feature guarded by this flag does not exist in Duke, it always acts as if the flag was set.
for (auto& ainf : gs.actorinfo) ainf.flags |= SFLAG_MOVEFTA_CHECKSEE;

View file

@ -183,6 +183,13 @@ void initactorflags_r()
setflag(SFLAG2_FREEZEDAMAGE | SFLAG2_REFLECTIVE, { FREEZEBLAST });
setflag(SFLAG2_FLOATING, { DRONE });
setflag(SFLAG2_TRIGGERRESPAWN, {
FEM10,
PODFEM1,
NAKED1,
STATUE,
TOUGHGAL
});
// Animals were not supposed to have this, but due to a coding bug the logic was unconditional for everything in the game.
for (auto& ainf : gs.actorinfo)

View file

@ -93,7 +93,7 @@ int wakeup(DDukeActor* sn, int pn);
int timedexit(int snum);
void dokneeattack(int snum, const std::initializer_list<int>& respawnlist);
void dokneeattack(int snum);
int endoflevel(int snum);
void playerisdead(int snum, int psectlotag, double fz, double cz);
void footprints(int snum);

View file

@ -2829,7 +2829,7 @@ int ParseState::parse(void)
break;
case concmd_respawnhitag:
insptr++;
fi.respawnhitag(g_ac);
respawnhitag(g_ac);
break;
case concmd_ifspritepal:
insptr++;

View file

@ -372,7 +372,7 @@ DDukeActor* aim(DDukeActor* actor, int abase)
//
//---------------------------------------------------------------------------
void dokneeattack(int snum, const std::initializer_list<int> & respawnlist)
void dokneeattack(int snum)
{
auto p = &ps[snum];
@ -393,7 +393,7 @@ void dokneeattack(int snum, const std::initializer_list<int> & respawnlist)
spawnguts(p->actorsqu, PClass::FindActor("DukeJibs6"), 7);
spawn(p->actorsqu, TILE_BLOODPOOL);
S_PlayActorSound(SQUISHED, p->actorsqu);
if (isIn(p->actorsqu->spr.picnum, respawnlist))
if (actorflag(p->actorsqu, SFLAG2_TRIGGERRESPAWN))
{
if (p->actorsqu->spr.yint)
operaterespawns(p->actorsqu->spr.yint);

View file

@ -3143,7 +3143,7 @@ HORIZONLY:
}
}
dokneeattack(snum, { FEM1, FEM2, FEM3, FEM4, FEM5, FEM6, FEM7, FEM8, FEM9, FEM10, PODFEM1, NAKED1, STATUE });
dokneeattack(snum);
if (fi.doincrements(p)) return;

View file

@ -3865,7 +3865,7 @@ HORIZONLY:
return;
}
}
dokneeattack(snum, { FEM10, NAKED1, STATUE });
dokneeattack(snum);
if (fi.doincrements(p)) return;

View file

@ -1344,24 +1344,8 @@ void checksectors_d(int snum)
neartag(p->GetActor()->getPosWithOffsetZ().plusZ(16), p->GetActor()->sector(), p->GetActor()->PrevAngles.Yaw, near, 80., NT_Lotag | NT_Hitag);
if (near.actor() != nullptr)
{
switch (near.actor()->spr.picnum)
{
case FEM1:
case FEM2:
case FEM3:
case FEM4:
case FEM5:
case FEM6:
case FEM7:
case FEM8:
case FEM9:
case FEM10:
case PODFEM1:
case NAKED1:
case STATUE:
case TOUGHGAL:
if (actorflag(near.actor(), SFLAG2_TRIGGERRESPAWN))
return;
}
}
near.clearObj();

View file

@ -1722,13 +1722,11 @@ void checksectors_r(int snum)
neartag(p->GetActor()->getPosWithOffsetZ().plusZ(16), p->GetActor()->sector(), p->GetActor()->PrevAngles.Yaw, near, 80., NT_Lotag | NT_Hitag);
if (near.actor() != nullptr)
{
if (actorflag(near.actor(), SFLAG2_TRIGGERRESPAWN))
return;
switch (near.actor()->spr.picnum)
{
case FEM10:
case NAKED1:
case STATUE:
case TOUGHGAL:
return;
case COW:
near.actor()->spriteextra = 1;
return;

View file

@ -43,6 +43,12 @@ BEGIN_DUKE_NS
DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>* actors)
{
if (actorflag(act, SFLAG2_TRIGGERRESPAWN))
{
act->spr.yint = act->spr.hitag;
act->spr.hitag = -1;
}
if (act->GetClass() != RUNTIME_CLASS(DDukeActor))
{
CallInitialize(act);
@ -50,6 +56,7 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
}
auto sectp = act->sector();
if (isWorldTour())
{
switch (act->spr.picnum)
@ -331,10 +338,7 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
case FEM10:
case PODFEM1:
case NAKED1:
case STATUE:
case TOUGHGAL:
act->spr.yint = act->spr.hitag;
act->spr.hitag = -1;
if (act->spr.picnum == PODFEM1) act->spr.extra <<= 1;
[[fallthrough]];

View file

@ -37,6 +37,12 @@ BEGIN_DUKE_NS
DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>* actors)
{
if (actorflag(act, SFLAG2_TRIGGERRESPAWN))
{
act->spr.yint = act->spr.hitag;
act->spr.hitag = -1;
}
if (act->GetClass() != RUNTIME_CLASS(DDukeActor))
{
CallInitialize(act);
@ -233,8 +239,6 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
case NAKED1:
case STATUE:
case TOUGHGAL:
act->spr.yint = act->spr.hitag;
act->spr.hitag = -1;
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
act->clipdist = 8;
ChangeActorStat(act, STAT_ZOMBIEACTOR);