#ifndef __SOLDER_PROFILE_TYPE_H
#define __SOLDER_PROFILE_TYPE_H

#include "Overhead Types.h"
#include "Soldier Control.h"
#include "mapscreen.h"

#define NUM_PROFILES		255 //170 new profiles by Jazz
#define NUM_PROFILES_v111	170
//tais: maximum amount of starting gear kits
#define NUM_MERCSTARTINGGEAR_KITS	5

#ifdef JA2UB
#define FIRST_RPC 60	//JA25 was 59
#else
#define FIRST_RPC 57
#endif

#define FIRST_NPC 75

#define NAME_LENGTH			30
#define NICKNAME_LENGTH	10


//ONLY HAVE 8 MISC FLAGS.. SHOULD BE ENOUGH
#define	PROFILE_MISC_FLAG_RECRUITED									0x01
#define	PROFILE_MISC_FLAG_HAVESEENCREATURE							0x02
#define	PROFILE_MISC_FLAG_FORCENPCQUOTE								0x04
#define PROFILE_MISC_FLAG_WOUNDEDBYPLAYER							0x08
#define	PROFILE_MISC_FLAG_TEMP_NPC_QUOTE_DATA_EXISTS				0x10
#define PROFILE_MISC_FLAG_SAID_HOSTILE_QUOTE						0x20
#define	PROFILE_MISC_FLAG_EPCACTIVE									0x40
#define	PROFILE_MISC_FLAG_ALREADY_USED_ITEMS						0x80				//The player has already purchased the mercs items.

#define PROFILE_MISC_FLAG2_DONT_ADD_TO_SECTOR						0x01
#define PROFILE_MISC_FLAG2_LEFT_COUNTRY								0x02
#define PROFILE_MISC_FLAG2_BANDAGED_TODAY							0x04
#define PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE						0x08
#define PROFILE_MISC_FLAG2_NEEDS_TO_SAY_HOSTILE_QUOTE				0x10
#define PROFILE_MISC_FLAG2_MARRIED_TO_HICKS							0x20
#define PROFILE_MISC_FLAG2_ASKED_BY_HICKS							0x40
//JMich_MMG: Flag to see if gearkit cost is still unpaid for
#define	PROFILE_MISC_FLAG2_MERC_GEARKIT_UNPAID						0x80

#define	PROFILE_MISC_FLAG3_PLAYER_LEFT_MSG_FOR_MERC_AT_AIM			0x01		// In the aimscreen, the merc was away and the player left a message
#define PROFILE_MISC_FLAG3_PERMANENT_INSERTION_CODE					0x02
#define PROFILE_MISC_FLAG3_PLAYER_HAD_CHANCE_TO_HIRE				0x04		// player's had a chance to hire this merc
#define PROFILE_MISC_FLAG3_HANDLE_DONE_TRAVERSAL					0x08

#define PROFILE_MISC_FLAG3_NPC_PISSED_OFF							0x10
#define	PROFILE_MISC_FLAG3_MERC_MERC_IS_DEAD_AND_QUOTE_SAID			0x20		// In the merc site, the merc has died and Speck quote for the dead merc has been said

#define PROFILE_MISC_FLAG3_TOWN_DOESNT_CARE_ABOUT_DEATH				0x40
#define PROFILE_MISC_FLAG3_GOODGUY									0x80
//
// The following variables are used with the 'bMercStatus' variable
//
//

//Merc is ready
#define MERC_OK																0

//if the merc doesnt have a EDT file
#define MERC_HAS_NO_TEXT_FILE									-1

//used in the aim video conferencing screen
#define	MERC_ANNOYED_BUT_CAN_STILL_CONTACT		-2
#define	MERC_ANNOYED_WONT_CONTACT							-3
#define	MERC_HIRED_BUT_NOT_ARRIVED_YET				-4

//self explanatory
#define	MERC_IS_DEAD													-5

//set when the merc is returning home.	A delay for 1,2 or 3 days
#define	MERC_RETURNING_HOME										-6

// used when merc starts game on assignment, goes on assignment later, or leaves to go on another contract
#define	MERC_WORKING_ELSEWHERE								-7

//When the merc was fired, they were a POW, make sure they dont show up in AIM, or MERC as available
#define	MERC_FIRED_AS_A_POW										-8


// the values for categories of stats
#define SUPER_STAT_VALUE 80
#define NEEDS_TRAINING_STAT_VALUE 50
#define NO_CHANCE_IN_HELL_STAT_VALUE 40

#define SUPER_SKILL_VALUE 80
#define NEEDS_TRAINING_SKILL_VALUE 50
#define NO_CHANCE_IN_HELL_SKILL_VALUE 0

//
// WDS 05/13/2009
// This is a temporary fix and should be REALLY fixed someday.
// The bMercOpinion array in MERCPROFILESTRUCT below only contains 75 entries.  That
// means profile ID#s of 75 and beyond are not valid to be used for checking morale.
//
// Flugente 16/04/2013: Done
#define NUMBER_OF_OPINIONS_OLD	75		// for old structures, we need to keep this value. Do NOT change, or you'll be in a world of pain. I warned you.
#define NUMBER_OF_OPINIONS		255	

	
inline bool OKToCheckOpinion(int profileNumber) {
	return (profileNumber < NUMBER_OF_OPINIONS);
}

// SANDRO - replaced this list to represent the old traits only
typedef enum
{
	NO_SKILLTRAIT_OT = 0,
	LOCKPICKING_OT,
	HANDTOHAND_OT,
	ELECTRONICS_OT,
	NIGHTOPS_OT,
	THROWING_OT,
	TEACHING_OT,
	HEAVY_WEAPS_OT,
	AUTO_WEAPS_OT,
	STEALTHY_OT,
	AMBIDEXT_OT,
	THIEF_OT,
	MARTIALARTS_OT,
	KNIFING_OT,
	PROF_SNIPER_OT,
	CAMOUFLAGED_OT,
	// SANDRO - I dared to remove these for it is really useless,
	//   with the camo removing/repainting feature you only need the basic camouflage trait anyway
	//CAMOUFLAGED_URBAN,
	//CAMOUFLAGED_DESERT,
	//CAMOUFLAGED_SNOW,
	EXPERT,
	NUM_SKILLTRAITS_OT
} SkillTrait;

//////////////////////////////////////////////////////////////////////
// SANDRO - the list for new traits
typedef enum
{
	NO_SKILLTRAIT_NT = 0,
	// MAJOR TRAITS
	AUTO_WEAPONS_NT, // 1
	HEAVY_WEAPONS_NT, // 2
	SNIPER_NT, // 3
	RANGER_NT, // 4
	GUNSLINGER_NT, // 5
	MARTIAL_ARTS_NT, // 6
	SQUADLEADER_NT, // 7
	TECHNICIAN_NT, // 8
	DOCTOR_NT, // 9
	// MINOR TRAITS
	AMBIDEXTROUS_NT, // 10
	MELEE_NT, // 11
	THROWING_NT, // 12
	NIGHT_OPS_NT, // 13
	STEALTHY_NT, // 14
	ATHLETICS_NT, // 15
	BODYBUILDING_NT, // 16
	DEMOLITIONS_NT, // 17
	TEACHING_NT, // 18
	SCOUTING_NT, // 19

	// Flugente: new traits have to go here, even if they are major traits, as otherwise the existing traits in profiles get mixed up
	COVERT_NT, // 20	// a major trait
	RADIO_OPERATOR_NT, //21		// a minor trait
	SNITCH_NT, //22		// a minor trait 
	SURVIVAL_NT, //23	// a minor trait

	NUM_SKILLTRAITS_NT
} SkillTraitNew;

#define NUM_MAJOR_TRAITS 10
#define NUM_MINOR_TRAITS 13

#define NUM_ORIGINAL_MAJOR_TRAITS 9

// Flugente: I've had it with this hardcoding madness. Without this, adding or removing a new trait would crash anything related to a bubblehelp display of traits
// always check every use of these enums and every use of the skill-strings if you add a new trait
#define NEWTRAIT_MERCSKILL_EXPERTOFFSET	(NUM_MAJOR_TRAITS + NUM_MINOR_TRAITS)
#define NEWTRAIT_MERCSKILL_OFFSET_ALL	(NEWTRAIT_MERCSKILL_EXPERTOFFSET + NUM_MAJOR_TRAITS)

// Flugente: these aren't really traits, but it is convenient to pretend so
#define INTEL	(2 * NEWTRAIT_MERCSKILL_EXPERTOFFSET + 2)
#define DISGUISE		(INTEL + 1)
#define VARIOUSSKILLS	(DISGUISE + 1)
// sevenfm: add autobandage to skills menu
#define AUTOBANDAGESKILLS (VARIOUSSKILLS + 1)

// SANDRO - new set of character traits
typedef enum
{
	CHAR_TRAIT_NORMAL = 0,
	CHAR_TRAIT_SOCIABLE,
	CHAR_TRAIT_LONER,
	CHAR_TRAIT_OPTIMIST,
	CHAR_TRAIT_ASSERTIVE,
	CHAR_TRAIT_INTELLECTUAL,
	CHAR_TRAIT_PRIMITIVE,
	CHAR_TRAIT_AGGRESSIVE,
	CHAR_TRAIT_PHLEGMATIC,
	CHAR_TRAIT_DAUNTLESS,
	CHAR_TRAIT_PACIFIST,
	CHAR_TRAIT_MALICIOUS,
	CHAR_TRAIT_SHOWOFF,
	CHAR_TRAIT_COWARD,
	NUM_CHAR_TRAITS
} CharacterTraits;

// SANDRO - appearances
typedef enum
{
	APPEARANCE_AVERAGE = 0,
	APPEARANCE_UGLY,
	APPEARANCE_HOMELY,
	APPEARANCE_ATTRACTIVE,
	APPEARANCE_BABE,
	NUM_APPEARANCES
} Appearances;

// Flugente - care levels
typedef enum
{
	CARELEVEL_NONE = 0,
	CARELEVEL_SOME = 1,
	CARELEVEL_EXTREME = 2,

	NUM_CARELEVELS
} CareLevels;

// Flugente - refinements
typedef enum
{
	REFINEMENT_AVERAGE = 0,
	REFINEMENT_SLOB = 1,
	REFINEMENT_SNOB = 2,

	NUM_REFINEMENT
} Refinements;

// Flugente - nationalities
typedef enum
{
	// old Sirtech values
	AMERICAN_NAT = 0,		// take that, Murica! Sirtech knew you have no value :-)
	ARAB_NAT = 1,          
	AUSTRALIAN_NAT = 2,
	BRITISH_NAT = 3,
	CANADIAN_NAT = 4,
	CUBAN_NAT = 5,
	DANISH_NAT = 6,
	FRENCH_NAT = 7,
	RUSSIAN_NAT = 8,       // kitty: changed 9 from nigerian (moved down) to traconian (UB takes place in Tracona)
	TRACONIAN_NAT = 9,	   // this was simply not defined in original data (I did not find any country), but we can't have any holes in here, so just invented soemthing
	SWISS_NAT = 10,
	JAMAICAN_NAT = 11,
	POLISH_NAT = 12,
	CHINESE_NAT = 13,
	IRISH_NAT = 14,
	SOUTH_AFRICAN_NAT = 15,
	HUNGARIAN_NAT = 16,
	SCOTTISH_NAT = 17,
	ARULCAN_NAT = 18,
	GERMAN_NAT = 19,
	AFRICAN_NAT = 20,   
	ITALIAN_NAT = 21,
	DUTCH_NAT = 22,
	ROMANIAN_NAT = 23,
	METAVIRAN_NAT = 24,

	// new values, because why not
	// kitty:
	// added a few more and removed some, hoping to achieve a decent amount from every inhabited continent (plus one, in the 90's, relatively well-known fictional one)
	// 0-24 original ja2 nationalities (except 9, see there)
	// sorted non-original ones in (english) alphabetic order for some more ease of use during IMP creation
	AFGHAN_NAT,       // 25 
	ALBANIAN_NAT,
	ARGENTINIAN_NAT,
	ARMENIAN_NAT,
	AZERBAIJANI_NAT,
	BANGLADESHI_NAT,  // 30
	BELARUSIAN_NAT,
	BELGIAN_NAT,     
	BENINESE_NAT,
	BOLIVIAN_NAT,
	BOSNIAN_NAT,      // 35
	BRASILIAN_NAT,
	BULGARIAN_NAT,
	CAMBODIAN_NAT,
	CHADIAN_NAT,
	CHILEAN_NAT,      // 40
	COLUMBIAN_NAT,
	CONGOLESE_NAT,
	CROATIAN_NAT,
	ECUADORIAN_NAT,
	EGYPTIAN_NAT,     // 45 
	ENGLISH_NAT,    
	ERITREAN_NAT,
	ESTONIAN_NAT,
	ETHIOPIAN_NAT,
	FILIPINO_NAT,     // 50
	FINNISH_NAT,  
	GEORGIAN_NAT,
	GREEK_NAT,
	GUATEMALAN_NAT,
	HAITIAN_NAT,      // 55
	HONDURAN_NAT, 
	INDIAN_NAT,
	INDONESIAN_NAT,
	IRANIAN_NAT,
	IRAQI_NAT,        // 60
	ISLANDIC_NAT, 
	ISRAELI_NAT,
	JAPANESE_NAT,
	JORDANIAN_NAT,
	KAZAKHSTANI_NAT,  // 65
	KOREAN_NAT,    
	KYRGYZSTANI_NAT,
	LAOTIAN_NAT,
	LATVIAN_NAT,
	LEBANESE_NAT,     // 70
	LITHUANIAN_NAT, 
	LYBIAN_NAT,
	MACEDONIAN_NAT,
	MALAYSIAN_NAT,
	MEXICAN_NAT,      // 75
	MONGOLIAN_NAT,
	MOROCCAN_NAT,
	MOZAMBICAN_NAT,
	MYANMA_NAT,
	NAMIBIAN_NAT,     // 80
	NICARAGUAN_NAT,
	NIGERIAN_NAT,      
	NIGERIEN_NAT,     
	NORWEGIAN_NAT,
	PAKISTANI_NAT,    // 85
	PANAMANIAN_NAT,
	PORTOGUESE_NAT,
	RWANDANESE_NAT,
	SALVADORAN_NAT,
	SAUDI_NAT,        // 90
	SERBIAN_NAT,
	SLOVAKIAN_NAT,
	SLOVENIAN_NAT,
	SOMALI_NAT,
	SPANISH_NAT,      // 95
	SUDANESE_NAT,
	SWEDISH_NAT,
	SYRIAN_NAT,
	THAI_NAT,
	TOGOLESE_NAT,     // 100
	TUNISIAN_NAT,
	TURKISH_NAT,
	UGANDAN_NAT,
	UKRAINIAN_NAT,
	URUGUAYAN_NAT,    // 105
	UZBEKISTANI_NAT,
	VENEZUELAN_NAT,
	VIETNAMESE_NAT,
	WELSH_NAT,
	YEMENI_NAT,       // 110
	ZAMUNDAN_NAT,     // Zamunda 
	ZIMBABWEAN_NAT,

	NUM_NATIONALITIES
} Nationalities;

// Flugente - races
typedef enum
{
	WHITE = 0,
	BLACK = 1,
	ASIAN = 2,
	ESKIMO = 3,
	HISPANIC = 4,

	NUM_RACES
} Races;

// Flugente - racist levels
typedef enum
{
	RACIST_NONE = 0,
	RACIST_SOME = 1,
	RACIST_VERY = 2,

	NUM_RACIST
} RacistLevels;

// Flugente: dynamic opinons: number of profile flagmasks
#define OPINION_FLAGMASKS_NUMBER	6

//////////////////////////////////////////////////////////////////////

typedef enum
{
	NO_DISABILITY = 0,
	HEAT_INTOLERANT,
	NERVOUS,
	CLAUSTROPHOBIC,
	NONSWIMMER,
	FEAR_OF_INSECTS,
	FORGETFUL,
	PSYCHO,
	// Flugente: more disabilities
	DEAF,
	SHORTSIGHTED,
	HEMOPHILIAC,
	AFRAID_OF_HEIGHTS,
	SELF_HARM,

	NUM_DISABILITIES
} PersonalityTrait;

#define NERVOUS_RADIUS 10

typedef enum
{
	ATT_NORMAL = 0,
	ATT_FRIENDLY,
	ATT_LONER,
	ATT_OPTIMIST,
	ATT_PESSIMIST,
	ATT_AGGRESSIVE,
	ATT_ARROGANT,
	ATT_BIG_SHOT,
	ATT_ASSHOLE,
	ATT_COWARD,
	NUM_ATTITUDES
} Attitudes;

typedef enum
{
	MALE = 0,
	FEMALE
} Sexes;

typedef enum
{
	NOT_SEXIST = 0,
	SOMEWHAT_SEXIST,
	VERY_SEXIST,
	GENTLEMAN,
	NUM_SEXIST
} SexistLevels;

// rftr: removed the CharacterEvolution enum as it was replaced by growth modifiers

#define BUDDY_MERC( prof, bud ) ((prof)->bBuddy[0] == (bud) || (prof)->bBuddy[1] == (bud) || (prof)->bBuddy[2] == (bud) || (prof)->bBuddy[3] == (bud) || (prof)->bBuddy[4] == (bud) || ( (prof)->bLearnToLike == (bud) && (prof)->bLearnToLikeCount == 0 ) )
#define HATED_MERC( prof, hat ) ((prof)->bHated[0] == (hat) || (prof)->bHated[1] == (hat) || (prof)->bHated[2] == (hat) || (prof)->bHated[3] == (hat) || (prof)->bHated[4] == (hat) || ( (prof)->bLearnToHate == (hat) && (prof)->bLearnToHateCount == 0 ) )

#define BUDDY_OPINION +25
#define HATED_OPINION -25

///////////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - Let's add a nice new struct for records, as there are just too many of them 
class STRUCT_Records 
{
public:

	UINT16	usKillsElites;
	UINT16	usKillsRegulars;
	UINT16	usKillsAdmins;
	UINT16  usKillsHostiles;
	UINT16	usKillsCreatures;
	UINT16  usKillsZombies;
	UINT16	usKillsTanks;
	UINT16	usKillsOthers;

	UINT16	usAssistsMercs;
	UINT16	usAssistsMilitia;
	UINT16	usAssistsOthers;

	UINT16	usShotsFired;
	UINT16  usMissilesLaunched;
	UINT16  usGrenadesThrown;
	UINT16  usKnivesThrown;
	UINT16  usBladeAttacks;
	UINT16  usHtHAttacks;
	UINT16	usShotsHit;

	UINT16	usBattlesTactical;
	UINT16	usBattlesAutoresolve;
	UINT16	usBattlesRetreated;
	UINT16  usAmbushesExperienced;
	UINT16	usLargestBattleFought;

	UINT16	usTimesWoundedShot;
	UINT16	usTimesWoundedStabbed;
	UINT16	usTimesWoundedPunched;
	UINT16	usTimesWoundedBlasted;
	UINT16	usTimesStatDamaged;
	UINT16	usTimesSurgeryUndergoed;
	UINT16	usFacilityAccidents;
	
	UINT16	usLocksPicked;
	UINT16	usLocksBreached;
	UINT16	usTrapsRemoved;
	UINT16	usExpDetonated;
	UINT16	usItemsRepaired;
	UINT16	usItemsCombined;
	UINT16  usItemsStolen;
	UINT16	usMercsBandaged;
	UINT16	usSurgeriesMade;
	UINT16  usMilitiaTrained;
	UINT16	usNPCsDiscovered;
	UINT16	usSectorsDiscovered;
	UINT8   ubQuestsHandled;
	
	UINT16  usInterrogations;
	UINT32  usDamageTaken;
	UINT32  usDamageDealt;
	UINT16  usTimesInfected;
	UINT16	zFiller7;
	UINT32  usPointsHealed;		// we store the healed hundreth, because we can

}; // RECORDS
//////////////////////////////////////////////////////////////////////////////

#define mNameLength 80
#define mGearKitNameLength 80

// CHRISL: Class to handle profile equipment from XML_MercStartingGear
class MERCPROFILEGEAR {
public:
	// Constructor
	MERCPROFILEGEAR();
	// Assignment operator
	MERCPROFILEGEAR& operator=(const MERCPROFILEGEAR&);
	// Copy constructor
	MERCPROFILEGEAR(const MERCPROFILEGEAR& src);
	// Destructor
	~MERCPROFILEGEAR();

	// Initialize the mercenary profile gear
	void initialize();

	//  Note that the constructor does this automatically.
	void clearInventory();
public:
	UINT16		mIndex;
	INT16		PriceModifier;
	INT16		AbsolutePrice;
	CHAR16		mGearKitName[mGearKitNameLength];
	CHAR8		mName[mNameLength];
	char		endOfPOD;	// marker for end of POD (plain old data)
	std::vector<int>	inv;
	std::vector<int>	iStatus;
	std::vector<int>	iDrop;
	std::vector<int>	iNumber;
	std::vector<int>	lbe;
	std::vector<int>	lStatus;
private:
	int			invCnt;
	int			lbeCnt;
};
#define SIZEOF_MERCPROFILEGEAR_POD offsetof( MERCPROFILEGEAR, endOfPOD )

class OLD_MERCPROFILESTRUCT_101
{
public:
	// Constructor
	OLD_MERCPROFILESTRUCT_101();
	CHAR16	zName[ NAME_LENGTH ];
	CHAR16	zNickname[ NICKNAME_LENGTH ];
	UINT32	uiAttnSound;
	UINT32	uiCurseSound;
	UINT32	uiDieSound;
	UINT32	uiGoodSound;
	UINT32	uiGruntSound;
	UINT32	uiGrunt2Sound;
	UINT32	uiOkSound;
	UINT8		ubFaceIndex;
	PaletteRepID		PANTS;
	PaletteRepID		VEST;
	PaletteRepID		SKIN;
	PaletteRepID		HAIR;
	INT8		bSex;
	INT8		bArmourAttractiveness;
	UINT8		ubMiscFlags2;
	INT8		bEvolution;
	UINT8		ubMiscFlags;
	UINT8		bSexist;
	UINT8		bLearnToHate;

	// skills
	INT8		bStealRate;
	INT8		bVocalVolume;
	UINT8		ubQuoteRecord;
	INT8		bDeathRate;
	INT8		bScientific;

	INT16		sExpLevelGain;
	INT16		sLifeGain;
	INT16		sAgilityGain;
	INT16		sDexterityGain;
	INT16		sWisdomGain;
	INT16		sMarksmanshipGain;
	INT16		sMedicalGain;
	INT16		sMechanicGain;
	INT16		sExplosivesGain;

	UINT8		ubBodyType;
	INT8		bMedical;

	UINT16	usEyesX;
	UINT16	usEyesY;
	UINT16	usMouthX;
	UINT16	usMouthY;
	UINT32	uiEyeDelay;
	UINT32	uiMouthDelay;
	UINT32	uiBlinkFrequency;
	UINT32	uiExpressionFrequency;
	UINT16	sSectorX;
	UINT16	sSectorY;

	UINT32	uiDayBecomesAvailable;			//day the merc will be available.	used with the bMercStatus

	INT8		bStrength;

	INT8		bLifeMax;
	INT8		bExpLevelDelta;
	INT8		bLifeDelta;
	INT8		bAgilityDelta;
	INT8		bDexterityDelta;
	INT8		bWisdomDelta;
	INT8		bMarksmanshipDelta;
	INT8		bMedicalDelta;
	INT8		bMechanicDelta;
	INT8		bExplosivesDelta;
	INT8	bStrengthDelta;
	INT8	bLeadershipDelta;
	UINT16	usKills;
	UINT16	usAssists;
	UINT16	usShotsFired;
	UINT16	usShotsHit;
	UINT16	usBattlesFought;
	UINT16	usTimesWounded;
	UINT16	usTotalDaysServed;

	INT16		sLeadershipGain;
	INT16		sStrengthGain;



	// BODY TYPE SUBSITUTIONS
	UINT32	uiBodyTypeSubFlags;

	INT16	sSalary;
	INT8	bLife;
	INT8		bDexterity;		// dexterity (hand coord) value
	INT8	bDisability;
	INT8	bSkillTrait;

	INT8	bReputationTolerance;
	INT8	bExplosive;
	INT8	bSkillTrait2;
	INT8	bLeadership;

	INT8	bBuddy[5];
	INT8	bHated[5];
	INT8	bExpLevel;		// general experience level

	INT8	bMarksmanship;
	UINT8	bMinService;
	INT8	bWisdom;
	UINT8	bResigned;
	UINT8	bActive;

	UINT8	DO_NOT_USE_bInvStatus[OldInventory::NUM_INV_SLOTS];
	UINT8	DO_NOT_USE_bInvNumber[OldInventory::NUM_INV_SLOTS];
	UINT16 usApproachFactor[4];

	INT8	bMainGunAttractiveness;
	INT8		bAgility;			// agility (speed) value

	BOOLEAN	fUseProfileInsertionInfo;				// Set to various flags, ( contained in TacticalSave.h )
	INT16		sGridNo;												// The Gridno the NPC was in before leaving the sector
	UINT8		ubQuoteActionID;
	INT8		bMechanical;

	UINT8	ubInvUndroppable;
	UINT8	ubRoomRangeStart[2];
	UINT16 DO_NOT_USE_inv[OldInventory::NUM_INV_SLOTS];
	INT8 bMercTownReputation[ 20 ];

	UINT16 usStatChangeChances[ 12 ];		// used strictly for balancing, never shown!
	UINT16 usStatChangeSuccesses[ 12 ];	// used strictly for balancing, never shown!

	UINT8	ubStrategicInsertionCode;

	UINT8	ubRoomRangeEnd[2];

	INT8 bPadding[ 4 ];

	UINT8 ubLastQuoteSaid;
	
	INT8 bRace;
	INT8 bNationality;
	INT8 bAppearance;
	INT8 bAppearanceCareLevel;
	INT8 bRefinement;
	INT8 bRefinementCareLevel;
	INT8 bHatedNationality;
	INT8 bHatedNationalityCareLevel;
	INT8 bRacist;
	UINT32 uiWeeklySalary;
	UINT32 uiBiWeeklySalary;
	INT8 bMedicalDeposit;
	INT8 bAttitude;
	INT8 bBaseMorale;
	UINT16 sMedicalDepositAmount;
	
	UINT8 bLearnToLike;
	UINT8 ubApproachVal[4];
	UINT8 ubApproachMod[3][4];
	INT8 bTown;
	INT8 bTownAttachment;
	UINT16 usOptionalGearCost;
	
	INT8 bMercOpinion[NUMBER_OF_OPINIONS_OLD];	// Flugente: old value has to be kept for compatibility. Do not change, or you'll be in a world of pain

	INT8 bApproached;
	INT8 bMercStatus;								//The status of the merc.	If negative, see flags at the top of this file.	Positive:	The number of days the merc is away for.	0:	Not hired but ready to be.
	INT8 bHatedTime[5];
	INT8 bLearnToLikeTime;
	INT8 bLearnToHateTime;
	INT8 bHatedCount[5];
	INT8 bLearnToLikeCount;
	INT8 bLearnToHateCount;
	UINT8 ubLastDateSpokenTo;
	UINT8 bLastQuoteSaidWasSpecial;
	INT8	bSectorZ;
	UINT16 usStrategicInsertionData;
	INT8 bFriendlyOrDirectDefaultResponseUsedRecently;
	INT8 bRecruitDefaultResponseUsedRecently;
	INT8 bThreatenDefaultResponseUsedRecently;
	INT8 bNPCData;			// NPC specific
	INT32	iBalance;
	INT16 sTrueSalary; // for use when the person is working for us for free but has a positive salary value
	UINT8	ubCivilianGroup;
	UINT8	ubNeedForSleep;
	UINT32	uiMoney;
	INT8	bNPCData2;		// NPC specific

	UINT8	ubMiscFlags3;

	UINT8 ubDaysOfMoraleHangover;		// used only when merc leaves team while having poor morale
	UINT8	ubNumTimesDrugUseInLifetime;		// The # times a drug has been used in the player's lifetime...

	// Flags used for the precedent to repeating oneself in Contract negotiations.	Used for quote 80 -	~107.	Gets reset every day
	UINT32	uiPrecedentQuoteSaid;
	UINT32	uiProfileChecksum;
	INT16		sPreCombatGridNo;
	UINT8		ubTimeTillNextHatedComplaint;
	UINT8		ubSuspiciousDeath;

	INT32	iMercMercContractLength;		//Used for MERC mercs, specifies how many days the merc has gone since last page

	UINT32	uiTotalCostToDate;			// The total amount of money that has been paid to the merc for their salary
	UINT8		ubBuffer[4];

	//
	// 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)
};
#define SIZEOF_OLD_MERCPROFILESTRUCT_101_POD offsetof( OLD_MERCPROFILESTRUCT_101, endOfPOD )

class MERCPROFILESTRUCT {
public:
	// Constructor
	MERCPROFILESTRUCT();
	// Copy Constructor
	MERCPROFILESTRUCT(const MERCPROFILESTRUCT&);
	// Conversion operator
	MERCPROFILESTRUCT& operator=(const OLD_MERCPROFILESTRUCT_101& src);
	// Assignment operator
	MERCPROFILESTRUCT& operator=(const MERCPROFILESTRUCT&);
	// Destructor
	~MERCPROFILESTRUCT();

	void	CopyOldInventoryToNew(const OLD_MERCPROFILESTRUCT_101& src);
	// Changed by ADB, rev 1513
	//BOOLEAN Load(HWFILE hFile, bool forceLoadOldVersion);
	BOOLEAN Load(HWFILE hFile, bool forceLoadOldVersion, bool forceLoadOldEncryption, bool wasSavedWithEncryption);
	BOOLEAN Save(HWFILE hFile);
	UINT32	GetChecksum();

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

	// Clear out the mercenary profile's invetory
	//	Use this instead of the old method of calling memset.
	//	Note that the constructor does this automatically.
	void clearInventory();

	// Note: Place all non-POD items at the end (after endOfPOD)
	// The format of this structure affects what is written into and read from various
	// files (maps, save files, etc.).	If you change it then that code will not work 
	// properly until it is all fixed and the files updated.
public:
	CHAR16	zName[ NAME_LENGTH ];
	CHAR16	zNickname[ NICKNAME_LENGTH ];
	UINT32	uiAttnSound;
	UINT32	uiCurseSound;
	UINT32	uiDieSound;
	UINT32	uiGoodSound;
	UINT32	uiGruntSound;
	UINT32	uiGrunt2Sound;
	UINT32	uiOkSound;
	UINT8		ubFaceIndex;
	PaletteRepID		PANTS;
	PaletteRepID		VEST;
	PaletteRepID		SKIN;
	PaletteRepID		HAIR;
	INT8		bSex;
	INT8		bArmourAttractiveness;
	UINT8		ubMiscFlags2;
	BOOLEAN		fRegresses;
	UINT8		ubMiscFlags;
	UINT8		bSexist;
	UINT8		bLearnToHate;

	// skills
	INT8		bStealRate;
	INT8		bVocalVolume;
	UINT8		ubQuoteRecord;
	INT8		bDeathRate;
	INT8		bScientific;

	INT16		sExpLevelGain;
	INT16		sLifeGain;
	INT16		sAgilityGain;
	INT16		sDexterityGain;
	INT16		sWisdomGain;
	INT16		sMarksmanshipGain;
	INT16		sMedicalGain;
	INT16		sMechanicGain;
	INT16		sExplosivesGain;

	UINT8		ubBodyType;
	INT8		bMedical;

	UINT16	usEyesX;
	UINT16	usEyesY;
	UINT16	usMouthX;
	UINT16	usMouthY;
	UINT32	uiEyeDelay;
	UINT32	uiMouthDelay;
	UINT32	uiBlinkFrequency;
	UINT32	uiExpressionFrequency;
	UINT16	sSectorX;
	UINT16	sSectorY;

	UINT32	uiDayBecomesAvailable;			//day the merc will be available.	used with the bMercStatus

	INT8		bStrength;

	INT8		bLifeMax;
	INT8		bExpLevelDelta;
	INT8		bLifeDelta;
	INT8		bAgilityDelta;
	INT8		bDexterityDelta;
	INT8		bWisdomDelta;
	INT8		bMarksmanshipDelta;
	INT8		bMedicalDelta;
	INT8		bMechanicDelta;
	INT8		bExplosivesDelta;
	INT8	bStrengthDelta;
	INT8	bLeadershipDelta;
	/////////////////////////////////////////////////////////////
	// SANDRO - converted to it's own structure
	//UINT16	usKills;
	//UINT16	usAssists;
	//UINT16	usShotsFired;
	//UINT16	usShotsHit;
	//UINT16	usBattlesFought;
	//UINT16	usTimesWounded;
	/////////////////////////////////////////////////////////////

	UINT16	usTotalDaysServed;

	INT16		sLeadershipGain;
	INT16		sStrengthGain;



	// BODY TYPE SUBSITUTIONS
	UINT32	uiBodyTypeSubFlags;

	INT16	sSalary;
	INT8	bLife;
	INT8		bDexterity;		// dexterity (hand coord) value
	INT8	bDisability;
	INT8	bSkillTraits[30];

	INT8	bReputationTolerance;
	INT8	bExplosive;
	//INT8	bSkillTrait2;
	//INT8	bSkillTrait3; // added by SANDRO
	INT8	bLeadership;

	UINT8	bBuddy[5];
	UINT8	bHated[5];
	INT8	bExpLevel;		// general experience level

	INT8	bMarksmanship;
	UINT8	bMinService;
	INT8	bWisdom;
	UINT8	bResigned;
	UINT8	bActive;

	UINT16 usApproachFactor[4];

	INT8	bMainGunAttractiveness;
	INT8		bAgility;			// agility (speed) value

	BOOLEAN	fUseProfileInsertionInfo;				// Set to various flags, ( contained in TacticalSave.h )
//	INT16		sGridNo;												// The Gridno the NPC was in before leaving the sector
	INT16 _old_sGridNo;				// WANNE - BMP: DONE! (Structure)						// The Gridno the NPC was in before leaving the sector
	UINT8		ubQuoteActionID;
	INT8		bMechanical;

	UINT8	ubInvUndroppable;
	//DBrot: More Rooms
	//UINT8	ubRoomRangeStart[2];
	UINT16 usRoomRangeStart[2];
	INT8 bMercTownReputation[ 20 ];

	UINT16 usStatChangeChances[ 12 ];		// used strictly for balancing, never shown!
	UINT16 usStatChangeSuccesses[ 12 ];	// used strictly for balancing, never shown!

	UINT8	ubStrategicInsertionCode;

	//UINT8	ubRoomRangeEnd[2];
	UINT16 usRoomRangeEnd[2];

	UINT8 ubLastQuoteSaid;
	
	INT8 bRace;
	INT8 bNationality;
	INT8 bAppearance;
	INT8 bAppearanceCareLevel;
	INT8 bRefinement;
	INT8 bRefinementCareLevel;
	INT8 bHatedNationality;
	INT8 bHatedNationalityCareLevel;
	INT8 bRacist;
	UINT32 uiWeeklySalary;
	UINT32 uiBiWeeklySalary;
	INT8 bMedicalDeposit;
	INT8 bAttitude;
	INT8 bCharacterTrait; // added by SANDRO
	INT8 bBaseMorale;
	UINT16 sMedicalDepositAmount;
	
	UINT8 bLearnToLike;
	UINT8 ubApproachVal[4];
	UINT8 ubApproachMod[3][4];
	INT8 bTown;
	INT8 bTownAttachment;
	UINT16 usOptionalGearCost;
	INT8 bMercOpinion[NUMBER_OF_OPINIONS];
	INT8 bApproached;
	INT8 bMercStatus;								//The status of the merc.	If negative, see flags at the top of this file.	Positive:	The number of days the merc is away for.	0:	Not hired but ready to be.
	INT8 bHatedTime[5];
	INT8 bLearnToLikeTime;
	INT8 bLearnToHateTime;
	INT8 bHatedCount[5];
	INT8 bLearnToLikeCount;
	INT8 bLearnToHateCount;
	UINT8 ubLastDateSpokenTo;
	UINT8 bLastQuoteSaidWasSpecial;
	INT8	bSectorZ;
	UINT32 usStrategicInsertionData;
	INT8 bFriendlyOrDirectDefaultResponseUsedRecently;
	INT8 bRecruitDefaultResponseUsedRecently;
	INT8 bThreatenDefaultResponseUsedRecently;
	INT8 bNPCData;			// NPC specific
	INT32	iBalance;
	INT16 sTrueSalary; // for use when the person is working for us for free but has a positive salary value
	UINT8	ubCivilianGroup;
	UINT8	ubNeedForSleep;
	UINT32	uiMoney;
	INT8	bNPCData2;		// NPC specific

	UINT8	ubMiscFlags3;

	UINT8 ubDaysOfMoraleHangover;		// used only when merc leaves team while having poor morale
	UINT8	ubNumTimesDrugUseInLifetime;		// The # times a drug has been used in the player's lifetime...

	// Flags used for the precedent to repeating oneself in Contract negotiations.	Used for quote 80 -	~107.	Gets reset every day
	UINT32	uiPrecedentQuoteSaid;
	UINT32	uiProfileChecksum;
//	INT16		sPreCombatGridNo;
	INT16		_old_sPreCombatGridNo;		// WANNE - BMP: DONE! (Structure)
	UINT8		ubTimeTillNextHatedComplaint;
	UINT8		ubSuspiciousDeath;

	INT32	iMercMercContractLength;		//Used for MERC mercs, specifies how many days the merc has gone since last page

	UINT32	uiTotalCostToDate;			// The total amount of money that has been paid to the merc for their salary

	//SB: extended fields
	INT32	sGridNo;			// WANNE - BMP: DONE! (Structure)
	INT32	sPreCombatGridNo;	// WANNE - BMO: DONE! (Structure)
	//
	// 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)

	std::vector<int>	inv;
	std::vector<int>	bInvStatus;
	std::vector<int>	bInvNumber;

	// SANDRO - merc records
	STRUCT_Records		records;

	// Flugente: background
	UINT16 usBackground;

	// anv: for snitches, remember if he was exposed and by how many people (could be used for covert purposes too)
	//UINT8	ubExposedInSector[MAP_WORLD_X * MAP_WORLD_Y];

	// anv: simplified ubExposedInSector, hours until snitch can go undercover after exposition
	UINT8 ubSnitchExposedCooldown;

	// Flugente: flagmasks for dynamic opinions on each and every other person. Yes, this is significant in size
	UINT32 usDynamicOpinionFlagmask[NUM_PROFILES][OPINION_FLAGMASKS_NUMBER];

	INT8	sDynamicOpinionLongTerm[NUM_PROFILES];

	// Flugente: voice set used
	UINT32 usVoiceIndex;

	// Flugente: type of profile
	UINT32 Type;

	// rftr: growth modifiers - ignored if fRegresses is TRUE
	INT16 bGrowthModifierLife;
	INT16 bGrowthModifierStrength;
	INT16 bGrowthModifierAgility;
	INT16 bGrowthModifierDexterity;
	INT16 bGrowthModifierWisdom;
	INT16 bGrowthModifierMarksmanship;
	INT16 bGrowthModifierExplosive;
	INT16 bGrowthModifierLeadership;
	INT16 bGrowthModifierMedical;
	INT16 bGrowthModifierMechanical;
	INT16 bGrowthModifierExpLevel;
}; // MERCPROFILESTRUCT;

// WANNE - BMP: DONE!
class _OLD_MERCPROFILESTRUCT {
public:
	CHAR16	zName[ NAME_LENGTH ];
	CHAR16	zNickname[ NICKNAME_LENGTH ];
	UINT32	uiAttnSound;
	UINT32	uiCurseSound;
	UINT32	uiDieSound;
	UINT32	uiGoodSound;
	UINT32	uiGruntSound;
	UINT32	uiGrunt2Sound;
	UINT32	uiOkSound;
	UINT8		ubFaceIndex;
	PaletteRepID		PANTS;
	PaletteRepID		VEST;
	PaletteRepID		SKIN;
	PaletteRepID		HAIR;
	INT8		bSex;
	INT8		bArmourAttractiveness;
	UINT8		ubMiscFlags2;
	INT8		bEvolution;
	UINT8		ubMiscFlags;
	UINT8		bSexist;
	INT8		bLearnToHate;

	// skills
	INT8		bStealRate;
	INT8		bVocalVolume;
	UINT8		ubQuoteRecord;
	INT8		bDeathRate;
	INT8		bScientific;

	INT16		sExpLevelGain;
	INT16		sLifeGain;
	INT16		sAgilityGain;
	INT16		sDexterityGain;
	INT16		sWisdomGain;
	INT16		sMarksmanshipGain;
	INT16		sMedicalGain;
	INT16		sMechanicGain;
	INT16		sExplosivesGain;

	UINT8		ubBodyType;
	INT8		bMedical;

	UINT16	usEyesX;
	UINT16	usEyesY;
	UINT16	usMouthX;
	UINT16	usMouthY;
	UINT32	uiEyeDelay;
	UINT32	uiMouthDelay;
	UINT32	uiBlinkFrequency;
	UINT32	uiExpressionFrequency;
	UINT16	sSectorX;
	UINT16	sSectorY;

	UINT32	uiDayBecomesAvailable;			//day the merc will be available.	used with the bMercStatus

	INT8		bStrength;

	INT8		bLifeMax;
	INT8		bExpLevelDelta;
	INT8		bLifeDelta;
	INT8		bAgilityDelta;
	INT8		bDexterityDelta;
	INT8		bWisdomDelta;
	INT8		bMarksmanshipDelta;
	INT8		bMedicalDelta;
	INT8		bMechanicDelta;
	INT8		bExplosivesDelta;
	INT8	bStrengthDelta;
	INT8	bLeadershipDelta;
	UINT16	usKills;
	UINT16	usAssists;
	UINT16	usShotsFired;
	UINT16	usShotsHit;
	UINT16	usBattlesFought;
	UINT16	usTimesWounded;
	UINT16	usTotalDaysServed;

	INT16		sLeadershipGain;
	INT16		sStrengthGain;



	// BODY TYPE SUBSITUTIONS
	UINT32	uiBodyTypeSubFlags;

	INT16	sSalary;
	INT8	bLife;
	INT8		bDexterity;		// dexterity (hand coord) value
	INT8	bDisability;
	INT8	bSkillTrait;

	INT8	bReputationTolerance;
	INT8	bExplosive;
	INT8	bSkillTrait2;
	INT8	bLeadership;

	INT8	bBuddy[5];
	INT8	bHated[5];
	INT8	bExpLevel;		// general experience level

	INT8	bMarksmanship;
	UINT8	bMinService;
	INT8	bWisdom;
	UINT8	bResigned;
	UINT8	bActive;

	UINT16 usApproachFactor[4];

	INT8	bMainGunAttractiveness;
	INT8		bAgility;			// agility (speed) value

	BOOLEAN	fUseProfileInsertionInfo;				// Set to various flags, ( contained in TacticalSave.h )
	INT16		sGridNo;												// The Gridno the NPC was in before leaving the sector
	UINT8		ubQuoteActionID;
	INT8		bMechanical;

	UINT8	ubInvUndroppable;
	UINT8	ubRoomRangeStart[2];
	INT8 bMercTownReputation[ 20 ];

	UINT16 usStatChangeChances[ 12 ];		// used strictly for balancing, never shown!
	UINT16 usStatChangeSuccesses[ 12 ];	// used strictly for balancing, never shown!

	UINT8	ubStrategicInsertionCode;

	UINT8	ubRoomRangeEnd[2];

	UINT8 ubLastQuoteSaid;
	
	INT8 bRace;
	INT8 bNationality;
	INT8 bAppearance;
	INT8 bAppearanceCareLevel;
	INT8 bRefinement;
	INT8 bRefinementCareLevel;
	INT8 bHatedNationality;
	INT8 bHatedNationalityCareLevel;
	INT8 bRacist;
	UINT32 uiWeeklySalary;
	UINT32 uiBiWeeklySalary;
	INT8 bMedicalDeposit;
	INT8 bAttitude;
	INT8 bBaseMorale;
	UINT16 sMedicalDepositAmount;
	
	INT8 bLearnToLike;
	UINT8 ubApproachVal[4];
	UINT8 ubApproachMod[3][4];
	INT8 bTown;
	INT8 bTownAttachment;
	UINT16 usOptionalGearCost;
	
	INT8 bMercOpinion[NUMBER_OF_OPINIONS_OLD];	// Flugente: old value has to be kept for compatibility. Do not change, or you'll be in a world of pain

	INT8 bApproached;
	INT8 bMercStatus;								//The status of the merc.	If negative, see flags at the top of this file.	Positive:	The number of days the merc is away for.	0:	Not hired but ready to be.
	INT8 bHatedTime[5];
	INT8 bLearnToLikeTime;
	INT8 bLearnToHateTime;
	INT8 bHatedCount[5];
	INT8 bLearnToLikeCount;
	INT8 bLearnToHateCount;
	UINT8 ubLastDateSpokenTo;
	UINT8 bLastQuoteSaidWasSpecial;
	INT8	bSectorZ;
	UINT16 usStrategicInsertionData;
	INT8 bFriendlyOrDirectDefaultResponseUsedRecently;
	INT8 bRecruitDefaultResponseUsedRecently;
	INT8 bThreatenDefaultResponseUsedRecently;
	INT8 bNPCData;			// NPC specific
	INT32	iBalance;
	INT16 sTrueSalary; // for use when the person is working for us for free but has a positive salary value
	UINT8	ubCivilianGroup;
	UINT8	ubNeedForSleep;
	UINT32	uiMoney;
	INT8	bNPCData2;		// NPC specific

	UINT8	ubMiscFlags3;

	UINT8 ubDaysOfMoraleHangover;		// used only when merc leaves team while having poor morale
	UINT8	ubNumTimesDrugUseInLifetime;		// The # times a drug has been used in the player's lifetime...

	// Flags used for the precedent to repeating oneself in Contract negotiations.	Used for quote 80 -	~107.	Gets reset every day
	UINT32	uiPrecedentQuoteSaid;
	UINT32	uiProfileChecksum;
	INT16		sPreCombatGridNo;
	UINT8		ubTimeTillNextHatedComplaint;
	UINT8		ubSuspiciousDeath;

	INT32	iMercMercContractLength;		//Used for MERC mercs, specifies how many days the merc has gone since last page

	UINT32	uiTotalCostToDate;			// The total amount of money that has been paid to the merc for their salary

	//
	// 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)

	std::vector<int>	inv;
	std::vector<int>	bInvStatus;
	std::vector<int>	bInvNumber;
}; // _OLD_MERCPROFILESTRUCT;

#define SIZEOF_MERCPROFILESTRUCT_POD offsetof( MERCPROFILESTRUCT, endOfPOD )
#define _OLD_SIZEOF_MERCPROFILESTRUCT_POD offsetof( _OLD_MERCPROFILESTRUCT, endOfPOD )

#define TIME_BETWEEN_HATED_COMPLAINTS 24

#define SUSPICIOUS_DEATH				1
#define VERY_SUSPICIOUS_DEATH		2


#ifdef WFconvertUB

typedef struct
{
	UINT16	zName[ NAME_LENGTH ];
	UINT16	zNickname[ NICKNAME_LENGTH ];
	UINT32	uiAttnSound;
	UINT32	uiCurseSound;
	UINT32	uiDieSound;
	UINT32	uiGoodSound;
	UINT32	uiGruntSound;
	UINT32	uiGrunt2Sound;
	UINT32  uiOkSound;
	UINT8		ubFaceIndex;
	PaletteRepID		PANTS;
	PaletteRepID		VEST;
	PaletteRepID		SKIN;
	PaletteRepID		HAIR;
	INT8		bSex;
	INT8		bArmourAttractiveness;
	UINT8		ubMiscFlags2;
	INT8		bEvolution;
	UINT8		ubMiscFlags;
	UINT8		bSexist;
	INT8		bLearnToHate;

	// skills
	INT8		bStealRate;
	INT8		bVocalVolume;
	UINT8		ubQuoteRecord;
	INT8		bDeathRate;
	INT8		bScientific;

	INT16		sExpLevelGain;
	INT16		sLifeGain;
	INT16		sAgilityGain;
	INT16		sDexterityGain;
	INT16		sWisdomGain;
	INT16		sMarksmanshipGain;
	INT16		sMedicalGain;
	INT16		sMechanicGain;
	INT16		sExplosivesGain;

	UINT8		ubBodyType;
	INT8		bMedical;

	UINT16	usEyesX;
	UINT16	usEyesY;
	UINT16	usMouthX;
	UINT16	usMouthY;
	UINT32	uiEyeDelay;
	UINT32	uiMouthDelay;
	UINT32	uiBlinkFrequency;
	UINT32	uiExpressionFrequency;
	UINT16	sSectorX;
	UINT16	sSectorY;

	UINT32	uiDayBecomesAvailable;			//day the merc will be available.  used with the bMercStatus

	INT8		bStrength;

	INT8		bLifeMax;
	INT8		bExpLevelDelta;
	INT8		bLifeDelta;
	INT8		bAgilityDelta;
	INT8		bDexterityDelta;
	INT8		bWisdomDelta;
	INT8		bMarksmanshipDelta;
	INT8		bMedicalDelta;
	INT8		bMechanicDelta;
	INT8		bExplosivesDelta;
	INT8    bStrengthDelta;
	INT8    bLeadershipDelta;
	UINT16  usKills;
	UINT16  usAssists;
	UINT16  usShotsFired;
	UINT16  usShotsHit;
	UINT16  usBattlesFought;
	UINT16  usTimesWounded;
	UINT16  usTotalDaysServed;

	INT16		sLeadershipGain;
	INT16		sStrengthGain;



	// BODY TYPE SUBSITUTIONS
	UINT32	uiBodyTypeSubFlags;

	INT16	sSalary;
	INT8	bLife;
	INT8		bDexterity;		// dexterity (hand coord) value
	INT8	bPersonalityTrait;
	INT8	bSkillTrait;

	INT8	bReputationTolerance;
	INT8	bExplosive;
	INT8	bSkillTrait2;
	INT8	bLeadership;

	INT8	bBuddy[5];
	INT8	bHated[5];
	INT8	bExpLevel;		// general experience level

	INT8	bMarksmanship;
	UINT8	bMinService;
	INT8	bWisdom;
	UINT8	bResigned;
	UINT8	bActive;

	UINT8	bInvStatus[19];
	UINT8 bInvNumber[19];
	UINT16 usApproachFactor[4];

	INT8	bMainGunAttractiveness;
	INT8		bAgility;			// agility (speed) value

	BOOLEAN	fUseProfileInsertionInfo;				// Set to various flags, ( contained in TacticalSave.h )
	INT16		sGridNo;												// The Gridno the NPC was in before leaving the sector
	UINT8		ubQuoteActionID;
	INT8		bMechanical;

	UINT8	ubInvUndroppable;
	UINT8	ubRoomRangeStart[2];
	UINT16 inv[19];
	INT8 bMercTownReputation[ 20 ];

	UINT16 usStatChangeChances[ 12 ];		// used strictly for balancing, never shown!
	UINT16 usStatChangeSuccesses[ 12 ];	// used strictly for balancing, never shown!

	UINT8	ubStrategicInsertionCode;

	UINT8	ubRoomRangeEnd[2];

	INT8 bPadding[ 4 ];

	UINT8 ubLastQuoteSaid;

	INT8 bRace;
	INT8 bNationality;
	INT8 bAppearance;
	INT8 bAppearanceCareLevel;
	INT8 bRefinement;
	INT8 bRefinementCareLevel;
	INT8 bHatedNationality;
	INT8 bHatedNationalityCareLevel;
	INT8 bRacist;
	UINT32 uiWeeklySalary;
	UINT32 uiBiWeeklySalary;
	INT8 bMedicalDeposit;
	INT8 bAttitude;
	INT8 bBaseMorale;
	UINT16 sMedicalDepositAmount;

	INT8 bLearnToLike;
	UINT8 ubApproachVal[4];
	UINT8 ubApproachMod[3][4];
	INT8 bTown;
	INT8 bTownAttachment;
	UINT16 usOptionalGearCost;
	INT8 bMercOpinion[NUMBER_OF_OPINIONS];
	INT8 bApproached;
	INT8 bMercStatus;								//The status of the merc.  If negative, see flags at the top of this file.  Positive:  The number of days the merc is away for.  0:  Not hired but ready to be.
	INT8 bHatedTime[5];
	INT8 bLearnToLikeTime;
	INT8 bLearnToHateTime;
	INT8 bHatedCount[5];
	INT8 bLearnToLikeCount;
	INT8 bLearnToHateCount;
	UINT8 ubLastDateSpokenTo;
	UINT8 bLastQuoteSaidWasSpecial;
	INT8	bSectorZ;
	UINT16 usStrategicInsertionData;
	INT8 bFriendlyOrDirectDefaultResponseUsedRecently;
	INT8 bRecruitDefaultResponseUsedRecently;
	INT8 bThreatenDefaultResponseUsedRecently;
	INT8 bNPCData;			// NPC specific
	INT32	iBalance;
	INT16 sTrueSalary; // for use when the person is working for us for free but has a positive salary value
	UINT8	ubCivilianGroup;
	UINT8	ubNeedForSleep;
	UINT32	uiMoney;
	INT8	bNPCData2;		// NPC specific

	UINT8	ubMiscFlags3;

	UINT8 ubDaysOfMoraleHangover;		// used only when merc leaves team while having poor morale
	UINT8	ubNumTimesDrugUseInLifetime;		// The # times a drug has been used in the player's lifetime...

	// Flags used for the precedent to repeating oneself in Contract negotiations.  Used for quote 80 -  ~107.  Gets reset every day
	UINT32	uiPrecedentQuoteSaid;
	UINT32	uiProfileChecksum;
	INT16		sPreCombatGridNo;
	UINT8		ubTimeTillNextHatedComplaint;
	UINT8		ubSuspiciousDeath;

	INT32	iMercMercContractLength;		//Used for MERC mercs, specifies how many days the merc has gone since last page

	UINT32	uiTotalCostToDate;			// The total amount of money that has been paid to the merc for their salary

	UINT16	usTotalKills;						// total kills the player has had ( only used if the player imported the mercs from ja2 )
	UINT16	usTotalAssists;					// total assists the player has had ( only used if the player imported the mercs from ja2 )
} MERCPROFILESTRUCT_OLD_WF;

#endif

#endif
