- DoActorDie

This commit is contained in:
Christoph Oelckers 2021-10-29 22:00:27 +02:00
parent 5d07c768b2
commit ee8f6460c1
6 changed files with 50 additions and 68 deletions

View file

@ -55,7 +55,6 @@ extern STATE s_NinjaDieSlicedHack[];
extern STATEp sg_NinjaGrabThroat[];
int DoActorStopFall(DSWActor* actor);
int DoScaleSprite(DSWActor* actor)
@ -90,12 +89,11 @@ int DoScaleSprite(DSWActor* actor)
return 0;
}
int
DoActorDie(short SpriteNum, short weapon)
int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath)
{
auto actor = &swActors[SpriteNum];
USERp u = User[SpriteNum].Data();
SPRITEp sp = &sprite[SpriteNum];
auto u = actor->u();
auto sp = &actor->s();
auto SpriteNum = actor->GetSpriteIndex();
change_sprite_stat(SpriteNum, STAT_DEAD_ACTOR);
@ -107,10 +105,10 @@ DoActorDie(short SpriteNum, short weapon)
SET(sp->extra, SPRX_BREAKABLE);
SET(sp->cstat, CSTAT_SPRITE_BREAKABLE);
if (weapon < 0)
if (weapActor == nullptr)
{
// killed by one of these non-sprites
switch (weapon)
switch (meansofdeath)
{
case WPN_NM_LAVA:
ChangeState(SpriteNum, u->StateEnd);
@ -126,9 +124,12 @@ DoActorDie(short SpriteNum, short weapon)
return 0;
}
if (!weapActor->hasU()) return 0;
auto wu = weapActor->u();
auto wp = &weapActor->s();
// killed by one of these sprites
switch (User[weapon]->ID)
switch (wu->ID)
{
// Coolie actually explodes himself
// he is the Sprite AND Weapon
@ -137,15 +138,13 @@ DoActorDie(short SpriteNum, short weapon)
u->RotNum = 0;
sp->xvel <<= 1;
u->ActorActionFunc = nullptr;
sprite[SpriteNum].ang = NORM_ANGLE(sprite[SpriteNum].ang + 1024);
sp->ang = NORM_ANGLE(sp->ang + 1024);
break;
case NINJA_RUN_R0:
if (u->ID == NINJA_RUN_R0) // Cut in half!
{
SPRITEp wp = &sprite[weapon];
if (User[weapon]->WeaponNum != WPN_FIST)
if (wu->WeaponNum != WPN_FIST)
{
if (sw_ninjahack)
SpawnBlood(SpriteNum, SpriteNum, -1, -1, -1, -1);
@ -161,7 +160,6 @@ DoActorDie(short SpriteNum, short weapon)
{
if (RandomRange(1000) > 500)
{
SPRITEp wp = &sprite[weapon];
InitPlasmaFountain(wp, sp);
}
@ -171,7 +169,7 @@ DoActorDie(short SpriteNum, short weapon)
sp->xvel = 200 + RandomRange(200);
u->jump_speed = -200 - RandomRange(250);
DoActorBeginJump(actor);
sprite[SpriteNum].ang = sprite[weapon].ang;
sp->ang = wp->ang;
}
}
else
@ -190,7 +188,7 @@ DoActorDie(short SpriteNum, short weapon)
u->ActorActionFunc = nullptr;
//u->ActorActionFunc = NullAnimator;
if (!sw_ninjahack)
sprite[SpriteNum].ang = sprite[weapon].ang;
sp->ang = wp->ang;
break;
case COOLG_RUN_R0:
@ -251,7 +249,6 @@ DoActorDie(short SpriteNum, short weapon)
break;
default:
ASSERT(weapon >= 0);
switch (u->ID)
{
case SKULL_R0:
@ -262,7 +259,6 @@ DoActorDie(short SpriteNum, short weapon)
default:
if (RandomRange(1000) > 700)
{
SPRITEp wp = &sprite[weapon];
InitPlasmaFountain(wp, sp);
}
@ -274,7 +270,7 @@ DoActorDie(short SpriteNum, short weapon)
sp->xvel = 300 + RandomRange(400);
u->jump_speed = -300 - RandomRange(350);
DoActorBeginJump(actor);
sprite[SpriteNum].ang = sprite[weapon].ang;
sp->ang = wp->ang;
break;
}
break;
@ -351,7 +347,7 @@ DoActorSectorDamage(DSWActor* actor)
if (u->Health <= 0)
{
UpdateSinglePlayKills(SpriteNum);
DoActorDie(SpriteNum, WPN_NM_LAVA);
DoActorDie(actor, nullptr, WPN_NM_LAVA);
return true;
}
}
@ -366,7 +362,7 @@ DoActorSectorDamage(DSWActor* actor)
if (u->Health <= 0)
{
UpdateSinglePlayKills(SpriteNum);
DoActorDie(SpriteNum, WPN_NM_LAVA);
DoActorDie(actor, nullptr, WPN_NM_LAVA);
return true;
}
}
@ -386,7 +382,7 @@ DoActorSectorDamage(DSWActor* actor)
else
{
ASSERT(true == false);
//DoActorDie(SpriteNum, WPN_NM_SECTOR_SQUISH);
//DoActorDie(actor, nullptr, WPN_NM_SECTOR_SQUISH);
}
return true;

View file

@ -976,8 +976,9 @@ DoBunnyQuickJump(DSWActor* actor)
if (u->lo_sp)
{
short hit_sprite = short(u->lo_sp - sprite);
auto hitActor = &swActors[hit_sprite];
SPRITEp tsp = u->lo_sp;
USERp tu = User[hit_sprite].Data();
USERp tu = hitActor->u();
if (!tu || tu->ID != BUNNY_RUN_R0) return false;
@ -1004,7 +1005,7 @@ DoBunnyQuickJump(DSWActor* actor)
SetSuicide(hit_sprite);
}
else
DoActorDie(hit_sprite, SpriteNum);
DoActorDie(hitActor, actor, 0);
Bunny_Count--; // Bunny died
@ -1171,8 +1172,9 @@ int DoBunnyStandKill(DSWActor* actor)
void BunnyHatch(short Weapon)
{
SPRITEp wp = &sprite[Weapon];
USERp wu = User[Weapon].Data();
auto actor = &swActors[Weapon];
SPRITEp sp = &actor->s();
USERp u = actor->u();
short New,i;
SPRITEp np;
@ -1184,15 +1186,15 @@ void BunnyHatch(short Weapon)
for (i = 0; i < MAX_BUNNYS; i++)
{
New = COVERinsertsprite(wp->sectnum, STAT_DEFAULT);
New = COVERinsertsprite(sp->sectnum, STAT_DEFAULT);
auto actorNew = &swActors[New];
np = &sprite[New];
memset(np,0,sizeof(SPRITE));
np->sectnum = wp->sectnum;
np->sectnum = sp->sectnum;
np->statnum = STAT_DEFAULT;
np->x = wp->x;
np->y = wp->y;
np->z = wp->z;
np->x = sp->x;
np->y = sp->y;
np->z = sp->z;
np->owner = -1;
np->xrepeat = 30; // Baby size
np->yrepeat = 24;
@ -1200,7 +1202,7 @@ void BunnyHatch(short Weapon)
np->pal = 0;
SetupBunny(New);
nu = User[New].Data();
np->shade = wp->shade;
np->shade = sp->shade;
// make immediately active
SET(nu->Flags, SPR_ACTIVE);
@ -1212,7 +1214,7 @@ void BunnyHatch(short Weapon)
// Oops, mommy died giving birth to a boy
if (RandomRange(1000) > 500)
{
wu->Health = 0;
u->Health = 0;
Bunny_Count--; // Bunny died
// Blood fountains
@ -1223,7 +1225,7 @@ void BunnyHatch(short Weapon)
SetSuicide(Weapon);
}
else
DoActorDie(Weapon, New);
DoActorDie(actor, actorNew, 0);
}
}

View file

@ -636,7 +636,7 @@ int DoCoolieMove(DSWActor* actor)
{
//DoActorDie(SpriteNum, -3);
UpdateSinglePlayKills(SpriteNum);
DoActorDie(SpriteNum, SpriteNum);
DoActorDie(actor, actor, 0);
return 0;
}

View file

@ -88,6 +88,7 @@ void KeepActorOnFloor(short SpriteNum);
int DoActorSlide(DSWActor* actor);
int DoActorSectorDamage(DSWActor* actor);
int DoScaleSprite(DSWActor* actor);
int DoActorStopFall(DSWActor* actor);
void InitPlayerSprite(PLAYERp pp);
void InitAllPlayerSprites(void);

View file

@ -45,7 +45,7 @@ int DoWalk(short SpriteNum);
int DoBody(short SpriteNum);
bool CanMoveHere(int16_t spritenum);
bool SpriteOverlap(int16_t spritenum_a, int16_t spritenum_b);
int DoActorDie(short SpriteNum, short weapon);
int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath);
void SpriteControl(void);
void SetEnemyInactive(short SpriteNum);
void DoActorZrange(short SpriteNum);

View file

@ -4993,34 +4993,17 @@ int
ActorChooseDeath(short SpriteNum, short Weapon)
{
auto actor = &swActors[SpriteNum];
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum].Data();
SPRITEp wp = &sprite[Weapon];
USERp wu = User[Weapon].Data();
SPRITEp sp = &actor->s();
USERp u = actor->u();
auto weapActor = &swActors[Weapon];
SPRITEp wp = &weapActor->s();
USERp wu = weapActor->u();
ASSERT(u);
if (u->Health > 0)
if (u == nullptr || u->Health > 0)
return false;
UpdateSinglePlayKills(SpriteNum);
ASSERT(Weapon >= 0);
#if 0
if (Weapon < 0)
{
switch (Weapon)
{
default:
DoActorDie(SpriteNum, Weapon);
UpdateSinglePlayKills(SpriteNum);
break;
}
return false;
}
#endif
if (u->Attrib)
PlaySpriteSound(SpriteNum,attr_die,v3df_follow);
@ -5149,15 +5132,15 @@ ActorChooseDeath(short SpriteNum, short Weapon)
}
if (u->WeaponNum == WPN_FIST)
DoActorDie(SpriteNum, Weapon);
DoActorDie(actor, weapActor, 0);
else if (u->ID == NINJA_RUN_R0 || RandomRange(1000) < 500)
DoActorDie(SpriteNum, Weapon);
DoActorDie(actor, weapActor, 0);
else
{
// Can't gib bosses!
if (u->ID == SERP_RUN_R0 || u->ID == SUMO_RUN_R0 || u->ID == ZILLA_RUN_R0)
{
DoActorDie(SpriteNum, Weapon);
DoActorDie(actor, weapActor, 0);
break;
}
@ -5170,7 +5153,7 @@ ActorChooseDeath(short SpriteNum, short Weapon)
SetSuicide(SpriteNum);
}
else
DoActorDie(SpriteNum, Weapon);
DoActorDie(actor, weapActor, 0);
}
break;
@ -5179,7 +5162,7 @@ ActorChooseDeath(short SpriteNum, short Weapon)
if (SpawnShrap(SpriteNum, Weapon))
SetSuicide(SpriteNum);
else
DoActorDie(SpriteNum, Weapon);
DoActorDie(actor, weapActor, 0);
break;
#endif
case BOLT_THINMAN_R0:
@ -5201,7 +5184,7 @@ ActorChooseDeath(short SpriteNum, short Weapon)
{
SpawnShrapX(wu); // Do rail gun shrap
}
DoActorDie(SpriteNum, Weapon);
DoActorDie(actor, weapActor, 0);
}
else
@ -5245,7 +5228,7 @@ ActorChooseDeath(short SpriteNum, short Weapon)
// Bosses do not gib
if (u->ID == SERP_RUN_R0 || u->ID == SUMO_RUN_R0 || u->ID == ZILLA_RUN_R0)
{
DoActorDie(SpriteNum, Weapon);
DoActorDie(actor, weapActor, 0);
return true;
}
@ -5254,13 +5237,13 @@ ActorChooseDeath(short SpriteNum, short Weapon)
SetSuicide(SpriteNum);
}
else
DoActorDie(SpriteNum, Weapon);
DoActorDie(actor, weapActor, 0);
}
break;
default:
DoActorDie(SpriteNum, Weapon);
DoActorDie(actor, weapActor, 0);
break;
}