diff --git a/Assets/Character Stats/Equipment/EquippableItemTypeDefinition.cs b/Assets/Character Stats/Equipment/EquippableItemTypeDefinition.cs index cc443046..2afda52f 100644 --- a/Assets/Character Stats/Equipment/EquippableItemTypeDefinition.cs +++ b/Assets/Character Stats/Equipment/EquippableItemTypeDefinition.cs @@ -285,4 +285,7 @@ public class StatAvailabilityWeightAndRolls public float weightMultiplier; public float minStatRoll; public float maxStatRoll; + public bool forceUsePercent = false; + public float minPercentStatRoll; + public float maxPercentStatRoll; } \ No newline at end of file diff --git a/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Chest.asset b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Chest.asset index a37d1547..1c27663f 100644 --- a/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Chest.asset +++ b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Chest.asset @@ -30,137 +30,206 @@ MonoBehaviour: weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 8a59fbc0a19857b48a0789d4b4115ea4, type: 2} isAllowed: 1 isMandatory: 1 weightMultiplier: 2 minStatRoll: 2 maxStatRoll: 4 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: de18f1cd5c7345243a127dbf50a1c714, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 0886a83f3dd15114487850e54518829d, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 332d0dbee9590e24e9ad5166dd75ef69, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 8dcb92f2ee1026241a3bc051a42f91f5, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 4e90e0c058763a143b3ec657351fcace, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: ec3548202e941294da429cd3083937c0, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0.01 maxStatRoll: 0.05 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: d318a3662a3ccf04f9f193a818cc3361, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: a19f2ac40579e5d4aa0713f43fcfa276, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: d52b20e3f02ba8946bf37a7470beafd0, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: aa214c2ad3c962447b486ecf16c9c950, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 63eee8f1286035f4a80356bcfad289b6, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 1e63fcf4ac1c02c4e9b9bd62f0243f05, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 79006f60ae538ad4ca179ee739f39232, type: 2} isAllowed: 1 isMandatory: 0 weightMultiplier: 1 minStatRoll: 1 maxStatRoll: 2 + forceUsePercent: 0 + minPercentStatRoll: 0.02 + maxPercentStatRoll: 0.05 - stat: {fileID: 11400000, guid: 6093187f425cccc43b5fa829db293893, type: 2} isAllowed: 1 isMandatory: 0 weightMultiplier: 1.5 minStatRoll: 1 maxStatRoll: 3 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: a50126674c634ef49b4986605ee42baa, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 - minStatRoll: 1 - maxStatRoll: 2 + weightMultiplier: 0.5 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.01 + maxPercentStatRoll: 0.03 - stat: {fileID: 11400000, guid: e6da017ba613adf4d82d9b6a214c6c7c, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 - minStatRoll: 2 - maxStatRoll: 3 + weightMultiplier: 1.2 + minStatRoll: 1 + maxStatRoll: 2 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: f1c964d3ea9c1d349bb5111b11accade, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 + weightMultiplier: 0.5 minStatRoll: 1 - maxStatRoll: 3 + maxStatRoll: 2 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 1407df369cf076445a1619597e085e1c, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 599541ff1aaa6c848a732f9a97e5f1c4, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 7895ba1f0b9a732488642046ee62c8a6, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 88595dcd80f9c614b8bd7d8218fb5951, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 canBeGenerated: 1 baseGenerationWeight: 1 diff --git a/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Helmet.asset b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Helmet.asset index 94bfdc6f..eec93578 100644 --- a/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Helmet.asset +++ b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Helmet.asset @@ -30,137 +30,206 @@ MonoBehaviour: weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 8a59fbc0a19857b48a0789d4b4115ea4, type: 2} isAllowed: 1 isMandatory: 1 weightMultiplier: 2 minStatRoll: 1 maxStatRoll: 3 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: de18f1cd5c7345243a127dbf50a1c714, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 0886a83f3dd15114487850e54518829d, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 332d0dbee9590e24e9ad5166dd75ef69, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 8dcb92f2ee1026241a3bc051a42f91f5, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 4e90e0c058763a143b3ec657351fcace, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: ec3548202e941294da429cd3083937c0, type: 2} isAllowed: 1 isMandatory: 0 weightMultiplier: 0.25 - minStatRoll: 0.01 - maxStatRoll: 0.05 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.02 + maxPercentStatRoll: 0.05 - stat: {fileID: 11400000, guid: d318a3662a3ccf04f9f193a818cc3361, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: a19f2ac40579e5d4aa0713f43fcfa276, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: d52b20e3f02ba8946bf37a7470beafd0, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: aa214c2ad3c962447b486ecf16c9c950, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 63eee8f1286035f4a80356bcfad289b6, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 1e63fcf4ac1c02c4e9b9bd62f0243f05, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 79006f60ae538ad4ca179ee739f39232, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 + weightMultiplier: 0.8 minStatRoll: 1 maxStatRoll: 2 + forceUsePercent: 0 + minPercentStatRoll: 0.02 + maxPercentStatRoll: 0.05 - stat: {fileID: 11400000, guid: 6093187f425cccc43b5fa829db293893, type: 2} isAllowed: 1 isMandatory: 0 weightMultiplier: 1.25 minStatRoll: 1 maxStatRoll: 3 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: a50126674c634ef49b4986605ee42baa, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 - minStatRoll: 1 - maxStatRoll: 2 + weightMultiplier: 0.25 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.01 + maxPercentStatRoll: 0.03 - stat: {fileID: 11400000, guid: e6da017ba613adf4d82d9b6a214c6c7c, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 + weightMultiplier: 1.2 minStatRoll: 1 maxStatRoll: 3 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: f1c964d3ea9c1d349bb5111b11accade, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 + weightMultiplier: 0.5 minStatRoll: 1 - maxStatRoll: 3 + maxStatRoll: 2 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 1407df369cf076445a1619597e085e1c, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 599541ff1aaa6c848a732f9a97e5f1c4, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 7895ba1f0b9a732488642046ee62c8a6, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 88595dcd80f9c614b8bd7d8218fb5951, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 canBeGenerated: 1 baseGenerationWeight: 1 diff --git a/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Shoulder.asset b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Shoulder.asset index c971dcd4..1edc0ee2 100644 --- a/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Shoulder.asset +++ b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Shoulder.asset @@ -30,137 +30,206 @@ MonoBehaviour: weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 8a59fbc0a19857b48a0789d4b4115ea4, type: 2} isAllowed: 1 isMandatory: 1 weightMultiplier: 2 minStatRoll: 1 maxStatRoll: 3 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: de18f1cd5c7345243a127dbf50a1c714, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 0886a83f3dd15114487850e54518829d, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 332d0dbee9590e24e9ad5166dd75ef69, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 8dcb92f2ee1026241a3bc051a42f91f5, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 4e90e0c058763a143b3ec657351fcace, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: ec3548202e941294da429cd3083937c0, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0.01 maxStatRoll: 0.05 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: d318a3662a3ccf04f9f193a818cc3361, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: a19f2ac40579e5d4aa0713f43fcfa276, type: 2} - isAllowed: 0 + isAllowed: 1 isMandatory: 0 - weightMultiplier: 0 + weightMultiplier: 0.25 minStatRoll: 0 - maxStatRoll: 100 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.03 + maxPercentStatRoll: 0.05 - stat: {fileID: 11400000, guid: d52b20e3f02ba8946bf37a7470beafd0, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: aa214c2ad3c962447b486ecf16c9c950, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 63eee8f1286035f4a80356bcfad289b6, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 1e63fcf4ac1c02c4e9b9bd62f0243f05, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 79006f60ae538ad4ca179ee739f39232, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 + weightMultiplier: 0.5 minStatRoll: 1 maxStatRoll: 2 + forceUsePercent: 0 + minPercentStatRoll: 0.01 + maxPercentStatRoll: 0.03 - stat: {fileID: 11400000, guid: 6093187f425cccc43b5fa829db293893, type: 2} isAllowed: 1 isMandatory: 0 weightMultiplier: 1.25 minStatRoll: 1 maxStatRoll: 3 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: a50126674c634ef49b4986605ee42baa, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 - minStatRoll: 1 - maxStatRoll: 2 + weightMultiplier: 0.5 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.01 + maxPercentStatRoll: 0.03 - stat: {fileID: 11400000, guid: e6da017ba613adf4d82d9b6a214c6c7c, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 + weightMultiplier: 0.8 minStatRoll: 1 maxStatRoll: 3 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: f1c964d3ea9c1d349bb5111b11accade, type: 2} isAllowed: 1 isMandatory: 0 - weightMultiplier: 1 + weightMultiplier: 0.8 minStatRoll: 1 maxStatRoll: 3 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 1407df369cf076445a1619597e085e1c, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 599541ff1aaa6c848a732f9a97e5f1c4, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 7895ba1f0b9a732488642046ee62c8a6, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 88595dcd80f9c614b8bd7d8218fb5951, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 canBeGenerated: 1 baseGenerationWeight: 1 diff --git a/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Staff.asset b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Staff.asset new file mode 100644 index 00000000..a6b71ade --- /dev/null +++ b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Staff.asset @@ -0,0 +1,235 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 97c2864d727cc3f4485dcd520d9b2793, type: 3} + m_Name: Staff + m_EditorClassIdentifier: Assembly-CSharp::EquippableItemTypeDefinition + equipmentKey: staff + displayName: Staff + shortName: Staff + description: + uiIcon: {fileID: 0} + equipmentType: 8 + weaponType: 0 + showInUI: 1 + availableIcons: [] + useResourcesFolder: 1 + resourcesPath: Weapons/Staffs + statRules: + - stat: {fileID: 11400000, guid: d9561a8f85fc81f43961fa58de0cd088, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 8a59fbc0a19857b48a0789d4b4115ea4, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: de18f1cd5c7345243a127dbf50a1c714, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 0886a83f3dd15114487850e54518829d, type: 2} + isAllowed: 1 + isMandatory: 0 + weightMultiplier: 1.5 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.04 + maxPercentStatRoll: 0.06 + - stat: {fileID: 11400000, guid: 332d0dbee9590e24e9ad5166dd75ef69, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 8dcb92f2ee1026241a3bc051a42f91f5, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 4e90e0c058763a143b3ec657351fcace, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: ec3548202e941294da429cd3083937c0, type: 2} + isAllowed: 1 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.01 + maxPercentStatRoll: 0.05 + - stat: {fileID: 11400000, guid: d318a3662a3ccf04f9f193a818cc3361, type: 2} + isAllowed: 1 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.02 + maxPercentStatRoll: 0.05 + - stat: {fileID: 11400000, guid: a19f2ac40579e5d4aa0713f43fcfa276, type: 2} + isAllowed: 1 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.03 + maxPercentStatRoll: 0.05 + - stat: {fileID: 11400000, guid: d52b20e3f02ba8946bf37a7470beafd0, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 0 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: aa214c2ad3c962447b486ecf16c9c950, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 63eee8f1286035f4a80356bcfad289b6, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 0 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 1e63fcf4ac1c02c4e9b9bd62f0243f05, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 79006f60ae538ad4ca179ee739f39232, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 6093187f425cccc43b5fa829db293893, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: a50126674c634ef49b4986605ee42baa, type: 2} + isAllowed: 1 + isMandatory: 0 + weightMultiplier: 1.25 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.02 + maxPercentStatRoll: 0.05 + - stat: {fileID: 11400000, guid: e6da017ba613adf4d82d9b6a214c6c7c, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: f1c964d3ea9c1d349bb5111b11accade, type: 2} + isAllowed: 1 + isMandatory: 0 + weightMultiplier: 1.5 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.03 + maxPercentStatRoll: 0.05 + - stat: {fileID: 11400000, guid: 1407df369cf076445a1619597e085e1c, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 599541ff1aaa6c848a732f9a97e5f1c4, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 0 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 7895ba1f0b9a732488642046ee62c8a6, type: 2} + isAllowed: 0 + isMandatory: 0 + weightMultiplier: 1 + minStatRoll: 0 + maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + - stat: {fileID: 11400000, guid: 88595dcd80f9c614b8bd7d8218fb5951, type: 2} + isAllowed: 1 + isMandatory: 1 + weightMultiplier: 2 + minStatRoll: 5 + maxStatRoll: 10 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 + canBeGenerated: 1 + baseGenerationWeight: 1 diff --git a/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Staff.asset.meta b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Staff.asset.meta new file mode 100644 index 00000000..b7e0f7fa --- /dev/null +++ b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Staff.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5b159288acc626544b4ab98deb39a5fa +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Sword.asset b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Sword.asset index 1422e75b..15e3024e 100644 --- a/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Sword.asset +++ b/Assets/Scriptables/Data/Resources/Items/Equippables/EquippableItemTypeDefinitions/Resources/EquipmentDefinitions/Sword.asset @@ -30,137 +30,206 @@ MonoBehaviour: weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 8a59fbc0a19857b48a0789d4b4115ea4, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: de18f1cd5c7345243a127dbf50a1c714, type: 2} isAllowed: 1 isMandatory: 1 weightMultiplier: 2 minStatRoll: 1 maxStatRoll: 3 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 0886a83f3dd15114487850e54518829d, type: 2} isAllowed: 1 isMandatory: 0 weightMultiplier: 1 minStatRoll: 0 - maxStatRoll: 100 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.02 + maxPercentStatRoll: 0.04 - stat: {fileID: 11400000, guid: 332d0dbee9590e24e9ad5166dd75ef69, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 1 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 8dcb92f2ee1026241a3bc051a42f91f5, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 1 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 4e90e0c058763a143b3ec657351fcace, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 1 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: ec3548202e941294da429cd3083937c0, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 1 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: d318a3662a3ccf04f9f193a818cc3361, type: 2} isAllowed: 1 isMandatory: 0 weightMultiplier: 1 - minStatRoll: 1 - maxStatRoll: 2 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.01 + maxPercentStatRoll: 0.03 - stat: {fileID: 11400000, guid: a19f2ac40579e5d4aa0713f43fcfa276, type: 2} isAllowed: 1 isMandatory: 0 weightMultiplier: 1 - minStatRoll: 1 - maxStatRoll: 3 + minStatRoll: 0 + maxStatRoll: 0 + forceUsePercent: 1 + minPercentStatRoll: 0.01 + maxPercentStatRoll: 0.03 - stat: {fileID: 11400000, guid: d52b20e3f02ba8946bf37a7470beafd0, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: aa214c2ad3c962447b486ecf16c9c950, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 63eee8f1286035f4a80356bcfad289b6, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 1e63fcf4ac1c02c4e9b9bd62f0243f05, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 79006f60ae538ad4ca179ee739f39232, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 6093187f425cccc43b5fa829db293893, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: a50126674c634ef49b4986605ee42baa, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: e6da017ba613adf4d82d9b6a214c6c7c, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: f1c964d3ea9c1d349bb5111b11accade, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 1407df369cf076445a1619597e085e1c, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 599541ff1aaa6c848a732f9a97e5f1c4, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 0 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 7895ba1f0b9a732488642046ee62c8a6, type: 2} isAllowed: 0 isMandatory: 0 weightMultiplier: 1 minStatRoll: 0 maxStatRoll: 100 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 - stat: {fileID: 11400000, guid: 88595dcd80f9c614b8bd7d8218fb5951, type: 2} - isAllowed: 1 + isAllowed: 0 isMandatory: 0 - weightMultiplier: 0.2 + weightMultiplier: 0 minStatRoll: 1 maxStatRoll: 2 + forceUsePercent: 0 + minPercentStatRoll: 0 + maxPercentStatRoll: 0 canBeGenerated: 1 baseGenerationWeight: 1 diff --git a/Assets/Scripts/Drops/EquipmentDropTable.cs b/Assets/Scripts/Drops/EquipmentDropTable.cs index 4a55be30..2da51b09 100644 --- a/Assets/Scripts/Drops/EquipmentDropTable.cs +++ b/Assets/Scripts/Drops/EquipmentDropTable.cs @@ -186,9 +186,11 @@ public class EquipmentDropTable : MonoBehaviour private int GetPlayerLevel() { - // Replace this with your actual player level system - // For example: return PlayerController.Instance.Level; - return 1; // Placeholder + RiftPlayer player = FindFirstObjectByType(); + + if (player == null) return GameDifficultyController.Instance.GetCurrentDifficultyLevel() + 1; + + return player.character.level.currentLevel; } #region Editor Testing diff --git a/Assets/Scripts/Items/Generator/EquippableItemGenerator.cs b/Assets/Scripts/Items/Generator/EquippableItemGenerator.cs index 02a3f9c5..0d87a2c3 100644 --- a/Assets/Scripts/Items/Generator/EquippableItemGenerator.cs +++ b/Assets/Scripts/Items/Generator/EquippableItemGenerator.cs @@ -6,9 +6,7 @@ using UnityEngine; public class EquippableItemGenerator : MonoBehaviour { [Header("Generation Settings")] - public float baseStatValue = 10f; public float statVariance = 0.3f; // 30% variance - public float percentStatBaseValue = 0.05f; // 5% base for percent stats public enum ItemTier { @@ -126,7 +124,8 @@ public class EquippableItemGenerator : MonoBehaviour private void GenerateStatsForItem(EquippableItemInstance item, EquippableItemTypeDefinition equipmentTypeDef, ItemTier tier, int playerLevel) { // Get stat roll count from equipment definition or tier - int statCount = equipmentTypeDef.GetRandomStatRollCount(); + //int statCount = equipmentTypeDef.GetRandomStatRollCount(); + int statCount = 0; if (statCount == 0) { statCount = GetStatCountForTier(tier); @@ -245,13 +244,15 @@ public class EquippableItemGenerator : MonoBehaviour if (canUseFlat && canUsePercent) { - if (Random.value < 0.6f) + if(rule.forceUsePercent) { - usePercent = false; // Use only flat + usePercent = true; + useFlat = false; } else { - useFlat = false; // Use only percent + usePercent = false; + useFlat = true; } } @@ -274,56 +275,44 @@ public class EquippableItemGenerator : MonoBehaviour private float GenerateFlatStatValue(StatAvailabilityWeightAndRolls rule, float multiplier) { - float baseValue = baseStatValue * multiplier; + float baseValue; // Apply stat-specific scaling from the rule if (rule.maxStatRoll > rule.minStatRoll) { baseValue = Random.Range(rule.minStatRoll, rule.maxStatRoll) * multiplier; } + else + { + baseValue = Mathf.Min(rule.minStatRoll, rule.maxStatRoll) * multiplier; + } // Add variance float variance = baseValue * statVariance; float finalValue = Random.Range(baseValue - variance, baseValue + variance); - // Some stats need higher base values - if (rule.stat.StatKey.ToLower().Contains("health")) - { - finalValue *= 5f; // Health gets higher flat values - } - else if (rule.stat.StatKey.ToLower().Contains("mana")) - { - finalValue *= 3f; // Mana gets higher flat values - } return Mathf.Max(1f, finalValue); } private float GeneratePercentStatValue(StatAvailabilityWeightAndRolls rule, float multiplier) { - float baseValue = percentStatBaseValue * multiplier; + float baseValue; // Apply stat-specific scaling from the rule - if (rule.maxStatRoll > rule.minStatRoll) + if (rule.maxPercentStatRoll > rule.minPercentStatRoll) { - float scaleFactor = Random.Range(rule.minStatRoll, rule.maxStatRoll) / 100f; // Assuming rule values are in percentage - baseValue *= scaleFactor; + baseValue = Random.Range(rule.minPercentStatRoll, rule.maxPercentStatRoll) * multiplier; + } + else + { + baseValue = Mathf.Min(rule.minPercentStatRoll, rule.maxPercentStatRoll) * multiplier; } // Add variance float variance = baseValue * statVariance; float finalValue = Random.Range(baseValue - variance, baseValue + variance); - // Some stats get reduced values for balance - if (rule.stat.StatKey.ToLower().Contains("crit")) - { - finalValue *= 0.5f; // Crit stats are more powerful - } - else if (rule.stat.StatKey.ToLower().Contains("movement") || rule.stat.StatKey.ToLower().Contains("dodge")) - { - finalValue *= 0.4f; // Movement and dodge are powerful - } - return Mathf.Max(0.01f, Mathf.Round(finalValue * 1000f) / 1000f); // Round to 3 decimal places }