diff --git a/loading/saveload_api/.gitattributes b/loading/saveload_api/.gitattributes new file mode 100644 index 00000000000..8ad74f78d9c --- /dev/null +++ b/loading/saveload_api/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/loading/saveload_api/.gitignore b/loading/saveload_api/.gitignore new file mode 100644 index 00000000000..4709183670a --- /dev/null +++ b/loading/saveload_api/.gitignore @@ -0,0 +1,2 @@ +# Godot 4+ specific ignores +.godot/ diff --git a/loading/saveload_api/enemy.tscn b/loading/saveload_api/enemy.tscn new file mode 100644 index 00000000000..6bb6cf3ecb2 --- /dev/null +++ b/loading/saveload_api/enemy.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=3 uid="uid://bw7ctlk1oblox"] + +[ext_resource type="Texture2D" uid="uid://dm6sh6t5nfmmc" path="res://icon.svg" id="1_rkf5a"] + +[sub_resource type="SceneSaveloadConfig" id="SceneSaveloadConfig_t0koa"] +properties/0/path = NodePath(".:position") +properties/0/sync = true +properties/1/path = NodePath(".:rotation") +properties/1/sync = true + +[node name="Enemy" type="Node2D"] + +[node name="Icon" type="Sprite2D" parent="."] +self_modulate = Color(1, 0.486275, 1, 1) +texture = ExtResource("1_rkf5a") + +[node name="SaveloadSynchronizer" type="SaveloadSynchronizer" parent="."] +saveload_config = SubResource("SceneSaveloadConfig_t0koa") diff --git a/loading/saveload_api/icon.svg b/loading/saveload_api/icon.svg new file mode 100644 index 00000000000..adc26df6c2c --- /dev/null +++ b/loading/saveload_api/icon.svg @@ -0,0 +1 @@ + diff --git a/loading/saveload_api/icon.svg.import b/loading/saveload_api/icon.svg.import new file mode 100644 index 00000000000..741afec740c --- /dev/null +++ b/loading/saveload_api/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dm6sh6t5nfmmc" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/loading/saveload_api/main.gd b/loading/saveload_api/main.gd new file mode 100644 index 00000000000..185b71f7a0a --- /dev/null +++ b/loading/saveload_api/main.gd @@ -0,0 +1,17 @@ +extends Node2D + +const save_file : String = "res://test_save" +const enemy_scene : PackedScene = preload("res://enemy.tscn") + +@onready var enemies : Node2D = $Enemies + + +func _unhandled_key_input(event : InputEvent) -> void: + if event.is_action_pressed("save"): + SaveloadAPI.save(save_file) + elif event.is_action_pressed("open"): + SaveloadAPI.load(save_file) + elif event.is_action_pressed("spawn"): + var enemy : Node2D = enemy_scene.instantiate() + enemy.position = Vector2(randf() * 600, randf() * 600) + enemies.add_child(enemy, true) diff --git a/loading/saveload_api/main.tscn b/loading/saveload_api/main.tscn new file mode 100644 index 00000000000..993198fa1e6 --- /dev/null +++ b/loading/saveload_api/main.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=3 format=3 uid="uid://cxiryehmclcsv"] + +[ext_resource type="Script" path="res://main.gd" id="1_h4sb6"] +[ext_resource type="PackedScene" uid="uid://b6tneivslk4kq" path="res://player.tscn" id="2_udeoi"] + +[node name="Main" type="Node2D"] +script = ExtResource("1_h4sb6") + +[node name="Player" parent="." instance=ExtResource("2_udeoi")] +position = Vector2(455, 286) + +[node name="Enemies" type="Node2D" parent="."] + +[node name="SaveloadSpawner" type="SaveloadSpawner" parent="."] +_spawnable_scenes = PackedStringArray("res://enemy.tscn") +spawn_path = NodePath("../Enemies") +spawn_limit = 8 + +[node name="RichTextLabel" type="RichTextLabel" parent="."] +offset_right = 294.0 +offset_bottom = 173.0 +text = "Move: arrow keys +Spawn enemy: enter +Save: ctrl+s +Open: ctrl+o" diff --git a/loading/saveload_api/plaD421.tmp b/loading/saveload_api/plaD421.tmp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/loading/saveload_api/player.gd b/loading/saveload_api/player.gd new file mode 100644 index 00000000000..13261c2fa0b --- /dev/null +++ b/loading/saveload_api/player.gd @@ -0,0 +1,15 @@ +extends Node2D +class_name Player + +@export var move_speed : float = 100.0 #pixels per second +@export var turn_rate : float = 1.0 #radians per second + +func _process(delta : float) -> void: + if Input.is_action_pressed("turn_left"): + rotate(-turn_rate * delta) + if Input.is_action_pressed("turn_right"): + rotate(turn_rate * delta) + if Input.is_action_pressed("move_up"): + translate(Vector2(0, -move_speed * delta).rotated(rotation)) + if Input.is_action_pressed("move_down"): + translate(Vector2(0, move_speed * delta).rotated(rotation)) diff --git a/loading/saveload_api/player.tscn b/loading/saveload_api/player.tscn new file mode 100644 index 00000000000..8c0cd59c999 --- /dev/null +++ b/loading/saveload_api/player.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=4 format=3 uid="uid://b6tneivslk4kq"] + +[ext_resource type="Script" path="res://player.gd" id="1_0r5m6"] +[ext_resource type="Texture2D" uid="uid://dm6sh6t5nfmmc" path="res://icon.svg" id="1_jpk80"] + +[sub_resource type="SceneSaveloadConfig" id="SceneSaveloadConfig_k2tv0"] +properties/0/path = NodePath(".:position") +properties/0/sync = true +properties/1/path = NodePath(".:rotation") +properties/1/sync = true + +[node name="Player" type="Node2D"] +script = ExtResource("1_0r5m6") + +[node name="SaveloadSynchronizer" type="SaveloadSynchronizer" parent="."] +saveload_config = SubResource("SceneSaveloadConfig_k2tv0") + +[node name="Icon" type="Sprite2D" parent="."] +texture = ExtResource("1_jpk80") diff --git a/loading/saveload_api/project.godot b/loading/saveload_api/project.godot new file mode 100644 index 00000000000..6abe4c089ad --- /dev/null +++ b/loading/saveload_api/project.godot @@ -0,0 +1,54 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Saveload Test" +run/main_scene="res://main.tscn" +config/features=PackedStringArray("4.2", "Forward Plus") +config/icon="res://icon.svg" + +[input] + +move_up={ +"deadzone": 0.5, +"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":4194320,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +move_down={ +"deadzone": 0.5, +"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":4194322,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +turn_right={ +"deadzone": 0.5, +"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":4194321,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +turn_left={ +"deadzone": 0.5, +"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":4194319,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +save={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +open={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":79,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +spawn={ +"deadzone": 0.5, +"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,"echo":false,"script":null) +] +} diff --git a/loading/saveload_api/test_save b/loading/saveload_api/test_save new file mode 100644 index 00000000000..d4973974145 Binary files /dev/null and b/loading/saveload_api/test_save differ