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