3d-printing-simulator-textb.../Scenes/Printer/printer.gd

177 lines
5.5 KiB
GDScript

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/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)
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()
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
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
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 * 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()
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
time -= 60
return '%d m %.2f s' % [minutes, time]
else:
return '%.2f s' % time
func _on_refresh_printer_dropdown() -> void:
if is_printing:
return
_on_select_job_pressed()
func _on_sell_button_pressed() -> void:
PlayerData.give_money.emit(printer_data.printer_price * PlayerData.sell_multiplier)
PlayerData.owned_printers -= 1
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 select_job.get_item_text(0) == "No jobs accepted":
return
time_left = selected_job.job_time / printer_data.printer_speed
progress_bar.value = 0
start_button.disabled = true
is_printing = true
if PlayerData.jobs.size() == 1:
PlayerData.jobs.clear()
else:
PlayerData.jobs.remove_at(selected_job_index)
failure_points = calculate_fail_thresholds()
print('Failure points: ', failure_points)
GameData.refresh_printer_dropdown.emit()