2,875
edits
No edit summary |
(Input calculation draft) |
||
Line 24: | Line 24: | ||
} | } | ||
-- | --- Constructor function for creating new ItemEconomy instances. | ||
-- ItemEconomy | -- @return ItemEconomy An instance of the ItemEconomy class. | ||
function ItemEconomy:new() | function ItemEconomy:new() | ||
local newObj = {} | local newObj = {} | ||
Line 33: | Line 33: | ||
end | end | ||
--- Verifies and updates the economy values of the ItemEconomy instance. | |||
-- If any economy value is nil, it sets a default value. | |||
-- If any economy value is out of range, clamp it to the nearest valid range. | |||
-- @return ItemEconomy The ItemEconomy instance with verified and updated economy values. | |||
function ItemEconomy:verify() | |||
-- Set default values if some are nil | |||
self.inputsPerAction = self.inputsPerAction or 1 | |||
self.outputsPerAction = self.outputsPerAction or 1 | |||
self.preservationChance = self.preservationChance or 0 | |||
self.duplicationChance = self.duplicationChance or 0 | |||
self.extraItemChance = self.extraItemChance or 0 | |||
self.extraItemAmount = self.extraItemAmount or 0 | |||
self.flatExtraItems = self.flatExtraItems or 0 | |||
self.extraBaseItemChance = self.extraBaseItemChance or 0 | |||
self.extraBaseItems = self.extraBaseItems or 0 | |||
-- Clamp economy values | -- Clamp economy values | ||
self.preservationChanceP = number.clamp(self.preservationChance, 0, 80) / 100 | |||
self.duplicationChanceP = number.clamp(self.duplicationChance, 0, 100) / 100 | |||
self.extraItemChanceP = number.clamp(self.extraItemChance, 0, 100) / 100 | |||
self.extraBaseItemChanceP = number.clamp(self.extraBaseItemChance, 0, 100) / 100 | |||
return | return self | ||
end | end | ||
Line 58: | Line 62: | ||
-- @return (number) The estimated output multiplier of the crafting process. | -- @return (number) The estimated output multiplier of the crafting process. | ||
function p.estimatedOutputMultiplier(itemEconomy) | function p.estimatedOutputMultiplier(itemEconomy) | ||
local minOutput = p.estimatedOutput(nil, itemEconomy) | |||
return minOutput / itemEconomy.inputsPerAction | |||
end | end | ||
Line 66: | Line 71: | ||
-- @return (number) The estimated output of the crafting process. | -- @return (number) The estimated output of the crafting process. | ||
function p.estimatedOutput(inputAmount, itemEconomy) | function p.estimatedOutput(inputAmount, itemEconomy) | ||
eco = | eco = itemEconomy:verify() | ||
-- Equal inputAmount to inputsPerAction to get 1 baseAction | -- Equal inputAmount to inputsPerAction to get 1 baseAction | ||
Line 73: | Line 78: | ||
-- Calculate the effective actions taken. | -- Calculate the effective actions taken. | ||
local totalActions = baseActions / (1 - eco. | local totalActions = baseActions / (1 - eco.preservationChanceP) | ||
-- Calculates extra items that can't be doubled. | -- Calculates extra items that can't be doubled. | ||
local extraItems = (totalActions * eco. | local extraItems = (totalActions * eco.extraItemChanceP * eco.extraItemAmount) + (totalActions * eco.flatExtraItems) | ||
-- Calculates extra items that CAN be doubled. | -- Calculates extra items that CAN be doubled. | ||
local baseItems = (eco.outputsPerAction + eco. | local baseItems = (eco.outputsPerAction + eco.extraBaseItemChanceP * eco.extraBaseItems) | ||
-- Total output | -- Total output | ||
return (totalActions * baseItems * (1 + eco. | return (totalActions * baseItems * (1 + eco.duplicationChanceP)) + extraItems | ||
end | end | ||
function p.estimatedInput(outputAmount, | function p.estimatedInputMultiplier(itemEconomy) | ||
local minInput = p.estimatedInput(nil, itemEconomy) | |||
return minInput / itemEconomy.outputsPerAction | |||
end | |||
function p.estimatedInput(outputAmount, itemEconomy) | |||
eco = itemEconomy:verify() | |||
outputAmount = outputAmount or eco.outputsPerAction | |||
local preserveAmount = outputAmount * eco.inputsPerAction * (1 - eco.preservationChanceP) | |||
local duplicateAmount = eco.outputsPerAction + eco.outputsPerAction * eco.duplicationChanceP | |||
local extraBaseItems = eco.extraBaseItemChanceP * eco.extraBaseItems + eco.extraBaseItemChanceP * eco.extraBaseItems * eco.duplicationChanceP | |||
local extraItems = eco.extraItemChanceP * eco.extraItemAmount | |||
-- Total input required for given output. | |||
local actualInput = preserveAmount / (duplicateAmount + extraBaseItems + extraItems + eco.flatExtraItems) | |||
return math.max(actualInput, eco.inputsPerAction) | |||
end | end | ||
-- | -- | ||
-- Calculates if equipping the Ring Of Wealth will result in more items for the player. | -- Calculates if equipping the Ring Of Wealth will result in more items for the player. | ||
function p.ringOfWealthHasEffect() | |||
function p.ringOfWealthHasEffect( | |||
end | end | ||
Line 101: | Line 117: | ||
function p.Test() | function p.Test() | ||
local eco = ItemEconomy:new() | local eco = ItemEconomy:new() | ||
eco.inputsPerAction = 2 | |||
eco.outputsPerAction = 4 | |||
eco.flatExtraItems = 0 | eco.flatExtraItems = 0 | ||
eco.preservationChance = 0 | eco.preservationChance = 0 | ||
eco.duplicationChance = | eco.duplicationChance = 0 | ||
eco.extraBaseItems = | eco.extraBaseItems = 0 | ||
eco.extraBaseItemChance = | eco.extraBaseItemChance = 0 | ||
mw.log(p.estimatedOutputMultiplier(eco)) | |||
mw.log(p.estimatedInputMultiplier(eco)) | |||
end | end | ||
return p | return p |
edits