@abstract class_name Upgrade extends Resource enum SCALE_TYPE { LINEAR, EXP, LOG } enum UPGRADE_DIRECTION { INCREASE = 1, DECREASE = -1 } @export var icon : Texture2D = preload("uid://dqvou7t7o1t5d") @export var text : String @export var baseCost : int : set(value): baseCost = value cost = value @export_range(0.001, 999, 0.001, "hide_slider") var value : float @export_group("Restrictions") @export_range(-1, 100, 1, "hide_slider") var maxLevel : int = -1 ##[param -1] for infinite leveling @export var tierLock : Array[int] @export_group("Upgrade Scaling") @export var upgradeDirection : UPGRADE_DIRECTION = UPGRADE_DIRECTION.INCREASE @export var upgradeScaleType : SCALE_TYPE = SCALE_TYPE.LINEAR @export var costScaleType : SCALE_TYPE = SCALE_TYPE.LINEAR @export var costModificator : float var cost : int var level : int = 0 func isLevelMax() -> bool : return not tierLock.is_empty() && level == tierLock[Game.tier] @abstract func upgrade(_subject = null) -> bool func upgradeProperty(subject: Variant, property: String) -> void: subject.set(property, getNextValue(subject.get(property), value, upgradeScaleType)) func upgradeUpgrade() -> void: level += 1 Game.money -= cost cost = getNextValue(cost, costModificator, costScaleType) func canUpgrade() -> bool: return not isLevelMax() && Game.money >= cost && (tierLock.is_empty() || tierLock[Game.tier] > level) func getNextValue(oldValue, baseValue, scaleType : SCALE_TYPE): match scaleType: SCALE_TYPE.LINEAR: return oldValue + baseValue _: push_error("Upgrade scale type not defined !") return oldValue