diff --git a/GameSettings.cpp b/GameSettings.cpp index 8a4e5b2c..7bde6f3c 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 eb0545df..362510f6 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 d2542dd0..279d58cb 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 bfd1cf5a..c62ed011 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 2f339f2a..9b2ec634 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 29d92cbc..ca7d971d 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 5a37fd47..e1ccca3b 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 30d49d99..97495ed4 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 7d78f7ab..aaeb5210 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 5ef0257d..5bd3db45 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 97d177d8..027a8310 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 68f3f8d2..32885c5d 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 d5f73ec2..e023a900 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 a115eeba..19add5b4 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 116c6173..3bd562f9 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 e851529e..3efcbf84 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 eed092db..4a53684a 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 99f8dfa0..62cc3d1c 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 ee65e8c6..c36d55f0 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 e0293392..d80b0c37 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",