diff --git a/models/textures/Tree texture.png b/models/textures/Tree texture.png new file mode 100644 index 0000000..9da8c99 Binary files /dev/null and b/models/textures/Tree texture.png differ diff --git a/models/textures/Tree texture.png.import b/models/textures/Tree texture.png.import new file mode 100644 index 0000000..3619f18 --- /dev/null +++ b/models/textures/Tree texture.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cs0pf7ogpaqm0" +path="res://.godot/imported/Tree texture.png-f926170428cfb15d629cee223218cb1e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://models/textures/Tree texture.png" +dest_files=["res://.godot/imported/Tree texture.png-f926170428cfb15d629cee223218cb1e.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 diff --git a/models/tree1.blend b/models/tree1.blend new file mode 100644 index 0000000..b698978 Binary files /dev/null and b/models/tree1.blend differ diff --git a/models/tree1.blend.import b/models/tree1.blend.import new file mode 100644 index 0000000..afc8d86 --- /dev/null +++ b/models/tree1.blend.import @@ -0,0 +1,50 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://iex6w53r12mp" +path="res://.godot/imported/tree1.blend-cc08633ad44091cf543995f60bfe014d.scn" + +[deps] + +source_file="res://models/tree1.blend" +dest_files=["res://.godot/imported/tree1.blend-cc08633ad44091cf543995f60bfe014d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 +blender/nodes/visible=0 +blender/nodes/punctual_lights=true +blender/nodes/cameras=true +blender/nodes/custom_properties=true +blender/nodes/modifiers=1 +blender/meshes/colors=false +blender/meshes/uvs=true +blender/meshes/normals=true +blender/meshes/tangents=true +blender/meshes/skins=2 +blender/meshes/export_bones_deforming_mesh_only=false +blender/materials/unpack_enabled=true +blender/materials/export_materials=1 +blender/animation/limit_playback=true +blender/animation/always_sample=true +blender/animation/group_tracks=true diff --git a/models/tree1.blend1 b/models/tree1.blend1 new file mode 100644 index 0000000..2501d4b Binary files /dev/null and b/models/tree1.blend1 differ diff --git a/models/tree1.glb b/models/tree1.glb new file mode 100644 index 0000000..90b9a03 Binary files /dev/null and b/models/tree1.glb differ diff --git a/models/tree1.glb.import b/models/tree1.glb.import new file mode 100644 index 0000000..81a142b --- /dev/null +++ b/models/tree1.glb.import @@ -0,0 +1,34 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bmtdabffpea0c" +path="res://.godot/imported/tree1.glb-11071132bbffea34242c0708ce7d8c96.scn" + +[deps] + +source_file="res://models/tree1.glb" +dest_files=["res://.godot/imported/tree1.glb-11071132bbffea34242c0708ce7d8c96.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/models/tree1_Tree texture.png b/models/tree1_Tree texture.png new file mode 100644 index 0000000..9da8c99 Binary files /dev/null and b/models/tree1_Tree texture.png differ diff --git a/models/tree1_Tree texture.png.import b/models/tree1_Tree texture.png.import new file mode 100644 index 0000000..be55359 --- /dev/null +++ b/models/tree1_Tree texture.png.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bmdnagwn484ry" +path.s3tc="res://.godot/imported/tree1_Tree texture.png-a307eefd8a9f7394b4f1a33a9ac5ea26.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "608aea78302cc1f1db9655a5e11c59a2" +} + +[deps] + +source_file="res://models/tree1_Tree texture.png" +dest_files=["res://.godot/imported/tree1_Tree texture.png-a307eefd8a9f7394b4f1a33a9ac5ea26.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +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=0 diff --git a/project.godot b/project.godot index 7a96e00..7d32826 100644 --- a/project.godot +++ b/project.godot @@ -11,13 +11,18 @@ config_version=5 [application] config/name="Godsim" -run/main_scene="res://scenes/world.tscn" +run/main_scene="res://scenes/UI/main_menu.tscn" config/features=PackedStringArray("4.2", "Forward Plus") config/icon="res://icon.svg" [autoload] Definitions="*res://scripts/definitions.gd" +World="*res://scripts/world.gd" + +[filesystem] + +import/fbx/enabled=false [input] @@ -69,6 +74,7 @@ run={ LMC={ "deadzone": 0.5, "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +, 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":4194305,"key_label":0,"unicode":0,"echo":false,"script":null) ] } "tile type loop"={ @@ -76,3 +82,8 @@ LMC={ "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":84,"key_label":0,"unicode":116,"echo":false,"script":null) ] } +ingame_menu={ +"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":4194305,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} diff --git a/scenes/UI/ingame_menu.tscn b/scenes/UI/ingame_menu.tscn new file mode 100644 index 0000000..799dc01 --- /dev/null +++ b/scenes/UI/ingame_menu.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=3 format=3 uid="uid://csfa8wr1fbfb2"] + +[ext_resource type="Script" path="res://scripts/ingame_menu.gd" id="1_swq50"] +[ext_resource type="Script" path="res://scripts/menu_button.gd" id="2_ey872"] + +[node name="ingame_menu" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_swq50") + +[node name="PanelContainer" type="PanelContainer" parent="."] +modulate = Color(1, 1, 1, 0.501961) +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 89.0 +offset_top = 93.0 +offset_right = -89.0 +offset_bottom = -93.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Buttons" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -20.0 +offset_right = 20.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="save_world_button" type="Button" parent="Buttons"] +layout_mode = 2 +offset_left = -45.0 +offset_top = -45.0 +offset_right = 46.0 +offset_bottom = -14.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +text = "Save world" +script = ExtResource("2_ey872") + +[node name="save_exit_button" type="Button" parent="Buttons"] +layout_mode = 2 +offset_left = -71.0 +offset_top = 22.0 +offset_right = 87.0 +offset_bottom = 53.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +text = "Save and exit game" +script = ExtResource("2_ey872") + +[node name="exit_nosave_button" type="Button" parent="Buttons"] +layout_mode = 2 +offset_left = 334.0 +offset_top = 212.0 +offset_right = 492.0 +offset_bottom = 243.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +text = "exit without saving" +script = ExtResource("2_ey872") diff --git a/scenes/UI/main_menu.tscn b/scenes/UI/main_menu.tscn new file mode 100644 index 0000000..400b6be --- /dev/null +++ b/scenes/UI/main_menu.tscn @@ -0,0 +1,59 @@ +[gd_scene load_steps=2 format=3 uid="uid://byrk15nhm7h45"] + +[ext_resource type="Script" path="res://scripts/menu_button.gd" id="1_48nxl"] + +[node name="Main menu" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="new_world_button" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -47.0 +offset_top = -73.0 +offset_right = 45.0 +offset_bottom = -42.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "New world" +script = ExtResource("1_48nxl") + +[node name="load_world_button" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -47.5 +offset_top = -15.5 +offset_right = 47.5 +offset_bottom = 15.5 +grow_horizontal = 2 +grow_vertical = 2 +text = "Load world" +script = ExtResource("1_48nxl") + +[node name="quit_button" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -23.0 +offset_top = 55.0 +offset_right = 19.0 +offset_bottom = 86.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "Quit" +script = ExtResource("1_48nxl") diff --git a/scenes/ui.tscn b/scenes/UI/ui.tscn similarity index 100% rename from scenes/ui.tscn rename to scenes/UI/ui.tscn diff --git a/scenes/models/god.tscn b/scenes/models/god.tscn index 5bc14d0..b95afc0 100644 --- a/scenes/models/god.tscn +++ b/scenes/models/god.tscn @@ -1,7 +1,9 @@ -[gd_scene load_steps=3 format=3 uid="uid://b6er1dx11vq1a"] +[gd_scene load_steps=5 format=3 uid="uid://b6er1dx11vq1a"] [ext_resource type="Script" path="res://scripts/God.gd" id="1_hfa56"] -[ext_resource type="PackedScene" uid="uid://bs7ctvbx7xov5" path="res://scenes/ui.tscn" id="2_06brk"] +[ext_resource type="PackedScene" uid="uid://bs7ctvbx7xov5" path="res://scenes/UI/ui.tscn" id="2_tlgt4"] +[ext_resource type="Script" path="res://scripts/ingame_menu.gd" id="3_26rdb"] +[ext_resource type="Script" path="res://scripts/ingame_menu_button.gd" id="4_ggyng"] [node name="God" type="Node3D"] transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) @@ -12,5 +14,75 @@ script = ExtResource("1_hfa56") [node name="eye" type="RayCast3D" parent="Camera"] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0) target_position = Vector3(100, 0, 0) +collision_mask = 3 -[node name="UI" parent="." instance=ExtResource("2_06brk")] +[node name="UI" parent="." instance=ExtResource("2_tlgt4")] + +[node name="ingame_menu" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("3_26rdb") + +[node name="PanelContainer" type="PanelContainer" parent="ingame_menu"] +modulate = Color(1, 1, 1, 0.501961) +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 89.0 +offset_top = 93.0 +offset_right = -89.0 +offset_bottom = -93.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Buttons" type="Control" parent="ingame_menu"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -20.0 +offset_right = 20.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="save_world_button" type="Button" parent="ingame_menu/Buttons"] +layout_mode = 2 +offset_left = -45.0 +offset_top = -45.0 +offset_right = 46.0 +offset_bottom = -14.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +text = "Save world" +script = ExtResource("4_ggyng") + +[node name="save_exit_button" type="Button" parent="ingame_menu/Buttons"] +layout_mode = 2 +offset_left = -71.0 +offset_top = 22.0 +offset_right = 87.0 +offset_bottom = 53.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +text = "Save and exit game" +script = ExtResource("4_ggyng") + +[node name="exit_nosave_button" type="Button" parent="ingame_menu/Buttons"] +layout_mode = 2 +offset_left = 334.0 +offset_top = 212.0 +offset_right = 492.0 +offset_bottom = 243.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +text = "exit without saving" +script = ExtResource("4_ggyng") diff --git a/scenes/models/tile.tscn b/scenes/models/tile.tscn index 9729753..d8b6c50 100644 --- a/scenes/models/tile.tscn +++ b/scenes/models/tile.tscn @@ -33,6 +33,7 @@ size = Vector3(10, 5, 10) [node name="Tile" type="StaticBody3D"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -2.5, 0) +collision_layer = 2 script = ExtResource("1_s01tx") [node name="Empty_tile" type="CollisionShape3D" parent="."] @@ -64,13 +65,17 @@ skeleton = NodePath("../..") [node name="ray_north" type="RayCast3D" parent="."] target_position = Vector3(10, 0, 0) +collision_mask = 3 [node name="ray_south" type="RayCast3D" parent="."] target_position = Vector3(-10, 0, 0) +collision_mask = 3 [node name="ray_west" type="RayCast3D" parent="."] target_position = Vector3(0, 0, -10) +collision_mask = 3 [node name="ray_east" type="RayCast3D" parent="."] target_position = Vector3(0, 0, 10) +collision_mask = 3 collide_with_areas = true diff --git a/scenes/models/tree_1.tscn b/scenes/models/tree_1.tscn new file mode 100644 index 0000000..2a32e3c --- /dev/null +++ b/scenes/models/tree_1.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://diinihb536yya"] + +[ext_resource type="PackedScene" uid="uid://bmtdabffpea0c" path="res://models/tree1.glb" id="1_q4afb"] + +[node name="Tree1" type="Node3D"] + +[node name="tree1" parent="." instance=ExtResource("1_q4afb")] + +[editable path="tree1"] diff --git a/scenes/world.tscn b/scenes/world.tscn index d1a50f2..8444e04 100644 --- a/scenes/world.tscn +++ b/scenes/world.tscn @@ -1,29 +1,28 @@ [gd_scene load_steps=6 format=3 uid="uid://dh52xle0rfx5r"] -[ext_resource type="PackedScene" uid="uid://b6er1dx11vq1a" path="res://scenes/models/god.tscn" id="1_vj3b2"] -[ext_resource type="Script" path="res://scripts/Earth.gd" id="2_oiur1"] +[ext_resource type="Script" path="res://scripts/Earth.gd" id="1_u71pd"] +[ext_resource type="PackedScene" uid="uid://b6er1dx11vq1a" path="res://scenes/models/god.tscn" id="2_frpdt"] -[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_xk8d1"] +[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_01wm3"] -[sub_resource type="Sky" id="Sky_wd7fg"] -sky_material = SubResource("ProceduralSkyMaterial_xk8d1") +[sub_resource type="Sky" id="Sky_oeb53"] +sky_material = SubResource("ProceduralSkyMaterial_01wm3") -[sub_resource type="Environment" id="Environment_4ke8e"] +[sub_resource type="Environment" id="Environment_4hkk2"] background_mode = 2 -sky = SubResource("Sky_wd7fg") -ambient_light_source = 3 +sky = SubResource("Sky_oeb53") [node name="World" type="Node3D"] - -[node name="God" parent="." instance=ExtResource("1_vj3b2")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 1) - -[node name="Sky" type="WorldEnvironment" parent="."] -environment = SubResource("Environment_4ke8e") - -[node name="Sun" type="DirectionalLight3D" parent="Sky"] -transform = Transform3D(-0.0647024, -0.76, 0.646694, -0.0118927, 0.648593, 0.761042, -0.997834, 0.0415503, -0.051004, 0, 0, 0) -shadow_enabled = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.20056, -2.31495, -0.853709) [node name="Earth" type="Node3D" parent="."] -script = ExtResource("2_oiur1") +script = ExtResource("1_u71pd") + +[node name="God" parent="." instance=ExtResource("2_frpdt")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -2.77222, 0.906321, 0) + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_4hkk2") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="WorldEnvironment"] +transform = Transform3D(-3.53179e-08, 0.58921, -0.80798, 2.57552e-08, 0.80798, 0.58921, 1, 0, -4.37114e-08, -14.3426, 13.3054, 0) diff --git a/scripts/Earth.gd b/scripts/Earth.gd index 0f7d124..47b1604 100644 --- a/scripts/Earth.gd +++ b/scripts/Earth.gd @@ -10,6 +10,8 @@ var tile_exemplar = preload("res://scenes/models/tile.tscn"); func _ready(): var start_tile = tile_exemplar.instantiate() + start_tile.add_to_group("Persistent") + add_child(start_tile); func _physics_process(delta): @@ -23,6 +25,7 @@ func mark_free_tiles(): for dir in free_dirs: var free_tile = tile_exemplar.instantiate() free_tile.tile_type = TileType.Empty + free_tile.add_to_group("Persistent") add_child(free_tile) var pos: Vector3 = tile.position match dir: diff --git a/scripts/God.gd b/scripts/God.gd index f4f6f56..90ca50a 100644 --- a/scripts/God.gd +++ b/scripts/God.gd @@ -41,7 +41,7 @@ func _physics_process(delta): velocity_label.text = "Velocity: " + str(walk) var input_dir = Input.get_vector("left", "right", "forward", "backward") - var direction = (head.transform.basis * Vector3(input_dir.x, input_dir.x, input_dir.y)).normalized() + var direction = (head.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() var velocity = Vector3.ZERO var speed diff --git a/scripts/Tile.gd b/scripts/Tile.gd index 4153154..4ad7c8b 100644 --- a/scripts/Tile.gd +++ b/scripts/Tile.gd @@ -32,3 +32,13 @@ func get_free_dirs_around(): func _process(delta): pass + +func save(): + if tile_type == TileType.Empty: return {} + return { + "node": "tile", + "pos_x": position.x, + "pos_y": position.y, + "pos_z": position.z, + "tile_type": tile_type + } diff --git a/scripts/ingame_menu.gd b/scripts/ingame_menu.gd new file mode 100644 index 0000000..c5e224f --- /dev/null +++ b/scripts/ingame_menu.gd @@ -0,0 +1,6 @@ +extends Control + +func _physics_process(delta): + if Input.is_action_just_pressed("ingame_menu"): + self.visible = !self.visible + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE if self.visible else Input.MOUSE_MODE_CAPTURED) diff --git a/scripts/ingame_menu_button.gd b/scripts/ingame_menu_button.gd new file mode 100644 index 0000000..9dbc66d --- /dev/null +++ b/scripts/ingame_menu_button.gd @@ -0,0 +1,24 @@ +extends Button + +@onready var button = $"." +@onready var main_menu = $".." +var world_scene = preload("res://scenes/world.tscn") + +func _ready(): + print("ready") + enable() + +func enable(): + $".".pressed.connect(self._button_pressed) + +func disable(): + $".".pressed.disconnect() + +func _button_pressed(): + if ("save_world" in name): + World.save_world() + elif ("save_exit" in name): + World.save_world() + get_tree().change_scene_to_file("res://scenes/UI/main_menu.tscn") + elif ("exit_nosave" in name): + get_tree().change_scene_to_file("res://scenes/UI/main_menu.tscn") diff --git a/scripts/menu_button.gd b/scripts/menu_button.gd new file mode 100644 index 0000000..de26274 --- /dev/null +++ b/scripts/menu_button.gd @@ -0,0 +1,42 @@ +extends Button + +@onready var button = $"." +@onready var main_menu = $".." +var world_scene = preload("res://scenes/world.tscn") + +func _ready(): + print("ready") + enable() + +func test(): + print("test") + +func enable(): + $".".pressed.connect(self._button_pressed) + +func disable(): + $".".pressed.disconnect() + +func _button_pressed(): + if ("quit" in name): + get_tree().quit() + elif ("new_world" in name): + get_tree().change_scene_to_packed(world_scene) + World.new_world() + elif ("load_world" in name): + #assert(get_tree().change_scene_to_packed(world_scene) == OK) + #get_tree().change_scene_to_packed(world_scene) + var world_scene_instance = world_scene.instantiate(); + world_scene_instance.name = "world" + var a = $"/root/Main menu" + print(str(a)) + get_tree().root.add_child(world_scene_instance) + get_tree().root.remove_child(a) + World.load_world("world") + elif ("save_world" in name): + World.save_world() + elif ("save_exit" in name): + World.save_world() + get_tree().change_scene_to_file("res://scenes/UI/main_menu.tscn") + elif ("exit_nosave" in name): + get_tree().change_scene_to_file("res://scenes/UI/main_menu.tscn") diff --git a/scripts/world.gd b/scripts/world.gd new file mode 100644 index 0000000..434e864 --- /dev/null +++ b/scripts/world.gd @@ -0,0 +1,108 @@ +extends Node + +var world_seed = 0; +var world_info = { + "seed": 0, + "name": "world" +} + +func _ready(): + #new_world() + pass + +func new_world(): + world_info.seed = round(Time.get_unix_time_from_system()) + print("World seed is " + str(world_info.seed)) + print("World name is " + str(world_info.name)) + +func save_world(): + print("Saving world") + var save_game = FileAccess.open("user://%s.save" % world_info.name, FileAccess.WRITE) + + # Saving world info + save_game.store_line(JSON.stringify(world_info)) + + var save_nodes = get_tree().get_nodes_in_group("Persistent") + + for node in save_nodes: + # Check the node is an instanced scene so it can be instanced again during load. + if node.scene_file_path.is_empty(): + print("persistent node '%s' is not an instanced scene, skipped" % node.name) + continue + + # Check the node has a save function. + if !node.has_method("save"): + print("persistent node '%s' is missing a save() function, skipped" % node.name) + continue + + # Call the node's save function. + var node_data = node.call("save") + #print(node_data) + if (node_data == {}): continue + # JSON provides a static method to serialized JSON string. + var json_string = JSON.stringify(node_data) + + # Store the save dictionary as a new line in the save file. + save_game.store_line(json_string) + +func load_world(save_name): + if not FileAccess.file_exists("user://%s.save" % save_name): + return # Error! We don't have a save to load. + + # We need to revert the game state so we're not cloning objects + # during loading. This will vary wildly depending on the needs of a + # project, so take care with this step. + # For our example, we will accomplish this by deleting saveable objects. + var save_nodes = get_tree().get_nodes_in_group("Persistent") + for i in save_nodes: + i.queue_free() + + # Load the file line by line and process that dictionary to restore + # the object it represents. + var save_game = FileAccess.open("user://%s.save" % save_name, FileAccess.READ) + + var json_string_world = save_game.get_line() + + var json_world = JSON.new() + + var parse_result_world = json_world.parse(json_string_world) + if not parse_result_world == OK: + print("JSON Parse Error: ", json_world.get_error_message(), " in ", json_string_world, " at line ", json_world.get_error_line()) + return + + world_info = json_world.get_data() + + while save_game.get_position() < save_game.get_length(): + var json_string = save_game.get_line() + + # Creates the helper class to interact with JSON + var json = JSON.new() + + # Check if there is any error while parsing the JSON string, skip in case of failure + var parse_result = json.parse(json_string) + if not parse_result == OK: + print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line()) + continue + + # Get the data from the JSON object + var node_data = json.get_data() + + # Firstly, we need to create the object and add it to the tree and set its position. + #var new_object = load(node_data["filename"]).instantiate() + var new_object + match node_data["node"]: + "tile": + new_object = load("res://scenes/models/tile.tscn").instantiate() + #print(str(get_tree().root.get_node("world/Earth"))) + get_tree().root.get_node("world/Earth").add_child(new_object) + + new_object.position = Vector3(node_data["pos_x"], node_data["pos_y"], node_data["pos_z"]) + + # Now we set the remaining variables. + for i in node_data.keys(): + if i == "node" or "pos" in i: + continue + new_object.set(i, node_data[i]) + new_object.call("update_tile") + get_tree().root.get_node("world/Earth").call("mark_free_tiles") + diff --git a/textures/tree1_Tree texture.png b/textures/tree1_Tree texture.png new file mode 100644 index 0000000..9da8c99 Binary files /dev/null and b/textures/tree1_Tree texture.png differ diff --git a/textures/tree1_Tree texture.png.import b/textures/tree1_Tree texture.png.import new file mode 100644 index 0000000..d1de466 --- /dev/null +++ b/textures/tree1_Tree texture.png.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djg78u0i8giw8" +path.s3tc="res://.godot/imported/tree1_Tree texture.png-643219c601b830844579a0c7f3bf8bf3.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={ +"md5": "608aea78302cc1f1db9655a5e11c59a2" +} + +[deps] + +source_file="res://textures/tree1_Tree texture.png" +dest_files=["res://.godot/imported/tree1_Tree texture.png-643219c601b830844579a0c7f3bf8bf3.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +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=0