From 05df588aa74725ac5e6c85ae7c53a0de4a49825a Mon Sep 17 00:00:00 2001 From: jepsu Date: Fri, 26 Jun 2026 20:41:22 +0300 Subject: [PATCH] Visual tweaks and added printing functionality --- Resources/job_data.gd | 26 +++++++++-- Styles/btn_style_box_green_hover.tres | 9 ++++ Styles/btn_style_box_red_hover.tres | 9 ++++ job_card.gd | 25 ++++++++--- job_card.tscn | 20 ++++++--- printer.gd | 63 ++++++++++++++++++++++++--- printer.tscn | 6 ++- printer_card.gd | 5 +++ printers.gd | 1 - printers_card.tscn | 2 + ui.gd | 4 -- ui.tscn | 12 ++++- 12 files changed, 153 insertions(+), 29 deletions(-) create mode 100644 Styles/btn_style_box_green_hover.tres create mode 100644 Styles/btn_style_box_red_hover.tres diff --git a/Resources/job_data.gd b/Resources/job_data.gd index ba58d38..fb0c3ab 100644 --- a/Resources/job_data.gd +++ b/Resources/job_data.gd @@ -2,7 +2,27 @@ class_name JobData extends Resource @export var job_name: String -@export var job_reward: float -@export var job_experience: float -@export var job_amount: int +@export var job_reward: float: + set(value): + job_reward = value + _generate_job_time() +@export var job_experience: float: + set(value): + job_experience = value + _generate_job_time() +@export var job_amount: int: + set(value): + job_amount = value + _generate_job_time() @export var job_description: String +var job_time: float +var job_material: String = "PLA" + + +func _init() -> void: + _generate_job_time() + +func _generate_job_time() -> void: + var print_time: float = sqrt(job_experience + job_reward) * job_amount + var round_time: float = round(print_time * 100) / 100 + job_time = round_time diff --git a/Styles/btn_style_box_green_hover.tres b/Styles/btn_style_box_green_hover.tres new file mode 100644 index 0000000..0886185 --- /dev/null +++ b/Styles/btn_style_box_green_hover.tres @@ -0,0 +1,9 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://csahw36txnewl"] + +[resource] +bg_color = Color(0.38039216, 0.5294118, 0.39215687, 0.39215687) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 +corner_detail = 5 diff --git a/Styles/btn_style_box_red_hover.tres b/Styles/btn_style_box_red_hover.tres new file mode 100644 index 0000000..53f7647 --- /dev/null +++ b/Styles/btn_style_box_red_hover.tres @@ -0,0 +1,9 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://b0kxbbhtsbhcr"] + +[resource] +bg_color = Color(0.67741466, 0.38848603, 0.4169196, 0.39215687) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 +corner_detail = 5 diff --git a/job_card.gd b/job_card.gd index f451d00..2cbb9e4 100644 --- a/job_card.gd +++ b/job_card.gd @@ -3,7 +3,7 @@ extends PanelContainer signal job_accepted var job_data: JobData -var job_time: float +var job_time: String var job_material: String @onready var job_name: Label = $MarginContainer/VBoxContainer/HBoxContainer2/PartName @onready var job_amount: Label = $MarginContainer/VBoxContainer/HBoxContainer3/PartAmount @@ -20,14 +20,25 @@ func initialize_job(data: JobData) -> void: job_name.text = job_data.job_name job_amount.text = 'Amount: %d pcs' % job_data.job_amount job_reward.text = 'Reward: %.2f €' % job_data.job_reward - job_experience.text = 'Experience: %.0f xp | ' % job_data.job_experience - job_time_label.text = 'Time: %.2f s' % job_time + job_experience.text = 'Experience: %.0f xp' % job_data.job_experience + job_time_label.text = 'Time: %s' % job_time job_material_label.text = '| %s' % job_material +func calculate_time() -> String: + var print_time: float = sqrt(job_data.job_experience + job_data.job_reward) * job_data.job_amount + var round_time: float = round(print_time * 100) / 100 + var minutes: int = 0 + + if round_time >= 60: + while round_time >= 60: + minutes += 1 + round_time -= 60 + return '%d m %.2f s' % [minutes, round_time] + else: + return '%.2f s' % round_time + func _on_accept_job_pressed() -> void: job_accepted.emit(self) -func calculate_time() -> float: - var print_time: float = sqrt(job_data.job_experience + job_data.job_reward) * job_data.job_amount - var round_time: float = round(print_time * 100) / 100 - return round_time +func _on_skip_job_pressed() -> void: + queue_free() diff --git a/job_card.tscn b/job_card.tscn index 98ca8c7..d390f26 100644 --- a/job_card.tscn +++ b/job_card.tscn @@ -1,6 +1,8 @@ [gd_scene format=3 uid="uid://dvfcie8hqcb0"] [ext_resource type="Script" uid="uid://wjam0w8dmel3" path="res://job_card.gd" id="1_vsles"] +[ext_resource type="StyleBox" uid="uid://csahw36txnewl" path="res://Styles/btn_style_box_green_hover.tres" id="2_4nwb4"] +[ext_resource type="StyleBox" uid="uid://b0kxbbhtsbhcr" path="res://Styles/btn_style_box_red_hover.tres" id="3_h28cc"] [node name="JobCard" type="PanelContainer" unique_id=1714388686] offset_right = 40.0 @@ -34,12 +36,19 @@ layout_mode = 2 [node name="PartExperience" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer3" unique_id=1599086122] layout_mode = 2 +size_flags_horizontal = 3 text = "Experience: 40" [node name="PartAmount" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer3" unique_id=1418182269] layout_mode = 2 +size_flags_horizontal = 3 text = "Amount: 1" -horizontal_alignment = 1 + +[node name="AcceptJob" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer3" unique_id=1475207118] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_styles/hover = ExtResource("2_4nwb4") +text = "Accept" [node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer" unique_id=1428599849] layout_mode = 2 @@ -54,11 +63,12 @@ text = "Reward: 5 €" layout_mode = 2 size_flags_horizontal = 3 text = "Time: 3 min" -horizontal_alignment = 1 -[node name="AcceptJob" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=1475207118] +[node name="SkipJob" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=1848796901] layout_mode = 2 size_flags_horizontal = 3 -text = "Accept Job" +theme_override_styles/hover = ExtResource("3_h28cc") +text = "Skip" -[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/AcceptJob" to="." method="_on_accept_job_pressed"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer3/AcceptJob" to="." method="_on_accept_job_pressed"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/SkipJob" to="." method="_on_skip_job_pressed"] diff --git a/printer.gd b/printer.gd index f0334e5..307c5bf 100644 --- a/printer.gd +++ b/printer.gd @@ -4,21 +4,74 @@ extends PanelContainer @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 var printer_data: PrinterData var selected_job: JobData var selected_job_index: int +var is_printing: bool = false +var time_left: float func initialize_printer(data: PrinterData) -> void: printer_data = data - #print("Creating bought printer: " + printer_data.printer_manufacturer) printer_name_label.text = printer_data.printer_manufacturer printer_model_label.text = printer_data.printer_type + time_left_label.visible = false + set_status() + progress_bar.visible = false progress_bar.value = 0 _on_select_job_pressed() -func start_job() -> void: - pass +func _process(delta) -> void: + if is_printing: + select_job.disabled = true + progress_bar.visible = true + time_left_label.visible = true + set_status() + var total_time = selected_job.job_time + var progress = (total_time - time_left) / total_time + #print('Job time: %.2f' % total_time) + #print('Time left: %.2f' % time_left) + #print('Progress: %.2f' % progress) + 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) + if PlayerData.jobs.size() == 1: + PlayerData.jobs.clear() + else: + PlayerData.jobs.remove_at(selected_job_index) + 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_sell_button_pressed() -> void: PlayerData.give_money.emit(printer_data.printer_price * PlayerData.sell_multiplier) @@ -41,7 +94,8 @@ func _on_start_button_pressed() -> void: if select_job.get_item_text(0) == "No jobs accepted": print("No job selected") else: - start_job() + time_left = selected_job.job_time + is_printing = true #PlayerData.give_money.emit(selected_job.job_reward) #if PlayerData.jobs.size() == 1: @@ -53,4 +107,3 @@ func _on_start_button_pressed() -> void: func _on_select_job_item_selected(index: int) -> void: selected_job = select_job.get_item_metadata(index) selected_job_index = index - print(selected_job) diff --git a/printer.tscn b/printer.tscn index 2624718..100a4b3 100644 --- a/printer.tscn +++ b/printer.tscn @@ -1,6 +1,7 @@ [gd_scene format=3 uid="uid://33ctlyrpibs3"] [ext_resource type="Script" uid="uid://dj7pngpg53qdb" path="res://printer.gd" id="1_jhpce"] +[ext_resource type="StyleBox" uid="uid://csahw36txnewl" path="res://Styles/btn_style_box_green_hover.tres" id="2_tnxmo"] [node name="Printer" type="PanelContainer" unique_id=1372437203] custom_minimum_size = Vector2(0, 150) @@ -45,13 +46,13 @@ layout_mode = 2 layout_mode = 2 text = "Material: PLA" -[node name="JobLabel" type="Label" parent="MarginContainer/MainArea/PrintInfo" unique_id=1516591173] +[node name="TimeLeftLabel" type="Label" parent="MarginContainer/MainArea/PrintInfo" unique_id=1516591173] layout_mode = 2 text = "Time left: 15.0" [node name="ProgressBar" type="ProgressBar" parent="MarginContainer/MainArea/PrintInfo" unique_id=768246659] layout_mode = 2 -value = 67.0 +max_value = 1.0 [node name="Buttons" type="HBoxContainer" parent="MarginContainer/MainArea" unique_id=248340191] layout_mode = 2 @@ -59,6 +60,7 @@ layout_mode = 2 [node name="StartButton" type="Button" parent="MarginContainer/MainArea/Buttons" unique_id=1943803675] layout_mode = 2 size_flags_horizontal = 3 +theme_override_styles/hover = ExtResource("2_tnxmo") text = "Start print" [node name="UpgradeButton" type="Button" parent="MarginContainer/MainArea/Buttons" unique_id=765929805] diff --git a/printer_card.gd b/printer_card.gd index ece2880..58d6c09 100644 --- a/printer_card.gd +++ b/printer_card.gd @@ -17,6 +17,11 @@ func initialize_printer(data: PrinterData) -> void: printer_speed.text = "Speed: " + str(printer_data.printer_speed) + "/5" printer_quality.text = "Quality: " + str(printer_data.printer_quality) + "/5" printer_price.text = "Price: " + str(printer_data.printer_price) + "€" + + if PlayerData.money > printer_data.printer_price: + buy_button.disabled = false + else: + buy_button.disabled = true func _on_buy_button_pressed() -> void: buy_printer.emit(self) diff --git a/printers.gd b/printers.gd index 20e0d49..4ac3e6e 100644 --- a/printers.gd +++ b/printers.gd @@ -13,5 +13,4 @@ func _ready() -> void: new_printer.buy_printer.connect(_buy_printer_pressed) func _buy_printer_pressed(bought_printer): - #print("Printer model: " + bought_printer.printer_data.printer_type) printer_purchase_requested.emit(bought_printer.printer_data) diff --git a/printers_card.tscn b/printers_card.tscn index 8a93099..ea62e99 100644 --- a/printers_card.tscn +++ b/printers_card.tscn @@ -1,6 +1,7 @@ [gd_scene format=3 uid="uid://bdpqvwvwmaian"] [ext_resource type="Script" uid="uid://ttfk4n2fkifj" path="res://printer_card.gd" id="1_5nuqd"] +[ext_resource type="StyleBox" uid="uid://csahw36txnewl" path="res://Styles/btn_style_box_green_hover.tres" id="2_22or4"] [node name="PrinterCard" type="PanelContainer" unique_id=1714388686] offset_right = 40.0 @@ -54,6 +55,7 @@ text = "Price: 500 €" [node name="BuyButton" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=1475207118] layout_mode = 2 size_flags_horizontal = 3 +theme_override_styles/hover = ExtResource("2_22or4") text = "Buy" [connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/BuyButton" to="." method="_on_buy_button_pressed"] diff --git a/ui.gd b/ui.gd index 5be2d69..a1176fd 100644 --- a/ui.gd +++ b/ui.gd @@ -18,7 +18,6 @@ func _ready() -> void: func generate_job(): var job_count = %JobContainer.get_children() - #print("Current jobs: " + str(job_count.size())) if not job_count.size() >= job_limit: var random_job: JobData = jobs_array.pick_random() @@ -39,8 +38,6 @@ func _on_money_changed(money): func _on_job_accepted_pressed(accepted_job): print("Job accepted") - #PlayerData.give_experience.emit(accepted_job.job_data.job_experience) - #PlayerData.give_money.emit(accepted_job.job_data.job_reward) PlayerData.jobs.append(accepted_job.job_data) print(PlayerData.jobs[0].job_name) @@ -52,7 +49,6 @@ func _on_job_spawner_timeout() -> void: generate_job() func _on_printers_printer_purchase_requested(printer_data: PrinterData) -> void: - #print("Signal reached UI: " + printer_data.printer_manufacturer) if PlayerData.try_purchase(printer_data.printer_price): %Money.text = "Money: " + str(PlayerData.money) + "€" var new_printer = PRINTER.instantiate() diff --git a/ui.tscn b/ui.tscn index 41de930..d6c3fed 100644 --- a/ui.tscn +++ b/ui.tscn @@ -20,6 +20,14 @@ [ext_resource type="Resource" uid="uid://b6x4k150ugskw" path="res://Resources/Printers/printer_creality_ender_3.tres" id="17_vkygq"] [ext_resource type="Resource" uid="uid://b4v47rpo27kec" path="res://Resources/Printers/printer_prusa_mk4s.tres" id="18_sosvr"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8fchy"] +bg_color = Color(0.3529412, 0.47843137, 0.7372549, 0.47058824) +corner_radius_top_left = 6 +corner_radius_top_right = 6 +corner_radius_bottom_right = 6 +corner_radius_bottom_left = 6 +corner_detail = 6 + [node name="UI" type="Control" unique_id=256887379] layout_mode = 3 anchors_preset = 15 @@ -80,7 +88,8 @@ horizontal_alignment = 2 unique_name_in_owner = true custom_minimum_size = Vector2(0, 5) layout_mode = 2 -value = 67.0 +theme_override_styles/fill = SubResource("StyleBoxFlat_8fchy") +value = 65.27 show_percentage = false [node name="MainArea" type="HBoxContainer" parent="VBoxContainer" unique_id=352001241] @@ -193,7 +202,6 @@ visible = false layout_mode = 2 [node name="JobSpawner" type="Timer" parent="." unique_id=1696213535] -wait_time = 3.0 autostart = true [connection signal="pressed" from="VBoxContainer/MainArea/RightColumn/TabSwitcher/TabButtons/JobsTabButton" to="VBoxContainer/MainArea/RightColumn/TabSwitcher" method="_on_jobs_tab_button_pressed"]