Formula.gd 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. extends Object
  2. class_name Formula
  3. #
  4. const attributePointsBase : int = 10
  5. const attributePointPerLevel : int = 3
  6. const coefMaxMana : float = 1.5
  7. const coefRegenMana : float = 0.05
  8. const coefMaxStamina : float = 1.8
  9. const coefRegenStamina : float = 10.0
  10. const coefMaxHealth : float = 2.0
  11. const coefRegenHealth : float = 0.01
  12. const coefDefense : float = 2.0
  13. const coefAttack : float = 2.0
  14. const weightSnap : float = 0.001
  15. # Base formulas functions
  16. static func F(val) -> int:
  17. return floori(val)
  18. static func Percent(val) -> float:
  19. return val * 0.01
  20. static func FPercent(val) -> int:
  21. return F(Percent(val))
  22. static func Fifth(val) -> float:
  23. return val * 0.2
  24. static func FFifth(val) -> int:
  25. return F(Fifth(val))
  26. static func Half(val) -> float:
  27. return val * 0.5
  28. static func FHalf(val) -> int:
  29. return F(Half(val))
  30. # Concentration related stats
  31. static func GetMaxMana(stat : ActorStats) -> int:
  32. return stat.morphStat.maxMana + F((stat.concentration + stat.level) * coefMaxMana) + stat.modifiers.Get(CellCommons.Modifier.MaxMana, true)
  33. static func GetRegenMana(stat : ActorStats) -> int:
  34. return 1 + FFifth(stat.concentration) + FPercent(GetMaxMana(stat) * coefRegenMana) + stat.modifiers.Get(CellCommons.Modifier.RegenMana, true)
  35. static func GetCritRate(stat : ActorStats) -> float:
  36. return stat.morphStat.critRate + Percent(FFifth(stat.concentration + stat.level)) + stat.modifiers.Get(CellCommons.Modifier.CritRate, true)
  37. static func GetMAttack(stat : ActorStats) -> int:
  38. return stat.morphStat.mattack + F(stat.concentration * coefAttack) + stat.level + stat.modifiers.Get(CellCommons.Modifier.MAttack, true)
  39. static func GetMDefense(stat : ActorStats) -> int:
  40. return stat.morphStat.mdefense + F(stat.concentration * coefDefense) + stat.level + stat.modifiers.Get(CellCommons.Modifier.MDefense, true)
  41. # Endurance related stats
  42. static func GetMaxStamina(stat : ActorStats) -> int:
  43. return stat.morphStat.maxStamina + F((stat.endurance + stat.level) * coefMaxStamina) + stat.modifiers.Get(CellCommons.Modifier.MaxStamina, true)
  44. static func GetRegenStamina(stat : ActorStats) -> int:
  45. return stat.level + stat.endurance + FPercent(GetMaxStamina(stat) * coefRegenStamina) + stat.modifiers.Get(CellCommons.Modifier.RegenStamina, true)
  46. static func GetCooldownAttackDelay(stat : ActorStats) -> float:
  47. return maxf(0.001, stat.morphStat.cooldownAttackDelay - Percent(stat.endurance + stat.level)) + stat.modifiers.Get(CellCommons.Modifier.CooldownDelay, true)
  48. # Vitality related stats
  49. static func GetMaxHealth(stat : ActorStats) -> int:
  50. return stat.morphStat.maxHealth + F((stat.vitality + stat.level) * coefMaxHealth) + stat.modifiers.Get(CellCommons.Modifier.MaxHealth, true)
  51. static func GetRegenHealth(stat : ActorStats) -> int:
  52. return 1 + FFifth(stat.vitality) + FPercent(GetMaxHealth(stat) * coefRegenHealth) + stat.modifiers.Get(CellCommons.Modifier.RegenHealth, true)
  53. static func GetDefense(stat : ActorStats) -> int:
  54. return stat.morphStat.defense + F(stat.vitality * coefDefense) + stat.level + stat.modifiers.Get(CellCommons.Modifier.Defense, true)
  55. # Agility related stats
  56. static func GetCastAttackDelay(stat : ActorStats) -> float:
  57. return max(0.001, stat.morphStat.castAttackDelay - Percent(stat.agility + stat.level)) + stat.modifiers.Get(CellCommons.Modifier.CastDelay, true)
  58. static func GetDodgeRate(stat : ActorStats) -> float:
  59. return stat.morphStat.dodgeRate + Percent(FFifth(stat.agility + stat.level)) + stat.modifiers.Get(CellCommons.Modifier.DodgeRate, true)
  60. static func GetAttackRange(stat : ActorStats) -> int:
  61. return stat.morphStat.attackRange + FFifth(stat.agility) + stat.modifiers.Get(CellCommons.Modifier.AttackRange, true)
  62. # Strength related stats
  63. static func GetWalkSpeed(stat : ActorStats) -> float:
  64. return stat.morphStat.walkSpeed + Fifth(stat.strength + stat.level) + stat.modifiers.Get(CellCommons.Modifier.WalkSpeed, true)
  65. static func GetWeightCapacity(stat : ActorStats) -> float:
  66. return snappedf(stat.morphStat.weightCapacity + Half(stat.strength + stat.level), weightSnap) + stat.modifiers.Get(CellCommons.Modifier.WeightCapacity, true)
  67. static func GetAttack(stat : ActorStats) -> int:
  68. return stat.morphStat.attack + F(stat.strength * coefAttack) + stat.level + stat.modifiers.Get(CellCommons.Modifier.Attack, true)
  69. #
  70. static func ClampHealth(stat : ActorStats) -> int:
  71. return clampi(stat.health, 0, stat.current.maxHealth)
  72. static func ClampMana(stat : ActorStats) -> int:
  73. return clampi(stat.mana, 0, stat.current.maxMana)
  74. static func ClampStamina(stat : ActorStats) -> int:
  75. return clampi(stat.stamina, 0, stat.current.maxStamina)
  76. static func GetWeight(inventory : ActorInventory) -> float:
  77. return snappedf(inventory.GetWeight(), weightSnap)
  78. # Animation ratios
  79. static func GetWalkRatio(stat : ActorStats) -> float:
  80. return stat.morphStat.walkSpeed / stat.current.walkSpeed if stat.current.walkSpeed > 0 else 1.0
  81. # Experience management
  82. static func GetXpBonus(stat : ActorStats) -> float:
  83. return stat.baseExp * pow(stat.level, 1.7)
  84. static func ApplyXp(agent : BaseAgent):
  85. var bonus : float = Formula.GetXpBonus(agent.stat)
  86. for entry in agent.attackers:
  87. if entry.attacker != null and not entry.attacker.is_queued_for_deletion():
  88. var damageRatio : float = agent.GetDamageRatio(entry.attacker)
  89. var bonusScaled : int = int(bonus * damageRatio)
  90. entry.attacker.stat.AddExperience(bonusScaled)
  91. if damageRatio > 0.5:
  92. entry.attacker.progress.AddBestiary(agent.data._id, 1)
  93. # Attribute points
  94. static func GetMaxAttributePoints(level : int) -> int:
  95. return attributePointsBase + level * attributePointPerLevel
  96. static func GetAssignedAttributePoints(stat : ActorStats) -> int:
  97. return stat.agility + stat.vitality + stat.strength + stat.endurance + stat.concentration