Merged from revision: 7129

Updates/Improvements (by Sevenfm)
1. Quick inventory items:
Press [ALT] + [1..0] for quick access to predefined items in tactical (ja2_options.ini: QUICK_ITEM_0 to QUICK_ITEM_9)

Press [ALT] + [`] (tilde key left to [1]) to put item back to inventory and switch hands.
The item will be put in the same slot it was taken from (unless it was stacked or game was reloaded).

2. Also a few quick hotkeys:
[ALT] + [q] - switch to sling (same as [SHIFT] + [k])
[CTRL] + [q] - switch hands
[SHIFT] + [q] - drop item from main hand to the ground

Additional info:
-some hotkeys do not work in cheat mode
-only NIV
-only one-handed items supported
-stacked items currently not supported
-remembered item slot is lost when you reload game

3. A few small fixes for dynamic tooltips and other things


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7130 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Wanne
2014-03-31 09:33:51 +00:00
parent 3619806002
commit f13a096f1e
20 changed files with 611 additions and 63 deletions
+11
View File
@@ -1382,6 +1382,17 @@ void LoadGameExternalOptions()
// sevenfm: new mouse commands
gGameExternalOptions.bAlternateMouseCommands = iniReader.ReadBoolean("Tactical Interface Settings", "ALTERNATE_MOUSE_COMMANDS", FALSE);
gGameExternalOptions.iQuickItem1 = iniReader.ReadInteger("Tactical Interface Settings", "QUICK_ITEM_1", 0, -100, MAXITEMS);
gGameExternalOptions.iQuickItem2 = iniReader.ReadInteger("Tactical Interface Settings", "QUICK_ITEM_2", 0, -100, MAXITEMS);
gGameExternalOptions.iQuickItem3 = iniReader.ReadInteger("Tactical Interface Settings", "QUICK_ITEM_3", 0, -100, MAXITEMS);
gGameExternalOptions.iQuickItem4 = iniReader.ReadInteger("Tactical Interface Settings", "QUICK_ITEM_4", 0, -100, MAXITEMS);
gGameExternalOptions.iQuickItem5 = iniReader.ReadInteger("Tactical Interface Settings", "QUICK_ITEM_5", 0, -100, MAXITEMS);
gGameExternalOptions.iQuickItem6 = iniReader.ReadInteger("Tactical Interface Settings", "QUICK_ITEM_6", 0, -100, MAXITEMS);
gGameExternalOptions.iQuickItem7 = iniReader.ReadInteger("Tactical Interface Settings", "QUICK_ITEM_7", 0, -100, MAXITEMS);
gGameExternalOptions.iQuickItem8 = iniReader.ReadInteger("Tactical Interface Settings", "QUICK_ITEM_8", 0, -100, MAXITEMS);
gGameExternalOptions.iQuickItem9 = iniReader.ReadInteger("Tactical Interface Settings", "QUICK_ITEM_9", 0, -100, MAXITEMS);
gGameExternalOptions.iQuickItem0 = iniReader.ReadInteger("Tactical Interface Settings", "QUICK_ITEM_0", 0, -100, MAXITEMS);
// New setting to change stamina
gGameExternalOptions.uStaminaHit = iniReader.ReadInteger("Tactical Interface Settings", "STAMINA_HIT", 10000);
+11
View File
@@ -790,6 +790,17 @@ typedef struct
BOOLEAN fExtMouseKeyEnabled;
// sevenfm: new mouse commands
BOOLEAN bAlternateMouseCommands;
INT32 iQuickItem1;
INT32 iQuickItem2;
INT32 iQuickItem3;
INT32 iQuickItem4;
INT32 iQuickItem5;
INT32 iQuickItem6;
INT32 iQuickItem7;
INT32 iQuickItem8;
INT32 iQuickItem9;
INT32 iQuickItem0;
// for small progress bar
BOOLEAN fSmallSizeProgressbar;
// stamina multiplier (for all weapons eg knife fist gun
+3
View File
@@ -2657,6 +2657,9 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile)
this->iLastBulletImpact = 0;
this->iLastArmourProtection = 0;
this->usQuickItemId = 0;
this->ubQuickItemSlot = 0;
return TRUE;
}
+1 -1
View File
@@ -6787,7 +6787,7 @@ BOOLEAN BuildFortification( INT32 sGridNo, UINT32 flag )
if ( !usUseObjIndex )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"The selected barricade cannot be built in this sector" );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szMTATextStr[ STR_MTA_CANNOT_BUILD ] );
return FALSE;
}
+33 -11
View File
@@ -1792,7 +1792,7 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
SetBackgroundRectFilled( iBack );
}
if ( ( !pSoldier->aiData.bNeutral && ( pSoldier->bSide != gbPlayerNum ) ) )
if ( !pSoldier->aiData.bNeutral && ( pSoldier->bSide != gbPlayerNum ) )
{
BltVideoObjectFromIndex( FRAME_BUFFER, guiRADIO2, pSoldier->sLocatorFrame, sXPos, sYPos, VO_BLT_SRCTRANSPARENCY, NULL );
}
@@ -1906,8 +1906,11 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
BOOLEAN bInCombat = gTacticalStatus.uiFlags & TURNBASED && gTacticalStatus.uiFlags & INCOMBAT;
BOOLEAN bStealth = pSoldier->bStealthMode || pSoldier->bSoldierFlagMask & ( SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER );
// sevenfm: for mercs use name color as cover indicator
if( pSoldier->bTeam == OUR_TEAM && ! ( pSoldier->flags.uiStatusFlags & ( SOLDIER_VEHICLE | SOLDIER_ROBOT) ) &&
// sevenfm: for mercs use name color as cover indicator
// only use color when there is enemy in sector
if( pSoldier->bTeam == OUR_TEAM &&
(NumEnemyInSector() != 0) &&
! ( pSoldier->flags.uiStatusFlags & ( SOLDIER_VEHICLE | SOLDIER_ROBOT) ) &&
( ( gGameExternalOptions.ubShowCoverIndicator == 1 && ( bInCombat || bStealth ) ) ||
( gGameExternalOptions.ubShowCoverIndicator == 2 && bStealth ) ) )
{
@@ -3876,8 +3879,8 @@ void PopupDoorOpenMenu( BOOLEAN fClosingDoor )
INT32 iMenuAnchorX, iMenuAnchorY;
CHAR16 zDisp[ 100 ];
iMenuAnchorX = gOpenDoorMenu.sX;
iMenuAnchorY = gOpenDoorMenu.sY;
//iMenuAnchorX = gOpenDoorMenu.sX;
//iMenuAnchorY = gOpenDoorMenu.sY;
// Blit background!
//BltVideoObjectFromIndex( FRAME_BUFFER, guiBUTTONBORDER, 0, iMenuAnchorX, iMenuAnchorY, VO_BLT_SRCTRANSPARENCY, NULL );
@@ -6219,9 +6222,9 @@ void GetEnemyInfoString( SOLDIERTYPE* pSelectedSoldier, SOLDIERTYPE* pTargetSold
else
{ // show general name
if( Item[pTargetSoldier->inv[HEAD1POS].usItem].gasmask )
wcscat( NameStr, L"Mask" );
wcscat( NameStr, TacticalStr[ GENERAL_INFO_MASK ] );
else if( Item[pTargetSoldier->inv[HEAD1POS].usItem].nightvisionrangebonus || Item[pTargetSoldier->inv[HEAD1POS].usItem].cavevisionrangebonus )
wcscat( NameStr, L"NVG" );
wcscat( NameStr, TacticalStr[ GENERAL_INFO_NVG ] );
}
}
if( pTargetSoldier->inv[HEAD2POS].exists() )
@@ -6235,9 +6238,9 @@ void GetEnemyInfoString( SOLDIERTYPE* pSelectedSoldier, SOLDIERTYPE* pTargetSold
else
{ // show general name
if( Item[pTargetSoldier->inv[HEAD1POS].usItem].gasmask )
wcscat( NameStr, L"Mask" );
wcscat( NameStr, TacticalStr[ GENERAL_INFO_MASK ] );
else if( Item[pTargetSoldier->inv[HEAD1POS].usItem].nightvisionrangebonus || Item[pTargetSoldier->inv[HEAD1POS].usItem].cavevisionrangebonus )
wcscat( NameStr, L"NVG" );
wcscat( NameStr, TacticalStr[ GENERAL_INFO_NVG ] );
}
}
}
@@ -6249,7 +6252,7 @@ void GetEnemyInfoString( SOLDIERTYPE* pSelectedSoldier, SOLDIERTYPE* pTargetSold
{
if ( showExactInfo )
{
swprintf( NameStr, L"%s", ItemNames[ pTargetSoldier->inv[ HANDPOS ].usItem ] );
swprintf( NameStr, L"%s", ShortItemNames[ pTargetSoldier->inv[ HANDPOS ].usItem ] );
}
else
{
@@ -6292,7 +6295,7 @@ void GetEnemyInfoString( SOLDIERTYPE* pSelectedSoldier, SOLDIERTYPE* pTargetSold
else
{
if( pTargetSoldier->inv[ HANDPOS ].usItem )
swprintf( NameStr, L"%s", L"Item" );
swprintf( NameStr, L"%s", TacticalStr[ GENERAL_INFO_ITEM ] );
else
swprintf( NameStr, L"%s", L"" );
}
@@ -6373,6 +6376,7 @@ void ShowAdditionalInfo( INT16 sX, INT16 sY, SOLDIERTYPE* pTargetSoldier )
SetFontBackground( FONT_MCOLOR_BLACK );
// 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 ) ) )
{
if( pTargetSoldier->aiData.bOppList[ MercPtrs[ gusSelectedSoldier ]->ubID ] == SEEN_CURRENTLY )
@@ -6416,6 +6420,15 @@ void ShowEnemyHealthBar( INT16 sX, INT16 sY, SOLDIERTYPE* pSoldier )
UINT8 ubLines = gGameExternalOptions.ubShowEnemyHealth - 1;
INT32 iBarWidth = 24;
INT32 iBarHeight;
SOLDIERTYPE *pSelectedSoldier;
if ( gusSelectedSoldier != NOBODY )
pSelectedSoldier = MercPtrs[ gusSelectedSoldier ];
else
return;
if ( pSelectedSoldier->aiData.bOppList[pSoldier->ubID] != SEEN_CURRENTLY )
return;
// show enemy health bar
if( gGameExternalOptions.ubShowEnemyHealth > 1 && gTacticalStatus.ubCurrentTeam == OUR_TEAM )
@@ -6437,6 +6450,15 @@ void ShowRankIcon( INT16 sXPos, INT16 sYPos, SOLDIERTYPE* pSoldier )
{
INT32 iBack;
INT16 sX, sY;
SOLDIERTYPE *pSelectedSoldier;
if ( gusSelectedSoldier != NOBODY )
pSelectedSoldier = MercPtrs[ gusSelectedSoldier ];
else
return;
if ( pSelectedSoldier->aiData.bOppList[pSoldier->ubID] != SEEN_CURRENTLY )
return;
if( gGameExternalOptions.ubShowEnemyRankIcon && gTacticalStatus.ubCurrentTeam == OUR_TEAM )
//&& (!gGameExternalOptions.fEnemyNames) && (!gGameExternalOptions.fEnemyRank))
+15
View File
@@ -1876,6 +1876,21 @@ enum
MAX_IMP_ITEM_TYPES
};
// sevenfm: types for quick items
enum
{
INV_ITEM_TYPE_UNKNOWN = 0,
INV_ITEM_TYPE_HTH = -1,
INV_ITEM_TYPE_MELEE = -2,
INV_ITEM_TYPE_TASER = -3,
INV_ITEM_TYPE_HANDCUFFS = -4,
INV_ITEM_TYPE_SIDEARM = -5,
INV_ITEM_TYPE_FIRSTAID = -6,
INV_ITEM_TYPE_BINOCULARS = -7,
INV_ITEM_TYPE_XRAY = -8,
INV_ITEM_TYPE_METALDETECTOR = -9,
};
extern IMP_ITEM_CHOICE_TYPE gIMPItemChoices[MAX_IMP_ITEM_TYPES];
#endif
+3
View File
@@ -1043,6 +1043,9 @@ SOLDIERTYPE& SOLDIERTYPE::operator=(const OLDSOLDIERTYPE_101& src)
this->iLastBulletImpact = 0;
this->iLastArmourProtection = 0;
this->usQuickItemId = 0;
this->ubQuickItemSlot = 0;
}
return *this;
}
+3
View File
@@ -1508,6 +1508,9 @@ public:
UINT8 ubLastMoraleFromHit;
UINT8 iLastBulletImpact;
UINT8 iLastArmourProtection;
UINT16 usQuickItemId;
UINT8 ubQuickItemSlot;
public:
// CREATION FUNCTIONS
+14 -9
View File
@@ -56,6 +56,9 @@ void DrawMouseTooltip(void);
void SoldierTooltip( SOLDIERTYPE* pSoldier )
{
if(!pSoldier)
return;
// WANNE: No tooltips on bloodcats, bugs, tanks, roboter
if ( CREATURE_OR_BLOODCAT( pSoldier ) || TANK ( pSoldier ) ||
AM_A_ROBOT( pSoldier))
@@ -141,10 +144,12 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier )
if (gGameExternalOptions.fEnableDynamicSoldierTooltips && fMercIsUsingScope == 0 && !gGameExternalOptions.gfAllowUDTRange)
{
// add 10% to max tooltip viewing distance per level of the merc
uiMaxTooltipDistance *= 1 + (EffectiveExpLevel(MercPtrs[ gusSelectedSoldier ])/ 10); // SANDRO - changed to effective level calc
// sevenfm: fixed incorrect integer calculation
uiMaxTooltipDistance = (INT32)( uiMaxTooltipDistance * ( 1 + ( (FLOAT)( EffectiveExpLevel( MercPtrs[ gusSelectedSoldier ] ) ) / 10.0 ) ) ); // SANDRO - changed to effective level calc
if ( gGameExternalOptions.gfAllowLimitedVision )
uiMaxTooltipDistance *= 1 - (gGameExternalOptions.ubVisDistDecreasePerRainIntensity / 100);
// sevenfm: this calculation doesn't make sense: disabled
//if ( gGameExternalOptions.gfAllowLimitedVision )
// uiMaxTooltipDistance *= 1 - (gGameExternalOptions.ubVisDistDecreasePerRainIntensity / 100);
if ( !(Item[MercPtrs[gusSelectedSoldier]->inv[HEAD1POS].usItem].nightvisionrangebonus > 0) &&
!(Item[MercPtrs[gusSelectedSoldier]->inv[HEAD2POS].usItem].nightvisionrangebonus > 0) &&
@@ -337,12 +342,12 @@ void SoldierTooltip( SOLDIERTYPE* pSoldier )
swprintf( pStrInfo, gzTooltipStrings[STR_TT_CAT_ARMOR] );
if ( ubTooltipDetailLevel == DL_Basic )
{
if ( gGameExternalOptions.fEnableSoldierTooltipHelmet )
swprintf( pStrInfo, L"%s%s", pStrInfo, pSoldier->inv[HELMETPOS].usItem ? gzTooltipStrings[STR_TT_HELMET] : L"" );
if ( gGameExternalOptions.fEnableSoldierTooltipVest )
swprintf( pStrInfo, L"%s%s", pStrInfo, pSoldier->inv[VESTPOS].usItem ? gzTooltipStrings[STR_TT_VEST] : L"" );
if ( gGameExternalOptions.fEnableSoldierTooltipLeggings )
swprintf( pStrInfo, L"%s%s", pStrInfo, pSoldier->inv[LEGPOS].usItem ? gzTooltipStrings[STR_TT_LEGGINGS] : L"" );
if ( gGameExternalOptions.fEnableSoldierTooltipHelmet && pSoldier->inv[HELMETPOS].usItem )
swprintf( pStrInfo, L"%s%s ", pStrInfo, gzTooltipStrings[STR_TT_HELMET] );
if ( gGameExternalOptions.fEnableSoldierTooltipVest && pSoldier->inv[VESTPOS].usItem )
swprintf( pStrInfo, L"%s%s ", pStrInfo, gzTooltipStrings[STR_TT_VEST] );
if ( gGameExternalOptions.fEnableSoldierTooltipLeggings && pSoldier->inv[LEGPOS].usItem )
swprintf( pStrInfo, L"%s%s", pStrInfo, gzTooltipStrings[STR_TT_LEGGINGS] );
wcscat( pStrInfo, L"\n" );
}
else // ubTooltipDetailLevel == DL_Limited
+378 -33
View File
@@ -118,6 +118,7 @@
#include "Map Screen Interface Map Inventory.h"//dnl ch75 021113
#include "DisplayCover.h" // added by Sevenfm
#include "InterfaceItemImages.h" // added by Sevenfm
//forward declarations of common classes to eliminate includes
class OBJECTTYPE;
@@ -160,6 +161,8 @@ UINT32 guiUITargetSoldierId = NOBODY;
extern COVER_DRAW_MODE gubDrawMode;
extern MINES_DRAW_MODE gubDrawModeMine;
extern MOUSE_REGION gMPanelRegion;
void HandleTalkingMenuKeys( InputAtom *pInputEvent, UINT32 *puiNewEvent );
void HandleMenuKeys( InputAtom *pInputEvent, UINT32 *puiNewEvent );
void HandleItemMenuKeys( InputAtom *pInputEvent, UINT32 *puiNewEvent );
@@ -328,7 +331,13 @@ void HandleTBDropBackpacks( void );
void HandleTBPickUpBackpacks( void );
void HandleTBSoldierRun( void );
void HandleTacticalTakeItem( void );
void HandleTacticalDropItem( UINT8 ubSlot );
void HandleTacticalTakeInvItem( INT32 iType );
void HandleTacticalStoreInvItem( void );
INT32 InvItemType( UINT16 usItem );
void HandleTacticalInventoryMenu( void );
void HandleTacticalMoveItems( void );
void TacticalInventoryMessageBoxCallBack( UINT8 ubExitValue );
void HandleTacticalCoverMenu( void );
void TacticalCoverMessageBoxCallBack( UINT8 ubExitValue );
@@ -2472,6 +2481,10 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
// MercPtrs[ gusSelectedSoldier ]->flags.uiStatusFlags |= SOLDIER_CREATURE;
//EVENT_InitNewSoldierAnim( MercPtrs[ gusSelectedSoldier ], CRIPPLE_BEG, 0 , TRUE );
}
else
{
HandleTacticalTakeInvItem( gGameExternalOptions.iQuickItem1 );
}
}
else
ChangeCurrentSquad( 0 );
@@ -2485,6 +2498,10 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
{
ChangeSoldiersBodyType( INFANT_MONSTER, TRUE );
}
else
{
HandleTacticalTakeInvItem( gGameExternalOptions.iQuickItem2 );
}
}
else if( fCtrl ) //toggle between the different npc debug modes
{
@@ -2510,6 +2527,10 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
//LocateSoldier( gusSelectedSoldier, FALSE );
//EVENT_FireSoldierWeapon( MercPtrs[ gusSelectedSoldier ], sMapPos );
}
else
{
HandleTacticalTakeInvItem( gGameExternalOptions.iQuickItem3 );
}
}
else if( fCtrl ) //toggle between the different npc debug modes
{
@@ -2531,6 +2552,10 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
{
ChangeSoldiersBodyType( CRIPPLECIV, TRUE );
}
else
{
HandleTacticalTakeInvItem( gGameExternalOptions.iQuickItem4 );
}
}
else if( fCtrl ) //remapped squad 14 to here
ChangeCurrentSquad( 13 );
@@ -2548,6 +2573,10 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
{
ChangeSoldiersBodyType( YAM_MONSTER, TRUE );
}
else
{
HandleTacticalTakeInvItem( gGameExternalOptions.iQuickItem5 );
}
}
else
{
@@ -2559,23 +2588,58 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
break;
case '6':
if( fAlt )
{
HandleTacticalTakeInvItem( gGameExternalOptions.iQuickItem6 );
}
else
{
ChangeCurrentSquad( 5 );
}
break;
case '7':
ChangeCurrentSquad( 6 );
if( fAlt )
{
HandleTacticalTakeInvItem( gGameExternalOptions.iQuickItem7 );
}
else
{
ChangeCurrentSquad( 6 );
}
break;
case '8':
ChangeCurrentSquad( 7 );
if( fAlt )
{
HandleTacticalTakeInvItem( gGameExternalOptions.iQuickItem8 );
}
else
{
ChangeCurrentSquad( 7 );
}
break;
case '9':
ChangeCurrentSquad( 8 );
if( fAlt )
{
HandleTacticalTakeInvItem( gGameExternalOptions.iQuickItem9 );
}
else
{
ChangeCurrentSquad( 8 );
}
break;
case '0':
ChangeCurrentSquad( 9 );
if( fAlt )
{
HandleTacticalTakeInvItem( gGameExternalOptions.iQuickItem0 );
}
else
{
ChangeCurrentSquad( 9 );
}
break;
case '!':
@@ -3226,18 +3290,32 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
// }
break;
case 'q':
if ( gGameSettings.fOptions[TOPTION_GL_HIGH_ANGLE] )
if( fCtrl )
{
gGameSettings.fOptions[TOPTION_GL_HIGH_ANGLE] = FALSE;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_GL_LOW_ANGLE ] );
HandleTBSwapHands( );
}
else if ( fAlt )
{
HandleTBSwapGunsling( );
}
else
{
gGameSettings.fOptions[TOPTION_GL_HIGH_ANGLE] = TRUE;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_GL_HIGH_ANGLE ] );
if ( gGameSettings.fOptions[TOPTION_GL_HIGH_ANGLE] )
{
gGameSettings.fOptions[TOPTION_GL_HIGH_ANGLE] = FALSE;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_GL_LOW_ANGLE ] );
}
else
{
gGameSettings.fOptions[TOPTION_GL_HIGH_ANGLE] = TRUE;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_GL_HIGH_ANGLE ] );
}
}
break;
case 'Q':
HandleTacticalDropItem( HANDPOS );
break;
case 'G':
if( fCtrl )
@@ -3584,26 +3662,7 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
}
else
{
// Move all sector items to current mercs feet
if ( !(gTacticalStatus.fEnemyInSector) )
{
HandleAllReachAbleItemsInTheSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ );
SOLDIERTYPE *pSoldier;
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
for ( UINT32 uiLoop = 0; uiLoop < guiNumWorldItems; uiLoop++ ) //for all items in sector
{
if ( (gWorldItems[ uiLoop ].bVisible == TRUE) && (gWorldItems[ uiLoop ].fExists) && (gWorldItems[ uiLoop ].usFlags & WORLD_ITEM_REACHABLE) && !(gWorldItems[ uiLoop ].usFlags & WORLD_ITEM_ARMED_BOMB) && (gWorldItems[ uiLoop ].sGridNo != pSoldier->sGridNo) )//item exists and is reachable and is not already on soldiers tile
{
MoveItemPools(gWorldItems[ uiLoop ].sGridNo, pSoldier->sGridNo, gWorldItems[ uiLoop ].ubLevel, pSoldier->pathing.bLevel);
}
}
NotifySoldiersToLookforItems( );
}
}
HandleTacticalMoveItems();
}
break;
@@ -4261,6 +4320,10 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
{
EnvBeginRainStorm( 1 );
}
else
{
HandleTacticalStoreInvItem();
}
}
else if( fCtrl )
{
@@ -4268,6 +4331,10 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
{
EnvEndRainStorm( );
}
else
{
//HandleTacticalTakeItem();
}
}
else
// Switch panels...
@@ -7136,9 +7203,11 @@ void HandleTBSwapHands( void )
}
void HandleTBSwapGunsling( void )
{
SOLDIERTYPE *pSoldier;
if ( gusSelectedSoldier != NOBODY && UsingNewInventorySystem() == true)
{
SOLDIERTYPE *pSoldier = MercPtrs[ gusSelectedSoldier ];
pSoldier = MercPtrs[ gusSelectedSoldier ];
pSoldier->SwitchWeapons( );
}
}
@@ -7756,7 +7825,9 @@ void HandleTacticalInventoryMenu( void )
}
gzUserDefinedButtonColor[0] = FONT_MCOLOR_LTGRAY;
gzUserDefinedButtonColor[1] = FONT_MCOLOR_LTGRAY;
gzUserDefinedButtonColor[1] = FONT_MCOLOR_LTGRAY;
gzUserDefinedButtonColor[2] = FONT_MCOLOR_LTGRAY;
gzUserDefinedButtonColor[3] = FONT_MCOLOR_LTGRAY;
gzUserDefinedButtonColor[4] = FONT_ORANGE;
gzUserDefinedButtonColor[5] = FONT_ORANGE;
gzUserDefinedButtonColor[6] = FONT_ORANGE;
@@ -7780,7 +7851,8 @@ void TacticalInventoryMessageBoxCallBack( UINT8 ubExitValue )
case 2: // reload ALL
HandleTBReloadAll();
break;
case 3:
case 3: // move items (Shift+m)
HandleTacticalMoveItems();
break;
case 4:
break;
@@ -7911,7 +7983,7 @@ void HandleTacticalTransformItem( void )
{
UINT16 usItem;
TransformInfoStruct *pTransformation;
OBJECTTYPE* pObj;
//OBJECTTYPE* pObj;
SOLDIERTYPE* pSoldier;
if( !GetSoldier( &pSoldier, gusSelectedSoldier ) )
@@ -7982,4 +8054,277 @@ BOOLEAN FindTransformation( UINT16 usItem, TransformInfoStruct **pTransformation
return FALSE;
}
void HandleTacticalMoveItems( void )
{
// Move all sector items to current mercs feet
if ( !(gTacticalStatus.fEnemyInSector) )
{
HandleAllReachAbleItemsInTheSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ );
SOLDIERTYPE *pSoldier;
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
for ( UINT32 uiLoop = 0; uiLoop < guiNumWorldItems; uiLoop++ ) //for all items in sector
{
if ( (gWorldItems[ uiLoop ].bVisible == TRUE) && (gWorldItems[ uiLoop ].fExists) && (gWorldItems[ uiLoop ].usFlags & WORLD_ITEM_REACHABLE) && !(gWorldItems[ uiLoop ].usFlags & WORLD_ITEM_ARMED_BOMB) && (gWorldItems[ uiLoop ].sGridNo != pSoldier->sGridNo) )//item exists and is reachable and is not already on soldiers tile
{
MoveItemPools(gWorldItems[ uiLoop ].sGridNo, pSoldier->sGridNo, gWorldItems[ uiLoop ].ubLevel, pSoldier->pathing.bLevel);
}
}
NotifySoldiersToLookforItems( );
}
}
}
void HandleTacticalStoreInvItem( void )
{
SOLDIERTYPE *pSoldier;
UINT8 ubStoreSlot = 0;
UINT16 APTotalCost = 0;
if( gusSelectedSoldier != NOBODY )
pSoldier = MercPtrs[ gusSelectedSoldier ];
else
return;
if ( !UsingNewInventorySystem() )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ QUICK_ITEMS_ONLY_NIV ] );
return;
}
if( !pSoldier->inv[HANDPOS].exists() )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ QUICK_ITEMS_NO_ITEM_IN_HAND ] );
return;
}
if( pSoldier->usQuickItemId == pSoldier->inv[HANDPOS].usItem &&
( CanItemFitInPosition(pSoldier, &pSoldier->inv[HANDPOS], pSoldier->ubQuickItemSlot, FALSE) && !pSoldier->inv[pSoldier->ubQuickItemSlot].exists() ) )
ubStoreSlot = pSoldier->ubQuickItemSlot;
// find slot to store HANDPOS in
for(UINT8 i = GUNSLINGPOCKPOS; i < NUM_INV_SLOTS && ubStoreSlot == 0; ++i)
{
// take first slot that hand item would fit
if ( ( CanItemFitInPosition(pSoldier, &pSoldier->inv[HANDPOS], i, FALSE) && !pSoldier->inv[i].exists() ) )
{
ubStoreSlot = i;
break;
}
}
if( ubStoreSlot == 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ QUICK_ITEMS_NOWHERE_TO_PLACE ] );
return;
}
// calculate needed APs
if (gGameOptions.fInventoryCostsAP)
{
APTotalCost += GetInvMovementCost(&pSoldier->inv[HANDPOS], HANDPOS, ubStoreSlot );
if( !EnoughPoints( pSoldier, APTotalCost, 0, TRUE ) )
return;
}
// move item from HANDPOS to found ubStoreSlot
if (gGameOptions.fInventoryCostsAP)
DeductPoints( pSoldier, APTotalCost, 0 );
pSoldier->inv[HANDPOS].MoveThisObjectTo(pSoldier->inv[ubStoreSlot], 1, pSoldier);
// swap hands
if( pSoldier->inv[SECONDHANDPOS].exists() )
SwapHandItems( pSoldier );
// update interface
fCharacterInfoPanelDirty = TRUE;
fInterfacePanelDirty = DIRTYLEVEL2;
pSoldier->HandleFlashLights();
}
void HandleTacticalTakeInvItem( INT32 iType )
{
SOLDIERTYPE *pSoldier;
UINT8 ubItemSlot = HANDPOS;
UINT16 APTotalCost = 0;
if( iType == 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ QUICK_ITEM_NO_DEFINED_ITEM ] );
return;
}
if( gusSelectedSoldier != NOBODY )
pSoldier = MercPtrs[ gusSelectedSoldier ];
else
return;
if ( !UsingNewInventorySystem() )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ QUICK_ITEMS_ONLY_NIV ] );
return;
}
// check if item is already in main hand
if ( pSoldier->inv[HANDPOS].exists() &&
( iType > 0 ? ( pSoldier->inv[HANDPOS].usItem == iType ) : ( InvItemType( pSoldier->inv[HANDPOS].usItem ) == iType ) ) )
return;
if( pSoldier->inv[HANDPOS].exists() && pSoldier->inv[SECONDHANDPOS].exists() )
{
// try to free HANDPOS for new item
HandleTacticalStoreInvItem();
}
// both hands are full
if( pSoldier->inv[HANDPOS].exists() && pSoldier->inv[SECONDHANDPOS].exists() )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ QUICK_ITEM_NO_FREE_HAND ] );
return;
}
// search for type of item
for(UINT8 i = GUNSLINGPOCKPOS; i < NUM_INV_SLOTS; ++i)
{
if ( pSoldier->inv[i].exists() &&
!Item[ pSoldier->inv[i].usItem ].twohanded &&
( iType > 0 ? ( pSoldier->inv[i].usItem == iType ) : ( InvItemType( pSoldier->inv[i].usItem ) == iType ) ) )
{
ubItemSlot = i;
break;
}
}
// if not found item
if( ubItemSlot == HANDPOS )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ QUICK_ITEM_NOT_FOUND ]);
return;
}
// remember item slot and id
pSoldier->usQuickItemId = pSoldier->inv[ubItemSlot].usItem;
pSoldier->ubQuickItemSlot = ubItemSlot;
if (gGameOptions.fInventoryCostsAP)
{
APTotalCost += GetInvMovementCost(&pSoldier->inv[ubItemSlot], ubItemSlot, HANDPOS);
if( !EnoughPoints( pSoldier, APTotalCost, 0, TRUE ) )
return;
}
if( !CanItemFitInPosition( pSoldier, &pSoldier->inv[ubItemSlot], HANDPOS, FALSE ) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[ QUICK_ITEM_CANNOT_TAKE ] );
return;
}
// if item in main hand exists -> move it to second hand
if( pSoldier->inv[HANDPOS].exists() )
HandleTBSwapHands();
// move item to handpos
if (gGameOptions.fInventoryCostsAP)
DeductPoints( pSoldier, APTotalCost, 0 );
pSoldier->inv[ubItemSlot].MoveThisObjectTo(pSoldier->inv[HANDPOS], 1, pSoldier);
// update interface
fCharacterInfoPanelDirty = TRUE;
fInterfacePanelDirty = DIRTYLEVEL2;
pSoldier->HandleFlashLights();
}
INT32 InvItemType( UINT16 usItem )
{
if( usItem == XRAY_DEVICE )
return INV_ITEM_TYPE_XRAY;
if( Item[ usItem ].firstaidkit )
return INV_ITEM_TYPE_FIRSTAID;
if( Item[ usItem ].usItemClass == IC_BLADE )
return INV_ITEM_TYPE_MELEE;
if( Item[ usItem ].usItemClass == IC_PUNCH && !(Item[ usItem ].usItemFlag & TASER) )
return INV_ITEM_TYPE_HTH;
if( HasItemFlag( usItem, HANDCUFFS ) )
//if( Item[ usItem ].usItemClass == IC_MISC && Item[ usItem ].usItemFlag & HANDCUFFS )
return INV_ITEM_TYPE_HANDCUFFS;
//Item[ uiItem ].usSpotting
if( Item[ usItem ].usItemClass == IC_MISC && Item[ usItem ].dayvisionrangebonus )
return INV_ITEM_TYPE_BINOCULARS;
if( Item[ usItem ].usItemFlag & TASER )
return INV_ITEM_TYPE_TASER;
if( Item[ usItem ].usItemClass == IC_GUN && !Item[ usItem ].twohanded && Weapon[Item[ usItem ].ubClassIndex].ubWeaponType <= GUN_SMG )
return INV_ITEM_TYPE_SIDEARM;
if( Item[ usItem ].usItemClass == IC_MISC && Item[ usItem ].metaldetector )
return INV_ITEM_TYPE_METALDETECTOR;
return INV_ITEM_TYPE_UNKNOWN;
}
void HandleTacticalDropItem( UINT8 ubSlot )
{
SOLDIERTYPE *pSoldier;
UINT16 APTotalCost = 0;
if( gusSelectedSoldier != NOBODY )
pSoldier = MercPtrs[ gusSelectedSoldier ];
else
return;
if( pSoldier->inv[ ubSlot ].exists() )
{
if (gGameOptions.fInventoryCostsAP)
{
APTotalCost += GetInvMovementCost(&pSoldier->inv[ubSlot], ubSlot, HANDPOS);
APTotalCost += GetBasicAPsToPickupItem( pSoldier );
if( !EnoughPoints( pSoldier, APTotalCost, 0, TRUE ) )
return;
DeductPoints( pSoldier, APTotalCost, 0 );
}
SoldierDropItem( pSoldier, &pSoldier->inv[ ubSlot ] );
DeleteObj( &(pSoldier->inv[ ubSlot ]) );
}
}
void HandleTacticalTakeItem( void )
{
SOLDIERTYPE *pSoldier;
if( gusSelectedSoldier != NOBODY )
pSoldier = MercPtrs[ gusSelectedSoldier ];
else
return;
if( gpItemPointer == NULL )
{
//not holding anything
if( pSoldier->inv[HANDPOS].exists() )
{
pSoldier->inv[HANDPOS].MoveThisObjectTo(gItemPointer);
gpItemPointer = &gItemPointer;
}
}
// update interface
fCharacterInfoPanelDirty = TRUE;
fInterfacePanelDirty = DIRTYLEVEL2;
pSoldier->HandleFlashLights();
// Set mouse
if( gpItemPointer->exists() )
{
guiExternVo = GetInterfaceGraphicForItem( &(Item[ gpItemPointer->usItem ]) );
gusExternVoSubIndex = g_bUsePngItemImages ? 0 : Item[ gpItemPointer->usItem ].ubGraphicNum;
MSYS_ChangeRegionCursor( &gMPanelRegion , EXTERN_CURSOR );
MSYS_SetCurrentCursor( EXTERN_CURSOR );
fMapInventoryItem=TRUE;
fTeamPanelDirty=TRUE;
}
}
+13
View File
@@ -852,6 +852,7 @@ enum
STR_MTA_REMOVE_FORTIFY,
STR_TA_FILL_SANDBAG,
STR_MTA_CANCEL,
STR_MTA_CANNOT_BUILD,
TEXT_NUM_MTA_STR
};
@@ -1082,6 +1083,18 @@ enum
INSPECT_RESULT_DANGEROUS,
INSPECT_RESULT_HIGH_DANGER,
GENERAL_INFO_MASK,
GENERAL_INFO_NVG,
GENERAL_INFO_ITEM,
QUICK_ITEMS_ONLY_NIV,
QUICK_ITEMS_NO_ITEM_IN_HAND,
QUICK_ITEMS_NOWHERE_TO_PLACE,
QUICK_ITEM_NO_DEFINED_ITEM,
QUICK_ITEM_NO_FREE_HAND,
QUICK_ITEM_NOT_FOUND,
QUICK_ITEM_CANNOT_TAKE,
TEXT_NUM_TACTICAL_STR
};
+14 -1
View File
@@ -3319,6 +3319,18 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
L"可能危险",
L"危险",
L"非常危险!",
L"Mask", // TODO.Translate
L"NVG",
L"Item",
L"This feature works only with New Inventory System",
L"No item in your main hand",
L"Nowhere to place item from main hand",
L"No defined item for this quick slot",
L"No free hand for new item",
L"Item not found",
L"Cannot take item to main hand",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -8023,6 +8035,7 @@ STR16 szMTATextStr[]=
L"拆除掩体", //L"removing a fortification",
L"填满沙包", //L"filling sandbags",
L"%s必须停止%s", //L"%s had to stop %s.",
L"The selected barricade cannot be built in this sector", // TODO.Translate
};
STR16 szInventoryArmTextStr[]=
@@ -8452,7 +8465,7 @@ STR16 szTacticalInventoryDialogString[]=
L"NVG",
L"Reload All",
L"",
L"Move", // TODO.Translate
L"",
L"Sort",
+14 -1
View File
@@ -3316,6 +3316,18 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
L"Risky",
L"Dangerous",
L"High danger!",
L"Mask", // TODO.Translate
L"NVG",
L"Item",
L"This feature works only with New Inventory System",
L"No item in your main hand",
L"Nowhere to place item from main hand",
L"No defined item for this quick slot",
L"No free hand for new item",
L"Item not found",
L"Cannot take item to main hand",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -8035,6 +8047,7 @@ STR16 szMTATextStr[]= // TODO.Translate
L"removing a fortification",
L"filling sandbags",
L"%s had to stop %s.",
L"The selected barricade cannot be built in this sector", // TODO.Translate
};
STR16 szInventoryArmTextStr[]= // TODO.Translate
@@ -8466,7 +8479,7 @@ STR16 szTacticalInventoryDialogString[]=
L"NVG",
L"Reload All",
L"",
L"Move", // TODO.Translate
L"",
L"Sort",
+14 -1
View File
@@ -3317,6 +3317,18 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
L"Risky",
L"Dangerous",
L"High danger!",
L"Mask",
L"NVG",
L"Item",
L"This feature works only with New Inventory System",
L"No item in your main hand",
L"Nowhere to place item from main hand",
L"No defined item for this quick slot",
L"No free hand for new item",
L"Item not found",
L"Cannot take item to main hand",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -8020,6 +8032,7 @@ STR16 szMTATextStr[]=
L"removing a fortification",
L"filling sandbags",
L"%s had to stop %s.",
L"The selected barricade cannot be built in this sector",
};
STR16 szInventoryArmTextStr[]=
@@ -8450,7 +8463,7 @@ STR16 szTacticalInventoryDialogString[]=
L"NVG",
L"Reload All",
L"",
L"Move",
L"",
L"Sort",
+14 -1
View File
@@ -3323,6 +3323,18 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
L"Risqué",
L"Dangereux",
L"Danger élevé !",
L"Mask", // TODO.Translate
L"NVG",
L"Item",
L"This feature works only with New Inventory System",
L"No item in your main hand",
L"Nowhere to place item from main hand",
L"No defined item for this quick slot",
L"No free hand for new item",
L"Item not found",
L"Cannot take item to main hand",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -8017,6 +8029,7 @@ STR16 szMTATextStr[]=
L"le retrait d'une fortification",
L"le remplissage des sacs de sable",
L"%s a dû arrêter... %s",
L"The selected barricade cannot be built in this sector", // TODO.Translate
};
STR16 szInventoryArmTextStr[]=
@@ -8448,7 +8461,7 @@ STR16 szTacticalInventoryDialogString[]=
L"LVN",
L"Recharger tout",
L"",
L"Move", // TODO.Translate
L"",
L"Trier",
+14 -1
View File
@@ -3319,6 +3319,18 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
L"Riskant",
L"Gefährlich",
L"Hohe Gefahr!",
L"Mask", // TODO.Translate
L"NVG",
L"Item",
L"This feature works only with New Inventory System",
L"No item in your main hand",
L"Nowhere to place item from main hand",
L"No defined item for this quick slot",
L"No free hand for new item",
L"Item not found",
L"Cannot take item to main hand",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -7845,6 +7857,7 @@ STR16 szMTATextStr[]=
L"entferne eine Befestigung",
L"Sandsäcke befüllen",
L"%s musste %s stoppen.",
L"The selected barricade cannot be built in this sector", // TODO.Translate
};
STR16 szInventoryArmTextStr[]=
@@ -8276,7 +8289,7 @@ STR16 szTacticalInventoryDialogString[]=
L"NVG",
L"Reload All",
L"",
L"Move", // TODO.Translate
L"",
L"Sort",
+14 -1
View File
@@ -3311,6 +3311,18 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
L"Risky",
L"Dangerous",
L"High danger!",
L"Mask", // TODO.Translate
L"NVG",
L"Item",
L"This feature works only with New Inventory System",
L"No item in your main hand",
L"Nowhere to place item from main hand",
L"No defined item for this quick slot",
L"No free hand for new item",
L"Item not found",
L"Cannot take item to main hand",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -8026,6 +8038,7 @@ STR16 szMTATextStr[]= // TODO.Translate
L"removing a fortification",
L"filling sandbags",
L"%s had to stop %s.",
L"The selected barricade cannot be built in this sector", // TODO.Translate
};
// TODO.Translate
@@ -8458,7 +8471,7 @@ STR16 szTacticalInventoryDialogString[]=
L"NVG",
L"Reload All",
L"",
L"Move", // TODO.Translate
L"",
L"Sort",
+14 -1
View File
@@ -3325,6 +3325,18 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
L"Risky",
L"Dangerous",
L"High danger!",
L"Mask", // TODO.Translate
L"NVG",
L"Item",
L"This feature works only with New Inventory System",
L"No item in your main hand",
L"Nowhere to place item from main hand",
L"No defined item for this quick slot",
L"No free hand for new item",
L"Item not found",
L"Cannot take item to main hand",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -8045,6 +8057,7 @@ STR16 szMTATextStr[]= // TODO.Translate
L"removing a fortification",
L"filling sandbags",
L"%s had to stop %s.",
L"The selected barricade cannot be built in this sector", // TODO.Translate
};
STR16 szInventoryArmTextStr[]= // TODO.Translate
@@ -8476,7 +8489,7 @@ STR16 szTacticalInventoryDialogString[]=
L"NVG",
L"Reload All",
L"",
L"Move", // TODO.Translate
L"",
L"Sort",
+14 -1
View File
@@ -3318,6 +3318,18 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
L"Risky",
L"Dangerous",
L"High danger!",
L"Mask", // TODO.Translate
L"NVG",
L"Item",
L"This feature works only with New Inventory System",
L"No item in your main hand",
L"Nowhere to place item from main hand",
L"No defined item for this quick slot",
L"No free hand for new item",
L"Item not found",
L"Cannot take item to main hand",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -8024,6 +8036,7 @@ STR16 szMTATextStr[]= // TODO.Translate
L"removing a fortification",
L"filling sandbags",
L"%s had to stop %s.",
L"The selected barricade cannot be built in this sector", // TODO.Translate
};
STR16 szInventoryArmTextStr[]= // TODO.Translate
@@ -8455,7 +8468,7 @@ STR16 szTacticalInventoryDialogString[]=
L"NVG",
L"Reload All",
L"",
L"Move", // TODO.Translate
L"",
L"Sort",
+14 -1
View File
@@ -3321,6 +3321,18 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
L"Risky",
L"Dangerous",
L"High danger!",
L"Mask", // TODO.Translate
L"NVG",
L"Item",
L"This feature works only with New Inventory System",
L"No item in your main hand",
L"Nowhere to place item from main hand",
L"No defined item for this quick slot",
L"No free hand for new item",
L"Item not found",
L"Cannot take item to main hand",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -8035,6 +8047,7 @@ STR16 szMTATextStr[]= // TODO.Translate
L"removing a fortification",
L"filling sandbags",
L"%s had to stop %s.",
L"The selected barricade cannot be built in this sector", // TODO.Translate
};
STR16 szInventoryArmTextStr[]= // TODO.Translate
@@ -8466,7 +8479,7 @@ STR16 szTacticalInventoryDialogString[]=
L"NVG",
L"Reload All",
L"",
L"Move", // TODO.Translate
L"",
L"Sort",