Files
idle/generator/generator_buff_data.gd

96 lines
3.0 KiB
GDScript

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))