- DoDamage API.

# Conflicts:
#	source/games/sw/src/weapon.cpp
This commit is contained in:
Christoph Oelckers 2021-11-05 22:32:53 +01:00
parent f8eac8c8eb
commit 14b3a68e8c
2 changed files with 38 additions and 72 deletions

View file

@ -3841,7 +3841,7 @@ int DoVomit(DSWActor* actor)
{ {
if (TEST(u->coll.actor->s().extra, SPRX_PLAYER_OR_ENEMY)) if (TEST(u->coll.actor->s().extra, SPRX_PLAYER_OR_ENEMY))
{ {
DoDamage(u->coll.actor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(u->coll.actor, actor);
} }
} }
return 0; return 0;
@ -4254,7 +4254,7 @@ bool VehicleMoveHit(DSWActor* actor)
{ {
if (hitActor != GetOwner(ctrlr)) if (hitActor != GetOwner(ctrlr))
{ {
DoDamage(hitActor->GetSpriteIndex(), ctrlr->GetSpriteIndex()); DoDamage(hitActor, ctrlr);
return true; return true;
} }
} }
@ -4262,7 +4262,7 @@ bool VehicleMoveHit(DSWActor* actor)
{ {
if (hsp->statnum == STAT_MINE_STUCK) if (hsp->statnum == STAT_MINE_STUCK)
{ {
DoDamage(hitActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(hitActor, actor);
return true; return true;
} }
} }
@ -4364,7 +4364,7 @@ bool WeaponMoveHit(DSWActor* actor)
{ {
if ((sop = DetectSectorObject(sectp))) if ((sop = DetectSectorObject(sectp)))
{ {
DoDamage(sop->sp_child->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(sop->sp_child, actor);
return true; return true;
} }
} }
@ -4429,7 +4429,7 @@ bool WeaponMoveHit(DSWActor* actor)
break; break;
} }
} }
DoDamage(hitActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(hitActor, actor);
return true; return true;
} }
} }
@ -4437,7 +4437,7 @@ bool WeaponMoveHit(DSWActor* actor)
{ {
if (hsp->statnum == STAT_MINE_STUCK) if (hsp->statnum == STAT_MINE_STUCK)
{ {
DoDamage(hitActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(hitActor, actor);
return true; return true;
} }
} }
@ -4473,7 +4473,7 @@ bool WeaponMoveHit(DSWActor* actor)
if ((sop = DetectSectorObjectByWall(wph))) if ((sop = DetectSectorObjectByWall(wph)))
{ {
if (sop->max_damage != -999) if (sop->max_damage != -999)
DoDamage(sop->sp_child->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(sop->sp_child, actor);
return true; return true;
} }
} }
@ -5690,13 +5690,11 @@ bool OwnerIs(DSWActor* actor, int pic)
} }
int
DoDamage(short SpriteNum, short Weapon) int DoDamage(DSWActor* actor, DSWActor* weapActor)
{ {
auto actor = &swActors[SpriteNum]; SPRITEp sp = &actor->s();
auto weapActor = Weapon >= 0 ? &swActors[Weapon] : nullptr; USERp u = actor->u();
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum].Data();
SPRITEp wp; SPRITEp wp;
USERp wu; USERp wu;
int damage=0; int damage=0;
@ -5755,14 +5753,14 @@ DoDamage(short SpriteNum, short Weapon)
if (PlayerTakeDamage(u->PlayerP, weapActor)) if (PlayerTakeDamage(u->PlayerP, weapActor))
{ {
PlayerUpdateHealth(u->PlayerP, damage); PlayerUpdateHealth(u->PlayerP, damage);
PlayerCheckDeath(u->PlayerP, Weapon); PlayerCheckDeath(u->PlayerP, weapActor->GetSpriteIndex());
} }
} }
else else
{ {
PLAYERp pp = Player + screenpeek; PLAYERp pp = Player + screenpeek;
ActorHealth(SpriteNum, damage); ActorHealth(actor->GetSpriteIndex(), damage);
if (u->Health <= 0) if (u->Health <= 0)
{ {
int choosesnd=0; int choosesnd=0;
@ -5779,44 +5777,12 @@ DoDamage(short SpriteNum, short Weapon)
} }
break; break;
#if 0
case SO_SPEED_BOAT:
damage = -100;
if (u->sop_parent)
{
break;
} }
else if (u->PlayerP)
{
PlayerDamageSlide(u->PlayerP, damage, wp->ang);
if (PlayerTakeDamage(u->PlayerP, weapActor))
{
PlayerUpdateHealth(u->PlayerP, damage);
PlayerCheckDeath(u->PlayerP, Weapon);
} }
}
else
{
ActorHealth(SpriteNum, damage);
ActorPain(SpriteNum);
ActorChooseDeath(SpriteNum, Weapon);
}
SpawnBlood(actor, weapActor, 0, 0, 0, 0);
break;
#endif
}
}
if (Player[0].PlayerSprite == Weapon)
{
//DSPRINTF(ds,"got here 4, %d", User[Player[0].PlayerSprite]->ID);
MONO_PRINT(ds);
}
// weapon is the actor - no missile used - example swords, axes, etc // weapon is the actor - no missile used - example swords, axes, etc
auto SpriteNum = actor->GetSpriteIndex();
auto Weapon = weapActor? weapActor->GetSpriteIndex() : -1;
switch (wu->ID) switch (wu->ID)
{ {
case NINJA_RUN_R0: case NINJA_RUN_R0:
@ -7348,7 +7314,7 @@ int DoDamageTest(DSWActor* actor)
if (GetOwner(actor) != itActor && SpriteOverlap(actor, itActor)) if (GetOwner(actor) != itActor && SpriteOverlap(actor, itActor))
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -7370,7 +7336,7 @@ static void DoHitscanDamage(DSWActor* weaponActor, DSWActor* hitActor)
{ {
if (hitActor->s().statnum == StatDamageList[stat]) if (hitActor->s().statnum == StatDamageList[stat])
{ {
DoDamage(hitActor->GetSpriteIndex(), weaponActor->GetSpriteIndex()); DoDamage(hitActor, weaponActor);
break; break;
} }
} }
@ -7425,12 +7391,12 @@ int DoFlamesDamageTest(DSWActor* actor)
{ {
if (FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,wp->x,wp->y,SPRITEp_MID(wp),wp->sectnum)) if (FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,wp->x,wp->y,SPRITEp_MID(wp),wp->sectnum))
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
else if (SpriteOverlap(actor, itActor)) else if (SpriteOverlap(actor, itActor))
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
@ -7573,7 +7539,7 @@ int DoExpDamageTest(DSWActor* actor)
if (StatDamageList[stat] == STAT_SO_SP_CHILD) if (StatDamageList[stat] == STAT_SO_SP_CHILD)
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
else else
{ {
@ -7590,7 +7556,7 @@ int DoExpDamageTest(DSWActor* actor)
!FAFcansee(wp->x, wp->y, wp->z, wp->sectnum, sp->x, sp->y, SPRITEp_LOWER(sp), sp->sectnum)) !FAFcansee(wp->x, wp->y, wp->z, wp->sectnum, sp->x, sp->y, SPRITEp_LOWER(sp), sp->sectnum))
continue; continue;
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -7710,7 +7676,7 @@ int DoMineExpMine(DSWActor* actor)
zdist = abs(sp->z - wp->z)>>4; zdist = abs(sp->z - wp->z)>>4;
if (SpriteOverlap(actor, itActor) || (unsigned)zdist < wu->Radius + u->Radius) if (SpriteOverlap(actor, itActor) || (unsigned)zdist < wu->Radius + u->Radius)
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
// only explode one mine at a time // only explode one mine at a time
break; break;
} }
@ -12709,7 +12675,7 @@ int InitSwordAttack(PLAYERp pp)
if (SpriteOverlapZ(pp->PlayerSprite, itActor->GetSpriteIndex(), Z(20))) if (SpriteOverlapZ(pp->PlayerSprite, itActor->GetSpriteIndex(), Z(20)))
{ {
if (FAFcansee(sp->x, sp->y, SPRITEp_MID(sp), sp->sectnum, psp->x, psp->y, SPRITEp_MID(psp), psp->sectnum)) if (FAFcansee(sp->x, sp->y, SPRITEp_MID(sp), sp->sectnum, psp->x, psp->y, SPRITEp_MID(psp), psp->sectnum))
DoDamage(itActor->GetSpriteIndex(), pp->Actor()->GetSpriteIndex()); DoDamage(itActor, pp->Actor());
} }
} }
} }
@ -12894,7 +12860,7 @@ int InitFistAttack(PLAYERp pp)
if (SpriteOverlapZ(pp->PlayerSprite, itActor->GetSpriteIndex(), Z(20)) || face == 190) if (SpriteOverlapZ(pp->PlayerSprite, itActor->GetSpriteIndex(), Z(20)) || face == 190)
{ {
if (FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,psp->x,psp->y,SPRITEp_MID(psp),psp->sectnum)) if (FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,psp->x,psp->y,SPRITEp_MID(psp),psp->sectnum))
DoDamage(itActor->GetSpriteIndex(), pp->Actor()->GetSpriteIndex()); DoDamage(itActor, pp->Actor());
if (face == 190) if (face == 190)
{ {
SpawnDemonFist(itActor); SpawnDemonFist(itActor);
@ -13195,7 +13161,7 @@ int InitSumoStompAttack(DSWActor* actor)
if (dist < CLOSE_RANGE_DIST_FUDGE(tsp, sp, reach)) if (dist < CLOSE_RANGE_DIST_FUDGE(tsp, sp, reach))
{ {
if (FAFcansee(tsp->x,tsp->y,SPRITEp_MID(tsp),tsp->sectnum,sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum)) if (FAFcansee(tsp->x,tsp->y,SPRITEp_MID(tsp),tsp->sectnum,sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum))
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -13226,7 +13192,7 @@ int InitMiniSumoClap(DSWActor* actor)
if (FAFcansee(tsp->x, tsp->y, ActorMid(u->targetActor), tsp->sectnum, sp->x, sp->y, SPRITEp_MID(sp), sp->sectnum)) if (FAFcansee(tsp->x, tsp->y, ActorMid(u->targetActor), tsp->sectnum, sp->x, sp->y, SPRITEp_MID(sp), sp->sectnum))
{ {
PlaySound(DIGI_CGTHIGHBONE, actor, v3df_follow | v3df_dontpan); PlaySound(DIGI_CGTHIGHBONE, actor, v3df_follow | v3df_dontpan);
DoDamage(u->targetActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(u->targetActor, actor);
} }
} }
} }
@ -14780,7 +14746,7 @@ int InitRipperSlash(DSWActor* actor)
if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 600) && FACING_RANGE(hp, sp, 150)) if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 600) && FACING_RANGE(hp, sp, 150))
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -14813,7 +14779,7 @@ int InitBunnySlash(DSWActor* actor)
if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 600) && FACING_RANGE(hp, sp, 150)) if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 600) && FACING_RANGE(hp, sp, 150))
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -14847,7 +14813,7 @@ int InitSerpSlash(DSWActor* actor)
if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 800) && FACING_RANGE(hp, sp, 150)) if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 800) && FACING_RANGE(hp, sp, 150))
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -14924,7 +14890,7 @@ int DoBladeDamage(DSWActor* actor)
if (WallSpriteInsideSprite(sp, hp)) if (WallSpriteInsideSprite(sp, hp))
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -14965,11 +14931,11 @@ int DoStaticFlamesDamage(DSWActor* actor)
continue; continue;
if (SpriteOverlap(actor, itActor)) // If sprites are overlapping, cansee will fail! if (SpriteOverlap(actor, itActor)) // If sprites are overlapping, cansee will fail!
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
else if (u->Radius > 200) else if (u->Radius > 200)
{ {
if (FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,hp->x,hp->y,SPRITEp_MID(hp),hp->sectnum)) if (FAFcansee(sp->x,sp->y,SPRITEp_MID(sp),sp->sectnum,hp->x,hp->y,SPRITEp_MID(hp),hp->sectnum))
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -15006,7 +14972,7 @@ int InitCoolgBash(DSWActor* actor)
if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 600) && FACING_RANGE(hp, sp, 150)) if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 600) && FACING_RANGE(hp, sp, 150))
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -15039,7 +15005,7 @@ int InitSkelSlash(DSWActor* actor)
if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 600) && FACING_RANGE(hp, sp, 150)) if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 600) && FACING_RANGE(hp, sp, 150))
{ {
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -15073,7 +15039,7 @@ int InitGoroChop(DSWActor* actor)
if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 700) && FACING_RANGE(hp, sp, 150)) if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 700) && FACING_RANGE(hp, sp, 150))
{ {
PlaySound(DIGI_GRDAXEHIT, actor, v3df_none); PlaySound(DIGI_GRDAXEHIT, actor, v3df_none);
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
} }
} }
@ -15083,7 +15049,7 @@ int InitGoroChop(DSWActor* actor)
int InitHornetSting(DSWActor* actor) int InitHornetSting(DSWActor* actor)
{ {
DoDamage(actor->u()->coll.actor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(actor->u()->coll.actor, actor);
InitActorReposition(actor); InitActorReposition(actor);
return 0; return 0;
} }
@ -15861,7 +15827,7 @@ int InitEelFire(DSWActor* actor)
if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 600) && FACING_RANGE(hp, sp, 150)) if (dist < CLOSE_RANGE_DIST_FUDGE(sp, hp, 600) && FACING_RANGE(hp, sp, 150))
{ {
PlaySound(DIGI_GIBS1, actor, v3df_none); PlaySound(DIGI_GIBS1, actor, v3df_none);
DoDamage(itActor->GetSpriteIndex(), actor->GetSpriteIndex()); DoDamage(itActor, actor);
} }
else else
InitActorReposition(actor); InitActorReposition(actor);

View file

@ -249,7 +249,7 @@ bool MissileHitMatch(DSWActor* weapActor, int WeaponNum, DSWActor* hitActor);
int DoItemFly(DSWActor*); int DoItemFly(DSWActor*);
int SpawnVehicleSmoke(DSWActor* actor); int SpawnVehicleSmoke(DSWActor* actor);
short PrevWall(short wall_num); short PrevWall(short wall_num);
int DoDamage(short SpriteNum,short Weapon); int DoDamage(DSWActor*, DSWActor*);
END_SW_NS END_SW_NS