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->bExtraAgility, sizeof(bExtraAgility), sizeof(INT16), numBytesRead);
numBytesRead = ReadFieldByField(hFile, &this->bExtraWisdom, sizeof(bExtraWisdom), 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->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 ) if ( guiCurrentSaveGameVersion >= FOOD_CHANGES )
{ {
@@ -2227,13 +2227,13 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
if ( guiCurrentSaveGameVersion >= SNITCH_TRAIT_EXTENDED ) 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 else
{ {
this->bSoldierFlagMask2 = 0; this->usSoldierFlagMask2 = 0;
for(int i = 0; i < sizeof(bSoldierFlagMask2); ++i) for(int i = 0; i < sizeof(usSoldierFlagMask2); ++i)
buffer++; buffer++;
} }
@@ -6277,8 +6277,9 @@ BOOLEAN LoadSavedGame( int ubSavedGameID )
//now change the savegame format so that temp files are saved and loaded correctly //now change the savegame format so that temp files are saved and loaded correctly
guiCurrentSaveGameVersion = SAVE_GAME_VERSION; 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. // 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++) for (INT8 bLoop=gTacticalStatus.Team[gbPlayerNum].bFirstID; bLoop <= gTacticalStatus.Team[gbPlayerNum].bLastID; bLoop++)
{ {
pTeamSoldier=MercPtrs[bLoop]; pTeamSoldier=MercPtrs[bLoop];
@@ -6286,9 +6287,8 @@ BOOLEAN LoadSavedGame( int ubSavedGameID )
if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_PCUNDERAICONTROL) if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_PCUNDERAICONTROL)
pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL); pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL);
if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_BOXER) pTeamSoldier->DeleteBoxingFlag();
pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_BOXER); }*/
}
return( TRUE ); return( TRUE );
} }
@@ -8637,7 +8637,7 @@ BOOLEAN LoadGeneralInfo( HWFILE hFile )
fDisableMapInterfaceDueToBattle = sGeneralInfo.fDisableMapInterfaceDueToBattle; fDisableMapInterfaceDueToBattle = sGeneralInfo.fDisableMapInterfaceDueToBattle;
memcpy( &gsBoxerGridNo, &sGeneralInfo.sBoxerGridNo, NUM_BOXERS * sizeof( INT32 ) ); 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 ) ); memcpy( &gfBoxerFought, &sGeneralInfo.fBoxerFought, NUM_BOXERS * sizeof( BOOLEAN ) );
//Load the helicopter status //Load the helicopter status
+16 -16
View File
@@ -6674,9 +6674,9 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
if ( result < gGameExternalOptions.ubPrisonerProcessDefectChance ) if ( result < gGameExternalOptions.ubPrisonerProcessDefectChance )
{ {
// troops are converted to militia, but there is a chance that they will be demoted in the process // 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; ++turnedmilitia_elite;
else if ( i < interrogatedprisoners[PRISONER_ELITE] + interrogatedprisoners[PRISONER_REGULAR] && Chance(80) ) else if ( i >= interrogatedprisoners[PRISONER_ADMIN] && Chance( 80 ) )
++turnedmilitia_regular; ++turnedmilitia_regular;
else else
++turnedmilitia_admin; ++turnedmilitia_admin;
@@ -6768,7 +6768,7 @@ void HandlePrisonerProcessingInSector( INT16 sMapX, INT16 sMapY, INT8 bZ )
if ( !oldinterrogationpoints ) if ( !oldinterrogationpoints )
return; return;
FLOAT totalexp = (FLOAT) (100 * prisonersinterrogated); FLOAT totalexp = (FLOAT) (1 * prisonersinterrogated);
FLOAT expratio = totalexp / (oldinterrogationpoints * 33); // TODO FLOAT expratio = totalexp / (oldinterrogationpoints * 33); // TODO
// award experience // award experience
@@ -6979,8 +6979,8 @@ void HandleEquipmentMove( INT16 sMapX, INT16 sMapY, INT8 bZ )
if ( distance == 0 ) if ( distance == 0 )
continue; continue;
// each soldier can carry 30 items, and needs 10 minutes (two way walk) per sector distance, thereby 6 / distance runs possible // 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 = 30 * (*it).second * 6 / distance; UINT16 maxitems = 40 * (*it).second * 6 / distance;
UINT16 maxweight = 400 * (*it).second * 6 / distance; UINT16 maxweight = 400 * (*it).second * 6 / distance;
// open the inventory of the sector we are taking stuff from // 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; UINT32 uiTotalNumberOfRealItems_Target = 0;
// use the new map // use the new map
pWorldItem_Target.clear();//dnl ch75 021113 pWorldItem_Target.clear();//dnl ch75 021113
if( ( gWorldSectorX == targetX )&&( gWorldSectorY == targetY ) && (gbWorldSectorZ == bZ ) ) 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 ) 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; fShowSnitchToggleMenu = FALSE;
fShowSnitchMenu = FALSE; fShowSnitchMenu = FALSE;
fShowAssignmentMenu = FALSE; fShowAssignmentMenu = FALSE;
@@ -11459,9 +11459,9 @@ void SnitchToggleMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
} }
else if( iValue == SNITCH_MENU_TOGGLE_OFF ) 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; fShowSnitchToggleMenu = FALSE;
fShowSnitchMenu = FALSE; fShowSnitchMenu = FALSE;
fShowAssignmentMenu = FALSE; fShowAssignmentMenu = FALSE;
@@ -11471,9 +11471,9 @@ void SnitchToggleMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
} }
else if( iValue == SNITCH_MENU_MISBEHAVIOUR_ON ) 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; fShowSnitchToggleMenu = FALSE;
fShowSnitchMenu = FALSE; fShowSnitchMenu = FALSE;
fShowAssignmentMenu = FALSE; fShowAssignmentMenu = FALSE;
@@ -11482,9 +11482,9 @@ void SnitchToggleMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
} }
else if( iValue == SNITCH_MENU_MISBEHAVIOUR_OFF) 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; fShowSnitchToggleMenu = FALSE;
fShowSnitchMenu = FALSE; fShowSnitchMenu = FALSE;
fShowAssignmentMenu = FALSE; fShowAssignmentMenu = FALSE;
@@ -15176,7 +15176,7 @@ void HandleShadingOfLinesForSnitchToggleMenu( void )
pSoldier = GetSelectedAssignSoldier( FALSE ); pSoldier = GetSelectedAssignSoldier( FALSE );
if( pSoldier->bSoldierFlagMask2 & SOLDIER_SNITCHING_OFF ) if( pSoldier->usSoldierFlagMask2 & SOLDIER_SNITCHING_OFF )
{ {
UnShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_TOGGLE_ON ); UnShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_TOGGLE_ON );
ShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_TOGGLE_OFF ); ShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_TOGGLE_OFF );
@@ -15187,7 +15187,7 @@ void HandleShadingOfLinesForSnitchToggleMenu( void )
UnShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_TOGGLE_OFF ); 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 ); UnShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_MISBEHAVIOUR_ON );
ShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_MISBEHAVIOUR_OFF ); ShadeStringInBox( ghSnitchToggleBox, SNITCH_MENU_MISBEHAVIOUR_OFF );
+5 -4
View File
@@ -4792,7 +4792,11 @@ void TargetHitCallback( SOLDIERCELL *pTarget, INT32 index )
pTarget->uiFlags &= ~CELL_RETREATING; pTarget->uiFlags &= ~CELL_RETREATING;
} }
if( iNewLife <= 0 ) 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 ) if( pTarget->pAttacker[ index ]->uiFlags & CELL_PLAYER )
{ //Player killed the enemy soldier -- update his stats as well as any assisters. { //Player killed the enemy soldier -- update his stats as well as any assisters.
SOLDIERCELL *pKiller; SOLDIERCELL *pKiller;
@@ -4810,9 +4814,6 @@ void TargetHitCallback( SOLDIERCELL *pTarget, INT32 index )
{ {
if( pKiller->uiFlags & CELL_MERC ) if( pKiller->uiFlags & CELL_MERC )
{ {
// Flugente: campaign stats
gCurrentIncident.AddStat( pTarget->pSoldier, CAMPAIGNHISTORY_TYPE_KILL );
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
// SANDRO - new mercs' records // SANDRO - new mercs' records
switch(pTarget->pSoldier->ubSoldierClass) 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...) // 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( 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 ) 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...) // 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( 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 ) if( pSoldier->sSectorX == pOtherSoldier->sSectorX && pSoldier->sSectorY == pOtherSoldier->sSectorY && pSoldier->bSectorZ == pOtherSoldier->bSectorZ )
{ {
+19 -9
View File
@@ -838,6 +838,8 @@ static int l_EnvEndRainStorm (lua_State *L);
static int l_ProfilesStrategicInsertionData (lua_State *L); static int l_ProfilesStrategicInsertionData (lua_State *L);
static int l_ResetBoxers( lua_State *L );
using namespace std; using namespace std;
UINT16 idProfil; UINT16 idProfil;
@@ -1124,6 +1126,7 @@ void IniFunction(lua_State *L, BOOLEAN bQuests )
lua_register(L, "GetCharacterSectorZ", l_GetCharacterSectorZ); lua_register(L, "GetCharacterSectorZ", l_GetCharacterSectorZ);
lua_register(L, "GetCharacterSectorX", l_GetCharacterSectorX); 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 //Tactical merc
lua_register(L, "CheckCivGroupHostile", l_fCivGroupHostile); lua_register(L, "CheckCivGroupHostile", l_fCivGroupHostile);
@@ -10588,18 +10591,25 @@ static int l_GetCharacterSectorX (lua_State *L)
//Set charcter to sector Z //Set charcter to sector Z
static int l_SetCharacterSectorZ (lua_State *L) static int l_SetCharacterSectorZ (lua_State *L)
{ {
UINT8 n = lua_gettop(L); if ( lua_gettop( L ) >= 2 )
int i = 0;
UINT8 id = 0;
UINT8 SectorZ = 0;
for (i= 1; i<=n; i++ )
{ {
if (i == 1 ) id = lua_tointeger(L,i); UINT8 id = lua_tointeger( L, 1 );
if (i == 2 ) SectorZ = lua_tointeger(L,i); UINT8 SectorZ = lua_tointeger( L, 2 );
gMercProfiles[id].bSectorZ = SectorZ;
} }
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;
}
return 0; 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 // 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; pSoldier->bActionPoints = 0;
// Flugente: due to a fix, also note here that the reinforcements get no APs. // 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 // Flugente: campaign stats
if ( IsOurSoldier(pSoldier) ) if ( IsOurSoldier(pSoldier) )
+15 -32
View File
@@ -93,9 +93,7 @@ void ModifyPlayerReputation(INT8 bRepChange)
BOOLEAN MercThinksDeathRateTooHigh( UINT8 ubProfileID ) BOOLEAN MercThinksDeathRateTooHigh( UINT8 ubProfileID )
{ {
INT8 bDeathRateTolerance; INT8 bDeathRateTolerance = gMercProfiles[ubProfileID].bDeathRate;
bDeathRateTolerance = gMercProfiles[ ubProfileID ].bDeathRate;
// if he couldn't care less what it is // if he couldn't care less what it is
if (bDeathRateTolerance == 101) if (bDeathRateTolerance == 101)
@@ -109,19 +107,15 @@ BOOLEAN MercThinksDeathRateTooHigh( UINT8 ubProfileID )
// too high - sorry // too high - sorry
return(TRUE); return(TRUE);
} }
else
{ // within tolerance
// within tolerance return(FALSE);
return(FALSE);
}
} }
BOOLEAN MercThinksBadReputationTooHigh( UINT8 ubProfileID ) BOOLEAN MercThinksBadReputationTooHigh( UINT8 ubProfileID )
{ {
INT8 bRepTolerance; INT8 bRepTolerance = gMercProfiles[ ubProfileID ].bReputationTolerance;
bRepTolerance = gMercProfiles[ ubProfileID ].bReputationTolerance;
// if he couldn't care less what it is // if he couldn't care less what it is
if (bRepTolerance == 101) if (bRepTolerance == 101)
@@ -135,11 +129,9 @@ BOOLEAN MercThinksBadReputationTooHigh( UINT8 ubProfileID )
// too high - sorry // too high - sorry
return(TRUE); return(TRUE);
} }
else
{ // within tolerance
// within tolerance return(FALSE);
return(FALSE);
}
} }
@@ -158,7 +150,6 @@ BOOLEAN MercThinksHisMoraleIsTooLow( SOLDIERTYPE *pSoldier )
return(FALSE); return(FALSE);
} }
// morale tolerance is based directly upon reputation tolerance // morale tolerance is based directly upon reputation tolerance
// above 50, morale is GOOD, never below tolerance then // above 50, morale is GOOD, never below tolerance then
bMoraleTolerance = (100 - bRepTolerance) / 2; bMoraleTolerance = (100 - bRepTolerance) / 2;
@@ -168,11 +159,9 @@ BOOLEAN MercThinksHisMoraleIsTooLow( SOLDIERTYPE *pSoldier )
// too low - sorry // too low - sorry
return(TRUE); return(TRUE);
} }
else
{ // within tolerance
// within tolerance return(FALSE);
return(FALSE);
}
} }
BOOLEAN MercIsOwedTooMuchMoney( UINT8 ubProfileID ) BOOLEAN MercIsOwedTooMuchMoney( UINT8 ubProfileID )
@@ -188,8 +177,7 @@ BOOLEAN MercIsOwedTooMuchMoney( UINT8 ubProfileID )
BOOLEAN MercThinksPlayerIsInactiveTooLong( UINT8 ubProfileID ) BOOLEAN MercThinksPlayerIsInactiveTooLong( UINT8 ubProfileID )
{ {
UINT8 ubTolerance; UINT8 ubTolerance = gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS];
ubTolerance = gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS];
if( gMercProfiles[ubProfileID].bCharacterTrait == CHAR_TRAIT_PACIFIST ) if( gMercProfiles[ubProfileID].bCharacterTrait == CHAR_TRAIT_PACIFIST )
{ {
ubTolerance = max(0, ubTolerance + gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS_PACIFIST_BONUS]); ubTolerance = max(0, ubTolerance + gMoraleSettings.bValues[MORALE_PLAYER_INACTIVE_DAYS_PACIFIST_BONUS]);
@@ -206,10 +194,8 @@ BOOLEAN MercThinksPlayerIsInactiveTooLong( UINT8 ubProfileID )
{ {
return(TRUE); return(TRUE);
} }
else
{ return(FALSE);
return(FALSE);
}
} }
void UpdateLastDayOfPlayerActivity( UINT16 usDay ) void UpdateLastDayOfPlayerActivity( UINT16 usDay )
@@ -228,11 +214,8 @@ UINT8 LackOfProgressTolerance( void )
// give an EXTRA day over normal // give an EXTRA day over normal
return( 7 - DIF_LEVEL_MEDIUM + gStrategicStatus.ubHighestProgress / 42 ); 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; UINT32 uiRemainingDecrement;
INT16 sThisDecrement; INT16 sThisDecrement;
Assert( ( bTownId >= FIRST_TOWN ) && ( bTownId < NUM_TOWNS ) ); Assert( ( bTownId >= FIRST_TOWN ) && ( bTownId < NUM_TOWNS ) );
// doesn't affect towns where player hasn't established a "presence" yet // doesn't affect towns where player hasn't established a "presence" yet
@@ -363,8 +362,6 @@ void DecrementTownLoyalty( INT8 bTownId, UINT32 uiLoyaltyDecrease )
uiRemainingDecrement -= sThisDecrement; uiRemainingDecrement -= sThisDecrement;
} }
return;
} }
@@ -376,7 +373,6 @@ void UpdateTownLoyaltyRating( INT8 bTownId )
INT16 sRatingChange = 0; INT16 sRatingChange = 0;
UINT8 ubMaxLoyalty = 0; UINT8 ubMaxLoyalty = 0;
Assert( ( bTownId >= FIRST_TOWN ) && ( bTownId < NUM_TOWNS ) ); Assert( ( bTownId >= FIRST_TOWN ) && ( bTownId < NUM_TOWNS ) );
// remember previous loyalty value // remember previous loyalty value
@@ -437,8 +433,6 @@ void UpdateTownLoyaltyRating( INT8 bTownId )
{ {
fMapPanelDirty = TRUE; fMapPanelDirty = TRUE;
} }
return;
} }
+65 -22
View File
@@ -7558,36 +7558,79 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent )
} }
if( fCtrl ) if( fCtrl )
{ {
//CHRISL: pickup all items to vehicle if ( UsingNewInventorySystem() && fShowInventoryFlag && fShowMapInventoryPool && !gTacticalStatus.fEnemyInSector)
if ( UsingNewInventorySystem() == true && fShowInventoryFlag && fShowMapInventoryPool && !(gTacticalStatus.fEnemyInSector) && gGameExternalOptions.fVehicleInventory && (pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE))
{ {
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) if (pInventoryPoolList[i].fExists == TRUE && (pInventoryPoolList[i].usFlags & WORLD_ITEM_REACHABLE))
continue;
if(pSoldier->inv[x].exists() == true)
{ {
if(pSoldier->inv[x].usItem != pInventoryPoolList[i].object.usItem) for (int x = 0; x < NUM_INV_SLOTS; x++)
continue; {
else if (vehicleInv[x] == FALSE)
pInventoryPoolList[i].object.AddObjectsToStack(pSoldier->inv[x], -1, pSoldier, x); continue;
} if (pSoldier->inv[x].exists() == true)
else {
pInventoryPoolList[i].object.MoveThisObjectTo(pSoldier->inv[x], -1, pSoldier, x); if (pSoldier->inv[x].usItem != pInventoryPoolList[i].object.usItem)
if(pInventoryPoolList[i].object.ubNumberOfObjects < 0) continue;
{ else
//RemoveItemFromWorld(i); pInventoryPoolList[i].object.AddObjectsToStack(pSoldier->inv[x], -1, pSoldier, x);
break; }
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; // Flugente: also allow mercs to qickly pick up items this way (but not EPCs)
fInterfacePanelDirty = DIRTYLEVEL2; 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 ) && ( StrategicMap[ usSector ].fEnemyControlled == FALSE ) &&
( NumEnemiesInSector( ( INT16 )iCounterA, ( INT16 )iCounterB ) == 0 ) ) ( NumEnemiesInSector( ( INT16 )iCounterA, ( INT16 )iCounterB ) == 0 ) )
{ {
ubSectorsControlled++; ++ubSectorsControlled;
} }
} }
} }
+55 -63
View File
@@ -42,18 +42,18 @@ void ExitBoxing( void )
//DBrot: More Rooms //DBrot: More Rooms
//UINT8 ubRoom; //UINT8 ubRoom;
UINT16 usRoom; UINT16 usRoom;
SOLDIERTYPE * pSoldier; SOLDIERTYPE* pSoldier;
UINT32 uiLoop; UINT32 uiLoop;
UINT8 ubPass; UINT8 ubPass;
// find boxers and turn them neutral again // find boxers and turn them neutral again
// first time through loop, look for AI guy, then for PC guy.... for stupid // first time through loop, look for AI guy, then for PC guy.... for stupid
// oppcnt/alert status reasons // 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 // 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 ]; pSoldier = MercPtrs[ uiLoop ];
@@ -128,7 +128,6 @@ void ExitBoxing( void )
// Lock UI until we get out of the ring // Lock UI until we get out of the ring
guiPendingOverrideEvent = LU_BEGINUILOCK; guiPendingOverrideEvent = LU_BEGINUILOCK;
} }
} }
@@ -196,7 +195,7 @@ UINT8 CountPeopleInBoxingRing( void )
UINT16 usRoom; UINT16 usRoom;
UINT8 ubTotalInRing = 0; UINT8 ubTotalInRing = 0;
for ( uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++ ) for ( uiLoop = 0; uiLoop < guiNumMercSlots; ++uiLoop )
{ {
pSoldier = MercSlots[ uiLoop ]; pSoldier = MercSlots[ uiLoop ];
@@ -204,7 +203,7 @@ UINT8 CountPeopleInBoxingRing( void )
{ {
if ( InARoom( pSoldier->sGridNo, &usRoom ) && usRoom == BOXING_RING) if ( InARoom( pSoldier->sGridNo, &usRoom ) && usRoom == BOXING_RING)
{ {
ubTotalInRing++; ++ubTotalInRing;
} }
} }
} }
@@ -214,17 +213,16 @@ UINT8 CountPeopleInBoxingRing( void )
void CountPeopleInBoxingRingAndDoActions( void ) void CountPeopleInBoxingRingAndDoActions( void )
{ {
UINT32 uiLoop; UINT32 uiLoop;
UINT8 ubTotalInRing = 0; UINT8 ubTotalInRing = 0;
//DBrot: More Rooms //DBrot: More Rooms
//UINT8 ubRoom; UINT16 usRoom;
UINT16 usRoom; UINT16 ubPlayersInRing = 0;
UINT8 ubPlayersInRing = 0;
SOLDIERTYPE * pSoldier; SOLDIERTYPE * pSoldier;
SOLDIERTYPE * pInRing[2] = { NULL, NULL }; SOLDIERTYPE * pInRing[2] = { NULL, NULL };
SOLDIERTYPE * pNonBoxingPlayer = NULL; SOLDIERTYPE * pNonBoxingPlayer = NULL;
for ( uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++ ) for ( uiLoop = 0; uiLoop < guiNumMercSlots; ++uiLoop )
{ {
pSoldier = MercSlots[ uiLoop ]; pSoldier = MercSlots[ uiLoop ];
@@ -236,19 +234,17 @@ void CountPeopleInBoxingRingAndDoActions( void )
{ {
pInRing[ ubTotalInRing ] = pSoldier; pInRing[ ubTotalInRing ] = pSoldier;
} }
ubTotalInRing++; ++ubTotalInRing;
if ( pSoldier->flags.uiStatusFlags & SOLDIER_PC ) if ( pSoldier->flags.uiStatusFlags & SOLDIER_PC )
{ {
ubPlayersInRing++; ++ubPlayersInRing;
if ( !pNonBoxingPlayer && !(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) ) if ( !pNonBoxingPlayer && !(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) )
{ {
pNonBoxingPlayer = pSoldier; pNonBoxingPlayer = pSoldier;
} }
} }
} }
} }
} }
@@ -270,7 +266,6 @@ void CountPeopleInBoxingRingAndDoActions( void )
return; return;
} }
if ( gTacticalStatus.bBoxingState == BOXING_WAITING_FOR_PLAYER ) if ( gTacticalStatus.bBoxingState == BOXING_WAITING_FOR_PLAYER )
{ {
if ( ubTotalInRing == 1 && ubPlayersInRing == 1 ) if ( ubTotalInRing == 1 && ubPlayersInRing == 1 )
@@ -281,44 +276,45 @@ void CountPeopleInBoxingRingAndDoActions( void )
} }
} }
else 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! if (ubTotalInRing == 2 && ubPlayersInRing == 1)
for ( uiLoop = 0; uiLoop < 2; uiLoop++ )
{ {
if ( ! ( pInRing[ uiLoop ]->flags.uiStatusFlags & SOLDIER_BOXER ) ) // ladieees and gennleman, we have a fight!
for (uiLoop = 0; uiLoop < 2; ++uiLoop)
{ {
// set as boxer! if (!(pInRing[uiLoop]->flags.uiStatusFlags & SOLDIER_BOXER))
pInRing[ uiLoop ]->flags.uiStatusFlags |= SOLDIER_BOXER; {
// set as boxer!
pInRing[uiLoop]->flags.uiStatusFlags |= SOLDIER_BOXER;
}
} }
} // start match!
// start match! SetBoxingState(BOXING);
SetBoxingState( BOXING ); gfLastBoxingMatchWonByPlayer = FALSE;
gfLastBoxingMatchWonByPlayer = FALSE;
#ifdef JA2TESTVERSION #ifdef JA2TESTVERSION
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Boxer APs %d %d", pInRing[0]->bActionPoints, pInRing[1]->bActionPoints ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Boxer APs %d %d", pInRing[0]->bActionPoints, pInRing[1]->bActionPoints );
#endif #endif
// give the first turn to a randomly chosen boxer // give the first turn to a randomly chosen boxer
EnterCombatMode( pInRing[ Random( 2 ) ]->bTeam ); EnterCombatMode(pInRing[Random(2)]->bTeam);
}
} }
} /*
/* else
else {
{
// check to see if the player has more than one person in the ring // check to see if the player has more than one person in the ring
if ( ubPlayersInRing > 1 ) if ( ubPlayersInRing > 1 )
{ {
// boxing match just became invalid! // boxing match just became invalid!
BoxingPlayerDisqualified( pNonBoxingPlayer, NON_BOXER_IN_RING ); BoxingPlayerDisqualified( pNonBoxingPlayer, NON_BOXER_IN_RING );
return; return;
} }
}
*/
} }
*/
} }
BOOLEAN CheckOnBoxers( void ) BOOLEAN CheckOnBoxers( void )
@@ -359,7 +355,7 @@ BOOLEAN BoxerExists( void )
{ {
UINT32 uiLoop; UINT32 uiLoop;
for( uiLoop = 0; uiLoop < NUM_BOXERS; uiLoop++ ) for( uiLoop = 0; uiLoop < NUM_BOXERS; ++uiLoop )
{ {
if ( WhoIsThere2( gsBoxerGridNo[ uiLoop ], 0 ) != NOBODY ) if ( WhoIsThere2( gsBoxerGridNo[ uiLoop ], 0 ) != NOBODY )
{ {
@@ -371,17 +367,17 @@ BOOLEAN BoxerExists( void )
BOOLEAN PickABoxer( void ) BOOLEAN PickABoxer( void )
{ {
UINT32 uiLoop; UINT32 uiLoop;
SOLDIERTYPE * pBoxer; SOLDIERTYPE* pBoxer;
for( uiLoop = 0; uiLoop < NUM_BOXERS; uiLoop++ ) for( uiLoop = 0; uiLoop < NUM_BOXERS; ++uiLoop )
{ {
if ( gubBoxerID[ uiLoop ] != NOBODY ) if ( gubBoxerID[ uiLoop ] != NOBODY )
{ {
if ( gfBoxerFought[ uiLoop ] ) if ( gfBoxerFought[ uiLoop ] )
{ {
// pathetic attempt to prevent multiple AI boxers // pathetic attempt to prevent multiple AI boxers
MercPtrs[ gubBoxerID[ uiLoop ] ]->flags.uiStatusFlags &= ~SOLDIER_BOXER; MercPtrs[ gubBoxerID[ uiLoop ] ]->DeleteBoxingFlag();
} }
else else
{ {
@@ -430,15 +426,13 @@ BOOLEAN PickABoxer( void )
BOOLEAN BoxerAvailable( void ) BOOLEAN BoxerAvailable( void )
{ {
UINT8 ubLoop;
// No way around this, BoxerAvailable will have to go find boxer IDs if they aren't set. // No way around this, BoxerAvailable will have to go find boxer IDs if they aren't set.
if ( CheckOnBoxers() == FALSE ) if ( CheckOnBoxers() == FALSE )
{ {
return( FALSE ); return( FALSE );
} }
for( ubLoop = 0; ubLoop < NUM_BOXERS; ubLoop++ ) for (UINT8 ubLoop = 0; ubLoop < NUM_BOXERS; ++ubLoop)
{ {
if ( gubBoxerID[ ubLoop ] != NOBODY && !gfBoxerFought[ ubLoop ] ) if ( gubBoxerID[ ubLoop ] != NOBODY && !gfBoxerFought[ ubLoop ] )
{ {
@@ -453,14 +447,13 @@ BOOLEAN BoxerAvailable( void )
// SEQUEL FIGHT. Maybe we could check Kingpin's location instead! // SEQUEL FIGHT. Maybe we could check Kingpin's location instead!
UINT8 BoxersAvailable( void ) UINT8 BoxersAvailable( void )
{ {
UINT8 ubLoop;
UINT8 ubCount = 0; UINT8 ubCount = 0;
for( ubLoop = 0; ubLoop < NUM_BOXERS; ubLoop++ ) for (UINT8 ubLoop = 0; ubLoop < NUM_BOXERS; ++ubLoop)
{ {
if ( gubBoxerID[ ubLoop ] != NOBODY && !gfBoxerFought[ ubLoop ] ) if ( gubBoxerID[ ubLoop ] != NOBODY && !gfBoxerFought[ ubLoop ] )
{ {
ubCount++; ++ubCount;
} }
} }
@@ -487,7 +480,7 @@ BOOLEAN AnotherFightPossible( void )
// Loop through all mercs on player team // Loop through all mercs on player team
ubLoop = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; ubLoop = gTacticalStatus.Team[ gbPlayerNum ].bFirstID;
pSoldier = MercPtrs[ ubLoop ]; 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 ) 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. // add the history record here.
AddHistoryToPlayersLog( HISTORY_DISQUALIFIED_BOXING, pSoldier->ubProfile, GetWorldTotalMin(), gWorldSectorX, gWorldSectorY ); AddHistoryToPlayersLog( HISTORY_DISQUALIFIED_BOXING, pSoldier->ubProfile, GetWorldTotalMin(), gWorldSectorX, gWorldSectorY );
// make not a boxer any more // make not a boxer any more
pSoldier->flags.uiStatusFlags &= ~(SOLDIER_BOXER); pSoldier->DeleteBoxingFlag( );
pSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL); pSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL);
} }
} }
@@ -531,7 +524,6 @@ void SetBoxingState( INT8 bNewState )
// pause time // pause time
PauseGame(); PauseGame();
} }
} }
else else
{ {
@@ -546,7 +538,6 @@ void SetBoxingState( INT8 bNewState )
// fight to occur // fight to occur
gfBoxerFought[ 0 ] = TRUE; gfBoxerFought[ 0 ] = TRUE;
} }
} }
} }
gTacticalStatus.bBoxingState = bNewState; gTacticalStatus.bBoxingState = bNewState;
@@ -557,13 +548,14 @@ void SetBoxingState( INT8 bNewState )
void ClearAllBoxerFlags( void ) void ClearAllBoxerFlags( void )
{ {
UINT32 uiSlot; for (UINT32 uiSlot = 0; uiSlot < guiNumMercSlots; ++uiSlot)
for( uiSlot = 0; uiSlot < guiNumMercSlots; uiSlot++ )
{ {
if ( MercSlots[ uiSlot ] && MercSlots[ uiSlot ]->flags.uiStatusFlags & SOLDIER_BOXER ) 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 // 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() ) switch ( pCiv->GetUniformType() )
{ {
+3 -4
View File
@@ -2399,7 +2399,6 @@ CHAR8 *GetSnitchDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, B
{ {
static CHAR8 zFileName[164]; static CHAR8 zFileName[164];
static CHAR8 zFileNameExists[164]; static CHAR8 zFileNameExists[164];
UINT8 ubFileNumID;
if ( fWavFile ) 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 ) 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 pFilename1;
STR8 pFilename2; //STR8 pFilename2;
STR8 pFilename3; //STR8 pFilename3;
CHAR16 zDialogueTextTemp[ QUOTE_MESSAGE_SIZE ]; //CHAR16 zDialogueTextTemp[ QUOTE_MESSAGE_SIZE ];
BOOLEAN fTextAvailable = FALSE; BOOLEAN fTextAvailable = FALSE;
// first things first - grab the text (if player has SUBTITLE PREFERENCE ON) // 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++; pSoldier->bRegenBoostersUsedToday++;
// set flag: we are on drugs // set flag: we are on drugs
pSoldier->bSoldierFlagMask |= SOLDIER_DRUGGED; pSoldier->usSoldierFlagMask |= SOLDIER_DRUGGED;
} }
// increase drug counter if not alcoholic drug // increase drug counter if not alcoholic drug
@@ -258,7 +258,7 @@ void HandleEndTurnDrugAdjustments( SOLDIERTYPE *pSoldier )
INT32 iNumLoops; INT32 iNumLoops;
// if were not on drugs, nothing to do here // if were not on drugs, nothing to do here
if ( ( pSoldier->bSoldierFlagMask & SOLDIER_DRUGGED ) == 0 ) if ( ( pSoldier->usSoldierFlagMask & SOLDIER_DRUGGED ) == 0 )
return; return;
// We test for every 'pure' drug separately // We test for every 'pure' drug separately
@@ -516,7 +516,7 @@ void HandleEndTurnDrugAdjustments( SOLDIERTYPE *pSoldier )
// if all drug effects have ended, delete flag // if all drug effects have ended, delete flag
if ( !MercUnderTheInfluence(pSoldier) ) if ( !MercUnderTheInfluence(pSoldier) )
pSoldier->bSoldierFlagMask &= ~SOLDIER_DRUGGED; pSoldier->usSoldierFlagMask &= ~SOLDIER_DRUGGED;
} }
void HandleAPEffectDueToDrugs( SOLDIERTYPE *pSoldier, INT16 *pubPoints ) 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 // 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 ); DoRightIcon( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons, 12 );
bNumRightIcons++; bNumRightIcons++;
@@ -2210,12 +2210,12 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
// Flugente: icons for radio operator actions (not the assignment) // Flugente: icons for radio operator actions (not the assignment)
if ( MercPtrs[ pFace->ubSoldierID ]->bAssignment != RADIO_SCAN ) 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 ); DoRightIcon( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons, 19 );
bNumRightIcons++; 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 ); DoRightIcon( uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons, 20 );
bNumRightIcons++; bNumRightIcons++;
@@ -2420,7 +2420,7 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
BltVideoObjectFromIndex( uiRenderBuffer, guiPORTRAITICONS, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL ); BltVideoObjectFromIndex( uiRenderBuffer, guiPORTRAITICONS, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
fDoIcon = FALSE; 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[2], TacticalStr[ CLEAN_ONE_GUN_STR ] );
wcscpy( gzUserDefinedButton[3], TacticalStr[ CLEAN_ALL_GUNS_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 ] ); wcscpy( gzUserDefinedButton[1], TacticalStr[ TAKE_OFF_DISGUISE_STR ] );
else else
wcscpy( gzUserDefinedButton[1], TacticalStr[ TAKE_OFF_CLOTHES_STR ] ); 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 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 ] ); wcscpy( gzUserDefinedButton[6], TacticalStr[ SPY_SELFTEST_STR ] );
else else
wcscpy( gzUserDefinedButton[6], TacticalStr[ UNUSED_STR ] ); wcscpy( gzUserDefinedButton[6], TacticalStr[ UNUSED_STR ] );
@@ -5185,7 +5185,7 @@ void TacticalFunctionSelectionMessageBoxCallBack( UINT8 ubExitValue )
break; break;
case 7: case 7:
// test our disguise // test our disguise
if ( gpTempSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) ) if ( gpTempSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
gpTempSoldier->SpySelfTest(); gpTempSoldier->SpySelfTest();
break; break;
default: 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 // - 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 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. // 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 we are Nails, don't allow taking our vest
if ( pOpponent->ubProfile == 34 && i == VESTPOS ) if ( pOpponent->ubProfile == 34 && i == VESTPOS )
+1 -1
View File
@@ -123,7 +123,7 @@ void HandleFlashLights()
{ {
pSoldier = MercSlots[ uiLoop ]; pSoldier = MercSlots[ uiLoop ];
if ( pSoldier != NULL && pSoldier->bSoldierFlagMask & SOLDIER_REDOFLASHLIGHT ) if ( pSoldier != NULL && pSoldier->usSoldierFlagMask & SOLDIER_REDOFLASHLIGHT )
{ {
pSoldier->HandleFlashLights(); pSoldier->HandleFlashLights();
} }
+1 -1
View File
@@ -11294,7 +11294,7 @@ void RemoveItemPickupMenu( )
gItemPickupMenu.pSoldier->flags.fPauseAllAnimation = FALSE; gItemPickupMenu.pSoldier->flags.fPauseAllAnimation = FALSE;
// Flugente: remove the marker notifying we are currently stealing // Flugente: remove the marker notifying we are currently stealing
gItemPickupMenu.pSoldier->bSoldierFlagMask &= ~SOLDIER_ACCESSTEAMMEMBER; gItemPickupMenu.pSoldier->usSoldierFlagMask &= ~SOLDIER_ACCESSTEAMMEMBER;
// Remove graphics! // Remove graphics!
DeleteVideoObjectFromIndex( gItemPickupMenu.uiPanelVo ); 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 // Flugente: we have to recheck our flashlights, as we changed items
//gpSMCurrentMerc->bSoldierFlagMask |= SOLDIER_REDOFLASHLIGHT; //gpSMCurrentMerc->usSoldierFlagMask |= SOLDIER_REDOFLASHLIGHT;
gpSMCurrentMerc->HandleFlashLights(); gpSMCurrentMerc->HandleFlashLights();
} }
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN) else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN)
+5 -5
View File
@@ -1905,7 +1905,7 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
SetFontBackground( FONT_MCOLOR_BLACK ); SetFontBackground( FONT_MCOLOR_BLACK );
BOOLEAN bInCombat = gTacticalStatus.uiFlags & TURNBASED && gTacticalStatus.uiFlags & INCOMBAT; 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 // sevenfm: for mercs use name color as cover indicator
// only use color when there is enemy in sector // only use color when there is enemy in sector
if( pSoldier->bTeam == OUR_TEAM && 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; BOOLEAN bStealth = pSoldier->bStealthMode;
// draw cover indicators // draw cover indicators
if( ( gGameExternalOptions.ubShowHealthBarsOnHead > 1 ) && if( ( gGameExternalOptions.ubShowHealthBarsOnHead > 1 ) &&
@@ -5359,7 +5359,7 @@ STR16 GetSoldierHealthString( SOLDIERTYPE *pSoldier )
else else
{ {
// Flugente: display if we are a prisoner of war // Flugente: display if we are a prisoner of war
if ( pSoldier->bSoldierFlagMask & SOLDIER_POW ) if ( pSoldier->usSoldierFlagMask & SOLDIER_POW )
return zHealthStr[ 7 ]; return zHealthStr[ 7 ];
INT32 cnt, cntStart; 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 // show awareness sign only when in stealth mode or disguised
if( ( gusSelectedSoldier != NOBODY ) && if( ( gusSelectedSoldier != NOBODY ) &&
( pTargetSoldier->bTeam == ENEMY_TEAM || pTargetSoldier->bTeam == CIV_TEAM && !pTargetSoldier->aiData.bNeutral ) && ( 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 ) if( pTargetSoldier->aiData.bOppList[ MercPtrs[ gusSelectedSoldier ]->ubID ] == SEEN_CURRENTLY )
swprintf( NameStr, L"%s", L"*" ); swprintf( NameStr, L"%s", L"*" );
@@ -6581,7 +6581,7 @@ BOOLEAN ShowSoldierRoleSymbol(SOLDIERTYPE* pSoldier)
sYPos += 25; sYPos += 25;
// is this guy an officer? // is this guy an officer?
if ( pSoldier->bSoldierFlagMask & SOLDIER_ENEMY_OFFICER ) if ( pSoldier->usSoldierFlagMask & SOLDIER_ENEMY_OFFICER )
{ {
// Add bars // Add bars
iBack = RegisterBackgroundRect( BGND_FLAG_SINGLE, NULL, sXPos, sYPos, (INT16)(sXPos + 20 ), (INT16)(sYPos + 20 ) ); 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(); BOOLEAN isnight = NightTime();
// check up to 10 times for an item with a matching coolness // 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 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 ) 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 ( newvest )
{ {
// if we are already wearing a vest, give us back that item // 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; UINT16 vestitem = 0;
if ( GetFirstClothesItemWithSpecificData(&vestitem, pSoldier->VestPal, "blank") ) 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 ); 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 // this vest is not damaged, so remove the damaged vest flag
pSoldier->bSoldierFlagMask &= ~SOLDIER_DAMAGED_VEST; pSoldier->usSoldierFlagMask &= ~SOLDIER_DAMAGED_VEST;
} }
if ( newpants ) if ( newpants )
{ {
// if we are already wearing a vest, give us back that item // 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; UINT16 pantsitem = 0;
if ( GetFirstClothesItemWithSpecificData(&pantsitem, "blank", pSoldier->PantsPal) ) 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 ); 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 // 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 // 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 ); 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 // 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 // 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 ) 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 // 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) ) 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 ) if ( pSoldier->bTeam == OUR_TEAM )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_DISGUISED_AS_SOLDIER], pSoldier->GetName() ); 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 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 ) if ( pSoldier->bTeam == OUR_TEAM )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_DISGUISED_AS_CIVILIAN], pSoldier->GetName() ); 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 usNumMatches = 0;
UINT16 usRandom = 0; UINT16 usRandom = 0;
UINT16 i = 0;
UINT16 lowestCoolness = LowestLaunchableCoolness(itemIndex); UINT16 lowestCoolness = LowestLaunchableCoolness(itemIndex);
#if 0
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("PickARandomLaunchable: itemIndex = %d", itemIndex)); //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) // 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; return 0;
} }
+110 -107
View File
@@ -742,7 +742,7 @@ void HandleMoraleEvent( SOLDIERTYPE *pSoldier, INT8 bMoraleEvent, INT16 sMapX, I
if ( gGameOptions.fNewTraitSystem ) 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 // 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 // SANDRO - no penalty for pacifists to run away
if ( gMercProfiles[pTeamSoldier->ubProfile].bCharacterTrait != CHAR_TRAIT_PACIFIST ) if ( gMercProfiles[pTeamSoldier->ubProfile].bCharacterTrait != CHAR_TRAIT_PACIFIST )
@@ -1065,7 +1065,7 @@ void HourlyMoraleUpdate( void )
bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID; bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID;
// loop through all mercs to calculate their morale // 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 the merc is active, in Arulco, and conscious, not POW
if ( pSoldier->bActive && pSoldier->ubProfile != NO_PROFILE && if ( pSoldier->bActive && pSoldier->ubProfile != NO_PROFILE &&
@@ -1162,7 +1162,7 @@ void HourlyMoraleUpdate( void )
} }
} }
iTotalOpinions += bOpinion; iTotalOpinions += bOpinion;
bNumTeamMembers++; ++bNumTeamMembers;
if ( EffectiveLeadership( pOtherSoldier ) > bHighestTeamLeadership) if ( EffectiveLeadership( pOtherSoldier ) > bHighestTeamLeadership)
{ {
bHighestTeamLeadership = EffectiveLeadership( pOtherSoldier ); bHighestTeamLeadership = EffectiveLeadership( pOtherSoldier );
@@ -1236,46 +1236,45 @@ void HourlyMoraleUpdate( void )
} }
} }
bStrategicMoraleUpdateCounter++; ++bStrategicMoraleUpdateCounter;
if ( bStrategicMoraleUpdateCounter == gMoraleSettings.ubHoursBetweenStrategicDelay ) if ( bStrategicMoraleUpdateCounter == gMoraleSettings.ubHoursBetweenStrategicDelay )
{ {
DecayStrategicMoraleModifiers(); DecayStrategicMoraleModifiers();
bStrategicMoraleUpdateCounter = 0; bStrategicMoraleUpdateCounter = 0;
} }
} }
void HandleSnitchCheck( void ) void HandleSnitchCheck( void )
{ {
INT8 bMercID, bOtherID; UINT16 bMercID, bOtherID;
INT8 bOpinion=-1; INT8 bOpinion = -1;
INT8 bLastTeamID; UINT16 bLastTeamID;
SOLDIERTYPE * pSoldier; SOLDIERTYPE* pSoldier;
SOLDIERTYPE * pOtherSoldier; SOLDIERTYPE* pOtherSoldier;
MERCPROFILESTRUCT * pProfile; MERCPROFILESTRUCT* pProfile;
BOOLEAN fSameGroupOnly; BOOLEAN fSameGroupOnly;
// anv: save merc id and his negative morale event for snitches // anv: save merc id and his negative morale event for snitches
UINT8 ubSnitchEventsCounter = 0; std::vector<SnitchEvent> snitcheventvector;
SnitchEvent SnitchEvents[NUM_PROFILES];
bMercID = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; bMercID = gTacticalStatus.Team[gbPlayerNum].bFirstID;
bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID; bLastTeamID = gTacticalStatus.Team[gbPlayerNum].bLastID;
// loop through all mercs to calculate their morale // 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 && if ( pSoldier && pSoldier->bActive && pSoldier->ubProfile != NO_PROFILE &&
!(pSoldier->bAssignment == IN_TRANSIT || !(pSoldier->bAssignment == IN_TRANSIT ||
pSoldier->bAssignment == ASSIGNMENT_DEAD || 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 // calculate the guy's opinion of the people he is with
pProfile = &(gMercProfiles[ pSoldier->ubProfile ]); pProfile = &(gMercProfiles[pSoldier->ubProfile]);
// if we're moving // 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 // we only check our opinions of people in our squad
fSameGroupOnly = TRUE; fSameGroupOnly = TRUE;
@@ -1285,19 +1284,20 @@ void HandleSnitchCheck( void )
fSameGroupOnly = FALSE; fSameGroupOnly = FALSE;
} }
// loop through all other mercs // loop through all other mercs
bOtherID = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; bOtherID = gTacticalStatus.Team[gbPlayerNum].bFirstID;
for ( pOtherSoldier = MercPtrs[ bOtherID ]; bOtherID <= bLastTeamID; bOtherID++,pOtherSoldier++) for ( pOtherSoldier = MercPtrs[bOtherID]; bOtherID <= bLastTeamID; ++bOtherID, pOtherSoldier++ )
{ {
// skip past ourselves and all inactive mercs // 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 == IN_TRANSIT ||
pOtherSoldier->bAssignment == ASSIGNMENT_DEAD || 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 // all we have to check is the group ID
if (pSoldier->ubGroupID != pOtherSoldier->ubGroupID) if ( pSoldier->ubGroupID != pOtherSoldier->ubGroupID )
{ {
continue; continue;
} }
@@ -1305,72 +1305,72 @@ void HandleSnitchCheck( void )
else else
{ {
// check to see if the location is the same // check to see if the location is the same
if (pOtherSoldier->sSectorX != pSoldier->sSectorX || if ( pOtherSoldier->sSectorX != pSoldier->sSectorX ||
pOtherSoldier->sSectorY != pSoldier->sSectorY || pOtherSoldier->sSectorY != pSoldier->sSectorY ||
pOtherSoldier->bSectorZ != pSoldier->bSectorZ) pOtherSoldier->bSectorZ != pSoldier->bSectorZ )
{ {
continue; continue;
} }
// if the OTHER soldier is in motion then we don't do anything! // 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; continue;
} }
} }
bOpinion = SoldierRelation( pSoldier, pOtherSoldier); bOpinion = SoldierRelation( pSoldier, pOtherSoldier );
if( bOpinion <= gSkillTraitValues.bSNTMercOpinionAboutMercTreshold ) 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!) // check death rate vs. merc's tolerance once/day (ignores buddies!)
if( MercThinksDeathRateTooHigh( pSoldier->ubProfile ) ) if ( MercThinksDeathRateTooHigh( pSoldier->ubProfile ) )
{ {
// too high, inform // 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!) // check his morale vs. his morale tolerance once/day (ignores buddies!)
if( MercThinksHisMoraleIsTooLow( pSoldier ) ) if ( MercThinksHisMoraleIsTooLow( pSoldier ) )
{ {
// too low, inform // 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 // check his opinion about player's reputation
if( MercThinksBadReputationTooHigh( pSoldier->ubProfile ) ) if ( MercThinksBadReputationTooHigh( pSoldier->ubProfile ) )
{ {
// too high, inform // 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 // check his opinion about player activity
if( MercThinksPlayerIsInactiveTooLong( pSoldier->ubProfile ) ) if ( MercThinksPlayerIsInactiveTooLong( pSoldier->ubProfile ) )
{ {
// player inactive, inform // 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 // check if player owes him money
if( MercIsOwedTooMuchMoney( pSoldier->ubProfile ) ) if ( MercIsOwedTooMuchMoney( pSoldier->ubProfile ) )
{ {
// player owes him money, inform // 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 // 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 // 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..... // 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 // 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; UINT8 bSnitchID;
SOLDIERTYPE *pSnitch; SOLDIERTYPE *pSnitch;
BOOLEAN fSleepingSnitch = FALSE; 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; bSnitchID = event.ubSnitchID;
pSnitch = FindSoldierByProfileID(bSnitchID,TRUE); pSnitch = FindSoldierByProfileID( bSnitchID, TRUE );
if( pSnitch == NULL ) if ( pSnitch == NULL )
continue; continue;
if( !(pSnitch->bActive) ) if ( !(pSnitch->bActive) )
continue; continue;
if( pSnitch->flags.fMercAsleep ) if ( pSnitch->flags.fMercAsleep )
fSleepingSnitch = TRUE; fSleepingSnitch = TRUE;
// snitch introduction // snitch introduction
if ( fSleepingSnitch )
TacticalCharacterDialogueWithSpecialEvent( pSnitch, 0, DIALOGUE_SPECIAL_EVENT_SLEEP, 0, 0 );
if( fSleepingSnitch ) SnitchTacticalCharacterDialogue( pSnitch, 0, SNITCH_INTRODUCTION, NO_PROFILE, NO_PROFILE );
TacticalCharacterDialogueWithSpecialEvent( FindSoldierByProfileID(bSnitchID,TRUE), 0, DIALOGUE_SPECIAL_EVENT_SLEEP, 0,0 );
SnitchTacticalCharacterDialogue(FindSoldierByProfileID(bSnitchID,TRUE),0,SNITCH_INTRODUCTION,NOBODY,NOBODY);
// process all reports by the same snitch in row // 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 // check if relevant mercs are well
SOLDIERTYPE *pSoldier, *pOtherSoldier; SOLDIERTYPE *pSoldier, *pOtherSoldier;
pSoldier = FindSoldierByProfileID(SnitchEvents[bCounter2].ubTargetProfile,TRUE); pSoldier = FindSoldierByProfileID( event2.ubTargetProfile, TRUE );
if( pSoldier == NULL || !(pSoldier->bActive) ) if ( pSoldier == NULL || !(pSoldier->bActive) )
continue; continue;
if( SnitchEvents[bCounter2].ubEventType == SNITCH_HATED_PERSON ) if ( event2.ubEventType == SNITCH_HATED_PERSON )
{ {
pOtherSoldier = FindSoldierByProfileID(SnitchEvents[bCounter2].ubSecondaryTargetProfile,TRUE); pOtherSoldier = FindSoldierByProfileID( event2.ubSecondaryTargetProfile, TRUE );
if( pOtherSoldier == NULL || !(pOtherSoldier->bActive) ) if ( pOtherSoldier == NULL || !(pOtherSoldier->bActive) )
continue; continue;
} }
// say this info // say this info
SnitchTacticalCharacterDialogue(FindSoldierByProfileID(bSnitchID,TRUE),SnitchEvents[bCounter2].ubEventType,SnitchEvents[bCounter2].ubEventType, SnitchTacticalCharacterDialogue( pSnitch, event2.ubEventType, event2.ubEventType, event2.ubTargetProfile, event2.ubSecondaryTargetProfile );
SnitchEvents[bCounter2].ubTargetProfile,SnitchEvents[bCounter2].ubSecondaryTargetProfile);
// clear info // 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; INT16 sSnitchingChance = 0;
UINT8 ubSnitchProfile; UINT8 ubSnitchProfile;
SOLDIERTYPE * pSnitch; SOLDIERTYPE * pSnitch;
SOLDIERTYPE * pSoldier; SOLDIERTYPE * pSoldier;
SOLDIERTYPE * pOtherSoldier; SOLDIERTYPE * pOtherSoldier;
pSoldier = FindSoldierByProfileID(ubTargetProfile,FALSE); pSoldier = FindSoldierByProfileID( ubTargetProfile, FALSE );
pOtherSoldier = FindSoldierByProfileID(ubSecondaryTargetProfile,FALSE); pOtherSoldier = FindSoldierByProfileID( ubSecondaryTargetProfile, FALSE );
// loop through all other mercs // loop through all other mercs
bSnitchID = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; bSnitchID = gTacticalStatus.Team[gbPlayerNum].bFirstID;
for ( pSnitch = MercPtrs[ bSnitchID ]; bSnitchID <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; bSnitchID++,pSnitch++) 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;
ubSnitchProfile = pSnitch->ubProfile; ubSnitchProfile = pSnitch->ubProfile;
// skip past ourselves and all inactive mercs // skip past ourselves and all inactive mercs
if (ProfileHasSkillTrait(ubSnitchProfile,SNITCH_NT) && if ( ProfileHasSkillTrait( ubSnitchProfile, SNITCH_NT ) &&
ubSnitchProfile != ubTargetProfile && ubSnitchProfile != ubSecondaryTargetProfile ubSnitchProfile != ubTargetProfile && ubSnitchProfile != ubSecondaryTargetProfile
&& pSnitch->bActive && ubSnitchProfile != NO_PROFILE && && pSnitch->bActive && ubSnitchProfile != NO_PROFILE &&
!(pSnitch->bAssignment == IN_TRANSIT || !(pSnitch->bAssignment == IN_TRANSIT ||
pSnitch->bAssignment == ASSIGNMENT_DEAD || pSnitch->bAssignment == ASSIGNMENT_DEAD ||
pSnitch->bAssignment == ASSIGNMENT_POW)) pSnitch->bAssignment == ASSIGNMENT_POW) )
{ {
if (fSameGroupOnly) if ( fSameGroupOnly )
{ {
// all we have to check is the group ID // all we have to check is the group ID
if (pSoldier->ubGroupID != pSnitch->ubGroupID) if ( pSoldier->ubGroupID != pSnitch->ubGroupID )
{ {
continue; continue;
} }
@@ -1483,15 +1485,15 @@ UINT8 RememberSnitchableEvent( UINT8 ubTargetProfile, UINT8 ubSecondaryTargetPro
else else
{ {
// check to see if the location is the same // check to see if the location is the same
if (pSnitch->sSectorX != pSoldier->sSectorX || if ( pSnitch->sSectorX != pSoldier->sSectorX ||
pSnitch->sSectorY != pSoldier->sSectorY || pSnitch->sSectorY != pSoldier->sSectorY ||
pSnitch->bSectorZ != pSoldier->bSectorZ) pSnitch->bSectorZ != pSoldier->bSectorZ )
{ {
continue; continue;
} }
// if snitch is in motion then we don't do anything! // 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; continue;
} }
@@ -1501,8 +1503,8 @@ UINT8 RememberSnitchableEvent( UINT8 ubTargetProfile, UINT8 ubSecondaryTargetPro
// decreased if target doesn't like snitch, increased if snitch doesn't like him // decreased if target doesn't like snitch, increased if snitch doesn't like him
sSnitchingChance = gSkillTraitValues.ubSNTBaseChance; sSnitchingChance = gSkillTraitValues.ubSNTBaseChance;
sSnitchingChance = (INT16)(sSnitchingChance + sSnitchingChance = (INT16)(sSnitchingChance +
SoldierRelation( pSoldier, pSnitch)*gSkillTraitValues.fSNTMercOpinionAboutSnitchBonusModifier+ SoldierRelation( pSoldier, pSnitch )*gSkillTraitValues.fSNTMercOpinionAboutSnitchBonusModifier +
SoldierRelation( pSnitch, pSoldier)*gSkillTraitValues.fSNTSnitchOpinionAboutMercBonusModifier+ SoldierRelation( pSnitch, pSoldier )*gSkillTraitValues.fSNTSnitchOpinionAboutMercBonusModifier +
gMercProfiles[ubSnitchProfile].bLeadership*gSkillTraitValues.fSNTSnitchLeadershipBonusModifer); gMercProfiles[ubSnitchProfile].bLeadership*gSkillTraitValues.fSNTSnitchLeadershipBonusModifer);
if ( pSoldier->bAssignment == pSnitch->bAssignment ) if ( pSoldier->bAssignment == pSnitch->bAssignment )
{ {
@@ -1512,7 +1514,7 @@ UINT8 RememberSnitchableEvent( UINT8 ubTargetProfile, UINT8 ubSecondaryTargetPro
{ {
sSnitchingChance += gSkillTraitValues.bSNTSociableMercBonus; sSnitchingChance += gSkillTraitValues.bSNTSociableMercBonus;
} }
if ( gMercProfiles[pSnitch->ubProfile].bCharacterTrait == CHAR_TRAIT_LONER) if ( gMercProfiles[pSnitch->ubProfile].bCharacterTrait == CHAR_TRAIT_LONER )
{ {
sSnitchingChance += gSkillTraitValues.bSNTLonerMercBonus; sSnitchingChance += gSkillTraitValues.bSNTLonerMercBonus;
} }
@@ -1520,29 +1522,30 @@ UINT8 RememberSnitchableEvent( UINT8 ubTargetProfile, UINT8 ubSecondaryTargetPro
{ {
if ( gSkillTraitValues.bSNTMercOpinionAboutMercTreshold != HATED_OPINION ) if ( gSkillTraitValues.bSNTMercOpinionAboutMercTreshold != HATED_OPINION )
{ {
sSnitchingChance = (INT16)( sSnitchingChance * sSnitchingChance = (INT16)(sSnitchingChance *
( 1.0 - (FLOAT)( SoldierRelation( pSoldier, pOtherSoldier ) - HATED_OPINION ) / (1.0 - (FLOAT)(SoldierRelation( pSoldier, pOtherSoldier ) - HATED_OPINION) /
(FLOAT)( gSkillTraitValues.bSNTMercOpinionAboutMercTreshold - HATED_OPINION ) ) ); (FLOAT)(gSkillTraitValues.bSNTMercOpinionAboutMercTreshold - HATED_OPINION)));
} }
} }
if ( gMercProfiles[pSnitch->ubProfile].bDisability == DEAF ) if ( gMercProfiles[pSnitch->ubProfile].bDisability == DEAF )
{ {
sSnitchingChance /= 2; sSnitchingChance /= 2;
} }
sSnitchingChance = max(0, sSnitchingChance); sSnitchingChance = max( 0, sSnitchingChance );
if( Random(100) < (UINT8)sSnitchingChance ) if ( Random( 100 ) < (UINT8)sSnitchingChance )
{ {
//information gathered succesfully, remember event to report it later //information gathered succesfully, remember event to report it later
SnitchEvents[ubSnitchEventsCounter].ubEventType = ubEventType; SnitchEvent event;
SnitchEvents[ubSnitchEventsCounter].ubSnitchID = ubSnitchProfile;
SnitchEvents[ubSnitchEventsCounter].ubTargetProfile = ubTargetProfile; event.ubEventType = ubEventType;
SnitchEvents[ubSnitchEventsCounter].ubSecondaryTargetProfile = ubSecondaryTargetProfile; event.ubSnitchID = ubSnitchProfile;
++ubSnitchEventsCounter; event.ubTargetProfile = ubTargetProfile;
event.ubSecondaryTargetProfile = ubSecondaryTargetProfile;
aVec.push_back( event );
} }
} }
} }
return ubSnitchEventsCounter;
} }
void DailyMoraleUpdate(SOLDIERTYPE *pSoldier) void DailyMoraleUpdate(SOLDIERTYPE *pSoldier)
+2 -2
View File
@@ -154,8 +154,8 @@ extern INT8 GetMoraleModifier( SOLDIERTYPE * pSoldier );
void HourlyMoraleUpdate( void ); void HourlyMoraleUpdate( void );
void HandleSnitchCheck( void ); void HandleSnitchCheck( void );
void HandleSnitchesReports( SnitchEvent *SnitchEvents, UINT8 ubSnitchEventsCounter ); void HandleSnitchesReports( std::vector<SnitchEvent>& aVec );
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 );
void DailyMoraleUpdate( SOLDIERTYPE *pSoldier ); void DailyMoraleUpdate( SOLDIERTYPE *pSoldier );
void DecayTacticalMoraleModifiers( void ); 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 // 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 ) ] ); KillOnePrisoner( &SectorInfo[ SECTOR( gWorldSectorX, gWorldSectorY ) ] );
} }
else if ( pSoldierOld->bTeam == MILITIA_TEAM ) 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 ) 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 sector is controlled by enemies, it's not ours (duh!)
if ( !SectorOursAndPeaceful( sX, sY, 0 ) ) if ( StrategicMap[sX + sY * MAP_WORLD_X].fEnemyControlled )
continue; 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 // only sectors where there are no ongoing battles or even enemy garrisons are valid for our cause
if ( !SectorInfo[ (UINT8)SECTOR( sX, sY ) ].fSurfaceWasEverPlayerControlled ) // the current sector is ok though - if we call this function, we are currently deciding where to move the current prisoners
continue; 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? // Is there a prison in this sector?
for (UINT16 cnt = 0; cnt < NUM_FACILITY_TYPES; ++cnt) for (UINT16 cnt = 0; cnt < NUM_FACILITY_TYPES; ++cnt)
@@ -6612,247 +6617,221 @@ BOOLEAN GetPlayerControlledPrisonList( std::vector<UINT32>& arSectorIDVector )
extern INT32 giReinforcementPool; 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 ) void PrisonerMessageBoxCallBack( UINT8 ubExitValue )
{ {
UINT32 usSectorID = 0; UINT32 usSectorID = 0;
// Get a list of all available prisons, and create a fitting messagebox // Get a list of all available prisons, and create a fitting messagebox
std::vector<UINT32> prisonsectorvector; std::vector<UINT32> prisonsectorvector;
if ( GetPlayerControlledPrisonList( prisonsectorvector ) ) if ( GetPlayerControlledPrisonList( prisonsectorvector ) )
{ {
UINT8 cnt = 1; UINT8 cnt = 1;
std::vector<UINT32>::iterator itend = prisonsectorvector.end(); std::vector<UINT32>::iterator itend = prisonsectorvector.end( );
for (std::vector<UINT32>::iterator it = prisonsectorvector.begin(); it != itend; ++it) for ( std::vector<UINT32>::iterator it = prisonsectorvector.begin( ); it != itend; ++it )
{ {
if ( ubExitValue == cnt ) if ( ubExitValue == cnt )
{ {
usSectorID = (*it); usSectorID = (*it);
break; break;
} }
++cnt; ++cnt;
} }
} }
// if sector is still not set, then we did not select one - release prisoners // if sector is still not set, then we did not select one - release prisoners
if ( usSectorID == 0 ) if ( usSectorID == 0 )
{ {
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_RELEASED] ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_RELEASED] );
} }
UINT16 prisonerstobemoved = 0; BOOLEAN success = FALSE;
UINT8 prisonersspecial = 0, prisonerselite = 0, prisonersregular = 0, prisonersadmin = 0; UINT16 prisonerstobemoved = gusPrisonersSpecial + gusPrisonersElite + gusPrisonersRegular + gusPrisonersAdmin;
BOOLEAN success = FALSE;
if ( !gbWorldSectorZ )
{
SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( gWorldSectorX, gWorldSectorY ) ] );
prisonerstobemoved = GetNumberOfPrisoners( pSectorInfo, &prisonersspecial, &prisonerselite, &prisonersregular, &prisonersadmin ); if ( usSectorID > 0 )
{
SECTORINFO *pPrisonSectorInfo = &(SectorInfo[usSectorID]);
DeleteAllPrisoners( pSectorInfo ); if ( pPrisonSectorInfo )
{
success = TRUE;
if ( usSectorID > 0) ChangeNumberOfPrisoners( pPrisonSectorInfo, gusPrisonersSpecial, gusPrisonersElite, gusPrisonersRegular, gusPrisonersAdmin );
{
SECTORINFO *pPrisonSectorInfo = &( SectorInfo[ usSectorID ] );
if ( pPrisonSectorInfo ) CHAR16 wString[64];
{ GetShortSectorString( SECTORX( usSectorID ), SECTORY( usSectorID ), wString );
success = TRUE; ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_SENTTOSECTOR], prisonerstobemoved, wString );
}
}
ChangeNumberOfPrisoners( pPrisonSectorInfo, prisonersspecial, prisonerselite, prisonersregular, prisonersadmin ); gusPrisonersSpecial = 0;
gusPrisonersElite = 0;
gusPrisonersRegular = 0;
gusPrisonersAdmin = 0;
CHAR16 wString[ 64 ]; if ( !success )
GetShortSectorString( SECTORX(usSectorID), SECTORY(usSectorID), wString ); {
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_SENTTOSECTOR], prisonerstobemoved, wString ); // 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;
} }
else
{
UNDERGROUND_SECTORINFO *pSectorInfo = FindUnderGroundSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ );
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;
} }
void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ ) void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
{ {
SOLDIERTYPE *pTeamSoldier; SOLDIERTYPE *pTeamSoldier;
INT32 cnt = 0; INT32 cnt = 0;
UINT8 ubNumPrisoners = 0; UINT16 ubNumPrisoners = 0;
UINT8 ubNumPrisonerAdmin = 0; UINT16 ubNumPrisonerAdmin = 0;
UINT8 ubNumPrisonerTroop = 0; UINT16 ubNumPrisonerTroop = 0;
UINT8 ubNumPrisonerElite = 0; UINT16 ubNumPrisonerElite = 0;
UINT16 ubNumPrisonerSpecial = 0;
// Check if the battle is won! // Check if the battle is won!
// Loop through all mercs and make go // Loop through all mercs and make go
for ( pTeamSoldier = Menptr, cnt = 0; cnt < TOTAL_SOLDIERS; ++pTeamSoldier, ++cnt ) for ( pTeamSoldier = Menptr, cnt = 0; cnt < TOTAL_SOLDIERS; ++pTeamSoldier, ++cnt )
{ {
// Kill those not already dead.,... // Kill those not already dead.,...
if ( pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bTeam == ENEMY_TEAM ) if ( pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bTeam == ENEMY_TEAM )
{ {
// Only pows that are not dead yet // Only pows that are not dead yet
if ( ( pTeamSoldier->bSoldierFlagMask & SOLDIER_POW ) && !( pTeamSoldier->flags.uiStatusFlags & SOLDIER_DEAD ) ) 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 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 ) //if ( pTeamSoldier->stats.bLife > OKLIFE && pTeamSoldier->stats.bLife != 0 )
{ {
switch ( pTeamSoldier->ubSoldierClass ) switch ( pTeamSoldier->ubSoldierClass )
{ {
case SOLDIER_CLASS_ADMINISTRATOR: ubNumPrisonerAdmin++; break; case SOLDIER_CLASS_ADMINISTRATOR: ++ubNumPrisonerAdmin; break;
case SOLDIER_CLASS_ARMY: ubNumPrisonerTroop++; break; case SOLDIER_CLASS_ARMY: ++ubNumPrisonerTroop; break;
case SOLDIER_CLASS_ELITE: ubNumPrisonerElite++; break; case SOLDIER_CLASS_ELITE: ++ubNumPrisonerElite; break;
default: default:
// if none of the above classes, ignore this one // if none of the above classes, ignore this one
continue; continue;
break; break;
} }
// Flugente: campaign stats // Flugente: campaign stats
gCurrentIncident.AddStat( pTeamSoldier, CAMPAIGNHISTORY_TYPE_PRISONER ); gCurrentIncident.AddStat( pTeamSoldier, CAMPAIGNHISTORY_TYPE_PRISONER );
++ubNumPrisoners; ++ubNumPrisoners;
// place items on the floor // place items on the floor
INT8 bVisible = 0; INT8 bVisible = 0;
UINT16 usItemFlags = 0; UINT16 usItemFlags = 0;
UINT8 size = pTeamSoldier->inv.size(); UINT8 size = pTeamSoldier->inv.size( );
for ( UINT8 cnt = 0; cnt < size; ++cnt ) for ( UINT8 cnt = 0; cnt < size; ++cnt )
{ {
OBJECTTYPE* pObj = &( pTeamSoldier->inv[ cnt ] ); OBJECTTYPE* pObj = &(pTeamSoldier->inv[cnt]);
if ( pObj->exists() == true ) if ( pObj->exists( ) == true )
{ {
// Check if it's supposed to be dropped // Check if it's supposed to be dropped
if ( !( (*pObj).fFlags & OBJECT_UNDROPPABLE ) || pTeamSoldier->bTeam == gbPlayerNum ) if ( !((*pObj).fFlags & OBJECT_UNDROPPABLE) || pTeamSoldier->bTeam == gbPlayerNum )
{ {
if ( !(Item[ pObj->usItem ].defaultundroppable ) ) if ( !(Item[pObj->usItem].defaultundroppable) )
{ {
//ReduceAmmoDroppedByNonPlayerSoldiers( pTeamSoldier, cnt ); //ReduceAmmoDroppedByNonPlayerSoldiers( pTeamSoldier, cnt );
//if this soldier was an enemy //if this soldier was an enemy
// Kaiden: Added from UB's reveal all items after combat feature! // 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. // HEADROCK HAM B2.8: Now also reveals equipment dropped by militia, if requirement is met.
if( pTeamSoldier->bTeam == ENEMY_TEAM || if ( pTeamSoldier->bTeam == ENEMY_TEAM ||
( gGameExternalOptions.ubMilitiaDropEquipment == 2 && pTeamSoldier->bTeam == MILITIA_TEAM ) || (gGameExternalOptions.ubMilitiaDropEquipment == 2 && pTeamSoldier->bTeam == MILITIA_TEAM) ||
( gGameExternalOptions.ubMilitiaDropEquipment == 1 && pTeamSoldier->bTeam == MILITIA_TEAM && Menptr[ pTeamSoldier->ubAttackerID ].bTeam != OUR_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 //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; 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 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 -= (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.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) //if(UsingNewAttachmentSystem()==true)
//ReduceAttachmentsOnGunForNonPlayerChars(pTeamSoldier, pObj); //ReduceAttachmentsOnGunForNonPlayerChars(pTeamSoldier, pObj);
// HEADROCK HAM B2.8: Militia will drop items only if allowed. // HEADROCK HAM B2.8: Militia will drop items only if allowed.
if (!(gGameExternalOptions.ubMilitiaDropEquipment == 0 && pTeamSoldier->bTeam == MILITIA_TEAM ) && if ( !(gGameExternalOptions.ubMilitiaDropEquipment == 0 && pTeamSoldier->bTeam == MILITIA_TEAM) &&
!(gGameExternalOptions.ubMilitiaDropEquipment == 1 && pTeamSoldier->bTeam == MILITIA_TEAM && Menptr[ pTeamSoldier->ubAttackerID ].bTeam == OUR_TEAM )) !(gGameExternalOptions.ubMilitiaDropEquipment == 1 && pTeamSoldier->bTeam == MILITIA_TEAM && Menptr[pTeamSoldier->ubAttackerID].bTeam == OUR_TEAM) )
{ {
AddItemToPool( pTeamSoldier->sGridNo, pObj, bVisible , pTeamSoldier->pathing.bLevel, usItemFlags, -1 ); 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 if ( pTeamSoldier->bTeam != gbPlayerNum )
AllSoldiersLookforItems( TRUE ); // Remove merc!
// ATE: Remove merc slot first - will disappear if no corpse data found!
TacticalRemoveSoldier( pTeamSoldier->ubID );
else
pTeamSoldier->RemoveSoldierFromGridNo( );
if ( pTeamSoldier->bTeam != gbPlayerNum ) // this function updates number of enemies, and also updates groups
// Remove merc! ProcessQueenCmdImplicationsOfDeath( pTeamSoldier );
// 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 // Remove as target
ProcessQueenCmdImplicationsOfDeath( pTeamSoldier ); RemoveManAsTarget( pTeamSoldier );
}
}
}
}
// Remove as target if ( ubNumPrisoners )
RemoveManAsTarget( pTeamSoldier ); {
} // Make team look for items
} AllSoldiersLookforItems( TRUE );
}
}
if (!bMapZ) // Battle ended Above-ground // Get a list of all available prisons, and create a fitting messagebox
{ std::vector<UINT32> prisonsectorvector;
SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( sMapX, sMapY ) ] ); 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); GetShortSectorString( SECTORX( usSectorID ), SECTORY( usSectorID ), zShortTownIDString );
}
else
{
UNDERGROUND_SECTORINFO *pSectorInfo = FindUnderGroundSector( sMapX, sMapY, bMapZ );
ChangeNumberOfPrisoners(pSectorInfo, 0, ubNumPrisonerElite, ubNumPrisonerTroop, ubNumPrisonerAdmin); // Set string for generic button
} swprintf( gzUserDefinedButton[cnt++], L"%s", zShortTownIDString );
if ( ubNumPrisoners ) if ( cnt >= 7 )
{ break;
// 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 ];
GetShortSectorString( SECTORX(usSectorID), SECTORY(usSectorID), zShortTownIDString ); for ( ; cnt < 8; ++cnt )
{
wcscpy( gzUserDefinedButton[cnt], TacticalStr[PRISONER_LETGO_STR] );
}
// Set string for generic button // remember all prisoners...
swprintf( gzUserDefinedButton[ cnt++ ], L"%s", zShortTownIDString ); gusPrisonersSpecial = ubNumPrisonerSpecial;
gusPrisonersElite = ubNumPrisonerElite;
gusPrisonersRegular = ubNumPrisonerTroop;
gusPrisonersAdmin = ubNumPrisonerAdmin;
if ( cnt >= 7 ) DoMessageBox( MSG_BOX_BASIC_MEDIUM_BUTTONS, TacticalStr[PRISONER_DECIDE_STR], GAME_SCREEN, MSG_BOX_FLAG_GENERIC_EIGHT_BUTTONS, PrisonerMessageBoxCallBack, NULL );
break; }
} else
DoMessageBox( MSG_BOX_BASIC_STYLE, TacticalStr[PRISONER_NO_PRISONS_STR], GAME_SCREEN, (UINT8)MSG_BOX_FLAG_OK, NULL, NULL );
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 );
}
} }
// Flugente: for campaign stats, we want to know how many people were wounded. // 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 // Once combat ends, we count all these flags and remove them
void UpdateWoundedFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ ) void UpdateWoundedFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
{ {
SOLDIERTYPE *pSoldier; SOLDIERTYPE *pSoldier;
INT32 cnt = 0; INT32 cnt = 0;
UINT8 ubNumPrisoners = 0; UINT8 ubNumPrisoners = 0;
UINT8 ubNumPrisonerAdmin = 0; UINT8 ubNumPrisonerAdmin = 0;
UINT8 ubNumPrisonerTroop = 0; UINT8 ubNumPrisonerTroop = 0;
UINT8 ubNumPrisonerElite = 0; UINT8 ubNumPrisonerElite = 0;
// Check if the battle is won! // Check if the battle is won!
// Loop through all mercs and make go // Loop through all mercs and make go
for ( pSoldier = Menptr, cnt = 0; cnt < TOTAL_SOLDIERS; ++pSoldier, ++cnt ) for ( pSoldier = Menptr, cnt = 0; cnt < TOTAL_SOLDIERS; ++pSoldier, ++cnt )
{ {
// Kill those not already dead.,... // Kill those not already dead.,...
if ( pSoldier->bActive && pSoldier->bInSector && pSoldier->bSoldierFlagMask & SOLDIER_FRESHWOUND ) if ( pSoldier->bActive && pSoldier->bInSector && pSoldier->usSoldierFlagMask & SOLDIER_FRESHWOUND )
{ {
// remove flag, so we are not counted again // remove flag, so we are not counted again
pSoldier->bSoldierFlagMask &= ~SOLDIER_FRESHWOUND; pSoldier->usSoldierFlagMask &= ~SOLDIER_FRESHWOUND;
// the dead count as dead, not as wounded // the dead count as dead, not as wounded
if ( pSoldier->stats.bLife <= 0 ) if ( pSoldier->stats.bLife <= 0 )
@@ -6883,27 +6862,27 @@ void UpdateWoundedFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
// Flugente: campaign stats // Flugente: campaign stats
gCurrentIncident.AddStat( pSoldier, CAMPAIGNHISTORY_TYPE_WOUND ); gCurrentIncident.AddStat( pSoldier, CAMPAIGNHISTORY_TYPE_WOUND );
} }
} }
} }
void RemoveStaticEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ ) void RemoveStaticEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
{ {
if (!bMapZ) // Battle ended Above-ground if ( !bMapZ ) // Battle ended Above-ground
{ {
SECTORINFO *pSectorInfo = &( SectorInfo[ SECTOR( sMapX, sMapY ) ] ); SECTORINFO *pSectorInfo = &(SectorInfo[SECTOR( sMapX, sMapY )]);
pSectorInfo->ubNumAdmins = pSectorInfo->ubNumTroops = pSectorInfo->ubNumElites = 0; pSectorInfo->ubNumAdmins = pSectorInfo->ubNumTroops = pSectorInfo->ubNumElites = 0;
pSectorInfo->ubAdminsInBattle = pSectorInfo->ubTroopsInBattle = pSectorInfo->ubElitesInBattle = 0; pSectorInfo->ubAdminsInBattle = pSectorInfo->ubTroopsInBattle = pSectorInfo->ubElitesInBattle = 0;
} }
else else
{ {
UNDERGROUND_SECTORINFO *pSectorInfo; UNDERGROUND_SECTORINFO *pSectorInfo;
pSectorInfo = FindUnderGroundSector( sMapX, sMapY, bMapZ ); pSectorInfo = FindUnderGroundSector( sMapX, sMapY, bMapZ );
pSectorInfo->ubNumAdmins = pSectorInfo->ubNumTroops = pSectorInfo->ubNumElites = 0; pSectorInfo->ubNumAdmins = pSectorInfo->ubNumTroops = pSectorInfo->ubNumElites = 0;
pSectorInfo->ubAdminsInBattle = pSectorInfo->ubTroopsInBattle = pSectorInfo->ubElitesInBattle = 0; pSectorInfo->ubAdminsInBattle = pSectorInfo->ubTroopsInBattle = pSectorInfo->ubElitesInBattle = 0;
} }
} }
@@ -7819,7 +7798,7 @@ UINT8 NumCapableEnemyInSector( )
else else
{ {
// Flugente: captured soldiers also do not count // Flugente: captured soldiers also do not count
if ( pTeamSoldier->bSoldierFlagMask & SOLDIER_POW ) if ( pTeamSoldier->usSoldierFlagMask & SOLDIER_POW )
continue; continue;
// Check for any more badguys // Check for any more badguys
@@ -8734,7 +8713,6 @@ BOOLEAN ProcessImplicationsOfPCAttack( SOLDIERTYPE * pSoldier, SOLDIERTYPE ** pp
SetSoldierNeutral( pTarget ); SetSoldierNeutral( pTarget );
} }
} }
} }
} }
@@ -8864,7 +8842,7 @@ BOOLEAN ProcessImplicationsOfPCAttack( SOLDIERTYPE * pSoldier, SOLDIERTYPE ** pp
else if ( pTarget->bTeam == gbPlayerNum && !(gTacticalStatus.uiFlags & INCOMBAT) ) 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 // 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( 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 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 // 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(); enemysidestrength += pSoldier->GetSurrenderStrength();
else else
// player side counts double, to put more emphasize on overwhelming the enemy with mercs and not just spamming militia // 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...) // only if not dying, and if not a NPC (Mike...)
if( pSoldier->stats.bLife >= OKLIFE && pSoldier->ubProfile == NO_PROFILE ) if( pSoldier->stats.bLife >= OKLIFE && pSoldier->ubProfile == NO_PROFILE )
{ {
pSoldier->bSoldierFlagMask |= SOLDIER_POW; pSoldier->usSoldierFlagMask |= SOLDIER_POW;
// Remove as target // Remove as target
RemoveManAsTarget( pSoldier ); RemoveManAsTarget( pSoldier );
@@ -10365,7 +10343,7 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szPrisonerTextStr[STR_PRISONER_REFUSE_SURRENDER] ); 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 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(); MercPtrs[ gusSelectedSoldier ]->LooseDisguise();
@@ -10520,7 +10498,7 @@ void TeamRestock(UINT8 bTeam)
pSoldier->inv = createstruct.Inv; pSoldier->inv = createstruct.Inv;
// we took new gear, so we can drop it again // 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->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 // officers with double squadleader trait are captains, otherwise lieutnant
aType = max( aType, NUM_SKILL_TRAITS( pSoldier, SQUADLEADER_NT) ); 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 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; Corpse.usFlags |= ROTTING_CORPSE_NEVER_RISE_AGAIN;
// Flugente: copy name of soldier... // Flugente: copy name of soldier...
@@ -912,10 +912,10 @@ BOOLEAN TurnSoldierIntoCorpse( SOLDIERTYPE *pSoldier, BOOLEAN fRemoveMerc, BOOLE
#endif #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 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; Corpse.usFlags |= ROTTING_CORPSE_NO_VEST;
if ( pSoldier->bSoldierFlagMask & SOLDIER_DAMAGED_PANTS ) if ( pSoldier->usSoldierFlagMask & SOLDIER_DAMAGED_PANTS )
Corpse.usFlags |= ROTTING_CORPSE_NO_PANTS; Corpse.usFlags |= ROTTING_CORPSE_NO_PANTS;
// Determine corpse type! // Determine corpse type!
+4 -4
View File
@@ -1199,7 +1199,7 @@ BOOLEAN InternalAddSoldierToSector( UINT8 ubID, BOOLEAN fCalculateDirection, BOO
} }
// Flugente: campaign stats // Flugente: campaign stats
if ( pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP ) if ( pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP )
gCurrentIncident.usIncidentFlags |= INCIDENT_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 // 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) // 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.... // Override calculated direction if we were told to....
if ( pSoldier->ubInsertionDirection > 100 ) 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 // 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 ) if ( gGameExternalOptions.ubSkyriderHotLZ == 3 )
{ {
+83 -71
View File
@@ -2266,9 +2266,9 @@ void SOLDIERTYPE::CalcNewActionPoints( void )
this->bInitialActionPoints = this->bActionPoints; 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 // 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->bInitialActionPoints = 0;
this->bActionPoints = 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 // 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 ) if ( ubHitLocation == AIM_SHOT_TORSO )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_VEST; pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_VEST;
else if ( ubHitLocation == AIM_SHOT_LEGS ) else if ( ubHitLocation == AIM_SHOT_LEGS )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_PANTS; pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_PANTS;
// IF HERE AND GUY IS DEAD, RETURN! // IF HERE AND GUY IS DEAD, RETURN!
if ( pSoldier->flags.uiStatusFlags & SOLDIER_DEAD ) 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 // 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 ) if ( ubHitLocation == AIM_SHOT_TORSO )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_VEST; pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_VEST;
else if ( ubHitLocation == AIM_SHOT_LEGS ) else if ( ubHitLocation == AIM_SHOT_LEGS )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_PANTS; pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_PANTS;
INT32 sNewGridNo; 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 // 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 ) if ( ubHitLocation == AIM_SHOT_TORSO )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_VEST; pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_VEST;
else if ( ubHitLocation == AIM_SHOT_LEGS ) else if ( ubHitLocation == AIM_SHOT_LEGS )
pSoldier->bSoldierFlagMask |= SOLDIER_DAMAGED_PANTS; pSoldier->usSoldierFlagMask |= SOLDIER_DAMAGED_PANTS;
// IF HERE AND GUY IS DEAD, RETURN! // IF HERE AND GUY IS DEAD, RETURN!
if ( pSoldier->flags.uiStatusFlags & SOLDIER_DEAD ) if ( pSoldier->flags.uiStatusFlags & SOLDIER_DEAD )
@@ -7171,7 +7171,7 @@ void SOLDIERTYPE::ChangeSoldierStance( UINT8 ubDesiredStance )
this->EVENT_InitNewSoldierAnim( usNewState, 0 , FALSE ); this->EVENT_InitNewSoldierAnim( usNewState, 0 , FALSE );
} }
this->bSoldierFlagMask |= SOLDIER_REDOFLASHLIGHT; this->usSoldierFlagMask |= SOLDIER_REDOFLASHLIGHT;
} }
void SOLDIERTYPE::EVENT_InternalSetSoldierDestination( UINT16 usNewDirection, BOOLEAN fFromMove, UINT16 usAnimState ) 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 // Flugente: note we received a fresh wound
if ( sLifeDeduct > 0 ) if ( sLifeDeduct > 0 )
this->bSoldierFlagMask |= SOLDIER_FRESHWOUND; this->usSoldierFlagMask |= SOLDIER_FRESHWOUND;
// Calculate damage to our items if from an explosion! // Calculate damage to our items if from an explosion!
if ( ubReason == TAKE_DAMAGE_EXPLOSION || ubReason == TAKE_DAMAGE_STRUCTURE_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 ) else if ( !pTSoldier->aiData.bNeutral && pTSoldier->stats.bLife >= OKLIFE && pTSoldier->bSide != this->bSide )
*/ */
// Flugente: people we captured don't refuse to be bandaged // 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; fRefused = TRUE;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, Message[ STR_REFUSE_FIRSTAID ] ); 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 // 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 // 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; return FALSE;
// if we are in a suspicious activity: not covert // if we are in a suspicious activity: not covert
@@ -15375,7 +15375,6 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
this->usAnimState == PUNCH_BREATH || this->usAnimState == PUNCH_BREATH ||
this->usAnimState == KICK_DOOR || this->usAnimState == KICK_DOOR ||
this->usAnimState == CUTTING_FENCE || this->usAnimState == CUTTING_FENCE ||
this->usAnimState == THROW_KNIFE ||
this->usAnimState == PLANT_BOMB || this->usAnimState == PLANT_BOMB ||
this->usAnimState == USE_REMOTE || this->usAnimState == USE_REMOTE ||
this->usAnimState == STEAL_ITEM || this->usAnimState == STEAL_ITEM ||
@@ -15389,7 +15388,13 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
this->usAnimState == FOCUSED_STAB || this->usAnimState == FOCUSED_STAB ||
this->usAnimState == HTH_KICK || this->usAnimState == HTH_KICK ||
this->usAnimState == FOCUSED_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() ); 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 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() ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NO_CIV], this->GetName() );
return FALSE; return FALSE;
} }
// if we are trying to dress like a soldier, but aren't sucessful: not covert // 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; return FALSE;
} }
@@ -15431,7 +15436,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
return FALSE; 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() ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_DRUNKEN_SOLDIER], this->GetName() );
return FALSE; return FALSE;
@@ -15449,7 +15454,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
return FALSE; 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() ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOO_CLOSE], this->GetName() );
return FALSE; return FALSE;
@@ -15460,7 +15465,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
default: 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 // 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) // 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() ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOO_CLOSE], this->GetName() );
return FALSE; 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 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 ) 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 // civilians are suspicious if they are found in certain sectors. Especially at night
// sector specific value: // 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 our equipment is too good, that is suspicious... not covert!
if ( this->EquipmentTooGood( (distance < discoverrange) ) ) 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 // 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 // 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 // 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 :-) // I deem this necessary, to avoid cheap exploits by nefarious players :-)
@@ -15647,7 +15652,7 @@ BOOLEAN SOLDIERTYPE::RecognizeAsCombatant(UINT8 ubTargetID)
#endif #endif
// not in covert mode: we recognize him // 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; return TRUE;
// neutral characters just dont care // neutral characters just dont care
@@ -15688,7 +15693,7 @@ BOOLEAN SOLDIERTYPE::RecognizeAsCombatant(UINT8 ubTargetID)
if ( !pSoldier->SeemsLegit(this->ubID) ) if ( !pSoldier->SeemsLegit(this->ubID) )
{ {
// aha, he/she's a spy! Blow cover // 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(); pSoldier->LooseDisguise();
@@ -15719,7 +15724,7 @@ BOOLEAN SOLDIERTYPE::RecognizeAsCombatant(UINT8 ubTargetID)
void SOLDIERTYPE::LooseDisguise( void ) void SOLDIERTYPE::LooseDisguise( void )
{ {
// loose any covert flags // loose any covert flags
this->bSoldierFlagMask &= ~(SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER); this->usSoldierFlagMask &= ~(SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER);
// rehandle sight for everybody // rehandle sight for everybody
SOLDIERTYPE* pSoldier; SOLDIERTYPE* pSoldier;
@@ -15738,15 +15743,15 @@ void SOLDIERTYPE::LooseDisguise( void )
void SOLDIERTYPE::Strip() void SOLDIERTYPE::Strip()
{ {
// if covert, loose that ability // if covert, loose that ability
if ( this->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) ) if ( this->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
{ {
LooseDisguise(); LooseDisguise();
} }
// if already not covert, take off clothes // 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 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; UINT16 vestitem = 0;
if ( GetFirstClothesItemWithSpecificData(&vestitem, this->VestPal, "blank") ) 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] ); 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; UINT16 pantsitem = 0;
if ( GetFirstClothesItemWithSpecificData(&pantsitem, "blank", this->PantsPal) ) if ( GetFirstClothesItemWithSpecificData(&pantsitem, "blank", this->PantsPal) )
@@ -15773,7 +15778,7 @@ void SOLDIERTYPE::Strip()
} }
// loose any clothes flags // loose any clothes flags
this->bSoldierFlagMask &= ~(SOLDIER_NEW_VEST|SOLDIER_NEW_PANTS); this->usSoldierFlagMask &= ~(SOLDIER_NEW_VEST|SOLDIER_NEW_PANTS);
// show our true colours // show our true colours
UINT16 usPaletteAnimSurface = LoadSoldierAnimationSurface( this, this->usAnimState ); UINT16 usPaletteAnimSurface = LoadSoldierAnimationSurface( this, this->usAnimState );
@@ -15791,7 +15796,7 @@ void SOLDIERTYPE::Strip()
SET_PALETTEREP_ID ( this->VestPal, pProfile->VEST ); SET_PALETTEREP_ID ( this->VestPal, pProfile->VEST );
SET_PALETTEREP_ID ( this->PantsPal, pProfile->PANTS ); 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->VestPal, gUniformColors[ UNIFORM_ENEMY_ELITE ].vest );
SET_PALETTEREP_ID( this->PantsPal, gUniformColors[ UNIFORM_ENEMY_ELITE ].pants ); SET_PALETTEREP_ID( this->PantsPal, gUniformColors[ UNIFORM_ENEMY_ELITE ].pants );
@@ -15869,7 +15874,7 @@ BOOLEAN SOLDIERTYPE::CanProcessPrisoners()
UINT32 SOLDIERTYPE::GetSurrenderStrength() 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; return 0;
UINT32 value = 100 + 10 * EffectiveExpLevel( this ) + EffectiveStrength( this, FALSE ) + 3 * EffectiveMarksmanship( this) + EffectiveLeadership( this) / 4; 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! // 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 // 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() ); 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; return TRUE;
// there can be non-NPC assassins too // there can be non-NPC assassins too
if ( this->bSoldierFlagMask & SOLDIER_ASSASSIN ) if ( this->usSoldierFlagMask & SOLDIER_ASSASSIN )
return TRUE; return TRUE;
return FALSE; return FALSE;
@@ -16242,11 +16247,11 @@ BOOLEAN SOLDIERTYPE::UpdateMultiTurnAction()
void SOLDIERTYPE::DropSectorEquipment() void SOLDIERTYPE::DropSectorEquipment()
{ {
// not if we already dropped the gear // not if we already dropped the gear
if ( this->bSoldierFlagMask & SOLDIER_EQUIPMENT_DROPPED ) if ( this->usSoldierFlagMask & SOLDIER_EQUIPMENT_DROPPED )
return; return;
// set marker: we are about to drop our gear // set marker: we are about to drop our gear
this->bSoldierFlagMask |= SOLDIER_EQUIPMENT_DROPPED; this->usSoldierFlagMask |= SOLDIER_EQUIPMENT_DROPPED;
OBJECTTYPE* pObj = NULL; OBJECTTYPE* pObj = NULL;
UINT8 size = this->inv.size(); UINT8 size = this->inv.size();
@@ -16770,13 +16775,13 @@ void SOLDIERTYPE::AddDrugValues(UINT8 uDrugType, UINT8 usEffect, UINT8 usTravelR
this->drugs.bDrugSideEffectRate[ uDrugType ] = 0; this->drugs.bDrugSideEffectRate[ uDrugType ] = 0;
// set flag: we are on drugs // set flag: we are on drugs
this->bSoldierFlagMask |= SOLDIER_DRUGGED; this->usSoldierFlagMask |= SOLDIER_DRUGGED;
} }
void SOLDIERTYPE::HandleFlashLights() void SOLDIERTYPE::HandleFlashLights()
{ {
// no more need to redo this check // 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 // we must be active and in a sector (not travelling) in a valid position
if ( !bActive || !bInSector || TileIsOutOfBounds(this->sGridNo) ) if ( !bActive || !bInSector || TileIsOutOfBounds(this->sGridNo) )
@@ -16790,11 +16795,11 @@ void SOLDIERTYPE::HandleFlashLights()
BOOLEAN fLightChanged = FALSE; BOOLEAN fLightChanged = FALSE;
// remove existing lights we 'own' // remove existing lights we 'own'
if ( this->bSoldierFlagMask & SOLDIER_LIGHT_OWNER ) if ( this->usSoldierFlagMask & SOLDIER_LIGHT_OWNER )
{ {
RemovePersonalLights( this->ubID ); RemovePersonalLights( this->ubID );
this->bSoldierFlagMask &= ~SOLDIER_LIGHT_OWNER; this->usSoldierFlagMask &= ~SOLDIER_LIGHT_OWNER;
fLightChanged = TRUE; fLightChanged = TRUE;
} }
@@ -16866,7 +16871,7 @@ void SOLDIERTYPE::HandleFlashLights()
} }
// take note: we own a light source // take note: we own a light source
this->bSoldierFlagMask |= SOLDIER_LIGHT_OWNER; this->usSoldierFlagMask |= SOLDIER_LIGHT_OWNER;
fLightChanged = TRUE; fLightChanged = TRUE;
} }
@@ -17011,10 +17016,10 @@ INT16 SOLDIERTYPE::GetAPBonus()
{ {
INT16 bonus = 0; INT16 bonus = 0;
if ( this->bSoldierFlagMask & SOLDIER_AIRDROP_TURN ) if ( this->usSoldierFlagMask & SOLDIER_AIRDROP_TURN )
bonus += this->GetBackgroundValue(BG_AIRDROP); bonus += this->GetBackgroundValue(BG_AIRDROP);
if ( this->bSoldierFlagMask & SOLDIER_ASSAULT_BONUS ) if ( this->usSoldierFlagMask & SOLDIER_ASSAULT_BONUS )
bonus += this->GetBackgroundValue(BG_ASSAULT); bonus += this->GetBackgroundValue(BG_ASSAULT);
UINT8 ubSector = (UINT8)SECTOR( this->sSectorX, this->sSectorY ); UINT8 ubSector = (UINT8)SECTOR( this->sSectorX, this->sSectorY );
@@ -17113,7 +17118,7 @@ INT16 SOLDIERTYPE::GetInterruptModifier( UINT8 usDistance )
bonus -= 3; 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 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; bonus -= 8;
return bonus; return bonus;
@@ -17122,7 +17127,7 @@ INT16 SOLDIERTYPE::GetInterruptModifier( UINT8 usDistance )
void SOLDIERTYPE::SoldierPropertyUpkeep() void SOLDIERTYPE::SoldierPropertyUpkeep()
{ {
// these effects last only one turn // 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 ) if ( HasBackgroundFlag( BACKGROUND_EXP_UNDERGROUND ) && this->bSectorZ )
++bExtraExpLevel; ++bExtraExpLevel;
@@ -17152,9 +17157,9 @@ void SOLDIERTYPE::SoldierPropertyUpkeep()
} }
// if soldier was seen this turn, increase his observed counter // 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]; ++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 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->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 // Flugente: campaign stats
gCurrentIncident.AddStat( this, CAMPAIGNHISTORY_TYPE_PARTICIPANT ); gCurrentIncident.AddStat( this, CAMPAIGNHISTORY_TYPE_PARTICIPANT );
@@ -17172,7 +17177,7 @@ void SOLDIERTYPE::SoldierPropertyUpkeep()
} }
else 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() BOOLEAN SOLDIERTYPE::IsJamming()
{ {
if ( bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_JAMMING ) if ( usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_JAMMING )
{ {
if ( CanUseRadio(FALSE) ) if ( CanUseRadio(FALSE) )
return TRUE; return TRUE;
// if we cannot use the radio, remove that flag hile we're at it // if we cannot use the radio, remove that flag hile we're at it
else else
bSoldierFlagMask &= ~SOLDIER_RADIO_OPERATOR_JAMMING; usSoldierFlagMask &= ~SOLDIER_RADIO_OPERATOR_JAMMING;
} }
return FALSE; return FALSE;
@@ -18014,7 +18019,7 @@ BOOLEAN SOLDIERTYPE::IsJamming()
BOOLEAN SOLDIERTYPE::JamCommunications() BOOLEAN SOLDIERTYPE::JamCommunications()
{ {
// not possible if already jamming // 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 ]); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[ MSG113_ALREADY_JAMMING ]);
return FALSE; return FALSE;
@@ -18028,7 +18033,7 @@ BOOLEAN SOLDIERTYPE::JamCommunications()
SwitchOffRadio(); SwitchOffRadio();
// add flag // add flag
bSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_JAMMING; usSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_JAMMING;
// play sound // play sound
PlayJA2SampleFromFile( "Sounds\\radioerror2.wav", RATE_11025, SoundVolume( MIDVOLUME, this->sGridNo ), 1, SoundDir( this->sGridNo ) ); PlayJA2SampleFromFile( "Sounds\\radioerror2.wav", RATE_11025, SoundVolume( MIDVOLUME, this->sGridNo ), 1, SoundDir( this->sGridNo ) );
@@ -18038,13 +18043,13 @@ BOOLEAN SOLDIERTYPE::JamCommunications()
BOOLEAN SOLDIERTYPE::IsScanning() BOOLEAN SOLDIERTYPE::IsScanning()
{ {
if ( bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_SCANNING ) if ( usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_SCANNING )
{ {
if ( CanUseRadio(FALSE) ) if ( CanUseRadio(FALSE) )
return TRUE; return TRUE;
// if we cannot use the radio, remove that flag hile we're at it // if we cannot use the radio, remove that flag hile we're at it
else else
bSoldierFlagMask &= ~SOLDIER_RADIO_OPERATOR_SCANNING; usSoldierFlagMask &= ~SOLDIER_RADIO_OPERATOR_SCANNING;
} }
return FALSE; return FALSE;
@@ -18053,7 +18058,7 @@ BOOLEAN SOLDIERTYPE::IsScanning()
BOOLEAN SOLDIERTYPE::ScanForJam() BOOLEAN SOLDIERTYPE::ScanForJam()
{ {
// not possible if already scanning // 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 ]); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[ MSG113_ALREADY_SCANNING ]);
return FALSE; return FALSE;
@@ -18067,7 +18072,7 @@ BOOLEAN SOLDIERTYPE::ScanForJam()
SwitchOffRadio(); SwitchOffRadio();
// add flag // add flag
bSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_SCANNING; usSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_SCANNING;
// play sound // play sound
PlayJA2SampleFromFile( "Sounds\\scan1.wav", RATE_11025, SoundVolume( MIDVOLUME, this->sGridNo ), 1, SoundDir( this->sGridNo ) ); PlayJA2SampleFromFile( "Sounds\\scan1.wav", RATE_11025, SoundVolume( MIDVOLUME, this->sGridNo ), 1, SoundDir( this->sGridNo ) );
@@ -18077,13 +18082,13 @@ BOOLEAN SOLDIERTYPE::ScanForJam()
BOOLEAN SOLDIERTYPE::IsRadioListening() BOOLEAN SOLDIERTYPE::IsRadioListening()
{ {
return ( (bSoldierFlagMask & SOLDIER_RADIO_OPERATOR_LISTENING) && CanUseRadio(FALSE) ); return ( (usSoldierFlagMask & SOLDIER_RADIO_OPERATOR_LISTENING) && CanUseRadio(FALSE) );
} }
BOOLEAN SOLDIERTYPE::RadioListen() BOOLEAN SOLDIERTYPE::RadioListen()
{ {
// not possible if already scanning // 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 ]); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, New113Message[ MSG113_ALREADY_LISTENING ]);
return FALSE; return FALSE;
@@ -18097,7 +18102,7 @@ BOOLEAN SOLDIERTYPE::RadioListen()
SwitchOffRadio(); SwitchOffRadio();
// add flag // add flag
bSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_LISTENING; usSoldierFlagMask |= SOLDIER_RADIO_OPERATOR_LISTENING;
// play sound // play sound
PlayJA2SampleFromFile( "Sounds\\scan1.wav", RATE_11025, SoundVolume( MIDVOLUME, this->sGridNo ), 1, SoundDir( this->sGridNo ) ); 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() BOOLEAN SOLDIERTYPE::SwitchOffRadio()
{ {
// erasing the flags is enough // 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; return TRUE;
} }
@@ -18172,9 +18177,9 @@ void SOLDIERTYPE::DepleteActiveRadioSetEnergy(BOOLEAN fActivation, BOOLEAN fAssi
cost = gItemSettings.energy_cost_radioset_activate; cost = gItemSettings.energy_cost_radioset_activate;
else if ( fAssignment ) else if ( fAssignment )
cost = gItemSettings.energy_cost_radioset_scan_assignment; 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; 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; cost = gItemSettings.energy_cost_radioset_scan;
else else
// nothing to do here.. // nothing to do here..
@@ -18234,7 +18239,7 @@ BOOLEAN SOLDIERTYPE::IsSpotting()
BOOLEAN SOLDIERTYPE::CanSpot( INT32 sTargetGridNo ) 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; return FALSE;
// additional checks if we want to know wether we can target a specific location // additional checks if we want to know wether we can target a specific location
@@ -18423,6 +18428,13 @@ BOOLEAN SOLDIERTYPE::AIDoctorSelf()
return FALSE; 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 ) INT32 CheckBleeding( SOLDIERTYPE *pSoldier )
{ {
@@ -19279,7 +19291,7 @@ void SOLDIERTYPE::EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection
UINT8 ubPerson = WhoIsThere2( sGridNo, this->pathing.bLevel ); 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 // we found someone we can handcuff
SOLDIERTYPE* pSoldier = MercPtrs[ ubPerson ]; SOLDIERTYPE* pSoldier = MercPtrs[ ubPerson ];
@@ -19315,7 +19327,7 @@ void SOLDIERTYPE::EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection
if ( success ) if ( success )
{ {
// arrest this guy // arrest this guy
pSoldier->bSoldierFlagMask |= SOLDIER_POW; pSoldier->usSoldierFlagMask |= SOLDIER_POW;
// Remove as target // Remove as target
RemoveManAsTarget( pSoldier ); RemoveManAsTarget( pSoldier );
@@ -19390,7 +19402,7 @@ void SOLDIERTYPE::EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection
this->DoMercBattleSound( BATTLE_SOUND_CURSE1 ); this->DoMercBattleSound( BATTLE_SOUND_CURSE1 );
// if we are disguised, there is a chance that he'll uncover us // 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->LooseDisguise();
this->Strip(); this->Strip();
@@ -19449,7 +19461,7 @@ void SOLDIERTYPE::EVENT_SoldierApplyItemToPerson( INT32 sGridNo, UINT8 ubDirecti
success = FALSE; success = FALSE;
// if we are disguised, there is a chance that he'll uncover us // 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->LooseDisguise();
this->Strip(); 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 // 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 // IF WE ARE CONSIDERING ATTACKING THEM. Creatures & bloodcats will attack neutrals
// but they can't attack empty vehicles!! // 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 typedef struct
{ {
@@ -1431,7 +1431,7 @@ public:
INT16 bExtraWisdom; // additional wisdom gained via drugs INT16 bExtraWisdom; // additional wisdom gained via drugs
INT8 bExtraExpLevel; // corruption can temporarily alter our ExpLevel without messing up our stats this way 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 // Flugente: food system
INT32 bFoodLevel; // current level of food saturation 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 // 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]; UINT8 ubFiller[20];
INT32 bSoldierFlagMask2; // anv: another bSoldierFlagMask UINT32 usSoldierFlagMask2; // anv: another usSoldierFlagMask
#ifdef JA2UB #ifdef JA2UB
@@ -1833,6 +1833,9 @@ public:
BOOLEAN AIDoctorFriend(); // AI-only: heal a wounded friend. Do NOT, repeat, NOT use this with mercs! 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! 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; }; // 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 // Flugente: if playing with the covert trait, the assassins come covert, so they are tougher to find
if ( gGameExternalOptions.fAssassinsAreDisguised && gGameOptions.fNewTraitSystem && pSoldier->IsAssassin() ) 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); 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 // 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 ) 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; 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 // 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 //Assign a bogus ID, then return it
pSoldier->ubID = NUM_PROFILES; pSoldier->ubID = NUM_PROFILES;
@@ -3162,7 +3162,7 @@ SOLDIERTYPE* TacticalCreateEnemyAssassin(UINT8 disguisetype)
pSoldier->stats.bAgility = (INT8)( 70 + Random( 16 ) ); pSoldier->stats.bAgility = (INT8)( 70 + Random( 16 ) );
// add assassin flag // add assassin flag
pSoldier->bSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_ASSASSIN); pSoldier->usSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_ASSASSIN);
// add spy trait lvl2 // add spy trait lvl2
pSoldier->stats.ubSkillTraits[0] = COVERT_NT; pSoldier->stats.ubSkillTraits[0] = COVERT_NT;
@@ -3247,8 +3247,8 @@ void CreateAssassin(UINT8 disguisetype)
fInterfacePanelDirty = DIRTYLEVEL2; 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) // 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->usSoldierFlagMask &= ~SOLDIER_COVERT_CIV;
pSoldier->bSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_ASSASSIN); pSoldier->usSoldierFlagMask |= (SOLDIER_COVERT_SOLDIER|SOLDIER_ASSASSIN);
// So we can see them! // So we can see them!
AllTeamsLookForAll(NO_INTERRUPTS); AllTeamsLookForAll(NO_INTERRUPTS);
@@ -3358,7 +3358,7 @@ void CreatePrisonerOfWar()
AddSoldierToSector( pSoldier->ubID ); AddSoldierToSector( pSoldier->ubID );
// mark this guy // mark this guy
pSoldier->bSoldierFlagMask |= SOLDIER_POW_PRISON; pSoldier->usSoldierFlagMask |= SOLDIER_POW_PRISON;
// set correct civ group // set correct civ group
pSoldier->ubCivilianGroup = POW_PRISON_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 // RETURN TRUE IF ALL TRAITS ASSIGNED OTHERWISE FALSE
if (( !gGameOptions.fNewTraitSystem && ATraitAssigned && BTraitAssigned ) || ( gGameOptions.fNewTraitSystem && ATraitAssigned && BTraitAssigned && CTraitAssigned ) ) if (( !gGameOptions.fNewTraitSystem && ATraitAssigned && BTraitAssigned ) || ( gGameOptions.fNewTraitSystem && ATraitAssigned && BTraitAssigned && CTraitAssigned ) )
return( TRUE ); return( TRUE );
else
return( FALSE ); return( FALSE );
} }
+2 -2
View File
@@ -2717,7 +2717,7 @@ void AddSoldierInitListMilitiaOnEdge( UINT8 ubStrategicInsertionCode, UINT8 ubNu
pSoldier->bActionPoints = 0; pSoldier->bActionPoints = 0;
// Flugente: due to a fix, also note here that the reinforcements get no APs. // 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 // Flugente: campaign stats
if ( IsOurSoldier(pSoldier) ) if ( IsOurSoldier(pSoldier) )
@@ -2842,7 +2842,7 @@ void SectorAddPrisonersofWar( INT16 sMapX, INT16 sMapY, INT16 sMapZ )
++numberofcivs; ++numberofcivs;
// count how many pows are already placed // count how many pows are already placed
if ( pTeamSoldier->bSoldierFlagMask & SOLDIER_POW_PRISON ) if ( pTeamSoldier->usSoldierFlagMask & SOLDIER_POW_PRISON )
++numberofpows; ++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... // 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 ) 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 ) 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 // handle town loyalty adjustment
@@ -2028,7 +2028,7 @@ BOOLEAN RecruitEPC( UINT8 ubCharNum )
pNewSoldier->ubWhatKindOfMercAmI = MERC_TYPE__EPC; 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... // 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( ); UpdateTeamPanelAssignments( );
+1 -1
View File
@@ -2260,7 +2260,7 @@ UINT8 HandleHandcuffCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT32 uiCurso
if ( usSoldierIndex != NOBODY ) if ( usSoldierIndex != NOBODY )
{ {
// no handcuffing if the guy is already caught... // no handcuffing if the guy is already caught...
if ( !(MercPtrs[usSoldierIndex]->bSoldierFlagMask & SOLDIER_POW) ) if ( !(MercPtrs[usSoldierIndex]->usSoldierFlagMask & SOLDIER_POW) )
return( HANDCUFF_GREY_UICURSOR ); return( HANDCUFF_GREY_UICURSOR );
} }
} }
+5 -5
View File
@@ -3327,7 +3327,7 @@ BOOLEAN UseHandToHand( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, BOOLEAN fStea
fFailure=FALSE; 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 // 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; BOOLEAN fUncovered = FALSE;
@@ -9393,9 +9393,9 @@ INT32 BulletImpact( SOLDIERTYPE *pFirer, BULLET *pBullet, SOLDIERTYPE * pTarget,
if ( gGameExternalOptions.fZombieOnlyHeadShotsPermanentlyKill && pTarget->stats.bLife > 0 ) if ( gGameExternalOptions.fZombieOnlyHeadShotsPermanentlyKill && pTarget->stats.bLife > 0 )
{ {
if ( ubHitLocation == AIM_SHOT_HEAD ) if ( ubHitLocation == AIM_SHOT_HEAD )
pTarget->bSoldierFlagMask |= SOLDIER_HEADSHOT; pTarget->usSoldierFlagMask |= SOLDIER_HEADSHOT;
else else
pTarget->bSoldierFlagMask &= ~SOLDIER_HEADSHOT; pTarget->usSoldierFlagMask &= ~SOLDIER_HEADSHOT;
} }
} }
#endif #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 // this is intended to work on darts, but it is possible on any ammo
if ( AmmoTypes[ubAmmoType].ammoflag & AMMO_NEUROTOXIN ) if ( AmmoTypes[ubAmmoType].ammoflag & AMMO_NEUROTOXIN )
{ {
pTarget->bSoldierFlagMask |= SOLDIER_DRUGGED; pTarget->usSoldierFlagMask |= SOLDIER_DRUGGED;
// Add lifedamage effects // Add lifedamage effects
pTarget->AddDrugValues( DRUG_TYPE_LIFEDAMAGE, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugEffect, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugTravelRate, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugSideEffect ); 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) // 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 ) if ( gGameExternalOptions.fZombieOnlyHeadShotsPermanentlyKill && pTarget->stats.bLife > 0 )
{ {
pTarget->bSoldierFlagMask |= SOLDIER_HEADSHOT; pTarget->usSoldierFlagMask |= SOLDIER_HEADSHOT;
} }
} }
#endif #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 // Flugente: note that this enemy has been seen by mercs this turn
if ( pOpponent->bTeam == ENEMY_TEAM && pSoldier->bTeam == OUR_TEAM ) 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 // 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 ) 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 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! // 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 ) 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!) // ... check wether he is not neutral against us (account for the fact that we might be covert!)
// if we are an NPC assassin // 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 // 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; fAddAsOpponent = TRUE;
} }
else 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 // 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 // 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); RemoveOneOpponent(pOpponent);
} }
UpdatePersonal(pOpponent,ubTarget,NOT_HEARD_OR_SEEN,NOWHERE,0); UpdatePersonal(pOpponent,ubTarget,NOT_HEARD_OR_SEEN,NOWHERE,0);
@@ -3539,7 +3539,7 @@ void SaySeenQuote( SOLDIERTYPE *pSoldier, BOOLEAN fSeenCreature, BOOLEAN fVirgin
else else
{ {
// Flugente: no quotes on seeing enemy when covert // 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 #ifdef ENGLISH
if ( Random( 100 ) < 30 ) if ( Random( 100 ) < 30 )
@@ -3585,7 +3585,7 @@ void OurTeamSeesSomeone( SOLDIERTYPE * pSoldier, INT8 bNumReRevealed, INT8 bNumN
if ( pSoldier->bTeam == gbPlayerNum ) 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 // 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.... // STOP IF WE WERE MOVING....
/// Speek up! /// Speek up!
+2 -2
View File
@@ -1317,7 +1317,7 @@ void TurnBasedHandleNPCAI(SOLDIERTYPE *pSoldier)
// pSoldier->flags.fNoAPToFinishMove = FALSE; // pSoldier->flags.fNoAPToFinishMove = FALSE;
// Flugente: pows don't do anything // Flugente: pows don't do anything
if ( pSoldier->bSoldierFlagMask & SOLDIER_POW ) if ( pSoldier->usSoldierFlagMask & SOLDIER_POW )
{ {
EndAIGuysTurn( pSoldier); EndAIGuysTurn( pSoldier);
return; return;
@@ -2054,7 +2054,7 @@ INT8 ExecuteAction(SOLDIERTYPE *pSoldier)
{ {
HandleInitialRedAlert(pSoldier->bTeam, TRUE); HandleInitialRedAlert(pSoldier->bTeam, TRUE);
pSoldier->bSoldierFlagMask |= SOLDIER_RAISED_REDALERT; pSoldier->usSoldierFlagMask |= SOLDIER_RAISED_REDALERT;
} }
// SANDRO - ENEMY TAUNTS // SANDRO - ENEMY TAUNTS
+4 -4
View File
@@ -1529,7 +1529,7 @@ INT32 ClosestUnDisguisedPC( SOLDIERTYPE *pSoldier, INT32 * psDistance )
if ( AM_AN_EPC( pTargetSoldier ) ) if ( AM_AN_EPC( pTargetSoldier ) )
continue; continue;
if ( pTargetSoldier->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) ) if ( pTargetSoldier->usSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) )
continue; continue;
sDist = PythSpacesAway(pSoldier->sGridNo,pTargetSoldier->sGridNo); 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 // 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; UINT8 id = NOBODY;
UINT32 uiLoop; UINT32 uiLoop;
@@ -3103,7 +3103,7 @@ UINT8 GetClosestFlaggedSoldierID( SOLDIERTYPE * pSoldier, INT16 aRange, UINT8 au
continue; continue;
// check for flag // check for flag
if ( !(pFriend->bSoldierFlagMask & aFlag) ) if ( !(pFriend->usSoldierFlagMask & aFlag) )
continue; continue;
// are we close enough? // are we close enough?
@@ -3111,7 +3111,7 @@ UINT8 GetClosestFlaggedSoldierID( SOLDIERTYPE * pSoldier, INT16 aRange, UINT8 au
if ( friendrange < range) if ( friendrange < range)
{ {
// can we see this guy? // 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; range = friendrange;
id = pFriend->ubID; id = pFriend->ubID;
+1 -1
View File
@@ -3243,7 +3243,7 @@ BOOLEAN GetBestAoEGridNo(SOLDIERTYPE *pSoldier, INT32* pGridNo, INT16 aRadius, U
continue; continue;
// dying or captured friends are 'helpless' anyway, we are willing to sacrifice them :-) // 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! // 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 // 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) if (usRoom == BOXING_RING)
{ {
for ( ubLoop = 0; ubLoop < NUM_BOXERS; ubLoop++ ) for ( ubLoop = 0; ubLoop < NUM_BOXERS; ++ubLoop )
{ {
if (pSoldier->ubID == gubBoxerID[ ubLoop ]) if (pSoldier->ubID == gubBoxerID[ ubLoop ])
{ {
@@ -757,8 +757,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier)
if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_PCUNDERAICONTROL) if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_PCUNDERAICONTROL)
pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL); pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_PCUNDERAICONTROL);
if (pTeamSoldier->flags.uiStatusFlags & SOLDIER_BOXER) pTeamSoldier->DeleteBoxingFlag( );
pTeamSoldier->flags.uiStatusFlags &= (~SOLDIER_BOXER);
} }
if (pSoldier->bTeam == gbPlayerNum || CountPeopleInBoxingRing() == 0) if (pSoldier->bTeam == gbPlayerNum || CountPeopleInBoxingRing() == 0)
@@ -885,7 +884,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier)
} }
//ddd{ //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) ) 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! // 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 ) 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 ) 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! // Flugente: if we see one of our buddies captured, it is a clear sign of enemy activity!
if ( gGameExternalOptions.fAllowPrisonerSystem && pSoldier->bTeam == ENEMY_TEAM ) 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 ) 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! // raise alarm!
return( AI_ACTION_RED_ALERT ); return( AI_ACTION_RED_ALERT );
@@ -2778,7 +2777,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK)
} }
} }
// frequencies are clear, lets call for help // frequencies are clear, lets call for help
else if ( !(pSoldier->bSoldierFlagMask & SOLDIER_RAISED_REDALERT) ) else if ( !(pSoldier->usSoldierFlagMask & SOLDIER_RAISED_REDALERT) )
{ {
// raise alarm! // raise alarm!
return( AI_ACTION_RED_ALERT ); 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! // Flugente: if we see one of our buddies captured, it is a clear sign of enemy activity!
if ( gGameExternalOptions.fAllowPrisonerSystem && pSoldier->bTeam == ENEMY_TEAM ) 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 ) 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 // 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) // (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"); 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 // frequencies are clear, lets call for help
else if ( !(pSoldier->bSoldierFlagMask & SOLDIER_RAISED_REDALERT) ) else if ( !(pSoldier->usSoldierFlagMask & SOLDIER_RAISED_REDALERT) )
{ {
// raise alarm! // raise alarm!
return( AI_ACTION_RED_ALERT ); 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) // (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're not swimming in deep water, and somebody has called for spotters
// and we see the location of at least 2 opponents // 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 && (pSoldier->aiData.bOppCnt > 1) && !fCivilian &&
(gTacticalStatus.Team[pSoldier->bTeam].bMenInSector > 1) && !bInDeepWater) (gTacticalStatus.Team[pSoldier->bTeam].bMenInSector > 1) && !bInDeepWater)
{ {
@@ -6187,7 +6186,7 @@ L_NEWAIM:
// RADIO RED ALERT: determine %chance to call others and report contact // 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 // 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 continue; // next merc
// Flugente: chance to ignore the noise if the ceator is covert // 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 // green AI state: always ignore
// yellow AI state: 50% chance to 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 // Flugente: prisoners of war don't do anything
if ( pSoldier->bSoldierFlagMask & SOLDIER_POW ) if ( pSoldier->usSoldierFlagMask & SOLDIER_POW )
return; return;
// if man has nothing to do // 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 ); 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 // 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 // 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 ); 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 // 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 ); usLineColor = Get16BPPColor( gTacticalStatus.Team[ MILITIA_TEAM ].RadarColor );
// Render different color if an enemy and he's unconscious // Render different color if an enemy and he's unconscious
+9 -9
View File
@@ -368,7 +368,7 @@ void InitTacticalPlacementGUI()
!MercPtrs[ i ]->bSectorZ ) !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 // 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 ); AddMercToHeli( MercPtrs[ i ]->ubID );
@@ -946,7 +946,7 @@ void RenderTacticalPlacementGUI()
gTPClipRectCenterBottom.iRight = iOffsetHorizontal + 634; gTPClipRectCenterBottom.iRight = iOffsetHorizontal + 634;
} }
// Flugente airdrop // 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 // Left black border
gTPClipRectCenterLeft.iLeft = iOffsetHorizontal; gTPClipRectCenterLeft.iLeft = iOffsetHorizontal;
@@ -976,7 +976,7 @@ void RenderTacticalPlacementGUI()
pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES ); 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 ); Blt16BPPBufferLooseHatchRectWithColor( (UINT16*)pDestBuf, uiDestPitchBYTES, &gTPClipRect, usHatchColor );
// WANNE - MP: Center // WANNE - MP: Center
else else
@@ -989,7 +989,7 @@ void RenderTacticalPlacementGUI()
SetClippingRegionAndImageWidth( uiDestPitchBYTES, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT ); 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 ); RectangleDraw( TRUE, gTPClipRect.iLeft, gTPClipRect.iTop, gTPClipRect.iRight, gTPClipRect.iBottom, usHatchColor, pDestBuf );
else else
{ {
@@ -1199,7 +1199,7 @@ void TacticalPlacementHandle()
} }
// WANNE - MP: Center // 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 ) if (gMercPlacement[ gbCursorMercID ].ubStrategicInsertionCode == INSERTION_CODE_CENTER )
{ {
@@ -1470,7 +1470,7 @@ void MercClickCallback( MOUSE_REGION *reg, INT32 reason )
{ {
if( gbSelectedMercID != i ) 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; gubDefaultButton = GROUP_BUTTON;
gbSelectedMercID = i; gbSelectedMercID = i;
@@ -1493,7 +1493,7 @@ void SelectNextUnplacedUnit()
if( gbSelectedMercID == -1 ) if( gbSelectedMercID == -1 )
return; return;
if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->bSoldierFlagMask & SOLDIER_AIRDROP ) if ( gGameExternalOptions.ubSkyriderHotLZ == 3 && gMercPlacement[ gbSelectedMercID ].pSoldier->usSoldierFlagMask & SOLDIER_AIRDROP )
gubDefaultButton = GROUP_BUTTON; gubDefaultButton = GROUP_BUTTON;
for( i = gbSelectedMercID; i < giPlacements; i++ ) for( i = gbSelectedMercID; i < giPlacements; i++ )
@@ -1547,7 +1547,7 @@ void HandleTacticalPlacementClicksInOverheadMap( MOUSE_REGION *reg, INT32 reason
{ {
if( gbSelectedMercID != -1 ) 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; gubDefaultButton = GROUP_BUTTON;
if( GetOverheadMouseGridNo( &sGridNo ) ) if( GetOverheadMouseGridNo( &sGridNo ) )
@@ -1694,7 +1694,7 @@ void PutDownMercPiece( INT32 iPlacement )
if(!TileIsOutOfBounds(sGridNo)) if(!TileIsOutOfBounds(sGridNo))
{ {
// Flugente: initiate airdrop, place merc on roof if necessary // 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 // hideous hack
gfTacticalDoHeliRun = TRUE; gfTacticalDoHeliRun = TRUE;
+2 -2
View File
@@ -1552,7 +1552,7 @@ void RenderOverheadOverlays()
if (pSoldier->bTeam == CIV_TEAM) 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 // 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 ); Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sX, sY, MILITIA_TEAM );
else else
Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sX, sY, CIV_TEAM ); Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sX, sY, CIV_TEAM );
@@ -1576,7 +1576,7 @@ void RenderOverheadOverlays()
else else
{ {
// Flugente: if we are a (still covert) enemy assassin, colour us like militia, so that the player wont notice us // 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 ); Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sX, sY, MILITIA_TEAM );
else else
Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sX, sY, pSoldier->bTeam ); Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sX, sY, pSoldier->bTeam );