diff --git a/pkg/data/area/area.go b/pkg/data/area/area.go new file mode 100644 index 0000000..5c1dfdd --- /dev/null +++ b/pkg/data/area/area.go @@ -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 +) diff --git a/pkg/data/belt.go b/pkg/data/belt.go new file mode 100644 index 0000000..2c16c4e --- /dev/null +++ b/pkg/data/belt.go @@ -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 diff --git a/pkg/data/data.go b/pkg/data/data.go new file mode 100644 index 0000000..53ebd38 --- /dev/null +++ b/pkg/data/data.go @@ -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 +} diff --git a/pkg/data/difficulty/difficulty.go b/pkg/data/difficulty/difficulty.go new file mode 100644 index 0000000..e8985f0 --- /dev/null +++ b/pkg/data/difficulty/difficulty.go @@ -0,0 +1,9 @@ +package difficulty + +const ( + Normal = "normal" + Nightmare = "nightmare" + Hell = "hell" +) + +type Difficulty string diff --git a/pkg/data/item/class.go b/pkg/data/item/class.go new file mode 100644 index 0000000..9aa0eb1 --- /dev/null +++ b/pkg/data/item/class.go @@ -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 +} diff --git a/pkg/data/item/name.go b/pkg/data/item/name.go new file mode 100644 index 0000000..8c654b1 --- /dev/null +++ b/pkg/data/item/name.go @@ -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", +} diff --git a/pkg/data/item/quality.go b/pkg/data/item/quality.go new file mode 100644 index 0000000..30b68b5 --- /dev/null +++ b/pkg/data/item/quality.go @@ -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" +} diff --git a/pkg/data/items.go b/pkg/data/items.go new file mode 100644 index 0000000..e4f50fe --- /dev/null +++ b/pkg/data/items.go @@ -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)) +} diff --git a/pkg/data/npc.go b/pkg/data/npc.go new file mode 100644 index 0000000..7f8df57 --- /dev/null +++ b/pkg/data/npc.go @@ -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 +} diff --git a/pkg/data/npc/npc.go b/pkg/data/npc/npc.go new file mode 100644 index 0000000..63a0c1a --- /dev/null +++ b/pkg/data/npc/npc.go @@ -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 +) diff --git a/pkg/data/object/interact_type.go b/pkg/data/object/interact_type.go new file mode 100644 index 0000000..8c964f9 --- /dev/null +++ b/pkg/data/object/interact_type.go @@ -0,0 +1,9 @@ +package object + +type InteractType uint + +const ( + InteractTypeNone InteractType = 0x00 + InteractTypeTrap InteractType = 0x04 + InteractTypeLocked InteractType = 0x80 +) diff --git a/pkg/data/object/type.go b/pkg/data/object/type.go new file mode 100644 index 0000000..3776b4c --- /dev/null +++ b/pkg/data/object/type.go @@ -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 +) diff --git a/pkg/data/objects.go b/pkg/data/objects.go new file mode 100644 index 0000000..7bb974b --- /dev/null +++ b/pkg/data/objects.go @@ -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 +} diff --git a/pkg/data/skill/skills.go b/pkg/data/skill/skills.go new file mode 100644 index 0000000..b0fc32a --- /dev/null +++ b/pkg/data/skill/skills.go @@ -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 +) diff --git a/pkg/data/stat/immune.go b/pkg/data/stat/immune.go new file mode 100644 index 0000000..f5fd58b --- /dev/null +++ b/pkg/data/stat/immune.go @@ -0,0 +1,10 @@ +package stat + +type Resist string + +const ( + ColdImmune Resist = "cold" + FireImmune Resist = "fire" + LightImmune Resist = "light" + PoisonImmune Resist = "poison" +) diff --git a/pkg/data/stat/stats.go b/pkg/data/stat/stats.go new file mode 100644 index 0000000..8737f03 --- /dev/null +++ b/pkg/data/stat/stats.go @@ -0,0 +1,1090 @@ +package stat + +type Stat int16 + +const ( + Strength Stat = iota + Energy + Dexterity + Vitality + StatPoints + SkillPoints + Life + MaxLife + Mana + MaxMana + Stamina + MaxStamina + Level + Experience + Gold + StashGold + EnhancedDefense + EnhancedDamageMax + EnhancedDamage + AttackRating + ChanceToBlock + MinDamage + MaxDamage + TwoHandedMinDamage + TwoHandedMaxDamage + DamagePercent + ManaRecovery + ManaRecoveryBonus + StaminaRecoveryBonus + LastExp + NextExp + Defense + DefenseVsMissiles + DefenseVsHth + NormalDamageReduction + MagicDamageReduction + DamageReduced + MagicResist + MaxMagicResist + FireResist + MaxFireResist + LightningResist + MaxLightningResist + ColdResist + MaxColdResist + PoisonResist + MaxPoisonResist + DamageAura + FireMinDamage + FireMaxDamage + LightningMinDamage + LightningMaxDamage + MagicMinDamage + MagicMaxDamage + ColdMinDamage + ColdMaxDamage + ColdLength + PoisonMinDamage + PoisonMaxDamage + PoisonLength + LifeSteal + LifeStealMax + ManaSteal + ManaStealMax + StaminaDrainMinDamage + StaminaDrainMaxDamage + StunLength + VelocityPercent + AttackRate + OtherAnimRate + Quantity + Value + Durability + MaxDurability + ReplenishLife + MaxDurabilityPercent + MaxLifePercent + MaxManaPercent + AttackerTakesDamage + GoldFind + MagicFind + Knockback + TimeDuration + AddClassSkills + Unused84 + AddExperience + LifeAfterEachKill + ReducePrices + DoubleHerbDuration + LightRadius + LightColor + Requirements + LevelRequire + IncreasedAttackSpeed + LevelRequirePercent + LastBlockFrame + FasterRunWalk + NonClassSkill + State + FasterHitRecovery + PlayerCount + PoisonOverrideLength + FasterBlockRate + BypassUndead + BypassDemons + FasterCastRate + BypassBeasts + SingleSkill + SlainMonstersRestInPeace + CurseResistance + PoisonLengthReduced + NormalDamage + HitCausesMonsterToFlee + HitBlindsTarget + DamageTakenGoesToMana + IgnoreTargetsDefense + TargetDefense + PreventMonsterHeal + HalfFreezeDuration + AttackRatingPercent + MonsterDefensePerHit + DemonDamagePercent + UndeadDamagePercent + DemonAttackRating + UndeadAttackRating + Throwable + FireSkills + AllSkills + AttackerTakesLightDamage + IronMaidenLevel + LifeTapLevel + ThornsPercent + BoneArmor + BoneArmorMax + FreezesTarget + OpenWounds + CrushingBlow + KickDamage + ManaAfterKill + HealAfterDemonKill + ExtraBlood + DeadlyStrike + AbsorbFirePercent + AbsorbFire + AbsorbLightningPercent + AbsorbLightning + AbsorbMagicPercent + AbsorbMagic + AbsorbColdPercent + AbsorbCold + SlowsTarget + Aura + Indestructible + CannotBeFrozen + SlowerStaminaDrain + Reanimate + Pierce + MagicArrow + ExplosiveArrow + ThrowMinDamage + ThrowMaxDamage + SkillHandofAthena + SkillStaminaPercent + SkillPassiveStaminaPercent + SkillConcentration + SkillEnchant + SkillPierce + SkillConviction + SkillChillingArmor + SkillFrenzy + SkillDecrepify + SkillArmorPercent + Alignment + Target0 + Target1 + GoldLost + ConverisonLevel + ConverisonMaxHP + UnitDooverlay + AttackVsMonType + DamageVsMonType + Fade + ArmorOverridePercent + Unused183 + Unused184 + Unused185 + Unused186 + Unused187 + AddSkillTab + Unused189 + Unused190 + Unused191 + Unused192 + Unused193 + NumSockets + SkillOnAttack + SkillOnKill + SkillOnDeath + SkillOnHit + SkillOnLevelUp + Unused200 + SkillOnGetHit + Unused202 + Unused203 + ItemChargedSkill + Unused205 + Unused206 + Unused207 + Unused208 + Unused209 + Unused210 + Unused211 + Unused212 + Unused213 + DefensePerLevel + ArmorPercentPerLevel + LifePerLevel + ManaPerLevel + MaxDamagePerLevel + MaxDamagePercentPerLevel + StrengthPerLevel + DexterityPerLevel + EnergyPerLevel + VitalityPerLevel + AttackRatingPerLevel + AttackRatingPercentPerLevel + ColdDamageMaxPerLevel + FireDamageMaxPerLevel + LightningDamageMaxPerLevel + PoisonDamageMaxPerLevel + ResistColdPerLevel + ResistFirePerLevel + ResistLightningPerLevel + ResistPoisonPerLevel + AbsorbColdPerLevel + AbsorbFirePerLevel + AbsorbLightningPerLevel + AbsorbPoisonPerLevel + ThornsPerLevel + ExtraGoldPerLevel + MagicFindPerLevel + RegenStaminaPerLevel + StaminaPerLevel + DamageDemonPerLevel + DamageUndeadPerLevel + AttackRatingDemonPerLevel + AttackRatingUndeadPerLevel + CrushingBlowPerLevel + OpenWoundsPerLevel + KickDamagePerLevel + DeadlyStrikePerLevel + FindGemsPerLevel + ReplenishDurability + ReplenishQuantity + ExtraStack + FindItem + SlashDamage + SlashDamagePercent + CrushDamage + CrushDamagePercent + ThrustDamage + ThrustDamagePercent + AbsorbSlash + AbsorbCrush + AbsorbThrust + AbsorbSlashPercent + AbsorbCrushPercent + AbsorbThrustPercent + ArmorByTime + ArmorPercentByTime + LifeByTime + ManaByTime + MaxDamageByTime + MaxDamagePercentByTime + StrengthByTime + DexterityByTime + EnergyByTime + VitalityByTime + AttackRatingByTime + AttackRatingPercentByTime + ColdDamageMaxByTime + FireDamageMaxByTime + LightningDamageMaxByTime + PoisonDamageMaxByTime + ResistColdByTime + ResistFireByTime + ResistLightningByTime + ResistPoisonByTime + AbsorbColdByTime + AbsorbFireByTime + AbsorbLightningByTime + AbsorbPoisonByTime + FindGoldByTime + MagicFindByTime + RegenStaminaByTime + StaminaByTime + DamageDemonByTime + DamageUndeadByTime + AttackRatingDemonByTime + AttackRatingUndeadByTime + CrushingBlowByTime + OpenWoundsByTime + KickDamageByTime + DeadlyStrikeByTime + FindGemsByTime + PierceCold + PierceFire + PierceLightning + PiercePoison + DamageVsMonster + DamagePercentVsMonster + AttackRatingVsMonster + AttackRatingPercentVsMonster + AcVsMonster + AcPercentVsMonster + FireLength + BurningMin + BurningMax + ProgressiveDamage + ProgressiveSteal + ProgressiveOther + ProgressiveFire + ProgressiveCold + ProgressiveLightning + ExtraCharges + ProgressiveAttackRating + PoisonCount + DamageFrameRate + PierceIdx + FireSkillDamage + LightningSkillDamage + ColdSkillDamage + PoisonSkillDamage + EnemyFireResist + EnemyLightningResist + EnemyColdResist + EnemyPoisonResist + PassiveCriticalStrike + PassiveDodge + PassiveAvoid + PassiveEvade + PassiveWarmth + PassiveMasteryMeleeAttackRating + PassiveMasteryMeleeDamage + PassiveMasteryMeleeCritical + PassiveMasteryThrowAttackRating + PassiveMasteryThrowDamage + PassiveMasteryThrowCritical + PassiveWeaponBlock + SummonResist + ModifierListSkill + ModifierListLevel + LastSentHPPercent + SourceUnitType + SourceUnitID + ShortParam1 + QuestItemDifficulty + PassiveMagicMastery + PassiveMagicPierce +) + +func (s Stat) String() string { + switch s { + case Strength: + return "strength" + case Energy: + return "energy" + case Dexterity: + return "dexterity" + case Vitality: + return "vitality" + case StatPoints: + return "statpoints" + case SkillPoints: + return "skillpoints" + case Life: + return "life" + case MaxLife: + return "maxlife" + case Mana: + return "mana" + case MaxMana: + return "maxmana" + case Stamina: + return "stamina" + case MaxStamina: + return "maxstamina" + case Level: + return "level" + case Experience: + return "experience" + case Gold: + return "gold" + case StashGold: + return "stashgold" + case EnhancedDefense: + return "enhanceddefense" + case EnhancedDamageMax: + return "enhanceddamagemax" + case EnhancedDamage: + return "enhanceddamage" + case AttackRating: + return "attackrating" + case ChanceToBlock: + return "chancetoblock" + case MinDamage: + return "mindamage" + case MaxDamage: + return "maxdamage" + case TwoHandedMinDamage: + return "twohandedmindamage" + case TwoHandedMaxDamage: + return "twohandedmaxdamage" + case DamagePercent: + return "damagepercent" + case ManaRecovery: + return "manarecovery" + case ManaRecoveryBonus: + return "manarecoverybonus" + case StaminaRecoveryBonus: + return "staminarecoverybonus" + case LastExp: + return "lastexp" + case NextExp: + return "nextexp" + case Defense: + return "defense" + case DefenseVsMissiles: + return "defensevsmissiles" + case DefenseVsHth: + return "defensevshth" + case NormalDamageReduction: + return "normaldamagereduction" + case MagicDamageReduction: + return "magicdamagereduction" + case DamageReduced: + return "damagereduced" + case MagicResist: + return "magicresist" + case MaxMagicResist: + return "maxmagicresist" + case FireResist: + return "fireresist" + case MaxFireResist: + return "maxfireresist" + case LightningResist: + return "lightningresist" + case MaxLightningResist: + return "maxlightningresist" + case ColdResist: + return "coldresist" + case MaxColdResist: + return "maxcoldresist" + case PoisonResist: + return "poisonresist" + case MaxPoisonResist: + return "maxpoisonresist" + case DamageAura: + return "damageaura" + case FireMinDamage: + return "firemindamage" + case FireMaxDamage: + return "firemaxdamage" + case LightningMinDamage: + return "lightningmindamage" + case LightningMaxDamage: + return "lightningmaxdamage" + case MagicMinDamage: + return "magicmindamage" + case MagicMaxDamage: + return "magicmaxdamage" + case ColdMinDamage: + return "coldmindamage" + case ColdMaxDamage: + return "coldmaxdamage" + case ColdLength: + return "coldlength" + case PoisonMinDamage: + return "poisonmindamage" + case PoisonMaxDamage: + return "poisonmaxdamage" + case PoisonLength: + return "poisonlength" + case LifeSteal: + return "lifesteal" + case LifeStealMax: + return "lifestealmax" + case ManaSteal: + return "manasteal" + case ManaStealMax: + return "manastealmax" + case StaminaDrainMinDamage: + return "staminadrainmindamage" + case StaminaDrainMaxDamage: + return "staminadrainmaxdamage" + case StunLength: + return "stunlength" + case VelocityPercent: + return "velocitypercent" + case AttackRate: + return "attackrate" + case OtherAnimRate: + return "otheranimrate" + case Quantity: + return "quantity" + case Value: + return "value" + case Durability: + return "durability" + case MaxDurability: + return "maxdurability" + case ReplenishLife: + return "replenishlife" + case MaxDurabilityPercent: + return "maxdurabilitypercent" + case MaxLifePercent: + return "maxlifepercent" + case MaxManaPercent: + return "maxmanapercent" + case AttackerTakesDamage: + return "attackertakesdamage" + case GoldFind: + return "goldfind" + case MagicFind: + return "magicfind" + case Knockback: + return "knockback" + case TimeDuration: + return "timeduration" + case AddClassSkills: + return "addclassskills" + case Unused84: + return "unused84" + case AddExperience: + return "addexperience" + case LifeAfterEachKill: + return "lifeaftereachkill" + case ReducePrices: + return "reduceprices" + case DoubleHerbDuration: + return "doubleherbduration" + case LightRadius: + return "lightradius" + case LightColor: + return "lightcolor" + case Requirements: + return "requirements" + case LevelRequire: + return "levelrequire" + case IncreasedAttackSpeed: + return "increasedattackspeed" + case LevelRequirePercent: + return "levelrequirepercent" + case LastBlockFrame: + return "lastblockframe" + case FasterRunWalk: + return "fasterrunwalk" + case NonClassSkill: + return "nonclassskill" + case State: + return "state" + case FasterHitRecovery: + return "fasterhitrecovery" + case PlayerCount: + return "playercount" + case PoisonOverrideLength: + return "poisonoverridelength" + case FasterBlockRate: + return "fasterblockrate" + case BypassUndead: + return "bypassundead" + case BypassDemons: + return "bypassdemons" + case FasterCastRate: + return "fastercastrate" + case BypassBeasts: + return "bypassbeasts" + case SingleSkill: + return "singleskill" + case SlainMonstersRestInPeace: + return "slainmonstersrestinpeace" + case CurseResistance: + return "curseresistance" + case PoisonLengthReduced: + return "poisonlengthreduced" + case NormalDamage: + return "normaldamage" + case HitCausesMonsterToFlee: + return "hitcausesmonstertoflee" + case HitBlindsTarget: + return "hitblindstarget" + case DamageTakenGoesToMana: + return "damagetakengoestomana" + case IgnoreTargetsDefense: + return "ignoretargetsdefense" + case TargetDefense: + return "targetdefense" + case PreventMonsterHeal: + return "preventmonsterheal" + case HalfFreezeDuration: + return "halffreezeduration" + case AttackRatingPercent: + return "attackratingpercent" + case MonsterDefensePerHit: + return "monsterdefenseperhit" + case DemonDamagePercent: + return "demondamagepercent" + case UndeadDamagePercent: + return "undeaddamagepercent" + case DemonAttackRating: + return "demonattackrating" + case UndeadAttackRating: + return "undeadattackrating" + case Throwable: + return "throwable" + case FireSkills: + return "fireskills" + case AllSkills: + return "allskills" + case AttackerTakesLightDamage: + return "attackertakeslightdamage" + case IronMaidenLevel: + return "ironmaidenlevel" + case LifeTapLevel: + return "lifetaplevel" + case ThornsPercent: + return "thornspercent" + case BoneArmor: + return "bonearmor" + case BoneArmorMax: + return "bonearmormax" + case FreezesTarget: + return "freezestarget" + case OpenWounds: + return "openwounds" + case CrushingBlow: + return "crushingblow" + case KickDamage: + return "kickdamage" + case ManaAfterKill: + return "manaafterkill" + case HealAfterDemonKill: + return "healafterdemonkill" + case ExtraBlood: + return "extrablood" + case DeadlyStrike: + return "deadlystrike" + case AbsorbFirePercent: + return "absorbfirepercent" + case AbsorbFire: + return "absorbfire" + case AbsorbLightningPercent: + return "absorblightningpercent" + case AbsorbLightning: + return "absorblightning" + case AbsorbMagicPercent: + return "absorbmagicpercent" + case AbsorbMagic: + return "absorbmagic" + case AbsorbColdPercent: + return "absorbcoldpercent" + case AbsorbCold: + return "absorbcold" + case SlowsTarget: + return "slowstarget" + case Aura: + return "aura" + case Indestructible: + return "indestructible" + case CannotBeFrozen: + return "cannotbefrozen" + case SlowerStaminaDrain: + return "slowerstaminadrain" + case Reanimate: + return "reanimate" + case Pierce: + return "pierce" + case MagicArrow: + return "magicarrow" + case ExplosiveArrow: + return "explosivearrow" + case ThrowMinDamage: + return "throwmindamage" + case ThrowMaxDamage: + return "throwmaxdamage" + case SkillHandofAthena: + return "skillhandofathena" + case SkillStaminaPercent: + return "skillstaminapercent" + case SkillPassiveStaminaPercent: + return "skillpassivestaminapercent" + case SkillConcentration: + return "skillconcentration" + case SkillEnchant: + return "skillenchant" + case SkillPierce: + return "skillpierce" + case SkillConviction: + return "skillconviction" + case SkillChillingArmor: + return "skillchillingarmor" + case SkillFrenzy: + return "skillfrenzy" + case SkillDecrepify: + return "skilldecrepify" + case SkillArmorPercent: + return "skillarmorpercent" + case Alignment: + return "alignment" + case Target0: + return "target0" + case Target1: + return "target1" + case GoldLost: + return "goldlost" + case ConverisonLevel: + return "converisonlevel" + case ConverisonMaxHP: + return "converisonmaxhp" + case UnitDooverlay: + return "unitdooverlay" + case AttackVsMonType: + return "attackvsmontype" + case DamageVsMonType: + return "damagevsmontype" + case Fade: + return "fade" + case ArmorOverridePercent: + return "armoroverridepercent" + case Unused183: + return "unused183" + case Unused184: + return "unused184" + case Unused185: + return "unused185" + case Unused186: + return "unused186" + case Unused187: + return "unused187" + case AddSkillTab: + return "addskilltab" + case Unused189: + return "unused189" + case Unused190: + return "unused190" + case Unused191: + return "unused191" + case Unused192: + return "unused192" + case Unused193: + return "unused193" + case NumSockets: + return "numsockets" + case SkillOnAttack: + return "skillonattack" + case SkillOnKill: + return "skillonkill" + case SkillOnDeath: + return "skillondeath" + case SkillOnHit: + return "skillonhit" + case SkillOnLevelUp: + return "skillonlevelup" + case Unused200: + return "unused200" + case SkillOnGetHit: + return "skillongethit" + case Unused202: + return "unused202" + case Unused203: + return "unused203" + case ItemChargedSkill: + return "itemchargedskill" + case Unused205: + return "unused205" + case Unused206: + return "unused206" + case Unused207: + return "unused207" + case Unused208: + return "unused208" + case Unused209: + return "unused209" + case Unused210: + return "unused210" + case Unused211: + return "unused211" + case Unused212: + return "unused212" + case Unused213: + return "unused213" + case DefensePerLevel: + return "defenseperlevel" + case ArmorPercentPerLevel: + return "armorpercentperlevel" + case LifePerLevel: + return "lifeperlevel" + case ManaPerLevel: + return "manaperlevel" + case MaxDamagePerLevel: + return "maxdamageperlevel" + case MaxDamagePercentPerLevel: + return "maxdamagepercentperlevel" + case StrengthPerLevel: + return "strengthperlevel" + case DexterityPerLevel: + return "dexterityperlevel" + case EnergyPerLevel: + return "energyperlevel" + case VitalityPerLevel: + return "vitalityperlevel" + case AttackRatingPerLevel: + return "attackratingperlevel" + case AttackRatingPercentPerLevel: + return "attackratingpercentperlevel" + case ColdDamageMaxPerLevel: + return "colddamagemaxperlevel" + case FireDamageMaxPerLevel: + return "firedamagemaxperlevel" + case LightningDamageMaxPerLevel: + return "lightningdamagemaxperlevel" + case PoisonDamageMaxPerLevel: + return "poisondamagemaxperlevel" + case ResistColdPerLevel: + return "resistcoldperlevel" + case ResistFirePerLevel: + return "resistfireperlevel" + case ResistLightningPerLevel: + return "resistlightningperlevel" + case ResistPoisonPerLevel: + return "resistpoisonperlevel" + case AbsorbColdPerLevel: + return "absorbcoldperlevel" + case AbsorbFirePerLevel: + return "absorbfireperlevel" + case AbsorbLightningPerLevel: + return "absorblightningperlevel" + case AbsorbPoisonPerLevel: + return "absorbpoisonperlevel" + case ThornsPerLevel: + return "thornsperlevel" + case ExtraGoldPerLevel: + return "extragoldperlevel" + case MagicFindPerLevel: + return "magicfindperlevel" + case RegenStaminaPerLevel: + return "regenstaminaperlevel" + case StaminaPerLevel: + return "staminaperlevel" + case DamageDemonPerLevel: + return "damagedemonperlevel" + case DamageUndeadPerLevel: + return "damageundeadperlevel" + case AttackRatingDemonPerLevel: + return "attackratingdemonperlevel" + case AttackRatingUndeadPerLevel: + return "attackratingundeadperlevel" + case CrushingBlowPerLevel: + return "crushingblowperlevel" + case OpenWoundsPerLevel: + return "openwoundsperlevel" + case KickDamagePerLevel: + return "kickdamageperlevel" + case DeadlyStrikePerLevel: + return "deadlystrikeperlevel" + case FindGemsPerLevel: + return "findgemsperlevel" + case ReplenishDurability: + return "replenishdurability" + case ReplenishQuantity: + return "replenishquantity" + case ExtraStack: + return "extrastack" + case FindItem: + return "finditem" + case SlashDamage: + return "slashdamage" + case SlashDamagePercent: + return "slashdamagepercent" + case CrushDamage: + return "crushdamage" + case CrushDamagePercent: + return "crushdamagepercent" + case ThrustDamage: + return "thrustdamage" + case ThrustDamagePercent: + return "thrustdamagepercent" + case AbsorbSlash: + return "absorbslash" + case AbsorbCrush: + return "absorbcrush" + case AbsorbThrust: + return "absorbthrust" + case AbsorbSlashPercent: + return "absorbslashpercent" + case AbsorbCrushPercent: + return "absorbcrushpercent" + case AbsorbThrustPercent: + return "absorbthrustpercent" + case ArmorByTime: + return "armorbytime" + case ArmorPercentByTime: + return "armorpercentbytime" + case LifeByTime: + return "lifebytime" + case ManaByTime: + return "manabytime" + case MaxDamageByTime: + return "maxdamagebytime" + case MaxDamagePercentByTime: + return "maxdamagepercentbytime" + case StrengthByTime: + return "strengthbytime" + case DexterityByTime: + return "dexteritybytime" + case EnergyByTime: + return "energybytime" + case VitalityByTime: + return "vitalitybytime" + case AttackRatingByTime: + return "attackratingbytime" + case AttackRatingPercentByTime: + return "attackratingpercentbytime" + case ColdDamageMaxByTime: + return "colddamagemaxbytime" + case FireDamageMaxByTime: + return "firedamagemaxbytime" + case LightningDamageMaxByTime: + return "lightningdamagemaxbytime" + case PoisonDamageMaxByTime: + return "poisondamagemaxbytime" + case ResistColdByTime: + return "resistcoldbytime" + case ResistFireByTime: + return "resistfirebytime" + case ResistLightningByTime: + return "resistlightningbytime" + case ResistPoisonByTime: + return "resistpoisonbytime" + case AbsorbColdByTime: + return "absorbcoldbytime" + case AbsorbFireByTime: + return "absorbfirebytime" + case AbsorbLightningByTime: + return "absorblightningbytime" + case AbsorbPoisonByTime: + return "absorbpoisonbytime" + case FindGoldByTime: + return "findgoldbytime" + case MagicFindByTime: + return "magicfindbytime" + case RegenStaminaByTime: + return "regenstaminabytime" + case StaminaByTime: + return "staminabytime" + case DamageDemonByTime: + return "damagedemonbytime" + case DamageUndeadByTime: + return "damageundeadbytime" + case AttackRatingDemonByTime: + return "attackratingdemonbytime" + case AttackRatingUndeadByTime: + return "attackratingundeadbytime" + case CrushingBlowByTime: + return "crushingblowbytime" + case OpenWoundsByTime: + return "openwoundsbytime" + case KickDamageByTime: + return "kickdamagebytime" + case DeadlyStrikeByTime: + return "deadlystrikebytime" + case FindGemsByTime: + return "findgemsbytime" + case PierceCold: + return "piercecold" + case PierceFire: + return "piercefire" + case PierceLightning: + return "piercelightning" + case PiercePoison: + return "piercepoison" + case DamageVsMonster: + return "damagevsmonster" + case DamagePercentVsMonster: + return "damagepercentvsmonster" + case AttackRatingVsMonster: + return "attackratingvsmonster" + case AttackRatingPercentVsMonster: + return "attackratingpercentvsmonster" + case AcVsMonster: + return "acvsmonster" + case AcPercentVsMonster: + return "acpercentvsmonster" + case FireLength: + return "firelength" + case BurningMin: + return "burningmin" + case BurningMax: + return "burningmax" + case ProgressiveDamage: + return "progressivedamage" + case ProgressiveSteal: + return "progressivesteal" + case ProgressiveOther: + return "progressiveother" + case ProgressiveFire: + return "progressivefire" + case ProgressiveCold: + return "progressivecold" + case ProgressiveLightning: + return "progressivelightning" + case ExtraCharges: + return "extracharges" + case ProgressiveAttackRating: + return "progressiveattackrating" + case PoisonCount: + return "poisoncount" + case DamageFrameRate: + return "damageframerate" + case PierceIdx: + return "pierceidx" + case FireSkillDamage: + return "fireskilldamage" + case LightningSkillDamage: + return "lightningskilldamage" + case ColdSkillDamage: + return "coldskilldamage" + case PoisonSkillDamage: + return "poisonskilldamage" + case EnemyFireResist: + return "enemyfireresist" + case EnemyLightningResist: + return "enemylightningresist" + case EnemyColdResist: + return "enemycoldresist" + case EnemyPoisonResist: + return "enemypoisonresist" + case PassiveCriticalStrike: + return "passivecriticalstrike" + case PassiveDodge: + return "passivedodge" + case PassiveAvoid: + return "passiveavoid" + case PassiveEvade: + return "passiveevade" + case PassiveWarmth: + return "passivewarmth" + case PassiveMasteryMeleeAttackRating: + return "passivemasterymeleeattackrating" + case PassiveMasteryMeleeDamage: + return "passivemasterymeleedamage" + case PassiveMasteryMeleeCritical: + return "passivemasterymeleecritical" + case PassiveMasteryThrowAttackRating: + return "passivemasterythrowattackrating" + case PassiveMasteryThrowDamage: + return "passivemasterythrowdamage" + case PassiveMasteryThrowCritical: + return "passivemasterythrowcritical" + case PassiveWeaponBlock: + return "passiveweaponblock" + case SummonResist: + return "summonresist" + case ModifierListSkill: + return "modifierlistskill" + case ModifierListLevel: + return "modifierlistlevel" + case LastSentHPPercent: + return "lastsenthppercent" + case SourceUnitType: + return "sourceunittype" + case SourceUnitID: + return "sourceunitid" + case ShortParam1: + return "shortparam1" + case QuestItemDifficulty: + return "questitemdifficulty" + case PassiveMagicMastery: + return "passivemagicmastery" + case PassiveMagicPierce: + return "passivemagicpierce" + } + + return "" +} diff --git a/pkg/data/state/states.go b/pkg/data/state/states.go new file mode 100644 index 0000000..25cd8cd --- /dev/null +++ b/pkg/data/state/states.go @@ -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 +)