Files
idle/core/research/research_xp_tracker.gd

73 lines
2.3 KiB
GDScript

class_name ResearchXPTracker
extends Node
@export var game_state: LevelGameState
signal research_xp_changed(research_id: StringName, new_xp: BigNumber)
signal research_level_up(research_id: StringName, old_level: int, new_level: int)
func add_xp_with_buffs(research_id: StringName, base_xp: BigNumber) -> BigNumber:
if game_state == null:
return BigNumber.new(0.0, 0)
var buff_multiplier: float = game_state.get_research_xp_multiplier(research_id)
var multiplier_bn: BigNumber = BigNumber.from_float(buff_multiplier)
var actual_xp: BigNumber = base_xp.multiply(multiplier_bn)
game_state.add_research_xp(research_id, actual_xp)
return actual_xp
func _on_generator_produced(generator_id: StringName, _amount: Variant) -> void:
var research: ResearchData = _get_research_for_generator(generator_id)
if research == null:
return
var research_catalogue: ResearchCatalogue = game_state.research_catalogue
if research_catalogue == null:
return
research = research_catalogue.get_research_by_generator_id(generator_id)
if research == null:
return
if not _is_research_active(research.id):
return
var amount_big: BigNumber = _amount
var amount_float: float = amount_big.mantissa * pow(10.0, float(amount_big.exponent))
if amount_float <= 0.0:
return
var base_xp: BigNumber = BigNumber.from_float(research.xp_per_currency_produced * amount_float)
if base_xp.mantissa <= 0.0:
return
add_xp_with_buffs(research.id, base_xp)
func _get_research_for_generator(generator_id: StringName) -> ResearchData:
if game_state == null or game_state.research_catalogue == null:
return null
return game_state.research_catalogue.get_research_by_generator_id(generator_id)
func _is_research_active(research_id: StringName) -> bool:
if game_state == null:
return false
var research_panel: Node = game_state.find_child("ResearchPanel", true, false)
if research_panel == null:
return true
if research_panel.has_method("is_research_active"):
return research_panel.is_research_active(research_id)
return true
func activate_research(research_id: StringName) -> void:
if game_state == null:
return
var research_panel: Node = game_state.find_child("ResearchPanel", true, false)
if research_panel != null and research_panel.has_method("activate_research"):
research_panel.activate_research(research_id)