75 lines
2.7 KiB
GDScript
75 lines
2.7 KiB
GDScript
class_name ResearchRow
|
|
extends HBoxContainer
|
|
|
|
@onready var _name_label: Label = $VBoxContainer/NameLabel
|
|
@onready var _level_label: Label = $VBoxContainer/HBoxContainer/LevelLabel
|
|
@onready var _progress_bar: ProgressBar = $VBoxContainer/HBoxContainer/ProgressBar
|
|
@onready var _multiplier_label: Label = $VBoxContainer/HBoxContainer/MultiplierLabel
|
|
@onready var _buff_label: Label = $VBoxContainer/HBoxContainer/BuffLabel
|
|
|
|
var _research: ResearchData
|
|
var _game_state: LevelGameState
|
|
|
|
func _ready() -> void:
|
|
_game_state = find_parent("LevelGameState")
|
|
if _game_state == null:
|
|
push_error("ResearchRow: Could not find LevelGameState parent")
|
|
return
|
|
|
|
_game_state.research_xp_changed.connect(_on_research_xp_changed)
|
|
_game_state.research_level_up.connect(_on_research_level_up)
|
|
|
|
func setup(research: ResearchData) -> void:
|
|
_research = research
|
|
if _name_label:
|
|
_name_label.text = research.name
|
|
|
|
func get_research_id() -> StringName:
|
|
if _research == null:
|
|
return &""
|
|
return _research.id
|
|
|
|
func update_display(level: int, progress: float, multiplier: float, xp_current: BigNumber, xp_needed: BigNumber) -> void:
|
|
if _level_label:
|
|
_level_label.text = "Level %d" % level
|
|
|
|
if _progress_bar:
|
|
_progress_bar.value = progress * 100
|
|
|
|
if _multiplier_label:
|
|
_multiplier_label.text = "+%d%%" % int((multiplier - 1.0) * 100)
|
|
|
|
if _buff_label and _research != null:
|
|
if not _research.associated_buff_id.is_empty():
|
|
var buff: GeneratorBuffData = _game_state.get_buff(_research.associated_buff_id)
|
|
if buff != null and _game_state.is_buff_active(buff.id):
|
|
var buff_level: int = _game_state.get_buff_level(buff.id)
|
|
var effect: float = buff.get_effect_multiplier(buff_level) - 1.0
|
|
_buff_label.text = "%s: +%d%% XP" % [buff.text, int(effect * 100)]
|
|
else:
|
|
_buff_label.text = ""
|
|
else:
|
|
_buff_label.text = ""
|
|
|
|
func _on_research_xp_changed(research_id: StringName, _new_xp: BigNumber) -> void:
|
|
if _research != null and research_id == _research.id:
|
|
_update_from_state()
|
|
|
|
func _on_research_level_up(research_id: StringName, _old_level: int, _new_level: int) -> void:
|
|
if _research != null and research_id == _research.id:
|
|
_update_from_state()
|
|
|
|
func _update_from_state() -> void:
|
|
if _research == null or _game_state == null:
|
|
return
|
|
|
|
var xp: BigNumber = _game_state.get_research_xp(_research.id)
|
|
var level: int = _game_state.get_research_level(_research.id)
|
|
|
|
var progress: float = _research.get_xp_progress(xp)
|
|
var multiplier: float = _research.get_multiplier_for_level(level)
|
|
var xp_current: BigNumber = xp.subtract(_research.get_total_xp_for_level(level))
|
|
var xp_needed: BigNumber = _research.get_xp_required_for_level_big(level + 1)
|
|
|
|
update_display(level, progress, multiplier, xp_current, xp_needed)
|