Finished adding Filament inventory and usage during printing

This commit is contained in:
jepsu 2026-07-01 17:17:19 +03:00
parent e4cff6f2b9
commit d112e0c105
3 changed files with 67 additions and 34 deletions

View file

@ -1,7 +1,12 @@
extends Node extends Node
signal amount_changed(new_amount)
var filament_data: FilamentData var filament_data: FilamentData
var amount: float var amount: float:
set(value):
amount = value
amount_changed.emit(amount)
func initialize_filament(data: FilamentData) -> void: func initialize_filament(data: FilamentData) -> void:

View file

@ -1,29 +1,32 @@
extends PanelContainer extends PanelContainer
@onready var printer_name_label: Label = $MarginContainer/MainArea/TopInfo/PrinterLabel @onready var printer_name_label: Label = $MarginContainer/MainArea/TopInfo/PrinterLabel
@onready var printer_model_label: Label = $MarginContainer/MainArea/PrinterModelLabel @onready var printer_model_label: Label = $MarginContainer/MainArea/Model/PrinterModelLabel
@onready var progress_bar: ProgressBar = $MarginContainer/MainArea/PrintInfo/ProgressBar @onready var progress_bar: ProgressBar = $MarginContainer/MainArea/PrintInfo/ProgressBar
@onready var select_job: OptionButton = $MarginContainer/MainArea/SelectJob @onready var select_job: OptionButton = $MarginContainer/MainArea/SelectJob
@onready var select_filament: OptionButton = $MarginContainer/MainArea/PrintInfo/InfoRow1/SelectFilament @onready var select_filament: OptionButton = $MarginContainer/MainArea/SelectFilament
@onready var status_label: RichTextLabel = $MarginContainer/MainArea/TopInfo/StatusLabel @onready var status_label: RichTextLabel = $MarginContainer/MainArea/TopInfo/StatusLabel
@onready var time_left_label: Label = $MarginContainer/MainArea/PrintInfo/InfoRow2/TimeLeftLabel @onready var time_left_label: RichTextLabel = $MarginContainer/MainArea/PrintInfo/InfoRow2/TimeLeftLabel
@onready var start_button: Button = $MarginContainer/MainArea/Buttons/StartButton @onready var start_button: Button = $MarginContainer/MainArea/Buttons/StartButton
@onready var reward_label: RichTextLabel = $MarginContainer/MainArea/PrintInfo/InfoRow2/RewardLabel @onready var reward_label: RichTextLabel = $MarginContainer/MainArea/PrintInfo/InfoRow2/RewardLabel
@onready var quality_label: RichTextLabel = $MarginContainer/MainArea/PrintInfo/InfoRow1/QualityLabel @onready var quality_label: RichTextLabel = $MarginContainer/MainArea/PrintInfo/InfoRow1/QualityLabel
@onready var loaded_filament_label: RichTextLabel = $MarginContainer/MainArea/PrintInfo/InfoRow1/LoadedFilament
var printer_data: PrinterData var printer_data: PrinterData
# - Job and Filament selection variables
var selected_job: JobData var selected_job: JobData
var selected_job_index: int var selected_job_index: int
var selected_filament: Node var selected_filament: Node = null
var selected_filament_index: int var selected_filament_index: int
# - Printer states
var is_printing: bool = false var is_printing: bool = false
var time_left: float var print_failed: bool = false
# Variables - Failure calculations # Variables - Failure calculations
var print_failed: bool = false var time_left: float
var failure_points: Array var failure_points: Array
var failure_point_amount: float = 5 var failure_point_amount: float = 5
var print_quality: float = 1.0 var print_quality: float = 1.0
@ -38,6 +41,7 @@ func initialize_printer(data: PrinterData) -> void:
quality_label.visible = false quality_label.visible = false
reward_label.visible = false reward_label.visible = false
time_left_label.visible = false time_left_label.visible = false
loaded_filament_label.visible = true
time_left = 0 time_left = 0
status_label.text = 'Status: [color=%s]%s[/color]' % [GameData.hex_white, "Free"] status_label.text = 'Status: [color=%s]%s[/color]' % [GameData.hex_white, "Free"]
progress_bar.visible = false progress_bar.visible = false
@ -49,11 +53,12 @@ func initialize_printer(data: PrinterData) -> void:
func _process(delta) -> void: func _process(delta) -> void:
if is_printing: if is_printing:
select_job.visible = false select_job.hide()
progress_bar.visible = true select_filament.hide()
time_left_label.visible = true progress_bar.show()
quality_label.visible = true time_left_label.show()
reward_label.visible = true quality_label.show()
reward_label.show()
set_status() set_status()
var text_color = GameData.hex_green var text_color = GameData.hex_green
@ -66,10 +71,10 @@ func _process(delta) -> void:
var total_time = selected_job.job_time / printer_data.printer_speed var total_time = selected_job.job_time / printer_data.printer_speed
var progress = (total_time - time_left) / total_time var progress = (total_time - time_left) / total_time
selected_filament.amount -= delta selected_filament.amount -= 0.5 * delta
time_left -= delta time_left -= delta
progress_bar.value = progress progress_bar.value = progress
time_left_label.text = 'Time left: %s' % calculate_time_left(time_left) time_left_label.text = 'Time left: [color=%s]%s[/color]' % [GameData.hex_blue, calculate_time_left(time_left)]
if time_left <= 0: if time_left <= 0:
var end_reward = selected_job.job_reward * print_quality var end_reward = selected_job.job_reward * print_quality
@ -99,14 +104,15 @@ func reset_status() -> void:
print_failed = false print_failed = false
print_quality = 1.0 print_quality = 1.0
failure_points = [] failure_points = []
time_left_label.visible = false time_left_label.hide()
quality_label.visible = false quality_label.hide()
reward_label.visible = false reward_label.hide()
progress_bar.visible = false progress_bar.hide()
progress_bar.value = 0 progress_bar.value = 0
time_left = 0 time_left = 0
select_filament.show()
select_job.disabled = false select_job.disabled = false
select_job.visible = true select_job.show()
start_button.disabled = false start_button.disabled = false
_on_select_job_pressed() _on_select_job_pressed()
@ -173,6 +179,7 @@ func _on_select_filament_pressed() -> void:
if current_filaments.is_empty(): if current_filaments.is_empty():
select_filament.add_item("Out of filament") select_filament.add_item("Out of filament")
loaded_filament_label.text = 'Loaded filament: None'
selected_filament = null selected_filament = null
else: else:
for filament in current_filaments: for filament in current_filaments:
@ -186,14 +193,18 @@ func _on_select_filament_pressed() -> void:
select_filament.set_item_metadata(current_index, filament) select_filament.set_item_metadata(current_index, filament)
selected_filament = select_filament.get_item_metadata(0) selected_filament = select_filament.get_item_metadata(0)
selected_job_index = 0 selected_job_index = 0
selected_filament.amount_changed.connect(_on_filament_amount_changed)
_on_filament_amount_changed(selected_filament.amount)
func _on_select_filament_item_selected(index: int) -> void: func _on_select_filament_item_selected(index: int) -> void:
selected_filament = select_filament.get_item_metadata(index) selected_filament = select_filament.get_item_metadata(index)
selected_filament_index = index selected_filament_index = index
selected_filament.amount_changed.connect(_on_filament_amount_changed)
_on_filament_amount_changed(selected_filament.amount)
func _on_select_job_pressed() -> void: func _on_select_job_pressed() -> void:
select_job.clear() select_job.clear()
if PlayerData.jobs.is_empty(): # or GameData.filaments_array.is_empty(): if PlayerData.jobs.is_empty():
select_job.add_item("No jobs accepted") select_job.add_item("No jobs accepted")
start_button.disabled = true start_button.disabled = true
else: else:
@ -212,6 +223,9 @@ func _on_select_job_item_selected(index: int) -> void:
selected_job = select_job.get_item_metadata(index) selected_job = select_job.get_item_metadata(index)
selected_job_index = index selected_job_index = index
func _on_filament_amount_changed(new_amount: float) -> void:
loaded_filament_label.text = 'Loaded filament: [color=%s]%s | %.2f g[/color]' % [GameData.hex_blue, selected_filament.filament_data.material, new_amount]
func _on_start_button_pressed() -> void: func _on_start_button_pressed() -> void:
if select_job.get_item_text(0) == "No jobs accepted": if select_job.get_item_text(0) == "No jobs accepted":
return return
@ -229,11 +243,5 @@ func _on_start_button_pressed() -> void:
else: else:
PlayerData.jobs.remove_at(selected_job_index) PlayerData.jobs.remove_at(selected_job_index)
# Remove filament from filament selection dropdown
if GameData.filaments_array.size() == 1:
GameData.filaments_array.clear()
else:
GameData.filaments_array.remove_at(selected_filament_index)
failure_points = calculate_fail_thresholds() failure_points = calculate_fail_thresholds()
GameData.refresh_printer_dropdown.emit() GameData.refresh_printer_dropdown.emit()

View file

@ -41,8 +41,12 @@ text = "Status: Free"
horizontal_alignment = 2 horizontal_alignment = 2
vertical_alignment = 1 vertical_alignment = 1
[node name="PrinterModelLabel" type="Label" parent="MarginContainer/MainArea" unique_id=666140345] [node name="Model" type="HBoxContainer" parent="MarginContainer/MainArea" unique_id=916690802]
layout_mode = 2 layout_mode = 2
[node name="PrinterModelLabel" type="Label" parent="MarginContainer/MainArea/Model" unique_id=666140345]
layout_mode = 2
size_flags_horizontal = 3
text = "Printer model" text = "Printer model"
[node name="PrintInfo" type="VBoxContainer" parent="MarginContainer/MainArea" unique_id=1502076264] [node name="PrintInfo" type="VBoxContainer" parent="MarginContainer/MainArea" unique_id=1502076264]
@ -50,11 +54,13 @@ layout_mode = 2
[node name="InfoRow1" type="HBoxContainer" parent="MarginContainer/MainArea/PrintInfo" unique_id=1561257387] [node name="InfoRow1" type="HBoxContainer" parent="MarginContainer/MainArea/PrintInfo" unique_id=1561257387]
layout_mode = 2 layout_mode = 2
size_flags_vertical = 3
[node name="SelectFilament" type="OptionButton" parent="MarginContainer/MainArea/PrintInfo/InfoRow1" unique_id=1562930238] [node name="LoadedFilament" type="RichTextLabel" parent="MarginContainer/MainArea/PrintInfo/InfoRow1" unique_id=532233684]
layout_mode = 2 layout_mode = 2
item_count = 1 size_flags_horizontal = 3
popup/item_0/id = 0 bbcode_enabled = true
text = "Loaded filament: XXX | XXX g"
[node name="QualityLabel" type="RichTextLabel" parent="MarginContainer/MainArea/PrintInfo/InfoRow1" unique_id=937206053] [node name="QualityLabel" type="RichTextLabel" parent="MarginContainer/MainArea/PrintInfo/InfoRow1" unique_id=937206053]
layout_mode = 2 layout_mode = 2
@ -63,11 +69,17 @@ bbcode_enabled = true
text = "Print quality: ###%" text = "Print quality: ###%"
horizontal_alignment = 2 horizontal_alignment = 2
[node name="InfoRow2" type="HBoxContainer" parent="MarginContainer/MainArea/PrintInfo" unique_id=719967546] [node name="Label" type="Label" parent="MarginContainer/MainArea/PrintInfo/InfoRow1" unique_id=1388403149]
layout_mode = 2 layout_mode = 2
[node name="TimeLeftLabel" type="Label" parent="MarginContainer/MainArea/PrintInfo/InfoRow2" unique_id=1516591173] [node name="InfoRow2" type="HBoxContainer" parent="MarginContainer/MainArea/PrintInfo" unique_id=719967546]
layout_mode = 2 layout_mode = 2
size_flags_vertical = 3
[node name="TimeLeftLabel" type="RichTextLabel" parent="MarginContainer/MainArea/PrintInfo/InfoRow2" unique_id=948453921]
layout_mode = 2
size_flags_horizontal = 3
bbcode_enabled = true
text = "Time left: ###s" text = "Time left: ###s"
[node name="RewardLabel" type="RichTextLabel" parent="MarginContainer/MainArea/PrintInfo/InfoRow2" unique_id=700892606] [node name="RewardLabel" type="RichTextLabel" parent="MarginContainer/MainArea/PrintInfo/InfoRow2" unique_id=700892606]
@ -77,6 +89,9 @@ bbcode_enabled = true
text = "Reward: ###€" text = "Reward: ###€"
horizontal_alignment = 2 horizontal_alignment = 2
[node name="Label" type="Label" parent="MarginContainer/MainArea/PrintInfo/InfoRow2" unique_id=1668802451]
layout_mode = 2
[node name="ProgressBar" type="ProgressBar" parent="MarginContainer/MainArea/PrintInfo" unique_id=768246659] [node name="ProgressBar" type="ProgressBar" parent="MarginContainer/MainArea/PrintInfo" unique_id=768246659]
layout_mode = 2 layout_mode = 2
theme_override_styles/fill = ExtResource("2_dlbos") theme_override_styles/fill = ExtResource("2_dlbos")
@ -103,14 +118,19 @@ size_flags_horizontal = 3
theme_override_styles/hover = ExtResource("3_mmlst") theme_override_styles/hover = ExtResource("3_mmlst")
text = "Sell printer" text = "Sell printer"
[node name="SelectFilament" type="OptionButton" parent="MarginContainer/MainArea" unique_id=1562930238]
layout_mode = 2
item_count = 1
popup/item_0/id = 0
[node name="SelectJob" type="OptionButton" parent="MarginContainer/MainArea" unique_id=1500040832] [node name="SelectJob" type="OptionButton" parent="MarginContainer/MainArea" unique_id=1500040832]
layout_mode = 2 layout_mode = 2
[node name="Timer" type="Timer" parent="." unique_id=425740035] [node name="Timer" type="Timer" parent="." unique_id=425740035]
[connection signal="item_selected" from="MarginContainer/MainArea/PrintInfo/InfoRow1/SelectFilament" to="." method="_on_select_filament_item_selected"]
[connection signal="pressed" from="MarginContainer/MainArea/PrintInfo/InfoRow1/SelectFilament" to="." method="_on_select_filament_pressed"]
[connection signal="pressed" from="MarginContainer/MainArea/Buttons/StartButton" to="." method="_on_start_button_pressed"] [connection signal="pressed" from="MarginContainer/MainArea/Buttons/StartButton" to="." method="_on_start_button_pressed"]
[connection signal="pressed" from="MarginContainer/MainArea/Buttons/SellButton" to="." method="_on_sell_button_pressed"] [connection signal="pressed" from="MarginContainer/MainArea/Buttons/SellButton" to="." method="_on_sell_button_pressed"]
[connection signal="item_selected" from="MarginContainer/MainArea/SelectFilament" to="." method="_on_select_filament_item_selected"]
[connection signal="pressed" from="MarginContainer/MainArea/SelectFilament" to="." method="_on_select_filament_pressed"]
[connection signal="item_selected" from="MarginContainer/MainArea/SelectJob" to="." method="_on_select_job_item_selected"] [connection signal="item_selected" from="MarginContainer/MainArea/SelectJob" to="." method="_on_select_job_item_selected"]
[connection signal="pressed" from="MarginContainer/MainArea/SelectJob" to="." method="_on_select_job_pressed"] [connection signal="pressed" from="MarginContainer/MainArea/SelectJob" to="." method="_on_select_job_pressed"]