145 lines
3.4 KiB
GDScript
145 lines
3.4 KiB
GDScript
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
|