Введём доп. величины для удобства изложения:
local startDamage = damage -- Начальное значение на отрезке
local endDamage = damage * maxMulty --Конечное значение
Итак у нас есть startDamage, endDamage и percHP. Нам нужно скалировать значение урона от начального до конечного, в зависимости от процента. Показываю на пальцах, как дойти до формулы самому.
- Очевидно, что когда
percHP==1
, мы берём startDamage.
- Очевидно, что когда
percHP==0
, мы берём endDamage.
- Что же брать, если
percHP==0.5
? Очевидно, среднее арифметическое. То есть (startDamage + endDamage)/2
, или что то же самое startDamage/2 + endDamage/2
И здесь уже виден намёк на то, какой будет формула. На 50% мы берём половину от начального и половину от конечного значения. На 60%, очевидно, надо брать 40% от начального и 60% от конечного.
Значит, формула такая:
startDamage * percHP + endDamage * (1 - percHP)
Можно, конечно, подставить теперь сюда ваши переменные, но не советую этого делать, так как в текущем виде формула максимально проста и понятна.
В мире программирования функцию
линейной интерполяции принято называть
lerp, хотя это дело вкуса. Тут важно, что она не связана с хп, а пишется в общем виде (немного адаптировал к данному вопросу):
local function lerp(start_val, end_val, perc)
return start_val * perc + end_val * (1 - perc)
end
Если объявили эту функцию, то ниже можно будет писать:
lerp(damage, damage * maxMulty, percHP)
Если объявить функцию глобально, то можно будет использовать её в прерываниях в любом месте проекта. Глобально объявляется без слова
local:
function lerp(start_val, end_val, perc)
return start_val * perc + end_val * (1 - perc)
end
Проверка:
print(lerp(100,400,0.9)) -- 130