netfishing/progression/player_fishing_upgrades.gd

146 lines
3.4 KiB
GDScript3
Raw Permalink Normal View History

class_name PlayerFishingUpgrades
extends Node
const PlayerWalletType = preload("res://economy/player_wallet.gd")
signal upgrades_changed(reel_speed_level: int, barrier_power_level: int)
const MAX_REEL_SPEED_LEVEL: int = 5
const MAX_BARRIER_POWER_LEVEL: int = 3
const REEL_SPEED_COSTS: Array[int] = [50, 125, 300, 650, 1250]
const BARRIER_POWER_COSTS: Array[int] = [100, 275, 700]
var _reel_speed_level: int = 0
var _barrier_power_level: int = 0
func get_reel_speed_level() -> int:
return _reel_speed_level
func get_barrier_power_level() -> int:
return _barrier_power_level
func get_reel_speed_multiplier() -> float:
return 1.0 + float(_reel_speed_level) * 0.10
func get_barrier_damage() -> int:
return _barrier_power_level + 1
func get_next_reel_speed_cost() -> int:
if _reel_speed_level >= MAX_REEL_SPEED_LEVEL:
return -1
return REEL_SPEED_COSTS[_reel_speed_level]
func get_next_barrier_power_cost() -> int:
if _barrier_power_level >= MAX_BARRIER_POWER_LEVEL:
return -1
return BARRIER_POWER_COSTS[_barrier_power_level]
func can_purchase_reel_speed(wallet: PlayerWalletType) -> bool:
var cost: int = get_next_reel_speed_cost()
return wallet != null and cost >= 0 and wallet.can_afford(cost)
func can_purchase_barrier_power(wallet: PlayerWalletType) -> bool:
var cost: int = get_next_barrier_power_cost()
return wallet != null and cost >= 0 and wallet.can_afford(cost)
func purchase_reel_speed(wallet: PlayerWalletType) -> bool:
return _purchase_level(true, wallet)
func purchase_barrier_power(wallet: PlayerWalletType) -> bool:
return _purchase_level(false, wallet)
func reset_to_defaults() -> void:
restore_levels(0, 0)
func restore_levels(
reel_speed_level: int,
barrier_power_level: int,
) -> bool:
var validated_reel: int = clampi(
reel_speed_level,
0,
MAX_REEL_SPEED_LEVEL
)
var validated_barrier: int = clampi(
barrier_power_level,
0,
MAX_BARRIER_POWER_LEVEL
)
var changed: bool = (
_reel_speed_level != validated_reel
or _barrier_power_level != validated_barrier
)
_reel_speed_level = validated_reel
_barrier_power_level = validated_barrier
if changed:
upgrades_changed.emit(
_reel_speed_level,
_barrier_power_level
)
return true
func restore_from_save(data: Dictionary) -> void:
var reel_value: Variant = data.get("reel_speed_level", 0)
var barrier_value: Variant = data.get("barrier_power_level", 0)
restore_levels(
int(reel_value) if reel_value is int or reel_value is float else 0,
int(barrier_value)
if barrier_value is int or barrier_value is float
else 0
)
func to_save_data() -> Dictionary:
return {
"reel_speed_level": _reel_speed_level,
"barrier_power_level": _barrier_power_level,
}
func _purchase_level(
is_reel_speed: bool,
wallet: PlayerWalletType,
) -> bool:
if wallet == null:
return false
var current_level: int = (
_reel_speed_level if is_reel_speed else _barrier_power_level
)
var maximum_level: int = (
MAX_REEL_SPEED_LEVEL
if is_reel_speed
else MAX_BARRIER_POWER_LEVEL
)
if current_level < 0 or current_level >= maximum_level:
return false
var costs: Array[int] = (
REEL_SPEED_COSTS if is_reel_speed else BARRIER_POWER_COSTS
)
var cost: int = costs[current_level]
if cost < 0 or not wallet.can_afford(cost):
return false
if not wallet.debit(cost):
return false
if is_reel_speed:
_reel_speed_level = current_level + 1
else:
_barrier_power_level = current_level + 1
upgrades_changed.emit(
_reel_speed_level,
_barrier_power_level
)
return true