Witchmo

Luck/Intelligence Rework

Nov 27th, 2024 (edited)
788
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.71 KB | Source Code | 0 0
  1. -- Determines the percentage modifier per each point in a stat
  2. function CalcStatCurve(stat, breakpoints)
  3.     if #breakpoints == 0 then
  4.         return 0
  5.     end
  6.    
  7.     for _, segment in ipairs(breakpoints) do
  8.         if segment.endStat - segment.startStat == 0 then
  9.             return 0
  10.         end
  11.        
  12.         if stat >= segment.startStat and stat <= segment.endStat then
  13.             return segment.startValue + ((stat - segment.startStat) / (segment.endStat - segment.startStat)) *
  14.             (segment.endValue - segment.startValue)
  15.         end
  16.     end
  17.    
  18.     if stat > breakpoints[#breakpoints].endStat then
  19.         return breakpoints[#breakpoints].endValue
  20.     end
  21.    
  22.     return breakpoints[1].startValue
  23. end
  24.  
  25. function BS_CALC_GetResistRate(bIsPredict, bIsEffectLuck, bIsFriendlyAction, luck, baseLuck, resistRate)
  26.     local rate = resistRate;
  27.    
  28.     if bIsEffectLuck == false then
  29.         return rate
  30.     end
  31.    
  32.     if bIsFriendlyAction then
  33.         rate = resistRate - 0.25 * luck / 1000;
  34.     else
  35.         local breakpoints = {
  36.             { startStat = 0, endStat = 60, startValue = 0.8, endValue = 1.1 },
  37.             { startStat = 60, endStat = 140, startValue = 1.1, endValue = 1.2 },
  38.             { startStat = 140, endStat = 999, startValue = 1.2, endValue = 1.4 }
  39.         }
  40.        
  41.         local luckWeight = math.min(CalcStatCurve(luck, breakpoints), 1.4);
  42.         rate = math.min(resistRate * luckWeight, 1);
  43.     end
  44.    
  45.     return rate
  46. end
  47.  
  48. -- Randomized damage rate
  49. function BS_CALC_GetRandomRate(bIsPlayer, luck)
  50.     local randRate = 1
  51.    
  52.     if bIsPlayer == true then
  53.         local rangeMin = math.min(CalcStatCurve(luck, breakpoints), 1.12)
  54.         local rangeMax = 1.2
  55.         local breakpoints = {
  56.             {startStat = 0, endStat = 60, startValue = 0.8, endValue = 1.0},
  57.             {startStat = 60, endStat = 140, startValue = 1.0, endValue = 1.1},
  58.             {startStat = 140, endStat = 320, startValue = 1.1, endValue = 1.12},
  59.         }
  60.        
  61.         randRate = rangeMin + math.random() * (rangeMax - rangeMin)
  62.     else
  63.         local rangeMinMonster = 0.9
  64.         local rangeMaxMonster = 1.1
  65.        
  66.         randRate = rangeMinMonster + math.random() * (rangeMaxMonster - rangeMinMonster)
  67.     end
  68.  
  69.     randRate = math.floor(randRate * 100000) / 100000
  70.    
  71.     return randRate
  72. end
  73.  
  74. function BS_CALC_GetIntelligenceBonus(intel)
  75.     local breakpoints = {
  76.         {startStat = 0, endStat = 40, startValue = 1.0, endValue = 1.1},
  77.         {startStat = 40, endStat = 180, startValue = 1.1, endValue = 1.3},
  78.         {startStat = 180, endStat = 850, startValue = 1.3, endValue = 1.5},
  79.     }
  80.     local intelMultiplier = math.min(CalcStatCurve(intel, breakpoints), 1.5);
  81.    
  82.    return intelMultiplier
  83.  end
  84.  
  85. function BS_CALC_GetBaseCriticalRate(isFighter, jobCriticalRate, luck, baseLuck)
  86.     local minCrit = 1 / 64
  87.     local maxCrit = jobCriticalRate
  88.     local critRate = minCrit
  89.    
  90.     if isFighter then
  91.         local level = ConvertBaseLuckToLevel(baseLuck)
  92.         local levelBonus = math.min(level / 2560, 0.025)
  93.         local breakpoints = {
  94.             { startStat = 0, endStat = 60, startValue = 0, endValue = 0.15 },
  95.             { startStat = 60, endStat = 140, startValue = 0.15, endValue = 0.2 },
  96.             { startStat = 140, endStat = 900, startValue = 0.2, endValue = 1 }
  97.         }
  98.  
  99.         local luckWeight = CalcStatCurve(luck, breakpoints) + levelBonus
  100.         critRate = math.max(minCrit, minCrit + (maxCrit - minCrit) * luckWeight)
  101.         critRate = math.min(critRate, 0.5)
  102.  
  103.         return critRate
  104.     end
  105.  
  106.     local breakpoints = {
  107.         { startStat = 0, endStat = 60, startValue = 0, endValue = 0.1 },
  108.         { startStat = 60, endStat = 140, startValue = 0.1, endValue = 0.2 },
  109.         { startStat = 140, endStat = 900, startValue = 0.2, endValue = 1 }
  110.     }
  111.  
  112.     local luckWeight = CalcStatCurve(luck, breakpoints)
  113.     critRate = math.max(minCrit, minCrit + (maxCrit - minCrit) * luckWeight)
  114.     critRate = math.min(critRate, 0.25)
  115.  
  116.     return critRate
  117. end
Advertisement
Add Comment
Please, Sign In to add comment