Merged revision(s) 7166-7177 from branches/ja2_source_official_2014:

- Flagmasks are unsigned, and should be called and treated as such
- Fix: experience gain from interrogation was too high
- Fix: chance of a prisoner becoming militia was calculated wrong
- default weight maximum for MOVE ITEM assignment increased from 30 to 40 kg
- Fix: snitches report the same event multiple times
- Fix: snitches treat vehicles as persons
- Fix: selection of launchables is inefficient, an does not take into account wether items are depending on day/night cycle
- new key combination: in strategic, pressing [CTRL] + [E] wile both a merc's inventory and the sector inventory are open will fill the merc's inventory with sector items
- trivial code cleanup
- if prisoners are taken in a sector that houses a prison, that prison can also be selected to house them
- Fix: distributing newly taken prisoners in a prison sector no longer redistributes all prisoners, only the new ones
- GetClosestFlaggedSoldierID can also be called without evaluation of sight
- Fix: Covert Ops: throwing/lobbing items or shooting rockets is deemed suspicious behaviour
- Fix: boxing was broken by loading a savegame
- Fix: campaign history rarely recorded kills in autoresolve
- There is no reason why the IDs that boxers are reset to before they are reinitialised would ever need to be altered by a modder. Required script change in stable GameDir r2024.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7178 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2014-04-30 21:36:18 +00:00
parent 8b494003fd
commit 30060f0595
46 changed files with 759 additions and 711 deletions
+9 -9
View File
@@ -2083,7 +2083,7 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
numBytesRead = ReadFieldByField(hFile, &this->bExtraAgility, sizeof(bExtraAgility), sizeof(INT16), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->bExtraWisdom, sizeof(bExtraWisdom), sizeof(INT16), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->bExtraExpLevel, sizeof(bExtraExpLevel), sizeof(INT8), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->bSoldierFlagMask, sizeof(bSoldierFlagMask), sizeof(INT32), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->usSoldierFlagMask, sizeof(usSoldierFlagMask), sizeof(UINT32), numBytesRead);
if ( guiCurrentSaveGameVersion >= FOOD_CHANGES )
{
@@ -2227,13 +2227,13 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
if ( guiCurrentSaveGameVersion >= SNITCH_TRAIT_EXTENDED )
{
numBytesRead = ReadFieldByField(hFile, &this->bSoldierFlagMask2, sizeof(bSoldierFlagMask2), sizeof(INT32), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->usSoldierFlagMask2, sizeof(usSoldierFlagMask2), sizeof(UINT32), numBytesRead);
}
else
{
this->bSoldierFlagMask2 = 0;
this->usSoldierFlagMask2 = 0;
for(int i = 0; i < sizeof(bSoldierFlagMask2); ++i)
for(int i = 0; i < sizeof(usSoldierFlagMask2); ++i)
buffer++;
}
@@ -6277,8 +6277,9 @@ BOOLEAN LoadSavedGame( int ubSavedGameID )
//now change the savegame format so that temp files are saved and loaded correctly
guiCurrentSaveGameVersion = SAVE_GAME_VERSION;
// Flugente: should not be needed anymore
// WANNE: This should fix the bug if any merc are still under PC control. This could happen after boxing in SAN MONA.
SOLDIERTYPE *pTeamSoldier;
/*SOLDIERTYPE *pTeamSoldier;
for (INT8 bLoop=gTacticalStatus.Team[gbPlayerNum].bFirstID; bLoop <= gTacticalStatus.Team[gbPlayerNum].bLastID; bLoop++)
{
pTeamSoldier=MercPtrs[bLoop];
@@ -6286,9 +6287,8 @@ BOOLEAN LoadSavedGame( int ubSavedGameID )
if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_PCUNDERAICONTROL)
pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL);
if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_BOXER)
pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_BOXER);
}
pTeamSoldier->DeleteBoxingFlag();
}*/
return( TRUE );
}
@@ -8637,7 +8637,7 @@ BOOLEAN LoadGeneralInfo( HWFILE hFile )
fDisableMapInterfaceDueToBattle = sGeneralInfo.fDisableMapInterfaceDueToBattle;
memcpy( &gsBoxerGridNo, &sGeneralInfo.sBoxerGridNo, NUM_BOXERS * sizeof( INT32 ) );
memcpy( &gubBoxerID, &sGeneralInfo.ubBoxerID, NUM_BOXERS * sizeof( INT8 ) );
memcpy( &gubBoxerID, &sGeneralInfo.ubBoxerID, NUM_BOXERS * sizeof( UINT8 ) );
memcpy( &gfBoxerFought, &sGeneralInfo.fBoxerFought, NUM_BOXERS * sizeof( BOOLEAN ) );
//Load the helicopter status
+16 -16
View File
@@ -6674,9 +6674,9 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
if ( result < gGameExternalOptions.ubPrisonerProcessDefectChance )
{
// troops are converted to militia, but there is a chance that they will be demoted in the process
if ( i < interrogatedprisoners[PRISONER_ELITE] && Chance(80) )
if ( i >= interrogatedprisoners[PRISONER_ADMIN] + interrogatedprisoners[PRISONER_REGULAR] && Chance( 80 ) )
++turnedmilitia_elite;
else if ( i < interrogatedprisoners[PRISONER_ELITE] + interrogatedprisoners[PRISONER_REGULAR] && Chance(80) )
else if ( i >= interrogatedprisoners[PRISONER_ADMIN] && Chance( 80 ) )
++turnedmilitia_regular;
else
++turnedmilitia_admin;
@@ -6768,7 +6768,7 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
if ( !oldinterrogationpoints )
return;
FLOAT totalexp = (FLOAT) (100 * prisonersinterrogated);
FLOAT totalexp = (FLOAT) (1 * prisonersinterrogated);
FLOAT expratio = totalexp / (oldinterrogationpoints * 33); // TODO
// award experience
@@ -6979,8 +6979,8 @@ void HandleEquipmentMove( INT16 sMapX, INT16 sMapY, INT8 bZ )
if ( distance == 0 )
continue;
// each soldier can carry 30 items, and needs 10 minutes (two way walk) per sector distance, thereby 6 / distance runs possible
UINT16 maxitems = 30 * (*it).second * 6 / distance;
// each soldier can carry 40 items or 40 kg, and needs 10 minutes (two way walk) per sector distance, thereby 6 / distance runs possible per hour
UINT16 maxitems = 40 * (*it).second * 6 / distance;
UINT16 maxweight = 400 * (*it).second * 6 / distance;
// open the inventory of the sector we are taking stuff from
@@ -6988,7 +6988,7 @@ void HandleEquipmentMove( INT16 sMapX, INT16 sMapY, INT8 bZ )
UINT32 uiTotalNumberOfRealItems_Target = 0;
// use the new map
pWorldItem_Target.clear();//dnl ch75 021113
pWorldItem_Target.clear();//dnl ch75 021113
if( ( gWorldSectorX == targetX )&&( gWorldSectorY == targetY ) && (gbWorldSectorZ == bZ ) )
{
@@ -11448,9 +11448,9 @@ void SnitchToggleMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
}
else if( iValue == SNITCH_MENU_TOGGLE_ON )
{
if ( pSoldier->bSoldierFlagMask2 & SOLDIER_SNITCHING_OFF )
if ( pSoldier->usSoldierFlagMask2 & SOLDIER_SNITCHING_OFF )
{
pSoldier->bSoldierFlagMask2 &= ~SOLDIER_SNITCHING_OFF;
pSoldier->usSoldierFlagMask2 &= ~SOLDIER_SNITCHING_OFF;
fShowSnitchToggleMenu = FALSE;
fShowSnitchMenu = FALSE;
fShowAssignmentMenu = FALSE;
@@ -11459,9 +11459,9 @@ void SnitchToggleMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
}
else if( iValue == SNITCH_MENU_TOGGLE_OFF )
{
if ( !(pSoldier->bSoldierFlagMask2 & SOLDIER_SNITCHING_OFF) )
if ( !(pSoldier->usSoldierFlagMask2 & SOLDIER_SNITCHING_OFF) )
{
pSoldier->bSoldierFlagMask2 |= SOLDIER_SNITCHING_OFF;
pSoldier->usSoldierFlagMask2 |= SOLDIER_SNITCHING_OFF;
fShowSnitchToggleMenu = FALSE;
fShowSnitchMenu = FALSE;
fShowAssignmentMenu = FALSE;
@@ -11471,9 +11471,9 @@ void SnitchToggleMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
}
else if( iValue == SNITCH_MENU_MISBEHAVIOUR_ON )
{
if ( pSoldier->bSoldierFlagMask2 & SOLDIER_PREVENT_MISBEHAVIOUR_OFF )
if ( pSoldier->usSoldierFlagMask2 & SOLDIER_PREVENT_MISBEHAVIOUR_OFF )
{
pSoldier->bSoldierFlagMask2 &= ~SOLDIER_PREVENT_MISBEHAVIOUR_OFF;
pSoldier->usSoldierFlagMask2 &= ~SOLDIER_PREVENT_MISBEHAVIOUR_OFF;
fShowSnitchToggleMenu = FALSE;
fShowSnitchMenu = FALSE;
fShowAssignmentMenu = FALSE;
@@ -11482,9 +11482,9 @@ void SnitchToggleMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
}
else if( iValue == SNITCH_MENU_MISBEHAVIOUR_OFF)
{
if ( !(pSoldier->bSoldierFlagMask2 & SOLDIER_PREVENT_MISBEHAVIOUR_OFF) )
if ( !(pSoldier->usSoldierFlagMask2 & SOLDIER_PREVENT_MISBEHAVIOUR_OFF) )
{
pSoldier->bSoldierFlagMask2 |= SOLDIER_PREVENT_MISBEHAVIOUR_OFF;
pSoldier->usSoldierFlagMask2 |= SOLDIER_PREVENT_MISBEHAVIOUR_OFF;
fShowSnitchToggleMenu = FALSE;
fShowSnitchMenu = FALSE;
fShowAssignmentMenu = FALSE;
@@ -15176,7 +15176,7 @@ void HandleShadingOfLinesForSnitchToggleMenu( void )
pSoldier = GetSelectedAssignSoldier( FALSE );
if( pSoldier->bSoldierFlagMask2 & SOLDIER_SNITCHING_OFF )
if( pSoldier->usSoldierFlagMask2 & SOLDIER_SNITCHING_OFF )
{
UnShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_TOGGLE_ON );
ShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_TOGGLE_OFF );
@@ -15187,7 +15187,7 @@ void HandleShadingOfLinesForSnitchToggleMenu( void )
UnShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_TOGGLE_OFF );
}
if( pSoldier->bSoldierFlagMask2 & SOLDIER_PREVENT_MISBEHAVIOUR_OFF )
if( pSoldier->usSoldierFlagMask2 & SOLDIER_PREVENT_MISBEHAVIOUR_OFF )
{
UnShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_MISBEHAVIOUR_ON );
ShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_MISBEHAVIOUR_OFF );
+5 -4
View File
@@ -4792,7 +4792,11 @@ void TargetHitCallback( SOLDIERCELL *pTarget, INT32 index )
pTarget->uiFlags &= ~CELL_RETREATING;
}
if( iNewLife <= 0 )
{ //soldier has been killed
{
// Flugente: campaign stats
gCurrentIncident.AddStat( pTarget->pSoldier, CAMPAIGNHISTORY_TYPE_KILL );
//soldier has been killed
if( pTarget->pAttacker[ index ]->uiFlags & CELL_PLAYER )
{ //Player killed the enemy soldier -- update his stats as well as any assisters.
SOLDIERCELL *pKiller;
@@ -4810,9 +4814,6 @@ void TargetHitCallback( SOLDIERCELL *pTarget, INT32 index )
{
if( pKiller->uiFlags & CELL_MERC )
{
// Flugente: campaign stats
gCurrentIncident.AddStat( pTarget->pSoldier, CAMPAIGNHISTORY_TYPE_KILL );
/////////////////////////////////////////////////////////////////////////////////////
// SANDRO - new mercs' records
switch(pTarget->pSoldier->ubSoldierClass)
+2 -2
View File
@@ -422,7 +422,7 @@ void HourlyLarryUpdate()
// note - snitches stop others, but can get wasted themselves (if they have drug use specifically set in background...)
if( pOtherSoldier && !pOtherSoldier->flags.fBetweenSectors && pOtherSoldier->bActive && pOtherSoldier->bInSector && !pOtherSoldier->flags.fMercAsleep && pSoldier->ubProfile != pOtherSoldier->ubProfile )
{
if ( ProfileHasSkillTrait( pOtherSoldier->ubProfile, SNITCH_NT ) && !( pSoldier->bSoldierFlagMask2 & SOLDIER_PREVENT_MISBEHAVIOUR_OFF ) )
if ( ProfileHasSkillTrait( pOtherSoldier->ubProfile, SNITCH_NT ) && !( pSoldier->usSoldierFlagMask2 & SOLDIER_PREVENT_MISBEHAVIOUR_OFF ) )
{
if( pSoldier->sSectorX == pOtherSoldier->sSectorX && pSoldier->sSectorY == pOtherSoldier->sSectorY && pSoldier->bSectorZ == pOtherSoldier->bSectorZ )
{
@@ -551,7 +551,7 @@ void HourlyStealUpdate()
// note - snitches stop others, but can scrounge themselves (if they have scrounging specifically set in background...)
if( pOtherSoldier && !pOtherSoldier->flags.fBetweenSectors && pOtherSoldier->bActive && pOtherSoldier->bInSector && !pOtherSoldier->flags.fMercAsleep && pSoldier->ubProfile != pOtherSoldier->ubProfile )
{
if ( ProfileHasSkillTrait( pOtherSoldier->ubProfile, SNITCH_NT ) && !( pSoldier->bSoldierFlagMask2 & SOLDIER_PREVENT_MISBEHAVIOUR_OFF ) )
if ( ProfileHasSkillTrait( pOtherSoldier->ubProfile, SNITCH_NT ) && !( pSoldier->usSoldierFlagMask2 & SOLDIER_PREVENT_MISBEHAVIOUR_OFF ) )
{
if( pSoldier->sSectorX == pOtherSoldier->sSectorX && pSoldier->sSectorY == pOtherSoldier->sSectorY && pSoldier->bSectorZ == pOtherSoldier->bSectorZ )
{
+21 -11
View File
@@ -838,6 +838,8 @@ static int l_EnvEndRainStorm (lua_State *L);
static int l_ProfilesStrategicInsertionData (lua_State *L);
static int l_ResetBoxers( lua_State *L );
using namespace std;
UINT16 idProfil;
@@ -1123,7 +1125,8 @@ void IniFunction(lua_State *L, BOOLEAN bQuests )
lua_register(L, "GetNPCBalance", l_GetiBalance);
lua_register(L, "GetCharacterSectorZ", l_GetCharacterSectorZ);
lua_register(L, "GetCharacterSectorX", l_GetCharacterSectorX);
lua_register(L, "GetCharacterSectorY", l_GetCharacterSectorY);
lua_register(L, "GetCharacterSectorY", l_GetCharacterSectorY);
lua_register(L, "ResetBoxers", l_ResetBoxers );
//Tactical merc
lua_register(L, "CheckCivGroupHostile", l_fCivGroupHostile);
@@ -10588,19 +10591,26 @@ static int l_GetCharacterSectorX (lua_State *L)
//Set charcter to sector Z
static int l_SetCharacterSectorZ (lua_State *L)
{
UINT8 n = lua_gettop(L);
int i = 0;
UINT8 id = 0;
UINT8 SectorZ = 0;
for (i= 1; i<=n; i++ )
if ( lua_gettop( L ) >= 2 )
{
if (i == 1 ) id = lua_tointeger(L,i);
if (i == 2 ) SectorZ = lua_tointeger(L,i);
UINT8 id = lua_tointeger( L, 1 );
UINT8 SectorZ = lua_tointeger( L, 2 );
gMercProfiles[id].bSectorZ = SectorZ;
}
return 0;
}
// set boxer ids back to NOBODY, so they can be reinitialised
static int l_ResetBoxers( lua_State *L )
{
for ( UINT8 i = 0; i < NUM_BOXERS; ++i )
{
gubBoxerID[i] = NOBODY;
gfBoxerFought[i] = FALSE;
}
gMercProfiles[ id ].bSectorZ = SectorZ;
return 0;
}
+1 -1
View File
@@ -1695,7 +1695,7 @@ UINT8 MoveAllInHelicopterToFootMovementGroup( INT8 bNewSquad )
}
// Flugente: we are leaving the helicopter and instantly deploy into combat - this must be an airdrop
pSoldier->bSoldierFlagMask |= (SOLDIER_AIRDROP_TURN|SOLDIER_AIRDROP);
pSoldier->usSoldierFlagMask |= (SOLDIER_AIRDROP_TURN|SOLDIER_AIRDROP);
}
}
+1 -1
View File
@@ -1899,7 +1899,7 @@ void AddEnemiesToBattle( GROUP *pGroup, UINT8 ubStrategicInsertionCode, UINT8 ub
pSoldier->bActionPoints = 0;
// Flugente: due to a fix, also note here that the reinforcements get no APs.
pSoldier->bSoldierFlagMask |= SOLDIER_NO_AP;
pSoldier->usSoldierFlagMask |= SOLDIER_NO_AP;
// Flugente: campaign stats
if ( IsOurSoldier(pSoldier) )
+16 -33
View File
@@ -93,9 +93,7 @@ void ModifyPlayerReputation(INT8 bRepChange)
BOOLEAN MercThinksDeathRateTooHigh( UINT8 ubProfileID )
{
INT8 bDeathRateTolerance;
bDeathRateTolerance = gMercProfiles[ ubProfileID ].bDeathRate;
INT8 bDeathRateTolerance = gMercProfiles[ubProfileID].bDeathRate;
// if he couldn't care less what it is
if (bDeathRateTolerance == 101)
@@ -109,19 +107,15 @@ BOOLEAN MercThinksDeathRateTooHigh( UINT8 ubProfileID )
// too high - sorry
return(TRUE);
}
else
{
// within tolerance
return(FALSE);
}
// within tolerance
return(FALSE);
}
BOOLEAN MercThinksBadReputationTooHigh( UINT8 ubProfileID )
{
INT8 bRepTolerance;
bRepTolerance = gMercProfiles[ ubProfileID ].bReputationTolerance;
INT8 bRepTolerance = gMercProfiles[ ubProfileID ].bReputationTolerance;
// if he couldn't care less what it is
if (bRepTolerance == 101)
@@ -135,11 +129,9 @@ BOOLEAN MercThinksBadReputationTooHigh( UINT8 ubProfileID )
// too high - sorry
return(TRUE);
}
else
{
// within tolerance
return(FALSE);
}
// within tolerance
return(FALSE);
}
@@ -157,8 +149,7 @@ BOOLEAN MercThinksHisMoraleIsTooLow( SOLDIERTYPE *pSoldier )
// that obviously it CAN'T be too low...
return(FALSE);
}
// morale tolerance is based directly upon reputation tolerance
// above 50, morale is GOOD, never below tolerance then
bMoraleTolerance = (100 - bRepTolerance) / 2;
@@ -168,11 +159,9 @@ BOOLEAN MercThinksHisMoraleIsTooLow( SOLDIERTYPE *pSoldier )
// too low - sorry
return(TRUE);
}
else
{
// within tolerance
return(FALSE);
}
// within tolerance
return(FALSE);
}
BOOLEAN MercIsOwedTooMuchMoney( UINT8 ubProfileID )
@@ -188,8 +177,7 @@ BOOLEAN MercIsOwedTooMuchMoney( UINT8 ubProfileID )
BOOLEAN MercThinksPlayerIsInactiveTooLong( UINT8 ubProfileID )
{
UINT8 ubTolerance;
ubTolerance = gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS];
UINT8 ubTolerance = gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS];
if( gMercProfiles[ubProfileID].bCharacterTrait == CHAR_TRAIT_PACIFIST )
{
ubTolerance = max(0, ubTolerance + gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS_PACIFIST_BONUS]);
@@ -206,10 +194,8 @@ BOOLEAN MercThinksPlayerIsInactiveTooLong( UINT8 ubProfileID )
{
return(TRUE);
}
else
{
return(FALSE);
}
return(FALSE);
}
void UpdateLastDayOfPlayerActivity( UINT16 usDay )
@@ -228,11 +214,8 @@ UINT8 LackOfProgressTolerance( void )
// give an EXTRA day over normal
return( 7 - DIF_LEVEL_MEDIUM + gStrategicStatus.ubHighestProgress / 42 );
}
else
{
return( 6 - gGameOptions.ubDifficultyLevel + gStrategicStatus.ubHighestProgress / 42 );
}
return( 6 - gGameOptions.ubDifficultyLevel + gStrategicStatus.ubHighestProgress / 42 );
}
-6
View File
@@ -333,7 +333,6 @@ void DecrementTownLoyalty( INT8 bTownId, UINT32 uiLoyaltyDecrease )
UINT32 uiRemainingDecrement;
INT16 sThisDecrement;
Assert( ( bTownId >= FIRST_TOWN ) && ( bTownId < NUM_TOWNS ) );
// doesn't affect towns where player hasn't established a "presence" yet
@@ -363,8 +362,6 @@ void DecrementTownLoyalty( INT8 bTownId, UINT32 uiLoyaltyDecrease )
uiRemainingDecrement -= sThisDecrement;
}
return;
}
@@ -376,7 +373,6 @@ void UpdateTownLoyaltyRating( INT8 bTownId )
INT16 sRatingChange = 0;
UINT8 ubMaxLoyalty = 0;
Assert( ( bTownId >= FIRST_TOWN ) && ( bTownId < NUM_TOWNS ) );
// remember previous loyalty value
@@ -437,8 +433,6 @@ void UpdateTownLoyaltyRating( INT8 bTownId )
{
fMapPanelDirty = TRUE;
}
return;
}
+65 -22
View File
@@ -7558,36 +7558,79 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent )
}
if( fCtrl )
{
//CHRISL: pickup all items to vehicle
if ( UsingNewInventorySystem() == true && fShowInventoryFlag && fShowMapInventoryPool && !(gTacticalStatus.fEnemyInSector) && gGameExternalOptions.fVehicleInventory && (pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE))
if ( UsingNewInventorySystem() && fShowInventoryFlag && fShowMapInventoryPool && !gTacticalStatus.fEnemyInSector)
{
for(unsigned int i = 0; i<pInventoryPoolList.size(); i++)
//CHRISL: pickup all items to vehicle
if ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE )
{
if(pInventoryPoolList[i].fExists == TRUE && (pInventoryPoolList[i].usFlags & WORLD_ITEM_REACHABLE))
if (gGameExternalOptions.fVehicleInventory)
{
for(int x = 0; x<NUM_INV_SLOTS; x++)
for (unsigned int i = 0; i < pInventoryPoolList.size(); i++)
{
if(vehicleInv[x] == FALSE)
continue;
if(pSoldier->inv[x].exists() == true)
if (pInventoryPoolList[i].fExists == TRUE && (pInventoryPoolList[i].usFlags & WORLD_ITEM_REACHABLE))
{
if(pSoldier->inv[x].usItem != pInventoryPoolList[i].object.usItem)
continue;
else
pInventoryPoolList[i].object.AddObjectsToStack(pSoldier->inv[x], -1, pSoldier, x);
}
else
pInventoryPoolList[i].object.MoveThisObjectTo(pSoldier->inv[x], -1, pSoldier, x);
if(pInventoryPoolList[i].object.ubNumberOfObjects < 0)
{
//RemoveItemFromWorld(i);
break;
for (int x = 0; x < NUM_INV_SLOTS; x++)
{
if (vehicleInv[x] == FALSE)
continue;
if (pSoldier->inv[x].exists() == true)
{
if (pSoldier->inv[x].usItem != pInventoryPoolList[i].object.usItem)
continue;
else
pInventoryPoolList[i].object.AddObjectsToStack(pSoldier->inv[x], -1, pSoldier, x);
}
else
pInventoryPoolList[i].object.MoveThisObjectTo(pSoldier->inv[x], -1, pSoldier, x);
if (pInventoryPoolList[i].object.ubNumberOfObjects < 0)
{
//RemoveItemFromWorld(i);
break;
}
}
}
fTeamPanelDirty = TRUE;
fMapPanelDirty = TRUE;
fInterfacePanelDirty = DIRTYLEVEL2;
}
}
fTeamPanelDirty = TRUE;
fMapPanelDirty = TRUE;
fInterfacePanelDirty = DIRTYLEVEL2;
}
// Flugente: also allow mercs to qickly pick up items this way (but not EPCs)
else if ( !AM_AN_EPC(pSoldier) )
{
for (unsigned int i = 0; i < pInventoryPoolList.size(); ++i)
{
if (pInventoryPoolList[i].fExists == TRUE && (pInventoryPoolList[i].usFlags & WORLD_ITEM_REACHABLE))
{
INT8 invsize = (INT8)pSoldier->inv.size(); // remember inventorysize, so we don't call size() repeatedly
for (INT8 bLoop = 0; bLoop < invsize; ++bLoop)
{
if ( CanItemFitInPosition( pSoldier, &pInventoryPoolList[i].object, bLoop, FALSE ) )
{
// TODO: do not add LBE if we would then have to move existing items
if (pSoldier->inv[bLoop].exists())
{
if (pSoldier->inv[bLoop].usItem != pInventoryPoolList[i].object.usItem)
continue;
else
pInventoryPoolList[i].object.AddObjectsToStack(pSoldier->inv[bLoop], -1, pSoldier, bLoop, 0, FALSE);
}
else
pInventoryPoolList[i].object.MoveThisObjectTo(pSoldier->inv[bLoop], -1, pSoldier, bLoop);
if (pInventoryPoolList[i].object.ubNumberOfObjects < 0)
{
//RemoveItemFromWorld(i);
break;
}
}
}
}
fTeamPanelDirty = TRUE;
fMapPanelDirty = TRUE;
fInterfacePanelDirty = DIRTYLEVEL2;
}
}
}
}
+1 -1
View File
@@ -1890,7 +1890,7 @@ UINT8 GetTownSectorsUnderControl( INT8 bTownId )
( StrategicMap[ usSector ].fEnemyControlled == FALSE ) &&
( NumEnemiesInSector( ( INT16 )iCounterA, ( INT16 )iCounterB ) == 0 ) )
{
ubSectorsControlled++;
++ubSectorsControlled;
}
}
}
+55 -63
View File
@@ -42,18 +42,18 @@ void ExitBoxing( void )
//DBrot: More Rooms
//UINT8 ubRoom;
UINT16 usRoom;
SOLDIERTYPE * pSoldier;
UINT32 uiLoop;
UINT8 ubPass;
SOLDIERTYPE* pSoldier;
UINT32 uiLoop;
UINT8 ubPass;
// find boxers and turn them neutral again
// first time through loop, look for AI guy, then for PC guy.... for stupid
// oppcnt/alert status reasons
for( ubPass = 0; ubPass < 2; ubPass++ )
for( ubPass = 0; ubPass < 2; ++ubPass )
{
// because boxer could die, loop through all soldier ptrs
for ( uiLoop = 0; uiLoop < gTacticalStatus.Team[ CIV_TEAM ].bLastID; uiLoop++ )
for ( uiLoop = 0; uiLoop < gTacticalStatus.Team[ CIV_TEAM ].bLastID; ++uiLoop )
{
pSoldier = MercPtrs[ uiLoop ];
@@ -128,7 +128,6 @@ void ExitBoxing( void )
// Lock UI until we get out of the ring
guiPendingOverrideEvent = LU_BEGINUILOCK;
}
}
@@ -196,7 +195,7 @@ UINT8 CountPeopleInBoxingRing( void )
UINT16 usRoom;
UINT8 ubTotalInRing = 0;
for ( uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++ )
for ( uiLoop = 0; uiLoop < guiNumMercSlots; ++uiLoop )
{
pSoldier = MercSlots[ uiLoop ];
@@ -204,7 +203,7 @@ UINT8 CountPeopleInBoxingRing( void )
{
if ( InARoom( pSoldier->sGridNo, &usRoom ) && usRoom == BOXING_RING)
{
ubTotalInRing++;
++ubTotalInRing;
}
}
}
@@ -214,17 +213,16 @@ UINT8 CountPeopleInBoxingRing( void )
void CountPeopleInBoxingRingAndDoActions( void )
{
UINT32 uiLoop;
UINT8 ubTotalInRing = 0;
UINT32 uiLoop;
UINT8 ubTotalInRing = 0;
//DBrot: More Rooms
//UINT8 ubRoom;
UINT16 usRoom;
UINT8 ubPlayersInRing = 0;
UINT16 usRoom;
UINT16 ubPlayersInRing = 0;
SOLDIERTYPE * pSoldier;
SOLDIERTYPE * pInRing[2] = { NULL, NULL };
SOLDIERTYPE * pNonBoxingPlayer = NULL;
for ( uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++ )
for ( uiLoop = 0; uiLoop < guiNumMercSlots; ++uiLoop )
{
pSoldier = MercSlots[ uiLoop ];
@@ -236,19 +234,17 @@ void CountPeopleInBoxingRingAndDoActions( void )
{
pInRing[ ubTotalInRing ] = pSoldier;
}
ubTotalInRing++;
++ubTotalInRing;
if ( pSoldier->flags.uiStatusFlags & SOLDIER_PC )
{
ubPlayersInRing++;
++ubPlayersInRing;
if ( !pNonBoxingPlayer && !(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) )
{
pNonBoxingPlayer = pSoldier;
}
}
}
}
}
@@ -270,7 +266,6 @@ void CountPeopleInBoxingRingAndDoActions( void )
return;
}
if ( gTacticalStatus.bBoxingState == BOXING_WAITING_FOR_PLAYER )
{
if ( ubTotalInRing == 1 && ubPlayersInRing == 1 )
@@ -281,44 +276,45 @@ void CountPeopleInBoxingRingAndDoActions( void )
}
}
else
// if pre-boxing, check for two people (from different teams!) in the ring
if ( gTacticalStatus.bBoxingState == PRE_BOXING )
{
if ( ubTotalInRing == 2 && ubPlayersInRing == 1 )
// if pre-boxing, check for two people (from different teams!) in the ring
if (gTacticalStatus.bBoxingState == PRE_BOXING)
{
// ladieees and gennleman, we have a fight!
for ( uiLoop = 0; uiLoop < 2; uiLoop++ )
if (ubTotalInRing == 2 && ubPlayersInRing == 1)
{
if ( ! ( pInRing[ uiLoop ]->flags.uiStatusFlags & SOLDIER_BOXER ) )
// ladieees and gennleman, we have a fight!
for (uiLoop = 0; uiLoop < 2; ++uiLoop)
{
// set as boxer!
pInRing[ uiLoop ]->flags.uiStatusFlags |= SOLDIER_BOXER;
if (!(pInRing[uiLoop]->flags.uiStatusFlags & SOLDIER_BOXER))
{
// set as boxer!
pInRing[uiLoop]->flags.uiStatusFlags |= SOLDIER_BOXER;
}
}
}
// start match!
SetBoxingState( BOXING );
gfLastBoxingMatchWonByPlayer = FALSE;
// start match!
SetBoxingState(BOXING);
gfLastBoxingMatchWonByPlayer = FALSE;
#ifdef JA2TESTVERSION
#ifdef JA2TESTVERSION
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Boxer APs %d %d", pInRing[0]->bActionPoints, pInRing[1]->bActionPoints );
#endif
// give the first turn to a randomly chosen boxer
EnterCombatMode( pInRing[ Random( 2 ) ]->bTeam );
#endif
// give the first turn to a randomly chosen boxer
EnterCombatMode(pInRing[Random(2)]->bTeam);
}
}
}
/*
else
{
/*
else
{
// check to see if the player has more than one person in the ring
if ( ubPlayersInRing > 1 )
{
// boxing match just became invalid!
BoxingPlayerDisqualified( pNonBoxingPlayer, NON_BOXER_IN_RING );
return;
// boxing match just became invalid!
BoxingPlayerDisqualified( pNonBoxingPlayer, NON_BOXER_IN_RING );
return;
}
}
*/
}
*/
}
BOOLEAN CheckOnBoxers( void )
@@ -359,7 +355,7 @@ BOOLEAN BoxerExists( void )
{
UINT32 uiLoop;
for( uiLoop = 0; uiLoop < NUM_BOXERS; uiLoop++ )
for( uiLoop = 0; uiLoop < NUM_BOXERS; ++uiLoop )
{
if ( WhoIsThere2( gsBoxerGridNo[ uiLoop ], 0 ) != NOBODY )
{
@@ -371,17 +367,17 @@ BOOLEAN BoxerExists( void )
BOOLEAN PickABoxer( void )
{
UINT32 uiLoop;
SOLDIERTYPE * pBoxer;
UINT32 uiLoop;
SOLDIERTYPE* pBoxer;
for( uiLoop = 0; uiLoop < NUM_BOXERS; uiLoop++ )
for( uiLoop = 0; uiLoop < NUM_BOXERS; ++uiLoop )
{
if ( gubBoxerID[ uiLoop ] != NOBODY )
{
if ( gfBoxerFought[ uiLoop ] )
{
// pathetic attempt to prevent multiple AI boxers
MercPtrs[ gubBoxerID[ uiLoop ] ]->flags.uiStatusFlags &= ~SOLDIER_BOXER;
MercPtrs[ gubBoxerID[ uiLoop ] ]->DeleteBoxingFlag();
}
else
{
@@ -430,15 +426,13 @@ BOOLEAN PickABoxer( void )
BOOLEAN BoxerAvailable( void )
{
UINT8 ubLoop;
// No way around this, BoxerAvailable will have to go find boxer IDs if they aren't set.
if ( CheckOnBoxers() == FALSE )
{
return( FALSE );
}
for( ubLoop = 0; ubLoop < NUM_BOXERS; ubLoop++ )
for (UINT8 ubLoop = 0; ubLoop < NUM_BOXERS; ++ubLoop)
{
if ( gubBoxerID[ ubLoop ] != NOBODY && !gfBoxerFought[ ubLoop ] )
{
@@ -453,14 +447,13 @@ BOOLEAN BoxerAvailable( void )
// SEQUEL FIGHT. Maybe we could check Kingpin's location instead!
UINT8 BoxersAvailable( void )
{
UINT8 ubLoop;
UINT8 ubCount = 0;
for( ubLoop = 0; ubLoop < NUM_BOXERS; ubLoop++ )
for (UINT8 ubLoop = 0; ubLoop < NUM_BOXERS; ++ubLoop)
{
if ( gubBoxerID[ ubLoop ] != NOBODY && !gfBoxerFought[ ubLoop ] )
{
ubCount++;
++ubCount;
}
}
@@ -487,7 +480,7 @@ BOOLEAN AnotherFightPossible( void )
// Loop through all mercs on player team
ubLoop = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
pSoldier = MercPtrs[ ubLoop ];
for ( ; ubLoop <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; ubLoop++,pSoldier++ )
for ( ; ubLoop <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; ++ubLoop, pSoldier++ )
{
if ( pSoldier->bActive && pSoldier->bInSector && pSoldier->stats.bLife > (OKLIFE + 5) && !pSoldier->bCollapsed )
{
@@ -517,7 +510,7 @@ void BoxingMovementCheck( SOLDIERTYPE * pSoldier )
// add the history record here.
AddHistoryToPlayersLog( HISTORY_DISQUALIFIED_BOXING, pSoldier->ubProfile, GetWorldTotalMin(), gWorldSectorX, gWorldSectorY );
// make not a boxer any more
pSoldier->flags.uiStatusFlags &= ~(SOLDIER_BOXER);
pSoldier->DeleteBoxingFlag( );
pSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL);
}
}
@@ -531,7 +524,6 @@ void SetBoxingState( INT8 bNewState )
// pause time
PauseGame();
}
}
else
{
@@ -546,7 +538,6 @@ void SetBoxingState( INT8 bNewState )
// fight to occur
gfBoxerFought[ 0 ] = TRUE;
}
}
}
gTacticalStatus.bBoxingState = bNewState;
@@ -557,13 +548,14 @@ void SetBoxingState( INT8 bNewState )
void ClearAllBoxerFlags( void )
{
UINT32 uiSlot;
for( uiSlot = 0; uiSlot < guiNumMercSlots; uiSlot++ )
for (UINT32 uiSlot = 0; uiSlot < guiNumMercSlots; ++uiSlot)
{
if ( MercSlots[ uiSlot ] && MercSlots[ uiSlot ]->flags.uiStatusFlags & SOLDIER_BOXER )
{
MercSlots[ uiSlot ]->flags.uiStatusFlags &= ~(SOLDIER_BOXER);
MercSlots[ uiSlot ]->DeleteBoxingFlag();
if ( MercSlots[uiSlot]->bTeam == gbPlayerNum )
MercSlots[uiSlot]->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL);
}
}
}
+1 -1
View File
@@ -966,7 +966,7 @@ void StartCivQuote( SOLDIERTYPE *pCiv )
}
// Flugente: if we are an assassin, we speak like the militia we emulate
if ( pCiv->bSoldierFlagMask & SOLDIER_ASSASSIN )
if ( pCiv->usSoldierFlagMask & SOLDIER_ASSASSIN )
{
switch ( pCiv->GetUniformType() )
{
+3 -4
View File
@@ -2399,7 +2399,6 @@ CHAR8 *GetSnitchDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, B
{
static CHAR8 zFileName[164];
static CHAR8 zFileNameExists[164];
UINT8 ubFileNumID;
if ( fWavFile )
{
@@ -2639,9 +2638,9 @@ BOOLEAN SnitchDialogueReplaceMercNicksWithProperData( CHAR16 *pFinishedString, U
BOOLEAN GetSnitchDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, UINT32 iDataSize, STR16 zDialogueText, UINT32 *puiSound1ID, UINT32 *puiSound2ID, UINT32 *puiSound3ID, CHAR8 zSoundFiles[][64], UINT8 ubTargetProfile, UINT8 ubSecondaryTargetProfile )
{
STR8 pFilename1;
STR8 pFilename2;
STR8 pFilename3;
CHAR16 zDialogueTextTemp[ QUOTE_MESSAGE_SIZE ];
//STR8 pFilename2;
//STR8 pFilename3;
//CHAR16 zDialogueTextTemp[ QUOTE_MESSAGE_SIZE ];
BOOLEAN fTextAvailable = FALSE;
// first things first - grab the text (if player has SUBTITLE PREFERENCE ON)
+3 -3
View File
@@ -202,7 +202,7 @@ BOOLEAN ApplyDrugs( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObject )
pSoldier->bRegenBoostersUsedToday++;
// set flag: we are on drugs
pSoldier->bSoldierFlagMask |= SOLDIER_DRUGGED;
pSoldier->usSoldierFlagMask |= SOLDIER_DRUGGED;
}
// increase drug counter if not alcoholic drug
@@ -258,7 +258,7 @@ void HandleEndTurnDrugAdjustments( SOLDIERTYPE *pSoldier )
INT32 iNumLoops;
// if were not on drugs, nothing to do here
if ( ( pSoldier->bSoldierFlagMask & SOLDIER_DRUGGED ) == 0 )
if ( ( pSoldier->usSoldierFlagMask & SOLDIER_DRUGGED ) == 0 )
return;
// We test for every 'pure' drug separately
@@ -516,7 +516,7 @@ void HandleEndTurnDrugAdjustments( SOLDIERTYPE *pSoldier )
// if all drug effects have ended, delete flag
if ( !MercUnderTheInfluence(pSoldier) )
pSoldier->bSoldierFlagMask &= ~SOLDIER_DRUGGED;
pSoldier->usSoldierFlagMask &= ~SOLDIER_DRUGGED;
}
void HandleAPEffectDueToDrugs( SOLDIERTYPE *pSoldier, INT16 *pubPoints )
+4 -4
View File
@@ -2194,7 +2194,7 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
}
// Flugente: add an icon if we are currently in disguise
if ( MercPtrs[ pFace->ubSoldierID ]->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( MercPtrs[ pFace->ubSoldierID ]->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{
DoRightIcon( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons, 12 );
bNumRightIcons++;
@@ -2210,12 +2210,12 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
// Flugente: icons for radio operator actions (not the assignment)
if ( MercPtrs[ pFace->ubSoldierID ]->bAssignment != RADIO_SCAN )
{
if ( MercPtrs[ pFace->ubSoldierID ]->bSoldierFlagMask & (SOLDIER_RADIO_OPERATOR_SCANNING|SOLDIER_RADIO_OPERATOR_LISTENING) )
if ( MercPtrs[ pFace->ubSoldierID ]->usSoldierFlagMask & (SOLDIER_RADIO_OPERATOR_SCANNING|SOLDIER_RADIO_OPERATOR_LISTENING) )
{
DoRightIcon( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons, 19 );
bNumRightIcons++;
}
else if ( MercPtrs[ pFace->ubSoldierID ]->bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_JAMMING )
else if ( MercPtrs[ pFace->ubSoldierID ]->usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_JAMMING )
{
DoRightIcon( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons, 20 );
bNumRightIcons++;
@@ -2420,7 +2420,7 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
BltVideoObjectFromIndex( uiRenderBuffer, guiPORTRAITICONS, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
fDoIcon = FALSE;
bNumRightIcons++;
++bNumRightIcons;
}
}
}
+4 -4
View File
@@ -4941,7 +4941,7 @@ void StartTacticalFunctionSelectionMessageBox( SOLDIERTYPE * pSoldier, INT32 sGr
wcscpy( gzUserDefinedButton[2], TacticalStr[ CLEAN_ONE_GUN_STR ] );
wcscpy( gzUserDefinedButton[3], TacticalStr[ CLEAN_ALL_GUNS_STR ] );
if ( gpTempSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( gpTempSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
wcscpy( gzUserDefinedButton[1], TacticalStr[ TAKE_OFF_DISGUISE_STR ] );
else
wcscpy( gzUserDefinedButton[1], TacticalStr[ TAKE_OFF_CLOTHES_STR ] );
@@ -4958,7 +4958,7 @@ void StartTacticalFunctionSelectionMessageBox( SOLDIERTYPE * pSoldier, INT32 sGr
}
// if disguised, allow testing our disguise
if ( gpTempSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( gpTempSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
wcscpy( gzUserDefinedButton[6], TacticalStr[ SPY_SELFTEST_STR ] );
else
wcscpy( gzUserDefinedButton[6], TacticalStr[ UNUSED_STR ] );
@@ -5185,7 +5185,7 @@ void TacticalFunctionSelectionMessageBoxCallBack( UINT8 ubExitValue )
break;
case 7:
// test our disguise
if ( gpTempSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( gpTempSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
gpTempSoldier->SpySelfTest();
break;
default:
@@ -6443,7 +6443,7 @@ UINT8 StealItems(SOLDIERTYPE* pSoldier,SOLDIERTYPE* pOpponent, UINT8* ubIndexRet
// - remove the 'steal from teammember' stuff from the usual stealing stuff, and add it as a new action (like handcuffing), complete with building the steal-sub-menu and everything
// - or introduce a flag that prohibits teammembers from 'reaction-firing' on us. Set it upon stealing (here) and remove it after the steal menu is closed
// or simplicity reasons, I will do #2 here. Until it breaks, then I'll be forced to do #1.
pSoldier->bSoldierFlagMask |= SOLDIER_ACCESSTEAMMEMBER;
pSoldier->usSoldierFlagMask |= SOLDIER_ACCESSTEAMMEMBER;
// if we are Nails, don't allow taking our vest
if ( pOpponent->ubProfile == 34 && i == VESTPOS )
+1 -1
View File
@@ -123,7 +123,7 @@ void HandleFlashLights()
{
pSoldier = MercSlots[ uiLoop ];
if ( pSoldier != NULL && pSoldier->bSoldierFlagMask & SOLDIER_REDOFLASHLIGHT )
if ( pSoldier != NULL && pSoldier->usSoldierFlagMask & SOLDIER_REDOFLASHLIGHT )
{
pSoldier->HandleFlashLights();
}
+1 -1
View File
@@ -11294,7 +11294,7 @@ void RemoveItemPickupMenu( )
gItemPickupMenu.pSoldier->flags.fPauseAllAnimation = FALSE;
// Flugente: remove the marker notifying we are currently stealing
gItemPickupMenu.pSoldier->bSoldierFlagMask &= ~SOLDIER_ACCESSTEAMMEMBER;
gItemPickupMenu.pSoldier->usSoldierFlagMask &= ~SOLDIER_ACCESSTEAMMEMBER;
// Remove graphics!
DeleteVideoObjectFromIndex( gItemPickupMenu.uiPanelVo );
+1 -1
View File
@@ -4163,7 +4163,7 @@ void SMInvClickCallback( MOUSE_REGION * pRegion, INT32 iReason )
}
// Flugente: we have to recheck our flashlights, as we changed items
//gpSMCurrentMerc->bSoldierFlagMask |= SOLDIER_REDOFLASHLIGHT;
//gpSMCurrentMerc->usSoldierFlagMask |= SOLDIER_REDOFLASHLIGHT;
gpSMCurrentMerc->HandleFlashLights();
}
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN)
+5 -5
View File
@@ -1905,7 +1905,7 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
SetFontBackground( FONT_MCOLOR_BLACK );
BOOLEAN bInCombat = gTacticalStatus.uiFlags & TURNBASED && gTacticalStatus.uiFlags & INCOMBAT;
BOOLEAN bStealth = pSoldier->bStealthMode || pSoldier->bSoldierFlagMask & ( SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER );
BOOLEAN bStealth = pSoldier->bStealthMode || pSoldier->usSoldierFlagMask & ( SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER );
// sevenfm: for mercs use name color as cover indicator
// only use color when there is enemy in sector
if( pSoldier->bTeam == OUR_TEAM &&
@@ -3633,7 +3633,7 @@ void DrawBarsInUIBox( SOLDIERTYPE *pSoldier , INT16 sXPos, INT16 sYPos, INT16 sW
}
/*
BOOLEAN bDisguised = pSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER);
BOOLEAN bDisguised = pSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER);
BOOLEAN bStealth = pSoldier->bStealthMode;
// draw cover indicators
if( ( gGameExternalOptions.ubShowHealthBarsOnHead > 1 ) &&
@@ -5359,7 +5359,7 @@ STR16 GetSoldierHealthString( SOLDIERTYPE *pSoldier )
else
{
// Flugente: display if we are a prisoner of war
if ( pSoldier->bSoldierFlagMask & SOLDIER_POW )
if ( pSoldier->usSoldierFlagMask & SOLDIER_POW )
return zHealthStr[ 7 ];
INT32 cnt, cntStart;
@@ -6377,7 +6377,7 @@ void ShowAdditionalInfo( INT16 sX, INT16 sY, SOLDIERTYPE* pTargetSoldier )
// show awareness sign only when in stealth mode or disguised
if( ( gusSelectedSoldier != NOBODY ) &&
( pTargetSoldier->bTeam == ENEMY_TEAM || pTargetSoldier->bTeam == CIV_TEAM && !pTargetSoldier->aiData.bNeutral ) &&
( MercPtrs[ gusSelectedSoldier ]->bStealthMode || MercPtrs[ gusSelectedSoldier ]->bSoldierFlagMask & ( SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER ) ) )
( MercPtrs[ gusSelectedSoldier ]->bStealthMode || MercPtrs[ gusSelectedSoldier ]->usSoldierFlagMask & ( SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER ) ) )
{
if( pTargetSoldier->aiData.bOppList[ MercPtrs[ gusSelectedSoldier ]->ubID ] == SEEN_CURRENTLY )
swprintf( NameStr, L"%s", L"*" );
@@ -6581,7 +6581,7 @@ BOOLEAN ShowSoldierRoleSymbol(SOLDIERTYPE* pSoldier)
sYPos += 25;
// is this guy an officer?
if ( pSoldier->bSoldierFlagMask & SOLDIER_ENEMY_OFFICER )
if ( pSoldier->usSoldierFlagMask & SOLDIER_ENEMY_OFFICER )
{
// Add bars
iBack = RegisterBackgroundRect( BGND_FLAG_SINGLE, NULL, sXPos, sYPos, (INT16)(sXPos + 20 ), (INT16)(sYPos + 20 ) );
+1 -1
View File
@@ -3478,7 +3478,7 @@ UINT16 PickARandomItem(UINT8 typeIndex, INT8 bSoldierClass, UINT8 maxCoolness, B
BOOLEAN isnight = NightTime();
// check up to 10 times for an item with a matching coolness
for (int i=0; i < 10;i++)
for (int i=0; i < 10; ++i)
{
//if we've already tried more times then there are items + 1, limit the looping to speed up the game, and just plain give up
if ( i > gArmyItemChoices[bSoldierClass][ typeIndex ].ubChoices )
+42 -12
View File
@@ -9508,7 +9508,7 @@ BOOLEAN ApplyClothes( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fUseAPs
if ( newvest )
{
// if we are already wearing a vest, give us back that item
if ( pSoldier->bSoldierFlagMask & SOLDIER_NEW_VEST )
if ( pSoldier->usSoldierFlagMask & SOLDIER_NEW_VEST )
{
UINT16 vestitem = 0;
if ( GetFirstClothesItemWithSpecificData(&vestitem, pSoldier->VestPal, "blank") )
@@ -9522,16 +9522,16 @@ BOOLEAN ApplyClothes( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fUseAPs
}
SET_PALETTEREP_ID( pSoldier->VestPal, Clothes[clothestype].vest );
pSoldier->bSoldierFlagMask |= SOLDIER_NEW_VEST;
pSoldier->usSoldierFlagMask |= SOLDIER_NEW_VEST;
// this vest is not damaged, so remove the damaged vest flag
pSoldier->bSoldierFlagMask &= ~SOLDIER_DAMAGED_VEST;
pSoldier->usSoldierFlagMask &= ~SOLDIER_DAMAGED_VEST;
}
if ( newpants )
{
// if we are already wearing a vest, give us back that item
if ( pSoldier->bSoldierFlagMask & SOLDIER_NEW_PANTS )
if ( pSoldier->usSoldierFlagMask & SOLDIER_NEW_PANTS )
{
UINT16 pantsitem = 0;
if ( GetFirstClothesItemWithSpecificData(&pantsitem, "blank", pSoldier->PantsPal) )
@@ -9545,10 +9545,10 @@ BOOLEAN ApplyClothes( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fUseAPs
}
SET_PALETTEREP_ID( pSoldier->PantsPal, Clothes[clothestype].pants );
pSoldier->bSoldierFlagMask |= SOLDIER_NEW_PANTS;
pSoldier->usSoldierFlagMask |= SOLDIER_NEW_PANTS;
// these pants are not damaged, so remove the damaged pants flag
pSoldier->bSoldierFlagMask &= ~SOLDIER_DAMAGED_PANTS;
pSoldier->usSoldierFlagMask &= ~SOLDIER_DAMAGED_PANTS;
}
// Use palette from HVOBJECT, then use substitution for pants, etc
@@ -9567,10 +9567,10 @@ BOOLEAN ApplyClothes( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fUseAPs
DeductPoints( pSoldier, apcost, 0 );
}
if ( pSoldier->bSoldierFlagMask & SOLDIER_NEW_VEST && pSoldier->bSoldierFlagMask & SOLDIER_NEW_PANTS )
if ( pSoldier->usSoldierFlagMask & SOLDIER_NEW_VEST && pSoldier->usSoldierFlagMask & SOLDIER_NEW_PANTS )
{
// first, remove the covert flags, and then reapply the correct ones, in case we switch between civilian and military clothes
pSoldier->bSoldierFlagMask &= ~(SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER);
pSoldier->usSoldierFlagMask &= ~(SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER);
// we now have to determine wether we are currently wearing civilian or military clothes
for ( UINT8 i = UNIFORM_ENEMY_ADMIN; i <= UNIFORM_ENEMY_ELITE; ++i )
@@ -9578,7 +9578,7 @@ BOOLEAN ApplyClothes( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fUseAPs
// both parts have to fit. We cant mix different uniforms and get soldier disguise
if ( COMPARE_PALETTEREP_ID(pSoldier->VestPal, gUniformColors[ i ].vest) && COMPARE_PALETTEREP_ID(pSoldier->PantsPal, gUniformColors[ i ].pants) )
{
pSoldier->bSoldierFlagMask |= SOLDIER_COVERT_SOLDIER;
pSoldier->usSoldierFlagMask |= SOLDIER_COVERT_SOLDIER;
if ( pSoldier->bTeam == OUR_TEAM )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_DISGUISED_AS_SOLDIER], pSoldier->GetName() );
@@ -9588,9 +9588,9 @@ BOOLEAN ApplyClothes( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fUseAPs
}
// if not dressed as a soldier, we must be dressed as a civilian
if ( !(pSoldier->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER) )
if ( !(pSoldier->usSoldierFlagMask & SOLDIER_COVERT_SOLDIER) )
{
pSoldier->bSoldierFlagMask |= SOLDIER_COVERT_CIV;
pSoldier->usSoldierFlagMask |= SOLDIER_COVERT_CIV;
if ( pSoldier->bTeam == OUR_TEAM )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_DISGUISED_AS_CIVILIAN], pSoldier->GetName() );
@@ -12194,8 +12194,8 @@ UINT16 PickARandomLaunchable(UINT16 itemIndex)
{
UINT16 usNumMatches = 0;
UINT16 usRandom = 0;
UINT16 i = 0;
UINT16 lowestCoolness = LowestLaunchableCoolness(itemIndex);
#if 0
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("PickARandomLaunchable: itemIndex = %d", itemIndex));
// WANNE: This should fix the hang on the merc positioning screen (fix by Razer)
@@ -12230,6 +12230,36 @@ UINT16 PickARandomLaunchable(UINT16 itemIndex)
}
}
}
#endif
// Flugente: the above code is highly dubious.. why do we loop over all items 2 times, and why that obscure usRandom--; business? This can cause an underflow!
BOOLEAN isnight = NightTime();
UINT16 maxcoolness = max( HighestPlayerProgressPercentage() / 10, lowestCoolness );
std::vector<UINT16> legalvec;
for ( UINT16 i = 0; i < MAXITEMS; ++i )
{
if ( Item[i].usItemClass == 0 )
break;
//Madd: quickfix: make it not choose best grenades right away.
if ( Item[i].ubCoolness <= maxcoolness && ItemIsLegal( i ) && ValidLaunchable( i, itemIndex ) )
{
// Flugente: ignore this item if we aren't allowed to pick it at this time of day
if ( (isnight && Item[i].usItemChoiceTimeSetting == 1) || (!isnight && Item[i].usItemChoiceTimeSetting == 2) )
continue;
legalvec.push_back(i);
++usNumMatches;
}
}
if ( !legalvec.empty() )
{
usRandom = (UINT16)Random( legalvec.size() );
return legalvec[usRandom];
}
return 0;
}
+116 -113
View File
@@ -742,7 +742,7 @@ void HandleMoraleEvent( SOLDIERTYPE *pSoldier, INT8 bMoraleEvent, INT16 sMapX, I
if ( gGameOptions.fNewTraitSystem )
{
// Flugente: if we have the covert trait and are covert, we might simply be returning from a reconnaissance mission in enemy territory. No need for a morale drop in this case
if ( !HAS_SKILL_TRAIT( pTeamSoldier, COVERT_NT ) || ( (pTeamSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER)) == 0) )
if ( !HAS_SKILL_TRAIT( pTeamSoldier, COVERT_NT ) || ( (pTeamSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER)) == 0) )
{
// SANDRO - no penalty for pacifists to run away
if ( gMercProfiles[pTeamSoldier->ubProfile].bCharacterTrait != CHAR_TRAIT_PACIFIST )
@@ -1065,7 +1065,7 @@ void HourlyMoraleUpdate( void )
bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID;
// loop through all mercs to calculate their morale
for ( pSoldier = MercPtrs[ bMercID ]; bMercID <= bLastTeamID; bMercID++,pSoldier++)
for ( pSoldier = MercPtrs[ bMercID ]; bMercID <= bLastTeamID; ++bMercID,pSoldier++)
{
//if the merc is active, in Arulco, and conscious, not POW
if ( pSoldier->bActive && pSoldier->ubProfile != NO_PROFILE &&
@@ -1162,7 +1162,7 @@ void HourlyMoraleUpdate( void )
}
}
iTotalOpinions += bOpinion;
bNumTeamMembers++;
++bNumTeamMembers;
if ( EffectiveLeadership( pOtherSoldier ) > bHighestTeamLeadership)
{
bHighestTeamLeadership = EffectiveLeadership( pOtherSoldier );
@@ -1236,46 +1236,45 @@ void HourlyMoraleUpdate( void )
}
}
bStrategicMoraleUpdateCounter++;
++bStrategicMoraleUpdateCounter;
if ( bStrategicMoraleUpdateCounter == gMoraleSettings.ubHoursBetweenStrategicDelay )
{
DecayStrategicMoraleModifiers();
bStrategicMoraleUpdateCounter = 0;
}
}
void HandleSnitchCheck( void )
{
INT8 bMercID, bOtherID;
INT8 bOpinion=-1;
INT8 bLastTeamID;
SOLDIERTYPE * pSoldier;
SOLDIERTYPE * pOtherSoldier;
MERCPROFILESTRUCT * pProfile;
BOOLEAN fSameGroupOnly;
UINT16 bMercID, bOtherID;
INT8 bOpinion = -1;
UINT16 bLastTeamID;
SOLDIERTYPE* pSoldier;
SOLDIERTYPE* pOtherSoldier;
MERCPROFILESTRUCT* pProfile;
BOOLEAN fSameGroupOnly;
// anv: save merc id and his negative morale event for snitches
UINT8 ubSnitchEventsCounter = 0;
SnitchEvent SnitchEvents[NUM_PROFILES];
std::vector<SnitchEvent> snitcheventvector;
bMercID = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID;
bMercID = gTacticalStatus.Team[gbPlayerNum].bFirstID;
bLastTeamID = gTacticalStatus.Team[gbPlayerNum].bLastID;
// loop through all mercs to calculate their morale
for ( pSoldier = MercPtrs[ bMercID ]; bMercID <= bLastTeamID; bMercID++,pSoldier++)
for ( pSoldier = MercPtrs[bMercID]; bMercID <= bLastTeamID; ++bMercID, pSoldier++ )
{
//if the merc is active, in Arulco, not POW
//if the merc is active, in Arulco, not POW, not a vehicle
if ( pSoldier && pSoldier->bActive && pSoldier->ubProfile != NO_PROFILE &&
!(pSoldier->bAssignment == IN_TRANSIT ||
pSoldier->bAssignment == ASSIGNMENT_DEAD ||
pSoldier->bAssignment == ASSIGNMENT_POW) )
pSoldier->bAssignment == ASSIGNMENT_POW ||
pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE) )
{
// calculate the guy's opinion of the people he is with
pProfile = &(gMercProfiles[ pSoldier->ubProfile ]);
pProfile = &(gMercProfiles[pSoldier->ubProfile]);
// if we're moving
if (pSoldier->ubGroupID != 0 && PlayerIDGroupInMotion( pSoldier->ubGroupID ))
if ( pSoldier->ubGroupID != 0 && PlayerIDGroupInMotion( pSoldier->ubGroupID ) )
{
// we only check our opinions of people in our squad
fSameGroupOnly = TRUE;
@@ -1285,19 +1284,20 @@ void HandleSnitchCheck( void )
fSameGroupOnly = FALSE;
}
// loop through all other mercs
bOtherID = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
for ( pOtherSoldier = MercPtrs[ bOtherID ]; bOtherID <= bLastTeamID; bOtherID++,pOtherSoldier++)
bOtherID = gTacticalStatus.Team[gbPlayerNum].bFirstID;
for ( pOtherSoldier = MercPtrs[bOtherID]; bOtherID <= bLastTeamID; ++bOtherID, pOtherSoldier++ )
{
// skip past ourselves and all inactive mercs
if (bOtherID != bMercID && pOtherSoldier->bActive && pOtherSoldier->ubProfile != NO_PROFILE &&
if ( bOtherID != bMercID && pOtherSoldier && pOtherSoldier->bActive && pOtherSoldier->ubProfile != NO_PROFILE &&
!(pOtherSoldier->bAssignment == IN_TRANSIT ||
pOtherSoldier->bAssignment == ASSIGNMENT_DEAD ||
pOtherSoldier->bAssignment == ASSIGNMENT_POW))
pOtherSoldier->bAssignment == ASSIGNMENT_POW ||
pOtherSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE) )
{
if (fSameGroupOnly)
if ( fSameGroupOnly )
{
// all we have to check is the group ID
if (pSoldier->ubGroupID != pOtherSoldier->ubGroupID)
if ( pSoldier->ubGroupID != pOtherSoldier->ubGroupID )
{
continue;
}
@@ -1305,72 +1305,72 @@ void HandleSnitchCheck( void )
else
{
// check to see if the location is the same
if (pOtherSoldier->sSectorX != pSoldier->sSectorX ||
if ( pOtherSoldier->sSectorX != pSoldier->sSectorX ||
pOtherSoldier->sSectorY != pSoldier->sSectorY ||
pOtherSoldier->bSectorZ != pSoldier->bSectorZ)
pOtherSoldier->bSectorZ != pSoldier->bSectorZ )
{
continue;
}
// if the OTHER soldier is in motion then we don't do anything!
if (pOtherSoldier->ubGroupID != 0 && PlayerIDGroupInMotion( pOtherSoldier->ubGroupID ))
if ( pOtherSoldier->ubGroupID != 0 && PlayerIDGroupInMotion( pOtherSoldier->ubGroupID ) )
{
continue;
}
}
bOpinion = SoldierRelation( pSoldier, pOtherSoldier);
if( bOpinion <= gSkillTraitValues.bSNTMercOpinionAboutMercTreshold )
bOpinion = SoldierRelation( pSoldier, pOtherSoldier );
if ( bOpinion <= gSkillTraitValues.bSNTMercOpinionAboutMercTreshold )
{
ubSnitchEventsCounter = RememberSnitchableEvent(pSoldier->ubProfile,pOtherSoldier->ubProfile,fSameGroupOnly,SNITCH_HATED_PERSON,SnitchEvents,ubSnitchEventsCounter);
RememberSnitchableEvent( pSoldier->ubProfile, pOtherSoldier->ubProfile, fSameGroupOnly, SNITCH_HATED_PERSON, snitcheventvector );
}
}
}
// check death rate vs. merc's tolerance once/day (ignores buddies!)
if( MercThinksDeathRateTooHigh( pSoldier->ubProfile ) )
if ( MercThinksDeathRateTooHigh( pSoldier->ubProfile ) )
{
// too high, inform
ubSnitchEventsCounter = RememberSnitchableEvent(pSoldier->ubProfile,NO_PROFILE,fSameGroupOnly,SNITCH_DEATH_RATE,SnitchEvents,ubSnitchEventsCounter);
RememberSnitchableEvent( pSoldier->ubProfile, NO_PROFILE, fSameGroupOnly, SNITCH_DEATH_RATE, snitcheventvector );
}
// check his morale vs. his morale tolerance once/day (ignores buddies!)
if( MercThinksHisMoraleIsTooLow( pSoldier ) )
if ( MercThinksHisMoraleIsTooLow( pSoldier ) )
{
// too low, inform
ubSnitchEventsCounter = RememberSnitchableEvent(pSoldier->ubProfile,NO_PROFILE,fSameGroupOnly,SNITCH_LOW_MORALE,SnitchEvents,ubSnitchEventsCounter);
RememberSnitchableEvent( pSoldier->ubProfile, NO_PROFILE, fSameGroupOnly, SNITCH_LOW_MORALE, snitcheventvector );
}
// check his opinion about player's reputation
if( MercThinksBadReputationTooHigh( pSoldier->ubProfile ) )
if ( MercThinksBadReputationTooHigh( pSoldier->ubProfile ) )
{
// too high, inform
ubSnitchEventsCounter = RememberSnitchableEvent(pSoldier->ubProfile,NO_PROFILE,fSameGroupOnly,SNITCH_REPUTATION,SnitchEvents,ubSnitchEventsCounter);
RememberSnitchableEvent( pSoldier->ubProfile, NO_PROFILE, fSameGroupOnly, SNITCH_REPUTATION, snitcheventvector );
}
// check his opinion about player activity
if( MercThinksPlayerIsInactiveTooLong( pSoldier->ubProfile ) )
if ( MercThinksPlayerIsInactiveTooLong( pSoldier->ubProfile ) )
{
// player inactive, inform
ubSnitchEventsCounter = RememberSnitchableEvent(pSoldier->ubProfile,NO_PROFILE,fSameGroupOnly,SNITCH_PROGRESS,SnitchEvents,ubSnitchEventsCounter);
RememberSnitchableEvent( pSoldier->ubProfile, NO_PROFILE, fSameGroupOnly, SNITCH_PROGRESS, snitcheventvector );
}
// check if player owes him money
if( MercIsOwedTooMuchMoney( pSoldier->ubProfile ) )
if ( MercIsOwedTooMuchMoney( pSoldier->ubProfile ) )
{
// player owes him money, inform
ubSnitchEventsCounter = RememberSnitchableEvent(pSoldier->ubProfile,NO_PROFILE,fSameGroupOnly,SNITCH_OWED_MONEY,SnitchEvents,ubSnitchEventsCounter);
RememberSnitchableEvent( pSoldier->ubProfile, NO_PROFILE, fSameGroupOnly, SNITCH_OWED_MONEY, snitcheventvector );
}
// check if contract is running out, and will not renew
// but only if he hasn't another contract signed, so there's still a chance to renew if player reacts properly
if( ContractIsGoingToExpireSoon(pSoldier) )
if ( ContractIsGoingToExpireSoon( pSoldier ) )
{
if( ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC ) )
if ( (pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC) )
{
// Only do this if they don't want to renew.....
if ( !WillMercRenew( pSoldier, FALSE ) && !(pSoldier->flags.fSignedAnotherContract) )
if ( !(pSoldier->flags.fSignedAnotherContract) && !WillMercRenew( pSoldier, FALSE ) )
{
ubSnitchEventsCounter = RememberSnitchableEvent(pSoldier->ubProfile,NO_PROFILE,fSameGroupOnly,SNITCH_GONNA_QUIT,SnitchEvents,ubSnitchEventsCounter);
RememberSnitchableEvent( pSoldier->ubProfile, NO_PROFILE, fSameGroupOnly, SNITCH_GONNA_QUIT, snitcheventvector );
}
}
}
@@ -1378,104 +1378,106 @@ void HandleSnitchCheck( void )
}
// anv: handle snitches informing player about reasons for morale drops
HandleSnitchesReports( SnitchEvents, ubSnitchEventsCounter );
HandleSnitchesReports( snitcheventvector );
}
void HandleSnitchesReports( SnitchEvent *SnitchEvents, UINT8 ubSnitchEventsCounter )
void HandleSnitchesReports( std::vector<SnitchEvent>& aVec )
{
UINT8 bSnitchID;
SOLDIERTYPE *pSnitch;
BOOLEAN fSleepingSnitch = FALSE;
for( UINT8 bCounter = 0; bCounter < ubSnitchEventsCounter; ++bCounter )
UINT16 size = aVec.size( );
for ( UINT16 bCounter = 0; bCounter < size; ++bCounter )
{
if( SnitchEvents[bCounter].ubEventType != NOBODY )
SnitchEvent& event = aVec[bCounter];
if ( event.ubEventType < NUM_SNITCH_EVENTS )
{
bSnitchID = SnitchEvents[bCounter].ubSnitchID;
pSnitch = FindSoldierByProfileID(bSnitchID,TRUE);
bSnitchID = event.ubSnitchID;
pSnitch = FindSoldierByProfileID( bSnitchID, TRUE );
if( pSnitch == NULL )
if ( pSnitch == NULL )
continue;
if( !(pSnitch->bActive) )
if ( !(pSnitch->bActive) )
continue;
if( pSnitch->flags.fMercAsleep )
if ( pSnitch->flags.fMercAsleep )
fSleepingSnitch = TRUE;
// snitch introduction
if ( fSleepingSnitch )
TacticalCharacterDialogueWithSpecialEvent( pSnitch, 0, DIALOGUE_SPECIAL_EVENT_SLEEP, 0, 0 );
if( fSleepingSnitch )
TacticalCharacterDialogueWithSpecialEvent( FindSoldierByProfileID(bSnitchID,TRUE), 0, DIALOGUE_SPECIAL_EVENT_SLEEP, 0,0 );
SnitchTacticalCharacterDialogue(FindSoldierByProfileID(bSnitchID,TRUE),0,SNITCH_INTRODUCTION,NOBODY,NOBODY);
SnitchTacticalCharacterDialogue( pSnitch, 0, SNITCH_INTRODUCTION, NO_PROFILE, NO_PROFILE );
// process all reports by the same snitch in row
for(UINT8 bCounter2 = bCounter; bCounter2 < ubSnitchEventsCounter; bCounter2++ )
for ( UINT16 bCounter2 = bCounter; bCounter2 < size; ++bCounter2 )
{
if( SnitchEvents[bCounter2].ubSnitchID == bSnitchID )
SnitchEvent& event2 = aVec[bCounter2];
if ( event2.ubEventType < NUM_SNITCH_EVENTS && event2.ubSnitchID == bSnitchID )
{
// check if relevant mercs are well
SOLDIERTYPE *pSoldier, *pOtherSoldier;
pSoldier = FindSoldierByProfileID(SnitchEvents[bCounter2].ubTargetProfile,TRUE);
if( pSoldier == NULL || !(pSoldier->bActive) )
pSoldier = FindSoldierByProfileID( event2.ubTargetProfile, TRUE );
if ( pSoldier == NULL || !(pSoldier->bActive) )
continue;
if( SnitchEvents[bCounter2].ubEventType == SNITCH_HATED_PERSON )
if ( event2.ubEventType == SNITCH_HATED_PERSON )
{
pOtherSoldier = FindSoldierByProfileID(SnitchEvents[bCounter2].ubSecondaryTargetProfile,TRUE);
if( pOtherSoldier == NULL || !(pOtherSoldier->bActive) )
pOtherSoldier = FindSoldierByProfileID( event2.ubSecondaryTargetProfile, TRUE );
if ( pOtherSoldier == NULL || !(pOtherSoldier->bActive) )
continue;
}
// say this info
SnitchTacticalCharacterDialogue(FindSoldierByProfileID(bSnitchID,TRUE),SnitchEvents[bCounter2].ubEventType,SnitchEvents[bCounter2].ubEventType,
SnitchEvents[bCounter2].ubTargetProfile,SnitchEvents[bCounter2].ubSecondaryTargetProfile);
SnitchTacticalCharacterDialogue( pSnitch, event2.ubEventType, event2.ubEventType, event2.ubTargetProfile, event2.ubSecondaryTargetProfile );
// clear info
SnitchEvents[bCounter2].ubEventType = NOBODY;
event2.ubEventType = NUM_SNITCH_EVENTS;
}
}
if( fSleepingSnitch )
TacticalCharacterDialogueWithSpecialEvent( FindSoldierByProfileID(bSnitchID,TRUE), 0, DIALOGUE_SPECIAL_EVENT_SLEEP, 1,0 );
if ( fSleepingSnitch )
TacticalCharacterDialogueWithSpecialEvent( FindSoldierByProfileID( bSnitchID, TRUE ), 0, DIALOGUE_SPECIAL_EVENT_SLEEP, 1, 0 );
// clear info
event.ubEventType = NUM_SNITCH_EVENTS;
}
}
ubSnitchEventsCounter = 0;
}
UINT8 RememberSnitchableEvent( UINT8 ubTargetProfile, UINT8 ubSecondaryTargetProfile, BOOLEAN fSameGroupOnly, UINT8 ubEventType, SnitchEvent SnitchEvents[], UINT8 ubSnitchEventsCounter )
void RememberSnitchableEvent( UINT8 ubTargetProfile, UINT8 ubSecondaryTargetProfile, BOOLEAN fSameGroupOnly, UINT8 ubEventType, std::vector<SnitchEvent>& aVec )
{
INT8 bSnitchID;
UINT16 bSnitchID;
INT16 sSnitchingChance = 0;
UINT8 ubSnitchProfile;
SOLDIERTYPE * pSnitch;
SOLDIERTYPE * pSoldier;
SOLDIERTYPE * pOtherSoldier;
pSoldier = FindSoldierByProfileID(ubTargetProfile,FALSE);
pOtherSoldier = FindSoldierByProfileID(ubSecondaryTargetProfile,FALSE);
// loop through all other mercs
bSnitchID = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
for ( pSnitch = MercPtrs[ bSnitchID ]; bSnitchID <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; bSnitchID++,pSnitch++)
{
// Flugente: we can only store up to 255 (UINT8) snitch events, so get out of here once we reach that! (This shouldn't happen that often anyway, unless you manage to summon all mercenaries in one place)
if ( ubSnitchEventsCounter == 255 )
break;
pSoldier = FindSoldierByProfileID( ubTargetProfile, FALSE );
pOtherSoldier = FindSoldierByProfileID( ubSecondaryTargetProfile, FALSE );
// loop through all other mercs
bSnitchID = gTacticalStatus.Team[gbPlayerNum].bFirstID;
for ( pSnitch = MercPtrs[bSnitchID]; bSnitchID <= gTacticalStatus.Team[gbPlayerNum].bLastID; ++bSnitchID, pSnitch++ )
{
ubSnitchProfile = pSnitch->ubProfile;
// skip past ourselves and all inactive mercs
if (ProfileHasSkillTrait(ubSnitchProfile,SNITCH_NT) &&
if ( ProfileHasSkillTrait( ubSnitchProfile, SNITCH_NT ) &&
ubSnitchProfile != ubTargetProfile && ubSnitchProfile != ubSecondaryTargetProfile
&& pSnitch->bActive && ubSnitchProfile != NO_PROFILE &&
!(pSnitch->bAssignment == IN_TRANSIT ||
pSnitch->bAssignment == ASSIGNMENT_DEAD ||
pSnitch->bAssignment == ASSIGNMENT_POW))
pSnitch->bAssignment == ASSIGNMENT_DEAD ||
pSnitch->bAssignment == ASSIGNMENT_POW) )
{
if (fSameGroupOnly)
if ( fSameGroupOnly )
{
// all we have to check is the group ID
if (pSoldier->ubGroupID != pSnitch->ubGroupID)
if ( pSoldier->ubGroupID != pSnitch->ubGroupID )
{
continue;
}
@@ -1483,27 +1485,27 @@ UINT8 RememberSnitchableEvent( UINT8 ubTargetProfile, UINT8 ubSecondaryTargetPro
else
{
// check to see if the location is the same
if (pSnitch->sSectorX != pSoldier->sSectorX ||
if ( pSnitch->sSectorX != pSoldier->sSectorX ||
pSnitch->sSectorY != pSoldier->sSectorY ||
pSnitch->bSectorZ != pSoldier->bSectorZ)
pSnitch->bSectorZ != pSoldier->bSectorZ )
{
continue;
}
// if snitch is in motion then we don't do anything!
if (pSnitch->ubGroupID != 0 && PlayerIDGroupInMotion( pSnitch->ubGroupID ))
if ( pSnitch->ubGroupID != 0 && PlayerIDGroupInMotion( pSnitch->ubGroupID ) )
{
continue;
}
}
// calculate chances of snitching
// decreased if target doesn't like snitch, increased if snitch doesn't like him
sSnitchingChance = gSkillTraitValues.ubSNTBaseChance;
sSnitchingChance = (INT16)(sSnitchingChance +
SoldierRelation( pSoldier, pSnitch)*gSkillTraitValues.fSNTMercOpinionAboutSnitchBonusModifier+
SoldierRelation( pSnitch, pSoldier)*gSkillTraitValues.fSNTSnitchOpinionAboutMercBonusModifier+
gMercProfiles[ubSnitchProfile].bLeadership*gSkillTraitValues.fSNTSnitchLeadershipBonusModifer);
sSnitchingChance = (INT16)(sSnitchingChance +
SoldierRelation( pSoldier, pSnitch )*gSkillTraitValues.fSNTMercOpinionAboutSnitchBonusModifier +
SoldierRelation( pSnitch, pSoldier )*gSkillTraitValues.fSNTSnitchOpinionAboutMercBonusModifier +
gMercProfiles[ubSnitchProfile].bLeadership*gSkillTraitValues.fSNTSnitchLeadershipBonusModifer);
if ( pSoldier->bAssignment == pSnitch->bAssignment )
{
sSnitchingChance += gSkillTraitValues.bSNTSameAssignmentBonus;
@@ -1512,37 +1514,38 @@ UINT8 RememberSnitchableEvent( UINT8 ubTargetProfile, UINT8 ubSecondaryTargetPro
{
sSnitchingChance += gSkillTraitValues.bSNTSociableMercBonus;
}
if ( gMercProfiles[pSnitch->ubProfile].bCharacterTrait == CHAR_TRAIT_LONER)
if ( gMercProfiles[pSnitch->ubProfile].bCharacterTrait == CHAR_TRAIT_LONER )
{
sSnitchingChance += gSkillTraitValues.bSNTLonerMercBonus;
}
if ( ubEventType == SNITCH_HATED_PERSON )
{
{
if ( gSkillTraitValues.bSNTMercOpinionAboutMercTreshold != HATED_OPINION )
{
sSnitchingChance = (INT16)( sSnitchingChance *
( 1.0 - (FLOAT)( SoldierRelation( pSoldier, pOtherSoldier ) - HATED_OPINION ) /
(FLOAT)( gSkillTraitValues.bSNTMercOpinionAboutMercTreshold - HATED_OPINION ) ) );
sSnitchingChance = (INT16)(sSnitchingChance *
(1.0 - (FLOAT)(SoldierRelation( pSoldier, pOtherSoldier ) - HATED_OPINION) /
(FLOAT)(gSkillTraitValues.bSNTMercOpinionAboutMercTreshold - HATED_OPINION)));
}
}
if ( gMercProfiles[pSnitch->ubProfile].bDisability == DEAF )
{
sSnitchingChance /= 2;
}
sSnitchingChance = max(0, sSnitchingChance);
if( Random(100) < (UINT8)sSnitchingChance )
sSnitchingChance = max( 0, sSnitchingChance );
if ( Random( 100 ) < (UINT8)sSnitchingChance )
{
//information gathered succesfully, remember event to report it later
SnitchEvents[ubSnitchEventsCounter].ubEventType = ubEventType;
SnitchEvents[ubSnitchEventsCounter].ubSnitchID = ubSnitchProfile;
SnitchEvents[ubSnitchEventsCounter].ubTargetProfile = ubTargetProfile;
SnitchEvents[ubSnitchEventsCounter].ubSecondaryTargetProfile = ubSecondaryTargetProfile;
++ubSnitchEventsCounter;
SnitchEvent event;
event.ubEventType = ubEventType;
event.ubSnitchID = ubSnitchProfile;
event.ubTargetProfile = ubTargetProfile;
event.ubSecondaryTargetProfile = ubSecondaryTargetProfile;
aVec.push_back( event );
}
}
}
return ubSnitchEventsCounter;
}
void DailyMoraleUpdate(SOLDIERTYPE *pSoldier)
+2 -2
View File
@@ -154,8 +154,8 @@ extern INT8 GetMoraleModifier( SOLDIERTYPE * pSoldier );
void HourlyMoraleUpdate( void );
void HandleSnitchCheck( void );
void HandleSnitchesReports( SnitchEvent *SnitchEvents, UINT8 ubSnitchEventsCounter );
UINT8 RememberSnitchableEvent( UINT8 ubTargetProfile, UINT8 ubSecondaryTargetProfile, BOOLEAN fSameGroupOnly, UINT8 ubEventType, SnitchEvent SnitchEvents[], UINT8 ubSnitchEventsCounter );
void HandleSnitchesReports( std::vector<SnitchEvent>& aVec );
void RememberSnitchableEvent( UINT8 ubTargetProfile, UINT8 ubSecondaryTargetProfile, BOOLEAN fSameGroupOnly, UINT8 ubEventType, std::vector<SnitchEvent>& aVec );
void DailyMoraleUpdate( SOLDIERTYPE *pSoldier );
void DecayTacticalMoraleModifiers( void );
+224 -246
View File
@@ -3764,7 +3764,7 @@ void HandleNPCTeamMemberDeath( SOLDIERTYPE *pSoldierOld )
}
// Flugente: if this was a prisoner of war, reduce their sector count by 1
if ( pSoldierOld->bSoldierFlagMask & SOLDIER_POW_PRISON )
if ( pSoldierOld->usSoldierFlagMask & SOLDIER_POW_PRISON )
KillOnePrisoner( &SectorInfo[ SECTOR( gWorldSectorX, gWorldSectorY ) ] );
}
else if ( pSoldierOld->bTeam == MILITIA_TEAM )
@@ -6582,13 +6582,18 @@ BOOLEAN GetPlayerControlledPrisonList( std::vector<UINT32>& arSectorIDVector )
{
for(INT16 sY = 1; sY < MAP_WORLD_X - 1; ++sY )
{
// only sectors where there are no ongoing battles or even enemy garrisons are valid for our cause
if ( !SectorOursAndPeaceful( sX, sY, 0 ) )
continue;
// if sector is controlled by enemies, it's not ours (duh!)
if ( StrategicMap[sX + sY * MAP_WORLD_X].fEnemyControlled )
continue;
// only allow sectors which we have controlled at least once - otherwise prisoners might get sent to San Mona prison, even though the player never was there
if ( !SectorInfo[ (UINT8)SECTOR( sX, sY ) ].fSurfaceWasEverPlayerControlled )
continue;
// only sectors where there are no ongoing battles or even enemy garrisons are valid for our cause
// the current sector is ok though - if we call this function, we are currently deciding where to move the current prisoners
if ( NumHostilesInSector( sX, sY, 0 ) && ((sX != gWorldSectorX) || (sY != gWorldSectorY)) )
continue;
// only allow sectors which we have controlled at least once - otherwise prisoners might get sent to San Mona prison, even though the player was never there
if ( !SectorInfo[(UINT8)SECTOR( sX, sY )].fSurfaceWasEverPlayerControlled )
continue;
// Is there a prison in this sector?
for (UINT16 cnt = 0; cnt < NUM_FACILITY_TYPES; ++cnt)
@@ -6612,247 +6617,221 @@ BOOLEAN GetPlayerControlledPrisonList( std::vector<UINT32>& arSectorIDVector )
extern INT32 giReinforcementPool;
// we cannot simply move all prisoners of a sector. It might be a prison we are already using, so we would move all inmates, not just the new ones
UINT16 gusPrisonersSpecial = 0;
UINT16 gusPrisonersElite = 0;
UINT16 gusPrisonersRegular = 0;
UINT16 gusPrisonersAdmin = 0;
void PrisonerMessageBoxCallBack( UINT8 ubExitValue )
{
UINT32 usSectorID = 0;
UINT32 usSectorID = 0;
// Get a list of all available prisons, and create a fitting messagebox
std::vector<UINT32> prisonsectorvector;
if ( GetPlayerControlledPrisonList( prisonsectorvector ) )
{
UINT8 cnt = 1;
std::vector<UINT32>::iterator itend = prisonsectorvector.end();
for (std::vector<UINT32>::iterator it = prisonsectorvector.begin(); it != itend; ++it)
{
if ( ubExitValue == cnt )
{
usSectorID = (*it);
break;
}
// Get a list of all available prisons, and create a fitting messagebox
std::vector<UINT32> prisonsectorvector;
if ( GetPlayerControlledPrisonList( prisonsectorvector ) )
{
UINT8 cnt = 1;
std::vector<UINT32>::iterator itend = prisonsectorvector.end( );
for ( std::vector<UINT32>::iterator it = prisonsectorvector.begin( ); it != itend; ++it )
{
if ( ubExitValue == cnt )
{
usSectorID = (*it);
break;
}
++cnt;
}
}
++cnt;
}
}
// if sector is still not set, then we did not select one - release prisoners
if ( usSectorID == 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_RELEASED] );
}
// if sector is still not set, then we did not select one - release prisoners
if ( usSectorID == 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_RELEASED] );
}
UINT16 prisonerstobemoved = 0;
UINT8 prisonersspecial = 0, prisonerselite = 0, prisonersregular = 0, prisonersadmin = 0;
BOOLEAN success = FALSE;
if ( !gbWorldSectorZ )
{
SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( gWorldSectorX, gWorldSectorY ) ] );
BOOLEAN success = FALSE;
UINT16 prisonerstobemoved = gusPrisonersSpecial + gusPrisonersElite + gusPrisonersRegular + gusPrisonersAdmin;
prisonerstobemoved = GetNumberOfPrisoners( pSectorInfo, &prisonersspecial, &prisonerselite, &prisonersregular, &prisonersadmin );
DeleteAllPrisoners( pSectorInfo );
if ( usSectorID > 0 )
{
SECTORINFO *pPrisonSectorInfo = &(SectorInfo[usSectorID]);
if ( usSectorID > 0)
{
SECTORINFO *pPrisonSectorInfo = &( SectorInfo[ usSectorID ] );
if ( pPrisonSectorInfo )
{
success = TRUE;
if ( pPrisonSectorInfo )
{
success = TRUE;
ChangeNumberOfPrisoners( pPrisonSectorInfo, gusPrisonersSpecial, gusPrisonersElite, gusPrisonersRegular, gusPrisonersAdmin );
ChangeNumberOfPrisoners( pPrisonSectorInfo, prisonersspecial, prisonerselite, prisonersregular, prisonersadmin );
CHAR16 wString[64];
GetShortSectorString( SECTORX( usSectorID ), SECTORY( usSectorID ), wString );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_SENTTOSECTOR], prisonerstobemoved, wString );
}
}
CHAR16 wString[ 64 ];
GetShortSectorString( SECTORX(usSectorID), SECTORY(usSectorID), wString );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_SENTTOSECTOR], prisonerstobemoved, wString );
}
}
}
else
{
UNDERGROUND_SECTORINFO *pSectorInfo = FindUnderGroundSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ );
gusPrisonersSpecial = 0;
gusPrisonersElite = 0;
gusPrisonersRegular = 0;
gusPrisonersAdmin = 0;
prisonerstobemoved = GetNumberOfPrisoners( pSectorInfo, &prisonersspecial, &prisonerselite, &prisonersregular, &prisonersadmin );
DeleteAllPrisoners( pSectorInfo );
if ( usSectorID > 0)
{
SECTORINFO *pPrisonSectorInfo = &( SectorInfo[ usSectorID ] );
if ( pPrisonSectorInfo )
{
success = TRUE;
ChangeNumberOfPrisoners( pPrisonSectorInfo, prisonersspecial, prisonerselite, prisonersregular, prisonersadmin );
CHAR16 wString[ 64 ];
GetShortSectorString( SECTORX(usSectorID), SECTORY(usSectorID), wString );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_SENTTOSECTOR], prisonerstobemoved, wString );
}
}
}
if ( !success )
// send some prisoners back to queen's pool
// there is a chance that escaped prisoners may return to the queen...
giReinforcementPool += (prisonerstobemoved * gGameExternalOptions.ubPrisonerReturntoQueenChance) / 100;
if ( !success )
{
// send some prisoners back to queen's pool
// there is a chance that escaped prisoners may return to the queen...
giReinforcementPool += (prisonerstobemoved * gGameExternalOptions.ubPrisonerReturntoQueenChance) / 100;
}
}
void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
{
SOLDIERTYPE *pTeamSoldier;
INT32 cnt = 0;
UINT8 ubNumPrisoners = 0;
UINT8 ubNumPrisonerAdmin = 0;
UINT8 ubNumPrisonerTroop = 0;
UINT8 ubNumPrisonerElite = 0;
SOLDIERTYPE *pTeamSoldier;
INT32 cnt = 0;
UINT16 ubNumPrisoners = 0;
UINT16 ubNumPrisonerAdmin = 0;
UINT16 ubNumPrisonerTroop = 0;
UINT16 ubNumPrisonerElite = 0;
UINT16 ubNumPrisonerSpecial = 0;
// Check if the battle is won!
// Loop through all mercs and make go
for ( pTeamSoldier = Menptr, cnt = 0; cnt < TOTAL_SOLDIERS; ++pTeamSoldier, ++cnt )
{
// Kill those not already dead.,...
if ( pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bTeam == ENEMY_TEAM )
{
// Only pows that are not dead yet
if ( ( pTeamSoldier->bSoldierFlagMask & SOLDIER_POW ) && !( pTeamSoldier->flags.uiStatusFlags & SOLDIER_DEAD ) )
{
// if we arrive here and the guy has lifepoints < OKLIFE, something is very odd... better take him prisoner and remove him anyway
//if ( pTeamSoldier->stats.bLife > OKLIFE && pTeamSoldier->stats.bLife != 0 )
{
switch ( pTeamSoldier->ubSoldierClass )
{
case SOLDIER_CLASS_ADMINISTRATOR: ubNumPrisonerAdmin++; break;
case SOLDIER_CLASS_ARMY: ubNumPrisonerTroop++; break;
case SOLDIER_CLASS_ELITE: ubNumPrisonerElite++; break;
default:
// if none of the above classes, ignore this one
continue;
break;
}
// Check if the battle is won!
// Loop through all mercs and make go
for ( pTeamSoldier = Menptr, cnt = 0; cnt < TOTAL_SOLDIERS; ++pTeamSoldier, ++cnt )
{
// Kill those not already dead.,...
if ( pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bTeam == ENEMY_TEAM )
{
// Only pows that are not dead yet
if ( (pTeamSoldier->usSoldierFlagMask & SOLDIER_POW) && !(pTeamSoldier->flags.uiStatusFlags & SOLDIER_DEAD) )
{
// if we arrive here and the guy has lifepoints < OKLIFE, something is very odd... better take him prisoner and remove him anyway
//if ( pTeamSoldier->stats.bLife > OKLIFE && pTeamSoldier->stats.bLife != 0 )
{
switch ( pTeamSoldier->ubSoldierClass )
{
case SOLDIER_CLASS_ADMINISTRATOR: ++ubNumPrisonerAdmin; break;
case SOLDIER_CLASS_ARMY: ++ubNumPrisonerTroop; break;
case SOLDIER_CLASS_ELITE: ++ubNumPrisonerElite; break;
default:
// if none of the above classes, ignore this one
continue;
break;
}
// Flugente: campaign stats
gCurrentIncident.AddStat( pTeamSoldier, CAMPAIGNHISTORY_TYPE_PRISONER );
++ubNumPrisoners;
++ubNumPrisoners;
// place items on the floor
INT8 bVisible = 0;
UINT16 usItemFlags = 0;
UINT8 size = pTeamSoldier->inv.size();
for ( UINT8 cnt = 0; cnt < size; ++cnt )
{
OBJECTTYPE* pObj = &( pTeamSoldier->inv[ cnt ] );
// place items on the floor
INT8 bVisible = 0;
UINT16 usItemFlags = 0;
UINT8 size = pTeamSoldier->inv.size( );
for ( UINT8 cnt = 0; cnt < size; ++cnt )
{
OBJECTTYPE* pObj = &(pTeamSoldier->inv[cnt]);
if ( pObj->exists() == true )
{
// Check if it's supposed to be dropped
if ( !( (*pObj).fFlags & OBJECT_UNDROPPABLE ) || pTeamSoldier->bTeam == gbPlayerNum )
{
if ( !(Item[ pObj->usItem ].defaultundroppable ) )
{
//ReduceAmmoDroppedByNonPlayerSoldiers( pTeamSoldier, cnt );
if ( pObj->exists( ) == true )
{
// Check if it's supposed to be dropped
if ( !((*pObj).fFlags & OBJECT_UNDROPPABLE) || pTeamSoldier->bTeam == gbPlayerNum )
{
if ( !(Item[pObj->usItem].defaultundroppable) )
{
//ReduceAmmoDroppedByNonPlayerSoldiers( pTeamSoldier, cnt );
//if this soldier was an enemy
// Kaiden: Added from UB's reveal all items after combat feature!
// HEADROCK HAM B2.8: Now also reveals equipment dropped by militia, if requirement is met.
if( pTeamSoldier->bTeam == ENEMY_TEAM ||
( gGameExternalOptions.ubMilitiaDropEquipment == 2 && pTeamSoldier->bTeam == MILITIA_TEAM ) ||
( gGameExternalOptions.ubMilitiaDropEquipment == 1 && pTeamSoldier->bTeam == MILITIA_TEAM && Menptr[ pTeamSoldier->ubAttackerID ].bTeam != OUR_TEAM ))
{
//add a flag to the item so when all enemies are killed, we can run through and reveal all the enemies items
usItemFlags |= WORLD_ITEM_DROPPED_FROM_ENEMY;
//if this soldier was an enemy
// Kaiden: Added from UB's reveal all items after combat feature!
// HEADROCK HAM B2.8: Now also reveals equipment dropped by militia, if requirement is met.
if ( pTeamSoldier->bTeam == ENEMY_TEAM ||
(gGameExternalOptions.ubMilitiaDropEquipment == 2 && pTeamSoldier->bTeam == MILITIA_TEAM) ||
(gGameExternalOptions.ubMilitiaDropEquipment == 1 && pTeamSoldier->bTeam == MILITIA_TEAM && Menptr[pTeamSoldier->ubAttackerID].bTeam != OUR_TEAM) )
{
//add a flag to the item so when all enemies are killed, we can run through and reveal all the enemies items
usItemFlags |= WORLD_ITEM_DROPPED_FROM_ENEMY;
if ( Item[pObj->usItem].damageable && Item[pObj->usItem].usItemClass != IC_THROWING_KNIFE ) // Madd: drop crappier items from enemies on higher difficulty levels - note the quick fix for throwing knives
{
(*pObj)[0]->data.objectStatus -= (gGameOptions.ubDifficultyLevel - 1) * Random(20);
(*pObj)[0]->data.objectStatus = min(max((*pObj)[0]->data.objectStatus,1),100); // never below 1% or above 100%
if ( Item[pObj->usItem].damageable && Item[pObj->usItem].usItemClass != IC_THROWING_KNIFE ) // Madd: drop crappier items from enemies on higher difficulty levels - note the quick fix for throwing knives
{
(*pObj)[0]->data.objectStatus -= (gGameOptions.ubDifficultyLevel - 1) * Random( 20 );
(*pObj)[0]->data.objectStatus = min( max( (*pObj)[0]->data.objectStatus, 1 ), 100 ); // never below 1% or above 100%
(*pObj)[0]->data.sRepairThreshold = max(1, min(100, ((*pObj)[0]->data.objectStatus + 200)/3 ));
}
}
(*pObj)[0]->data.sRepairThreshold = max( 1, min( 100, ((*pObj)[0]->data.objectStatus + 200) / 3 ) );
}
}
//if(UsingNewAttachmentSystem()==true)
//ReduceAttachmentsOnGunForNonPlayerChars(pTeamSoldier, pObj);
//if(UsingNewAttachmentSystem()==true)
//ReduceAttachmentsOnGunForNonPlayerChars(pTeamSoldier, pObj);
// HEADROCK HAM B2.8: Militia will drop items only if allowed.
if (!(gGameExternalOptions.ubMilitiaDropEquipment == 0 && pTeamSoldier->bTeam == MILITIA_TEAM ) &&
!(gGameExternalOptions.ubMilitiaDropEquipment == 1 && pTeamSoldier->bTeam == MILITIA_TEAM && Menptr[ pTeamSoldier->ubAttackerID ].bTeam == OUR_TEAM ))
{
AddItemToPool( pTeamSoldier->sGridNo, pObj, bVisible , pTeamSoldier->pathing.bLevel, usItemFlags, -1 );
}
}
}
}
}
// HEADROCK HAM B2.8: Militia will drop items only if allowed.
if ( !(gGameExternalOptions.ubMilitiaDropEquipment == 0 && pTeamSoldier->bTeam == MILITIA_TEAM) &&
!(gGameExternalOptions.ubMilitiaDropEquipment == 1 && pTeamSoldier->bTeam == MILITIA_TEAM && Menptr[pTeamSoldier->ubAttackerID].bTeam == OUR_TEAM) )
{
AddItemToPool( pTeamSoldier->sGridNo, pObj, bVisible, pTeamSoldier->pathing.bLevel, usItemFlags, -1 );
}
}
}
}
}
DropKeysInKeyRing( pTeamSoldier, pTeamSoldier->sGridNo, pTeamSoldier->pathing.bLevel, bVisible, FALSE, 0, FALSE );
DropKeysInKeyRing( pTeamSoldier, pTeamSoldier->sGridNo, pTeamSoldier->pathing.bLevel, bVisible, FALSE, 0, FALSE );
// Make team look for items
AllSoldiersLookforItems( TRUE );
if ( pTeamSoldier->bTeam != gbPlayerNum )
// Remove merc!
// ATE: Remove merc slot first - will disappear if no corpse data found!
TacticalRemoveSoldier( pTeamSoldier->ubID );
else
pTeamSoldier->RemoveSoldierFromGridNo( );
if ( pTeamSoldier->bTeam != gbPlayerNum )
// Remove merc!
// ATE: Remove merc slot first - will disappear if no corpse data found!
TacticalRemoveSoldier( pTeamSoldier->ubID );
else
pTeamSoldier->RemoveSoldierFromGridNo( );
// this function updates number of enemies, and also updates groups
ProcessQueenCmdImplicationsOfDeath( pTeamSoldier );
// this function updates number of enemies, and also updates groups
ProcessQueenCmdImplicationsOfDeath( pTeamSoldier );
// Remove as target
RemoveManAsTarget( pTeamSoldier );
}
}
}
}
// Remove as target
RemoveManAsTarget( pTeamSoldier );
}
}
}
}
if ( ubNumPrisoners )
{
// Make team look for items
AllSoldiersLookforItems( TRUE );
if (!bMapZ) // Battle ended Above-ground
{
SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( sMapX, sMapY ) ] );
// Get a list of all available prisons, and create a fitting messagebox
std::vector<UINT32> prisonsectorvector;
if ( GetPlayerControlledPrisonList( prisonsectorvector ) )
{
UINT8 cnt = 0;
std::vector<UINT32>::iterator itend = prisonsectorvector.end( );
for ( std::vector<UINT32>::iterator it = prisonsectorvector.begin( ); it != itend; ++it )
{
UINT32 usSectorID = (*it);
CHAR16 zShortTownIDString[50];
ChangeNumberOfPrisoners(pSectorInfo, 0, ubNumPrisonerElite, ubNumPrisonerTroop, ubNumPrisonerAdmin);
}
else
{
UNDERGROUND_SECTORINFO *pSectorInfo = FindUnderGroundSector( sMapX, sMapY, bMapZ );
GetShortSectorString( SECTORX( usSectorID ), SECTORY( usSectorID ), zShortTownIDString );
ChangeNumberOfPrisoners(pSectorInfo, 0, ubNumPrisonerElite, ubNumPrisonerTroop, ubNumPrisonerAdmin);
}
// Set string for generic button
swprintf( gzUserDefinedButton[cnt++], L"%s", zShortTownIDString );
if ( ubNumPrisoners )
{
// Get a list of all available prisons, and create a fitting messagebox
std::vector<UINT32> prisonsectorvector;
if ( GetPlayerControlledPrisonList( prisonsectorvector ) )
{
UINT8 cnt = 0;
std::vector<UINT32>::iterator itend = prisonsectorvector.end();
for (std::vector<UINT32>::iterator it = prisonsectorvector.begin(); it != itend; ++it)
{
UINT32 usSectorID = (*it);
CHAR16 zShortTownIDString[ 50 ];
if ( cnt >= 7 )
break;
}
GetShortSectorString( SECTORX(usSectorID), SECTORY(usSectorID), zShortTownIDString );
for ( ; cnt < 8; ++cnt )
{
wcscpy( gzUserDefinedButton[cnt], TacticalStr[PRISONER_LETGO_STR] );
}
// Set string for generic button
swprintf( gzUserDefinedButton[ cnt++ ], L"%s", zShortTownIDString );
// remember all prisoners...
gusPrisonersSpecial = ubNumPrisonerSpecial;
gusPrisonersElite = ubNumPrisonerElite;
gusPrisonersRegular = ubNumPrisonerTroop;
gusPrisonersAdmin = ubNumPrisonerAdmin;
if ( cnt >= 7 )
break;
}
for ( ; cnt < 8; ++cnt)
{
wcscpy( gzUserDefinedButton[ cnt ], TacticalStr[ PRISONER_LETGO_STR ] );
}
DoMessageBox( MSG_BOX_BASIC_MEDIUM_BUTTONS, TacticalStr[ PRISONER_DECIDE_STR ], GAME_SCREEN, MSG_BOX_FLAG_GENERIC_EIGHT_BUTTONS, PrisonerMessageBoxCallBack, NULL );
}
else
DoMessageBox( MSG_BOX_BASIC_STYLE, TacticalStr[ PRISONER_NO_PRISONS_STR ], GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_OK, NULL, NULL );
}
DoMessageBox( MSG_BOX_BASIC_MEDIUM_BUTTONS, TacticalStr[PRISONER_DECIDE_STR], GAME_SCREEN, MSG_BOX_FLAG_GENERIC_EIGHT_BUTTONS, PrisonerMessageBoxCallBack, NULL );
}
else
DoMessageBox( MSG_BOX_BASIC_STYLE, TacticalStr[PRISONER_NO_PRISONS_STR], GAME_SCREEN, (UINT8)MSG_BOX_FLAG_OK, NULL, NULL );
}
}
// Flugente: for campaign stats, we want to know how many people were wounded.
@@ -6860,22 +6839,22 @@ void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
// Once combat ends, we count all these flags and remove them
void UpdateWoundedFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
{
SOLDIERTYPE *pSoldier;
INT32 cnt = 0;
UINT8 ubNumPrisoners = 0;
UINT8 ubNumPrisonerAdmin = 0;
UINT8 ubNumPrisonerTroop = 0;
UINT8 ubNumPrisonerElite = 0;
SOLDIERTYPE *pSoldier;
INT32 cnt = 0;
UINT8 ubNumPrisoners = 0;
UINT8 ubNumPrisonerAdmin = 0;
UINT8 ubNumPrisonerTroop = 0;
UINT8 ubNumPrisonerElite = 0;
// Check if the battle is won!
// Loop through all mercs and make go
for ( pSoldier = Menptr, cnt = 0; cnt < TOTAL_SOLDIERS; ++pSoldier, ++cnt )
{
// Kill those not already dead.,...
if ( pSoldier->bActive && pSoldier->bInSector && pSoldier->bSoldierFlagMask & SOLDIER_FRESHWOUND )
{
// Check if the battle is won!
// Loop through all mercs and make go
for ( pSoldier = Menptr, cnt = 0; cnt < TOTAL_SOLDIERS; ++pSoldier, ++cnt )
{
// Kill those not already dead.,...
if ( pSoldier->bActive && pSoldier->bInSector && pSoldier->usSoldierFlagMask & SOLDIER_FRESHWOUND )
{
// remove flag, so we are not counted again
pSoldier->bSoldierFlagMask &= ~SOLDIER_FRESHWOUND;
pSoldier->usSoldierFlagMask &= ~SOLDIER_FRESHWOUND;
// the dead count as dead, not as wounded
if ( pSoldier->stats.bLife <= 0 )
@@ -6883,27 +6862,27 @@ void UpdateWoundedFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
// Flugente: campaign stats
gCurrentIncident.AddStat( pSoldier, CAMPAIGNHISTORY_TYPE_WOUND );
}
}
}
}
}
void RemoveStaticEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
{
if (!bMapZ) // Battle ended Above-ground
{
SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( sMapX, sMapY ) ] );
if ( !bMapZ ) // Battle ended Above-ground
{
SECTORINFO *pSectorInfo = &(SectorInfo[SECTOR( sMapX, sMapY )]);
pSectorInfo->ubNumAdmins = pSectorInfo->ubNumTroops = pSectorInfo->ubNumElites = 0;
pSectorInfo->ubAdminsInBattle = pSectorInfo->ubTroopsInBattle = pSectorInfo->ubElitesInBattle = 0;
}
else
{
UNDERGROUND_SECTORINFO *pSectorInfo;
pSectorInfo->ubNumAdmins = pSectorInfo->ubNumTroops = pSectorInfo->ubNumElites = 0;
pSectorInfo->ubAdminsInBattle = pSectorInfo->ubTroopsInBattle = pSectorInfo->ubElitesInBattle = 0;
}
else
{
UNDERGROUND_SECTORINFO *pSectorInfo;
pSectorInfo = FindUnderGroundSector( sMapX, sMapY, bMapZ );
pSectorInfo->ubNumAdmins = pSectorInfo->ubNumTroops = pSectorInfo->ubNumElites = 0;
pSectorInfo->ubAdminsInBattle = pSectorInfo->ubTroopsInBattle = pSectorInfo->ubElitesInBattle = 0;
}
pSectorInfo = FindUnderGroundSector( sMapX, sMapY, bMapZ );
pSectorInfo->ubNumAdmins = pSectorInfo->ubNumTroops = pSectorInfo->ubNumElites = 0;
pSectorInfo->ubAdminsInBattle = pSectorInfo->ubTroopsInBattle = pSectorInfo->ubElitesInBattle = 0;
}
}
@@ -7819,7 +7798,7 @@ UINT8 NumCapableEnemyInSector( )
else
{
// Flugente: captured soldiers also do not count
if ( pTeamSoldier->bSoldierFlagMask & SOLDIER_POW )
if ( pTeamSoldier->usSoldierFlagMask & SOLDIER_POW )
continue;
// Check for any more badguys
@@ -8734,7 +8713,6 @@ BOOLEAN ProcessImplicationsOfPCAttack( SOLDIERTYPE * pSoldier, SOLDIERTYPE ** pp
SetSoldierNeutral( pTarget );
}
}
}
}
@@ -8864,7 +8842,7 @@ BOOLEAN ProcessImplicationsOfPCAttack( SOLDIERTYPE * pSoldier, SOLDIERTYPE ** pp
else if ( pTarget->bTeam == gbPlayerNum && !(gTacticalStatus.uiFlags & INCOMBAT) )
{
// Flugente: if we are on the same team adn are currently stealing (accessing inventory) from a teammember, do NOT retaliate
if ( AllowedToStealFromTeamMate(pSoldier->ubID, pTarget->ubID) && pSoldier->bSoldierFlagMask & SOLDIER_ACCESSTEAMMEMBER )
if ( AllowedToStealFromTeamMate(pSoldier->ubID, pTarget->ubID) && pSoldier->usSoldierFlagMask & SOLDIER_ACCESSTEAMMEMBER )
{
}
@@ -10276,10 +10254,10 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
if( pSoldier->bActive && ( pSoldier->sSectorX == gWorldSectorX ) && ( pSoldier->sSectorY == gWorldSectorY ) && ( pSoldier->bSectorZ == gbWorldSectorZ) )
{
// if we are disguised as a civilian, the enemy does not take us into the equation - he does not consider us
if ( pSoldier->bSoldierFlagMask & SOLDIER_COVERT_CIV )
if ( pSoldier->usSoldierFlagMask & SOLDIER_COVERT_CIV )
;
// if we are disguised as a soldier, the enemy counts us on HIS team
else if ( pSoldier->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
else if ( pSoldier->usSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
enemysidestrength += pSoldier->GetSurrenderStrength();
else
// player side counts double, to put more emphasize on overwhelming the enemy with mercs and not just spamming militia
@@ -10352,7 +10330,7 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
// only if not dying, and if not a NPC (Mike...)
if( pSoldier->stats.bLife >= OKLIFE && pSoldier->ubProfile == NO_PROFILE )
{
pSoldier->bSoldierFlagMask |= SOLDIER_POW;
pSoldier->usSoldierFlagMask |= SOLDIER_POW;
// Remove as target
RemoveManAsTarget( pSoldier );
@@ -10365,7 +10343,7 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_REFUSE_SURRENDER] );
// if asking for surrender while undercover and the enemy refuses, he learns who you are, so he uncovers you
if ( gusSelectedSoldier != NOBODY && MercPtrs[ gusSelectedSoldier ]->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( gusSelectedSoldier != NOBODY && MercPtrs[ gusSelectedSoldier ]->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{
MercPtrs[ gusSelectedSoldier ]->LooseDisguise();
@@ -10520,7 +10498,7 @@ void TeamRestock(UINT8 bTeam)
pSoldier->inv = createstruct.Inv;
// we took new gear, so we can drop it again
pSoldier->bSoldierFlagMask &= ~SOLDIER_EQUIPMENT_DROPPED;
pSoldier->usSoldierFlagMask &= ~SOLDIER_EQUIPMENT_DROPPED;
}
}
}
@@ -10705,7 +10683,7 @@ UINT8 HighestEnemyOfficersInSector( BOOL& aType )
{
if ( pSoldier->bActive && pSoldier->bInSector && pSoldier->stats.bLife > 0 )
{
if ( pSoldier->bSoldierFlagMask & SOLDIER_ENEMY_OFFICER )
if ( pSoldier->usSoldierFlagMask & SOLDIER_ENEMY_OFFICER )
{
// officers with double squadleader trait are captains, otherwise lieutnant
aType = max( aType, NUM_SKILL_TRAITS( pSoldier, SQUADLEADER_NT) );
+3 -3
View File
@@ -903,7 +903,7 @@ BOOLEAN TurnSoldierIntoCorpse( SOLDIERTYPE *pSoldier, BOOLEAN fRemoveMerc, BOOLE
}
// if zombie and headshots are required, forbid rising if killed by headshot
if ( pSoldier->IsZombie() && gGameExternalOptions.fZombieOnlyHeadShotsPermanentlyKill && (pSoldier->bSoldierFlagMask & SOLDIER_HEADSHOT) )
if ( pSoldier->IsZombie() && gGameExternalOptions.fZombieOnlyHeadShotsPermanentlyKill && (pSoldier->usSoldierFlagMask & SOLDIER_HEADSHOT) )
Corpse.usFlags |= ROTTING_CORPSE_NEVER_RISE_AGAIN;
// Flugente: copy name of soldier...
@@ -912,10 +912,10 @@ BOOLEAN TurnSoldierIntoCorpse( SOLDIERTYPE *pSoldier, BOOLEAN fRemoveMerc, BOOLE
#endif
// if this soldier's uniform was damaged (gunfire, blade attacks, explosions) then don't allow to take the uniform. We can't stay hidden if we're covered in blood :-)
if ( pSoldier->bSoldierFlagMask & SOLDIER_DAMAGED_VEST )
if ( pSoldier->usSoldierFlagMask & SOLDIER_DAMAGED_VEST )
Corpse.usFlags |= ROTTING_CORPSE_NO_VEST;
if ( pSoldier->bSoldierFlagMask & SOLDIER_DAMAGED_PANTS )
if ( pSoldier->usSoldierFlagMask & SOLDIER_DAMAGED_PANTS )
Corpse.usFlags |= ROTTING_CORPSE_NO_PANTS;
// Determine corpse type!
+4 -4
View File
@@ -1199,7 +1199,7 @@ BOOLEAN InternalAddSoldierToSector( UINT8 ubID, BOOLEAN fCalculateDirection, BOO
}
// Flugente: campaign stats
if ( pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP )
if ( pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP )
gCurrentIncident.usIncidentFlags |= INCIDENT_AIRDROP;
// problem: soldiers already present in a sector have ubStrategicInsertionCode = 0, which is INSERTION_CODE_NORTH - but they don't actually come from north, as they are already present
@@ -1234,7 +1234,7 @@ BOOLEAN InternalAddSoldierToSector( UINT8 ubID, BOOLEAN fCalculateDirection, BOO
}
// add this flag whenever we enter strategically enter a sector (= we attack a sector)
pSoldier->bSoldierFlagMask |= SOLDIER_ASSAULT_BONUS;
pSoldier->usSoldierFlagMask |= SOLDIER_ASSAULT_BONUS;
// Override calculated direction if we were told to....
if ( pSoldier->ubInsertionDirection > 100 )
@@ -1530,9 +1530,9 @@ void AddSoldierToSectorGridNo( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubDir
}
// Flugente: if we are airdropping, center screen on the action and remove soldier initially. He will be dropped into the sector by the helicopter
if ( pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP )
if ( pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP )
{
pSoldier->bSoldierFlagMask &= ~SOLDIER_AIRDROP;
pSoldier->usSoldierFlagMask &= ~SOLDIER_AIRDROP;
if ( gGameExternalOptions.ubSkyriderHotLZ == 3 )
{
+83 -71
View File
@@ -2266,9 +2266,9 @@ void SOLDIERTYPE::CalcNewActionPoints( void )
this->bInitialActionPoints = this->bActionPoints;
// Flugente: due to changes and bugs with enemy reinforcements, we now set a flag if a soldier should start with no APs, and act here accordingly
if ( this->bSoldierFlagMask & SOLDIER_NO_AP )
if ( this->usSoldierFlagMask & SOLDIER_NO_AP )
{
this->bSoldierFlagMask &= ~SOLDIER_NO_AP;
this->usSoldierFlagMask &= ~SOLDIER_NO_AP;
this->bInitialActionPoints = 0;
this->bActionPoints = 0;
@@ -6505,9 +6505,9 @@ void SoldierGotHitGunFire( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 sD
// Flugente: if hit in legs or torso, blood will be on our uniform - parts of the clothes cannot be worn anymore
if ( ubHitLocation == AIM_SHOT_TORSO )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_VEST;
pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_VEST;
else if ( ubHitLocation == AIM_SHOT_LEGS )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_PANTS;
pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_PANTS;
// IF HERE AND GUY IS DEAD, RETURN!
if ( pSoldier->flags.uiStatusFlags & SOLDIER_DEAD )
@@ -6557,9 +6557,9 @@ void SoldierGotHitExplosion( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16
{
// Flugente: if hit in legs or torso, blood will be on our uniform - parts of the clothes cannot be worn anymore
if ( ubHitLocation == AIM_SHOT_TORSO )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_VEST;
pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_VEST;
else if ( ubHitLocation == AIM_SHOT_LEGS )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_PANTS;
pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_PANTS;
INT32 sNewGridNo;
@@ -6731,9 +6731,9 @@ void SoldierGotHitBlade( SOLDIERTYPE *pSoldier, UINT16 usWeaponIndex, INT16 sDam
{
// Flugente: if hit in legs or torso, blood will be on our uniform - parts of the clothes cannot be worn anymore
if ( ubHitLocation == AIM_SHOT_TORSO )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_VEST;
pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_VEST;
else if ( ubHitLocation == AIM_SHOT_LEGS )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_PANTS;
pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_PANTS;
// IF HERE AND GUY IS DEAD, RETURN!
if ( pSoldier->flags.uiStatusFlags & SOLDIER_DEAD )
@@ -7171,7 +7171,7 @@ void SOLDIERTYPE::ChangeSoldierStance( UINT8 ubDesiredStance )
this->EVENT_InitNewSoldierAnim( usNewState, 0 , FALSE );
}
this->bSoldierFlagMask |= SOLDIER_REDOFLASHLIGHT;
this->usSoldierFlagMask |= SOLDIER_REDOFLASHLIGHT;
}
void SOLDIERTYPE::EVENT_InternalSetSoldierDestination( UINT16 usNewDirection, BOOLEAN fFromMove, UINT16 usAnimState )
@@ -9872,7 +9872,7 @@ UINT8 SOLDIERTYPE::SoldierTakeDamage( INT8 bHeight, INT16 sLifeDeduct, INT16 sPo
// Flugente: note we received a fresh wound
if ( sLifeDeduct > 0 )
this->bSoldierFlagMask |= SOLDIER_FRESHWOUND;
this->usSoldierFlagMask |= SOLDIER_FRESHWOUND;
// Calculate damage to our items if from an explosion!
if ( ubReason == TAKE_DAMAGE_EXPLOSION || ubReason == TAKE_DAMAGE_STRUCTURE_EXPLOSION)
@@ -12530,7 +12530,7 @@ void SOLDIERTYPE::EVENT_SoldierBeginFirstAid( INT32 sGridNo, UINT8 ubDirection )
else if ( !pTSoldier->aiData.bNeutral && pTSoldier->stats.bLife >= OKLIFE && pTSoldier->bSide != this->bSide )
*/
// Flugente: people we captured don't refuse to be bandaged
if ( !pTSoldier->aiData.bNeutral && pTSoldier->stats.bLife >= OKLIFE && pTSoldier->bSide != this->bSide && !(pTSoldier->bSoldierFlagMask & SOLDIER_POW) )
if ( !pTSoldier->aiData.bNeutral && pTSoldier->stats.bLife >= OKLIFE && pTSoldier->bSide != this->bSide && !(pTSoldier->usSoldierFlagMask & SOLDIER_POW) )
{
fRefused = TRUE;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, Message[ STR_REFUSE_FIRSTAID ] );
@@ -15350,7 +15350,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
// if we don't have the Flag: not covert
// important: no messages up to this point. the function will get called a lot, up to this point there is nothing unusual
if ( !(this->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) ) )
if ( !(this->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) ) )
return FALSE;
// if we are in a suspicious activity: not covert
@@ -15375,7 +15375,6 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
this->usAnimState == PUNCH_BREATH ||
this->usAnimState == KICK_DOOR ||
this->usAnimState == CUTTING_FENCE ||
this->usAnimState == THROW_KNIFE ||
this->usAnimState == PLANT_BOMB ||
this->usAnimState == USE_REMOTE ||
this->usAnimState == STEAL_ITEM ||
@@ -15389,7 +15388,13 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
this->usAnimState == FOCUSED_STAB ||
this->usAnimState == HTH_KICK ||
this->usAnimState == FOCUSED_HTH_KICK ||
this->usAnimState == LONG_JUMP
this->usAnimState == LONG_JUMP ||
this->usAnimState == THROW_GRENADE_STANCE ||
this->usAnimState == LOB_GRENADE_STANCE ||
this->usAnimState == THROW_ITEM ||
this->usAnimState == LOB_ITEM ||
this->usAnimState == THROW_ITEM_CROUCHED ||
this->usAnimState == SHOOT_ROCKET_CROUCHED
)
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_ACTIVITIES], this->GetName() );
@@ -15397,14 +15402,14 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
}
// if we are trying to dress like a civilian, but aren't sucessful: not covert
if ( this->bSoldierFlagMask & SOLDIER_COVERT_CIV && !(this->LooksLikeACivilian()) )
if ( this->usSoldierFlagMask & SOLDIER_COVERT_CIV && !(this->LooksLikeACivilian()) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NO_CIV], this->GetName() );
return FALSE;
}
// if we are trying to dress like a soldier, but aren't sucessful: not covert
if ( this->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER && !(this->LooksLikeASoldier()) )
if ( this->usSoldierFlagMask & SOLDIER_COVERT_SOLDIER && !(this->LooksLikeASoldier()) )
{
return FALSE;
}
@@ -15431,7 +15436,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
return FALSE;
}
if ( this->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER && GetDrunkLevel( this ) != SOBER )
if ( this->usSoldierFlagMask & SOLDIER_COVERT_SOLDIER && GetDrunkLevel( this ) != SOBER )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_DRUNKEN_SOLDIER], this->GetName() );
return FALSE;
@@ -15449,7 +15454,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
return FALSE;
}
if ( this->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
if ( this->usSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOO_CLOSE], this->GetName() );
return FALSE;
@@ -15460,7 +15465,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
default:
// without the covert ops skill, we can only dress up as civilians. We will be discovered if we get too close to the enemy
// exception: special NPCs and EPCs can still get close (the Kulbas, for example, ARE civilians, so they apply)
if ( (this->bSoldierFlagMask & SOLDIER_COVERT_NPC_SPECIAL) == 0 )
if ( (this->usSoldierFlagMask & SOLDIER_COVERT_NPC_SPECIAL) == 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOO_CLOSE], this->GetName() );
return FALSE;
@@ -15469,7 +15474,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
}
// if we are a soldier, elites can uncover us if we are VERY close, and more experienced
if ( this->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER && gSkillTraitValues.fCOElitesDetectNextTile && distance < 2 && EffectiveExpLevel(pSoldier) > EffectiveExpLevel(this) + covertlevel )
if ( this->usSoldierFlagMask & SOLDIER_COVERT_SOLDIER && gSkillTraitValues.fCOElitesDetectNextTile && distance < 2 && EffectiveExpLevel(pSoldier) > EffectiveExpLevel(this) + covertlevel )
{
if ( pSoldier->ubSoldierClass == SOLDIER_CLASS_ELITE )
{
@@ -15479,7 +15484,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
}
}
if ( this->bSoldierFlagMask & SOLDIER_COVERT_CIV )
if ( this->usSoldierFlagMask & SOLDIER_COVERT_CIV )
{
// civilians are suspicious if they are found in certain sectors. Especially at night
// sector specific value:
@@ -15553,7 +15558,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
}
}
if ( this->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
if ( this->usSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
{
// if our equipment is too good, that is suspicious... not covert!
if ( this->EquipmentTooGood( (distance < discoverrange) ) )
@@ -15575,7 +15580,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
// even as a soldier, we will be caught around fresh corpses
// assassins will not be uncovered around corpses, as the AI cannot willingly evade them... one could 'ward' against assassins by surrounding yourself with fresh corpses
if (distance < gSkillTraitValues.sCOCloseDetectionRangeSoldierCorpse && !(this->bSoldierFlagMask & SOLDIER_ASSASSIN) )
if (distance < gSkillTraitValues.sCOCloseDetectionRangeSoldierCorpse && !(this->usSoldierFlagMask & SOLDIER_ASSASSIN) )
{
// check wether we are around a fresh corpse - this will make us much more suspicious
// I deem this necessary, to avoid cheap exploits by nefarious players :-)
@@ -15647,7 +15652,7 @@ BOOLEAN SOLDIERTYPE::RecognizeAsCombatant(UINT8 ubTargetID)
#endif
// not in covert mode: we recognize him
if ( (pSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER)) == 0 )
if ( (pSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER)) == 0 )
return TRUE;
// neutral characters just dont care
@@ -15688,7 +15693,7 @@ BOOLEAN SOLDIERTYPE::RecognizeAsCombatant(UINT8 ubTargetID)
if ( !pSoldier->SeemsLegit(this->ubID) )
{
// aha, he/she's a spy! Blow cover
if ( pSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( pSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{
pSoldier->LooseDisguise();
@@ -15719,7 +15724,7 @@ BOOLEAN SOLDIERTYPE::RecognizeAsCombatant(UINT8 ubTargetID)
void SOLDIERTYPE::LooseDisguise( void )
{
// loose any covert flags
this->bSoldierFlagMask &= ~(SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER);
this->usSoldierFlagMask &= ~(SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER);
// rehandle sight for everybody
SOLDIERTYPE* pSoldier;
@@ -15738,15 +15743,15 @@ void SOLDIERTYPE::LooseDisguise( void )
void SOLDIERTYPE::Strip()
{
// if covert, loose that ability
if ( this->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( this->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{
LooseDisguise();
}
// if already not covert, take off clothes
else if ( this->bSoldierFlagMask & (SOLDIER_NEW_VEST|SOLDIER_NEW_PANTS) )
else if ( this->usSoldierFlagMask & (SOLDIER_NEW_VEST|SOLDIER_NEW_PANTS) )
{
// if we have undamaged clothes, spawn them, the graphci will be removed anyway
if ( (this->bSoldierFlagMask & SOLDIER_NEW_VEST) && !(this->bSoldierFlagMask & SOLDIER_DAMAGED_VEST) )
if ( (this->usSoldierFlagMask & SOLDIER_NEW_VEST) && !(this->usSoldierFlagMask & SOLDIER_DAMAGED_VEST) )
{
UINT16 vestitem = 0;
if ( GetFirstClothesItemWithSpecificData(&vestitem, this->VestPal, "blank") )
@@ -15759,7 +15764,7 @@ void SOLDIERTYPE::Strip()
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NO_CLOTHES_ITEM] );
}
if ( (this->bSoldierFlagMask & SOLDIER_NEW_PANTS) && !(this->bSoldierFlagMask & SOLDIER_DAMAGED_PANTS) )
if ( (this->usSoldierFlagMask & SOLDIER_NEW_PANTS) && !(this->usSoldierFlagMask & SOLDIER_DAMAGED_PANTS) )
{
UINT16 pantsitem = 0;
if ( GetFirstClothesItemWithSpecificData(&pantsitem, "blank", this->PantsPal) )
@@ -15773,7 +15778,7 @@ void SOLDIERTYPE::Strip()
}
// loose any clothes flags
this->bSoldierFlagMask &= ~(SOLDIER_NEW_VEST|SOLDIER_NEW_PANTS);
this->usSoldierFlagMask &= ~(SOLDIER_NEW_VEST|SOLDIER_NEW_PANTS);
// show our true colours
UINT16 usPaletteAnimSurface = LoadSoldierAnimationSurface( this, this->usAnimState );
@@ -15791,7 +15796,7 @@ void SOLDIERTYPE::Strip()
SET_PALETTEREP_ID ( this->VestPal, pProfile->VEST );
SET_PALETTEREP_ID ( this->PantsPal, pProfile->PANTS );
}
else if ( this->bSoldierFlagMask & SOLDIER_ASSASSIN )
else if ( this->usSoldierFlagMask & SOLDIER_ASSASSIN )
{
SET_PALETTEREP_ID( this->VestPal, gUniformColors[ UNIFORM_ENEMY_ELITE ].vest );
SET_PALETTEREP_ID( this->PantsPal, gUniformColors[ UNIFORM_ENEMY_ELITE ].pants );
@@ -15869,7 +15874,7 @@ BOOLEAN SOLDIERTYPE::CanProcessPrisoners()
UINT32 SOLDIERTYPE::GetSurrenderStrength()
{
if( this->stats.bLife < OKLIFE || this->flags.fMercAsleep || this->bCollapsed || (this->bSoldierFlagMask & SOLDIER_POW) )
if( this->stats.bLife < OKLIFE || this->flags.fMercAsleep || this->bCollapsed || (this->usSoldierFlagMask & SOLDIER_POW) )
return 0;
UINT32 value = 100 + 10 * EffectiveExpLevel( this ) + EffectiveStrength( this, FALSE ) + 3 * EffectiveMarksmanship( this) + EffectiveLeadership( this) / 4;
@@ -15908,9 +15913,9 @@ BOOLEAN SOLDIERTYPE::FreePrisoner()
// if he is captured, free him!
// note that this would also work for prisoner civs that we spawn in our prisons. All needed would be commanding the AI to get there
if ( pSoldier->bSoldierFlagMask & (SOLDIER_POW|SOLDIER_POW_PRISON) )
if ( pSoldier->usSoldierFlagMask & (SOLDIER_POW|SOLDIER_POW_PRISON) )
{
pSoldier->bSoldierFlagMask &= ~(SOLDIER_POW|SOLDIER_POW_PRISON);
pSoldier->usSoldierFlagMask &= ~(SOLDIER_POW|SOLDIER_POW_PRISON);
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_X_FREES_Y], this->GetName(), pSoldier->GetName() );
@@ -15949,7 +15954,7 @@ BOOLEAN SOLDIERTYPE::IsAssassin()
return TRUE;
// there can be non-NPC assassins too
if ( this->bSoldierFlagMask & SOLDIER_ASSASSIN )
if ( this->usSoldierFlagMask & SOLDIER_ASSASSIN )
return TRUE;
return FALSE;
@@ -16242,11 +16247,11 @@ BOOLEAN SOLDIERTYPE::UpdateMultiTurnAction()
void SOLDIERTYPE::DropSectorEquipment()
{
// not if we already dropped the gear
if ( this->bSoldierFlagMask & SOLDIER_EQUIPMENT_DROPPED )
if ( this->usSoldierFlagMask & SOLDIER_EQUIPMENT_DROPPED )
return;
// set marker: we are about to drop our gear
this->bSoldierFlagMask |= SOLDIER_EQUIPMENT_DROPPED;
this->usSoldierFlagMask |= SOLDIER_EQUIPMENT_DROPPED;
OBJECTTYPE* pObj = NULL;
UINT8 size = this->inv.size();
@@ -16770,13 +16775,13 @@ void SOLDIERTYPE::AddDrugValues(UINT8 uDrugType, UINT8 usEffect, UINT8 usTravelR
this->drugs.bDrugSideEffectRate[ uDrugType ] = 0;
// set flag: we are on drugs
this->bSoldierFlagMask |= SOLDIER_DRUGGED;
this->usSoldierFlagMask |= SOLDIER_DRUGGED;
}
void SOLDIERTYPE::HandleFlashLights()
{
// no more need to redo this check
this->bSoldierFlagMask &= ~SOLDIER_REDOFLASHLIGHT;
this->usSoldierFlagMask &= ~SOLDIER_REDOFLASHLIGHT;
// we must be active and in a sector (not travelling) in a valid position
if ( !bActive || !bInSector || TileIsOutOfBounds(this->sGridNo) )
@@ -16790,11 +16795,11 @@ void SOLDIERTYPE::HandleFlashLights()
BOOLEAN fLightChanged = FALSE;
// remove existing lights we 'own'
if ( this->bSoldierFlagMask & SOLDIER_LIGHT_OWNER )
if ( this->usSoldierFlagMask & SOLDIER_LIGHT_OWNER )
{
RemovePersonalLights( this->ubID );
this->bSoldierFlagMask &= ~SOLDIER_LIGHT_OWNER;
this->usSoldierFlagMask &= ~SOLDIER_LIGHT_OWNER;
fLightChanged = TRUE;
}
@@ -16866,7 +16871,7 @@ void SOLDIERTYPE::HandleFlashLights()
}
// take note: we own a light source
this->bSoldierFlagMask |= SOLDIER_LIGHT_OWNER;
this->usSoldierFlagMask |= SOLDIER_LIGHT_OWNER;
fLightChanged = TRUE;
}
@@ -17011,10 +17016,10 @@ INT16 SOLDIERTYPE::GetAPBonus()
{
INT16 bonus = 0;
if ( this->bSoldierFlagMask & SOLDIER_AIRDROP_TURN )
if ( this->usSoldierFlagMask & SOLDIER_AIRDROP_TURN )
bonus += this->GetBackgroundValue(BG_AIRDROP);
if ( this->bSoldierFlagMask & SOLDIER_ASSAULT_BONUS )
if ( this->usSoldierFlagMask & SOLDIER_ASSAULT_BONUS )
bonus += this->GetBackgroundValue(BG_ASSAULT);
UINT8 ubSector = (UINT8)SECTOR( this->sSectorX, this->sSectorY );
@@ -17113,7 +17118,7 @@ INT16 SOLDIERTYPE::GetInterruptModifier( UINT8 usDistance )
bonus -= 3;
// if we are airdropping and do not have the 'airdrop' background, we receive a substantial malus to our interrupt level. Roping down takes a lot of attention
if ( this->bSoldierFlagMask & SOLDIER_AIRDROP_TURN && (this->GetBackgroundValue(BG_AIRDROP) <= 0) )
if ( this->usSoldierFlagMask & SOLDIER_AIRDROP_TURN && (this->GetBackgroundValue(BG_AIRDROP) <= 0) )
bonus -= 8;
return bonus;
@@ -17122,7 +17127,7 @@ INT16 SOLDIERTYPE::GetInterruptModifier( UINT8 usDistance )
void SOLDIERTYPE::SoldierPropertyUpkeep()
{
// these effects last only one turn
this->bSoldierFlagMask &= ~(SOLDIER_AIRDROP_TURN|SOLDIER_ASSAULT_BONUS|SOLDIER_RAISED_REDALERT);
this->usSoldierFlagMask &= ~(SOLDIER_AIRDROP_TURN|SOLDIER_ASSAULT_BONUS|SOLDIER_RAISED_REDALERT);
if ( HasBackgroundFlag( BACKGROUND_EXP_UNDERGROUND ) && this->bSectorZ )
++bExtraExpLevel;
@@ -17152,9 +17157,9 @@ void SOLDIERTYPE::SoldierPropertyUpkeep()
}
// if soldier was seen this turn, increase his observed counter
if ( this->bSoldierFlagMask & SOLDIER_ENEMY_OBSERVEDTHISTURN )
if ( this->usSoldierFlagMask & SOLDIER_ENEMY_OBSERVEDTHISTURN )
{
this->bSoldierFlagMask &= ~SOLDIER_ENEMY_OBSERVEDTHISTURN;
this->usSoldierFlagMask &= ~SOLDIER_ENEMY_OBSERVEDTHISTURN;
++usSkillCounter[SOLDIER_COUNTER_ROLE_OBSERVED];
}
@@ -17162,9 +17167,9 @@ void SOLDIERTYPE::SoldierPropertyUpkeep()
// if there is a combat going and we are in sector, note that in the battle report
if ( this->bInSector && (gTacticalStatus.uiFlags & INCOMBAT || gTacticalStatus.fEnemyInSector) )
{
if ( !(this->bSoldierFlagMask & SOLDIER_BATTLE_PARTICIPATION) )
if ( !(this->usSoldierFlagMask & SOLDIER_BATTLE_PARTICIPATION) )
{
this->bSoldierFlagMask |= SOLDIER_BATTLE_PARTICIPATION;
this->usSoldierFlagMask |= SOLDIER_BATTLE_PARTICIPATION;
// Flugente: campaign stats
gCurrentIncident.AddStat( this, CAMPAIGNHISTORY_TYPE_PARTICIPANT );
@@ -17172,7 +17177,7 @@ void SOLDIERTYPE::SoldierPropertyUpkeep()
}
else
{
this->bSoldierFlagMask &= ~SOLDIER_BATTLE_PARTICIPATION;
this->usSoldierFlagMask &= ~SOLDIER_BATTLE_PARTICIPATION;
}
}
@@ -17999,13 +18004,13 @@ BOOLEAN SOLDIERTYPE::OrderArtilleryStrike( UINT32 usSectorNr, INT32 sTargetGridN
BOOLEAN SOLDIERTYPE::IsJamming()
{
if ( bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_JAMMING )
if ( usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_JAMMING )
{
if ( CanUseRadio(FALSE) )
return TRUE;
// if we cannot use the radio, remove that flag hile we're at it
else
bSoldierFlagMask &= ~SOLDIER_RADIO_OPERATOR_JAMMING;
usSoldierFlagMask &= ~SOLDIER_RADIO_OPERATOR_JAMMING;
}
return FALSE;
@@ -18014,7 +18019,7 @@ BOOLEAN SOLDIERTYPE::IsJamming()
BOOLEAN SOLDIERTYPE::JamCommunications()
{
// not possible if already jamming
if ( bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_JAMMING )
if ( usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_JAMMING )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[ MSG113_ALREADY_JAMMING ]);
return FALSE;
@@ -18028,7 +18033,7 @@ BOOLEAN SOLDIERTYPE::JamCommunications()
SwitchOffRadio();
// add flag
bSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_JAMMING;
usSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_JAMMING;
// play sound
PlayJA2SampleFromFile( "Sounds\\radioerror2.wav", RATE_11025, SoundVolume( MIDVOLUME, this->sGridNo ), 1, SoundDir( this->sGridNo ) );
@@ -18038,13 +18043,13 @@ BOOLEAN SOLDIERTYPE::JamCommunications()
BOOLEAN SOLDIERTYPE::IsScanning()
{
if ( bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_SCANNING )
if ( usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_SCANNING )
{
if ( CanUseRadio(FALSE) )
return TRUE;
// if we cannot use the radio, remove that flag hile we're at it
else
bSoldierFlagMask &= ~SOLDIER_RADIO_OPERATOR_SCANNING;
usSoldierFlagMask &= ~SOLDIER_RADIO_OPERATOR_SCANNING;
}
return FALSE;
@@ -18053,7 +18058,7 @@ BOOLEAN SOLDIERTYPE::IsScanning()
BOOLEAN SOLDIERTYPE::ScanForJam()
{
// not possible if already scanning
if ( bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_SCANNING )
if ( usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_SCANNING )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[ MSG113_ALREADY_SCANNING ]);
return FALSE;
@@ -18067,7 +18072,7 @@ BOOLEAN SOLDIERTYPE::ScanForJam()
SwitchOffRadio();
// add flag
bSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_SCANNING;
usSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_SCANNING;
// play sound
PlayJA2SampleFromFile( "Sounds\\scan1.wav", RATE_11025, SoundVolume( MIDVOLUME, this->sGridNo ), 1, SoundDir( this->sGridNo ) );
@@ -18077,13 +18082,13 @@ BOOLEAN SOLDIERTYPE::ScanForJam()
BOOLEAN SOLDIERTYPE::IsRadioListening()
{
return ( (bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_LISTENING) && CanUseRadio(FALSE) );
return ( (usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_LISTENING) && CanUseRadio(FALSE) );
}
BOOLEAN SOLDIERTYPE::RadioListen()
{
// not possible if already scanning
if ( bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_LISTENING )
if ( usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_LISTENING )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[ MSG113_ALREADY_LISTENING ]);
return FALSE;
@@ -18097,7 +18102,7 @@ BOOLEAN SOLDIERTYPE::RadioListen()
SwitchOffRadio();
// add flag
bSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_LISTENING;
usSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_LISTENING;
// play sound
PlayJA2SampleFromFile( "Sounds\\scan1.wav", RATE_11025, SoundVolume( MIDVOLUME, this->sGridNo ), 1, SoundDir( this->sGridNo ) );
@@ -18144,7 +18149,7 @@ BOOLEAN SOLDIERTYPE::RadioCallReinforcements( UINT32 usSector, UINT16 sNumber )
BOOLEAN SOLDIERTYPE::SwitchOffRadio()
{
// erasing the flags is enough
bSoldierFlagMask &= ~(SOLDIER_RADIO_OPERATOR_JAMMING|SOLDIER_RADIO_OPERATOR_SCANNING|SOLDIER_RADIO_OPERATOR_LISTENING);
usSoldierFlagMask &= ~(SOLDIER_RADIO_OPERATOR_JAMMING|SOLDIER_RADIO_OPERATOR_SCANNING|SOLDIER_RADIO_OPERATOR_LISTENING);
return TRUE;
}
@@ -18172,9 +18177,9 @@ void SOLDIERTYPE::DepleteActiveRadioSetEnergy(BOOLEAN fActivation, BOOLEAN fAssi
cost = gItemSettings.energy_cost_radioset_activate;
else if ( fAssignment )
cost = gItemSettings.energy_cost_radioset_scan_assignment;
else if ( bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_JAMMING )
else if ( usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_JAMMING )
cost = gItemSettings.energy_cost_radioset_jam;
else if ( bSoldierFlagMask & (SOLDIER_RADIO_OPERATOR_SCANNING|SOLDIER_RADIO_OPERATOR_LISTENING) )
else if ( usSoldierFlagMask & (SOLDIER_RADIO_OPERATOR_SCANNING|SOLDIER_RADIO_OPERATOR_LISTENING) )
cost = gItemSettings.energy_cost_radioset_scan;
else
// nothing to do here..
@@ -18234,7 +18239,7 @@ BOOLEAN SOLDIERTYPE::IsSpotting()
BOOLEAN SOLDIERTYPE::CanSpot( INT32 sTargetGridNo )
{
if ( this->stats.bLife < OKLIFE || this->flags.fMercAsleep || this->bCollapsed || (this->bSoldierFlagMask & SOLDIER_POW) )
if ( this->stats.bLife < OKLIFE || this->flags.fMercAsleep || this->bCollapsed || (this->usSoldierFlagMask & SOLDIER_POW) )
return FALSE;
// additional checks if we want to know wether we can target a specific location
@@ -18423,6 +18428,13 @@ BOOLEAN SOLDIERTYPE::AIDoctorSelf()
return FALSE;
}
// Flugente: boxing fix: this shall be the only location where the boxing flag gets removed (easier debugging)
void SOLDIERTYPE::DeleteBoxingFlag()
{
if ( flags.uiStatusFlags & SOLDIER_BOXER )
flags.uiStatusFlags &= (~SOLDIER_BOXER);
}
INT32 CheckBleeding( SOLDIERTYPE *pSoldier )
{
@@ -19279,7 +19291,7 @@ void SOLDIERTYPE::EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection
UINT8 ubPerson = WhoIsThere2( sGridNo, this->pathing.bLevel );
if ( ubPerson != NOBODY && MercPtrs[ ubPerson ]->bTeam == ENEMY_TEAM && !(MercPtrs[ ubPerson ]->bSoldierFlagMask & SOLDIER_POW) )
if ( ubPerson != NOBODY && MercPtrs[ ubPerson ]->bTeam == ENEMY_TEAM && !(MercPtrs[ ubPerson ]->usSoldierFlagMask & SOLDIER_POW) )
{
// we found someone we can handcuff
SOLDIERTYPE* pSoldier = MercPtrs[ ubPerson ];
@@ -19315,7 +19327,7 @@ void SOLDIERTYPE::EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection
if ( success )
{
// arrest this guy
pSoldier->bSoldierFlagMask |= SOLDIER_POW;
pSoldier->usSoldierFlagMask |= SOLDIER_POW;
// Remove as target
RemoveManAsTarget( pSoldier );
@@ -19390,7 +19402,7 @@ void SOLDIERTYPE::EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection
this->DoMercBattleSound( BATTLE_SOUND_CURSE1 );
// if we are disguised, there is a chance that he'll uncover us
if ( this->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( this->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{
this->LooseDisguise();
this->Strip();
@@ -19449,7 +19461,7 @@ void SOLDIERTYPE::EVENT_SoldierApplyItemToPerson( INT32 sGridNo, UINT8 ubDirecti
success = FALSE;
// if we are disguised, there is a chance that he'll uncover us
if ( this->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( this->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{
this->LooseDisguise();
this->Strip();
+6 -3
View File
@@ -601,7 +601,7 @@ extern CLOTHES_STRUCT Clothes[CLOTHES_MAX];
// This macro should be used whenever we want to see if someone is neutral
// IF WE ARE CONSIDERING ATTACKING THEM. Creatures & bloodcats will attack neutrals
// but they can't attack empty vehicles!!
#define CONSIDERED_NEUTRAL( me, them ) ( (them->aiData.bNeutral || them->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER|SOLDIER_POW)) && ( me->bTeam != CREATURE_TEAM || (them->flags.uiStatusFlags & SOLDIER_VEHICLE) ) )
#define CONSIDERED_NEUTRAL( me, them ) ( (them->aiData.bNeutral || them->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER|SOLDIER_POW)) && ( me->bTeam != CREATURE_TEAM || (them->flags.uiStatusFlags & SOLDIER_VEHICLE) ) )
typedef struct
{
@@ -1431,7 +1431,7 @@ public:
INT16 bExtraWisdom; // additional wisdom gained via drugs
INT8 bExtraExpLevel; // corruption can temporarily alter our ExpLevel without messing up our stats this way
INT32 bSoldierFlagMask; // for various soldier-related flags (Illusion, Kill streak, etc.). Easier than adding 32 bool variables
UINT32 usSoldierFlagMask; // for various soldier-related flags (Illusion, Kill streak, etc.). Easier than adding 32 bool variables
// Flugente: food system
INT32 bFoodLevel; // current level of food saturation
@@ -1461,7 +1461,7 @@ public:
// Note that we also have to account for padding, so you might need to substract more than just the size of the new variables
UINT8 ubFiller[20];
INT32 bSoldierFlagMask2; // anv: another bSoldierFlagMask
UINT32 usSoldierFlagMask2; // anv: another usSoldierFlagMask
#ifdef JA2UB
@@ -1833,6 +1833,9 @@ public:
BOOLEAN AIDoctorFriend(); // AI-only: heal a wounded friend. Do NOT, repeat, NOT use this with mercs!
BOOLEAN AIDoctorSelf(); // AI-only: heal self. Do NOT, repeat, NOT use this with mercs!
// Flugente: boxing fix: this shall be the only location where the boxing flag gets removed (easier debugging)
void DeleteBoxingFlag();
//////////////////////////////////////////////////////////////////////////////
}; // SOLDIERTYPE;
+10 -9
View File
@@ -1264,7 +1264,7 @@ BOOLEAN TacticalCopySoldierFromProfile( SOLDIERTYPE *pSoldier, SOLDIERCREATE_STR
// Flugente: if playing with the covert trait, the assassins come covert, so they are tougher to find
if ( gGameExternalOptions.fAssassinsAreDisguised && gGameOptions.fNewTraitSystem && pSoldier->IsAssassin() )
{
pSoldier->bSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_COVERT_NPC_SPECIAL|SOLDIER_NEW_VEST|SOLDIER_NEW_PANTS);
pSoldier->usSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_COVERT_NPC_SPECIAL|SOLDIER_NEW_VEST|SOLDIER_NEW_PANTS);
UINT8 rnd = Random(11);
@@ -1718,7 +1718,7 @@ BOOLEAN TacticalCopySoldierFromCreateStruct( SOLDIERTYPE *pSoldier, SOLDIERCREAT
// this guy becomes an officer if there are enough soldiers around, and we aren't already at max of officers
if ( numenemies > gGameExternalOptions.usEnemyOfficersPerTeamSize * numofficers && numofficers < gGameExternalOptions.usEnemyOfficersMax )
pSoldier->bSoldierFlagMask |= SOLDIER_ENEMY_OFFICER;
pSoldier->usSoldierFlagMask |= SOLDIER_ENEMY_OFFICER;
}
}
@@ -3047,7 +3047,7 @@ SOLDIERTYPE* ReserveTacticalMilitiaSoldierForAutoresolve( UINT8 ubSoldierClass )
return NULL;
// the militia in autoresolve will drop their gear after combat. For this reason, there is no need for MercPtrs[i] to also drop it
MercPtrs[i]->bSoldierFlagMask |= SOLDIER_EQUIPMENT_DROPPED;
MercPtrs[i]->usSoldierFlagMask |= SOLDIER_EQUIPMENT_DROPPED;
//Assign a bogus ID, then return it
pSoldier->ubID = NUM_PROFILES;
@@ -3162,7 +3162,7 @@ SOLDIERTYPE* TacticalCreateEnemyAssassin(UINT8 disguisetype)
pSoldier->stats.bAgility = (INT8)( 70 + Random( 16 ) );
// add assassin flag
pSoldier->bSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_ASSASSIN);
pSoldier->usSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_ASSASSIN);
// add spy trait lvl2
pSoldier->stats.ubSkillTraits[0] = COVERT_NT;
@@ -3247,8 +3247,8 @@ void CreateAssassin(UINT8 disguisetype)
fInterfacePanelDirty = DIRTYLEVEL2;
// add correct flags. Undo SOLDIER_COVERT_CIV flag, we disguise as militia, not as a civilian (player cannot disguise as militia, thus he becomes a civilian)
pSoldier->bSoldierFlagMask &= ~SOLDIER_COVERT_CIV;
pSoldier->bSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_ASSASSIN);
pSoldier->usSoldierFlagMask &= ~SOLDIER_COVERT_CIV;
pSoldier->usSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_ASSASSIN);
// So we can see them!
AllTeamsLookForAll(NO_INTERRUPTS);
@@ -3358,7 +3358,7 @@ void CreatePrisonerOfWar()
AddSoldierToSector( pSoldier->ubID );
// mark this guy
pSoldier->bSoldierFlagMask |= SOLDIER_POW_PRISON;
pSoldier->usSoldierFlagMask |= SOLDIER_POW_PRISON;
// set correct civ group
pSoldier->ubCivilianGroup = POW_PRISON_CIV_GROUP;
@@ -5260,9 +5260,10 @@ BOOLEAN AssignTraitsToSoldier( SOLDIERTYPE *pSoldier, SOLDIERCREATE_STRUCT *pCre
}
}
}
// RETURN TRUE IF ALL TRAITS ASSIGNED OTHERWISE FALSE
if (( !gGameOptions.fNewTraitSystem && ATraitAssigned && BTraitAssigned ) || ( gGameOptions.fNewTraitSystem && ATraitAssigned && BTraitAssigned && CTraitAssigned ) )
return( TRUE );
else
return( FALSE );
return( FALSE );
}
+2 -2
View File
@@ -2717,7 +2717,7 @@ void AddSoldierInitListMilitiaOnEdge( UINT8 ubStrategicInsertionCode, UINT8 ubNu
pSoldier->bActionPoints = 0;
// Flugente: due to a fix, also note here that the reinforcements get no APs.
pSoldier->bSoldierFlagMask |= SOLDIER_NO_AP;
pSoldier->usSoldierFlagMask |= SOLDIER_NO_AP;
// Flugente: campaign stats
if ( IsOurSoldier(pSoldier) )
@@ -2842,7 +2842,7 @@ void SectorAddPrisonersofWar( INT16 sMapX, INT16 sMapY, INT16 sMapZ )
++numberofcivs;
// count how many pows are already placed
if ( pTeamSoldier->bSoldierFlagMask & SOLDIER_POW_PRISON )
if ( pTeamSoldier->usSoldierFlagMask & SOLDIER_POW_PRISON )
++numberofpows;
}
+3 -3
View File
@@ -1909,11 +1909,11 @@ BOOLEAN RecruitRPC( UINT8 ubCharNum )
// Flugente: people recruited in Arulco are known to the enemy as civilians or even soldiers. So they will be covert when recruited. Of course, this is not for the rebels...
if ( ubCharNum == DEVIN || ubCharNum == HAMOUS || ubCharNum == SLAY || ubCharNum == VINCE || ubCharNum == MADDOG || ubCharNum == MICKY )
{
pNewSoldier->bSoldierFlagMask |= (SOLDIER_COVERT_CIV|SOLDIER_COVERT_NPC_SPECIAL);
pNewSoldier->usSoldierFlagMask |= (SOLDIER_COVERT_CIV|SOLDIER_COVERT_NPC_SPECIAL);
}
else if ( ubCharNum == IGGY || ubCharNum == CONRAD )
{
pNewSoldier->bSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_COVERT_NPC_SPECIAL);
pNewSoldier->usSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_COVERT_NPC_SPECIAL);
}
// handle town loyalty adjustment
@@ -2028,7 +2028,7 @@ BOOLEAN RecruitEPC( UINT8 ubCharNum )
pNewSoldier->ubWhatKindOfMercAmI = MERC_TYPE__EPC;
// Flugente: people recruited in Arulco are known to the enemy as civilians or even soldiers. So they will be covert when recruited. Of course, this is not for the rebels...
pNewSoldier->bSoldierFlagMask |= (SOLDIER_COVERT_CIV|SOLDIER_COVERT_NPC_SPECIAL);
pNewSoldier->usSoldierFlagMask |= (SOLDIER_COVERT_CIV|SOLDIER_COVERT_NPC_SPECIAL);
UpdateTeamPanelAssignments( );
+1 -1
View File
@@ -2260,7 +2260,7 @@ UINT8 HandleHandcuffCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT32 uiCurso
if ( usSoldierIndex != NOBODY )
{
// no handcuffing if the guy is already caught...
if ( !(MercPtrs[usSoldierIndex]->bSoldierFlagMask & SOLDIER_POW) )
if ( !(MercPtrs[usSoldierIndex]->usSoldierFlagMask & SOLDIER_POW) )
return( HANDCUFF_GREY_UICURSOR );
}
}
+5 -5
View File
@@ -3327,7 +3327,7 @@ BOOLEAN UseHandToHand( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, BOOLEAN fStea
fFailure=FALSE;
// Flugente: if we are disguised and try to steal from a conscious enemy, there is a chance that he notices us and we lose our disguise. If he can see us this always happens
if ( !fSoldierCollapsed && pSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( !fSoldierCollapsed && pSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{
BOOLEAN fUncovered = FALSE;
@@ -9393,9 +9393,9 @@ INT32 BulletImpact( SOLDIERTYPE *pFirer, BULLET *pBullet, SOLDIERTYPE * pTarget,
if ( gGameExternalOptions.fZombieOnlyHeadShotsPermanentlyKill && pTarget->stats.bLife > 0 )
{
if ( ubHitLocation == AIM_SHOT_HEAD )
pTarget->bSoldierFlagMask |= SOLDIER_HEADSHOT;
pTarget->usSoldierFlagMask |= SOLDIER_HEADSHOT;
else
pTarget->bSoldierFlagMask &= ~SOLDIER_HEADSHOT;
pTarget->usSoldierFlagMask &= ~SOLDIER_HEADSHOT;
}
}
#endif
@@ -9509,7 +9509,7 @@ INT32 BulletImpact( SOLDIERTYPE *pFirer, BULLET *pBullet, SOLDIERTYPE * pTarget,
// this is intended to work on darts, but it is possible on any ammo
if ( AmmoTypes[ubAmmoType].ammoflag & AMMO_NEUROTOXIN )
{
pTarget->bSoldierFlagMask |= SOLDIER_DRUGGED;
pTarget->usSoldierFlagMask |= SOLDIER_DRUGGED;
// Add lifedamage effects
pTarget->AddDrugValues( DRUG_TYPE_LIFEDAMAGE, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugEffect, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugTravelRate, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugSideEffect );
@@ -10277,7 +10277,7 @@ INT32 HTHImpact( SOLDIERTYPE * pSoldier, SOLDIERTYPE * pTarget, INT32 iHitBy, BO
// set a flag if this was a headshot, unset if it wasn't. Thus we can determine if this was a headshot kill (only if life > 0, ignore if already dead)
if ( gGameExternalOptions.fZombieOnlyHeadShotsPermanentlyKill && pTarget->stats.bLife > 0 )
{
pTarget->bSoldierFlagMask |= SOLDIER_HEADSHOT;
pTarget->usSoldierFlagMask |= SOLDIER_HEADSHOT;
}
}
#endif
+8 -8
View File
@@ -2174,7 +2174,7 @@ void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT32 sOppGridNo,
{
// Flugente: note that this enemy has been seen by mercs this turn
if ( pOpponent->bTeam == ENEMY_TEAM && pSoldier->bTeam == OUR_TEAM )
pOpponent->bSoldierFlagMask |= SOLDIER_ENEMY_OBSERVEDTHISTURN;
pOpponent->usSoldierFlagMask |= SOLDIER_ENEMY_OBSERVEDTHISTURN;
}
// if we're seeing a guy we didn't see on our last chance to look for him
@@ -2329,10 +2329,10 @@ void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT32 sOppGridNo,
else if ( pSoldier->IsAssassin() && pSoldier->bTeam == CIV_TEAM )
{
// if we are an assassin and still neutral and undercover, approach target and then become hostile
if ( pSoldier->aiData.bNeutral && pSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( pSoldier->aiData.bNeutral && pSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{
// only if this guy isn't disguised himself!
if ( (pOpponent->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER)) == 0)
if ( (pOpponent->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER)) == 0)
{
if ( pSoldier->ubCivilianGroup != NON_CIV_GROUP && gTacticalStatus.fCivGroupHostile[ pSoldier->ubCivilianGroup ] >= CIV_GROUP_WILL_BECOME_HOSTILE )
{
@@ -2513,10 +2513,10 @@ void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT32 sOppGridNo,
{
// ... check wether he is not neutral against us (account for the fact that we might be covert!)
// if we are an NPC assassin
if ( pSoldier->bSoldierFlagMask & SOLDIER_ASSASSIN && pSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( pSoldier->usSoldierFlagMask & SOLDIER_ASSASSIN && pSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{
// check wether our opponent would see us as an opponent if we weren't covert
if ( !( (pSoldier->aiData.bNeutral || pSoldier->bSoldierFlagMask & SOLDIER_POW) && ( pOpponent->bTeam != CREATURE_TEAM || pOpponent->flags.uiStatusFlags & SOLDIER_VEHICLE ) ) )
if ( !( (pSoldier->aiData.bNeutral || pSoldier->usSoldierFlagMask & SOLDIER_POW) && ( pOpponent->bTeam != CREATURE_TEAM || pOpponent->flags.uiStatusFlags & SOLDIER_VEHICLE ) ) )
fAddAsOpponent = TRUE;
}
else
@@ -3044,7 +3044,7 @@ IAN COMMENTED THIS OUT MAY 1997 - DO WE NEED THIS?
{
// Flugente: we consider enemies to be neutral if they are prisoners of war (otherwise the AI would kill prisoners). Bu as we want to remove them, we have to account for that
// we also move RecognizeAsCombatant to be the last condition checked, because it is the most computationally expensive one
if ( ( !CONSIDERED_NEUTRAL( pOpponent, pSoldier ) || pSoldier->bSoldierFlagMask & SOLDIER_POW ) && pOpponent->RecognizeAsCombatant(pSoldier->ubID) )
if ( ( !CONSIDERED_NEUTRAL( pOpponent, pSoldier ) || pSoldier->usSoldierFlagMask & SOLDIER_POW ) && pOpponent->RecognizeAsCombatant(pSoldier->ubID) )
RemoveOneOpponent(pOpponent);
}
UpdatePersonal(pOpponent,ubTarget,NOT_HEARD_OR_SEEN,NOWHERE,0);
@@ -3539,7 +3539,7 @@ void SaySeenQuote( SOLDIERTYPE *pSoldier, BOOLEAN fSeenCreature, BOOLEAN fVirgin
else
{
// Flugente: no quotes on seeing enemy when covert
if ( (pSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) ) == 0 )
if ( (pSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) ) == 0 )
{
#ifdef ENGLISH
if ( Random( 100 ) < 30 )
@@ -3585,7 +3585,7 @@ void OurTeamSeesSomeone( SOLDIERTYPE * pSoldier, INT8 bNumReRevealed, INT8 bNumN
if ( pSoldier->bTeam == gbPlayerNum )
{
// Flugente: disguised mercs do not alert us if they see an enemy, as otherwise one has to continously give them new orders
if ( !(pSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER)) )
if ( !(pSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER)) )
{
// STOP IF WE WERE MOVING....
/// Speek up!
+2 -2
View File
@@ -1317,7 +1317,7 @@ void TurnBasedHandleNPCAI(SOLDIERTYPE *pSoldier)
// pSoldier->flags.fNoAPToFinishMove = FALSE;
// Flugente: pows don't do anything
if ( pSoldier->bSoldierFlagMask & SOLDIER_POW )
if ( pSoldier->usSoldierFlagMask & SOLDIER_POW )
{
EndAIGuysTurn( pSoldier);
return;
@@ -2054,7 +2054,7 @@ INT8 ExecuteAction(SOLDIERTYPE *pSoldier)
{
HandleInitialRedAlert(pSoldier->bTeam, TRUE);
pSoldier->bSoldierFlagMask |= SOLDIER_RAISED_REDALERT;
pSoldier->usSoldierFlagMask |= SOLDIER_RAISED_REDALERT;
}
// SANDRO - ENEMY TAUNTS
+4 -4
View File
@@ -1529,7 +1529,7 @@ INT32 ClosestUnDisguisedPC( SOLDIERTYPE *pSoldier, INT32 * psDistance )
if ( AM_AN_EPC( pTargetSoldier ) )
continue;
if ( pTargetSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( pTargetSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
continue;
sDist = PythSpacesAway(pSoldier->sGridNo,pTargetSoldier->sGridNo);
@@ -3070,7 +3070,7 @@ INT32 CalcStraightThreatValue( SOLDIERTYPE *pEnemy )
}
// Flugente: get the id of the closest soldier with a specific flag that we can currently see
UINT8 GetClosestFlaggedSoldierID( SOLDIERTYPE * pSoldier, INT16 aRange, UINT8 auTeam, UINT32 aFlag )
UINT8 GetClosestFlaggedSoldierID( SOLDIERTYPE * pSoldier, INT16 aRange, UINT8 auTeam, UINT32 aFlag, BOOLEAN fCheckSight )
{
UINT8 id = NOBODY;
UINT32 uiLoop;
@@ -3103,7 +3103,7 @@ UINT8 GetClosestFlaggedSoldierID( SOLDIERTYPE * pSoldier, INT16 aRange, UINT8 au
continue;
// check for flag
if ( !(pFriend->bSoldierFlagMask & aFlag) )
if ( !(pFriend->usSoldierFlagMask & aFlag) )
continue;
// are we close enough?
@@ -3111,7 +3111,7 @@ UINT8 GetClosestFlaggedSoldierID( SOLDIERTYPE * pSoldier, INT16 aRange, UINT8 au
if ( friendrange < range)
{
// can we see this guy?
if ( SoldierTo3DLocationLineOfSightTest( pSoldier, pFriend->sGridNo, pSoldier->pathing.bLevel, 3, TRUE, CALC_FROM_WANTED_DIR ) )
if ( !fCheckSight || SoldierTo3DLocationLineOfSightTest( pSoldier, pFriend->sGridNo, pSoldier->pathing.bLevel, 3, TRUE, CALC_FROM_WANTED_DIR ) )
{
range = friendrange;
id = pFriend->ubID;
+1 -1
View File
@@ -3243,7 +3243,7 @@ BOOLEAN GetBestAoEGridNo(SOLDIERTYPE *pSoldier, INT32* pGridNo, INT16 aRadius, U
continue;
// dying or captured friends are 'helpless' anyway, we are willing to sacrifice them :-)
if ( uCheckFriends && pSoldier->bSide == pFriend->bSide && pFriend->stats.bLife > OKLIFE && !(pFriend->bSoldierFlagMask & SOLDIER_POW) )
if ( uCheckFriends && pSoldier->bSide == pFriend->bSide && pFriend->stats.bLife > OKLIFE && !(pFriend->usSoldierFlagMask & SOLDIER_POW) )
{
// active friend, remember where he is so that we DON'T blow him up!
// this includes US, since we don't want to blow OURSELVES up either
+12 -13
View File
@@ -732,7 +732,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier)
{
if (usRoom == BOXING_RING)
{
for ( ubLoop = 0; ubLoop < NUM_BOXERS; ubLoop++ )
for ( ubLoop = 0; ubLoop < NUM_BOXERS; ++ubLoop )
{
if (pSoldier->ubID == gubBoxerID[ ubLoop ])
{
@@ -757,8 +757,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier)
if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_PCUNDERAICONTROL)
pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL);
if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_BOXER)
pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_BOXER);
pTeamSoldier->DeleteBoxingFlag( );
}
if (pSoldier->bTeam == gbPlayerNum || CountPeopleInBoxingRing() == 0)
@@ -885,7 +884,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier)
}
//ddd{
if( !(pSoldier->bSoldierFlagMask & SOLDIER_RAISED_REDALERT) && gGameExternalOptions.bNewTacticalAIBehavior && pSoldier->bTeam == ENEMY_TEAM )
if( !(pSoldier->usSoldierFlagMask & SOLDIER_RAISED_REDALERT) && gGameExternalOptions.bNewTacticalAIBehavior && pSoldier->bTeam == ENEMY_TEAM )
{
if ( !(gTacticalStatus.uiFlags & TURNBASED) && (gTacticalStatus.uiFlags & INCOMBAT) )
{
@@ -922,7 +921,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier)
// Flugente: if we see one of our buddies in handcuffs, its a clear sign of enemy activity!
if ( gGameExternalOptions.fAllowPrisonerSystem && pSoldier->bTeam == ENEMY_TEAM && !gTacticalStatus.Team[pSoldier->bTeam].bAwareOfOpposition )
{
UINT8 ubPerson = GetClosestFlaggedSoldierID( pSoldier, 20, ENEMY_TEAM, SOLDIER_POW );
UINT8 ubPerson = GetClosestFlaggedSoldierID( pSoldier, 20, ENEMY_TEAM, SOLDIER_POW, TRUE );
if ( ubPerson != NOBODY )
{
@@ -1604,7 +1603,7 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
// Flugente: if we see one of our buddies captured, it is a clear sign of enemy activity!
if ( gGameExternalOptions.fAllowPrisonerSystem && pSoldier->bTeam == ENEMY_TEAM )
{
UINT8 ubPerson = GetClosestFlaggedSoldierID( pSoldier, 20, ENEMY_TEAM, SOLDIER_POW );
UINT8 ubPerson = GetClosestFlaggedSoldierID( pSoldier, 20, ENEMY_TEAM, SOLDIER_POW, TRUE );
if ( ubPerson != NOBODY )
{
@@ -1637,7 +1636,7 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
}
}
}
else if ( !(pSoldier->bSoldierFlagMask & SOLDIER_RAISED_REDALERT) && !gTacticalStatus.Team[pSoldier->bTeam].bAwareOfOpposition )
else if ( !(pSoldier->usSoldierFlagMask & SOLDIER_RAISED_REDALERT) && !gTacticalStatus.Team[pSoldier->bTeam].bAwareOfOpposition )
{
// raise alarm!
return( AI_ACTION_RED_ALERT );
@@ -2778,7 +2777,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK)
}
}
// frequencies are clear, lets call for help
else if ( !(pSoldier->bSoldierFlagMask & SOLDIER_RAISED_REDALERT) )
else if ( !(pSoldier->usSoldierFlagMask & SOLDIER_RAISED_REDALERT) )
{
// raise alarm!
return( AI_ACTION_RED_ALERT );
@@ -2964,7 +2963,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK)
// Flugente: if we see one of our buddies captured, it is a clear sign of enemy activity!
if ( gGameExternalOptions.fAllowPrisonerSystem && pSoldier->bTeam == ENEMY_TEAM )
{
UINT8 ubPerson = GetClosestFlaggedSoldierID( pSoldier, 20, ENEMY_TEAM, SOLDIER_POW );
UINT8 ubPerson = GetClosestFlaggedSoldierID( pSoldier, 20, ENEMY_TEAM, SOLDIER_POW, TRUE );
if ( ubPerson != NOBODY )
{
@@ -3169,7 +3168,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK)
// if we're a computer merc, and we have the action points remaining to RADIO
// (we never want NPCs to choose to radio if they would have to wait a turn)
if ( !(pSoldier->bSoldierFlagMask & SOLDIER_RAISED_REDALERT) && !fCivilian && (pSoldier->bActionPoints >= APBPConstants[AP_RADIO]) && (gTacticalStatus.Team[pSoldier->bTeam].bMenInSector > 1) )
if ( !(pSoldier->usSoldierFlagMask & SOLDIER_RAISED_REDALERT) && !fCivilian && (pSoldier->bActionPoints >= APBPConstants[AP_RADIO]) && (gTacticalStatus.Team[pSoldier->bTeam].bMenInSector > 1) )
{
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"decideactionred: checking to radio red alert");
@@ -4665,7 +4664,7 @@ INT16 ubMinAPCost;
}
}
// frequencies are clear, lets call for help
else if ( !(pSoldier->bSoldierFlagMask & SOLDIER_RAISED_REDALERT) )
else if ( !(pSoldier->usSoldierFlagMask & SOLDIER_RAISED_REDALERT) )
{
// raise alarm!
return( AI_ACTION_RED_ALERT );
@@ -6048,7 +6047,7 @@ L_NEWAIM:
// (we never want NPCs to choose to radio if they would have to wait a turn)
// and we're not swimming in deep water, and somebody has called for spotters
// and we see the location of at least 2 opponents
if ( !(pSoldier->bSoldierFlagMask & SOLDIER_RAISED_REDALERT) && (gTacticalStatus.ubSpottersCalledForBy != NOBODY) && (pSoldier->bActionPoints >= APBPConstants[AP_RADIO]) &&
if ( !(pSoldier->usSoldierFlagMask & SOLDIER_RAISED_REDALERT) && (gTacticalStatus.ubSpottersCalledForBy != NOBODY) && (pSoldier->bActionPoints >= APBPConstants[AP_RADIO]) &&
(pSoldier->aiData.bOppCnt > 1) && !fCivilian &&
(gTacticalStatus.Team[pSoldier->bTeam].bMenInSector > 1) && !bInDeepWater)
{
@@ -6187,7 +6186,7 @@ L_NEWAIM:
// RADIO RED ALERT: determine %chance to call others and report contact
////////////////////////////////////////////////////////////////////////////
if ( !(pSoldier->bSoldierFlagMask & SOLDIER_RAISED_REDALERT) && pSoldier->bTeam == MILITIA_TEAM && (pSoldier->bActionPoints >= APBPConstants[AP_RADIO]) && (gTacticalStatus.Team[pSoldier->bTeam].bMenInSector > 1) )
if ( !(pSoldier->usSoldierFlagMask & SOLDIER_RAISED_REDALERT) && pSoldier->bTeam == MILITIA_TEAM && (pSoldier->bActionPoints >= APBPConstants[AP_RADIO]) && (gTacticalStatus.Team[pSoldier->bTeam].bMenInSector > 1) )
{
// if there hasn't been an initial RED ALERT yet in this sector
+1 -1
View File
@@ -190,7 +190,7 @@ INT32 MostImportantNoiseHeard( SOLDIERTYPE *pSoldier, INT32 *piRetValue, BOOLEAN
continue; // next merc
// Flugente: chance to ignore the noise if the ceator is covert
if ( pTemp->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
if ( pTemp->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{
// green AI state: always ignore
// yellow AI state: 50% chance to ignore
+1 -1
View File
@@ -73,7 +73,7 @@ void RTHandleAI( SOLDIERTYPE * pSoldier )
}
// Flugente: prisoners of war don't do anything
if ( pSoldier->bSoldierFlagMask & SOLDIER_POW )
if ( pSoldier->usSoldierFlagMask & SOLDIER_POW )
return;
// if man has nothing to do
+1 -1
View File
@@ -262,7 +262,7 @@ INT8 CalcAverageCTGTForPosition( SOLDIERTYPE * pSoldier, UINT8 ubOppID, INT32 sO
UINT8 NumberOfTeamMatesAdjacent( SOLDIERTYPE * pSoldier, INT32 sGridNo );
// Flugente: get the id of the closest soldier (coser than x tiles) of a specific team with a specific flag that we can currently see
UINT8 GetClosestFlaggedSoldierID( SOLDIERTYPE * pSoldier, INT16 aRange, UINT8 auTeam, UINT32 aFlag );
UINT8 GetClosestFlaggedSoldierID( SOLDIERTYPE * pSoldier, INT16 aRange, UINT8 auTeam, UINT32 aFlag, BOOLEAN fCheckSight = TRUE );
// get the id of the closest soldier (closer than x tiles) of a specific team that is wounded that we can currently see
UINT8 GetClosestWoundedSoldierID( SOLDIERTYPE * pSoldier, INT16 aRange, UINT8 auTeam );
+1 -1
View File
@@ -644,7 +644,7 @@ void RenderRadarScreen( )
}
// Flugente: if we are a (still covert) enemy assassin, colour us like militia, so that the player wont notice us
if ( pSoldier->bSoldierFlagMask & SOLDIER_ASSASSIN && pSoldier->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
if ( pSoldier->usSoldierFlagMask & SOLDIER_ASSASSIN && pSoldier->usSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
usLineColor = Get16BPPColor( gTacticalStatus.Team[ MILITIA_TEAM ].RadarColor );
// Render different color if an enemy and he's unconscious
+9 -9
View File
@@ -368,7 +368,7 @@ void InitTacticalPlacementGUI()
!MercPtrs[ i ]->bSectorZ )
{
// Flugente: if options allow it and we entered this sector - in combat - via helicopter, then allow us free selection of our entry point, and drop us from the helicopter
if ( MercPtrs[ i ]->bTeam == gbPlayerNum && gGameExternalOptions.ubSkyriderHotLZ == 3 && MercPtrs[ i ]->bSoldierFlagMask & SOLDIER_AIRDROP )
if ( MercPtrs[ i ]->bTeam == gbPlayerNum && gGameExternalOptions.ubSkyriderHotLZ == 3 && MercPtrs[ i ]->usSoldierFlagMask & SOLDIER_AIRDROP )
{
AddMercToHeli( MercPtrs[ i ]->ubID );
@@ -946,7 +946,7 @@ void RenderTacticalPlacementGUI()
gTPClipRectCenterBottom.iRight = iOffsetHorizontal + 634;
}
// Flugente airdrop
else if ( gfCenter && gGameExternalOptions.ubSkyriderHotLZ == 3 && gbSelectedMercID >= 0 && gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP )
else if ( gfCenter && gGameExternalOptions.ubSkyriderHotLZ == 3 && gbSelectedMercID >= 0 && gMercPlacement[ gbSelectedMercID ].pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP )
{
// Left black border
gTPClipRectCenterLeft.iLeft = iOffsetHorizontal;
@@ -976,7 +976,7 @@ void RenderTacticalPlacementGUI()
pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
if (!gfCenter || (gGameExternalOptions.ubSkyriderHotLZ == 3 && gbSelectedMercID >= 0 && !(gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP)) )
if (!gfCenter || (gGameExternalOptions.ubSkyriderHotLZ == 3 && gbSelectedMercID >= 0 && !(gMercPlacement[ gbSelectedMercID ].pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP)) )
Blt16BPPBufferLooseHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &gTPClipRect, usHatchColor );
// WANNE - MP: Center
else
@@ -989,7 +989,7 @@ void RenderTacticalPlacementGUI()
SetClippingRegionAndImageWidth( uiDestPitchBYTES, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
if (!gfCenter || (gGameExternalOptions.ubSkyriderHotLZ == 3 && gbSelectedMercID >= 0 && !(gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP)) )
if (!gfCenter || (gGameExternalOptions.ubSkyriderHotLZ == 3 && gbSelectedMercID >= 0 && !(gMercPlacement[ gbSelectedMercID ].pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP)) )
RectangleDraw( TRUE, gTPClipRect.iLeft, gTPClipRect.iTop, gTPClipRect.iRight, gTPClipRect.iBottom, usHatchColor, pDestBuf );
else
{
@@ -1199,7 +1199,7 @@ void TacticalPlacementHandle()
}
// WANNE - MP: Center
if ( gfCenter && ( is_networked || (gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP)) )
if ( gfCenter && ( is_networked || (gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP)) )
{
if (gMercPlacement[ gbCursorMercID ].ubStrategicInsertionCode == INSERTION_CODE_CENTER )
{
@@ -1470,7 +1470,7 @@ void MercClickCallback( MOUSE_REGION *reg, INT32 reason )
{
if( gbSelectedMercID != i )
{
if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ i ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP )
if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ i ].pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP )
gubDefaultButton = GROUP_BUTTON;
gbSelectedMercID = i;
@@ -1493,7 +1493,7 @@ void SelectNextUnplacedUnit()
if( gbSelectedMercID == -1 )
return;
if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP )
if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP )
gubDefaultButton = GROUP_BUTTON;
for( i = gbSelectedMercID; i < giPlacements; i++ )
@@ -1547,7 +1547,7 @@ void HandleTacticalPlacementClicksInOverheadMap( MOUSE_REGION *reg, INT32 reason
{
if( gbSelectedMercID != -1 )
{
if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP )
if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP )
gubDefaultButton = GROUP_BUTTON;
if( GetOverheadMouseGridNo( &sGridNo ) )
@@ -1694,7 +1694,7 @@ void PutDownMercPiece( INT32 iPlacement )
if(!TileIsOutOfBounds(sGridNo))
{
// Flugente: initiate airdrop, place merc on roof if necessary
if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP )
if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP )
{
// hideous hack
gfTacticalDoHeliRun = TRUE;
+2 -2
View File
@@ -1552,7 +1552,7 @@ void RenderOverheadOverlays()
if (pSoldier->bTeam == CIV_TEAM)
{
// Flugente: if we are a (still covert) enemy assassin, colour us like militia, so that the player wont notice us
if ( pSoldier->bSoldierFlagMask & SOLDIER_ASSASSIN && pSoldier->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
if ( pSoldier->usSoldierFlagMask & SOLDIER_ASSASSIN && pSoldier->usSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sX, sY, MILITIA_TEAM );
else
Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sX, sY, CIV_TEAM );
@@ -1576,7 +1576,7 @@ void RenderOverheadOverlays()
else
{
// Flugente: if we are a (still covert) enemy assassin, colour us like militia, so that the player wont notice us
if ( pSoldier->bSoldierFlagMask & SOLDIER_ASSASSIN && pSoldier->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
if ( pSoldier->usSoldierFlagMask & SOLDIER_ASSASSIN && pSoldier->usSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sX, sY, MILITIA_TEAM );
else
Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sX, sY, pSoldier->bTeam );