mirror of
https://github.com/ZDoom/Raze.git
synced 2025-02-20 18:42:26 +00:00
- added a new sprite flag for those types which can trigger respawn actions.
This commit is contained in:
parent
4397e65443
commit
5358b3d98c
17 changed files with 67 additions and 78 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
|
|
|
@ -381,6 +381,7 @@ enum sflags2_t
|
|||
SFLAG2_MIRRORREFLECT = 0x08000000,
|
||||
SFLAG2_ALTPROJECTILESPRITE = 0x10000000, // yet another shooter flag. :(
|
||||
SFLAG2_UNDERWATERSLOWDOWN = 0x20000000,
|
||||
SFLAG2_TRIGGERRESPAWN = 0x40000000,
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -3865,7 +3865,7 @@ HORIZONLY:
|
|||
return;
|
||||
}
|
||||
}
|
||||
dokneeattack(snum, { FEM10, NAKED1, STATUE });
|
||||
dokneeattack(snum);
|
||||
|
||||
|
||||
if (fi.doincrements(p)) return;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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]];
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue