extends PanelContainer @onready var printer_name_label: Label = $MarginContainer/MainArea/TopInfo/PrinterLabel @onready var printer_model_label: Label = $MarginContainer/MainArea/PrinterModelLabel @onready var progress_bar: ProgressBar = $MarginContainer/MainArea/PrintInfo/ProgressBar @onready var select_job: OptionButton = $MarginContainer/MainArea/SelectJob @onready var status_label: Label = $MarginContainer/MainArea/TopInfo/StatusLabel @onready var time_left_label: Label = $MarginContainer/MainArea/PrintInfo/TimeLeftLabel @onready var start_button: Button = $MarginContainer/MainArea/Buttons/StartButton var printer_data: PrinterData var selected_job: JobData var selected_job_index: int var is_printing: bool = false var time_left: float func _ready() -> void: GameData.print_started.connect(_on_print_started) func initialize_printer(data: PrinterData) -> void: printer_data = data printer_name_label.text = printer_data.printer_manufacturer printer_model_label.text = printer_data.printer_type time_left_label.visible = false time_left = 0 set_status() progress_bar.visible = false progress_bar.value = 0 _on_select_job_pressed() func _process(delta) -> void: if is_printing: select_job.visible = false progress_bar.visible = true time_left_label.visible = true set_status() var total_time = selected_job.job_time / printer_data.printer_speed var progress = (total_time - time_left) / total_time time_left -= delta progress_bar.value = progress time_left_label.text = 'Time left: %s' % calculate_time_left(time_left) if time_left <= 0: PlayerData.give_money.emit(selected_job.job_reward) PlayerData.give_experience.emit(selected_job.job_experience) select_job.visible = true reset_status() func reset_status() -> void: is_printing = false _on_select_job_pressed() set_status() time_left_label.visible = false progress_bar.visible = false progress_bar.value = 0 select_job.disabled = false func set_status() -> void: if is_printing: status_label.text = 'Status: Printing' else: status_label.text = 'Status: Free' func calculate_time_left(time) -> String: var minutes: int = 0 if time >= 60: while time >= 60: minutes += 1 time -= 60 return '%d m %.2f s' % [minutes, time] else: return '%.2f s' % time func _on_print_started() -> void: print("Refresh dropdown") _on_select_job_pressed() func _on_sell_button_pressed() -> void: PlayerData.give_money.emit(printer_data.printer_price * PlayerData.sell_multiplier) queue_free() func _on_select_job_pressed() -> void: select_job.clear() if PlayerData.jobs.is_empty(): select_job.add_item("No jobs accepted") start_button.disabled = true else: start_button.disabled = false for job in PlayerData.jobs: var item_text = '%s (XP: %d | %d € | %s)' % [job.job_name, job.job_experience, job.job_reward, calculate_time_left(job.job_time / printer_data.printer_speed)] select_job.add_item(item_text) var current_index = select_job.item_count - 1 select_job.set_item_metadata(current_index, job) selected_job = select_job.get_item_metadata(0) selected_job_index = 0 func _on_select_job_item_selected(index: int) -> void: selected_job = select_job.get_item_metadata(index) selected_job_index = index func _on_start_button_pressed() -> void: if not select_job.get_item_text(0) == "No jobs accepted": time_left = selected_job.job_time / printer_data.printer_speed progress_bar.value = 0 is_printing = true if PlayerData.jobs.size() == 1: PlayerData.jobs.clear() else: PlayerData.jobs.remove_at(selected_job_index) GameData.print_started.emit()