models

package
v0.0.0-...-126e10b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 26, 2024 License: MIT Imports: 4 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Act5PrologueQuest

type Act5PrologueQuest int

Act5PrologueQuest represents the Act 5 Prologue quest names.

const (
	Act5PrologueQuestSiegeOnHarrogath Act5PrologueQuest = iota
	Act5PrologueQuestRescueOnMountArreat
	Act5PrologueQuestPrisonOfIce
	Act5PrologueQuestBetrayalOfHarrogath
	Act5PrologueQuestRiteOfPassage
	Act5PrologueQuestEveOfDestruction
)

type ActInfoData

type ActInfoData struct {
	// Act defines the ID for the Act.
	Act int `csv:"act"`

	// Town uses an area level ("Name field" from levels.txt) to define the Act's town area.
	Town string `csv:"town"`

	// Start uses an area level ("Name field" from levels.txt) to define where the player starts in the Act.
	Start string `csv:"start"`

	// MaxNPCItemLevel controls the maximum item level for items sold by the NPC in the Act.
	MaxNPCItemLevel int `csv:"maxnpcitemlevel"`

	// ClassLevelRangeStart uses an area level ("Name field" from levels.txt) with its MonLvl values as a global Act minimum monster level.
	// For example, this is used to determine chest levels in an Act.
	ClassLevelRangeStart string `csv:"classlevelrangestart"`

	// ClassLevelRangeEnd uses an area level ("Name field" from levels.txt) with its MonLvl values as a global Act maximum monster level.
	// For example, this is used to determine chest levels in an Act.
	ClassLevelRangeEnd string `csv:"classlevelrangeend"`

	// WanderingNPCStart uses an index to determine which wandering monster class to use when populating areas.
	// See wanderingmmon.txt for a list of possible monsters to spawn.
	WanderingNPCStart int `csv:"wanderingnpcstart"`

	// WanderingNPCRange is a modifier that gets added to the "WanderingNPCStart" value to randomly select an index.
	WanderingNPCRange int `csv:"wanderingnpcrange"`

	// CommonActCOF specifies which ".D2" file to use for the common Act COF file.
	// This is used to establish the seed when initializing the Act.
	CommonActCOF string `csv:"commonactcof"`

	// Waypoint1 to Waypoint9 uses an area level ("Name field" from levels.txt) as the designated waypoint selection in the Waypoint UI.
	Waypoint1 string `csv:"waypoint1"`
	Waypoint2 string `csv:"waypoint2"`
	Waypoint3 string `csv:"waypoint3"`
	Waypoint4 string `csv:"waypoint4"`
	Waypoint5 string `csv:"waypoint5"`
	Waypoint6 string `csv:"waypoint6"`
	Waypoint7 string `csv:"waypoint7"`
	Waypoint8 string `csv:"waypoint8"`
	Waypoint9 string `csv:"waypoint9"`

	// WanderingMonsterPopulateChance is the percent chance (from 0 to 100) to spawn a wandering monster.
	// See wanderingmmon.txt for a list of possible monsters to spawn.
	WanderingMonsterPopulateChance int `csv:"wanderingMonsterPopulateChance"`

	// WanderingMonsterRegionTotal is the maximum number of wandering monsters allowed at once.
	WanderingMonsterRegionTotal int `csv:"wanderingMonsterRegionTotal"`

	// WanderingPopulateRandomChance is a secondary percent chance (from 0 to #) to determine whether to attempt populating with monsters.
	// Only fails if the random chance selects 0.
	WanderingPopulateRandomChance int `csv:"wanderingPopulateRandomChance"`
}

ActInfoData represents the data from the "actinfo.txt" file.

type ArmorComponent

type ArmorComponent int

ArmorComponent represents the character's graphics and animations for different components when wearing armor.

const (
	ArmorComponentLight ArmorComponent = iota
	ArmorComponentMedium
	ArmorComponentHeavy
)

type ArmorData

type ArmorData struct {
	MinAc int // The minimum amount of Defense that an armor item type can have.
	MaxAc int // The maximum amount of Defense that an armor item type can have.
	Block int // Controls the block percent chance that the item provides (out of 100, but caps at 75).
	RArm  int // Controls the character's graphics and animations for the Right Arm component when wearing the armor, where the value 0 = Light or "lit", 1 = Medium or "med", and 2 = Heavy or "hvy".
	LArm  int // Controls the character's graphics and animations for the Left Arm component when wearing the armor, where the value 0 = Light or "lit", 1 = Medium or "med", and 2 = Heavy or "hvy".
	Torso int // Controls the character's graphics and animations for the Torso component when wearing the armor, where the value 0 = Light or "lit", 1 = Medium or "med", and 2 = Heavy or "hvy".
	Legs  int // Controls the character's graphics and animations for the Legs component when wearing the armor, where the value 0 = Light or "lit", 1 = Medium or "med", and 2 = Heavy or "hvy".
	RSPad int // Controls the character's graphics and animations for the Right Shoulder Pad component when wearing the armor, where the value 0 = Light or "lit", 1 = Medium or "med", and 2 = Heavy or "hvy".
	LSPad int // Controls the character's graphics and animations for the Left Shoulder Pad component when wearing the armor, where the value 0 = Light or "lit", 1 = Medium or "med", and 2 = Heavy or "hvy".
}

ArmorData represents the additional data fields exclusive to armor type items.

type AutoMagicData

type AutoMagicData struct {
	Name           string `csv:"Name"`           // Defines the item affix name.
	Version        int    `csv:"version"`        // Defines which game version to use this item affix (<100 = Classic mode | 100 = Expansion mode).
	Spawnable      bool   `csv:"spawnable"`      // Boolean field. If equals 1, then this item affix is used as part of the game's randomizer for assigning item modifiers when an item spawns. If equals 0, then this item affix is never used.
	Rare           bool   `csv:"rare"`           // Boolean field. If equals 1, then this item affix can be used when randomly assigning item modifiers when a rare item spawns. If equals 0, then this item affix is not used for rare items.
	Level          int    `csv:"level"`          // The minimum item level required for this item affix to spawn on the item. If the item level is below this value, then the item affix will not spawn on the item.
	MaxLevel       int    `csv:"maxlevel"`       // The maximum item level required for this item affix to spawn on the item. If the item level is above this value, then the item affix will not spawn on the item.
	LevelReq       int    `csv:"levelreq"`       // The minimum character level required to equip an item that has this item affix.
	ClassSpecific  string `csv:"classspecific"`  // Controls if this item affix should only be used for class-specific items.
	Class          string `csv:"class"`          // Controls which character class is required for the class-specific level requirement "classlevelreq" field.
	ClassLevelReq  int    `csv:"classlevelreq"`  // The minimum character level required for a specific class in order to equip an item that has this item affix.
	Frequency      int    `csv:"frequency"`      // Controls the probability that the affix appears on the item.
	Group          int    `csv:"group"`          // Assigns an item affix to a specific group number.
	ModCode1       string `csv:"mod1code"`       // Controls the item properties for the item affix (Uses the "code" field from Properties.txt).
	ModCode2       string `csv:"mod2code"`       // Controls the item properties for the item affix (Uses the "code" field from Properties.txt).
	ModCode3       string `csv:"mod3code"`       // Controls the item properties for the item affix (Uses the "code" field from Properties.txt).
	ModParam1      int    `csv:"mod1param"`      // The "parameter" value associated with the related property (mod#code). Usage depends on the property function (See the "func" field on Properties.txt).
	ModParam2      int    `csv:"mod2param"`      // The "parameter" value associated with the related property (mod#code). Usage depends on the property function (See the "func" field on Properties.txt).
	ModParam3      int    `csv:"mod3param"`      // The "parameter" value associated with the related property (mod#code). Usage depends on the property function (See the "func" field on Properties.txt).
	ModMin1        int    `csv:"mod1min"`        // The "min" value to assign to the listed related (mod#code). Usage depends on the property function (See the "func" field on Properties.txt).
	ModMin2        int    `csv:"mod2min"`        // The "min" value to assign to the listed related (mod#code). Usage depends on the property function (See the "func" field on Properties.txt).
	ModMin3        int    `csv:"mod3min"`        // The "min" value to assign to the listed related (mod#code). Usage depends on the property function (See the "func" field on Properties.txt).
	ModMaxe1       int    `csv:"mod1max"`        // The "max" value to assign to the listed related (mod#code). Usage depends on the property function (See the "func" field on Properties.txt).
	ModMaxe2       int    `csv:"mod2max"`        // The "max" value to assign to the listed related (mod#code). Usage depends on the property function (See the "func" field on Properties.txt).
	ModMaxe3       int    `csv:"mod3max"`        // The "max" value to assign to the listed related (mod#code). Usage depends on the property function (See the "func" field on Properties.txt).
	TransformColor string `csv:"transformcolor"` // Controls the color change of the item after spawning with this item affix.
	ITypeCode1     string `csv:"itype1"`         // Controls what Item Types are allowed to spawn with this item affix.
	ITypeCode2     string `csv:"itype2"`         // Controls what Item Types are allowed to spawn with this item affix.
	ITypeCode3     string `csv:"itype3"`         // Controls what Item Types are allowed to spawn with this item affix.
	ITypeCode4     string `csv:"itype4"`         // Controls what Item Types are allowed to spawn with this item affix.
	ITypeCode5     string `csv:"itype5"`         // Controls what Item Types are allowed to spawn with this item affix.
	ITypeCode6     string `csv:"itype6"`         // Controls what Item Types are allowed to spawn with this item affix.
	ITypeCode7     string `csv:"itype7"`         // Controls what Item Types are allowed to spawn with this item affix.
	ETypeCode1     string `csv:"etype1,"`        // Controls what Item Types are forbidden to spawn with this item affix.
	ETypeCode2     string `csv:"etype2,"`        // Controls what Item Types are forbidden to spawn with this item affix.
	ETypeCode3     string `csv:"etype3,"`        // Controls what Item Types are forbidden to spawn with this item affix.
	ETypeCode4     string `csv:"etype4,"`        // Controls what Item Types are forbidden to spawn with this item affix.
	ETypeCode5     string `csv:"etype5,"`        // Controls what Item Types are forbidden to spawn with this item affix.
	Multiply       int    `csv:"multiply"`       // Multiplicative modifier for the item's buy and sell costs, based on the item affix (Calculated in 1024ths for buy cost and 4096ths for sell cost).
	Add            int    `csv:"add"`            // Flat integer modification to the item's buy and sell costs, based on the item affix.
}

AutoMagicData represents item affixes (groups of item modifiers) that are automatically applied to items, regardless of their quality type.

type AutoMapEntry

type AutoMapEntry struct {
	LevelName     LevelName `csv:"LevelName" lua:"LevelName"`         // Act number and name of the level type
	TileName      TileName  `csv:"TileName" lua:"TileName"`           // Orientation of the tile on the Automap (string codes)
	Style         int       `csv:"Style" lua:"Style"`                 // Group numeric ID for the range of cells with the same style
	StartSequence int       `csv:"StartSequence" lua:"StartSequence"` // Start index value for valid "Cel#" field on the Automap
	EndSequence   int       `csv:"EndSequence" lua:"EndSequence"`     // End index value for valid "Cel#" field on the Automap
	Cel1          int       `csv:"Cel1" lua:"Cel1"`                   // Unique image frames from MaxiMap.dc6 for Automap display
	Cel2          int       `csv:"Cel2" lua:"Cel2"`                   // Unique image frames from MaxiMap.dc6 for Automap display
	Cel3          int       `csv:"Cel3" lua:"Cel3"`                   // Unique image frames from MaxiMap.dc6 for Automap display
	Cel4          int       `csv:"Cel4" lua:"Cel4"`                   // Unique image frames from MaxiMap.dc6 for Automap display
}

type AutomagicColor

type AutomagicColor string // represents the color change of the item after spawning with this item affix.
const (
	AutomagicColorNone         AutomagicColor = ""     // represents no color change.
	AutomagicColorWhite        AutomagicColor = "whit" // represents white color.
	AutomagicColorLightGrey    AutomagicColor = "lgry" // represents light grey color.
	AutomagicColorDarkGrey     AutomagicColor = "dgry" // represents dark grey color.
	AutomagicColorBlack        AutomagicColor = "blac" // represents black color.
	AutomagicColorLightBlue    AutomagicColor = "lblu" // represents light blue color.
	AutomagicColorDarkBlue     AutomagicColor = "dblu" // represents dark blue color.
	AutomagicColorCrystalBlue  AutomagicColor = "cblu" // represents crystal blue color.
	AutomagicColorLightRed     AutomagicColor = "lred" // represents light red color.
	AutomagicColorDarkRed      AutomagicColor = "dred" // represents dark red color.
	AutomagicColorCrystalRed   AutomagicColor = "cred" // represents crystal red color.
	AutomagicColorLightGreen   AutomagicColor = "lgrn" // represents light green color.
	AutomagicColorDarkGreen    AutomagicColor = "dgrn" // represents dark green color.
	AutomagicColorCrystalGreen AutomagicColor = "cgrn" // represents crystal green color.
	AutomagicColorLightYellow  AutomagicColor = "lyel" // represents light yellow color.
	AutomagicColorDarkYellow   AutomagicColor = "dyel" // represents dark yellow color.
	AutomagicColorLightGold    AutomagicColor = "lgld" // represents light gold color.
	AutomagicColorDarkGold     AutomagicColor = "dgld" // represents dark gold color.
	AutomagicColorLightPurple  AutomagicColor = "lpur" // represents light purple color.
	AutomagicColorDarkPurple   AutomagicColor = "dpur" // represents dark purple color.
	AutomagicColorOrange       AutomagicColor = "oran" // represents orange color.
	AutomagicColorBrightWhite  AutomagicColor = "bwht" // represents bright white color.
)

type BeltData

type BeltData struct {
	Name                string `csv:"name" lua:"name"`                               // Reference field to define the belt type
	NumBoxes            int    `csv:"numboxes" lua:"numboxes"`                       // Number of item slots in the belt
	Box1Left            int    `csv:"box1left" lua:"box1left"`                       // Belt slot 1 left side coordinate (for Server verification)
	Box2Left            int    `csv:"box2left" lua:"box2left"`                       // Belt slot 2 left side coordinate (for Server verification)
	Box3Left            int    `csv:"box3left" lua:"box3left"`                       // Belt slot 3 left side coordinate (for Server verification)
	Box4Left            int    `csv:"box4left" lua:"box4left"`                       // Belt slot 4 left side coordinate (for Server verification)
	Box5Left            int    `csv:"box5left" lua:"box5left"`                       // Belt slot 5 left side coordinate (for Server verification)
	Box6Left            int    `csv:"box6left" lua:"box6left"`                       // Belt slot 6 left side coordinate (for Server verification)
	Box7Left            int    `csv:"box7left" lua:"box7left"`                       // Belt slot 7 left side coordinate (for Server verification)
	Box8Left            int    `csv:"box8left" lua:"box8left"`                       // Belt slot 8 left side coordinate (for Server verification)
	Box9Left            int    `csv:"box9left" lua:"box9left"`                       // Belt slot 9 left side coordinate (for Server verification)
	Box10Left           int    `csv:"box10left" lua:"box10left"`                     // Belt slot 10 left side coordinate (for Server verification)
	Box11Left           int    `csv:"box11left" lua:"box11left"`                     // Belt slot 11 left side coordinate (for Server verification)
	Box12Left           int    `csv:"box12left" lua:"box12left"`                     // Belt slot 12 left side coordinate (for Server verification)
	Box13Left           int    `csv:"box13left" lua:"box13left"`                     // Belt slot 13 left side coordinate (for Server verification)
	Box14Left           int    `csv:"box14left" lua:"box14left"`                     // Belt slot 14 left side coordinate (for Server verification)
	Box15Left           int    `csv:"box15left" lua:"box15left"`                     // Belt slot 15 left side coordinate (for Server verification)
	Box16Left           int    `csv:"box16left" lua:"box16left"`                     // Belt slot 16 left side coordinate (for Server verification)
	Box1Right           int    `csv:"box1right" lua:"box1right"`                     // Belt slot 1 right side coordinate (for Server verification)
	Box2Right           int    `csv:"box2right" lua:"box2right"`                     // Belt slot 2 right side coordinate (for Server verification)
	Box3Right           int    `csv:"box3right" lua:"box3right"`                     // Belt slot 3 right side coordinate (for Server verification)
	Box4Right           int    `csv:"box4right" lua:"box4right"`                     // Belt slot 4 right side coordinate (for Server verification)
	Box5Right           int    `csv:"box5right" lua:"box5right"`                     // Belt slot 5 right side coordinate (for Server verification)
	Box6Right           int    `csv:"box6right" lua:"box6right"`                     // Belt slot 6 right side coordinate (for Server verification)
	Box7Right           int    `csv:"box7right" lua:"box7right"`                     // Belt slot 7 right side coordinate (for Server verification)
	Box8Right           int    `csv:"box8right" lua:"box8right"`                     // Belt slot 8 right side coordinate (for Server verification)
	Box9Right           int    `csv:"box9right" lua:"box9right"`                     // Belt slot 9 right side coordinate (for Server verification)
	Box10Right          int    `csv:"box10right" lua:"box10right"`                   // Belt slot 10 right side coordinate (for Server verification)
	Box11Right          int    `csv:"box11right" lua:"box11right"`                   // Belt slot 11 right side coordinate (for Server verification)
	Box12Right          int    `csv:"box12right" lua:"box12right"`                   // Belt slot 12 right side coordinate (for Server verification)
	Box13Right          int    `csv:"box13right" lua:"box13right"`                   // Belt slot 13 right side coordinate (for Server verification)
	Box14Right          int    `csv:"box14right" lua:"box14right"`                   // Belt slot 14 right side coordinate (for Server verification)
	Box15Right          int    `csv:"box15right" lua:"box15right"`                   // Belt slot 15 right side coordinate (for Server verification)
	Box16Right          int    `csv:"box16right" lua:"box16right"`                   // Belt slot 16 right side coordinate (for Server verification)
	Box1Top             int    `csv:"box1top" lua:"box1top"`                         // Belt slot 1 top coordinate (for Server verification)
	Box2Top             int    `csv:"box2top" lua:"box2top"`                         // Belt slot 2 top coordinate (for Server verification)
	Box3Top             int    `csv:"box3top" lua:"box3top"`                         // Belt slot 3 top coordinate (for Server verification)
	Box4Top             int    `csv:"box4top" lua:"box4top"`                         // Belt slot 4 top coordinate (for Server verification)
	Box5Top             int    `csv:"box5top" lua:"box5top"`                         // Belt slot 5 top coordinate (for Server verification)
	Box6Top             int    `csv:"box6top" lua:"box6top"`                         // Belt slot 6 top coordinate (for Server verification)
	Box7Top             int    `csv:"box7top" lua:"box7top"`                         // Belt slot 7 top coordinate (for Server verification)
	Box8Top             int    `csv:"box8top" lua:"box8top"`                         // Belt slot 8 top coordinate (for Server verification)
	Box9Top             int    `csv:"box9top" lua:"box9top"`                         // Belt slot 9 top coordinate (for Server verification)
	Box10Top            int    `csv:"box10top" lua:"box10top"`                       // Belt slot 10 top coordinate (for Server verification)
	Box11Top            int    `csv:"box11top" lua:"box11top"`                       // Belt slot 11 top coordinate (for Server verification)
	Box12Top            int    `csv:"box12top" lua:"box12top"`                       // Belt slot 12 top coordinate (for Server verification)
	Box13Top            int    `csv:"box13top" lua:"box13top"`                       // Belt slot 13 top coordinate (for Server verification)
	Box14Top            int    `csv:"box14top" lua:"box14top"`                       // Belt slot 14 top coordinate (for Server verification)
	Box15Top            int    `csv:"box15top" lua:"box15top"`                       // Belt slot 15 top coordinate (for Server verification)
	Box16Top            int    `csv:"box16top" lua:"box16top"`                       // Belt slot 16 top coordinate (for Server verification)
	Box1Bottom          int    `csv:"box1bottom" lua:"box1bottom"`                   // Belt slot 1 bottom coordinate (for Server verification)
	Box2Bottom          int    `csv:"box2bottom" lua:"box2bottom"`                   // Belt slot 2 bottom coordinate (for Server verification)
	Box3Bottom          int    `csv:"box3bottom" lua:"box3bottom"`                   // Belt slot 3 bottom coordinate (for Server verification)
	Box4Bottom          int    `csv:"box4bottom" lua:"box4bottom"`                   // Belt slot 4 bottom coordinate (for Server verification)
	Box5Bottom          int    `csv:"box5bottom" lua:"box5bottom"`                   // Belt slot 5 bottom coordinate (for Server verification)
	Box6Bottom          int    `csv:"box6bottom" lua:"box6bottom"`                   // Belt slot 6 bottom coordinate (for Server verification)
	Box7Bottom          int    `csv:"box7bottom" lua:"box7bottom"`                   // Belt slot 7 bottom coordinate (for Server verification)
	Box8Bottom          int    `csv:"box8bottom" lua:"box8bottom"`                   // Belt slot 8 bottom coordinate (for Server verification)
	Box9Bottom          int    `csv:"box9bottom" lua:"box9bottom"`                   // Belt slot 9 bottom coordinate (for Server verification)
	Box10Bottom         int    `csv:"box10bottom" lua:"box10bottom"`                 // Belt slot 10 bottom coordinate (for Server verification)
	Box11Bottom         int    `csv:"box11bottom" lua:"box11bottom"`                 // Belt slot 11 bottom coordinate (for Server verification)
	Box12Bottom         int    `csv:"box12bottom" lua:"box12bottom"`                 // Belt slot 12 bottom coordinate (for Server verification)
	Box13Bottom         int    `csv:"box13bottom" lua:"box13bottom"`                 // Belt slot 13 bottom coordinate (for Server verification)
	Box14Bottom         int    `csv:"box14bottom" lua:"box14bottom"`                 // Belt slot 14 bottom coordinate (for Server verification)
	Box15Bottom         int    `csv:"box15bottom" lua:"box15bottom"`                 // Belt slot 15 bottom coordinate (for Server verification)
	Box16Bottom         int    `csv:"box16bottom" lua:"box16bottom"`                 // Belt slot 16 bottom coordinate (for Server verification)
	DefaultItemTypeCol1 string `csv:"defaultItemTypeCol1" lua:"defaultItemTypeCol1"` // Default item type used for the populate belt and auto-use functionality on the controller
	DefaultItemTypeCol2 string `csv:"defaultItemTypeCol2" lua:"defaultItemTypeCol2"` // Default item type used for the populate belt and auto-use functionality on the controller
	DefaultItemTypeCol3 string `csv:"defaultItemTypeCol3" lua:"defaultItemTypeCol3"` // Default item type used for the populate belt and auto-use functionality on the controller
	DefaultItemTypeCol4 string `csv:"defaultItemTypeCol4" lua:"defaultItemTypeCol4"` // Default item type used for the populate belt and auto-use functionality on the controller
	DefaultItemCodeCol1 string `csv:"defaultItemCodeCol1" lua:"defaultItemCodeCol1"` // Default item code used for the populate belt and auto-use functionality on the controller
	DefaultItemCodeCol2 string `csv:"defaultItemCodeCol2" lua:"defaultItemCodeCol2"` // Default item code used for the populate belt and auto-use functionality on the controller
	DefaultItemCodeCol3 string `csv:"defaultItemCodeCol3" lua:"defaultItemCodeCol3"` // Default item code used for the populate belt and auto-use functionality on the controller
	DefaultItemCodeCol4 string `csv:"defaultItemCodeCol4" lua:"defaultItemCodeCol4"` // Default item code used for the populate belt and auto-use functionality on the controller
}

BeltData holds the statistics for belts and their various item slots

type Book

type Book struct {
	Name            string `csv:"Name"`            // Reference field to define the book
	ScrollSpellCode string `csv:"ScrollSpellCode"` // Item's code for the related scroll item
	BookSpellCode   string `csv:"BookSpellCode"`   // Item's code for the book item
	PSpell          int    `csv:"pSpell"`          // Item spell function to use when using the book (See Code-Description mapping)
	SpellIcon       int    `csv:"SpellIcon"`       // Numeric index to pick the DC6 file for the mouse cursor when using the scroll or book
	ScrollSkill     string `csv:"ScrollSkill"`     // Skill to use for the scroll item (uses the "skill" field from skills.txt)
	BookSkill       string `csv:"BookSkill"`       // Skill to use for the book item (uses the "skill" field from skills.txt)
	BaseCost        int    `csv:"BaseCost"`        // Starting gold cost to buy the book from an NPC
	CostPerCharge   int    `csv:"CostPerCharge"`   // Additional gold cost added with the book's "BaseCost" value, based on how many charges the book has
}

type CharStats

type CharStats struct {
	Class               string `csv:"class"`
	Strength            int    `csv:"str"`
	Dexterity           int    `csv:"dex"`
	Intelligence        int    `csv:"int"`
	Vitality            int    `csv:"vit"`
	Total               int    `csv:"tot"`
	Stamina             int    `csv:"stamina"`
	HPAdd               int    `csv:"hpadd"`
	PercentStrength     int    `csv:"PercentStr"`
	PercentDexterity    int    `csv:"PercentDex"`
	PercentIntelligence int    `csv:"PercentInt"`
	PercentVitality     int    `csv:"PercentVit"`
	ManaRegen           int    `csv:"ManaRegen"`
	ToHitFactor         int    `csv:"ToHitFactor"`
	WalkVelocity        int    `csv:"WalkVelocity"`
	RunVelocity         int    `csv:"RunVelocity"`
	RunDrain            int    `csv:"RunDrain"`
	Comment             string `csv:"Comment"`
	LifePerLevel        int    `csv:"LifePerLevel"`
	StaminaPerLevel     int    `csv:"StaminaPerLevel"`
	ManaPerLevel        int    `csv:"ManaPerLevel"`
	LifePerVitality     int    `csv:"LifePerVitality"`
	StaminaPerVitality  int    `csv:"StaminaPerVitality"`
	ManaPerMagic        int    `csv:"ManaPerMagic"`
	StatPerLevel        int    `csv:"StatPerLevel"`
	Walk                int    `csv:"#walk"`
	Run                 int    `csv:"#run"`
	Swing               int    `csv:"#swing"`
	Spell               int    `csv:"#spell"`
	GetHit              int    `csv:"#gethit"`
	Bow                 int    `csv:"#bow"`
	BlockFactor         int    `csv:"BlockFactor"`
	StartSkill          string `csv:"StartSkill"`
	Skill1              string `csv:"Skill 1"`
	Skill2              string `csv:"Skill 2"`
	Skill3              string `csv:"Skill 3"`
	Skill4              string `csv:"Skill 4"`
	Skill5              string `csv:"Skill 5"`
	Skill6              string `csv:"Skill 6"`
	Skill7              string `csv:"Skill 7"`
	Skill8              string `csv:"Skill 8"`
	Skill9              string `csv:"Skill 9"`
	Skill10             string `csv:"Skill 10"`
	StrAllSkills        string `csv:"StrAllSkills"`
	StrSkillTab1        string `csv:"StrSkillTab1"`
	StrSkillTab2        string `csv:"StrSkillTab2"`
	StrSkillTab3        string `csv:"StrSkillTab3"`
	StrClassOnly        string `csv:"StrClassOnly"`
	BaseWClass          string `csv:"baseWClass"`
	Item1               string `csv:"item1"`
	Item1Loc            string `csv:"item1loc"`
	Item1Count          string `csv:"item1count"`
	Item2               string `csv:"item2"`
	Item2Loc            string `csv:"item2loc"`
	Item2Count          string `csv:"item2count"`
	Item3               string `csv:"item3"`
	Item3Loc            string `csv:"item3loc"`
	Item3Count          string `csv:"item3count"`
	Item4               string `csv:"item4"`
	Item4Loc            string `csv:"item4loc"`
	Item4Count          string `csv:"item4count"`
	Item5               string `csv:"item5"`
	Item5Loc            string `csv:"item5loc"`
	Item5Count          string `csv:"item5count"`
	Item6               string `csv:"item6"`
	Item6Loc            string `csv:"item6loc"`
	Item6Count          string `csv:"item6count"`
	Item7               string `csv:"item7"`
	Item7Loc            string `csv:"item7loc"`
	Item7Count          string `csv:"item7count"`
	Item8               string `csv:"item8"`
	Item8Loc            string `csv:"item8loc"`
	Item8Count          string `csv:"item8count"`
	Item9               string `csv:"item9"`
	Item9Loc            string `csv:"item9loc"`
	Item9Count          string `csv:"item9count"`
	Item10              string `csv:"item10"`
	Item10Loc           string `csv:"item10loc"`
	Item10Count         string `csv:"item10count"`
}

CharStats holds the starting stats for each of the classes

type CharacterClass

type CharacterClass int

CharacterClass represents the character classes.

const (
	CharacterClassNone        CharacterClass = iota // None
	CharacterClassAmazon                            // Amazon
	CharacterClassBarbarian                         // Barbarian
	CharacterClassPaladin                           // Paladin
	CharacterClassNecromancer                       // Necromancer
	CharacterClassSorceress                         // Sorceress
	CharacterClassDruid                             // Druid
	CharacterClassAssassin                          // Assassin
)

type ColorCode

type ColorCode string

ColorCode represents the color codes for item color changes.

const (
	ColorCodeNoColorChange ColorCode = ""     // No color change
	ColorCodeWhite         ColorCode = "whit" // White
	ColorCodeLightGrey     ColorCode = "lgry" // Light Grey
	ColorCodeDarkGrey      ColorCode = "dgry" // Dark Grey
	ColorCodeBlack         ColorCode = "blac" // Black
	ColorCodeLightBlue     ColorCode = "lblu" // Light Blue
	ColorCodeDarkBlue      ColorCode = "dblu" // Dark Blue
	ColorCodeCrystalBlue   ColorCode = "cblu" // Crystal Blue
	ColorCodeLightRed      ColorCode = "lred" // Light Red
	ColorCodeDarkRed       ColorCode = "dred" // Dark Red
	ColorCodeCrystalRed    ColorCode = "cred" // Crystal Red
	ColorCodeLightGreen    ColorCode = "lgrn" // Light Green
	ColorCodeDarkGreen     ColorCode = "dgrn" // Dark Green
	ColorCodeCrystalGreen  ColorCode = "cgrn" // Crystal Green
	ColorCodeLightYellow   ColorCode = "lyel" // Light Yellow
	ColorCodeDarkYellow    ColorCode = "dyel" // Dark Yellow
	ColorCodeLightGold     ColorCode = "lgld" // Light Gold
	ColorCodeDarkGold      ColorCode = "dgld" // Dark Gold
	ColorCodeLightPurple   ColorCode = "lpur" // Light Purple
	ColorCodeDarkPurple    ColorCode = "dpur" // Dark Purple
	ColorCodeOrange        ColorCode = "oran" // Orange
	ColorCodeBrightWhite   ColorCode = "bwht" // Bright White
)

type Component

type Component int

Component represents the layers of player animation when the item is equipped.

const (
	ComponentHead Component = iota
	ComponentTorso
	ComponentLegs
	ComponentRightArm
	ComponentLeftArm
	ComponentRightHand
	ComponentLeftHand
	ComponentShield
	ComponentSpecial1
	ComponentSpecial2
	ComponentSpecial3
	ComponentSpecial4
	ComponentSpecial5
	ComponentSpecial6
	ComponentSpecial7
	ComponentSpecial8
	ComponentNone
)

type CubeItemType

type CubeItemType string

CubeItemType represents the input and output item types

const (
	ItemTypeQuantity    CubeItemType = "qty=#"
	ItemTypeLow         CubeItemType = "low"
	ItemTypeNormal      CubeItemType = "nor"
	ItemTypeHigh        CubeItemType = "hiq"
	ItemTypeMagic       CubeItemType = "mag"
	ItemTypeSet         CubeItemType = "set"
	ItemTypeRare        CubeItemType = "rar"
	ItemTypeUnique      CubeItemType = "uni"
	ItemTypeCrafted     CubeItemType = "crf"
	ItemTypeTempered    CubeItemType = "tmp"
	ItemTypeNoSockets   CubeItemType = "nos"
	ItemTypeSockets     CubeItemType = "sock=#"
	ItemTypeNotEthereal CubeItemType = "noe"
	ItemTypeEthereal    CubeItemType = "eth"
	ItemTypeUpgradable  CubeItemType = "upg"
	ItemTypeBasic       CubeItemType = "bas"
	ItemTypeExceptional CubeItemType = "exc"
	ItemTypeElite       CubeItemType = "eli"
	ItemTypeNotRuneWord CubeItemType = "nru"
)

type CubeRecipe

type CubeRecipe struct {
	Description       string     `csv:"description"`    // This is a reference field to define the cube recipe
	Enabled           bool       `csv:"enabled"`        // Boolean field. If equals 1, then the recipe can be used in-game. If equals 0, then the recipe cannot be used in-game.
	FirstLadderSeason int        `csv:"ladder"`         // Integer field. The first ladder season this cube recipe can be made on (inclusive). If blank or 0 then it is available in non-ladder.
	MinDifficulty     int        `csv:"min diff"`       // The minimum game difficulty to use the recipe (0 = All Game Difficulties | 1 = Nightmare and Hell Difficulty only | 2 = Hell Difficulty only)
	Version           int        `csv:"version"`        // Defines which game version to use this recipe (0 = Classic mode | 100 = Expansion mode)
	Op                OpCode     `csv:"op"`             // Uses a function as an additional input requirement for the recipe
	Param             string     `csv:"param"`          // Parameters for the "op" function
	Value             string     `csv:"value"`          // Value for the "op" function
	Class             string     `csv:"class"`          // Defines the recipe to be only usable by a defined class
	NumInputs         int        `csv:"numinputs"`      // Controls the number of items that need to be inside the cube for the recipe
	Input1            string     `csv:"input 1"`        // Controls what items are required for the recipe. Uses the item’s unique code. Users can also add input parameters by adding a comma “,” to the input and using a code.
	Input2            string     `csv:"input 2"`        // Controls what items are required for the recipe. Uses the item’s unique code. Users can also add input parameters by adding a comma “,” to the input and using a code.
	Input3            string     `csv:"input 3"`        // Controls what items are required for the recipe. Uses the item’s unique code. Users can also add input parameters by adding a comma “,” to the input and using a code.
	Input4            string     `csv:"input 4"`        // Controls what items are required for the recipe. Uses the item’s unique code. Users can also add input parameters by adding a comma “,” to the input and using a code.
	Input5            string     `csv:"input 5"`        // Controls what items are required for the recipe. Uses the item’s unique code. Users can also add input parameters by adding a comma “,” to the input and using a code.
	Input6            string     `csv:"input 6"`        // Controls what items are required for the recipe. Uses the item’s unique code. Users can also add input parameters by adding a comma “,” to the input and using a code.
	Input7            string     `csv:"input 7"`        // Controls what items are required for the recipe. Uses the item’s unique code. Users can also add input parameters by adding a comma “,” to the input and using a code.
	Output            OutputCode `csv:"output"`         // Controls the first output item. Uses the item’s unique code. Users can also add output parameters by adding a comma “,” to the output and using a code.
	OutputLevel       int        `csv:"lvl"`            // Forces the output item level to be a specific level. If this field is used, then ignore the “plvl” and “ilvl” fields.
	OutputPlayerLvl   float64    `csv:"plvl"`           // This is a numeric ratio that gets multiplied with the current player’s level, to add to the output item’s level requirement
	OutputInputLvl    float64    `csv:"ilvl"`           // This is a numeric ratio that gets multiplied with “input 1” item’s level, to add to the output item’s level requirement
	OutputMod1        string     `csv:"mod 1"`          // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputModChance1  float64    `csv:"mod 1 chance"`   // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputModParam1   string     `csv:"mod 1 param"`    // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputModMin1     float64    `csv:"mod 1 min"`      // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputModMax1     float64    `csv:"mod 1 max"`      // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputMod2        string     `csv:"mod 2"`          // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputModChance2  float64    `csv:"mod 2 chance"`   // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputModParam2   string     `csv:"mod 2 param"`    // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputModMin2     float64    `csv:"mod 2 min"`      // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputModMax2     float64    `csv:"mod 2 max"`      // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputMod3        string     `csv:"mod 3"`          // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputModChance3  float64    `csv:"mod 3 chance"`   // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputModParam3   string     `csv:"mod 3 param"`    // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputModMin3     float64    `csv:"mod 3 min"`      // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputModMax3     float64    `csv:"mod 3 max"`      // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputMod4        string     `csv:"mod 4"`          // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputModChance4  float64    `csv:"mod 4 chance"`   // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputModParam4   string     `csv:"mod 4 param"`    // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputModMin4     float64    `csv:"mod 4 min"`      // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputModMax4     float64    `csv:"mod 4 max"`      // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputMod5        string     `csv:"mod 5"`          // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputModChance5  float64    `csv:"mod 5 chance"`   // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputModParam5   string     `csv:"mod 5 param"`    // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputModMin5     float64    `csv:"mod 5 min"`      // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputModMax5     float64    `csv:"mod 5 max"`      // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputB           OutputCode `csv:"output b"`       // Controls the second output item. Uses the item’s unique code. Users can also add output parameters by adding a comma “,” to the output and using a code. (See “output” for more details)
	OutputBLevel      int        `csv:"b lvl"`          // Forces the output item level to be a specific level. If this field is used, then ignore the “plvl” and “ilvl” fields.
	OutputBPLvl       float64    `csv:"b plvl"`         // This is a numeric ratio that gets multiplied with the current player’s level, to add to the output item’s level requirement
	OutputBILvl       float64    `csv:"b ilvl"`         // This is a numeric ratio that gets multiplied with “input 2” item’s level, to add to the output item’s level requirement
	OutputBMod1       string     `csv:"b mod 1"`        // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputBModChance1 float64    `csv:"b mod 1 chance"` // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputBModParam1  string     `csv:"b mod 1 param"`  // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBModMin1    float64    `csv:"b mod 1 min"`    // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBModMax1    float64    `csv:"b mod 1 max"`    // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBMod2       string     `csv:"b mod 2"`        // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputBModChance2 float64    `csv:"b mod 2 chance"` // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputBModParam2  string     `csv:"b mod 2 param"`  // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBModMin2    float64    `csv:"b mod 2 min"`    // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBModMax2    float64    `csv:"b mod 2 max"`    // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBMod3       string     `csv:"b mod 3"`        // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputBModChance3 float64    `csv:"b mod 3 chance"` // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputBModParam3  string     `csv:"b mod 3 param"`  // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBModMin3    float64    `csv:"b mod 3 min"`    // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBModMax3    float64    `csv:"b mod 3 max"`    // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBMod4       string     `csv:"b mod 4"`        // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputBModChance4 float64    `csv:"b mod 4 chance"` // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputBModParam4  string     `csv:"b mod 4 param"`  // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBModMin4    float64    `csv:"b mod 4 min"`    // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBModMax4    float64    `csv:"b mod 4 max"`    // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBMod5       string     `csv:"b mod 5"`        // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputBModChance5 float64    `csv:"b mod 5 chance"` // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputBModParam5  string     `csv:"b mod 5 param"`  // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBModMin5    float64    `csv:"b mod 5 min"`    // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputBModMax5    float64    `csv:"b mod 5 max"`    // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputC           OutputCode `csv:"output c"`       // Controls the third output item. Uses the item’s unique code. Users can also add output parameters by adding a comma “,” to the output and using a code. (See “output” for more details)
	OutputCLevel      int        `csv:"c lvl"`          // Forces the output item level to be a specific level. If this field is used, then ignore the “plvl” and “ilvl” fields.
	OutputCPLvl       float64    `csv:"c plvl"`         // This is a numeric ratio that gets multiplied with the current player’s level, to add to the output item’s level requirement
	OutputCILvl       float64    `csv:"c ilvl"`         // This is a numeric ratio that gets multiplied with “input 3” item’s level, to add to the output item’s level requirement
	OutputCMod1       string     `csv:"c mod 1"`        // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputCModChance1 float64    `csv:"c mod 1 chance"` // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputCModParam1  string     `csv:"c mod 1 param"`  // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCModMin1    float64    `csv:"c mod 1 min"`    // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCModMax1    float64    `csv:"c mod 1 max"`    // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCMod2       string     `csv:"c mod 2"`        // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputCModChance2 float64    `csv:"c mod 2 chance"` // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputCModParam2  string     `csv:"c mod 2 param"`  // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCModMin2    float64    `csv:"c mod 2 min"`    // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCModMax2    float64    `csv:"c mod 2 max"`    // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCMod3       string     `csv:"c mod 3"`        // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputCModChance3 float64    `csv:"c mod 3 chance"` // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputCModParam3  string     `csv:"c mod 3 param"`  // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCModMin3    float64    `csv:"c mod 3 min"`    // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCModMax3    float64    `csv:"c mod 3 max"`    // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCMod4       string     `csv:"c mod 4"`        // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputCModChance4 float64    `csv:"c mod 4 chance"` // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputCModParam4  string     `csv:"c mod 4 param"`  // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCModMin4    float64    `csv:"c mod 4 min"`    // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCModMax4    float64    `csv:"c mod 4 max"`    // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCMod5       string     `csv:"c mod 5"`        // Controls the output item properties (Uses the “code” field from Properties.txt)
	OutputCModChance5 float64    `csv:"c mod 5 chance"` // The percent chance that the property will be assigned. If this equals 0, then the ItemProperty will always be assigned.
	OutputCModParam5  string     `csv:"c mod 5 param"`  // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCModMin5    float64    `csv:"c mod 5 min"`    // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	OutputCModMax5    float64    `csv:"c mod 5 max"`    // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)

}

CubeRecipe holds the recipes for the Horadric Cube

type DifficultyLevels

type DifficultyLevels struct {

	// Data Fields:
	Name                                     string // This is a reference field to define the difficulty mode.
	ResistPenalty                            int    // Defines the baseline starting point for a player character’s resistances for Expansion mode.
	ResistPenaltyNonExpansion                int    // Defines the baseline starting point for a player character’s resistances for Non-Expansion mode.
	DeathExpPenalty                          int    // Modifies the percentage of current level experience lost when a player character dies.
	MonsterSkillBonus                        int    // Adds additional skill levels to skills used by monsters (defined from monstats.txt).
	MonsterFreezeDivisor                     int    // Divisor that affects all Freeze Length values on monsters. The attempted Freeze Length value is divided by this divisor to determine the actual Freeze Length.
	MonsterColdDivisor                       int    // Divisor that affects all Cold Length values on monsters. The attempted Cold Length value is divided by this divisor to determine the actual Cold Length.
	AiCurseDivisor                           int    // Divisor that affects all durations of Curses on monsters. The attempted Curse duration is divided by this divisor to determine the actual Curse duration.
	LifeStealDivisor                         int    // Divisor that affects the amount of Life Steal that player characters gain. The attempted Life Steal value is divided by this divisor to determine the actual Life Steal.
	ManaStealDivisor                         int    // Divisor that affects the amount of Mana Steal that player characters gain. The attempted Mana Steal value is divided by this divisor to determine the actual Mana Steal.
	UniqueDamageBonus                        int    // Percentage modifier for a Unique monster’s overall Damage and Attack Rating. This is applied after calculating the monster’s other modifications.
	ChampionDamageBonus                      int    // Percentage modifier for a Champion monster’s overall Damage and Attack Rating. This is applied after calculating the monster’s other modifications.
	PlayerDamagePercentVSPlayer              int    // Percentage modifier for the total damage a player deals to another player.
	PlayerDamagePercentVSMercenary           int    // Percentage modifier for the total damage a player deals to another player’s mercenary.
	PlayerDamagePercentVSPrimeEvil           int    // Percentage modifier for the total damage a player deals to a Prime Evil boss.
	PlayerHitReactBufferVSPlayer             int    // The frame length for the amount of time a player cannot be placed into another hit react from a player (25 frames = 1 second).
	PlayerHitReactBufferVSMonster            int    // The frame length for the amount of time a player cannot be placed into another hit react from a monster (25 frames = 1 second).
	MercenaryDamagePercentVSPlayer           int    // Percentage modifier for the total damage a player’s mercenary deals to another player.
	MercenaryDamagePercentVSMercenary        int    // Percentage modifier for the total damage a player’s mercenary deals to another player’s mercenary.
	MercenaryDamagePercentVSBoss             int    // Percentage modifier for the total damage a player’s mercenary deals to a boss monster.
	MercenaryMaxStunLength                   int    // The frame length for the maximum stun length allowed on a player’s mercenary (25 Frames = 1 second).
	PrimeEvilDamagePercentVSPlayer           int    // Percentage modifier applied to the total damage a Prime Evil boss deals to a player.
	PrimeEvilDamagePercentVSMercenary        int    // Percentage modifier for the total damage a Prime Evil boss deals to a player’s mercenary.
	PrimeEvilDamagePercentVSPet              int    // Percentage modifier for the total damage a Prime Evil boss deals to a player’s pet.
	PetDamagePercentVSPlayer                 int    // Percentage modifier for the total damage a player’s pet deals to another player.
	MonsterCEDamagePercent                   int    // Percentage modifier that affects how much damage is dealt to a player by a Monster’s version of Corpse Explosion. For example, when certain monsters die and explode on death.
	MonsterFireEnchantExplosionDamagePercent int    // Percentage modifier that affects how much damage is dealt to a player by a Monster’s Fire Enchant explosion. The Fire Enchant death explosion uses the same Corpse Explosion functionality and this value is applied after the “MonsterCEDamagePercent” value.
	StaticFieldMin                           int    // Percentage modifier for capping the amount of current Life damage dealt to monsters by the Sorceress Static Field skill. This field only affects games in Expansion mode.
	GambleRare                               int    // The odds to obtain a Rare item from gambling. The game rolls a random number between 0 to 100000. If that rolled number is less than this value, then the gambled item will be a Rare item.
	GambleSet                                int    // The odds to obtain a Set item from gambling. The game rolls a random number between 0 to 100000. If that rolled number is less than this value, then the gambled item will be a Set item.
	GambleUnique                             int    // The odds to obtain a Unique item from gambling. The game rolls a random number between 0 to 100000. If that rolled number is less than this value, then the gambled item will be a Unique item.
	GambleUber                               int    // The odds to make the gambled item be an Exceptional Quality item. The game rolls a random number between 0 to 10000. This rolled number is then compared to the following formula: ([Item Level] - [Base Item Level]) * [“GambleUber”] + 1. If the rolled number is less than this value, then the item becomes an Exceptional Quality item, and the game will roll for upgrading it to Elite Quality (See “GambleUltra”).
	GambleUltra                              int    // The odds to make the gambled item be an Elite Quality item. The game rolls a random number between 0 to 10000. This rolled number is then compared to the following formula: ([Item Level] - [Base Item Level]) * [“GambleUltra”] + 1. If the rolled number is less than this value, then the item is upgraded to an Elite Quality item. This only happens if the item successfully rolled for Exceptional Quality.
}

DifficultyLevels represents the global parameters for game rules between each difficulty mode

type Difficultylevel

type Difficultylevel struct {
	Name                                     string  `csv:"Name"`                                     // The difficulty mode name.
	ResistPenalty                            int     `csv:"ResistPenalty"`                            // Baseline starting point for player character's resistances for Expansion mode.
	ResistPenaltyNonExpansion                int     `csv:"ResistPenaltyNonExpansion"`                // Baseline starting point for player character's resistances for Non-Expansion mode.
	DeathExpPenalty                          float64 `csv:"DeathExpPenalty"`                          // Modifies the percentage of current level experience lost when a player character dies.
	MonsterSkillBonus                        int     `csv:"MonsterSkillBonus"`                        // Additional skill levels added to skills used by monsters (defined from monstats.txt).
	MonsterFreezeDivisor                     int     `csv:"MonsterFreezeDivisor"`                     // Divisor affecting all Freeze Length values on monsters.
	MonsterColdDivisor                       int     `csv:"MonsterColdDivisor"`                       // Divisor affecting all Cold Length values on monsters.
	AiCurseDivisor                           int     `csv:"AiCurseDivisor"`                           // Divisor affecting durations of Curses on monsters.
	LifeStealDivisor                         int     `csv:"LifeStealDivisor"`                         // Divisor affecting the amount of Life Steal that player characters gain.
	ManaStealDivisor                         int     `csv:"ManaStealDivisor"`                         // Divisor affecting the amount of Mana Steal that player characters gain.
	UniqueDamageBonus                        float64 `csv:"UniqueDamageBonus"`                        // Percentage modifier for a Unique monster's overall Damage and Attack Rating.
	ChampionDamageBonus                      float64 `csv:"ChampionDamageBonus"`                      // Percentage modifier for a Champion monster's overall Damage and Attack Rating.
	PlayerDamagePercentVSPlayer              float64 `csv:"PlayerDamagePercentVSPlayer"`              // Percentage modifier for the total damage a player deals to another player.
	PlayerDamagePercentVSMercenary           float64 `csv:"PlayerDamagePercentVSMercenary"`           // Percentage modifier for the total damage a player deals to another player's mercenary.
	PlayerDamagePercentVSPrimeEvil           float64 `csv:"PlayerDamagePercentVSPrimeEvil"`           // Percentage modifier for the total damage a player deals to a Prime Evil boss.
	PlayerHitReactBufferVSPlayer             int     `csv:"PlayerHitReactBufferVSPlayer"`             // Frame length for the amount of time a player cannot be placed into another hit react from a player.
	PlayerHitReactBufferVSMonster            int     `csv:"PlayerHitReactBufferVSMonster"`            // Frame length for the amount of time a player cannot be placed into another hit react from a monster.
	MercenaryDamagePercentVSPlayer           float64 `csv:"MercenaryDamagePercentVSPlayer"`           // Percentage modifier for the total damage a player's mercenary deals to another player.
	MercenaryDamagePercentVSMercenary        float64 `csv:"MercenaryDamagePercentVSMercenary"`        // Percentage modifier for the total damage a player's mercenary deals to another player's mercenary.
	MercenaryDamagePercentVSBoss             float64 `csv:"MercenaryDamagePercentVSBoss"`             // Percentage modifier for the total damage a player's mercenary deals to a boss monster.
	MercenaryMaxStunLength                   int     `csv:"MercenaryMaxStunLength"`                   // Frame length for the maximum stun length allowed on a player's mercenary.
	PrimeEvilDamagePercentVSPlayer           float64 `csv:"PrimeEvilDamagePercentVSPlayer"`           // Percentage modifier applied to the total damage a Prime Evil boss deals to a player.
	PrimeEvilDamagePercentVSMercenary        float64 `csv:"PrimeEvilDamagePercentVSMercenary"`        // Percentage modifier for the total damage a Prime Evil boss deals to a player's mercenary.
	PrimeEvilDamagePercentVSPet              float64 `csv:"PrimeEvilDamagePercentVSPet"`              // Percentage modifier for the total damage a Prime Evil boss deals to a player's pet.
	PetDamagePercentVSPlayer                 float64 `csv:"PetDamagePercentVSPlayer"`                 // Percentage modifier for the total damage a player's pet deals to another player.
	MonsterCEDamagePercent                   float64 `csv:"MonsterCEDamagePercent"`                   // Percentage modifier that affects how much damage is dealt to a player by a Monster's version of Corpse Explosion.
	MonsterFireEnchantExplosionDamagePercent float64 `csv:"MonsterFireEnchantExplosionDamagePercent"` // Percentage modifier that affects how much damage is dealt to a player by a Monster's Fire Enchant explosion.
	StaticFieldMin                           float64 `csv:"StaticFieldMin"`                           // Percentage modifier for capping the amount of current Life damage dealt to monsters by the Sorceress Static Field skill.
	GambleRare                               int     `csv:"GambleRare"`                               // Odds to obtain a Rare item from gambling.
	GambleSet                                int     `csv:"GambleSet"`                                // Odds to obtain a Set item from gambling.
	GambleUnique                             int     `csv:"GambleUnique"`                             // Odds to obtain a Unique item from gambling.
	GambleUber                               int     `csv:"GambleUber"`                               // Odds to make the gambled item be an Exceptional Quality item.
	GambleUltra                              int     `csv:"GambleUltra"`                              // Odds to make the gambled item be an Elite Quality item.
}

Difficultylevel represents the data structure for the difficultylevels.txt file.

type DrlgType

const (
	None DrlgType = iota
	Maze
	Preset
	Outdoor
)

type DynamicRandomLevelGenerationType

type DynamicRandomLevelGenerationType int

type EnvironmentPreset

type EnvironmentPreset int

EnvironmentPreset represents the environment presets for default sound reverberation settings.

const (
	Generic         EnvironmentPreset = iota // 0 - Generic
	PaddedCell                               // 1 - Padded Cell
	Room                                     // 2 - Room
	Bathroom                                 // 3 - Bathroom
	Livingroom                               // 4 - Livingroom
	StoneRoom                                // 5 - Stone Room
	Auditorium                               // 6 - Auditorium
	ConcertHall                              // 7 - Concert Hall
	Cave                                     // 8 - Cave
	Arena                                    // 9 - Arena
	Hanger                                   // 10 - Hanger
	CarpetedHallway                          // 11 - Carpeted Hallway
	Hallway                                  // 12 - Hallway
	StoneCorridor                            // 13 - Stone Corridor
	Alley                                    // 14 - Alley
	Forest                                   // 15 - Forest
	City                                     // 16 - City
	Mountains                                // 17 - Mountains
	Quarry                                   // 18 - Quarry
	Plain                                    // 19 - Plain
	ParkingLot                               // 20 - Parking Lot
	SewerPipe                                // 21 - Sewer Pipe
	Underwater                               // 22 - Underwater
	Drugged                                  // 23 - Drugged
	Dizzy                                    // 24 - Dizzy
	Psychotic                                // 25 - Psychotic
	ProgrammerTest                           // 26 - Programmer Test (A long distant echo)
)

List of environment presets with their corresponding codes and descriptions.

func (EnvironmentPreset) String

func (ep EnvironmentPreset) String() string

type ExperienceData

type ExperienceData struct {
	//Level       string `csv:"Level"`       // This is a reference field to define the level
	Amazon      int `csv:"Amazon"`      // Controls the experience required for each level with the Amazon class
	Sorceress   int `csv:"Sorceress"`   // Controls the experience required for each level with the Sorceress class
	Necromancer int `csv:"Necromancer"` // Controls the experience required for each level with the Necromancer class
	Paladin     int `csv:"Paladin"`     // Controls the experience required for each level with the Paladin class
	Barbarian   int `csv:"Barbarian"`   // Controls the experience required for each level with the Barbarian class
	Druid       int `csv:"Druid"`       // Controls the experience required for each level with the Druid class
	Assassin    int `csv:"Assassin"`    // Controls the experience required for each level with the Assassin class
	ExpRatio    int `csv:"ExpRatio"`    // This multiplier affects the percentage of experienced earned, based on the level
}

ExperienceData represents the data fields for experience required for each level by each class.

type FieldBitField

type FieldBitField int

FieldBitField represents the bit fields for controlling different flags that can affect the item.

const (
	FieldBitFieldMagicQuality FieldBitField = 1 << iota
	FieldBitFieldMetal
	FieldBitFieldSpellcaster
	FieldBitFieldSkillBased
)

type GambleRecord

type GambleRecord struct {
	Name string `csv:"name"` // Reference field to describe the Item
	Code string `csv:"code"` // Pointer to the "code" field from weapons.txt/armor.txt/misc.txt
}

GambleRecord represents the data for each item type that appears as a possible option for the Gambling UI.

type GamblingOptions

type GamblingOptions struct {

	// Data Fields:
	Name string // This is a reference field to describe the Item.
	Code string // This is a pointer to the “code” field from weapons.txt/armor.txt/misc.txt.
}

GamblingOptions represents the Item Types that will appear as possible items to purchase in the Gambling UI.

type GemApplyType

type GemApplyType int

GemApplyType represents the types of effects from a gem or rune when socketed into an item.

const (
	GemApplyTypeWeapon GemApplyType = iota
	GemApplyTypeArmorHelmet
	GemApplyTypeShield
)

type GemData

type GemData struct {
	Name          string `csv:"name"`           // This is a reference field to define the gem/rune name
	Letter        string `csv:"letter"`         // Defines the string that appears in the item tooltip when a rune is socketed into an item
	Transform     string `csv:"transform"`      // Controls the color change of the item after being socketed by the gem/rune (Uses Color Codes from colors.txt)
	TransformCode int    `csv:"transform_code"` // Defines the code for the color transformation (0 to 20)
	Code          string `csv:"code"`           // Defines the unique item code used to create the gem/rune

	// Weapon Modifiers when socketed into gemapplytype == 0
	WeaponMod1Code  string `csv:"weapon_mod1_code"`  // Controls the item properties that the gem/rune provides when socketed into an item with a "gemapplytype" value that equals 0 (Uses the "code" field from Properties.txt)
	WeaponMod1Param string `csv:"weapon_mod1_param"` // The stat's "parameter" value associated with the listed property (WeaponMod1Code). Usage depends on the property function (See the "func" field on Properties.txt)
	WeaponMod1Min   int    `csv:"weapon_mod1_min"`   // The stat's "min" value associated with the listed property (WeaponMod1Code). Usage depends on the property function (See the "func" field on Properties.txt)
	WeaponMod1Max   int    `csv:"weapon_mod1_max"`   // The stat's "max" value to assign to the listed property (WeaponMod1Code). Usage depends on the property function (See the "func" field on Properties.txt)

	WeaponMod2Code  string `csv:"weapon_mod2_code"` // Repeat for WeaponMod2 (2nd weapon modifier)
	WeaponMod2Param string `csv:"weapon_mod2_param"`
	WeaponMod2Min   int    `csv:"weapon_mod2_min"`
	WeaponMod2Max   int    `csv:"weapon_mod2_max"`

	WeaponMod3Code  string `csv:"weapon_mod3_code"` // Repeat for WeaponMod3 (3rd weapon modifier)
	WeaponMod3Param string `csv:"weapon_mod3_param"`
	WeaponMod3Min   int    `csv:"weapon_mod3_min"`
	WeaponMod3Max   int    `csv:"weapon_mod3_max"`

	// Helmet Modifiers when socketed into gemapplytype == 1
	HelmMod1Code  string `csv:"helm_mod1_code"`  // Controls the item properties that the gem/rune provides when socketed into an item with a "gemapplytype" value that equals 1 (Uses the "code" field from Properties.txt)
	HelmMod1Param string `csv:"helm_mod1_param"` // The stat's "parameter" value associated with the listed property (HelmMod1Code). Usage depends on the property function (See the "func" field on Properties.txt)
	HelmMod1Min   int    `csv:"helm_mod1_min"`   // The stat's "min" value associated with the listed property (HelmMod1Code). Usage depends on the property function (See the "func" field on Properties.txt)
	HelmMod1Max   int    `csv:"helm_mod1_max"`   // The stat's "max" value to assign to the listed property (HelmMod1Code). Usage depends on the property function (See the "func" field on Properties.txt)

	HelmMod2Code  string `csv:"helm_mod2_code"` // Repeat for HelmMod2 (2nd helmet modifier)
	HelmMod2Param string `csv:"helm_mod2_param"`
	HelmMod2Min   int    `csv:"helm_mod2_min"`
	HelmMod2Max   int    `csv:"helm_mod2_max"`

	HelmMod3Code  string `csv:"helm_mod3_code"` // Repeat for HelmMod3 (3rd helmet modifier)
	HelmMod3Param string `csv:"helm_mod3_param"`
	HelmMod3Min   int    `csv:"helm_mod3_min"`
	HelmMod3Max   int    `csv:"helm_mod3_max"`

	// Shield Modifiers when socketed into gemapplytype == 2
	ShieldMod1Code  string `csv:"shield_mod1_code"`  // Controls the item properties that the gem/rune provides when socketed into an item with a "gemapplytype" value that equals 2 (Uses the "code" field from Properties.txt)
	ShieldMod1Param string `csv:"shield_mod1_param"` // The stat's "parameter" value associated with the listed property (ShieldMod1Code). Usage depends on the property function (See the "func" field on Properties.txt)
	ShieldMod1Min   int    `csv:"shield_mod1_min"`   // The stat's "min" value associated with the listed property (ShieldMod1Code). Usage depends on the property function (See the "func" field on Properties.txt)
	ShieldMod1Max   int    `csv:"shield_mod1_max"`   // The stat's "max" value to assign to the listed property (ShieldMod1Code). Usage depends on the property function (See the "func" field on Properties.txt)

	ShieldMod2Code  string `csv:"shield_mod2_code"` // Repeat for ShieldMod2 (2nd shield modifier)
	ShieldMod2Param string `csv:"shield_mod2_param"`
	ShieldMod2Min   int    `csv:"shield_mod2_min"`
	ShieldMod2Max   int    `csv:"shield_mod2_max"`

	ShieldMod3Code  string `csv:"shield_mod3_code"` // Repeat for ShieldMod3 (3rd shield modifier)
	ShieldMod3Param string `csv:"shield_mod3_param"`
	ShieldMod3Min   int    `csv:"shield_mod3_min"`
	ShieldMod3Max   int    `csv:"shield_mod3_max"`
}

GemData represents the data fields for gems and runes in the game.

type HellUpgrade

type HellUpgrade string

HellUpgrade represents the item code for upgrading an item in Hell difficulty.

const (
	HellUpgradeNone HellUpgrade = "xxx"
)

type Hero

type Hero int

Hero is used for different types of hero's

const (
	HeroNone        Hero = iota //
	HeroBarbarian               // Barbarian
	HeroNecromancer             // Necromancer
	HeroPaladin                 // Paladin
	HeroAssassin                // Assassin
	HeroSorceress               // Sorceress
	HeroAmazon                  // Amazon
	HeroDruid                   // Druid
)

Heroes

func HeroFromString

func HeroFromString(input string) Hero

func (Hero) GetToken

func (h Hero) GetToken() string

GetToken returns a 2 letter token

func (Hero) GetToken3

func (h Hero) GetToken3() string

GetToken3 returns a 3 letter token

func (Hero) MarshalJSON

func (h Hero) MarshalJSON() ([]byte, error)

MarshalJSON converts CustomString to a JSON string when marshaling.

func (Hero) String

func (h Hero) String() string

func (*Hero) UnmarshalJSON

func (h *Hero) UnmarshalJSON(data []byte) error

UnmarshalJSON parses a JSON string and sets the value of CustomString.

type Hireling

type Hireling struct {
	Hireling                    string  `csv:"Hireling"`                 // Reference field to define the Hireling name
	Version                     int     `csv:"Version"`                  // Defines which game version to use this hireling (0 = Classic mode | 100 = Expansion mode)
	ID                          int     `csv:"Id"`                       // The unique identification number to define each hireling type
	Class                       string  `csv:"Class"`                    // Refers to the “hcIdx” field in MonStats.txt, defines the base type of unit to use for the hireling
	Act                         int     `csv:"Act"`                      // The Act that the hireling belongs to (values 1 to 5 equal Act 1 to Act 5, respectively)
	Difficulty                  int     `csv:"Difficulty"`               // The difficulty mode associated with the hireling (1 = Normal | 2 = Nightmare | 3 = Hell)
	Level                       int     `csv:"Level"`                    // The starting level of the unit
	Seller                      string  `csv:"Seller"`                   // Refers to the “hcIdx” field in MonStats.txt, defines the unit NPC that sells this hireling
	NameFirst                   string  `csv:"NameFirst"`                // String key for generating random hireling names (sequential range from “NameFirst” to “NameLast”, max name length is 48 characters)
	NameLast                    string  `csv:"NameLast"`                 // String key for generating random hireling names (sequential range from “NameFirst” to “NameLast”, max name length is 48 characters)
	Gold                        int     `csv:"Gold"`                     // Initial cost of the hireling, used in hire price calculation
	ExpPerLevel                 float64 `csv:"Exp/Lvl"`                  // Modifier for calculating the amount of Experience needed for the hireling’s next level
	HP                          int     `csv:"HP"`                       // Starting amount of Life at base Level
	HPPerLevel                  int     `csv:"HP/Lvl"`                   // Amount of Life gained per Level
	Defense                     int     `csv:"Defense"`                  // Starting amount of Defense at base Level
	DefensePerLevel             int     `csv:"Def/Lvl"`                  // Amount of Defense gained per Level
	Strength                    int     `csv:"Str"`                      // Starting amount of Strength at base Level
	StrengthPerLevel            int     `csv:"Str/Lvl"`                  // Amount of Strength gained per Level (Calculated in 8ths)
	Dexterity                   int     `csv:"Dex"`                      // Starting amount of Dexterity at base Level
	DexterityPerLevel           int     `csv:"Dex/Lvl"`                  // Amount of Dexterity gained per Level (Calculated in 8ths)
	AttackRating                int     `csv:"AR"`                       // Starting amount of Attack Rating at base Level
	AttackRatingPerLevel        int     `csv:"AR/Lvl"`                   // Amount of Attack Rating gained per Level
	MinPhysicalDamage           int     `csv:"Dmg-Min"`                  // Starting amount of minimum Physical Damage for attacks
	MaxPhysicalDamage           int     `csv:"Dmg-Max"`                  // Starting amount of maximum Physical Damage for attacks
	PhysicalDamagePerLevel      int     `csv:"Dmg/Lvl"`                  // Amount of Physical Damage gained per level (Calculated in 8ths)
	FireResistance              int     `csv:"ResistFire"`               // Starting amount of Fire Resistance at base Level
	FireResistancePerLevel      int     `csv:"ResistFire/Lvl"`           // Amount of Fire Resistance gained per Level (Calculated in 4ths)
	ColdResistance              int     `csv:"ResistCold"`               // Starting amount of Cold Resistance at base Level
	ColdResistancePerLevel      int     `csv:"ResistCold/Lvl"`           // Amount of Cold Resistance gained per Level (Calculated in 4ths)
	LightningResistance         int     `csv:"ResistLightning"`          // Starting amount of Lightning Resistance at base Level
	LightningResistancePerLevel int     `csv:"ResistLightning/Lvl"`      // Amount of Lightning Resistance gained per Level (Calculated in 4ths)
	PoisonResistance            int     `csv:"ResistPoison"`             // Starting amount of Poison Resistance at base Level
	PoisonResistancePerLevel    int     `csv:"ResistPoison/Lvl"`         // Amount of Poison Resistance gained per Level (Calculated in 4ths)
	HirelingDescription         string  `csv:"HireDesc"`                 // String key used to display the special description of the hireling in the hire UI window
	DefaultChance               int     `csv:"DefaultChance"`            // Chance for the hireling to attack with their weapon instead of using a Skill (denominator value for random roll)
	Skill1                      string  `csv:"Skill1"`                   // Points to a skill from the “skill” field in skills.txt file, gives the hireling the Skill to use (requires “Mode1”, “Chance1”, “ChancePerLvl1”)
	Skill2                      string  `csv:"Skill2"`                   // Points to a skill from the “skill” field in skills.txt file, gives the hireling the Skill to use (requires “Mode2”, “Chance2”, “ChancePerLvl2”)
	Skill3                      string  `csv:"Skill3"`                   // Points to a skill from the “skill” field in skills.txt file, gives the hireling the Skill to use (requires “Mode3”, “Chance3”, “ChancePerLvl3”)
	Skill4                      string  `csv:"Skill4"`                   // Points to a skill from the “skill” field in skills.txt file, gives the hireling the Skill to use (requires “Mode4”, “Chance4”, “ChancePerLvl4”)
	Skill5                      string  `csv:"Skill5"`                   // Points to a skill from the “skill” field in skills.txt file, gives the hireling the Skill to use (requires “Mode5”, “Chance5”, “ChancePerLvl5”)
	Skill6                      string  `csv:"Skill6"`                   // Points to a skill from the “skill” field in skills.txt file, gives the hireling the Skill to use (requires “Mode6”, “Chance6”, “ChancePerLvl6”)
	Mode1                       int     `csv:"Mode1"`                    // Uses a monster mode to determine the hireling’s behavior when using the related Skill (numeric ID of the monster mode, not the Token)
	Mode2                       int     `csv:"Mode2"`                    // Uses a monster mode to determine the hireling’s behavior when using the related Skill (numeric ID of the monster mode, not the Token)
	Mode3                       int     `csv:"Mode3"`                    // Uses a monster mode to determine the hireling’s behavior when using the related Skill (numeric ID of the monster mode, not the Token)
	Mode4                       int     `csv:"Mode4"`                    // Uses a monster mode to determine the hireling’s behavior when using the related Skill (numeric ID of the monster mode, not the Token)
	Mode5                       int     `csv:"Mode5"`                    // Uses a monster mode to determine the hireling’s behavior when using the related Skill (numeric ID of the monster mode, not the Token)
	Mode6                       int     `csv:"Mode6"`                    // Uses a monster mode to determine the hireling’s behavior when using the related Skill (numeric ID of the monster mode, not the Token)
	Chance1                     int     `csv:"Chance1"`                  // Base chance for the hireling to use Skill1, denominator value for random roll
	Chance2                     int     `csv:"Chance2"`                  // Base chance for the hireling to use Skill2, denominator value for random roll
	Chance3                     int     `csv:"Chance3"`                  // Base chance for the hireling to use Skill3, denominator value for random roll
	Chance4                     int     `csv:"Chance4"`                  // Base chance for the hireling to use Skill4, denominator value for random roll
	Chance5                     int     `csv:"Chance5"`                  // Base chance for the hireling to use Skill5, denominator value for random roll
	Chance6                     int     `csv:"Chance6"`                  // Base chance for the hireling to use Skill6, denominator value for random roll
	ChancePerLevel1             int     `csv:"ChancePerLvl1"`            // Chance for the hireling to use Skill1, affected by the difference in current Level and “Level” field
	ChancePerLevel2             int     `csv:"ChancePerLvl2"`            // Chance for the hireling to use Skill2, affected by the difference in current Level and “Level” field
	ChancePerLevel3             int     `csv:"ChancePerLvl3"`            // Chance for the hireling to use Skill3, affected by the difference in current Level and “Level” field
	ChancePerLevel4             int     `csv:"ChancePerLvl4"`            // Chance for the hireling to use Skill4, affected by the difference in current Level and “Level” field
	ChancePerLevel5             int     `csv:"ChancePerLvl5"`            // Chance for the hireling to use Skill5, affected by the difference in current Level and “Level” field
	ChancePerLevel6             int     `csv:"ChancePerLvl6"`            // Chance for the hireling to use Skill6, affected by the difference in current Level and “Level” field
	Skill1Level                 int     `csv:"Level1"`                   // Starting Level for Skill1
	Skill2Level                 int     `csv:"Level2"`                   // Starting Level for Skill2
	Skill3Level                 int     `csv:"Level3"`                   // Starting Level for Skill3
	Skill4Level                 int     `csv:"Level4"`                   // Starting Level for Skill4
	Skill5Level                 int     `csv:"Level5"`                   // Starting Level for Skill5
	Skill6Level                 int     `csv:"Level6"`                   // Starting Level for Skill6
	Skill1LevelPerLevel         int     `csv:"LvlPerLvl1"`               // Modifier to increase Skill1 level for every Level gained
	Skill2LevelPerLevel         int     `csv:"LvlPerLvl2"`               // Modifier to increase Skill2 level for every Level gained
	Skill3LevelPerLevel         int     `csv:"LvlPerLvl3"`               // Modifier to increase Skill3 level for every Level gained
	Skill4LevelPerLevel         int     `csv:"LvlPerLvl4"`               // Modifier to increase Skill4 level for every Level gained
	Skill5LevelPerLevel         int     `csv:"LvlPerLvl5"`               // Modifier to increase Skill5 level for every Level gained
	Skill6LevelPerLevel         int     `csv:"LvlPerLvl6"`               // Modifier to increase Skill6 level for every Level gained
	HiringMaxLevelDifference    int     `csv:"HiringMaxLevelDifference"` // Used to generate a range for the hireling's starting Level in the hiring UI window
	ResurrectCostMultiplier     int     `csv:"resurrectcostmultiplier"`  // Modifier used to calculate the hireling’s current resurrect cost
	ResurrectCostDivisor        int     `csv:"resurrectcostdivisor"`     // Modifier used to calculate the hireling’s current resurrect cost
	ResurrectCostMax            int     `csv:"resurrectcostmax"`         // Maximum Gold cost to resurrect this hireling
	EquivalentCharClass         string  `csv:"equivalentcharclass"`      // Determines what class this hireling is treated like under the hood for calculating skill level bonuses and gear restrictions
}

type HirelingDescription

type HirelingDescription struct {
	ID             int  `csv:"id"`             // The id of the hireling monster class as defined in monstats.txt
	AlternateVoice bool `csv:"alternateVoice"` // Boolean field. If equals 1, then the hireling will use the alternate (feminine) voice type for voice lines. If equals 0, then it will use the masculine voice type.
}

type InventoryData

type InventoryData struct {
	// Class is a reference field to define the type of inventory screen.
	Class string `csv:"class"`

	// InvLeft is the starting X coordinate pixel position of the inventory panel.
	InvLeft int `csv:"invLeft"`

	// InvRight is the ending X coordinate pixel position of the inventory panel (Includes the "InvLeft" value with the inventory width size).
	InvRight int `csv:"invRight"`

	// InvTop is the starting Y coordinate pixel position of the inventory panel.
	InvTop int `csv:"invTop"`

	// InvBottom is the ending Y coordinate pixel position of the inventory panel (Includes the "InvTop" value with the inventory height size).
	InvBottom int `csv:"invBottom"`

	// GridX is the column number size of the inventory grid, measured in the number of grid boxes to use.
	GridX int `csv:"gridX"`

	// GridY is the column row size of the inventory grid, measured in the number of grid boxes to use.
	GridY int `csv:"gridY"`

	// GridLeft is the starting X coordinate location of the inventory's left grid side.
	GridLeft int `csv:"gridLeft"`

	// GridRight is the ending X coordinate location of the inventory's right grid side (Includes the "GridLeft" value with the grid width size).
	GridRight int `csv:"gridRight"`

	// GridTop is the starting Y coordinate location of the inventory's top grid side.
	GridTop int `csv:"gridTop"`

	// GridBottom is the ending Y coordinate location of the inventory's bottom grid side (Includes the "GridTop" value with the grid height size).
	GridBottom int `csv:"gridBottom"`

	// GridBoxWidth is the width size of an inventory's box cell.
	GridBoxWidth int `csv:"gridBoxWidth"`

	// GridBoxHeight is the height size of an inventory's box cell.
	GridBoxHeight int `csv:"gridBoxHeight"`

	// RArmLeft is the starting X coordinate location of the Right Weapon Slot.
	RArmLeft int `csv:"rArmLeft"`

	// RArmRight is the ending X coordinate location of the Right Weapon Slot (Includes the "RArmLeft" value with the "RArmWidth" value).
	RArmRight int `csv:"rArmRight"`

	// RArmTop is the starting Y coordinate location of the Right Weapon Slot.
	RArmTop int `csv:"rArmTop"`

	// RArmBottom is the ending Y coordinate location of the Right Weapon Slot (Includes the "RArmTop" value with the "RArmHeight" value).
	RArmBottom int `csv:"rArmBottom"`

	// RArmWidth is the pixel width of the Right Weapon Slot.
	RArmWidth int `csv:"rArmWidth"`

	// RArmHeight is the pixel height of the Right Weapon Slot.
	RArmHeight int `csv:"rArmHeight"`

	// TorsoLeft is the starting X coordinate location of the Body Armor Slot.
	TorsoLeft int `csv:"torsoLeft"`

	// TorsoRight is the ending X coordinate location of the Body Armor Slot (Includes the "TorsoLeft" value with the "TorsoWidth" value).
	TorsoRight int `csv:"torsoRight"`

	// TorsoTop is the starting Y coordinate location of the Body Armor Slot.
	TorsoTop int `csv:"torsoTop"`

	// TorsoBottom is the ending Y coordinate location of the Body Armor Slot (Includes the "TorsoTop" value with the "TorsoHeight" value).
	TorsoBottom int `csv:"torsoBottom"`

	// TorsoWidth is the pixel width of the Body Armor Slot.
	TorsoWidth int `csv:"torsoWidth"`

	// TorsoHeight is the pixel height of the Body Armor Slot.
	TorsoHeight int `csv:"torsoHeight"`

	// LArmLeft is the starting X coordinate location of the Left Weapon Slot.
	LArmLeft int `csv:"lArmLeft"`

	// LArmRight is the ending X coordinate location of the Left Weapon Slot (Includes the "LArmLeft" value with the "LArmWidth" value).
	LArmRight int `csv:"lArmRight"`

	// LArmTop is the starting Y coordinate location of the Left Weapon Slot.
	LArmTop int `csv:"lArmTop"`

	// LArmBottom is the ending Y coordinate location of the Left Weapon Slot (Includes the "LArmTop" value with the "LArmHeight" value).
	LArmBottom int `csv:"lArmBottom"`

	// LArmWidth is the pixel width of the Left Weapon Slot.
	LArmWidth int `csv:"lArmWidth"`

	// LArmHeight is the pixel height of the Left Weapon Slot.
	LArmHeight int `csv:"lArmHeight"`

	// HeadLeft is the starting X coordinate location of the Helm Slot.
	HeadLeft int `csv:"headLeft"`

	// HeadRight is the ending X coordinate location of the Helm Slot (Includes the "HeadLeft" value with the "HeadWidth" value).
	HeadRight int `csv:"headRight"`

	// HeadTop is the starting Y coordinate location of the Helm Slot.
	HeadTop int `csv:"headTop"`

	// HeadBottom is the ending Y coordinate location of the Helm Slot (Includes the "HeadTop" value with the "HeadHeight" value).
	HeadBottom int `csv:"headBottom"`

	// HeadWidth is the pixel width of the Helm Slot.
	HeadWidth int `csv:"headWidth"`

	// HeadHeight is the pixel height of the Helm Slot.
	HeadHeight int `csv:"headHeight"`

	// NeckLeft is the starting X coordinate location of the Amulet Slot.
	NeckLeft int `csv:"neckLeft"`

	// NeckRight is the ending X coordinate location of the Amulet Slot (Includes the "NeckLeft" value with the "NeckWidth" value).
	NeckRight int `csv:"neckRight"`

	// NeckTop is the starting Y coordinate location of the Amulet Slot.
	NeckTop int `csv:"neckTop"`

	// NeckBottom is the ending Y coordinate location of the Amulet Slot (Includes the "NeckTop" value with the "NeckHeight" value).
	NeckBottom int `csv:"neckBottom"`

	// NeckWidth is the pixel width of the Amulet Slot.
	NeckWidth int `csv:"neckWidth"`

	// NeckHeight is the pixel height of the Amulet Slot.
	NeckHeight int `csv:"neckHeight"`

	// RHandLeft is the starting X coordinate location of the Right Ring Slot.
	RHandLeft int `csv:"rHandLeft"`

	// RHandRight is the ending X coordinate location of the Right Ring Slot (Includes the "RHandLeft" value with the "RHandWidth" value).
	RHandRight int `csv:"rHandRight"`

	// RHandTop is the starting Y coordinate location of the Right Ring Slot.
	RHandTop int `csv:"rHandTop"`

	// RHandBottom is the ending Y coordinate location of the Right Ring Slot (Includes the "RHandTop" value with the "RHandHeight" value).
	RHandBottom int `csv:"rHandBottom"`

	// RHandWidth is the pixel width of the Right Ring Slot.
	RHandWidth int `csv:"rHandWidth"`

	// RHandHeight is the pixel height of the Right Ring Slot.
	RHandHeight int `csv:"rHandHeight"`

	// LHandLeft is the starting X coordinate location of the Left Ring Slot.
	LHandLeft int `csv:"lHandLeft"`

	// LHandRight is the ending X coordinate location of the Left Ring Slot (Includes the "LHandLeft" value with the "LHandWidth" value).
	LHandRight int `csv:"lHandRight"`

	// LHandTop is the starting Y coordinate location of the Left Ring Slot.
	LHandTop int `csv:"lHandTop"`

	// LHandBottom is the ending Y coordinate location of the Left Ring Slot (Includes the "LHandTop" value with the "LHandHeight" value).
	LHandBottom int `csv:"lHandBottom"`

	// LHandWidth is the pixel width of the Left Ring Slot.
	LHandWidth int `csv:"lHandWidth"`

	// LHandHeight is the pixel height of the Left Ring Slot.
	LHandHeight int `csv:"lHandHeight"`

	// BeltLeft is the starting X coordinate location of the Belt Slot.
	BeltLeft int `csv:"beltLeft"`

	// BeltRight is the ending X coordinate location of the Belt Slot (Includes the "BeltLeft" value with the "BeltWidth" value).
	BeltRight int `csv:"beltRight"`

	// BeltTop is the starting Y coordinate location of the Belt Slot.
	BeltTop int `csv:"beltTop"`

	// BeltBottom is the ending Y coordinate location of the Belt Slot (Includes the "BeltTop" value with the "BeltHeight" value).
	BeltBottom int `csv:"beltBottom"`

	// BeltWidth is the pixel width of the Belt Slot.
	BeltWidth int `csv:"beltWidth"`

	// BeltHeight is the pixel height of the Belt Slot.
	BeltHeight int `csv:"beltHeight"`

	// FeetLeft is the starting X coordinate location of the Boots Slot.
	FeetLeft int `csv:"feetLeft"`

	// FeetRight is the ending X coordinate location of the Boots Slot (Includes the "FeetLeft" value with the "FeetWidth" value).
	FeetRight int `csv:"feetRight"`

	// FeetTop is the starting Y coordinate location of the Boots Slot.
	FeetTop int `csv:"feetTop"`

	// FeetBottom is the ending Y coordinate location of the Boots Slot (Includes the "FeetTop" value with the "FeetHeight" value).
	FeetBottom int `csv:"feetBottom"`

	// FeetWidth is the pixel width of the Boots Slot.
	FeetWidth int `csv:"feetWidth"`

	// FeetHeight is the pixel height of the Boots Slot.
	FeetHeight int `csv:"feetHeight"`

	// GlovesLeft is the starting X coordinate location of the Gloves Slot.
	GlovesLeft int `csv:"glovesLeft"`

	// GlovesRight is the ending X coordinate location of the Gloves Slot (Includes the "GlovesLeft" value with the "GlovesWidth" value).
	GlovesRight int `csv:"glovesRight"`

	// GlovesTop is the starting Y coordinate location of the Gloves Slot.
	GlovesTop int `csv:"glovesTop"`

	// GlovesBottom is the ending Y coordinate location of the Gloves Slot (Includes the "GlovesTop" value with the "GlovesHeight" value).
	GlovesBottom int `csv:"glovesBottom"`

	// GlovesWidth is the pixel width of the Gloves Slot.
	GlovesWidth int `csv:"glovesWidth"`

	// GlovesHeight is the pixel height of the Gloves Slot.
	GlovesHeight int `csv:"glovesHeight"`
}

InventoryData represents the data from the "inventory.txt" file.

type ItemArmor

type ItemArmor struct {
	// Name is the reference field to define the item.
	Name string `csv:"name"`

	// Version defines which game version to create this item (0 = Classic mode | 100 = Expansion mode).
	Version int `csv:"version"`

	// CompactSave is a boolean field. If equals 1, then only the item's base stats will be stored in the character save,
	// but not any modifiers or additional stats. If equals 0, then all of the item's stats will be saved.
	CompactSave int `csv:"compactsave"`

	// Rarity determines the chance that the item will randomly spawn (1/#).
	// The higher the value, the rarer the item will be.
	// This field depends on the "spawnable" field being enabled, the "quest" field being disabled,
	// and the item level being less than or equal to the area level.
	// This value is also affected by the relative Act number that the item is dropping in,
	// where the higher the Act number, the more common the item will drop.
	Rarity int `csv:"rarity"`

	// Spawnable is a boolean field. If equals 1, then this item can be randomly spawned.
	// If equals 0, then this item will never randomly spawn.
	Spawnable int `csv:"spawnable"`

	// MinAC is the minimum amount of Defense that an armor item type can have.
	MinAC int `csv:"minac"`

	// MaxAC is the maximum amount of Defense that an armor item type can have.
	MaxAC int `csv:"maxac"`

	// Absorbs specifies the amount of damage that an item can absorb.
	Absorbs int `csv:"absorbs"`

	// Speed affects the Walk/Run Speed reduction when wearing the armor.
	Speed int `csv:"speed"`

	// ReqStr defines the amount of the Strength attribute needed to use the item.
	ReqStr int `csv:"reqstr"`

	// Block controls the block percent chance that the item provides (out of 100, but caps at 75).
	Block int `csv:"block"`

	// Durability defines the base durability amount that the item will spawn with.
	Durability int `csv:"durability"`

	// NoDurability is a boolean field. If equals 1, then the item will not have durability.
	// If equals 0, then the item will have durability.
	NoDurability int `csv:"nodurability"`

	// Level controls the base item level. This is used for determining when the item is allowed to drop,
	// such as making sure that the item level is not greater than the monster's level or the area level.
	Level int `csv:"level"`

	// LevelReq controls the player level requirement for being able to use the item.
	LevelReq int `csv:"levelreq"`

	// Cost defines the base gold cost of the item when being sold by an NPC.
	// This can be affected by item modifiers and the rarity of the item.
	Cost int `csv:"cost"`

	// GambleCost defines the gambling gold cost of the item on the Gambling UI.
	GambleCost int `csv:"gamble cost"`

	// Code defines a unique 3 letter/number code for the item. This is used as an identifier to reference the item.
	Code string `csv:"code"`

	// NameStr is the String Key that is used for the base item name.
	NameStr string `csv:"namestr"`

	// MagicLvl defines the magic level of the item, which can affect how magical item modifiers that can appear on the item.
	MagicLvl int `csv:"magic lvl"`

	// AutoPrefix is a boolean field. If equals 1, then the item automatically picks an item affix name
	// from a designated "group" value from the automagic.txt file, instead of using random prefixes.
	// This is only used when the item is of Magical quality.
	AutoPrefix int `csv:"auto prefix"`

	// AlternateGfx uses a unique 3 letter/number code similar to the defined "Code" fields
	// to determine what in-game graphics to display on the player character when the item is equipped.
	AlternateGfx string `csv:"alternategfx"`

	// OpenBetaGfx is a field for graphics used during the open beta version of the game.
	OpenBetaGfx string `csv:"OpenBetaGfx"`

	// NormCode links to a "Code" field to determine the normal version of the item.
	NormCode string `csv:"normcode"`

	// UberCode links to a "Code" field to determine the Exceptional version of the item.
	UberCode string `csv:"ubercode"`

	// UltraCode links to a "Code" field to determine the Elite version of the item.
	UltraCode string `csv:"ultracode"`

	// SpellOffset controls the offset index for reading spell data related to the item from the spells.txt file.
	SpellOffset int `csv:"spelloffset"`

	// Component determines the layer of player animation when the item is equipped.
	// This uses a code referenced from the Composit.txt file.
	Component int `csv:"component"`

	// InvWidth and InvHeight define the width and height of grid cells that the item occupies in the player inventory.
	InvWidth  int `csv:"invwidth"`
	InvHeight int `csv:"invheight"`

	// HasInv is a boolean field. If equals 1, then the item will have its own inventory allowing for the capability to socket gems, runes, or jewels.
	// If equals 0, then the item will not have its own inventory.
	HasInv int `csv:"hasinv"`

	// GemSockets determines the number of sockets that the item can have, allowing for socketing gems or runes.
	GemSockets int `csv:"gemsockets"`

	// GemApplyType defines the type of gems that can be used with the item.
	GemApplyType int `csv:"gemapplytype"`

	// FlippyFile is the .dc6 file that contains the graphics of the item on the ground when it is dropped.
	FlippyFile string `csv:"flippyfile"`

	// InvFile is the .dc6 file that contains the graphics of the item in the player's inventory.
	InvFile string `csv:"invfile"`

	// UniqueInvFile is the .dc6 file that contains the graphics of a unique item in the player's inventory.
	UniqueInvFile string `csv:"uniqueinvfile"`

	// SetInvFile is the .dc6 file that contains the graphics of a set item in the player's inventory.
	SetInvFile string `csv:"setinvfile"`

	// RArm, LArm, Torso, and Legs fields are used to specify which inventory slot the item should appear on the player model.
	RArm  int `csv:"rArm"`
	LArm  int `csv:"lArm"`
	Torso int `csv:"Torso"`
	Legs  int `csv:"Legs"`

	// RSPad and LSPad fields are used for specifying padding for 3D rendering of the item's graphic.
	RSPad int `csv:"rSPad"`
	LSPad int `csv:"lSPad"`

	// Useable is a boolean field. If equals 1, then the item can be used by right-clicking it.
	// If equals 0, then the item cannot be used.
	Useable int `csv:"useable"`

	// Throwable is a boolean field. If equals 1, then the item can be thrown.
	// If equals 0, then the item cannot be thrown.
	Throwable int `csv:"throwable"`

	// Stackable is a boolean field. If equals 1, then the item can be stacked in the inventory.
	// If equals 0, then the item cannot be stacked.
	Stackable int `csv:"stackable"`

	// MinStack and MaxStack define the minimum and maximum number of items that can be stacked together.
	MinStack int `csv:"minstack"`
	MaxStack int `csv:"maxstack"`

	// Type and Type2 fields are used to categorize the item and determine what class of items it belongs to.
	Type  string `csv:"type"`
	Type2 string `csv:"type2"`

	// DropSound is the sound that is played when the item is dropped on the ground.
	DropSound string `csv:"dropsound"`

	// DropSfxFrame is the frame number in the flippy file where the item's sound effect is triggered.
	DropSfxFrame int `csv:"dropsfxframe"`

	// UseSound specifies the sound that is played when the item is used.
	UseSound string `csv:"usesound"`

	// Unique is a boolean field. If equals 1, then the item is unique and can only be found once in the game.
	// If equals 0, then the item is not unique and can be found multiple times.
	Unique int `csv:"unique"`

	// Transparent is a boolean field. If equals 1, then the item has transparency.
	// If equals 0, then the item does not have transparency.
	Transparent int `csv:"transparent"`

	// TransTbl defines the transform table used for certain item types to determine how they appear in-game.
	TransTbl int `csv:"transtbl"`

	// Quivered is a boolean field. If equals 1, then the item can be equipped in the quiver slot.
	// If equals 0, then the item cannot be equipped in the quiver slot.
	Quivered int `csv:"quivered"`

	// LightRadius defines the light radius of the item when equipped.
	LightRadius int `csv:"lightradius"`

	// Belt is a boolean field. If equals 1, then the item can be equipped in the belt slot.
	// If equals 0, then the item cannot be equipped in the belt slot.
	Belt int `csv:"belt"`

	// Quest is a boolean field. If equals 1, then the item is a quest item.
	// If equals 0, then the item is not a quest item.
	Quest int `csv:"quest"`

	// MissileType is used to determine the type of missile projectile the item uses when thrown or shot.
	MissileType string `csv:"missiletype"`

	// DurWarning is a boolean field. If equals 1, then the game will warn the player when the item's durability is low.
	// If equals 0, then there will be no warning for low durability.
	DurWarning int `csv:"durwarning"`

	// QntWarning is a boolean field. If equals 1, then the game will warn the player when the item's quantity is low.
	// If equals 0, then there will be no warning for low quantity.
	QntWarning int `csv:"qntwarning"`

	// MinDam and MaxDam define the minimum and maximum damage values for the item.
	MinDam int `csv:"mindam"`
	MaxDam int `csv:"maxdam"`

	// StrBonus and DexBonus specify the strength and dexterity bonuses provided by the item when equipped.
	StrBonus int `csv:"StrBonus"`
	DexBonus int `csv:"DexBonus"`

	// GemOffset determines the index of the gem information in the gems.txt file.
	GemOffset int `csv:"gemoffset"`

	// Bitfield1 is a field that contains various bit flags for different item properties.
	Bitfield1 int `csv:"bitfield1"`

	CharsiMin      int `csv:"CharsiMin"`
	CharsiMax      int `csv:"CharsiMax"`
	CharsiMagicMin int `csv:"CharsiMagicMin"`
	CharsiMagicMax int `csv:"CharsiMagicMax"`
	CharsiMagicLvl int `csv:"CharsiMagicLvl"`

	GheedMin      int `csv:"GheedMin"`
	GheedMax      int `csv:"GheedMax"`
	GheedMagicMin int `csv:"GheedMagicMin"`
	GheedMagicMax int `csv:"GheedMagicMax"`
	GheedMagicLvl int `csv:"GheedMagicLvl"`

	AkaraMin      int `csv:"AkaraMin"`
	AkaraMax      int `csv:"AkaraMax"`
	AkaraMagicMin int `csv:"AkaraMagicMin"`
	AkaraMagicMax int `csv:"AkaraMagicMax"`
	AkaraMagicLvl int `csv:"AkaraMagicLvl"`

	FaraMin      int `csv:"FaraMin"`
	FaraMax      int `csv:"FaraMax"`
	FaraMagicMin int `csv:"FaraMagicMin"`
	FaraMagicMax int `csv:"FaraMagicMax"`
	FaraMagicLvl int `csv:"FaraMagicLvl"`

	LysanderMin      int `csv:"LysanderMin"`
	LysanderMax      int `csv:"LysanderMax"`
	LysanderMagicMin int `csv:"LysanderMagicMin"`
	LysanderMagicMax int `csv:"LysanderMagicMax"`
	LysanderMagicLvl int `csv:"LysanderMagicLvl"`

	DrognanMin      int `csv:"DrognanMin"`
	DrognanMax      int `csv:"DrognanMax"`
	DrognanMagicMin int `csv:"DrognanMagicMin"`
	DrognanMagicMax int `csv:"DrognanMagicMax"`
	DrognanMagicLvl int `csv:"DrognanMagicLvl"`

	HraltiMin      int `csv:"HraltiMin"`
	HraltiMax      int `csv:"HraltiMax"`
	HraltiMagicMin int `csv:"HraltiMagicMin"`
	HraltiMagicMax int `csv:"HraltiMagicMax"`
	HratliMagicLvl int `csv:"HratliMagicLvl"`

	AlkorMin      int `csv:"AlkorMin"`
	AlkorMax      int `csv:"AlkorMax"`
	AlkorMagicMin int `csv:"AlkorMagicMin"`
	AlkorMagicMax int `csv:"AlkorMagicMax"`
	AlkorMagicLvl int `csv:"AlkorMagicLvl"`

	OrmusMin      int `csv:"OrmusMin"`
	OrmusMax      int `csv:"OrmusMax"`
	OrmusMagicMin int `csv:"OrmusMagicMin"`
	OrmusMagicMax int `csv:"OrmusMagicMax"`
	OrmusMagicLvl int `csv:"OrmusMagicLvl"`

	ElzixMin      int `csv:"ElzixMin"`
	ElzixMax      int `csv:"ElzixMax"`
	ElzixMagicMin int `csv:"ElzixMagicMin"`
	ElzixMagicMax int `csv:"ElzixMagicMax"`
	ElzixMagicLvl int `csv:"ElzixMagicLvl"`

	AshearaMin      int `csv:"AshearaMin"`
	AshearaMax      int `csv:"AshearaMax"`
	AshearaMagicMin int `csv:"AshearaMagicMin"`
	AshearaMagicMax int `csv:"AshearaMagicMax"`
	AshearaMagicLvl int `csv:"AshearaMagicLvl"`

	CainMin      int `csv:"CainMin"`
	CainMax      int `csv:"CainMax"`
	CainMagicMin int `csv:"CainMagicMin"`
	CainMagicMax int `csv:"CainMagicMax"`
	CainMagicLvl int `csv:"CainMagicLvl"`

	HalbuMin      int `csv:"HalbuMin"`
	HalbuMax      int `csv:"HalbuMax"`
	HalbuMagicMin int `csv:"HalbuMagicMin"`
	HalbuMagicMax int `csv:"HalbuMagicMax"`
	HalbuMagicLvl int `csv:"HalbuMagicLvl"`

	JamellaMin      int `csv:"JamellaMin"`
	JamellaMax      int `csv:"JamellaMax"`
	JamellaMagicMin int `csv:"JamellaMagicMin"`
	JamellaMagicMax int `csv:"JamellaMagicMax"`
	JamellaMagicLvl int `csv:"JamellaMagicLvl"`

	LarzukMin      int `csv:"LarzukMin"`
	LarzukMax      int `csv:"LarzukMax"`
	LarzukMagicMin int `csv:"LarzukMagicMin"`
	LarzukMagicMax int `csv:"LarzukMagicMax"`
	LarzukMagicLvl int `csv:"LarzukMagicLvl"`

	MalahMin      int `csv:"MalahMin"`
	MalahMax      int `csv:"MalahMax"`
	MalahMagicMin int `csv:"MalahMagicMin"`
	MalahMagicMax int `csv:"MalahMagicMax"`
	MalahMagicLvl int `csv:"MalahMagicLvl"`

	DrehyaMin      int `csv:"DrehyaMin"`
	DrehyaMax      int `csv:"DrehyaMax"`
	DrehyaMagicMin int `csv:"DrehyaMagicMin"`
	DrehyaMagicMax int `csv:"DrehyaMagicMax"`
	DrehyaMagicLvl int `csv:"DrehyaMagicLvl"`

	// SourceArt and GameArt specify the art that is used for the item in the source file and the game file, respectively.
	SourceArt string `csv:"Source Art"`
	GameArt   string `csv:"Game Art"`

	// Transform is a boolean field. If equals 1, then the item can transform or "morph" the player character
	// when equipped. If equals 0, then the item does not have transformation capabilities.
	Transform int `csv:"Transform"`

	// InvTrans is a boolean field. If equals 1, then the item can be moved in the inventory while it is still in the process of being identified.
	// If equals 0, then the item cannot be moved until the identification process is completed.
	InvTrans int `csv:"InvTrans"`

	// SkipName is a boolean field. If equals 1, then the item name will not be displayed when the item is dropped.
	// If equals 0, then the item name will be displayed when the item is dropped.
	SkipName int `csv:"SkipName"`

	// NightmareUpgrade is a boolean field. If equals 1, then the item can be upgraded to an exceptional version in Nightmare difficulty.
	// If equals 0, then the item cannot be upgraded in Nightmare difficulty.
	NightmareUpgrade string `csv:"NightmareUpgrade"`

	// HellUpgrade is a boolean field. If equals 1, then the item can be upgraded to an elite version in Hell difficulty.
	// If equals 0, then the item cannot be upgraded in Hell difficulty.
	HellUpgrade string `csv:"HellUpgrade"`

	// Nameable is a boolean field. If equals 1, then the item can be named.
	// If equals 0, then the item cannot be named.
	Nameable int `csv:"nameable"`
}

ItemArmor represents an item in the game.

type ItemBodyLocation

type ItemBodyLocation string

ItemBodyLocation represents the possible body locations for equippable items

const (
	ItemBodyLocationNone   ItemBodyLocation = ""
	ItemBodyLocationHead   ItemBodyLocation = "head"
	ItemBodyLocationNeck   ItemBodyLocation = "neck"
	ItemBodyLocationTorso  ItemBodyLocation = "tors"
	ItemBodyLocationRArm   ItemBodyLocation = "rarm"
	ItemBodyLocationLArm   ItemBodyLocation = "larm"
	ItemBodyLocationRRing  ItemBodyLocation = "rrin"
	ItemBodyLocationLRing  ItemBodyLocation = "lrin"
	ItemBodyLocationBelt   ItemBodyLocation = "belt"
	ItemBodyLocationFeet   ItemBodyLocation = "feet"
	ItemBodyLocationGloves ItemBodyLocation = "glov"
)

type ItemClass

type ItemClass string

ItemClass represents the classes that can use specific items

const (
	ItemClassNone        ItemClass = ""
	ItemClassAmazon      ItemClass = "ama"
	ItemClassBarbarian   ItemClass = "bar"
	ItemClassPaladin     ItemClass = "pal"
	ItemClassNecromancer ItemClass = "nec"
	ItemClassSorceress   ItemClass = "sor"
	ItemClassDruid       ItemClass = "dru"
	ItemClassAssassin    ItemClass = "ass"
)

type ItemHighQualityModifiers

type ItemHighQualityModifiers struct {
	Mod1Code  string `csv:"mod1code"`  // First item property code (references Properties.txt).
	Mod1Param int    `csv:"mod1param"` // First item property parameter value.
	Mod1Min   int    `csv:"mod1min"`   // First item property min value.
	Mod1Max   int    `csv:"mod1max"`   // First item property max value.

	Mod2Code  string `csv:"mod2code"`  // Second item property code (references Properties.txt).
	Mod2Param int    `csv:"mod2param"` // Second item property parameter value.
	Mod2Min   int    `csv:"mod2min"`   // Second item property min value.
	Mod2Max   int    `csv:"mod2max"`   // Second item property max value.

	Armor   bool `csv:"armor"`   // If true, the modifier can be applied to torso armor and helmet item types.
	Weapon  bool `csv:"weapon"`  // If true, the modifier can be applied to melee weapon item types (except scepters, wands, and staves).
	Shield  bool `csv:"shield"`  // If true, the modifier can be applied to shield item types.
	Scepter bool `csv:"scepter"` // If true, the modifier can be applied to scepter item types.
	Wand    bool `csv:"wand"`    // If true, the modifier can be applied to wand item types.
	Staff   bool `csv:"staff"`   // If true, the modifier can be applied to staff item types.
	Bow     bool `csv:"bow"`     // If true, the modifier can be applied to bow or crossbow item types.
	Boots   bool `csv:"boots"`   // If true, the modifier can be applied to boots item types.
	Gloves  bool `csv:"gloves"`  // If true, the modifier can be applied to gloves item types.
	Belt    bool `csv:"belt"`    // If true, the modifier can be applied to belt item types.
}

ItemHighQualityModifiers represents a group of item modifiers for High Quality (Superior) item types.

type ItemProperty

type ItemProperty struct {
	Code string `csv:"code"` // ItemProperty ID used as a reference in other data files.

	Func1 string `csv:"func1"` // Function ID for defining the property behavior.
	Func2 string `csv:"func2"` // Additional Function ID.
	Func3 string `csv:"func3"` // Additional Function ID.
	Func4 string `csv:"func4"` // Additional Function ID.
	Func5 string `csv:"func5"` // Additional Function ID.
	Func6 string `csv:"func6"` // Additional Function ID.
	Func7 string `csv:"func7"` // Additional Function ID.

	Stat1 string `csv:"stat1"` // Stat applied by the property (references ItemStatCost.txt).
	Stat2 string `csv:"stat2"` // Additional Stat.
	Stat3 string `csv:"stat3"` // Additional Stat.
	Stat4 string `csv:"stat4"` // Additional Stat.
	Stat5 string `csv:"stat5"` // Additional Stat.
	Stat6 string `csv:"stat6"` // Additional Stat.
	Stat7 string `csv:"stat7"` // Additional Stat.

	Set1 bool `csv:"set1"` // Boolean field. If true, set the stat value regardless of its current value.
	Set2 bool `csv:"set2"` // Additional Boolean field.
	Set3 bool `csv:"set3"` // Additional Boolean field.
	Set4 bool `csv:"set4"` // Additional Boolean field.
	Set5 bool `csv:"set5"` // Additional Boolean field.
	Set6 bool `csv:"set6"` // Additional Boolean field.
	Set7 bool `csv:"set7"` // Additional Boolean field.

	Val1 int `csv:"val1"` // Integer field used as a possible input parameter for additional function calculations.
	Val2 int `csv:"val2"` // Additional Integer field.
	Val3 int `csv:"val3"` // Additional Integer field.
	Val4 int `csv:"val4"` // Additional Integer field.
	Val5 int `csv:"val5"` // Additional Integer field.
	Val6 int `csv:"val6"` // Additional Integer field.
	Val7 int `csv:"val7"` // Additional Integer field.
}

ItemProperty represents an item modifier and its associated function.

type ItemQualityLevel

type ItemQualityLevel int

ItemQualityLevel represents the item quality level

const (
	// AnyQuality represents any quality level (Used for a random quality)
	AnyQuality ItemQualityLevel = iota
	// LowQuality represents Low Quality level (Ex: "Crude")
	LowQuality
	// NormalQuality represents Normal Quality level (Default value if the value is empty)
	NormalQuality
	// HighQuality represents High Quality level (Superior)
	HighQuality
	// MagicQuality represents Magic Quality level (Uses Magic Prefixes and Suffixes)
	MagicQuality
	// SetItem represents Set Item quality level
	SetItem
	// RareQuality represents Rare Quality level
	RareQuality
	// UniqueQuality represents Unique Quality level (Predetermined stats)
	UniqueQuality
	// CraftedQuality represents Crafted Quality level
	CraftedQuality
	// TemperedQuality represents Tempered Quality level
	TemperedQuality
)

type ItemRatio

type ItemRatio struct {
	Function      ItemRatioFunction `csv:"Function"`         // Reference field to define the item ratio name.
	Version       int               `csv:"Version"`          // Game version to use this item ratio (0 = Classic mode | 100 = Expansion mode).
	Uber          int               `csv:"Uber"`             // If 1, the item ratio applies to Exceptional or Elite Quality items; else it applies to Normal Quality items.
	ClassSpecific int               `csv:"Class Specific"`   // If 1, the item ratio applies to class-based items.
	Unique        int               `csv:"Unique"`           // Base value for calculating the Unique Quality chance. Higher value means rarer chance. (Calculated first)
	UniqueDivisor int               `csv:"UniqueDivisor"`    // Modifier for changing the Unique Quality chance based on the difference between the Monster Level and the Item's base level.
	UniqueMin     int               `csv:"UniqueMin"`        // The minimum value of the probability denominator for Unique Quality. (Calculated in 128ths)
	Set           int               `csv:"Set"`              // Base value for calculating the Set Quality chance. Higher value means rarer chance. (Calculated after Unique)
	SetDivisor    int               `csv:"SetDivisor"`       // Modifier for changing the Set Quality chance based on the difference between the Monster Level and the Item's base level.
	SetMin        int               `csv:"SetMin"`           // The minimum value of the probability denominator for Set Quality. (Calculated in 128ths)
	Rare          int               `csv:"Rare"`             // Base value for calculating the Rare Quality chance. Higher value means rarer chance. (Calculated after Set)
	RareDivisor   int               `csv:"RareDivisor"`      // Modifier for changing the Rare Quality chance based on the difference between the Monster Level and the Item's base level.
	RareMin       int               `csv:"RareMin"`          // The minimum value of the probability denominator for Rare Quality. (Calculated in 128ths)
	Magic         int               `csv:"Magic"`            // Base value for calculating the Magic Quality chance. Higher value means rarer chance. (Calculated after Rare)
	MagicDivisor  int               `csv:"MagicDivisor"`     // Modifier for changing the Magic Quality chance based on the difference between the Monster Level and the Item's base level.
	MagicMin      int               `csv:"MagicMin"`         // The minimum value of the probability denominator for Magic Quality. (Calculated in 128ths)
	HiQuality     int               `csv:"HiQuality"`        // Base value for calculating the High Quality (Superior) chance. Higher value means rarer chance. (Calculated after Magic)
	HiQualityDiv  int               `csv:"HiQualityDivisor"` // Modifier for changing the High Quality (Superior) chance based on the difference between the Monster Level and the Item's base level.
	Normal        int               `csv:"Normal"`           // Base value for calculating the Normal Quality chance. Higher value means rarer chance. (Calculated after Normal, defaults to Low Quality)
	NormalDivisor int               `csv:"NormalDivisor"`    // Modifier for changing the Normal Quality chance based on the difference between the Monster Level and the Item's base level.
}

ItemRatio represents the quality of items when being spawned and the probability calculations.

type ItemRatioFunction

type ItemRatioFunction string

ItemRatioFunction represents the type of item ratio used for determining item quality.

const (
	ItemRatioUnique    ItemRatioFunction = "Unique"
	ItemRatioSet       ItemRatioFunction = "Set"
	ItemRatioRare      ItemRatioFunction = "Rare"
	ItemRatioMagic     ItemRatioFunction = "Magic"
	ItemRatioHiQuality ItemRatioFunction = "HiQuality"
	ItemRatioNormal    ItemRatioFunction = "Normal"
	ItemRatioLow       ItemRatioFunction = "Low"
)

Constants for Item Ratio Functions.

type ItemStatCost

type ItemStatCost struct {
	Name           string `csv:"Stat"`            // Defines the unique pointer for this stat, used in other files.
	SendOther      int    `csv:"Send Other"`      // If 1, add the stat to a new monster if it has no state and an item mask; else ignore.
	Signed         int    `csv:"Signed"`          // If 1, stat is treated as a signed integer; else it's an unsigned integer. Applies to stats with state bits.
	SendBits       int    `csv:"Send Bits"`       // Controls how many bits of data for the stat to send to the game client.
	SendParamBits  int    `csv:"Send Param Bits"` // Controls how many bits of data for the stat's parameter value to send to the client for a unit.
	UpdateAnimRate int    `csv:"UpdateAnimRate"`  // If 1, the stat will adjust the unit's speed when changed; else ignore.
	Saved          int    `csv:"Saved"`           // If 1, this state will be stored in the Character Save file; else ignore.
	CSvSigned      int    `csv:"CSvSigned"`       // If 1, the stat will be saved as a signed integer in the Character Save file; else it's unsigned.
	CSvBits        int    `csv:"CSvBits"`         // Controls how many bits of data for the stat to save in the Character Save file.
	CSvParam       int    `csv:"CSvParam"`        // Controls how many bits of data for the stat's parameter value to save in the Character Save file.
	FCallback      int    `csv:"fCallback"`       // If 1, any changes to the stat will call the Callback function to update character's states, skills, or item events.
	FMin           int    `csv:"fMin"`            // If 1, the stat has a minimum value that cannot be reduced further (See MinAccr); else ignore.
	MinAccr        int    `csv:"MinAccr"`         // The minimum value of a stat. Used if FMin is enabled.
	Encode         int    `csv:"Encode"`          // Controls how the stat will modify an item's buy, sell, and repair costs.
	Add            int    `csv:"Add"`             // Flat integer modification to the Unique item's buy, sell, and repair costs. Added after Multiply field.
	Multiply       int    `csv:"Multiply"`        // Multiplicative modifier for the item's buy, sell, and repair costs.
	ValShift       int    `csv:"ValShift"`        // Shifts the stat's input value by a number of bits for calculations.
	SaveBits109    int    `csv:"1.09-Save Bits"`  // Controls how many bits are allocated for the overall size of the stat when saving/reading an item from a Character Save in 1.09d or older.
	SaveAdd109     int    `csv:"1.09-Save Add"`   // Controls how many bits are allocated for the stat's value when saving/reading an item from a Character Save in 1.09d or older.
	SaveBits       int    `csv:"Save Bits"`       // Controls how many bits are allocated for the overall size of the stat when saving/reading an item from a Character Save.
	SaveAdd        int    `csv:"Save Add"`        // Controls how many bits are allocated for the stat's value when saving/reading an item from a Character Save.
	SaveParamBits  int    `csv:"Save Param Bits"` // Controls how many bits for the stat's parameter value to use when saving/reading an item from a Character Save.
	KeepZero       int    `csv:"keepzero"`        // If 1, this stat remains on the change list even if its value is 0; else ignore.
	Op             string `csv:"op"`              // Name operator for advanced stat modification when calculating the value of a stat.
	OpParam        string `csv:"op param"`        // Possible parameter value for the Op function.
	OpBase         string `csv:"op base"`         // Possible parameter value for the Op function.
	OpStat1        string `csv:"op stat1"`        // Possible parameter value for the Op function.
	OpStat2        string `csv:"op stat2"`        // Possible parameter value for the Op function.
	OpStat3        string `csv:"op stat3"`        // Possible parameter value for the Op function.
	Direct         int    `csv:"direct"`          // If 1, the stat updates in relation to its maxstat field to ensure it never exceeds that value in certain skill functions.
	MaxStat        string `csv:"maxstat"`         // Controls which stat is associated with this stat to be treated as the maximum version of this stat.
	DamageRelated  int    `csv:"damagerelated"`   // If 1, this stat is exclusive to the item and will not add to the unit; else it always adds to the unit.
	ItemEvent1     string `csv:"itemevent1"`      // Event that will activate the specified function defined by itemeventfunc1.
	ItemEvent2     string `csv:"itemevent2"`      // Event that will activate the specified function defined by itemeventfunc2.
	ItemEventFunc1 string `csv:"itemeventfunc1"`  // Function to use after the related item event occurred.
	ItemEventFunc2 string `csv:"itemeventfunc2"`  // Function to use after the related item event occurred.
	DescPriority   int    `csv:"descpriority"`    // Controls how this stat is sorted in item tooltips.
	DescFunc       int    `csv:"descfunc"`        // Controls how the stat is displayed in tooltips.
	DescVal        string `csv:"descval"`         // Possible parameter value for the DescFunc function. Controls how the value of the stat is displayed.
	DescStrPos     string `csv:"descstrpos"`      // Possible parameter value for the DescFunc function. Uses a string to display the item stat in a tooltip when its value is positive.
	DescStrNeg     string `csv:"descstrneg"`      // Possible parameter value for the DescFunc function. Uses a string to display the item stat in a tooltip when its value is negative.
	DescStr2       string `csv:"descstr2"`        // Possible parameter value for the DescFunc function. Uses a string to append to an item stat's string in a tooltip.
	DGrp           int    `csv:"dgrp"`            // Assigns the stat to a group ID value.
	DGrpFunc       int    `csv:"dgrpfunc"`        // Controls how the shared group of stats is displayed in tooltips.
	DGrpVal        int    `csv:"dgrpval"`         // Possible parameter value for the DGrpFunc function. Controls how the value of the stat is displayed.
	DGrpStrPos     string `csv:"dgrpstrpos"`      // Possible parameter value for the DGrpFunc function. Uses a string to display the item stat in a tooltip when its value is positive.
	DGrpStrNeg     string `csv:"dgrpstrneg"`      // Possible parameter value for the DGrpFunc function. Uses a string to display the item stat in a tooltip when its value is negative.
	DGrpStr2       string `csv:"dgrpstr2"`        // Possible parameter value for the DGrpFunc function. Uses a string to append to an item stat's string in a tooltip.
	Stuff          int    `csv:"stuff"`           // Used as a bit shift value for handling the conversion of skill IDs and skill levels to bit values for the stat.
	AdvDisplay     int    `csv:"advdisplay"`      // Controls how the stat appears in the Advanced Stats UI.
}

ItemStatCost represents the functionalities for each possible stat on a unit.

type ItemStorePage

type ItemStorePage string

ItemStorePage represents the UI tab page on the NPC shop UI to display specific item types

const (
	StorePageArmor   ItemStorePage = "armo"
	StorePageWeapons ItemStorePage = "weap"
	StorePageMagic   ItemStorePage = "mag"
	StorePageMisc    ItemStorePage = "misc"
)

type ItemSuperType

type ItemSuperType int

ItemSuperType represents the item types.

const (
	TypeArmor ItemSuperType = iota
	TypeWeapon
	TypeMisc
)

type ItemType

type ItemType struct {
	// This is a reference field to define the Item Type name.
	ItemType string `csv:"ItemType"`

	// Defines the unique pointer for this Item Type, which is used by the following files: weapons.txt, armor.txt, misc.txt, cubemain.txt, skills.txt, treasureclassex.txt.
	Code string `csv:"Code"`

	// Points to the index of another Item Type to reference as a parent. This is used to create a hierarchy for Item Types where the parents will have more universal settings shared across the related children.
	Equiv1 string `csv:"Equiv1"`

	// Points to the index of another Item Type to reference as a parent. This is used to create a hierarchy for Item Types where the parents will have more universal settings shared across the related children.
	Equiv2 string `csv:"Equiv2"`

	// Boolean Field. If equals 1, then the item can be repaired by an NPC in the shop UI. If equals 0, then the item cannot be repaired.
	Repair bool `csv:"Repair"`

	// Boolean Field. If equals 1, then the item can be equipped by a character (also will require the "BodyLoc1" & "BodyLoc2" fields as parameters). If equals 0, then the item can only be carried in the inventory, stash, or Horadric Cube.
	Body bool `csv:"Body"`

	// These are required parameters if the "Body" field is enabled. These fields specify the inventory slots where the item can be equipped.
	BodyLoc1 string `csv:"BodyLoc1"`
	BodyLoc2 string `csv:"BodyLoc2"`

	// Points to the index of another Item Type as the required equipped Item Type to be used as ammo.
	Shoots string `csv:"Shoots"`

	// Points to the index of another Item Type as the required equipped Item Type to be used as this ammo's weapon.
	Quiver string `csv:"Quiver"`

	// Boolean Field. If equals 1, then it determines that this item is a throwing weapon. If equals 0, then ignore this.
	Throwable bool `csv:"Throwable"`

	// Boolean Field. If equals 1, then the item (considered ammo in this case) will be automatically transferred from the inventory to the required "BodyLoc" when another item runs out of that specific ammo. If equals 0, then ignore this.
	Reload bool `csv:"Reload"`

	// Boolean Field. If equals 1, then the item in the inventory will replace a matching equipped item if that equipped item was destroyed. If equals 0, then ignore this.
	ReEquip bool `csv:"ReEquip"`

	// Boolean Field. If equals 1, then if the player picks up a matching Item Type, then they will try to automatically stack together. If equals 0, then ignore this.
	AutoStack bool `csv:"AutoStack"`

	// Boolean Field. If equals 1, then this item will always have the Magic quality (unless it is a Quest item). If equals 0, then ignore this.
	Magic bool `csv:"Magic"`

	// Boolean Field. If equals 1, then this item can spawn as a Rare quality. If equals 0, then ignore this.
	Rare bool `csv:"Rare"`

	// Boolean Field. If equals 1, then this item will always have the Normal quality. If equals 0, then ignore this.
	Normal bool `csv:"Normal"`

	// Boolean Field. If equals 1, then this item can be placed in the character's belt slots. If equals 0, then ignore this.
	Beltable bool `csv:"Beltable"`

	// Determines the maximum possible number of sockets that can be spawned on the item when the item level is greater than or equal to 1 and less than or equal to the "MaxSocketsLevelThreshold1" value. The number of sockets is capped by the "gemsockets" value from the weapons.txt/armor.txt/misc.txt file.
	MaxSockets1 int `csv:"MaxSockets1"`

	// Defines the item level threshold between using the "MaxSockets1" and "MaxSockets2" field.
	MaxSocketsLevelThreshold1 int `csv:"MaxSocketsLevelThreshold1"`

	// Determines the maximum possible number of sockets that can be spawned on the item when the item level is greater than the "MaxSocketsLevelThreshold1" value and less than or equal to the "MaxSocketsLevelThreshold2". The number of sockets is capped by the "gemsockets" value from the weapons.txt/armor.txt/misc.txt file.
	MaxSockets2 int `csv:"MaxSockets2"`

	// Defines the item level threshold between using the "MaxSockets2" and "MaxSockets3" field.
	MaxSocketsLevelThreshold2 int `csv:"MaxSocketsLevelThreshold2"`

	// Determines the maximum possible number of sockets that can be spawned on the item when the item level is greater than the "MaxSocketsLevelThreshold2" value. The number of sockets is capped by the "gemsockets" value from the weapons.txt/armor.txt/misc.txt file.
	MaxSockets3 int `csv:"MaxSockets3"`

	// Boolean Field. If equals 1, then allow this Item Type to be used in default treasure classes. If equals 0, then ignore this.
	TreasureClass bool `csv:"TreasureClass"`

	// Determines the chance for the item to spawn with stats, when created as a random Weapon/Armor/Misc item. Used in the following formula: IF RANDOM(0, ("Rarity" - [Current Act Level])) > 0, THEN spawn stats.
	Rarity int `csv:"Rarity"`

	// Determines if the Item Type should have class specific item skill modifiers.
	StaffMods string `csv:"StaffMods"`

	// Determines if this item should be usable only by a specific class.
	Class string `csv:"Class"`

	// Tracks the number of inventory graphics used for this item type. This number must match the number of "InvGfx" fields used.
	VarInvGfx int `csv:"VarInvGfx"`

	// Defines a DC6 file to use for the item's inventory graphics. The number of "InvGfx" fields used should match the value used in "VarInvGfx".
	InvGfx1 string `csv:"InvGfx1"`
	InvGfx2 string `csv:"InvGfx2"`
	InvGfx3 string `csv:"InvGfx3"`
	InvGfx4 string `csv:"InvGfx4"`
	InvGfx5 string `csv:"InvGfx5"`
	InvGfx6 string `csv:"InvGfx6"`
}

ItemType represents the general statistics for each type of item, used for the item type fields in other files.

type ItemUnique

type ItemUnique struct {
	Index             string `csv:"index"`             // Points to a string key value to use as the Unique item's name.
	Version           int    `csv:"version"`           // Defines which game version to create this item (<100 = Classic mode | 100 = Expansion mode).
	Enabled           bool   `csv:"enabled"`           // If equals 1, then this item can be rolled as a choice when randomly dropping a unique. If equals 0, then this item cannot be dropped randomly, but can still be dropped explicitly from a treasure class.
	FirstLadderSeason int    `csv:"firstLadderSeason"` // The first ladder season the unique item can be dropped or created on (inclusive). If blank or 0, then it is available in non-ladder.
	LastLadderSeason  int    `csv:"lastLadderSeason"`  // The last ladder season the unique item is ladder-only (inclusive). Must be used in conjunction with firstLadderSeason.
	Rarity            int    `csv:"rarity"`            // Modifies the chances that this Unique item will spawn compared to other Unique items. Each "rarity" value gets summed together to give a total denominator used for the random roll for the item.
	NoLimit           bool   `csv:"nolimit"`           // Requires the "quest" field from the misc.txt file to be enabled. If equals 1, then this item can be created and will automatically be identified. If equals 0, then ignore this.
	Lvl               int    `csv:"lvl"`               // The item level for the item, which controls what object or monster needs to be in order to drop this item.
	LvlReq            int    `csv:"lvl req"`           // The minimum character level required to equip the item.
	Code              string `csv:"code"`              // Defines the baseline item code to use for this Unique item (must match the "code" field value from weapons.txt, armor.txt, or misc.txt).
	Carry1            bool   `csv:"carry1"`            // If equals 1, then players can only carry one of these items in their inventory. If equals 0, then ignore this.
	CostMult          int    `csv:"cost mult"`         // Multiplicative modifier for the Unique item's buy, sell, and repair costs.
	CostAdd           int    `csv:"cost add"`          // Flat integer modification to the Unique item's buy, sell, and repair costs. Added after the "cost mult" has modified the costs.
	ChrTransform      string `csv:"chrtransform"`      // Controls the color change of the item when equipped on a character or dropped on the ground. If empty, then the item will have the default item color.
	InvTransform      string `csv:"invtransform"`      // Controls the color change of the item in the inventory UI. If empty, then the item will have the default item color.
	InvFile           string `csv:"invfile"`           // An override for the "invfile" field from the weapon.txt, armor.txt, or misc.txt files.
	FlippyFile        string `csv:"flippyfile"`        // An override for the "flippyfile" field from the weapon.txt, armor.txt, or misc.txt files.
	DropSound         string `csv:"dropsound"`         // An override for the "dropsound" field from the weapon.txt, armor.txt, or misc.txt files.
	DropSFXFrame      int    `csv:"dropsfxframe"`      // An override for the "dropsfxframe" field from the weapon.txt, armor.txt, or misc.txt files.
	UseSound          string `csv:"usesound"`          // An override for the "usesound" field from the weapon.txt, armor.txt, or misc.txt files.
	Prop1             string `csv:"prop1"`             // Controls the first item property for the Unique item.
	Par1              string `csv:"par1"`              // The stat's "parameter" value associated with the first property (prop1).
	Min1              int    `csv:"min1"`              // The stat's "min" value to assign to the first property (prop1).
	Max1              int    `csv:"max1"`              // The stat's "max" value to assign to the first property (prop1).
	Prop2             string `csv:"prop2"`             // Controls the second item property for the Unique item.
	Par2              string `csv:"par2"`              // The stat's "parameter" value associated with the second property (prop2).
	Min2              int    `csv:"min2"`              // The stat's "min" value to assign to the second property (prop2).
	Max2              int    `csv:"max2"`              // The stat's "max" value to assign to the second property (prop2).
	Prop3             string `csv:"prop3"`             // Controls the third item property for the Unique item.
	Par3              string `csv:"par3"`              // The stat's "parameter" value associated with the third property (prop3).
	Min3              int    `csv:"min3"`              // The stat's "min" value to assign to the third property (prop3).
	Max3              int    `csv:"max3"`              // The stat's "max" value to assign to the third property (prop3).
	Prop4             string `csv:"prop4"`             // Controls the fourth item property for the Unique item.
	Par4              string `csv:"par4"`              // The stat's "parameter" value associated with the fourth property (prop4).
	Min4              int    `csv:"min4"`              // The stat's "min" value to assign to the fourth property (prop4).
	Max4              int    `csv:"max4"`              // The stat's "max" value to assign to the fourth property (prop4).
	Prop5             string `csv:"prop5"`             // Controls the fifth item property for the Unique item.
	Par5              string `csv:"par5"`              // The stat's "parameter" value associated with the fifth property (prop5).
	Min5              int    `csv:"min5"`              // The stat's "min" value to assign to the fifth property (prop5).
	Max5              int    `csv:"max5"`              // The stat's "max" value to assign to the fifth property (prop5).
	Prop6             string `csv:"prop6"`             // Controls the sixth item property for the Unique item.
	Par6              string `csv:"par6"`              // The stat's "parameter" value associated with the sixth property (prop6).
	Min6              int    `csv:"min6"`              // The stat's "min" value to assign to the sixth property (prop6).
	Max6              int    `csv:"max6"`              // The stat's "max" value to assign to the sixth property (prop6).
	Prop7             string `csv:"prop7"`             // Controls the seventh item property for the Unique item.
	Par7              string `csv:"par7"`              // The stat's "parameter" value associated with the seventh property (prop7).
	Min7              int    `csv:"min7"`              // The stat's "min" value to assign to the seventh property (prop7).
	Max7              int    `csv:"max7"`              // The stat's "max" value to assign to the seventh property (prop7).
	Prop8             string `csv:"prop8"`             // Controls the eighth item property for the Unique item.
	Par8              string `csv:"par8"`              // The stat's "parameter" value associated with the eighth property (prop8).
	Min8              int    `csv:"min8"`              // The stat's "min" value to assign to the eighth property (prop8).
	Max8              int    `csv:"max8"`              // The stat's "max" value to assign to the eighth property (prop8).
	Prop9             string `csv:"prop9"`             // Controls the ninth item property for the Unique item.
	Par9              string `csv:"par9"`              // The stat's "parameter" value associated with the ninth property (prop9).
	Min9              int    `csv:"min9"`              // The stat's "min" value to assign to the ninth property (prop9).
	Max9              int    `csv:"max9"`              // The stat's "max" value to assign to the ninth property (prop9).
	Prop10            string `csv:"prop10"`            // Controls the tenth item property for the Unique item.
	Par10             string `csv:"par10"`             // The stat's "parameter" value associated with the tenth property (prop10).
	Min10             int    `csv:"min10"`             // The stat's "min" value to assign to the tenth property (prop10).
	Max10             int    `csv:"max10"`             // The stat's "max" value to assign to the tenth property (prop10).
	Prop11            string `csv:"prop11"`            // Controls the eleventh item property for the Unique item.
	Par11             string `csv:"par11"`             // The stat's "parameter" value associated with the eleventh property (prop11).
	Min11             int    `csv:"min11"`             // The stat's "min" value to assign to the eleventh property (prop11).
	Max11             int    `csv:"max11"`             // The stat's "max" value to assign to the eleventh property (prop11).
	Prop12            string `csv:"prop12"`            // Controls the twelfth item property for the Unique item.
	Par12             string `csv:"par12"`             // The stat's "parameter" value associated with the twelfth property (prop12).
	Min12             int    `csv:"min12"`             // The stat's "min" value to assign to the twelfth property (prop12).
	Max12             int    `csv:"max12"`             // The stat's "max" value to assign to the twelfth property (prop12).
	DiabloCloneWeight int    `csv:"diablocloneweight"` // The amount of weight added to the Diablo Clone progress when this item is sold.
}

ItemUnique represents a unique item in the game.

type ItemWeapon

type ItemWeapon struct {
	Name              string `csv:"name"`              // Reference field to define the item.
	Version           int    `csv:"version"`           // Game version to create this item (0 = Classic mode | 100 = Expansion mode).
	CompactSave       int    `csv:"compactsave"`       // If 1, only the item's base stats will be stored in the character save, not any modifiers or additional stats. If 0, all of the items stats will be saved.
	Rarity            int    `csv:"rarity"`            // Determines the chance that the item will randomly spawn (1/#). Higher value means rarer item. Depends on spawnable, quest, and item level being less than or equal to the area level. Affected by the relative Act number.
	Spawnable         int    `csv:"spawnable"`         // If 1, this item can be randomly spawned. If 0, this item will never randomly spawn.
	Speed             int    `csv:"speed"`             // For armor: Walk/Run Speed reduction when wearing the armor. For weapon: Attack Speed reduction when wearing the weapon.
	ReqStr            int    `csv:"reqstr"`            // Amount of Strength attribute needed to use the item.
	ReqDex            int    `csv:"reqdex"`            // Amount of Dexterity attribute needed to use the item.
	Durability        int    `csv:"durability"`        // Base durability amount that the item will spawn with.
	NoDurability      int    `csv:"nodurability"`      // If 1, the item will not have durability. If 0, the item will have durability.
	Level             int    `csv:"level"`             // Base item level. Used for determining when the item is allowed to drop.
	ShowLevel         int    `csv:"ShowLevel"`         // If 1, display the item level next to the item name. If 0, ignore this.
	LevelReq          int    `csv:"levelreq"`          // Player level requirement for being able to use the item.
	Cost              int    `csv:"cost"`              // Base gold cost of the item when sold by an NPC. Affected by item modifiers and rarity.
	GambleCost        int    `csv:"gamble cost"`       // Gambling gold cost of the item on the Gambling UI.
	Code              string `csv:"code"`              // Unique 3 letter/number code for the item. Used as an identifier to reference the item.
	NameStr           string `csv:"namestr"`           // String Key used for the base item name.
	MagicLvl          int    `csv:"magic lvl"`         // Magic level of the item, affecting magical item modifiers that can appear on the item (See automagic.txt).
	AutoPrefix        int    `csv:"auto prefix"`       // Automatically picks an item affix name from a designated "group" value from the automagic.txt file, used when the item is Magical quality.
	AlternateGfx      string `csv:"alternategfx"`      // Unique 3 letter/number code to determine what in-game graphics to display on the player character when the item is equipped.
	NormCode          string `csv:"normcode"`          // Links to a "code" field to determine the normal version of the item.
	UberCode          string `csv:"ubercode"`          // Links to a "code" field to determine the Exceptional version of the item.
	UltraCode         string `csv:"ultracode"`         // Links to a "code" field to determine the Elite version of the item.
	Component         string `csv:"component"`         // Determines the layer of player animation when the item is equipped, using a code referenced from the Composit.txt file.
	InvWidth          int    `csv:"invwidth"`          // Defines the width of grid cells that the item occupies in the player inventory.
	InvHeight         int    `csv:"invheight"`         // Defines the height of grid cells that the item occupies in the player inventory.
	HasInv            int    `csv:"hasinv"`            // If 1, the item will have its own inventory, allowing for the capability to socket gems, runes, or jewels. If 0, the item cannot have sockets.
	GemSockets        int    `csv:"gemsockets"`        // Controls the maximum number of sockets allowed on this item, limited by the item's size based on "invwidth" and "invheight".
	GemApplyType      string `csv:"gemapplytype"`      // Determines which effect from a gem or rune will be applied when socketed into this item (See gems.txt).
	FlippyFile        string `csv:"flippyfile"`        // Controls which DC6 file to use for displaying the item in the game world when it is dropped on the ground (uses the file name as the input).
	InvFile           string `csv:"invfile"`           // Controls which DC6 file to use for displaying the item graphics in the inventory (uses the file name as the input).
	UniqueInvFile     string `csv:"uniqueinvfile"`     // Controls which DC6 file to use for displaying the item graphics in the inventory when it is a Unique quality item (uses the file name as the input).
	SetInvFile        string `csv:"setinvfile"`        // Controls which DC6 file to use for displaying the item graphics in the inventory when it is a Set quality item (uses the file name as the input).
	Useable           int    `csv:"useable"`           // If 1, the item can be used with the right-click mouse button command (works with specific belt items or quest items). If 0, ignore this.
	Stackable         int    `csv:"stackable"`         // If 1, the item will use a quantity field and handle stacking functionality. If 0, the item cannot be stacked.
	MinStack          int    `csv:"minstack"`          // Controls the minimum stack count or quantity allowed on the item. Depends on "stackable" being enabled.
	MaxStack          int    `csv:"maxstack"`          // Controls the maximum stack count or quantity allowed on the item. Depends on "stackable" being enabled.
	SpawnStack        int    `csv:"spawnstack"`        // Controls the stack count or quantity that the item can spawn with. Depends on "stackable" being enabled.
	Transmogrify      int    `csv:"Transmogrify"`      // If 1, the item will use the transmogrify function. If 0, ignore this. Depends on "useable" being enabled.
	TMogType          string `csv:"TMogType"`          // Links to a "code" field to determine which item is chosen to transmogrify this item to.
	TMogMin           int    `csv:"TMogMin"`           // Controls the minimum quantity that the transmogrify item will have. Depends on what item was chosen in the "TMogType" field, and that the transmogrify item has quantity.
	TMogMax           int    `csv:"TMogMax"`           // Controls the minimum quantity that the transmogrify item will have. Depends on what item was chosen in the "TMogType" field, and that the transmogrify item has quantity.
	Type              string `csv:"type"`              // Points to an Item Type defined in the ItemTypes.txt file, which controls how the item functions.
	Type2             string `csv:"type2"`             // Points to a secondary Item Type defined in the ItemTypes.txt file, which controls how the item functions. Optional, adds more functionalities and possibilities with the item.
	DropSound         string `csv:"dropsound"`         // Points to a sound defined in the sounds.txt file. Used when the item is dropped on the ground.
	DropSfxFrame      int    `csv:"dropsfxframe"`      // Defines which frame in the "flippyfile" animation to play the "dropsound" sound when the item is dropped on the ground.
	UseSound          string `csv:"usesound"`          // Points to a sound defined in the sounds.txt file. Used when the item is moved in the inventory or used.
	Unique            int    `csv:"unique"`            // If 1, the item can only spawn as a Unique quality type. If 0, the item can spawn as other quality types.
	Transparent       int    `csv:"transparent"`       // If 1, the item will be drawn transparent on the player model (similar to ethereal models). If 0, the item will appear solid on the player model.
	TransTbl          int    `csv:"transtbl"`          // Controls what type of transparency to use, based on the "transparent" field being enabled.
	LightRadius       int    `csv:"lightradius"`       // Controls the value of the light radius that this item can apply on the monster. This only affects monsters with this item equipped, not other types of units. Ignored if the item's component on the monster is "lit", "med", or "hvy".
	Belt              int    `csv:"belt"`              // Controls which belt type to use for belt items only. Determines what index entry in the belts.txt file to use.
	Quest             int    `csv:"quest"`             // Controls what quest class is tied to the item, enabling certain item functionalities for a specific quest. Any value greater than 0 also means the item is flagged as a quest item, affecting how it is displayed, traded, its rarity, and how it cannot be sold to an NPC. If 0, the item will not be flagged as a quest item.
	QuestDiffCheck    int    `csv:"questdiffcheck"`    // If 1 and the "quest" field is enabled, then the game will check the current difficulty setting and tie that difficulty setting to the quest item. This means the player can have more than 1 of the same quest item as long as they are obtained per difficulty mode (Normal / Nightmare / Hell). If 0 and the "quest" field is enabled, then the player can only have 1 count of the quest item in the inventory, regardless of difficulty.
	MissileType       string `csv:"missiletype"`       // Points to the "Id" field from the Missiles.txt file, determining what type of missile is used when using the throwing weapons.
	DurWarning        int    `csv:"durwarning"`        // Controls the threshold value for durability to display the low durability warning UI. Used if the item has durability.
	QntWarning        int    `csv:"qntwarning"`        // Controls the threshold value for quantity to display the low quantity warning UI. Used if the item has stacks.
	MinDam            int    `csv:"mindam"`            // The minimum physical damage provided by the item.
	MaxDam            int    `csv:"maxdam"`            // The maximum physical damage provided by the item.
	StrBonus          int    `csv:"StrBonus"`          // Percentage multiplier that gets multiplied by the player's current Strength attribute value to modify the bonus damage percent from the equipped item. Default value is 100 if this equals 1.
	DexBonus          int    `csv:"DexBonus"`          // Percentage multiplier that gets multiplied by the player's current Dexterity attribute value to modify the bonus damage percent from the equipped item. Default value is 100 if this equals 1.
	GemOffset         int    `csv:"gemoffset"`         // Determines the starting index offset for reading the gems.txt file when determining what effects gems or runes will have on the item based on the "gemapplytype" field.
	BitField1         int    `csv:"bitfield1"`         // Controls different flags that can affect the item, using an integer value to check against different bit fields using the "&" operator.
	Transform         int    `csv:"Transform"`         // Controls the color palette change of the item for the character model graphics.
	InvTrans          int    `csv:"InvTrans"`          // Controls the color palette change of the item for the inventory graphics.
	SkipName          int    `csv:"SkipName"`          // If 1 and the item is Unique rarity, then skip adding the item's base name in its title. If 0, ignore this.
	NightmareUpgrade  string `csv:"NightmareUpgrade"`  // Links to another item's "code" field, determining which item will replace this item when generated in the NPC's store while the game is playing in Nightmare difficulty. If this field's code equals "xxx", then this item will not change in this difficulty.
	HellUpgrade       string `csv:"HellUpgrade"`       // Links to another item's "code" field, determining which item will replace this item when generated in the NPC's store while the game is playing in Hell difficulty. If this field's code equals "xxx", then this item will not change in this difficulty.
	Nameable          int    `csv:"Nameable"`          // If 1, the item's name can be personalized by Anya for the Act 5 Betrayal of Harrogath quest reward. If 0, the item cannot be used for the personalized name reward.
	PermStoreItem     int    `csv:"PermStoreItem"`     // If 1, this item will always appear on the NPC's store. If 0, the item will randomly appear on the NPC's store when appropriate.
	DiabloCloneWeight int    `csv:"diablocloneweight"` // The amount of weight added to the diablo clone progress when this item is sold. When offline, selling this item will instead immediately spawn diablo clone.
	OneOrTwoHanded    int    `csv:"1or2handed"`        // If 1, the item will be treated as a one-handed and two-handed weapon by the Barbarian class. If 0, the Barbarian can only use this weapon as either one-handed or two-handed, but not both. (Exclusive to weapons.txt)
	TwoHanded         int    `csv:"2handed"`           // If 1, the item will be treated as a two-handed weapon. If 0, the item will be treated as a one-handed weapon. (Exclusive to weapons.txt)
	TwoHandWClass     string `csv:"2handedwclass"`     // Defines the two-handed weapon class, controlling what character animations are used when the weapon is equipped. (Exclusive to weapons.txt)
	TwoHandMinDam     int    `csv:"2handmindam"`       // The minimum physical damage provided by the weapon if the item is two-handed. (Relies on the "2handed" field being enabled)
	TwoHandMaxDam     int    `csv:"2handmaxdam"`       // The maximum physical damage provided by the weapon if the item is two-handed. (Relies on the "2handed" field being enabled)
	HitClass          string `csv:"hitclass"`          // Defines the hit class of the weapon, used to determine what SFX to use when the weapon hits an enemy.
	MinMisDam         int    `csv:"minmisdam"`         // The minimum physical damage provided by the item if it is a throwing weapon.
	MaxMisDam         int    `csv:"maxmisdam"`         // The maximum physical damage provided by the item if it is a throwing weapon.
	RangeAdder        int    `csv:"rangeadder"`        // Adds extra range in grid spaces for melee attacks while the melee weapon is equipped. The baseline melee range is 1, and this field adds to that range.
	WeaponClass       string `csv:"wclass"`            // Defines the one-handed weapon class, controlling what character animations are used when the weapon is equipped.
}

ItemWeapon represents the functionalities for weapon type items.

type LevelData

type LevelData struct {
	// Name defines the unique name pointer for the area level, which is used in other files
	Name string `csv:"Name"`

	// Id defines the unique numeric ID for the area level, which is used in other files
	Id int `csv:"Id"`

	// Pal defines which palette file to use for the area level.
	// This uses index values from 0 to 4 to convey Act 1 to Act 5.
	Pal int `csv:"Pal"`

	// Act defines the Act number that the area level is a part of.
	// This uses index values from 0 to 4 to convey Act 1 to Act 5.
	Act int `csv:"Act"`

	// QuestFlag controls what quest record that the player needs to have completed before being allowed to enter this area level, while playing in Classic Mode.
	// Each quest can have multiple quest records, and this field is looking for a specific quest record from a quest.
	QuestFlag int `csv:"QuestFlag"`

	// QuestFlagEx controls what quest record that the player needs to have completed before being allowed to enter this area level, while playing in Expansion Mode.
	// Each quest can have multiple quest records, and this field is looking for a specific quest record from a quest.
	QuestFlagEx int `csv:"QuestFlagEx"`

	// Layer defines a unique numeric ID that is used to identify which Automap data belongs to which area level when saving and loading data from the character save.
	Layer int `csv:"Layer"`

	// SizeX & SizeX(N) & SizeX(H) specify the Length tile size values of an entire area level,
	// which are used for determining how to build the level, for Normal, Nightmare, and Hell Difficulty, respectively.
	SizeX, SizeXN, SizeXH int `csv:"SizeX,SizeX(N),SizeX(H)"`

	// SizeY & SizeY(N) & SizeY(H) specify the Width tile size values of an entire area level,
	// which are used for determining how to build the level, for Normal, Nightmare, and Hell Difficulty, respectively.
	SizeY, SizeYN, SizeYH int `csv:"SizeY,SizeY(N),SizeY(H)"`

	// OffsetX & OffsetY specify the location offset coordinates (measured in tile size) for the origin point of the area level in the world.
	OffsetX, OffsetY int `csv:"OffsetX,OffsetY"`

	// Depend assigns another level to be this area level’s depended level,
	// which controls this area level’s position and how it starts building its tiles.
	// Uses the level "Id" field. If this equals 0, then ignore this.
	Depend int `csv:"Depend"`

	// Teleport controls the functionality of the Sorceress Teleport skill and the Assassin Dragon Flight skill on the area level.
	Teleport int `csv:"Teleport"`

	// Rain is a Boolean Field. If equals 1, then allow rain to play its effects on the area level.
	// If the level is part of Act 5, then it will snow on the area level, instead of rain.
	// If equals 0, then it will never rain on the area level.
	Rain int `csv:"Rain"`

	// Mud is a Boolean Field. If equals 1, then random bubbles will animate on the tiles that are flagged as water tiles.
	// If equals 0, then ignore this.
	Mud int `csv:"Mud"`

	// NoPer is a Boolean Field. If equals 1, then allow the use of the display option of Perspective Mode while the player is in the level.
	// If equals 0, then disable the option of Perspective Mode and force the player to use Orthographic Mode while the player is in the level.
	NoPer int `csv:"NoPer"`

	// LOSDraw is a Boolean field. If equals 1, then the level will check the player’s line of sight before drawing monsters.
	// If equals 0, then ignore this.
	LOSDraw int `csv:"LOSDraw"`

	// FloorFilter is a Boolean field. If equals 1 and if the floor’s layer in the area level equals 1,
	// then draw the floor tiles with a linear texture sampler. If equals 0, then draw the floor tiles with a nearest texture sampler.
	FloorFilter int `csv:"FloorFilter"`

	// BlankScreen is a Boolean field. If equals 1, then draw the area level screen.
	// If equals 0, then do not draw the area level screen, meaning that the level will be a blank screen.
	BlankScreen int `csv:"BlankScreen"`

	// DrawEdges is a Boolean field. If equals 1, then draw the areas in levels that are not covered by floor tiles.
	// If equals 0, then ignore this.
	DrawEdges int `csv:"DrawEdges"`

	// DrlgType determines the type of Dynamic Random Level Generation used for building and handling different elements of the area level.
	// Uses a numeric code to handle which type of DRLG is used.
	DrlgType int `csv:"DrlgType"`

	// LevelType defines the Level Type used for this area level.
	// Uses the Level Type’s ID, which is determined by what order it is defined in the LvlType.txt file.
	LevelType int `csv:"LevelType"`

	// SubType controls the group of tile substitutions for the area level (see LvlSub.txt).
	// There are defined subtypes to choose from.
	SubType int `csv:"SubType"`

	// SubTheme controls which theme number to use in a Level Substitution (See LvlSub.txt).
	// The allowed values are 0 to 4, which convey which "Prob#", "Trials#", and "Max#" field to use from the LvlSub.txt file.
	// If this equals -1, then there is no sub-theme for the area level.
	SubTheme int `csv:"SubTheme"`

	// SubWaypoint controls the level substitutions for adding waypoints in the area level (see LvlSub.txt).
	// This uses a defined subtype to choose from (See "SubType"). This will depend on the room having a waypoint tile.
	SubWaypoint int `csv:"SubWaypoint"`

	// SubShrine controls the level substitutions for adding shrines in the area level (see LvlSub.txt).
	// This uses a defined subtype to choose from (See "SubType"). This will depend on the room allowing for a shrine to spawn.
	SubShrine int `csv:"SubShrine"`

	// Vis0 (to Vis7) defines the visibility of other area levels involved with this area level,
	// allowing for travel functionalities between levels.
	// This uses the "Id" field of another defined area level to link with this area level.
	// If this equals 0, then no area level is specified.
	Vis0, Vis1, Vis2, Vis3, Vis4, Vis5, Vis6, Vis7 int `csv:"Vis0,Vis1,Vis2,Vis3,Vis4,Vis5,Vis6,Vis7"`

	// Warp0 (to Warp7) uses the "Id" field from LevelWarp.txt, which defines which Level Warp to use when exiting the area level.
	// This is connected with the definition of the related "Vis#" field.
	// If this equals -1, then no Level Warp is specified, which should also mean that the related "Vis#" field is not defined.
	Warp0, Warp1, Warp2, Warp3, Warp4, Warp5, Warp6, Warp7 int `csv:"Warp0,Warp1,Warp2,Warp3,Warp4,Warp5,Warp6,Warp7"`

	// Intensity controls the intensity value of the area level’s ambient colors.
	// This affects the brightness of the room’s RGB colors.
	// Uses a value between 0 and 128.
	// If all these related fields equal 0, then the game ignores setting the area level’s ambient colors.
	Intensity int `csv:"Intensity"`

	// Red controls the red value of the area level’s ambient colors.
	// Uses a value between 0 and 255.
	Red int `csv:"Red"`

	// Green controls the green value of the area level’s ambient colors.
	// Uses a value between 0 and 255.
	Green int `csv:"Green"`

	// Blue controls the blue value of the area level’s ambient colors.
	// Uses a value between 0 and 255.
	Blue int `csv:"Blue"`

	// Portal is a Boolean Field. If equals 1, then this area level will be flagged as a portal level,
	// which is saved in the player’s information and can be used for keeping track of the player’s portal functionalities.
	// If equals 0, then ignore this.
	Portal int `csv:"Portal"`

	// Position is a Boolean Field. If equals 1, then enable special casing for positioning the player on the area level.
	// This can mean that the player could spawn in a different location on the area level,
	// depending on the level room’s position type.
	// An example can be when the player spawns in a town when loading the game, or using a waypoint, or using a town portal.
	// If equals 0, then ignore this.
	Position int `csv:"Position"`

	// SaveMonsters is a Boolean Field. If equals 1, then the game will save the monsters in the area level,
	// such as when all players leave the area level.
	// If equals 0, then monsters will not be saved and will be removed.
	// This is usually disabled for areas where monsters do not spawn.
	SaveMonsters int `csv:"SaveMonsters"`

	// Quest controls what quest record is attached to monsters that spawn in this area level.
	// This is used for specific quests handling lists of monsters in the area level.
	Quest int `csv:"Quest"`

	// WarpDist defines the minimum pixel distance from a Level Warp that a monster is allowed to spawn near.
	// Tile distance values are converted to game pixel distance values by multiplying the tile distance value by 160 / 32, where 160 is the width of pixels of a tile.
	WarpDist int `csv:"WarpDist"`

	// MonLvl & MonLvl(N) & MonLvl(H) control the overall monster level for the area level for Normal, Nightmare, and Hell Difficulty, respectively.
	// This is for Classic mode only. This can affect the highest item level allowed to drop in this area level.
	MonLvl, MonLvlN, MonLvlH int `csv:"MonLvl,MonLvl(N),MonLvl(H)"`

	// MonLvlEx & MonLvlEx(N) & MonLvlEx(H) control the overall monster level for the area level for Normal, Nightmare, and Hell Difficulty, respectively.
	// This is for Expansion mode only. This can affect the highest item level allowed to drop in this area level.
	MonLvlEx, MonLvlExN, MonLvlExH int `csv:"MonLvlEx,MonLvlEx(N),MonLvlEx(H)"`

	// MonDen & MonDen(N) & MonDen(H) control the monster density on the area level for Normal, Nightmare, and Hell Difficulty, respectively.
	// This is a random value out of 100000, which will determine whether to spawn or not spawn a monster pack in the room of the area level.
	// If this value equals 0, then no random monsters will populate on the area level.
	MonDen, MonDenN, MonDenH int `csv:"MonDen,MonDen(N),MonDen(H)"`

	// MonUMin & MonUMin(N) & MonUMin(H) define the minimum number of Unique Monsters that can spawn in the area level for Normal, Nightmare, and Hell Difficulty, respectively.
	// This field depends on the related "MonDen" field being defined.
	MonUMin, MonUMinN, MonUMinH int `csv:"MonUMin,MonUMin(N),MonUMin(H)"`

	// MonUMax & MonUMax(N) & MonUMax(H) define the maximum number of Unique Monsters that can spawn in the area level for Normal, Nightmare, and Hell Difficulty, respectively.
	// This field depends on the related "MonDen" field being defined.
	// Each room in the area level will attempt to spawn a Unique Monster with a 5/100 random chance,
	// and this field’s value will cap the number of successful attempts for the entire area level.
	MonUMax, MonUMaxN, MonUMaxH int `csv:"MonUMax,MonUMax(N),MonUMax(H)"`

	// MonWndr is a Boolean Field. If equals 1, then allow Wandering Monsters to spawn on this area level (see wanderingmon.txt).
	// This field depends on the related "MonDen" field being defined. If equals 0, then ignore this.
	MonWndr int `csv:"MonWndr"`

	// MonSpcWalk defines a distance value, used to handle monster pathing AI when the level has certain pathing blockers,
	// such as jail bars or rivers.
	// In these cases, monsters will walk randomly until a player is located within this distance value,
	// or when the monsters find a possible path to target the player.
	// If this equals 0, then ignore this field.
	MonSpcWalk int `csv:"MonSpcWalk"`

	// NumMon controls the number of different monsters randomly spawn in the area level.
	// The maximum value is 13. This controls the number of random selections from the 25 related "mon#" and "umon#" fields or "nmmon#" fields, depending on the game difficulty.
	NumMon int `csv:"NumMon"`

	// mon1 (to mon25) define which monsters can spawn on the area level for Normal Difficulty.
	// Uses the monster "Id" field from the monstats.txt file.
	Mon1, Mon2, Mon3, Mon4, Mon5, Mon6, Mon7, Mon8, Mon9, Mon10, Mon11, Mon12, Mon13, Mon14, Mon15, Mon16, Mon17, Mon18, Mon19, Mon20, Mon21, Mon22, Mon23, Mon24, Mon25 int `` /* 146-byte string literal not displayed */

	// rangedspawn is a Boolean Field. If equals 1, then for the first monster, try to pick a ranged type.
	// If equals 0, then ignore this.
	RangedSpawn int `csv:"rangedspawn"`

	// nmon1 (to nmon25) define which monsters can spawn on the area level for Nightmare Difficulty and Hell Difficulty.
	// Uses the monster "Id" field from the monstats.txt file.
	Nmon1, Nmon2, Nmon3, Nmon4, Nmon5, Nmon6, Nmon7, Nmon8, Nmon9, Nmon10, Nmon11, Nmon12, Nmon13, Nmon14, Nmon15, Nmon16, Nmon17, Nmon18, Nmon19, Nmon20, Nmon21, Nmon22, Nmon23, Nmon24, Nmon25 int `` /* 171-byte string literal not displayed */

	// umon1 (to umon25) define which monsters can spawn as Unique monsters on this area level for Normal Difficulty.
	// Uses the monster "Id" field from the monstats.txt file.
	Umon1, Umon2, Umon3, Umon4, Umon5, Umon6, Umon7, Umon8, Umon9, Umon10, Umon11, Umon12, Umon13, Umon14, Umon15, Umon16, Umon17, Umon18, Umon19, Umon20, Umon21, Umon22, Umon23, Umon24, Umon25 int `` /* 171-byte string literal not displayed */

	// cmon1 (to cmon4) define which Critter monsters can spawn on the area level.
	// Uses the monster "Id" field from the monstats.txt file.
	// Critter monsters are determined by the "critter" field from the monstats2.txt file.
	Cmon1, Cmon2, Cmon3, Cmon4 int `csv:"cmon1,cmon2,cmon3,cmon4"`

	// cpct1 (to cpct4) control the percent chance (out of 100) to spawn a Critter monster on the area level.
	Cpct1, Cpct2, Cpct3, Cpct4 int `csv:"cpct1,cpct2,cpct3,cpct4"`

	// camt1 (to camt4) control the amount of Critter monsters to spawn on the area level after they succeeded their random spawn chance from the related "cpct#" field.
	Camt1, Camt2, Camt3, Camt4 int `csv:"camt1,camt2,camt3,camt4"`

	// Themes control the type of theme when building a level room.
	// This value is a summation of possible values to build a bit mask for determining which themes to use when building a level room.
	Themes int `csv:"Themes"`

	// SoundEnv uses the "Index" field from SoundEnviron.txt, which controls what music is played while the player is in the area level.
	SoundEnv int `csv:"SoundEnv"`

	// Waypoint defines the unique numeric ID for the Waypoint in the area level.
	// If this value is greater than or equal to 255, then ignore this field.
	Waypoint int `csv:"Waypoint"`

	// LevelName is a String Field. Used for displaying the name of the area level on the Automap or when hovering the mouse cursor over the waypoint button.
	// The value is the string identifier defined in the String.tbl file.
	LevelName string `csv:"LevelName"`

	// ObjectID defines a numeric ID to specify which object group belongs to the area level (See LevelWarp.txt).
	// If this value is greater than or equal to 255, then ignore this field.
	ObjGrp0, ObjGrp1, ObjGrp2, ObjGrp3, ObjGrp4, ObjGrp5, ObjGrp6, ObjGrp7 int `csv:"ObjGrp0,ObjGrp1,ObjGrp2,ObjGrp3,ObjGrp4,ObjGrp5,ObjGrp6,ObjGrp7"`
	ObjPrb0, ObjPrb1, ObjPrb2, ObjPrb3, ObjPrb4, ObjPrb5, ObjPrb6, ObjPrb7 int `csv:"ObjPrb0,ObjPrb1,ObjPrb2,ObjPrb3,ObjPrb4,ObjPrb5,ObjPrb6,ObjPrb7"`

	// Defines what group this level belongs to. Used for condensing level names
	// in desecrated (terror) zones messaging. See LevelGroups.txt.
	LevelGroup string
}

LevelData represents the data fields in the "Levels.txt" file.

type LevelGroup

type LevelGroup struct {
	Name      string `csv:"Name"`      // Defines the unique name pointer for the level group, which is used in other files
	ID        int    `csv:"Id"`        // Defines the unique numeric ID for the level group, which is used in other files
	GroupName string `csv:"GroupName"` // String Field. Used for displaying the name of the level group, such as when all levels in a group have been desecrated.
}

LevelGroup represents the data structure for controlling how the game groups levels together. This has currently no gameplay purpose and is mainly used for condensing level names in desecrated (terror) zone messaging.

type LevelMazeData

type LevelMazeData struct {
	// Name is a reference field to describe the area level.
	Name string `csv:"Name"`

	// Level refers to the "Id" field from the Levels.txt file.
	Level int `csv:"Level"`

	// Rooms, RoomsN, RoomsH control the total number of rooms that a Level Maze will generate for Normal, Nightmare, and Hell Difficulty, respectively.
	Rooms, RoomsN, RoomsH int `csv:"Rooms,Rooms(N),Rooms(H)"`

	// SizeX and SizeY control the length and width sizes of each room (ds1 map files) that is added to the Level Maze. This is measured in tile sizes.
	SizeX, SizeY int `csv:"SizeX,SizeY"`

	// Merge affects the probability that a room gets an adjacent room linked next to it. This is a random chance out of 1000.
	Merge int `csv:"Merge"`
}

LevelMazeData represents the data from the "LvlMaze.txt" file.

type LevelName

type LevelName string

LevelName represents the level types for the Automap.

const (
	LevelTypeNone        LevelName = "Level ItemSuperType None"
	LevelType1Town       LevelName = "Level ItemSuperType 1 Town"
	LevelType1Wilderness LevelName = "Level ItemSuperType 1 Wilderness"
	LevelType1Cave       LevelName = "Level ItemSuperType 1 Cave"
	LevelType1Crypt      LevelName = "Level ItemSuperType 1 Crypt"
	LevelType1Monastery  LevelName = "Level ItemSuperType 1 Monestary"
	LevelType1Courtyard  LevelName = "Level ItemSuperType 1 Courtyard"
	LevelType1Barracks   LevelName = "Level ItemSuperType 1 Barracks"
	LevelType1Jail       LevelName = "Level ItemSuperType 1 Jail"
	LevelType1Cathedral  LevelName = "Level ItemSuperType 1 Cathedral"
	LevelType1Catacombs  LevelName = "Level ItemSuperType 1 Catacombs"
	LevelType1Tristram   LevelName = "Level ItemSuperType 1 Tristram"
	LevelType2Town       LevelName = "Level ItemSuperType 2 Town"
	LevelType2Sewer      LevelName = "Level ItemSuperType 2 Sewer"
	LevelType2Harem      LevelName = "Level ItemSuperType 2 Desert"
	LevelType2Basement   LevelName = "Level ItemSuperType 2 Sewer"
	LevelType2Desert     LevelName = "Level ItemSuperType 2 Desert"
	LevelType2Tomb       LevelName = "Level ItemSuperType 2 Tomb"
	LevelType2Lair       LevelName = "Level ItemSuperType 2 Lair"
	LevelType2Arcane     LevelName = "Level ItemSuperType 2 Arcane"
	LevelType3Town       LevelName = "Level ItemSuperType 3 Town"
	LevelType3Jungle     LevelName = "Level ItemSuperType 3 Jungle"
	LevelType3Kurast     LevelName = "Level ItemSuperType 3 Kurast"
	LevelType3Spider     LevelName = "Level ItemSuperType 3 Spider"
	LevelType3Dungeon    LevelName = "Level ItemSuperType 3 Dungeon"
	LevelType3Sewer      LevelName = "Level ItemSuperType 3 Sewer"
	LevelType4Town       LevelName = "Level ItemSuperType 4 Town"
	LevelType4Mesa       LevelName = "Level ItemSuperType 4 Mesa"
	LevelType4Lava       LevelName = "Level ItemSuperType 4 Hell"
	LevelType5Town       LevelName = "Level ItemSuperType 5 Town"
	LevelType5Siege      LevelName = "Level ItemSuperType 6 Siege"
	LevelType5Barricade  LevelName = "Level ItemSuperType 6 Barricade"
	LevelType5Temple     LevelName = "Level ItemSuperType 6 Temple"
	LevelType5IceCaves   LevelName = "Level ItemSuperType 5 Ice Caves"
	LevelType5Baal       LevelName = "Level ItemSuperType 5 Baal"
	LevelType5Lava       LevelName = "Level ItemSuperType 5 Lava"
)

Level type constants for the Automap.

type LevelPreset

type LevelPreset struct {
	// Name is a reference field to define the Level Preset.
	Name string `csv:"Name"`

	// Def defines the unique numeric ID for the Level Preset. This is referenced in other files.
	Def int `csv:"Def"`

	// LevelId refers to the "Id" field from the Levels.txt file. If this value is not equal to 0,
	// then this Level Preset is used to build that entire area level. If this value is equal to 0,
	// then the Level Preset does not define the entire area level and is used as a part of constructing area levels.
	LevelId int `csv:"LevelId"`

	// Populate is a Boolean Field. If equals 1, then units are allowed to spawn in the Level Preset.
	// If equals 0, then units will never spawn in the Level Preset.
	Populate int `csv:"Populate"`

	// Logicals is a Boolean Field. If equals 1, then the Level Preset allows for wall transparency to function.
	// If equals 0, then walls will always appear solid.
	Logicals int `csv:"Logicals"`

	// Outdoors is a Boolean Field. If equals 1, then the Level Preset will be classified as an outdoor area,
	// which can mean that lighting will function differently. If equals 0, then the Level Preset will be classified as an indoor area.
	Outdoors int `csv:"Outdoors"`

	// Animate is a Boolean Field. If equals 1, then the game will animate the tiles in the Level Preset.
	// If equals 0, then ignore this.
	Animate int `csv:"Animate"`

	// KillEdge is a Boolean Field. If equals 1, then the game will remove tiles that border the size of the Level Preset.
	// If equals 0, then ignore this.
	KillEdge int `csv:"KillEdge"`

	// FillBlanks is a Boolean Field. If equals 1, then all blank tiles in the Level Preset will be filled with unwalkable tiles.
	// If equals 0, then ignore this.
	FillBlanks int `csv:"FillBlanks"`

	// SizeX specifies the Length tile size value of the Level Preset, which is used for determining how big to build area levels.
	// This value is equal to 0 for Level Presets that are static.
	SizeX int `csv:"SizeX"`

	// SizeY specifies the Width tile size value of the Level Preset, which is used for determining how big to build area levels.
	// This value is equal to 0 for Level Presets that are static.
	SizeY int `csv:"SizeY"`

	// AutoMap is a Boolean Field. If equals 1, then this Level Preset will be automatically completely revealed on the Automap.
	// If equals 0, then this Level Preset will be hidden on the Automap and will need to be explored.
	AutoMap int `csv:"AutoMap"`

	// Scan is a Boolean Field. If equals 1, then this Level Preset will allow the usage of warping with waypoints
	// (This requires that the Level Preset has a waypoint object). If equals 0, then ignore this.
	Scan int `csv:"Scan"`

	// Pops defines how many Pop tiles are defined in the Level Preset file.
	// These Pop tiles are mainly used for controlling the roof and wall popping when a player enters a building in an area.
	Pops int `csv:"Pops"`

	// PopPad determines the size of the Pop tile area, by using an offset value.
	// This offset value can increase or decrease the size of the Pop tile size if it has a positive or negative value.
	PopPad int `csv:"PopPad"`

	// Files determines the number of different versions to use for the Level Preset.
	// This value acts as a range, which the game will use for randomly choosing one of the "File#" fields to build the Level Preset.
	// This is how the Level Presets have variety when the area level is being built.
	Files int `csv:"Files"`

	// File1 to File6 specify the name of which ds1 file to use.
	// The ds1 files contain data for building Level Presets.
	// If this value equals 0, then this field will be ignored.
	// The number of these defined fields should match the value used in the "Files" field.
	File1 string `csv:"File1"`
	File2 string `csv:"File2"`
	File3 string `csv:"File3"`
	File4 string `csv:"File4"`
	File5 string `csv:"File5"`
	File6 string `csv:"File6"`

	// Dt1Mask functions as a bit field mask with a size of a 32-bit value.
	// This explains to the ds1 file which of the 32 dt1 tile files to use from a Level ItemSuperType when assembling the Level Preset.
	// Each "File#" field from LevelType.txt is assigned a bit value, up to the 32 possible bit values.
	// (For example: File1 = 1, File2=2, File3 = 4, File4=8, File5=16....File32 = 2147483648).
	// To build the "Dt1Mask", you would select which "File#" fields to use from LevelTypes.txt
	// and add their associated bit values together for a total value. This total value is the bitmask value.
	Dt1Mask int `csv:"Dt1Mask"`
}

LevelPreset represents the data structure for Level Preset information.

type LevelSubstitutionData

type LevelSubstitutionData struct {
	// Name is a reference field to describe the Level Substitution.
	Name string `csv:"Name"`

	// Type refers to the "SubType" field from the Levels.txt file. This defines a group that multiple substitutions can share.
	Type int `csv:"ItemSuperType"`

	// File specifies the name of the ds1 file to use. The ds1 files contain data for building Level Presets.
	File string `csv:"File"`

	// CheckAll is a Boolean Field. If equals 1, then substitute each tile in the room. If equals 0, then substitute random tiles in the room.
	CheckAll int `csv:"CheckAll"`

	// BordType controls how often substituting tiles can work for border tiles.
	BordType int `csv:"BordType"`

	// GridSize controls the tile size of a cluster for substituting tiles. This evenly affects both the X and Y size values of a room.
	GridSize int `csv:"GridSize"`

	// Dt1Mask functions as a bit field mask with a size of a 32 bit value. This explains to the ds1 file which of the 32 dt1 tile files to use from a Level Type when assembling selecting a tile for substitution.
	Dt1Mask int `csv:"Dt1Mask"`

	// Prob0 (to Prob4) affects the probability that the tile substitution is used. This is a random chance out of 100. Which "Prob#" field that is checked depends on the "SubTheme" value from the Levels.txt file.
	Prob0, Prob1, Prob2, Prob3, Prob4 int `csv:"Prob0,Prob1,Prob2,Prob3,Prob4"`

	// Trials0 (to Trials4) controls the number of times to randomly substitute tiles in a cluster. If this value equals -1, then the game will try to do as many tile substitutions that can be allowed based on the cluster and tile size. This field depends on the "CheckAll" field being equal to 0.
	Trials0, Trials1, Trials2, Trials3, Trials4 int `csv:"Trials0,Trials1,Trials2,Trials3,Trials4"`
}

LevelSubstitutionData represents the data from LvlSub.txt. This file controls how tiles can be substituted in for other tiles. The game divides the level into clusters and iterates through these clusters to randomly substitute tiles, creating more visual diversity.

type LevelType

type LevelType struct {
	// Name is a reference field to define the Level ItemSuperType.
	Name string `csv:"Name"`

	// File1 (to File32) specifies the name of which dt1 file to use. The dt1 files contain the images for each area tile found in each Act. If this value equals 0, then this field will be ignored.
	File1  string `csv:"File 1"`
	File2  string `csv:"File 2"`
	File3  string `csv:"File 3"`
	File4  string `csv:"File 4"`
	File5  string `csv:"File 5"`
	File6  string `csv:"File 6"`
	File7  string `csv:"File 7"`
	File8  string `csv:"File 8"`
	File9  string `csv:"File 9"`
	File10 string `csv:"File 10"`
	File11 string `csv:"File 11"`
	File12 string `csv:"File 12"`
	File13 string `csv:"File 13"`
	File14 string `csv:"File 14"`
	File15 string `csv:"File 15"`
	File16 string `csv:"File 16"`
	File17 string `csv:"File 17"`
	File18 string `csv:"File 18"`
	File19 string `csv:"File 19"`
	File20 string `csv:"File 20"`
	File21 string `csv:"File 21"`
	File22 string `csv:"File 22"`
	File23 string `csv:"File 23"`
	File24 string `csv:"File 24"`
	File25 string `csv:"File 25"`
	File26 string `csv:"File 26"`
	File27 string `csv:"File 27"`
	File28 string `csv:"File 28"`
	File29 string `csv:"File 29"`
	File30 string `csv:"File 30"`
	File31 string `csv:"File 31"`
	File32 string `csv:"File 32"`

	// Act defines which Act is related to the Level ItemSuperType. When loading an Act, the game will only use the Level Types associated with that Act number. Uses a decimal number to convey each Act number (Ex: A value of 3 means Act 3).
	Act uint `csv:"Act"`
}

LevelType represents the data from LvlTypes.txt. This file controls which files containing tile graphics are used for creating maps. It looks at dt1 files, which contain tile images of the environments found in the game. Each line in this file defines a Level ItemSuperType and what files it uses.

The order of each Level ItemSuperType defined in this file conveys its ID value, which is referenced by the following files: Levels.txt, LvlPrest.txt The order of these Level Types should not be changed.

type LevelWarp

type LevelWarp struct {
	// Name is the reference field to define the Level Warp.
	Name string `csv:"Name"`

	// Id defines the numeric ID for the type of Level Warp.
	Id string `csv:"Id"`

	// SelectX defines the horizontal offset of the starting left corner position of the Level Warp area.
	SelectX int `csv:"SelectX"`

	// SelectY defines the vertical offset of the starting left corner position of the Level Warp area.
	SelectY int `csv:"SelectY"`

	// SelectDX defines the horizontal offset from the starting position of the Level Warp area.
	SelectDX int `csv:"SelectDX"`

	// SelectDY defines the vertical offset from the starting position of the Level Warp area.
	SelectDY int `csv:"SelectDY"`

	// ExitWalkX defines the horizontal position of the destination location where the player will walk to after exiting to this Level Warp.
	ExitWalkX int `csv:"ExitWalkX"`

	// ExitWalkY defines the vertical position of the destination location where the player will walk to after exiting to this Level Warp.
	ExitWalkY int `csv:"ExitWalkY"`

	// OffsetX defines the horizontal position of the sub-tile for the Level Warp, where the player will appear when exiting to this area level.
	OffsetX int `csv:"OffsetX"`

	// OffsetY defines the vertical position of the sub-tile for the Level Warp, where the player will appear when exiting to this area level.
	OffsetY int `csv:"OffsetY"`

	// LitVersion is a boolean field. If it equals 1, then Level Warp tiles will change their appearance when highlighted. If it equals 0, then the Level Warp tiles will not change appearance when highlighted.
	LitVersion int `csv:"LitVersion"`

	// Tiles defines an index offset to determine which tile to use in the tile set for the highlighted version of the Level Warp.
	Tiles int `csv:"Tiles"`

	// NoInteract is a boolean field. If it equals 1, then the Level Warp cannot be directly interacted by the player. If it equals 0, then the player can interact with the Level Warp.
	NoInteract int `csv:"NoInteract"`

	// Direction defines the orientation of the Level Warp.
	Direction string `csv:"Direction"`

	// UniqueId defines the unique numeric ID for the Level Warp. Each Level Warp should have a unique ID so that the game can handle loading that specific Level Warp’s related files.
	UniqueId int `csv:"UniqueId"`
}

LevelWarp represents the data from LvlWarp.txt. This file controls how the player is moved to different area levels, such as entrances and exits between different areas. This player transportation of between levels is defined as a Level Warp. Level Warps function as special tiles that are added to the area for controlling the location for where to transport the player.

This file is used by the Levels.txt file. LevelWarp represents the data from the "LvlWarp.txt" file.

type MagicPrefix

type MagicPrefix struct {
	Name           string `csv:"Name"`           // Defines the item affix name
	Version        int    `csv:"version"`        // Defines which game version to use this item affix (<100 = Classic mode | 100 = Expansion mode)
	Spawnable      bool   `csv:"spawnable"`      // Boolean Field. If equals 1, then this item affix is used as part of the game’s randomizer for assigning item modifiers when an item spawns. If equals 0, then this item affix is never used.
	Rare           bool   `csv:"rare"`           // Boolean Field. If equals 1, then this item affix can be used when randomly assigning item modifiers when a rare item spawns. If equals 0, then this item affix is not used for rare items.
	Level          int    `csv:"level"`          // The minimum item level required for this item affix to spawn on the item. If the item level is below this value, then the item affix will not spawn on the item.
	MaxLevel       int    `csv:"maxlevel"`       // The maximum item level required for this item affix to spawn on the item. If the item level is above this value, then the item affix will not spawn on the item.
	LevelReq       int    `csv:"levelreq"`       // The minimum character level required to equip an item that has this item affix
	ClassSpecific  string `csv:"classspecific"`  // Controls if this item affix should only be used for class specific items. This relies on the class specified in the “Class” field from ItemTypes.txt, for the specific item.
	Class          string `csv:"class"`          // Controls which character class is required for the class specific level requirement “classlevelreq” field
	ClassLevelReq  int    `csv:"classlevelreq"`  // The minimum character level required for a specific class in order to equip an item that has this item affix. This relies on the class specified in the “class” field. If equals null, then the class will default to using the “levelreq” field.
	Frequency      int    `csv:"frequency"`      // Controls the probability that the affix appears on the item (a higher value means that the item affix will appear on the item more often). This value gets summed together with other “frequency” values from all possible item affixes that can spawn on the item, and then is used as a denominator value for the randomizer. Whichever item affix is randomly selected will be the one to appear on the item. The formula is calculated as the following: [Item Affix Selected] = [“frequency”] / [Total Frequency]. If the item has a magic level (from the “magic lvl” field in weapons.txt/armor.txt/misc.txt) then the magic level value is multiplied with this value. If equals 0, then this item affix will never appear on an item.
	Group          int    `csv:"group"`          // Assigns an item affix to a specific group number. Items cannot spawn with more than 1 item affix with the same group number. This is used to guarantee that certain item affixes do not overlap on the same item. If this field is null, then the group number will default to group 0.
	Mod1Code       string `csv:"mod1code"`       // Controls the item properties for the item affix (Uses the “code” field from Properties.txt)
	Mod1Param      int    `csv:"mod1param"`      // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	Mod1Min        int    `csv:"mod1min"`        // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	Mod1Max        int    `csv:"mod1max"`        // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	Mod2Code       string `csv:"mod2code"`       // Controls the item properties for the item affix (Uses the “code” field from Properties.txt)
	Mod2Param      int    `csv:"mod2param"`      // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	Mod2Min        int    `csv:"mod2min"`        // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	Mod2Max        int    `csv:"mod2max"`        // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	Mod3Code       string `csv:"mod3code"`       // Controls the item properties for the item affix (Uses the “code” field from Properties.txt)
	Mod3Param      int    `csv:"mod3param"`      // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	Mod3Min        int    `csv:"mod3min"`        // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	Mod3Max        int    `csv:"mod3max"`        // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	TransformColor string `csv:"transformcolor"` // Controls the color change of the item after spawning with this item affix. If empty, then the item affix will not change the item’s color. (Uses Color Codes from the reference file colors.txt)
	ItemType1      string `csv:"itype1"`         // Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ItemType2      string `csv:"itype2"`         // Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ItemType3      string `csv:"itype3"`         // Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ItemType4      string `csv:"itype4"`         // Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ItemType5      string `csv:"itype5"`         // Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ItemType6      string `csv:"itype6"`         // Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ItemType7      string `csv:"itype7"`         // Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ExcludeType1   string `csv:"etype1"`         // Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ExcludeType2   string `csv:"etype2"`         // Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ExcludeType3   string `csv:"etype3"`         // Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ExcludeType4   string `csv:"etype4"`         // Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ExcludeType5   string `csv:"etype5"`         // Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ExcludeType6   string `csv:"etype6"`         // Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	ExcludeType7   string `csv:"etype7"`         // Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	Multiply       int    `csv:"multiply"`       // Multiplicative modifier for the item’s buy and sell costs, based on the item affix (Calculated in 1024ths for buy cost and 4096ths for sell cost)
	Add            int    `csv:"add"`            // Flat integer modification to the item’s buy and sell costs, based on the item affix
}

MagicPrefix represents the data structure for controlling what item affixes (groups of item modifiers) are applied as the prefix for an item. These item affixes will appear at the start of an item’s name. This file is loaded together with other similar files in the following order: magicsuffix.txt, magicprefix.txt, automagic.txt. These combined files form the Item Mods structure.

type MagicSuffix

type MagicSuffix struct {
	Name           string  `csv:"Name"`           // Defines the item affix name
	Version        int     `csv:"version"`        // Defines which game version to use this item affix (<100 = Classic mode | 100 = Expansion mode)
	Spawnable      bool    `csv:"spawnable"`      // If equals 1, then this item affix is used as part of the game’s randomizer for assigning item modifiers when an item spawns. If equals 0, then this item affix is never used.
	Rare           bool    `csv:"rare"`           // If equals 1, then this item affix can be used when randomly assigning item modifiers when a rare item spawns. If equals 0, then this item affix is not used for rare items.
	Level          int     `csv:"level"`          // The minimum item level required for this item affix to spawn on the item. If the item level is below this value, then the item affix will not spawn on the item.
	MaxLevel       int     `csv:"maxlevel"`       // The maximum item level required for this item affix to spawn on the item. If the item level is above this value, then the item affix will not spawn on the item.
	LevelReq       int     `csv:"levelreq"`       // The minimum character level required to equip an item that has this item affix.
	ClassSpecific  string  `csv:"classspecific"`  // Controls if this item affix should only be used for class-specific items. This relies on the class specified in the “Class” field from ItemTypes.txt, for the specific item.
	Class          string  `csv:"class"`          // Controls which character class is required for the class-specific level requirement “classlevelreq” field.
	ClassLevelReq  *int    `csv:"classlevelreq"`  // The minimum character level required for a specific class to equip an item that has this item affix. If equals null, then the class will default to using the “levelreq” field.
	Frequency      float64 `csv:"frequency"`      // Controls the probability that the affix appears on the item (a higher value means that the item affix will appear on the item more often).
	Group          *int    `csv:"group"`          // Assigns an item affix to a specific group number. Items cannot spawn with more than 1 item affix with the same group number. This is used to guarantee that certain item affixes do not overlap on the same item. If this field is null, then the group number will default to group 0.
	Mod1Code       string  `csv:"mod1code"`       // Controls the item properties for the item affix. (Uses the “code” field from Properties.txt)
	Mod1Param      *string `csv:"mod1param"`      // The “parameter” value associated with the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	Mod1Min        *string `csv:"mod1min"`        // The “min” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	Mod1Max        *string `csv:"mod1max"`        // The “max” value to assign to the listed property (mod). Usage depends on the property function (See the “func” field on Properties.txt)
	TransformColor *string `csv:"transformcolor"` // Controls the color change of the item after spawning with this item affix. If empty, then the item affix will not change the item’s color. (Uses Color Codes from the reference file colors.txt)
	IType1         string  `csv:"itype1"`         // Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	IType2         string  `csv:"itype2"`         // (Continued...) Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	IType3         string  `csv:"itype3"`         // (Continued...) Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	IType4         string  `csv:"itype4"`         // (Continued...) Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	IType5         string  `csv:"itype5"`         // (Continued...) Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	IType6         string  `csv:"itype6"`         // (Continued...) Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	IType7         string  `csv:"itype7"`         // (Continued...) Controls what Item Types are allowed to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	EType1         string  `csv:"etype1"`         // Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	EType2         string  `csv:"etype2"`         // (Continued...) Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	EType3         string  `csv:"etype3"`         // (Continued...) Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	EType4         string  `csv:"etype4"`         // (Continued...) Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	EType5         string  `csv:"etype5"`         // (Continued...) Controls what Item Types are excluded to spawn with this item affix. Uses the “code” field from ItemTypes.txt
	Multiply       int     `csv:"multiply"`       // Multiplicative modifier for the item’s buy and sell costs, based on the item affix (Calculated in 1024ths for buy cost and 4096ths for sell cost)
	Add            int     `csv:"add"`            // Flat integer modification to the item’s buy and sell costs, based on the item affix
}

MagicSuffix represents an item affix that is applied as a suffix for an item.

type MiscItem

type MiscItem struct {
	Name           string `csv:"name"`
	Version        int    `csv:"version"`
	CompactSave    int    `csv:"compactsave"`
	Rarity         int    `csv:"rarity"`
	Spawnable      int    `csv:"spawnable"`
	Speed          int    `csv:"speed"`
	ReqStr         int    `csv:"reqstr"`
	ReqDex         int    `csv:"reqdex"`
	Durability     int    `csv:"durability"`
	NoDurability   int    `csv:"nodurability"`
	Level          int    `csv:"level"`
	ShowLevel      int    `csv:"ShowLevel"`
	LevelReq       int    `csv:"levelreq"`
	Cost           int    `csv:"cost"`
	GambleCost     int    `csv:"gamble cost"`
	Code           string `csv:"code"`
	NameStr        string `csv:"namestr"`
	MagicLvl       int    `csv:"magic lvl"`
	AutoPrefix     int    `csv:"auto prefix"`
	AlternateGfx   string `csv:"alternategfx"`
	NormCode       string `csv:"normcode"`
	UberCode       string `csv:"ubercode"`
	UltraCode      string `csv:"ultracode"`
	Component      string `csv:"component"`
	InvWidth       int    `csv:"invwidth"`
	InvHeight      int    `csv:"invheight"`
	HasInv         int    `csv:"hasinv"`
	GemSockets     int    `csv:"gemsockets"`
	GemApplyType   string `csv:"gemapplytype"`
	FlippyFile     string `csv:"flippyfile"`
	InvFile        string `csv:"invfile"`
	UniqueInvFile  string `csv:"uniqueinvfile"`
	SetInvFile     string `csv:"setinvfile"`
	Useable        int    `csv:"useable"`
	Stackable      int    `csv:"stackable"`
	MinStack       int    `csv:"minstack"`
	MaxStack       int    `csv:"maxstack"`
	SpawnStack     int    `csv:"spawnstack"`
	Transmogrify   int    `csv:"Transmogrify"`
	TMogType       string `csv:"TMogType"`
	TMogMin        int    `csv:"TMogMin"`
	TMogMax        int    `csv:"TMogMax"`
	Type           string `csv:"type"`
	Type2          string `csv:"type2"`
	DropSound      string `csv:"dropsound"`
	DropSfxFrame   int    `csv:"dropsfxframe"`
	UseSound       string `csv:"usesound"`
	Unique         int    `csv:"unique"`
	Transparent    int    `csv:"transparent"`
	TransTbl       string `csv:"transtbl"`
	LightRadius    int    `csv:"lightradius"`
	Belt           int    `csv:"belt"`
	Quest          int    `csv:"quest"`
	QuestDiffCheck int    `csv:"questdiffcheck"`
	MissileType    string `csv:"missiletype"`
	DurWarning     int    `csv:"durwarning"`
	QntWarning     int    `csv:"qntwarning"`
	MinDam         int    `csv:"mindam"`
	MaxDam         int    `csv:"maxdam"`
	StrBonus       int    `csv:"StrBonus"`
	DexBonus       int    `csv:"DexBonus"`
	GemOffset      int    `csv:"gemoffset"`
	BitField1      int    `csv:"bitfield1"`
	Autobelt       int    `csv:"autobelt"`
	BetterGem      string `csv:"bettergem"`
	Multibuy       int    `csv:"multibuy"`
	SpellIcon      int    `csv:"spellicon"`
	PSpell         int    `csv:"pspell"`
	State          string `csv:"state"`
	CState1        string `csv:"cstate1"`
	CState2        string `csv:"cstate2"`
	Len            int    `csv:"len"`
	Stat1          string `csv:"stat1"`
	Stat2          string `csv:"stat2"`
	Stat3          string `csv:"stat3"`
	Calc1          int    `csv:"calc1"`
	Calc2          int    `csv:"calc2"`
	Calc3          int    `csv:"calc3"`
	SpellDesc      int    `csv:"spelldesc"`
	SpellDescStr   string `csv:"spelldescstr"`
	SpellDescStr2  string `csv:"spelldescstr2"`
	SpellDescCalc  int    `csv:"spelldesccalc"`
	SpellDescColor int    `csv:"spelldesccolor"`

	CharsiMin      int `csv:"CharsiMin"`
	CharsiMax      int `csv:"CharsiMax"`
	CharsiMagicMin int `csv:"CharsiMagicMin"`
	CharsiMagicMax int `csv:"CharsiMagicMax"`
	CharsiMagicLvl int `csv:"CharsiMagicLvl"`

	GheedMin      int `csv:"GheedMin"`
	GheedMax      int `csv:"GheedMax"`
	GheedMagicMin int `csv:"GheedMagicMin"`
	GheedMagicMax int `csv:"GheedMagicMax"`
	GheedMagicLvl int `csv:"GheedMagicLvl"`

	AkaraMin      int `csv:"AkaraMin"`
	AkaraMax      int `csv:"AkaraMax"`
	AkaraMagicMin int `csv:"AkaraMagicMin"`
	AkaraMagicMax int `csv:"AkaraMagicMax"`
	AkaraMagicLvl int `csv:"AkaraMagicLvl"`

	FaraMin      int `csv:"FaraMin"`
	FaraMax      int `csv:"FaraMax"`
	FaraMagicMin int `csv:"FaraMagicMin"`
	FaraMagicMax int `csv:"FaraMagicMax"`
	FaraMagicLvl int `csv:"FaraMagicLvl"`

	LysanderMin      int `csv:"LysanderMin"`
	LysanderMax      int `csv:"LysanderMax"`
	LysanderMagicMin int `csv:"LysanderMagicMin"`
	LysanderMagicMax int `csv:"LysanderMagicMax"`
	LysanderMagicLvl int `csv:"LysanderMagicLvl"`

	DrognanMin      int `csv:"DrognanMin"`
	DrognanMax      int `csv:"DrognanMax"`
	DrognanMagicMin int `csv:"DrognanMagicMin"`
	DrognanMagicMax int `csv:"DrognanMagicMax"`
	DrognanMagicLvl int `csv:"DrognanMagicLvl"`

	HratliMin      int `csv:"HratliMin"`
	HratliMax      int `csv:"HratliMax"`
	HratliMagicMin int `csv:"HratliMagicMin"`
	HratliMagicMax int `csv:"HratliMagicMax"`
	HratliMagicLvl int `csv:"HratliMagicLvl"`

	AlkorMin      int `csv:"AlkorMin"`
	AlkorMax      int `csv:"AlkorMax"`
	AlkorMagicMin int `csv:"AlkorMagicMin"`
	AlkorMagicMax int `csv:"AlkorMagicMax"`
	AlkorMagicLvl int `csv:"AlkorMagicLvl"`

	OrmusMin      int `csv:"OrmusMin"`
	OrmusMax      int `csv:"OrmusMax"`
	OrmusMagicMin int `csv:"OrmusMagicMin"`
	OrmusMagicMax int `csv:"OrmusMagicMax"`
	OrmusMagicLvl int `csv:"OrmusMagicLvl"`

	ElzixMin      int `csv:"ElzixMin"`
	ElzixMax      int `csv:"ElzixMax"`
	ElzixMagicMin int `csv:"ElzixMagicMin"`
	ElzixMagicMax int `csv:"ElzixMagicMax"`
	ElzixMagicLvl int `csv:"ElzixMagicLvl"`

	AshearaMin      int `csv:"AshearaMin"`
	AshearaMax      int `csv:"AshearaMax"`
	AshearaMagicMin int `csv:"AshearaMagicMin"`
	AshearaMagicMax int `csv:"AshearaMagicMax"`
	AshearaMagicLvl int `csv:"AshearaMagicLvl"`

	CainMin      int `csv:"CainMin"`
	CainMax      int `csv:"CainMax"`
	CainMagicMin int `csv:"CainMagicMin"`
	CainMagicMax int `csv:"CainMagicMax"`
	CainMagicLvl int `csv:"CainMagicLvl"`

	HalbuMin      int `csv:"HalbuMin"`
	HalbuMax      int `csv:"HalbuMax"`
	HalbuMagicMin int `csv:"HalbuMagicMin"`
	HalbuMagicMax int `csv:"HalbuMagicMax"`
	HalbuMagicLvl int `csv:"HalbuMagicLvl"`

	JamellaMin      int `csv:"JamellaMin"`
	JamellaMax      int `csv:"JamellaMax"`
	JamellaMagicMin int `csv:"JamellaMagicMin"`
	JamellaMagicMax int `csv:"JamellaMagicMax"`
	JamellaMagicLvl int `csv:"JamellaMagicLvl"`

	LarzukMin      int `csv:"LarzukMin"`
	LarzukMax      int `csv:"LarzukMax"`
	LarzukMagicMin int `csv:"LarzukMagicMin"`
	LarzukMagicMax int `csv:"LarzukMagicMax"`
	LarzukMagicLvl int `csv:"LarzukMagicLvl"`

	MalahMin      int `csv:"MalahMin"`
	MalahMax      int `csv:"MalahMax"`
	MalahMagicMin int `csv:"MalahMagicMin"`
	MalahMagicMax int `csv:"MalahMagicMax"`
	MalahMagicLvl int `csv:"MalahMagicLvl"`

	AnyaMin      int `csv:"AnyaMin"`
	AnyaMax      int `csv:"AnyaMax"`
	AnyaMagicMin int `csv:"AnyaMagicMin"`
	AnyaMagicMax int `csv:"AnyaMagicMax"`
	AnyaMagicLvl int `csv:"AnyaMagicLvl"`
}

type Missile

type Missile struct {
	Missile           string `csv:"Missile"`       // Defines the unique name ID for the missile.
	PCltDoFunc        string `csv:"pCltDoFunc"`    // ID value to select a function for the missile's behavior on the client side while active every frame.
	PCltHitFunc       string `csv:"pCltHitFunc"`   // ID value to select a specialized function for the missile's behavior when hitting something on the client side.
	PSrvDoFunc        string `csv:"pSrvDoFunc"`    // ID value to select a specialized function for the missile's behavior on the server side every frame.
	PSrvHitFunc       string `csv:"pSrvHitFunc"`   // ID value to select a specialized function for the missile's behavior when hitting something on the server side.
	PSrvDmgFunc       string `csv:"pSrvDmgFunc"`   // ID value to select a specialized function called before damaging a unit on the server side.
	SrvCalc1          string `csv:"SrvCalc1"`      // Numeric calculation field used as a parameter for "pSrvDoFunc".
	Param1            int    `csv:"Param1"`        // Integer field used as a parameter for "pSrvDoFunc".
	Param2            int    `csv:"Param2"`        // Integer field used as a parameter for "pSrvDoFunc".
	Param3            int    `csv:"Param3"`        // Integer field used as a parameter for "pSrvDoFunc".
	Param4            int    `csv:"Param4"`        // Integer field used as a parameter for "pSrvDoFunc".
	Param5            int    `csv:"Param5"`        // Integer field used as a parameter for "pSrvDoFunc".
	CltCalc1          string `csv:"CltCalc1"`      // Numeric calculation field used as a parameter for "pCltDoFunc".
	CltParam1         int    `csv:"CltParam1"`     // Integer field used as a parameter for "pCltDoFunc".
	CltParam2         int    `csv:"CltParam2"`     // Integer field used as a parameter for "pCltDoFunc".
	CltParam3         int    `csv:"CltParam3"`     // Integer field used as a parameter for "pCltDoFunc".
	CltParam4         int    `csv:"CltParam4"`     // Integer field used as a parameter for "pCltDoFunc".
	CltParam5         int    `csv:"CltParam5"`     // Integer field used as a parameter for "pCltDoFunc".
	SHitCalc1         string `csv:"SHitCalc1"`     // Numeric calculation field used as a parameter for "pSrvHitFunc".
	SHitPar1          int    `csv:"sHitPar1"`      // Integer field used as a parameter for "pSrvHitFunc".
	SHitPar2          int    `csv:"sHitPar2"`      // Integer field used as a parameter for "pSrvHitFunc".
	SHitPar3          int    `csv:"sHitPar3"`      // Integer field used as a parameter for "pSrvHitFunc".
	CHitCalc1         string `csv:"CHitCalc1"`     // Numeric calculation field used as a parameter for "pCltHitFunc".
	CHitPar1          int    `csv:"cHitPar1"`      // Integer field used as a parameter for "pCltHitFunc".
	CHitPar2          int    `csv:"cHitPar2"`      // Integer field used as a parameter for "pCltHitFunc".
	CHitPar3          int    `csv:"cHitPar3"`      // Integer field used as a parameter for "pCltHitFunc".
	DmgCalc1          string `csv:"DmgCalc1"`      // Numeric calculation field used as a parameter for "pSrvDmgFunc".
	DParam1           int    `csv:"dParam1"`       // Integer field used as a parameter for "pSrvDmgFunc".
	DParam2           int    `csv:"dParam2"`       // Integer field used as a parameter for "pSrvDmgFunc".
	Vel               int    `csv:"Vel"`           // Baseline velocity of the missile in pixels traveled per frame.
	MaxVel            int    `csv:"MaxVel"`        // Maximum velocity of the missile.
	VelLev            int    `csv:"VelLev"`        // Extra velocity based on the caster unit's level.
	Accel             int    `csv:"Accel"`         // Acceleration of the missile's movement.
	Range             int    `csv:"Range"`         // Baseline duration that the missile will exist for after it is created, measured in frames where 25 Frames = 1 second.
	LevRange          int    `csv:"LevRange"`      // Extra duration based on the caster unit's level.
	Light             int    `csv:"Light"`         // Missile's Light Radius size measured in grid sub-tiles.
	Flicker           int    `csv:"Flicker"`       // If greater than 0, the Light Radius randomly changes in size every 4th frame while the missile is active.
	Red               int    `csv:"Red"`           // Red color value of the missile's Light Radius.
	Green             int    `csv:"Green"`         // Green color value of the missile's Light Radius.
	Blue              int    `csv:"Blue"`          // Blue color value of the missile's Light Radius.
	InitSteps         int    `csv:"InitSteps"`     // Number of frames the missile needs to be alive until it becomes visible on the game client.
	Activate          int    `csv:"Activate"`      // Number of frames the missile needs to be alive until it becomes active.
	LoopAnim          int    `csv:"LoopAnim"`      // If true, the missile's animation will repeat once the previous animation finishes.
	CelFile           string `csv:"CelFile"`       // DCC missile file to use for the visual graphics of the missile.
	AnimRate          int    `csv:"animrate"`      // Visual speed of the missile's animation graphics.
	AnimLen           int    `csv:"AnimLen"`       // Length of the missile's animation in frames where 25 Frames = 1 second.
	AnimSpeed         int    `csv:"AnimSpeed"`     // Visual speed of the missile's animation graphics on the client side, measured in 16ths.
	RandStart         int    `csv:"RandStart"`     // If greater than 0, the missile will start at a random frame between 0 and this value when it begins its animation.
	SubLoop           bool   `csv:"SubLoop"`       // If true, the missile will use a specific sequence of its animation while it is alive.
	SubStart          int    `csv:"SubStart"`      // The starting frame of the sequence animation. Requires "SubLoop" field to be enabled.
	SubStop           int    `csv:"SubStop"`       // The ending frame of the sequence animation. Requires "SubLoop" field to be enabled.
	CollideType       int    `csv:"CollideType"`   // Missile's collision type, controlling what units or objects the missile can impact.
	CollideKill       bool   `csv:"CollideKill"`   // If true, the missile will be destroyed when it collides with something.
	CollideFriend     bool   `csv:"CollideFriend"` // If true, the missile can collide with friendly units, including the caster.
	LastCollide       bool   `csv:"LastCollide"`   // If true, the missile will track the last unit that it collided with.
	Collision         bool   `csv:"Collision"`     // If true, the missile will have a missile type path placement collision mask when it is initialized or moved.
	ClientCol         bool   `csv:"ClientCol"`     // If true, the missile will check collision on the client based on the "CollideType" field.
	ClientSend        bool   `csv:"ClientSend"`    // If true, the server will create the missile on the client.
	NextHit           bool   `csv:"NextHit"`       // If true, the missile will use the next delay.
	NextDelay         int    `csv:"NextDelay"`     // Delay in frame length until the missile is allowed to hit the same unit again. Requires "NextHit" field to be enabled.
	XOffset           int    `csv:"xoffset"`       // X location coordinate (measured in pixels) to offset the visual graphics of the missile.
	YOffset           int    `csv:"yoffset"`       // Y location coordinate (measured in pixels) to offset the visual graphics of the missile.
	ZOffset           int    `csv:"zoffset"`       // Z location coordinate (measured in pixels) to visually draw the missile based on its actual location.
	Size              int    `csv:"Size"`          // Diameter in sub-tiles (X and Y axis) that the missile will occupy.
	SrcTown           bool   `csv:"SrcTown"`       // If true, the missile will be destroyed if the caster unit is located in an act town.
	CltSrcTown        int    `csv:"CltSrcTown"`    // If greater than 0 and "LoopAnim" field is disabled, this controls which frame to set the missile's animation when the player is in town.
	CanDestroy        int    `csv:"CanDestroy"`    // If true, the missile can be attacked and destroyed.
	ToHit             int    `csv:"ToHit"`         // If true, this missile will use the caster's Attack Rating stat to determine if the missile should hit its target.
	AlwaysExplode     int    `csv:"AlwaysExplode"` // If true, the missile will always process an explosion when killed.
	Explosion         int    `csv:"Explosion"`     // If true, the missile will be classified as an explosion.
	Town              int    `csv:"Town"`          // If true, the missile is allowed to be alive when in a town area.
	NoUniqueMod       int    `csv:"NoUniqueMod"`   // If true, the missile will not receive bonuses from Unique monster modifiers.
	NoMultiShot       int    `csv:"NoMultiShot"`   // If true, the missile will not be affected by the Multi-Shot monster modifier.
	Holy              int    `csv:"Holy"`          // Bit field flag where each value is a code to allow the missile to damage a certain type of monster.
	CanSlow           int    `csv:"CanSlow"`       // If true, the missile can be affected by the "slowmissiles" state.
	ReturnFire        int    `csv:"ReturnFire"`    // If true, missile can trigger the Sorceress Chilling Armor event function.
	GetHit            int    `csv:"GetHit"`        // If true, the missile will cause the target unit to enter the Get Hit mode (GH), which acts as the hit recovery mode.
	SoftHit           int    `csv:"SoftHit"`       // If true, the missile will cause a soft hit on the unit.
	KnockBack         int    `csv:"KnockBack"`     // Percentage chance (out of 100) that the target unit will be knocked back when hit by the missile.
	Trans             int    `csv:"Trans"`         // Alpha mode for how the missile is displayed, affecting transparency and blending.
	Pierce            bool   `csv:"Pierce"`        // If true, allow the Pierce modifier function to work with this missile.
	MissileSkill      bool   `csv:"MissileSkill"`  // If true, the missile will use the skill's damage instead of its defined damage.
	Skill             string `csv:"Skill"`         // Links to the "skill" field from the skills.txt file.
	ResultFlags       string `csv:"ResultFlags"`   // Controls different flags affecting how the target reacts after being hit by the missile.
	HitFlags          string `csv:"HitFlags"`      // Controls different flags affecting the damage dealt when the target is hit by the missile.
	HitShift          int    `csv:"HitShift"`      // Percentage modifier for the missile's damage.
	ApplyMastery      bool   `csv:"ApplyMastery"`  // If true, apply the caster's elemental mastery bonus modifiers to the missile's elemental damage.
	SrcDamage         int    `csv:"SrcDamage"`     // Controls how much of the source unit's damage should be added to the missile's damage.
	Half2HSrc         bool   `csv:"Half2HSrc"`     // If true and the source unit is currently wielding a 2-Handed weapon, the source damage is reduced by 50%.
	SrcMissDmg        int    `csv:"SrcMissDmg"`    // If the missile was created by another missile, this controls how much of the source missile's damage should be added to this missile's damage.
	MinDamage         int    `csv:"MinDamage"`     // Minimum baseline physical damage dealt by the missile.
	MinLevDam1        string `csv:"MinLevDam1"`    // Additional minimum physical damage dealt by the missile, calculated using the leveling formula.
	MinLevDam2        string `csv:"MinLevDam2"`
	MinLevDam3        string `csv:"MinLevDam3"`
	MinLevDam4        string `csv:"MinLevDam4"`
	MinLevDam5        string `csv:"MinLevDam5"`
	MaxDamage         int    `csv:"MaxDamage"`  // Maximum baseline physical damage dealt by the missile.
	MaxLevDam1        string `csv:"MaxLevDam1"` // Additional maximum physical damage dealt by the missile, calculated using the leveling formula.
	MaxLevDam2        string `csv:"MaxLevDam2"`
	MaxLevDam3        string `csv:"MaxLevDam3"`
	MaxLevDam4        string `csv:"MaxLevDam4"`
	MaxLevDam5        string `csv:"MaxLevDam5"`
	DmgSymPerCalc     string `csv:"DmgSymPerCalc"` // Calculation field determining the percentage increase to the physical damage dealt by the missile.
	EType             string `csv:"EType"`         // Type of elemental damage dealt by the missile. Possible values: "None", "fire", "ltng", "mag", "cold", "pois", "life", "mana", "stam", "stun", "rand", "burn", "frze".
	EMin              int    `csv:"EMin"`          // Minimum baseline elemental damage dealt by the missile.
	MinELev1          int    `csv:"MinELev1"`      // Additional minimum elemental damage dealt by the missile, calculated using the leveling formula.
	MinELev2          int    `csv:"MinELev2"`
	MinELev3          int    `csv:"MinELev3"`
	EMax              int    `csv:"EMax"`     // Maximum baseline elemental damage dealt by the missile.
	MaxELev1          int    `csv:"MaxELev1"` // Additional maximum elemental damage dealt by the missile, calculated using the leveling formula.
	MaxELev2          int    `csv:"MaxELev2"`
	MaxELev3          int    `csv:"MaxELev3"`
	ELen              int    `csv:"ELen"`     // Baseline elemental duration dealt by the missile in frames. Only applicable to appropriate elemental types with duration.
	ELevLen1          int    `csv:"ELevLen1"` // Additional elemental duration added by the missile, calculated using the leveling formula.
	ELevLen2          int    `csv:"ELevLen2"`
	ELevLen3          int    `csv:"ELevLen3"`
	HitClass          int    `csv:"HitClass"`         // Missile's own hit class into the damage routines, used for determining hit sound effects and overlays.
	NumDirections     int    `csv:"NumDirections"`    // Number of directions allowed by the missile, based on the DCC file used.
	LocalBlood        bool   `csv:"LocalBlood"`       // If true, change the color of blood missiles to green.
	DamageRate        int    `csv:"DamageRate"`       // Controls the "damage_framerate" stat, acting as a percentage multiplier for damage reduction stat modifiers during damage resistance calculations.
	TravelSound       string `csv:"TravelSound"`      // Points to a "Sound" field defined in the sounds.txt file, used when the missile is created and while it is alive.
	HitSound          string `csv:"HitSound"`         // Points to a "Sound" field defined in the sounds.txt file, used when the missile collides with a target.
	ProgSound         string `csv:"ProgSound"`        // Points to a "Sound" field defined in the sounds.txt file, used for a programmed special event based on the client function.
	ProgOverlay       string `csv:"ProgOverlay"`      // Points to the "overlay" field defined in the Overlay.txt file, used for a programmed special event based on the server or client function.
	ExplosionMissile  string `csv:"ExplosionMissile"` // Points to the "Missile" field for another missile, used for the missile created on the client when this missile explodes.
	SubMissile1       string `csv:"SubMissile1"`      // Points to the "Missile" field for another missile, used for creating a new missile based on the server function used.
	SubMissile2       string `csv:"SubMissile2"`
	SubMissile3       string `csv:"SubMissile3"`
	HitSubMissile1    string `csv:"HitSubMissile1"` // Points to the "Missile" field for another missile, used for a new missile after a collision, based on the server function used.
	HitSubMissile2    string `csv:"HitSubMissile2"`
	HitSubMissile3    string `csv:"HitSubMissile3"`
	HitSubMissile4    string `csv:"HitSubMissile4"`
	CltSubMissile1    string `csv:"CltSubMissile1"` // Points to the "Missile" field for another missile, used for creating a new missile based on the client function used.
	CltSubMissile2    string `csv:"CltSubMissile2"`
	CltSubMissile3    string `csv:"CltSubMissile3"`
	CltHitSubMissile1 string `csv:"CltHitSubMissile1"` // Points to the "Missile" field for another missile, used for a new missile after a collision, based on the client function used.
	CltHitSubMissile2 string `csv:"CltHitSubMissile2"`
	CltHitSubMissile3 string `csv:"CltHitSubMissile3"`
}

Missile represents a projectile used throughout the game for attacks, skills, and special effects.

type MonsterEquipment

type MonsterEquipment struct {
	Monster string `csv:"monster"` // Defines the monster that should be equipped. Points to the matching "Id" value in the monstats.txt file.
	OnInit  int    `csv:"oninit"`  // Defines if the monster equipment is added on initialization during the monster's creation.
	Level   int    `csv:"level"`   // Defines the level requirement for the monster to gain this equipment.

	Item1 string `csv:"item1"` // Item to be equipped on the monster. Uses ID pointer from Weapons.txt, Armor.txt, or Misc.txt.
	Loc1  string `csv:"loc1"`  // Specifies the inventory slot where the item will be equipped.
	Mod1  int    `csv:"mod1"`  // Controls the quality level of the related item.

	Item2 string `csv:"item2"` // Second item to be equipped on the monster.
	Loc2  string `csv:"loc2"`  // Specifies the inventory slot for the second item.
	Mod2  int    `csv:"mod2"`  // Quality level for the second item.

	Item3 string `csv:"item3"` // Third item to be equipped on the monster.
	Loc3  string `csv:"loc3"`  // Specifies the inventory slot for the third item.
	Mod3  int    `csv:"mod3"`  // Quality level for the third item.
}

MonsterEquipment represents the equipment setup for a monster.

type MonsterLevelStats

type MonsterLevelStats struct {
	Level int `csv:"Level"` // An integer value to determine how to scale the monster's statistics when at a specific level.

	// Non-Ladder Battle.net / Singleplayer / Open Battle.net / TCP
	Defense       float64 `csv:"AC"`    // Percentage multiplier for increasing the Monster's Defense (multiplies with the "AC" field in monstats.txt).
	DefenseN      float64 `csv:"AC(N)"` // Percentage multiplier for increasing the Monster's Defense in Nightmare difficulty.
	DefenseH      float64 `csv:"AC(H)"` // Percentage multiplier for increasing the Monster's Defense in Hell difficulty.
	AttackRating  float64 `csv:"TH"`    // Percentage multiplier for increasing the Monster's Attack Rating (multiplies with the "A1TH" and "A2TH" fields in monstats.txt).
	AttackRatingN float64 `csv:"TH(N)"` // Percentage multiplier for increasing the Monster's Attack Rating in Nightmare difficulty.
	AttackRatingH float64 `csv:"TH(H)"` // Percentage multiplier for increasing the Monster's Attack Rating in Hell difficulty.
	Life          float64 `csv:"HP"`    // Percentage multiplier for increasing the Monster's Life (multiplies with the "MinHP" and "MaxHP" fields in monstats.txt).
	LifeN         float64 `csv:"HP(N)"` // Percentage multiplier for increasing the Monster's Life in Nightmare difficulty.
	LifeH         float64 `csv:"HP(H)"` // Percentage multiplier for increasing the Monster's Life in Hell difficulty.
	Damage        float64 `csv:"DM"`    // Percentage multiplier for increasing the Monster's Damage (multiplies with various damage fields in monstats.txt).
	DamageN       float64 `csv:"DM(N)"` // Percentage multiplier for increasing the Monster's Damage in Nightmare difficulty.
	DamageH       float64 `csv:"DM(H)"` // Percentage multiplier for increasing the Monster's Damage in Hell difficulty.
	Experience    float64 `csv:"XP"`    // Percentage multiplier for increasing the Experience provided to the player when killing the Monster (multiplies with the "Exp" fields in monstats.txt).
	ExperienceN   float64 `csv:"XP(N)"` // Percentage multiplier for increasing the Experience in Nightmare difficulty.
	ExperienceH   float64 `csv:"XP(H)"` // Percentage multiplier for increasing the Experience in Hell difficulty.

	// Ladder Battle.net game type
	LadderDefense     float64 `csv:"L-AC"`    // Percentage multiplier for increasing the Monster's Defense in Ladder Battle.net (multiplies with the "AC" field in monstats.txt).
	LadderDefenseN    float64 `csv:"L-AC(N)"` // Percentage multiplier for increasing the Monster's Defense in Ladder Battle.net - Nightmare difficulty.
	LadderDefenseH    float64 `csv:"L-AC(H)"` // Percentage multiplier for increasing the Monster's Defense in Ladder Battle.net - Hell difficulty.
	LadderLife        float64 `csv:"L-HP"`    // Percentage multiplier for increasing the Monster's Life in Ladder Battle.net (multiplies with the "MinHP" and "MaxHP" fields in monstats.txt).
	LadderLifeN       float64 `csv:"L-HP(N)"` // Percentage multiplier for increasing the Monster's Life in Ladder Battle.net - Nightmare difficulty.
	LadderLifeH       float64 `csv:"L-HP(H)"` // Percentage multiplier for increasing the Monster's Life in Ladder Battle.net - Hell difficulty.
	LadderDamage      float64 `csv:"L-DM"`    // Percentage multiplier for increasing the Monster's Damage in Ladder Battle.net (multiplies with various damage fields in monstats.txt).
	LadderDamageN     float64 `csv:"L-DM(N)"` // Percentage multiplier for increasing the Monster's Damage in Ladder Battle.net - Nightmare difficulty.
	LadderDamageH     float64 `csv:"L-DM(H)"` // Percentage multiplier for increasing the Monster's Damage in Ladder Battle.net - Hell difficulty.
	LadderExperience  float64 `csv:"L-XP"`    // Percentage multiplier for increasing the Experience provided to the player when killing the Monster in Ladder Battle.net (multiplies with the "Exp" fields in monstats.txt).
	LadderExperienceN float64 `csv:"L-XP(N)"` // Percentage multiplier for increasing the Experience in Ladder Battle.net - Nightmare difficulty.
	LadderExperienceH float64 `csv:"L-XP(H)"` // Percentage multiplier for increasing the Experience in Ladder Battle.net - Hell difficulty.
}

MonsterLevelStats represents how monster statistics increase per level based on the current game type and difficulty.

type MonsterPreset

type MonsterPreset struct {
	Act   int    `csv:"Act"`   // Defines the Act number used for each Monster Preset (values between 1 to 5).
	Place string `csv:"Place"` // Defines the Monster Preset which is used for preloading, such as during level transitions.
}

MonsterPreset represents the monsters preloaded in a preset based on the Act number.

type MonsterProp

type MonsterProp struct {
	ID       string `csv:"Id"`          // Defines the monster that should gain the Property (points to the matching "Id" value in the monstats.txt file).
	Prop1    string `csv:"prop1"`       // Defines the first Property to apply to the monster (Uses the "code" field from Properties.txt).
	Chance1  int    `csv:"chance1"`     // The percent chance that the first related property (prop1) will be assigned. If this value equals 0, then the Property will always be applied.
	Param1   string `csv:"par1"`        // The "parameter" value associated with the first related property (prop1). Usage depends on the property function (See the "func" field on Properties.txt).
	Min1     int    `csv:"min1"`        // The "min" value to assign to the first related property (prop1). Usage depends on the property function (See the "func" field on Properties.txt).
	Max1     int    `csv:"max1"`        // The "max" value to assign to the first related property (prop1). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop2    string `csv:"prop2"`       // Defines the second Property to apply to the monster (Uses the "code" field from Properties.txt).
	Chance2  int    `csv:"chance2"`     // The percent chance that the second related property (prop2) will be assigned. If this value equals 0, then the Property will always be applied.
	Param2   string `csv:"par2"`        // The "parameter" value associated with the second related property (prop2). Usage depends on the property function (See the "func" field on Properties.txt).
	Min2     int    `csv:"min2"`        // The "min" value to assign to the second related property (prop2). Usage depends on the property function (See the "func" field on Properties.txt).
	Max2     int    `csv:"max2"`        // The "max" value to assign to the second related property (prop2). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop3    string `csv:"prop3"`       // Defines the third Property to apply to the monster (Uses the "code" field from Properties.txt).
	Chance3  int    `csv:"chance3"`     // The percent chance that the third related property (prop3) will be assigned. If this value equals 0, then the Property will always be applied.
	Param3   string `csv:"par3"`        // The "parameter" value associated with the third related property (prop3). Usage depends on the property function (See the "func" field on Properties.txt).
	Min3     int    `csv:"min3"`        // The "min" value to assign to the third related property (prop3). Usage depends on the property function (See the "func" field on Properties.txt).
	Max3     int    `csv:"max3"`        // The "max" value to assign to the third related property (prop3). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop4    string `csv:"prop4"`       // Defines the fourth Property to apply to the monster (Uses the "code" field from Properties.txt).
	Chance4  int    `csv:"chance4"`     // The percent chance that the fourth related property (prop4) will be assigned. If this value equals 0, then the Property will always be applied.
	Param4   string `csv:"par4"`        // The "parameter" value associated with the fourth related property (prop4). Usage depends on the property function (See the "func" field on Properties.txt).
	Min4     int    `csv:"min4"`        // The "min" value to assign to the fourth related property (prop4). Usage depends on the property function (See the "func" field on Properties.txt).
	Max4     int    `csv:"max4"`        // The "max" value to assign to the fourth related property (prop4). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop5    string `csv:"prop5"`       // Defines the fifth Property to apply to the monster (Uses the "code" field from Properties.txt).
	Chance5  int    `csv:"chance5"`     // The percent chance that the fifth related property (prop5) will be assigned. If this value equals 0, then the Property will always be applied.
	Param5   string `csv:"par5"`        // The "parameter" value associated with the fifth related property (prop5). Usage depends on the property function (See the "func" field on Properties.txt).
	Min5     int    `csv:"min5"`        // The "min" value to assign to the fifth related property (prop5). Usage depends on the property function (See the "func" field on Properties.txt).
	Max5     int    `csv:"max5"`        // The "max" value to assign to the fifth related property (prop5). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop6    string `csv:"prop6"`       // Defines the sixth Property to apply to the monster (Uses the "code" field from Properties.txt).
	Chance6  int    `csv:"chance6"`     // The percent chance that the sixth related property (prop6) will be assigned. If this value equals 0, then the Property will always be applied.
	Param6   string `csv:"par6"`        // The "parameter" value associated with the sixth related property (prop6). Usage depends on the property function (See the "func" field on Properties.txt).
	Min6     int    `csv:"min6"`        // The "min" value to assign to the sixth related property (prop6). Usage depends on the property function (See the "func" field on Properties.txt).
	Max6     int    `csv:"max6"`        // The "max" value to assign to the sixth related property (prop6). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop1N   string `csv:"prop1 (N)"`   // Defines the first Property for Nightmare difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance1N int    `csv:"chance1 (N)"` // The percent chance that the first related property for Nightmare difficulty (prop1 (N)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param1N  string `csv:"par1 (N)"`    // The "parameter" value associated with the first related property for Nightmare difficulty (prop1 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min1N    int    `csv:"min1 (N)"`    // The "min" value to assign to the first related property for Nightmare difficulty (prop1 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max1N    int    `csv:"max1 (N)"`    // The "max" value to assign to the first related property for Nightmare difficulty (prop1 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop2N   string `csv:"prop2 (N)"`   // Defines the second Property for Nightmare difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance2N int    `csv:"chance2 (N)"` // The percent chance that the second related property for Nightmare difficulty (prop2 (N)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param2N  string `csv:"par2 (N)"`    // The "parameter" value associated with the second related property for Nightmare difficulty (prop2 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min2N    int    `csv:"min2 (N)"`    // The "min" value to assign to the second related property for Nightmare difficulty (prop2 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max2N    int    `csv:"max2 (N)"`    // The "max" value to assign to the second related property for Nightmare difficulty (prop2 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop3N   string `csv:"prop3 (N)"`   // Defines the third Property for Nightmare difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance3N int    `csv:"chance3 (N)"` // The percent chance that the third related property for Nightmare difficulty (prop3 (N)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param3N  string `csv:"par3 (N)"`    // The "parameter" value associated with the third related property for Nightmare difficulty (prop3 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min3N    int    `csv:"min3 (N)"`    // The "min" value to assign to the third related property for Nightmare difficulty (prop3 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max3N    int    `csv:"max3 (N)"`    // The "max" value to assign to the third related property for Nightmare difficulty (prop3 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop4N   string `csv:"prop4 (N)"`   // Defines the fourth Property for Nightmare difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance4N int    `csv:"chance4 (N)"` // The percent chance that the fourth related property for Nightmare difficulty (prop4 (N)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param4N  string `csv:"par4 (N)"`    // The "parameter" value associated with the fourth related property for Nightmare difficulty (prop4 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min4N    int    `csv:"min4 (N)"`    // The "min" value to assign to the fourth related property for Nightmare difficulty (prop4 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max4N    int    `csv:"max4 (N)"`    // The "max" value to assign to the fourth related property for Nightmare difficulty (prop4 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop5N   string `csv:"prop5 (N)"`   // Defines the fifth Property for Nightmare difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance5N int    `csv:"chance5 (N)"` // The percent chance that the fifth related property for Nightmare difficulty (prop5 (N)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param5N  string `csv:"par5 (N)"`    // The "parameter" value associated with the fifth related property for Nightmare difficulty (prop5 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min5N    int    `csv:"min5 (N)"`    // The "min" value to assign to the fifth related property for Nightmare difficulty (prop5 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max5N    int    `csv:"max5 (N)"`    // The "max" value to assign to the fifth related property for Nightmare difficulty (prop5 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop6N   string `csv:"prop6 (N)"`   // Defines the sixth Property for Nightmare difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance6N int    `csv:"chance6 (N)"` // The percent chance that the sixth related property for Nightmare difficulty (prop6 (N)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param6N  string `csv:"par6 (N)"`    // The "parameter" value associated with the sixth related property for Nightmare difficulty (prop6 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min6N    int    `csv:"min6 (N)"`    // The "min" value to assign to the sixth related property for Nightmare difficulty (prop6 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max6N    int    `csv:"max6 (N)"`    // The "max" value to assign to the sixth related property for Nightmare difficulty (prop6 (N)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop1H   string `csv:"prop1 (H)"`   // Defines the first Property for Hell difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance1H int    `csv:"chance1 (H)"` // The percent chance that the first related property for Hell difficulty (prop1 (H)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param1H  string `csv:"par1 (H)"`    // The "parameter" value associated with the first related property for Hell difficulty (prop1 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min1H    int    `csv:"min1 (H)"`    // The "min" value to assign to the first related property for Hell difficulty (prop1 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max1H    int    `csv:"max1 (H)"`    // The "max" value to assign to the first related property for Hell difficulty (prop1 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop2H   string `csv:"prop2 (H)"`   // Defines the second Property for Hell difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance2H int    `csv:"chance2 (H)"` // The percent chance that the second related property for Hell difficulty (prop2 (H)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param2H  string `csv:"par2 (H)"`    // The "parameter" value associated with the second related property for Hell difficulty (prop2 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min2H    int    `csv:"min2 (H)"`    // The "min" value to assign to the second related property for Hell difficulty (prop2 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max2H    int    `csv:"max2 (H)"`    // The "max" value to assign to the second related property for Hell difficulty (prop2 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop3H   string `csv:"prop3 (H)"`   // Defines the third Property for Hell difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance3H int    `csv:"chance3 (H)"` // The percent chance that the third related property for Hell difficulty (prop3 (H)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param3H  string `csv:"par3 (H)"`    // The "parameter" value associated with the third related property for Hell difficulty (prop3 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min3H    int    `csv:"min3 (H)"`    // The "min" value to assign to the third related property for Hell difficulty (prop3 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max3H    int    `csv:"max3 (H)"`    // The "max" value to assign to the third related property for Hell difficulty (prop3 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop4H   string `csv:"prop4 (H)"`   // Defines the fourth Property for Hell difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance4H int    `csv:"chance4 (H)"` // The percent chance that the fourth related property for Hell difficulty (prop4 (H)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param4H  string `csv:"par4 (H)"`    // The "parameter" value associated with the fourth related property for Hell difficulty (prop4 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min4H    int    `csv:"min4 (H)"`    // The "min" value to assign to the fourth related property for Hell difficulty (prop4 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max4H    int    `csv:"max4 (H)"`    // The "max" value to assign to the fourth related property for Hell difficulty (prop4 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop5H   string `csv:"prop5 (H)"`   // Defines the fifth Property for Hell difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance5H int    `csv:"chance5 (H)"` // The percent chance that the fifth related property for Hell difficulty (prop5 (H)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param5H  string `csv:"par5 (H)"`    // The "parameter" value associated with the fifth related property for Hell difficulty (prop5 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min5H    int    `csv:"min5 (H)"`    // The "min" value to assign to the fifth related property for Hell difficulty (prop5 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max5H    int    `csv:"max5 (H)"`    // The "max" value to assign to the fifth related property for Hell difficulty (prop5 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Prop6H   string `csv:"prop6 (H)"`   // Defines the sixth Property for Hell difficulty to apply to the monster (Uses the "code" field from Properties.txt).
	Chance6H int    `csv:"chance6 (H)"` // The percent chance that the sixth related property for Hell difficulty (prop6 (H)) will be assigned. If this value equals 0, then the Property will always be applied.
	Param6H  string `csv:"par6 (H)"`    // The "parameter" value associated with the sixth related property for Hell difficulty (prop6 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Min6H    int    `csv:"min6 (H)"`    // The "min" value to assign to the sixth related property for Hell difficulty (prop6 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
	Max6H    int    `csv:"max6 (H)"`    // The "max" value to assign to the sixth related property for Hell difficulty (prop6 (H)). Usage depends on the property function (See the "func" field on Properties.txt).
}

MonsterProp represents special properties that can be added to a monster based on the game difficulty in an older version of the game.

type MonsterSequence

type MonsterSequence struct {
	Sequence string `csv:"sequence"` // Establishes the Monster Sequence index. An entire monster sequence can be composed of multiple sequence lines, which means that each line needs to have matching "sequence" fields and must be in contiguous order.
	Mode     string `csv:"mode"`     // Defines which monster mode animation to use for the sequence
	Frame    int    `csv:"frame"`    // The in-game frame number for the animation. For the first line in the sequence, this value will establish where the starting frame for the animation. These values should be in contiguous order for the sequence.
	Dir      int    `csv:"dir"`      // Defines the numeric animation direction that the frame uses. Most animations have between 8 to 64 maximum directions.
	Event    int    `csv:"event"`    // Defines what type of event will be used when the frame triggers

}

MonsterSequence represents the sequence table used for specifying events during certain animation frames, such as when using skills. A sequence is divided into multiple lines in this file to define each frame in the animation and to determine which event to use during a specific frame.

type MonsterSounds

type MonsterSounds struct {
	ID                  string `csv:"Id"`            // Defines the unique name ID for the monster sound.
	Attack1             string `csv:"Attack1"`       // Play this sound when the monster performs Attack 1. Points to a "Sound" value in the sounds.txt file.
	Attack2             string `csv:"Attack2"`       // Play this sound when the monster performs Attack 2. Points to a "Sound" value in the sounds.txt file.
	Weapon1             string `csv:"Weapon1"`       // Play this sound when the monster performs Attack 1. Points to a "Sound" value in the sounds.txt file.
	Weapon2             string `csv:"Weapon2"`       // Play this sound when the monster performs Attack 2. Points to a "Sound" value in the sounds.txt file.
	Att1Delay           int    `csv:"Att1Del"`       // Controls the amount of game frames to delay playing the "Attack1" sound.
	Att2Delay           int    `csv:"Att2Del"`       // Controls the amount of game frames to delay playing the "Attack2" sound.
	Wea1Delay           int    `csv:"Wea1Del"`       // Controls the amount of game frames to delay playing the "Weapon1" sound.
	Wea2Delay           int    `csv:"Wea2Del"`       // Controls the amount of game frames to delay playing the "Weapon2" sound.
	Att1Probability     int    `csv:"Att1Prb"`       // Controls the percent chance (out of 100) to play the "Attack1" sound.
	Att2Probability     int    `csv:"Att2Prb"`       // Controls the percent chance (out of 100) to play the "Attack2" sound.
	Wea1Volume          int    `csv:"Wea1Vol"`       // Controls the volume of the "Weapon1" sound. Uses a range between 0 to 255, where 255 is the maximum volume.
	Wea2Volume          int    `csv:"Wea2Vol"`       // Controls the volume of the "Weapon2" sound. Uses a range between 0 to 255, where 255 is the maximum volume.
	HitSound            string `csv:"HitSound"`      // Play this sound when the monster gets hit or knocked back. Points to a "Sound" value in the sounds.txt file.
	DeathSound          string `csv:"DeathSound"`    // Play this sound when the monster dies. Points to a "Sound" value in the sounds.txt file.
	HitDelay            int    `csv:"HitDelay"`      // Controls the amount of game frames to delay playing the "HitSound" sound.
	DeathDelay          int    `csv:"DeaDelay"`      // Controls the amount of game frames to delay playing the "DeathSound" sound.
	Skill1              string `csv:"Skill1"`        // Play this sound when the monster uses Skill 1. Points to a "Sound" value in the sounds.txt file.
	Skill2              string `csv:"Skill2"`        // Play this sound when the monster uses Skill 2. Points to a "Sound" value in the sounds.txt file.
	Skill3              string `csv:"Skill3"`        // Play this sound when the monster uses Skill 3. Points to a "Sound" value in the sounds.txt file.
	Skill4              string `csv:"Skill4"`        // Play this sound when the monster uses Skill 4. Points to a "Sound" value in the sounds.txt file.
	Footstep            string `csv:"Footstep"`      // Play this sound while the monster is walking or running. Points to a "Sound" value in the sounds.txt file.
	FootstepLayer       string `csv:"FootstepLayer"` // Play this sound while the monster is walking or running. Points to a "Sound" value in the sounds.txt file.
	FootstepCount       int    `csv:"FsCnt"`         // Controls the footstep count which is used to determine how often to play the "Footstep" and "FootstepLayer" sound.
	FootstepOffset      int    `csv:"FsOff"`         // Controls the footstep offset which is used for calculating when to play the next "Footstep" and "FootstepLayer" sound, based on the current animation frame and the animation rate.
	FootstepProbability int    `csv:"FsPrb"`         // Controls the probability to play the "Footstep" and "FootstepLayer" sound, with a random chance out of 100.
	NeutralSound        string `csv:"Neutral"`       // Play this sound while the monster is in Neutral, Walk, or Run mode. Points to a "Sound" value in the sounds.txt file.
	NeutralTime         int    `csv:"NeuTime"`       // Controls the amount of game frames to delay between re-playing the "Neutral" sound after it finishes.
	InitSound           string `csv:"Init"`          // Play this sound when the monster spawns and is not dead and is not playing its Neutral sound. Points to a "Sound" value in the sounds.txt file.
	TauntSound          string `csv:"Taunt"`         // Play this sound when the server requests that the monster should play its Taunt. Points to a "Sound" value in the sounds.txt file.
	FleeSound           string `csv:"Flee"`          // Play this sound when the monster is told to flee. Points to a "Sound" value in the sounds.txt file.
	ConvertMode1        string `csv:"CvtMo1"`        // This is used to convert the mode for playing the sound. Defines the original mode that the monster is using.
	ConvertMode2        string `csv:"CvtMo2"`        // This is used to convert the mode for playing the sound. Defines the original mode that the monster is using.
	ConvertMode3        string `csv:"CvtMo3"`        // This is used to convert the mode for playing the sound. Defines the original mode that the monster is using.
	ConvertSkill1       string `csv:"CvtSk1"`        // Defines the skill that the monster is using. If the monster uses a specific skill, then the game can change the monster's mode for sound functionalities to another mode to change how sounds are generally handled. Points to a "Skill" in the skills.txt file.
	ConvertSkill2       string `csv:"CvtSk2"`        // Defines the skill that the monster is using. If the monster uses a specific skill, then the game can change the monster's mode for sound functionalities to another mode to change how sounds are generally handled. Points to a "Skill" in the skills.txt file.
	ConvertSkill3       string `csv:"CvtSk3"`        // Defines the skill that the monster is using. If the monster uses a specific skill, then the game can change the monster's mode for sound functionalities to another mode to change how sounds are generally handled. Points to a "Skill" in the skills.txt file.
	ConvertTarget1      string `csv:"CvtTgt1"`       // Defines the mode to convert the sound to when the monster is using the relative skill from the "ConvertSkill1" field.
	ConvertTarget2      string `csv:"CvtTgt2"`       // Defines the mode to convert the sound to when the monster is using the relative skill from the "ConvertSkill2" field.
	ConvertTarget3      string `csv:"CvtTgt3"`       // Defines the mode to convert the sound to when the monster is using the relative skill from the "ConvertSkill3" field.
}

MonsterSounds represents the data for each monster's sounds

type MonsterStats

type MonsterStats struct {
	Id                      string `csv:"Id"`                                       // Controls the unique name ID to define the monster.
	BaseId                  string `csv:"BaseId"`                                   // Points to the "Id" of another monster to define the monster's base type.
	NextInClass             string `csv:"NextInClass"`                              // Points to the "Id" of another monster to signify the next monster in the group of this monster's type.
	TransLvl                string `csv:"TransLvl"`                                 // Defines the color transform level to use for this monster, affecting its color palette.
	NameStr                 string `csv:"NameStr"`                                  // String Key. Used to define the monster's name, shown in the Life bar UI when targeted.
	MonStatsEx              string `csv:"MonStatsEx"`                               // Controls a pointer to the "Id" of a monster to define which entry to use in the monstats2.txt file.
	MonProp                 string `csv:"MonProp"`                                  // Points to the "Id" field from the MonProp.txt file. Used to add special modifiers to the monster.
	MonType                 string `csv:"MonType"`                                  // Points to the "type" field from the MonType.txt file. Used to handle the monster's classification.
	AI                      string `csv:"AI"`                                       // Points to a type of AI script to use for the monster (See monai.txt).
	DescStr                 string `csv:"DescStr"`                                  // String Key. Used to add an additional description below the Life bar UI when the monster is targeted.
	Code                    string `csv:"Code"`                                     // Controls the token used for choosing the proper cells to display the monster's graphics.
	Enabled                 bool   `csv:"enabled"`                                  // Boolean Field. If true, then this monster is allowed to spawn in the game.
	RangedType              bool   `csv:"rangedtype"`                               // Boolean Field. If true, then the monster will be classified as a ranged type.
	PlaceSpawn              bool   `csv:"placespawn"`                               // Boolean Field. If true, then this monster will be treated as a spawner for other monsters.
	Spawn                   string `csv:"spawn"`                                    // Points to the "Id" of another monster to control what kind of monster is spawned from this monster.
	SpawnX                  string `csv:"spawnx"`                                   // Controls the X offset for where another monster is displaced when being spawned by this monster.
	SpawnY                  string `csv:"spawny"`                                   // Controls the Y offset for where another monster is displaced when being spawned by this monster.
	SpawnMode               string `csv:"spawnmode"`                                // Defines the animation mode that the spawned monsters will be initiated with.
	Minion1                 string `csv:"minion1"`                                  // Points to the "Id" of another monster to control what kind of monster is spawned with this monster.
	Minion2                 string `csv:"minion2"`                                  // Points to the "Id" of another monster to control what kind of monster is spawned with this monster.
	SetBoss                 bool   `csv:"SetBoss"`                                  // Boolean Field. If true, then set the monster AI to use the Boss AI type.
	BossXfer                bool   `csv:"BossXfer"`                                 // Boolean Field. If true, then the monster's AI will transfer its boss recognition to another monster.
	PartyMin                string `csv:"PartyMin"`                                 // The minimum number of minions that can spawn with this monster.
	PartyMax                string `csv:"PartyMax"`                                 // The maximum number of minions that can spawn with this monster.
	MinGrp                  string `csv:"MinGrp"`                                   // The minimum number of duplicates of this monster that can spawn together.
	MaxGrp                  string `csv:"MaxGrp"`                                   // The maximum number of duplicates of this monster that can spawn together.
	SparsePopulate          string `csv:"sparsePopulate"`                           // Controls the percent chance that this monster does not spawn.
	Velocity                string `csv:"Velocity"`                                 // Determines the movement velocity of the monster.
	Run                     string `csv:"Run"`                                      // Determines the run speed of the monster as opposed to walk speed.
	Rarity                  string `csv:"Rarity"`                                   // Modifies the chance that this monster will be chosen to spawn in the area level.
	Level                   string `csv:"Level"`                                    // Determines the monster's level.
	MonSound                string `csv:"MonSound"`                                 // Points to the "Id" field of a monster sound from the monsounds.txt file.
	UMonSound               string `csv:"UMonSound"`                                // Points to the "Id" field of a monster sound from the monsounds.txt file.
	Threat                  string `csv:"threat"`                                   // Controls the AI threat value of the monster, affecting targeting priorities of enemy AIs.
	Aidel                   string `csv:"aidel"`                                    // Controls the delay in frame length for how often the monster's AI will update its commands.
	Aidist                  string `csv:"aidist"`                                   // Controls the maximum distance (measured in tiles) between the monster and an enemy until the monster's AI becomes aggressive. If equals 0, then default to 35.
	AIP1                    string `csv:"aip1"`                                     // Numeric parameter used to control various functions of the monster's AI. Depends on the AI script being used.
	AIP2                    string `csv:"aip2"`                                     // Numeric parameter used to control various functions of the monster's AI. Depends on the AI script being used.
	AIP3                    string `csv:"aip3"`                                     // Numeric parameter used to control various functions of the monster's AI. Depends on the AI script being used.
	AIP4                    string `csv:"aip4"`                                     // Numeric parameter used to control various functions of the monster's AI. Depends on the AI script being used.
	AIP5                    string `csv:"aip5"`                                     // Numeric parameter used to control various functions of the monster's AI. Depends on the AI script being used.
	AIP6                    string `csv:"aip6"`                                     // Numeric parameter used to control various functions of the monster's AI. Depends on the AI script being used.
	AIP7                    string `csv:"aip7"`                                     // Numeric parameter used to control various functions of the monster's AI. Depends on the AI script being used.
	AIP8                    string `csv:"aip8"`                                     // Numeric parameter used to control various functions of the monster's AI. Depends on the AI script being used.
	MissA1                  string `csv:"MissA1"`                                   // Points to the "Missile" field from Missiles.txt to determine which missile to use when the monster is in Attack 1 mode.
	MissA2                  string `csv:"MissA2"`                                   // Points to the "Missile" field from Missiles.txt to determine which missile to use when the monster is in Attack 2 mode.
	MissS1                  string `csv:"MissS1"`                                   // Points to the "Missile" field from Missiles.txt to determine which missile to use when the monster is in Skill 1 mode.
	MissS2                  string `csv:"MissS2"`                                   // Points to the "Missile" field from Missiles.txt to determine which missile to use when the monster is in Skill 2 mode.
	MissS3                  string `csv:"MissS3"`                                   // Points to the "Missile" field from Missiles.txt to determine which missile to use when the monster is in Skill 3 mode.
	MissS4                  string `csv:"MissS4"`                                   // Points to the "Missile" field from Missiles.txt to determine which missile to use when the monster is in Skill 4 mode.
	MissC                   string `csv:"MissC"`                                    // Points to the "Missile" field from Missiles.txt to determine which missile to use when the monster is in Cast mode.
	MissSQ                  string `csv:"MissSQ"`                                   // Points to the "Missile" field from Missiles.txt to determine which missile to use when the monster is in Sequence mode.
	Align                   string `csv:"Align"`                                    // Controls the monster's alignment, determining if it will be an enemy, ally, or neutral to the player.
	IsSpawn                 bool   `csv:"isSpawn"`                                  // Boolean Field. If true, then the monster is allowed to spawn in an area level.
	IsMelee                 bool   `csv:"isMelee"`                                  // Boolean Field. If true, then the monster is classified as a melee only type.
	Npc                     bool   `csv:"npc"`                                      // Boolean Field. If true, then the monster is classified as an NPC (Non-Playable Character).
	Interact                bool   `csv:"interact"`                                 // Boolean Field. If true, then the monster is interactable, allowing the player to click on the monster to perform an interact command.
	Inventory               bool   `csv:"inventory"`                                // Boolean Field. If true, then monster will have an inventory with randomly generated items.
	InTown                  bool   `csv:"inTown"`                                   // Boolean Field. If true, then the monster is allowed to be in town.
	LUndead                 bool   `csv:"lUndead"`                                  // Boolean Field. If true, then the monster is treated as a Low Undead type.
	HUndead                 bool   `csv:"hUndead"`                                  // Boolean Field. If true, then the monster is treated as a High Undead type.
	Demon                   bool   `csv:"demon"`                                    // Boolean Field. If true, then the monster is classified as a Demon type.
	Flying                  bool   `csv:"flying"`                                   // Boolean Field. If true, then the monster is flagged as a flying type.
	OpenDoors               bool   `csv:"opendoors"`                                // Boolean Field. If true, then the monster will use its AI to open doors if necessary.
	Boss                    bool   `csv:"boss"`                                     // Boolean Field. If true, then the monster is classified as a Boss type.
	PrimeEvil               bool   `csv:"primeevil"`                                // Boolean Field. If true, then the monster is classified as a Prime Evil type.
	Killable                bool   `csv:"killable"`                                 // Boolean Field. If true, then the monster can be killed, damaged, and be put in a Death or Dead mode.
	SwitchAI                bool   `csv:"switchai"`                                 // Boolean Field. If true, then monster's AI can be switched, such as by the Assassin's Mind Blast ability.
	NoAura                  bool   `csv:"noAura"`                                   // Boolean Field. If true, then the monster cannot be affected by friendly auras.
	NoMultishot             bool   `csv:"nomultishot"`                              // Boolean Field. If true, then the monster is not allowed to spawn with the Multi-Shot unique monster modifier.
	NeverCount              bool   `csv:"neverCount"`                               // Boolean Field. If true, then the monster is not counted on the list of active monsters in the area.
	PetIgnore               bool   `csv:"petIgnore"`                                // Boolean Field. If true, then pet AI scripts will ignore this monster.
	DeathDmg                bool   `csv:"deathDmg"`                                 // Boolean Field. If true, then the monster will explode on death or use a general death damage function.
	GenericSpawn            bool   `csv:"genericSpawn"`                             // Boolean Field. If true, the monster is flagged as a possible selection for the AI generic spawner function.
	Zoo                     bool   `csv:"zoo"`                                      // Boolean Field. If true, then the monster will be flagged as a zoo type monster.
	CannotDesecrate         bool   `csv:"CannotDesecrate"`                          // Boolean Field. If true, then the monster will not be able to be desecrated when inside a desecrated level.
	RightArmItemType        string `csv:"rightArmItemType"`                         // Determines what type of items the monster is allowed to hold in its right arm.
	LeftArmItemType         string `csv:"leftArmItemType"`                          // Determines what type of items the monster is allowed to hold in its left arm.
	CanNotUseTwoHandedItems bool   `csv:"canNotUseTwoHandedItems"`                  // Boolean Field. If true, then the monster can't use items marked as two-handed.
	SendSkills              byte   `csv:"SendSkills"`                               // Determines which of the monster's skill's level should be sent to the client.
	Skill1                  string `csv:"Skill1"`                                   // Points to a skill from the "skill" field in the skills.txt file. Gives the monster the skill to use (requires "Sk#mode").
	Skill2                  string `csv:"Skill2"`                                   // Points to a skill from the "skill" field in the skills.txt file. Gives the monster the skill to use (requires "Sk#mode").
	Skill3                  string `csv:"Skill3"`                                   // Points to a skill from the "skill" field in the skills.txt file. Gives the monster the skill to use (requires "Sk#mode").
	Skill4                  string `csv:"Skill4"`                                   // Points to a skill from the "skill" field in the skills.txt file. Gives the monster the skill to use (requires "Sk#mode").
	Skill5                  string `csv:"Skill5"`                                   // Points to a skill from the "skill" field in the skills.txt file. Gives the monster the skill to use (requires "Sk#mode").
	Skill6                  string `csv:"Skill6"`                                   // Points to a skill from the "skill" field in the skills.txt file. Gives the monster the skill to use (requires "Sk#mode").
	Skill7                  string `csv:"Skill7"`                                   // Points to a skill from the "skill" field in the skills.txt file. Gives the monster the skill to use (requires "Sk#mode").
	Skill8                  string `csv:"Skill8"`                                   // Points to a skill from the "skill" field in the skills.txt file. Gives the monster the skill to use (requires "Sk#mode").
	Sk1Mode                 string `csv:"Sk1mode"`                                  // Determines the monster's animation mode when using the related skill. Can also point to a "sequence" defined in the monseq.txt file.
	Sk2Mode                 string `csv:"Sk2mode"`                                  // Determines the monster's animation mode when using the related skill. Can also point to a "sequence" defined in the monseq.txt file.
	Sk3Mode                 string `csv:"Sk3mode"`                                  // Determines the monster's animation mode when using the related skill. Can also point to a "sequence" defined in the monseq.txt file.
	Sk4Mode                 string `csv:"Sk4mode"`                                  // Determines the monster's animation mode when using the related skill. Can also point to a "sequence" defined in the monseq.txt file.
	Sk5Mode                 string `csv:"Sk5mode"`                                  // Determines the monster's animation mode when using the related skill. Can also point to a "sequence" defined in the monseq.txt file.
	Sk6Mode                 string `csv:"Sk6mode"`                                  // Determines the monster's animation mode when using the related skill. Can also point to a "sequence" defined in the monseq.txt file.
	Sk7Mode                 string `csv:"Sk7mode"`                                  // Determines the monster's animation mode when using the related skill. Can also point to a "sequence" defined in the monseq.txt file.
	Sk8Mode                 string `csv:"Sk8mode"`                                  // Determines the monster's animation mode when using the related skill. Can also point to a "sequence" defined in the monseq.txt file.
	Sk1Lvl                  string `csv:"Sk1lvl"`                                   // Controls the base skill level of the related skill on the monster.
	Sk2Lvl                  string `csv:"Sk2lvl"`                                   // Controls the base skill level of the related skill on the monster.
	Sk3Lvl                  string `csv:"Sk3lvl"`                                   // Controls the base skill level of the related skill on the monster.
	Sk4Lvl                  string `csv:"Sk4lvl"`                                   // Controls the base skill level of the related skill on the monster.
	Sk5Lvl                  string `csv:"Sk5lvl"`                                   // Controls the base skill level of the related skill on the monster.
	Sk6Lvl                  string `csv:"Sk6lvl"`                                   // Controls the base skill level of the related skill on the monster.
	Sk7Lvl                  string `csv:"Sk7lvl"`                                   // Controls the base skill level of the related skill on the monster.
	Sk8Lvl                  string `csv:"Sk8lvl"`                                   // Controls the base skill level of the related skill on the monster.
	Drain                   string `csv:"Drain"`                                    // Controls the monster's overall Life and Mana steal percentage.
	ColdEffect              string `csv:"coldeffect"`                               // Sets the percentage change in movement speed and attack rate when the monster is chilled by a cold effect.
	ResDm                   string `csv:"ResDm"`                                    // Sets the monster's Physical Damage Resistance stat.
	ResMa                   string `csv:"ResMa"`                                    // Sets the monster's Magic Resistance stat.
	ResFi                   string `csv:"ResFi"`                                    // Sets the monster's Fire Resistance stat.
	ResLi                   string `csv:"ResLi"`                                    // Sets the monster's Lightning Resistance stat.
	ResCo                   string `csv:"ResCo"`                                    // Sets the monster's Cold Resistance stat.
	ResPo                   string `csv:"ResPo"`                                    // Sets the monster's Poison Resistance stat.
	DamageRegen             string `csv:"DamageRegen"`                              // Controls the monster's Life regeneration per frame.
	SkillDamage             string `csv:"SkillDamage"`                              // Points to a skill from the "skill" field in the skills.txt file. Changes the monster's min physical damage, max physical damage, and Attack Rating.
	NoRatio                 bool   `csv:"noRatio"`                                  // Boolean Field. If true, then use this file's fields to determine the monster's baseline stats. If false, use the MonLvl.txt file to determine the monster's baseline stats.
	ShieldBlockOverride     string `csv:"ShieldBlockOverride"`                      // If equals 1, then the monster can block without a shield. If equals 2, then the monster cannot block at all, even with a shield equipped. If equals 0, then ignore this.
	ToBlock                 string `csv:"ToBlock"`                                  // The monster's percent chance to block an attack.
	Crit                    string `csv:"Crit"`                                     // The percent chance for the monster to score a critical hit when attacking an enemy, causing the attack to deal double damage.
	MinHP                   string `csv:"minHP"`                                    // The monster's minimum amount of Life when spawned.
	MaxHP                   string `csv:"maxHP"`                                    // The monster's maximum amount of Life when spawned.
	AC                      string `csv:"AC"`                                       // The monster's Defense value.
	Exp                     string `csv:"Exp"`                                      // The amount of Experience that is rewarded to the player when the monster is killed.
	A1MinD                  string `csv:"A1MinD"`                                   // The minimum damage dealt by the monster when using the Attack 1 (A1) animation mode.
	A1MaxD                  string `csv:"A1MaxD"`                                   // The maximum damage dealt by the monster when using the Attack 1 (A1) animation mode.
	A1TH                    string `csv:"A1TH"`                                     // The monster's Attack Rating when using the Attack 1 (A1) animation mode.
	A2MinD                  string `csv:"A2MinD"`                                   // The minimum damage dealt by the monster when using the Attack 2 (A2) animation mode.
	A2MaxD                  string `csv:"A2MaxD"`                                   // The maximum damage dealt by the monster when using the Attack 2 (A2) animation mode.
	A2TH                    string `csv:"A2TH"`                                     // The monster's Attack Rating when using the Attack 2 (A2) animation mode.
	S1MinD                  string `csv:"S1MinD"`                                   // The minimum damage dealt by the monster when using the Skill 1 (S1) animation mode.
	S1MaxD                  string `csv:"S1MaxD"`                                   // The maximum damage dealt by the monster when using the Skill 1 (S1) animation mode.
	S1TH                    string `csv:"S1TH"`                                     // The monster's Attack Rating when using the Skill 1 (S1) animation mode.
	El1Mode                 string `csv:"El1Mode"`                                  // Determines which animation mode will trigger an additional elemental damage type when used.
	El1Pct                  string `csv:"El1Pct"`                                   // Controls the random percent chance (out of 100) that the monster will append the element damage to the attack. This field is used when El#Mode is not null.
	El1MinD                 string `csv:"El1MinD"`                                  // The minimum element damage applied to the attack. This field is used when El#Mode is not null.
	El1MaxD                 string `csv:"El1MaxD"`                                  // The maximum element damage applied to the attack. This field is used when El#Mode is not null.
	El1Dur                  string `csv:"El1Dur"`                                   // Controls the duration of the related element mode in frame lengths (25 Frames = 1 Second). This is only applicable for the Cold, Poison, Stun, Burning, Freeze elements. This field is used when El#Mode is not null.
	El2Mode                 string `csv:"El2Mode"`                                  // Determines which animation mode will trigger an additional elemental damage type when used.
	El2Pct                  string `csv:"El2Pct"`                                   // Controls the random percent chance (out of 100) that the monster will append the element damage to the attack. This field is used when El#Mode is not null.
	El2MinD                 string `csv:"El2MinD"`                                  // The minimum element damage applied to the attack. This field is used when El#Mode is not null.
	El2MaxD                 string `csv:"El2MaxD"`                                  // The maximum element damage applied to the attack. This field is used when El#Mode is not null.
	El2Dur                  string `csv:"El2Dur"`                                   // Controls the duration of the related element mode in frame lengths (25 Frames = 1 Second). This is only applicable for the Cold, Poison, Stun, Burning, Freeze elements. This field is used when El#Mode is not null.
	El3Mode                 string `csv:"El3Mode"`                                  // Determines which animation mode will trigger an additional elemental damage type when used.
	El3Pct                  string `csv:"El3Pct"`                                   // Controls the random percent chance (out of 100) that the monster will append the element damage to the attack. This field is used when El#Mode is not null.
	El3MinD                 string `csv:"El3MinD"`                                  // The minimum element damage applied to the attack. This field is used when El#Mode is not null.
	El3MaxD                 string `csv:"El3MaxD"`                                  // The maximum element damage applied to the attack. This field is used when El#Mode is not null.
	El3Dur                  string `csv:"El3Dur"`                                   // Controls the duration of the related element mode in frame lengths (25 Frames = 1 Second). This is only applicable for the Cold, Poison, Stun, Burning, Freeze elements. This field is used when El#Mode is not null.
	TreasureClass1          string `csv:"TreasureClass1"`                           // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass2          string `csv:"TreasureClass2"`                           // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass3          string `csv:"TreasureClass3"`                           // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass4          string `csv:"TreasureClass4"`                           // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass1Nightmare string `csv:"TreasureClass1(N)"`                        // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass2Nightmare string `csv:"TreasureClass2(N)"`                        // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass3Nightmare string `csv:"TreasureClass3(N)"`                        // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass4Nightmare string `csv:"TreasureClass4(N)"`                        // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass1Hell      string `csv:"TreasureClass1(H)"`                        // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass2Hell      string `csv:"TreasureClass2(H)"`                        // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass3Hell      string `csv:"TreasureClass3(H)"`                        // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TreasureClass4Hell      string `csv:"TreasureClass4(H)"`                        // Defines which Treasure Class is used by the monster when it is killed. Points to the "Treasure Class" field from the TreasureClassEx.txt file. Used for normal monster types.
	TCQuestId               string `csv:"TCQuestId"`                                // Checks to see if the player has a quest flag progress. If not, then use the "TreasureClass4" field, based on the game's current difficulty.
	RespecFromAkara         bool   `csv:"Respecialization from Akara is Completed"` // Indicates if the respecialization from Akara is completed.
	TCQuestCP               string `csv:"TCQuestCP"`                                // Controls which Quest Checkpoint, or current progress within a quest (based on the "TCQuestId" value), is needed to use the "TreasureClass4" field, based on the game's current difficulty.
}

MonsterStats represents the main functionalities and statistics for a monster in the game.

type MonsterStats2

type MonsterStats2 struct {
	Id                  string `csv:"Id"`              // Controls the unique name ID to define the monster. This must match the same value in the monstats.txt file.
	Height              int    `csv:"Height"`          // Determines the height of the monster.
	Code1               string `csv:"Code1"`           // Code for the first purpose of Height.
	Code1Desc           string `csv:"Description1"`    // Description for the first purpose of Height.
	Code2               string `csv:"Code2"`           // Code for the second purpose of Height.
	Code2Desc           string `csv:"Description2"`    // Description for the second purpose of Height.
	OverlayHeight       int    `csv:"OverlayHeight"`   // Determines the height value of overlays for the monster.
	PixHeight           int    `csv:"pixHeight"`       // Determines the pixel height value for the damage bar when the monster is selected.
	SizeX               int    `csv:"SizeX"`           // Determines the tile grid size of the monster for handling placement when the monster spawns or uses movement skills.
	SizeY               int    `csv:"SizeY"`           // Determines the tile grid size of the monster for handling placement when the monster spawns or uses movement skills.
	SpawnColCode        int    `csv:"spawnCol"`        // Controls the method for spawning the monster based on the collisions in the environment.
	SpawnColDesc        string `csv:"Description3"`    // Description for the SpawnColCode.
	MeleeRng            int    `csv:"MeleeRng"`        // Controls the range of the monster's melee attack.
	BaseWeapon          string `csv:"BaseW"`           // Defines the monster's base weapon class.
	BaseWeaponDesc      string `csv:"Description4"`    // Description for the BaseWeapon.
	HitClass            int    `csv:"HitClass"`        // Defines the specific class of an attack when the monster successfully hits with an attack.
	HitClassDesc        string `csv:"Description5"`    // Description for the HitClass.
	HDv                 string `csv:"HDv"`             // Head visual.
	TRv                 string `csv:"TRv"`             // Torso visual.
	LGv                 string `csv:"LGv"`             // Legs visual.
	RAv                 string `csv:"RAv"`             // Right Arm visual.
	LAv                 string `csv:"LAv"`             // Left Arm visual.
	RHv                 string `csv:"RHv"`             // Right Hand visual.
	LHv                 string `csv:"LHv"`             // Left Hand visual.
	SHv                 string `csv:"SHv"`             // Shield visual.
	S1v                 string `csv:"S1v"`             // Special 1 visual.
	S2v                 string `csv:"S2v"`             // Special 2 visual.
	S3v                 string `csv:"S3v"`             // Special 3 visual.
	S4v                 string `csv:"S4v"`             // Special 4 visual.
	S5v                 string `csv:"S5v"`             // Special 5 visual.
	S6v                 string `csv:"S6v"`             // Special 6 visual.
	S7v                 string `csv:"S7v"`             // Special 7 visual.
	S8v                 string `csv:"S8v"`             // Special 8 visual.
	HD                  bool   `csv:"HD"`              // Head enabled.
	TR                  bool   `csv:"TR"`              // Torso enabled.
	LG                  bool   `csv:"LG"`              // Legs enabled.
	RA                  bool   `csv:"RA"`              // Right Arm enabled.
	LA                  bool   `csv:"LA"`              // Left Arm enabled.
	RH                  bool   `csv:"RH"`              // Right Hand enabled.
	LH                  bool   `csv:"LH"`              // Left Hand enabled.
	SH                  bool   `csv:"SH"`              // Shield enabled.
	S1                  bool   `csv:"S1"`              // Special 1 enabled.
	S2                  bool   `csv:"S2"`              // Special 2 enabled.
	S3                  bool   `csv:"S3"`              // Special 3 enabled.
	S4                  bool   `csv:"S4"`              // Special 4 enabled.
	S5                  bool   `csv:"S5"`              // Special 5 enabled.
	S6                  bool   `csv:"S6"`              // Special 6 enabled.
	S7                  bool   `csv:"S7"`              // Special 7 enabled.
	S8                  bool   `csv:"S8"`              // Special 8 enabled.
	TotalPieces         int    `csv:"TotalPieces"`     // Defines the total amount of component pieces that the monster uses.
	DeathMode           bool   `csv:"mDT"`             // If equals 1, then enable the Death Mode for the monster.
	NeutralMode         bool   `csv:"mNU"`             // If equals 1, then enable the Neutral Mode for the monster.
	WalkMode            bool   `csv:"mWL"`             // If equals 1, then enable the Walk Mode for the monster.
	GetHitMode          bool   `csv:"mGH"`             // If equals 1, then enable the Get Hit Mode for the monster.
	Attack1Mode         bool   `csv:"mA1"`             // If equals 1, then enable the Attack 1 Mode for the monster.
	Attack2Mode         bool   `csv:"mA2"`             // If equals 1, then enable the Attack 2 Mode for the monster.
	BlockMode           bool   `csv:"mBL"`             // If equals 1, then enable the Block Mode for the monster.
	CastMode            bool   `csv:"mSC"`             // If equals 1, then enable the Cast Mode for the monster.
	Skill1Mode          bool   `csv:"mS1"`             // If equals 1, then enable the Skill 1 Mode for the monster.
	Skill2Mode          bool   `csv:"mS2"`             // If equals 1, then enable the Skill 2 Mode for the monster.
	Skill3Mode          bool   `csv:"mS3"`             // If equals 1, then enable the Skill 3 Mode for the monster.
	Skill4Mode          bool   `csv:"mS4"`             // If equals 1, then enable the Skill 4 Mode for the monster.
	DeadMode            bool   `csv:"mDD"`             // If equals 1, then enable the Dead Mode for the monster.
	KnockbackMode       bool   `csv:"mKB"`             // If equals 1, then enable the Knockback Mode for the monster.
	SequenceMode        bool   `csv:"mSQ"`             // If equals 1, then enable the Sequence Mode for the monster.
	RunMode             bool   `csv:"mRN"`             // If equals 1, then enable the Run Mode for the monster.
	DeathDirections     int    `csv:"dDT"`             // Defines the number of directions that the monster can face during Death Mode.
	NeutralDirections   int    `csv:"dNU"`             // Defines the number of directions that the monster can face during Neutral Mode.
	WalkDirections      int    `csv:"dWL"`             // Defines the number of directions that the monster can face during Walk Mode.
	GetHitDirections    int    `csv:"dGH"`             // Defines the number of directions that the monster can face during Get Hit Mode.
	Attack1Directions   int    `csv:"dA1"`             // Defines the number of directions that the monster can face during Attack 1 Mode.
	Attack2Directions   int    `csv:"dA2"`             // Defines the number of directions that the monster can face during Attack 2 Mode.
	BlockDirections     int    `csv:"dBL"`             // Defines the number of directions that the monster can face during Block Mode.
	CastDirections      int    `csv:"dSC"`             // Defines the number of directions that the monster can face during Cast Mode.
	Skill1Directions    int    `csv:"dS1"`             // Defines the number of directions that the monster can face during Skill 1 Mode.
	Skill2Directions    int    `csv:"dS2"`             // Defines the number of directions that the monster can face during Skill 2 Mode.
	Skill3Directions    int    `csv:"dS3"`             // Defines the number of directions that the monster can face during Skill 3 Mode.
	Skill4Directions    int    `csv:"dS4"`             // Defines the number of directions that the monster can face during Skill 4 Mode.
	DeadDirections      int    `csv:"dDD"`             // Defines the number of directions that the monster can face during Dead Mode.
	KnockbackDirections int    `csv:"dKB"`             // Defines the number of directions that the monster can face during Knockback Mode.
	SequenceDirections  int    `csv:"dSQ"`             // Defines the number of directions that the monster can face during Sequence Mode.
	RunDirections       int    `csv:"dRN"`             // Defines the number of directions that the monster can face during Run Mode.
	Attack1Moving       bool   `csv:"A1mv"`            // If equals 1, then enable the Attack 1 Mode while the monster is moving with the Walk mode or Run mode.
	Attack2Moving       bool   `csv:"A2mv"`            // If equals 1, then enable the Attack 2 Mode while the monster is moving with the Walk mode or Run mode.
	CastMoving          bool   `csv:"SCmv"`            // If equals 1, then enable the Cast Mode while the monster is moving with the Walk mode or Run mode.
	Skill1Moving        bool   `csv:"S1mv"`            // If equals 1, then enable the Skill 1 Mode while the monster is moving with the Walk mode or Run mode.
	Skill2Moving        bool   `csv:"S2mv"`            // If equals 1, then enable the Skill 2 Mode while the monster is moving with the Walk mode or Run mode.
	Skill3Moving        bool   `csv:"S3mv"`            // If equals 1, then enable the Skill 3 Mode while the monster is moving with the Walk mode or Run mode.
	Skill4Moving        bool   `csv:"S4mv"`            // If equals 1, then enable the Skill 4 Mode while the monster is moving with the Walk mode or Run mode.
	NoGfxHitTest        bool   `csv:"noGfxHitTest"`    // If equals 1, then enable the mouse selection bounding box functionality around the monster.
	HtTop               int    `csv:"htTop"`           // Define the pixel top offset around the monster for the mouse selection bounding box functionality.
	HtLeft              int    `csv:"htLeft"`          // Define the pixel left offset around the monster for the mouse selection bounding box functionality.
	HtWidth             int    `csv:"htWidth"`         // Define the pixel right offset around the monster for the mouse selection bounding box functionality.
	HtHeight            int    `csv:"htHeight"`        // Define the pixel bottom offset around the monster for the mouse selection bounding box functionality.
	Restore             int    `csv:"restore"`         // Determines if the monster should be placed on the inactive list, to be saved when the level unloads.
	AutomapCel          int    `csv:"automapCel"`      // Controls what index of the Automap tiles to use to display this monster on the Automap.
	NoMap               bool   `csv:"noMap"`           // If equals 1, then the monster will not appear on the Automap.
	NoOvly              bool   `csv:"noOvly"`          // If equals 1, then no looping overlays will be drawn on the monster.
	IsSelectable        bool   `csv:"isSel"`           // If equals 1, then the monster is selectable and can be targeted.
	AlwaysSelectable    bool   `csv:"alSel"`           // If equals 1, then the player can always select the monster, regardless of being an ally or enemy.
	NeverSelectable     bool   `csv:"noSel"`           // If equals 1, then the player can never select the monster.
	ShiftSelectable     bool   `csv:"shiftSel"`        // If equals 1, then the player can target this monster when holding the Shift key and clicking to use a skill.
	CorpseSelectable    bool   `csv:"corpseSel"`       // If equals 1, then the monster's corpse can be with the mouse cursor.
	IsAttackable        bool   `csv:"isAtt"`           // If equals 1, then the monster can be attacked.
	CanRevive           bool   `csv:"revive"`          // If equals 1, then the monster is allowed to be revived by the Necromancer Revive skill.
	LimitCorpses        bool   `csv:"limitCorpses"`    // If equals 1, then the monster's corpse will be placed into a pool with all other corpses with this field checked.
	IsCritter           bool   `csv:"critter"`         // If equals 1, then the monster will be flagged as a critter.
	IsSmallType         bool   `csv:"small"`           // If equals 1, then the monster will be classified as a small type.
	IsLargeType         bool   `csv:"large"`           // If equals 1, then the monster will be classified as a large type.
	IsSoftBodied        bool   `csv:"soft"`            // If equals 1, then the monster's corpse is classified as soft-bodied.
	IsInert             bool   `csv:"inert"`           // If equals 1, then the monster will never attack its enemies.
	HasObjectCollision  bool   `csv:"objCol"`          // If equals 1 and the monster class is "barricadedoor", "barricadedoor2", or "evilhut", then the monster will place an invisible object with collision.
	HasDeadCollision    bool   `csv:"deadCol"`         // If equals 1, then the monster's corpse will have collision with other units.
	IsUnflatDead        bool   `csv:"unflatDead"`      // If equals 1, then ignore the corpse draw order for rendering the sprite on top of others, while the monster is dead.
	HasShadow           bool   `csv:"Shadow"`          // If equals 1, then the monster will project a shadow on the ground.
	NoUniqueShift       bool   `csv:"noUniqueShift"`   // If equals 1 and the monster is a Unique monster, then the monster will not have random color palette transform shifts.
	UseComponentDeath   bool   `csv:"compositeDeath"`  // If equals 1, then the monster's Death Mode and Dead mode will make use of its component system.
	LocalBloodColor     int    `csv:"localBlood"`      // Controls the color of the monster's blood based on the region locale.
	Bleed               int    `csv:"Bleed"`           // Controls if the monster will create blood missiles.
	LightRadiusSize     int    `csv:"Light"`           // Controls the monster's minimum Light Radius size.
	LightColorR         int    `csv:"light-r"`         // Controls the red color value of the monster's Light Radius.
	LightColorG         int    `csv:"light-g"`         // Controls the green color value of the monster's Light Radius.
	LightColorB         int    `csv:"light-b"`         // Controls the blue color value of the monster's Light Radius.
	Utrans              int    `csv:"Utrans"`          // Modifies the color palette transform for the monster in Normal difficulty.
	UtransN             int    `csv:"Utrans(N)"`       // Modifies the color palette transform for the monster in Nightmare difficulty.
	UtransH             int    `csv:"Utrans(H)"`       // Modifies the color palette transform for the monster in Hell difficulty.
	UtransDesc          string `csv:"Description6"`    // Description for the Utrans codes.
	InfernoLength       int    `csv:"InfernoLen"`      // The frame length to hold the channel cast time of the inferno skill.
	InfernoAnim         int    `csv:"InfernoAnim"`     // The exact frame in the channel animation to loop back and start at again.
	InfernoRollback     int    `csv:"InfernoRollback"` // The exact frame in the channel animation to determine when to roll back to the "InfernoAnim" frame.
	ResurrectMode       string `csv:"ResurrectMode"`   // Controls which monster mode to set on the monster when it is resurrected.
	ResurrectModeDesc   string `csv:"Description7"`    // Description for the ResurrectMode codes.
	ResurrectSkill      string `csv:"ResurrectSkill"`  // Controls what skill should the monster use when it is resurrected.
	SpawnUniqueMod      string `csv:"SpawnUniqueMod"`  // Controls what unique modifier the monster should always spawn with.
}

MonsterStats2 represents additional functionalities and statistics for a monster in the game (continuation of MonsterStats1).

type MonsterUniqueAppellation

type MonsterUniqueAppellation struct {
	Name string `csv:"Name"` // A string key, which is used as a potential selection for generating a unique monster’s name
}

MonsterUniqueAppellation represents the data for unique monster name suffixes

type MonsterUniqueModifier

type MonsterUniqueModifier struct {
	UniqueMod string `csv:"uniquemod"` // Reference field to define the monster modifier.
	ID        int    `csv:"id"`        // Unique numeric ID for the monster modifier. Used as a reference in other data files.
	Enabled   int    `csv:"enabled"`   // If 1, this monster modifier will be available for monsters to spawn with. If 0, it will never be used.
	Version   int    `csv:"version"`   // Defines which game version to use this monster modifier (<100 = Classic mode | 100 = Expansion mode).

	Xfer     int `csv:"xfer"`     // If 1, this monster modifier can be transferred from the Boss monster to Minion monsters, including auras. If 0, it will never be transferred.
	Champion int `csv:"champion"` // If 1, this monster modifier will only be used by Champion monsters. If 0, it can be used by any type of special monster.
	FPick    int `csv:"fPick"`    // Controls if this monster modifier is allowed on the monster based on the function code and the parameters it checks.

	Exclude1 string `csv:"exclude1"` // Controls which Monster Types should not have this monster modifier (Uses the "type" field from MonType.txt).
	Exclude2 string `csv:"exclude2"` // Additional exclusion for Monster Types.

	CPick  int `csv:"cpick"`     // Modifies the chances that this monster modifier will be chosen for a Champion monster compared to other monster modifiers.
	CPickN int `csv:"cpick (N)"` // Modifies the chances in Nightmare difficulty.
	CPickH int `csv:"cpick (H)"` // Modifies the chances in Hell difficulty.

	UPick  int `csv:"upick"`     // Modifies the chances that this monster modifier will be chosen for a Unique monster compared to other monster modifiers.
	UPickN int `csv:"upick (N)"` // Modifies the chances in Nightmare difficulty.
	UPickH int `csv:"upick (H)"` // Modifies the chances in Hell difficulty.

	Constants string `csv:"constants"` // Special list of numeric parameters for special monsters.
}

MonsterUniqueModifier represents the monster modifier for special monsters, including Unique and Champion monsters.

type MonsterUniqueName

type MonsterUniqueName = MonsterUniqueAppellation

type NPC

type NPC string

NPC represents the NPCs in each Act that have specific item data.

const (
	NpcCharsi   NPC = "Charsi"
	NpcGheed    NPC = "Gheed"
	NpcAkara    NPC = "Akara"
	NpcFara     NPC = "Fara"
	NpcLysander NPC = "Lysander"
	NpcDrognan  NPC = "Drognan"
	NpcHratli   NPC = "Hratli"
	NpcAlkor    NPC = "Alkor"
	NpcOrmus    NPC = "Ormus"
	NpcElzix    NPC = "Elzix"
	NpcAsheara  NPC = "Asheara"
	NpcCain     NPC = "Cain"
	NpcHalbu    NPC = "Halbu"
	NpcJamella  NPC = "Jamella"
	NpcLarzuk   NPC = "Larzuk"
	NpcMalah    NPC = "Malah"
	NpcAnya     NPC = "Anya"
)

type NPCTrade

type NPCTrade struct {
	NPC            string `csv:"npc"`             // Points to the matching "Id" value in the monstats.txt file. Should not be changed.
	BuyMult        int    `csv:"buy mult"`        // Used to calculate the item's price when bought by the NPC from the player. [cost] * [buy mult] / 1024
	SellMult       int    `csv:"sell mult"`       // Used to calculate the item's price when sold by the NPC to the player. [cost] * [sell mult] / 1024
	RepMult        int    `csv:"rep mult"`        // Used to calculate the cost to repair an item. [cost] * [rep mult] / 1024. Influences repair cost based on item durability and charges.
	QuestFlagA     int    `csv:"questflag A"`     // Relative additional price calculations based on the player's quest flag progress (Quest Progress).
	QuestFlagB     int    `csv:"questflag B"`     // Additional quest flag progress (Quest Progress).
	QuestFlagC     int    `csv:"questflag C"`     // Additional quest flag progress (Quest Progress).
	QuestBuyMultA  int    `csv:"questbuymult A"`  // Same functionality as "buy mult", but relies on "questflag" and applies after "buy mult" calculation.
	QuestBuyMultB  int    `csv:"questbuymult B"`  // Same functionality as "buy mult", but relies on "questflag" and applies after "buy mult" calculation.
	QuestBuyMultC  int    `csv:"questbuymult C"`  // Same functionality as "buy mult", but relies on "questflag" and applies after "buy mult" calculation.
	QuestSellMultA int    `csv:"questsellmult A"` // Same functionality as "sell mult", but relies on "questflag" and applies after "sell mult" calculation.
	QuestSellMultB int    `csv:"questsellmult B"` // Same functionality as "sell mult", but relies on "questflag" and applies after "sell mult" calculation.
	QuestSellMultC int    `csv:"questsellmult C"` // Same functionality as "sell mult", but relies on "questflag" and applies after "sell mult" calculation.
	QuestRepMultA  int    `csv:"questrepmult A"`  // Same functionality as "rep mult", but relies on "questflag" and applies after "rep mult" calculation.
	QuestRepMultB  int    `csv:"questrepmult B"`  // Same functionality as "rep mult", but relies on "questflag" and applies after "rep mult" calculation.
	QuestRepMultC  int    `csv:"questrepmult C"`  // Same functionality as "rep mult", but relies on "questflag" and applies after "rep mult" calculation.
	MaxBuy         int    `csv:"max buy"`         // Sets the maximum price that the NPC will pay when the player sells an item in Normal Difficulty.
	MaxBuyN        int    `csv:"max buy (N)"`     // Sets the maximum price that the NPC will pay when the player sells an item in Nightmare Difficulty.
	MaxBuyH        int    `csv:"max buy (H)"`     // Sets the maximum price that the NPC will pay when the player sells an item in Hell Difficulty.
}

NPCTrade represents the data for how each town NPC manipulates their store prices.

type NightmareUpgrade

type NightmareUpgrade string

NightmareUpgrade represents the item code for upgrading an item in Nightmare difficulty.

const (
	NightmareUpgradeNone NightmareUpgrade = "xxx"
)

type Object

type Object struct {
	// Defines the unique type class of the object which is used to reference this object. These are also defined in the objpreset.txt file.
	Class int `csv:"Class"`

	// String key. Used as the display name of the object when being highlighted by the player.
	Name string `csv:"Name"`

	// Determines what files to use to display the graphics of the object. These are defined by the ObjType.txt file.
	Token string `csv:"Token"`

	// Boolean Field. If equals 1, then the object can be selected by the player and highlighted when hovered on by the mouse cursor.
	// Each field is numbered, correlating to 1 of 8 Object Modes that the object uses (See Overview section, or ObjMode.txt).
	Selectable0 bool `csv:"Selectable0"`
	Selectable1 bool `csv:"Selectable1"`
	Selectable2 bool `csv:"Selectable2"`
	Selectable3 bool `csv:"Selectable3"`
	Selectable4 bool `csv:"Selectable4"`
	Selectable5 bool `csv:"Selectable5"`
	Selectable6 bool `csv:"Selectable6"`
	Selectable7 bool `csv:"Selectable7"`

	// Controls the amount of sub tiles that the object occupies using X and Y coordinates. This is generally used for measuring the object's size when trying to spawn objects in rooms and controlling their distances apart.
	SizeX int `csv:"SizeX"`
	SizeY int `csv:"SizeY"`

	// Controls the frame length of the object's mode. If this equals 0, then that mode will be skipped.
	// Each field is numbered, correlating to 1 of 8 Object Modes that the object uses (See Overview section, or ObjMode.txt).
	FrameCnt0 int `csv:"FrameCnt0"`
	FrameCnt1 int `csv:"FrameCnt1"`
	FrameCnt2 int `csv:"FrameCnt2"`
	FrameCnt3 int `csv:"FrameCnt3"`
	FrameCnt4 int `csv:"FrameCnt4"`
	FrameCnt5 int `csv:"FrameCnt5"`
	FrameCnt6 int `csv:"FrameCnt6"`
	FrameCnt7 int `csv:"FrameCnt7"`

	// Controls the animation frame rate of how many frames to update per delta (Measured in 256ths).
	// Each field is numbered, correlating to 1 of 8 Object Modes that the object uses (See Overview section, or ObjMode.txt).
	FrameDelta0 int `csv:"FrameDelta0"`
	FrameDelta1 int `csv:"FrameDelta1"`
	FrameDelta2 int `csv:"FrameDelta2"`
	FrameDelta3 int `csv:"FrameDelta3"`
	FrameDelta4 int `csv:"FrameDelta4"`
	FrameDelta5 int `csv:"FrameDelta5"`
	FrameDelta6 int `csv:"FrameDelta6"`
	FrameDelta7 int `csv:"FrameDelta7"`

	// Boolean Field. If equals 1, then the object's current animation will loop back to play again when it finishes.
	// Each field is numbered, correlating to 1 of 8 Object Modes that the object uses (See Overview section, or ObjMode.txt).
	CycleAnim0 bool `csv:"CycleAnim0"`
	CycleAnim1 bool `csv:"CycleAnim1"`
	CycleAnim2 bool `csv:"CycleAnim2"`
	CycleAnim3 bool `csv:"CycleAnim3"`
	CycleAnim4 bool `csv:"CycleAnim4"`
	CycleAnim5 bool `csv:"CycleAnim5"`
	CycleAnim6 bool `csv:"CycleAnim6"`
	CycleAnim7 bool `csv:"CycleAnim7"`

	// Controls the Light Radius distance value for the object. If this value equals 0, then the object will not emit a Light Radius.
	// Each field is numbered, correlating to 1 of 8 Object Modes that the object uses (See Overview section, or ObjMode.txt).
	Lit0 int `csv:"Lit0"`
	Lit1 int `csv:"Lit1"`
	Lit2 int `csv:"Lit2"`
	Lit3 int `csv:"Lit3"`
	Lit4 int `csv:"Lit4"`
	Lit5 int `csv:"Lit5"`
	Lit6 int `csv:"Lit6"`
	Lit7 int `csv:"Lit7"`

	// Boolean Field. If equals 1, then the object will draw a shadow. If equals 0, then the object will not draw a shadow.
	// Each field is numbered, correlating to 1 of 8 Object Modes that the object uses (See Overview section, or ObjMode.txt).
	BlocksLight0 int `csv:"BlocksLight0"`
	BlocksLight1 int `csv:"BlocksLight1"`
	BlocksLight2 int `csv:"BlocksLight2"`
	BlocksLight3 int `csv:"BlocksLight3"`
	BlocksLight4 int `csv:"BlocksLight4"`
	BlocksLight5 int `csv:"BlocksLight5"`
	BlocksLight6 int `csv:"BlocksLight6"`
	BlocksLight7 int `csv:"BlocksLight7"`

	// Boolean Field. If equals 1, then the object will have collision. If equals 0, then the object will not have collision, and units can walk through it.
	// Each field is numbered, correlating to 1 of 8 Object Modes that the object uses (See Overview section, or ObjMode.txt).
	HasCollision0 bool `csv:"HasCollision0"`
	HasCollision1 bool `csv:"HasCollision1"`
	HasCollision2 bool `csv:"HasCollision2"`
	HasCollision3 bool `csv:"HasCollision3"`
	HasCollision4 bool `csv:"HasCollision4"`
	HasCollision5 bool `csv:"HasCollision5"`
	HasCollision6 bool `csv:"HasCollision6"`
	HasCollision7 bool `csv:"HasCollision7"`

	// Boolean Field. If equals 1, then the player can target this object to be attacked, and the player will use the Kick skill when operating the object.
	// If the object has the Class equal to "CompellingOrb" or "SoulStoneForge", then instead of using the Kick skill, players will use the Attack skill when operating the object.
	// If equals 0, then ignore this, and the player will not use a skill or animation when operating the object.
	IsAttackable0 bool `csv:"IsAttackable0"`

	// Controls the frame for where the object will start playing the next animation.
	// Each field is numbered, correlating to 1 of 8 Object Modes that the object uses (See Overview section, or ObjMode.txt).
	Start0 int `csv:"Start0"`
	Start1 int `csv:"Start1"`
	Start2 int `csv:"Start2"`
	Start3 int `csv:"Start3"`
	Start4 int `csv:"Start4"`
	Start5 int `csv:"Start5"`
	Start6 int `csv:"Start6"`
	Start7 int `csv:"Start7"`

	// Boolean Field. If equals 1, then enable the object to update its mode based on the game's time of day.
	// If equals 0, then the object will not update its mode based on the time of day.
	EnvEffect bool `csv:"EnvEffect"`

	// Boolean Field. If equals 1, then the object will be treated as a door when the game handles its collision, animation properties, tooltips, and commands.
	// If equals 0, then ignore this.
	IsDoor bool `csv:"IsDoor"`

	// Boolean Field. If equals 1, then the object will block the player's line of sight to see anything beyond the object.
	// If equals 0, then ignore this. This field relies on the "IsDoor" field being enabled.
	BlocksVis bool `csv:"BlocksVis"`

	// Determines the object's orientation type, which can affect mouse selection priority of the object when a unit is being rendered in front of or behind the object (such as a door object covering a unit and how the mouse selection should handle that).
	// This also affects the randomization of the coordinates when spawning the object near the edge of a room.
	Orientation int `csv:"Orientation"`

	// Controls how the object's sprite is drawn, which can affect how it is displayed in Perspective game camera mode.
	// Each field is numbered, correlating to 1 of 8 Object Modes that the object uses (See Overview section, or ObjMode.txt).
	OrderFlag0 int `csv:"OrderFlag0"`
	OrderFlag1 int `csv:"OrderFlag1"`
	OrderFlag2 int `csv:"OrderFlag2"`
	OrderFlag3 int `csv:"OrderFlag3"`
	OrderFlag4 int `csv:"OrderFlag4"`
	OrderFlag5 int `csv:"OrderFlag5"`
	OrderFlag6 int `csv:"OrderFlag6"`
	OrderFlag7 int `csv:"OrderFlag7"`

	// Boolean Field. If equals 1, then enable a random chance that the object will spawn in already in Opened mode.
	// The game will choose a 1/14 chance that this can happen when the object is spawned. If equals 0, then ignore this.
	PreOperate bool `csv:"PreOperate"`

	// Boolean Field. If equals 1, then confirm that this object has the correlating mode.
	// If equals 0, then this object will not have the correlating mode. This flag can affect how the object functions work.
	// Each field is numbered, correlating to 1 of 8 Object Modes that the object uses (See Overview section, or ObjMode.txt).
	Mode0 int `csv:"Mode0"`
	Mode1 int `csv:"Mode1"`
	Mode2 int `csv:"Mode2"`
	Mode3 int `csv:"Mode3"`
	Mode4 int `csv:"Mode4"`
	Mode5 int `csv:"Mode5"`
	Mode6 int `csv:"Mode6"`
	Mode7 int `csv:"Mode7"`

	// Controls the offset values in the X and Y directions for the object's visual graphics. This is measured in game pixels.
	Xoffset int `csv:"Xoffset"`
	Yoffset int `csv:"Yoffset"`

	// Boolean Field. If equals 1, then draw the object's shadows. If equals 0, then do not draw the object's shadows.
	Draw bool `csv:"Draw"`

	// Controls the Red color gradient of the object's Light Radius. This field depends on the "Lit#" field having a value greater than 0.
	Red int `csv:"Red"`

	// Controls the Green color gradient of the object's Light Radius. This field depends on the "Lit#" field having a value greater than 0.
	Green int `csv:"Green"`

	// Controls the Blue color gradient of the object's Light Radius. This field depends on the "Lit#" field having a value greater than 0.
	Blue int `csv:"Blue"`

	// Boolean Field. If equals 1, then the object will be flagged to have a Head composite piece, and the game will use the component system to handle the object's mouse selection collision box.
	// If equals 0, then ignore this.
	HD bool `csv:"HD"`

	// Boolean Field. If equals 1, then the object will be flagged to have a Torso composite piece, and the game will use the component system to handle the object's mouse selection collision box.
	// If equals 0, then ignore this.
	TR bool `csv:"TR"`

	// Boolean Field. If equals 1, then the object will be flagged to have a Legs composite piece, and the game will use the component system to handle the object's mouse selection collision box.
	// If equals 0, then ignore this.
	LG bool `csv:"LG"`

	// Boolean Field. If equals 1, then the object will be flagged to have a Right Arm composite piece, and the game will use the component system to handle the object's mouse selection collision box.
	// If equals 0, then ignore this.
	RA bool `csv:"RA"`

	// Boolean Field. If equals 1, then the object will be flagged to have a Left Arm composite piece, and the game will use the component system to handle the object's mouse selection collision box.
	// If equals 0, then ignore this.
	LA bool `csv:"LA"`

	// Boolean Field. If equals 1, then the object will be flagged to have a Right Hand composite piece, and the game will use the component system to handle the object's mouse selection collision box.
	// If equals 0, then ignore this.
	RH bool `csv:"RH"`

	// Boolean Field. If equals 1, then the object will be flagged to have a Left Hand composite piece, and the game will use the component system to handle the object's mouse selection collision box.
	// If equals 0, then ignore this.
	LH bool `csv:"LH"`

	// Boolean Field. If equals 1, then the object will be flagged to have a Shield composite piece, and the game will use the component system to handle the object's mouse selection collision box.
	// If equals 0, then ignore this.
	SH bool `csv:"SH"`

	// Boolean Field. If equals 1, then the object will be flagged to have a Special # composite piece, and the game will use the component system to handle the object's mouse selection collision box.
	// If equals 0, then ignore this.
	S1 bool `csv:"S1"`
	S2 bool `csv:"S2"`
	S3 bool `csv:"S3"`
	S4 bool `csv:"S4"`
	S5 bool `csv:"S5"`
	S6 bool `csv:"S6"`
	S7 bool `csv:"S7"`
	S8 bool `csv:"S8"`

	// Defines the total amount of composite pieces. If this value is greater than 1, then the game will treat the object with the multiple composite piece system, and the player can hover the mouse over and select the object's different components.
	TotalPieces int `csv:"TotalPieces"`

	// Determines the object's class type by declaring a specific value. This is used by the various functions ("InitFn", "OperateFn", "PopulateFn") for knowing how to handle specific types of objects.
	SubClass int `csv:"SubClass"`

	// Controls the X and Y distance delta values between adjacent objects when they are being populated together.
	// This field is only used by the Populate Function ("PopulateFn") values 3 and 4, for the Add Barrels and Add Crates functions.
	Xspace int `csv:"Xspace"`
	Yspace int `csv:"Yspace"`

	// Controls the vertical offset of the name tooltip's position above the object when the object is being selected. This is measured in pixels.
	NameOffset int `csv:"NameOffset"`

	// Boolean Field. If equals 1, then if a monster operates the object, then the object will run its operate function.
	// If equals 0, then if a monster operates the object, then the object will not run its operate function.
	MonsterOK bool `csv:"MonsterOK"`

	// Controls what shrine function to use (See "Code" field in shrines.txt) when the object is told to do its Skill command.
	ShrineFunction int `csv:"ShrineFunction"`

	// Boolean Field. If equals 1, the game will restore the object in an inactive state when the area level repopulates after a player loads back into it.
	// If equals 0, then the game will not restore the object.
	Restore bool `csv:"Restore"`

	// Used as possible parameters for various functions for the object.
	Parm0 int `csv:"Parm0"`
	Parm1 int `csv:"Parm1"`
	Parm2 int `csv:"Parm2"`
	Parm3 int `csv:"Parm3"`
	Parm4 int `csv:"Parm4"`

	// Boolean Field. If equals 1, then the object will have a random chance to spawn with the locked attribute and have a display tooltip name with the "lockedchest" string key.
	// This only works when the object has the Init Function ("InitFn") value equal to 3. If equals 0, then ignore this.
	Lockable bool `csv:"Lockable"`

	// Controls if an object should call its Populate function ("PopulateFn") when it is chosen as an object that can spawn in a room.
	// Objects with a gore value greater than 2 will not be populated in rooms.
	Gore int `csv:"Gore"`

	// Boolean Field. If equals 1, then the object's animation rate will always match the "FrameDelta#" field (depending on the object's mode) which means the client and server will have synced animations.
	// If equals 0, then the animation rate will have random visual variation.
	Sync bool `csv:"Sync"`

	// Controls the amount of damage dealt by the object when it performs an Operate Function ("OperateFn") that deals damage such as triggering a pulse trap or an explosion.
	Damage int `csv:"Damage"`

	// Boolean Field. If equals 1, then add and remove an overlay on the object based on its current mode. If equals 0, then ignore this.
	// This field will only work with specific object Classes and will use specific Overlays for those objects.
	Overlay bool `csv:"Overlay"`

	// Boolean Field. If equals 1, then the game will handle the bounding box around the object for mouse selection.
	// The game will use the object's pixel size and "Left", "Top", "Width", "Height" field values to determine the collision size.
	// If equals 0, then ignore this.
	CollisionSubst bool `csv:"CollisionSubst"`

	// Controls the starting X position offset value for drawing the bounding collision box around the object for mouse selection.
	// This field depends on the "CollisionSubst" field being enabled.
	Left int `csv:"Left"`

	// Controls the starting Y position offset value for drawing the bounding collision box around the object for mouse selection.
	// This field depends on the "CollisionSubst" field being enabled.
	Top int `csv:"Top"`

	// Controls the ending X position offset value for drawing the bounding collision box around the object for mouse selection.
	// This field depends on the "CollisionSubst" field being enabled.
	Width int `csv:"Width"`

	// Controls the ending Y position offset value for drawing the bounding collision box around the object for mouse selection.
	// This field depends on the "CollisionSubst" field being enabled.
	Height int `csv:"Height"`

	// Defines a function that the game will use when the player clicks on the object.
	OperateFn ObjectOperateFunction `csv:"OperateFn"`

	// Defines a function that the game will use to spawn this object.
	PopulateFn ObjectPopulateFunction `csv:"PopulateFn"`

	// Defines a function to control how the object works while active and when initially activated by a player.
	InitFn ObjectInitFunction `csv:"InitFn"`

	// Defines a function that runs on the object from the game's client side.
	ClientFn ObjectClientFunction `csv:"ClientFn"`

	// Boolean Field. If equals 1, then when the object has been used, the game will not restore the object in an inactive state when the area level repopulates after a player loads back into it.
	// If equals 0, then ignore this.
	RestoreVirgins bool `csv:"RestoreVirgins"`

	// Boolean Field. If equals 1, then missiles can collide with this object. If equals 0, then missiles will ignore and fly through this object.
	BlockMissile bool `csv:"BlockMissile"`

	// Controls the targeting priority of the object.
	// Code	Description
	// 0	The object will not change its targeting priority.
	// 1	The object's target priority will equal a corpse only when the object is opened.
	// 2	The object's target priority always equals a corpse.
	ObjectTargetPriority `csv:"DrawUnder"`

	// Boolean Field. If equals 1, then this object will be classified as an
	// object that can be opened to warp to another area, and the UI will be
	// notified to display a tooltip for opening or entering, based on the
	// object’s mode. If equals 0, then ignore this.
	OpenWarp bool `csv:"OpenWarp"`

	// Used to display a tile in the Automap to represent the object. Defines
	// which cell number to use in the tile list for the Automap. If this value
	// equals 0, then this object will not display on the Automap.
	// (See Automap.txt)
	AutoMap string `csv:"AutoMap"`
}

Object represents the functionalities of all objects found in area levels.

type ObjectClientFunction

type ObjectClientFunction int

ObjectClientFunction represents the various functions an object can have.

const (
	// DoNothing The object does nothing.
	DoNothing ObjectClientFunction = iota

	// AmbientSoundAlwaysTrue Always return true for an ambient sound.
	AmbientSoundAlwaysTrue

	// Ripple Randomly plays between the Operating animation and loops back to the Neutral animation.
	Ripple

	// HellFire Same as function Ripple, but sound will also be processed.
	HellFire

	// Drinker Randomly plays between the Special 0 animation and loops back to the Neutral animation. Also processes sound.
	Drinker

	// Gesturer Randomly plays between the Special 0 / Special 1 animation and loops back to the Neutral animation. Also processes sound.
	Gesturer

	// Turner Randomly plays between the Special 0 animation and loops back to the Neutral animation. Uses different tick counts than function Drinker. Also processes sound.
	Turner

	// Skeleton Randomly plays between the Operating animation and loops back to the Neutral animation.
	Skeleton

	// DurielEntrance If the object is not in Neutral mode, then preload the Duriel monster.
	DurielEntrance

	// ClientSmoke Controls how the object can be removed from the client based on distance to a player and if the object has a specific tick count.
	ClientSmoke

	// Bubbles Randomly plays between the Operating animation and loops back to the Neutral animation. Uses different tick counts than function Skeleton.
	Bubbles

	// Floaters Always return true.
	Floaters

	// Altar If the object is not in Neutral mode, then preload the Ancients statues.
	Altar

	// InvisibleAncient If the object is in its Neutral mode and the player operating the object has not completed the Rite of Passage quest, then handle the control of operating the object.
	InvisibleAncient

	// Bonfire Updates the object’s animation modes based on the time of day.
	Bonfire

	// FrozenAnya If the object is in Neutral mode, then play the “npcalert” overlay.
	FrozenAnya

	// LastExit If the object is in its Operating mode, then modify the animation frames.
	LastExit

	// Zoo Handle the creation of monsters if monsters need to be created.
	Zoo

	// Keeper Randomly plays the “barbarian_grunt_small_1” sound.
	Keeper
)

type ObjectGroup

type ObjectGroup struct {
	// GroupName is a reference field to define the Object Group name.
	GroupName string `csv:"GroupName"`

	// ObjectIDs contains the IDs of Objects assigned to this Object Group.
	ObjectID0 int `csv:"ID0"`
	ObjectID1 int `csv:"ID1"`
	ObjectID2 int `csv:"ID2"`
	ObjectID3 int `csv:"ID3"`
	ObjectID4 int `csv:"ID4"`
	ObjectID5 int `csv:"ID5"`
	ObjectID6 int `csv:"ID6"`
	ObjectID7 int `csv:"ID7"`

	// ObjectDensities controls the number of Objects to spawn in the area level.
	// This is also affected by the Object's populate function defined by the "PopulateFn" field from the objects.txt file.
	// The maximum value allowed is 128.
	ObjectDesnity0 int `csv:"DENSITY0"`
	ObjectDesnity1 int `csv:"DENSITY1"`
	ObjectDesnity2 int `csv:"DENSITY2"`
	ObjectDesnity3 int `csv:"DENSITY3"`
	ObjectDesnity4 int `csv:"DENSITY4"`
	ObjectDesnity5 int `csv:"DENSITY5"`
	ObjectDesnity6 int `csv:"DENSITY6"`
	ObjectDesnity7 int `csv:"DENSITY7"`

	// ObjectProbabilities control the probability that the Object will spawn in the area level.
	// This is calculated in order, so the first probability that is successful will be chosen.
	// These field values should add up to exactly 100 in total to guarantee that one of the objects spawns.
	ObjectProbability0 int `csv:"PROB0"`
	ObjectProbability1 int `csv:"PROB1"`
	ObjectProbability2 int `csv:"PROB2"`
	ObjectProbability3 int `csv:"PROB3"`
	ObjectProbability4 int `csv:"PROB4"`
	ObjectProbability5 int `csv:"PROB5"`
	ObjectProbability6 int `csv:"PROB6"`
	ObjectProbability7 int `csv:"PROB7"`
}

ObjectGroup represents a group of possible Objects to spawn in a part of an area level.

type ObjectInitFunction

type ObjectInitFunction int

ObjectInitFunction represents the various functions an object can have.

const (
	// InitDoNothing The object does nothing.
	InitDoNothing ObjectInitFunction = iota

	// ObjectInitShrine General function for determining which type of Shrine function to pick for the Shrine object.
	// This also uses the “Parm0” field to define the Shrine Type:
	// · If equals 0, default to health shrine
	// · If equals 1, then use Health Shrine
	// · If equals 2, then use Mana Shrine
	// · If equals 3, then pick a random stats shrine with a 10% chance to spawn a surprise shrine
	ObjectInitShrine

	// ObjectInitTrappable Handle a random chance to give the object 1 of the 9 random traps.
	// This random chance depends on the area level’s monster level.
	ObjectInitTrappable

	// ObjectInitChest Run function 1, and also determine if the object should be Locked or not.
	// The random chance to make the object Locked depends on the area level’s monster level.
	ObjectInitChest

	// QuestObjectTowerTomeInit If The Forgotten Tower quest is active, then set the object to run in Special 0 Mode.
	QuestObjectTowerTomeInit

	// QuestObjectStoneInit Sets the object’s mode to be Opened or Neutral, depending on the progress with the Portal to Tristram for the Search for Cain quest.
	QuestObjectStoneInit

	// QuestObjectGibbetInit Sets the object’s mode, depending on the progress with Cain’s Cage for the Search for Cain quest.
	QuestObjectGibbetInit

	// ObjectInitDungeonTorch Sets the object’s mode to Opened.
	ObjectInitDungeonTorch

	// Quest Object Inifuss Init Sets the object’s mode, depending on the progress with the Tree for the Search for Cain quest.
	QuestObjectInifussInit

	// ObjectInitBonfire If the current level is Act 1 Rogue Encampment, then tell the object to do a periodic skill, otherwise set the object mode to Opened.
	ObjectInitBonfire

	// ObjectInitTownPortal Initializes the object’s mode and adds the level ID as an attribute to keep track of.
	ObjectInitTownPortal

	// ObjectInitPermanentPortal Handles specific level transitions for permanent portals found throughout the game.
	ObjectInitPermanentPortal

	// QuestObjectStoneSoundInit Attaches the object to the Search for Cain quest functions.
	QuestObjectStoneSoundInit

	// ObjectInitDungeonTorch2 Sets the object’s mode to Operating.
	ObjectInitDungeonTorch2

	// QuestObjectMalusInit Attaches the object to the Tools of the Trade quest functions.
	QuestObjectMalusInit

	// ObjectInitWell Sets the object’s attributes for a well including the amount of charges.
	// This also uses the “Parm2” field to define the amount of Life healed.
	ObjectInitWell

	// ObjectInitWaypoint Handles setting up the waypoint mechanic to the object for the current area level.
	ObjectInitWaypoint

	// QuestObjectJerhyn1Init Handle where to place Jerhyn (near the palace entrance) based on Arcane Sanctuary quest progress.
	QuestObjectJerhyn1Init

	// QuestObjectJerhyn2Init Handle where to place Jerhyn (inside the palace) based on The Seven Tombs quest progress.
	QuestObjectJerhyn2Init

	// QuestObjectTaintedSunAltarInit Attaches the object to the Tainted Sun quest functions.
	QuestObjectTaintedSunAltarInit

	// QuestObjectSevenTombsReceptacleInit Setup the object to be a receptacle for the Horadric Staff, based on The Seven Tombs quest progress.
	QuestObjectSevenTombsReceptacleInit

	// ObjectInitFire Setup the object to act as fire.
	ObjectInitFire

	// QuestObjectLamEsensTomeInit Attaches the object to the Lam Esen’s Tome quest functions.
	QuestObjectLamEsensTomeInit

	// ObjectInitTrap1 Handle setting up the object frame count and making sure it has full stats.
	ObjectInitTrap1

	// QuestObjectGidbinnInit Attaches the object to the Blade of the Old Religion quest functions.
	QuestObjectGidbinnInit

	// TestObjectInit Sets the object’s mode to Operating.
	TestObjectInit

	// ObjectInitTrappablePoison Sets up the random chance of 333/1000 for the object to have a trap that creates a poison nova.
	ObjectInitTrappablePoison

	// ObjectInitGold Create a random amount of gold piles (between 1 to 10) in random locations around the object.
	ObjectInitGold

	// QuestObjectInitArcanePortal Setup the object to link area levels between the Palace Cellar Level 3 and the Arcane Sanctuary.
	QuestObjectInitArcanePortal

	// QuestObjectHaremBlockerInit Setup the object’s collision based on the Arcane Sanctuary quest progress.
	QuestObjectHaremBlockerInit

	// QuestObjectHoradricCubeChestInit Sets up information about the object.
	QuestObjectHoradricCubeChestInit

	// QuestObjectHoradricScrollChestInit Sets up information about the object.
	QuestObjectHoradricScrollChestInit

	// QuestObjectStaffOfKingsChestInit Sets up information about the object.
	QuestObjectStaffOfKingsChestInit

	// ObjectInitHellTorch Randomly set the object’s mode to Operating.
	ObjectInitHellTorch

	// QuestObjectDurielPassagewayInit Decide between setting the object’s mode to Opened or Neutral, based on the progress of the The Seven Tombs quest.
	QuestObjectDurielPassagewayInit

	// QuestObjectTyraelDoorInit Decide between setting the object’s mode to Opened or Neutral, based on the progress of the The Seven Tombs quest.
	QuestObjectTyraelDoorInit

	// QuestObjectGidbinnTownAltarInit Decide between setting the object’s mode to Opened or Neutral, based on the progress of the The Blade of the Old Religion quest.
	QuestObjectGidbinnTownAltarInit

	// Return null A placeholder value that does nothing.
	ReturnNull

	// QuestObjectBeneathTheCityStairsInit Decide between setting the object’s mode to Opened or Neutral, based on the progress of the Khalim’s Flail quest.
	QuestObjectBeneathTheCityStairsInit

	// QuestObjectBeneathTheCityLeverInit If the Khalim’s Flail quest is complete, then set the object’s mode to Opened.
	QuestObjectBeneathTheCityLeverInit

	// QuestObjectDarkWandererInit Create the “darkwanderer” monster and order to walk to the object’s location.
	// This depends on the players character save from having witnessed this event before.
	QuestObjectDarkWandererInit

	// QuestObjectInitHellGate Decide between setting the object’s mode to Opened or Neutral, based on the progress of the The Guardian quest.
	QuestObjectInitHellGate

	// QuestObjectMephistoBridgeInit Decide between setting the object’s mode to Opened or Neutral, based on the progress of the The Guardian quest.
	// If the object is not Opened, then also tell it to do its unique event.
	QuestObjectMephistoBridgeInit

	// ObjectTrappedSoulInit Determine where to spawn the “trappedsoul1” and “trappedsoul2” monster classes in the area level.
	ObjectTrappedSoulInit

	// QuestObjectForgottenTowerChestInit Decide between setting up the chest object, relying on the Forgotten Tower quest being in progress.
	QuestObjectForgottenTowerChestInit

	// QuestObjectSoulstoneForgeInit Decide between setting the object’s mode to Opened or Neutral, based on the progress of the Hell’s Forge quest.
	QuestObjectSoulstoneForgeInit

	// QuestObjectHratliStartInit Handle placing Hratli near the starting point of Act 3, based on the player’s Act 3 prologue progress.
	QuestObjectHratliStartInit

	// QuestObjectHratliEndInit Handle placing Hratli near his forge, if the player has progressed past the Act 3 prologue.
	QuestObjectHratliEndInit

	// ObjectJackInTheBoxInit If the object is in Opened or Opening mode, then tell the object to do a periodic item skill event.
	ObjectJackInTheBoxInit

	// QuestObjectNatalyaInit Handle placing Natalya at her location based on the player’s progress of The Guardian quest.
	QuestObjectNatalyaInit

	// QuestObjectMephistoDoorInit Handle setting the object to Opened mode based on the player’s progress of destroying the orb for The Blackened Temple quest.
	QuestObjectMephistoDoorInit

	// QuestObjectCainStartInit Handle creating the Cain unit in the Rogue Encampment based on the player’s progress of The Search for Cain quest.
	QuestObjectCainStartInit

	// QuestObjectDiabloStartInit Handle the spawning event of Diablo based on the player’s progress of activating the seal objects in the Chaos Sanctuary.
	QuestObjectDiabloStartInit

	// QuestObjectDiabloSealInit Do nothing.
	QuestObjectDiabloSealInit

	// ObjectInitBetterChest Initialize the chest object and give it the special magical property.
	ObjectInitBetterChest

	// ObjectInitFissure Tell the object to do a periodic skill event at random times.
	ObjectInitFissure

	// ObjectVileDoggieInit If the object is in Neutral mode, then set the object to Operating mode and tell it to do a unique event.
	ObjectVileDoggieInit

	// QuestObjectCompellingOrbInit Set the object to Opened based on the progress of The Blackened Temple quest.
	QuestObjectCompellingOrbInit

	// QuestObjectCainPortalInit Set the object to Operating mode and tell it to do a unique event.
	QuestObjectCainPortalInit

	// QuestCagedWussie1Init Spawn the “act5pow” units based on the player’s progress of the Rescue on Mount Arreat quest.
	QuestCagedWussie1Init

	// QuestMoeInit Setup the Korlic statue object with quest data based on the Right of Passage quest progress.
	QuestMoeInit

	// QuestLarryInit Setup the Madawc statue object with quest data based on the Right of Passage quest progress.
	QuestLarryInit

	// QuestCurlyInit Setup the Talic statue object with quest data based on the Right of Passage quest progress.
	QuestCurlyInit

	// QuestAnyaInsideTownInit Handle for creating the Anya NPC in town, based on the progress of the Prison of Ice quest.
	QuestAnyaInsideTownInit

	// QuestAnyaOutsideTownInit Handle this object during the progress of the Prison of Ice quest and tell it to do its unique event.
	QuestAnyaOutsideTownInit

	// QuestNihlathakInsideTownInit Create the Nihlathak NPC in town, based on the progress of the Prison of Ice quest.
	QuestNihlathakInsideTownInit

	// QuestNihlathakOutsideTownInit Create the “Nihlathak Boss” super unique monster, based on the progress of the Prison of Ice quest.
	QuestNihlathakOutsideTownInit

	// QuestLarzukStartInit Do nothing.
	QuestLarzukStartInit

	// QuestLarzukEndInit Object placeholder to create the “Larzuk” NPC in town.
	QuestLarzukEndInit

	// QuestAncientTomeInit Set the tome object mode to Opened or Neutral based on the progress of The Rite of Passage quest.
	QuestAncientTomeInit

	// QuestAncientGatewayInit Set the door object mode to Opened or Neutral based on the progress of The Rite of Passage quest.
	QuestAncientGatewayInit

	// QuestFrozenAnyaInit Handle this object during the progress of the Prison of Ice quest and tell it to do its unique event.
	QuestFrozenAnyaInit

	// QuestLastExitInit Set the Throne of Destruction exit object mode to Operating or Opened based on the progress of the Eve of Destruction quest.
	QuestLastExitInit

	// QuestSummitDoorInit Set this door object mode to Operating or Opened based on the progress of the Rite of Passage quest.
	QuestSummitDoorInit

	// QuestPlayerLastPortalInit Set the last portal object mode to Operating or Opened based on the progress of the Eve of Destruction quest.
	QuestPlayerLastPortalInit

	// QuestTyraelPortalToExpansionInit Set this object mode to Operating or Opened based on the progress of the Terror’s End quest.
	QuestTyraelPortalToExpansionInit

	// QuestZooInit Attempt a random chance based on successfully selecting a “zoo” type monster from the entire list of possible monsters (See monstats.txt).
	// If selected, then send the quest update command to all players, based on the Eve of Destruction quest.
	QuestZooInit
)

type ObjectMode

type ObjectMode struct {
	Name  string `csv:"Name"`
	Token string `csv:"Token"`
}

type ObjectOperateFunction

type ObjectOperateFunction int

ObjectOperateFunction represents the various functions that the game will use when the player clicks on an object.

const (
	// DoNotOperate Do nothing.
	DoNotOperate ObjectOperateFunction = iota

	// SpawnItemAndMaybeMonster General function to operate an object and spawn items.
	// Also can randomly spawn a monster and/or trigger a trap.
	SpawnItemAndMaybeMonster

	// Shrine General function for Shrine objects. Uses fields from the shrines.txt file for determining specific Shrine functions.
	ShrineOperate

	// SpawnItemSometimes General function to operate the object and spawn random items.
	// Has a 20% chance to spawn a random item. Can also randomly trigger a trap.
	SpawnItemSometimes

	// ChestOperate General function for opening chest objects and spawning random items.
	// Handles key interaction functionality if the chest object is locked.
	ChestOperate

	// BarrelOperate General function for breaking barrel objects and randomly spawning items or possibly a monster.
	BarrelOperate

	// QuestTomeOperate Handles updating The Forgotten Tower quest progress.
	QuestTomeOperate

	// BarrelExplodingOperate Explode the object and also explode adjacent Exploding Barrel object Classes.
	BarrelExplodingOperate

	// DoorOperate General function for opening and closing door objects.
	DoorOperate

	// QuestCairnStoneOperate Handle operating the 5 Cairn Stone objects based on the player’s progress for the Search for Cain quest
	// and if the player has the deciphered Scroll of Inifuss item. Also removes the Scroll of Inifuss item once successfully operated.
	QuestCairnStoneOperate

	// QuestGibbetOperate Handle operating the object and updating the player’s progress for the Search for Cain quest.
	// This is used for the cage object that Deckard Cain is trapped in.
	QuestGibbetOperate

	// BrazierOperate Switch the object from Neutral mode to Operating/Opened mode, or vice versa.
	BrazierOperate

	// QuestInifussOperate Handle dropping the Bark Scroll item, based on the player’s progress for the Search for Cain quest.
	QuestInifussOperate

	// TikiOperate Switch the object from Neutral mode to Operating mode, or vice versa.
	TikiOperate

	// SpawnItem General function to operate an object and have it spawn random items.
	// Can also remove the object’s collision and randomly trigger a trap.
	SpawnItem

	// TownPortalOperate Controls the Town Portal functionalities, including how to teleport players back to town or to the current level,
	// and handling how players interact with other player Town Portals.
	TownPortalOperate

	// TrapDoorOperate Open a door type object and then control its level warp capabilities.
	TrapDoorOperate

	// Obelisk1 Use the transaction UI if the player has a gem in their inventory, and operate the object.
	Obelisk1

	// SecretDoorOperate Handle operating an object and removing its collision.
	SecretDoorOperate

	// ArmorRackOperate Activate the object to spawn a random armor item.
	ArmorRackOperate

	// WeaponRackOperate Activate the object to spawn a random weapon item.
	WeaponRackOperate

	// QuestMalusOperate Handle dropping the Horadric Malus item, based on the player’s progress for the Tools of the Trade quest.
	QuestMalusOperate

	// WellOperate Handle healing the player and keeping track of the charges and regeneration of charges for the well object.
	WellOperate

	// WaypointOperate Handle activating a waypoint object and using the Waypoint UI when clicking on an activated waypoint object.
	WaypointOperate

	// QuestTaintedSunAltarOperate Create the Amulet of the Viper item and other treasure items based on The Horadric Staff quest progress
	// and the number of players in the game. Also update the progress for the Tainted Sun quest.
	QuestTaintedSunAltarOperate

	// QuestSevenTombsReceptacleOperate Handle using the Horadric Staff item with the transaction UI to operate the object.
	QuestSevenTombsReceptacleOperate

	// BookshelfOperate Randomly create either tomes or scrolls of Identify or Town Portal.
	BookshelfOperate

	// TeleportPadOperate Teleport the player to another part of the room.
	TeleportPadOperate

	// QuestLamEsenTomeOperate Handle dropping the Lam Esen’s Tome item, based on the player’s progress for the Lam Esen’s Tome quest.
	QuestLamEsenTomeOperate

	// BreakableOperate Animate the object and remove its collision.
	BreakableOperate

	// Exploding Create an explosion around the object.
	Exploding

	// QuestGidbinnOperate Handle dropping the Decoy Gidbinn item, based on the player’s progress for the Blade of the Old Religion quest.
	QuestGidbinnOperate

	// PlayerBankOperate Control accessing the Stash UI while in town for the Bank object Class.
	PlayerBankOperate

	// WirtSpurt Create the Wirt’s leg item and animate the object.
	WirtSpurt

	// ArcanePortal Control how the warp object transitions the player from the Palace Cellar Level 3 to the Arcane Sanctuary.
	ArcanePortal

	// QuestHoradricCubeChestOperate Create the Horadric Cube item and other treasure items based on The Horadric Staff quest progress
	// and the number of players in the game.
	QuestHoradricCubeChestOperate

	// QuestHoradricScrollChestOperate Create the Horadric Scroll item and other treasure items based on The Horadric Staff quest progress
	// and the number of players in the game.
	QuestHoradricScrollChestOperate

	// QuestStaffOfKingsChestOperate Create the Staff of Kings item and other treasure items based on The Horadric Staff quest progress
	// and the number of players in the game.
	QuestStaffOfKingsChestOperate

	// QuestArcaneTomeOperate Handles updating The Arcane Sanctuary quest progress.
	QuestArcaneTomeOperate

	// OneWayPortalOperate Controls the functionalities of the “DurielPortal” one way warp object.
	OneWayPortalOperate

	// QuestBeneathTheCityStairsOperate Handles warp object operates based on the Khalim’s Flail quest progress.
	QuestBeneathTheCityStairsOperate

	// QuestBeneathTheCityLeverOperate Handles operating an object based on the Khalim’s Flail quest progress.
	QuestBeneathTheCityLeverOperate

	// HellGateOperate Handles how to transition the player to Act 4 based on The Guardian quest progress.
	HellGateOperate

	// StairsOperate Handles how the stairs object opens or warp the player to another level.
	StairsOperate

	// JackInTheBoxOperate Handles the operating the object and having it spawn items and set its mode to Special 2.
	JackInTheBoxOperate

	// QuestSoulstoneForgeOperate Handle operating the object based on The Hellforge quest progress and how it spawns items.
	// Also remove the Hellforge Hammer weapon from the player.
	QuestSoulstoneForgeOperate

	// QuestMephistoDoorOperate Handles how the stairs object opens or warp the player to another level.
	QuestMephistoDoorOperate

	// DelaySpawnOperate Waits until the object is done operating before updating events.
	DelaySpawnOperate

	// QuestDiabloSealOperate Handle operating a Diablo Seal object while also tracking the progress on the other related Diablo Seal objects (5 in total).
	QuestDiabloSealOperate

	// QuestCompellingOrbOperate Handle operating the object based on the Khalim’s Flail quest progress and The Blackened Temple progress.
	// Also remove the Khalim’s Flail weapon from the player.
	QuestCompellingOrbOperate

	// QuestDiabloSeal1Operate Handle operating a Diablo Seal object Class and getting a spawn point for monsters. Also calls function 52.
	QuestDiabloSeal1Operate

	// QuestDiabloSeal3Operate Handle operating a Diablo Seal object Class and getting a spawn point for monsters. Also calls function 52.
	QuestDiabloSeal3Operate

	// QuestDiabloSeal5Operate Handle operating a Diablo Seal object Class and getting a spawn point for monsters. Also calls function 52.
	QuestDiabloSeal5Operate

	// QuestKhalimHeartChestOperate Create the Khalim’s Heart item and other treasure items based on the Khalim’s Flail quest progress and the number of players in the game.
	QuestKhalimHeartChestOperate

	// QuestKhalimEyeChestOperate Create the Khalim’s Eye item and other treasure items based on the Khalim’s Flail quest progress and the number of players in the game.
	QuestKhalimEyeChestOperate

	// QuestKhalimBrainChestOperate Create the Khalim’s Brain item and other treasure items based on the Khalim’s Flail quest progress and the number of players in the game.
	QuestKhalimBrainChestOperate

	// ReturnNull Placeholder to return null.
	ReturnNull2

	// TownGate Handles how the gate object opens and closes.
	TownGate

	// AncientStatue1Operate Handles the modes of one of the Ancient’s statues based on the player’s progress of the Rite of Passage quest.
	AncientStatue1Operate

	// AncientStatue2Operate Same as function 62. Handles the modes of one of the Ancient’s statues based on the player’s progress of the Rite of Passage quest.
	AncientStatue2Operate

	// AncientStatue3Operate Same as function 62. Handles the modes of one of the Ancient’s statues based on the player’s progress of the Rite of Passage quest.
	AncientStatue3Operate

	// QuestAncientAltarOperate Handle displaying quest text and disabling the player’s town portals,
	// based on the player’s progress of the Rite of Passage quest.
	QuestAncientAltarOperate

	// QuestAncientGatewayOperate Handle opening the door object based on the player’s progress of the Rite of Passage quest.
	QuestAncientGatewayOperate

	// QuestFrozenAnyaOperate Handles the object displaying quest text or validating that the player has the Malah’s Potion item
	// and updating the Prison of Ice quest.
	QuestFrozenAnyaOperate

	// EvilUrn Handle triggering a trap from the object.
	EvilUrn

	// QuestAncientInvisibleOperate Handle displaying the A5Q6InitAncients string conversation text based on the player’s progress of the Rite of Passage quest.
	QuestAncientInvisibleOperate

	// QuestLastExitOperate Handle transitioning the player to the from the Throne of Destruction level to the Worldstone Chamber level.
	QuestLastExitOperate

	// QuestSummitDoorOperate Handle opening the door object based on the player’s progress of the Rite of Passage quest.
	QuestSummitDoorOperate

	// QuestPlayerLastPortalOperate Handle transitioning the player to completing the game after completing the Destruction’s End quest.
	QuestPlayerLastPortalOperate

	// QuestTyraelPortalToExpansionOperate Handle transitioning the player to Act 5 after completing the Act 4 Terror’s End quest.
	QuestTyraelPortalToExpansionOperate
)

type ObjectPopulateFunction

type ObjectPopulateFunction int

ObjectPopulateFunction represents the various functions the game will use to spawn objects.

const (
	// DoNotSpawn Do not spawn the object.
	DoNotSpawn ObjectPopulateFunction = iota

	// AddClumpedGroup Handles creating multiple of these objects randomly in a room,
	// based on the object’s size and Class. This function only handles specific object classes
	// such as caskets, urns, and baskets.
	AddClumpedGroup

	// AddSingleShrine Handles the creation of a shrine object.
	AddSingleShrine

	// AddSimpleObjects Handles randomly spawning the object in a room, based on the object’s size.
	AddSimpleObjects

	// AddBarrels Handle creating multiple barrel or exploding barrel Class objects in a room.
	AddBarrels

	// AddCrates Handle creating multiple crate or urn Class objects in a room.
	AddCrates

	// AddCorpse Use function 3 to handle spawning the object.
	// Also call a random chance to spawn the “Flies” object class on top of the objects that spawn.
	AddCorpse

	// AddStakedCorpses Handles how to specifically spawn the “RogueCorpse1” and “RogueCorpse2” objects,
	// based on their sizes and the locations in the room.
	// Also call a random chance to spawn the “Flies” object class on top of the objects that spawn.
	AddStakedCorpses

	// AddWell Handles the creation of one of these objects randomly in a room based on the object’s size.
	// A level can have a maximum of 4 these objects that spawn.
	AddWell

	// AddOne Handles the creation of one of these objects randomly in a room based on the object’s size.
	AddOne
)

type ObjectPreset

type ObjectPreset struct {
	Index       int    `csv:"Index"`       // Assigns a unique numeric ID to the Object Preset so that it can be properly referenced.
	Act         int    `csv:"Act"`         // Defines the Act number used for each Object Preset. Uses values between 1 to 5.
	ObjectClass string `csv:"ObjectClass"` // Uses the "Class" field from objects.txt, which assigns an Object to this Object Preset.
}

ObjectPreset represents an object preset, which controls which objects are preloaded in a preset, based on the Act number.

type ObjectTargetPriority

type ObjectTargetPriority int
const (
	NoChange ObjectTargetPriority = iota
	EqualCorpseWhenOpened
	AlwaysEqualCorpse
)

type ObjectType

type ObjectType struct {
	// Name is the name of the object type.
	Name string `csv:"Name"`

	// Token is the token associated with the object type.
	Token string `csv:"Token"`

	// Beta is a flag indicating whether the object type is related to the beta version.
	Beta int `csv:"Beta"`
}

ObjectType represents the data from the "object types.txt" file.

type OpCode

type OpCode string

OpCode represents the operation code for class restriction

const (
	OpAnyClass        OpCode = ""
	OpAmazonOnly      OpCode = "ama"
	OpBarbarianOnly   OpCode = "bar"
	OpPaladinOnly     OpCode = "pal"
	OpNecromancerOnly OpCode = "nec"
	OpSorceressOnly   OpCode = "sor"
	OpDruidOnly       OpCode = "dru"
	OpAssassinOnly    OpCode = "ass"
)

type OpID

type OpID int

OpID represents the operation ID for additional input requirement

const (
	OpNone OpID = iota
	OpDayOfMonthLessThan
	OpDayOfMonthGreaterThan
	OpDayOfWeekNotEqual
	OpPlayerStatGreaterThan
	OpPlayerStatLessThan
	OpPlayerStatNotEqual
	OpPlayerStatEqual
	OpPlayerBaseStatGreaterThan
	OpPlayerBaseStatLessThan
	OpPlayerBaseStatNotEqual
	OpPlayerBaseStatEqual
	OpPlayerNonBaseStatGreaterThan
	OpPlayerNonBaseStatLessThan
	OpPlayerNonBaseStatNotEqual
	OpPlayerNonBaseStatEqual
	OpInputItemStatGreaterThan
	OpInputItemStatLessThan
	OpInputItemStatNotEqual
	OpInputItemStatEqual
	OpInputItemBaseStatGreaterThan
	OpInputItemBaseStatLessThan
	OpInputItemBaseStatNotEqual
	OpInputItemBaseStatEqual
	OpInputItemNonBaseStatGreaterThan
	OpInputItemNonBaseStatLessThan
	OpInputItemNonBaseStatNotEqual
	OpInputItemNonBaseStatEqual
	OpItemModClassNotEqual
	OpQuestDiffCheck
)

type OutputCode

type OutputCode string

OutputCode represents the output code for creating output items

const (
	OutputCowPortal               OutputCode = "Cow Portal"
	OutputPandemoniumPortal       OutputCode = "Pandemonium Portal"
	OutputPandemoniumFinalePortal OutputCode = "Pandemonium Finale Portal"
	OutputRedPortal               OutputCode = "Red Portal"
	OutputUseType                 OutputCode = "usetype"
	OutputUseItem                 OutputCode = "useitem"
	OutputQuantity                OutputCode = "qty=#"
	OutputPrefix                  OutputCode = "pre=#"
	OutputSuffix                  OutputCode = "suf=#"
	OutputLow                     OutputCode = "low"
	OutputNormal                  OutputCode = "nor"
	OutputHigh                    OutputCode = "hiq"
	OutputMagic                   OutputCode = "mag"
	OutputSet                     OutputCode = "set"
	OutputRare                    OutputCode = "rar"
	OutputUnique                  OutputCode = "uni"
	OutputCrafted                 OutputCode = "crf"
	OutputTempered                OutputCode = "tmp"
	OutputEthereal                OutputCode = "eth"
	OutputSockets                 OutputCode = "sock"
	OutputModifiers               OutputCode = "mod"
	OutputDestroyGemsRunesJewels  OutputCode = "uns"
	OutputRemoveGemsRunesJewels   OutputCode = "rem"
	OutputRegenerateUnique        OutputCode = "reg"
	OutputExceptional             OutputCode = "exc"
	OutputElite                   OutputCode = "eli"
	OutputRepair                  OutputCode = "rep"
	OutputRecharge                OutputCode = "rch"
	OutputLevel                   OutputCode = "lvl=#"
)

type Overlay

type Overlay struct {
	Overlay       string `csv:"overlay"`       // Defines the name of the overlay, used in other data files.
	Filename      string `csv:"Filename"`      // Defines which DCC file to use for the Overlay.
	Version       int    `csv:"version"`       // Defines which game version to use this Overlay (0 = Classic mode | 100 = Expansion mode).
	Character     string `csv:"Character"`     // Used for name categorizing Overlays for unit translation mapping.
	PreDraw       bool   `csv:"PreDraw"`       // Boolean field. If equals 1, then display the Overlay in front of sprites. If equals 0, then display the Overlay behind sprites.
	OneOfN        int    `csv:"1ofN"`          // Controls how to randomly display Overlays. This value will randomly add to the current index of the Overlay to possibly use another Overlay that is indexed after this current Overlay.
	XOffset       int    `csv:"Xoffset"`       // Sets the horizontal offset of the overlay on the unit. Positive values move it toward the left and negative values move it towards the right.
	YOffset       int    `csv:"Yoffset"`       // Sets the vertical offset of the overlay on the unit. Positive values move it down and negative values move it up.
	Height1       int    `csv:"Height1"`       // Additional value added to "Yoffset" depending on "OverlayHeight" field value from monstats2.txt.
	Height2       int    `csv:"Height2"`       // Additional value added to "Yoffset" for player unit types.
	AnimRate      int    `csv:"AnimRate"`      // Controls the animation frame rate of the Overlay. The value is the number of frames that will update per second.
	LoopWaitTime  int    `csv:"LoopWaitTime"`  // Controls the number of periodic frames to wait until redrawing the Overlay. This only works with Overlays that are a loop type.
	Trans         int    `csv:"Trans"`         // Controls the alpha mode for how the Overlay is displayed, which can affect transparency and blending.
	InitRadius    int    `csv:"InitRadius"`    // Controls the starting Light Radius value for the Overlay (Max = 18).
	Radius        int    `csv:"Radius"`        // Controls the maximum Light Radius value for the Overlay. This can only be greater than or equal to "InitRadius".
	Red           int    `csv:"Red"`           // Controls the Red color gradient of the Light Radius.
	Green         int    `csv:"Green"`         // Controls the Green color gradient of the Light Radius.
	Blue          int    `csv:"Blue"`          // Controls the Blue color gradient of the Light Radius.
	NumDirections int    `csv:"NumDirections"` // The number of directions in the cell file.
	LocalBlood    int    `csv:"LocalBlood"`    // Controls how to display green blood or VFX on a unit.
}

Overlay represents overlay graphics related to states, auras, cast animations, curses, and buffs.

type PetType

type PetType struct {
	PetType   string    `csv:"pet type"`                        // Defines the name of the pet type, used in the "pettype" column in skills.txt.
	Group     int       `csv:"group"`                           // Used as an ID field, where if pet types share the same group value, then only 1 pet of that group is allowed to be alive at any time. If equals 0 (or null), then ignore this.
	BaseMax   int       `csv:"basemax"`                         // This sets a baseline maximum number of pets allowed to be alive when skill levels are reset or changed.
	Warp      bool      `csv:"warp"`                            // Boolean field. If equals 1, then the Pet will teleport to the player when the player teleports or warps to another area. If equals 0, then the pet will die instead.
	Range     bool      `csv:"range"`                           // Boolean field. If equals 1, then the Pet will die if the player teleports or warps to another area and is located more than 40 grid tiles in distances from the Pet. If equals 0, then ignore this.
	PartySend bool      `csv:"partysend"`                       // Boolean field. If equals 1, then tell the Pet to do the Party Location Update command (find the location of its Player) when its health changes. If equals 0, then ignore this.
	Unsummon  bool      `csv:"unsummon"`                        // Boolean field. If equals 1, then the Pet can be unsummoned by the Unsummon skill function. If equals 0, then the Pet cannot be unsummoned.
	Automap   bool      `csv:"automap"`                         // Boolean field. If equals 1, then display the Pet on the Automap. If equals 0, then hide the pet on the Automap.
	Name      string    `csv:"name"`                            // String Key. Used to define the Pet's name on its party frame.
	DrawHP    bool      `csv:"drawhp"`                          // Boolean field. If equals 1, then display the Pet's Life bar under the party frame. If equals 0, then hide the Pet's Life bar under the party icon.
	IconType  int       `csv:"icontype"`                        // Controls the functionality for how to display the Pet Icon and the number of Pets counter. (0: Do not display, 1: Display icon, 2: Display icon and counter)
	BaseIcon  string    `csv:"baseicon"`                        // Define which DC6 file to use for the default Pet's icon in its party frame.
	MClass    [4]int    `csv:"mclass1,mclass2,mclass3,mclass4"` // Defines the alternative pets to use for the "pet type" by using their specific unit's "hcIdx" from Monstats.txt.
	MIcon     [4]string `csv:"micon1,micon2,micon3,micon4"`     // Defines which DC6 files to use for the related "mclass" Pets' icons in their party frame.
}

PetType represents the various statistics for each type of pet from all the classes summon Skills.

type Quality

type Quality int

Quality represents the possible item qualities.

const (
	QualityNormal Quality = iota
	QualityExceptional
	QualityElite
	QualitySocketed
	QualityEthereal
	QualityRuneword
)

type QuestClass

type QuestClass int

QuestClass represents the quest class tied to the item.

const (
	QuestClassNotAQuestItem QuestClass = iota
	QuestClassAct1Prologue
	QuestClassDenOfEvil
	QuestClassSistersBurialGrounds
	QuestClassToolsOfTheTrade
	QuestClassTheSearchForCain
)

type QuestFlag

type QuestFlag int
const (
	Act1PrologueSeen QuestFlag = iota
	DenOfEvilComplete
	SistersBurialGroundsComplete
	ToolsOfTheTradeComplete
	TheSearchForCainComplete
	TheForgottenTowerComplete
	SistersToTheSlaughterComplete
	Act1Traversed
	Act2PrologueSeen
	RadamentsLairComplete
	TheHoradricStaffComplete
	TheTaintedSunComplete
	TheArcaneSanctuaryComplete
	TheSummonerComplete
	TheSevenTombsComplete
	Act2Traversed
	Act3PrologueSeen
	LamEsenTomeComplete
	KhalimsWillComplete
	BladeOfTheOldReligionComplete
	TheGoldenBirdComplete
	TheBlackenedTempleComplete
	TheGuardianComplete
	Act3Traversed
	Act4PrologueSeen
	TheFallenAngelComplete
	TerrorsEndComplete
	TheHellforgeComplete
	Act4Traversed
	RogueWarningComplete
	GuardInTownWarningComplete
	GuardInDesertWarningComplete
	DarkWandererSeen
	AngelWarningComplete
	Act5PrologueSeen
	SiegeOnHarrogathComplete
	RescueOnMountArreatComplete
	PrisonOfIceComplete
	BetrayalOfHarrogathComplete
	RiteOfPassageComplete
	EveOfDestructionComplete
	RespecFromAkaraComplete
)

type RarePrefix

type RarePrefix struct {
	Name         string `csv:"name"`    // Uses a string key to define the Rare Prefix name
	Version      int    `csv:"version"` // Defines which game version to use this Set bonus (0 = Classic mode | 100 = Expansion mode)
	IncludeType1 string `csv:"itype1"`  // Controls what item types are allowed for this Rare Prefix to spawn on (Uses the ID field from ItemTypes.txt)
	IncludeType2 string `csv:"itype2"`
	IncludeType3 string `csv:"itype3"`
	IncludeType4 string `csv:"itype4"`
	IncludeType5 string `csv:"itype5"`
	IncludeType6 string `csv:"itype6"`
	IncludeType7 string `csv:"itype7"`
	ExcludeType1 string `csv:"etype1"` // Controls what item types are excluded for this Rare Prefix to spawn on (Uses the ID field from ItemTypes.txt)
	ExcludeType2 string `csv:"etype2"`
	ExcludeType3 string `csv:"etype3"`
	ExcludeType4 string `csv:"etype4"`
}

RarePrefix represents the data for rare item name prefixes

type RareSuffix

type RareSuffix struct {
	Name         string `csv:"name"`    // Uses a string key to define the Rare Suffix name
	Version      int    `csv:"version"` // Defines which game version to use this Set bonus (0 = Classic mode | 100 = Expansion mode)
	IncludeType1 string `csv:"itype1"`  // Controls what item types are allowed for this Rare Suffix to spawn on (Uses the ID field from ItemTypes.txt)
	IncludeType2 string `csv:"itype2"`
	IncludeType3 string `csv:"itype3"`
	IncludeType4 string `csv:"itype4"`
	IncludeType5 string `csv:"itype5"`
	IncludeType6 string `csv:"itype6"`
	IncludeType7 string `csv:"itype7"`
	ExcludeType1 string `csv:"etype1"` // Controls what item types are excluded for this Rare Suffix to spawn on (Uses the ID field from ItemTypes.txt)
	ExcludeType2 string `csv:"etype2"`
	ExcludeType3 string `csv:"etype3"`
	ExcludeType4 string `csv:"etype4"`
}

RareSuffix represents the data for rare item name suffixes

type RuneWordData

type RuneWordData struct {
	Name              string `csv:"Name"`              // Controls the string key used to display the name of the item when the Rune Word is complete
	Complete          int    `csv:"complete"`          // Boolean field. If equals 1, then the Rune Word can be crafted in-game. If equals 0, then the Rune Word cannot be crafted in-game.
	FirstLadderSeason int    `csv:"firstLadderSeason"` // Integer field. The first ladder season the Rune Word can be made on (inclusive). If blank or 0 then it is available in non-ladder.
	LastLadderSeason  int    `csv:"lastLadderSeason"`  // Integer field. The last ladder season the Rune Word is ladder-only (inclusive). Must be used in conjunction with firstLadderSeason.

	// Controls what item types are allowed for this Rune Word (Uses the ID field from ItemTypes.txt)
	ItemType1 string `csv:"itype1"`
	ItemType2 string `csv:"itype2"`
	ItemType3 string `csv:"itype3"`
	ItemType4 string `csv:"itype4"`
	ItemType5 string `csv:"itype5"`
	ItemType6 string `csv:"itype6"`

	// Controls what item types are excluded for this Rune Word (Uses the ID field from ItemTypes.txt)
	ExcludedType1 string `csv:"etype1"`
	ExcludedType2 string `csv:"etype2"`
	ExcludedType3 string `csv:"etype3"`

	// Controls what runes are required to make the Rune Word. The order of each of these fields matters. (Uses the ID field from misc.txt)
	Rune1 string `csv:"Rune1"`
	Rune2 string `csv:"Rune2"`
	Rune3 string `csv:"Rune3"`
	Rune4 string `csv:"Rune4"`
	Rune5 string `csv:"Rune5"`
	Rune6 string `csv:"Rune6"`

	// Controls the item properties that the Rune Word provides (Uses the "code" field from Properties.txt)
	T1Code1 string `csv:"T1Code1"`
	T1Code2 string `csv:"T1Code2"`
	T1Code3 string `csv:"T1Code3"`
	T1Code4 string `csv:"T1Code4"`
	T1Code5 string `csv:"T1Code5"`
	T1Code6 string `csv:"T1Code6"`
	T1Code7 string `csv:"T1Code7"`

	// The stat's "parameter" value associated with the related property (T1Code). Usage depends on the property function (See the "func" field on Properties.txt)
	T1Param1 string `csv:"T1Param1"`
	T1Param2 string `csv:"T1Param2"`
	T1Param3 string `csv:"T1Param3"`
	T1Param4 string `csv:"T1Param4"`
	T1Param5 string `csv:"T1Param5"`
	T1Param6 string `csv:"T1Param6"`
	T1Param7 string `csv:"T1Param7"`

	// The stat's "min" value to assign to the related property (T1Code). Usage depends on the property function (See the "func" field on Properties.txt)
	T1Min1 int `csv:"T1Min1"`
	T1Min2 int `csv:"T1Min2"`
	T1Min3 int `csv:"T1Min3"`
	T1Min4 int `csv:"T1Min4"`
	T1Min5 int `csv:"T1Min5"`
	T1Min6 int `csv:"T1Min6"`
	T1Min7 int `csv:"T1Min7"`

	// The stat's "max" value to assign to the related property (T1Code). Usage depends on the property function (See the "func" field on Properties.txt)
	T1Max1 int `csv:"T1Max1"`
	T1Max2 int `csv:"T1Max2"`
	T1Max3 int `csv:"T1Max3"`
	T1Max4 int `csv:"T1Max4"`
	T1Max5 int `csv:"T1Max5"`
	T1Max6 int `csv:"T1Max6"`
	T1Max7 int `csv:"T1Max7"`
}

RuneWordData represents the data fields for Rune Words and their modifiers.

type SetBonusData

type SetBonusData struct {
	Index   string `csv:"index"`   // Defines the specific Set ID
	Name    string `csv:"name"`    // Uses a string for displaying the Set name in the inventory tooltip
	Version int    `csv:"version"` // Defines which game version to use this Set bonus (0 = Classic mode | 100 = Expansion mode)

	// Controls the each of the different pairs of Partial Set item properties. These are applied when the player has equipped the related # of Set items.
	PCode2a string `csv:"PCode2a"`
	PCode3a string `csv:"PCode3a"`
	PCode4a string `csv:"PCode4a"`
	PCode5a string `csv:"PCode5a"`

	// The stat's "parameter" value associated with the relative property (PCode#a). Usage depends on the property function (See the "func" field on Properties.txt)
	PParam2a string `csv:"PParam2a"`
	PParam3a string `csv:"PParam3a"`
	PParam4a string `csv:"PParam4a"`
	PParam5a string `csv:"PParam5a"`

	// The stat's "min" value associated with the listed relative (PCode#a). Usage depends on the property function (See the "func" field on Properties.txt)
	PMin2a int `csv:"PMin2a"`
	PMin3a int `csv:"PMin3a"`
	PMin4a int `csv:"PMin4a"`
	PMin5a int `csv:"PMin5a"`

	// The stat's "max" value to assign to the listed relative (PCode#a). Usage depends on the property function (See the "func" field on Properties.txt)
	PMax2a int `csv:"PMax2a"`
	PMax3a int `csv:"PMax3a"`
	PMax4a int `csv:"PMax4a"`
	PMax5a int `csv:"PMax5a"`

	// Controls the each of the different pairs of Partial Set item properties. These are applied when the player has equipped the related # of Set items.
	PCode2b string `csv:"PCode2b"`
	PCode3b string `csv:"PCode3b"`
	PCode4b string `csv:"PCode4b"`
	PCode5b string `csv:"PCode5b"`

	// The stat's "parameter" value associated with the relative property (PCode#b). Usage depends on the property function (See the "func" field on Properties.txt)
	PParam2b string `csv:"PParam2b"`
	PParam3b string `csv:"PParam3b"`
	PParam4b string `csv:"PParam4b"`
	PParam5b string `csv:"PParam5b"`

	// The stat's "min" value associated with the listed relative (PCode#b). Usage depends on the property function (See the "func" field on Properties.txt)
	PMin2b int `csv:"PMin2b"`
	PMin3b int `csv:"PMin3b"`
	PMin4b int `csv:"PMin4b"`
	PMin5b int `csv:"PMin5b"`

	// The stat's "max" value to assign to the listed relative (PCode#b). Usage depends on the property function (See the "func" field on Properties.txt)
	PMax2b int `csv:"PMax2b"`
	PMax3b int `csv:"PMax3b"`
	PMax4b int `csv:"PMax4b"`
	PMax5b int `csv:"PMax5b"`

	// Controls the each of the different Full Set item properties. These are applied when the player has all Set item pieces equipped.
	FCode1 string `csv:"FCode1"`
	FCode2 string `csv:"FCode2"`
	FCode3 string `csv:"FCode3"`
	FCode4 string `csv:"FCode4"`
	FCode5 string `csv:"FCode5"`
	FCode6 string `csv:"FCode6"`
	FCode7 string `csv:"FCode7"`
	FCode8 string `csv:"FCode8"`

	// The stat's "parameter" value associated with the relative property (FCode#b). Usage depends on the property function (See the "func" field on Properties.txt)
	FParam1 string `csv:"FParam1"`
	FParam2 string `csv:"FParam2"`
	FParam3 string `csv:"FParam3"`
	FParam4 string `csv:"FParam4"`
	FParam5 string `csv:"FParam5"`
	FParam6 string `csv:"FParam6"`
	FParam7 string `csv:"FParam7"`
	FParam8 string `csv:"FParam8"`

	// The stat's "min" value associated with the listed relative (FCode#b). Usage depends on the property function (See the "func" field on Properties.txt)
	FMin1 int `csv:"FMin1"`
	FMin2 int `csv:"FMin2"`
	FMin3 int `csv:"FMin3"`
	FMin4 int `csv:"FMin4"`
	FMin5 int `csv:"FMin5"`
	FMin6 int `csv:"FMin6"`
	FMin7 int `csv:"FMin7"`
	FMin8 int `csv:"FMin8"`

	// The stat's "max" value to assign to the listed relative (FCode#b). Usage depends on the property function (See the "func" field on Properties.txt)
	FMax1 int `csv:"FMax1"`
	FMax2 int `csv:"FMax2"`
	FMax3 int `csv:"FMax3"`
	FMax4 int `csv:"FMax4"`
	FMax5 int `csv:"FMax5"`
	FMax6 int `csv:"FMax6"`
	FMax7 int `csv:"FMax7"`
	FMax8 int `csv:"FMax8"`
}

SetBonusData represents the data fields for Set bonus statistics when the player has equipped enough Set Items.

type SetItemData

type SetItemData struct {
	Index  string `csv:"index"`  // Links to a string key for displaying the Set item name
	Set    string `csv:"set"`    // Defines the Set to link to this Set Item (must match the "index" field from Sets.txt)
	Item   string `csv:"item"`   // Defines the baseline item code to use for this Set item (must match the "code" field value from weapons.txt, armor.txt, or misc.txt)
	Rarity string `csv:"rarity"` // Modifies the chances that this Unique item will spawn compared to the other Set items. This value acts as a numerator and a denominator. Each "rarity" value gets summed together to give a total denominator, used for the random roll for the item.

	// The item level for the item, which controls what object or monster needs to be in order to drop this item
	Lvl    int `csv:"lvl"`
	LvlReq int `csv:"lvl req"`

	// Controls the color change of the item when equipped on a character or dropped on the ground. If empty, then the item will have the default item color. (Uses Color Codes from the reference file colors.txt)
	ChrTransform string `csv:"chrtransform"`
	InvTransform string `csv:"invtransform"`

	// An override for the "invfile" field from the weapon.txt, armor.txt, or misc.txt files. By default, the Set Item will use what was defined by the baseline item from the "item" field.
	InvFile string `csv:"invfile"`

	// An override for the "flippyfile" field from the weapon.txt, armor.txt, or misc.txt files. By default, the Set Item will use what was defined by the baseline item from the "item" field.
	FlippyFile string `csv:"flippyfile"`

	// An override for the "dropsound" field from the weapon.txt, armor.txt, or misc.txt files. By default, the Set Item will use what was defined by the baseline item from the "item" field.
	DropSound string `csv:"dropsound"`

	// An override for the "dropsfxframe" field from the weapon.txt, armor.txt, or misc.txt files. By default, the Set Item will use what was defined by the baseline item from the "item" field.
	DropSfxFrame string `csv:"dropsfxframe"`

	// An override for the "usesound" field from the weapon.txt, armor.txt, or misc.txt files. By default, the Set Item will use what was defined by the baseline item from the "item" field.
	UseSound string `csv:"usesound"`

	CostMult float64 `csv:"cost mult"` // Multiplicative modifier for the Set item's buy, sell, and repair costs
	CostAdd  int     `csv:"cost add"`  // Flat integer modification to the Set item's buy, sell, and repair costs

	AddFunc int `csv:"add func"` // Controls how the additional Set item properties (aprop#a & aprop#b) will function on the Set item based on other related set items are equipped

	// Controls the item properties that are add baseline to the Set Item (Uses the "code" field from Properties.txt)
	Prop1 string `csv:"prop1"`
	Prop2 string `csv:"prop2"`
	Prop3 string `csv:"prop3"`
	Prop4 string `csv:"prop4"`
	Prop5 string `csv:"prop5"`
	Prop6 string `csv:"prop6"`
	Prop7 string `csv:"prop7"`
	Prop8 string `csv:"prop8"`
	Prop9 string `csv:"prop9"`

	// The stat's "parameter" value associated with the related property (prop#). Usage depends on the property function (See the "func" field on Properties.txt)
	Par1 string `csv:"par1"`
	Par2 string `csv:"par2"`
	Par3 string `csv:"par3"`
	Par4 string `csv:"par4"`
	Par5 string `csv:"par5"`
	Par6 string `csv:"par6"`
	Par7 string `csv:"par7"`
	Par8 string `csv:"par8"`
	Par9 string `csv:"par9"`

	// The stat's "min" value to assign to the related property (prop#). Usage depends on the property function (See the "func" field on Properties.txt)
	Min1 int `csv:"min1"`
	Min2 int `csv:"min2"`
	Min3 int `csv:"min3"`
	Min4 int `csv:"min4"`
	Min5 int `csv:"min5"`
	Min6 int `csv:"min6"`
	Min7 int `csv:"min7"`
	Min8 int `csv:"min8"`
	Min9 int `csv:"min9"`

	// The stat's "max" value to assign to the related property (prop#). Usage depends on the property function (See the "func" field on Properties.txt)
	Max1 int `csv:"max1"`
	Max2 int `csv:"max2"`
	Max3 int `csv:"max3"`
	Max4 int `csv:"max4"`
	Max5 int `csv:"max5"`
	Max6 int `csv:"max6"`
	Max7 int `csv:"max7"`
	Max8 int `csv:"max8"`
	Max9 int `csv:"max9"`

	// Controls the item properties that are added to the Set Item when other pieces of the Set are also equipped (Uses the "code" field from Properties.txt)
	AProp1a string `csv:"aprop1a"`
	AProp2a string `csv:"aprop2a"`
	AProp3a string `csv:"aprop3a"`
	AProp4a string `csv:"aprop4a"`
	AProp5a string `csv:"aprop5a"`

	// The stat's "parameter" value associated with the related property (aprop#a). Usage depends on the property function (See the "func" field on Properties.txt)
	APar1a string `csv:"apar1a"`
	APar2a string `csv:"apar2a"`
	APar3a string `csv:"apar3a"`
	APar4a string `csv:"apar4a"`
	APar5a string `csv:"apar5a"`

	// The stat's "min" value to assign to the related property (aprop#a). Usage depends on the property function (See the "func" field on Properties.txt)
	AMin1a int `csv:"amin1a"`
	AMin2a int `csv:"amin2a"`
	AMin3a int `csv:"amin3a"`
	AMin4a int `csv:"amin4a"`
	AMin5a int `csv:"amin5a"`

	// The stat's "max" value to assign to the related property (aprop#a). Usage depends on the property function (See the "func" field on Properties.txt)
	AMax1a int `csv:"amax1a"`
	AMax2a int `csv:"amax2a"`
	AMax3a int `csv:"amax3a"`
	AMax4a int `csv:"amax4a"`
	AMax5a int `csv:"amax5a"`

	// Controls the item properties that are added to the Set Item when other pieces of the Set are also equipped. Each of these numbered fields are paired with the related "aprop#a" field as an additional item property. (Uses the "code" field from Properties.txt)
	AProp1b string `csv:"aprop1b"`
	AProp2b string `csv:"aprop2b"`
	AProp3b string `csv:"aprop3b"`
	AProp4b string `csv:"aprop4b"`
	AProp5b string `csv:"aprop5b"`

	// The stat's "parameter" value associated with the related property (aprop#b). Usage depends on the property function (See the "func" field on Properties.txt)
	APar1b string `csv:"apar1b"`
	APar2b string `csv:"apar2b"`
	APar3b string `csv:"apar3b"`
	APar4b string `csv:"apar4b"`
	APar5b string `csv:"apar5b"`

	// The stat's "min" value to assign to the related property (aprop#b). Usage depends on the property function (See the "func" field on Properties.txt)
	AMin1b int `csv:"amin1b"`
	AMin2b int `csv:"amin2b"`
	AMin3b int `csv:"amin3b"`
	AMin4b int `csv:"amin4b"`
	AMin5b int `csv:"amin5b"`

	// The stat's "max" value to assign to the related property (aprop#b). Usage depends on the property function (See the "func" field on Properties.txt)
	AMax1b int `csv:"amax1b"`
	AMax2b int `csv:"amax2b"`
	AMax3b int `csv:"amax3b"`
	AMax4b int `csv:"amax4b"`
	AMax5b int `csv:"amax5b"`

	// The amount of weight added to the diablo clone progress when this item is sold. When offline, selling this item will instead immediately spawn diablo clone.
	DiabloCloneWeight int `csv:"diablocloneweight"`
}

SetItemData represents the data fields for each Set item in a Set.

type Shrine

type Shrine struct {
	ShrineType     string `csv:"Shrine Type"`           // The type of shrine
	ShrineName     string `csv:"Shrine name"`           // The name of the shrine
	Effect         string `csv:"Effect"`                // Description of the shrine's effect
	Code           int    `csv:"Code"`                  // Code function used to define the shrine's function
	Arg0           int    `csv:"Arg0"`                  // Parameter 1 for the shrine's function
	Arg1           int    `csv:"Arg1"`                  // Parameter 2 for the shrine's function
	DurationFrames int    `csv:"Duration in frames"`    // Duration of the shrine's effects in frames (1 second = 25 frames)
	ResetTimeMin   int    `csv:"reset time in minutes"` // Time in minutes before the shrine is available to use again
	Rarity         int    `csv:"rarity"`                // Rarity of the shrine
	ViewName       string `csv:"view name"`             // View name of the shrine
	NiftyPhrase    string `csv:"niftyphrase"`           // Activation phrase displayed when the shrine is used
	EffectClass    int    `csv:"effectclass"`           // The shrine's archetype involved in calculating region stats
	LevelMin       int    `csv:"LevelMin"`              // Minimum area level where the shrine can spawn
}

Shrine represents the data structure for the shrines.txt file.

type SkillData

type SkillData struct {
	ID                string `csv:"Id"`                // Unique identifier for the skill.
	CharClass         string `csv:"charclass"`         // Character class associated with the skill.
	SkillName         string `csv:"skill"`             // Description of the skill.
	SkillDesc         string `csv:"skilldesc"`         // Description of the skill.
	SrvStFunc         string `csv:"srvstfunc"`         // Server Start function used by the skill.
	SrvDoFunc         string `csv:"srvdofunc"`         // Server Do function used by the skill.
	PrgStack          string `csv:"prgstack"`          // Progressive stack.
	SrvPrgFunc1       string `csv:"srvprgfunc1"`       // Server Progressive function 1.
	SrvPrgFunc2       string `csv:"srvprgfunc2"`       // Server Progressive function 2.
	SrvPrgFunc3       string `csv:"srvprgfunc3"`       // Server Progressive function 3.
	PrgCalc1          string `csv:"prgcalc1"`          // Progressive calculation 1.
	PrgCalc2          string `csv:"prgcalc2"`          // Progressive calculation 2.
	PrgCalc3          string `csv:"prgcalc3"`          // Progressive calculation 3.
	PrgDam            string `csv:"prgdam"`            // Progressive damage.
	SrvMissile        string `csv:"srvmissile"`        // Server missile.
	DecQuant          string `csv:"decquant"`          // Decrement quantity.
	Lob               string `csv:"lob"`               // Lob skill.
	SrvMissileA       string `csv:"srvmissilea"`       // Server missile A.
	SrvMissileB       string `csv:"srvmissileb"`       // Server missile B.
	SrvMissileC       string `csv:"srvmissilec"`       // Server missile C.
	SrvOverlay        string `csv:"srvoverlay"`        // Server overlay.
	AuraFilter        string `csv:"aurafilter"`        // Aura filter.
	AuraState         string `csv:"aurastate"`         // Aura state.
	AuraTargetState   string `csv:"auratargetstate"`   // Aura target state.
	AuraLenCalc       string `csv:"auralencalc"`       // Aura length calculation.
	AuraRangeCalc     string `csv:"aurarangecalc"`     // Aura range calculation.
	AuraStat1         string `csv:"aurastat1"`         // Aura stat 1.
	AuraStatCalc1     string `csv:"aurastatcalc1"`     // Aura stat calculation 1.
	AuraStat2         string `csv:"aurastat2"`         // Aura stat 2.
	AuraStatCalc2     string `csv:"aurastatcalc2"`     // Aura stat calculation 2.
	AuraStat3         string `csv:"aurastat3"`         // Aura stat 3.
	AuraStatCalc3     string `csv:"aurastatcalc3"`     // Aura stat calculation 3.
	AuraStat4         string `csv:"aurastat4"`         // Aura stat 4.
	AuraStatCalc4     string `csv:"aurastatcalc4"`     // Aura stat calculation 4.
	AuraStat5         string `csv:"aurastat5"`         // Aura stat 5.
	AuraStatCalc5     string `csv:"aurastatcalc5"`     // Aura stat calculation 5.
	AuraStat6         string `csv:"aurastat6"`         // Aura stat 6.
	AuraStatCalc6     string `csv:"aurastatcalc6"`     // Aura stat calculation 6.
	AuraEvent1        string `csv:"auraevent1"`        // Aura event 1.
	AuraEventFunc1    string `csv:"auraeventfunc1"`    // Aura event function 1.
	AuraEvent2        string `csv:"auraevent2"`        // Aura event 2.
	AuraEventFunc2    string `csv:"auraeventfunc2"`    // Aura event function 2.
	AuraEvent3        string `csv:"auraevent3"`        // Aura event 3.
	AuraEventFunc3    string `csv:"auraeventfunc3"`    // Aura event function 3.
	AuraTgtEvent      string `csv:"auratgtevent"`      // Aura target event.
	AuraTgtEventFunc  string `csv:"auratgteventfunc"`  // Aura target event function.
	PassiveState      string `csv:"passivestate"`      // Passive state.
	PassiveIType      string `csv:"passiveitype"`      // Passive item type.
	PassiveStat1      string `csv:"passivestat1"`      // Passive stat 1.
	PassiveCalc1      string `csv:"passivecalc1"`      // Passive calculation 1.
	PassiveStat2      string `csv:"passivestat2"`      // Passive stat 2.
	PassiveCalc2      string `csv:"passivecalc2"`      // Passive calculation 2.
	PassiveStat3      string `csv:"passivestat3"`      // Passive stat 3.
	PassiveCalc3      string `csv:"passivecalc3"`      // Passive calculation 3.
	PassiveStat4      string `csv:"passivestat4"`      // Passive stat 4.
	PassiveCalc4      string `csv:"passivecalc4"`      // Passive calculation 4.
	PassiveStat5      string `csv:"passivestat5"`      // Passive stat 5.
	PassiveCalc5      string `csv:"passivecalc5"`      // Passive calculation 5.
	PassiveEvent      string `csv:"passiveevent"`      // Passive event.
	PassiveEventFunc  string `csv:"passiveeventfunc"`  // Passive event function.
	Summon            string `csv:"summon"`            // Summon.
	PetType           string `csv:"pettype"`           // Pet type.
	PetMax            string `csv:"petmax"`            // Maximum number of pets.
	SumMode           string `csv:"summode"`           // Summoning mode.
	SumSkill1         string `csv:"sumskill1"`         // Summon skill 1.
	SumSk1Calc        string `csv:"sumsk1calc"`        // Summon skill 1 calculation.
	SumSkill2         string `csv:"sumskill2"`         // Summon skill 2.
	SumSk2Calc        string `csv:"sumsk2calc"`        // Summon skill 2 calculation.
	SumSkill3         string `csv:"sumskill3"`         // Summon skill 3.
	SumSk3Calc        string `csv:"sumsk3calc"`        // Summon skill 3 calculation.
	SumSkill4         string `csv:"sumskill4"`         // Summon skill 4.
	SumSk4Calc        string `csv:"sumsk4calc"`        // Summon skill 4 calculation.
	SumSkill5         string `csv:"sumskill5"`         // Summon skill 5.
	SumSk5Calc        string `csv:"sumsk5calc"`        // Summon skill 5 calculation.
	SumUMod           string `csv:"sumumod"`           // Summon unique modifier.
	SumOverlay        string `csv:"sumoverlay"`        // Summon overlay.
	StSuccessOnly     string `csv:"stsuccessonly"`     // Single target success only.
	StSound           string `csv:"stsound"`           // Single target sound.
	StSoundClass      string `csv:"stsoundclass"`      // Single target sound class.
	StSoundDelay      string `csv:"stsounddelay"`      // Single target sound delay.
	WeaponSnd         string `csv:"weaponsnd"`         // Weapon sound.
	DoSound           string `csv:"dosound"`           // Do sound.
	DoSoundA          string `csv:"dosound a"`         // Do sound A.
	DoSoundB          string `csv:"dosound b"`         // Do sound B.
	TgtOverlay        string `csv:"tgtoverlay"`        // Target overlay.
	TgtSound          string `csv:"tgtsound"`          // Target sound.
	PrgOverlay        string `csv:"prgoverlay"`        // Progressive overlay.
	PrgSound          string `csv:"prgsound"`          // Progressive sound.
	CastOverlay       string `csv:"castoverlay"`       // Cast overlay.
	CltOverlayA       string `csv:"cltoverlaya"`       // Client overlay A.
	CltOverlayB       string `csv:"cltoverlayb"`       // Client overlay B.
	CltStFunc         string `csv:"cltstfunc"`         // Client Start function.
	CltDoFunc         string `csv:"cltdofunc"`         // Client Do function.
	CltPrgFunc1       string `csv:"cltprgfunc1"`       // Client Progressive function 1.
	CltPrgFunc2       string `csv:"cltprgfunc2"`       // Client Progressive function 2.
	CltPrgFunc3       string `csv:"cltprgfunc3"`       // Client Progressive function 3.
	CltMissile        string `csv:"cltmissile"`        // Client missile.
	CltMissileA       string `csv:"cltmissilea"`       // Client missile A.
	CltMissileB       string `csv:"cltmissileb"`       // Client missile B.
	CltMissileC       string `csv:"cltmissilec"`       // Client missile C.
	CltMissileD       string `csv:"cltmissiled"`       // Client missile D.
	CltCalc1          string `csv:"cltcalc1"`          // Client calculation 1.
	CltCalc2          string `csv:"cltcalc2"`          // Client calculation 2.
	CltCalc3          string `csv:"cltcalc3"`          // Client calculation 3.
	Warp              string `csv:"warp"`              // Warp skill.
	Immediate         string `csv:"immediate"`         // Immediate skill.
	Enhanceable       string `csv:"enhanceable"`       // Enhanceable skill.
	AttackRank        string `csv:"attackrank"`        // Attack rank.
	NoAmmo            string `csv:"noammo"`            // No ammo skill.
	Range             string `csv:"range"`             // Skill range.
	WeapSel           string `csv:"weapsel"`           // Weapon selection.
	ITypeA1           string `csv:"itypea1"`           // Item type A1.
	ITypeA2           string `csv:"itypea2"`           // Item type A2.
	ITypeA3           string `csv:"itypea3"`           // Item type A3.
	ETypeA1           string `csv:"etypea1"`           // Elemental type A1.
	ETypeA2           string `csv:"etypea2"`           // Elemental type A2.
	ITypeB1           string `csv:"itypeb1"`           // Item type B1.
	ITypeB2           string `csv:"itypeb2"`           // Item type B2.
	ITypeB3           string `csv:"itypeb3"`           // Item type B3.
	ETypeB1           string `csv:"etypeb1"`           // Elemental type B1.
	ETypeB2           string `csv:"etypeb2"`           // Elemental type B2.
	Anim              string `csv:"anim"`              // Animation.
	SeqTrans          string `csv:"seqtrans"`          // Sequence transition.
	MonAnim           string `csv:"monanim"`           // Monster animation.
	SeqNum            string `csv:"seqnum"`            // Sequence number.
	SeqInput          string `csv:"seqinput"`          // Sequence input.
	Durability        string `csv:"durability"`        // Durability.
	UseAttackRate     string `csv:"UseAttackRate"`     // Use attack rate.
	LineOfSight       string `csv:"LineOfSight"`       // Line of sight.
	TargetableOnly    string `csv:"TargetableOnly"`    // Targetable only.
	SearchEnemyXY     string `csv:"SearchEnemyXY"`     // Search enemy XY.
	SearchEnemyNear   string `csv:"SearchEnemyNear"`   // Search enemy near.
	SearchOpenXY      string `csv:"SearchOpenXY"`      // Search open XY.
	SelectProc        string `csv:"SelectProc"`        // Select proc.
	TargetCorpse      string `csv:"TargetCorpse"`      // Target corpse.
	TargetPet         string `csv:"TargetPet"`         // Target pet.
	TargetAlly        string `csv:"TargetAlly"`        // Target ally.
	TargetItem        string `csv:"TargetItem"`        // Target item.
	AttackNoMana      string `csv:"AttackNoMana"`      // Attack no mana.
	TgtPlaceCheck     string `csv:"TgtPlaceCheck"`     // Target place check.
	ItemEffect        string `csv:"ItemEffect"`        // Item effect.
	ItemCltEffect     string `csv:"ItemCltEffect"`     // Item client effect.
	ItemTgtDo         string `csv:"ItemTgtDo"`         // Item target do.
	ItemTarget        string `csv:"ItemTarget"`        // Item target.
	ItemCheckStart    string `csv:"ItemCheckStart"`    // Item check start.
	ItemCltCheckStart string `csv:"ItemCltCheckStart"` // Item client check start.
	ItemCastSound     string `csv:"ItemCastSound"`     // Item cast sound.
	ItemCastOverlay   string `csv:"ItemCastOverlay"`   // Item cast overlay.
	SkPoints          string `csv:"skpoints"`          // Skill points.
	ReqLevel          string `csv:"reqlevel"`          // Required level.
	MaxLevel          string `csv:"maxlvl"`            // Maximum level.
	ReqStr            string `csv:"reqstr"`            // Required strength.
	ReqDex            string `csv:"reqdex"`            // Required dexterity.
	ReqInt            string `csv:"reqint"`            // Required intelligence.
	ReqVit            string `csv:"reqvit"`            // Required vitality.
	ReqSkill1         string `csv:"reqskill1"`         // Required skill 1.
	ReqSkill2         string `csv:"reqskill2"`         // Required skill 2.
	ReqSkill3         string `csv:"reqskill3"`         // Required skill 3.
	Restrict          string `csv:"restrict"`          // Skill restrictions.
	State1            string `csv:"State1"`            // Skill state 1.
	State2            string `csv:"State2"`            // Skill state 2.
	State3            string `csv:"State3"`            // Skill state 3.
	Delay             string `csv:"delay"`             // Skill delay.
	LeftSkill         string `csv:"leftskill"`         // Left skill.
	Repeat            string `csv:"repeat"`            // Repeat skill.
	CheckFunc         string `csv:"checkfunc"`         // Check function.
	NoCostInState     string `csv:"nocostinstate"`     // No cost in state.
	UseManaOnDo       string `csv:"usemanaondo"`       // Use mana on do.
	StartMana         string `csv:"startmana"`         // Starting mana.
	MinMana           string `csv:"minmana"`           // Minimum mana.
	ManaShift         string `csv:"manashift"`         // Mana shift.
	Mana              string `csv:"mana"`              // Base mana.
	Interrupt         string `csv:"interrupt"`         // Interruptible skill.
	InTown            string `csv:"InTown"`            // Usable in town.
	Aura              string `csv:"aura"`              // Aura skill.
	Periodic          string `csv:"periodic"`          // Periodic skill.
	PerDelay          string `csv:"perdelay"`          // Periodic delay.
	Finishing         string `csv:"finishing"`         // Finishing skill.
	Passive           string `csv:"passive"`           // Passive skill.
	Progressive       string `csv:"progressive"`       // Progressive skill.
	General           string `csv:"general"`           // General skill.
	Scroll            string `csv:"scroll"`            // Scroll skill.
	Calc1             string `csv:"calc1"`             // Calculation 1.
	Calc2             string `csv:"calc2"`             // Calculation 2.
	Calc3             string `csv:"calc3"`             // Calculation 3.
	Calc4             string `csv:"calc4"`             // Calculation 4.
	Param1            string `csv:"Param1"`            // Parameter 1.
	Param2            string `csv:"Param2"`            // Parameter 2.
	Param3            string `csv:"Param3"`            // Parameter 3.
	Param4            string `csv:"Param4"`            // Parameter 4.
	Param5            string `csv:"Param5"`            // Parameter 5.
	Param6            string `csv:"Param6"`            // Parameter 6.
	Param7            string `csv:"Param7"`            // Parameter 7.
	Param8            string `csv:"Param8"`            // Parameter 8.
	InGame            string `csv:"InGame"`            // Enabled in-game.
	ToHit             string `csv:"ToHit"`             // Base bonus Attack Rating at level 1.
	LevToHit          string `csv:"LevToHit"`          // Additional bonus Attack Rating per level.
	ToHitCalc         string `csv:"ToHitCalc"`         // Attack Rating calculation.
	ResultFlags       string `csv:"ResultFlags"`       // Controls different flags for the target's reaction after being hit.
	HitFlags          string `csv:"HitFlags"`          // Controls different flags for the damage dealt when the target is hit.
	HitClass          string `csv:"HitClass"`          // Defines the skill's damage routines when hitting.
	Kick              string `csv:"Kick"`              // Separate function for calculating physical damage when kicking.
	HitShift          string `csv:"HitShift"`          // Percentage modifier for the skill's damage.
	SrcDam            string `csv:"SrcDam"`            // Percentage modifier for weapon damage transferred to the skill's damage.
	MinDam            string `csv:"MinDam"`            // Minimum baseline physical damage dealt by the skill.
	MinLevDam1        string `csv:"MinLevDam1"`        // Additional minimum physical damage dealt at level thresholds.
	MinLevDam2        string `csv:"MinLevDam2"`        // Additional minimum physical damage dealt at level thresholds.
	MinLevDam3        string `csv:"MinLevDam3"`        // Additional minimum physical damage dealt at level thresholds.
	MinLevDam4        string `csv:"MinLevDam4"`        // Additional minimum physical damage dealt at level thresholds.
	MinLevDam5        string `csv:"MinLevDam5"`        // Additional minimum physical damage dealt at level thresholds.
	MaxDam            string `csv:"MaxDam"`            // Maximum baseline physical damage dealt by the skill.
	MaxLevDam1        string `csv:"MaxLevDam1"`        // Additional maximum physical damage dealt at level thresholds.
	MaxLevDam2        string `csv:"MaxLevDam2"`        // Additional maximum physical damage dealt at level thresholds.
	MaxLevDam3        string `csv:"MaxLevDam3"`        // Additional maximum physical damage dealt at level thresholds.
	MaxLevDam4        string `csv:"MaxLevDam4"`        // Additional maximum physical damage dealt at level thresholds.
	MaxLevDam5        string `csv:"MaxLevDam5"`        // Additional maximum physical damage dealt at level thresholds.
	DmgSymPerCalc     string `csv:"DmgSymPerCalc"`     // Damage symmetrical percentage calculation.
	EType             string `csv:"EType"`             // Elemental type.
	EMin              string `csv:"EMin"`              // Minimum baseline elemental damage dealt by the skill.
	EMinLev1          string `csv:"EMinLev1"`          // Additional minimum elemental damage dealt at level thresholds.
	EMinLev2          string `csv:"EMinLev2"`          // Additional minimum elemental damage dealt at level thresholds.
	EMinLev3          string `csv:"EMinLev3"`          // Additional minimum elemental damage dealt at level thresholds.
	EMinLev4          string `csv:"EMinLev4"`          // Additional minimum elemental damage dealt at level thresholds.
	EMinLev5          string `csv:"EMinLev5"`          // Additional minimum elemental damage dealt at level thresholds.
	EMax              string `csv:"EMax"`              // Maximum baseline elemental damage dealt by the skill.
	EMaxLev1          string `csv:"EMaxLev1"`          // Additional maximum elemental damage dealt at level thresholds.
	EMaxLev2          string `csv:"EMaxLev2"`          // Additional maximum elemental damage dealt at level thresholds.
	EMaxLev3          string `csv:"EMaxLev3"`          // Additional maximum elemental damage dealt at level thresholds.
	EMaxLev4          string `csv:"EMaxLev4"`          // Additional maximum elemental damage dealt at level thresholds.
	EMaxLev5          string `csv:"EMaxLev5"`          // Additional maximum elemental damage dealt at level thresholds.
	EDmgSymPerCalc    string `csv:"EDmgSymPerCalc"`    // Elemental damage symmetrical percentage calculation.
	ELen              string `csv:"ELen"`              // Elemental length.
	ELevLen1          string `csv:"ELevLen1"`          // Additional elemental length at level thresholds.
	ELevLen2          string `csv:"ELevLen2"`          // Additional elemental length at level thresholds.
	ELevLen3          string `csv:"ELevLen3"`          // Additional elemental length at level thresholds.
	ELenSymPerCalc    string `csv:"ELenSymPerCalc"`    // Elemental length symmetrical percentage calculation.
	AIType            string `csv:"aitype"`            // AI type.
	AIBonus           string `csv:"aibonus"`           // AI bonus.
	CostMult          string `csv:"cost mult"`         // Cost multiplier.
	CostAdd           string `csv:"cost add"`          // Cost addition.
}

SkillData represents the data fields in the skills.txt file.

type SkillDescData

type SkillDescData struct {
	SkillDesc        string `csv:"skilldesc"`                // Skill description name.
	SkillPage        int    `csv:"SkillPage"`                // Skill tree page.
	SkillRow         int    `csv:"SkillRow"`                 // Skill tree row.
	SkillColumn      int    `csv:"SkillColumn"`              // Skill tree column.
	ListRow          int    `csv:"ListRow"`                  // Skill listing row in the skill selection UI.
	IconCel          string `csv:"IconCel"`                  // Icon asset for displaying the skill.
	HireableIconCel  string `csv:"HireableIconCel"`          // Icon asset for displaying the skill on a hireable (mercenary).
	StrName          string `csv:"str name"`                 // Skill name.
	StrShort         string `csv:"str short"`                // Short skill description.
	StrLong          string `csv:"str long"`                 // Long skill description on the Skill Tree.
	StrAlt           string `csv:"str alt"`                  // Skill name on the Character Screen when selected.
	DescDam          string `csv:"descdam"`                  // Skill's damage calculation function.
	DDamCalc1        string `csv:"ddam calc1"`               // Integer calc value used as a parameter for DescDam function.
	DDamCalc2        string `csv:"ddam calc2"`               // Integer calc value used as a parameter for DescDam function.
	P1DmElem         string `csv:"p1dmelem"`                 // Elemental type for charge-ups on the Character Screen.
	P2DmElem         string `csv:"p2dmelem"`                 // Elemental type for charge-ups on the Character Screen.
	P3DmElem         string `csv:"p3dmelem"`                 // Elemental type for charge-ups on the Character Screen.
	P1DmMin          string `csv:"p1dmmin"`                  // Minimum damage for charge-ups on the Character Screen.
	P2DmMin          string `csv:"p2dmmin"`                  // Minimum damage for charge-ups on the Character Screen.
	P3DmMin          string `csv:"p3dmmin"`                  // Minimum damage for charge-ups on the Character Screen.
	P1DmMax          string `csv:"p1dmmax"`                  // Maximum damage for charge-ups on the Character Screen.
	P2DmMax          string `csv:"p2dmmax"`                  // Maximum damage for charge-ups on the Character Screen.
	P3DmMax          string `csv:"p3dmmax"`                  // Maximum damage for charge-ups on the Character Screen.
	DescAtt          string `csv:"descatt"`                  // Overall Attack Rating of the skill in the Character Screen.
	DescMissile1     string `csv:"descmissile1"`             // Linked missile from Missiles.txt for reference.
	DescMissile2     string `csv:"descmissile2"`             // Linked missile from Missiles.txt for reference.
	DescMissile3     string `csv:"descmissile3"`             // Linked missile from Missiles.txt for reference.
	DescLine1        string `csv:"descline1"`                // Description function ID for level and next level tooltip lines.
	DescLine2        string `csv:"descline2"`                // Description function ID for level and next level tooltip lines.
	DescLine3        string `csv:"descline3"`                // Description function ID for level and next level tooltip lines.
	DescLine4        string `csv:"descline4"`                // Description function ID for level and next level tooltip lines.
	DescLine5        string `csv:"descline5"`                // Description function ID for level and next level tooltip lines.
	DescLine6        string `csv:"descline6"`                // Description function ID for level and next level tooltip lines.
	DescTextA1       string `csv:"desctexta1"`               // First string parameter for DescLine function.
	DescTextA2       string `csv:"desctexta2"`               // First string parameter for DescLine function.
	DescTextA3       string `csv:"desctexta3"`               // First string parameter for DescLine function.
	DescTextA4       string `csv:"desctexta4"`               // First string parameter for DescLine function.
	DescTextA5       string `csv:"desctexta5"`               // First string parameter for DescLine function.
	DescTextA6       string `csv:"desctexta6"`               // First string parameter for DescLine function.
	DescTextB1       string `csv:"desctextb1"`               // Second string parameter for DescLine function.
	DescTextB2       string `csv:"desctextb2"`               // Second string parameter for DescLine function.
	DescTextB3       string `csv:"desctextb3"`               // Second string parameter for DescLine function.
	DescTextB4       string `csv:"desctextb4"`               // Second string parameter for DescLine function.
	DescTextB5       string `csv:"desctextb5"`               // Second string parameter for DescLine function.
	DescTextB6       string `csv:"desctextb6"`               // Second string parameter for DescLine function.
	DescCalca1       string `csv:"desccalca1"`               // First numeric parameter for DescLine function.
	DescCalca2       string `csv:"desccalca2"`               // First numeric parameter for DescLine function.
	DescCalca3       string `csv:"desccalca3"`               // First numeric parameter for DescLine function.
	DescCalca4       string `csv:"desccalca4"`               // First numeric parameter for DescLine function.
	DescCalca5       string `csv:"desccalca5"`               // First numeric parameter for DescLine function.
	DescCalca6       string `csv:"desccalca6"`               // First numeric parameter for DescLine function.
	DescCalcb1       string `csv:"desccalcb1"`               // Second numeric parameter for DescLine function.
	DescCalcb2       string `csv:"desccalcb2"`               // Second numeric parameter for DescLine function.
	DescCalcb3       string `csv:"desccalcb3"`               // Second numeric parameter for DescLine function.
	DescCalcb4       string `csv:"desccalcb4"`               // Second numeric parameter for DescLine function.
	DescCalcb5       string `csv:"desccalcb5"`               // Second numeric parameter for DescLine function.
	DescCalcb6       string `csv:"desccalcb6"`               // Second numeric parameter for DescLine function.
	Dsc2Line1        string `csv:"dsc2line1"`                // Description function ID for pinned lines after skill description.
	Dsc2Line2        string `csv:"dsc2line2"`                // Description function ID for pinned lines after skill description.
	Dsc2Line3        string `csv:"dsc2line3"`                // Description function ID for pinned lines after skill description.
	Dsc2Line4        string `csv:"dsc2line4"`                // Description function ID for pinned lines after skill description.
	Dsc2Line5        string `csv:"dsc2line5"`                // Description function ID for pinned lines after skill description.
	Dsc2TextA1       string `csv:"dsc2texta1"`               // First string parameter for Dsc2Line function.
	Dsc2TextA2       string `csv:"dsc2texta2"`               // First string parameter for Dsc2Line function.
	Dsc2TextA3       string `csv:"dsc2texta3"`               // First string parameter for Dsc2Line function.
	Dsc2TextA4       string `csv:"dsc2texta4"`               // First string parameter for Dsc2Line function.
	Dsc2TextA5       string `csv:"dsc2texta5"`               // First string parameter for Dsc2Line function.
	Dsc2TextB1       string `csv:"dsc2textb1"`               // Second string parameter for Dsc2Line function.
	Dsc2TextB2       string `csv:"dsc2textb2"`               // Second string parameter for Dsc2Line function.
	Dsc2TextB3       string `csv:"dsc2textb3"`               // Second string parameter for Dsc2Line function.
	Dsc2TextB4       string `csv:"dsc2textb4"`               // Second string parameter for Dsc2Line function.
	Dsc2TextB5       string `csv:"dsc2textb5"`               // Second string parameter for Dsc2Line function.
	Dsc2Calca1       string `csv:"dsc2calca1"`               // First numeric parameter for Dsc2Line function.
	Dsc2Calca2       string `csv:"dsc2calca2"`               // First numeric parameter for Dsc2Line function.
	Dsc2Calca3       string `csv:"dsc2calca3"`               // First numeric parameter for Dsc2Line function.
	Dsc2Calca4       string `csv:"dsc2calca4"`               // First numeric parameter for Dsc2Line function.
	Dsc2Calca5       string `csv:"dsc2calca5"`               // First numeric parameter for Dsc2Line function.
	Dsc2Calca6       string `csv:"dsc2calca6"`               // First numeric parameter for Dsc2Line function.
	Dsc2Calcb1       string `csv:"dsc2calcb1"`               // Second numeric parameter for Dsc2Line function.
	Dsc2Calcb2       string `csv:"dsc2calcb2"`               // Second numeric parameter for Dsc2Line function.
	Dsc2Calcb3       string `csv:"dsc2calcb3"`               // Second numeric parameter for Dsc2Line function.
	Dsc2Calcb4       string `csv:"dsc2calcb4"`               // Second numeric parameter for Dsc2Line function.
	Dsc2Calcb5       string `csv:"dsc2calcb5"`               // Second numeric parameter for Dsc2Line function.
	Dsc2Calcb6       string `csv:"dsc2calcb6"`               // Second numeric parameter for Dsc2Line function.
	Dsc3Line1        string `csv:"dsc3line1"`                // Description function ID for pinned lines at the bottom of the skill tooltip.
	Dsc3Line2        string `csv:"dsc3line2"`                // Description function ID for pinned lines at the bottom of the skill tooltip.
	Dsc3Line3        string `csv:"dsc3line3"`                // Description function ID for pinned lines at the bottom of the skill tooltip.
	Dsc3Line4        string `csv:"dsc3line4"`                // Description function ID for pinned lines at the bottom of the skill tooltip.
	Dsc3Line5        string `csv:"dsc3line5"`                // Description function ID for pinned lines at the bottom of the skill tooltip.
	Dsc3Line6        string `csv:"dsc3line6"`                // Description function ID for pinned lines at the bottom of the skill tooltip.
	Dsc3Line7        string `csv:"dsc3line7"`                // Description function ID for pinned lines at the bottom of the skill tooltip.
	Dsc3TextA1       string `csv:"dsc3texta1"`               // First string parameter for Dsc3Line function.
	Dsc3TextA2       string `csv:"dsc3texta2"`               // First string parameter for Dsc3Line function.
	Dsc3TextA3       string `csv:"dsc3texta3"`               // First string parameter for Dsc3Line function.
	Dsc3TextA4       string `csv:"dsc3texta4"`               // First string parameter for Dsc3Line function.
	Dsc3TextA5       string `csv:"dsc3texta5"`               // First string parameter for Dsc3Line function.
	Dsc3TextA6       string `csv:"dsc3texta6"`               // First string parameter for Dsc3Line function.
	Dsc3TextA7       string `csv:"dsc3texta7"`               // First string parameter for Dsc3Line function.
	Dsc3TextB1       string `csv:"dsc3textb1"`               // Second string parameter for Dsc3Line function.
	Dsc3TextB2       string `csv:"dsc3textb2"`               // Second string parameter for Dsc3Line function.
	Dsc3TextB3       string `csv:"dsc3textb3"`               // Second string parameter for Dsc3Line function.
	Dsc3TextB4       string `csv:"dsc3textb4"`               // Second string parameter for Dsc3Line function.
	Dsc3TextB5       string `csv:"dsc3textb5"`               // Second string parameter for Dsc3Line function.
	Dsc3TextB6       string `csv:"dsc3textb6"`               // Second string parameter for Dsc3Line function.
	Dsc3TextB7       string `csv:"dsc3textb7"`               // Second string parameter for Dsc3Line function.
	ItemProcText     string `csv:"item proc text"`           // Override format for skill appearing as "chance to cast" on an item.
	ItemProcDescLine string `csv:"item proc descline count"` // Number of descline entries formatted into ItemProcText string.
}

SkillDescData represents a skill's tooltip description and how it is displayed on the Skill Tree.

type SoundEntry

type SoundEntry struct {
	Sound          string `csv:"Sound"`          // Defines the unique name ID for the sound, which is how other files can reference the sound
	Redirect       string `csv:"Redirect"`       // Points the sound to the index of another sound in the data file for new graphics mode
	Channel        string `csv:"Channel"`        // Declares which channel the sound is initialized in
	FileName       string `csv:"FileName"`       // File path and name of the sound file to play
	IsLocal        int    `csv:"IsLocal"`        // Boolean field for localized sound
	IsMusic        int    `csv:"IsMusic"`        // Boolean field for music sound
	IsAmbientScene int    `csv:"IsAmbientScene"` // Boolean field for ambient scene sound
	IsAmbientEvent int    `csv:"IsAmbientEvent"` // Boolean field for ambient event sound
	IsUI           int    `csv:"IsUI"`           // Boolean field for UI sound
	VolumeMin      int    `csv:"Volume Min"`     // Minimum volume of the sound (0 to 255)
	VolumeMax      int    `csv:"Volume Max"`     // Maximum volume of the sound (0 to 255)
	PitchMin       int    `csv:"Pitch Min"`      // Minimum pitch percentage of the sound
	PitchMax       int    `csv:"Pitch Max"`      // Maximum pitch percentage of the sound
	GroupSize      int    `csv:"Group Size"`     // Sound Group size to group related sounds
	GroupWeight    int    `csv:"Group Weight"`   // Weighted random chance for group sound selection
	Loop           int    `csv:"Loop"`           // Boolean field for sound loop
	FadeIn         int    `csv:"Fade In"`        // Gradual increase in volume when the sound starts playing
	FadeOut        int    `csv:"Fade Out"`       // Gradual decrease in volume when the sound stops playing
	DeferInst      int    `csv:"Defer Inst"`     // Boolean field to stop duplicate sound instance
	StopInst       int    `csv:"Stop Inst"`      // Boolean field to stop previous sound instance
	Duration       int    `csv:"Duration"`       // Length of time to play the sound (0 to ignore)
	Compound       int    `csv:"Compound"`       // Game tick time limit for sound compounding
	Falloff        int    `csv:"Falloff"`        // Defines the range of falloff for hearing the sound, based on distance
	LFEMix         int    `csv:"LFEMix"`         // Percentage of the sound's Low-Frequency Effects channel
	SpatialSpread  int    `csv:"3dSpread"`       // 3D spread angle of the sound (0 to 255)
	Priority       int    `csv:"Priority"`       // Priority of the sound compared to other sounds
	Stream         int    `csv:"Stream"`         // Boolean field for file streaming of the sound
	Is2D           int    `csv:"Is2D"`           // Boolean field for 2D or 3D sound
	Tracking       int    `csv:"Tracking"`       // Boolean field for sound tracking a unit
	Solo           int    `csv:"Solo"`           // Boolean field for reducing volume of other sounds while playing
	MusicVol       int    `csv:"Music Vol"`      // Boolean field for sound's volume affected by music volume
	Block1         int    `csv:"Block 1"`        // Offset time value in sound for sound environment or looping
	Block2         int    `csv:"Block 2"`        // Offset time value in sound for sound environment
	Block3         int    `csv:"Block 3"`        // Offset time value in sound for sound environment
	HDOptOut       int    `csv:"HDOptOut"`       // Boolean field for not playing sound in new graphics mode
	Delay          int    `csv:"Delay"`          // Delay to the starting tick of the sound when it starts playing
}

func (SoundEntry) ExportToLua

func (s SoundEntry) ExportToLua(state *lua.LState) *lua.LTable

ExportToLua exports the SoundEntry object to a Lua table.

type SoundEnvironment

type SoundEnvironment struct {
	Handle             string            `csv:"Handle"`                // Reference field to define the name of the Sound Environment
	Song               string            `csv:"Song"`                  // Background music while the player is in an area level (Points to "Sound" value in sounds.txt)
	DayAmbience        string            `csv:"Day Ambience"`          // Ambient sound during daytime in the game (Points to "Sound" value in sounds.txt)
	HDDayAmbience      string            `csv:"HD Day Ambience"`       // Ambient sound during daytime in the game while playing in new graphics mode (Points to "Sound" value in sounds.txt)
	NightAmbience      string            `csv:"Night Ambience"`        // Ambient sound during nighttime in the game (Points to "Sound" value in sounds.txt)
	HDNightAmbience    string            `csv:"HD Night Ambience"`     // Ambient sound during nighttime in the game while playing in new graphics mode (Points to "Sound" value in sounds.txt)
	DayEvent           string            `csv:"Day Event"`             // Random background sound during daytime in the game (Points to "Sound" value in sounds.txt)
	HDDayEvent         string            `csv:"HD Day Event"`          // Random background sound during daytime in the game while playing in new graphics mode (Points to "Sound" value in sounds.txt)
	NightEvent         string            `csv:"Night Event"`           // Random background sound during nighttime in the game (Points to "Sound" value in sounds.txt)
	HDNightEvent       string            `csv:"HD Night Event"`        // Random background sound during nighttime in the game while playing in new graphics mode (Points to "Sound" value in sounds.txt)
	EventDelay         int               `csv:"Event Delay"`           // Baseline number of frames to wait before playing "Day Event" or "Night Event" sound in SD mode
	HDEventDelay       int               `csv:"HD Event Delay"`        // Baseline number of frames to wait before playing "Day Event" or "Night Event" sound in new graphics mode
	Indoors            int               `csv:"Indoors"`               // Boolean field for obstructed sound if current sound is "event_thunder_1"
	Material1          int               `csv:"Material 1"`            // Material of Sound Environment affecting footstep sounds (Code descriptions in data)
	Material2          int               `csv:"Material 2"`            // Material of Sound Environment affecting footstep sounds (Code descriptions in data)
	HDMaterial1        int               `csv:"HD Material 1"`         // Material of Sound Environment affecting footstep sounds in new graphics mode (Code descriptions in data)
	HDMaterial2        int               `csv:"HD Material 2"`         // Material of Sound Environment affecting footstep sounds in new graphics mode (Code descriptions in data)
	SFXEAXEnviron      EnvironmentPreset `csv:"SFX EAX Environ"`       // Environment preset for default sound reverberation settings for special effects sounds (Code descriptions in data)
	SFXEAXRoomVol      int               `csv:"SFX EAX Room Vol"`      // Room effect level at mid frequencies for special effects sounds
	SFXEAXRoomHF       int               `csv:"SFX EAX Room HF"`       // Relative room effect level at high frequencies for special effects sounds
	SFXEAXDecayTime    int               `csv:"SFX EAX Decay Time"`    // Reverberation decay time at mid frequencies for special effects sounds
	SFXEAXDecayHF      int               `csv:"SFX EAX Decay HF"`      // High-frequency to mid-frequency decay time ratio for special effects sounds
	SFXEAXReflect      int               `csv:"SFX EAX Reflect"`       // Early reflections level relative to room effect for special effects sounds
	SFXEAXReflectDelay int               `csv:"SFX EAX Reflect Delay"` // Initial reflection delay time for special effects sounds
	SFXEAXReverb       int               `csv:"SFX EAX Reverb"`        // Late reverberation level relative to room effect for special effects sounds
	SFXEAXRevDelay     int               `csv:"SFX EAX Rev Delay"`     // Late reverberation delay time relative to initial reflection for special effects sounds
	VOXEAXEnviron      int               `csv:"VOX EAX Environ"`       // Environment preset for default sound reverberation settings for Voice sounds (Code descriptions in data)
	VOXEAXRoomVol      int               `csv:"VOX EAX Room Vol"`      // Room effect level at mid frequencies for Voice sounds
	VOXEAXRoomHF       int               `csv:"VOX EAX Room HF"`       // Relative room effect level at high frequencies for Voice sounds
	VOXEAXDecayTime    int               `csv:"VOX EAX Decay Time"`    // Reverberation decay time at mid frequencies for Voice sounds
	VOXEAXDecayHF      int               `csv:"VOX EAX Decay HF"`      // High-frequency to mid-frequency decay time ratio for Voice sounds
	VOXEAXReflect      int               `csv:"VOX EAX Reflect"`       // Early reflections level relative to room effect for Voice sounds
	VOXEAXReflectDelay int               `csv:"VOX EAX Reflect Delay"` // Initial reflection delay time for Voice sounds
	VOXEAXReverb       int               `csv:"VOX EAX Reverb"`        // Late reverberation level relative to room effect for Voice sounds
	VOXEAXRevDelay     int               `csv:"VOX EAX Rev Delay"`     // Late reverberation delay time relative to initial reflection for Voice sounds
	InheritEnvironment int               `csv:"InheritEnvironment"`    // Boolean field for inheriting values from the existing environment and overwriting other values
}

SoundEnvironment represents the settings for music and ambient sounds played in the game's area levels.

type State

type State struct {
	State           string `csv:"state"`             // Unique name ID for the state
	Group           string `csv:"group"`             // Group ID value to limit one active state with the same group on a unit
	RemHit          int    `csv:"remhit"`            // Boolean field, 1: State removed when the unit is hit, 0: Ignore
	NoSend          int    `csv:"nosend"`            // Boolean field, 1: State change not sent to the client, 0: Ignore
	Transform       int    `csv:"transform"`         // Boolean field, 1: Changes unit's appearance and resets animations, 0: Ignore
	Aura            int    `csv:"aura"`              // Boolean field, 1: Treated as an aura, 0: Ignore
	Curable         int    `csv:"curable"`           // Boolean field, 1: State can be cured, 0: Ignore
	Curse           int    `csv:"curse"`             // Boolean field, 1: State flagged as a curse, 0: Ignore
	Active          int    `csv:"active"`            // Boolean field, 1: State classified as an active state, 0: Ignore
	Restrict        int    `csv:"restrict"`          // Boolean field, 1: State restricts usage of certain skills, 0: Ignore
	Disguise        int    `csv:"disguise"`          // Boolean field, 1: State flagged as a disguise, 0: Ignore
	AttBlue         int    `csv:"attblue"`           // Boolean field, 1: Affects Attack Rating value in blue color, 0: Ignore
	DamBlue         int    `csv:"damblue"`           // Boolean field, 1: Affects Damage value in blue color, 0: Ignore
	ArmBlue         int    `csv:"armblue"`           // Boolean field, 1: Affects Defense value (Armor) in blue color, 0: Ignore
	RFBlue          int    `csv:"rfblue"`            // Boolean field, 1: Affects Fire Resistance value in blue color, 0: Ignore
	RLBlue          int    `csv:"rlblue"`            // Boolean field, 1: Affects Lightning Resistance value in blue color, 0: Ignore
	RCBlue          int    `csv:"rcblue"`            // Boolean field, 1: Affects Cold Resistance value in blue color, 0: Ignore
	StamBarBlue     int    `csv:"stambarblue"`       // Boolean field, 1: Affects Stamina Bar UI in blue color, 0: Ignore
	RPBlue          int    `csv:"rpblue"`            // Boolean field, 1: Affects Poison Resistance value in blue color, 0: Ignore
	AttRed          int    `csv:"attred"`            // Boolean field, 1: Affects Attack Rating value in red color, 0: Ignore
	DamRed          int    `csv:"damred"`            // Boolean field, 1: Affects Damage value in red color, 0: Ignore
	ArmRed          int    `csv:"armred"`            // Boolean field, 1: Affects Defense value (Armor) in red color, 0: Ignore
	RFRed           int    `csv:"rfred"`             // Boolean field, 1: Affects Fire Resistance value in red color, 0: Ignore
	RLRed           int    `csv:"rlred"`             // Boolean field, 1: Affects Lightning Resistance value in red color, 0: Ignore
	RCRed           int    `csv:"rcred"`             // Boolean field, 1: Affects Cold Resistance value in red color, 0: Ignore
	RPRed           int    `csv:"rpred"`             // Boolean field, 1: Affects Poison Resistance value in red color, 0: Ignore
	Exp             int    `csv:"exp"`               // Boolean field, 1: Unit with this state gives/gains exp, 0: Ignore
	PlrStayDeath    int    `csv:"plrstaydeath"`      // Boolean field, 1: State persists on player after death, 0: Ignore
	MonStayDeath    int    `csv:"monstaydeath"`      // Boolean field, 1: State persists on monster (non-boss) after death, 0: Ignore
	BossStayDeath   int    `csv:"bossstaydeath"`     // Boolean field, 1: State persists on boss after death, 0: Ignore
	Hide            int    `csv:"hide"`              // Boolean field, 1: Hides the unit when dead (corpse and death animations not drawn), 0: Ignore
	HideDead        int    `csv:"hidedead"`          // Boolean field, 1: Used to destroy units with invisible corpses, 0: Ignore
	Shatter         int    `csv:"shatter"`           // Boolean field, 1: Causes ice shatter missiles when the unit dies, 0: Ignore
	UDead           int    `csv:"udead"`             // Boolean field, 1: Flags the unit as a used dead corpse, 0: Ignore
	Life            int    `csv:"life"`              // Boolean field, 1: Cancels monster's normal life regeneration, 0: Ignore
	Green           int    `csv:"green"`             // Boolean field, 1: Overrides unit's color changes and makes it green, 0: Ignore
	PGSV            int    `csv:"pgsv"`              // Boolean field, 1: Part of a progressive skill (charge-up skill), 0: Ignore
	NoOverlays      int    `csv:"nooverlays"`        // Boolean field, 1: Disables standard way of adding overlays, 0: Ignore
	NoClear         int    `csv:"noclear"`           // Boolean field, 1: Applied state does not clear stats from the state's previous application, 0: Ignore
	BossInv         int    `csv:"bossinv"`           // Boolean field, 1: Uses the boss's inventory for the unit's equipped item graphics, 0: Ignore
	MeleeOnly       int    `csv:"meleeonly"`         // Boolean field, 1: Makes all unit's attacks melee attacks, 0: Ignore
	NotOnDead       int    `csv:"notondead"`         // Boolean field, 1: Does not play On function if unit is dead, 0: Ignore
	Overlay1        string `csv:"overlay1"`          // Controls which overlay to use for displaying the state (Front Start)
	Overlay2        string `csv:"overlay2"`          // Controls which overlay to use for displaying the state (Back Start)
	Overlay3        string `csv:"overlay3"`          // Controls which overlay to use for displaying the state (Front End)
	Overlay4        string `csv:"overlay4"`          // Controls which overlay to use for displaying the state (Back End)
	PGSVOverlay     string `csv:"pgsvoverlay"`       // Controls which overlay to use for progressive charges (charge-up skills)
	CastOverlay     string `csv:"castoverlay"`       // Controls which overlay to use when the state is initially applied
	RemOverlay      string `csv:"removerlay"`        // Controls which overlay to use when the state is removed
	Stat            string `csv:"stat"`              // Controls the associated stat for the state
	SetFunc         int    `csv:"setfunc"`           // Controls client-side set functions when the state is applied
	RemFunc         int    `csv:"remfunc"`           // Controls client-side remove functions when the state is removed
	Missile         string `csv:"missile"`           // Possible parameter for "setfunc" field, specifies missile from Missiles.txt
	Skill           string `csv:"skill"`             // Possible parameter for "setfunc" field, specifies skill from skills.txt
	ItemType        string `csv:"itemtype"`          // Potential Item Type affected by the state's color change (see ItemTypes.txt)
	ItemTrans       string `csv:"itemtrans"`         // Controls color change of the item when the unit has this state (uses color codes)
	ColorPri        int    `csv:"colorpri"`          // Priority of state's color change compared to other states on the unit
	ColorShift      int    `csv:"colorshift"`        // Controls index of the color shift palette to use
	LightR          int    `csv:"light-r"`           // State's change of the red color value of Light radius (0-255)
	LightG          int    `csv:"light-g"`           // State's change of the green color value of Light radius (0-255)
	LightB          int    `csv:"light-b"`           // State's change of the blue color value of Light radius (0-255)
	OnSound         string `csv:"onsound"`           // Sound played when the state is initially applied
	OffSound        string `csv:"offsound"`          // Sound played when the state is removed
	GfxType         int    `csv:"gfxtype"`           // Handles unit graphics transformation based on unit type
	GfxClass        int    `csv:"gfxclass"`          // Controls unit class used for handling graphics transformation
	CltEvent        string `csv:"cltevent"`          // Controls event to check on the client side for "clteventfunc" field
	CltEventFunc    int    `csv:"clteventfunc"`      // Client Unit event function called when event is determined in "cltevent" field
	CltActiveFunc   int    `csv:"cltactivefunc"`     // Client Do function called every frame while the state is active
	SrvActiveFunc   int    `csv:"srvactivefunc"`     // Server Do function called every frame while the state is active
	CanStack        int    `csv:"canstack"`          // Boolean field, 1: State can stack with duplicates (only for "poison" state), 0: Ignore
	SunderFull      int    `csv:"sunderfull"`        // Boolean field, 1: Reapply negative resistance stats at full potential when calculating pierce immunity if broken, 0: Ignore
	SunderResReduce int    `csv:"sunder-res-reduce"` // Boolean field, 1: Apply pierce resistance at reduced effectiveness when calculating pierce resistance if immunity was broken, 0: Ignore
}

State represents different passive behaviors applied to units that can apply various effects in the game.

type SubType

type SubType int

type ThemeCode

type ThemeCode int

type TileName

type TileName string

TileName represents the tile orientations on the Automap.

const (
	TileBaseFloor                  TileName = "fl"
	TileBaseLeftWall               TileName = "wl"
	TileBaseRightWall              TileName = "wr"
	TileBaseUpperTopCornerRight    TileName = "wtlr"
	TileBaseUpperTopCornerLeft     TileName = "wtll"
	TileBaseUpperTopCorner         TileName = "wtr"
	TileBaseLowerBottomCornerLeft  TileName = "wbl"
	TileBaseLowerBottomCornerRight TileName = "wbr"
	TileBaseLeftDoor               TileName = "wld"
	TileBaseRightDoor              TileName = "wrd"
	TileBaseLeftExit               TileName = "wle"
	TileBaseRightExit              TileName = "wre"
	TileBaseColumn                 TileName = "co"
	TileBaseShadow                 TileName = "sh"
	TileBaseTree                   TileName = "tr"
	TileBaseRoof                   TileName = "rf"
	TileBaseLeftWallDown           TileName = "ld"
	TileBaseRightWallDown          TileName = "rd"
	TileBaseFullWallDown           TileName = "fd"
	TileBaseFrontWallDown          TileName = "fi"
)

Tile name constants for the Automap.

type TransformType

type TransformType int

TransformType represents the color palette change of the item for the character model graphics and inventory graphics.

const (
	TransformTypeNoColorChange TransformType = iota
	TransformTypeGrey
	TransformTypeGrey2
	TransformTypeGold
	TransformTypeBrown
	TransformTypeGreyBrown
	TransformTypeInventoryGrey
	TransformTypeInventoryGrey2
	TransformTypeInventoryGreyBrown
)

type Transparency

type Transparency int

Transparency represents the types of transparency for items.

const (
	Transparency25 Transparency = iota
	Transparency50
	Transparency75
	TransparencyBlackAlpha
	TransparencyWhiteAlpha
	TransparencyNo
	TransparencyDark
	TransparencyHighlight
	TransparencyBlended
)

type TreasureClass

type TreasureClass struct {
	TreasureClass string  `lua:"TreasureClass" csv:"Treasure Class"` // Unique Treasure Class ID.
	Picks         int     `lua:"Picks" csv:"Picks"`                  // Number of item drop chances rolled or total guaranteed quantity of item drops.
	Unique        float64 `lua:"Unique" csv:"Unique"`                // Modifies the item ratio drop for a Unique Quality item.
	Set           float64 `lua:"Set" csv:"Set"`                      // Modifies the item ratio drop for a Set Quality item.
	Rare          float64 `lua:"Rare" csv:"Rare"`                    // Modifies the item ratio drop for a Rare Quality item.
	Magic         float64 `lua:"Magic" csv:"Magic"`                  // Modifies the item ratio drop for a Magic Quality item.
	NoDrop        float64 `lua:"NoDrop" csv:"NoDrop"`                // Probability of no item dropping by the Treasure Class.
	Item1         string  `lua:"Item1" csv:"Item1"`                  // Potential Item Type for drop.
	Item2         string  `lua:"Item2" csv:"Item2"`                  // Additional potential Item Type for drop.
	Item3         string  `lua:"Item3" csv:"Item3"`                  // Additional potential Item Type for drop.
	Item4         string  `lua:"Item4" csv:"Item4"`                  // Additional potential Item Type for drop.
	Item5         string  `lua:"Item5" csv:"Item5"`                  // Additional potential Item Type for drop.
	Item6         string  `lua:"Item6" csv:"Item6"`                  // Additional potential Item Type for drop.
	Item7         string  `lua:"Item7" csv:"Item7"`                  // Additional potential Item Type for drop.
	Item8         string  `lua:"Item8" csv:"Item8"`                  // Additional potential Item Type for drop.
	Item9         string  `lua:"Item9" csv:"Item9"`                  // Additional potential Item Type for drop.
	Item10        string  `lua:"Item10" csv:"Item10"`                // Additional potential Item Type for drop.
	Prob1         float64 `lua:"Prob1" csv:"Prob1"`                  // Probability for the drop of Item1.
	Prob2         float64 `lua:"Prob2" csv:"Prob2"`                  // Probability for the drop of Item2.
	Prob3         float64 `lua:"Prob3" csv:"Prob3"`                  // Probability for the drop of Item3.
	Prob4         float64 `lua:"Prob4" csv:"Prob4"`                  // Probability for the drop of Item4.
	Prob5         float64 `lua:"Prob5" csv:"Prob5"`                  // Probability for the drop of Item5.
	Prob6         float64 `lua:"Prob6" csv:"Prob6"`                  // Probability for the drop of Item6.
	Prob7         float64 `lua:"Prob7" csv:"Prob7"`                  // Probability for the drop of Item7.
	Prob8         float64 `lua:"Prob8" csv:"Prob8"`                  // Probability for the drop of Item8.
	Prob9         float64 `lua:"Prob9" csv:"Prob9"`                  // Probability for the drop of Item9.
	Prob10        float64 `lua:"Prob10" csv:"Prob10"`                // Probability for the drop of Item10.
	Term          int     `lua:"Term" csv:"Term"`                    // Indicates the end of the Treasure Class data.
}

TreasureClass represents the Treasure Class from the original game.

type TreasureClassEx

type TreasureClassEx struct {
	TreasureClass     string  `csv:"Treasure Class"`    // Unique Treasure Class ID.
	Group             int     `csv:"group"`             // Treasure Class group ID for item drop calculation.
	Level             int     `csv:"level"`             // Level of the Treasure Class.
	Picks             int     `csv:"Picks"`             // Number of item drop chances rolled or total guaranteed quantity of item drops.
	Unique            float64 `csv:"Unique"`            // Modifies the item ratio drop for a Unique Quality item.
	Set               float64 `csv:"Set"`               // Modifies the item ratio drop for a Set Quality item.
	Rare              float64 `csv:"Rare"`              // Modifies the item ratio drop for a Rare Quality item.
	Magic             float64 `csv:"Magic"`             // Modifies the item ratio drop for a Magic Quality item.
	NoDrop            float64 `csv:"NoDrop"`            // Probability of no item dropping by the Treasure Class.
	Item1             string  `csv:"Item1"`             // Potential Item Type or other Treasure Class that can drop.
	Item2             string  `csv:"Item2"`             // Additional potential Item Type or Treasure Class.
	Item3             string  `csv:"Item3"`             // Additional potential Item Type or Treasure Class.
	Item4             string  `csv:"Item4"`             // Additional potential Item Type or Treasure Class.
	Item5             string  `csv:"Item5"`             // Additional potential Item Type or Treasure Class.
	Item6             string  `csv:"Item6"`             // Additional potential Item Type or Treasure Class.
	Item7             string  `csv:"Item7"`             // Additional potential Item Type or Treasure Class.
	Item8             string  `csv:"Item8"`             // Additional potential Item Type or Treasure Class.
	Item9             string  `csv:"Item9"`             // Additional potential Item Type or Treasure Class.
	Item10            string  `csv:"Item10"`            // Additional potential Item Type or Treasure Class.
	Prob1             float64 `csv:"Prob1"`             // Probability for the drop of Item1.
	Prob2             float64 `csv:"Prob2"`             // Probability for the drop of Item2.
	Prob3             float64 `csv:"Prob3"`             // Probability for the drop of Item3.
	Prob4             float64 `csv:"Prob4"`             // Probability for the drop of Item4.
	Prob5             float64 `csv:"Prob5"`             // Probability for the drop of Item5.
	Prob6             float64 `csv:"Prob6"`             // Probability for the drop of Item6.
	Prob7             float64 `csv:"Prob7"`             // Probability for the drop of Item7.
	Prob8             float64 `csv:"Prob8"`             // Probability for the drop of Item8.
	Prob9             float64 `csv:"Prob9"`             // Probability for the drop of Item9.
	Prob10            float64 `csv:"Prob10"`            // Probability for the drop of Item10.
	FirstLadderSeason int     `csv:"firstLadderSeason"` // Starting ladder season for rolling in ladder games (inclusive).
	LastLadderSeason  int     `csv:"lastLadderSeason"`  // Last ladder season for which the treasure class is ladder-only (inclusive).
	NoAlwaysDrop      bool    `csv:"noAlwaysDrop"`      // If true, this treasure class will roll normally when being forced to always drop.
}

TreasureClassEx represents the Treasure Class linked to a monster drop.

type UniquePrefix

type UniquePrefix struct {
	Name string `csv:"name"` // A string key, which is used as a potential selection for generating a unique monster’s name
}

UniquePrefix represents the data for unique monster name prefixes

type UniqueSuffix

type UniqueSuffix struct {
	Name string `csv:"name"` // A string key, which is used as a potential selection for generating a unique monster’s name
}

UniqueSuffix represents the data for unique monster name suffixes

type WarpCode

type WarpCode int

type WeaponClass

type WeaponClass struct {
	Name string        `csv:"Weapon Class"` // The name of the weapon class.
	Code WeaponClassID `csv:"Code"`         // The unique 3-letter/number code for the weapon class.
}

WeaponClass represents different weapon classes.

type WeaponClassID

type WeaponClassID string

WeaponClassID represents the base weapon class

const (
	// HandToHand represents the Hand to Hand weapon class
	HandToHand WeaponClassID = "hth"
	// OneHandedSwing represents the One Handed Swing weapon class
	OneHandedSwing WeaponClassID = "1hs"
	// OneHandedThrust represents the One Handed Thrust weapon class
	OneHandedThrust WeaponClassID = "1ht"
	// Bow represents the Bow weapon class
	Bow WeaponClassID = "bow"
	// TwoHandedSwing represents the Two Handed Swing weapon class
	TwoHandedSwing WeaponClassID = "2hs"
	// TwoHandedThrust represents the Two Handed Thrust weapon class
	TwoHandedThrust WeaponClassID = "2ht"
	// DualWieldingLeftJabRightSwing represents the Dual Wielding - Left Jab Right Swing weapon class
	DualWieldingLeftJabRightSwing WeaponClassID = "1js"
	// DualWieldingLeftJabRightThrust represents the Dual Wielding - Left Jab Right Thrust weapon class
	DualWieldingLeftJabRightThrust WeaponClassID = "1jt"
	// DualWieldingLeftSwingRightSwing represents the Dual Wielding - Left Swing Right Swing weapon class
	DualWieldingLeftSwingRightSwing WeaponClassID = "1ss"
	// DualWieldingLeftSwingRightThrust represents the Dual Wielding - Left Swing Right Thrust weapon class
	DualWieldingLeftSwingRightThrust WeaponClassID = "1st"
	// Staff represents the Staff weapon class
	Staff WeaponClassID = "stf"
	// Crossbow represents the Crossbow weapon class
	Crossbow WeaponClassID = "xbw"
	// OneHandToHand represents the One Hand to Hand weapon class
	OneHandToHand WeaponClassID = "ht1"
	// TwoHandToHand represents the Two Hand to Hand weapon class
	TwoHandToHand WeaponClassID = "ht2"
)

Source Files

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL