mirror of
https://github.com/ZDoom/Raze.git
synced 2025-02-20 18:42:26 +00:00
- DoActorDie
This commit is contained in:
parent
5d07c768b2
commit
ee8f6460c1
6 changed files with 50 additions and 68 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -636,7 +636,7 @@ int DoCoolieMove(DSWActor* actor)
|
|||
{
|
||||
//DoActorDie(SpriteNum, -3);
|
||||
UpdateSinglePlayKills(SpriteNum);
|
||||
DoActorDie(SpriteNum, SpriteNum);
|
||||
DoActorDie(actor, actor, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue