Add data structures, it requires tons of refactor but it's more or less working

This commit is contained in:
Héctor Giménez
2023-03-11 21:28:33 +09:00
parent 73978a702c
commit 8600c2e2f6
17 changed files with 4383 additions and 0 deletions

157
pkg/data/area/area.go Normal file
View File

@@ -0,0 +1,157 @@
package area
type Area int
func (a Area) IsTown() bool {
switch a {
case RogueEncampment, LutGholein, KurastDocks, ThePandemoniumFortress, Harrogath:
return true
}
return false
}
const (
Abaddon Area = 125
AncientTunnels Area = 65
ArcaneSanctuary Area = 74
ArreatPlateau Area = 112
ArreatSummit Area = 120
Barracks Area = 28
BlackMarsh Area = 6
BloodMoor Area = 2
BloodyFoothills Area = 110
BurialGrounds Area = 17
CanyonOfTheMagi Area = 46
CatacombsLevel1 Area = 34
CatacombsLevel2 Area = 35
CatacombsLevel3 Area = 36
CatacombsLevel4 Area = 37
Cathedral Area = 33
CaveLevel1 Area = 9
CaveLevel2 Area = 13
ChaosSanctuary Area = 108
CityOfTheDamned Area = 106
ClawViperTempleLevel1 Area = 58
ClawViperTempleLevel2 Area = 61
ColdPlains Area = 3
Crypt Area = 18
CrystallinePassage Area = 113
DarkWood Area = 5
DenOfEvil Area = 8
DisusedFane Area = 95
DisusedReliquary Area = 99
DrifterCavern Area = 116
DryHills Area = 42
DuranceOfHateLevel1 Area = 100
DuranceOfHateLevel2 Area = 101
DuranceOfHateLevel3 Area = 102
DurielsLair Area = 73
FarOasis Area = 43
FlayerDungeonLevel1 Area = 88
FlayerDungeonLevel2 Area = 89
FlayerDungeonLevel3 Area = 91
FlayerJungle Area = 78
ForgottenReliquary Area = 96
ForgottenSands Area = 134
ForgottenTemple Area = 97
ForgottenTower Area = 20
FrigidHighlands Area = 111
FrozenRiver Area = 114
FrozenTundra Area = 117
FurnaceOfPain Area = 135
GlacialTrail Area = 115
GreatMarsh Area = 77
HallsOfAnguish Area = 122
HallsOfPain Area = 123
HallsOfTheDeadLevel1 Area = 56
HallsOfTheDeadLevel2 Area = 57
HallsOfTheDeadLevel3 Area = 60
HallsOfVaught Area = 124
HaremLevel1 Area = 50
HaremLevel2 Area = 51
Harrogath Area = 109
HoleLevel1 Area = 11
HoleLevel2 Area = 15
IcyCellar Area = 119
InfernalPit Area = 127
InnerCloister Area = 32
JailLevel1 Area = 29
JailLevel2 Area = 30
JailLevel3 Area = 31
KurastBazaar Area = 80
KurastCauseway Area = 82
KurastDocks Area = 75
LostCity Area = 44
LowerKurast Area = 79
LutGholein Area = 40
MaggotLairLevel1 Area = 62
MaggotLairLevel2 Area = 63
MaggotLairLevel3 Area = 64
MatronsDen Area = 133
Mausoleum Area = 19
MonasteryGate Area = 26
MooMooFarm Area = 39
NihlathaksTemple Area = 121
None Area = 0
OuterCloister Area = 27
OuterSteppes Area = 104
PalaceCellarLevel1 Area = 52
PalaceCellarLevel2 Area = 53
PalaceCellarLevel3 Area = 54
PitLevel1 Area = 12
PitLevel2 Area = 16
PitOfAcheron Area = 126
PlainsOfDespair Area = 105
RiverOfFlame Area = 107
RockyWaste Area = 41
RogueEncampment Area = 1
RuinedFane Area = 98
RuinedTemple Area = 94
SewersLevel1Act2 Area = 47
SewersLevel1Act3 Area = 92
SewersLevel2Act2 Area = 48
SewersLevel2Act3 Area = 93
SewersLevel3Act2 Area = 49
SpiderCave Area = 84
SpiderCavern Area = 85
SpiderForest Area = 76
StonyField Area = 4
StonyTombLevel1 Area = 55
StonyTombLevel2 Area = 59
SwampyPitLevel1 Area = 86
SwampyPitLevel2 Area = 87
SwampyPitLevel3 Area = 90
TalRashasTomb1 Area = 66
TalRashasTomb2 Area = 67
TalRashasTomb3 Area = 68
TalRashasTomb4 Area = 69
TalRashasTomb5 Area = 70
TalRashasTomb6 Area = 71
TalRashasTomb7 Area = 72
TamoeHighland Area = 7
TheAncientsWay Area = 118
ThePandemoniumFortress Area = 103
TheWorldstoneChamber Area = 132
TheWorldStoneKeepLevel1 Area = 128
TheWorldStoneKeepLevel2 Area = 129
TheWorldStoneKeepLevel3 Area = 130
ThroneOfDestruction Area = 131
TowerCellarLevel1 Area = 21
TowerCellarLevel2 Area = 22
TowerCellarLevel3 Area = 23
TowerCellarLevel4 Area = 24
TowerCellarLevel5 Area = 25
Travincal Area = 83
Tristram Area = 38
UberTristram Area = 136
UndergroundPassageLevel1 Area = 10
UndergroundPassageLevel2 Area = 14
UpperKurast Area = 81
ValleyOfSnakes Area = 45
MapsAncientTemple Area = 137
MapsDesecratedTemple Area = 138
MapsFrigidPlateau Area = 139
MapsInfernalTrial Area = 140
MapsRuinedCitadel Area = 141
)

24
pkg/data/belt.go Normal file
View File

@@ -0,0 +1,24 @@
package game
import "strings"
const (
HealingPotion PotionType = "HealingPotion"
ManaPotion PotionType = "ManaPotion"
RejuvenationPotion PotionType = "RejuvenationPotion"
)
type Belt []Item
func (b Belt) GetFirstPotion(potionType PotionType) (Position, bool) {
for _, i := range b {
// Ensure potion is in row 0 and one of the four columns
if strings.Contains(string(i.Name), string(potionType)) && i.Position.Y == 0 && (i.Position.X == 0 || i.Position.X == 1 || i.Position.X == 2 || i.Position.X == 3) {
return i.Position, true
}
}
return Position{}, false
}
type PotionType string

205
pkg/data/data.go Normal file
View File

@@ -0,0 +1,205 @@
package game
import (
"github.com/hectorgimenez/d2go/pkg/data/area"
"github.com/hectorgimenez/d2go/pkg/data/skill"
"github.com/hectorgimenez/d2go/pkg/data/stat"
"github.com/hectorgimenez/d2go/pkg/data/state"
"strings"
)
// since stat.MaxLife is returning max life without stats, we are setting the max life value that we read from the
// game memory, overwriting this value each time it increases. It's not a good solution but it will provide
// more accurate values for the life %. This value is checked for each memory iteration.
var maxLife = 0
var maxLifeBO = 0
const (
goldPerLevel = 10000
// Monster Types
MonsterTypeNone MonsterType = "None"
MonsterTypeChampion MonsterType = "Champion"
MonsterTypeMinion MonsterType = "Minion"
MonsterTypeUnique MonsterType = "Unique"
MonsterTypeSuperUnique MonsterType = "SuperUnique"
)
type Data struct {
AreaOrigin Position
Corpse Corpse
Monsters Monsters
// First slice represents X and second Y
CollisionGrid [][]bool
PlayerUnit PlayerUnit
NPCs NPCs
Items Items
Objects Objects
AdjacentLevels []Level
Rooms []Room
OpenMenus OpenMenus
Roster Roster
}
type Room struct {
Position
Width int
Height int
}
func (r Room) GetCenter() Position {
return Position{
X: r.Position.X + r.Width/2,
Y: r.Position.Y + r.Height/2,
}
}
func (r Room) IsInside(p Position) bool {
if p.X >= r.X && p.X <= r.X+r.Width {
return p.Y >= r.Y && p.Y <= r.Y+r.Height
}
return false
}
func (d Data) MercHPPercent() int {
for _, m := range d.Monsters {
if m.IsMerc() {
// Hacky thing to read merc life properly
maxLife := m.Stats[stat.MaxLife] >> 8
life := float64(m.Stats[stat.Life] >> 8)
if m.Stats[stat.Life] <= 32768 {
life = float64(m.Stats[stat.Life]) / 32768.0 * float64(maxLife)
}
return int(life / float64(maxLife) * 100)
}
}
return 0
}
type RosterMember struct {
Name string
Area area.Area
Position Position
}
type Roster []RosterMember
func (r Roster) FindByName(name string) (RosterMember, bool) {
for _, rm := range r {
if strings.EqualFold(rm.Name, name) {
return rm, true
}
}
return RosterMember{}, false
}
type Level struct {
Area area.Area
Position Position
}
type Class string
type Corpse struct {
Found bool
IsHovered bool
Position Position
}
type Position struct {
X int
Y int
}
type PlayerUnit struct {
Name string
Area area.Area
Position Position
Stats map[stat.Stat]int
Skills map[skill.Skill]int
States state.States
}
func (pu PlayerUnit) MaxGold() int {
return goldPerLevel * pu.Stats[stat.Level]
}
func (pu PlayerUnit) HPPercent() int {
_, found := pu.Stats[stat.MaxLife]
if !found {
return 100
}
if maxLifeBO == 0 && maxLife == 0 {
maxLife = pu.Stats[stat.MaxLife]
maxLifeBO = pu.Stats[stat.MaxLife]
}
if pu.States.HasState(state.Battleorders) {
if maxLifeBO < pu.Stats[stat.Life] {
maxLifeBO = pu.Stats[stat.Life]
}
return int((float64(pu.Stats[stat.Life]) / float64(maxLifeBO)) * 100)
}
if maxLife < pu.Stats[stat.Life] {
maxLife = pu.Stats[stat.Life]
}
return int((float64(pu.Stats[stat.Life]) / float64(maxLife)) * 100)
}
func (pu PlayerUnit) MPPercent() int {
return int((float64(pu.Stats[stat.Mana]) / float64(pu.Stats[stat.MaxMana])) * 100)
}
func (pu PlayerUnit) HasDebuff() bool {
debuffs := []state.State{
state.Amplifydamage,
state.Attract,
state.Confuse,
state.Conversion,
state.Decrepify,
state.Dimvision,
state.Ironmaiden,
state.Lifetap,
state.Lowerresist,
state.Terror,
state.Weaken,
state.Convicted,
state.Conviction,
state.Poison,
state.Cold,
state.Slowed,
state.BloodMana,
state.DefenseCurse,
}
for _, s := range pu.States {
for _, d := range debuffs {
if s == d {
return true
}
}
}
return false
}
type PointOfInterest struct {
Name string
Position Position
}
type OpenMenus struct {
Inventory bool
LoadingScreen bool
NPCInteract bool
NPCShop bool
Stash bool
Waypoint bool
MapShown bool
}

View File

@@ -0,0 +1,9 @@
package difficulty
const (
Normal = "normal"
Nightmare = "nightmare"
Hell = "hell"
)
type Difficulty string

60
pkg/data/item/class.go Normal file
View File

@@ -0,0 +1,60 @@
package item
import "strings"
var classMapping = map[string][]string{
"Axes": {"HandAxe", "Axe", "DoubleAxe", "MilitaryPick", "WarAxe", "LargeAxe", "BroadAxe", "BattleAxe", "GreatAxe", "GiantAxe", "Hatchet", "Cleaver", "TwinAxe", "Crowbill", "Naga", "MilitaryAxe", "BeardedAxe", "Tabar", "GothicAxe", "AncientAxe", "Tomahawk", "SmallCrescent", "EttinAxe", "WarSpike", "BerserkerAxe", "FeralAxe", "SilverEdgedAxe", "Decapitator", "ChampionAxe", "GloriousAxe"},
"Wands": {"Wand", "YewWand", "BoneWand", "GrimWand", "BurntWand", "PetrifiedWand", "TombWand", "GraveWand", "PolishedWand", "GhostWand", "LichWand", "UnearthedWand"},
"Clubs": {"Club", "SpikedClub", "Cudgel", "BarbedClub", "Truncheon", "TyrantClub"},
"Scepters": {"Scepter", "GrandScepter", "WarScepter", "RuneScepter", "HolyWaterSprinkler", "DivineScepter", "MightyScepter", "SeraphRod", "Caduceus"},
"Maces": {"Mace", "MorningStar", "Flail", "FlangedMace", "JaggedStar", "Knout", "ReinforcedMace", "DevilStar", "Scourge"},
"Hammers": {"WarHammer", "Maul", "GreatMaul", "BattleHammer", "WarClub", "MartelDeFer", "LegendaryMallet", "OgreMaul", "ThunderMaul"},
"Swords": {"ShortSword", "Scimitar", "Sabre", "Falchion", "CrystalSword", "BroadSword", "LongSword", "WarSword", "TwoHandedSword", "Claymore", "GiantSword", "BastardSword", "Flamberge", "GreatSword", "Gladius", "Cutlass", "Shamshir", "Tulwar", "DimensionalBlade", "BattleSword", "RuneSword", "AncientSword", "Espandon", "DacianFalx", "TuskSword", "GothicSword", "Zweihander", "ExecutionerSword", "Falcata", "Ataghan", "ElegantBlade", "HydraEdge", "PhaseBlade", "ConquestSword", "CrypticSword", "MythicalSword", "LegendSword", "HighlandBlade", "BalrogBlade", "ChampionSword", "ColossusSword", "ColossusBlade"},
"Daggers": {"Dagger", "Dirk", "Kris", "Blade", "Poignard", "Rondel", "Cinquedeas", "Stiletto", "BoneKnife", "MithrilPoint", "FangedKnife", "LegendSpike"},
"ThrowingKnifes": {"ThrowingKnife", "BalancedKnife", "BattleDart", "WarDart", "FlyingKnife", "WingedKnife"},
"ThrowingAxes": {"ThrowingAxe", "BalancedAxe", "Francisca", "Hurlbat", "FlyingAxe", "WingedAxe"},
"Javelins": {"Javelin", "Pilum", "ShortSpear", "Glaive", "ThrowingSpear", "WarJavelin", "GreatPilum", "Simbilan", "Spiculum", "Harpoon", "HyperionJavelin", "StygianPilum", "BalrogSpear", "GhostGlaive", "WingedHarpoon"},
"Spears": {"Spear", "Trident", "Brandistock", "Spetum", "Pike", "WarSpear", "Fuscina", "WarFork", "Yari", "Lance", "HyperionSpear", "StygianPike", "Mancatcher", "GhostSpear", "WarPike"},
"Polearms": {"Bardiche", "Voulge", "Scythe", "Poleaxe", "Halberd", "WarScythe", "LochaberAxe", "Bill", "BattleScythe", "Partizan", "BecDeCorbin", "GrimScythe", "OgreAxe", "ColossusVoulge", "Thresher", "CrypticAxe", "GreatPoleaxe", "GiantThresher"},
"Staves": {"ShortStaff", "LongStaff", "GnarledStaff", "BattleStaff", "WarStaff", "JoStaff", "QuarterStaff", "CedarStaff", "GothicStaff", "RuneStaff", "WalkingStick", "Stalagmite", "ElderStaff", "Shillelagh", "ArchonStaff"},
"Bows": {"ShortBow", "HuntersBow", "LongBow", "CompositeBow", "ShortBattleBow", "LongBattleBow", "ShortWarBow", "LongWarBow", "EdgeBow", "RazorBow", "CedarBow", "DoubleBow", "ShortSiegeBow", "LargeSiegeBow", "RuneBow", "GothicBow", "SpiderBow", "BladeBow", "ShadowBow", "GreatBow", "DiamondBow", "CrusaderBow", "WardBow", "HydraBow"},
"Crossbows": {"LightCrossbow", "Crossbow", "HeavyCrossbow", "RepeatingCrossbow", "Arbalest", "SiegeCrossbow", "Ballista", "ChuKoNu", "PelletBow", "GorgonCrossbow", "ColossusCrossbow", "DemonCrossBow"},
"Helms": {"Cap", "SkullCap", "Helm", "FullHelm", "GreatHelm", "Crown", "Mask", "BoneHelm", "WarHat", "Sallet", "Casque", "Basinet", "WingedHelm", "GrandCrown", "DeathMask", "GrimHelm", "Shako", "Hydraskull", "Armet", "GiantConch", "SpiredHelm", "Corona", "DemonHead", "BoneVisage"},
"Armors": {"QuiltedArmor", "LeatherArmor", "HardLeatherArmor", "StuddedLeather", "RingMail", "ScaleMail", "ChainMail", "BreastPlate", "SplintMail", "PlateMail", "FieldPlate", "GothicPlate", "FullPlateMail", "AncientArmor", "LightPlate", "GhostArmor", "SerpentskinArmor", "DemonhideArmor", "TrellisedArmor", "LinkedMail", "TigulatedMail", "MeshArmor", "Cuirass", "RussetArmor", "TemplarCoat", "SharktoothArmor", "EmbossedPlate", "ChaosArmor", "OrnatePlate", "MagePlate", "DuskShroud", "Wyrmhide", "ScarabHusk", "WireFleece", "DiamondMail", "LoricatedMail", "Boneweave", "GreatHauberk", "BalrogSkin", "HellforgePlate", "KrakenShell", "LacqueredPlate", "ShadowPlate", "SacredArmor", "ArchonPlate"},
"Shields": {"Buckler", "SmallShield", "LargeShield", "KiteShield", "TowerShield", "GothicShield", "BoneShield", "SpikedShield", "Defender", "RoundShield", "Scutum", "DragonShield", "Pavise", "AncientShield", "GrimShield", "BarbedShield", "Heater", "Luna", "Hyperion", "Monarch", "Aegis", "Ward", "TrollNest", "BladeBarrier"},
"Gloves": {"LeatherGloves", "HeavyGloves", "ChainGloves", "LightGauntlets", "Gauntlets", "DemonhideGloves", "SharkskinGloves", "HeavyBracers", "BattleGauntlets", "WarGauntlets", "BrambleMitts", "VampireboneGloves", "Vambraces", "CrusaderGauntlets", "OgreGauntlets"},
"Boots": {"Boots", "HeavyBoots", "ChainBoots", "LightPlatedBoots", "Greaves", "DemonhideBoots", "SharkskinBoots", "MeshBoots", "BattleBoots", "WarBoots", "WyrmhideBoots", "ScarabshellBoots", "BoneweaveBoots", "MirroredBoots", "MyrmidonGreaves"},
"Belts": {"Sash", "LightBelt", "Belt", "HeavyBelt", "PlatedBelt", "DemonhideSash", "SharkskinBelt", "MeshBelt", "BattleBelt", "WarBelt", "SpiderwebSash", "VampirefangBelt", "MithrilCoil", "TrollBelt", "ColossusGirdle"},
"Circlets": {"Circlet", "Coronet", "Tiara", "Diadem"},
"AssassinKatars": {"Katar", "WristBlade", "HatchetHands", "Cestus", "Claws", "BladeTalons", "ScissorsKatar", "Quhab", "WristSpike", "Fascia", "HandScythe", "GreaterClaws", "GreaterTalons", "ScissorsQuhab", "Suwayyah", "WristSword", "WarFist", "BattleCestus", "FeralClaws", "RunicTalons", "ScissorsSuwayyah"},
"SorceressOrbs": {"EagleOrb", "SacredGlobe", "SmokedSphere", "ClaspedOrb", "JaredsStone", "GlowingOrb", "CrystallineGlobe", "CloudySphere", "SparklingBall", "SwirlingCrystal", "HeavenlyStone", "EldritchOrb", "DemonHeart", "VortexOrb", "DimensionalShard"},
"AmazonBows": {"StagBow", "ReflexBow", "AshwoodBow", "CeremonialBow", "MatriarchalBow", "GrandMatronBow"},
"AmazonSpears": {"MaidenSpear", "MaidenPike", "CeremonialSpear", "CeremonialPike", "MatriarchalSpear", "MatriarchalPike"},
"AmazonJavelins": {"MaidenJavelin", "CeremonialJavelin", "MatriarchalJavelin"},
"DruidHelms": {"WolfHead", "HawkHelm", "Antlers", "FalconMask", "SpiritMask", "AlphaHelm", "GriffonHeaddress", "HuntersGuise", "SacredFeathers", "TotemicMask", "BloodSpirit", "SunSpirit", "EarthSpirit", "SkySpirit", "DreamSpirit"},
"BarbarianHelms": {"JawboneCap", "FangedHelm", "HornedHelm", "AssaultHelmet", "AvengerGuard", "JawboneVisor", "LionHelm", "RageMask", "SavageHelmet", "SlayerGuard", "CarnageHelm", "FuryVisor", "DestroyerHelm", "ConquerorCrown", "GuardianCrown"},
"PaladinShields": {"Targe", "Rondache", "HeraldicShield", "AerinShield", "CrownShield", "AkaranTarge", "AkaranRondache", "ProtectorShield", "GildedShield", "RoyalShield", "SacredTarge", "SacredRondache", "KurastShield", "ZakarumShield", "VortexShield"},
"NecromancerShields": {"PreservedHead", "ZombieHead", "UnravellerHead", "GargoyleHead", "DemonHeadShield", "MummifiedTrophy", "FetishTrophy", "SextonTrophy", "CantorTrophy", "HierophantTrophy", "MinionSkull", "HellspawnSkull", "OverseerSkull", "SuccubusSkull", "BloodlordSkull"},
}
func IsClass(itemClass string) bool {
for class := range classMapping {
if strings.EqualFold(itemClass, class) {
return true
}
}
return false
}
func ClassForItemName(itemName string) (string, bool) {
for class, itemNames := range classMapping {
for _, name := range itemNames {
if strings.EqualFold(itemName, name) {
return class, true
}
}
}
return "", false
}

677
pkg/data/item/name.go Normal file
View File

@@ -0,0 +1,677 @@
package item
const (
ScrollOfTownPortal = "ScrollOfTownPortal"
ScrollOfIdentify = "ScrollOfIdentify"
TomeOfTownPortal = "TomeOfTownPortal"
TomeOfIdentify = "TomeOfIdentify"
Key = "Key"
)
func GetNameByEnum(itemNumber uint) Name {
return Name(available[itemNumber])
}
type Name string
var available = []string{
"HandAxe",
"Axe",
"DoubleAxe",
"MilitaryPick",
"WarAxe",
"LargeAxe",
"BroadAxe",
"BattleAxe",
"GreatAxe",
"GiantAxe",
"Wand",
"YewWand",
"BoneWand",
"GrimWand",
"Club",
"Scepter",
"GrandScepter",
"WarScepter",
"SpikedClub",
"Mace",
"MorningStar",
"Flail",
"WarHammer",
"Maul",
"GreatMaul",
"ShortSword",
"Scimitar",
"Sabre",
"Falchion",
"CrystalSword",
"BroadSword",
"LongSword",
"WarSword",
"TwoHandedSword",
"Claymore",
"GiantSword",
"BastardSword",
"Flamberge",
"GreatSword",
"Dagger",
"Dirk",
"Kris",
"Blade",
"ThrowingKnife",
"ThrowingAxe",
"BalancedKnife",
"BalancedAxe",
"Javelin",
"Pilum",
"ShortSpear",
"Glaive",
"ThrowingSpear",
"Spear",
"Trident",
"Brandistock",
"Spetum",
"Pike",
"Bardiche",
"Voulge",
"Scythe",
"Poleaxe",
"Halberd",
"WarScythe",
"ShortStaff",
"LongStaff",
"GnarledStaff",
"BattleStaff",
"WarStaff",
"ShortBow",
"HuntersBow",
"LongBow",
"CompositeBow",
"ShortBattleBow",
"LongBattleBow",
"ShortWarBow",
"LongWarBow",
"LightCrossbow",
"Crossbow",
"HeavyCrossbow",
"RepeatingCrossbow",
"RancidGasPotion",
"OilPotion",
"ChokingGasPotion",
"ExplodingPotion",
"StranglingGasPotion",
"FulminatingPotion",
"DecoyGidbinn",
"TheGidbinn",
"WirtsLeg",
"HoradricMalus",
"HellforgeHammer",
"HoradricStaff",
"StaffOfKings",
"Hatchet",
"Cleaver",
"TwinAxe",
"Crowbill",
"Naga",
"MilitaryAxe",
"BeardedAxe",
"Tabar",
"GothicAxe",
"AncientAxe",
"BurntWand",
"PetrifiedWand",
"TombWand",
"GraveWand",
"Cudgel",
"RuneScepter",
"HolyWaterSprinkler",
"DivineScepter",
"BarbedClub",
"FlangedMace",
"JaggedStar",
"Knout",
"BattleHammer",
"WarClub",
"MartelDeFer",
"Gladius",
"Cutlass",
"Shamshir",
"Tulwar",
"DimensionalBlade",
"BattleSword",
"RuneSword",
"AncientSword",
"Espandon",
"DacianFalx",
"TuskSword",
"GothicSword",
"Zweihander",
"ExecutionerSword",
"Poignard",
"Rondel",
"Cinquedeas",
"Stiletto",
"BattleDart",
"Francisca",
"WarDart",
"Hurlbat",
"WarJavelin",
"GreatPilum",
"Simbilan",
"Spiculum",
"Harpoon",
"WarSpear",
"Fuscina",
"WarFork",
"Yari",
"Lance",
"LochaberAxe",
"Bill",
"BattleScythe",
"Partizan",
"BecDeCorbin",
"GrimScythe",
"JoStaff",
"QuarterStaff",
"CedarStaff",
"GothicStaff",
"RuneStaff",
"EdgeBow",
"RazorBow",
"CedarBow",
"DoubleBow",
"ShortSiegeBow",
"LargeSiegeBow",
"RuneBow",
"GothicBow",
"Arbalest",
"SiegeCrossbow",
"Ballista",
"ChuKoNu",
"KhalimsFlail",
"KhalimsWill",
"Katar",
"WristBlade",
"HatchetHands",
"Cestus",
"Claws",
"BladeTalons",
"ScissorsKatar",
"Quhab",
"WristSpike",
"Fascia",
"HandScythe",
"GreaterClaws",
"GreaterTalons",
"ScissorsQuhab",
"Suwayyah",
"WristSword",
"WarFist",
"BattleCestus",
"FeralClaws",
"RunicTalons",
"ScissorsSuwayyah",
"Tomahawk",
"SmallCrescent",
"EttinAxe",
"WarSpike",
"BerserkerAxe",
"FeralAxe",
"SilverEdgedAxe",
"Decapitator",
"ChampionAxe",
"GloriousAxe",
"PolishedWand",
"GhostWand",
"LichWand",
"UnearthedWand",
"Truncheon",
"MightyScepter",
"SeraphRod",
"Caduceus",
"TyrantClub",
"ReinforcedMace",
"DevilStar",
"Scourge",
"LegendaryMallet",
"OgreMaul",
"ThunderMaul",
"Falcata",
"Ataghan",
"ElegantBlade",
"HydraEdge",
"PhaseBlade",
"ConquestSword",
"CrypticSword",
"MythicalSword",
"LegendSword",
"HighlandBlade",
"BalrogBlade",
"ChampionSword",
"ColossusSword",
"ColossusBlade",
"BoneKnife",
"MithrilPoint",
"FangedKnife",
"LegendSpike",
"FlyingKnife",
"FlyingAxe",
"WingedKnife",
"WingedAxe",
"HyperionJavelin",
"StygianPilum",
"BalrogSpear",
"GhostGlaive",
"WingedHarpoon",
"HyperionSpear",
"StygianPike",
"Mancatcher",
"GhostSpear",
"WarPike",
"OgreAxe",
"ColossusVoulge",
"Thresher",
"CrypticAxe",
"GreatPoleaxe",
"GiantThresher",
"WalkingStick",
"Stalagmite",
"ElderStaff",
"Shillelagh",
"ArchonStaff",
"SpiderBow",
"BladeBow",
"ShadowBow",
"GreatBow",
"DiamondBow",
"CrusaderBow",
"WardBow",
"HydraBow",
"PelletBow",
"GorgonCrossbow",
"ColossusCrossbow",
"DemonCrossBow",
"EagleOrb",
"SacredGlobe",
"SmokedSphere",
"ClaspedOrb",
"JaredsStone",
"StagBow",
"ReflexBow",
"MaidenSpear",
"MaidenPike",
"MaidenJavelin",
"GlowingOrb",
"CrystallineGlobe",
"CloudySphere",
"SparklingBall",
"SwirlingCrystal",
"AshwoodBow",
"CeremonialBow",
"CeremonialSpear",
"CeremonialPike",
"CeremonialJavelin",
"HeavenlyStone",
"EldritchOrb",
"DemonHeart",
"VortexOrb",
"DimensionalShard",
"MatriarchalBow",
"GrandMatronBow",
"MatriarchalSpear",
"MatriarchalPike",
"MatriarchalJavelin",
"Cap",
"SkullCap",
"Helm",
"FullHelm",
"GreatHelm",
"Crown",
"Mask",
"QuiltedArmor",
"LeatherArmor",
"HardLeatherArmor",
"StuddedLeather",
"RingMail",
"ScaleMail",
"ChainMail",
"BreastPlate",
"SplintMail",
"PlateMail",
"FieldPlate",
"GothicPlate",
"FullPlateMail",
"AncientArmor",
"LightPlate",
"Buckler",
"SmallShield",
"LargeShield",
"KiteShield",
"TowerShield",
"GothicShield",
"LeatherGloves",
"HeavyGloves",
"ChainGloves",
"LightGauntlets",
"Gauntlets",
"Boots",
"HeavyBoots",
"ChainBoots",
"LightPlatedBoots",
"Greaves",
"Sash",
"LightBelt",
"Belt",
"HeavyBelt",
"PlatedBelt",
"BoneHelm",
"BoneShield",
"SpikedShield",
"WarHat",
"Sallet",
"Casque",
"Basinet",
"WingedHelm",
"GrandCrown",
"DeathMask",
"GhostArmor",
"SerpentskinArmor",
"DemonhideArmor",
"TrellisedArmor",
"LinkedMail",
"TigulatedMail",
"MeshArmor",
"Cuirass",
"RussetArmor",
"TemplarCoat",
"SharktoothArmor",
"EmbossedPlate",
"ChaosArmor",
"OrnatePlate",
"MagePlate",
"Defender",
"RoundShield",
"Scutum",
"DragonShield",
"Pavise",
"AncientShield",
"DemonhideGloves",
"SharkskinGloves",
"HeavyBracers",
"BattleGauntlets",
"WarGauntlets",
"DemonhideBoots",
"SharkskinBoots",
"MeshBoots",
"BattleBoots",
"WarBoots",
"DemonhideSash",
"SharkskinBelt",
"MeshBelt",
"BattleBelt",
"WarBelt",
"GrimHelm",
"GrimShield",
"BarbedShield",
"WolfHead",
"HawkHelm",
"Antlers",
"FalconMask",
"SpiritMask",
"JawboneCap",
"FangedHelm",
"HornedHelm",
"AssaultHelmet",
"AvengerGuard",
"Targe",
"Rondache",
"HeraldicShield",
"AerinShield",
"CrownShield",
"PreservedHead",
"ZombieHead",
"UnravellerHead",
"GargoyleHead",
"DemonHeadShield",
"Circlet",
"Coronet",
"Tiara",
"Diadem",
"Shako",
"Hydraskull",
"Armet",
"GiantConch",
"SpiredHelm",
"Corona",
"DemonHead",
"DuskShroud",
"Wyrmhide",
"ScarabHusk",
"WireFleece",
"DiamondMail",
"LoricatedMail",
"Boneweave",
"GreatHauberk",
"BalrogSkin",
"HellforgePlate",
"KrakenShell",
"LacqueredPlate",
"ShadowPlate",
"SacredArmor",
"ArchonPlate",
"Heater",
"Luna",
"Hyperion",
"Monarch",
"Aegis",
"Ward",
"BrambleMitts",
"VampireboneGloves",
"Vambraces",
"CrusaderGauntlets",
"OgreGauntlets",
"WyrmhideBoots",
"ScarabshellBoots",
"BoneweaveBoots",
"MirroredBoots",
"MyrmidonGreaves",
"SpiderwebSash",
"VampirefangBelt",
"MithrilCoil",
"TrollBelt",
"ColossusGirdle",
"BoneVisage",
"TrollNest",
"BladeBarrier",
"AlphaHelm",
"GriffonHeaddress",
"HuntersGuise",
"SacredFeathers",
"TotemicMask",
"JawboneVisor",
"LionHelm",
"RageMask",
"SavageHelmet",
"SlayerGuard",
"AkaranTarge",
"AkaranRondache",
"ProtectorShield",
"GildedShield",
"RoyalShield",
"MummifiedTrophy",
"FetishTrophy",
"SextonTrophy",
"CantorTrophy",
"HierophantTrophy",
"BloodSpirit",
"SunSpirit",
"EarthSpirit",
"SkySpirit",
"DreamSpirit",
"CarnageHelm",
"FuryVisor",
"DestroyerHelm",
"ConquerorCrown",
"GuardianCrown",
"SacredTarge",
"SacredRondache",
"KurastShield",
"ZakarumShield",
"VortexShield",
"MinionSkull",
"HellspawnSkull",
"OverseerSkull",
"SuccubusSkull",
"BloodlordSkull",
"Elixir",
"INVALID509",
"INVALID510",
"INVALID511",
"INVALID512",
"StaminaPotion",
"AntidotePotion",
"RejuvenationPotion",
"FullRejuvenationPotion",
"ThawingPotion",
"TomeOfTownPortal",
"TomeOfIdentify",
"Amulet",
"AmuletOfTheViper",
"Ring",
"Gold",
"ScrollOfInifuss",
"KeyToTheCairnStones",
"Arrows",
"Torch",
"Bolts",
"ScrollOfTownPortal",
"ScrollOfIdentify",
"Heart",
"Brain",
"Jawbone",
"Eye",
"Horn",
"Tail",
"Flag",
"Fang",
"Quill",
"Soul",
"Scalp",
"Spleen",
"Key",
"TheBlackTowerKey",
"PotionOfLife",
"AJadeFigurine",
"TheGoldenBird",
"LamEsensTome",
"HoradricCube",
"HoradricScroll",
"MephistosSoulstone",
"BookOfSkill",
"KhalimsEye",
"KhalimsHeart",
"KhalimsBrain",
"Ear",
"ChippedAmethyst",
"FlawedAmethyst",
"Amethyst",
"FlawlessAmethyst",
"PerfectAmethyst",
"ChippedTopaz",
"FlawedTopaz",
"Topaz",
"FlawlessTopaz",
"PerfectTopaz",
"ChippedSapphire",
"FlawedSapphire",
"Sapphire",
"FlawlessSapphire",
"PerfectSapphire",
"ChippedEmerald",
"FlawedEmerald",
"Emerald",
"FlawlessEmerald",
"PerfectEmerald",
"ChippedRuby",
"FlawedRuby",
"Ruby",
"FlawlessRuby",
"PerfectRuby",
"ChippedDiamond",
"FlawedDiamond",
"Diamond",
"FlawlessDiamond",
"PerfectDiamond",
"MinorHealingPotion",
"LightHealingPotion",
"HealingPotion",
"GreaterHealingPotion",
"SuperHealingPotion",
"MinorManaPotion",
"LightManaPotion",
"ManaPotion",
"GreaterManaPotion",
"SuperManaPotion",
"ChippedSkull",
"FlawedSkull",
"Skull",
"FlawlessSkull",
"PerfectSkull",
"Herb",
"SmallCharm",
"LargeCharm",
"GrandCharm",
"INVALID606",
"INVALID607",
"INVALID608",
"INVALID609",
"ElRune",
"EldRune",
"TirRune",
"NefRune",
"EthRune",
"IthRune",
"TalRune",
"RalRune",
"OrtRune",
"ThulRune",
"AmnRune",
"SolRune",
"ShaelRune",
"DolRune",
"HelRune",
"IoRune",
"LumRune",
"KoRune",
"FalRune",
"LemRune",
"PulRune",
"UmRune",
"MalRune",
"IstRune",
"GulRune",
"VexRune",
"OhmRune",
"LoRune",
"SurRune",
"BerRune",
"JahRune",
"ChamRune",
"ZodRune",
"Jewel",
"MalahsPotion",
"ScrollOfKnowledge",
"ScrollOfResistance",
"KeyOfTerror",
"KeyOfHate",
"KeyOfDestruction",
"DiablosHorn",
"BaalsEye",
"MephistosBrain",
"TokenofAbsolution",
"TwistedEssenceOfSuffering",
"ChargedEssenceOfHatred",
"BurningEssenceOfTerror",
"FesteringEssenceOfDestruction",
"StandardOfHeroes",
}

31
pkg/data/item/quality.go Normal file
View File

@@ -0,0 +1,31 @@
package item
type Quality int
const (
QualityNormal Quality = 0x02
QualitySuperior Quality = 0x03
QualityMagic Quality = 0x04
QualitySet Quality = 0x05
QualityRare Quality = 0x06
QualityUnique Quality = 0x07
)
func (q Quality) ToString() string {
switch q {
case QualityNormal:
return "Normal"
case QualitySuperior:
return "Superior"
case QualityMagic:
return "Magic"
case QualitySet:
return "Set"
case QualityRare:
return "Rare"
case QualityUnique:
return "Unique"
}
return "UnknownItemQuality"
}

45
pkg/data/items.go Normal file
View File

@@ -0,0 +1,45 @@
package game
import (
"github.com/hectorgimenez/d2go/pkg/data/item"
"github.com/hectorgimenez/d2go/pkg/data/stat"
"strings"
)
type Items struct {
Belt Belt
Inventory Inventory
Shop []Item
Ground []Item
Equipped []Item
}
type Inventory []Item
type UnitID int
type Item struct {
UnitID
Name item.Name
Quality item.Quality
Position Position
Ethereal bool
IsHovered bool
Stats map[stat.Stat]int
Identified bool
IsVendor bool
}
func (i Item) IsPotion() bool {
return i.IsHealingPotion() || i.IsManaPotion() || i.IsRejuvPotion()
}
func (i Item) IsHealingPotion() bool {
return strings.Contains(string(i.Name), string(HealingPotion))
}
func (i Item) IsManaPotion() bool {
return strings.Contains(string(i.Name), string(ManaPotion))
}
func (i Item) IsRejuvPotion() bool {
return strings.Contains(string(i.Name), string(RejuvenationPotion))
}

115
pkg/data/npc.go Normal file
View File

@@ -0,0 +1,115 @@
package game
import (
"github.com/hectorgimenez/d2go/pkg/data/npc"
"github.com/hectorgimenez/d2go/pkg/data/stat"
)
type NPC struct {
ID npc.ID
Name string
Positions []Position
}
type MonsterType string
type Monster struct {
UnitID
Name npc.ID
IsHovered bool
Position Position
Stats map[stat.Stat]int
Type MonsterType
}
type Monsters []Monster
type NPCs []NPC
func (n NPCs) FindOne(npcid npc.ID) (NPC, bool) {
for _, np := range n {
if np.ID == npcid {
return np, true
}
}
return NPC{}, false
}
func (m Monsters) FindOne(id npc.ID, t MonsterType) (Monster, bool) {
for _, monster := range m {
if monster.Name == id {
if t == MonsterTypeNone || t == monster.Type {
return monster, true
}
}
}
return Monster{}, false
}
func (m Monsters) Enemies(filters ...MonsterFilter) []Monster {
monsters := make([]Monster, 0)
for _, mo := range m {
if !mo.IsMerc() {
monsters = append(monsters, mo)
}
}
for _, f := range filters {
monsters = f(monsters)
}
return monsters
}
type MonsterFilter func(m Monsters) []Monster
func MonsterEliteFilter() MonsterFilter {
return func(m Monsters) []Monster {
var filteredMonsters []Monster
for _, mo := range m {
if mo.Type == MonsterTypeMinion || mo.Type == MonsterTypeUnique || mo.Type == MonsterTypeChampion || mo.Type == MonsterTypeSuperUnique {
filteredMonsters = append(filteredMonsters, mo)
}
}
return filteredMonsters
}
}
func MonsterAnyFilter() MonsterFilter {
return func(m Monsters) []Monster {
return m
}
}
func (m Monsters) FindByID(id UnitID) (Monster, bool) {
for _, monster := range m {
if monster.UnitID == id {
return monster, true
}
}
return Monster{}, false
}
func (m Monster) IsImmune(resist stat.Resist) bool {
for st, value := range m.Stats {
// We only want max resistance
if value < 100 {
continue
}
if resist == stat.ColdImmune && st == stat.ColdResist {
return true
}
}
return false
}
func (m Monster) IsMerc() bool {
if m.Name == npc.Guard {
return true
}
return false
}

740
pkg/data/npc/npc.go Normal file
View File

@@ -0,0 +1,740 @@
package npc
type ID int
const (
Skeleton ID = iota
Returned
BoneWarrior
BurningDead
Horror
Zombie
HungryDead
Ghoul
DrownedCarcass
PlagueBearer
Afflicted
Tainted
Misshapen
Disfigured
Damned
FoulCrow
BloodHawk
BlackRaptor
CloudStalker
Fallen
Carver
Devilkin
DarkOne
WarpedFallen
Brute
Yeti
Crusher
WailingBeast
GargantuanBeast
SandRaer
Marauder
Invader
Infel
Assailant
Gorgon
Gorgon2
Gorgon3
Gorgon4
Ghost
Wraith
Specter
Apparition
DarkShape
DarkHunter
VileHunter
DarkStalker
BlackRogue
FleshHunter
DuneBeast
RockDweller
JungleHunter
DoomApe
TempleGuard
MoonClan
NightClan
BloodClan
HellClan
DeathClan
FallenShaman
CarverShaman
DevilkinShaman
DarkShaman
WarpedShaman
QuillRat
SpikeFiend
ThornBeast
RazorSpine
JungleUrchin
SandMaggot
RockWorm
Devourer
GiantLamprey
WorldKiller
TombViper
ClawViper
Salamander
PitViper
SerpentMagus
SandLeaper
CaveLeaper
TombCreeper
TreeLurker
RazorPitDemon
Huntress
SaberCat
NightTiger
HellCat
Itchies
BlackLocusts
PlagueBugs
HellSwarm
DungSoldier
SandWarrior
Scarab
SteelWeevil
AlbinoRoach
DriedCorpse
Decayed
Embalmed
PreservedDead
Cadaver
HollowOne
Guardian
Unraveler
HoradrimAncient
BaalSubjectMummy
ChaosHorde
ChaosHorde2
ChaosHorde3
ChaosHorde4
CarrionBird
UndeadScavenger
HellBuzzard
WingedNightmare
Sucker
Feeder
BloodHook
BloodWing
Gloam
SwampGhost
BurningSoul
BlackSoul
Arach
SandFisher
PoisonSpinner
FlameSper
SperMagus
ThornedHulk
BrambleHulk
Thrasher
Spikefist
GhoulLord
NightLord
DarkLord
BloodLord
Banished
DesertWing
Fiend
Gloombat
BloodDiver
DarkFamiliar
RatMan
Fetish
Flayer
SoulKiller
StygianDoll
DeckardCain
Gheed
Akara
Chicken
Kashya
Rat
Rogue
HellMeteor
Charsi
Warriv
Andariel
Bird
Bird2
Bat
DarkRanger
VileArcher
DarkArcher
BlackArcher
FleshArcher
DarkSpearwoman
VileLancer
DarkLancer
BlackLancer
FleshLancer
SkeletonArcher
ReturnedArcher
BoneArcher
BurningDeadArcher
HorrorArcher
Warriv2
Atma
Drognan
Fara
Cow
SandMaggotYoung
RockWormYoung
DevourerYoung
GiantLampreyYoung
WorldKillerYoung
Camel
Blunderbore
Gorbelly
Mauler
Urdar
SandMaggotEgg
RockWormEgg
DevourerEgg
GiantLampreyEgg
WorldKillerEgg
Act2Male
Act2Female
Act2Child
Greiz
Elzix
Geglash
Jerhyn
Lysander
Act2Guard
Act2Vendor
Act2Vendor2
FoulCrowNest
BloodHawkNest
BlackVultureNest
CloudStalkerNest
Meshif
Duriel
UndeadRatMan
UndeadFetish
UndeadFlayer
UndeadSoulKiller
UndeadStygianDoll
DarkGuard
DarkGuard2
DarkGuard3
DarkGuard4
DarkGuard5
BloodMage
BloodMage2
BloodMage3
BloodMage4
BloodMage5
Maggot
MummyGenerator
Radament
FireBeast
IceGlobe
LightningBeast
PoisonOrb
FlyingScimitar
Zakarumite
Faithful
Zealot
Sexton
Cantor
Heirophant
Heirophant2
Mephisto
Diablo
DeckardCain2
DeckardCain3
DeckardCain4
SwampDweller
BogCreature
SlimePrince
Summoner
Tyrael
Asheara
Hratli
Alkor
Ormus
Izual
Halbu
WaterWatcherLimb
RiverStalkerLimb
StygianWatcherLimb
WaterWatcherHead
RiverStalkerHead
StygianWatcherHead
Meshif2
DeckardCain5
Navi
BloodRaven
Bug
Scorpion
RogueScout
Rogue2
Rogue3
GargoyleTrap
ReturnedMage
BoneMage
BurningDeadMage
HorrorMage
RatManShaman
FetishShaman
FlayerShaman
SoulKillerShaman
StygianDollShaman
Larva
SandMaggotQueen
RockWormQueen
DevourerQueen
GiantLampreyQueen
WorldKillerQueen
ClayGolem
BloodGolem
IronGolem
FireGolem
Familiar
Act3Male
NightMarauder
Act3Female
Natalya
FleshSpawner
StygianHag
Grotesque
FleshBeast
StygianDog
GrotesqueWyrm
Groper
Strangler
StormCaster
Corpulent
CorpseSpitter
MawFiend
DoomKnight
AbyssKnight
OblivionKnight
QuillBear
SpikeGiant
ThornBrute
RazorBeast
GiantUrchin
Snake
Parrot
Fish
EvilHole
EvilHole2
EvilHole3
EvilHole4
EvilHole5
FireboltTrap
HorzMissileTrap
VertMissileTrap
PoisonCloudTrap
LightningTrap
Kaelan
InvisoSpawner
DiabloClone
SuckerNest
FeederNest
BloodHookNest
BloodWingNest
Guard
MiniSper
BonePrison
BonePrison2
BonePrison3
BonePrison4
BoneWall
CouncilMember
CouncilMember2
CouncilMember3
Turret
Turret2
Turret3
Hydra
Hydra2
Hydra3
MeleeTrap
SevenTombs
Decoy
Valkyrie
Act2Guard3
IronWolf
Balrog
PitLord
VenomLord
NecroSkeleton
NecroMage
Griswold
CompellingOrbNpc
Tyrael2
DarkWanderer
NovaTrap
SpiritMummy
LightningSpire
FireTower
Slinger
SpearCat
NightSlinger
HellSlinger
Act2Guard4
Act2Guard5
ReturnedMage2
BoneMage2
BaalColdMage
HorrorMage2
ReturnedMage3
BoneMage3
BurningDeadMage2
HorrorMage3
ReturnedMage4
BoneMage4
BurningDeadMage3
HorrorMage4
HellBovine
Window
Window2
SpearCat2
NightSlinger2
RatMan2
Fetish2
Flayer2
SoulKiller2
StygianDoll2
MephistoSpirit
TheSmith
TrappedSoul
TrappedSoul2
Jamella
Izual2
RatMan3
Malachai
Hephasto
WakeOfDestruction
ChargedBoltSentry
LightningSentry
BladeCreeper
InvisiblePet
InfernoSentry
DeathSentry
ShadowWarrior
ShadowMaster
DruHawk
DruSpiritWolf
DruFenris
SpiritOfBarbs
HeartOfWolverine
OakSage
DruPlaguePoppy
DruCycleOfLife
VineCreature
DruBear
Eagle
Wolf
Bear
BarricadeDoor
BarricadeDoor2
PrisonDoor
BarricadeTower
RotWalker
ReanimatedHorde
ProwlingDead
UnholyCorpse
DefiledWarrior
SiegeBeast
CrushBiest
BloodBringer
GoreBearer
DeamonSteed
SnowYeti
SnowYeti2
SnowYeti3
SnowYeti4
WolfRer
WolfRer2
WolfRer3
MinionExp
SlayerExp
IceBoar
FireBoar
HellSpawn
IceSpawn
GreaterHellSpawn
GreaterIceSpawn
FanaticMinion
BerserkSlayer
ConsumedIceBoar
ConsumedFireBoar
FrenziedHellSpawn
FrenziedIceSpawn
InsaneHellSpawn
InsaneIceSpawn
SuccubusExp
VileTemptress
StygianHarlot
HellTemptress
BloodTemptress
Dominus
VileWitch
StygianFury
BloodWitch
HellWitch
OverSeer
Lasher
OverLord
BloodBoss
HellWhip
MinionSpawner
MinionSlayerSpawner
MinionBoarSpawner
MinionBoarSpawner2
MinionSpawnSpawner
MinionBoarSpawner3
MinionBoarSpawner4
MinionSpawnSpawner2
Imp
Imp2
Imp3
Imp4
Imp5
CatapultS
CatapultE
CatapultSiege
CatapultW
FrozenHorror
FrozenHorror2
FrozenHorror3
FrozenHorror4
FrozenHorror5
BloodLord2
BloodLord3
BloodLord4
BloodLord5
BloodLord6
Larzuk
Drehya
Malah
NihlathakTown
QualKehk
CatapultSpotterS
CatapultSpotterE
CatapultSpotterSiegeName
CatapultSpotterW
DeckardCain6
Tyrael3
Act5Combatant
Act5Combatant2
BarricadeWallRight
BarricadeWallLeft
Nihlathak
Drehya2
EvilHut
DeathMauler
DeathMauler2
DeathMauler3
DeathMauler4
DeathMauler5
POW
Act5Townguard
Act5Townguard2
AncientStatue
AncientStatueNpc2
AncientStatueNpc3
AncientBarbarian
AncientBarbarian2
AncientBarbarian3
BaalThrone
BaalCrab
BaalTaunt
PutrDefiler
PutrDefiler2
PutrDefiler3
PutrDefiler4
PutrDefiler5
PainWorm
PainWorm2
PainWorm3
PainWorm4
PainWorm5
Bunny
CouncilMemberBall
VenomLord2
BaalCrabToStairs
Act5Hireling1Hand
Act5Hireling2Hand
BaalTentacle
BaalTentacle2
BaalTentacle3
BaalTentacle4
BaalTentacle5
InjuredBarbarian
InjuredBarbarian2
InjuredBarbarian3
BaalCrabClone
BaalsMinion
BaalsMinion2
BaalsMinion3
WorldstoneEffect
BurningDeadArcher2
BoneArcher2
BurningDeadArcher3
ReturnedArcher2
HorrorArcher2
Afflicted2
Tainted2
Misshapen2
Disfigured2
Damned2
MoonClan2
NightClan2
HellClan2
BloodClan2
DeathClan2
FoulCrow2
BloodHawk2
BlackRaptor2
CloudStalker2
ClawViper2
PitViper2
Salamander2
TombViper2
SerpentMagus2
Marauder2
Infel2
SandRaer2
Invader2
Assailant2
DeathMauler6
QuillRat2
SpikeFiend2
RazorSpine2
CarrionBird2
ThornedHulk2
Slinger2
Slinger3
Slinger4
VileArcher2
DarkArcher2
VileLancer2
DarkLancer2
BlackLancer2
Blunderbore2
Mauler2
ReturnedMage5
BurningDeadMage4
ReturnedMage6
HorrorMage5
BoneMage5
HorrorMage6
HorrorMage7
Huntress2
SaberCat2
CaveLeaper2
TombCreeper2
Ghost2
Wraith2
Specter2
SuccubusExp2
HellTemptress2
Dominus2
HellWitch2
VileWitch2
Gloam2
BlackSoul2
BurningSoul2
Carver2
Devilkin2
DarkOne2
CarverShaman2
DevilkinShaman2
DarkShaman2
BoneWarrior2
Returned2
Gloombat2
Fiend2
BloodLord7
BloodLord8
Scarab2
SteelWeevil2
Flayer3
StygianDoll3
SoulKiller3
Flayer4
StygianDoll4
SoulKiller4
FlayerShaman2
StygianDollShaman2
SoulKillerShaman2
TempleGuard2
TempleGuard3
Guardian2
Unraveler2
HoradrimAncient2
HoradrimAncient3
Zealot2
Zealot3
Heirophant3
Heirophant4
Grotesque2
FleshSpawner2
GrotesqueWyrm2
FleshBeast2
WorldKiller2
WorldKillerYoung2
WorldKillerEgg2
SlayerExp2
HellSpawn2
GreaterHellSpawn2
Arach2
Balrog2
PitLord2
Imp6
Imp7
UndeadStygianDoll2
UndeadSoulKiller2
Strangler2
StormCaster2
MawFiend2
BloodLord9
GhoulLord2
DarkLord2
UnholyCorpse2
DoomKnight2
DoomKnight3
OblivionKnight2
OblivionKnight3
Cadaver2
UberMephisto
UberDiablo
UberIzual
Lilith
UberDuriel
UberBaal
EvilHut2
DemonHole
PitLord3
OblivionKnight4
Imp8
HellSwarm2
WorldKiller3
Arach3
SteelWeevil3
HellTemptress3
VileWitch3
FleshHunter2
DarkArcher3
BlackLancer3
HellWhip2
Returned3
HorrorArcher3
BurningDeadMage5
HorrorMage8
BoneMage6
HorrorMage9
DarkLord3
Specter3
BurningSoul3
)

View File

@@ -0,0 +1,9 @@
package object
type InteractType uint
const (
InteractTypeNone InteractType = 0x00
InteractTypeTrap InteractType = 0x04
InteractTypeLocked InteractType = 0x80
)

582
pkg/data/object/type.go Normal file
View File

@@ -0,0 +1,582 @@
package object
type Name int
const (
NotApplicable Name = iota - 1
TestData1
Casket5
Shrine
Casket6
LargeUrn1
LargeChestRight
LargeChestLeft
Barrel
TowerTome
Urn2
Bench
BarrelExploding
RogueFountain
DoorGateLeft
DoorGateRight
DoorWoodenLeft
DoorWoodenRight
CairnStoneAlpha
CairnStoneBeta
CairnStoneGamma
CairnStoneDelta
CairnStoneLambda
CairnStoneTheta
DoorCourtyardLeft
DoorCourtyardRight
DoorCathedralDouble
CainGibbet
DoorMonasteryDoubleRight
HoleAnim
Brazier
InifussTree
Fountain
Crucifix
Candles1
Candles2
Standard1
Standard2
Torch1Tiki
Torch2Wall
RogueBonfire
River1
River2
River3
River4
River5
AmbientSoundGenerator
Crate
AndarielDoor
RogueTorch1
RogueTorch2
CasketR
CasketL
Urn3
Casket
RogueCorpse1
RogueCorpse2
RogueCorpseRolling
CorpseOnStick1
CorpseOnStick2
TownPortal
PermanentTownPortal
InvisibleObject
DoorCathedralLeft
DoorCathedralRight
DoorWoodenLeft2
InvisibleRiverSound1
InvisibleRiverSound2
Ripple1
Ripple2
Ripple3
Ripple4
ForestNightSound1
ForestNightSound2
YetiDung
TrappDoor
DoorByAct2Dock
SewerDrip
HealthOrama
InvisibleTownSound
Casket3
Obelisk
ForestAltar
BubblingPoolOfBlood
HornShrine
HealingWell
BullHealthShrine
SteleDesertMagicShrine
TombLargeChestL
TombLargeChestR
Sarcophagus
DesertObelisk
TombDoorLeft
TombDoorRight
InnerHellManaShrine
LargeUrn4
LargeUrn5
InnerHellHealthShrine
InnerHellShrine
TombDoorLeft2
TombDoorRight2
DurielsLairPortal
Brazier3
FloorBrazier
Flies
ArmorStandRight
ArmorStandLeft
WeaponRackRight
WeaponRackLeft
Malus
PalaceHealthShrine
Drinker
Fountain1
Gesturer
DesertFountain
Turner
Fountain3
SnakeWomanShrine
JungleTorch
Fountain4
WaypointPortal
DungeonHealthShrine
JerhynPlaceHolder1
JerhynPlaceHolder2
InnerHellShrine2
InnerHellShrine3
InnerHellHiddenStash
InnerHellSkullPile
InnerHellHiddenStash2
InnerHellHiddenStash3
SecretDoor1
Act1WildernessWell
VileDogAfterglow
CathedralWell
ArcaneSanctuaryShrine
DesertShrine2
DesertShrine3
DesertShrine1
DesertWell
CaveWell
Act1LargeChestRight
Act1TallChestRight
Act1MediumChestRight
DesertJug1
DesertJug2
Act1LargeChest1
InnerHellWaypoint
Act2MediumChestRight
Act2LargeChestRight
Act2LargeChestLeft
TaintedSunAltar
DesertShrine5
DesertShrine4
HoradricOrifice
TyraelsDoor
GuardCorpse
HiddenStashRock
Act2Waypoint
Act1WildernessWaypoint
SkeletonCorpseIsAnOxymoron
HiddenStashRockB
SmallFire
MediumFire
LargeFire
Act1CliffHidingSpot
ManaWell1
ManaWell2
ManaWell3
ManaWell4
ManaWell5
HollowLog
JungleHealWell
SkeletonCorpseIsStillAnOxymoron
DesertHealthShrine
ManaWell7
LooseRock
LooseBoulder
MediumChestLeft
LargeChestLeft2
GuardCorpseOnAStick
Bookshelf1
Bookshelf2
JungleChest
TombCoffin
JungleMediumChestLeft
JungleShrine2
JungleStashObject1
JungleStashObject2
JungleStashObject3
JungleStashObject4
DummyCainPortal
JungleShrine3
JungleShrine4
TeleportationPad1
LamEsensTome
StairsL
StairsR
FloorTrap
JungleShrine5
TallChestLeft
MephistoShrine1
MephistoShrine2
MephistoShrine3
MephistoManaShrine
MephistoLair
StashBox
StashAltar
MafistoHealthShrine
Act3WaterRocks
Basket1
Basket2
Act3WaterLogs
Act3WaterRocksGirl
Act3WaterBubbles
Act3WaterLogsX
Act3WaterRocksB
Act3WaterRocksGirlC
Act3WaterRocksY
Act3WaterLogsZ
WebCoveredTree1
WebCoveredTree2
WebCoveredTree3
WebCoveredTree4
Pillar
Cocoon
Cocoon2
SkullPileH1
OuterHellShrine
Act3WaterRocksGirlW
Act3BigLog
SlimeDoor1
SlimeDoor2
OuterHellShrine2
OuterHellShrine3
PillarH2
Act3BigLogC
Act3BigLogD
HellHealthShrine
Act3TownWaypoint
WaypointH
BurningBodyTown
Gchest1L
Gchest2R
Gchest3R
GLchest3L
SewersRatNest
BurningBodyTown2
SewersRatNest2
Act1BedBed1
Act1BedBed2
HellManaShrine
ExplodingCow
GidbinnAltar
GidbinnAltarDecoy
DiabloRightLight
DiabloLeftLight
DiabloStartPoint
Act1CabinStool
Act1CabinWood
Act1CabinWood2
HellSkeletonSpawnNW
Act1HolyShrine
TombsFloorTrapSpikes
Act1CathedralShrine
Act1JailShrine1
Act1JailShrine2
Act1JailShrine3
MaggotLairGooPile
Bank
WirtCorpse
GoldPlaceHolder
GuardCorpse2
DeadVillager1
DeadVillager2
DummyFlameNoDamage
TinyPixelShapedThingie
CavesHealthShrine
CavesManaShrine
CaveMagicShrine
Act3DungeonManaShrine
Act3SewersMagicShrine1
Act3SewersHealthWell
Act3SewersManaWell
Act3SewersMagicShrine2
Act2BrazierCeller
Act2TombAnubisCoffin
Act2Brazier
Act2BrazierTall
Act2BrazierSmall
Act2CellerWaypoint
HarumBedBed
IronGrateDoorLeft
IronGrateDoorRight
WoodenGrateDoorLeft
WoodenGrateDoorRight
WoodenDoorLeft
WoodenDoorRight
TombsWallTorchLeft
TombsWallTorchRight
ArcaneSanctuaryPortal
Act2HaramMagicShrine1
Act2HaramMagicShrine2
MaggotHealthWell
MaggotManaWell
ArcaneSanctuaryMagicShrine
TeleportationPad2
TeleportationPad3
TeleportationPad4
DummyArcaneThing1
DummyArcaneThing2
DummyArcaneThing3
DummyArcaneThing4
DummyArcaneThing5
DummyArcaneThing6
DummyArcaneThing7
HaremDeadGuard1
HaremDeadGuard2
HaremDeadGuard3
HaremDeadGuard4
HaremEunuchBlocker
ArcaneHealthWell
ArcaneManaWell
TestData2
Act2TombWell
Act2SewerWaypoint
Act3TravincalWaypoint
Act3SewerMagicShrine
Act3SewerDeadBody
Act3SewerTorch
Act3KurastTorch
MafistoLargeChestLeft
MafistoLargeChestRight
MafistoMediumChestLeft
MafistoMediumChestRight
SpiderLairLargeChestLeft
SpiderLairTallChestLeft
SpiderLairMediumChestRight
SpiderLairTallChestRight
SteegStone
GuildVault
TrophyCase
MessageBoard
MephistoBridge
HellGate
Act3KurastManaWell
Act3KurastHealthWell
HellFire1
HellFire2
HellFire3
HellLava1
HellLava2
HellLava3
HellLightSource1
HellLightSource2
HellLightSource3
HoradricCubeChest
HoradricScrollChest
StaffOfKingsChest
YetAnotherTome
HellBrazier1
HellBrazier2
DungeonRockPile
Act3DungeonMagicShrine
Act3DungeonBasket
OuterHellHungSkeleton
GuyForDungeon
Act3DungeonCasket
Act3SewerStairs
Act3SewerStairsToLevel3
DarkWandererStartPosition
TrappedSoulPlaceHolder
Act3TownTorch
LargeChestR
InnerHellBoneChest
HellSkeletonSpawnNE
Act3WaterFog
DummyNotUsed
HellForge
GuildPortal
HratliStartPosition
HratliEndPosition
BurningTrappedSoul1
BurningTrappedSoul2
NatalyaStartPosition
StuckedTrappedSoul1
StuckedTrappedSoul2
CainStartPosition
StairSR
ArcaneLargeChestLeft
ArcaneCasket
ArcaneLargeChestRight
ArcaneSmallChestLeft
ArcaneSmallChestRight
DiabloSeal1
DiabloSeal2
DiabloSeal3
DiabloSeal4
DiabloSeal5
SparklyChest
PandamoniumFortressWaypoint
InnerHellFissure
HellMesaBrazier
Smoke
ValleyWaypoint
HellBrazier3
CompellingOrb
KhalimChest1
KhalimChest2
KhalimChest3
SiegeMachineControl
PotOTorch
PyoxFirePit
ExpansionChestRight
ExpansionWildernessShrine1
ExpansionWildernessShrine2
ExpansionHiddenStash
ExpansionWildernessFlag
ExpansionWildernessBarrel
ExpansionSiegeBarrel
ExpansionWoodChestLeft
ExpansionWildernessShrine3
ExpansionManaShrine
ExpansionHealthShrine
BurialChestLeft
BurialChestRight
ExpansionWell
ExpansionWildernessShrine4
ExpansionWildernessShrine5
ExpansionWaypoint
ExpansionChestLeft
ExpansionWoodChestRight
ExpansionSmallChestLeft
ExpansionSmallChestRight
ExpansionTorch1
ExpansionCampFire
ExpansionTownTorch
ExpansionTorch2
ExpansionBurningBodies
ExpansionBurningPit
ExpansionTribalFlag
ExpansionTownFlag
ExpansionChandelier
ExpansionJar1
ExpansionJar2
ExpansionJar3
ExpansionSwingingHeads
ExpansionWildernessPole
AnimatedSkullAndRockPile
ExpansionTownGate
SkullAndRockPile
SiegeHellGate
EnemyCampBanner1
EnemyCampBanner2
ExpansionExplodingChest
ExpansionSpecialChest
ExpansionDeathPole
ExpansionDeathPoleLeft
TempleAltar
DrehyaTownStartPosition
DrehyaWildernessStartPosition
NihlathakTownStartPosition
NihlathakWildernessStartPositionName
IceCaveHiddenStash
IceCaveHealthShrine
IceCaveManaShrine
IceCaveEvilUrn
IceCaveJar1
IceCaveJar2
IceCaveJar3
IceCaveJar4
IceCaveJar5
IceCaveMagicShrine
CagedWussie
AncientStatue3
AncientStatue1
AncientStatue2
DeadBarbarian
ClientSmoke
IceCaveMagicShrine2
IceCaveTorch1
IceCaveTorch2
ExpansionTikiTorch
WorldstoneManaShrine
WorldstoneHealthShrine
WorldstoneTomb1
WorldstoneTomb2
WorldstoneTomb3
WorldstoneMagicShrine
WorldstoneTorch1
WorldstoneTorch2
ExpansionSnowyManaShrine1
ExpansionSnowyHealthShrine
ExpansionSnowyWell
WorldstoneWaypoint
ExpansionSnowyMagicShrine2
ExpansionWildernessWaypoint
ExpansionSnowyMagicShrine3
WorldstoneWell
WorldstoneMagicShrine2
ExpansionSnowyObject1
ExpansionSnowyWoodChestLeft
ExpansionSnowyWoodChestRight
WorldstoneMagicShrine3
ExpansionSnowyWoodChest2Left
ExpansionSnowyWoodChest2Right
SnowySwingingHeads
SnowyDebris
PenBreakableDoor
ExpansionTempleMagicShrine1
ExpansionSnowyPoleMR
IceCaveWaypoint
ExpansionTempleMagicShrine2
ExpansionTempleWell
ExpansionTempleTorch1
ExpansionTempleTorch2
ExpansionTempleObject1
ExpansionTempleObject2
WorldstoneMrBox
IceCaveWell
ExpansionTempleMagicShrine
ExpansionTempleHealthShrine
ExpansionTempleManaShrine
BlacksmithForge
WorldstoneTomb1Left
WorldstoneTomb2Left
WorldstoneTomb3Left
IceCaveBubblesU
IceCaveBubblesS
RedBaalsLairTomb1
RedBaalsLairTomb1Left
RedBaalsLairTomb2
RedBaalsLairTomb2Left
RedBaalsLairTomb3
RedBaalsLairTomb3Left
RedBaalsLairMrBox
RedBaalsLairTorch1
RedBaalsLairTorch2
CandlesTemple
TempleWaypoint
ExpansionDeadPerson1
TempleGroundTomb
LarzukGreeting
LarzukStandard
TempleGroundTombLeft
ExpansionDeadPerson2
AncientsAltar
ArreatSummitDoorToWorldstone
ExpansionWeaponRackRight
ExpansionWeaponRackLeft
ExpansionArmorStandRight
ExpansionArmorStandLeft
ArreatsSummitTorch2
ExpansionFuneralSpire
ExpansionBurningLogs
IceCaveSteam
ExpansionDeadPerson3
BaalsLair
FrozenAnya
BBQBunny
BaalTorchBig
InvisibleAncient
InvisibleBase
BaalsPortal
ArreatSummitDoor
LastPortal
LastLastPortal
ZooTestData
KeeperTestData
BaalsPortal2
FirePlaceGuy
DoorBlocker1
DoorBlocker2
// Added manually
GoodChest Name = 580
NotSoGoodChestName = 581
)

58
pkg/data/objects.go Normal file
View File

@@ -0,0 +1,58 @@
package game
import "github.com/hectorgimenez/d2go/pkg/data/object"
type Object struct {
Name object.Name
IsHovered bool
Selectable bool
InteractType object.InteractType
Position Position
}
type Objects []Object
func (o Objects) FindOne(name object.Name) (Object, bool) {
for _, obj := range o {
if obj.Name == name {
return obj, true
}
}
return Object{}, false
}
func (o Object) IsWaypoint() bool {
return o.Name == object.WaypointPortal || o.Name == object.Act2Waypoint || o.Name == object.Act3TownWaypoint || o.Name == object.PandamoniumFortressWaypoint || o.Name == object.ExpansionWaypoint
}
func (o Object) IsPortal() bool {
return o.Name == object.TownPortal
}
func (o Object) IsRedPortal() bool {
return o.Name == object.PermanentTownPortal
}
func (o Object) IsChest() bool {
switch o.Name {
case 1, 3, 5, 6, 50, 51, 53, 54, 55, 56, 57, 58, 79, 87, 88, 89, 125, 126, 127, 128, 139, 140, 141, 144, 146, 147,
148, 154, 155, 158, 159, 169, 171, 174, 175, 176, 177, 178, 181, 182, 183, 185, 186, 187, 188, 198, 203, 204, 205,
223, 224, 225, 240, 241, 242, 243, 244, 247, 248, 266, 268, 270, 271, 272, 274, 284, 314, 315, 316, 317, 326, 329,
330, 331, 332, 333, 334, 335, 336, 354, 355, 356, 360, 371, 372, 380, 381, 383, 384, 387, 388, 389, 390, 391, 397,
405, 406, 407, 413, 416, 420, 424, 425, 430, 431, 432, 433, 454, 455, 463, 466, 485, 486, 487, 501, 502, 504, 505,
518, 524, 525, 526, 529, 530, 531, 532, 533, 534, 535, 540, 541, 544, 545, 556, 580, 581:
return true
}
return false
}
func (o Object) IsSuperChest() bool {
switch o.Name {
case 104, 105, 106, 107, 181, 183, 580, 397, 387, 389, 390, 391, 455:
return true
}
return false
}

365
pkg/data/skill/skills.go Normal file
View File

@@ -0,0 +1,365 @@
package skill
type Skill int16
const (
AttackSkill Skill = iota
Kick
Throw
Unsummon
LeftHandThrow
LeftHandSwing
MagicArrow
FireArrow
InnerSight
CriticalStrike
Jab
ColdArrow
MultipleShot
Dodge
PowerStrike
PoisonJavelin
ExplodingArrow
SlowMissiles
Avoid
Impale
LightningBolt
IceArrow
GuidedArrow
Penetrate
ChargedStrike
PlagueJavelin
Strafe
ImmolationArrow
Decoy
Evade
Fend
FreezingArrow
Valkyrie
Pierce
LightningStrike
LightningFury
FireBolt
Warmth
ChargedBolt
IceBolt
FrozenArmor
Inferno
StaticField
Telekinesis
FrostNova
IceBlast
Blaze
FireBall
Nova
Lightning
ShiverArmor
FireWall
Enchant
ChainLightning
Teleport
GlacialSpike
Meteor
ThunderStorm
EnergyShield
Blizzard
ChillingArmor
FireMastery
Hydra
LightningMastery
FrozenOrb
ColdMastery
AmplifyDamage
Teeth
BoneArmor
SkeletonMastery
RaiseSkeleton
DimVision
Weaken
PoisonDagger
CorpseExplosion
ClayGolem
IronMaiden
Terror
BoneWall
GolemMastery
RaiseSkeletalMage
Confuse
LifeTap
PoisonExplosion
BoneSpear
BloodGolem
Attract
Decrepify
BonePrison
SummonResist
IronGolem
LowerResist
PoisonNova
BoneSpirit
FireGolem
Revive
Sacrifice
Smite
Might
Prayer
ResistFire
HolyBolt
HolyFire
Thorns
Defiance
ResistCold
Zeal
Charge
BlessedAim
Cleansing
ResistLightning
Vengeance
BlessedHammer
Concentration
HolyFreeze
Vigor
Conversion
HolyShield
HolyShock
Sanctuary
Meditation
FistOfTheHeavens
Fanaticism
Conviction
Redemption
Salvation
Bash
BladeMastery
AxeMastery
MaceMastery
Howl
FindPotion
Leap
DoubleSwing
PolearmMastery
ThrowingMastery
SpearMastery
Taunt
Shout
Stun
DoubleThrow
IncreasedStamina
FindItem
LeapAttack
Concentrate
IronSkin
BattleCry
Frenzy
IncreasedSpeed
BattleOrders
GrimWard
Whirlwind
Berserk
NaturalResistance
WarCry
BattleCommand
FireHit
UnHolyBolt
SkeletonRaise
MaggotEgg
ShamanFire
MagottUp
MagottDown
MagottLay
AndrialSpray
Jump
SwarmMove
Nest
QuickStrike
VampireFireball
VampireFirewall
VampireMeteor
GargoyleTrap
SpiderLay
VampireHeal
VampireRaise
Submerge
FetishAura
FetishInferno
ZakarumHeal
Emerge
Resurrect
Bestow
MissileSkill1
MonTeleport
PrimeLightning
PrimeBolt
PrimeBlaze
PrimeFirewall
PrimeSpike
PrimeIceNova
PrimePoisonball
PrimePoisonNova
DiabLight
DiabCold
DiabFire
FingerMageSpider
DiabWall
DiabRun
DiabPrison
PoisonBallTrap
AndyPoisonBolt
HireableMissile
DesertTurret
ArcaneTower
MonBlizzard
Mosquito
CursedBallTrapRight
CursedBallTrapLeft
MonFrozenArmor
MonBoneArmor
MonBoneSpirit
MonCurseCast
HellMeteor
RegurgitatorEat
MonFrenzy
QueenDeath
ScrollOfIdentify
TomeOfIdentify
ScrollOfTownPortal
TomeOfTownPortal
Raven
PoisonCreeper
Werewolf
Lycanthropy
Firestorm
OakSage
SummonSpiritWolf
Werebear
MoltenBoulder
ArcticBlast
CarrionVine
FeralRage
Maul
Fissure
CycloneArmor
HeartOfWolverine
SummonDireWolf
Rabies
FireClaws
Twister
SolarCreeper
Hunger
ShockWave
Volcano
Tornado
SpiritOfBarbs
SummonGrizzly
Fury
Armageddon
Hurricane
FireBlast
ClawMastery
PsychicHammer
TigerStrike
DragonTalon
ShockWeb
BladeSentinel
BurstOfSpeed
FistsOfFire
DragonClaw
ChargedBoltSentry
WakeOfFire
WeaponBlock
CloakOfShadows
CobraStrike
BladeFury
Fade
ShadowWarrior
ClawsOfThunder
DragonTail
LightningSentry
WakeOfInferno
MindBlast
BladesOfIce
DragonFlight
DeathSentry
BladeShield
Venom
ShadowMaster
PhoenixStrike
WakeOfDestructionSentry
ImpInferno
ImpFireball
BaalTaunt
BaalCorpseExplode
BaalMonsterSpawn
CatapultChargedBall
CatapultSpikeBall
SuckBlood
CryHelp
HealingVortex
Teleport2
SelfResurrect
VineAttack
OverseerWhip
BarbsAura
WolverineAura
OakSageAura
ImpFireMissile
Impregnate
SiegeBeastStomp
MinionSpawner
CatapultBlizzard
CatapultPlague
CatapultMeteor
BoltSentry
CorpseCycler
DeathMaul
DefenseCurse
BloodMana
monInfernoSentry
monDeathSentry
sentryLightning
fenrisRage
BaalTentacle
BaalNova
BaalInferno
BaalColdMissiles
MegademonInferno
EvilHutSpawner
CountessFirewall
ImpBolt
HorrorArcticBlast
deathSentryLtng
VineCycler
BearSmite
Resurrect2
BloodLordFrenzy
BaalTeleport
ImpTeleport
BaalCloneTeleport
ZakarumLightning
VampireMissile
MephistoMissile
DoomKnightMissile
RogueMissile
HydraMissile
NecromageMissile
MonBow
MonFireArrow
MonColdArrow
MonExplodingArrow
MonFreezingArrow
MonPowerStrike
SuccubusBolt
MephFrostNova
MonIceSpear
ShamanIce
Diablogeddon
DeleriumChange
NihlathakCorpseExplosion
SerpentCharge
TrapNova
UnHolyBoltEx
ShamanFireEx
ImpFireMissileEx
FixedSiegeBeastStomp
Unset Skill = -1
)

10
pkg/data/stat/immune.go Normal file
View File

@@ -0,0 +1,10 @@
package stat
type Resist string
const (
ColdImmune Resist = "cold"
FireImmune Resist = "fire"
LightImmune Resist = "light"
PoisonImmune Resist = "poison"
)

1090
pkg/data/stat/stats.go Normal file

File diff suppressed because it is too large Load Diff

206
pkg/data/state/states.go Normal file
View File

@@ -0,0 +1,206 @@
package state
type States []State
func (s States) HasState(state State) bool {
for _, st := range s {
if st == state {
return true
}
}
return false
}
type State uint
const (
None State = iota
Freeze
Poison
Resistfire
Resistcold
Resistlightning
Resistmagic
Playerbody
Resistall
Amplifydamage
Frozenarmor
Cold
Inferno
Blaze
Bonearmor
Concentrate
Enchant
Innersight
SkillMove
Weaken
Chillingarmor
Stunned
Spiderlay
Dimvision
Slowed
Fetishaura
Shout
Taunt
Conviction
Convicted
Energyshield
Venomclaws
Battleorders
Might
Prayer
Holyfire
Thorns
Defiance
Thunderstorm
Lightningbolt
Blessedaim
Stamina
Concentration
Holywind
Holywindcold
Cleansing
Holyshock
Sanctuary
Meditation
Fanaticism
Redemption
Battlecommand
Preventheal
Conversion
Uninterruptable
Ironmaiden
Terror
Attract
Lifetap
Confuse
Decrepify
Lowerresist
Openwounds
Dopplezon
Criticalstrike
Dodge
Avoid
Penetrate
Evade
Pierce
Warmth
Firemastery
Lightningmastery
Coldmastery
Blademastery
Axemastery
Macemastery
Polearmmastery
Throwingmastery
Spearmastery
Increasedstamina
Ironskin
Increasedspeed
Naturalresistance
Fingermagecurse
Nomanaregen
Justhit
Slowmissiles
Shiverarmor
Battlecry
Blue
Red
DeathDelay
Valkyrie
Frenzy
Berserk
Revive
Itemfullset
Sourceunit
Redeemed
Healthpot
Holyshield
JustPortaled
Monfrenzy
CorpseNodraw
Alignment
Manapot
Shatter
SyncWarped
ConversionSave
Pregnant
State111
Rabies
DefenseCurse
BloodMana
Burning
Dragonflight
Maul
CorpseNoselect
Shadowwarrior
Feralrage
Skilldelay
Tigerstrike
Cobrastrike
Phoenixstrike
Fistsoffire
Bladesofice
Clawsofthunder
ShrineArmor
ShrineCombat
ShrineResistLightning
ShrineResistFire
ShrineResistCold
ShrineResistPoison
ShrineSkill
ShrineManaRegen
ShrineStamina
ShrineExperience
FenrisRage
Wolf
Bear
Bloodlust
Changeclass
Attached
Hurricane
Armageddon
Invis
Barbs
Wolverine
Oaksage
VineBeast
Cyclonearmor
Clawmastery
CloakOfShadows
Recycled
Weaponblock
Cloaked
Quickness
Bladeshield
Fade
Summonresist
Oaksagecontrol
Wolverinecontrol
Barbscontrol
Debugcontrol
Itemset1
Itemset2
Itemset3
Itemset4
Itemset5
Itemset6
Runeword
Restinpeace
Corpseexp
Whirlwind
Fullsetgeneric
Monsterset
Delerium
Antidote
Thawing
Staminapot
PassiveResistfire
PassiveResistcold
PassiveResistltng
Uberminion
Cooldown
Sharedstash
Hidedead
)