From f13a096f1e8c0edc74a82961c795ab4151182898 Mon Sep 17 00:00:00 2001 From: Wanne Date: Mon, 31 Mar 2014 09:33:51 +0000 Subject: [PATCH] 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 --- GameSettings.cpp | 11 + GameSettings.h | 11 + SaveLoadGame.cpp | 3 + Tactical/Handle Items.cpp | 2 +- Tactical/Interface.cpp | 44 +++- Tactical/Item Types.h | 15 ++ Tactical/Soldier Control.cpp | 3 + Tactical/Soldier Control.h | 3 + Tactical/SoldierTooltips.cpp | 23 +- Tactical/Turn Based Input.cpp | 411 +++++++++++++++++++++++++++++++--- Utils/Text.h | 13 ++ Utils/_ChineseText.cpp | 15 +- Utils/_DutchText.cpp | 15 +- Utils/_EnglishText.cpp | 15 +- Utils/_FrenchText.cpp | 15 +- Utils/_GermanText.cpp | 15 +- Utils/_ItalianText.cpp | 15 +- Utils/_PolishText.cpp | 15 +- Utils/_RussianText.cpp | 15 +- Utils/_TaiwaneseText.cpp | 15 +- 20 files changed, 611 insertions(+), 63 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index 8a4e5b2c1..7bde6f3c9 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -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); diff --git a/GameSettings.h b/GameSettings.h index eb0545dfa..362510f65 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -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 diff --git a/SaveLoadGame.cpp b/SaveLoadGame.cpp index d2542dd0a..279d58cb5 100644 --- a/SaveLoadGame.cpp +++ b/SaveLoadGame.cpp @@ -2657,6 +2657,9 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile) this->iLastBulletImpact = 0; this->iLastArmourProtection = 0; + this->usQuickItemId = 0; + this->ubQuickItemSlot = 0; + return TRUE; } diff --git a/Tactical/Handle Items.cpp b/Tactical/Handle Items.cpp index bfd1cf5ad..c62ed011b 100644 --- a/Tactical/Handle Items.cpp +++ b/Tactical/Handle Items.cpp @@ -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; } diff --git a/Tactical/Interface.cpp b/Tactical/Interface.cpp index 2f339f2ae..9b2ec634a 100644 --- a/Tactical/Interface.cpp +++ b/Tactical/Interface.cpp @@ -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)) diff --git a/Tactical/Item Types.h b/Tactical/Item Types.h index 29d92cbc7..ca7d971d4 100644 --- a/Tactical/Item Types.h +++ b/Tactical/Item Types.h @@ -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 diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 5a37fd479..e1ccca3b1 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -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; } diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index 30d49d993..97495ed4a 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -1508,6 +1508,9 @@ public: UINT8 ubLastMoraleFromHit; UINT8 iLastBulletImpact; UINT8 iLastArmourProtection; + + UINT16 usQuickItemId; + UINT8 ubQuickItemSlot; public: // CREATION FUNCTIONS diff --git a/Tactical/SoldierTooltips.cpp b/Tactical/SoldierTooltips.cpp index 7d78f7abc..aaeb52108 100644 --- a/Tactical/SoldierTooltips.cpp +++ b/Tactical/SoldierTooltips.cpp @@ -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 diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index 5ef0257db..5bd3db45c 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -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; + } +} + diff --git a/Utils/Text.h b/Utils/Text.h index 97d177d89..027a8310a 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -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 }; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 68f3f8d2a..32885c5d4 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -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", diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index d5f73ec27..e023a9001 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -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", diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index a115eebac..19add5b4c 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -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", diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 116c6173d..3bd562f95 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -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", diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index e851529ef..3efcbf841 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -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", diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index eed092db6..4a53684a1 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -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", diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 99f8dfa0b..62cc3d1c9 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -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", diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index ee65e8c6a..c36d55f05 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -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", diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp index e0293392d..d80b0c373 100644 --- a/Utils/_TaiwaneseText.cpp +++ b/Utils/_TaiwaneseText.cpp @@ -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",