#pragma once

#include <cstdint>

namespace diablo2 {
	namespace structures {
		struct linkage;

		struct playerclass_line;
		struct bodylocs_line;
		struct storepage_line;
		struct elemtypes_line;
		struct hitclass_line;
		struct monmode_line;
		struct properties_line;

		struct unique_items //size=0x14C (332)
		{
			WORD	uniqueId;		//+00
			BYTE	uk1[0x20];		//+02
			WORD	uniqueNameId;	//+22
			BYTE	uk2[0x08];		//+24
			union {
				BYTE	flag;		//+2C
				struct {
					BYTE ukf : 2;
					BYTE carry1 : 1;
					BYTE ladder : 1;
				};
			};
			BYTE	uk3[0x11F];		//+2D
		};

		struct data_tables {
			playerclass_line* player_class;                                 //+00000000   01415B48      playerclass.txt
			linkage* player_class_info;                     //+00000004   01410524      playerclass info

			bodylocs_line* body_locs;                                    //+00000008   01415578      bodylocs.txt
			linkage* body_locs_info;                        //+0000000C   01410504      bodylocs info

			storepage_line* store_page;                                   //+00000010   01414CC8      storepage.txt
			linkage* store_page_info;                       //+00000014   01415B24      storepage info

			elemtypes_line* elemtypes;                                   //+00000018   01414958      elemtypes.txt
			linkage* elemtypes_info;                       //+0000001C   01415B04      elemtypes info

			hitclass_line* hit_class;                                    //+00000020   01414148      hitclass.txt
			linkage* hit_class_info;                        //+00000024   01415AE4      hitclass info

			monmode_line* mon_mode;                                 //+00000028   01416878      monmode.txt
			linkage* mon_mode_info;                         //+0000002C   01415514      monmode info

			void* pPlayerModeStub;                              //+00000030   014162E8      plrmode.txt
			linkage* iPlayerMode;                      //+00000034   01414934      plrmode info
			void* pSkillCalc;                                   //+00000038   05279860      skillcalc.txt
			linkage* iSkillCalc;                       //+0000003C   01410014      skillcalc info
			uint8_t* pSkillsCode;                                  //+00000040   0537A514      skillscode formulae
			uint32_t dwSkillsCodeSize;                             //+00000044   00001768      size of skillscode block
			uint32_t dwSkillsCodeSizeEx;                           //+00000048   00001768      size of skillscode block
			uint8_t* pSkillDescCode;                               //+0000004C   0535C994      skilldesccode formulae
			uint32_t dwSkillDescCodeSize;                          //+00000050   0000107F      size of skilldesccode block
			uint32_t dwSkillDescCodeSizeEx;                        //+00000054   0000107F      size of skilldesccode block
			const char* pMissileCalc;                           //+00000058   01419C28      misscalc.txt
			linkage* iMissileCalc;                     //+0000005C   01417024      misscalc info
			uint8_t* pMissCode;                                    //+00000060   014A4944      misscode formulae
			uint32_t dwMissCodeSize;                               //+00000064   000000D4      size of misscode block
			uint32_t dwMissCodeSizeEx;                             //+00000068   000000D4      size of misscode block
			const char* pSkillCode;                             //+0000006C   052C445C      skillcode.txt (Id from skills.txt)
			linkage* iSkillCode;                       //+00000070   0141F084      skillcode info
			void* pEvents;                                      //+00000074   0141ACA8      events.txt
			linkage* iEvents;                          //+00000078   0141F064      events info
			uint32_t* pCompCodes;                                  //+0000007C   06C4FAFC      compcode.txt
			linkage* iCompCodes;                       //+00000080   01410544      compcode info
			int nCompCodes;                                     //+00000084   00000073      # of compcode records
			void* pMonAI;                                       //+00000088   0564351C      monai.txt
			linkage* iMonAI;                           //+0000008C   01414914      monai info
			int nMonAI;                                         //+00000090   00000098      # of monai records
			linkage* iItems;                           //+00000094   014BA014      items info
			uint8_t* pItemsCode;                                   //+00000098   013FDED8      itemscode formulae
			uint32_t dwItemsCodeSize;                              //+0000009C   000010E0      size of itemscode block
			uint32_t dwItemsCodeSizeEx;                            //+000000A0   000010E0      size of itemscode block
			uint32_t* pProperties;                   //+000000A4   0579E218      properties.txt
			linkage* iProperties;                      //+000000A8   01489464      properties info
			int nProperties;                                    //+000000AC   00000110      # of properties records
			linkage* iRunes;                           //+000000B0   014C4774      runes info
			uint32_t* pMercDesc;                             //+000000B4   01417208      hiredesc.txt
			linkage* iMercDesc;                        //+000000B8   01415534      hiredesc info
			uint32_t* pStates;                           //+000000BC   05767EA0      states.txt (limit = 255)
			linkage* iStates;                          //+000000C0   014A16C4      states info
			int nStates;                                        //+000000C4   000000BD      # of states records
			void* pStateMasks;                                  //+000000C8   014A2574      statemasks.txt
			uint32_t* fStateMasks[40];                             //+000000CC   014A2574      statemasks[40] (statemasks.txt segment array)
			short* pProgressiveStates;                          //+0000016C   014A23E4      progressive-state list
			int nProgressiveStates;                             //+00000170   00000006      # of progressive states
			short* pCurseStates;                                //+00000174   014A2254      curse-state list
			int nCurseStates;                                   //+00000178   0000001A      # of curse states
			short* pTransformStates;                            //+0000017C   014A20C4      transform-state list
			int nTransformStates;                               //+00000180   00000007      # of transform states
			short* pActionStates;                               //+00000184   014A3E74      action-state list
			int nActionStates;                                  //+00000188   00000007      # of action states
			short* pColourStates;                               //+0000018C   014A3CE4      color-state list
			int nColourStates;                                  //+00000190   00000002      # of color states
			void* pSoundCodes;                                  //+00000194   057656BC      soundcode.txt (sound column from sounds.txt)
			linkage* iSoundCodes;                      //+00000198   0141F0E4      soundcode info
			int nSoundCodes;                                    //+0000019C   00000000      # of soundcode records (blanked out later)
			uint32_t* pHirelings;                     //+000001A0   055D8CD8      hirelings.txt (limit = 256)
			int nHirelings;                                     //+000001A4   00000078      # of hirelings records
			int pMercFirst[256];                                //+000001A8   00000000      array of 256 integers (namefirst column from hirelings.txt)
			int pMercLast[256];		                            //+000005A8   0000000C      array of 256 integers (namelast column from hirelings.txt)   
			void* pNPCs;                                        //+000009A8   05724F74      npcs.txt
			int nNPCs;                                          //+000009AC   00000011      # of npcs records
			void* pColours;                                     //+000009B0   01417568      colors.txt
			linkage* iColours;                         //+000009B4   01415554      colors info
			linkage* iTreasureClassEx;                 //+000009B8   014C4714      treasureclassex info
			uint32_t* pTreasureClassEx;                  //+000009BC   05718D98      treasureclassex.txt (limit = 65534 - autotcs#)
			int nTreasureClassEx;                               //+000009C0   0000043C      # of treasureclassex records
			uint32_t* aTreasureClass[45];                          //+000009C4   0571D074      chest treasureclassex list (an array of 45 pointers)
			uint32_t* pMonstats;                       //+00000A78   04FE0014      monstats.txt (limit = 32766)
			linkage* iMonstats;                        //+00000A7C   0143C024      monstats info
			int nMonstats;                                      //+00000A80   000002E1      # of monstats records
			void* pMonSounds;                                   //+00000A84   013EBC9C      monsounds.txt
			linkage* iMonSounds;                       //+00000A88   01438024      monsounds info
			int nMonSounds;                                     //+00000A8C   0000008D      # of monsounds records
			uint32_t* pMonstats2;                     //+00000A90   05287408      monstats2.txt (no sign of that 1023 record limit)
			linkage* iMonstats2;                       //+00000A94   01502014      monstats2 info
			int nMonstats2;                                     //+00000A98   00000245      # of monstats2 records
			void* pMonPlace;                                    //+00000A9C   01412648      monplace.txt
			linkage* iMonPlace;                        //+00000AA0   01417BA4      monplace info
			int nMonPlace;                                      //+00000AA4   00000025      # of monplace records
			void* pMonPreset;                                   //+00000AA8   057248B0      monpreset.txt
			void* aMonPresetI[5];                               //+00000AAC   057248B0      array of 5 pointers to the monpreset sections for each of the 5 acts
			void* aMonPresetII[5];                              //+00000AC0   0000002F      array of 5 integers (# of records for monpreset in each of the 5 acts)
			uint32_t* pSuperUniques;               //+00000AD4   05364928      superuniques.txt (limit = 512)
			linkage* iSuperUniques;                    //+00000AD8   0145A1F4      superuniques info
			int nSuperUniques;                                  //+00000ADC   00000042      # of superunique records
			uint16_t aSuperUniques[66];                             //+00000AE0   00010000      array of 66 uint16_ts (the IdNos of the default superuniques, new ones are not added here [thankfully])
			uint32_t* pMissiles;                       //+00000B64   05590014      missiles.txt (does some fixing for collidetype > 8)
			linkage* iMissiles;                        //+00000B68   01492014      missiles info
			int nMissiles;                                      //+00000B6C   000002C4      # of missiles records
			uint32_t* pMonLvl;                           //+00000B70   013B0064      monlvl.txt
			int nMonLvl;                                        //+00000B74   0000006F      # of monlvl records
			void* pMonSeq;                                      //+00000B78   05375900      monseq.txt
			linkage* iMonSeq;                          //+00000B7C   0143A024      monseq info
			int nMonSeq;                                        //+00000B80   000003F2      # of monseq records
			uint32_t* pMonSeqTable;                      //+00000B84   0143E7E4      sequences table (created from monseq.txt)
			int nMonSeqTable;                                   //+00000B88   0000003C      # of sequences
			uint32_t* pSkillDesc;                     //+00000B8C   05741104      skilldesc.txt (limit = 32766) [JL and not JLE]
			linkage* iSkillDesc;                       //+00000B90   014B8024      skilldesc info
			int nSkillDesc;                                     //+00000B94   000000DD      # of skilldesc records
			uint32_t* pSkills;                           //+00000B98   056E4D78      skills.txt (limit = 32766) [JL and not JLE]
			linkage* iSkills;                          //+00000B9C   014B50E4      skills info
			int nSkills;                                        //+00000BA0   00000173      # of skills records
			int* nClassSkillCount;                              //+00000BA4   014B9014      class skill count list
			int nHighestClassSkillCount;                        //+00000BA8   0000001E      # highest class skill count
			short* nClassSkillList;                             //+00000BAC   014BCB54      class skill list
			int nPassiveSkills;                                 //+00000BB0   0000001C      # of passive skills
			uint16_t* pPassiveSkills;								//+00000BB4   014BCB04      passiveskill list
			linkage* iOverlay;                         //+00000BB8   01484024      overlay info
			uint32_t* pOverlay;                         //+00000BBC   05352F54      overlay.txt
			int nOverlay;                                       //+00000BC0   00000125      # of overlay records
			uint32_t* pCharStats;                     //+00000BC4   057AD178      charstats.txt
			int nCharStats;                                     //+00000BC8   00000007      # of charstats records
			uint32_t* pItemStatCost;               //+00000BCC   05219760      itemstatcost.txt (limit = 510) [511 used as END_OF_STATS in 'GF/JM' files]
			linkage* iItemStatCost;                    //+00000BD0   0148C024      itemstatcost info
			int nItemStatCost;                                  //+00000BD4   0000016E      # of itemstatcost records
			void* pOPStats;										//+00000BD8   014882A4      opstats nesting table
			int nOPStats;										//+00000BDC   000000D3      # of nested opstats
			uint32_t* pMonEquip;                       //+00000BE0   013B3798      monequip.txt (limit = 32766)
			int nMonEquip;                                      //+00000BE4   0000002D      # of monequip records
			uint32_t* pPetType;                         //+00000BE8   05774138      pettype.txt (limit = 511)
			linkage* iPetType;                         //+00000BEC   01486024      pettype info
			int nPetType;                                       //+00000BF0   00000014      # of pettype records
			linkage* iItemTypes;                       //+00000BF4   0141E024      itemtypes info
			uint32_t* pItemTypes;                     //+00000BF8   050D14AC      itemtypes.txt
			int nItemTypes;                                     //+00000BFC   00000069      # of itemtypes records
			int nItemTypesIndex;                                //+00000C00   00000004      (itemtypes#+31)/32
			uint32_t* pItemTypesNest;                              //+00000C04   0537C41C      itemtypes nesting table
			linkage* iSets;                            //+00000C08   014B3CE4      sets info
			void* pSets;                                        //+00000C0C   057A162C      sets.txt (limit = 32766)
			int nSets;                                          //+00000C10   00000020      # of sets records
			linkage* iSetItems;                        //+00000C14   014B1024      setitems info
			uint32_t* pSetItems;                       //+00000C18   056BBAC0      setitems.txt (limit = 32766)
			int nSetItems;                                      //+00000C1C   0000007F      # of setitems records
			linkage* iUniqueItems;                     //+00000C20   014AA044      uniqueitems info
			unique_items* pUniqueItems;                 //+00000C24   0510E8B4      uniqueitems.txt (limit = 32766)
			int nUniqueItems;                                   //+00000C28   00000191      # of uniqueitems records
			//linkage* iMonProp;                         //+00000C2C   01439024      monprop info
			//FileMonpropTable* pMonProp;                         //+00000C30   05132A2C      monprop.txt
			//int nMonProp;                                       //+00000C34   0000000E      # of monprop records
			//linkage* iMonType;                         //+00000C38   0141C024      montype info
			//void* pMonType;                                     //+00000C3C   06C4F014      montype.txt
			//int nMonType;                                       //+00000C40   0000003B      # of montype records
			//uint32_t* pMonTypeNest;                                //+00000C44   0141AAB4      montype nesting table
			//int nMonTypeIndex;                                  //+00000C48   00000002      (montype#+31)/32
			//linkage* iMonUMod;                         //+00000C4C   0145A274      monumod info
			//FileMonumodTable* pMonUMod;                         //+00000C50   0654F014      monumod.txt (limit = 512)
			//int nMonUMod;                                       //+00000C54   0000002B      # of monumod records
			//FileLevelsTable* pLevels;                           //+00000C58   0562D0EC      levels.txt (limit = 1023)
			//int nLevels;                                        //+00000C5C   00000096      # of levels records
			//FileLevelDefsTable* pLevelDefs;                     //+00000C60   055E134C      leveldefs.txt
			//FileLevelPresetTable* pLevelPreset;                 //+00000C64   0502C7E8      lvlprest.txt
			//int nLevelPreset;                                   //+00000C68   00000447      # of lvlprest records
			//int nStuff;                                         //+00000C6C   00000006      stuff value (ItemStatCost.txt + 0x140, record #1)
			//int cStuff;                                         //+00000C70   0000003F      2 ^ stuff - 1 (used as a controller field for opstats and other special stats)
			//FileAnimDataTable* pAnimData;                       //+00000C74   052369C0      sgptAnimTables (see below)
			//FileExperienceTable* pExperience;                   //+00000C78   05ECF014      experience.txt
			//FileDifficultyLevelsTable* pDifficultyLevels;       //+00000C7C   05750CD8      difficultylevels.txt (recordNo must equal 3)
			//int nDifficultyLevels;                              //+00000C80   00000003      # of difficultylevels records
			//BOOL bCompileTXT;                                   //+00000C84                 -txt switch
			//void* ExpFieldI[6];									//+00000C88
			//uint32_t unk0[4];										//+00000CA0
			//void* pExpField;									//+00000CB0
			//void* ExpFieldII[4];								//+00000CB4
			//void* pCubeMain;									//+00000CC4
			//int nCubeMain;										//+00000CC8
			//int nInventory;										//+00000CCC
			//D2InventoryRecordStrc* pInventory;					//+00000CD0
			//uint32_t unk1;											//+00000CD4
			//int nMasterItemList;								//+00000CD8
			//FileItemTable* pMasterItemList;						//+00000CDC
			//void* pWeapons;										//+00000CE0
			//int nWeapons;										//+00000CE4
			//void* pArmor;										//+00000CE8
			//int nArmor;											//+00000CEC
			//void* pMisc;										//+00000CF0
			//int nMisc;											//+00000CF4
			//uint32_t unk2;											//+00000CF8
			//int nGems;											//+00000CFC
			//FileGemsTable* pGems;								//+00000D00
			//int nLowQualityItems;								//+00000D04
			//FileLowQualityItemsTable* pLowQualityItems;			//+00000D08
			//int nBooks;											//+00000D0C
			//FileBooksTable* pBooks;								//+00000D10
			//int nRareAffix;										//+00000D14
			//FileRareAffixTable* pRareAffix;						//+00000D18
			//FileRareAffixTable* pRareSuffix;					//+00000D1C
			//FileRareAffixTable* pRarePrefix;					//+00000D20
			//int nItemRatio;										//+00000D24
			//FileItemratioTable* pItemRatio;						//+00000D28
			//uint32_t unk3;											//+00000D2C
			//int nGamble;										//+00000D30
			//uint32_t* pGambleSelection;							//+00000D34
			//int* pGambleChooseLimit[100];						//+00000D3C
			//int nAffix;											//+00000EC8
			//FileAffixTable* pAffix;								//+00000ECC [suffixes][prefixes][automagic]
			//FileAffixTable* pMagicSuffix;						//+00000ED0
			//FileAffixTable* pMagicPrefix;						//+00000ED4
			//FileAffixTable* pAutoMagic;							//+00000ED8
			//int nRunes;											//+00000EDC
			//void* pRunes;										//+00000EE0
			//int nQualityItems;									//+00000EE4
			//FileQualityitemsTable* pQualityItems;				//+00000EE8
			//uint32_t unk4;											//+00000EEC
			//uint32_t dwHiSeed;										//+00000EF0
			//uint32_t dwLoSeed;										//+00000EF4
			//uint32_t dwAutoMapRand[72];							//+00000EFC
			//void* pLvlTypes;									//+00001018
			//int* pPortalLevels;									//+0000101C
			//int nPortalLevels;									//+00001020
			//int nLvlTypes;										//+00001024
			//FileLevelWarpTable* pLevelWarp;						//+00001028
			//int nLevelWarp;										//+0000102C
			//FileLevelMazeTable* pLevelMaze;						//+00001030
			//int nLevelMaze;										//+00001034
			//void* pLvlSub;										//+00001038
			//int nLvlSub;										//+0000103C
			//void* sLvlSub;										//+00001040
			//uint32_t unk5;											//+00001044
			//void* ppLvlTypes;									//+00001048
			//uint32_t unk6;											//+0000104C
			//D2AutoMapShortStrc* pAutoMap;						//+00001050
			//int nAutoMap;										//+00001054
			//void* pMonLink;										//+00001058
			//int nMonItemPercent;								//+0000105C
			//void* pMonItemPercent;								//+00001060
			//void* pUniqueTitle;									//+00001064
			//void* pUniquePrefix;								//+00001068
			//void* pUniqueSuffix;								//+0000106C
			//void* pUniqueAppelation;							//+00001070
			//int nUniqueTitle;									//+00001074
			//int nUniquePrefix;									//+00001078
			//int nUniqueSuffix;									//+0000107C
			//int nUniqueAppelation;								//+00001080
			//uint32_t unk7[4];										//+00001084
			//FileShrinesTable* pShrines;							//+00001094
			//int nShrines;										//+00001098
			//FileObjectsTable* pObjects;							//+0000109C
			//int nObjects;										//+000010A0
			//void* pObjGroup;									//+000010A4
			//int nObjectGroup;									//+000010A8
			//void* pArmType;										//+000010AC
			//int nMonMode;										//+000010B0
			//FileMonmodeTable* pMonMode[3];						//+000010B4
			//void* pMonLoc;										//+000010B8
			//int nObjTypeAndMode;								//+000010BC
			//void* pObjTypeAndMode;								//+000010C0
			//void* pObjType;										//+000010C4
			//void* pObjMode;										//+000010C8
			//int nPlayerTypeAndMode;								//+000010CC
			//void* pPlayerTypeAndMode;							//+000010D0
			//void* pPlayerType;									//+000010D4
			//void* pPlayerMode;									//+000010D8
		};
	}
}