void UpdateNodesInteractivity(MissionRouteMapNode changedNode) { // toggle has been enabled if (changedNode.toggle.isOn) { // disable all, except connected nodes, which are not already in route allNodes.ForEach(node => node.toggle.interactable = changedNode.connections.Exists(seg => seg.zone == node.zone) && !setUpPath.Exists(seg => seg.zone == node.zone)); // enable self for untoggle possibility changedNode.toggle.interactable = true; } else { if (setUpPath.NotNullOrEmpty()) { var lastRouteNode = allNodes.Find(node => setUpPath.Last().zone == node.zone); // disable all, except connected for last node, which are not already in route allNodes.ForEach(node => node.toggle.interactable = lastRouteNode.connections.Exists(seg => seg.zone == node.zone) && !setUpPath.Exists(seg => seg.zone == node.zone)); // enable self for untoggle possibility lastRouteNode.toggle.interactable = true; } else { // disable all but starting Nodes allNodes.ForEach(node => node.toggle.interactable = false); startingNodes.ForEach(node => node.toggle.interactable = true); } } }
void OnNodeToggle(MissionRouteMapNode changedNode) { if (changedNode.toggle.isOn) { setUpPath.Add(new MissionRouteSegment(changedNode.zone, PathLength(changedNode))); } else { setUpPath.Remove(setUpPath.Last()); } UpdateNodesInteractivity(changedNode); }
int PathLength(MissionRouteMapNode changedNode) => setUpPath.Any() ? changedNode.connections.Find(node => setUpPath.Last().zone == node.zone).length : 0;