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