1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-11-18 10:26:02 -05:00
OpenDiablo2/d2core/d2records/missiles_loader.go

318 lines
8.4 KiB
Go
Raw Normal View History

package d2records
import (
"log"
Removing d2datadict singletons (#738) * Remove weapons, armor, misc, itemCommon, itemTyps datadict singletons - removed loader calls from d2app - removed the HeroObjects singleton from `d2core/d2inventory` - added an InventoryItemFactory in d2inventory - package-level functions that use data records are now methods of the InventoryItemFactory - renamed ItemGenerator in d2item to ItemFactory - package-level functions that use records are now methods of ItemFactory - d2map.MapEntityFactory now has an item factory instance for creating items - fixed a bug in unique item record loader where it loaded an empty record - added a PlayerStateFactory for creating a player state (uses the asset manager) - updated the test inventory/equipment code in d2player to handle errors from the ItemFactory - character select and character creation screens have a player state and inventory item factory - updated item tests to use the item factory * minor edit * Removed d2datadict.Experience singleton added a HeroStatsFactory, much like the other factories. The factory gets an asset manager reference in order to use data records. * removed d2datadict.AutoMagic singleton * removed d2datadict.AutoMap singleton * removed d2datadict.BodyLocations singleton * removed d2datadict.Books singleton * Removed singletons for level records - removed loader calls in d2app - changed type references from d2datadict to d2records - added a `MapGenerator` in d2mapgen which uses thew asset manager and map engine - package-level map generation functions are now MapGenerator methods - `d2datadict.GetLevelDetails(id int)` is now a method of the RecordManager * remove SkillCalc and MissileCalc singletons * Removed CharStats and ItemStatCost singletons - added an ItemStatFactory which uses the asset manager to create stats - package-level functions for stats in d2item are now StatFactory methods - changed type references from d2datadict to d2records - `d2player.GetAllPlayerStates` is now a method of the `PlayerStateFactory` * Removed DkillDesc and Skills singletons from d2datadict - removed loader calls from d2app - diablo2stats.Stat instances are given a reference to the factory for doing record lookups * update the stats test to use mock a asset manager and stat factory * fixed diablo2stats tests and diablo2item tests * removed CompCodes singleton from d2datadict * remove cubemain singleton from d2datadict * removed DifficultyLevels singleton from d2datadict * removed ElemTypes singleton from d2datadict * removed events.go loader from d2datadict (was unused) * removed Gems singleton from d2datadict * removed Hireling and Inventory singletons from d2datadict * removed MagicPrefix and MagicSuffix singletons from d2datadict * removed ItemRatios singleton from d2datadict * removed Missiles singleton from d2datadict * removed MonModes singleton * Removed all monster and npc singletons from d2datadict - MapStamp instances now get a reference to their factory for doing record lookups * removed SoundEntry and SoundEnviron singletons from d2datadict
2020-09-20 17:52:01 -04:00
"strings"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2txt"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2calculation"
)
// nolint:funlen // cant reduce
func missilesLoader(r *RecordManager, d *d2txt.DataDictionary) error {
records := make(Missiles)
Removing d2datadict singletons (#738) * Remove weapons, armor, misc, itemCommon, itemTyps datadict singletons - removed loader calls from d2app - removed the HeroObjects singleton from `d2core/d2inventory` - added an InventoryItemFactory in d2inventory - package-level functions that use data records are now methods of the InventoryItemFactory - renamed ItemGenerator in d2item to ItemFactory - package-level functions that use records are now methods of ItemFactory - d2map.MapEntityFactory now has an item factory instance for creating items - fixed a bug in unique item record loader where it loaded an empty record - added a PlayerStateFactory for creating a player state (uses the asset manager) - updated the test inventory/equipment code in d2player to handle errors from the ItemFactory - character select and character creation screens have a player state and inventory item factory - updated item tests to use the item factory * minor edit * Removed d2datadict.Experience singleton added a HeroStatsFactory, much like the other factories. The factory gets an asset manager reference in order to use data records. * removed d2datadict.AutoMagic singleton * removed d2datadict.AutoMap singleton * removed d2datadict.BodyLocations singleton * removed d2datadict.Books singleton * Removed singletons for level records - removed loader calls in d2app - changed type references from d2datadict to d2records - added a `MapGenerator` in d2mapgen which uses thew asset manager and map engine - package-level map generation functions are now MapGenerator methods - `d2datadict.GetLevelDetails(id int)` is now a method of the RecordManager * remove SkillCalc and MissileCalc singletons * Removed CharStats and ItemStatCost singletons - added an ItemStatFactory which uses the asset manager to create stats - package-level functions for stats in d2item are now StatFactory methods - changed type references from d2datadict to d2records - `d2player.GetAllPlayerStates` is now a method of the `PlayerStateFactory` * Removed DkillDesc and Skills singletons from d2datadict - removed loader calls from d2app - diablo2stats.Stat instances are given a reference to the factory for doing record lookups * update the stats test to use mock a asset manager and stat factory * fixed diablo2stats tests and diablo2item tests * removed CompCodes singleton from d2datadict * remove cubemain singleton from d2datadict * removed DifficultyLevels singleton from d2datadict * removed ElemTypes singleton from d2datadict * removed events.go loader from d2datadict (was unused) * removed Gems singleton from d2datadict * removed Hireling and Inventory singletons from d2datadict * removed MagicPrefix and MagicSuffix singletons from d2datadict * removed ItemRatios singleton from d2datadict * removed Missiles singleton from d2datadict * removed MonModes singleton * Removed all monster and npc singletons from d2datadict - MapStamp instances now get a reference to their factory for doing record lookups * removed SoundEntry and SoundEnviron singletons from d2datadict
2020-09-20 17:52:01 -04:00
r.missilesByName = make(missilesByName)
for d.Next() {
record := &MissileRecord{
Name: d.String("Missile"),
Id: d.Number("Id"),
ClientMovementFunc: d.Number("pCltDoFunc"),
ClientCollisionFunc: d.Number("pCltHitFunc"),
ServerMovementFunc: d.Number("pSrvDoFunc"),
ServerCollisionFunc: d.Number("pSrvHitFunc"),
ServerDamageFunc: d.Number("pSrvDmgFunc"),
ServerMovementCalc: MissileCalc{
Calc: "SrvCalc1",
Desc: "*srv calc 1 desc",
Params: []MissileCalcParam{
{
d.Number("Param1"),
d.String("*param1 desc"),
},
{
d.Number("Param2"),
d.String("*param2 desc"),
},
{
d.Number("Param3"),
d.String("*param3 desc"),
},
{
d.Number("Param4"),
d.String("*param4 desc"),
},
{
d.Number("Param5"),
d.String("*param5 desc"),
},
},
},
ClientMovementCalc: MissileCalc{
Calc: "CltCalc1",
Desc: "*client calc 1 desc",
Params: []MissileCalcParam{
{
d.Number("CltParam1"),
d.String("*client param1 desc"),
},
{
d.Number("CltParam2"),
d.String("*client param2 desc"),
},
{
d.Number("CltParam3"),
d.String("*client param3 desc"),
},
{
d.Number("CltParam4"),
d.String("*client param4 desc"),
},
{
d.Number("CltParam5"),
d.String("*client param5 desc"),
},
},
},
ServerCollisionCalc: MissileCalc{
Calc: "SHitCalc1",
Desc: "*server hit calc 1 desc",
Params: []MissileCalcParam{
{
d.Number("sHitPar1"),
d.String("*server hit param1 desc"),
},
{
d.Number("sHitPar2"),
d.String("*server hit param2 desc"),
},
{
d.Number("sHitPar3"),
d.String("*server hit param3 desc"),
},
},
},
ClientCollisionCalc: MissileCalc{
Calc: "CHitCalc1",
Desc: "*client hit calc 1 desc",
Params: []MissileCalcParam{
{
d.Number("cHitPar1"),
d.String("*client hit param1 desc"),
},
{
d.Number("cHitPar2"),
d.String("*client hit param2 desc"),
},
{
d.Number("cHitPar3"),
d.String("*client hit param3 desc"),
},
},
},
ServerDamageCalc: MissileCalc{
Calc: "DmgCalc1",
Desc: "*damage calc 1",
Params: []MissileCalcParam{
{
d.Number("dParam1"),
d.String("*damage param1 desc"),
},
{
d.Number("dParam2"),
d.String("*damage param2 desc"),
},
},
},
Velocity: d.Number("Vel"),
MaxVelocity: d.Number("MaxVel"),
LevelVelocityBonus: d.Number("VelLev"),
Accel: d.Number("Accel"),
Range: d.Number("Range"),
LevelRangeBonus: d.Number("LevRange"),
Light: MissileLight{
Diameter: d.Number("Light"),
Flicker: d.Number("Flicker"),
Red: uint8(d.Number("Red")),
Green: uint8(d.Number("Green")),
Blue: uint8(d.Number("Blue")),
},
Animation: MissileAnimation{
StepsBeforeVisible: d.Number("InitSteps"),
StepsBeforeActive: d.Number("Activate"),
LoopAnimation: d.Number("LoopAnim") > 0,
CelFileName: d.String("CelFile"),
AnimationRate: d.Number("animrate"),
AnimationLength: d.Number("AnimLen"),
AnimationSpeed: d.Number("AnimSpeed"),
StartingFrame: d.Number("RandStart"),
HasSubLoop: d.Number("SubLoop") > 0,
SubStartingFrame: d.Number("SubStart"),
SubEndingFrame: d.Number("SubStop"),
},
Collision: MissileCollision{
CollisionType: d.Number("CollideType"),
DestroyedUponCollision: d.Number("CollideKill") > 0,
FriendlyFire: d.Number("CollideFriend") > 0,
LastCollide: d.Number("LastCollide") > 0,
Collision: d.Number("Collision") > 0,
ClientCollision: d.Number("ClientCol") > 0,
ClientSend: d.Number("ClientSend") > 0,
UseCollisionTimer: d.Number("NextHit") > 0,
TimerFrames: d.Number("NextDelay"),
},
XOffset: d.Number("xoffset"),
YOffset: d.Number("yoffset"),
ZOffset: d.Number("zoffset"),
Size: d.Number("Size"),
DestroyedByTP: d.Number("SrcTown") > 0,
DestroyedByTPFrame: d.Number("CltSrcTown"),
CanDestroy: d.Number("CanDestroy") > 0,
UseAttackRating: d.Number("ToHit") > 0,
AlwaysExplode: d.Number("AlwaysExplode") > 0,
ClientExplosion: d.Number("Explosion") > 0,
TownSafe: d.Number("Town") > 0,
IgnoreBossModifiers: d.Number("NoUniqueMod") > 0,
IgnoreMultishot: d.Number("NoMultiShot") > 0,
HolyFilterType: d.Number("Holy"),
CanBeSlowed: d.Number("CanSlow") > 0,
TriggersHitEvents: d.Number("ReturnFire") > 0,
TriggersGetHit: d.Number("GetHit") > 0,
SoftHit: d.Number("SoftHit") > 0,
KnockbackPercent: d.Number("KnockBack"),
TransparencyMode: d.Number("Trans"),
UseQuantity: d.Number("Qty") > 0,
AffectedByPierce: d.Number("Pierce") > 0,
SpecialSetup: d.Number("SpecialSetup") > 0,
MissileSkill: d.Number("MissileSkill") > 0,
SkillName: d.String("Skill"),
ResultFlags: d.Number("ResultFlags"),
HitFlags: d.Number("HitFlags"),
HitShift: d.Number("HitShift"),
ApplyMastery: d.Number("ApplyMastery") > 0,
SourceDamage: d.Number("SrcDamage"),
HalfDamageForTwoHander: d.Number("Half2HSrc") > 0,
SourceMissDamage: d.Number("SrcMissDmg"),
Damage: MissileDamage{
MinDamage: d.Number("MinDamage"),
MinLevelDamage: [5]int{
d.Number("MinLevDam1"),
d.Number("MinLevDam2"),
d.Number("MinLevDam3"),
d.Number("MinLevDam4"),
d.Number("MinLevDam5"),
},
MaxDamage: d.Number("MaxDamage"),
MaxLevelDamage: [5]int{
d.Number("MaxLevDam1"),
d.Number("MaxLevDam2"),
d.Number("MaxLevDam3"),
d.Number("MaxLevDam4"),
d.Number("MaxLevDam5"),
},
DamageSynergyPerCalc: d2calculation.CalcString(d.String("DmgSymPerCalc")),
},
ElementalDamage: MissileElementalDamage{
ElementType: d.String("EType"),
Damage: MissileDamage{
MinDamage: d.Number("MinEDamage"),
MinLevelDamage: [5]int{
d.Number("MinELevDam1"),
d.Number("MinELevDam2"),
d.Number("MinELevDam3"),
d.Number("MinELevDam4"),
d.Number("MinELevDam5"),
},
MaxDamage: d.Number("MaxEDamage"),
MaxLevelDamage: [5]int{
d.Number("MaxELevDam1"),
d.Number("MaxELevDam2"),
d.Number("MaxELevDam3"),
d.Number("MaxELevDam4"),
d.Number("MaxELevDam5"),
},
DamageSynergyPerCalc: d2calculation.CalcString(d.String("EDmgSymPerCalc")),
},
Duration: d.Number("ELen"),
LevelDuration: [3]int{
d.Number("ELevLen1"),
d.Number("ELevLen2"),
d.Number("ELevLen3"),
},
},
HitClass: d.Number("HitClass"),
NumDirections: d.Number("NumDirections"),
LocalBlood: d.Number("LocalBlood"),
DamageReductionRate: d.Number("DamageRate"),
TravelSound: d.String("TravelSound"),
HitSound: d.String("HitSound"),
ProgSound: d.String("ProgSound"),
ProgOverlay: d.String("ProgOverlay"),
ExplosionMissile: d.String("ExplosionMissile"),
SubMissile: [3]string{
d.String("SubMissile1"),
d.String("SubMissile2"),
d.String("SubMissile3"),
},
HitSubMissile: [4]string{
d.String("HitSubMissile1"),
d.String("HitSubMissile2"),
d.String("HitSubMissile3"),
d.String("HitSubMissile4"),
},
ClientSubMissile: [3]string{
d.String("CltSubMissile1"),
d.String("CltSubMissile2"),
d.String("CltSubMissile3"),
},
ClientHitSubMissile: [4]string{
d.String("CltHitSubMissile1"),
d.String("CltHitSubMissile2"),
d.String("CltHitSubMissile3"),
d.String("CltHitSubMissile4"),
},
}
records[record.Id] = record
Removing d2datadict singletons (#738) * Remove weapons, armor, misc, itemCommon, itemTyps datadict singletons - removed loader calls from d2app - removed the HeroObjects singleton from `d2core/d2inventory` - added an InventoryItemFactory in d2inventory - package-level functions that use data records are now methods of the InventoryItemFactory - renamed ItemGenerator in d2item to ItemFactory - package-level functions that use records are now methods of ItemFactory - d2map.MapEntityFactory now has an item factory instance for creating items - fixed a bug in unique item record loader where it loaded an empty record - added a PlayerStateFactory for creating a player state (uses the asset manager) - updated the test inventory/equipment code in d2player to handle errors from the ItemFactory - character select and character creation screens have a player state and inventory item factory - updated item tests to use the item factory * minor edit * Removed d2datadict.Experience singleton added a HeroStatsFactory, much like the other factories. The factory gets an asset manager reference in order to use data records. * removed d2datadict.AutoMagic singleton * removed d2datadict.AutoMap singleton * removed d2datadict.BodyLocations singleton * removed d2datadict.Books singleton * Removed singletons for level records - removed loader calls in d2app - changed type references from d2datadict to d2records - added a `MapGenerator` in d2mapgen which uses thew asset manager and map engine - package-level map generation functions are now MapGenerator methods - `d2datadict.GetLevelDetails(id int)` is now a method of the RecordManager * remove SkillCalc and MissileCalc singletons * Removed CharStats and ItemStatCost singletons - added an ItemStatFactory which uses the asset manager to create stats - package-level functions for stats in d2item are now StatFactory methods - changed type references from d2datadict to d2records - `d2player.GetAllPlayerStates` is now a method of the `PlayerStateFactory` * Removed DkillDesc and Skills singletons from d2datadict - removed loader calls from d2app - diablo2stats.Stat instances are given a reference to the factory for doing record lookups * update the stats test to use mock a asset manager and stat factory * fixed diablo2stats tests and diablo2item tests * removed CompCodes singleton from d2datadict * remove cubemain singleton from d2datadict * removed DifficultyLevels singleton from d2datadict * removed ElemTypes singleton from d2datadict * removed events.go loader from d2datadict (was unused) * removed Gems singleton from d2datadict * removed Hireling and Inventory singletons from d2datadict * removed MagicPrefix and MagicSuffix singletons from d2datadict * removed ItemRatios singleton from d2datadict * removed Missiles singleton from d2datadict * removed MonModes singleton * Removed all monster and npc singletons from d2datadict - MapStamp instances now get a reference to their factory for doing record lookups * removed SoundEntry and SoundEnviron singletons from d2datadict
2020-09-20 17:52:01 -04:00
r.missilesByName[sanitizeMissilesKey(record.Name)] = record
}
if d.Err != nil {
return d.Err
}
log.Printf("Loaded %d Missile Records", len(records))
r.Missiles = records
return nil
}
Removing d2datadict singletons (#738) * Remove weapons, armor, misc, itemCommon, itemTyps datadict singletons - removed loader calls from d2app - removed the HeroObjects singleton from `d2core/d2inventory` - added an InventoryItemFactory in d2inventory - package-level functions that use data records are now methods of the InventoryItemFactory - renamed ItemGenerator in d2item to ItemFactory - package-level functions that use records are now methods of ItemFactory - d2map.MapEntityFactory now has an item factory instance for creating items - fixed a bug in unique item record loader where it loaded an empty record - added a PlayerStateFactory for creating a player state (uses the asset manager) - updated the test inventory/equipment code in d2player to handle errors from the ItemFactory - character select and character creation screens have a player state and inventory item factory - updated item tests to use the item factory * minor edit * Removed d2datadict.Experience singleton added a HeroStatsFactory, much like the other factories. The factory gets an asset manager reference in order to use data records. * removed d2datadict.AutoMagic singleton * removed d2datadict.AutoMap singleton * removed d2datadict.BodyLocations singleton * removed d2datadict.Books singleton * Removed singletons for level records - removed loader calls in d2app - changed type references from d2datadict to d2records - added a `MapGenerator` in d2mapgen which uses thew asset manager and map engine - package-level map generation functions are now MapGenerator methods - `d2datadict.GetLevelDetails(id int)` is now a method of the RecordManager * remove SkillCalc and MissileCalc singletons * Removed CharStats and ItemStatCost singletons - added an ItemStatFactory which uses the asset manager to create stats - package-level functions for stats in d2item are now StatFactory methods - changed type references from d2datadict to d2records - `d2player.GetAllPlayerStates` is now a method of the `PlayerStateFactory` * Removed DkillDesc and Skills singletons from d2datadict - removed loader calls from d2app - diablo2stats.Stat instances are given a reference to the factory for doing record lookups * update the stats test to use mock a asset manager and stat factory * fixed diablo2stats tests and diablo2item tests * removed CompCodes singleton from d2datadict * remove cubemain singleton from d2datadict * removed DifficultyLevels singleton from d2datadict * removed ElemTypes singleton from d2datadict * removed events.go loader from d2datadict (was unused) * removed Gems singleton from d2datadict * removed Hireling and Inventory singletons from d2datadict * removed MagicPrefix and MagicSuffix singletons from d2datadict * removed ItemRatios singleton from d2datadict * removed Missiles singleton from d2datadict * removed MonModes singleton * Removed all monster and npc singletons from d2datadict - MapStamp instances now get a reference to their factory for doing record lookups * removed SoundEntry and SoundEnviron singletons from d2datadict
2020-09-20 17:52:01 -04:00
func sanitizeMissilesKey(missileName string) string {
return strings.ToLower(strings.ReplaceAll(missileName, " ", ""))
}