Add generator buffs (additional test required)
This commit is contained in:
95
generator/generator_buff_data.gd
Normal file
95
generator/generator_buff_data.gd
Normal file
@@ -0,0 +1,95 @@
|
||||
class_name GeneratorBuffData
|
||||
extends Resource
|
||||
|
||||
enum BuffKind {
|
||||
AUTO_PRODUCTION_MULTIPLIER,
|
||||
MANUAL_CLICK_MULTIPLIER,
|
||||
RESOURCE_PURCHASE,
|
||||
}
|
||||
|
||||
const HUGE_EXPONENT: int = 1000000
|
||||
|
||||
@export var id: StringName = &""
|
||||
@export var kind: BuffKind = BuffKind.AUTO_PRODUCTION_MULTIPLIER
|
||||
@export_multiline var text: String = ""
|
||||
@export var icon: Texture2D
|
||||
@export var max_level: int = -1
|
||||
|
||||
@export_group("Effect")
|
||||
@export var base_effect: float = 1.0
|
||||
@export var effect_increment: float = 0.1
|
||||
|
||||
@export_group("Cost")
|
||||
@export var cost_currency: Resource
|
||||
@export var base_cost_mantissa: float = 10.0
|
||||
@export var base_cost_exponent: int = 0
|
||||
@export var cost_multiplier: float = 1.5
|
||||
|
||||
@export_group("Resource Purchase")
|
||||
@export var resource_target_currency: Resource
|
||||
@export var resource_purchase_base_mantissa: float = 10.0
|
||||
@export var resource_purchase_base_exponent: int = 0
|
||||
@export var resource_purchase_increment_multiplier: float = 1.2
|
||||
|
||||
func can_purchase_next_level(current_level: int) -> bool:
|
||||
if max_level < 0:
|
||||
return true
|
||||
return maxi(current_level, 0) < max_level
|
||||
|
||||
func get_effect_multiplier(level: int) -> float:
|
||||
var safe_level: int = maxi(level, 0)
|
||||
return maxf(base_effect + (effect_increment * float(safe_level)), 0.0)
|
||||
|
||||
func get_cost_for_level(level: int) -> BigNumber:
|
||||
var safe_level: int = maxi(level, 0)
|
||||
var base_cost: BigNumber = BigNumber.new(base_cost_mantissa, base_cost_exponent)
|
||||
if base_cost.mantissa <= 0.0:
|
||||
return BigNumber.from_float(0.0)
|
||||
|
||||
if cost_multiplier <= 0.0:
|
||||
return BigNumber.new(1.0, HUGE_EXPONENT)
|
||||
|
||||
var growth: float = 1.0
|
||||
if not is_equal_approx(cost_multiplier, 1.0):
|
||||
growth = pow(cost_multiplier, float(safe_level))
|
||||
if not is_finite(growth):
|
||||
return BigNumber.new(1.0, HUGE_EXPONENT)
|
||||
|
||||
return _scale_big_number(base_cost, growth)
|
||||
|
||||
func get_resource_purchase_amount_for_level(level: int) -> BigNumber:
|
||||
var safe_level: int = maxi(level, 0)
|
||||
var base_amount: BigNumber = BigNumber.new(resource_purchase_base_mantissa, resource_purchase_base_exponent)
|
||||
if base_amount.mantissa <= 0.0:
|
||||
return BigNumber.from_float(0.0)
|
||||
|
||||
if resource_purchase_increment_multiplier <= 0.0:
|
||||
return BigNumber.from_float(0.0)
|
||||
|
||||
var growth: float = 1.0
|
||||
if not is_equal_approx(resource_purchase_increment_multiplier, 1.0):
|
||||
growth = pow(resource_purchase_increment_multiplier, float(safe_level))
|
||||
if not is_finite(growth):
|
||||
return BigNumber.new(1.0, HUGE_EXPONENT)
|
||||
|
||||
return _scale_big_number(base_amount, growth)
|
||||
|
||||
func get_effect_description(level: int) -> String:
|
||||
var safe_level: int = maxi(level, 0)
|
||||
match kind:
|
||||
BuffKind.AUTO_PRODUCTION_MULTIPLIER, BuffKind.MANUAL_CLICK_MULTIPLIER:
|
||||
return "x%.2f" % get_effect_multiplier(safe_level)
|
||||
BuffKind.RESOURCE_PURCHASE:
|
||||
return "+%s" % get_resource_purchase_amount_for_level(safe_level).to_string_suffix(2)
|
||||
_:
|
||||
return "-"
|
||||
|
||||
func _scale_big_number(base_amount: BigNumber, scale: float) -> BigNumber:
|
||||
if base_amount.mantissa <= 0.0:
|
||||
return BigNumber.from_float(0.0)
|
||||
if scale <= 0.0:
|
||||
return BigNumber.from_float(0.0)
|
||||
if not is_finite(scale):
|
||||
return BigNumber.new(1.0, HUGE_EXPONENT)
|
||||
|
||||
return base_amount.multiply(BigNumber.from_float(scale))
|
||||
Reference in New Issue
Block a user