From d6fd60d3e88381dd7c214091c0b816c5e331d3e9 Mon Sep 17 00:00:00 2001 From: jepsu Date: Mon, 29 Jun 2026 23:51:46 +0300 Subject: [PATCH] Added failure possibility and print quality lowering possibility --- Scenes/Global/game_data.gd | 4 +- Scenes/Global/player_data.gd | 8 +++- Scenes/Map/Map.tscn | 52 ++++++++++++++++++++++++- Scenes/Map/map_tile.gd | 1 + Scenes/Map/map_tile.gd.uid | 1 + Scenes/Map/map_tile.tscn | 3 ++ Scenes/Printer/printer.gd | 65 +++++++++++++++++++++++++++++--- Scenes/Printer/printer.tscn | 26 +++++++++++-- Scenes/Shop/Printers/printers.gd | 1 - Scenes/UI/ui.tscn | 19 ++++++++++ export_presets.cfg | 3 +- 11 files changed, 165 insertions(+), 18 deletions(-) create mode 100644 Scenes/Map/map_tile.gd create mode 100644 Scenes/Map/map_tile.gd.uid diff --git a/Scenes/Global/game_data.gd b/Scenes/Global/game_data.gd index 9325515..690ab6a 100644 --- a/Scenes/Global/game_data.gd +++ b/Scenes/Global/game_data.gd @@ -43,10 +43,8 @@ func _on_shop_printer_purchase_req(printer_data: PrinterData) -> void: #region Job generation func _on_job_spawn_timer_timeout() -> void: - pass - #print("Spawn timer over") #generate_job() - #draw_job() + draw_job() func generate_job() -> void: if not current_job_count >= max_jobs: diff --git a/Scenes/Global/player_data.gd b/Scenes/Global/player_data.gd index 0f4e2c9..f4480a4 100644 --- a/Scenes/Global/player_data.gd +++ b/Scenes/Global/player_data.gd @@ -25,7 +25,13 @@ var owned_printers: int = 0: owned_printers = value owned_printers_changed.emit(value) -var sell_multiplier: float = 0.5 +var sell_multiplier: float = 0.5: + set(value): + sell_multiplier = value + +var failure_chance: float = 0.4: + set(value): + failure_chance = value var jobs: Array[JobData] diff --git a/Scenes/Map/Map.tscn b/Scenes/Map/Map.tscn index aa069c3..58429cb 100644 --- a/Scenes/Map/Map.tscn +++ b/Scenes/Map/Map.tscn @@ -10,6 +10,48 @@ fog_enabled = true fog_light_color = Color(0.7149284, 0.74206614, 0.7842839, 1) fog_sky_affect = 0.0 +[sub_resource type="Curve" id="Curve_v0tmn"] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.5, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_m2fa0"] +curve = SubResource("Curve_v0tmn") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_6kfdn"] +emission_shape = 3 +emission_box_extents = Vector3(10, 0.2, 10) +angle_min = 1.0728835e-05 +angle_max = 360.00003 +direction = Vector3(1, 0, 1) +initial_velocity_min = 0.049999997 +initial_velocity_max = 0.19999999 +gravity = Vector3(0, 0, 0) +scale_min = 2.0 +scale_max = 4.0 +alpha_curve = SubResource("CurveTexture_m2fa0") + +[sub_resource type="Gradient" id="Gradient_yju8x"] +offsets = PackedFloat32Array(0.2, 0.8) +metadata/_snap_enabled = true + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_11lgl"] + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_lcs11"] +noise = SubResource("FastNoiseLite_11lgl") +color_ramp = SubResource("Gradient_yju8x") + +[sub_resource type="ORMMaterial3D" id="ORMMaterial3D_11lgl"] +transparency = 1 +vertex_color_use_as_albedo = true +albedo_color = Color(1, 1, 1, 0.11764706) +albedo_texture = SubResource("NoiseTexture2D_lcs11") +proximity_fade_enabled = true + +[sub_resource type="SphereMesh" id="SphereMesh_lcs11"] +material = SubResource("ORMMaterial3D_11lgl") +radius = 2.0 +height = 4.0 + [node name="Map" type="Node3D" unique_id=1765565476] script = ExtResource("1_iio4a") tile_scene = ExtResource("2_lcs11") @@ -17,8 +59,7 @@ tile_scene = ExtResource("2_lcs11") [node name="Camera3D" type="Camera3D" parent="." unique_id=40432726] transform = Transform3D(1, 0, 0, 0, 0.7071068, 0.7071068, 0, -0.7071068, 0.7071068, 0, 6, 5) -[node name="MapTile" parent="." unique_id=441860049 instance=ExtResource("2_lcs11")] -visible = false +[node name="MapTile" parent="." unique_id=441860049 instance_placeholder="res://Scenes/Map/map_tile.tscn"] [node name="Control" type="CanvasLayer" parent="." unique_id=1301244712] @@ -36,4 +77,11 @@ text = "Generate new tile" [node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1838982295] environment = SubResource("Environment_7g6h4") +[node name="EnvFog" type="GPUParticles3D" parent="." unique_id=1381169011] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +amount = 50 +lifetime = 10.0 +process_material = SubResource("ParticleProcessMaterial_6kfdn") +draw_pass_1 = SubResource("SphereMesh_lcs11") + [connection signal="pressed" from="Control/Button" to="." method="_on_button_pressed"] diff --git a/Scenes/Map/map_tile.gd b/Scenes/Map/map_tile.gd new file mode 100644 index 0000000..67e954f --- /dev/null +++ b/Scenes/Map/map_tile.gd @@ -0,0 +1 @@ +extends Node3D diff --git a/Scenes/Map/map_tile.gd.uid b/Scenes/Map/map_tile.gd.uid new file mode 100644 index 0000000..4837de7 --- /dev/null +++ b/Scenes/Map/map_tile.gd.uid @@ -0,0 +1 @@ +uid://db7luam5x7vhs diff --git a/Scenes/Map/map_tile.tscn b/Scenes/Map/map_tile.tscn index 1f2edc2..e05a329 100644 --- a/Scenes/Map/map_tile.tscn +++ b/Scenes/Map/map_tile.tscn @@ -1,5 +1,7 @@ [gd_scene format=3 uid="uid://c6icyfxslhlmc"] +[ext_resource type="Script" uid="uid://db7luam5x7vhs" path="res://Scenes/Map/map_tile.gd" id="1_0t1dj"] + [sub_resource type="CylinderMesh" id="CylinderMesh_7g6h4"] top_radius = 1.0 bottom_radius = 1.0 @@ -12,6 +14,7 @@ radius = 0.859375 [node name="MapTile" type="Node3D" unique_id=441860049] transform = Transform3D(-4.3711385e-08, 0, -0.99999994, 0, 1, 0, 0.99999994, 0, -4.3711385e-08, 0, 0, 0) +script = ExtResource("1_0t1dj") [node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=786384927] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0) diff --git a/Scenes/Printer/printer.gd b/Scenes/Printer/printer.gd index 4e7ff25..63274a0 100644 --- a/Scenes/Printer/printer.gd +++ b/Scenes/Printer/printer.gd @@ -5,14 +5,21 @@ extends PanelContainer @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 time_left_label: Label = $MarginContainer/MainArea/PrintInfo/InfoRow2/TimeLeftLabel @onready var start_button: Button = $MarginContainer/MainArea/Buttons/StartButton +@onready var reward_label: Label = $MarginContainer/MainArea/PrintInfo/InfoRow2/RewardLabel +@onready var quality_label: Label = $MarginContainer/MainArea/PrintInfo/InfoRow1/QualityLabel + var printer_data: PrinterData var selected_job: JobData var selected_job_index: int var is_printing: bool = false +var print_failed: bool = false var time_left: float +var failure_points: Array + +var print_quality: float = 1.0 func _ready() -> void: GameData.refresh_printer_dropdown.connect(_on_refresh_printer_dropdown) @@ -21,6 +28,8 @@ 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 + quality_label.visible = false + reward_label.visible = false time_left_label.visible = false time_left = 0 set_status() @@ -33,8 +42,13 @@ func _process(delta) -> void: select_job.visible = false progress_bar.visible = true time_left_label.visible = true + quality_label.visible = true + reward_label.visible = true set_status() + quality_label.text = 'Quality: %.0f %%' % (print_quality * 100) + reward_label.text = 'Reward: %.2f €' % (selected_job.job_reward * print_quality) + var total_time = selected_job.job_time / printer_data.printer_speed var progress = (total_time - time_left) / total_time @@ -43,31 +57,68 @@ func _process(delta) -> void: 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 + PlayerData.give_money.emit(selected_job.job_reward * print_quality) + PlayerData.give_experience.emit(selected_job.job_experience * print_quality) reset_status() + + if failure_points.has(roundf(progress_bar.value * 100)): + if failure_points[0] == roundf(progress_bar.value * 100): + if check_failure(roundf(progress_bar.value * 100)): + print('Print failed') + print_failed = true + reset_status() + else: + if check_failure(roundf(progress_bar.value * 100)): + print_quality -= 0.1 + print('Fail check, new print quality: %.2f' % print_quality) + print('Failure points: ', failure_points) + else: + print('Passed check') func reset_status() -> void: is_printing = false + set_status() + print_failed = false + print_quality = 1.0 + failure_points = [] time_left_label.visible = false + quality_label.visible = false + reward_label.visible = false progress_bar.visible = false progress_bar.value = 0 time_left = 0 select_job.disabled = false + select_job.visible = true start_button.disabled = false _on_select_job_pressed() - set_status() func set_status() -> void: + if print_failed: + status_label.text = 'Status: Failed' + return + if is_printing: status_label.text = 'Status: Printing' else: status_label.text = 'Status: Free' +func calculate_fail_thresholds() -> Array: + var failure_checkpoints: Array = [] + failure_checkpoints.append(roundf(randf_range(1,33))) + failure_checkpoints.append(roundf(randf_range(34,66))) + failure_checkpoints.append(roundf(randf_range(67,90))) + return failure_checkpoints + +func check_failure(value: float) -> bool: + if randf() >= PlayerData.failure_chance: + failure_points[failure_points.bsearch(value, true)] = 0 + return false + else: + failure_points[failure_points.bsearch(value, true)] = 0 + return true + func calculate_time_left(time) -> String: var minutes: int = 0 - if time >= 60: while time >= 60: minutes += 1 @@ -121,4 +172,6 @@ func _on_start_button_pressed() -> void: else: PlayerData.jobs.remove_at(selected_job_index) + failure_points = calculate_fail_thresholds() + print('Failure points: ', failure_points) GameData.refresh_printer_dropdown.emit() diff --git a/Scenes/Printer/printer.tscn b/Scenes/Printer/printer.tscn index bca15ea..52e3310 100644 --- a/Scenes/Printer/printer.tscn +++ b/Scenes/Printer/printer.tscn @@ -43,13 +43,31 @@ text = "Printer model" [node name="PrintInfo" type="VBoxContainer" parent="MarginContainer/MainArea" unique_id=1502076264] layout_mode = 2 -[node name="FilamentLabel" type="Label" parent="MarginContainer/MainArea/PrintInfo" unique_id=181392172] +[node name="InfoRow1" type="HBoxContainer" parent="MarginContainer/MainArea/PrintInfo" unique_id=1561257387] layout_mode = 2 -text = "Material: PLA" -[node name="TimeLeftLabel" type="Label" parent="MarginContainer/MainArea/PrintInfo" unique_id=1516591173] +[node name="FilamentLabel" type="Label" parent="MarginContainer/MainArea/PrintInfo/InfoRow1" unique_id=181392172] layout_mode = 2 -text = "Time left: 15.0" +text = "Material: ###" + +[node name="QualityLabel" type="Label" parent="MarginContainer/MainArea/PrintInfo/InfoRow1" unique_id=1362675397] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Print quality: ###%" +horizontal_alignment = 2 + +[node name="InfoRow2" type="HBoxContainer" parent="MarginContainer/MainArea/PrintInfo" unique_id=719967546] +layout_mode = 2 + +[node name="TimeLeftLabel" type="Label" parent="MarginContainer/MainArea/PrintInfo/InfoRow2" unique_id=1516591173] +layout_mode = 2 +text = "Time left: ###s" + +[node name="RewardLabel" type="Label" parent="MarginContainer/MainArea/PrintInfo/InfoRow2" unique_id=1767576134] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Reward: ###€" +horizontal_alignment = 2 [node name="ProgressBar" type="ProgressBar" parent="MarginContainer/MainArea/PrintInfo" unique_id=768246659] layout_mode = 2 diff --git a/Scenes/Shop/Printers/printers.gd b/Scenes/Shop/Printers/printers.gd index 16d1f90..bf82b51 100644 --- a/Scenes/Shop/Printers/printers.gd +++ b/Scenes/Shop/Printers/printers.gd @@ -7,7 +7,6 @@ const PRINTER_SCENE = preload("uid://bdpqvwvwmaian") func _ready() -> void: generate_printers() - printer_purchase_requested.connect(GameData._on_shop_printer_purchase_req) func generate_printers() -> void: diff --git a/Scenes/UI/ui.tscn b/Scenes/UI/ui.tscn index bf187b4..9e9f579 100644 --- a/Scenes/UI/ui.tscn +++ b/Scenes/UI/ui.tscn @@ -9,6 +9,8 @@ [ext_resource type="Resource" uid="uid://b6x4k150ugskw" path="res://Resources/Printers/printer_creality_ender_3.tres" id="18_8rt22"] [ext_resource type="Resource" uid="uid://b4v47rpo27kec" path="res://Resources/Printers/printer_prusa_mk4s.tres" id="19_1ohgd"] +[sub_resource type="Gradient" id="Gradient_7g6h4"] + [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8fchy"] bg_color = Color(0.3529412, 0.47843137, 0.7372549, 0.47058824) corner_radius_top_left = 6 @@ -38,6 +40,23 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_vqjbf") +[node name="CPUParticles2D" type="CPUParticles2D" parent="." unique_id=61421642] +position = Vector2(568, 312) +amount = 60 +lifetime = 8.0 +preprocess = 8.0 +speed_scale = 0.3 +emission_shape = 3 +emission_rect_extents = Vector2(1000, 600) +direction = Vector2(0, -1) +gravity = Vector2(0, 0) +initial_velocity_min = 20.0 +initial_velocity_max = 50.0 +scale_amount_min = 2.0 +scale_amount_max = 5.0 +color = Color(0.45585775, 0.45585775, 0.4558577, 1) +color_ramp = SubResource("Gradient_7g6h4") + [node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=1634044894] layout_mode = 1 anchors_preset = 15 diff --git a/export_presets.cfg b/export_presets.cfg index eff927c..1d9125e 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -8,7 +8,8 @@ name="Linux" platform="Linux" dedicated_server=false custom_features="" -export_filter="all_resources" +export_filter="scenes" +export_files=PackedStringArray("res://Scenes/Map/Map.tscn", "res://Scenes/Map/map_tile.tscn") include_filter="" exclude_filter="" export_path="Releases/PrintingSim-stable"