Decouples core systems from centralized globals in favor of catalogue-based architecture and data-driven content. Key changes: - Prestige: node-based buff tech tree, graph panel, progress bar - Research: multi-worker system, per-generator research, xp generation - Ascension: meta-currency layer via multi-currency prestige resets - Buffs: refactored as generator-independent via catalogues - UI: currency panel, edge-scrolling camera + zoom, current-goal panel - Alchemy Tower: crafting building with recipe/cost system - Testing: 7 test suites (ascension, prestige, research, goals) - Content: migrated from hardcoded idles/ to gym format (tiny_sword)
80 lines
1.9 KiB
GDScript
80 lines
1.9 KiB
GDScript
class_name PrestigeConfig
|
|
extends Resource
|
|
|
|
enum BasisType {
|
|
LIFETIME_TOTAL,
|
|
RUN_TOTAL,
|
|
RUN_MAX,
|
|
ALL_CURRENCIES,
|
|
}
|
|
|
|
enum FormulaType {
|
|
POWER,
|
|
TRIANGULAR_INVERSE,
|
|
}
|
|
|
|
enum RoundingMode {
|
|
FLOOR,
|
|
ROUND,
|
|
CEIL,
|
|
}
|
|
|
|
enum MultiplierMode {
|
|
ADDITIVE,
|
|
MULTIPLICATIVE_POWER,
|
|
}
|
|
|
|
@export var id: StringName = &"primary"
|
|
@export var display_name: String = "Ascension"
|
|
@export var prestige_currency_id: StringName = &"prestige"
|
|
@export var source_currency_id: StringName = &"magic"
|
|
@export var basis: BasisType = BasisType.LIFETIME_TOTAL
|
|
@export var formula: FormulaType = FormulaType.POWER
|
|
@export var threshold_mantissa: float = 1.0
|
|
@export var threshold_exponent: int = 4
|
|
@export var scale: float = 1.0
|
|
@export var exponent: float = 0.5
|
|
@export var flat_bonus: float = 0.0
|
|
@export var minimum_gain: int = 0
|
|
@export var rounding_mode: RoundingMode = RoundingMode.FLOOR
|
|
@export var allow_prestige_without_gain: bool = false
|
|
@export var multiplier_mode: MultiplierMode = MultiplierMode.ADDITIVE
|
|
@export var base_multiplier: float = 1.0
|
|
@export var multiplier_per_prestige: float = 0.05
|
|
@export var multiplier_exponent: float = 1.0
|
|
@export var include_currency_ids: Array[StringName] = []
|
|
|
|
func get_threshold() -> BigNumber:
|
|
return BigNumber.new(threshold_mantissa, threshold_exponent)
|
|
|
|
func is_valid() -> bool:
|
|
if String(id).strip_edges().is_empty():
|
|
return false
|
|
if String(source_currency_id).strip_edges().is_empty() and basis != BasisType.ALL_CURRENCIES:
|
|
return false
|
|
if threshold_mantissa <= 0.0:
|
|
return false
|
|
if scale < 0.0:
|
|
return false
|
|
if formula == FormulaType.POWER and exponent <= 0.0:
|
|
return false
|
|
if base_multiplier < 0.0:
|
|
return false
|
|
|
|
return true
|
|
|
|
func is_cumulative_basis() -> bool:
|
|
return basis != BasisType.RUN_TOTAL
|
|
|
|
func round_value(value: float) -> float:
|
|
if not is_finite(value):
|
|
return value
|
|
|
|
match rounding_mode:
|
|
RoundingMode.CEIL:
|
|
return ceilf(value)
|
|
RoundingMode.ROUND:
|
|
return roundf(value)
|
|
_:
|
|
return floorf(value)
|