diff --git a/source/games/sw/src/ai.cpp b/source/games/sw/src/ai.cpp index a9dbbea3a..c2d9d88cd 100644 --- a/source/games/sw/src/ai.cpp +++ b/source/games/sw/src/ai.cpp @@ -681,7 +681,7 @@ DoActorActionDecide(short SpriteNum) } // if player is facing me and I'm being attacked - if (FACING(sp, u->tgt_sp()) && TEST(u->Flags, SPR_ATTACKED) && ICanSee) + if (Facing(actor, u->targetActor) && TEST(u->Flags, SPR_ATTACKED) && ICanSee) { // if I'm a target - at least one missile comming at me if (TEST(u->Flags, SPR_TARGETED)) @@ -745,7 +745,7 @@ DoActorActionDecide(short SpriteNum) dist = Distance(sp->x, sp->y, u->targetActor->s().x, u->targetActor->s().y); if (dist < 15000 || ICanSee) { - if ((FACING(sp, u->tgt_sp()) && dist < 10000) || ICanSee) + if ((Facing(actor, u->targetActor) && dist < 10000) || ICanSee) { DoActorOperate(actor); @@ -821,14 +821,14 @@ int DoActorDecide(DSWActor* actor) return 0; // zombie is attacking a player - if (actor_action == InitActorAttack && u->ID == ZOMBIE_RUN_R0 && User[u->tgt_sp()-sprite]->PlayerP) + if (actor_action == InitActorAttack && u->ID == ZOMBIE_RUN_R0 && u->targetActor->u()->PlayerP) { // Don't let zombies shoot at master - if (sp->owner == (u->tgt_sp() - sprite)) + if (sp->owner == u->targetActor->GetSpriteIndex()) return 0; // if this player cannot take damage from this zombie(weapon) return out - if (!PlayerTakeDamage(User[u->tgt_sp()-sprite]->PlayerP, SpriteNum)) + if (!PlayerTakeDamage(u->targetActor->u()->PlayerP, SpriteNum)) return 0; } @@ -1314,25 +1314,24 @@ int InitActorAttack(DSWActor* actor) SPRITEp sp = User[SpriteNum]->SpriteP; // zombie is attacking a player - if (u->ID == ZOMBIE_RUN_R0 && User[u->tgt_sp()-sprite]->PlayerP) + if (u->ID == ZOMBIE_RUN_R0 && u->targetActor->hasU() && u->targetActor->u()->PlayerP) { // Don't let zombies shoot at master - if (sp->owner == (u->tgt_sp() - sprite)) + if (sp->owner == u->targetActor->GetSpriteIndex()) return 0; // if this player cannot take damage from this zombie(weapon) return out - if (!PlayerTakeDamage(User[u->tgt_sp()-sprite]->PlayerP, SpriteNum)) + if (!PlayerTakeDamage(u->targetActor->u()->PlayerP, SpriteNum)) return 0; } - if (TEST(sprite[u->tgt_sp()-sprite].cstat, CSTAT_SPRITE_TRANSLUCENT)) + if (TEST(u->targetActor->s().cstat, CSTAT_SPRITE_TRANSLUCENT)) { InitActorRunAway(actor); return 0; } - if (User[u->tgt_sp()-sprite].Data() && - User[u->tgt_sp()-sprite]->Health <= 0) + if (u->targetActor->hasU() && u->targetActor->u()->Health <= 0) { DoActorPickClosePlayer(actor); InitActorReposition(actor); @@ -1347,9 +1346,8 @@ int InitActorAttack(DSWActor* actor) // if the guy you are after is dead, look for another and // reposition - if (User[u->tgt_sp()-sprite].Data() && - User[u->tgt_sp()-sprite]->PlayerP && - TEST(User[u->tgt_sp()-sprite]->PlayerP->Flags, PF_DEAD)) + if (u->targetActor->hasU() && u->targetActor->u()->PlayerP && + TEST(u->targetActor->u()->PlayerP->Flags, PF_DEAD)) { DoActorPickClosePlayer(actor); InitActorReposition(actor); @@ -1365,7 +1363,7 @@ int InitActorAttack(DSWActor* actor) sp->ang = NORM_ANGLE(getangle(u->targetActor->s().x - sp->x, u->targetActor->s().y - sp->y)); // If it's your own kind, lay off! - if (u->ID == User[u->tgt_sp() - sprite]->ID && !User[u->tgt_sp() - sprite]->PlayerP) + if (u->ID == u->targetActor->u()->ID && !u->targetActor->u()->PlayerP) { InitActorRunAway(actor); return 0; diff --git a/source/games/sw/src/bunny.cpp b/source/games/sw/src/bunny.cpp index 613eeafdc..faf09ad10 100644 --- a/source/games/sw/src/bunny.cpp +++ b/source/games/sw/src/bunny.cpp @@ -1042,8 +1042,8 @@ DoBunnyQuickJump(DSWActor* actor) DoActorPickClosePlayer(actor); - if (User[u->tgt_sp()-sprite]->PlayerP) - pp = User[u->tgt_sp()-sprite]->PlayerP; + if (u->targetActor->u()->PlayerP) + pp = u->targetActor->u()->PlayerP; if (tu->spal != PALETTE_PLAYER0) { @@ -1058,7 +1058,7 @@ DoBunnyQuickJump(DSWActor* actor) if (pp == Player+myconnectindex) { choose_snd = STD_RANDOM_RANGE(2<<8)>>8; - if (FAFcansee(sp->x,sp->y,SPRITEp_TOS(sp),sp->sectnum,pp->posx, pp->posy, pp->posz, pp->cursectnum) && FACING(sp, u->tgt_sp())) + if (FAFcansee(sp->x,sp->y,SPRITEp_TOS(sp),sp->sectnum,pp->posx, pp->posy, pp->posz, pp->cursectnum) && Facing(actor, u->targetActor)) PlayerSound(fagsnds[choose_snd], v3df_doppler|v3df_follow|v3df_dontpan,pp); } } @@ -1074,7 +1074,7 @@ DoBunnyQuickJump(DSWActor* actor) if (pp == Player+myconnectindex) { choose_snd = STD_RANDOM_RANGE(3<<8)>>8; - if (FAFcansee(sp->x,sp->y,SPRITEp_TOS(sp),sp->sectnum,pp->posx, pp->posy, pp->posz, pp->cursectnum) && FACING(sp, u->tgt_sp())) + if (FAFcansee(sp->x,sp->y,SPRITEp_TOS(sp),sp->sectnum,pp->posx, pp->posy, pp->posz, pp->cursectnum) && Facing(actor, u->targetActor)) PlayerSound(straightsnds[choose_snd], v3df_doppler|v3df_follow|v3df_dontpan,pp); } } diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index 22fb08ebe..9a23ff5ce 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -295,7 +295,6 @@ inline int SPRITEp_SIZE_BOS(const spritetype* sp) #define KENFACING_PLAYER(pp,sp) (bcos(sp->ang)*(pp->posy-sp->y) >= bsin(sp-ang)*(pp->posx-sp->x)) #define FACING_PLAYER(pp,sp) (abs(getincangle(getangle((pp)->posx - (sp)->x, (pp)->posy - (sp)->y), (sp)->ang)) < 512) #define PLAYER_FACING(pp,sp) (abs(getincangle(getangle((sp)->x - (pp)->posx, (sp)->y - (pp)->posy), (pp)->angle.ang.asbuild())) < 320) -#define FACING(sp1,sp2) (abs(getincangle(getangle((sp1)->x - (sp2)->x, (sp1)->y - (sp2)->y), (sp2)->ang)) < 512) #define FACING_PLAYER_RANGE(pp,sp,range) (abs(getincangle(getangle((pp)->posx - (sp)->x, (pp)->posy - (sp)->y), (sp)->ang)) < (range)) #define PLAYER_FACING_RANGE(pp,sp,range) (abs(getincangle(getangle((sp)->x - (pp)->posx, (sp)->y - (pp)->posy), (pp)->angle.ang.asbuild())) < (range)) @@ -2262,6 +2261,12 @@ inline int ActorMid(DSWActor* actor) return SPRITEp_MID(&actor->s()); } +inline int Facing(DSWActor* actor1, DSWActor* actor2) +{ + auto sp1 = &actor1->s(); + auto sp2 = &actor2->s(); + return (abs(getincangle(getangle((sp1)->x - (sp2)->x, (sp1)->y - (sp2)->y), (sp2)->ang)) < 512); +} END_SW_NS #endif diff --git a/source/games/sw/src/hornet.cpp b/source/games/sw/src/hornet.cpp index 3d9dcf3b3..9569deb0f 100644 --- a/source/games/sw/src/hornet.cpp +++ b/source/games/sw/src/hornet.cpp @@ -572,9 +572,9 @@ int DoCheckSwarm(DSWActor* actor) // Who's the closest meat!? DoActorPickClosePlayer(actor); - if (User[u->tgt_sp() - sprite]->PlayerP) + if (u->targetActor->u()->PlayerP) { - pp = User[u->tgt_sp() - sprite]->PlayerP; + pp = u->targetActor->u()->PlayerP; DISTANCE(sp->x, sp->y, pp->posx, pp->posy, pdist, a, b, c); } else