This commit is contained in:
Michele Rossi
2026-03-13 00:36:52 +01:00
parent e019b4b90a
commit 246cf6a05f
12 changed files with 549 additions and 126 deletions

View File

@@ -12,21 +12,59 @@ const HUGE_COST_EXPONENT: int = 1000000
@export var is_automatic: bool = true
@export var press_buys_generator: bool = true
@export var run_multiplier: float = 1.0
@export var starts_unlocked: bool = true
@export var starts_available: bool = true
## Manual click fallback when no data is assigned.
@export var click_mantissa: float = 1.0
@export var click_exponent: int = 0
var owned: int = 0
var purchased_count: int = 0
var owned: int:
get:
_ensure_registered()
return GameState.get_generator_owned(_generator_id)
set(value):
_ensure_registered()
GameState.set_generator_owned(_generator_id, value)
var purchased_count: int:
get:
_ensure_registered()
return GameState.get_generator_purchased_count(_generator_id)
set(value):
_ensure_registered()
GameState.set_generator_purchased_count(_generator_id, value)
var is_unlocked: bool:
get:
_ensure_registered()
return GameState.is_generator_unlocked(_generator_id)
set(value):
_ensure_registered()
GameState.set_generator_unlocked(_generator_id, value)
var is_available: bool:
get:
_ensure_registered()
return GameState.is_generator_available(_generator_id)
set(value):
_ensure_registered()
GameState.set_generator_available(_generator_id, value)
var cycle_progress_seconds: float = 0.0
var _generator_id: StringName = &""
var _is_registered: bool = false
func _ready() -> void:
_generator_id = _resolve_generator_id()
_ensure_registered()
cycle_progress_seconds = 0.0
func _process(delta: float) -> void:
if not is_automatic:
return
if not is_available_to_player():
return
if data == null or owned <= 0:
return
@@ -63,6 +101,9 @@ func get_cost_for_amount(amount: int = 1) -> BigNumber:
return _float_to_big_number(raw_cost)
func can_buy(amount: int = 1) -> bool:
if not is_available_to_player():
return false
var cost: BigNumber = get_cost_for_amount(amount)
var current: BigNumber = _get_currency_amount()
return current.is_greater_than(cost) or current.is_equal_to(cost)
@@ -70,6 +111,8 @@ func can_buy(amount: int = 1) -> bool:
func buy(amount: int = 1) -> bool:
if data == null:
return false
if not is_available_to_player():
return false
var safe_amount: int = maxi(amount, 1)
var total_cost: BigNumber = get_cost_for_amount(safe_amount)
@@ -85,6 +128,8 @@ func buy(amount: int = 1) -> bool:
func buy_max() -> int:
if data == null:
return 0
if not is_available_to_player():
return 0
var available_currency: float = _big_number_to_float(_get_currency_amount())
var estimated_max: int = data.max_affordable(owned, available_currency)
@@ -108,6 +153,9 @@ func buy_max() -> int:
return best if buy(best) else 0
func _on_pressed() -> void:
if not is_available_to_player():
return
if data != null and press_buys_generator:
buy(1)
return
@@ -117,6 +165,13 @@ func _on_pressed() -> void:
func grant_currency(amount: BigNumber) -> void:
_add_currency(amount)
func get_generator_id() -> StringName:
_ensure_registered()
return _generator_id
func is_available_to_player() -> bool:
return is_unlocked and is_available
func _add_currency(amount: BigNumber) -> void:
match currency:
GameState.CurrencyType.gold:
@@ -160,3 +215,36 @@ func _big_number_to_float(value: BigNumber) -> float:
if value.exponent < -308:
return 0.0
return value.mantissa * pow(10.0, float(value.exponent))
func _resolve_generator_id() -> StringName:
if data != null:
var data_id: String = String(data.id)
if not data_id.is_empty():
return StringName(data_id)
if not String(name).is_empty():
return StringName(String(name))
return &"generator"
func _ensure_registered() -> void:
if _is_registered:
return
if _generator_id == &"":
_generator_id = _resolve_generator_id()
if _generator_id == &"":
return
GameState.register_generator(_generator_id, _default_unlocked_state(), _default_available_state())
_is_registered = true
func _default_unlocked_state() -> bool:
if data != null:
return data.starts_unlocked
return starts_unlocked
func _default_available_state() -> bool:
if data != null:
return data.starts_available
return starts_available

View File

@@ -3,6 +3,8 @@ extends Resource
@export var id: StringName = &""
@export var name: String = ""
@export var starts_unlocked: bool = true
@export var starts_available: bool = true
## Base cost and exponential growth (part I): cost_next = b * r^owned
@export var initial_cost: float = 10.0

View File

@@ -0,0 +1,13 @@
[gd_resource type="Resource" script_class="CurrencyGeneratorData" format=3 uid="uid://04pmc034qupd"]
[ext_resource type="Script" uid="uid://b00tqsuhxdy0d" path="res://generator/currency_generator_data.gd" id="1_s3g28"]
[resource]
script = ExtResource("1_s3g28")
id = &"Gems"
name = "Gems Mine"
initial_cost = 60.0
initial_time = 3.0
initial_revenue = 60.0
initial_productivity = 20.0
metadata/_custom_type_script = "uid://b00tqsuhxdy0d"