2025-09-17 10:12:15 +02:00
|
|
|
|
using System;
|
2025-09-16 01:16:02 +02:00
|
|
|
|
using System.Collections.Generic;
|
2025-09-16 10:45:09 +02:00
|
|
|
|
using System.Dynamic;
|
2025-09-16 19:49:18 +02:00
|
|
|
|
using System.Linq;
|
2025-09-16 01:16:02 +02:00
|
|
|
|
using Unity.VisualScripting;
|
|
|
|
|
|
using UnityEditor;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
using UnityEngine.Rendering;
|
2025-09-16 14:20:19 +02:00
|
|
|
|
using UnityEngine.UIElements;
|
2025-09-16 01:16:02 +02:00
|
|
|
|
using static UnityEngine.GraphicsBuffer;
|
2025-09-18 03:24:40 +02:00
|
|
|
|
using static UnityEngine.UI.GridLayoutGroup;
|
2025-09-16 01:16:02 +02:00
|
|
|
|
|
2025-09-18 17:37:35 +02:00
|
|
|
|
|
2025-09-16 01:16:02 +02:00
|
|
|
|
[ExecuteAlways]
|
|
|
|
|
|
public class GameManager : MonoBehaviour
|
|
|
|
|
|
{
|
2025-09-16 16:50:21 +02:00
|
|
|
|
public Transform ConnectionParent;
|
2025-09-17 23:38:11 +02:00
|
|
|
|
public GameObject ConnectionPrefab;
|
2025-09-16 10:45:09 +02:00
|
|
|
|
public Transform NodeParent;
|
|
|
|
|
|
public GameObject NodePrefab;
|
2025-09-16 01:16:02 +02:00
|
|
|
|
|
2025-09-18 17:37:35 +02:00
|
|
|
|
public List<Player> players;
|
2025-09-17 21:48:38 +02:00
|
|
|
|
public int currentPlayer = -1;
|
2025-09-18 03:24:40 +02:00
|
|
|
|
public Node pressedNode = null;
|
2025-09-17 21:48:38 +02:00
|
|
|
|
|
2025-09-16 18:19:40 +02:00
|
|
|
|
public static GameManager Instance { get; private set; }
|
2025-09-16 01:16:02 +02:00
|
|
|
|
|
2025-09-16 19:49:18 +02:00
|
|
|
|
public bool regenerateOnChange = false;
|
|
|
|
|
|
|
2025-09-17 17:05:48 +02:00
|
|
|
|
[HideInInspector] public float minConnectionLength = 6;
|
2025-09-16 16:50:21 +02:00
|
|
|
|
[HideInInspector] public float maxConnectionLength = 6;
|
|
|
|
|
|
[HideInInspector] public int nodeCount = 100;
|
2025-09-16 17:40:34 +02:00
|
|
|
|
[HideInInspector] public int hoverRadiusCon = 50;
|
|
|
|
|
|
[HideInInspector] public int hoverRadiusNode = 50;
|
2025-09-17 10:12:15 +02:00
|
|
|
|
[HideInInspector] public int selectedLevel = -1;
|
2025-09-16 00:08:50 +02:00
|
|
|
|
|
2025-09-17 10:12:15 +02:00
|
|
|
|
[SerializeField] [HideInInspector] public List<LevelData> levels = new List<LevelData>();
|
2025-09-16 10:45:09 +02:00
|
|
|
|
|
2025-09-18 03:24:40 +02:00
|
|
|
|
public enum ActionType { MOVE_UNITS, DESTRUCT_CON, EXPLODE_CON };
|
|
|
|
|
|
|
|
|
|
|
|
public struct Action
|
|
|
|
|
|
{
|
|
|
|
|
|
public ActionType type;
|
|
|
|
|
|
public int nodeFromId;
|
|
|
|
|
|
public int nodeToId;
|
2025-09-18 17:37:35 +02:00
|
|
|
|
public int amount;
|
2025-09-18 03:24:40 +02:00
|
|
|
|
public int player;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-17 15:43:26 +02:00
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class LevelData
|
|
|
|
|
|
{
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class NodeData
|
|
|
|
|
|
{
|
|
|
|
|
|
public Vector3 position;
|
|
|
|
|
|
public int owner;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class ConnectionData
|
|
|
|
|
|
{
|
|
|
|
|
|
public int nodeAIndex;
|
|
|
|
|
|
public int nodeBIndex;
|
|
|
|
|
|
public bool allowed = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-17 17:05:48 +02:00
|
|
|
|
public float minConnectionLength = 0;
|
2025-09-17 15:43:26 +02:00
|
|
|
|
public float maxConnectionLength = 0;
|
|
|
|
|
|
public List<NodeData> nodes = new List<NodeData>();
|
|
|
|
|
|
public List<ConnectionData> connections = new List<ConnectionData>();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-16 18:19:40 +02:00
|
|
|
|
void Awake()
|
2025-09-16 17:40:34 +02:00
|
|
|
|
{
|
|
|
|
|
|
if (Instance != null && Instance != this)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Application.isPlaying)
|
|
|
|
|
|
Destroy(gameObject);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Instance = this;
|
|
|
|
|
|
if (Application.isPlaying)
|
|
|
|
|
|
DontDestroyOnLoad(gameObject);
|
|
|
|
|
|
|
2025-09-17 17:26:16 +02:00
|
|
|
|
|
2025-09-17 23:38:11 +02:00
|
|
|
|
GetConnections().ForEach(obj => obj.DelConnect());
|
|
|
|
|
|
GetConnections().ForEach(obj => obj.SetConnect());
|
2025-09-17 17:26:16 +02:00
|
|
|
|
|
2025-09-16 17:40:34 +02:00
|
|
|
|
}
|
2025-09-16 16:50:21 +02:00
|
|
|
|
|
2025-09-17 21:48:38 +02:00
|
|
|
|
private void Update()
|
|
|
|
|
|
{
|
2025-09-18 03:24:40 +02:00
|
|
|
|
if (Input.GetMouseButtonDown(0))
|
|
|
|
|
|
{
|
|
|
|
|
|
pressedNode = GetNodes().Find(n => n.hovered && n.Owner == currentPlayer);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (Input.GetMouseButtonUp(0))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pressedNode != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
Node toNode = GetNodes().Find(n => n.hovered && pressedNode != n);
|
|
|
|
|
|
|
|
|
|
|
|
if (toNode)
|
|
|
|
|
|
{
|
|
|
|
|
|
Connection con = Instance.GetConnections().Find(c => (c.nodeA == pressedNode && c.nodeB == toNode) || (c.nodeB == pressedNode && c.nodeA == toNode));
|
|
|
|
|
|
if (con)
|
|
|
|
|
|
{
|
|
|
|
|
|
var action = new Action { nodeFromId = pressedNode.id, nodeToId = toNode.id, type = ActionType.MOVE_UNITS, player = Instance.currentPlayer };
|
|
|
|
|
|
Instance.ExecuteAction(action);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-17 23:38:11 +02:00
|
|
|
|
}
|
2025-09-17 21:48:38 +02:00
|
|
|
|
|
2025-09-17 23:38:11 +02:00
|
|
|
|
public List<Node> GetNodes() => NodeParent.GetComponentsInChildren<Node>().ToList();
|
2025-09-18 17:37:35 +02:00
|
|
|
|
public List<Connection> GetConnections() => ConnectionParent != null ? ConnectionParent.GetComponentsInChildren<Connection>()?.ToList() ?? new() : new();
|
2025-09-17 21:48:38 +02:00
|
|
|
|
|
2025-09-18 03:24:40 +02:00
|
|
|
|
public void ExecuteRoundEnd()
|
2025-09-17 23:38:11 +02:00
|
|
|
|
{
|
2025-09-18 03:24:40 +02:00
|
|
|
|
foreach(Connection con in GetConnections())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (con.state == Connection.BuildState.CONSTRUCTING)
|
|
|
|
|
|
con.state = Connection.BuildState.BUILT;
|
|
|
|
|
|
else if (con.state == Connection.BuildState.DECONSTRUCTING)
|
|
|
|
|
|
con.state = Connection.BuildState.EMPTY;
|
|
|
|
|
|
}
|
2025-09-17 21:48:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-18 03:24:40 +02:00
|
|
|
|
public void ExecuteAction(Action action)
|
|
|
|
|
|
{
|
|
|
|
|
|
Node nodeTo = GetNodes().Find(n => n.id == action.nodeToId);
|
|
|
|
|
|
Node nodeFrom = GetNodes().Find(n => n.id == action.nodeFromId);
|
|
|
|
|
|
Connection con = GetConnections().Find(c => (c.nodeA == nodeTo && c.nodeB == nodeFrom) || (c.nodeA == nodeFrom && c.nodeB == nodeTo));
|
2025-09-18 17:37:35 +02:00
|
|
|
|
Player p = players.Find(p => (p.id == action.player));
|
2025-09-18 03:24:40 +02:00
|
|
|
|
|
|
|
|
|
|
bool hostile = nodeTo.Owner != action.player;
|
|
|
|
|
|
|
|
|
|
|
|
switch (action.type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case ActionType.MOVE_UNITS:
|
2025-09-18 17:37:35 +02:00
|
|
|
|
if (p.energy < 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("Not enough energy");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
p.energy -= 1;
|
2025-09-18 03:24:40 +02:00
|
|
|
|
switch (con.state)
|
|
|
|
|
|
{
|
|
|
|
|
|
case Connection.BuildState.EMPTY:
|
|
|
|
|
|
// Build Connection
|
2025-09-18 17:37:35 +02:00
|
|
|
|
|
2025-09-18 03:24:40 +02:00
|
|
|
|
con.state = Connection.BuildState.CONSTRUCTING;
|
|
|
|
|
|
Debug.Log("Starting construction from " + nodeTo.id + " to " + nodeFrom.id);
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
case Connection.BuildState.CONSTRUCTING:
|
|
|
|
|
|
if (hostile)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("Attacking hostile construction from " + nodeTo.id + " to " + nodeFrom.id);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("This should not be possible O_o");
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
case Connection.BuildState.DECONSTRUCTING:
|
|
|
|
|
|
if (hostile)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("Attacking hostile construction from " + nodeTo.id + " to " + nodeFrom.id);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("This should not be possible O_o");
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
case Connection.BuildState.BUILT:
|
|
|
|
|
|
if (hostile)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("Attacking hostile units at " + nodeFrom.id);
|
2025-09-18 17:37:35 +02:00
|
|
|
|
int actualAmount = action.amount + Math.Min(0, nodeFrom.Units - action.amount);
|
|
|
|
|
|
nodeFrom.Units -= actualAmount;
|
|
|
|
|
|
var unitDiff = actualAmount - nodeFrom.Units;
|
|
|
|
|
|
nodeTo.Units -= actualAmount;
|
|
|
|
|
|
if (unitDiff == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
nodeTo.Owner = -1;
|
|
|
|
|
|
} else if (unitDiff > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
nodeTo.Owner = p.id;
|
|
|
|
|
|
}
|
2025-09-18 03:24:40 +02:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("Moving units from " + nodeTo.id + " to " + nodeFrom.id);
|
2025-09-18 17:37:35 +02:00
|
|
|
|
int actualAmount = action.amount + Math.Min(0, nodeFrom.Units - action.amount);
|
|
|
|
|
|
nodeFrom.Units -= actualAmount;
|
|
|
|
|
|
nodeTo.Units += actualAmount;
|
2025-09-18 03:24:40 +02:00
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case ActionType.DESTRUCT_CON:
|
|
|
|
|
|
if (!hostile)
|
|
|
|
|
|
{
|
2025-09-18 17:37:35 +02:00
|
|
|
|
if (p.energy < 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("Not enough energy");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
p.energy -= 1;
|
2025-09-18 03:24:40 +02:00
|
|
|
|
Debug.Log("Starten deconstruction from " + nodeTo.id + " to " + nodeFrom.id);
|
|
|
|
|
|
con.state = Connection.BuildState.DECONSTRUCTING;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("This should not be possible O_o");
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
case ActionType.EXPLODE_CON:
|
2025-09-18 17:37:35 +02:00
|
|
|
|
if (p.energy < 2)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("Not enough energy");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
p.energy -= 2;
|
2025-09-18 03:24:40 +02:00
|
|
|
|
Debug.Log("Exploding connection from " + nodeTo.id + " to " + nodeFrom.id);
|
|
|
|
|
|
con.state = Connection.BuildState.EMPTY;
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-09-16 01:16:02 +02:00
|
|
|
|
public void GenerateAlongSphere()
|
2025-09-16 00:08:50 +02:00
|
|
|
|
{
|
2025-09-16 01:16:02 +02:00
|
|
|
|
for (int i = NodeParent.childCount - 1; i >= 0; i--)
|
|
|
|
|
|
DestroyImmediate(NodeParent.GetChild(i).gameObject);
|
2025-09-16 00:08:50 +02:00
|
|
|
|
|
|
|
|
|
|
float radius = 20f;
|
|
|
|
|
|
float goldenRatio = (1f + Mathf.Sqrt(5f)) / 2f;
|
|
|
|
|
|
float angleIncrement = 2f * Mathf.PI * goldenRatio;
|
|
|
|
|
|
|
2025-09-16 01:16:02 +02:00
|
|
|
|
for (int i = 0; i < nodeCount; i++)
|
2025-09-16 00:08:50 +02:00
|
|
|
|
{
|
2025-09-16 01:16:02 +02:00
|
|
|
|
float t = (float)i / nodeCount; // von 0 bis 1
|
2025-09-16 00:08:50 +02:00
|
|
|
|
float inclination = Mathf.Acos(1f - 2f * t);
|
|
|
|
|
|
float azimuth = angleIncrement * i;
|
|
|
|
|
|
|
|
|
|
|
|
float x = Mathf.Sin(inclination) * Mathf.Cos(azimuth);
|
|
|
|
|
|
float y = Mathf.Sin(inclination) * Mathf.Sin(azimuth);
|
|
|
|
|
|
float z = Mathf.Cos(inclination);
|
|
|
|
|
|
|
|
|
|
|
|
Vector3 pos = new Vector3(x, y, z) * radius;
|
|
|
|
|
|
|
2025-09-16 14:20:19 +02:00
|
|
|
|
var auto = PrefabUtility.InstantiatePrefab(NodePrefab, NodeParent) as GameObject;
|
2025-09-17 23:38:11 +02:00
|
|
|
|
auto.GetComponent<Node>().id = i;
|
2025-09-16 00:08:50 +02:00
|
|
|
|
auto.transform.localPosition = pos;
|
|
|
|
|
|
}
|
2025-09-16 01:16:02 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void GenerateConnections()
|
2025-09-16 00:08:50 +02:00
|
|
|
|
{
|
2025-09-17 23:38:11 +02:00
|
|
|
|
for (int i = ConnectionParent.childCount - 1; i >= 0; i--)
|
|
|
|
|
|
DestroyImmediate(ConnectionParent.GetChild(i).gameObject);
|
2025-09-16 16:50:21 +02:00
|
|
|
|
|
2025-09-17 23:38:11 +02:00
|
|
|
|
var nodes = GetNodes();
|
2025-09-16 16:50:21 +02:00
|
|
|
|
|
2025-09-16 01:16:02 +02:00
|
|
|
|
foreach (Node nodeA in nodes)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nodeA == null) continue;
|
|
|
|
|
|
foreach (Node nodeB in nodes)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (nodeB == null) continue;
|
|
|
|
|
|
bool conExists = false;
|
2025-09-17 17:05:48 +02:00
|
|
|
|
float dist = Vector3.Distance(nodeA.transform.position, nodeB.transform.position);
|
|
|
|
|
|
if (nodeA == nodeB || dist > maxConnectionLength)
|
2025-09-16 01:16:02 +02:00
|
|
|
|
continue;
|
|
|
|
|
|
|
2025-09-17 23:38:11 +02:00
|
|
|
|
foreach (Connection con in GetConnections())
|
2025-09-16 01:16:02 +02:00
|
|
|
|
{
|
|
|
|
|
|
if ((con.nodeA == nodeA && con.nodeB == nodeB) || (con.nodeA == nodeB && con.nodeB == nodeA))
|
|
|
|
|
|
{
|
|
|
|
|
|
conExists = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!conExists)
|
2025-09-16 14:20:19 +02:00
|
|
|
|
{
|
2025-09-17 17:05:48 +02:00
|
|
|
|
AddConnection(nodeA, nodeB, dist < minConnectionLength);
|
2025-09-16 14:20:19 +02:00
|
|
|
|
}
|
2025-09-16 01:16:02 +02:00
|
|
|
|
}
|
2025-09-16 14:20:19 +02:00
|
|
|
|
|
2025-09-16 00:08:50 +02:00
|
|
|
|
}
|
2025-09-16 01:16:02 +02:00
|
|
|
|
}
|
2025-09-16 13:04:05 +02:00
|
|
|
|
|
2025-09-17 15:43:26 +02:00
|
|
|
|
public void AddConnection(Node nodeA, Node nodeB, bool allowed = true)
|
|
|
|
|
|
{
|
2025-09-17 23:38:11 +02:00
|
|
|
|
var newCon = PrefabUtility.InstantiatePrefab(ConnectionPrefab, ConnectionParent).GetComponent<Connection>();
|
|
|
|
|
|
newCon.nodeA = nodeA;
|
|
|
|
|
|
newCon.nodeB = nodeB;
|
|
|
|
|
|
newCon.allowed = allowed;
|
2025-09-17 15:43:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-17 10:12:15 +02:00
|
|
|
|
public void LoadLevelData(int index)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(index >= levels.Count)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.LogWarning("LevelIndex out of range");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = NodeParent.childCount - 1; i >= 0; i--)
|
|
|
|
|
|
DestroyImmediate(NodeParent.GetChild(i).gameObject);
|
|
|
|
|
|
|
|
|
|
|
|
foreach (LineRenderer line in ConnectionParent.GetComponentsInChildren<LineRenderer>())
|
|
|
|
|
|
DestroyImmediate(line.gameObject);
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-09-17 23:38:11 +02:00
|
|
|
|
for(int i = 0; i < levels[index].nodes.Count; i++)
|
2025-09-17 10:12:15 +02:00
|
|
|
|
{
|
2025-09-17 23:38:11 +02:00
|
|
|
|
var nodeData = levels[index].nodes[i];
|
2025-09-17 10:12:15 +02:00
|
|
|
|
var auto = PrefabUtility.InstantiatePrefab(NodePrefab, NodeParent) as GameObject;
|
|
|
|
|
|
auto.transform.localPosition = nodeData.position;
|
|
|
|
|
|
auto.GetComponent<Node>().Owner = nodeData.owner;
|
2025-09-17 23:38:11 +02:00
|
|
|
|
auto.GetComponent<Node>().id = i;
|
2025-09-17 10:12:15 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-17 23:38:11 +02:00
|
|
|
|
var currentNodes = GetNodes();
|
|
|
|
|
|
|
|
|
|
|
|
int idx = 0;
|
|
|
|
|
|
foreach (Node node in currentNodes)
|
|
|
|
|
|
node.id = idx++;
|
|
|
|
|
|
|
|
|
|
|
|
currentNodes = GetNodes();
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-09-17 10:12:15 +02:00
|
|
|
|
foreach (LevelData.ConnectionData conData in levels[index].connections)
|
|
|
|
|
|
{
|
2025-09-17 23:38:11 +02:00
|
|
|
|
AddConnection(currentNodes[conData.nodeAIndex], currentNodes[conData.nodeBIndex], conData.allowed);
|
|
|
|
|
|
Debug.Log(conData.nodeAIndex + " - " + conData.nodeBIndex);
|
2025-09-17 10:12:15 +02:00
|
|
|
|
}
|
|
|
|
|
|
selectedLevel = index;
|
2025-09-17 17:05:48 +02:00
|
|
|
|
minConnectionLength = levels[index].minConnectionLength;
|
2025-09-17 10:12:15 +02:00
|
|
|
|
maxConnectionLength = levels[index].maxConnectionLength;
|
2025-09-17 23:38:11 +02:00
|
|
|
|
nodeCount = currentNodes.Count;
|
2025-09-17 10:12:15 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void SaveLevelData(int index = -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
LevelData data = new LevelData();
|
|
|
|
|
|
|
2025-09-17 17:05:48 +02:00
|
|
|
|
data.minConnectionLength = minConnectionLength;
|
2025-09-17 10:12:15 +02:00
|
|
|
|
data.maxConnectionLength = maxConnectionLength;
|
|
|
|
|
|
|
|
|
|
|
|
// Nodes speichern
|
2025-09-17 23:38:11 +02:00
|
|
|
|
foreach (var node in GetNodes())
|
2025-09-17 10:12:15 +02:00
|
|
|
|
{
|
|
|
|
|
|
data.nodes.Add(new LevelData.NodeData
|
|
|
|
|
|
{
|
|
|
|
|
|
position = node.transform.localPosition,
|
|
|
|
|
|
owner = node.Owner
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Connections speichern
|
2025-09-17 23:38:11 +02:00
|
|
|
|
foreach (var con in GetConnections())
|
2025-09-17 10:12:15 +02:00
|
|
|
|
{
|
2025-09-17 23:38:11 +02:00
|
|
|
|
if (con.nodeA.id >= 0 && con.nodeB.id >= 0)
|
2025-09-17 10:12:15 +02:00
|
|
|
|
{
|
|
|
|
|
|
data.connections.Add(new LevelData.ConnectionData
|
|
|
|
|
|
{
|
2025-09-17 23:38:11 +02:00
|
|
|
|
nodeAIndex = con.nodeA.id,
|
|
|
|
|
|
nodeBIndex = con.nodeB.id,
|
2025-09-17 10:12:15 +02:00
|
|
|
|
allowed = con.allowed
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (index == -1 || index >= levels.Count)
|
|
|
|
|
|
levels.Add(data);
|
|
|
|
|
|
else
|
|
|
|
|
|
levels[index] = data;
|
|
|
|
|
|
|
|
|
|
|
|
int newIndex = index < 0 ? levels.Count - 1 : index;
|
|
|
|
|
|
selectedLevel = newIndex;
|
|
|
|
|
|
}
|
2025-09-16 14:20:19 +02:00
|
|
|
|
}
|