✨ Building regisery instead of single building
This commit is contained in:
5
Data/Buildings.json
Normal file
5
Data/Buildings.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"wall": "res://Scenes/Tiles/WallTile.tscn",
|
||||||
|
"farm": "res://Scenes/Tiles/FarmTile.tscn",
|
||||||
|
"tower": "res://Scenes/Tiles/TowerTile.tscn"
|
||||||
|
}
|
@@ -1,21 +1,22 @@
|
|||||||
[gd_scene load_steps=5 format=3 uid="uid://c22aprj452aha"]
|
[gd_scene load_steps=5 format=3 uid="uid://c22aprj452aha"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://cudpc3w17mbsw" path="res://Scripts/System/GridManager.cs" id="1_knkkn"]
|
[ext_resource type="Script" uid="uid://cudpc3w17mbsw" path="res://Scripts/System/GridManager.cs" id="1_knkkn"]
|
||||||
|
[ext_resource type="Script" uid="uid://cfbj72nm0eovg" path="res://Scripts/System/BuildingRegistry.cs" id="1_sxhdm"]
|
||||||
[ext_resource type="Script" uid="uid://bx1wj7gn6vrqe" path="res://Scripts/System/PlacementManager.cs" id="2_sxhdm"]
|
[ext_resource type="Script" uid="uid://bx1wj7gn6vrqe" path="res://Scripts/System/PlacementManager.cs" id="2_sxhdm"]
|
||||||
[ext_resource type="PackedScene" uid="uid://doxy60afddg1m" path="res://Scenes/Entities/Player.tscn" id="3_oss8w"]
|
[ext_resource type="PackedScene" uid="uid://doxy60afddg1m" path="res://Scenes/Entities/Player.tscn" id="3_oss8w"]
|
||||||
[ext_resource type="PackedScene" uid="uid://d1pudmkg5nnhj" path="res://Scenes/Tiles/WallTile.tscn" id="3_sxhdm"]
|
|
||||||
|
|
||||||
[node name="Root" type="Node2D"]
|
[node name="Root" type="Node2D"]
|
||||||
|
|
||||||
|
[node name="BuildingRegistry" type="Node" parent="."]
|
||||||
|
script = ExtResource("1_sxhdm")
|
||||||
|
|
||||||
[node name="GridSystem" type="Node2D" parent="."]
|
[node name="GridSystem" type="Node2D" parent="."]
|
||||||
script = ExtResource("1_knkkn")
|
script = ExtResource("1_knkkn")
|
||||||
|
|
||||||
[node name="PlacementSystem" type="Node2D" parent="." node_paths=PackedStringArray("Grid")]
|
[node name="PlacementSystem" type="Node2D" parent="." node_paths=PackedStringArray("Grid", "Registry")]
|
||||||
script = ExtResource("2_sxhdm")
|
script = ExtResource("2_sxhdm")
|
||||||
BuildingScene = ExtResource("3_sxhdm")
|
|
||||||
Grid = NodePath("../GridSystem")
|
Grid = NodePath("../GridSystem")
|
||||||
|
Registry = NodePath("../BuildingRegistry")
|
||||||
[node name="WallTile" parent="." instance=ExtResource("3_sxhdm")]
|
|
||||||
|
|
||||||
[node name="Player" parent="." instance=ExtResource("3_oss8w")]
|
[node name="Player" parent="." instance=ExtResource("3_oss8w")]
|
||||||
position = Vector2(602, 324)
|
position = Vector2(602, 324)
|
||||||
|
63
Scripts/System/BuildingRegistry.cs
Normal file
63
Scripts/System/BuildingRegistry.cs
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Godot;
|
||||||
|
|
||||||
|
namespace AceFieldNewHorizon.Scripts.System;
|
||||||
|
|
||||||
|
public partial class BuildingRegistry : Node
|
||||||
|
{
|
||||||
|
private Dictionary<string, PackedScene> _registry = new();
|
||||||
|
|
||||||
|
[Export] public string JsonPath { get; set; } = "res://Data/Buildings.json";
|
||||||
|
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
LoadFromJson(JsonPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadFromJson(string path)
|
||||||
|
{
|
||||||
|
var file = FileAccess.Open(path, FileAccess.ModeFlags.Read);
|
||||||
|
if (file == null)
|
||||||
|
{
|
||||||
|
GD.PrintErr($"[BuildingRegistry] Failed to open {path}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var text = file.GetAsText();
|
||||||
|
file.Close();
|
||||||
|
|
||||||
|
var json = new Json();
|
||||||
|
var error = json.Parse(text);
|
||||||
|
if (error != Error.Ok)
|
||||||
|
{
|
||||||
|
GD.PrintErr($"[BuildingRegistry] Failed to parse JSON: {json.GetErrorMessage()}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dict = (Godot.Collections.Dictionary)json.Data;
|
||||||
|
|
||||||
|
foreach (string key in dict.Keys)
|
||||||
|
{
|
||||||
|
var scenePath = dict[key].AsString();
|
||||||
|
var scene = GD.Load<PackedScene>(scenePath);
|
||||||
|
|
||||||
|
if (scene != null)
|
||||||
|
{
|
||||||
|
_registry[key] = scene;
|
||||||
|
GD.Print($"[BuildingRegistry] Loaded building '{key}' from {scenePath}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GD.PrintErr($"[BuildingRegistry] Failed to load scene for '{key}' at {scenePath}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GD.Print($"[BuildingRegistry] Loaded {_registry.Count} buildings");
|
||||||
|
}
|
||||||
|
|
||||||
|
public PackedScene GetScene(string id)
|
||||||
|
{
|
||||||
|
_registry.TryGetValue(id, out var scene);
|
||||||
|
return scene;
|
||||||
|
}
|
||||||
|
}
|
1
Scripts/System/BuildingRegistry.cs.uid
Normal file
1
Scripts/System/BuildingRegistry.cs.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://cfbj72nm0eovg
|
@@ -5,11 +5,23 @@ namespace AceFieldNewHorizon.Scripts.System;
|
|||||||
|
|
||||||
public partial class PlacementManager : Node2D
|
public partial class PlacementManager : Node2D
|
||||||
{
|
{
|
||||||
[Export] public PackedScene BuildingScene { get; set; }
|
|
||||||
[Export] public GridManager Grid { get; set; }
|
[Export] public GridManager Grid { get; set; }
|
||||||
|
[Export] public BuildingRegistry Registry { get; set; }
|
||||||
|
|
||||||
|
private string _currentBuildingId = "wall";
|
||||||
|
|
||||||
private Vector2I _hoveredCell;
|
private Vector2I _hoveredCell;
|
||||||
private BaseTile _ghostBuilding;
|
private BaseTile _ghostBuilding;
|
||||||
|
|
||||||
|
public void SetCurrentBuilding(string buildingId)
|
||||||
|
{
|
||||||
|
_currentBuildingId = buildingId;
|
||||||
|
|
||||||
|
// Replace ghost immediately
|
||||||
|
if (_ghostBuilding == null) return;
|
||||||
|
_ghostBuilding.QueueFree();
|
||||||
|
_ghostBuilding = null;
|
||||||
|
}
|
||||||
|
|
||||||
public override void _Process(double delta)
|
public override void _Process(double delta)
|
||||||
{
|
{
|
||||||
@@ -19,7 +31,10 @@ public partial class PlacementManager : Node2D
|
|||||||
|
|
||||||
if (_ghostBuilding == null)
|
if (_ghostBuilding == null)
|
||||||
{
|
{
|
||||||
_ghostBuilding = (BaseTile)BuildingScene.Instantiate();
|
var scene = Registry.GetScene(_currentBuildingId);
|
||||||
|
if (scene == null) return;
|
||||||
|
|
||||||
|
_ghostBuilding = (BaseTile)scene.Instantiate();
|
||||||
_ghostBuilding.SetGhostMode(true);
|
_ghostBuilding.SetGhostMode(true);
|
||||||
AddChild(_ghostBuilding);
|
AddChild(_ghostBuilding);
|
||||||
}
|
}
|
||||||
@@ -46,10 +61,13 @@ public partial class PlacementManager : Node2D
|
|||||||
// Left click to place
|
// Left click to place
|
||||||
if (Input.IsActionPressed("build_tile") && canPlace)
|
if (Input.IsActionPressed("build_tile") && canPlace)
|
||||||
{
|
{
|
||||||
|
var scene = Registry.GetScene(_currentBuildingId);
|
||||||
|
if (scene == null) return;
|
||||||
|
|
||||||
_ghostBuilding.FinalizePlacement();
|
_ghostBuilding.FinalizePlacement();
|
||||||
Grid.OccupyCell(_hoveredCell, _ghostBuilding);
|
Grid.OccupyCell(_hoveredCell, _ghostBuilding);
|
||||||
|
|
||||||
_ghostBuilding = (BaseTile)BuildingScene.Instantiate();
|
_ghostBuilding = (BaseTile)scene.Instantiate();
|
||||||
_ghostBuilding.SetGhostMode(true);
|
_ghostBuilding.SetGhostMode(true);
|
||||||
AddChild(_ghostBuilding);
|
AddChild(_ghostBuilding);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user