Files
source/Tactical/Item Types.h
T
Wanne 91087ca8c0 ************************************************************
* Merged Source Code from Development Trunk: Revision 4063 *
************************************************************
- Source Code is merged from: https://81.169.133.124/source/ja2/branches/Wanne/JA2%201.13%20MP
- This will be the Source for the Beta 2011 Test

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@4064 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2011-01-18 09:11:09 +00:00

1506 lines
38 KiB
C++

#ifndef ITEM_TYPES_H
#define ITEM_TYPES_H
#include "types.h"
#include <vector>
#include <list>
//if the number of slots are ever changed, the loading / saving checksum should use this value to make conversion easier
#define NUM_ORIGINAL_INV_SLOTS 19
// I don't care if this isn't intuitive! The hand positions go right
// before the big pockets so we can loop through them that way. --CJC
#define NO_SLOT -1
// NOTE NOTE NOTE! Leave this alone until it is no longer needed. It must match the
// original definition so old files can be read.
namespace OldInventory {
enum {
HELMETPOS = 0,
VESTPOS,
LEGPOS,
HEAD1POS,
HEAD2POS,
HANDPOS,
SECONDHANDPOS,
BIGPOCK1POS,
BIGPOCK2POS,
BIGPOCK3POS,
BIGPOCK4POS,
SMALLPOCK1POS,
SMALLPOCK2POS,
SMALLPOCK3POS,
SMALLPOCK4POS,
SMALLPOCK5POS,
SMALLPOCK6POS,
SMALLPOCK7POS,
SMALLPOCK8POS, // = 18, so 19 pockets needed
NUM_INV_SLOTS = NUM_ORIGINAL_INV_SLOTS
};
};
/* CHRISL: Added listings for each of the new inventory pockets. Also split the enum so we could include
endpoint markers for each type (big, med, sml) of pocket. */
typedef enum INVENTORY_SLOT{
HELMETPOS = 0,
VESTPOS,
LEGPOS,
HEAD1POS,
HEAD2POS,
HANDPOS,
SECONDHANDPOS,
VESTPOCKPOS,
LTHIGHPOCKPOS,
RTHIGHPOCKPOS,
CPACKPOCKPOS,
BPACKPOCKPOS,
GUNSLINGPOCKPOS,
KNIFEPOCKPOS,
BIGPOCK1POS,
BIGPOCK2POS,
BIGPOCK3POS,
BIGPOCK4POS,
BIGPOCK5POS,
BIGPOCK6POS,
BIGPOCK7POS,
MEDPOCK1POS,
MEDPOCK2POS,
MEDPOCK3POS,
MEDPOCK4POS,
SMALLPOCK1POS,
SMALLPOCK2POS,
SMALLPOCK3POS,
SMALLPOCK4POS,
SMALLPOCK5POS,
SMALLPOCK6POS,
SMALLPOCK7POS,
SMALLPOCK8POS,
SMALLPOCK9POS,
SMALLPOCK10POS,
SMALLPOCK11POS,
SMALLPOCK12POS,
SMALLPOCK13POS,
SMALLPOCK14POS,
SMALLPOCK15POS,
SMALLPOCK16POS,
SMALLPOCK17POS,
SMALLPOCK18POS,
SMALLPOCK19POS,
SMALLPOCK20POS,
SMALLPOCK21POS,
SMALLPOCK22POS,
SMALLPOCK23POS,
SMALLPOCK24POS,
SMALLPOCK25POS,
SMALLPOCK26POS,
SMALLPOCK27POS,
SMALLPOCK28POS,
SMALLPOCK29POS,
SMALLPOCK30POS,
NUM_INV_SLOTS,
};
#define INV_START_POS 0
#define BODYPOSSTART HELMETPOS
extern int BODYPOSFINAL ;//= GUNSLINGPOCKPOS;//RESET in initInventory
#define BIGPOCKSTART BIGPOCK1POS
extern int BIGPOCKFINAL ;//= MEDPOCK1POS;//RESET in initInventory
extern int MEDPOCKSTART ;//= MEDPOCK1POS;//RESET in initInventory
extern int MEDPOCKFINAL ;//= SMALLPOCK1POS;//RESET in initInventory
#define SMALLPOCKSTART SMALLPOCK1POS
extern int SMALLPOCKFINAL ;//= NUM_INV_SLOTS;//RESET in initInventory
#define STACK_SIZE_LIMIT NUM_INV_SLOTS
typedef enum ATTACHMENT_SLOT{
ATTACHMENTPOINT1 = 0,
ATTACHMENTPOINT2,
ATTACHMENTPOINT3,
ATTACHMENTPOINT4,
ATTACHMENTPOINT5,
ATTACHMENTPOINT6,
ATTACHMENTPOINT7,
ATTACHMENTPOINT8,
ATTACHMENTPOINT9,
ATTACHMENTPOINT10,
ATTACHMENTPOINT11,
ATTACHMENTPOINT12,
ATTACHMENTPOINT13,
ATTACHMENTPOINT14,
ATTACHMENTPOINT15,
ATTACHMENTPOINT16,
ATTACHMENTPOINT17,
ATTACHMENTPOINT18,
ATTACHMENTPOINT19,
ATTACHMENTPOINT20,
ATTACHMENTPOINT21,
ATTACHMENTPOINT22,
ATTACHMENTPOINT23,
ATTACHMENTPOINT24,
ATTACHMENTPOINT25,
ATTACHMENTPOINT26,
ATTACHMENTPOINT27,
ATTACHMENTPOINT28,
ATTACHMENTPOINT29,
ATTACHMENTPOINT30,
ATTACHMENTPOINT31,
NUM_ATTACH_SLOTS
};
#define INVALIDCURS 0
#define QUESTCURS 1
#define PUNCHCURS 2
#define TARGETCURS 3
#define KNIFECURS 4
#define AIDCURS 5
#define TOSSCURS 6
#define MINECURS 8
#define LPICKCURS 9
#define MDETECTCURS 10
#define CROWBARCURS 11
#define SURVCAMCURS 12
#define CAMERACURS 13
#define KEYCURS 14
#define SAWCURS 15
#define WIRECUTCURS 16
#define REMOTECURS 17
#define BOMBCURS 18 // ( only calculated, not set item table )
#define REPAIRCURS 19
#define TRAJECTORYCURS 20
#define JARCURS 21
#define TINCANCURS 22
#define REFUELCURS 23
#define CAMERARANGE 10
#define CONDBUL 0
#define COND 0
#define SINGLE 0
#define LIQ 0
#define USAGE 0
#define BUCKS 0
#define ITEM_NOT_FOUND -1
#define USABLE 10 // minimum work% of items to still be usable
#define MAX_OBJECTS_PER_SLOT 255
#define MAX_ATTACHMENTS 32
#define MAX_DEFAULT_ATTACHMENTS 20
extern UINT16 LAST_SLOT_INDEX;
#define MAX_MONEY_PER_SLOT 20000
typedef enum
{
BOMB_TIMED = 1,
BOMB_REMOTE,
BOMB_PRESSURE,
BOMB_SWITCH
} DetonatorType;
#define FIRST_MAP_PLACED_FREQUENCY 50
#define PANIC_FREQUENCY 127
#define PANIC_FREQUENCY_2 126
#define PANIC_FREQUENCY_3 125
#define OBJECT_UNDROPPABLE 0x01
#define OBJECT_MODIFIED 0x02
#define OBJECT_AI_UNUSABLE 0x04
#define OBJECT_ARMED_BOMB 0x08
#define OBJECT_KNOWN_TO_BE_TRAPPED 0x10
#define OBJECT_DISABLED_BOMB 0x20
#define OBJECT_ALARM_TRIGGER 0x40
#define OBJECT_NO_OVERWRITE 0x80
#define GS_CARTRIDGE_IN_CHAMBER 0x01
#define GS_WEAPON_BEING_RELOADED 0x02
//forward declaration
class OBJECTTYPE;
class SOLDIERTYPE;
#define MAX_ITEMS_IN_LBE 12
//CHRISL:
class LBENODE
{
public:
LBENODE() { initialize();};
void initialize() {inv.clear();};
BOOLEAN Load( HWFILE hFile );
BOOLEAN Load( INT8** hBuffer, float dMajorMapVersion, UINT8 ubMinorMapVersion );
BOOLEAN Save( HWFILE hFile, bool fSavingMap );
UINT32 lbeClass;
UINT16 lbeIndex;
UINT8 ubID;
BOOLEAN ZipperFlag;
int uniqueID;
UINT32 uiNodeChecksum;
char endOfPOD;
//compiler complains about too big an array since OBJECTTYPE's size is unknown at this time, because of forward declaration
//OBJECTTYPE inv[ITEMS_IN_LBE];
std::vector<OBJECTTYPE> inv;
};
#define SIZEOF_LBENODE_POD (offsetof(LBENODE, endOfPOD))
void CreateLBE(OBJECTTYPE* pObj, UINT8 ubID, int numSubPockets);
bool DestroyLBEIfEmpty(OBJECTTYPE* pObj);
void DestroyLBE(OBJECTTYPE* pObj);
void GetLBESlots(UINT32 LBEType, std::vector<INT8>& LBESlots);
void MoveItemsInSlotsToLBE( SOLDIERTYPE *pSoldier, std::vector<INT8>& LBESlots, LBENODE* pLBE, OBJECTTYPE* pObj);
// CHRISL:
BOOLEAN MoveItemsToActivePockets( SOLDIERTYPE *pSoldier, std::vector<INT8>& LBESlots, UINT32 uiHandPos, OBJECTTYPE *pObj );
BOOLEAN MoveItemToLBEItem( SOLDIERTYPE *pSoldier, UINT32 uiHandPos );
BOOLEAN MoveItemFromLBEItem( SOLDIERTYPE *pSoldier, UINT32 uiHandPos, OBJECTTYPE *pObj );
bool IsSlotAnLBESlot(int slot);
bool IsSlotASmallPocket(int slot);
extern std::list<LBENODE> LBEArray;
//do not alter or saves will break, create new defines if the size changes
#define OLD_MAX_ATTACHMENTS_101 4
#define OLD_MAX_OBJECTS_PER_SLOT_101 8
namespace Version101
{
//union was originally unnamed
union OLD_OBJECTTYPE_101_UNION
{
struct
{
INT8 bGunStatus; // status % of gun
UINT8 ubGunAmmoType; // ammo type, as per weapons.h
UINT8 ubGunShotsLeft; // duh, amount of ammo left
UINT16 usGunAmmoItem; // the item # for the item table
INT8 bGunAmmoStatus; // only for "attached ammo" - grenades, mortar shells
UINT8 ubGunState; // SB manual recharge
//warning, this unused space is the wrong size, 7 bytes above, 2 in the array, but it's been saved like that
UINT8 ubGunUnused[OLD_MAX_OBJECTS_PER_SLOT_101 - 6];
};
struct
{
UINT8 ubShotsLeft[OLD_MAX_OBJECTS_PER_SLOT_101];
};
struct
{
INT8 bStatus[OLD_MAX_OBJECTS_PER_SLOT_101];
};
struct
{
INT8 bMoneyStatus;
UINT32 uiMoneyAmount;
UINT8 ubMoneyUnused[OLD_MAX_OBJECTS_PER_SLOT_101 - 5];
};
struct
{ // this is used by placed bombs, switches, and the action item
INT8 bBombStatus; // % status
INT8 bDetonatorType; // timed, remote, or pressure-activated
UINT16 usBombItem; // the usItem of the bomb.
union
{
struct
{
INT8 bDelay; // >=0 values used only
};
struct
{
INT8 bFrequency; // >=0 values used only
};
};
UINT8 ubBombOwner; // side which placed the bomb
UINT8 bActionValue;// this is used by the ACTION_ITEM fake item
union
{
struct
{
UINT8 ubTolerance; // tolerance value for panic triggers
};
struct
{
UINT8 ubLocationID; // location value for remote non-bomb (special!) triggers
};
};
};
struct
{
INT8 bKeyStatus[ 6 ];
UINT8 ubKeyID;
UINT8 ubKeyUnused[1];
};
struct
{
UINT8 ubOwnerProfile;
UINT8 ubOwnerCivGroup;
UINT8 ubOwnershipUnused[6];
};
};
};
#define SIZEOF_OLD_OBJECTTYPE_101_UNION (sizeof(Version101::OLD_OBJECTTYPE_101_UNION))
class OLD_OBJECTTYPE_101
{
public:
OLD_OBJECTTYPE_101& operator=(OBJECTTYPE& src);//dnl ch33 120909
UINT16 usItem;
UINT8 ubNumberOfObjects;
Version101::OLD_OBJECTTYPE_101_UNION ugYucky;
// attached objects
UINT16 usAttachItem[OLD_MAX_ATTACHMENTS_101];
INT8 bAttachStatus[OLD_MAX_ATTACHMENTS_101];
INT8 fFlags;
UINT8 ubMission;
INT8 bTrap; // 1-10 exp_lvl to detect
UINT8 ubImprintID; // ID of merc that item is imprinted on
UINT8 ubWeight;
UINT8 fUsed; // flags for whether the item is used or not
};
namespace ObjectDataStructs {
struct OBJECT_GUN
{
INT16 bGunStatus; // status % of gun
UINT8 ubGunAmmoType; // ammo type, as per weapons.h
UINT16 ubGunShotsLeft; // duh, amount of ammo left
UINT16 usGunAmmoItem; // the item # for the item table
INT16 bGunAmmoStatus; // only for "attached ammo" - grenades, mortar shells
UINT8 ubGunState; // SB manual recharge
};
struct OBJECT_MONEY
{
INT16 bMoneyStatus;
UINT32 uiMoneyAmount;
};
struct OBJECT_BOMBS_AND_OTHER
{ // this is used by placed bombs, switches, and the action item
INT16 bBombStatus; // % status
INT8 bDetonatorType; // timed, remote, or pressure-activated
UINT16 usBombItem; // the usItem of the bomb.
union
{
INT8 bDelay; // >=0 values used only
INT8 bFrequency; // >=0 values used only
};
UINT8 ubBombOwner; // side which placed the bomb
UINT8 bActionValue; // this is used by the ACTION_ITEM fake item
union
{
UINT8 ubTolerance; // tolerance value for panic triggers
UINT8 ubLocationID; // location value for remote non-bomb (special!) triggers
};
};
struct OBJECT_KEY
{
INT16 bKeyStatus;
UINT8 ubKeyID;
};
struct OBJECT_OWNER
{
UINT16 ubOwnerProfile;
UINT8 ubOwnerCivGroup;
};
struct OBJECT_LBE
{
INT16 bLBEStatus;
INT8 bLBE; // Marks item as LBENODE
int uniqueID; // how the LBENODE is accessed
};
};
class ObjectData
{
public:
//needs a default ctor that inits stuff so that an objectStack can be init with 1 empty ObjectData
ObjectData() {initialize();};
~ObjectData();
// Copy Constructor
ObjectData(const ObjectData&);
// Assignment operator
ObjectData& operator=(const ObjectData&);
void initialize() {memset(this, 0, sizeof(ObjectData));};
void DeleteLBE();
void DuplicateLBE();
bool operator==(ObjectData& compare);
bool operator==(const ObjectData& compare)const;
union {
INT16 objectStatus;//holds the same value as bStatus[0]
UINT16 ubShotsLeft;//holds the same value as ubShotsLeft[0]
ObjectDataStructs::OBJECT_GUN gun;
ObjectDataStructs::OBJECT_MONEY money;
ObjectDataStructs::OBJECT_BOMBS_AND_OTHER misc;
ObjectDataStructs::OBJECT_KEY key;
ObjectDataStructs::OBJECT_OWNER owner;
ObjectDataStructs::OBJECT_LBE lbe;
};
INT8 bTrap; // 1-10 exp_lvl to detect
UINT8 fUsed; // flags for whether the item is used or not
UINT8 ubImprintID; // ID of merc that item is imprinted on
};
typedef std::list<OBJECTTYPE> attachmentList;
class StackedObjectData {
public:
StackedObjectData();
~StackedObjectData();
void initialize() {attachments.clear(); data.initialize();};
OBJECTTYPE* GetAttachmentAtIndex(UINT8 index);
BOOLEAN RemoveAttachmentAtIndex(UINT8 index, attachmentList::iterator * returnIter = NULL);
attachmentList::iterator RemoveAttachmentAtIter(attachmentList::iterator iter);
BOOLEAN AddAttachmentAtIndex(UINT8 index, OBJECTTYPE pObj);
UINT16 AttachmentListSize();
bool operator==(StackedObjectData& compare);
bool operator==(const StackedObjectData& compare)const;
BOOLEAN Load( HWFILE hFile );
BOOLEAN Load( INT8** hBuffer, float dMajorMapVersion, UINT8 ubMinorMapVersion );
BOOLEAN Save( HWFILE hFile, bool fSavingMap );
attachmentList attachments;
ObjectData data;
};
typedef std::list<StackedObjectData> StackedObjects;
#define ALL_OBJECTS -1
class OBJECTTYPE
{
public:
// Constructor
OBJECTTYPE();
// Conversion operator
OBJECTTYPE& operator=(const OLD_OBJECTTYPE_101&);
// Copy Constructor
OBJECTTYPE(const OBJECTTYPE&);
// Assignment operator
OBJECTTYPE& operator=(const OBJECTTYPE&);
// Destructor
~OBJECTTYPE();
const StackedObjectData* operator[](const unsigned int index) const;
StackedObjectData* operator[](const unsigned int index);
// Initialize the soldier.
// Use this instead of the old method of calling memset.
// Note that the constructor does this automatically.
void initialize();
bool operator==(OBJECTTYPE& compare);
bool operator==(const OBJECTTYPE& compare)const;
bool exists();
bool IsActiveLBE(unsigned int index);
bool HasAnyActiveLBEs(SOLDIERTYPE * pSoldier = NULL, UINT8 iter = 0);
LBENODE* GetLBEPointer(unsigned int index);
UINT16 GetWeightOfObjectInStack(unsigned int index = 0);
int AddObjectsToStack(int howMany, int objectStatus = 100);
int AddObjectsToStack(OBJECTTYPE& sourceObject, int howManyWanted = ALL_OBJECTS, SOLDIERTYPE* pSoldier = NULL, int slot = STACK_SIZE_LIMIT, int cap = 0, bool allowLBETransfer = true);
int ForceAddObjectsToStack(OBJECTTYPE& sourceObject, int howManyWanted = ALL_OBJECTS);
int MoveThisObjectTo(OBJECTTYPE& destObject, int numToMove = ALL_OBJECTS, SOLDIERTYPE* pSoldier = NULL, int slot = STACK_SIZE_LIMIT, int cap = 0);
int RemoveObjectsFromStack(int howMany);
bool RemoveObjectAtIndex(unsigned int index, OBJECTTYPE* destObject = NULL);
private://these are only helpers for the above functions
int PrivateRemoveObjectsFromStack(int howMany, OBJECTTYPE* destObject = NULL, SOLDIERTYPE* pSoldier = NULL, int slot = STACK_SIZE_LIMIT, int cap = 0);
void SpliceData(OBJECTTYPE& sourceObject, unsigned int numToSplice, StackedObjects::iterator beginIter);
bool CanStack(OBJECTTYPE& sourceObject, int& numToStack);
public:
BOOLEAN AttachObject( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttachment, BOOLEAN playSound = TRUE, UINT8 subObject = 0, INT32 iItemPos = -1, BOOLEAN fRemoveProhibited = TRUE, std::vector<UINT16> usAttachmentSlotIndexVector = std::vector<UINT16>());
BOOLEAN AttachObjectOAS( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttachment, BOOLEAN playSound = TRUE, UINT8 subObject = 0);
BOOLEAN AttachObjectNAS( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttachment, BOOLEAN playSound = TRUE, UINT8 subObject = 0, INT32 iItemPos = -1, BOOLEAN fRemoveProhibited = TRUE, std::vector<UINT16> usAttachmentSlotIndexVector = std::vector<UINT16>());
BOOLEAN RemoveAttachment( OBJECTTYPE* pAttachment, OBJECTTYPE * pNewObj = NULL, UINT8 subObject = 0, SOLDIERTYPE * pSoldier = NULL, BOOLEAN fForceInseperable = FALSE, BOOLEAN fRemoveProhibited = TRUE);
//see comments in .cpp
static void DeleteMe(OBJECTTYPE** ppObject);
static void CopyToOrCreateAt(OBJECTTYPE** ppTarget, OBJECTTYPE* pSource);
BOOLEAN Load( HWFILE hFile );
BOOLEAN Load( INT8** hBuffer, float dMajorMapVersion, UINT8 ubMinorMapVersion );
BOOLEAN Save( HWFILE hFile, bool fSavingMap );
//POD
UINT16 usItem;
UINT8 ubNumberOfObjects;
UINT8 ubMission; //EDIT THIS OUT WHEN THERE ARE NO ASSERTS!
//ADB ubWeight has been removed because it is always recalculated at every object change but only used in 1 place!!!
//much better to recalculate it only where it is used once!!!
//UINT16 ubWeight; //used to be UINT8
UINT8 fFlags;//used to be INT8, but that makes anything with OBJECT_NO_OVERWRITE negative
char endOfPOD;
#define SIZEOF_OBJECTTYPE_POD (offsetof(OBJECTTYPE, endOfPOD))
StackedObjects objectStack;
// std::vector<UINT16> usAttachmentSlotIndexVector; //WarmSteel - This holds the slots indexes this weapon has. -- CHRISL: Can't have this here because of item stacks
};
extern OBJECTTYPE gTempObject;
// SUBTYPES
#define IC_NONE 0x00000001
#define IC_GUN 0x00000002
#define IC_BLADE 0x00000004
#define IC_THROWING_KNIFE 0x00000008
#define IC_LAUNCHER 0x00000010
#define IC_TENTACLES 0x00000020
#define IC_THROWN 0x00000040
#define IC_PUNCH 0x00000080
#define IC_GRENADE 0x00000100
#define IC_BOMB 0x00000200
#define IC_AMMO 0x00000400
#define IC_ARMOUR 0x00000800
#define IC_MEDKIT 0x00001000
#define IC_KIT 0x00002000
#define IC_APPLIABLE 0x00004000
#define IC_FACE 0x00008000
#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
// PARENT TYPES
#define IC_WEAPON ( IC_GUN | IC_BLADE | IC_THROWING_KNIFE | IC_LAUNCHER | IC_TENTACLES )
#define IC_EXPLOSV ( IC_GRENADE | IC_BOMB )
#define IC_BOBBY_GUN ( IC_GUN | IC_LAUNCHER )
#define IC_BOBBY_MISC ( IC_GRENADE | IC_BOMB | IC_MISC | IC_MEDKIT | IC_KIT | IC_BLADE | IC_THROWING_KNIFE | IC_PUNCH | IC_FACE | IC_LBEGEAR )
// Chrisl: Define attachment classes
#define AC_DEFAULT1 0x00000001 //1
#define AC_BARREL 0x00000002 //2
#define AC_LASER 0x00000004 //4
#define AC_SIGHT 0x00000008 //8
#define AC_SCOPE 0x00000010 //16
#define AC_STOCK 0x00000020 //32
#define AC_AMMO 0x00000040 //64
#define AC_INTERNAL 0x00000080 //128
#define AC_EXTERNAL 0x00000100 //256
#define AC_UNDERBARREL 0x00000200 //512
#define AC_GRENADE 0x00000400 //1024
#define AC_ROCKET 0x00000800 //2048
#define AC_MISC1 0x00001000 //4096
#define AC_MISC2 0x00002000 //8192
#define AC_MISC3 0x00004000 //16384
#define AC_MISC4 0x00008000 //32768
#define AC_MISC5 0x00010000 //65536
#define AC_MISC6 0x00020000 //131072
#define AC_MISC7 0x00040000 //262144
#define AC_MISC8 0x00080000 //524288
#define AC_MISC9 0x00100000 //1048576
#define AC_MISC10 0x00200000 //2097152
#define AC_MISC11 0x00400000 //4194304
#define AC_MISC12 0x00800000 //8388608
#define AC_MISC13 0x01000000 //16777216
#define AC_MISC14 0x02000000 //33554432
#define AC_MISC15 0x04000000 //67108864
#define AC_MISC16 0x08000000 //134217728
#define AC_MISC17 0x10000000 //268435456
#define AC_MISC18 0x20000000 //536870912
#define AC_MISC19 0x40000000 //1073741824
#define AC_MISC20 0x80000000 //2147483648
// replaces candamage
//#define ITEM_DAMAGEABLE 0x0001
//// replaces canrepair
//#define ITEM_REPAIRABLE 0x0002
//// replaces waterdamage
//#define ITEM_WATER_DAMAGES 0x0004
//// replaces metal
//#define ITEM_METAL 0x0008
//// replaces sinkable
//#define ITEM_SINKS 0x0010
//// replaces seemeter
//#define ITEM_SHOW_STATUS 0x0020
//// for attachers/merges, hidden
//#define ITEM_HIDDEN_ADDON 0x0040
//// needs two hands
//#define ITEM_TWO_HANDED 0x0080
//// can't be found for sale
//#define ITEM_NOT_BUYABLE 0x0100
//// item is an attachment for something
//#define ITEM_ATTACHMENT 0x0200
//// item only belongs in the "big gun list"
//#define ITEM_BIGGUNLIST 0x0400
//// item should not be placed via the editor
//#define ITEM_NOT_EDITOR 0x0800
//// item defaults to undroppable
//#define ITEM_DEFAULT_UNDROPPABLE 0x1000
//// item is terrible for throwing
//#define ITEM_UNAERODYNAMIC 0x2000
//// item is electronic for repair (etc) purposes
//#define ITEM_ELECTRONIC 0x4000
//// item is a PERMANENT attachment
//#define ITEM_INSEPARABLE 0x8000
//
//// item flag combinations
//
//#define IF_STANDARD_GUN ITEM_DAMAGEABLE | ITEM_WATER_DAMAGES | ITEM_REPAIRABLE | ITEM_SHOW_STATUS | ITEM_METAL | ITEM_SINKS
//#define IF_TWOHANDED_GUN IF_STANDARD_GUN | ITEM_TWO_HANDED
//#define IF_STANDARD_BLADE ITEM_DAMAGEABLE | ITEM_WATER_DAMAGES | ITEM_REPAIRABLE | ITEM_SHOW_STATUS | ITEM_METAL | ITEM_SINKS
//#define IF_STANDARD_ARMOUR ITEM_DAMAGEABLE | ITEM_REPAIRABLE | ITEM_SHOW_STATUS | ITEM_SINKS
//#define IF_STANDARD_KIT ITEM_DAMAGEABLE | ITEM_SHOW_STATUS | ITEM_SINKS
//#define IF_STANDARD_CLIP ITEM_SINKS | ITEM_METAL
//#define EXPLOSIVE_GUN( x ) ( x == ROCKET_LAUNCHER || x == TANK_CANNON || x == RPG7 )
// HEADROCK HAM 4: As part of NCTH, over a dozen new variables have been added to the item struct. About the same number
// have also been removed. The new variables relate to the way the new shooting mechanism works, and obviously the ones
// taken out are no longer used anywhere as a result. Note that most of these new variables, the ones having to do with
// the CTH part of the shooting mechanism, come in size-3 arrays. The first item ([0]) represents modifiers given when the
// character is standing. [1] represents crouched, and [2] represents prone. Read more about how this is read from XML
// in the XML-reader formula.
// Removed vars:
// bipod,
// tohitbonus,
// bestlaserrange,
// aimbonus,
// minrangeforaimbonus,
// autofiretohitbonus,
// bursttohitbonus
typedef struct
{
UINT32 usItemClass;
UINT32 nasAttachmentClass; //CHRISL: Identify the class of attachment
UINT32 nasLayoutClass;
UINT16 ubClassIndex;
UINT8 ubCursor;
INT8 bSoundType;
UINT8 ubGraphicType;
UINT16 ubGraphicNum;
UINT16 ubWeight; //2 units per kilogram; roughly 1 unit per pound
UINT8 ubPerPocket;
UINT8 ItemSize;
UINT16 usPrice;
UINT8 ubCoolness;
INT8 bReliability;
INT8 bRepairEase;
UINT16 fFlags;
UINT32 uiIndex; // added
CHAR16 szItemName[80]; //+1 for the null terminator //added
BOOLEAN damageable;
BOOLEAN repairable;
BOOLEAN waterdamages;
BOOLEAN metal;
BOOLEAN sinks;
BOOLEAN showstatus;
BOOLEAN hiddenaddon;
BOOLEAN twohanded;
BOOLEAN notbuyable;
BOOLEAN attachment;
BOOLEAN hiddenattachment;
BOOLEAN biggunlist;
BOOLEAN notineditor;
BOOLEAN defaultundroppable;
BOOLEAN unaerodynamic;
BOOLEAN electronic;
BOOLEAN inseparable;
CHAR16 szLongItemName[80];
CHAR16 szItemDesc[400];
CHAR16 szBRName[80];
CHAR16 szBRDesc[400];
//TODO: quest items, boosters, money
// special item/attachment functions:
BOOLEAN cannon;
BOOLEAN rocketrifle;
BOOLEAN fingerprintid;
BOOLEAN metaldetector;
BOOLEAN gasmask;
BOOLEAN lockbomb;
BOOLEAN flare;
BOOLEAN ammocrate;
INT16 percentnoisereduction;
INT16 bipod;
INT16 tohitbonus;
INT16 bestlaserrange;
INT16 rangebonus;
INT16 aimbonus;
INT16 minrangeforaimbonus;
INT16 percentapreduction;
INT16 percentstatusdrainreduction;
BOOLEAN grenadelauncher;
BOOLEAN mortar;
BOOLEAN duckbill;
BOOLEAN detonator;
BOOLEAN remotedetonator;
BOOLEAN hidemuzzleflash;
BOOLEAN rocketlauncher;
BOOLEAN singleshotrocketlauncher;
UINT16 discardedlauncheritem;
BOOLEAN brassknuckles;
//*** ddd UINT16 bloodieditem;
INT16 bloodieditem;
BOOLEAN crowbar;
BOOLEAN glgrenade;
BOOLEAN flakjacket;
INT16 hearingrangebonus;
INT16 visionrangebonus;
INT16 nightvisionrangebonus;
INT16 dayvisionrangebonus;
INT16 cavevisionrangebonus;
INT16 brightlightvisionrangebonus;
INT16 itemsizebonus;
BOOLEAN leatherjacket;
BOOLEAN batteries;
BOOLEAN needsbatteries;
BOOLEAN xray;
BOOLEAN wirecutters;
BOOLEAN toolkit;
BOOLEAN firstaidkit;
BOOLEAN medicalkit;
BOOLEAN canteen;
BOOLEAN jar;
BOOLEAN canandstring;
BOOLEAN marbles;
BOOLEAN walkman;
BOOLEAN remotetrigger;
BOOLEAN robotremotecontrol;
BOOLEAN camouflagekit;
BOOLEAN locksmithkit;
BOOLEAN mine;
BOOLEAN alcohol;
BOOLEAN hardware;
BOOLEAN medical;
BOOLEAN gascan;
BOOLEAN containsliquid;
BOOLEAN rock;
INT16 damagebonus;
INT16 meleedamagebonus;
INT16 magsizebonus;
INT16 percentautofireapreduction;
INT16 autofiretohitbonus;
INT16 APBonus;
INT16 rateoffirebonus;
INT16 burstsizebonus;
INT16 bursttohitbonus;
INT16 percentreadytimeapreduction;
INT16 bulletspeedbonus;
BOOLEAN thermaloptics;
UINT8 percenttunnelvision;
INT16 percentreloadtimeapreduction;
INT16 percentburstfireapreduction;
INT16 camobonus;
INT16 stealthbonus;
INT16 urbanCamobonus;
INT16 desertCamobonus;
INT16 snowCamobonus;
BOOLEAN scifi; // item only available in scifi mode
BOOLEAN newinv; // item only available in new inventory mode
UINT8 ubAttachmentSystem; //Item availability per attachment system: 0 = both, 1 = OAS, 2 = NAS
UINT16 defaultattachments[MAX_DEFAULT_ATTACHMENTS]; //Need more default attachments, chose an array to do so. (no vector / list just to keep this all plain data)
//zilpin: pellet spread patterns externalized in XML
INT32 spreadPattern;
// HEADROCK HAM 4: New variable arrays for the New CTH system.
INT16 flatbasemodifier[3];
INT16 percentbasemodifier[3];
INT16 flataimmodifier[3];
INT16 percentaimmodifier[3];
INT16 percentcapmodifier[3];
INT16 percenthandlingmodifier[3];
INT16 percentdropcompensationmodifier[3];
INT16 maxcounterforcemodifier[3];
INT16 counterforceaccuracymodifier[3];
INT16 counterforcefrequencymodifier[3];
INT16 targettrackingmodifier[3];
INT16 aimlevelsmodifier[3];
// HEADROCK HAM 4: New modifiers that do not require a stance array, since they affect the gun objectively, not
// subjectively.
INT16 RecoilModifierX;
INT16 RecoilModifierY;
INT16 PercentRecoilModifier;
INT16 percentaccuracymodifier;
FLOAT scopemagfactor;
FLOAT projectionfactor;
BOOLEAN speeddot;
} INVTYPE;
// CHRISL: Added new structures to handle LBE gear and the two new XML files that will be needed to deal
// with the IC pockets and the new inventory system.
//DBrot: Increased the LBE combo to 32bit to allow for multiple combos (using a bitwise system)
class LBETYPE{
public:
LBETYPE();
LBETYPE(const LBETYPE&);
LBETYPE& operator=(const LBETYPE&);
~LBETYPE();
UINT16 lbeIndex;
UINT32 lbeClass;
UINT32 lbeCombo;
UINT8 lbeFilledSize;
char POD;
std::vector<UINT8> lbePocketIndex;
};
#define SIZEOF_LBETYPE offsetof( LBETYPE, POD )
extern std::vector<LBETYPE> LoadBearingEquipment;
typedef enum eLBE_CLASS // Designation of lbeClass
{
THIGH_PACK=1,
VEST_PACK,
COMBAT_PACK,
BACKPACK,
LBE_POCKET,
OTHER_POCKET
};
class POCKETTYPE{
public:
POCKETTYPE();
POCKETTYPE(const POCKETTYPE&);
POCKETTYPE& operator=(const POCKETTYPE&);
~POCKETTYPE();
UINT16 pIndex;
CHAR16 pName[80];
UINT8 pSilhouette;
UINT16 pType;
UINT32 pRestriction;
char POD;
std::vector<UINT8> ItemCapacityPerSize;
};
#define SIZEOF_POCKETTYPE offsetof( POCKETTYPE, POD )
extern std::vector<POCKETTYPE> LBEPocketType;
typedef enum ePOCKET_TYPE
{
NO_POCKET_TYPE = 0,
GUNSLING_POCKET_TYPE = 1,
KNIFE_POCKET_TYPE = 2,
VEHICLE_POCKET_TYPE = 3,
};
#define FIRST_WEAPON 1
#define FIRST_AMMO 71
#define FIRST_EXPLOSIVE 131
#define FIRST_ARMOUR 161
#define FIRST_MISC 201
#define FIRST_KEY 271
#define NOTHING NONE
typedef enum
{
NONE = 0,
// weapons
GLOCK_17 = FIRST_WEAPON,
GLOCK_18,
BERETTA_92F,
BERETTA_93R,
SW38,
BARRACUDA,
DESERTEAGLE,
M1911,
MP5K,
MAC10, //10
THOMPSON,
COMMANDO,
MP53,
AKSU74,
P90,
TYPE85,
SKS,
DRAGUNOV,
M24,
AUG, //20
G41,
MINI14,
C7,
FAMAS,
AK74,
AKM,
M14,
FNFAL,
G3A3,
G11, //30
M870,
SPAS15,
CAWS,
MINIMI,
RPK74,
HK21E,
COMBAT_KNIFE,
THROWING_KNIFE,
ROCK,
GLAUNCHER, //40
MORTAR,
ROCK2,
CREATURE_YOUNG_MALE_CLAWS,
CREATURE_OLD_MALE_CLAWS,
CREATURE_YOUNG_FEMALE_CLAWS,
CREATURE_OLD_FEMALE_CLAWS,
CREATURE_QUEEN_TENTACLES,
CREATURE_QUEEN_SPIT,
BRASS_KNUCKLES,
UNDER_GLAUNCHER, //50
ROCKET_LAUNCHER,
BLOODCAT_CLAW_ATTACK,
BLOODCAT_BITE,
MACHETE,
ROCKET_RIFLE,
AUTOMAG_III,
CREATURE_INFANT_SPIT,
CREATURE_YOUNG_MALE_SPIT,
CREATURE_OLD_MALE_SPIT,
TANK_CANNON, //60
DART_GUN,
BLOODY_THROWING_KNIFE,
FLAMETHROWER,
CROWBAR,
AUTO_ROCKET_RIFLE, //65
// MADD MARKER
BARRETT, //previously unused
VAL_SILENT, //previously unused
PSG, //previously unused
TAR21, //previously unused
MAX_WEAPONS = ( FIRST_AMMO - 1 ),
CLIP9_15 = FIRST_AMMO,
CLIP9_30,
CLIP9_15_AP,
CLIP9_30_AP,
CLIP9_15_HP,
CLIP9_30_HP,
CLIP38_6,
CLIP38_6_AP,
CLIP38_6_HP,
CLIP45_7,
CLIP45_30,
CLIP45_7_AP,
CLIP45_30_AP,
CLIP45_7_HP,
CLIP45_30_HP,
CLIP357_6,
CLIP357_9,
CLIP357_6_AP,
CLIP357_9_AP,
CLIP357_6_HP,
CLIP357_9_HP,
CLIP545_30_AP,
CLIP545_30_HP,
CLIP556_30_AP,
CLIP556_30_HP,
CLIP762W_10_AP,
CLIP762W_30_AP,
CLIP762W_10_HP,
CLIP762W_30_HP,
CLIP762N_5_AP,
CLIP762N_20_AP,
CLIP762N_5_HP,
CLIP762N_20_HP,
CLIP47_50_SAP,
CLIP57_50_AP,
CLIP57_50_HP,
CLIP12G_7,
CLIP12G_7_BUCKSHOT,
CLIPCAWS_10_SAP,
CLIPCAWS_10_FLECH,
CLIPROCKET_AP,
CLIPROCKET_HE,
CLIPROCKET_HEAT,
CLIPDART_SLEEP,
CLIPFLAME,
// MADD MARKER
CLIP50_11, // unused
CLIP9H_20, // unused
CLIP9_50,
CLIP9_50_AP,
CLIP9_50_HP,
DRUM545_75_AP,
DRUM545_75_HP,
BELT556_200_AP,
BELT556_200_HP,
BELT762N_100_AP,
BELT762N_100_HP,
CLIP57_20_AP,
CLIP57_20_HP,
// unused
// unused
// explosives
STUN_GRENADE = FIRST_EXPLOSIVE,
TEARGAS_GRENADE,
MUSTARD_GRENADE,
MINI_GRENADE,
HAND_GRENADE,
RDX,
TNT,
HMX,
C1,
MORTAR_SHELL,
MINE,
C4,
TRIP_FLARE,
TRIP_KLAXON,
SHAPED_CHARGE,
BREAK_LIGHT,
GL_HE_GRENADE,
GL_TEARGAS_GRENADE,
GL_STUN_GRENADE,
GL_SMOKE_GRENADE,
SMOKE_GRENADE,
TANK_SHELL,
STRUCTURE_IGNITE,
CREATURE_COCKTAIL,
STRUCTURE_EXPLOSION,
GREAT_BIG_EXPLOSION,
BIG_TEAR_GAS,
SMALL_CREATURE_GAS,
LARGE_CREATURE_GAS,
VERY_SMALL_CREATURE_GAS=270, // Renumbered because the original 160 was lost
// armor
FLAK_JACKET=161, //= FIRST_ARMOUR, ( We're out of space! )
FLAK_JACKET_18,
FLAK_JACKET_Y,
KEVLAR_VEST,
KEVLAR_VEST_18,
KEVLAR_VEST_Y,
SPECTRA_VEST,
SPECTRA_VEST_18,
SPECTRA_VEST_Y,
KEVLAR_LEGGINGS,
KEVLAR_LEGGINGS_18,
KEVLAR_LEGGINGS_Y,
SPECTRA_LEGGINGS,
SPECTRA_LEGGINGS_18,
SPECTRA_LEGGINGS_Y,
STEEL_HELMET,
KEVLAR_HELMET,
KEVLAR_HELMET_18,
KEVLAR_HELMET_Y,
SPECTRA_HELMET,
SPECTRA_HELMET_18,
SPECTRA_HELMET_Y,
CERAMIC_PLATES,
CREATURE_INFANT_HIDE,
CREATURE_YOUNG_MALE_HIDE,
CREATURE_OLD_MALE_HIDE,
CREATURE_QUEEN_HIDE,
LEATHER_JACKET,
LEATHER_JACKET_W_KEVLAR,
LEATHER_JACKET_W_KEVLAR_18,
LEATHER_JACKET_W_KEVLAR_Y,
CREATURE_YOUNG_FEMALE_HIDE,
CREATURE_OLD_FEMALE_HIDE,
TSHIRT,
TSHIRT_DEIDRANNA,
KEVLAR2_VEST,
KEVLAR2_VEST_18,
KEVLAR2_VEST_Y,
// kits
FIRSTAIDKIT = FIRST_MISC,
MEDICKIT,
TOOLKIT,
LOCKSMITHKIT,
CAMOUFLAGEKIT,
BOOBYTRAPKIT,
// miscellaneous
SILENCER,
SNIPERSCOPE,
BIPOD,
EXTENDEDEAR,
NIGHTGOGGLES,
SUNGOGGLES,
GASMASK,
CANTEEN,
METALDETECTOR,
COMPOUND18,
JAR_QUEEN_CREATURE_BLOOD,
JAR_ELIXIR,
MONEY,
JAR,
JAR_CREATURE_BLOOD,
ADRENALINE_BOOSTER,
DETONATOR,
REMDETONATOR,
VIDEOTAPE,
DEED,
LETTER,
TERRORIST_INFO,
CHALICE,
BLOODCAT_CLAWS,
BLOODCAT_TEETH,
BLOODCAT_PELT,
SWITCH,
// fake items
ACTION_ITEM,
REGEN_BOOSTER,
SYRINGE_3,
SYRINGE_4,
SYRINGE_5,
JAR_HUMAN_BLOOD,
OWNERSHIP,
// additional items
LASERSCOPE,
REMOTEBOMBTRIGGER,
WIRECUTTERS,
DUCKBILL,
ALCOHOL,
UVGOGGLES,
DISCARDED_LAW,
HEAD_1,
HEAD_2,
HEAD_3,
HEAD_4,
HEAD_5,
HEAD_6,
HEAD_7,
WINE,
BEER,
PORNOS,
VIDEO_CAMERA,
ROBOT_REMOTE_CONTROL,
CREATURE_PART_CLAWS,
CREATURE_PART_FLESH,
CREATURE_PART_ORGAN,
REMOTETRIGGER,
GOLDWATCH,
GOLFCLUBS,
WALKMAN,
PORTABLETV,
MONEY_FOR_PLAYERS_ACCOUNT,
CIGARS,
KEY_1 = FIRST_KEY,
KEY_2,
KEY_3,
KEY_4,
KEY_5,
KEY_6,
KEY_7,
KEY_8,
KEY_9,
KEY_10,
FLASH_SUPPRESSOR,
RPG7,
RPG_HE_ROCKET,
RPG_AP_ROCKET,
RPG_FRAG_ROCKET,
REFLEX_SCOPED,
REFLEX_UNSCOPED,
KEY_18,
KEY_19,
KEY_20,
KEY_21,
KEY_22,
KEY_23,
KEY_24,
KEY_25,
KEY_26,
KEY_27,
KEY_28,
KEY_29,
KEY_30,
KEY_31,
KEY_32, // 302
SILVER_PLATTER,
DUCT_TAPE,
ALUMINUM_ROD,
SPRING,
SPRING_AND_BOLT_UPGRADE,
STEEL_ROD,
QUICK_GLUE,
GUN_BARREL_EXTENDER,
STRING,
TIN_CAN,
STRING_TIED_TO_TIN_CAN,
MARBLES,
LAME_BOY,
COPPER_WIRE,
DISPLAY_UNIT,
FUMBLE_PAK,
XRAY_BULB,
CHEWING_GUM, // 320
FLASH_DEVICE,
BATTERIES,
ELASTIC,
XRAY_DEVICE,
SILVER,
GOLD,
GAS_CAN,
M900, //UNUSED_26,
M950, //UNUSED_27,
M960, //UNUSED_28,
MICRO_UZI, // UNUSED_29,
ENFIELD, // UNUSED_30,
MP5,
MP5SD,
MP5N,
UMP45,
FIVE7,
P7M8,
G36K,
G36C, // 340
MSG90A1,
BENNELLI,
AK103,
UNUSED_42,
UNUSED_43,
UNUSED_44,
UNUSED_45,
UNUSED_46,
UNUSED_47,
UNUSED_48, // 350
//CHRISL: Default NIV items
DEFAULT_THIGH = 428,
DEFAULT_VEST = 434,
DEFAULT_CPACK = 442,
DEFAULT_BPACK = 448,
MAXITEMS = 5001
} ITEMDEFINE;
/* CHRISL: Arrays to track ic group information. These allow us to determine which LBE slots control which pockets and
what LBE class the pockets are.*/
// { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54}
// Determines which LBE Slot controls each pocket
const INT8 icLBE[NUM_INV_SLOTS] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,10,10,11,11,11,11, 7, 7, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10,11,11,11,11,11,11,11,11};
// Determines the class (and default definition) of the controlling pocket
const INT8 icClass[NUM_INV_SLOTS] = {-1,-1,-1,-1,-1,-1,-1, 5, 5, 5, 5, 5, 6, 6, 3, 3, 3, 4, 4, 4, 4, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4};
// Determines the pocket number to look at in LBETYPE
const INT8 icPocket[NUM_INV_SLOTS] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 4, 5, 6, 8, 9,10,11,10,11, 4, 4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7};
// Determines which pockets are used in the old inventory system.
const INT8 oldInv[NUM_INV_SLOTS] = { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
// Determines which pockets to use for vehicles in the new inventory system.
const INT8 vehicleInv[NUM_INV_SLOTS]= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0};
// Determines the default pocket
const INT16 icDefault[NUM_INV_SLOTS] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
DEFAULT_CPACK, DEFAULT_CPACK, DEFAULT_CPACK,
DEFAULT_BPACK, DEFAULT_BPACK, DEFAULT_BPACK, DEFAULT_BPACK,
DEFAULT_VEST, DEFAULT_VEST,
DEFAULT_THIGH, DEFAULT_THIGH,
DEFAULT_VEST, DEFAULT_VEST, DEFAULT_VEST, DEFAULT_VEST, DEFAULT_VEST, DEFAULT_VEST, DEFAULT_VEST, DEFAULT_VEST, DEFAULT_VEST, DEFAULT_VEST,
DEFAULT_THIGH, DEFAULT_THIGH, DEFAULT_THIGH, DEFAULT_THIGH, DEFAULT_THIGH, DEFAULT_THIGH, DEFAULT_THIGH, DEFAULT_THIGH,
DEFAULT_CPACK, DEFAULT_CPACK, DEFAULT_CPACK, DEFAULT_CPACK,
DEFAULT_BPACK, DEFAULT_BPACK, DEFAULT_BPACK, DEFAULT_BPACK, DEFAULT_BPACK, DEFAULT_BPACK, DEFAULT_BPACK, DEFAULT_BPACK};
#define FIRST_HELMET STEEL_HELMET
#define LAST_HELMET SPECTRA_HELMET_Y
#define FIRST_VEST FLAK_JACKET
#define LAST_VEST KEVLAR2_VEST_Y
#define FIRST_LEGGINGS KEVLAR_LEGGINGS
#define LAST_LEGGINGS SPECTRA_LEGGINGS_Y
#define FIRST_HEAD_ITEM EXTENDEDEAR
#define LAST_HEAD_ITEM SUNGOGGLES
#define MAXATTACHMENTS 30000
extern INVTYPE Item[MAXITEMS];
extern UINT16 Attachment[MAXATTACHMENTS][4];
//WarmSteel - Here we have some definitions for NAS
typedef struct
{
UINT16 uiSlotIndex;
CHAR16 szSlotName[200];
UINT32 nasAttachmentClass;
UINT128 nasLayoutClass;
UINT16 usDescPanelPosX;
UINT16 usDescPanelPosY;
BOOLEAN fMultiShot;
BOOLEAN fBigSlot;
} AttachmentSlotStruct;
extern AttachmentSlotStruct AttachmentSlots[MAXITEMS+1];
typedef struct
{
UINT32 uiIndex;
UINT32 OIV;
UINT32 NIV;
UINT32 OAS;
UINT32 NAS;
} ItemReplacementStruct;
extern ItemReplacementStruct ItemReplacement[MAXATTACHMENTS];
typedef struct
{
std::vector<UINT16> usItemExclude;
std::vector<UINT16> usItemInclude;
std::vector<UINT16> ubWeaponClass;
std::vector<UINT16> usAddsSlots;
std::vector<UINT16> usRemovesSlots;
} AlterationStruct;
typedef struct
{
UINT16 usItem;
UINT32 uiItemClass;
INT8 bAttachmentSkillCheck;
INT8 bAttachmentSkillCheckMod;
UINT32 uiIndex;
} AttachmentInfoStruct;
extern AttachmentInfoStruct AttachmentInfo[MAXITEMS+1];
extern UINT16 Launchable[MAXITEMS+1][2];
extern UINT16 CompatibleFaceItems[MAXITEMS+1][2];
extern UINT16 IncompatibleAttachments[MAXATTACHMENTS][2];
typedef enum
{
DESTRUCTION,
COMBINE_POINTS,
TREAT_ARMOUR,
EXPLOSIVE,
EASY_MERGE,
ELECTRONIC_MERGE,
USE_ITEM,
USE_ITEM_HARD
} MergeType;
extern UINT16 Merge[MAXITEMS+1][6];
typedef struct
{
UINT16 usItem;
UINT16 usAttachment[2];
UINT16 usResult;
UINT32 uiIndex;
} ComboMergeInfoStruct;
extern ComboMergeInfoStruct AttachmentComboMerge[MAXITEMS+1];
BOOLEAN EXPLOSIVE_GUN(UINT16 x );
typedef struct IMP_ITEM_CHOICE_TYPE
{
UINT8 ubChoices; // how many valid choices there are in this category
INT16 bItemNo[50]; // room for up to 50 choices in each category
UINT8 ubNumItems; // # of items to select
UINT32 uiIndex;
} IMP_ITEM_CHOICE_TYPE;
enum
{
IMP_DEFAULT = 0,
IMP_RANDOMDEFAULT,
//ATTRIBUTES
IMP_WISDOM,
IMP_DEXTERITY,
IMP_AGILITY,
IMP_STRENGTH,
IMP_HEALTH,
IMP_LEADERSHIP,
IMP_MARKSMANSHIP,
IMP_EXPLOSIVE,
IMP_MECHANICAL,
IMP_MEDICAL,
//SKILLS - SANDRO was here
IMP_AUTO_WEAPONS,
IMP_HEAVY_WEAPONS,
IMP_SNIPER,
IMP_RANGER,
IMP_GUNSLINGER,
IMP_MARTIAL_ARTS,
IMP_SQUADLEADER,
IMP_TECHNICIAN,
IMP_DOCTOR,
IMP_AMBIDEXTROUS,
IMP_MELEE,
IMP_THROWING,
IMP_NIGHT_OPS,
IMP_STEALTHY,
IMP_ATHLETICS,
IMP_BODYBUILDING,
IMP_DEMOLITIONS,
IMP_TEACHING,
IMP_SCOUTING,
IMP_LOCKPICKING,
IMP_ELECTRONICS,
IMP_CAMOUFLAGED,
// DBrot: added seperate choices for experts
IMP_AUTO_WEAPONS_EXP,
IMP_HEAVY_WEAPONS_EXP,
IMP_SNIPER_EXP,
IMP_RANGER_EXP,
IMP_GUNSLINGER_EXP,
IMP_MARTIAL_ARTS_EXP,
IMP_SQUADLEADER_EXP,
IMP_TECHNICIAN_EXP,
IMP_DOCTOR_EXP,
IMP_MELEE_EXP,
IMP_THROWING_EXP,
IMP_NIGHT_OPS_EXP,
IMP_STEALTHY_EXP,
IMP_TEACHING_EXP,
IMP_LOCKPICKING_EXP,
MAX_IMP_ITEM_TYPES
};
extern IMP_ITEM_CHOICE_TYPE gIMPItemChoices[MAX_IMP_ITEM_TYPES];
#endif