diff --git a/Tactical/Handle Items.cpp b/Tactical/Handle Items.cpp index 710950cf..c2ce344c 100644 --- a/Tactical/Handle Items.cpp +++ b/Tactical/Handle Items.cpp @@ -5100,6 +5100,36 @@ void UpdateGear() if ( pObj != NULL ) // ... if pointer is not obviously useless ... { + // before replacing it, merge ammo in stacks, the not-full mag being the visible one + // by doing this we won't have so many used magazines lying around + if ( (Item[pObj->usItem].usItemClass & IC_AMMO) && pObj->ubNumberOfObjects > 1 ) + { + UINT32 ammocount = 0; + for ( INT16 i = 0; i < pObj->ubNumberOfObjects; ++i ) + ammocount += (*pObj)[i]->data.ubShotsLeft; + + UINT16 usMagIndex = Item[pObj->usItem].ubClassIndex; + UINT16 magsize = Magazine[usMagIndex].ubMagSize; + + if ( magsize ) + { + UINT8 fullmags = ammocount / magsize; + + UINT16 leftover = ammocount - fullmags * magsize; + + UINT8 totalmags = fullmags + (leftover > 0 ? 1 : 0); + + if ( totalmags < pObj->ubNumberOfObjects ) + pObj->RemoveObjectsFromStack( pObj->ubNumberOfObjects - totalmags ); + + for ( INT16 i = 0; i < totalmags; ++i ) + (*pObj)[i]->data.ubShotsLeft = magsize; + + if ( leftover > 0 ) + (*pObj)[0]->data.ubShotsLeft = leftover; + } + } + for ( INT16 i = 0; i < pObj->ubNumberOfObjects; ++i ) // ... there might be multiple items here (item stack), so for each one ... { // we could improve our gear by changing this object with another one @@ -5169,6 +5199,54 @@ void UpdateGear() } } } + + // if this is an ammo stack that could use more mags, try to fill it up + if ( (Item[pObj->usItem].usItemClass & IC_AMMO) ) + { + UINT8 ubSlotLimit = ItemSlotLimit( pObj, bLoop, pSoldier, FALSE ); + UINT16 usMagIndex = Item[pObj->usItem].ubClassIndex; + UINT16 magsize = Magazine[usMagIndex].ubMagSize; + + if ( magsize ) + { + while ( pObj->ubNumberOfObjects < ubSlotLimit ) + { + int add = ubSlotLimit - pObj->ubNumberOfObjects; + + UINT8 index = 0; + OBJECTTYPE* pObj_Better = GetBetterSectorObject( pObj->usItem, 0, index ); + + if ( pObj_Better ) + { + pObj->AddObjectsToStack( *pObj_Better, add ); + + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[IMPROVEGEARPICKUPMAG_STR], pSoldier->GetName( ), Item[pObj->usItem].szItemName ); + + // re-merge the magazines again, in case we picked up not full magazines + UINT32 ammocount = 0; + for ( INT16 i = 0; i < pObj->ubNumberOfObjects; ++i ) + ammocount += (*pObj)[i]->data.ubShotsLeft; + + UINT8 fullmags = ammocount / magsize; + + UINT16 leftover = ammocount - fullmags * magsize; + + UINT8 totalmags = fullmags + (leftover > 0 ? 1 : 0); + + if ( totalmags < pObj->ubNumberOfObjects ) + pObj->RemoveObjectsFromStack( pObj->ubNumberOfObjects - totalmags ); + + for ( INT16 i = 0; i < totalmags; ++i ) + (*pObj)[i]->data.ubShotsLeft = magsize; + + if ( leftover > 0 ) + (*pObj)[0]->data.ubShotsLeft = leftover; + } + else + break; + } + } + } } } } diff --git a/Utils/Text.h b/Utils/Text.h index 2230cd79..cd6ed5d3 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -1131,6 +1131,7 @@ enum IMPROVEGEARBUTTON_STR, IMPROVEGEARDESCRIBE_STR, + IMPROVEGEARPICKUPMAG_STR, TEXT_NUM_TACTICAL_STR }; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 660f319b..5110a770 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -4002,6 +4002,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"改进装备", //L"Improve gear", L"%s 改变 %s 对高级版本", //L"%s changed %s for superior version", + L"%s picked up %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 847f9a2d..133261f2 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -4001,6 +4001,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", + L"%s picked up %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 65ed555d..f123a3a5 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -3999,6 +3999,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", + L"%s picked up %s", }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index c38b34ce..fbeba069 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -4005,6 +4005,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", + L"%s picked up %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 53de67bb..733f4077 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -4007,6 +4007,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", + L"%s picked up %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index d32ce54e..3a380855 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -3995,6 +3995,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", + L"%s picked up %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index de49f284..d05005bb 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -4006,6 +4006,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", + L"%s picked up %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface. diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index add4275c..89be38c5 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -3999,6 +3999,7 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] = L"Improve gear", L"%s changed %s for superior version", + L"%s picked up %s", // TODO.Translate }; //Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.