feat: Implement the main game scene, core logic, UI, and manager setup for Tekton Dash.
This commit is contained in:
@@ -504,6 +504,9 @@ func _start_game():
|
||||
var all_players = get_tree().get_nodes_in_group("Players")
|
||||
ui_manager.initialize_leaderboard_with_players(all_players)
|
||||
|
||||
# Spawn Tekton NPC
|
||||
spawn_tekton_npc()
|
||||
|
||||
func _assign_random_spawn_positions():
|
||||
"""Assign spawn positions distributed to 4 corners (2 per corner for 8 players)."""
|
||||
var enhanced_gridmap = $EnhancedGridMap
|
||||
@@ -596,6 +599,54 @@ func _assign_random_spawn_positions():
|
||||
|
||||
spawn_index += 1
|
||||
|
||||
# =============================================================================
|
||||
# Tekton NPC Management
|
||||
# =============================================================================
|
||||
|
||||
func spawn_tekton_npc():
|
||||
"""Spawn a Tekton NPC at a random location."""
|
||||
if not multiplayer.is_server(): return
|
||||
|
||||
# Find random valid position
|
||||
var enhanced_gridmap = $EnhancedGridMap
|
||||
if not enhanced_gridmap: return
|
||||
|
||||
var valid_pos = Vector2i(-1, -1)
|
||||
for _i in range(20): # Try 20 times
|
||||
var x = randi() % enhanced_gridmap.columns
|
||||
var y = randi() % enhanced_gridmap.rows
|
||||
var cell = Vector3i(x, 0, y)
|
||||
if enhanced_gridmap.get_cell_item(cell) == 0: # Walkable floor
|
||||
valid_pos = Vector2i(x, y)
|
||||
break
|
||||
|
||||
if valid_pos != Vector2i(-1, -1):
|
||||
# Generate a consistent ID/Name for sync
|
||||
var tekton_id = Time.get_ticks_msec()
|
||||
_create_tekton(valid_pos, tekton_id)
|
||||
rpc("sync_spawn_tekton", valid_pos, tekton_id)
|
||||
|
||||
@rpc("call_remote", "reliable")
|
||||
func sync_spawn_tekton(pos: Vector2i, tekton_id: int):
|
||||
_create_tekton(pos, tekton_id)
|
||||
|
||||
func _create_tekton(pos: Vector2i, tekton_id: int):
|
||||
var node_name = "Tekton_%d" % tekton_id
|
||||
if has_node(node_name): return
|
||||
|
||||
var tekton_scene = load("res://scenes/tekton.tscn")
|
||||
var tekton = tekton_scene.instantiate()
|
||||
tekton.name = node_name
|
||||
add_child(tekton)
|
||||
|
||||
# Initialize
|
||||
if tekton.has_method("initialize"):
|
||||
if has_node("EnhancedGridMap"):
|
||||
tekton.initialize(pos, $EnhancedGridMap)
|
||||
|
||||
print("[Main] Spawned Tekton at %s (ID: %d)" % [pos, tekton_id])
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# Player Management
|
||||
# =============================================================================
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
[gd_scene format=3 uid="uid://dpi7acioph6kk"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dyovwailce5tf" path="res://scripts/tekton.gd" id="1_tekton"]
|
||||
[ext_resource type="Script" uid="uid://c67yq846u8y68" path="res://scripts/tekton_controller.gd" id="2_controller"]
|
||||
[ext_resource type="PackedScene" uid="uid://bye8rbeqmxy1m" path="res://assets/models/meshes/tekton/tekton_walking.glb" id="3_mesh"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_tekton"]
|
||||
size = Vector3(0.8, 1, 0.8)
|
||||
|
||||
[node name="Tekton" type="Node3D" unique_id=119914767 groups=["Tektons"]]
|
||||
script = ExtResource("1_tekton")
|
||||
|
||||
[node name="TektonController" type="Node" parent="." unique_id=1658331083]
|
||||
script = ExtResource("2_controller")
|
||||
|
||||
[node name="Visuals" type="Node3D" parent="." unique_id=1698719440]
|
||||
|
||||
[node name="tekton_walking" parent="Visuals" unique_id=1701195793 instance=ExtResource("3_mesh")]
|
||||
transform = Transform3D(0.15, 0, 0, 0, 0.15, 0, 0, 0, 0.15, 0, 0, 0)
|
||||
|
||||
[node name="HitArea" type="Area3D" parent="." unique_id=2139590311]
|
||||
collision_layer = 4
|
||||
collision_mask = 2
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="HitArea" unique_id=818146069]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
|
||||
shape = SubResource("BoxShape3D_tekton")
|
||||
Reference in New Issue
Block a user