Use worker for research
This commit is contained in:
@@ -23,6 +23,10 @@ signal goal_progress_changed(goal_id: StringName, progress: float)
|
||||
signal research_xp_changed(research_id: StringName, new_xp: BigNumber)
|
||||
## Emitted when a research track levels up.
|
||||
signal research_level_up(research_id: StringName, old_level: int, new_level: int)
|
||||
## Emitted when worker count changes (derived from currency balance).
|
||||
signal worker_count_changed(currency_id: StringName, new_count: int)
|
||||
## Emitted when research workers change.
|
||||
signal research_workers_changed(new_count: int)
|
||||
|
||||
# ==============================================================================
|
||||
# EXPORTED REFERENCES
|
||||
@@ -72,6 +76,8 @@ var _goal_completed: Dictionary = {}
|
||||
var research_xp: Dictionary = {}
|
||||
## Research levels by research ID.
|
||||
var research_levels: Dictionary = {}
|
||||
## Workers assigned to research (total across all tracks).
|
||||
var research_workers: int = 0
|
||||
|
||||
## Unix timestamp of last save.
|
||||
var last_save_time: int = 0
|
||||
@@ -81,8 +87,8 @@ var last_save_time: int = 0
|
||||
# ==============================================================================
|
||||
## JSON key for save format version.
|
||||
const SAVE_FORMAT_VERSION_KEY: String = "save_format_version"
|
||||
## Current save format version (5 includes research XP BigNumber serialization).
|
||||
const CURRENT_SAVE_FORMAT_VERSION: int = 5
|
||||
## Current save format version (7 includes research workers tracking).
|
||||
const CURRENT_SAVE_FORMAT_VERSION: int = 7
|
||||
## JSON key for generator owned count.
|
||||
const GENERATOR_OWNED_KEY: String = "owned"
|
||||
## JSON key for generator purchased count.
|
||||
@@ -120,6 +126,8 @@ const LAST_SAVE_TIME_KEY: String = "last_save_time"
|
||||
const RESEARCH_XP_KEY: String = "research_xp"
|
||||
## JSON key for research levels section.
|
||||
const RESEARCH_LEVELS_KEY: String = "research_levels"
|
||||
## JSON key for research workers section.
|
||||
const RESEARCH_WORKERS_KEY: String = "research_workers"
|
||||
|
||||
## Reference to the PrestigeManager autoload node (set in _ready).
|
||||
var prestige_manager: PrestigeManager
|
||||
@@ -484,6 +492,31 @@ func get_research_multiplier(research_id: StringName) -> float:
|
||||
return 1.0
|
||||
return research.get_multiplier_for_level(level)
|
||||
|
||||
## Returns the total number of workers assigned to research.
|
||||
func get_research_workers() -> int:
|
||||
return research_workers
|
||||
|
||||
## Assigns a worker to research (called when spending worker currency on research).
|
||||
func assign_worker_to_research() -> bool:
|
||||
var worker_currency: BigNumber = get_currency_amount_by_id("worker")
|
||||
if worker_currency.mantissa < 1.0:
|
||||
return false
|
||||
|
||||
spend_currency_by_id("worker", BigNumber.from_float(1.0))
|
||||
research_workers += 1
|
||||
research_workers_changed.emit(research_workers)
|
||||
return true
|
||||
|
||||
## Removes a worker from research (returns to worker currency).
|
||||
func remove_worker_from_research() -> bool:
|
||||
if research_workers <= 0:
|
||||
return false
|
||||
|
||||
research_workers -= 1
|
||||
add_currency_by_id("worker", BigNumber.from_float(1.0))
|
||||
research_workers_changed.emit(research_workers)
|
||||
return true
|
||||
|
||||
## Adds XP to a research track, applying buff modifiers and emitting signals on level up.
|
||||
func add_research_xp(research_id: StringName, xp: BigNumber) -> void:
|
||||
var actual_xp: BigNumber = ResearchBuffCalculator.apply_buffs(self, research_id, xp)
|
||||
@@ -508,6 +541,11 @@ func _get_research_data(research_id: StringName) -> ResearchData:
|
||||
return null
|
||||
return research_catalogue.get_research_by_id(research_id)
|
||||
|
||||
## Returns the current worker count (derived from "worker" currency balance).
|
||||
func get_worker_count() -> int:
|
||||
var worker_amount: BigNumber = get_currency_amount_by_id("worker")
|
||||
return int(worker_amount.mantissa) if worker_amount.mantissa >= 0 else 0
|
||||
|
||||
#endregion
|
||||
|
||||
# ==============================================================================
|
||||
@@ -588,6 +626,7 @@ func save_game() -> void:
|
||||
GOALS_KEY: _serialize_goals(),
|
||||
RESEARCH_XP_KEY: _serialize_research_xp(),
|
||||
RESEARCH_LEVELS_KEY: research_levels.duplicate(),
|
||||
RESEARCH_WORKERS_KEY: research_workers,
|
||||
LAST_SAVE_TIME_KEY: Time.get_unix_time_from_system()
|
||||
}
|
||||
|
||||
@@ -639,13 +678,15 @@ func load_game() -> void:
|
||||
research_xp = _deserialize_research_xp(parsed_data.get(RESEARCH_XP_KEY, {}))
|
||||
if parsed_data.has(RESEARCH_LEVELS_KEY):
|
||||
research_levels = parsed_data.get(RESEARCH_LEVELS_KEY, {})
|
||||
if parsed_data.has(RESEARCH_WORKERS_KEY):
|
||||
research_workers = int(parsed_data.get(RESEARCH_WORKERS_KEY, 0))
|
||||
|
||||
last_save_time = parsed_data.get(LAST_SAVE_TIME_KEY, Time.get_unix_time_from_system())
|
||||
for save_key_variant in parsed_data.keys():
|
||||
var save_key: String = String(save_key_variant)
|
||||
if save_key.is_empty():
|
||||
continue
|
||||
if save_key in [SAVE_FORMAT_VERSION_KEY, CURRENCIES_KEY, GENERATOR_STATES_KEY, BUFF_LEVELS_KEY, BUFF_UNLOCKED_KEY, BUFF_ACTIVE_KEY, GOALS_KEY, RESEARCH_XP_KEY, RESEARCH_LEVELS_KEY, LAST_SAVE_TIME_KEY]:
|
||||
if save_key in [SAVE_FORMAT_VERSION_KEY, CURRENCIES_KEY, GENERATOR_STATES_KEY, BUFF_LEVELS_KEY, BUFF_UNLOCKED_KEY, BUFF_ACTIVE_KEY, GOALS_KEY, RESEARCH_XP_KEY, RESEARCH_LEVELS_KEY, RESEARCH_WORKERS_KEY, LAST_SAVE_TIME_KEY]:
|
||||
continue
|
||||
|
||||
var section_payload: Variant = parsed_data.get(save_key_variant)
|
||||
|
||||
Reference in New Issue
Block a user