Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions proto/common.proto
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,6 @@ enum RangedWeaponType {
RangedWeaponTypeBow = 1;
RangedWeaponTypeCrossbow = 2;
RangedWeaponTypeGun = 3;
RangedWeaponTypeRelic = 4;
RangedWeaponTypeThrown = 5;
RangedWeaponTypeWand = 6;
}
Expand All @@ -387,7 +386,6 @@ enum ItemSlot {
ItemSlotTrinket2 = 13;
ItemSlotMainHand = 14; // can be 1h or 2h
ItemSlotOffHand = 15;
ItemSlotRanged = 16;
}

enum ItemQuality {
Expand Down
18 changes: 3 additions & 15 deletions sim/core/attack.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,19 +47,6 @@ func newWeaponFromUnarmed(critMultiplier float64) Weapon {
}
}

func getWeaponMinRange(item *Item) float64 {
switch item.RangedWeaponType {
case proto.RangedWeaponType_RangedWeaponTypeThrown:
case proto.RangedWeaponType_RangedWeaponTypeUnknown:
case proto.RangedWeaponType_RangedWeaponTypeWand:
return 0.
default:
return 5
}

return 0
}

func getWeaponMaxRange(item *Item) float64 {
switch item.RangedWeaponType {
case proto.RangedWeaponType_RangedWeaponTypeUnknown:
Expand Down Expand Up @@ -91,7 +78,7 @@ func newWeaponFromItem(item *Item, critMultiplier float64, bonusDps float64) Wea
NormalizedSwingSpeed: normalizedWeaponSpeed,
CritMultiplier: critMultiplier,
AttackPowerPerDPS: DefaultAttackPowerPerDPS,
MinRange: getWeaponMinRange(item),
MinRange: 0, // no more deadzone in MoP
MaxRange: getWeaponMaxRange(item),
}
}
Expand All @@ -116,7 +103,8 @@ func (character *Character) WeaponFromOffHand(critMultiplier float64) Weapon {

// Returns weapon stats using the ranged equipped weapon.
func (character *Character) WeaponFromRanged(critMultiplier float64) Weapon {
if weapon := character.GetRangedWeapon(); weapon != nil {
weapon := character.Ranged()
if weapon != nil {
return newWeaponFromItem(weapon, critMultiplier, character.PseudoStats.BonusRangedDps)
} else {
return Weapon{}
Expand Down
14 changes: 2 additions & 12 deletions sim/core/character.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ func NewCharacter(party *Party, partyIndex int, player *proto.Player) Character
character.PseudoStats.InFrontOfTarget = player.InFrontOfTarget

if player.EnableItemSwap && player.ItemSwap != nil {
character.enableItemSwap(player.ItemSwap, character.DefaultCritMultiplier(), character.DefaultCritMultiplier(), 0)
character.enableItemSwap(player.ItemSwap, character.DefaultCritMultiplier(), character.DefaultCritMultiplier(), character.DefaultCritMultiplier())
}

character.EquipScalingManager = character.NewEquipScalingManager()
Expand Down Expand Up @@ -530,18 +530,8 @@ func (character *Character) HasOHWeapon() bool {
return character.GetOHWeapon() != nil
}

// Returns the ranged weapon if one is equipped, and null otherwise.
func (character *Character) GetRangedWeapon() *Item {
weapon := character.Ranged()
if weapon.ID == 0 ||
weapon.RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeRelic {
return nil
} else {
return weapon
}
}
func (character *Character) HasRangedWeapon() bool {
return character.GetRangedWeapon() != nil
return character.Ranged() != nil
}

func (character *Character) GetDynamicProcMaskForWeaponEnchant(effectID int32) *ProcMask {
Expand Down
4 changes: 2 additions & 2 deletions sim/core/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ const OffHand Hand = false

const CombatTableCoverageCap = 1.024 // 102.4% chance to avoid an attack

const NumItemSlots = proto.ItemSlot_ItemSlotRanged + 1
const NumItemSlots = proto.ItemSlot_ItemSlotOffHand + 1

func TrinketSlots() []proto.ItemSlot {
return []proto.ItemSlot{proto.ItemSlot_ItemSlotTrinket1, proto.ItemSlot_ItemSlotTrinket2}
Expand All @@ -43,7 +43,7 @@ func MeleeWeaponSlots() []proto.ItemSlot {
}

func AllWeaponSlots() []proto.ItemSlot {
return []proto.ItemSlot{proto.ItemSlot_ItemSlotMainHand, proto.ItemSlot_ItemSlotOffHand, proto.ItemSlot_ItemSlotRanged}
return []proto.ItemSlot{proto.ItemSlot_ItemSlotMainHand, proto.ItemSlot_ItemSlotOffHand}
}

func ArmorSpecializationSlots() []proto.ItemSlot {
Expand Down
15 changes: 10 additions & 5 deletions sim/core/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ type ItemSpec struct {
ChallengeMode bool
}

type Equipment [proto.ItemSlot_ItemSlotRanged + 1]Item
type Equipment [NumItemSlots]Item

func (equipment *Equipment) MainHand() *Item {
return &equipment[proto.ItemSlot_ItemSlotMainHand]
Expand All @@ -257,7 +257,12 @@ func (equipment *Equipment) OffHand() *Item {
}

func (equipment *Equipment) Ranged() *Item {
return &equipment[proto.ItemSlot_ItemSlotRanged]
mh := equipment.MainHand()
if mh.RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeUnknown {
return nil
}

return mh
}

func (equipment *Equipment) Head() *Item {
Expand Down Expand Up @@ -373,7 +378,7 @@ func (equipment *Equipment) ToEquipmentSpecProto() *proto.EquipmentSpec {
}

// Structs used for looking up items/gems/enchants
type EquipmentSpec [proto.ItemSlot_ItemSlotRanged + 1]ItemSpec
type EquipmentSpec [NumItemSlots]ItemSpec

func ProtoToEquipmentSpec(es *proto.EquipmentSpec) EquipmentSpec {
var coreEquip EquipmentSpec
Expand Down Expand Up @@ -612,7 +617,7 @@ func ItemTypeToSlot(it proto.ItemType) proto.ItemSlot {
case proto.ItemType_ItemTypeWeapon:
return proto.ItemSlot_ItemSlotMainHand
case proto.ItemType_ItemTypeRanged:
return proto.ItemSlot_ItemSlotRanged
return proto.ItemSlot_ItemSlotMainHand
}

return 255
Expand All @@ -632,7 +637,7 @@ var itemTypeToSlotsMap = map[proto.ItemType][]proto.ItemSlot{
proto.ItemType_ItemTypeFeet: {proto.ItemSlot_ItemSlotFeet},
proto.ItemType_ItemTypeFinger: {proto.ItemSlot_ItemSlotFinger1, proto.ItemSlot_ItemSlotFinger2},
proto.ItemType_ItemTypeTrinket: {proto.ItemSlot_ItemSlotTrinket1, proto.ItemSlot_ItemSlotTrinket2},
proto.ItemType_ItemTypeRanged: {proto.ItemSlot_ItemSlotRanged},
proto.ItemType_ItemTypeRanged: {proto.ItemSlot_ItemSlotMainHand},
// ItemType_ItemTypeWeapon is excluded intentionally - the slot cannot be decided based on type alone for weapons.
}

Expand Down
23 changes: 14 additions & 9 deletions sim/core/item_swaps.go
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ func (swap *ItemSwap) SwapItems(sim *Simulation, swapSet proto.APLActionItemSwap
isPrepull := sim.CurrentTime < 0

for _, slot := range swap.slots {
if (slot >= proto.ItemSlot_ItemSlotMainHand) && (slot <= proto.ItemSlot_ItemSlotRanged) {
if slot == proto.ItemSlot_ItemSlotMainHand || slot == proto.ItemSlot_ItemSlotOffHand {
weaponSlotSwapped = true
} else if !isReset && !isPrepull {
continue
Expand Down Expand Up @@ -374,10 +374,19 @@ func (swap *ItemSwap) swapItem(sim *Simulation, slot proto.ItemSlot, isPrepull b

switch slot {
case proto.ItemSlot_ItemSlotMainHand:
// Feral's concept of Paws is handeled in the druid.go Initialize()
// and doesn't need MH swap handling here.
if character.AutoAttacks.AutoSwingMelee && !swap.isFeralDruid {
character.AutoAttacks.SetMH(character.WeaponFromMainHand(swap.mhCritMultiplier))

// As of MoP Ranged Weapons are worn in the Main Hand
// If we can get it, we equipeed a valid ranged weapon
if character.Ranged() != nil {
if character.AutoAttacks.AutoSwingRanged {
character.AutoAttacks.SetRanged(character.WeaponFromRanged(swap.rangedCritMultiplier))
}
} else {
// Feral's concept of Paws is handeled in the druid.go Initialize()
// and doesn't need MH swap handling here.
if character.AutoAttacks.AutoSwingMelee && !swap.isFeralDruid {
character.AutoAttacks.SetMH(character.WeaponFromMainHand(swap.mhCritMultiplier))
}
}
case proto.ItemSlot_ItemSlotOffHand:
// OH slot handling is more involved because we need to dynamically toggle the OH weapon attack on/off
Expand All @@ -392,10 +401,6 @@ func (swap *ItemSwap) swapItem(sim *Simulation, slot proto.ItemSlot, isPrepull b
}
character.PseudoStats.CanBlock = character.OffHand().WeaponType == proto.WeaponType_WeaponTypeShield
}
case proto.ItemSlot_ItemSlotRanged:
if character.AutoAttacks.AutoSwingRanged {
character.AutoAttacks.SetRanged(character.WeaponFromRanged(swap.rangedCritMultiplier))
}
}
}

Expand Down
18 changes: 12 additions & 6 deletions sim/core/racials.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,12 @@ func applyRaceEffects(agent Agent) {
case proto.Race_RaceDwarf:
character.PseudoStats.ReducedFrostHitTakenChance += 0.02

// Gun specialization (+1% ranged crit when using a gun).
if character.Ranged().RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeGun {
character.AddBonusRangedCritPercent(1)
// Crack Shot: 1% Expertise with Ranged Weapons
ranged := character.Ranged()
if ranged != nil && (ranged.RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeBow ||
ranged.RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeGun ||
ranged.RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeCrossbow) {
character.AddStat(stats.ExpertiseRating, ExpertisePerQuarterPercentReduction*4)
}

applyWeaponSpecialization(character, 3*ExpertisePerQuarterPercentReduction,
Expand Down Expand Up @@ -230,9 +233,12 @@ func applyRaceEffects(agent Agent) {
character.PseudoStats.ReducedNatureHitTakenChance += 0.02
character.AddStat(stats.Health, character.GetBaseStats()[stats.Health]*0.05)
case proto.Race_RaceTroll:
// Bow specialization (+1% ranged crit when using a bow).
if character.Ranged().RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeBow {
character.AddBonusRangedCritPercent(1)
// Dead Eye: 1% Expertise with Guns, Bows or Crossbows.
ranged := character.Ranged()
if ranged != nil && (ranged.RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeBow ||
ranged.RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeGun ||
ranged.RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeCrossbow) {
character.AddStat(stats.ExpertiseRating, ExpertisePerQuarterPercentReduction*4)
}

// Beast Slaying (+5% damage to beasts)
Expand Down
4 changes: 1 addition & 3 deletions sim/death_knight/blood/_blood_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,5 @@ var ItemFilter = core.ItemFilter{
proto.WeaponType_WeaponTypeSword,
proto.WeaponType_WeaponTypeMace,
},
RangedWeaponTypes: []proto.RangedWeaponType{
proto.RangedWeaponType_RangedWeaponTypeRelic,
},
RangedWeaponTypes: []proto.RangedWeaponType{},
}
4 changes: 1 addition & 3 deletions sim/death_knight/frost/_frost_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,5 @@ var ItemFilter = core.ItemFilter{
proto.WeaponType_WeaponTypeSword,
proto.WeaponType_WeaponTypeMace,
},
RangedWeaponTypes: []proto.RangedWeaponType{
proto.RangedWeaponType_RangedWeaponTypeRelic,
},
RangedWeaponTypes: []proto.RangedWeaponType{},
}
4 changes: 1 addition & 3 deletions sim/death_knight/unholy/_unholy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,5 @@ var ItemFilter = core.ItemFilter{
proto.WeaponType_WeaponTypeSword,
proto.WeaponType_WeaponTypeMace,
},
RangedWeaponTypes: []proto.RangedWeaponType{
proto.RangedWeaponType_RangedWeaponTypeRelic,
},
RangedWeaponTypes: []proto.RangedWeaponType{},
}
6 changes: 2 additions & 4 deletions sim/druid/balance/_balance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,6 @@ var ItemFilter = core.ItemFilter{
proto.WeaponType_WeaponTypeStaff,
proto.WeaponType_WeaponTypePolearm,
},
ArmorType: proto.ArmorType_ArmorTypeLeather,
RangedWeaponTypes: []proto.RangedWeaponType{
proto.RangedWeaponType_RangedWeaponTypeRelic,
},
ArmorType: proto.ArmorType_ArmorTypeLeather,
RangedWeaponTypes: []proto.RangedWeaponType{},
}
6 changes: 2 additions & 4 deletions sim/druid/feral/_feral_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,8 @@ var FeralItemFilter = core.ItemFilter{
proto.WeaponType_WeaponTypeStaff,
proto.WeaponType_WeaponTypePolearm,
},
ArmorType: proto.ArmorType_ArmorTypeLeather,
RangedWeaponTypes: []proto.RangedWeaponType{
proto.RangedWeaponType_RangedWeaponTypeRelic,
},
ArmorType: proto.ArmorType_ArmorTypeLeather,
RangedWeaponTypes: []proto.RangedWeaponType{},
}

func TestFeral(t *testing.T) {
Expand Down
6 changes: 2 additions & 4 deletions sim/druid/guardian/_tank_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,8 @@ func TestGuardian(t *testing.T) {
proto.WeaponType_WeaponTypeStaff,
proto.WeaponType_WeaponTypePolearm,
},
ArmorType: proto.ArmorType_ArmorTypeLeather,
RangedWeaponTypes: []proto.RangedWeaponType{
proto.RangedWeaponType_RangedWeaponTypeRelic,
},
ArmorType: proto.ArmorType_ArmorTypeLeather,
RangedWeaponTypes: []proto.RangedWeaponType{},
},
}))
}
Expand Down
4 changes: 1 addition & 3 deletions sim/druid/restoration/_restoration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,7 @@ func init() {
// proto.WeaponType_WeaponTypePolearm,
// },
// ArmorType: proto.ArmorType_ArmorTypeLeather,
// RangedWeaponTypes: []proto.RangedWeaponType{
// proto.RangedWeaponType_RangedWeaponTypeRelic,
// },
// RangedWeaponTypes: []proto.RangedWeaponType{},
// },
// }))
// }
Expand Down
8 changes: 2 additions & 6 deletions sim/hunter/hunter.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,10 @@ func NewHunter(character *core.Character, options *proto.Player, hunterOptions *
rangedWeapon := hunter.WeaponFromRanged(0)

hunter.EnableAutoAttacks(hunter, core.AutoAttackOptions{
// We don't know crit multiplier until later when we see the target so just
// use 0 for now.
MainHand: hunter.WeaponFromMainHand(0),
OffHand: hunter.WeaponFromOffHand(0),
Ranged: rangedWeapon,
Ranged: rangedWeapon,
//ReplaceMHSwing: hunter.TryRaptorStrike, //Todo: Might be weaving
AutoSwingRanged: true,
AutoSwingMelee: true,
AutoSwingMelee: false,
})

hunter.AutoAttacks.RangedConfig().ApplyEffects = func(sim *core.Simulation, target *core.Unit, spell *core.Spell) {
Expand Down
4 changes: 1 addition & 3 deletions sim/paladin/holy/_holy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,7 @@ func init() {
// proto.WeaponType_WeaponTypeShield,
// },
// ArmorType: proto.ArmorType_ArmorTypePlate,
// RangedWeaponTypes: []proto.RangedWeaponType{
// proto.RangedWeaponType_RangedWeaponTypeRelic,
// },
// RangedWeaponTypes: []proto.RangedWeaponType{},
// },
// }))
// }
Expand Down
6 changes: 2 additions & 4 deletions sim/paladin/protection/_protection_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,8 @@ func TestProtection(t *testing.T) {
proto.HandType_HandTypeOneHand,
proto.HandType_HandTypeOffHand,
},
ArmorType: proto.ArmorType_ArmorTypePlate,
RangedWeaponTypes: []proto.RangedWeaponType{
proto.RangedWeaponType_RangedWeaponTypeRelic,
},
ArmorType: proto.ArmorType_ArmorTypePlate,
RangedWeaponTypes: []proto.RangedWeaponType{},
},
}))
}
Expand Down
5 changes: 1 addition & 4 deletions sim/paladin/retribution/_retribution_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,7 @@ func TestRetribution(t *testing.T) {
proto.HandType_HandTypeTwoHand,
},
ArmorType: proto.ArmorType_ArmorTypePlate,
RangedWeaponTypes: []proto.RangedWeaponType{
proto.RangedWeaponType_RangedWeaponTypeRelic,
},
},
RangedWeaponTypes: []proto.RangedWeaponType{},
}))
}

Expand Down
9 changes: 5 additions & 4 deletions sim/rogue/rogue.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ type Rogue struct {

lastDeadlyPoisonProcMask core.ProcMask

deadlyPoisonPPHM [proto.ItemSlot_ItemSlotRanged + 1]*core.DynamicProcManager
instantPoisonPPMM [proto.ItemSlot_ItemSlotRanged + 1]*core.DynamicProcManager
woundPoisonPPMM [proto.ItemSlot_ItemSlotRanged + 1]*core.DynamicProcManager
deadlyPoisonPPHM [core.NumItemSlots]*core.DynamicProcManager
instantPoisonPPMM [core.NumItemSlots]*core.DynamicProcManager
woundPoisonPPMM [core.NumItemSlots]*core.DynamicProcManager

AdrenalineRushAura *core.Aura
BladeFlurryAura *core.Aura
Expand Down Expand Up @@ -324,7 +324,8 @@ func (rogue *Rogue) HasDagger(hand core.Hand) bool {

// Does the rogue have a thrown weapon equipped in the ranged slot?
func (rogue *Rogue) HasThrown() bool {
return rogue.Ranged().RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeThrown
weapon := rogue.Ranged()
return weapon != nil && weapon.RangedWeaponType == proto.RangedWeaponType_RangedWeaponTypeThrown
}

// Check if the rogue is considered in "stealth" for the purpose of casting abilities
Expand Down
6 changes: 2 additions & 4 deletions sim/shaman/elemental/_elemental_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,8 @@ func TestElemental(t *testing.T) {
proto.WeaponType_WeaponTypeShield,
proto.WeaponType_WeaponTypeStaff,
},
ArmorType: proto.ArmorType_ArmorTypeMail,
RangedWeaponTypes: []proto.RangedWeaponType{
proto.RangedWeaponType_RangedWeaponTypeRelic,
},
ArmorType: proto.ArmorType_ArmorTypeMail,
RangedWeaponTypes: []proto.RangedWeaponType{},
},
}))
}
Expand Down
Loading
Loading