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