Files
source/Tactical/Interface Items.h
T
Flugente 1fe56555eb Drivable Cars update (by anv):
- Streamlined vehicle controls - no more selecting driver and vehicle separately, switching displayed APs and other esoteric activities. To move vehicle just select its driver and you're good to go. If you click on vehicle in tactical, also its driver will be selected automatically. Besides driving car, driver can perform other actions normally.
- Vehicle's APs, health and fuel are displayed on the steering wheel - thanks to Buggler for idea. Vehicle APs are treated as a resource (so if car changes driver mid-turn, it won't go any further than it would).
- Added option Tactical Interface Settings > ADD_PASSENGER_TO_ANY_SQUAD. If you order passenger to exit vehicle by clicking on the seat belt, he'll be added to new squad, so if you ordered six passengers to exit one by one, you'd end up with six new squads. With ADD_PASSENGER_TO_ANY_SQUAD = TRUE, passenger will be added to any existing squad with empty slot if possible.
- Added option Tactical Interface Settings > PASSENGER_LEAVING_SWITCH_TO_NEW_SQUAD. If you order passenger to exit vehicle by clicking on the seat belt, by default you get switched to his new squad. With PASSENGER_LEAVING_SWITCH_TO_NEW_SQUAD = FALSE you'll switch only if exiting passenger is the selected one.
- Cosmetic fix: changed display above vehicle from "*Merc's name* (VEHICLE)" to "*Merc's name* (*Vehicle's name*)" and colour from yellow to white (since mercs in vehicle are controllable and yellow is reserved for mercs on assignments).
- Fixed passengers rotation. Again.
- Fixed vehicles getting "tired" - lowered APs due to fuel below max. They can move the same as long as they have any fuel.
- Fixed unrelated bug: clicking on any empty slot in team panel would select merc with id 0.
- Fixed unrelated bug: switching to squad with less mercs would cause team panel to still show skill tooltips for mercs from previous squad on empty slots.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7204 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2014-05-13 20:50:16 +00:00

368 lines
15 KiB
C++

#ifndef __INTERFACE_ITEMS_H
#define __INTERFACE_ITEMS_H
#include "items.h"
#include "Handle Items.h"
#include "popup_class.h"
// DEFINES FOR ITEM SLOT SIZES IN PIXELS
#define BIG_INV_SLOT_WIDTH 61
#define BIG_INV_SLOT_HEIGHT 22
#define SM_INV_SLOT_WIDTH 30
#define SM_INV_SLOT_HEIGHT 23
#define ATTACH_SLOT_WIDTH 32
#define ATTACH_SLOT_BIG_WIDTH 64
#define VEST_INV_SLOT_WIDTH 43
#define VEST_INV_SLOT_HEIGHT 24
#define LEGS_INV_SLOT_WIDTH 43
#define LEGS_INV_SLOT_HEIGHT 24
#define HEAD_INV_SLOT_WIDTH 43
#define HEAD_INV_SLOT_HEIGHT 24
#define NUM_UDB_GEN_LINES 12
#define NUM_UDB_ADV_LINES 13 // Flugente FTW 1.1: 12->13
// HEADROCK HAM 4: These rectangle definitions are used in UDB to determine locations for icons, data, and tooltip
// regions. They replace the plethora of region data provided in EDB.
typedef struct
{
INT16 sLeft;
INT16 sTop;
INT16 sRight;
INT16 sBottom;
} INV_DESC_REGIONS;
extern INV_DESC_REGIONS gItemDescLBEBackground[4]; // Coordinates for displaying LBE background image
extern INV_DESC_REGIONS gItemDescGenHeaderRegions[3]; // Header text regions for various parts of the General Tab
extern INV_DESC_REGIONS gItemDescGenIndexRegions[3][4]; // Index text regions for various parts of the General Tab
extern INV_DESC_REGIONS gItemDescGenRegions[NUM_UDB_GEN_LINES * 2][4]; // Data regions, 4 sub-columns each
extern INV_DESC_REGIONS gItemDescGenSecondaryRegions[26]; // Secondary data regions, 3x5 for now (possible 3x6?)
extern INV_DESC_REGIONS gItemDescTextRegions[8]; // Main description regions
extern INV_DESC_REGIONS gItemDescAdvIndexRegions[1][4];
extern INV_DESC_REGIONS gItemDescAdvRegions[NUM_UDB_ADV_LINES][4]; // Advanced data regions, 4 sub-columns each
// ODB arrays
extern INV_DESC_REGIONS gODBItemDescRegions[4][8]; // Four regions of eight sub-regions each.
//CHRISL: moved from Interface Items.cpp
typedef struct
{
INT16 sX;
INT16 sY;
INT16 sValDx;
} INV_DESC_STATS;
typedef struct
{
INT16 sX;
INT16 sY;
INT16 sHeight;
INT16 sWidth;
INT16 sBarDx;
INT16 sBarDy;
} INV_ATTACHXY;
typedef struct
{
UINT32 uiTotalAmount;
UINT32 uiMoneyRemaining;
UINT32 uiMoneyRemoving;
} REMOVE_MONEY;
typedef struct
{
UINT16 x;
UINT16 y;
} MoneyLoc;
void ItemDescCallback( MOUSE_REGION * pRegion, INT32 iReason );
#define ITEMDESC_FONT BLOCKFONT2
#define INV_BAR_DX 5
#define INV_BAR_DY 21
#define ITEM_STATS_WIDTH 26
#define ITEM_STATS_HEIGHT 8
#define EXCEPTIONAL_GUN_DAMAGE 40
#define EXCEPTIONAL_MELEE_DAMAGE 40
#define EXCEPTIONAL_WEIGHT 20
#define EXCEPTIONAL_RANGE 400
#define EXCEPTIONAL_MAGAZINE 50
#define EXCEPTIONAL_AP_COST 5
#define EXCEPTIONAL_BURST_SIZE 5
#define EXCEPTIONAL_RELIABILITY 2
#define EXCEPTIONAL_REPAIR_EASE 2
#define EXCEPTIONAL_ACCURACY 4
#define ITEMDESC_FONTHIGHLIGHT FONT_MCOLOR_WHITE
#define ITEMDESC_FONTPOSITIVE FONT_MCOLOR_LTGREEN
#define ITEMDESC_FONTNEGATIVE FONT_MCOLOR_LTRED
//CHRISL: extern'd for EDB project
extern INT16 gsInvDescX;
extern INT16 gsInvDescY;
extern UINT8 gubItemDescStatusIndex;
extern INT16 BULLET_SING_X;
extern INT16 BULLET_SING_Y;
extern INT16 BULLET_BURST_X;
extern INT16 BULLET_BURST_Y;
extern INT16 ITEMDESC_CALIBER_X;
extern INT16 ITEMDESC_CALIBER_Y;
extern INT16 ITEMDESC_CALIBER_WIDTH;
extern INT16 ITEMDESC_NAME_X;
extern INT16 ITEMDESC_NAME_Y;
extern INT16 ITEMDESC_ITEM_X;
extern INT16 ITEMDESC_ITEM_Y;
extern INT16 ITEMDESC_ITEM_STATUS_X;
extern INT16 ITEMDESC_ITEM_STATUS_Y;
extern INT16 ITEMDESC_ITEM_STATUS_HEIGHT;
extern INT16 ITEMDESC_AMMO_X;
extern INT16 ITEMDESC_AMMO_Y;
extern INT16 ITEMDESC_DONE_X;
extern INT16 ITEMDESC_DONE_Y;
// A STRUCT USED INTERNALLY FOR INV SLOT REGIONS
typedef struct
{
BOOLEAN fBigPocket;
INT16 sBarDx;
INT16 sBarDy;
INT16 sWidth;
INT16 sHeight;
INT16 sX; // starts at 0, gets set via InitInvSlotInterface()
INT16 sY; // starts at 0, gets set via InitInvSlotInterface()
} INV_REGIONS;
// USED TO SETUP REGION POSITIONS, ETC
typedef struct
{
INT16 sX;
INT16 sY;
} INV_REGION_DESC;
class OLD_ITEM_CURSOR_SAVE_INFO_101
{
public:
OLD_OBJECTTYPE_101 ItemPointerInfo;
UINT8 ubSoldierID;
UINT8 ubInvSlot;
BOOLEAN fCursorActive;
INT8 bPadding[5];
};
class ITEM_CURSOR_SAVE_INFO
{
public:
ITEM_CURSOR_SAVE_INFO& operator=(OLD_ITEM_CURSOR_SAVE_INFO_101& src)
{
this->fCursorActive = src.fCursorActive;
this->ItemPointerInfo = src.ItemPointerInfo;
this->ubInvSlot = src.ubInvSlot;
this->ubSoldierID = src.ubSoldierID;
return *this;
}
//could use a little tidying up
BOOLEAN Save(HWFILE hFile);
BOOLEAN Load(HWFILE hFile);
UINT8 ubSoldierID;
UINT8 ubInvSlot;
BOOLEAN fCursorActive;
OBJECTTYPE ItemPointerInfo;
};
// HEADROCK HAM 5: Enums for big-item display attachment asterisks.
enum
{
ATTACHMENT_NONE,
ATTACHMENT_GENERAL,
ATTACHMENT_GL,
ATTACHMENT_RECOILREDUCTION,
ATTACHMENT_OPTICAL,
};
// HEADROCK HAM 5: Asterisks for use with big item images
extern UINT32 guiAttachmentAsterisks;
// Itempickup stuff
BOOLEAN InitializeItemPickupMenu( SOLDIERTYPE *pSoldier, INT32 sGridNo, ITEM_POOL *pItemPool, INT16 sScreenX, INT16 sScreenY, INT8 bZLevel );
void RenderItemPickupMenu( );
void RemoveItemPickupMenu( );
void SetItemPickupMenuDirty( BOOLEAN fDirtyLevel );
BOOLEAN HandleItemPickupMenu( );
void SetPickUpMenuDirtyLevel( BOOLEAN fDirtyLevel );
// FUNCTIONS FOR INTERFACEING WITH ITEM PANEL STUFF
void INVRenderINVPanelItem( SOLDIERTYPE *pSoldier, INT16 sPocket, UINT8 fDirtyLevel );
BOOLEAN InitInvSlotInterface( INV_REGION_DESC *pRegionDesc , INV_REGION_DESC *pCamoRegion, MOUSE_CALLBACK INVMoveCallback, MOUSE_CALLBACK INVClickCallback, MOUSE_CALLBACK INVMoveCammoCallback, MOUSE_CALLBACK INVClickCammoCallback, BOOLEAN fSetHighestPrioity );
void ShutdownInvSlotInterface( );
void GetSlotInvXY( UINT8 ubPos, INT16 *psX, INT16 *psY );
void GetSlotInvHeightWidth( UINT8 ubPos, INT16 *psWidth, INT16 *psHeight );
void HandleRenderInvSlots( SOLDIERTYPE *pSoldier, UINT8 fDirtyLevel );
void HandleNewlyAddedItems( SOLDIERTYPE *pSoldier, BOOLEAN *fDirtyLevel );
void RenderInvBodyPanel( SOLDIERTYPE *pSoldier, INT16 sX, INT16 sY );
void DisableInvRegions( BOOLEAN fDisable );
void DegradeNewlyAddedItems( );
void CheckForAnyNewlyAddedItems( SOLDIERTYPE *pSoldier );
BOOLEAN HandleCompatibleAmmoUI( SOLDIERTYPE *pSoldier, INT8 bInvPos, BOOLEAN fOn );
// THIS FUNCTION IS CALLED TO RENDER AN ITEM.
// uiBuffer - The Dest Video Surface - can only be FRAME_BUFFER or guiSAVEBUFFER
// pSoldier - used for determining whether burst mode needs display
// pObject - Usually taken from pSoldier->inv[HANDPOS]
// sX, sY, Width, Height, - Will Center it in the Width
// fDirtyLevel if == DIRTYLEVEL2 will render everything
// if == DIRTYLEVEL1 will render bullets and status only
//
// pubHighlightCounter - if not null, and == 2 - will display name above item
// - if == 1 will only dirty the name space and then set counter to 0
// Last parameter used mainly for when mouse is over item
void RenderBulletIcon(OBJECTTYPE *pObject, UINT32 ubStatusIndex = 0);
void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObject, INT16 sX, INT16 sY, INT16 sWidth, INT16 sHeight, UINT8 fDirtyLevel, UINT8 *pubHighlightCounter, UINT8 ubStatusIndex, BOOLEAN fOutline, INT16 sOutlineColor, UINT8 iter = 0 );
void INVRenderSteeringWheel( UINT32 uiBuffer, UINT32 uiSteeringWheelIndex, SOLDIERTYPE *pSoldier, INT16 sX, INT16 sY, INT16 sWidth, INT16 sHeight, UINT8 fDirtyLevel );
// HEADROCK HAM 5: Drawing a large item pic with extra data.
void MAPINVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObject, UINT32 uiItemGraphicNum, INT16 sX, INT16 sY, INT16 sWidth, INT16 sHeight, BOOLEAN fOutline, INT16 sOutlineColor );
// 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( UINT32 uiWhichBuffer, INT8 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
void InitInvData(INV_REGIONS &InvData, BOOLEAN fBigPocket, INT16 sBarDx, INT16 sBarDy, INT16 sWidth, INT16 sHeight, INT16 sX, INT16 sY);
void InitInventoryOld();
void InitInventoryNew();
void InitInventoryVehicle(INV_REGION_DESC *pRegionDesc, MOUSE_CALLBACK INVMoveCallback, MOUSE_CALLBACK INVClickCallback, BOOLEAN fSetHighestPrioity);
void InitInventorySoldier(INV_REGION_DESC *pRegionDesc, MOUSE_CALLBACK INVMoveCallback, MOUSE_CALLBACK INVClickCallback, BOOLEAN fSetHighestPrioity, BOOLEAN fNIVmode);
extern BOOLEAN gfInItemDescBox;
BOOLEAN InItemDescriptionBox( );
BOOLEAN InitItemDescriptionBox( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sX, INT16 sY, UINT8 ubStatusIndex );
BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY, UINT8 ubStatusIndex, SOLDIERTYPE *pSoldier, UINT8 ubPosition = NUM_INV_SLOTS );
void UpdateAttachmentTooltips( OBJECTTYPE *pObject, UINT8 ubStatusIndex );
BOOLEAN InitKeyItemDescriptionBox( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sX, INT16 sY, UINT8 ubStatusIndex );
void RenderItemDescriptionBox( );
void HandleItemDescriptionBox( BOOLEAN *pfDirty );
void DeleteItemDescriptionBox( );
extern BOOLEAN UseNASDesc(OBJECTTYPE *pObject);
INT16 sNASXCorrection(OBJECTTYPE * pObject);
INT16 sNASYCorrection(OBJECTTYPE * pObject);
void HandleItemDescTabButton( );
BOOLEAN InItemStackPopup( );
BOOLEAN InitItemStackPopup( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sInvX, INT16 sInvY, INT16 sInvWidth, INT16 sInvHeight );
BOOLEAN InSectorStackPopup( );
BOOLEAN InitSectorStackPopup( SOLDIERTYPE *pSoldier, WORLDITEM *pInventoryPoolList, INT32 ubPosition, INT16 sInvX, INT16 sInvY, INT16 sInvWidth, INT16 sInvHeight );
void RenderItemStackPopup( BOOLEAN fFullRender );
void HandleItemStackPopup( );
void DeleteItemStackPopup( );
void EndItemStackPopupWithItemInHand( );
// keyring handlers
BOOLEAN InitKeyRingPopup( SOLDIERTYPE *pSoldier, INT16 sInvX, INT16 sInvY, INT16 sInvWidth, INT16 sInvHeight );
void RenderKeyRingPopup( BOOLEAN fFullRender );
void InitKeyRingInterface( MOUSE_CALLBACK KeyRingClickCallback );
void InitMapKeyRingInterface( MOUSE_CALLBACK KeyRingClickCallback );
void DeleteKeyRingPopup( );
void ShutdownKeyRingInterface( void );
void ShutdownInventoryInterface( void );
BOOLEAN InKeyRingPopup( void );
void BeginKeyRingItemPointer( SOLDIERTYPE *pSoldier, UINT8 ubKeyRingPosition );
extern OBJECTTYPE *gpItemPointer;
extern OBJECTTYPE gItemPointer;
extern SOLDIERTYPE *gpItemPointerSoldier;
extern UINT16 usItemSnapCursor;
extern UINT16 us16BPPItemCyclePlacedItemColors[ 20 ];
extern BOOLEAN gfItemPointerDifferentThanDefault;
void BeginItemPointer( SOLDIERTYPE *pSoldier, UINT8 ubHandPos );
void InternalBeginItemPointer( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObject, INT8 bHandPos );
void EndItemPointer( );
void DrawItemFreeCursor( );
void DrawItemTileCursor( );
void HideItemTileCursor( );
void InitItemInterface( );
BOOLEAN ItemCursorInLobRange( INT32 usMapPos );
BOOLEAN HandleItemPointerClick( INT32 usMapPos );
UINT32 GetInterfaceGraphicForItem( INVTYPE *pItem );
UINT16 GetTileGraphicForItem( INVTYPE *pItem );
BOOLEAN LoadTileGraphicForItem( INVTYPE *pItem, UINT32 *puiVo );
void GetHelpTextForItem( STR16 pzStr, OBJECTTYPE *pObject, SOLDIERTYPE *pSoldier, int subObject = -1 );
void CancelItemPointer( );
BOOLEAN LoadItemCursorFromSavedGame( HWFILE hFile );
BOOLEAN SaveItemCursorToSavedGame( HWFILE hFile );
void EnableKeyRing( BOOLEAN fEnable );
// handle compatable items for merc and map inventory
BOOLEAN HandleCompatibleAmmoUIForMapScreen( SOLDIERTYPE *pSoldier, INT32 bInvPos, BOOLEAN fOn, BOOLEAN fFromMerc );
BOOLEAN HandleCompatibleAmmoUIForMapInventory( SOLDIERTYPE *pSoldier, INT32 bInvPos, INT32 iStartSlotNumber, BOOLEAN fOn, BOOLEAN fFromMerc );
void ResetCompatibleItemArray( );
void CycleItemDescriptionItem( INT16 sX, INT16 sY );
INT16 CycleItems( INT16 usOldItem );
BOOLEAN InitializeStealItemPickupMenu( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, ITEM_POOL *pItemPool, UINT8 ubCount);
// BOB : quick attachment selection popups
extern POPUP* gItemDescAttachmentPopups[MAX_ATTACHMENTS]; // popup list for attachment slots
extern INT32 giActiveAttachmentPopup; // the attachment popup to display in mapscreen
// BOB : quick equip popups
extern POPUP* gEquipPopups[NUM_INV_SLOTS]; // popup list for attachment slots
extern INT32 giActiveEquipPopup; // the attachment popup to display in mapscreen
// HEADROCK HAM 5: Item Transformation Popup
extern POPUP* gItemDescTransformPopup;
extern BOOLEAN gfItemDescTransformPopupInitialized;
extern BOOLEAN gfItemDescTransformPopupVisible;
// BOB : duh...
void DoAttachment( UINT8 subObject, INT32 iItemPos );
// THE_BOB (AKA BOB): ammo box/mag popups
void PocketPopupFull( SOLDIERTYPE *pSoldier, INT16 sPocket ); // displays all suported options
void PocketPopupDefault( SOLDIERTYPE *pSoldier, INT16 sPocket ); // displays only pocket-specific (predefined) options
POPUP * createPopupForPocket( SOLDIERTYPE *pSoldier, INT16 sPocket ); // creates a popup positioned next to the pocket
// THE_BOB
extern UINT16 gsPocketUnderCursor;
void addArmorToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addLBEToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addWeaponsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addWeaponGroupsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addGrenadesToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addBombsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addFaceGearToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addAmmoToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addRifleGrenadesToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addRocketAmmoToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addMiscToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
void addKitsToPocketPopup( SOLDIERTYPE *pSoldier, INT16 sPocket, POPUP* popup );
#endif