Add fishing shop and persistent upgrades
This commit is contained in:
parent
49e7faaf84
commit
6386c5e3e3
27 changed files with 1662 additions and 38 deletions
145
progression/player_fishing_upgrades.gd
Normal file
145
progression/player_fishing_upgrades.gd
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
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
|
||||
1
progression/player_fishing_upgrades.gd.uid
Normal file
1
progression/player_fishing_upgrades.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://c6xd5laffvicg
|
||||
Loading…
Add table
Add a link
Reference in a new issue