#ifndef _SOLDIER_CREATE_H
#define _SOLDIER_CREATE_H

#include "Animation Cache.h"
#include "Timer Control.h"
#include "vobject.h"
#include "Overhead Types.h"
//#include "Item Types.h"
#include "soldier control.h"

#include <vector>
#include <iterator>

//forward declarations of common classes to eliminate includes
class OBJECTTYPE;
class SOLDIERTYPE;
class SOLDIERCREATE_STRUCT;//dnl ch33 130909
class _OLD_SOLDIERCREATE_STRUCT;//dnl ch42 250909

#define		SOLDIER_CREATE_AUTO_TEAM			-1

// WDS - make number of mercenaries, etc. be configurable
//Kris: 
//This value is the total maximum number of slots in a map.	
//Players		20
//Enemies		32
//Creatures 32
//Rebels		32
//Civilians 32
//Total			148
#define MAX_INDIVIDUALS											TOTAL_SOLDIERS

enum 
{ 
	PINKSKIN, 
	TANSKIN, 
	DARKSKIN, 
	BLACKSKIN, 
	NUMSKINS
};

enum
{
	BROWNHEAD,						//dark skin (this line plus all above)
	BLACKHEAD, //black skin (only this line )
	WHITEHEAD,
	BLONDEHEAD,
	REDHEAD,	//pink/tan skin (this line plus all above )
	NUMHEADS
};

enum
{
	WHITEVEST,
	GYELLOWSHIRT,
	YELLOWVEST,
	GREYVEST,
	BROWNVEST,
	PURPLESHIRT,
	BLUEVEST,
	JEANVEST,
	GREENVEST,
	REDVEST,
	BLACKSHIRT,
	NUMSHIRTS
};

enum
{
	BLUEPANTS,
	BLACKPANTS,
	JEANPANTS,
	TANPANTS,
	BEIGEPANTS,
	GREENPANTS,
	NUMPANTS
};

//Kris:	SERIALIZING INFORMATION
//All maps must have:
//	-MAPCREATE_STRUCT
//		MAPCREATE_STRUCT.ubNumIndividuals determines how many BASIC_SOLDIERCREATE_STRUCTs there are
//	-The BASIC_SOLDIERCREATE_STRUCTS are saved contiguously, but if any of them
//		fDetailedPlacement set, then there is a SOLDIERCREATE_STRUCT saved immediately after.

//These are the placement slots used by the editor to define where characters are in a map, what 
//they are, what team they are on, personality traits, etc.	The Merc section of the editor is 
//what is used to define these values.
//dnl ch42 250909
// WANNE - BMP: DONE!
typedef struct
{
	BOOLEAN fDetailedPlacement;			//Specialized information.	Has a counterpart containing all info.
	INT16 sStartingGridNo;				//Where the placement position is.
	INT8 bTeam;											//The team this individual is part of.
	INT8 bRelativeAttributeLevel;		
	INT8 bRelativeEquipmentLevel;		
	UINT8 ubDirection;								//1 of 8 values (always mandatory)
	INT8 bOrders;										
	INT8 bAttitude;									
	INT8 ubBodyType;									//up to 128 body types, -1 means random
	INT16 sPatrolGrid[OLD_MAXPATROLGRIDS];//dnl ch27 230909 Possible locations to visit, patrol, etc.
	INT8 bPatrolCnt;
	BOOLEAN fOnRoof;
	UINT8	ubSoldierClass;							//army, administrator, elite
	UINT8 ubCivilianGroup;
	BOOLEAN fPriorityExistance;			//These slots are used first
	BOOLEAN fHasKeys;
	INT8 PADDINGSLOTS[ 14 ];
} _OLD_BASIC_SOLDIERCREATE_STRUCT; //50 bytes

class BASIC_SOLDIERCREATE_STRUCT
{
public:
	BOOLEAN fDetailedPlacement;			// Specialized information, has a counterpart containing all info
	INT32 usStartingGridNo;				// Where the placement position is
	INT8 bTeam;							// The team this individual is part of
	INT8 bRelativeAttributeLevel;
	INT8 bRelativeEquipmentLevel;
	UINT8 ubDirection;					// 1 of 8 values (always mandatory)
	INT8 bOrders;
	INT8 bAttitude;
	INT8 ubBodyType;						// Up to 128 body types, -1 means random
	INT32 sPatrolGrid[MAXPATROLGRIDS];	// Possible locations to visit, patrol, etc.
	INT8 bPatrolCnt;
	BOOLEAN fOnRoof;
	UINT8 ubSoldierClass;				// Army, administrator, elite
	UINT8 ubCivilianGroup;
	BOOLEAN fPriorityExistance;			// These slots are used first
	BOOLEAN fHasKeys;
public:
	BASIC_SOLDIERCREATE_STRUCT& operator=(const _OLD_BASIC_SOLDIERCREATE_STRUCT& src);
	BOOLEAN Load(INT8** hBuffer, FLOAT dMajorMapVersion);
	BOOLEAN Save(HWFILE hFile, FLOAT dMajorMapVersion, UINT8 ubMinorMapVersion);
};

class OLD_SOLDIERCREATE_STRUCT_101
{
public:
	// Constructor
	OLD_SOLDIERCREATE_STRUCT_101();
	// Copy Constructor
	OLD_SOLDIERCREATE_STRUCT_101(const OLD_SOLDIERCREATE_STRUCT_101&);
	// Assignment operator
	OLD_SOLDIERCREATE_STRUCT_101& operator=(const OLD_SOLDIERCREATE_STRUCT_101&);
	OLD_SOLDIERCREATE_STRUCT_101& operator=(SOLDIERCREATE_STRUCT&);//dnl ch33 130909
	// Destructor
	~OLD_SOLDIERCREATE_STRUCT_101();

	// Initialize the soldier.	
	//	Use this instead of the old method of calling memset!
	//	Note that the constructor does this automatically.
	void initialize();

	// Note!	These two functions should ONLY be used either just before saving to a
	// file (NewToOld) or after loading a file (OldToNew).
	void CopyOldInventoryToNew();

public:
	//Bulletproofing so static detailed placements aren't used to tactically create soldiers.
	//Used by editor for validation purposes.
	BOOLEAN						fStatic;	
	
	//Profile information used for special NPCs and player mercs.
	UINT8							ubProfile;
	BOOLEAN						fPlayerMerc;
	BOOLEAN						fPlayerPlan;
	BOOLEAN						fCopyProfileItemsOver;

	//Location information
	INT16							sSectorX;
	INT16							sSectorY;
	UINT8							ubDirection;
	INT16							sInsertionGridNo;

	// Can force a team, but needs flag set
	INT8							bTeam;
	INT8							ubBodyType;

	//Orders and attitude settings
	INT8							bAttitude;
	INT8							bOrders;

	//Attributes
	INT8							bLifeMax;	
	INT8							bLife;
	INT8							bAgility;
	INT8							bDexterity;
	INT8							bExpLevel;
	INT8							bMarksmanship;
	INT8							bMedical;
	INT8							bMechanical;
	INT8							bExplosive;
	INT8							bLeadership;
	INT8							bStrength;
	INT8							bWisdom;
	INT8							bMorale;
	INT8							bAIMorale;

private:
	//Inventory
	OLD_OBJECTTYPE_101				DO_NOT_USE_Inv[ OldInventory::NUM_INV_SLOTS ];	
public:
	
	//Palette information for soldiers.
	PaletteRepID			HeadPal;	
	PaletteRepID			PantsPal;	
	PaletteRepID			VestPal;	
	PaletteRepID			SkinPal;	
	PaletteRepID			MiscPal;
	
	//Waypoint information for patrolling
	INT16 sPatrolGrid[OLD_MAXPATROLGRIDS];//dnl ch33 200909
	INT8 bPatrolCnt;
	
	//Kris:	Additions November 16, 1997 (padding down to 129 from 150)
	BOOLEAN						fVisible;
	CHAR16						name[ 10 ];

	UINT8							ubSoldierClass;	//army, administrator, elite

	BOOLEAN						fOnRoof;

	INT8							bSectorZ;

	SOLDIERTYPE				*pExistingSoldier;
	BOOLEAN						fUseExistingSoldier;
	UINT8							ubCivilianGroup;

	BOOLEAN						fKillSlotIfOwnerDies;
	UINT8							ubScheduleID;

	BOOLEAN						fUseGivenVehicle;				
	INT8							bUseGivenVehicleID;				
	BOOLEAN						fHasKeys;

	INT8 bPadding[115];

	//
	// New and OO stuff goes after here.	Above this point any changes will goof up reading from files.
	//
	char ef1,ef2;	// Extra filler to get "offsetof(endOfPOD)" to match SIZEOF(oldstruct)

	char endOfPOD;	// marker for end of POD (plain old data)

	Inventory				Inv;
}; // OLD_SOLDIERCREATE_STRUCT_101;

// WANNE - BMP: DONE!
class SOLDIERCREATE_STRUCT
{
public:
	// Constructor
	SOLDIERCREATE_STRUCT();
	// Copy Constructor
	SOLDIERCREATE_STRUCT(const SOLDIERCREATE_STRUCT&);
	// Assignment operator
	SOLDIERCREATE_STRUCT& operator=(const SOLDIERCREATE_STRUCT&);
	// Conversion operator from old to new
	SOLDIERCREATE_STRUCT& operator=(const OLD_SOLDIERCREATE_STRUCT_101&);
	// Conversion operator from SOLDIERTYPE to SOLDIERCREATE_STRUCT
	SOLDIERCREATE_STRUCT& operator=(const SOLDIERTYPE&);
	// Destructor
	~SOLDIERCREATE_STRUCT();

	UINT16 GetChecksum();

	SOLDIERCREATE_STRUCT& operator=(const _OLD_SOLDIERCREATE_STRUCT& src);//dnl ch42 250909

	// Initialize the soldier.	
	//	Use this instead of the old method of calling memset!
	//	Note that the constructor does this automatically.
	void initialize();

	BOOLEAN Load(HWFILE hFile, int versionToLoad, bool loadChecksum);
	BOOLEAN Load(INT8 **hBuffer, FLOAT dMajorMapVersion, UINT8 ubMinorMapVersion);
	BOOLEAN Save(HWFILE hFile, bool fSavingMap, FLOAT dMajorMapVersion=MAJOR_MAP_VERSION, UINT8 ubMinorMapVersion=MINOR_MAP_VERSION);//dnl ch42 250909

public:
	//Bulletproofing so static detailed placements aren't used to tactically create soldiers.
	//Used by editor for validation purposes.
	BOOLEAN						fStatic;	
	
	//Profile information used for special NPCs and player mercs.
	UINT8							ubProfile;
	BOOLEAN						fPlayerMerc;
	BOOLEAN						fPlayerPlan;
	BOOLEAN						fCopyProfileItemsOver;

	//Location information
	INT16							sSectorX;
	INT16							sSectorY;
	UINT8							ubDirection;
	INT32							sInsertionGridNo;//dnl ch42 290909

	// Can force a team, but needs flag set
	INT8							bTeam;
	INT8							ubBodyType;

	//Orders and attitude settings
	INT8							bAttitude;
	INT8							bOrders;

	//Attributes
	INT8							bLifeMax;	
	INT8							bLife;
	INT8							bAgility;
	INT8							bDexterity;
	INT8							bExpLevel;
	INT8							bMarksmanship;
	INT8							bMedical;
	INT8							bMechanical;
	INT8							bExplosive;
	INT8							bLeadership;
	INT8							bStrength;
	INT8							bWisdom;
	INT8							bMorale;
	INT8							bAIMorale;

public:
	
	//Palette information for soldiers.
	PaletteRepID			HeadPal;	
	PaletteRepID			PantsPal;	
	PaletteRepID			VestPal;	
	PaletteRepID			SkinPal;	
	PaletteRepID			MiscPal;
	
	//Waypoint information for patrolling
	INT32 sPatrolGrid[MAXPATROLGRIDS];//dnl ch42 290909
	INT8					bPatrolCnt;
	
	//Kris:	Additions November 16, 1997 (padding down to 129 from 150)
	BOOLEAN						fVisible;
	CHAR16						name[ 10 ];

	UINT8						ubSoldierClass;	//army, administrator, elite

	BOOLEAN						fOnRoof;

	INT8						bSectorZ;

	SOLDIERTYPE					*pExistingSoldier;
	BOOLEAN						fUseExistingSoldier;
	UINT8						ubCivilianGroup;

	BOOLEAN						fKillSlotIfOwnerDies;
	UINT8						ubScheduleID;

	BOOLEAN						fUseGivenVehicle;				
	INT8						bUseGivenVehicleID;				
	BOOLEAN						fHasKeys;

	//
	// New and OO stuff goes after here.	Above this point any changes will goof up reading from files.
	//
	char endOfPOD;	// marker for end of POD (plain old data)

	Inventory				Inv;
}; // SOLDIERCREATE_STRUCT;

// WANNE - BMP: DONE!
class _OLD_SOLDIERCREATE_STRUCT
{
public:
	//Bulletproofing so static detailed placements aren't used to tactically create soldiers.
	//Used by editor for validation purposes.
	BOOLEAN						fStatic;	
	
	//Profile information used for special NPCs and player mercs.
	UINT8							ubProfile;
	BOOLEAN						fPlayerMerc;
	BOOLEAN						fPlayerPlan;
	BOOLEAN						fCopyProfileItemsOver;

	//Location information
	INT16							sSectorX;
	INT16							sSectorY;
	UINT8							ubDirection;
	INT16							sInsertionGridNo;

	// Can force a team, but needs flag set
	INT8							bTeam;
	INT8							ubBodyType;

	//Orders and attitude settings
	INT8							bAttitude;
	INT8							bOrders;

	//Attributes
	INT8							bLifeMax;	
	INT8							bLife;
	INT8							bAgility;
	INT8							bDexterity;
	INT8							bExpLevel;
	INT8							bMarksmanship;
	INT8							bMedical;
	INT8							bMechanical;
	INT8							bExplosive;
	INT8							bLeadership;
	INT8							bStrength;
	INT8							bWisdom;
	INT8							bMorale;
	INT8							bAIMorale;

public:
	
	//Palette information for soldiers.
	PaletteRepID			HeadPal;	
	PaletteRepID			PantsPal;	
	PaletteRepID			VestPal;	
	PaletteRepID			SkinPal;	
	PaletteRepID			MiscPal;
	
	//Waypoint information for patrolling
	INT16					sPatrolGrid[OLD_MAXPATROLGRIDS];//dnl ch27 230909
	INT8					bPatrolCnt;
	
	//Kris:	Additions November 16, 1997 (padding down to 129 from 150)
	BOOLEAN						fVisible;
	CHAR16						name[ 10 ];

	UINT8						ubSoldierClass;	//army, administrator, elite

	BOOLEAN						fOnRoof;

	INT8						bSectorZ;

	SOLDIERTYPE					*pExistingSoldier;
	BOOLEAN						fUseExistingSoldier;
	UINT8						ubCivilianGroup;

	BOOLEAN						fKillSlotIfOwnerDies;
	UINT8						ubScheduleID;

	BOOLEAN						fUseGivenVehicle;				
	INT8						bUseGivenVehicleID;				
	BOOLEAN						fHasKeys;

	//
	// New and OO stuff goes after here.	Above this point any changes will goof up reading from files.
	//
	char endOfPOD;	// marker for end of POD (plain old data)

	Inventory				Inv;
}; // _OLD_SOLDIERCREATE_STRUCT;

#define SIZEOF_OLD_SOLDIERCREATE_STRUCT_101_POD offsetof( OLD_SOLDIERCREATE_STRUCT_101, endOfPOD )
#define SIZEOF_SOLDIERCREATE_STRUCT_POD offsetof( SOLDIERCREATE_STRUCT, endOfPOD )
#define _OLD_SIZEOF_SOLDIERCREATE_STRUCT_POD offsetof( _OLD_SOLDIERCREATE_STRUCT, endOfPOD )


//Original functions currently used throughout the game.
BOOLEAN TacticalRemoveSoldier( UINT16 usSoldierIndex );
BOOLEAN TacticalRemoveSoldierPointer( SOLDIERTYPE *pSoldier, BOOLEAN fRemoveVehicle );

INT8 CalcDifficultyModifier( UINT8 ubSoldierClass );

void RandomizeNewSoldierStats( SOLDIERCREATE_STRUCT *pCreateStruct );

//Kris:
//Modified return type from BOOLEAN to SOLDIERTYPE*
SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 *pubID );

//Randomly generated enemies used by strategic AI.
SOLDIERTYPE* TacticalCreateAdministrator();
SOLDIERTYPE* TacticalCreateEliteEnemy();
SOLDIERTYPE* TacticalCreateArmyTroop();
SOLDIERTYPE* TacticalCreateZombie();		// Flugente Zombies
SOLDIERTYPE* TacticalCreateMilitia( UINT8 ubMilitiaClass, INT16 sX, INT16 sY );	// Flugente: added sector coordinates
SOLDIERTYPE* TacticalCreateCreature( INT8 bCreatureBodyType );
SOLDIERTYPE* TacticalCreateEnemyTank();
SOLDIERTYPE* TacticalCreateEnemyJeep( );
SOLDIERTYPE* TacticalCreateEnemyRobot();

// Flugente: create an armed civilian
SOLDIERTYPE* TacticalCreateArmedCivilian( UINT8 usSoldierClass = SOLDIER_CLASS_ARMY );

SOLDIERTYPE* TacticalCreateCivilian( INT32 sGridNo, UINT8 usCivilianGroup, INT8 usTraderID,
									 INT8 sBodyType, INT8 aVest, INT8 aPants, INT8 aHair, INT8 aSkin, 
									 INT16 sItem1, INT16 sItem2, INT16 sItem3, INT16 sItem4 );

// Flugente: assassins are elite soldiers of the civ team that go hostile on a certain event, otherwise they just blend in
SOLDIERTYPE* TacticalCreateEnemyAssassin(UINT8 disguisetype);

SOLDIERTYPE* TacticalCreateBandit();

void CreateAssassin(UINT8 disguisetype);

// create a prisoner (in a prison cell) in the current sector
void CreatePrisonerOfWar();

// create a downed pilot in a random location in the current sector
void CreateDownedPilot();

// randomly generates a relative level rating (attributes or equipment)
void RandomizeRelativeLevel( INT8 *pbRelLevel, UINT8 ubSoldierClass );

// get the pythag. distance from the passed sector to the palace..
UINT8 GetPythDistanceFromPalace( INT16 sSectorX, INT16 sSectorY );


//These following functions are currently used exclusively by the editor.
//Now, this will be useful for the strategic AI.
//Definitions:
//Soldier (s):	Currently in the game, but subject to modifications.	The editor has the capability to 
//	modify soldier attributes on the fly for testing purposes.
//BasicPlacement (bp):	A BASIC_SOLDIERCREATE_STRUCT that contains compact, very general, information about 
//	a soldier.	The BasicPlacement is then used to generate a DetailedPlacement before creating a soldier.	
//	Most of the soldiers saved in the maps will be saved in this manner.
//DetailedPlacement (pp):	A SOLDIERCREATE_STRUCT ready to be passed to TacticalCreateSoldier to generate 
//	and add a new soldier to the world.	The DetailedPlacement contains all of the necessary information
//	to do this.	This information won't be saved in maps. In most cases, only very few attributes are static, 
//	and the rest are generated at runtime.	Because of this situation, saved detailed placements must be in a 
//	different format.
//StaticDetailedPlacement (spp):	A hybrid version of the DetailedPlacement.	This is the information saved in 
//	the map via the editor.	When loaded, this information is converted to a normal detailed placement, but 
//	must also use the BasicPlacement information to complete this properly.	Once the conversion is complete, 
//	the static information is lost.	This gives us complete flexibility.	The basic placements contain relative
//	values that work in conjunction with the strategic AI's relative values to generate soldiers.	In no
//	circumstances will static detailed placements be used outside of the editor.	Note, that this hybrid version
//	uses the identical structure as detailed placements.	All non-static values are set to -1.

//Used to generate a detailed placement from a basic placement.	This assumes that the detailed placement
//doesn't exist, meaning there are no static attributes.	This is called when you wish to convert a basic 
//placement into a detailed placement just before creating a soldier.
// Flugente: added sector coordinates, used for militia using sector equipment
void CreateDetailedPlacementGivenBasicPlacementInfo( SOLDIERCREATE_STRUCT *pp, BASIC_SOLDIERCREATE_STRUCT *bp, INT16 sX = -1, INT16 sY = -1 );

//Used exclusively by the editor when the user wishes to change a basic placement into a detailed placement.
//Because the intention is to make some of the attributes static, all of the information that can be generated
//are defaulted to -1.	When an attribute is made to be static, that value in replaced by the new static value.
//This information is NOT compatible with TacticalCreateSoldier.	Before doing so, you must first convert the
//static detailed placement to a regular detailed placement.	
void CreateStaticDetailedPlacementGivenBasicPlacementInfo( SOLDIERCREATE_STRUCT *spp, BASIC_SOLDIERCREATE_STRUCT *bp );

//When you are ready to generate a soldier with a static detailed placement slot, this function will generate
//the proper priority placement slot given the static detailed placement and it's accompanying basic placment.
//For the purposes of merc editing, the static detailed placement is preserved.
// Flugente: added sector coordinates, used for militia using sector equipment
void CreateDetailedPlacementGivenStaticDetailedPlacementAndBasicPlacementInfo( 
		SOLDIERCREATE_STRUCT *pp, SOLDIERCREATE_STRUCT *spp, BASIC_SOLDIERCREATE_STRUCT *bp, INT16 sX = -1, INT16 sY = -1);

//Used to update a existing soldier's attributes with the new static detailed placement info.	This is used
//by the editor upon exiting the editor into the game, to update the existing soldiers with new information.
//This gives flexibility of testing mercs.	Upon entering the editor again, this call will reset all the 
//mercs to their original states.
void UpdateSoldierWithStaticDetailedInformation( SOLDIERTYPE *s, SOLDIERCREATE_STRUCT *spp );

//In the case of setting a profile ID in order to extract a soldier from the profile array, we
//also want to copy that information to the static detailed placement, for editor viewing purposes.
void UpdateStaticDetailedPlacementWithProfileInformation( SOLDIERCREATE_STRUCT *spp, UINT8 ubProfile );

//When the editor modifies the soldier's relative attribute level,
//this function is called to update that information.
void ModifySoldierAttributesWithNewRelativeLevel( SOLDIERTYPE *s, INT8 bLevel );

// Force the soldier to be a different ID
void ForceSoldierProfileID( SOLDIERTYPE *pSoldier, UINT8 ubProfileID );

void GeneratePaletteForSoldier( SOLDIERTYPE *pSoldier, UINT8 ubSoldierClass, UINT8 ubTeam );

void QuickCreateProfileMerc( INT8 bTeam, UINT8 ubProfileID );

BOOLEAN InternalTacticalRemoveSoldier( UINT16 usSoldierIndex, BOOLEAN fRemoveVehicle );

//SPECIAL!	Certain events in the game can cause profiled NPCs to become enemies.	The two cases are 
//adding Mike and Iggy.	We will only add one NPC in any given combat and the conditions for setting
//the associated facts are done elsewhere.	The function will set the profile for the SOLDIERCREATE_STRUCT
//and the rest will be handled automatically so long the ubProfile field doesn't get changed.
//NOTE:	We don't want to add Mike or Iggy if this is being called from autoresolve!
void OkayToUpgradeEliteToSpecialProfiledEnemy( SOLDIERCREATE_STRUCT *pp );
extern BOOLEAN gfProfiledEnemyAdded; //needs to be saved (used by the above function)

//Legion by Jazz
//void BeginSoldierClimbUpOkno( SOLDIERTYPE *pSoldier );
void BeginSoldierFenceUp( SOLDIERTYPE *pSoldier );
//dnl ch27 240909
typedef enum
{
	UINT8_UINT8,
	UINT16_UINT16,
	UINT32_UINT32,
	UINT8_UINT16,
	UINT16_UINT8,
	INT16_INT32,
	INT32_INT16,
}TranslateArrayFieldsCommands;
BOOLEAN TranslateArrayFields(void* out, const void* inp, int len, int cmd);

//dnl ch56 141009
#define CENTRAL_GRIDNO (MAPROWCOLTOPOS(WORLD_ROWS/2,WORLD_COLS/2))
#define CENTRAL_RADIUS (min(WORLD_ROWS,WORLD_COLS)/5)

void ResetNumSquadleadersInArmyGroup( void ); // added by SANDRO
BOOLEAN AssignTraitsToSoldier( SOLDIERTYPE *pSoldier, SOLDIERCREATE_STRUCT *pCreateStruct ); // Added a function to add traits to soldiers - SANDRO

INT32 ChooseHairColor( UINT8 usBodyType, INT32 skin );

// Flugente: set palettes for vest/shirt
void SetClothes( SOLDIERTYPE* pSoldier, INT8 aVest, INT8 aPants, INT8 aHair = -1, INT8 aSkin = -1 );

#endif