mirror of
https://github.com/1dot13/source.git
synced 2026-07-29 13:52:17 +02:00
Build1936
Minor adjustments to some of the rendering functions to grant a bit more control to the code. Adjusted the mouse areas for key and item popup windows. Added the pocket capacity indicator to sector inventory when using NewInv mode. Added the right click option to sector inventory so you can view/manipulate stacks and view item descriptions without first equiping an item. Updated sector inventory so that capacity values appear in all pockets. Not just currently filled one. Updated sector inventory so that newly placed items could be right-clicked on for details. Increased the mouse region for the various stack popups so there is always room to close the popup without activating the description box. Fixed a bug in the sector inventory description panel that caused a crash when trying to remove an attachment. Fixed sector inventory so you can add attachments to weapons. Fixed some weight issues. Fixed a crash resulting from right-clicking in sector inventory while Item Desc window was already open. Fixed the "Active Squad" message so it displays the squad that is actually activated. Fixed a bug that allowed you to start a new game in NewInv mode while in 640x480 resolution. Updated the Item Description windows so you can load a gun as well as unload. Added new CTRL+SHIFT+D hotkey to delete all items in sector. Added new CTRL+SHIFT+S hotkey to sell all items in sector, assuming you have the ALT+LMB option turned on in your INI file. Fixed a problem with sector inventory item description where the status did not appear for items that couldn't stack. Fixed a problem with Nails so he always starts with his leather jacket, even if you don't buy his gear. Incorporated a failsafe so that NewInv mode can't be selected, nor NIV saves loaded, when no custom data path is set. Add new IC_BELTCLIP item class. Update pocket definition restrictions to use bitwise compare. Add failsafe so that you can't merge LBENODEs. Reset VC2005 so it doesn't point to a specific drive. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@1936 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -192,6 +192,7 @@ void EntryInitEditorItemsInfo()
|
||||
case IC_KIT:
|
||||
case IC_FACE:
|
||||
case IC_MONEY:
|
||||
case IC_BELTCLIP:
|
||||
eInfo.sNumEquipment1++;
|
||||
break;
|
||||
case IC_MISC:
|
||||
@@ -452,6 +453,7 @@ void InitEditorItemsInfo(UINT32 uiItemType)
|
||||
case IC_KIT:
|
||||
case IC_FACE:
|
||||
case IC_MONEY:
|
||||
case IC_BELTCLIP:
|
||||
fTypeMatch = eInfo.uiItemType == TBAR_MODE_ITEM_EQUIPMENT1;
|
||||
break;
|
||||
case IC_MISC:
|
||||
@@ -1661,3 +1663,4 @@ void DisplayItemStatistics()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -430,6 +430,7 @@ void SpecifyItemToEdit( OBJECTTYPE *pItem, INT32 iMapIndex )
|
||||
case IC_LAUNCHER:
|
||||
case IC_THROWING_KNIFE:
|
||||
case IC_MONEY:
|
||||
case IC_BELTCLIP:
|
||||
gbEditingMode = EDITING_EQUIPMENT;
|
||||
SetupEquipGUI();
|
||||
break;
|
||||
|
||||
@@ -474,7 +474,7 @@ BOOLEAN EnterGIOScreen()
|
||||
}
|
||||
|
||||
// CHRISL: New inventory options
|
||||
if(iResolution != 0){
|
||||
if(iResolution != 0 && gCustomDataCat.GetRootDir() != ""){
|
||||
usPosY = GIO_INV_SETTING_Y - GIO_OFFSET_TO_TOGGLE_BOX_Y;
|
||||
for( cnt=0; cnt<NUM_INV_OPTIONS; cnt++)
|
||||
{
|
||||
@@ -612,7 +612,7 @@ BOOLEAN ExitGIOScreen()
|
||||
RemoveButton( guiBROptionToggles[ cnt ] );
|
||||
|
||||
// CHRISL
|
||||
if(iResolution != 0){
|
||||
if(iResolution != 0 && gCustomDataCat.GetRootDir() != ""){
|
||||
for( cnt=0; cnt<NUM_INV_OPTIONS; cnt++)
|
||||
RemoveButton( guiINVOptionToggles[ cnt ] );
|
||||
}
|
||||
@@ -775,7 +775,7 @@ BOOLEAN RenderGIOScreen()
|
||||
DisplayWrappedString( (UINT16)(GIO_BR_SETTING_X+GIO_OFFSET_TO_TEXT), usPosY, GIO_DIF_SETTINGS_WIDTH, 2, GIO_TOGGLE_TEXT_FONT, GIO_TOGGLE_TEXT_COLOR, gzGIOScreenText[ GIO_BR_AWESOME_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// CHRISL
|
||||
if(iResolution != 0){
|
||||
if(iResolution != 0 && gCustomDataCat.GetRootDir() != ""){
|
||||
DisplayWrappedString( GIO_INV_SETTING_X, (UINT16)(GIO_INV_SETTING_Y-GIO_GAP_BN_SETTINGS), GIO_DIF_SETTINGS_WIDTH + 20, 2, GIO_TOGGLE_TEXT_FONT, GIO_TOGGLE_TEXT_COLOR, gzGIOScreenText[ GIO_INV_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
usPosY = GIO_INV_SETTING_Y+2;
|
||||
|
||||
@@ -1329,7 +1329,7 @@ void RestoreGIOButtonBackGrounds()
|
||||
}
|
||||
// CHRISL
|
||||
|
||||
if(iResolution != 0){
|
||||
if(iResolution != 0 && gCustomDataCat.GetRootDir() != ""){
|
||||
usPosY = GIO_INV_SETTING_Y-GIO_OFFSET_TO_TOGGLE_BOX_Y;
|
||||
for( cnt=0; cnt<NUM_INV_OPTIONS; cnt++)
|
||||
{
|
||||
@@ -1369,7 +1369,7 @@ void DoneFadeOutForExitGameInitOptionScreen( void )
|
||||
}
|
||||
|
||||
// CHRISL:
|
||||
if(iResolution != 0){
|
||||
if(iResolution != 0 && gCustomDataCat.GetRootDir() != ""){
|
||||
switch ( GetCurrentINVOptionButtonSetting() )
|
||||
{
|
||||
case GIO_INV_OLD:
|
||||
|
||||
+5
-1
@@ -299,7 +299,11 @@ void InitGameOptions()
|
||||
gGameOptions.fAirStrikes = FALSE;
|
||||
gGameOptions.ubGameStyle = STYLE_SCIFI;
|
||||
gGameOptions.ubDifficultyLevel = DIF_LEVEL_MEDIUM;
|
||||
gGameOptions.ubInventorySystem = INVENTORY_NEW;
|
||||
//CHRISL: override default inventory mode when in low res
|
||||
if(iResolution == 0 || gCustomDataCat.GetRootDir() == "")
|
||||
gGameOptions.ubInventorySystem = INVENTORY_OLD;
|
||||
else
|
||||
gGameOptions.ubInventorySystem = INVENTORY_NEW;
|
||||
//gGameOptions.fTurnTimeLimit = FALSE;
|
||||
|
||||
gGameOptions.fIronManMode = FALSE;
|
||||
|
||||
+4
-4
@@ -13,12 +13,12 @@
|
||||
#ifdef JA2EDITOR
|
||||
|
||||
//MAP EDITOR BUILD VERSION
|
||||
CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.1877" };
|
||||
CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.1936" };
|
||||
|
||||
#elif defined JA2BETAVERSION
|
||||
|
||||
//BETA/TEST BUILD VERSION
|
||||
CHAR16 zVersionLabel[256] = { L"Debug v1.13.1877" };
|
||||
CHAR16 zVersionLabel[256] = { L"Debug v1.13.1936" };
|
||||
|
||||
#elif defined CRIPPLED_VERSION
|
||||
|
||||
@@ -28,11 +28,11 @@ CHAR16 zVersionLabel[256] = { L"Beta v. 0.98" };
|
||||
#else
|
||||
|
||||
//RELEASE BUILD VERSION
|
||||
CHAR16 zVersionLabel[256] = { L"Release v1.13.1877" };
|
||||
CHAR16 zVersionLabel[256] = { L"Release v1.13.1936" };
|
||||
|
||||
#endif
|
||||
|
||||
CHAR8 czVersionNumber[16] = { "Build 08.03.10" }; //YY.MM.DD
|
||||
CHAR8 czVersionNumber[16] = { "Build 08.03.29" }; //YY.MM.DD
|
||||
CHAR16 zTrackingNumber[16] = { L"Z" };
|
||||
|
||||
|
||||
|
||||
@@ -1013,7 +1013,7 @@ INT32 PickPocket(MERCPROFILESTRUCT *pProfile, UINT8 ppStart, UINT8 ppStop, UINT1
|
||||
if(LBEPocketType[pIndex].ItemCapacityPerSize[Item[usItem].ItemSize] >= iNumber &&
|
||||
LBEPocketType[pIndex].ItemCapacityPerSize[Item[usItem].ItemSize] < capacity &&
|
||||
pProfile->inv[uiPos] == 0) {
|
||||
if((LBEPocketType[pIndex].pRestriction != 0 && LBEPocketType[pIndex].pRestriction == Item[usItem].usItemClass) ||
|
||||
if((LBEPocketType[pIndex].pRestriction != 0 && (LBEPocketType[pIndex].pRestriction & Item[usItem].usItemClass)) ||
|
||||
LBEPocketType[pIndex].pRestriction == 0) {
|
||||
capacity = LBEPocketType[pIndex].ItemCapacityPerSize[Item[usItem].ItemSize];
|
||||
pocket = uiPos;
|
||||
@@ -1479,3 +1479,4 @@ void GiveIMPItems( MERCPROFILESTRUCT *pProfile, INT8 abilityValue, UINT8 typeInd
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -2886,7 +2886,7 @@ BOOLEAN LoadSavedGame( UINT8 ubSavedGameID )
|
||||
gGameOptions.ubInventorySystem = SaveGameHeader.ubInventorySystem;
|
||||
if((UsingNewInventorySystem() == true))
|
||||
{
|
||||
if(iResolution == 0){
|
||||
if(iResolution == 0 || gCustomDataCat.GetRootDir() == ""){
|
||||
// Only load NewInv in higher screen res
|
||||
FileClose( hFile );
|
||||
return(FALSE);
|
||||
|
||||
@@ -2128,6 +2128,11 @@ void DoneFadeOutForSaveLoadScreen( void )
|
||||
DoSaveLoadMessageBox( MSG_BOX_BASIC_STYLE, zSaveLoadText[SLG_INV_RES_ERROR], SAVE_LOAD_SCREEN, MSG_BOX_FLAG_OK, FailedLoadingGameCallBack );
|
||||
NextLoopCheckForEnoughFreeHardDriveSpace();
|
||||
}
|
||||
else if(UsingNewInventorySystem() == true && gCustomDataCat.GetRootDir() == "")
|
||||
{
|
||||
DoSaveLoadMessageBox( MSG_BOX_BASIC_STYLE, zSaveLoadText[SLG_INV_CUSTUM_ERROR], SAVE_LOAD_SCREEN, MSG_BOX_FLAG_OK, FailedLoadingGameCallBack );
|
||||
NextLoopCheckForEnoughFreeHardDriveSpace();
|
||||
}
|
||||
else
|
||||
{
|
||||
DoSaveLoadMessageBox( MSG_BOX_BASIC_STYLE, zSaveLoadText[SLG_LOAD_GAME_ERROR], SAVE_LOAD_SCREEN, MSG_BOX_FLAG_OK, FailedLoadingGameCallBack );
|
||||
|
||||
@@ -153,6 +153,8 @@ UINT32 guiMapInvenButton[ 3 ];
|
||||
|
||||
BOOLEAN gfCheckForCursorOverMapSectorInventoryItem = FALSE;
|
||||
|
||||
extern int PLAYER_INFO_Y;
|
||||
extern int INV_REGION_Y;
|
||||
|
||||
extern BOOLEAN fShowInventoryFlag;
|
||||
extern BOOLEAN fMapScreenBottomDirty;
|
||||
@@ -211,6 +213,7 @@ BOOLEAN CanPlayerUseSectorInventory( SOLDIERTYPE *pSelectedSoldier );
|
||||
|
||||
extern void MAPEndItemPointer( );
|
||||
extern BOOLEAN GetCurrentBattleSectorXYZAndReturnTRUEIfThereIsABattle( INT16 *psSectorX, INT16 *psSectorY, INT16 *psSectorZ );
|
||||
extern BOOLEAN MAPInternalInitItemDescriptionBox( OBJECTTYPE *pObject, UINT8 ubStatusIndex, SOLDIERTYPE *pSoldier );
|
||||
|
||||
void DeleteAllItemsInInventoryPool();
|
||||
void DeleteItemsOfType( UINT16 usItemType );
|
||||
@@ -341,7 +344,7 @@ BOOLEAN RenderItemInPoolSlot( INT32 iCurrentSlot, INT32 iFirstSlotOnPage )
|
||||
|
||||
if( pInventoryPoolList[ iCurrentSlot + iFirstSlotOnPage ].object.exists() == false )
|
||||
{
|
||||
return ( FALSE );
|
||||
//return ( FALSE );
|
||||
}
|
||||
|
||||
GetVideoObject( &hHandle, GetInterfaceGraphicForItem( &(Item[ pInventoryPoolList[ iCurrentSlot + iFirstSlotOnPage ].object.usItem ] ) ) );
|
||||
@@ -372,12 +375,23 @@ BOOLEAN RenderItemInPoolSlot( INT32 iCurrentSlot, INT32 iFirstSlotOnPage )
|
||||
|
||||
SetFontDestBuffer( guiSAVEBUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE );
|
||||
|
||||
INVRenderItem( guiSAVEBUFFER, NULL, &(pInventoryPoolList[ iCurrentSlot + iFirstSlotOnPage ].object),
|
||||
(INT16)(sX + 7), sY, 60, 25, DIRTYLEVEL2, NULL, 0, fOutLine, sOutLine );//67
|
||||
if(UsingNewInventorySystem() == true && gpItemPointer != NULL)
|
||||
{
|
||||
int itemSlotLimit = ItemSlotLimit(gpItemPointer, STACK_SIZE_LIMIT);
|
||||
RenderPocketItemCapacity( guiSAVEBUFFER, itemSlotLimit, STACK_SIZE_LIMIT, 0, &pInventoryPoolList[ iCurrentSlot + iFirstSlotOnPage ].object, (sX + 7), sY );
|
||||
}
|
||||
|
||||
INVRenderItem( guiSAVEBUFFER, NULL, &(pInventoryPoolList[ iCurrentSlot + iFirstSlotOnPage ].object),
|
||||
(INT16)(sX + 7), sY, 60, 25, DIRTYLEVEL2, NULL, 0, fOutLine, sOutLine );//67
|
||||
|
||||
SetFontDestBuffer( FRAME_BUFFER, 0,0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE );
|
||||
|
||||
|
||||
if( pInventoryPoolList[ iCurrentSlot + iFirstSlotOnPage ].object.exists() == false )
|
||||
{
|
||||
return ( FALSE );
|
||||
}
|
||||
|
||||
// now blit this object in the box
|
||||
//BltVideoObjectOutlineFromIndex( guiSAVEBUFFER, GetInterfaceGraphicForItem( &(Item[ pInventoryPoolList[ iCurrentSlot + iFirstSlotOnPage ].object.usItem ]) ),
|
||||
// Item[ pInventoryPoolList[ iCurrentSlot + iFirstSlotOnPage ].object.usItem ].ubGraphicNum,
|
||||
@@ -810,9 +824,25 @@ void MapInvenPoolSlots(MOUSE_REGION * pRegion, INT32 iReason )
|
||||
|
||||
if( ( iReason & MSYS_CALLBACK_REASON_RBUTTON_UP ) )
|
||||
{
|
||||
//CHRISL: Make it possible to right click and pull up stack popup and/or item description boxes
|
||||
WORLDITEM * twItem = &(pInventoryPoolList[ ( iCurrentInventoryPoolPage * MAP_INVENTORY_POOL_SLOT_COUNT ) + iCounter ]);
|
||||
if ( !InSectorStackPopup( ) && !InItemStackPopup( ) && !InItemDescriptionBox( ) && !InKeyRingPopup( ) && twItem->object.exists() == true)
|
||||
{
|
||||
if(ItemSlotLimit( &twItem->object, STACK_SIZE_LIMIT ) == 1)
|
||||
{
|
||||
fShowInventoryFlag = TRUE;
|
||||
MAPInternalInitItemDescriptionBox( &twItem->object, 0, 0 );
|
||||
}
|
||||
else if(gpItemPointer == NULL || gpItemPointer->usItem == twItem->object.usItem || ValidAttachment(gpItemPointer->usItem, twItem->object.usItem) == TRUE)
|
||||
{
|
||||
InitSectorStackPopup( twItem, iCounter, 0, INV_REGION_Y, 261, ( SCREEN_HEIGHT - PLAYER_INFO_Y ) );
|
||||
fTeamPanelDirty=TRUE;
|
||||
fInterfacePanelDirty = DIRTYLEVEL2;
|
||||
}
|
||||
}
|
||||
if ( gpItemPointer == NULL )
|
||||
{
|
||||
fShowMapInventoryPool = FALSE;
|
||||
//fShowMapInventoryPool = FALSE;
|
||||
}
|
||||
// else do nothing
|
||||
}
|
||||
|
||||
+104
-1
@@ -506,6 +506,8 @@ extern UINT16 usVehicleY;
|
||||
//void DeleteButtonsForScrolling(void);
|
||||
|
||||
void BtnMessageUpMapScreenCallback( GUI_BUTTON *btn,INT32 reason );
|
||||
void BeginSellAllCallBack( UINT8 bExitValue );
|
||||
void BeginDeleteAllCallBack( UINT8 bExitValue );
|
||||
BOOLEAN fScrollButtonsInitialized = FALSE;
|
||||
|
||||
BOOLEAN fFlashAssignDone = FALSE;
|
||||
@@ -1049,6 +1051,7 @@ void MapscreenMarkButtonsDirty();
|
||||
extern BOOLEAN CanRedistributeMilitiaInSector( INT16 sClickedSectorX, INT16 sClickedSectorY, INT8 bClickedTownId );
|
||||
|
||||
extern INT32 GetNumberOfMercsInUpdateList( void );
|
||||
extern INT32 SellItem( OBJECTTYPE& object, BOOLEAN useModifier = TRUE );
|
||||
void DeleteAllItemsInInventoryPool();
|
||||
|
||||
|
||||
@@ -1058,6 +1061,70 @@ void DumpSectorDifficultyInfo( void );
|
||||
void DumpItemsList( void );
|
||||
#endif
|
||||
|
||||
void BeginSellAllCallBack( UINT8 bExitValue )
|
||||
{
|
||||
INT32 iPrice = 0;
|
||||
bool anythingSold = false;
|
||||
|
||||
if( bExitValue == MSG_BOX_RETURN_YES )
|
||||
{
|
||||
fRestoreBackgroundForMessageBox = TRUE;
|
||||
if ( gpItemPointer != NULL )
|
||||
{
|
||||
return;
|
||||
}
|
||||
for(UINT32 wItem = 0; wItem < guiNumWorldItems; wItem++)
|
||||
{
|
||||
if(0 == pInventoryPoolList[wItem].object.MoveThisObjectTo(gItemPointer,-1,0,NUM_INV_SLOTS,MAX_OBJECTS_PER_SLOT))
|
||||
{
|
||||
if (pInventoryPoolList[wItem].object.exists() == false) {
|
||||
pInventoryPoolList[wItem].object.initialize();
|
||||
}
|
||||
// Dirty interface
|
||||
fMapPanelDirty = TRUE;
|
||||
gpItemPointer = &gItemPointer;
|
||||
// Sell Item
|
||||
iPrice += SellItem( gItemPointer );
|
||||
gpItemPointer = NULL;
|
||||
fMapInventoryItem = FALSE;
|
||||
if (iPrice == 0) {
|
||||
iPrice = 1;
|
||||
}
|
||||
anythingSold = true;
|
||||
HandleButtonStatesWhileMapInventoryActive();
|
||||
}
|
||||
}
|
||||
if(anythingSold == true)
|
||||
AddTransactionToPlayersBook( SOLD_ITEMS, 0, GetWorldTotalMin(), iPrice );
|
||||
}
|
||||
}
|
||||
|
||||
void BeginDeleteAllCallBack( UINT8 bExitValue )
|
||||
{
|
||||
if( bExitValue == MSG_BOX_RETURN_YES )
|
||||
{
|
||||
fRestoreBackgroundForMessageBox = TRUE;
|
||||
if ( gpItemPointer != NULL )
|
||||
{
|
||||
return;
|
||||
}
|
||||
for(UINT32 wItem = 0; wItem < guiNumWorldItems; wItem++)
|
||||
{
|
||||
if(0 == pInventoryPoolList[wItem].object.MoveThisObjectTo(gItemPointer,-1,0,NUM_INV_SLOTS,MAX_OBJECTS_PER_SLOT))
|
||||
{
|
||||
if (pInventoryPoolList[wItem].object.exists() == false) {
|
||||
pInventoryPoolList[wItem].object.initialize();
|
||||
}
|
||||
// Dirty interface
|
||||
fMapPanelDirty = TRUE;
|
||||
gpItemPointer = &gItemPointer;
|
||||
// Delete Item
|
||||
gpItemPointer = NULL;
|
||||
fMapInventoryItem = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// CHRISL: New functions to handle initialization of inventory coordinates
|
||||
BOOLEAN InitializeInvPanelCoordsOld()
|
||||
@@ -4649,7 +4716,7 @@ UINT32 MapScreenHandle(void)
|
||||
// handle video overlays
|
||||
ExecuteVideoOverlays( );
|
||||
|
||||
if ( InItemStackPopup( ) )
|
||||
if ( InItemStackPopup( ) || InSectorStackPopup( ) )
|
||||
{
|
||||
RenderItemStackPopup( FALSE );
|
||||
}
|
||||
@@ -6137,6 +6204,23 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent )
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
if( fCtrl )
|
||||
{
|
||||
//CHRISL: Delete all items
|
||||
if(!fShowMapInventoryPool)
|
||||
{
|
||||
fShowMapInventoryPool = TRUE;
|
||||
CreateDestroyMapInventoryPoolButtons( TRUE );
|
||||
}
|
||||
DoMessageBox( MSG_BOX_BASIC_STYLE, NewInvMessage[NIV_DELETE_ALL], guiCurrentScreen, ( UINT8 )MSG_BOX_FLAG_YESNO, BeginDeleteAllCallBack, NULL );
|
||||
if(fShowMapInventoryPool)
|
||||
{
|
||||
fShowMapInventoryPool = FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
if( gfPreBattleInterfaceActive )
|
||||
{ //activate enter sector in prebattle interface.
|
||||
@@ -6462,6 +6546,25 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent )
|
||||
RequestTriggerExitFromMapscreen( MAP_EXIT_TO_SAVE );
|
||||
}
|
||||
break;
|
||||
case 'S':
|
||||
if( fCtrl )
|
||||
{
|
||||
//CHRISL: Sell all items
|
||||
if(gGameExternalOptions.fSellAll == TRUE)
|
||||
{
|
||||
if(!fShowMapInventoryPool)
|
||||
{
|
||||
fShowMapInventoryPool = TRUE;
|
||||
CreateDestroyMapInventoryPoolButtons( TRUE );
|
||||
}
|
||||
DoMessageBox( MSG_BOX_BASIC_STYLE, NewInvMessage[NIV_SELL_ALL], guiCurrentScreen, ( UINT8 )MSG_BOX_FLAG_YESNO, BeginSellAllCallBack, NULL );
|
||||
if(fShowMapInventoryPool)
|
||||
{
|
||||
fShowMapInventoryPool = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 't':
|
||||
// Teleport: CTRL-T
|
||||
if( ( fCtrl )&&( CHEATER_CHEAT_LEVEL( ) ) )
|
||||
|
||||
@@ -992,6 +992,7 @@ UINT32 GetArmsDealerItemTypeFromItemNumber( UINT16 usItem )
|
||||
|
||||
// CHRISL: Itendify new class for inventory system
|
||||
case IC_LBEGEAR:
|
||||
case IC_BELTCLIP:
|
||||
return( 0 );
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -2116,7 +2116,7 @@ OBJECTTYPE* InternalAddItemToPool( INT16 *psGridNo, OBJECTTYPE *pObject, INT8 bV
|
||||
{
|
||||
ITEM_POOL *pItemPool;
|
||||
ITEM_POOL *pItemPoolTemp;
|
||||
INT32 iWorldItem;
|
||||
INT32 iWorldItem = 0;
|
||||
STRUCTURE *pStructure, *pBase;
|
||||
INT16 sDesiredLevel;
|
||||
INT16 sNewGridNo = *psGridNo;
|
||||
|
||||
@@ -601,7 +601,7 @@ void RenderTopmostTacticalInterface( )
|
||||
return;
|
||||
}
|
||||
|
||||
if ( InItemStackPopup( ) )
|
||||
if ( InItemStackPopup( ) || InSectorStackPopup( ) )
|
||||
{
|
||||
RenderItemStackPopup( ( BOOLEAN )( fInterfacePanelDirty == DIRTYLEVEL2 ) );
|
||||
}
|
||||
@@ -1049,4 +1049,4 @@ BOOLEAN InterfaceOKForMeanwhilePopup()
|
||||
}
|
||||
|
||||
return( TRUE );
|
||||
}
|
||||
}
|
||||
|
||||
+289
-67
@@ -350,6 +350,7 @@ void DeletePool(ITEM_POOL *pItemPool);
|
||||
|
||||
// ITEM STACK POPUP STUFF
|
||||
BOOLEAN gfInItemStackPopup = FALSE;
|
||||
BOOLEAN gfInSectorStackPopup = FALSE;
|
||||
UINT32 guiItemPopupBoxes;
|
||||
OBJECTTYPE *gpItemPopupObject;
|
||||
INT16 gsItemPopupWidth;
|
||||
@@ -402,6 +403,7 @@ extern void StartSKIDescriptionBox( void );
|
||||
|
||||
void UpdateItemHatches();
|
||||
|
||||
extern void BeginInventoryPoolPtr( OBJECTTYPE *pInventorySlot );
|
||||
|
||||
UINT8 ubRGBItemCyclePlacedItemColors[] =
|
||||
{
|
||||
@@ -607,7 +609,7 @@ void GenerateProsString( STR16 zItemPros, OBJECTTYPE * pObject, UINT32 uiPixLimi
|
||||
UINT32 uiStringLength = 0;
|
||||
STR16 zTemp;
|
||||
UINT16 usItem = pObject->usItem;
|
||||
UINT8 ubWeight;
|
||||
UINT16 ubWeight;
|
||||
|
||||
zItemPros[0] = 0;
|
||||
|
||||
@@ -733,7 +735,7 @@ void GenerateConsString( STR16 zItemCons, OBJECTTYPE * pObject, UINT32 uiPixLimi
|
||||
{
|
||||
UINT32 uiStringLength = 0;
|
||||
STR16 zTemp;
|
||||
UINT8 ubWeight;
|
||||
UINT16 ubWeight;
|
||||
UINT16 usItem = pObject->usItem;
|
||||
|
||||
zItemCons[0] = 0;
|
||||
@@ -1527,7 +1529,7 @@ void INVRenderINVPanelItem( SOLDIERTYPE *pSoldier, INT16 sPocket, UINT8 fDirtyLe
|
||||
if (!gfSMDisableForItems && (UsingNewInventorySystem() == true) && gpItemPointer != NULL)
|
||||
{
|
||||
int itemSlotLimit = ItemSlotLimit(gpItemPointer, sPocket, pSoldier);
|
||||
RenderPocketItemCapacity( itemSlotLimit, sPocket, pSoldier);
|
||||
RenderPocketItemCapacity( guiSAVEBUFFER, itemSlotLimit, sPocket, pSoldier, &pSoldier->inv[sPocket], sX, sY );
|
||||
if(itemSlotLimit == 0 && !CanItemFitInPosition(pSoldier, gpItemPointer, (INT8)sPocket, FALSE)) {
|
||||
fHatchItOut = TRUE;
|
||||
}
|
||||
@@ -2353,15 +2355,14 @@ void InitItemInterface( )
|
||||
}
|
||||
|
||||
// CHRISL: Function to display pocket inventory quantity based on object in cursor
|
||||
void RenderPocketItemCapacity( UINT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldier )
|
||||
void RenderPocketItemCapacity( UINT32 uiWhichBuffer, UINT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT16 sX, INT16 sY )
|
||||
{
|
||||
INT16 sX, sY;
|
||||
static CHAR16 pStr[ 100 ];
|
||||
|
||||
// Can pocket hold the item in the cursor?
|
||||
if(InItemDescriptionBox( ))
|
||||
return;
|
||||
if(!CanItemFitInPosition( pSoldier, gpItemPointer, (INT8)bPos, FALSE ))
|
||||
if(pSoldier != NULL && !CanItemFitInPosition( pSoldier, gpItemPointer, (INT8)bPos, FALSE ))
|
||||
{
|
||||
// Further check to see if the cursor item is valid ammo or a valid attachment
|
||||
if(!CompatibleAmmoForGun(gpItemPointer, &pSoldier->inv[bPos]) && !ValidAttachment(gpItemPointer->usItem, pSoldier->inv[bPos].usItem))
|
||||
@@ -2374,18 +2375,13 @@ void RenderPocketItemCapacity( UINT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldie
|
||||
SetFont( ITEM_FONT );
|
||||
SetFontBackground( FONT_MCOLOR_BLACK );
|
||||
SetFontForeground( FONT_RED );
|
||||
if(CompatibleAmmoForGun(gpItemPointer, &pSoldier->inv[bPos]) || ValidLaunchable(gpItemPointer->usItem, pSoldier->inv[bPos].usItem))
|
||||
{
|
||||
SetFontForeground( FONT_YELLOW );
|
||||
swprintf( pStr, L"L" );
|
||||
}
|
||||
else if(pCapacity != 0 && CanItemFitInPosition(pSoldier, gpItemPointer, (INT8)bPos, FALSE))
|
||||
if(pSoldier == NULL || (pCapacity != 0 && CanItemFitInPosition(pSoldier, gpItemPointer, (INT8)bPos, FALSE)))
|
||||
{
|
||||
// Adjust capacity to account for current items
|
||||
if(gpItemPointer->usItem == pSoldier->inv[bPos].usItem)
|
||||
if(gpItemPointer->usItem == pObj->usItem)
|
||||
{
|
||||
SetFontForeground( FONT_GREEN );
|
||||
pCapacity = pCapacity - pSoldier->inv[bPos].ubNumberOfObjects;
|
||||
pCapacity = pCapacity - pObj->ubNumberOfObjects;
|
||||
if(pCapacity > 0)
|
||||
swprintf( pStr, L"+%d", pCapacity );
|
||||
else
|
||||
@@ -2394,14 +2390,17 @@ void RenderPocketItemCapacity( UINT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldie
|
||||
else
|
||||
swprintf( pStr, L"%d", pCapacity );
|
||||
}
|
||||
else if(CompatibleAmmoForGun(gpItemPointer, &pSoldier->inv[bPos]) || ValidLaunchable(gpItemPointer->usItem, pSoldier->inv[bPos].usItem))
|
||||
{
|
||||
SetFontForeground( FONT_YELLOW );
|
||||
swprintf( pStr, L"L" );
|
||||
}
|
||||
else if(ValidAttachment(gpItemPointer->usItem, pSoldier->inv[bPos].usItem))
|
||||
{
|
||||
SetFontForeground( FONT_YELLOW );
|
||||
swprintf( pStr, L"A" );
|
||||
}
|
||||
sX = gSMInvData[ bPos ].sX + 1;
|
||||
sY = gSMInvData[ bPos ].sY;
|
||||
UINT32 uiWhichBuffer = ( guiCurrentItemDescriptionScreen == MAP_SCREEN ) ? guiSAVEBUFFER : guiRENDERBUFFER;
|
||||
sX = sX + 1;
|
||||
|
||||
// Display pocket capacity
|
||||
if ( uiWhichBuffer == guiSAVEBUFFER )
|
||||
@@ -3370,6 +3369,7 @@ void ItemDescAmmoCallback(GUI_BUTTON *btn,INT32 reason)
|
||||
{
|
||||
static BOOLEAN fRightDown = FALSE;
|
||||
CHAR16 pStr[10];
|
||||
CHAR8 ubString[48];
|
||||
UINT32 ubStatusIndex = MSYS_GetBtnUserData( btn, 1 );
|
||||
|
||||
/* region gets disabled in SKI for shopkeeper boxes. It now works normally for merc's inventory boxes!
|
||||
@@ -3394,23 +3394,77 @@ void ItemDescAmmoCallback(GUI_BUTTON *btn,INT32 reason)
|
||||
|
||||
if( guiCurrentItemDescriptionScreen == MAP_SCREEN )
|
||||
{
|
||||
if ( gpItemPointer == NULL && EmptyWeaponMagazine( gpItemDescObject, &gItemPointer, ubStatusIndex ) )
|
||||
//if ( gpItemPointer == NULL && EmptyWeaponMagazine( gpItemDescObject, &gItemPointer, ubStatusIndex ) )
|
||||
EmptyWeaponMagazine( gpItemDescObject, &gTempObject, ubStatusIndex );
|
||||
if(gpItemPointer == NULL)
|
||||
{
|
||||
// OK, END the description box
|
||||
//fItemDescDelete = TRUE;
|
||||
fInterfacePanelDirty = DIRTYLEVEL2;
|
||||
//not holding anything
|
||||
gTempObject.MoveThisObjectTo(gItemPointer);
|
||||
gpItemPointer = &gItemPointer;
|
||||
gpItemPointerSoldier = gpItemDescSoldier;
|
||||
}
|
||||
else
|
||||
{
|
||||
//holding an item
|
||||
if(Magazine[Item[gpItemPointer->usItem].ubClassIndex].ubCalibre == Weapon[Item[gpItemDescObject->usItem].ubClassIndex].ubCalibre)
|
||||
{
|
||||
ReloadGun(gpItemDescSoldier, gpItemDescObject, gpItemPointer);
|
||||
}
|
||||
if(gpItemPointer->ubNumberOfObjects == 0)
|
||||
{
|
||||
// nothing left in cursor
|
||||
gTempObject.MoveThisObjectTo(gItemPointer);
|
||||
gpItemPointer = &gItemPointer;
|
||||
if(gpItemPointer->ubNumberOfObjects == 0)
|
||||
{
|
||||
// delete object if nothing left
|
||||
MAPEndItemPointer( );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// still holding someting so drop the clip we just pulled from the weapon
|
||||
// start by searching merc for a place to put the clip
|
||||
if(AutoPlaceObject(gpItemDescSoldier, &gTempObject, TRUE) == FALSE)
|
||||
{
|
||||
// couldn't find a place on the merc, so drop into the sector
|
||||
if(fShowMapInventoryPool) //sector inventory panel is open
|
||||
{
|
||||
AutoPlaceObjectInInventoryStash(&gTempObject, gpItemDescSoldier->sGridNo);
|
||||
fMapPanelDirty = TRUE;
|
||||
}
|
||||
else //sector inventory panel is closed
|
||||
{
|
||||
AddItemToPool(gpItemDescSoldier->sGridNo, &gTempObject, 1, gpItemDescSoldier->pathing.bLevel, WORLD_ITEM_REACHABLE, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// OK, END the description box
|
||||
//fItemDescDelete = TRUE;
|
||||
fInterfacePanelDirty = DIRTYLEVEL2;
|
||||
gpItemPointerSoldier = gpItemDescSoldier;
|
||||
|
||||
swprintf( pStr, L"0" );
|
||||
SpecifyButtonText( giItemDescAmmoButton, pStr );
|
||||
if ( GetMagSize(gpItemDescObject) <= 99 )
|
||||
swprintf( pStr, L"%d/%d", (*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunShotsLeft, GetMagSize(gpItemDescObject));
|
||||
else
|
||||
swprintf( pStr, L"%d", (*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunShotsLeft );
|
||||
|
||||
// Set mouse
|
||||
FilenameForBPP("INTERFACE\\infobox.sti", ubString);
|
||||
|
||||
UnloadButtonImage(giItemDescAmmoButtonImages);
|
||||
giItemDescAmmoButtonImages = LoadButtonImage(ubString,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].grayed,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].offNormal,-1,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].onNormal,-1 );
|
||||
//swprintf( pStr, L"0" );
|
||||
SpecifyButtonText( giItemDescAmmoButton, pStr );
|
||||
|
||||
// Set mouse
|
||||
if(gpItemPointer->exists() == true)
|
||||
{
|
||||
guiExternVo = GetInterfaceGraphicForItem( &(Item[ gpItemPointer->usItem ]) );
|
||||
gusExternVoSubIndex = Item[ gpItemPointer->usItem ].ubGraphicNum;
|
||||
|
||||
MSYS_ChangeRegionCursor( &gMPanelRegion , EXTERN_CURSOR );
|
||||
MSYS_SetCurrentCursor( EXTERN_CURSOR );
|
||||
|
||||
fMapInventoryItem=TRUE;
|
||||
fTeamPanelDirty=TRUE;
|
||||
}
|
||||
@@ -3418,27 +3472,67 @@ void ItemDescAmmoCallback(GUI_BUTTON *btn,INT32 reason)
|
||||
else
|
||||
{
|
||||
// Set pointer to item
|
||||
if ( gpItemPointer == NULL && EmptyWeaponMagazine( gpItemDescObject, &gItemPointer, ubStatusIndex ) )
|
||||
EmptyWeaponMagazine( gpItemDescObject, &gTempObject, ubStatusIndex );
|
||||
if(gpItemPointer == NULL)
|
||||
{
|
||||
//not holding anything
|
||||
gTempObject.MoveThisObjectTo(gItemPointer);
|
||||
gpItemPointer = &gItemPointer;
|
||||
gpItemPointerSoldier = gpItemDescSoldier;
|
||||
|
||||
// if in SKI, load item into SKI's item pointer
|
||||
if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE )
|
||||
{
|
||||
// pick up bullets from weapon into cursor (don't try to sell)
|
||||
BeginSkiItemPointer( PLAYERS_INVENTORY, -1, FALSE );
|
||||
}
|
||||
|
||||
// OK, END the description box
|
||||
//fItemDescDelete = TRUE;
|
||||
fInterfacePanelDirty = DIRTYLEVEL2;
|
||||
|
||||
swprintf( pStr, L"0" );
|
||||
SpecifyButtonText( giItemDescAmmoButton, pStr );
|
||||
|
||||
fItemDescDelete = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
//holding an item
|
||||
if(Magazine[Item[gpItemPointer->usItem].ubClassIndex].ubCalibre == Weapon[Item[gpItemDescObject->usItem].ubClassIndex].ubCalibre)
|
||||
{
|
||||
ReloadGun(gpItemDescSoldier, gpItemDescObject, gpItemPointer);
|
||||
}
|
||||
if(gpItemPointer->ubNumberOfObjects == 0)
|
||||
{
|
||||
// nothing left in cursor
|
||||
gTempObject.MoveThisObjectTo(gItemPointer);
|
||||
gpItemPointer = &gItemPointer;
|
||||
if(gpItemPointer->ubNumberOfObjects == 0)
|
||||
{
|
||||
// delete object if nothing left
|
||||
EndItemPointer( );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// still holding someting so drop the clip we just pulled from the weapon
|
||||
// start by searching merc for a place to put the clip
|
||||
if(AutoPlaceObject(gpItemDescSoldier, &gTempObject, TRUE) == FALSE)
|
||||
{
|
||||
AddItemToPool(gpItemDescSoldier->sGridNo, &gTempObject, 1, gpItemDescSoldier->pathing.bLevel, WORLD_ITEM_REACHABLE, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
gpItemPointerSoldier = gpItemDescSoldier;
|
||||
|
||||
// if in SKI, load item into SKI's item pointer
|
||||
if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE )
|
||||
{
|
||||
// pick up bullets from weapon into cursor (don't try to sell)
|
||||
BeginSkiItemPointer( PLAYERS_INVENTORY, -1, FALSE );
|
||||
}
|
||||
|
||||
// OK, END the description box
|
||||
//fItemDescDelete = TRUE;
|
||||
fInterfacePanelDirty = DIRTYLEVEL2;
|
||||
|
||||
if ( GetMagSize(gpItemDescObject) <= 99 )
|
||||
swprintf( pStr, L"%d/%d", (*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunShotsLeft, GetMagSize(gpItemDescObject));
|
||||
else
|
||||
swprintf( pStr, L"%d", (*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunShotsLeft );
|
||||
|
||||
FilenameForBPP("INTERFACE\\infobox.sti", ubString);
|
||||
|
||||
UnloadButtonImage(giItemDescAmmoButtonImages);
|
||||
giItemDescAmmoButtonImages = LoadButtonImage(ubString,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].grayed,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].offNormal,-1,AmmoTypes[(*gpItemDescObject)[ubStatusIndex]->data.gun.ubGunAmmoType].onNormal,-1 );
|
||||
//swprintf( pStr, L"0" );
|
||||
SpecifyButtonText( giItemDescAmmoButton, pStr );
|
||||
|
||||
fItemDescDelete = TRUE;
|
||||
|
||||
}
|
||||
btn->uiFlags &= (~BUTTON_CLICKED_ON );
|
||||
@@ -6040,18 +6134,127 @@ BOOLEAN ItemCursorInLobRange( INT16 sMapPos )
|
||||
|
||||
|
||||
|
||||
BOOLEAN InSectorStackPopup( )
|
||||
{
|
||||
return( gfInSectorStackPopup );
|
||||
}
|
||||
|
||||
BOOLEAN InItemStackPopup( )
|
||||
{
|
||||
return( gfInItemStackPopup );
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN InKeyRingPopup( )
|
||||
{
|
||||
return( gfInKeyRingPopup );
|
||||
}
|
||||
|
||||
BOOLEAN InitSectorStackPopup( WORLDITEM *pInventoryPoolList, INT32 ubPosition, INT16 sInvX, INT16 sInvY, INT16 sInvWidth, INT16 sInvHeight )
|
||||
{
|
||||
VOBJECT_DESC VObjectDesc;
|
||||
SGPRect aRect;
|
||||
ETRLEObject *pTrav;
|
||||
HVOBJECT hVObject;
|
||||
INT32 cnt;
|
||||
UINT16 usPopupWidth, usPopupHeight;
|
||||
INT16 sOffSetY = 0, sOffSetX = 0;
|
||||
INT16 sItemWidth = 0;
|
||||
static CHAR16 pStr[ 512 ];
|
||||
|
||||
sItemWidth = MAP_INV_ITEM_ROW_WIDTH - 1;
|
||||
sOffSetY = 120;
|
||||
|
||||
// Set some globals
|
||||
guiCurrentItemDescriptionScreen = guiCurrentScreen;
|
||||
gsItemPopupInvX = sInvX;
|
||||
gsItemPopupInvY = sInvY;
|
||||
gsItemPopupInvWidth = sInvWidth;
|
||||
gsItemPopupInvHeight = sInvHeight;
|
||||
// Determine # of items
|
||||
gpItemPopupObject = &(pInventoryPoolList->object );
|
||||
gubNumItemPopups = ItemSlotLimit( gpItemPopupObject, STACK_SIZE_LIMIT );
|
||||
|
||||
// Return false if #objects not >1
|
||||
if ( gubNumItemPopups <1 )
|
||||
return( FALSE );
|
||||
|
||||
// Load graphics
|
||||
VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMFILE;
|
||||
strcpy( VObjectDesc.ImageFile, "INTERFACE\\extra_inventory.STI" );
|
||||
CHECKF( AddVideoObject( &VObjectDesc, &guiItemPopupBoxes) );
|
||||
|
||||
// Get size
|
||||
GetVideoObject( &hVObject, guiItemPopupBoxes );
|
||||
pTrav = &(hVObject->pETRLEObject[ 0 ] );
|
||||
usPopupWidth = 75;
|
||||
//usPopupWidth = pTrav->usWidth;
|
||||
usPopupHeight = pTrav->usHeight;
|
||||
|
||||
// Get Width, Height
|
||||
gsItemPopupWidth = gubNumItemPopups * usPopupWidth;
|
||||
gsItemPopupHeight = pTrav->usHeight;
|
||||
gsItemPopupX = gsItemPopupInvX;
|
||||
gsItemPopupY = gsItemPopupInvY;
|
||||
|
||||
for ( cnt = 0; cnt < gubNumItemPopups; cnt++ )
|
||||
{
|
||||
// Build a mouse region here that is over any others.....
|
||||
MSYS_DefineRegion( &gItemPopupRegions[cnt],
|
||||
(INT16)( gsItemPopupInvX + ( cnt % sItemWidth * usPopupWidth ) + sOffSetX ), // top left
|
||||
(INT16)( sInvY + sOffSetY +( cnt / sItemWidth * usPopupHeight ) ), // top right
|
||||
(INT16)( gsItemPopupInvX + ( ( cnt % sItemWidth ) + 1 ) * usPopupWidth + sOffSetX ), // bottom left
|
||||
(INT16)( sInvY + ( (cnt / sItemWidth + 1) * usPopupHeight ) + sOffSetY ), // bottom right
|
||||
MSYS_PRIORITY_HIGHEST,
|
||||
MSYS_NO_CURSOR, MSYS_NO_CALLBACK, ItemPopupRegionCallback );
|
||||
// Add region
|
||||
MSYS_AddRegion( &gItemPopupRegions[cnt]);
|
||||
MSYS_SetRegionUserData( &gItemPopupRegions[cnt], 0, cnt );
|
||||
//CHRISL: Include the pockets capacity as UserData 1
|
||||
MSYS_SetRegionUserData( &gItemPopupRegions[cnt], 1, gubNumItemPopups );
|
||||
// Flag this as a sectory item
|
||||
MSYS_SetRegionUserData( &gItemPopupRegions[cnt], 2, -1);
|
||||
//CHRISL: Include the pocket we're looking at so we can display the right graphic
|
||||
MSYS_SetRegionUserData( &gItemPopupRegions[cnt], 3, ubPosition);
|
||||
|
||||
//OK, for each item, set dirty text if applicable!
|
||||
//CHRISL:
|
||||
if(cnt < gpItemPopupObject->ubNumberOfObjects && gpItemPopupObject->exists() == true){
|
||||
GetHelpTextForItem( pStr, gpItemPopupObject, 0, cnt );
|
||||
SetRegionFastHelpText( &(gItemPopupRegions[ cnt ]), pStr );
|
||||
}
|
||||
else{
|
||||
SetRegionFastHelpText( &(gItemPopupRegions[ cnt ]), ItemNames[ gpItemPopupObject->usItem ] );
|
||||
}
|
||||
SetRegionHelpEndCallback( &(gItemPopupRegions[ cnt ]), HelpTextDoneCallback );
|
||||
gfItemPopupRegionCallbackEndFix = FALSE;
|
||||
}
|
||||
|
||||
|
||||
// Build a mouse region here that is over any others.....
|
||||
MSYS_DefineRegion( &gItemPopupRegion, sInvX, sInvY ,(INT16)(sInvX + sInvWidth), (INT16)(sInvY + sInvHeight), MSYS_PRIORITY_HIGH,
|
||||
MSYS_NO_CURSOR, MSYS_NO_CALLBACK, ItemPopupFullRegionCallback );
|
||||
// Add region
|
||||
MSYS_AddRegion( &gItemPopupRegion);
|
||||
|
||||
//Disable all faces
|
||||
SetAllAutoFacesInactive( );
|
||||
|
||||
fInterfacePanelDirty = DIRTYLEVEL2;
|
||||
|
||||
gfInSectorStackPopup = TRUE;
|
||||
fShowInventoryFlag = TRUE;
|
||||
|
||||
//Reserict mouse cursor to panel
|
||||
aRect.iLeft = sInvX + sOffSetX;
|
||||
aRect.iTop = sInvY + sOffSetY;
|
||||
aRect.iRight = aRect.iLeft + sItemWidth * usPopupWidth;
|
||||
aRect.iBottom = aRect.iTop + (INT32)(ceil((float)cnt/(float)sItemWidth)+1) * usPopupHeight;
|
||||
|
||||
RestrictMouseCursor( &aRect );
|
||||
|
||||
return( TRUE );
|
||||
}
|
||||
|
||||
BOOLEAN InitItemStackPopup( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sInvX, INT16 sInvY, INT16 sInvWidth, INT16 sInvHeight )
|
||||
{
|
||||
VOBJECT_DESC VObjectDesc;
|
||||
@@ -6211,10 +6414,14 @@ BOOLEAN InitItemStackPopup( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sInvX
|
||||
gfInItemStackPopup = TRUE;
|
||||
|
||||
//Reserict mouse cursor to panel
|
||||
aRect.iTop = sInvY;
|
||||
aRect.iLeft = sInvX;
|
||||
aRect.iBottom = sInvY + sInvHeight;
|
||||
aRect.iRight = sInvX + sInvWidth;
|
||||
aRect.iLeft = sInvX + sOffSetX;
|
||||
aRect.iTop = sInvY + sOffSetY;
|
||||
aRect.iRight = aRect.iLeft + sItemWidth * usPopupWidth;
|
||||
aRect.iBottom = aRect.iTop + (INT32)(ceil((float)cnt/(float)sItemWidth)+1) * usPopupHeight;
|
||||
//aRect.iTop = sInvY;
|
||||
//aRect.iLeft = sInvX;
|
||||
//aRect.iBottom = sInvY + sInvHeight;
|
||||
//aRect.iRight = sInvX + sInvWidth;
|
||||
|
||||
RestrictMouseCursor( &aRect );
|
||||
|
||||
@@ -6237,7 +6444,8 @@ void RenderItemStackPopup( BOOLEAN fFullRender )
|
||||
UINT32 cnt;
|
||||
INT16 sX, sY, sNewX, sNewY;
|
||||
INT16 sItemWidth = 0, sOffSetY = 0, sWidth = 29;
|
||||
UINT8 ubPosition, image = 0, sID;
|
||||
UINT8 ubPosition, image = 0;
|
||||
int sID;
|
||||
|
||||
// CHRISL: Setup witdh and offset to layer inventory boxes if necessary
|
||||
if( guiCurrentScreen == MAP_SCREEN )
|
||||
@@ -6276,9 +6484,9 @@ void RenderItemStackPopup( BOOLEAN fFullRender )
|
||||
usWidth = (UINT32)pTrav->usWidth;
|
||||
|
||||
//CHRISL: resize usPopupWidth based on popup stack location
|
||||
if(UsingNewInventorySystem() == true)
|
||||
if(UsingNewInventorySystem() == true || sID == -1)
|
||||
{
|
||||
if((ubPosition >=BIGPOCKSTART && ubPosition < BIGPOCKFINAL) || (gGameExternalOptions.fVehicleInventory && (MercPtrs[sID]->flags.uiStatusFlags & SOLDIER_VEHICLE)))
|
||||
if(sID == -1 || (ubPosition >=BIGPOCKSTART && ubPosition < BIGPOCKFINAL) || (gGameExternalOptions.fVehicleInventory && (MercPtrs[sID]->flags.uiStatusFlags & SOLDIER_VEHICLE)))
|
||||
{
|
||||
if(guiCurrentScreen != MAP_SCREEN)
|
||||
sItemWidth -= 2;
|
||||
@@ -6345,6 +6553,7 @@ void DeleteItemStackPopup( )
|
||||
|
||||
|
||||
gfInItemStackPopup = FALSE;
|
||||
gfInSectorStackPopup = FALSE;
|
||||
|
||||
for ( cnt = 0; cnt < gubNumItemPopups; cnt++ )
|
||||
{
|
||||
@@ -6466,10 +6675,10 @@ BOOLEAN InitKeyRingPopup( SOLDIERTYPE *pSoldier, INT16 sInvX, INT16 sInvY, INT16
|
||||
gfInKeyRingPopup = TRUE;
|
||||
|
||||
//Reserict mouse cursor to panel
|
||||
aRect.iTop = sInvY;
|
||||
aRect.iLeft = sInvX;
|
||||
aRect.iBottom = sInvY + sInvHeight;
|
||||
aRect.iRight = sInvX + sInvWidth;
|
||||
aRect.iLeft = gsKeyRingPopupInvX + sOffSetX;
|
||||
aRect.iTop = sInvY + sOffSetY;
|
||||
aRect.iRight = aRect.iLeft + sKeyRingItemWidth * usPopupWidth;
|
||||
aRect.iBottom = aRect.iTop + (INT32)(ceil((float)cnt/(float)sKeyRingItemWidth)+1) * usPopupHeight;
|
||||
|
||||
RestrictMouseCursor( &aRect );
|
||||
|
||||
@@ -6811,7 +7020,7 @@ void ItemPopupRegionCallback( MOUSE_REGION * pRegion, INT32 iReason )
|
||||
{
|
||||
UINT32 uiItemPos;
|
||||
UINT32 iItemCap;
|
||||
UINT32 ubID;
|
||||
INT32 ubID;
|
||||
|
||||
uiItemPos = MSYS_GetRegionUserData( pRegion, 0 );
|
||||
iItemCap = MSYS_GetRegionUserData( pRegion, 1 );
|
||||
@@ -6884,15 +7093,26 @@ void ItemPopupRegionCallback( MOUSE_REGION * pRegion, INT32 iReason )
|
||||
{
|
||||
// Here, grab an item and put in cursor to swap
|
||||
//RemoveObjFrom( OBJECTTYPE * pObj, UINT8 ubRemoveIndex )
|
||||
gpItemPopupObject->RemoveObjectAtIndex( uiItemPos, &gItemPointer );
|
||||
|
||||
if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) )
|
||||
{
|
||||
// pick it up
|
||||
InternalMAPBeginItemPointer( gpItemPopupSoldier );
|
||||
if(ubID != -1)
|
||||
{
|
||||
gpItemPopupObject->RemoveObjectAtIndex( uiItemPos, &gItemPointer );
|
||||
InternalMAPBeginItemPointer( gpItemPopupSoldier );
|
||||
}
|
||||
else
|
||||
{
|
||||
OBJECTTYPE tSectorItem;
|
||||
gpItemPopupObject->RemoveObjectAtIndex( uiItemPos, &tSectorItem );
|
||||
BeginInventoryPoolPtr(&tSectorItem);
|
||||
guiCurrentItemDescriptionScreen = MAP_SCREEN;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gpItemPopupObject->RemoveObjectAtIndex( uiItemPos, &gItemPointer );
|
||||
gpItemPointer = &gItemPointer;
|
||||
gpItemPointerSoldier = gpItemPopupSoldier;
|
||||
}
|
||||
@@ -6903,13 +7123,13 @@ void ItemPopupRegionCallback( MOUSE_REGION * pRegion, INT32 iReason )
|
||||
// pick up stacked item into cursor and try to sell it ( unless CTRL is held down )
|
||||
BeginSkiItemPointer( PLAYERS_INVENTORY, -1, ( BOOLEAN )!gfKeyState[ CTRL ] );
|
||||
|
||||
// if we've just removed the last one there
|
||||
if ( gpItemPopupObject->exists() == false )
|
||||
{
|
||||
// we must immediately get out of item stack popup, because the item has been deleted (memset to 0), and
|
||||
// errors like a right bringing up an item description for item 0 could happen then. ARM.
|
||||
DeleteItemStackPopup( );
|
||||
}
|
||||
}
|
||||
// if we've just removed the last one there
|
||||
if ( gpItemPopupObject->exists() == false )
|
||||
{
|
||||
// we must immediately get out of item stack popup, because the item has been deleted (memset to 0), and
|
||||
// errors like a right bringing up an item description for item 0 could happen then. ARM.
|
||||
DeleteItemStackPopup( );
|
||||
}
|
||||
|
||||
// re-evaluate repairs
|
||||
@@ -6933,7 +7153,9 @@ void ItemPopupRegionCallback( MOUSE_REGION * pRegion, INT32 iReason )
|
||||
|
||||
DeleteItemStackPopup( );
|
||||
|
||||
if ( !InItemDescriptionBox( ) )
|
||||
if ( gpItemPopupObject->ubNumberOfObjects <= uiItemPos )
|
||||
fTeamPanelDirty = TRUE;
|
||||
else if ( !InItemDescriptionBox( ) )
|
||||
{
|
||||
// RESTORE BACKGROUND
|
||||
RestoreExternBackgroundRect( gsItemPopupInvX, gsItemPopupInvY, gsItemPopupInvWidth, gsItemPopupInvHeight );
|
||||
@@ -6972,7 +7194,7 @@ void ItemPopupFullRegionCallback( MOUSE_REGION * pRegion, INT32 iReason )
|
||||
}
|
||||
else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
|
||||
{
|
||||
if ( InItemStackPopup( ) )
|
||||
if ( InItemStackPopup( ) || InSectorStackPopup( ) )
|
||||
{
|
||||
DeleteItemStackPopup( );
|
||||
fTeamPanelDirty = TRUE;
|
||||
|
||||
@@ -115,7 +115,7 @@ void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObject
|
||||
// CHRISL: Add a new function that will be used to render a pocket silhouette
|
||||
void INVRenderSilhouette( UINT32 uiBugger, INT16 PocketIndex, INT16 SilIndex, INT16 sX, INT16 sY, INT16 sWideth, INT16 sHeight);
|
||||
// CHRISL: New function to handle display of inventory quantities based on item current in cursor
|
||||
void RenderPocketItemCapacity( UINT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldier );
|
||||
void RenderPocketItemCapacity( UINT32 uiWhichBuffer, UINT8 pCapacity, INT16 bPos, SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT16 sX, INT16 sY );
|
||||
// CHRISL: New function to display items stored in an LBENODE
|
||||
void RenderLBENODEItems( OBJECTTYPE *pObj, int subObject );
|
||||
// CHRISL: New function to setup GSMInvData based on game options
|
||||
@@ -140,6 +140,8 @@ void DeleteItemDescriptionBox( );
|
||||
|
||||
BOOLEAN InItemStackPopup( );
|
||||
BOOLEAN InitItemStackPopup( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sInvX, INT16 sInvY, INT16 sInvWidth, INT16 sInvHeight );
|
||||
BOOLEAN InSectorStackPopup( );
|
||||
BOOLEAN InitSectorStackPopup( WORLDITEM *pInventoryPoolList, INT32 ubPosition, INT16 sInvX, INT16 sInvY, INT16 sInvWidth, INT16 sInvHeight );
|
||||
void RenderItemStackPopup( BOOLEAN fFullRender );
|
||||
void HandleItemStackPopup( );
|
||||
void DeleteItemStackPopup( );
|
||||
|
||||
@@ -3476,7 +3476,7 @@ void SMInvClickCallback( MOUSE_REGION * pRegion, INT32 iReason )
|
||||
invWidth = 314;
|
||||
|
||||
//InitItemStackPopup( gpSMCurrentMerc, (UINT8)uiHandPos, SM_ITEMDESC_START_X, SM_ITEMDESC_START_Y, SM_ITEMDESC_WIDTH, SM_ITEMDESC_HEIGHT );
|
||||
InitItemStackPopup( gpSMCurrentMerc, (UINT8)uiHandPos, 216, INV_INTERFACE_START_Y, invWidth, ( SCREEN_HEIGHT - INV_INTERFACE_START_Y ) );
|
||||
InitItemStackPopup( gpSMCurrentMerc, (UINT8)uiHandPos, 248, INV_INTERFACE_START_Y, invWidth, ( SCREEN_HEIGHT - INV_INTERFACE_START_Y ) );
|
||||
|
||||
}
|
||||
}
|
||||
@@ -6277,7 +6277,8 @@ UINT8 FindNextMercInTeamPanel( SOLDIERTYPE *pSoldier, BOOLEAN fGoodForLessOKLife
|
||||
|
||||
if ( pNewSoldier->bAssignment != iCurrentSquad )
|
||||
{
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_ACTIVE ], ( CurrentSquad( ) + 1 ) );
|
||||
//ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_ACTIVE ], ( CurrentSquad( ) + 1 ) );
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_ACTIVE ], ( pNewSoldier->bAssignment + 1 ) );
|
||||
|
||||
return( pNewSoldier->ubID );
|
||||
}
|
||||
@@ -6368,7 +6369,7 @@ void BeginKeyPanelFromKeyShortcut( )
|
||||
if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE )
|
||||
return;
|
||||
|
||||
InitKeyRingPopup( pSoldier, 0, sStartYPosition, sWidth, sHeight );
|
||||
InitKeyRingPopup( pSoldier, 35, sStartYPosition, sWidth, sHeight );
|
||||
}
|
||||
|
||||
|
||||
@@ -6431,7 +6432,7 @@ void KeyRingItemPanelButtonCallback( MOUSE_REGION * pRegion, INT32 iReason )
|
||||
InvalidateRegion( 0, 107, 261, 359 );
|
||||
}
|
||||
|
||||
InitKeyRingPopup( pSoldier, 0, sStartYPosition, sWidth, sHeight );
|
||||
InitKeyRingPopup( pSoldier, 35, sStartYPosition, sWidth, sHeight );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7013,3 +7014,4 @@ void GoToMapScreenFromTactical( void )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -526,6 +526,7 @@ extern OBJECTTYPE gTempObject;
|
||||
|
||||
#define IC_KEY 0x00010000
|
||||
#define IC_LBEGEAR 0x00020000 // Added for LBE items as part of the new inventory system
|
||||
#define IC_BELTCLIP 0x00040000 // Added for Belt Clip items
|
||||
|
||||
#define IC_MISC 0x10000000
|
||||
#define IC_MONEY 0x20000000
|
||||
@@ -590,7 +591,7 @@ typedef struct
|
||||
INT8 bSoundType;
|
||||
UINT8 ubGraphicType;
|
||||
UINT16 ubGraphicNum;
|
||||
UINT8 ubWeight; //2 units per kilogram; roughly 1 unit per pound
|
||||
UINT16 ubWeight; //2 units per kilogram; roughly 1 unit per pound
|
||||
UINT8 ubPerPocket;
|
||||
UINT8 ItemSize;
|
||||
UINT16 usPrice;
|
||||
|
||||
+9
-3
@@ -1439,7 +1439,7 @@ UINT8 ItemSlotLimit( OBJECTTYPE * pObject, INT16 bSlot, SOLDIERTYPE *pSoldier, B
|
||||
//if ( iSize < 10 && ubSlotLimit > 1)
|
||||
// ubSlotLimit = 1;
|
||||
|
||||
if(LBEPocketType[pIndex].pRestriction != 0 && LBEPocketType[pIndex].pRestriction != Item[usItem].usItemClass) {
|
||||
if(LBEPocketType[pIndex].pRestriction != 0 && !(LBEPocketType[pIndex].pRestriction & Item[usItem].usItemClass)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3678,6 +3678,12 @@ BOOLEAN OBJECTTYPE::AttachObject( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttachme
|
||||
// check for merges
|
||||
else if (EvaluateValidMerge( pAttachment->usItem, this->usItem, &usResult, &usResult2, &ubType, &ubAPCost ))
|
||||
{
|
||||
//CHRISL: we don't want to try to merge IC_LBEGEAR items that are currently storing items.
|
||||
if(Item[this->usItem].usItemClass == IC_LBEGEAR)
|
||||
{
|
||||
if(this->IsActiveLBE(subObject) == true)
|
||||
return( FALSE );
|
||||
}
|
||||
//CHRISL: We don't want to do any merges if we're looking at a stack of items, with the exception of combines.
|
||||
if ( this->ubNumberOfObjects > 1 && ubType != COMBINE_POINTS )
|
||||
{
|
||||
@@ -4180,7 +4186,7 @@ BOOLEAN CanItemFitInPosition( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj, INT8 bPos
|
||||
lbePocket = (pSoldier->inv[icLBE[bPos]].exists() == false) ? LoadBearingEquipment[Item[icDefault[bPos]].ubClassIndex].lbePocketIndex[icPocket[bPos]] : LoadBearingEquipment[Item[pSoldier->inv[icLBE[bPos]].usItem].ubClassIndex].lbePocketIndex[icPocket[bPos]];
|
||||
pRestrict = LBEPocketType[lbePocket].pRestriction;
|
||||
if(pRestrict != 0)
|
||||
if(pRestrict != Item[pObj->usItem].usItemClass)
|
||||
if(!(pRestrict & Item[pObj->usItem].usItemClass))
|
||||
lbePocket = 0;
|
||||
}
|
||||
break;
|
||||
@@ -4267,7 +4273,7 @@ INT32 PickPocket(SOLDIERTYPE *pSoldier, UINT8 ppStart, UINT8 ppStop, UINT16 usIt
|
||||
if(LBEPocketType[pIndex].ItemCapacityPerSize[Item[usItem].ItemSize] >= iNumber &&
|
||||
LBEPocketType[pIndex].ItemCapacityPerSize[Item[usItem].ItemSize] < capacity &&
|
||||
pSoldier->inv[uiPos].exists() == false && uiPos != bExcludeSlot) {
|
||||
if((LBEPocketType[pIndex].pRestriction != 0 && LBEPocketType[pIndex].pRestriction == Item[usItem].usItemClass) ||
|
||||
if((LBEPocketType[pIndex].pRestriction != 0 && (LBEPocketType[pIndex].pRestriction & Item[usItem].usItemClass)) ||
|
||||
LBEPocketType[pIndex].pRestriction == 0) {
|
||||
capacity = LBEPocketType[pIndex].ItemCapacityPerSize[Item[usItem].ItemSize];
|
||||
pocket = uiPos;
|
||||
|
||||
@@ -534,6 +534,10 @@ BOOLEAN EnoughPoints( SOLDIERTYPE *pSoldier, INT16 sAPCost, INT32 iBPCost, BOOLE
|
||||
{
|
||||
INT16 sNewAP = 0;
|
||||
|
||||
//CHRISL: if we don't have soldier information, assume we have enough points.
|
||||
if(pSoldier == NULL)
|
||||
return( TRUE );
|
||||
|
||||
// If this guy is on a special move... don't care about APS, OR BPSs!
|
||||
if ( pSoldier->ubWaitActionToDo )
|
||||
{
|
||||
|
||||
@@ -544,7 +544,14 @@ SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 *
|
||||
|
||||
// Copy the items over for the soldier, only if we have a valid profile id!
|
||||
if ( pCreateStruct->ubProfile != NO_PROFILE )
|
||||
{
|
||||
CopyProfileItems( &Soldier, pCreateStruct );
|
||||
//CHRISL: make sure nails gets his jacket no matter what
|
||||
if(pCreateStruct->ubProfile == 34 && pCreateStruct->fCopyProfileItemsOver == FALSE)
|
||||
{
|
||||
CreateItem(188, 100, &Soldier.inv[VESTPOS]);
|
||||
}
|
||||
}
|
||||
|
||||
// Given team, get an ID for this guy!
|
||||
|
||||
|
||||
@@ -1866,7 +1866,8 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
|
||||
{
|
||||
HandleLocateSelectMerc( pNewSoldier->ubID, LOCATEANDSELECT_MERC );
|
||||
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_ACTIVE ], ( CurrentSquad( ) + 1 ) );
|
||||
//ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_ACTIVE ], ( CurrentSquad( ) + 1 ) );
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_ACTIVE ], ( pNewSoldier->bAssignment + 1 ) );
|
||||
|
||||
// Center to guy....
|
||||
LocateSoldier( gusSelectedSoldier, SETLOCATOR );
|
||||
@@ -2327,93 +2328,96 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
|
||||
//CHRISL: Ammo Crate
|
||||
if ( fCtrl )
|
||||
{
|
||||
INT32 crateItem;
|
||||
INT32 worldItem;
|
||||
bool mergeSuccessful;
|
||||
OBJECTTYPE newCrate;
|
||||
//look through all sector items for ammo.
|
||||
for(unsigned int wItem = 0; wItem < guiNumWorldItems; wItem++)
|
||||
if(!(gTacticalStatus.fEnemyInSector))
|
||||
{
|
||||
crateItem = 0;
|
||||
mergeSuccessful = false;
|
||||
if(Item[gWorldItems[wItem].object.usItem].usItemClass == IC_AMMO && gWorldItems[wItem].bVisible == TRUE && gWorldItems[wItem].fExists && (gWorldItems[wItem].usFlags & WORLD_ITEM_REACHABLE) && !(gWorldItems[wItem].usFlags & WORLD_ITEM_ARMED_BOMB))
|
||||
INT32 crateItem;
|
||||
INT32 worldItem;
|
||||
bool mergeSuccessful;
|
||||
OBJECTTYPE newCrate;
|
||||
//look through all sector items for ammo.
|
||||
for(unsigned int wItem = 0; wItem < guiNumWorldItems; wItem++)
|
||||
{
|
||||
worldItem = gWorldItems[wItem].object.usItem;
|
||||
//we don't want to do anything if the world item is already an ammo crate
|
||||
if(Item[worldItem].ammocrate == TRUE)
|
||||
continue;
|
||||
//we have a valid, ammo item. Look through Items.xml and see if we have an ammo crate for
|
||||
// this ammo type
|
||||
for(int iLoop = 0; iLoop < MAXITEMS; iLoop++)
|
||||
crateItem = 0;
|
||||
mergeSuccessful = false;
|
||||
if(Item[gWorldItems[wItem].object.usItem].usItemClass == IC_AMMO && gWorldItems[wItem].bVisible == TRUE && gWorldItems[wItem].fExists && (gWorldItems[wItem].usFlags & WORLD_ITEM_REACHABLE) && !(gWorldItems[wItem].usFlags & WORLD_ITEM_ARMED_BOMB))
|
||||
{
|
||||
//if ammocrate && calibers match && Ammo Types match
|
||||
if(Item[iLoop].ammocrate == TRUE && Magazine[Item[iLoop].ubClassIndex].ubCalibre == Magazine[Item[worldItem].ubClassIndex].ubCalibre && Magazine[Item[iLoop].ubClassIndex].ubAmmoType == Magazine[Item[worldItem].ubClassIndex].ubAmmoType)
|
||||
worldItem = gWorldItems[wItem].object.usItem;
|
||||
//we don't want to do anything if the world item is already an ammo crate
|
||||
if(Item[worldItem].ammocrate == TRUE)
|
||||
continue;
|
||||
//we have a valid, ammo item. Look through Items.xml and see if we have an ammo crate for
|
||||
// this ammo type
|
||||
for(int iLoop = 0; iLoop < MAXITEMS; iLoop++)
|
||||
{
|
||||
crateItem = iLoop;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//if we found a crateItem in the list, we first want to see if we already have an item created
|
||||
if(crateItem != 0)
|
||||
{
|
||||
//look through world items first
|
||||
for(unsigned int loop=0; loop < guiNumWorldItems; loop++)
|
||||
{
|
||||
if(gWorldItems[loop].object.usItem == crateItem)
|
||||
//if ammocrate && calibers match && Ammo Types match
|
||||
if(Item[iLoop].ammocrate == TRUE && Magazine[Item[iLoop].ubClassIndex].ubCalibre == Magazine[Item[worldItem].ubClassIndex].ubCalibre && Magazine[Item[iLoop].ubClassIndex].ubAmmoType == Magazine[Item[worldItem].ubClassIndex].ubAmmoType)
|
||||
{
|
||||
DistributeStatus(&gWorldItems[wItem].object, &gWorldItems[loop].object, Magazine[Item[crateItem].ubClassIndex].ubMagSize);
|
||||
crateItem = iLoop;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//if we found a crateItem in the list, we first want to see if we already have an item created
|
||||
if(crateItem != 0)
|
||||
{
|
||||
//look through world items first
|
||||
for(unsigned int loop=0; loop < guiNumWorldItems; loop++)
|
||||
{
|
||||
if(gWorldItems[loop].object.usItem == crateItem)
|
||||
{
|
||||
DistributeStatus(&gWorldItems[wItem].object, &gWorldItems[loop].object, Magazine[Item[crateItem].ubClassIndex].ubMagSize);
|
||||
if(gWorldItems[wItem].object.ubNumberOfObjects < 1)
|
||||
{
|
||||
mergeSuccessful = true;
|
||||
RemoveItemFromPool(gWorldItems[wItem].sGridNo,(wItem),gWorldItems[wItem].ubLevel);
|
||||
RemoveItemFromWorld(wItem);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//no crates in sector inventory. search merc inventories
|
||||
if(mergeSuccessful == false)
|
||||
{
|
||||
for(int loop=0; loop<18; loop++)
|
||||
{
|
||||
if(MercPtrs[loop]->bActive && MercPtrs[loop]->bInSector)
|
||||
{
|
||||
for(unsigned int pocket=0; pocket < MercPtrs[loop]->inv.size(); pocket++)
|
||||
{
|
||||
if(MercPtrs[loop]->inv[pocket].usItem == crateItem)
|
||||
{
|
||||
DistributeStatus(&gWorldItems[wItem].object, &MercPtrs[loop]->inv[pocket], Magazine[Item[crateItem].ubClassIndex].ubMagSize);
|
||||
if(gWorldItems[wItem].object.ubNumberOfObjects < 1)
|
||||
{
|
||||
mergeSuccessful = true;
|
||||
RemoveItemFromPool(gWorldItems[wItem].sGridNo,(wItem),gWorldItems[wItem].ubLevel);
|
||||
RemoveItemFromWorld(wItem);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(mergeSuccessful == true)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//no crates in merc inventory. create a new sector item
|
||||
if(mergeSuccessful == false)
|
||||
{
|
||||
CreateAmmo(crateItem, &newCrate, 0);
|
||||
DistributeStatus(&gWorldItems[wItem].object, &newCrate, Magazine[Item[crateItem].ubClassIndex].ubMagSize);
|
||||
AddItemToPool(gWorldItems[wItem].sGridNo, &newCrate, 1, gWorldItems[wItem].ubLevel, gWorldItems[wItem].usFlags, gWorldItems[wItem].bRenderZHeightAboveLevel);
|
||||
if(gWorldItems[wItem].object.ubNumberOfObjects < 1)
|
||||
{
|
||||
mergeSuccessful = true;
|
||||
RemoveItemFromPool(gWorldItems[wItem].sGridNo,(wItem),gWorldItems[wItem].ubLevel);
|
||||
RemoveItemFromWorld(wItem);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//no crates in sector inventory. search merc inventories
|
||||
if(mergeSuccessful == false)
|
||||
{
|
||||
for(int loop=0; loop<18; loop++)
|
||||
{
|
||||
if(MercPtrs[loop]->bActive && MercPtrs[loop]->bInSector)
|
||||
{
|
||||
for(unsigned int pocket=0; pocket < MercPtrs[loop]->inv.size(); pocket++)
|
||||
{
|
||||
if(MercPtrs[loop]->inv[pocket].usItem == crateItem)
|
||||
{
|
||||
DistributeStatus(&gWorldItems[wItem].object, &MercPtrs[loop]->inv[pocket], Magazine[Item[crateItem].ubClassIndex].ubMagSize);
|
||||
if(gWorldItems[wItem].object.ubNumberOfObjects < 1)
|
||||
{
|
||||
mergeSuccessful = true;
|
||||
RemoveItemFromPool(gWorldItems[wItem].sGridNo,(wItem),gWorldItems[wItem].ubLevel);
|
||||
RemoveItemFromWorld(wItem);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(mergeSuccessful == true)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//no crates in merc inventory. create a new sector item
|
||||
if(mergeSuccessful == false)
|
||||
{
|
||||
CreateAmmo(crateItem, &newCrate, 0);
|
||||
DistributeStatus(&gWorldItems[wItem].object, &newCrate, Magazine[Item[crateItem].ubClassIndex].ubMagSize);
|
||||
AddItemToPool(gWorldItems[wItem].sGridNo, &newCrate, 1, gWorldItems[wItem].ubLevel, gWorldItems[wItem].usFlags, gWorldItems[wItem].bRenderZHeightAboveLevel);
|
||||
if(gWorldItems[wItem].object.ubNumberOfObjects < 1)
|
||||
{
|
||||
mergeSuccessful = true;
|
||||
RemoveItemFromPool(gWorldItems[wItem].sGridNo,(wItem),gWorldItems[wItem].ubLevel);
|
||||
RemoveItemFromWorld(wItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pImpButtonText[11] );
|
||||
}
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pImpButtonText[11] );
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -1330,6 +1330,7 @@ enum
|
||||
SLG_BR_AWESOME_TEXT,
|
||||
|
||||
SLG_INV_RES_ERROR,
|
||||
SLG_INV_CUSTUM_ERROR,
|
||||
};
|
||||
extern STR16 zSaveLoadText[];
|
||||
|
||||
@@ -1570,6 +1571,8 @@ enum
|
||||
NIV_NO_PACK,
|
||||
NIV_ZIPPER_COMBAT,
|
||||
NIV_ZIPPER_NO_MOVE,
|
||||
NIV_SELL_ALL,
|
||||
NIV_DELETE_ALL,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -456,7 +456,7 @@ itemEndElementHandle(void *userData, const XML_Char *name)
|
||||
else if(strcmp(name, "ubWeight") == 0)
|
||||
{
|
||||
pData->curElement = ELEMENT;
|
||||
pData->curItem.ubWeight = (UINT8) atol(pData->szCharData);
|
||||
pData->curItem.ubWeight = (UINT16) atol(pData->szCharData);
|
||||
}
|
||||
else if(strcmp(name, "ubPerPocket") == 0)
|
||||
{
|
||||
|
||||
@@ -3390,6 +3390,7 @@ STR16 zSaveLoadText[] =
|
||||
L"Awesome Selection",
|
||||
|
||||
L"New Inventory does not work in 640x480 screen size. Please resize and try again.",
|
||||
L"New Inventory does not work from the default 'Data' folder.",
|
||||
};
|
||||
|
||||
|
||||
@@ -4271,6 +4272,8 @@ STR16 NewInvMessage[] =
|
||||
L"Gevonden niet rugzak",
|
||||
L"De ritssluiting werkt slechts in gevecht",
|
||||
L"Kan niet me bewegen terwijl actieve rugzakritssluiting",
|
||||
L"Bent zeker u u wilt alle sectorpunten verkopen?",
|
||||
L"Bent zeker u u wilt alle sectorpunten schr?",
|
||||
};
|
||||
|
||||
#endif //DUTCH
|
||||
|
||||
@@ -3391,6 +3391,7 @@ STR16 zSaveLoadText[] =
|
||||
L"Awesome Selection",
|
||||
|
||||
L"New Inventory does not work in 640x480 screen size. Please resize and try again.",
|
||||
L"New Inventory does not work from the default 'Data' folder.",
|
||||
};
|
||||
|
||||
|
||||
@@ -4266,6 +4267,8 @@ STR16 NewInvMessage[] =
|
||||
L"Backpack not found",
|
||||
L"Zipper only works in combat",
|
||||
L"Can not move while backpack zipper active",
|
||||
L"Are you sure you want to sell all sector items?",
|
||||
L"Are you sure you want to delete all sector items?",
|
||||
};
|
||||
|
||||
#endif //ENGLISH
|
||||
|
||||
@@ -3379,6 +3379,7 @@ STR16 zSaveLoadText[] =
|
||||
L"Superb Selection",
|
||||
|
||||
L"New Inventory does not work in 640x480 screen size. Please resize and try again.",
|
||||
L"New Inventory does not work from the default 'Data' folder.",
|
||||
};
|
||||
|
||||
|
||||
@@ -4253,6 +4254,8 @@ STR16 NewInvMessage[] =
|
||||
L"Baluchon non trouvé",
|
||||
L"La tirette fonctionne seulement dans le combat",
|
||||
L"Ne peut pas se déplacer alors que la tirette de baluchon active",
|
||||
L"Êtes vous sûr vous voulez vendre tous les articles de secteur?",
|
||||
L"Êtes vous sûr vous voulez supprimer tous les articles de secteur?",
|
||||
};
|
||||
|
||||
#endif //FRENCH
|
||||
|
||||
@@ -656,11 +656,11 @@ STR16 pAttributeMenuStrings[] =
|
||||
|
||||
STR16 pTrainingMenuStrings[] =
|
||||
{
|
||||
L"Üben", // train yourself
|
||||
L"Miliz", // train the town
|
||||
L"Trainer", // train your teammates
|
||||
L"Rekrut", // be trained by an instructor
|
||||
L"Abbrechen", // cancel this menu
|
||||
L"Üben", // train yourself
|
||||
L"Miliz", // train the town
|
||||
L"Trainer", // train your teammates
|
||||
L"Rekrut", // be trained by an instructor
|
||||
L"Abbrechen", // cancel this menu
|
||||
};
|
||||
|
||||
STR16 pSquadMenuStrings[] =
|
||||
@@ -3193,7 +3193,8 @@ STR16 zSaveLoadText[] =
|
||||
L"Ausgezeichnete Auswahl",
|
||||
L"Fantastische Auswahl",
|
||||
|
||||
L"Neuer Warenbestand arbeitet nicht im 640x480 Bildumfang. Bitte bestimmen Sie die Größe neu und versuchen Sie wieder.",
|
||||
L"Neues Inventar funktioniert nicht in 640x480 Auflösung. Wählen Sie eine andere Auflösung und versuchen Sie es erneut.",
|
||||
L"Neues Inventar funktioniert nicht mit dem ausgewählten 'Data' Ordner.",
|
||||
};
|
||||
|
||||
//MapScreen
|
||||
@@ -4059,6 +4060,8 @@ STR16 NewInvMessage[] =
|
||||
L"Rucksack nicht gefunden",
|
||||
L"Reißverschluss funktioniert nur im Kampf",
|
||||
L"Bewegung nicht möglich, während Reißverschluss des Rucksacks offen ist",
|
||||
L"Sind Sie sicher, dass Sie alle Gegenstände im Sektor verkaufen wollen?",
|
||||
L"Sind Sie sicher, dass Sie alle Gegenstände im Sektor löschen wollen?",
|
||||
};
|
||||
|
||||
#endif //GERMAN
|
||||
|
||||
@@ -3371,6 +3371,7 @@ STR16 zSaveLoadText[] =
|
||||
L"Awesome Selection",
|
||||
|
||||
L"New Inventory does not work in 640x480 screen size. Please resize and try again.",
|
||||
L"New Inventory does not work from the default 'Data' folder.",
|
||||
};
|
||||
|
||||
|
||||
@@ -4250,6 +4251,8 @@ STR16 NewInvMessage[] =
|
||||
L"Fagotto non trovato",
|
||||
L"La chiusura lampo funziona soltanto nel combattimento",
|
||||
L"Non può muoversi mentre la chiusura lampo del fagotto attiva",
|
||||
L"Siete sicuri voi desiderate vendere tutti gli articoli del settore?",
|
||||
L"Siete sicuri voi desiderate cancellare tutti gli articoli del settore?",
|
||||
};
|
||||
|
||||
#endif //ITALIAN
|
||||
|
||||
@@ -3371,6 +3371,7 @@ STR16 zSaveLoadText[] =
|
||||
L"Awesome Selection",
|
||||
|
||||
L"New Inventory does not work in 640x480 screen size. Please resize and try again.",
|
||||
L"New Inventory does not work from the default 'Data' folder.",
|
||||
};
|
||||
|
||||
|
||||
@@ -4246,6 +4247,8 @@ STR16 NewInvMessage[] =
|
||||
L"Backpack not found",
|
||||
L"Zipper only works in combat",
|
||||
L"Can not move while backpack zipper active",
|
||||
L"Are you sure you want to sell all sector items?",
|
||||
L"Are you sure you want to delete all sector items?",
|
||||
};
|
||||
|
||||
#endif //POLISH
|
||||
|
||||
@@ -3385,6 +3385,7 @@ STR16 zSaveLoadText[] =
|
||||
L"Все, включая эксклюзив",
|
||||
|
||||
L"Новый инвентарь, используемый в этом релизе, не работает при разрешении экрана 640х480. Измените разрешение и запустит игру заново.",
|
||||
L"Новый инвентарь не работает, если выбрана по умолчанию игровая папка 'Data'.",
|
||||
};
|
||||
|
||||
|
||||
@@ -4259,6 +4260,8 @@ STR16 NewInvMessage[] =
|
||||
L"Вы потеряли свой рюкзак...",
|
||||
L"Замок рюкзака работает лишь во время битвы.",
|
||||
L"Вы не можете передвигаться с открытым рюкзаком.",
|
||||
L"Вы уверены что находитесь в здравом уме и отвечаете за свои действия? И вы в самом деле хотите продать весь хлам этого сектора голодающему населению Арулько?",
|
||||
L"Вы уверены что находитесь в здравом уме и отвечаете за свои действия? И вы в самом деле хотите выбросить весь хлам, валяющийся в этом секторе?",
|
||||
};
|
||||
|
||||
#endif //RUSSIAN
|
||||
|
||||
@@ -3391,6 +3391,7 @@ STR16 zSaveLoadText[] =
|
||||
L"Awesome Selection",
|
||||
|
||||
L"New Inventory does not work in 640x480 screen size. Please resize and try again.",
|
||||
L"New Inventory does not work from the default 'Data' folder.",
|
||||
};
|
||||
|
||||
|
||||
@@ -4266,6 +4267,8 @@ STR16 NewInvMessage[] =
|
||||
L"Backpack not found",
|
||||
L"Zipper only works in combat",
|
||||
L"Can not move while backpack zipper active",
|
||||
L"Are you sure you want to sell all sector items?",
|
||||
L"Are you sure you want to delete all sector items?",
|
||||
};
|
||||
|
||||
#endif //TAIWANESE
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="C:\games\jagged alliance 2"
|
||||
OutputDirectory="\games\jagged alliance 2"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets=".\ja2_2005Express.vsprops;.\ja2_2005ExpressDebug.vsprops"
|
||||
@@ -66,7 +66,7 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="Winmm.lib"
|
||||
OutputFile="$(OutDir)\ja2_deb_en_1877.exe"
|
||||
OutputFile="$(OutDir)\ja2_deb_en_1936.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
@@ -99,7 +99,7 @@
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="C:\games\jagged alliance 2"
|
||||
OutputDirectory="\games\jagged alliance 2"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets=".\ja2_2005Express.vsprops"
|
||||
@@ -145,7 +145,7 @@
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="Winmm.lib"
|
||||
OutputFile="$(OutDir)\ja2_rel_en_1877.exe"
|
||||
OutputFile="$(OutDir)\ja2_rel_en_1936.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
GenerateMapFile="true"
|
||||
@@ -183,7 +183,7 @@
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="MapEditor|Win32"
|
||||
OutputDirectory="C:\games\jagged alliance 2"
|
||||
OutputDirectory="\games\jagged alliance 2"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets=".\ja2_2005Express.vsprops;.\ja2_2005ExpressEditor.vsprops"
|
||||
|
||||
Reference in New Issue
Block a user