73 lines
2.3 KiB
GDScript
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)
|