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)