From 9f11ea283f8f7af31d08fc4c2e66676dac288571 Mon Sep 17 00:00:00 2001 From: Persephone Bubblegum-Holiday Date: Mon, 4 Aug 2025 23:26:14 -0700 Subject: [PATCH] show playback in free roam mode --- Scenes/GUI/EditorScreen.tscn | 9 ++ Scenes/GUI/InGameMenu.tscn | 247 +++++++++++++++++++++++++++++++++-- Scripts/EditorScreen.gd | 4 + Scripts/FlowControl.gd | 9 +- Scripts/InGameMenu.gd | 156 +++++++++++++++++++++- Scripts/MovementRow.gd | 4 +- project.godot | 12 ++ 7 files changed, 419 insertions(+), 22 deletions(-) diff --git a/Scenes/GUI/EditorScreen.tscn b/Scenes/GUI/EditorScreen.tscn index 50c37c4..f0bc048 100644 --- a/Scenes/GUI/EditorScreen.tscn +++ b/Scenes/GUI/EditorScreen.tscn @@ -876,6 +876,15 @@ offset_right = 504.0 offset_bottom = 248.0 text = "Open" +[node name="PleaseWaitText" type="Label" parent="ShowtapeLoadScreen/DialogPanel"] +visible = false +offset_left = 4.0 +offset_top = 156.0 +offset_right = 430.0 +offset_bottom = 205.0 +text = "Please wait! Showtape is loading +The program may stop responding, but it is still loading" + [node name="ShowtapeSaveScreen" type="Control" parent="."] visible = false layout_mode = 1 diff --git a/Scenes/GUI/InGameMenu.tscn b/Scenes/GUI/InGameMenu.tscn index 62d1167..6f67970 100644 --- a/Scenes/GUI/InGameMenu.tscn +++ b/Scenes/GUI/InGameMenu.tscn @@ -1,7 +1,10 @@ -[gd_scene load_steps=14 format=3 uid="uid://cd67bfok34xhy"] +[gd_scene load_steps=17 format=3 uid="uid://cd67bfok34xhy"] [ext_resource type="Script" uid="uid://pwg37gka2qr4" path="res://Scripts/InGameMenu.gd" id="1_cp535"] [ext_resource type="Theme" uid="uid://dbgs4id7y5d1c" path="res://UI/Themes/Dark.tres" id="1_fxnf3"] +[ext_resource type="Texture2D" uid="uid://cttgtbu1xllwq" path="res://UI/TransportControls/Stop.png" id="3_5t5ap"] +[ext_resource type="Texture2D" uid="uid://bwhgy4u37jmo1" path="res://UI/TransportControls/Pause.png" id="4_j5gkc"] +[ext_resource type="Texture2D" uid="uid://xllpr3qc064c" path="res://UI/TransportControls/Play.png" id="5_4hvdi"] [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_cp535"] @@ -103,24 +106,68 @@ offset_right = 260.0 offset_bottom = 312.0 text = "Exit to Desktop" -[node name="ShowLabel" type="Label" parent="."] +[node name="TransportControls" type="Panel" parent="."] layout_mode = 1 -anchors_preset = -1 -anchor_left = 1.0 +anchors_preset = 2 anchor_top = 1.0 -anchor_right = 1.0 anchor_bottom = 1.0 -offset_left = -264.0 -offset_top = -40.0 -offset_right = -8.0 -offset_bottom = -8.0 -grow_horizontal = 0 +offset_left = 60.0 +offset_top = -476.0 +offset_right = 324.0 +offset_bottom = -388.0 grow_vertical = 0 + +[node name="ShowLabel" type="Label" parent="TransportControls"] +layout_mode = 1 +offset_left = 8.0 +offset_top = 8.0 +offset_right = 256.0 +offset_bottom = 40.0 text = "No Show Loaded" -horizontal_alignment = 2 +vertical_alignment = 1 +text_overrun_behavior = 3 + +[node name="TimeLabel" type="Label" parent="TransportControls"] +layout_mode = 0 +offset_left = 8.0 +offset_top = 48.0 +offset_right = 104.0 +offset_bottom = 80.0 +text = "0:00:00:00" vertical_alignment = 1 +[node name="StopButton" type="Button" parent="TransportControls"] +layout_mode = 0 +offset_left = 132.0 +offset_top = 44.0 +offset_right = 172.0 +offset_bottom = 84.0 +tooltip_text = "Stop playback and return to frame 0" +disabled = true +icon = ExtResource("3_5t5ap") + +[node name="PauseButton" type="Button" parent="TransportControls"] +layout_mode = 0 +offset_left = 176.0 +offset_top = 44.0 +offset_right = 216.0 +offset_bottom = 84.0 +tooltip_text = "Pause" +disabled = true +icon = ExtResource("4_j5gkc") + +[node name="PlayButton" type="Button" parent="TransportControls"] +layout_mode = 0 +offset_left = 220.0 +offset_top = 44.0 +offset_right = 260.0 +offset_bottom = 84.0 +tooltip_text = "Play" +disabled = true +icon = ExtResource("5_4hvdi") + [node name="FlowControlsScreen" type="Control" parent="."] +visible = false layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -279,13 +326,191 @@ offset_bottom = -4.0 max_value = 0.0 step = 1.0 +[node name="LoadShowScreen" type="Control" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ColorRect" type="ColorRect" parent="LoadShowScreen"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.121569, 0.121569, 0.121569, 0.501961) + +[node name="InputEater" type="Button" parent="LoadShowScreen"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/focus = SubResource("StyleBoxEmpty_cp535") +theme_override_styles/disabled_mirrored = SubResource("StyleBoxEmpty_fxnf3") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_esrnp") +theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_okjcw") +theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_5t5ap") +theme_override_styles/hover_mirrored = SubResource("StyleBoxEmpty_j5gkc") +theme_override_styles/hover = SubResource("StyleBoxEmpty_4hvdi") +theme_override_styles/pressed_mirrored = SubResource("StyleBoxEmpty_76ga2") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_ausu3") +theme_override_styles/normal_mirrored = SubResource("StyleBoxEmpty_b5eqy") +theme_override_styles/normal = SubResource("StyleBoxEmpty_x8byx") + +[node name="DialogPanel" type="Panel" parent="LoadShowScreen"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -256.0 +offset_top = -128.0 +offset_right = 256.0 +offset_bottom = 128.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="DialogLabel" type="Label" parent="LoadShowScreen/DialogPanel"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -96.0 +offset_top = 4.0 +offset_right = 96.0 +offset_bottom = 36.0 +grow_horizontal = 2 +text = "Load Showtape" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="InFileLabel" type="Label" parent="LoadShowScreen/DialogPanel"] +layout_mode = 0 +offset_left = 8.0 +offset_top = 73.0 +offset_right = 264.0 +offset_bottom = 105.0 +text = "File to load" +vertical_alignment = 1 + +[node name="InFilePath" type="TextEdit" parent="LoadShowScreen/DialogPanel"] +layout_mode = 1 +anchors_preset = -1 +anchor_right = 1.0 +offset_left = 4.0 +offset_top = 109.0 +offset_right = -104.0 +offset_bottom = 145.0 +grow_horizontal = 2 +grow_vertical = 2 +placeholder_text = "File Path" + +[node name="InBrowseButton" type="Button" parent="LoadShowScreen/DialogPanel"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -100.0 +offset_top = 109.0 +offset_right = -4.0 +offset_bottom = 145.0 +tooltip_text = "Browse for a file." +text = "Browse" + +[node name="CancelButton" type="Button" parent="LoadShowScreen/DialogPanel"] +layout_mode = 0 +offset_left = 309.0 +offset_top = 216.0 +offset_right = 405.0 +offset_bottom = 248.0 +text = "Cancel +" + +[node name="OpenButton" type="Button" parent="LoadShowScreen/DialogPanel"] +layout_mode = 0 +offset_left = 408.0 +offset_top = 216.0 +offset_right = 504.0 +offset_bottom = 248.0 +text = "Open" + +[node name="PleaseWaitText" type="Label" parent="LoadShowScreen/DialogPanel"] +visible = false +layout_mode = 0 +offset_left = 4.0 +offset_top = 156.0 +offset_right = 430.0 +offset_bottom = 205.0 +text = "Please wait! Showtape is loading +The program may stop responding, but it is still loading" + +[node name="ExitMenuOverwriteConfirmationDialog" type="ConfirmationDialog" parent="."] +auto_translate_mode = 1 +initial_position = 2 +size = Vector2i(472, 100) +ok_button_text = "Proceed" +dialog_text = "Are you sure you want to exit?" +cancel_button_text = "Do Not" + +[node name="ExitDesktopOverwriteConfirmationDialog" type="ConfirmationDialog" parent="."] +auto_translate_mode = 1 +initial_position = 2 +size = Vector2i(472, 100) +ok_button_text = "Proceed" +dialog_text = "Are you sure you want to exit?" +cancel_button_text = "Do Not" + +[node name="FileDoesntExistDialog" type="AcceptDialog" parent="."] +auto_translate_mode = 1 +initial_position = 2 +dialog_text = "The specified file does not exist." + +[node name="NoFileSpecified" type="AcceptDialog" parent="."] +auto_translate_mode = 1 +initial_position = 2 +dialog_text = "No File was specified." + +[node name="IncorrectShowtapeDialog" type="AcceptDialog" parent="."] +auto_translate_mode = 1 +initial_position = 2 +dialog_text = "This showtape is not compatible with the current stage." + +[node name="OpenShowtapeFileDialog" type="FileDialog" parent="."] +auto_translate_mode = 1 +title = "Open a File" +initial_position = 2 +ok_button_text = "Open" +dialog_hide_on_ok = true +file_mode = 0 +access = 2 +filters = PackedStringArray("*.ust") + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] + [connection signal="pressed" from="Buttons/ReturnButton" to="." method="_on_return_button_pressed"] [connection signal="pressed" from="Buttons/LoadShowButton" to="." method="_on_load_show_button_pressed"] [connection signal="pressed" from="Buttons/CosmeticsButton" to="." method="_on_cosmetics_button_pressed"] [connection signal="pressed" from="Buttons/FlowControlsButton" to="." method="_on_flow_controls_button_pressed"] [connection signal="pressed" from="Buttons/ExitMenuButton" to="." method="_on_exit_menu_button_pressed"] [connection signal="pressed" from="Buttons/ExitButton" to="." method="_on_exit_button_pressed"] +[connection signal="pressed" from="TransportControls/StopButton" to="." method="_on_stop_button_pressed"] +[connection signal="pressed" from="TransportControls/PauseButton" to="." method="_on_pause_button_pressed"] +[connection signal="pressed" from="TransportControls/PlayButton" to="." method="_on_play_button_pressed"] [connection signal="pressed" from="FlowControlsScreen/InputEater" to="." method="_on_input_eater_pressed"] [connection signal="value_changed" from="FlowControlsScreen/DialogPanel/VScrollBar" to="." method="_on_flow_v_scroll_bar_value_changed"] [connection signal="pressed" from="CosmeticsScreen/InputEater" to="." method="_on_input_eater_pressed"] [connection signal="value_changed" from="CosmeticsScreen/DialogPanel/VScrollBar" to="." method="_on_cosmetics_v_scroll_bar_value_changed"] +[connection signal="pressed" from="LoadShowScreen/InputEater" to="." method="_on_input_eater_pressed"] +[connection signal="pressed" from="LoadShowScreen/DialogPanel/InBrowseButton" to="." method="_on_in_browse_button_pressed"] +[connection signal="pressed" from="LoadShowScreen/DialogPanel/CancelButton" to="." method="_on_cancel_button_pressed"] +[connection signal="pressed" from="LoadShowScreen/DialogPanel/OpenButton" to="." method="_on_open_button_pressed"] +[connection signal="confirmed" from="ExitMenuOverwriteConfirmationDialog" to="." method="_on_exit_menu_overwrite_confirmation_dialog_confirmed"] +[connection signal="confirmed" from="ExitDesktopOverwriteConfirmationDialog" to="." method="_on_exit_desktop_overwrite_confirmation_dialog_confirmed"] +[connection signal="file_selected" from="OpenShowtapeFileDialog" to="." method="_on_open_showtape_file_dialog_file_selected"] diff --git a/Scripts/EditorScreen.gd b/Scripts/EditorScreen.gd index 5de1b96..dabefa5 100644 --- a/Scripts/EditorScreen.gd +++ b/Scripts/EditorScreen.gd @@ -218,16 +218,19 @@ func _on_showtape_load_open_button_pressed() -> void: if (!FileAccess.file_exists($ShowtapeLoadScreen/DialogPanel/InFilePath.text.strip_edges())): $FileDoesntExistDialog.show() return + $ShowtapeLoadScreen/DialogPanel/PleaseWaitText.visible = true var file = FileAccess.open($ShowtapeLoadScreen/DialogPanel/InFilePath.text.strip_edges(), FileAccess.READ) var content = file.get_as_text() var header = content.split(";")[0].split(",") if (header[1] != "2"): $IncorrectShowtapeDialog.dialog_text = "This showtape is not the correct version!" $IncorrectShowtapeDialog.show() + $ShowtapeLoadScreen/DialogPanel/PleaseWaitText.visible = false return if (header[3] != Stages.stages_info[current_stage]["ust_type"]): $IncorrectShowtapeDialog.dialog_text = "This showtape is not compatible with the currently selected stage.\nShowtape stage type: %s\n Current stage type: %s" % [ header[3], Stages.stages_info[current_stage]["ust_type"] ] $IncorrectShowtapeDialog.show() + $ShowtapeLoadScreen/DialogPanel/PleaseWaitText.visible = false return show_name = header[2] plot_data(content.split(";")[1]) @@ -237,6 +240,7 @@ func _on_showtape_load_open_button_pressed() -> void: $MenuBar/EditingLabel.text = "Editing: " + show_name $ShowtapeLoadScreen/DialogPanel/InFilePath.text = "" $ShowtapeLoadScreen.visible = false + $ShowtapeLoadScreen/DialogPanel/PleaseWaitText.visible = false func _on_load_overwrite_confirmation_dialog_confirmed() -> void: erase_all.emit() diff --git a/Scripts/FlowControl.gd b/Scripts/FlowControl.gd index 66de06e..60966d9 100644 --- a/Scripts/FlowControl.gd +++ b/Scripts/FlowControl.gd @@ -3,9 +3,10 @@ extends Control @export var in_value : float = 1.0 @export var out_value : float = 1.0 @export var vis_name : String = "" +@export var internal_id: int -signal in_value_updated(new_value: float) -signal out_value_updated(new_value: float) +signal in_value_updated(new_value: float, internalid: int) +signal out_value_updated(new_value: float, internalid: int) func _ready() -> void: $Panel/Label.text = self.vis_name @@ -14,8 +15,8 @@ func _ready() -> void: func _on_in_stepper_value_changed(value: float) -> void: self.in_value = value - in_value_updated.emit(value) + in_value_updated.emit(value, internal_id) func _on_out_stepper_value_changed(value: float) -> void: self.out_value = value - out_value_updated.emit(value) + out_value_updated.emit(value, internal_id) diff --git a/Scripts/InGameMenu.gd b/Scripts/InGameMenu.gd index 0fceb00..d94b264 100644 --- a/Scripts/InGameMenu.gd +++ b/Scripts/InGameMenu.gd @@ -2,11 +2,21 @@ extends Control var in_flows = [] var out_flows = [] +var prev_frame_held = [] +var animatables_handles = [] -var loaded_show = [] +var transport_enabled = false +var playing = false +var index = 0 + +var loaded_frames = [] +var show_is_loaded = false +var show_name + +var stage func _ready() -> void: - var stage = FreeRoamMaps.MapIndex[get_node("../").current_map]["stage"] + stage = FreeRoamMaps.MapIndex[get_node("../").current_map]["stage"] var cosmetics_offset = 0 var cosmetics_count = 0 @@ -24,7 +34,7 @@ func _ready() -> void: $CosmeticsScreen/DialogPanel/InvisibleMask/CosmeticsHandle.add_child(cosmetic_adjustment) $CosmeticsScreen/DialogPanel/VScrollBar.max_value = cosmetics_count - 1 - var rows_offset = 0 + var movement_count = 0 var flows_offset = 0 var flow_count = 0 for bit_number in stage["bit_mapping"]: @@ -34,8 +44,10 @@ func _ready() -> void: var in_flow = stage["bit_mapping"][bit_number]["flow_in"] var out_flow = stage["bit_mapping"][bit_number]["flow_out"] + animatables_handles.push_back(get_node("../../" + bot)) in_flows.push_back(in_flow) out_flows.push_back(out_flow) + prev_frame_held.push_back(false) if (in_flow is not String): var flow_control = load("res://Scenes/GUI/Controls/FlowControl.tscn").instantiate() @@ -45,17 +57,27 @@ func _ready() -> void: flow_control.in_value = in_flow flow_control.out_value = out_flow flow_control.anchor_right = 1.0 + flow_control.internal_id = movement_count $FlowControlsScreen/DialogPanel/InvisibleMask/FlowHandle.add_child(flow_control) + flow_control.in_value_updated.connect(self._update_in_flow) + flow_control.out_value_updated.connect(self._update_out_flow) flows_offset += 44 flow_count += 1 + movement_count += 1 $FlowControlsScreen/DialogPanel/VScrollBar.max_value = flow_count - 1 +func _update_in_flow(new_value: float, internalid: int) -> void: + in_flows[internalid] = new_value + +func _update_out_flow(new_value: float, internalid: int) -> void: + out_flows[internalid] = new_value + func _on_exit_button_pressed() -> void: - get_tree().quit() + $ExitDesktopOverwriteConfirmationDialog.show() func _on_exit_menu_button_pressed() -> void: - get_tree().change_scene_to_file("res://Scenes/GUI/MainMenu.tscn") + $ExitMenuOverwriteConfirmationDialog.show() func _on_flow_controls_button_pressed() -> void: $BG.visible = false @@ -67,6 +89,7 @@ func _on_cosmetics_button_pressed() -> void: func _on_load_show_button_pressed() -> void: $BG.visible = false + $LoadShowScreen.visible = true func _on_return_button_pressed() -> void: get_node("../").interact = true @@ -77,9 +100,132 @@ func _on_input_eater_pressed() -> void: $BG.visible = true $CosmeticsScreen.visible = false $FlowControlsScreen.visible = false + $LoadShowScreen.visible = false func _on_cosmetics_v_scroll_bar_value_changed(value: float) -> void: $CosmeticsScreen/DialogPanel/InvisibleMask/CosmeticsHandle.position.y = value * -44 func _on_flow_v_scroll_bar_value_changed(value: float) -> void: $FlowControlsScreen/DialogPanel/InvisibleMask/FlowHandle.position.y = value * -44 + +func _on_cancel_button_pressed() -> void: + $BG.visible = true + $LoadShowScreen.visible = false + $LoadShowScreen/DialogPanel/InFilePath.text = "" + +func _on_open_button_pressed() -> void: + if (!FileAccess.file_exists($LoadShowScreen/DialogPanel/InFilePath.text.strip_edges())): + $FileDoesntExistDialog.show() + return + $LoadShowScreen/DialogPanel/PleaseWaitText.visible = true + var file = FileAccess.open($LoadShowScreen/DialogPanel/InFilePath.text.strip_edges(), FileAccess.READ) + var content = file.get_as_text() + var header = content.split(";")[0].split(",") + if (header[1] != "2"): + $IncorrectShowtapeDialog.dialog_text = "This showtape is not the correct version!" + $IncorrectShowtapeDialog.show() + $LoadShowScreen/DialogPanel/PleaseWaitText.visible = false + return + if (header[3] != stage["ust_type"]): + $IncorrectShowtapeDialog.dialog_text = "This showtape is not compatible with the currently selected stage.\nShowtape stage type: %s\n Current stage type: %s" % [ header[3], stage["ust_type"] ] + $IncorrectShowtapeDialog.show() + $LoadShowScreen/DialogPanel/PleaseWaitText.visible = false + return + show_name = header[2] + load_data(content.split(";")[1]) + $AudioStreamPlayer.stream = load_audio_from_buffer(Marshalls.base64_to_raw(content.split(";")[2])) + set_transport_enabled(true) + show_is_loaded = true + $TransportControls/ShowLabel.text = "Editing: " + show_name + $LoadShowScreen/DialogPanel/InFilePath.text = "" + $LoadShowScreen/DialogPanel/PleaseWaitText.visible = false + $LoadShowScreen.visible = false + $BG.visible = true + +func _on_in_browse_button_pressed() -> void: + $OpenShowtapeFileDialog.show() + +func _on_exit_desktop_overwrite_confirmation_dialog_confirmed() -> void: + get_tree().quit() + +func _on_exit_menu_overwrite_confirmation_dialog_confirmed() -> void: + get_tree().change_scene_to_file("res://Scenes/GUI/MainMenu.tscn") + +func _on_open_showtape_file_dialog_file_selected(path: String) -> void: + $LoadShowScreen/DialogPanel/InFilePath.text = path + +func load_audio_from_buffer(data: PackedByteArray) -> AudioStream: + var sound + match (data[0]): + 73: + sound = AudioStreamMP3.load_from_buffer(data) + 82: + sound = AudioStreamWAV.load_from_buffer(data) + 79: + sound = AudioStreamOggVorbis.load_from_buffer(data) + return sound + +func load_data(data) -> void: + for frame_string in data.split(","): + if (frame_string == ""): continue + var check_frame_split = frame_string.split() + check_frame_split.reverse() + var unpacked_frame = [] + for i in stage["bit_mapping"]: + if ((check_frame_split[(i - 1) / 4].hex_to_int() & int(pow(2, ((i - 1) % 4)))) == int(pow(2, ((i - 1) % 4)))): + unpacked_frame.push_back(true) + else: unpacked_frame.push_back(false) + loaded_frames.push_back(unpacked_frame) + +func set_transport_enabled(enabled) -> void: + $TransportControls/PauseButton.disabled = !enabled + $TransportControls/PlayButton.disabled = !enabled + $TransportControls/StopButton.disabled = !enabled + transport_enabled = true + +func update_time_label() -> void: + var frames = index % 60 + var seconds = floori(index/60.0) % 60 + var minutes = floori(index/3600.0) % 60 + var hours = floori(index/216000.0) + $TransportControls/TimeLabel.text = "%d:%02d:%02d:%02d" % [hours, minutes, seconds, frames] + +func _on_stop_button_pressed() -> void: + playing = false + $AudioStreamPlayer.stop() + $AudioStreamPlayer.seek(0) + index = 0 + update_time_label() + +func _on_pause_button_pressed() -> void: + $AudioStreamPlayer.stop() + playing = false + +func _on_play_button_pressed() -> void: + $AudioStreamPlayer.play(float(index)/60.0) + playing = true + +func _physics_process(_delta: float) -> void: + if (playing): + var j = 0 + for i in stage["bit_mapping"]: + if (loaded_frames[index][j]): + if (!prev_frame_held[j]): + animatables_handles[j]._movement_in(stage["bit_mapping"][i]["movement"], in_flows[j]) + prev_frame_held[j] = true + else: + if (prev_frame_held[j]): + animatables_handles[j]._movement_out(stage["bit_mapping"][i]["movement"], in_flows[j]) + prev_frame_held[j] = false + j+=1 + index += 1 + if (index <= 0): _on_stop_button_pressed() + update_time_label() + +func _input(event: InputEvent) -> void: + if (transport_enabled): + if event.is_action_pressed("freeroam_transport_play_pause"): + if (playing): _on_pause_button_pressed() + else: _on_play_button_pressed() + elif event.is_action_pressed("freeroam_transport_stop"): + _on_stop_button_pressed() diff --git a/Scripts/MovementRow.gd b/Scripts/MovementRow.gd index b02c8c3..2d8e4fa 100644 --- a/Scripts/MovementRow.gd +++ b/Scripts/MovementRow.gd @@ -101,10 +101,10 @@ func update_text() -> void: if (animatronic == "None"): $Button.text = "%d - Unused (%s)" % [movement_bit, key_binding.as_text() if key_binding.keycode != 0 else "Unbound"] else: $Button.text = "%d - %s %s (%s)" % [movement_bit, animatronic, movement_name, key_binding.as_text() if key_binding.keycode != 0 else "Unbound"] -func _update_in_flow(new_value: float) -> void: +func _update_in_flow(new_value: float, _internalid: int) -> void: in_flow = new_value -func _update_out_flow(new_value: float) -> void: +func _update_out_flow(new_value: float, _internalid: int) -> void: out_flow = new_value func _ready() -> void: diff --git a/project.godot b/project.godot index 9e38bd8..ed2c4da 100644 --- a/project.godot +++ b/project.godot @@ -496,6 +496,18 @@ freeroam_toggle_flashlight={ , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":true,"script":null) ] } +freeroam_transport_play_pause={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194309,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"pressure":0.0,"pressed":true,"script":null) +] +} +freeroam_transport_stop={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194317,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":4,"pressure":0.0,"pressed":true,"script":null) +] +} [rendering]