view NPC.h @ 1184:a90dc4aee8f4

arcomage refactoring continued
author Gloval
date Thu, 06 Jun 2013 08:33:43 +0400
parents 39eaa6b00141
children ab6560001f5b
line wrap: on
line source

#pragma once

enum NPCProf
{
  Smith	= 1,           // GM Weapon Repair;
  Armorer = 2,         // GM Armor Repair;
  Alchemist = 3,       // GM Potion Repair;
  Scholar = 4,         // GM Item ID;               Learning: +5
  Guide = 5,           // Travel by foot: -1 day;
  Tracker = 6,         // Travel by foot: -2 days;
  Pathfinder = 7,      // Travel by foot: -3 days;
  Sailor = 8,          // Travel by sea: -2 days;
  Navigator = 9,       // Travel by sea: -3 days;
  Healer = 10,
  ExpertHealer = 11,
  MasterHealer = 12,
  Teacher = 13,        // Learning: +10;
  Instructor = 14,     // Learning: +15;
  Armsmaster = 15,     // Armsmaster: +2;
  Weaponsmaster = 16,  // Armsmaster: +3;
  Apprentice = 17,     // Fire: +2;         Air: +2;    Water: +2;   Earth: +2;
  Mystic = 18,         // Fire: +3;         Air: +3;    Water: +3;   Earth: +3;
  Spellmaster = 19,    // Fire: +4;         Air: +4;    Water: +4;   Earth: +4;
  Trader = 20,         // Merchant: +4;
  Merchant = 21,       // Merchant: +6;
  Scout = 22,          // Perception: +6;
  Herbalist = 23,      // Alchemy: +4;
  Apothecary = 24,     // Alchemy: +8;
  Tinker = 25,         // Traps: +4;
  Locksmith = 26,      // Traps: +6;
  Fool = 27,           // Luck: +5;
  ChimneySweep = 28,   // Luck: +20;
  Porter = 29,         // Food for rest: -1;
  QuarterMaster = 30,  // Food for rest: -2;
  Factor = 31,         // Gold finds: +10%;
  Banker = 32,         // Gold finds: +20%;
  Cook = 33,
  Chef = 34,
  Horseman = 35,       // Travel by foot: -2 days;
  Bard = 36,
  Enchanter = 37,      // Resist All: +20;
  Cartographer = 38,   // Wizard Eye level 2;
  WindMaster = 39,
  WaterMaster = 40,
  GateMaster = 41,
  Acolyte = 42,
  Piper = 43,
  Explorer = 44,       // Travel by foot -1 day;     Travel by sea: -1 day;
  Pirate = 45,         // Travel by sea: -2 days;    Gold finds: +10%;      Reputation: +5;
  Squire = 46,
  Psychic = 47,        // Perception: +5;            Luck: +10;
  Gypsy = 48,          // Food for rest: -1;         Merchant: +3;          Reputation: +5;
  Diplomat = 49,
  Duper = 50,          // Merchant: +8;              Reputation: +5;
  Burglar = 51,        // Traps: +8;                 Stealing: +8;          Reputation: +5;
  FallenWizard = 52,   // Reputation: +5;
  Acolyte2 = 53,       // Spirit: +2;                Mind: +2;              Body: +2;
  Initiate = 54,       // Spirit: +3;                Mind: +3;              Body: +3;
  Prelate = 55,        // Spirit: +4;                Mind: +4;              Body: +4;
  Monk = 56,           // Unarmed: +2;               Dodge: +2;
  Sage = 57,           // Monster ID: +6
  Hunter = 58          // Monster ID: +6
};



struct NPCTopic
{
  const char *pTopic;
  const char *pText;
};

extern NPCTopic pNPCTopics[789];


/*  136 */
#pragma pack(push, 1)
struct NPCData  //4Ch
{
  inline bool Hired() {return (uFlags & 0x80) != 0;}

  char *pName;  //0
  unsigned int uPortraitID;  //4
  unsigned int uFlags;     //8    // & 0x80    no greeting on dialogue start; looks like hired
  int fame;  //c
  int rep;  //10
  unsigned int Location2D;  //14
  unsigned int uProfession; //18
  int greet;  //1c
  int joins;  //20
  int field_24;
  unsigned int evt_A; //28
  unsigned int evt_B; //2c evtb
  unsigned int evt_C; //  30 evtc
  unsigned int evt_D;  //34
  unsigned int evt_E;  //38
  unsigned int evt_F;  //3c
  unsigned int uSex;  //40
  int bHasUsedTheAbility; //44
  int news_topic;  //48
};
#pragma pack(pop)


/*  138 */
#pragma pack(push, 1)
struct NPCProfession
{
  inline NPCProfession():
    uHirePrice(0), pBenefits(nullptr), pActionText(nullptr), pJoinText(nullptr), pDismissText(nullptr)
  {}

  unsigned int uHirePrice;
  char *pBenefits;
  char *pActionText;
  char *pJoinText;
  char *pDismissText;
};
#pragma pack(pop)


/*  139 */
#pragma pack(push, 1)
struct NPCProfessionChance
{
  unsigned int uTotalprofChance;  //summ 
  char professionChancePerArea[60]; //prof position
};
#pragma pack(pop)

/*  140 */
#pragma pack(push, 1)
struct NPCGreeting
{
  char *pGreeting1;  //at first meet
  char *pGreeting2;  // at latest meets
};
#pragma pack(pop)


/*  137 */
#pragma pack(push, 1)
struct NPCStats
{
  inline NPCStats():
    pNPCTextTXT_Raw(nullptr), pNPCTopicTXT_Raw(nullptr), pNPCDistTXT_Raw(nullptr)
  {
    uNumNPCNames[0] = uNumNPCNames[1] = 0;
  }

  void InitializeNPCText();
  void InitializeNPCData();
  void Initialize();
  void Release();
  void InitializeAdditionalNPCs(NPCData *pNPCDataBuff, int npc_uid, int uLocation2D, int uMapId);
  void _476C60();

  
  NPCData pNPCData[501]; //0 - 94BCh count from 1 
  NPCData pNewNPCData[501]; //94BCh- 12978h count from 1
  char *pNPCNames[540][2];
  NPCProfession pProfessions[59];  //count from 1
  NPCData pAdditionalNPC[100];
  char *pCatchPhrases[52];  //15CA4h
  char *pNPCUnicNames[500];  //from first batch
  NPCProfessionChance pProfessionChance[77]; //16544h profession chance in each area
  int field_17884;
  int field_17888;
  NPCGreeting pNPCGreetings[205];
  unsigned __int16 pGroups[51];
  unsigned __int16 pGroups_copy[51];
  unsigned int uNewlNPCBufPos;
  unsigned int uNumNewNPCs;
  int field_17FC8;
  unsigned int uNumNPCProfessions;
  unsigned int uNumNPCNames[2]; //0 male 1 female
  char *pNPCDataTXT_Raw;
  char *pNPCNamesTXT_Raw;
  char *pNPCProfTXT_Raw;
  char *pNPCNewsTXT_Raw;
  char *pNPCTopicTXT_Raw;
  char *pNPCTextTXT_Raw;
  char *pNPCDistTXT_Raw;
  char *pNPCGreetTXT_Raw;
  char *pNCPGroupTXT_Raw;
};
#pragma pack(pop)

extern int pDialogueNPCCount;
extern struct Texture *pDialogueNPCPortraits[6];
extern int uNumDialogueNPCPortraits; // weak
extern struct NPCStats *pNPCStats;

bool PartyHasDragon();
bool CheckHiredNPCSpeciality(unsigned int uProfession);