diff --git a/internal/config/modifier.go b/internal/config/modifier.go index f3ca0a6..c13c8e3 100644 --- a/internal/config/modifier.go +++ b/internal/config/modifier.go @@ -93,48 +93,48 @@ var StatModifiers = map[int]float64{ } var ScalingFactor = map[int]float64{ - 0: 1.5, // ITEM_MOD_MANA - 1: 2.0, // ITEM_MOD_HEALTH - 3: 2.0, // ITEM_MOD_AGILITY - 4: 2.0, // ITEM_MOD_STRENGTH - 5: 2.0, // ITEM_MOD_INTELLECT - 6: 1.0, // ITEM_MOD_SPIRIT - 7: 2.5, // ITEM_MOD_STAMINA - 12: 1.5, // ITEM_MOD_DEFENSE_SKILL_RATING - 13: 1.5, // ITEM_MOD_DODGE_RATING - 14: 1.25, // ITEM_MOD_PARRY_RATING - 15: 1.25, // ITEM_MOD_BLOCK_RATING - 16: 1.25, // ITEM_MOD_HIT_MELEE_RATING - 17: 1.25, // ITEM_MOD_HIT_RANGED_RATING - 18: 1.25, // ITEM_MOD_HIT_SPELL_RATING - 19: 1.5, // ITEM_MOD_CRIT_MELEE_RATING - 20: 1.5, // ITEM_MOD_CRIT_RANGED_RATING - 21: 1.0, // ITEM_MOD_CRIT_SPELL_RATING - 22: 1.0, // ITEM_MOD_HIT_TAKEN_MELEE_RATING - 23: 1.0, // ITEM_MOD_HIT_TAKEN_RANGED_RATING - 24: 1.0, // ITEM_MOD_HIT_TAKEN_SPELL_RATING - 25: 1.0, // ITEM_MOD_CRIT_TAKEN_MELEE_RATING - 26: 1.0, // ITEM_MOD_CRIT_TAKEN_RANGED_RATING - 27: 1.0, // ITEM_MOD_CRIT_TAKEN_SPELL_RATING - 28: 1.5, // ITEM_MOD_HASTE_MELEE_RATING - 29: 1.5, // ITEM_MOD_HASTE_RANGED_RATING - 30: 1.5, // ITEM_MOD_HASTE_SPELL_RATING - 31: 1.25, // ITEM_MOD_HIT_RATING - 32: 1.5, // ITEM_MOD_CRIT_RATING - 33: 1.0, // ITEM_MOD_HIT_TAKEN_RATING - 34: 1.0, // ITEM_MOD_CRIT_TAKEN_RATING - 35: 1.0, // ITEM_MOD_RESILIENCE_RATING - 36: 1.5, // ITEM_MOD_HASTE_RATING - 37: 1.25, // ITEM_MOD_EXPERTISE_RATING - 38: 3.5, // ITEM_MOD_ATTACK_POWER - 39: 3.5, // ITEM_MOD_RANGED_ATTACK_POWER - 40: 3.5, // ITEM_MOD_FERAL_ATTACK_POWER (not used as of 3.3) - 41: 3.5, // ITEM_MOD_SPELL_HEALING_DONE - 42: 3.5, // ITEM_MOD_SPELL_DAMAGE_DONE - 43: 1.5, // ITEM_MOD_MANA_REGENERATION - 44: 1.5, // ITEM_MOD_ARMOR_PENETRATION_RATING - 45: 3.75, // ITEM_MOD_SPELL_POWER - 46: 1.8, // ITEM_MOD_HEALTH_REGEN - 47: 2.0, // ITEM_MOD_SPELL_PENETRATION - 48: 1.5, // ITEM_MOD_BLOCK_VALUE + 0: 1.1, // ITEM_MOD_MANA + 1: 1.1, // ITEM_MOD_HEALTH + 3: 1.1, // ITEM_MOD_AGILITY + 4: 1.1, // ITEM_MOD_STRENGTH + 5: 1.1, // ITEM_MOD_INTELLECT + 6: 1.1, // ITEM_MOD_SPIRIT + 7: 2.0, // ITEM_MOD_STAMINA + 12: 1.1, // ITEM_MOD_DEFENSE_SKILL_RATING + 13: 1.1, // ITEM_MOD_DODGE_RATING + 14: 1.1, // ITEM_MOD_PARRY_RATING + 15: 1.1, // ITEM_MOD_BLOCK_RATING + 16: 1.1, // ITEM_MOD_HIT_MELEE_RATING + 17: 1.1, // ITEM_MOD_HIT_RANGED_RATING + 18: 1.1, // ITEM_MOD_HIT_SPELL_RATING + 19: 1.1, // ITEM_MOD_CRIT_MELEE_RATING + 20: 1.1, // ITEM_MOD_CRIT_RANGED_RATING + 21: 1.1, // ITEM_MOD_CRIT_SPELL_RATING + 22: 1.1, // ITEM_MOD_HIT_TAKEN_MELEE_RATING + 23: 1.1, // ITEM_MOD_HIT_TAKEN_RANGED_RATING + 24: 1.1, // ITEM_MOD_HIT_TAKEN_SPELL_RATING + 25: 1.1, // ITEM_MOD_CRIT_TAKEN_MELEE_RATING + 26: 1.1, // ITEM_MOD_CRIT_TAKEN_RANGED_RATING + 27: 1.1, // ITEM_MOD_CRIT_TAKEN_SPELL_RATING + 28: 1.1, // ITEM_MOD_HASTE_MELEE_RATING + 29: 1.1, // ITEM_MOD_HASTE_RANGED_RATING + 30: 1.1, // ITEM_MOD_HASTE_SPELL_RATING + 31: 1.1, // ITEM_MOD_HIT_RATING + 32: 1.1, // ITEM_MOD_CRIT_RATING + 33: 1.1, // ITEM_MOD_HIT_TAKEN_RATING + 34: 1.1, // ITEM_MOD_CRIT_TAKEN_RATING + 35: 1.1, // ITEM_MOD_RESILIENCE_RATING + 36: 1.1, // ITEM_MOD_HASTE_RATING + 37: 1.1, // ITEM_MOD_EXPERTISE_RATING + 38: 1.5, // ITEM_MOD_ATTACK_POWER + 39: 1.1, // ITEM_MOD_RANGED_ATTACK_POWER + 40: 1.1, // ITEM_MOD_FERAL_ATTACK_POWER (not used as of 3.3) + 41: 1.7, // ITEM_MOD_SPELL_HEALING_DONE + 42: 1.7, // ITEM_MOD_SPELL_DAMAGE_DONE + 43: 1.5, // ITEM_MOD_MANA_REGENERATION + 44: 1.0, // ITEM_MOD_ARMOR_PENETRATION_RATING + 45: 1.7, // ITEM_MOD_SPELL_POWER + 46: 1.1, // ITEM_MOD_HEALTH_REGEN + 47: 1.0, // ITEM_MOD_SPELL_PENETRATION + 48: 1.1, // ITEM_MOD_BLOCK_VALUE } diff --git a/internal/items/items.go b/internal/items/items.go index 167f16a..944a6d4 100644 --- a/internal/items/items.go +++ b/internal/items/items.go @@ -467,15 +467,15 @@ func (item *Item) ScaleItem(itemLevel int, itemQuality int) (bool, error) { origValue := stat.Value scaleParams := StatScaleParams{ - ItemLevel: *item.ItemLevel, - NewItemLevel: fromItemLevel, + ItemLevel: fromItemLevel, + NewItemLevel: *item.ItemLevel, Quality: *item.Quality, ItemType: *item.InventoryType, StatTypeId: statId, StatValue: stat.Value, } - stat.Value = scaleStatv2(scaleParams) + stat.Value = scaleStatv3(scaleParams) // stat.Value = scaleStatv2(itemLevel, *item.InventoryType, *item.Quality, stat.Percent, config.StatModifiers[statId]) log.Printf(">>>>>> Scaled : StatId: %v Type: %s Orig: %v - New Value: %v Percent: %v", statId, stat.Type, origValue, stat.Value, stat.Percent) @@ -698,12 +698,37 @@ func scaleStat(itemLevel int, itemType int, itemQuality int, percOfStat float64, func scaleStatv2(scaleParams StatScaleParams) int { modifier := config.QualityModifiers[scaleParams.Quality] * config.ScalingFactor[scaleParams.StatTypeId] - scaledValue := float64(scaleParams.StatValue) * float64(scaleParams.NewItemLevel/scaleParams.ItemLevel) * modifier + modifier *= float64(scaleParams.NewItemLevel) / float64(scaleParams.ItemLevel) + scaledValue := float64(scaleParams.StatValue) * modifier // * config.InvTypeModifiers[scaleParams.ItemType] log.Printf("------- scaledValue: %v modifier: %v", scaledValue, modifier) return int(math.Ceil(scaledValue)) } +func scaleStatv3(scaleParams StatScaleParams) int { + // Calculate the quality and inventory type modifiers + qualityModifier := config.QualityModifiers[scaleParams.Quality] + // invTypeModifier := config.InvTypeModifiers[scaleParams.ItemType] + + // Calculate the base scaling factor + baseScalingFactor := config.ScalingFactor[scaleParams.StatTypeId] + + // Calculate the level ratio (new item level / original item level) + levelRatio := float64(scaleParams.NewItemLevel) / float64(scaleParams.ItemLevel) + + // Apply the comprehensive scaling formula + scaledValue := float64(scaleParams.StatValue) * + math.Pow(levelRatio, baseScalingFactor) * + qualityModifier + + // // Log the details for debugging + // log.Printf("------- scaledValue: %v, levelRatio: %v, qualityModifier: %v, baseScalingFactor: %v", + // scaledValue, levelRatio, qualityModifier, baseScalingFactor) + + // Return the scaled value, rounded up + return int(math.Ceil(scaledValue)) +} + func ItemToSql(item Item, reqLevel int, difficulty int) string { entryBump := 20000000 diff --git a/main.go b/main.go index 2f1aefb..98c77b5 100644 --- a/main.go +++ b/main.go @@ -105,7 +105,7 @@ func main() { item.ApplyStats(items.ItemFromDbItem(highLevelItem)) - item.ScaleItem(*itemLevel, 4) + item.ScaleItem(*itemLevel, 3) log.Printf("Item Name: %v Stat1: %v Stat2: %v Stat3: %v Stat4: %v Stat5: %v Stat6: %v Stat7: %v Stat8: %v \n", item.Name, *item.StatValue1, *item.StatValue2, *item.StatValue3, *item.StatValue4, *item.StatValue5, *item.StatValue6, *item.StatValue7, *item.StatValue8)