mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-08-28 15:04:20 -04:00
230 lines
6.3 KiB
Go
230 lines
6.3 KiB
Go
|
package d2records
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
|
||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2txt"
|
||
|
|
||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2calculation"
|
||
|
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
|
||
|
)
|
||
|
|
||
|
func loadCommonItems(d *d2txt.DataDictionary, source d2enum.InventoryItemType) (CommonItems, error) {
|
||
|
records := make(CommonItems)
|
||
|
|
||
|
for d.Next() {
|
||
|
record := &ItemCommonRecord{
|
||
|
Source: source,
|
||
|
|
||
|
Name: d.String("name"),
|
||
|
|
||
|
Version: d.Number("version"),
|
||
|
CompactSave: d.Number("compactsave") > 0,
|
||
|
Rarity: d.Number("rarity"),
|
||
|
Spawnable: d.Number("spawnable") > 0,
|
||
|
|
||
|
MinAC: d.Number("minac"),
|
||
|
MaxAC: d.Number("maxac"),
|
||
|
Absorbs: d.Number("absorbs"),
|
||
|
Speed: d.Number("speed"),
|
||
|
RequiredStrength: d.Number("reqstr"),
|
||
|
Block: d.Number("block"),
|
||
|
Durability: d.Number("durability"),
|
||
|
NoDurability: d.Number("nodurability") > 0,
|
||
|
|
||
|
Level: d.Number("level"),
|
||
|
RequiredLevel: d.Number("levelreq"),
|
||
|
Cost: d.Number("cost"),
|
||
|
GambleCost: d.Number("gamble cost"),
|
||
|
Code: d.String("code"),
|
||
|
NameString: d.String("namestr"),
|
||
|
MagicLevel: d.Number("magic lvl"),
|
||
|
AutoPrefix: d.Number("auto prefix"),
|
||
|
|
||
|
AlternateGfx: d.String("alternategfx"),
|
||
|
OpenBetaGfx: d.String("OpenBetaGfx"),
|
||
|
NormalCode: d.String("normcode"),
|
||
|
UberCode: d.String("ubercode"),
|
||
|
UltraCode: d.String("ultracode"),
|
||
|
|
||
|
SpellOffset: d.Number("spelloffset"),
|
||
|
|
||
|
Component: d.Number("component"),
|
||
|
InventoryWidth: d.Number("invwidth"),
|
||
|
InventoryHeight: d.Number("invheight"),
|
||
|
HasInventory: d.Number("hasinv") > 0,
|
||
|
GemSockets: d.Number("gemsockets"),
|
||
|
GemApplyType: d.Number("gemapplytype"),
|
||
|
|
||
|
FlippyFile: d.String("flippyfile"),
|
||
|
InventoryFile: d.String("invfile"),
|
||
|
UniqueInventoryFile: d.String("uniqueinvfile"),
|
||
|
SetInventoryFile: d.String("setinvfile"),
|
||
|
|
||
|
AnimRightArm: d.Number("rArm"),
|
||
|
AnimLeftArm: d.Number("lArm"),
|
||
|
AnimTorso: d.Number("Torso"),
|
||
|
AnimLegs: d.Number("Legs"),
|
||
|
AnimRightShoulderPad: d.Number("rSPad"),
|
||
|
AnimLeftShoulderPad: d.Number("lSPad"),
|
||
|
|
||
|
Useable: d.Number("useable") > 0,
|
||
|
|
||
|
Throwable: d.Number("throwable") > 0,
|
||
|
Stackable: d.Number("stackable") > 0,
|
||
|
MinStack: d.Number("minstack"),
|
||
|
MaxStack: d.Number("maxstack"),
|
||
|
|
||
|
Type: d.String("type"),
|
||
|
Type2: d.String("type2"),
|
||
|
|
||
|
DropSound: d.String("dropsound"),
|
||
|
DropSfxFrame: d.Number("dropsfxframe"),
|
||
|
UseSound: d.String("usesound"),
|
||
|
|
||
|
Unique: d.Number("unique") > 0,
|
||
|
Transparent: d.Number("transparent") > 0,
|
||
|
TransTable: d.Number("transtbl"),
|
||
|
Quivered: d.Number("quivered") > 0,
|
||
|
LightRadius: d.Number("lightradius"),
|
||
|
Belt: d.Number("belt") > 0,
|
||
|
|
||
|
Quest: d.Number("quest"),
|
||
|
|
||
|
MissileType: d.Number("missiletype"),
|
||
|
DurabilityWarning: d.Number("durwarning"),
|
||
|
QuantityWarning: d.Number("qntwarning"),
|
||
|
|
||
|
MinDamage: d.Number("mindam"),
|
||
|
MaxDamage: d.Number("maxdam"),
|
||
|
StrengthBonus: d.Number("StrBonus"),
|
||
|
DexterityBonus: d.Number("DexBonus"),
|
||
|
|
||
|
GemOffset: d.Number("gemoffset"),
|
||
|
BitField1: d.Number("bitfield1"),
|
||
|
|
||
|
Vendors: createItemVendorParams(d),
|
||
|
|
||
|
SourceArt: d.String("Source Art"),
|
||
|
GameArt: d.String("Game Art"),
|
||
|
ColorTransform: d.Number("Transform"),
|
||
|
InventoryColorTransform: d.Number("InvTrans"),
|
||
|
|
||
|
SkipName: d.Number("SkipName") > 0,
|
||
|
NightmareUpgrade: d.String("NightmareUpgrade"),
|
||
|
HellUpgrade: d.String("HellUpgrade"),
|
||
|
|
||
|
Nameable: d.Number("Nameable") > 0,
|
||
|
|
||
|
// weapon params
|
||
|
BarbOneOrTwoHanded: d.Number("1or2handed") > 0,
|
||
|
UsesTwoHands: d.Number("2handed") > 0,
|
||
|
Min2HandDamage: d.Number("2handmindam"),
|
||
|
Max2HandDamage: d.Number("2handmaxdam"),
|
||
|
MinMissileDamage: d.Number("minmisdam"),
|
||
|
MaxMissileDamage: d.Number("maxmisdam"),
|
||
|
MissileSpeed: d.Number("misspeed"),
|
||
|
ExtraRange: d.Number("rangeadder"),
|
||
|
|
||
|
RequiredDexterity: d.Number("reqdex"),
|
||
|
|
||
|
WeaponClass: d.String("wclass"),
|
||
|
WeaponClass2Hand: d.String("2handedwclass"),
|
||
|
|
||
|
HitClass: d.String("hit class"),
|
||
|
SpawnStack: d.Number("spawnstack"),
|
||
|
|
||
|
SpecialFeature: d.String("special"),
|
||
|
|
||
|
QuestDifficultyCheck: d.Number("questdiffcheck") > 0,
|
||
|
|
||
|
PermStoreItem: d.Number("PermStoreItem") > 0,
|
||
|
|
||
|
// misc params
|
||
|
FlavorText: d.String("szFlavorText"),
|
||
|
|
||
|
Transmogrify: d.Number("Transmogrify") > 0,
|
||
|
TransmogCode: d.String("TMogType"),
|
||
|
TransmogMin: d.Number("TMogMin"),
|
||
|
TransmogMax: d.Number("TMogMax"),
|
||
|
|
||
|
AutoBelt: d.Number("autobelt") > 0,
|
||
|
|
||
|
SpellIcon: d.Number("spellicon"),
|
||
|
SpellType: d.Number("pSpell"),
|
||
|
OverlayState: d.String("state"),
|
||
|
CureOverlayStates: [2]string{
|
||
|
d.String("cstate1"),
|
||
|
d.String("cstate2"),
|
||
|
},
|
||
|
EffectLength: d.Number("len"),
|
||
|
UsageStats: createItemUsageStats(d),
|
||
|
|
||
|
SpellDescriptionType: d.Number("spelldesc"),
|
||
|
// 0 = none, 1 = use desc string, 2 = use desc string + calc value
|
||
|
SpellDescriptionString: d.String("spelldescstr"),
|
||
|
SpellDescriptionCalc: d2calculation.CalcString(d.String("spelldesccalc")),
|
||
|
|
||
|
BetterGem: d.String("BetterGem"),
|
||
|
|
||
|
Multibuy: d.Number("multibuy") > 0,
|
||
|
}
|
||
|
|
||
|
records[record.Code] = record
|
||
|
}
|
||
|
|
||
|
if d.Err != nil {
|
||
|
return nil, d.Err
|
||
|
}
|
||
|
|
||
|
return records, nil
|
||
|
}
|
||
|
|
||
|
func createItemVendorParams(d *d2txt.DataDictionary) map[string]*ItemVendorParams {
|
||
|
vs := []string{
|
||
|
"Charsi",
|
||
|
"Gheed",
|
||
|
"Akara",
|
||
|
"Fara",
|
||
|
"Lysander",
|
||
|
"Drognan",
|
||
|
"Hralti",
|
||
|
"Alkor",
|
||
|
"Ormus",
|
||
|
"Elzix",
|
||
|
"Asheara",
|
||
|
"Cain",
|
||
|
"Halbu",
|
||
|
"Jamella",
|
||
|
"Larzuk",
|
||
|
"Malah",
|
||
|
"Drehya",
|
||
|
}
|
||
|
|
||
|
result := make(map[string]*ItemVendorParams)
|
||
|
|
||
|
for _, name := range vs {
|
||
|
wvp := ItemVendorParams{
|
||
|
Min: d.Number(fmt.Sprintf("%s%s", name, "Min")),
|
||
|
Max: d.Number(fmt.Sprintf("%s%s", name, "Max")),
|
||
|
MagicMin: d.Number(fmt.Sprintf("%s%s", name, "MagicMin")),
|
||
|
MagicMax: d.Number(fmt.Sprintf("%s%s", name, "MagicMax")),
|
||
|
MagicLevel: d.Number(fmt.Sprintf("%s%s", name, "MagicLvl")),
|
||
|
}
|
||
|
result[name] = &wvp
|
||
|
}
|
||
|
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
func createItemUsageStats(d *d2txt.DataDictionary) [3]ItemUsageStat {
|
||
|
result := [3]ItemUsageStat{}
|
||
|
for i := 0; i < 3; i++ {
|
||
|
result[i].Stat = d.String("stat" + strconv.Itoa(i))
|
||
|
result[i].Calc = d2calculation.CalcString(d.String("calc" + strconv.Itoa(i)))
|
||
|
}
|
||
|
|
||
|
return result
|
||
|
}
|