Convert to SoldierID

TacticalStatusType::ubEnemySightingOnTheirTurnEnemyID
TacticalStatusType::ubEnemySightingOnTheirTurnPlayerID
TacticalTeamType::ubLastMercToRadio
This commit is contained in:
Asdow
2024-11-17 10:23:01 +02:00
parent 61c5a41bea
commit f0be44bb42
4 changed files with 249 additions and 300 deletions
+2 -2
View File
@@ -580,9 +580,9 @@ UINT32 MainGameScreenHandle(void)
{ {
if ( gTacticalStatus.ubCurrentTeam != gbPlayerNum ) if ( gTacticalStatus.ubCurrentTeam != gbPlayerNum )
{ {
MercPtrs[ gTacticalStatus.ubEnemySightingOnTheirTurnEnemyID ]->AdjustNoAPToFinishMove( FALSE ); gTacticalStatus.ubEnemySightingOnTheirTurnEnemyID->AdjustNoAPToFinishMove( FALSE );
} }
MercPtrs[ gTacticalStatus.ubEnemySightingOnTheirTurnEnemyID ]->flags.fPauseAllAnimation = FALSE; gTacticalStatus.ubEnemySightingOnTheirTurnEnemyID->flags.fPauseAllAnimation = FALSE;
gTacticalStatus.fEnemySightingOnTheirTurn = FALSE; gTacticalStatus.fEnemySightingOnTheirTurn = FALSE;
} }
+3 -3
View File
@@ -28,7 +28,7 @@ typedef struct
COLORVAL RadarColor; COLORVAL RadarColor;
INT8 bSide; INT8 bSide;
INT16 bMenInSector; INT16 bMenInSector;
UINT16 ubLastMercToRadio; SoldierID ubLastMercToRadio;
INT8 bTeamActive; INT8 bTeamActive;
INT8 bAwareOfOpposition; INT8 bAwareOfOpposition;
INT8 bHuman; INT8 bHuman;
@@ -89,8 +89,8 @@ struct TacticalStatusType
INT8 bRealtimeSpeed; INT8 bRealtimeSpeed;
UINT8 ubEnemyIntention; UINT8 ubEnemyIntention;
UINT8 ubEnemyIntendedRetreatDirection; UINT8 ubEnemyIntendedRetreatDirection;
UINT16 ubEnemySightingOnTheirTurnEnemyID; SoldierID ubEnemySightingOnTheirTurnEnemyID;
UINT16 ubEnemySightingOnTheirTurnPlayerID; SoldierID ubEnemySightingOnTheirTurnPlayerID;
BOOLEAN fEnemySightingOnTheirTurn; BOOLEAN fEnemySightingOnTheirTurn;
BOOLEAN fAutoBandageMode; BOOLEAN fAutoBandageMode;
UINT8 ubAttackBusyCount; UINT8 ubAttackBusyCount;
+241 -292
View File
@@ -3043,30 +3043,25 @@ void RemoveOneOpponent(SOLDIERTYPE *pSoldier)
void RemoveManAsTarget(SOLDIERTYPE *pSoldier) void RemoveManAsTarget(SOLDIERTYPE *pSoldier)
{ {
SOLDIERTYPE *pOpponent;
UINT8 ubLoop;
SoldierID ubTarget = pSoldier->ubID;
SOLDIERTYPE *pOpponent; // clean up the public opponent lists and locations
UINT16 ubTarget,ubLoop; for (ubLoop = 0; ubLoop < MAXTEAMS; ubLoop++)
{ // never causes any additional looks
UpdatePublic(ubLoop, ubTarget, NOT_HEARD_OR_SEEN, NOWHERE, 0);
ubTarget = pSoldier->ubID;
// clean up the public opponent lists and locations
for (ubLoop = 0; ubLoop < MAXTEAMS; ubLoop++)
{ // never causes any additional looks
UpdatePublic(ubLoop, ubTarget, NOT_HEARD_OR_SEEN, NOWHERE, 0);
}
/*
IAN COMMENTED THIS OUT MAY 1997 - DO WE NEED THIS?
// make sure this guy is no longer a possible target for anyone
for (cnt = 0, pOpponent = Menptr; cnt < MAXMERCS; cnt++,pOpponent++)
{
if (pOpponent->bOppNum == ubTarget)
pOpponent->bOppNum = NOBODY;
} }
/*
IAN COMMENTED THIS OUT MAY 1997 - DO WE NEED THIS?
// make sure this guy is no longer a possible target for anyone
for (cnt = 0, pOpponent = Menptr; cnt < MAXMERCS; cnt++,pOpponent++)
{
if (pOpponent->bOppNum == ubTarget)
pOpponent->bOppNum = NOBODY;
}
*/ */
@@ -3086,74 +3081,65 @@ IAN COMMENTED THIS OUT MAY 1997 - DO WE NEED THIS?
if ( ( !CONSIDERED_NEUTRAL( pOpponent, pSoldier ) || pSoldier->usSoldierFlagMask & SOLDIER_POW ) && pOpponent->RecognizeAsCombatant(pSoldier->ubID) ) if ( ( !CONSIDERED_NEUTRAL( pOpponent, pSoldier ) || pSoldier->usSoldierFlagMask & SOLDIER_POW ) && pOpponent->RecognizeAsCombatant(pSoldier->ubID) )
RemoveOneOpponent(pOpponent); RemoveOneOpponent(pOpponent);
} }
UpdatePersonal(pOpponent,ubTarget,NOT_HEARD_OR_SEEN,NOWHERE,0); UpdatePersonal(pOpponent, ubTarget, NOT_HEARD_OR_SEEN, NOWHERE, 0);
gbSeenOpponents[ubLoop][ubTarget] = FALSE; gbSeenOpponents[ubLoop][ubTarget] = FALSE;
} }
} }
/* /*
for (ubLoop = 0,pOpponent = Menptr; ubLoop < MAXMERCS; ubLoop++,pOpponent++)
{
// if the target is a true opponent and currently seen by this merc
if (!pSoldier->aiData.bNeutral && !pSoldier->aiData.bNeutral &&
(pOpponent->aiData.bOppList[ubTarget] == SEEN_CURRENTLY)
for (ubLoop = 0,pOpponent = Menptr; ubLoop < MAXMERCS; ubLoop++,pOpponent++) )
{ ///*** UNTIL ANDREW GETS THE SIDE PARAMETERS WORKING
// if the target is a true opponent and currently seen by this merc // && (pSoldier->side != pOpponent->side))
if (!pSoldier->aiData.bNeutral && !pSoldier->aiData.bNeutral && {
(pOpponent->aiData.bOppList[ubTarget] == SEEN_CURRENTLY) RemoveOneOpponent(pOpponent);
}
) UpdatePersonal(pOpponent,ubTarget,NOT_HEARD_OR_SEEN,NOWHERE,0);
///*** UNTIL ANDREW GETS THE SIDE PARAMETERS WORKING
// && (pSoldier->side != pOpponent->side))
{
RemoveOneOpponent(pOpponent);
}
UpdatePersonal(pOpponent,ubTarget,NOT_HEARD_OR_SEEN,NOWHERE,0); gbSeenOpponents[ubLoop][ubTarget] = FALSE;
}
gbSeenOpponents[ubLoop][ubTarget] = FALSE; */
}
*/
ResetLastKnownLocs(pSoldier);
if (gTacticalStatus.Team[pSoldier->bTeam].ubLastMercToRadio == ubTarget)
gTacticalStatus.Team[pSoldier->bTeam].ubLastMercToRadio = NOBODY;
ResetLastKnownLocs(pSoldier);
if (gTacticalStatus.Team[pSoldier->bTeam].ubLastMercToRadio == ubTarget)
gTacticalStatus.Team[pSoldier->bTeam].ubLastMercToRadio = NOBODY;
} }
void UpdatePublic(UINT8 ubTeam, SoldierID ubID, INT8 bNewOpplist, INT32 sGridNo, INT8 bLevel)
void UpdatePublic(UINT8 ubTeam, UINT16 ubID, INT8 bNewOpplist, INT32 sGridNo, INT8 bLevel)
{ {
INT32 cnt; INT32 cnt;
INT8 *pbPublOL; UINT8 ubTeamMustLookAgain = FALSE, ubMadeDifference = FALSE;
UINT8 ubTeamMustLookAgain = FALSE, ubMadeDifference = FALSE; SOLDIERTYPE *pSoldier;
SOLDIERTYPE *pSoldier; INT8* pbPublOL = &(gbPublicOpplist[ubTeam][ubID]);
// if new opplist is more up-to-date, or we are just wiping it for some reason
pbPublOL = &(gbPublicOpplist[ubTeam][ubID]); if ((gubKnowledgeValue[*pbPublOL - OLDEST_HEARD_VALUE][bNewOpplist - OLDEST_HEARD_VALUE] > 0) ||
(bNewOpplist == NOT_HEARD_OR_SEEN))
// if new opplist is more up-to-date, or we are just wiping it for some reason
if ((gubKnowledgeValue[*pbPublOL - OLDEST_HEARD_VALUE][bNewOpplist - OLDEST_HEARD_VALUE] > 0) ||
(bNewOpplist == NOT_HEARD_OR_SEEN))
{ {
// if this team is becoming aware of a soldier it wasn't previously aware of // if this team is becoming aware of a soldier it wasn't previously aware of
if ((bNewOpplist != NOT_HEARD_OR_SEEN) && (*pbPublOL == NOT_HEARD_OR_SEEN)) if ((bNewOpplist != NOT_HEARD_OR_SEEN) && (*pbPublOL == NOT_HEARD_OR_SEEN))
ubTeamMustLookAgain = TRUE; ubTeamMustLookAgain = TRUE;
// change the public opplist *BEFORE* anyone looks again or we'll recurse! // change the public opplist *BEFORE* anyone looks again or we'll recurse!
*pbPublOL = bNewOpplist; *pbPublOL = bNewOpplist;
} }
// always update the gridno, no matter what // always update the gridno, no matter what
gsPublicLastKnownOppLoc[ubTeam][ubID] = sGridNo; gsPublicLastKnownOppLoc[ubTeam][ubID] = sGridNo;
gbPublicLastKnownOppLevel[ubTeam][ubID] = bLevel; gbPublicLastKnownOppLevel[ubTeam][ubID] = bLevel;
// if team has been told about a guy the team was completely unaware of // if team has been told about a guy the team was completely unaware of
if (ubTeamMustLookAgain) if (ubTeamMustLookAgain)
{ {
// then everyone on team who's not aware of guynum must look for him // then everyone on team who's not aware of guynum must look for him
cnt = gTacticalStatus.Team[ubTeam].bFirstID; cnt = gTacticalStatus.Team[ubTeam].bFirstID;
@@ -3162,10 +3148,10 @@ void UpdatePublic(UINT8 ubTeam, UINT16 ubID, INT8 bNewOpplist, INT32 sGridNo, IN
{ {
// if this soldier is active, in this sector, and well enough to look // if this soldier is active, in this sector, and well enough to look
if (pSoldier->bActive && pSoldier->bInSector && (pSoldier->stats.bLife >= OKLIFE) && !( pSoldier->flags.uiStatusFlags & SOLDIER_GASSED ) ) if (pSoldier->bActive && pSoldier->bInSector && (pSoldier->stats.bLife >= OKLIFE) && !( pSoldier->flags.uiStatusFlags & SOLDIER_GASSED ) )
{
// if soldier isn't aware of guynum, give him another chance to see
if (pSoldier->aiData.bOppList[ubID] == NOT_HEARD_OR_SEEN)
{ {
// if soldier isn't aware of guynum, give him another chance to see
if (pSoldier->aiData.bOppList[ubID] == NOT_HEARD_OR_SEEN)
{
if (ManLooksForMan(pSoldier,MercPtrs[ubID],UPDATEPUBLIC)) if (ManLooksForMan(pSoldier,MercPtrs[ubID],UPDATEPUBLIC))
// then he actually saw guynum because of our new public knowledge // then he actually saw guynum because of our new public knowledge
ubMadeDifference = TRUE; ubMadeDifference = TRUE;
@@ -3176,17 +3162,16 @@ void UpdatePublic(UINT8 ubTeam, UINT16 ubID, INT8 bNewOpplist, INT32 sGridNo, IN
// if "Show only enemies seen" option is ON and it's this guy looking // if "Show only enemies seen" option is ON and it's this guy looking
//if (pSoldier->ubID == ShowOnlySeenPerson) //if (pSoldier->ubID == ShowOnlySeenPerson)
// NewShowOnlySeenPerson(pSoldier); // update the string // NewShowOnlySeenPerson(pSoldier); // update the string
}
} }
} }
} }
}
} }
void UpdatePersonal(SOLDIERTYPE *pSoldier, SoldierID ubID, INT8 bNewOpplist, INT32 sGridNo, INT8 bLevel)
void UpdatePersonal(SOLDIERTYPE *pSoldier, UINT16 ubID, INT8 bNewOpplist, INT32 sGridNo, INT8 bLevel)
{ {
/* /*
#ifdef RECORDOPPLIST #ifdef RECORDOPPLIST
@@ -3207,43 +3192,40 @@ void UpdatePersonal(SOLDIERTYPE *pSoldier, UINT16 ubID, INT8 bNewOpplist, INT32
INT8 OurMaxPublicOpplist() INT8 OurMaxPublicOpplist()
{ {
UINT32 uiLoop; UINT32 uiLoop;
INT8 bHighestOpplist = 0; INT8 bHighestOpplist = 0;
UINT8 ubOppValue,ubHighestValue = 0; UINT8 ubOppValue,ubHighestValue = 0;
SOLDIERTYPE * pSoldier; SOLDIERTYPE * pSoldier;
for (uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++) for (uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++)
{ {
pSoldier = MercSlots[ uiLoop ]; pSoldier = MercSlots[ uiLoop ];
// if this merc is inactive, at base, on assignment, or dead // if this merc is inactive, at base, on assignment, or dead
if (!pSoldier || !pSoldier->stats.bLife) if (!pSoldier || !pSoldier->stats.bLife)
continue; // next merc continue; // next merc
// if this man is NEUTRAL / on our side, he's not an opponent // if this man is NEUTRAL / on our side, he's not an opponent
if (pSoldier->aiData.bNeutral || (gTacticalStatus.Team[gbPlayerNum].bSide == Menptr[pSoldier->ubID].bSide)) if (pSoldier->aiData.bNeutral || (gTacticalStatus.Team[gbPlayerNum].bSide == pSoldier->ubID->bSide))
continue; // next merc continue; // next merc
// opponent, check our public opplist value for him // opponent, check our public opplist value for him
ubOppValue = gubKnowledgeValue[0 - OLDEST_HEARD_VALUE][gbPublicOpplist[gbPlayerNum][pSoldier->ubID] - OLDEST_HEARD_VALUE]; ubOppValue = gubKnowledgeValue[0 - OLDEST_HEARD_VALUE][gbPublicOpplist[gbPlayerNum][pSoldier->ubID] - OLDEST_HEARD_VALUE];
if (ubOppValue > ubHighestValue) if (ubOppValue > ubHighestValue)
{ {
ubHighestValue = ubOppValue; ubHighestValue = ubOppValue;
bHighestOpplist = gbPublicOpplist[gbPlayerNum][pSoldier->ubID]; bHighestOpplist = gbPublicOpplist[gbPlayerNum][pSoldier->ubID];
} }
} }
return(bHighestOpplist); return(bHighestOpplist);
} }
/* /*
BOOLEAN VisibleAnywhere(SOLDIERTYPE *pSoldier) BOOLEAN VisibleAnywhere(SOLDIERTYPE *pSoldier)
{ {
@@ -3668,53 +3650,46 @@ void OurTeamSeesSomeone( SOLDIERTYPE * pSoldier, INT8 bNumReRevealed, INT8 bNumN
void RadioSightings(SOLDIERTYPE *pSoldier, UINT16 ubAbout, UINT8 ubTeamToRadioTo ) void RadioSightings(SOLDIERTYPE *pSoldier, UINT16 ubAbout, UINT8 ubTeamToRadioTo )
{ {
SOLDIERTYPE *pOpponent; SOLDIERTYPE *pOpponent;
INT32 iLoop; INT32 iLoop;
UINT16 start,end,revealedEnemies = 0,unknownEnemies = 0,stillUnseen=TRUE; UINT16 start, end, revealedEnemies = 0, unknownEnemies = 0, stillUnseen = TRUE;
UINT16 scrollToGuynum = NOBODY,sightedHatedOpponent = FALSE; BOOLEAN sightedHatedOpponent = FALSE;
//UINT8 oppIsCivilian; //UINT8 oppIsCivilian;
INT8 *pPersOL,*pbPublOL; //,dayQuote; INT8 *pPersOL,*pbPublOL; //,dayQuote;
BOOLEAN fContactSeen; BOOLEAN fContactSeen;
BOOLEAN fSawCreatureForFirstTime = FALSE; BOOLEAN fSawCreatureForFirstTime = FALSE;
#ifdef TESTOPPLIST #ifdef TESTOPPLIST
DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
String("RADIO SIGHTINGS: for %d about %d",pSoldier->ubID,ubAbout) ); String("RADIO SIGHTINGS: for %d about %d",pSoldier->ubID,ubAbout) );
#endif #endif
#ifdef RECORDNET #ifdef RECORDNET
if (!ptr->human) if (!ptr->human)
fprintf(NetDebugFile,"\tNPC %d(%s) radios his sightings to his team\n",ptr->guynum,ExtMen[ptr->guynum].name); fprintf(NetDebugFile,"\tNPC %d(%s) radios his sightings to his team\n",ptr->guynum,ExtMen[ptr->guynum].name);
#endif #endif
gTacticalStatus.Team[pSoldier->bTeam].ubLastMercToRadio = pSoldier->ubID; gTacticalStatus.Team[pSoldier->bTeam].ubLastMercToRadio = pSoldier->ubID;
// who are we radioing about?
if (ubAbout == EVERYBODY)
// who are we radioing about?
if (ubAbout == EVERYBODY)
{ {
start = 0; start = 0;
end = MAXMERCS; end = MAXMERCS;
} }
else else
{ {
start = ubAbout; start = ubAbout;
end = ubAbout + 1; end = ubAbout + 1;
} }
// hang a pointer to the start of our this guy's personal opplist // hang a pointer to the start of our this guy's personal opplist
pPersOL = &(pSoldier->aiData.bOppList[start]); pPersOL = &(pSoldier->aiData.bOppList[start]);
// hang a pointer to the start of this guy's opponents in the public opplist // hang a pointer to the start of this guy's opponents in the public opplist
pbPublOL = &(gbPublicOpplist[ubTeamToRadioTo][start]); pbPublOL = &(gbPublicOpplist[ubTeamToRadioTo][start]);
pOpponent = MercPtrs[start]; pOpponent = MercPtrs[start];
@@ -3724,82 +3699,72 @@ DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
fContactSeen = FALSE; fContactSeen = FALSE;
#ifdef TESTOPPLIST #ifdef TESTOPPLIST
DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
String("RS: checking %d",pOpponent->ubID) ); String("RS: checking %d",pOpponent->ubID) );
#endif #endif
// make sure this merc is active, here & still alive (unconscious OK) // make sure this merc is active, here & still alive (unconscious OK)
if (!pOpponent->bActive || !pOpponent->bInSector || !pOpponent->stats.bLife) if (!pOpponent->bActive || !pOpponent->bInSector || !pOpponent->stats.bLife)
{ {
#ifdef TESTOPPLIST
DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
String("RS: inactive/notInSector/life %d",pOpponent->ubID) );
#endif
continue; // skip to the next merc
}
// if these two mercs are on the same SIDE, then they're NOT opponents
// NEW: Apr. 21 '96: must allow ALL non-humans to get radioed about
if ((pSoldier->bSide == pOpponent->bSide) && (pOpponent->flags.uiStatusFlags & SOLDIER_PC))
{
#ifdef TESTOPPLIST #ifdef TESTOPPLIST
DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
String("RS: same side %d",pSoldier->bSide) ); String("RS: inactive/notInSector/life %d",pOpponent->ubID) );
#endif
continue; // skip to the next merc
}
// determine whether we think we're still unseen or if "our cover's blown"
// if we know about this opponent's location for any reason
if ((pOpponent->bVisible >= 0) || gbShowEnemies)
{
// and he can see us, then gotta figure we KNOW that he can see us
if (pOpponent->aiData.bOppList[pSoldier->ubID] == SEEN_CURRENTLY)
stillUnseen = FALSE;
}
// if we personally don't know a thing about this opponent
if (*pPersOL == NOT_HEARD_OR_SEEN)
{
#ifdef RECORDOPPLIST
//fprintf(OpplistFile,"not heard or seen\n");
#endif #endif
continue; // skip to the next merc
}
// if these two mercs are on the same SIDE, then they're NOT opponents
// NEW: Apr. 21 '96: must allow ALL non-humans to get radioed about
if ((pSoldier->bSide == pOpponent->bSide) && (pOpponent->flags.uiStatusFlags & SOLDIER_PC))
{
#ifdef TESTOPPLIST #ifdef TESTOPPLIST
DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
String("RS: not heard or seen") ); String("RS: same side %d",pSoldier->bSide) );
#endif #endif
continue; // skip to the next merc
}
continue; // skip to the next opponent // determine whether we think we're still unseen or if "our cover's blown"
} // if we know about this opponent's location for any reason
if ((pOpponent->bVisible >= 0) || gbShowEnemies)
{
// and he can see us, then gotta figure we KNOW that he can see us
if (pOpponent->aiData.bOppList[pSoldier->ubID] == SEEN_CURRENTLY)
stillUnseen = FALSE;
}
// if personal knowledge is NOT more up to date and NOT the same as public
if ((!gubKnowledgeValue[*pbPublOL - OLDEST_HEARD_VALUE][*pPersOL - OLDEST_HEARD_VALUE]) && // if we personally don't know a thing about this opponent
(*pbPublOL != *pPersOL)) if (*pPersOL == NOT_HEARD_OR_SEEN)
{ {
#ifdef RECORDOPPLIST #ifdef RECORDOPPLIST
//fprintf(OpplistFile,"no new knowledge (per %d, pub %d)\n",*pPersOL,*pbPublOL); //fprintf(OpplistFile,"not heard or seen\n");
#endif #endif
#ifdef TESTOPPLIST #ifdef TESTOPPLIST
DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
String("RS: no new knowledge per %d pub %d",*pPersOL,*pbPublOL) ); String("RS: not heard or seen") );
#endif #endif
continue; // skip to the next opponent
}
// if personal knowledge is NOT more up to date and NOT the same as public
if ((!gubKnowledgeValue[*pbPublOL - OLDEST_HEARD_VALUE][*pPersOL - OLDEST_HEARD_VALUE]) &&
continue; // skip to the next opponent (*pbPublOL != *pPersOL))
} {
#ifdef RECORDOPPLIST
//fprintf(OpplistFile,"no new knowledge (per %d, pub %d)\n",*pPersOL,*pbPublOL);
#endif
#ifdef TESTOPPLIST
DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
String("RS: no new knowledge per %d pub %d",*pPersOL,*pbPublOL) );
#endif
continue; // skip to the next opponent
}
#ifdef RECORDOPPLIST #ifdef RECORDOPPLIST
//fprintf(OpplistFile,"made it!\n"); //fprintf(OpplistFile,"made it!\n");
#endif #endif
#ifdef TESTOPPLIST #ifdef TESTOPPLIST
DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
String("RS: made it!") ); String("RS: made it!") );
@@ -3807,160 +3772,145 @@ DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
// if it's our merc, and he currently sees this opponent // if it's our merc, and he currently sees this opponent
if (PTR_OURTEAM && (*pPersOL == SEEN_CURRENTLY) && !(( pOpponent->bSide == pSoldier->bSide) || pOpponent->aiData.bNeutral)) if (PTR_OURTEAM && (*pPersOL == SEEN_CURRENTLY) && !(( pOpponent->bSide == pSoldier->bSide) || pOpponent->aiData.bNeutral))
{
// used by QueueDayMessage() to scroll to one of the new enemies
// scroll to the last guy seen, unless we see a hated guy, then use him!
if (!sightedHatedOpponent)
scrollToGuynum = pOpponent->ubID;
// don't care whether and how many new enemies are seen if everyone visible
// and he's healthy enough to be a threat (so is worth talking about)
// do the following if we're radioing to our own team; if radioing to militia
// then alert them instead
if ( ubTeamToRadioTo != MILITIA_TEAM )
{ {
if (!gbShowEnemies && (pOpponent->stats.bLife >= OKLIFE)) // don't care whether and how many new enemies are seen if everyone visible
{ // and he's healthy enough to be a threat (so is worth talking about)
// if this enemy has not been publicly seen or heard recently
if (*pbPublOL == NOT_HEARD_OR_SEEN)
{
// chalk up another "unknown" enemy
unknownEnemies++;
fContactSeen = TRUE; // do the following if we're radioing to our own team; if radioing to militia
// if this enemy is hated by the merc doing the sighting // then alert them instead
//if (MercHated(Proptr[ptr->characternum].p_bias,oppPtr->characternum)) if ( ubTeamToRadioTo != MILITIA_TEAM )
//sightedHatedOpponent = TRUE;
// now the important part: does this enemy see him/her back?
if (pOpponent->aiData.bOppList[pSoldier->ubID] != SEEN_CURRENTLY)
{
// EXPERIENCE GAIN (10): Discovered a new enemy without being seen
StatChange(pSoldier,EXPERAMT,10,FALSE);
}
}
else
{ {
if (!gbShowEnemies && (pOpponent->stats.bLife >= OKLIFE))
{
// if this enemy has not been publicly seen or heard recently
if (*pbPublOL == NOT_HEARD_OR_SEEN)
{
// chalk up another "unknown" enemy
unknownEnemies++;
// if he has publicly not been seen now, or anytime during this turn fContactSeen = TRUE;
if ((*pbPublOL != SEEN_CURRENTLY) && (*pbPublOL != SEEN_THIS_TURN)) // if this enemy is hated by the merc doing the sighting
//if (MercHated(Proptr[ptr->characternum].p_bias,oppPtr->characternum))
//sightedHatedOpponent = TRUE;
// now the important part: does this enemy see him/her back?
if (pOpponent->aiData.bOppList[pSoldier->ubID] != SEEN_CURRENTLY)
{
// EXPERIENCE GAIN (10): Discovered a new enemy without being seen
StatChange(pSoldier,EXPERAMT,10,FALSE);
}
}
else
{
// if he has publicly not been seen now, or anytime during this turn
if ((*pbPublOL != SEEN_CURRENTLY) && (*pbPublOL != SEEN_THIS_TURN))
{ {
// chalk up another "revealed" enemy // chalk up another "revealed" enemy
++revealedEnemies; ++revealedEnemies;
fContactSeen = TRUE; fContactSeen = TRUE;
} }
else else
{
if ( MercPtrs[0]->stats.bLife < 10 )
{ {
//int breakpoint = 0; if ( MercPtrs[0]->stats.bLife < 10 )
{
//int breakpoint = 0;
}
} }
} }
}
if ( fContactSeen ) if ( fContactSeen )
{
if ( pSoldier->bTeam == gbPlayerNum )
{ {
if ( gTacticalStatus.ubCurrentTeam != gbPlayerNum ) if ( pSoldier->bTeam == gbPlayerNum )
{ {
// Save some stuff! if ( gTacticalStatus.ubCurrentTeam != gbPlayerNum )
if (gTacticalStatus.fEnemySightingOnTheirTurn)
{ {
// this has already come up so turn OFF the pause-all-anims flag for the previous // Save some stuff!
// person and set it for this next person if (gTacticalStatus.fEnemySightingOnTheirTurn)
MercPtrs[gTacticalStatus.ubEnemySightingOnTheirTurnEnemyID]->flags.fPauseAllAnimation = FALSE; {
} // this has already come up so turn OFF the pause-all-anims flag for the previous
else // person and set it for this next person
{ gTacticalStatus.ubEnemySightingOnTheirTurnEnemyID->flags.fPauseAllAnimation = FALSE;
gTacticalStatus.fEnemySightingOnTheirTurn = TRUE; }
} else
gTacticalStatus.ubEnemySightingOnTheirTurnEnemyID = pOpponent->ubID; {
gTacticalStatus.ubEnemySightingOnTheirTurnPlayerID = pSoldier->ubID; gTacticalStatus.fEnemySightingOnTheirTurn = TRUE;
gTacticalStatus.uiTimeSinceDemoOn = GetJA2Clock( ); }
gTacticalStatus.ubEnemySightingOnTheirTurnEnemyID = pOpponent->ubID;
gTacticalStatus.ubEnemySightingOnTheirTurnPlayerID = pSoldier->ubID;
gTacticalStatus.uiTimeSinceDemoOn = GetJA2Clock( );
pOpponent->flags.fPauseAllAnimation = TRUE; pOpponent->flags.fPauseAllAnimation = TRUE;
}
}
if ( pOpponent->flags.uiStatusFlags & SOLDIER_MONSTER )
{
gfPlayerTeamSawCreatures = TRUE;
}
// ATE: Added for bloodcat...
if ( pOpponent->ubBodyType == BLOODCAT )
{
// 2 is for bloodcat
gfPlayerTeamSawCreatures = 2;
} }
} }
if ( pOpponent->flags.uiStatusFlags & SOLDIER_MONSTER ) if ( pOpponent->flags.uiStatusFlags & SOLDIER_MONSTER )
{ {
gfPlayerTeamSawCreatures = TRUE; if ( !(gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags & PROFILE_MISC_FLAG_HAVESEENCREATURE) )
} {
fSawCreatureForFirstTime = TRUE;
// ATE: Added for bloodcat... }
if ( pOpponent->ubBodyType == BLOODCAT )
{
// 2 is for bloodcat
gfPlayerTeamSawCreatures = 2;
}
}
if ( pOpponent->flags.uiStatusFlags & SOLDIER_MONSTER )
{
if ( !(gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags & PROFILE_MISC_FLAG_HAVESEENCREATURE) )
{
fSawCreatureForFirstTime = TRUE;
} }
} }
} }
} else
else
{
// radioing to militia that we saw someone! alert them!
if ( gTacticalStatus.Team[ MILITIA_TEAM ].bTeamActive && !gTacticalStatus.Team[ MILITIA_TEAM ].bAwareOfOpposition )
{ {
HandleInitialRedAlert( MILITIA_TEAM, FALSE ); // radioing to militia that we saw someone! alert them!
if ( gTacticalStatus.Team[ MILITIA_TEAM ].bTeamActive && !gTacticalStatus.Team[ MILITIA_TEAM ].bAwareOfOpposition )
{
HandleInitialRedAlert( MILITIA_TEAM, FALSE );
}
} }
} } // end of our team's merc sees new opponent
} // end of our team's merc sees new opponent
// IF WE'RE HERE, OUR PERSONAL INFORMATION IS AT LEAST AS UP-TO-DATE // IF WE'RE HERE, OUR PERSONAL INFORMATION IS AT LEAST AS UP-TO-DATE
// AS THE PUBLIC KNOWLEDGE, SO WE WILL REPLACE THE PUBLIC KNOWLEDGE // AS THE PUBLIC KNOWLEDGE, SO WE WILL REPLACE THE PUBLIC KNOWLEDGE
#ifdef RECORDOPPLIST #ifdef RECORDOPPLIST
fprintf(OpplistFile,"UpdatePublic (RadioSightings) for team %d about %d\n",ptr->team,oppPtr->guynum); fprintf(OpplistFile,"UpdatePublic (RadioSightings) for team %d about %d\n",ptr->team,oppPtr->guynum);
#endif #endif
#ifdef TESTOPPLIST #ifdef TESTOPPLIST
DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
String("...............UPDATE PUBLIC: soldier %d SEEING soldier %d",pSoldier->ubID,pOpponent->ubID) ); String("...............UPDATE PUBLIC: soldier %d SEEING soldier %d",pSoldier->ubID,pOpponent->ubID) );
#endif #endif
UpdatePublic(ubTeamToRadioTo,pOpponent->ubID,*pPersOL,gsLastKnownOppLoc[pSoldier->ubID][pOpponent->ubID],gbLastKnownOppLevel[pSoldier->ubID][pOpponent->ubID]);
UpdatePublic(ubTeamToRadioTo,pOpponent->ubID,*pPersOL,gsLastKnownOppLoc[pSoldier->ubID][pOpponent->ubID],gbLastKnownOppLevel[pSoldier->ubID][pOpponent->ubID]);
} }
// if soldier heard a misc noise more important that his team's public one // if soldier heard a misc noise more important that his team's public one
if (pSoldier->aiData.ubNoiseVolume > gubPublicNoiseVolume[ubTeamToRadioTo]) if (pSoldier->aiData.ubNoiseVolume > gubPublicNoiseVolume[ubTeamToRadioTo])
{ {
// replace the soldier's team's public noise with his // replace the soldier's team's public noise with his
gsPublicNoiseGridNo[ubTeamToRadioTo] = pSoldier->aiData.sNoiseGridno; gsPublicNoiseGridNo[ubTeamToRadioTo] = pSoldier->aiData.sNoiseGridno;
gbPublicNoiseLevel[ubTeamToRadioTo] = pSoldier->bNoiseLevel; gbPublicNoiseLevel[ubTeamToRadioTo] = pSoldier->bNoiseLevel;
gubPublicNoiseVolume[ubTeamToRadioTo] = pSoldier->aiData.ubNoiseVolume; gubPublicNoiseVolume[ubTeamToRadioTo] = pSoldier->aiData.ubNoiseVolume;
} }
// if this soldier is on the local team // if this soldier is on the local team
if (PTR_OURTEAM) if (PTR_OURTEAM)
{ {
// don't trigger sighting quotes or stop merc's movement if everyone visible // don't trigger sighting quotes or stop merc's movement if everyone visible
//if (!(gTacticalStatus.uiFlags & SHOW_ALL_MERCS)) //if (!(gTacticalStatus.uiFlags & SHOW_ALL_MERCS))
{
// if we've revealed any enemies, or seen any previously unknown enemies
if (revealedEnemies || unknownEnemies)
{ {
// if we've revealed any enemies, or seen any previously unknown enemies
if (revealedEnemies || unknownEnemies)
{
// First check for a virgin map and set to false if we see our first guy.... // First check for a virgin map and set to false if we see our first guy....
// Only if this guy is an ememy! // Only if this guy is an ememy!
OurTeamSeesSomeone( pSoldier, revealedEnemies, unknownEnemies ); OurTeamSeesSomeone( pSoldier, revealedEnemies, unknownEnemies );
} }
else if (fSawCreatureForFirstTime) else if (fSawCreatureForFirstTime)
@@ -3968,8 +3918,7 @@ DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3,
gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags |= PROFILE_MISC_FLAG_HAVESEENCREATURE; gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags |= PROFILE_MISC_FLAG_HAVESEENCREATURE;
TacticalCharacterDialogue( pSoldier, QUOTE_FIRSTTIME_GAME_SEE_CREATURE ); TacticalCharacterDialogue( pSoldier, QUOTE_FIRSTTIME_GAME_SEE_CREATURE );
} }
}
}
} }
} }
+2 -2
View File
@@ -117,7 +117,7 @@ void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT32 sOppGridNo,
void DecideTrueVisibility(SOLDIERTYPE *pSoldier, UINT8 ubLocate); void DecideTrueVisibility(SOLDIERTYPE *pSoldier, UINT8 ubLocate);
void AddOneOpponent(SOLDIERTYPE *pSoldier); void AddOneOpponent(SOLDIERTYPE *pSoldier);
void RemoveOneOpponent(SOLDIERTYPE *pSoldier); void RemoveOneOpponent(SOLDIERTYPE *pSoldier);
void UpdatePersonal(SOLDIERTYPE *pSoldier, UINT16 ubID, INT8 bNewOpplist, INT32 sGridNo, INT8 bLevel); void UpdatePersonal(SOLDIERTYPE *pSoldier, SoldierID ubID, INT8 bNewOpplist, INT32 sGridNo, INT8 bLevel);
INT16 MaxNormalDistanceVisible( void ); INT16 MaxNormalDistanceVisible( void );
INT16 DistanceVisible( SOLDIERTYPE *pSoldier, INT8 bFacingDir, INT8 bSubjectDir, INT32 sSubjectGridNo, INT8 bLevel, const BOOLEAN& isCowering, const UINT8& tunnelVision); INT16 DistanceVisible( SOLDIERTYPE *pSoldier, INT8 bFacingDir, INT8 bSubjectDir, INT32 sSubjectGridNo, INT8 bLevel, const BOOLEAN& isCowering, const UINT8& tunnelVision);
void ResetLastKnownLocs(SOLDIERTYPE *ptr); void ResetLastKnownLocs(SOLDIERTYPE *ptr);
@@ -129,7 +129,7 @@ void InitOpponentKnowledgeSystem(void);
void InitSoldierOppList(SOLDIERTYPE *pSoldier); void InitSoldierOppList(SOLDIERTYPE *pSoldier);
void BetweenTurnsVisibilityAdjustments(void); void BetweenTurnsVisibilityAdjustments(void);
void RemoveManAsTarget(SOLDIERTYPE *pSoldier); void RemoveManAsTarget(SOLDIERTYPE *pSoldier);
void UpdatePublic(UINT8 ubTeam, UINT16 ubID, INT8 bNewOpplist, INT32 sGridNo, INT8 bLevel ); void UpdatePublic(UINT8 ubTeam, SoldierID ubID, INT8 bNewOpplist, INT32 sGridNo, INT8 bLevel );
void RadioSightings(SOLDIERTYPE *pSoldier, UINT16 ubAbout, UINT8 ubTeamToRadioTo ); void RadioSightings(SOLDIERTYPE *pSoldier, UINT16 ubAbout, UINT8 ubTeamToRadioTo );
void OurTeamRadiosRandomlyAbout(UINT16 ubAbout); void OurTeamRadiosRandomlyAbout(UINT16 ubAbout);
void DebugSoldierPage1( ); void DebugSoldierPage1( );