diff --git a/project.godot b/project.godot index 1f0221c..9d83e5b 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="res://scenes/world.tscn" config/features=PackedStringArray("4.2", "Forward Plus") config/icon="res://icon.svg" +[autoload] + +Definitions="*res://scripts/definitions.gd" + [input] MWU={ @@ -62,3 +66,8 @@ run={ "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":4194325,"key_label":0,"unicode":0,"echo":false,"script":null) ] } +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) +] +} diff --git a/scenes/models/god.tscn b/scenes/models/god.tscn index c9cb77a..d20b5db 100644 --- a/scenes/models/god.tscn +++ b/scenes/models/god.tscn @@ -4,8 +4,13 @@ [ext_resource type="PackedScene" uid="uid://bs7ctvbx7xov5" path="res://scenes/ui.tscn" id="2_06brk"] [node name="God" type="Node3D"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) script = ExtResource("1_hfa56") [node name="Camera" type="Camera3D" parent="."] +[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(50, 0, 0) + [node name="UI" parent="." instance=ExtResource("2_06brk")] diff --git a/scenes/models/tile.tscn b/scenes/models/tile.tscn index d70f58e..898e836 100644 --- a/scenes/models/tile.tscn +++ b/scenes/models/tile.tscn @@ -1,19 +1,69 @@ -[gd_scene load_steps=4 format=3 uid="uid://dj0odn77jplje"] +[gd_scene load_steps=9 format=3 uid="uid://dj0odn77jplje"] [ext_resource type="Script" path="res://scripts/Tile.gd" id="1_s01tx"] +[ext_resource type="Texture2D" uid="uid://d1k366i5jjtrk" path="res://textures/plus.svg" id="2_cddgt"] + +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_qnc60"] +data = PackedVector3Array(-5, 2.5, 5, 5, 2.5, 5, -5, -2.5, 5, 5, 2.5, 5, 5, -2.5, 5, -5, -2.5, 5, 5, 2.5, -5, -5, 2.5, -5, 5, -2.5, -5, -5, 2.5, -5, -5, -2.5, -5, 5, -2.5, -5, 5, 2.5, 5, 5, 2.5, -5, 5, -2.5, 5, 5, 2.5, -5, 5, -2.5, -5, 5, -2.5, 5, -5, 2.5, -5, -5, 2.5, 5, -5, -2.5, -5, -5, 2.5, 5, -5, -2.5, 5, -5, -2.5, -5, 5, 2.5, 5, -5, 2.5, 5, 5, 2.5, -5, -5, 2.5, 5, -5, 2.5, -5, 5, 2.5, -5, -5, -2.5, 5, 5, -2.5, 5, -5, -2.5, -5, 5, -2.5, 5, 5, -2.5, -5, -5, -2.5, -5) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_f1ys8"] +transparency = 1 +albedo_color = Color(1, 1, 1, 0) [sub_resource type="BoxMesh" id="BoxMesh_3vjuu"] +material = SubResource("StandardMaterial3D_f1ys8") size = Vector3(10, 5, 10) [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_scykg"] data = PackedVector3Array(-5, 2.5, 5, 5, 2.5, 5, -5, -2.5, 5, 5, 2.5, 5, 5, -2.5, 5, -5, -2.5, 5, 5, 2.5, -5, -5, 2.5, -5, 5, -2.5, -5, -5, 2.5, -5, -5, -2.5, -5, 5, -2.5, -5, 5, 2.5, 5, 5, 2.5, -5, 5, -2.5, 5, 5, 2.5, -5, 5, -2.5, -5, 5, -2.5, 5, -5, 2.5, -5, -5, 2.5, 5, -5, -2.5, -5, -5, 2.5, 5, -5, -2.5, 5, -5, -2.5, -5, 5, 2.5, 5, -5, 2.5, 5, 5, 2.5, -5, -5, 2.5, 5, -5, 2.5, -5, 5, 2.5, -5, -5, -2.5, 5, 5, -2.5, 5, -5, -2.5, -5, 5, -2.5, 5, 5, -2.5, -5, -5, -2.5, -5) +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0knec"] +albedo_color = Color(0.203922, 0.458824, 0.113725, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_doul4"] +material = SubResource("StandardMaterial3D_0knec") +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) script = ExtResource("1_s01tx") -[node name="VisibleMesh" type="MeshInstance3D" parent="."] -mesh = SubResource("BoxMesh_3vjuu") +[node name="Empty_tile" type="CollisionShape3D" parent="."] +shape = SubResource("ConcavePolygonShape3D_qnc60") -[node name="CollisionMesh" type="CollisionShape3D" parent="."] +[node name="VisibleMesh" type="MeshInstance3D" parent="Empty_tile"] +mesh = SubResource("BoxMesh_3vjuu") +skeleton = NodePath("../..") + +[node name="plus_sprite" type="Sprite3D" parent="Empty_tile"] +transform = Transform3D(2, 0, 0, 0, -8.74228e-08, -2, 0, 2, -8.74228e-08, 0, 2.501, 0) +texture = ExtResource("2_cddgt") + +[node name="Plain_tile" type="CollisionShape3D" parent="."] +visible = false shape = SubResource("ConcavePolygonShape3D_scykg") + +[node name="VisibleMesh" type="MeshInstance3D" parent="Plain_tile"] +mesh = SubResource("BoxMesh_doul4") +skeleton = NodePath("../..") + +[node name="Forest_tile" type="CollisionShape3D" parent="."] +visible = false +shape = SubResource("ConcavePolygonShape3D_scykg") + +[node name="VisibleMesh" type="MeshInstance3D" parent="Forest_tile"] +mesh = SubResource("BoxMesh_doul4") +skeleton = NodePath("../..") + +[node name="ray_north" type="RayCast3D" parent="."] +target_position = Vector3(10, 0, 0) + +[node name="ray_south" type="RayCast3D" parent="."] +target_position = Vector3(-10, 0, 0) + +[node name="ray_west" type="RayCast3D" parent="."] +target_position = Vector3(0, 0, -10) + +[node name="ray_east" type="RayCast3D" parent="."] +target_position = Vector3(0, 0, 10) +collide_with_areas = true diff --git a/scenes/world.tscn b/scenes/world.tscn index 7ec13f5..d1a50f2 100644 --- a/scenes/world.tscn +++ b/scenes/world.tscn @@ -1,7 +1,7 @@ [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="PackedScene" uid="uid://dj0odn77jplje" path="res://scenes/models/tile.tscn" id="2_1y5so"] +[ext_resource type="Script" path="res://scripts/Earth.gd" id="2_oiur1"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_xk8d1"] @@ -26,7 +26,4 @@ transform = Transform3D(-0.0647024, -0.76, 0.646694, -0.0118927, 0.648593, 0.761 shadow_enabled = true [node name="Earth" type="Node3D" parent="."] - -[node name="Tile" parent="Earth" instance=ExtResource("2_1y5so")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.3537, -2.5, 0) -constant_linear_velocity = Vector3(10, 0, 0) +script = ExtResource("2_oiur1") diff --git a/scripts/Earth.gd b/scripts/Earth.gd new file mode 100644 index 0000000..0f7d124 --- /dev/null +++ b/scripts/Earth.gd @@ -0,0 +1,38 @@ +extends Node3D + +enum TileType { + Empty, + Plain, + Forest +} + +var tile_exemplar = preload("res://scenes/models/tile.tscn"); + +func _ready(): + var start_tile = tile_exemplar.instantiate() + add_child(start_tile); + +func _physics_process(delta): + pass + +func mark_free_tiles(): + var tiles = get_children() + for tile in tiles: + if tile.tile_type == TileType.Empty: continue + var free_dirs = tile.get_free_dirs_around(); + for dir in free_dirs: + var free_tile = tile_exemplar.instantiate() + free_tile.tile_type = TileType.Empty + add_child(free_tile) + var pos: Vector3 = tile.position + match dir: + "north": + pos.x += 10 + "south": + pos.x -= 10 + "west": + pos.z -= 10 + "east": + pos.z += 10 + free_tile.position = pos; + free_tile.update_tile() diff --git a/scripts/God.gd b/scripts/God.gd index 70354d7..ed22429 100644 --- a/scripts/God.gd +++ b/scripts/God.gd @@ -6,6 +6,8 @@ var walk = 0.25 @onready var camera = $"./Camera" @onready var ui = $"./UI" @onready var velocity_label: Label = ui.find_child("velocity_label") +@onready var eye_raycast: RayCast3D = $"./Camera/eye" +@onready var earth = $"../Earth" func _ready(): camera.make_current() @@ -34,6 +36,13 @@ func _physics_process(delta): var velocity = Vector3.ZERO var speed + if Input.is_action_just_pressed("LMC") and eye_raycast.is_colliding(): + var target = eye_raycast.get_collider() + if "TileType" in target and target.tile_type == 0: + target.tile_type = 2 + target.update_tile() + earth.mark_free_tiles() + if Input.is_action_pressed("run"): speed = walk * 2 else: diff --git a/scripts/Tile.gd b/scripts/Tile.gd index 5627fa7..4153154 100644 --- a/scripts/Tile.gd +++ b/scripts/Tile.gd @@ -1,11 +1,34 @@ extends StaticBody3D +enum TileType { + Empty, + Plain, + Forest +} + +@export var tile_type: TileType = TileType.Empty; + +func update_tile(): + var children = find_children("*tile"); + for child in children: + if TileType.keys()[tile_type] == child.name.split("_")[0]: + child.visible = true; + else: + child.visible = false; -# Called when the node enters the scene tree for the first time. func _ready(): - pass # Replace with function body. + update_tile() - -# Called every frame. 'delta' is the elapsed time since the previous frame. +func get_free_dirs_around(): + var free_tiles_around = [] + if tile_type == TileType.Empty: return free_tiles_around + var raycasts = find_children("ray*"); + + for raycast: RayCast3D in raycasts: + raycast.force_raycast_update() + if !raycast.is_colliding(): + free_tiles_around.append(raycast.name.split("_")[1]) + return free_tiles_around + func _process(delta): pass diff --git a/scripts/definitions.gd b/scripts/definitions.gd new file mode 100644 index 0000000..592484b --- /dev/null +++ b/scripts/definitions.gd @@ -0,0 +1,7 @@ +extends Node +class_name defs +enum TileType { + Empty, + Plain, + Forest +} diff --git a/textures/plus.svg b/textures/plus.svg new file mode 100644 index 0000000..e5f846a --- /dev/null +++ b/textures/plus.svg @@ -0,0 +1,36 @@ + + + + + + + + + + diff --git a/textures/plus.svg.import b/textures/plus.svg.import new file mode 100644 index 0000000..136814f --- /dev/null +++ b/textures/plus.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1k366i5jjtrk" +path.s3tc="res://.godot/imported/plus.svg-fa9840203ca82cc4696e02bad07ef61f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://textures/plus.svg" +dest_files=["res://.godot/imported/plus.svg-fa9840203ca82cc4696e02bad07ef61f.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false