1 #ifndef ITEMS_H 2 #define ITEMS_H 3 4 #include <vector> 5 6 #include "Item_Types.h" 7 #include "JA2Types.h" 8 #include "Weapons.h" 9 10 struct CalibreModel; 11 struct ItemModel; 12 struct WeaponModel; 13 14 void DamageObj(OBJECTTYPE* pObj, INT8 bAmount); 15 16 extern UINT8 SlotToPocket[7]; 17 18 BOOLEAN WeaponInHand(const SOLDIERTYPE* pSoldier); 19 20 INT8 FindObj(const SOLDIERTYPE* pSoldier, UINT16 usItem); 21 INT8 FindAmmo(const SOLDIERTYPE*, const CalibreModel *, UINT8 ubMagSize, INT8 bExcludeSlot); 22 23 INT8 FindAttachment(const OBJECTTYPE* pObj, UINT16 usItem); 24 INT8 FindObjClass(const SOLDIERTYPE* s, UINT32 usItemClass); 25 extern INT8 FindAIUsableObjClass( const SOLDIERTYPE * pSoldier, UINT32 usItemClass ); 26 extern INT8 FindAIUsableObjClassWithin( const SOLDIERTYPE * pSoldier, UINT32 usItemClass, INT8 bLower, INT8 bUpper ); 27 extern INT8 FindEmptySlotWithin( const SOLDIERTYPE * pSoldier, INT8 bLower, INT8 bUpper ); 28 extern INT8 FindExactObj( const SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj ); 29 INT8 FindObjInObjRange(const SOLDIERTYPE* s, UINT16 usItem1, UINT16 usItem2); 30 extern INT8 FindLaunchable( const SOLDIERTYPE * pSoldier, UINT16 usWeapon ); 31 extern INT8 FindGLGrenade( const SOLDIERTYPE * pSoldier ); 32 extern INT8 FindThrowableGrenade( const SOLDIERTYPE * pSoldier ); 33 extern INT8 FindUsableObj( const SOLDIERTYPE * pSoldier, UINT16 usItem ); 34 35 extern void DeleteObj(OBJECTTYPE * pObj ); 36 extern void SwapObjs( OBJECTTYPE * pObj1, OBJECTTYPE * pObj2 ); 37 38 extern void RemoveObjFrom( OBJECTTYPE * pObj, UINT8 ubRemoveIndex ); 39 //Returns true if swapped, false if added to end of stack 40 extern BOOLEAN PlaceObjectAtObjectIndex( OBJECTTYPE * pSourceObj, OBJECTTYPE * pTargetObj, UINT8 ubIndex ); 41 extern void GetObjFrom( OBJECTTYPE * pObj, UINT8 ubGetIndex, OBJECTTYPE * pDest ); 42 43 bool AttachObject(SOLDIERTYPE* const s, OBJECTTYPE* const pTargetObj, OBJECTTYPE* const pAttachment, UINT8 const ubIndexInStack = 0); 44 extern BOOLEAN RemoveAttachment( OBJECTTYPE * pObj, INT8 bAttachPos, OBJECTTYPE * pNewObj ); 45 46 UINT8 CalculateObjectWeight(const OBJECTTYPE* pObject); 47 UINT32 CalculateCarriedWeight(const SOLDIERTYPE* pSoldier); 48 49 extern UINT16 TotalPoints(const OBJECTTYPE*); 50 UINT16 UseKitPoints(OBJECTTYPE&, UINT16 points, SOLDIERTYPE const&); 51 52 extern BOOLEAN EmptyWeaponMagazine( OBJECTTYPE * pWeapon, OBJECTTYPE *pAmmo ); 53 void CreateItem(UINT16 usItem, INT8 bStatus, OBJECTTYPE*); 54 void CreateItems(UINT16 usItem, INT8 bStatus, UINT8 ubNumber, OBJECTTYPE*); 55 void CreateMoney(UINT32 uiMoney, OBJECTTYPE*); 56 UINT16 DefaultMagazine(UINT16 gun); 57 UINT16 RandomMagazine( UINT16 usItem, UINT8 ubPercentStandard ); 58 extern BOOLEAN ReloadGun( SOLDIERTYPE * pSoldier, OBJECTTYPE * pGun, OBJECTTYPE * pAmmo ); 59 60 UINT8 ItemSlotLimit( UINT16 usItem, INT8 bSlot ); 61 62 // Function to put an item in a soldier profile 63 // It's very primitive, just finds an empty place! 64 BOOLEAN PlaceObjectInSoldierProfile( UINT8 ubProfile, OBJECTTYPE *pObject ); 65 BOOLEAN RemoveObjectFromSoldierProfile( UINT8 ubProfile, UINT16 usItem ); 66 INT8 FindObjectInSoldierProfile(MERCPROFILESTRUCT const&, UINT16 item_id); 67 68 void SetMoneyInSoldierProfile( UINT8 ubProfile, UINT32 uiMoney ); 69 70 void CheckEquipmentForDamage( SOLDIERTYPE *pSoldier, INT32 iDamage ); 71 BOOLEAN ArmBomb( OBJECTTYPE * pObj, INT8 bSetting ); 72 73 // NOTE TO ANDREW: 74 // 75 // The following functions expect that pObj points to the object 76 // "in the cursor", which should have memory allocated for it already 77 BOOLEAN PlaceObject( SOLDIERTYPE * pSoldier, INT8 bPos, OBJECTTYPE * pObj ); 78 79 // Send fNewItem to true to set off new item glow in inv panel 80 BOOLEAN AutoPlaceObject( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN fNewItem ); 81 BOOLEAN RemoveObjectFromSlot( SOLDIERTYPE * pSoldier, INT8 bPos, OBJECTTYPE * pObj ); 82 83 // Swap keys in keyring slot and keys in pocket 84 void SwapKeysToSlot(SOLDIERTYPE&, INT8 key_ring_pos, OBJECTTYPE&); 85 86 // create a keyobject 87 void CreateKeyObject(OBJECTTYPE*, UINT8 ubNumberOfKeys, UINT8 ubKeyIdValue); 88 BOOLEAN DeleteKeyObject( OBJECTTYPE * pObj ); 89 void AllocateObject(OBJECTTYPE** pObj); 90 91 // removes a key from a *KEYRING* slot 92 BOOLEAN RemoveKeyFromSlot( SOLDIERTYPE * pSoldier, INT8 bKeyRingPosition, OBJECTTYPE * pObj ); 93 94 // take several 95 BOOLEAN RemoveKeysFromSlot( SOLDIERTYPE * pSoldier, INT8 bKeyRingPosition, UINT8 ubNumberOfKeys ,OBJECTTYPE * pObj ); 96 97 // add the keys to an inventory slot 98 UINT8 AddKeysToSlot(SOLDIERTYPE&, INT8 key_ring_pos, OBJECTTYPE const& key); 99 100 101 102 //Kris: December 9, 1997 103 //I need a bunch of validation functions for ammo, attachments, etc., so I'll be adding them here. 104 //Chris, maybe you might find these useful, or add your own. I don't really know what I'm doing yet, 105 //so feel free to correct me... 106 107 //Simple check to see if the item has any attachments 108 bool ItemHasAttachments(OBJECTTYPE const&); 109 110 //Determine if this item can receive this attachment. This is different, in that it may 111 //be possible to have this attachment on this item, but may already have an attachment on 112 //it which doesn't work simultaneously with the new attachment (like a silencer and duckbill). 113 BOOLEAN ValidItemAttachment(const OBJECTTYPE* pObj, UINT16 usAttachment, BOOLEAN fAttemptingAttachment); 114 115 //Determines if it is possible to equip this weapon with this ammo. 116 bool ValidAmmoType( UINT16 usItem, UINT16 usAmmoType ); 117 118 // Determine if it is possible to add this attachment to the item 119 bool ValidAttachment(UINT16 attachment, UINT16 item); 120 121 BOOLEAN ValidLaunchable( UINT16 usLaunchable, UINT16 usItem ); 122 UINT16 GetLauncherFromLaunchable( UINT16 usLaunchable ); 123 124 BOOLEAN ValidMerge( UINT16 usMerge, UINT16 usItem ); 125 126 127 // Is the item passed a medical kit? 128 BOOLEAN IsMedicalKitItem(const OBJECTTYPE* pObject); 129 130 BOOLEAN AutoReload( SOLDIERTYPE * pSoldier ); 131 INT8 FindAmmoToReload( const SOLDIERTYPE * pSoldier, INT8 bWeaponIn, INT8 bExcludeSlot ); 132 133 void SwapHandItems( SOLDIERTYPE * pSoldier ); 134 135 INT8 FindAttachmentByClass(OBJECTTYPE const*, UINT32 uiItemClass); 136 void RemoveObjs( OBJECTTYPE * pObj, UINT8 ubNumberToRemove ); 137 138 void WaterDamage(SOLDIERTYPE&); 139 140 INT8 FindObjWithin( SOLDIERTYPE * pSoldier, UINT16 usItem, INT8 bLower, INT8 bUpper ); 141 142 BOOLEAN ApplyCamo(SOLDIERTYPE* pSoldier, OBJECTTYPE* pObj, BOOLEAN* pfGoodAPs); 143 144 BOOLEAN ItemIsLegal( UINT16 usItemIndex ); 145 UINT16 FindReplacementMagazine(const CalibreModel * calibre, UINT8 const mag_size, UINT8 const ammo_type); 146 UINT16 FindReplacementMagazineIfNecessary(const WeaponModel *old_gun, UINT16 const old_ammo_id, const WeaponModel *new_gun); 147 148 BOOLEAN DamageItemOnGround(OBJECTTYPE* pObject, INT16 sGridNo, INT8 bLevel, INT32 iDamage, SOLDIERTYPE* owner); 149 150 BOOLEAN ApplyCanteen( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAPs ); 151 BOOLEAN ApplyElixir( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAPs ); 152 153 BOOLEAN CompatibleFaceItem( UINT16 usItem1, UINT16 usItem2 ); 154 155 UINT32 MoneySlotLimit( INT8 bSlot ); 156 157 void CheckEquipmentForFragileItemDamage( SOLDIERTYPE *pSoldier, INT32 iDamage ); 158 159 // Range of Xray device 160 #define XRAY_RANGE 40 161 // Seconds that Xray lasts 162 #define XRAY_TIME 5 163 164 extern void ActivateXRayDevice( SOLDIERTYPE * pSoldier ); 165 extern void TurnOffXRayEffects( SOLDIERTYPE * pSoldier ); 166 INT8 FindLaunchableAttachment(const OBJECTTYPE* pObj, UINT16 usWeapon); 167 168 BOOLEAN CanItemFitInPosition(SOLDIERTYPE* s, OBJECTTYPE* pObj, INT8 bPos, BOOLEAN fDoingPlacement); 169 170 void SetNewItem(SOLDIERTYPE* pSoldier, UINT8 ubInvPos, BOOLEAN fNewItem); 171 void CleanUpStack(OBJECTTYPE* pObj, OBJECTTYPE* pCursorObj); 172 void StackObjs(OBJECTTYPE* pSourceObj, OBJECTTYPE* pTargetObj, UINT8 ubNumberToCopy); 173 bool ItemIsCool(OBJECTTYPE const&); 174 175 bool HasObjectImprint(OBJECTTYPE const&); 176 177 #endif 178