Пример #1
0
 private static void loadResourceDefinitions()
 {
     if (resourceDefinitions != null) { return; }
     resourceDefinitions = new SortedDictionary<String, ResourceDefinition>();
     foreach (var definitionNode in GameDatabase.Instance.GetConfigNodes("KethaneResource"))
     {
         try
         {
             var definition = new ResourceDefinition(definitionNode);
             if (!PartResourceLibrary.Instance.resourceDefinitions.Contains(definition.Resource))
             {
                 Debug.LogWarning(String.Format("[Kethane] {0} is an unknown resource, ignoring", definition.Resource));
             }
             else if (!resourceDefinitions.ContainsKey(definition.Resource))
             {
                 resourceDefinitions[definition.Resource] = definition;
             }
             else
             {
                 Debug.LogWarning(String.Format("[Kethane] Duplicate definition for {0}, ignoring", definition.Resource));
             }
         }
         catch (Exception e)
         {
             Debug.LogError(String.Format("[Kethane] Error loading resource definition:\n\n{0}", e));
         }
     }
     Debug.Log(String.Format("[Kethane] Loaded {0} resource definitions", resourceDefinitions.Count));
 }
Пример #2
0
        private static Color32 getDepositColor(ResourceDefinition definition, IBodyResources bodyResources, ICellResource deposit)
        {
            Color32 color;

            if (deposit != null)
            {
                var ratio = (float)(deposit.Quantity / bodyResources.MaxQuantity);
                color = (Color32)(definition.ColorFull * ratio + definition.ColorEmpty * (1 - ratio));
            }
            else
            {
                color = colorEmpty;
            }
            return(color);
        }
Пример #3
0
        private static Color32 getDepositColor(ResourceDefinition definition, Deposit deposit)
        {
            Color32 color;

            if (deposit != null)
            {
                var ratio = (deposit.Quantity / definition.MaxQuantity);
                color = (Color32)(definition.ColorFull * ratio + definition.ColorEmpty * (1 - ratio));
            }
            else
            {
                color = colorEmpty;
            }
            return(color);
        }
Пример #4
0
        public static Deposit Generate(Vector2 Pos, float radius, System.Random random, ResourceDefinition resource)
        {
            var initialQuantity = random.Range(resource.MinQuantity, resource.MaxQuantity);

            var vertices = new List<Point>();
            int vertexCount = random.Next(resource.MinVertices, resource.MaxVertices);
            for (int i = 0; i < vertexCount; i++)
            {
                float randomRadius = random.Range(resource.RadiusVariance * radius, radius);
                float angle = 2.0f * (float)Math.PI * ((float)i / (float)vertexCount);
                float x = Pos.x + randomRadius * (float)Math.Cos(angle);
                float z = Pos.y - randomRadius * (float)Math.Sin(angle);

                vertices.Add(new Point(x, z));
            }
            var Shape = new Polygon(vertices.ToArray());

            return new Deposit(Shape, initialQuantity, initialQuantity);
        }
Пример #5
0
        private void updateMapView()
        {
            if (!MapView.MapIsEnabled || !showOverlay || MapView.MapCamera == null)
            {
                gameObject.renderer.enabled = false;
                return;
            }

            gameObject.renderer.enabled = true;

            var target = MapView.MapCamera.target;

            var newBody     = getTargetBody(target);
            var bodyChanged = newBody != body;

            if (bodyChanged)
            {
                body = newBody;
                var radius = bodyRadii.ContainsKey(body) ? bodyRadii[body] : 1.025;
                gameObject.transform.parent        = ScaledSpace.Instance.scaledSpaceTransforms.Single(t => t.name == body.name);
                gameObject.transform.localScale    = Vector3.one * 1000f * (float)radius;
                gameObject.transform.localPosition = Vector3.zero;
                gameObject.transform.localRotation = Quaternion.identity;
            }

            if (bodyChanged || resource == null || resource.Resource != KethaneController.SelectedResource)
            {
                resource = KethaneController.ResourceDefinitions.Where(r => r.Resource == KethaneController.SelectedResource).Single().ForBody(body);
                refreshCellColors();
            }

            var        ray = MapView.MapCamera.camera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;

            if (gridCollider.Raycast(ray, out hitInfo, float.PositiveInfinity))
            {
                hoverCell = grid.NearestCell(gameObject.transform.InverseTransformPoint(hitInfo.point));
            }
            else
            {
                hoverCell = null;
            }
        }
Пример #6
0
        public static ResourceData Load(ResourceDefinition resource, ConfigNode resourceNode)
        {
            var bodyResources = new Dictionary<CelestialBody, BodyResourceData>();

            var generatorNode = resourceNode.GetNode("Generator") ?? resource.Generator;
            var generator = createGenerator(generatorNode.CreateCopy());
            if (generator == null)
            {
                Debug.LogWarning("[Kethane] Defaulting to empty generator for " + resource.Resource);
                generator = new EmptyResourceGenerator();
            }

            var bodyNodes = resourceNode.GetNodes("Body");

            foreach (var body in FlightGlobals.Bodies)
            {
                var bodyNode = bodyNodes.SingleOrDefault(n => n.GetValue("Name") == body.name);
                bodyResources[body] = BodyResourceData.Load(generator, body, bodyNode);
            }

            return new ResourceData(generator, generatorNode, bodyResources);
        }
Пример #7
0
        private void updateMapView()
        {
            if (!MapView.MapIsEnabled || !ShowOverlay || MapView.MapCamera == null || KethaneData.Current == null)
            {
                gameObject.renderer.enabled = false;
                return;
            }

            gameObject.renderer.enabled = true;

            var target = MapView.MapCamera.target;

            var newBody     = getTargetBody(target);
            var bodyChanged = newBody != body;

            if (bodyChanged)
            {
                body = newBody;

                refreshMesh();
                refreshCollider();

                var radius = bodyRadii.ContainsKey(body) ? bodyRadii[body] : 1.025;
                gameObject.transform.parent        = ScaledSpace.Instance.scaledSpaceTransforms.Single(t => t.name == body.name);
                gameObject.transform.localScale    = Vector3.one * 1000f * (float)radius;
                gameObject.transform.localPosition = Vector3.zero;
                gameObject.transform.localRotation = Quaternion.identity;
            }

            if (bodyChanged || resource == null || resource.Resource != KethaneController.SelectedResource)
            {
                resource = KethaneController.ResourceDefinitions.Where(r => r.Resource == KethaneController.SelectedResource).Single();
                refreshCellColors();
            }

            var ray = MapView.MapCamera.camera.ScreenPointToRay(Input.mousePosition);

            hoverCell = Cell.Raycast(ray, MapOverlay.GridLevel, bounds, heightAt, gameObject.transform);
        }
Пример #8
0
        private List <Deposit> generate(CelestialBody body, ResourceDefinition resource)
        {
            var random = new System.Random(depositSeed ^ (resource.Resource == "Kethane" ? bodySeeds[body.name] : 0) ^ resource.SeedModifier);

            var deposits = new List <Deposit>();

            for (int i = 0; i < resource.DepositCount; i++)
            {
                float R = random.Range(resource.MinRadius, resource.MaxRadius);
                for (int j = 0; j < resource.NumberOfTries; j++)
                {
                    Vector2 Pos     = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R));
                    var     deposit = Deposit.Generate(Pos, R, random, resource);
                    if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y)))))
                    {
                        deposits.Add(deposit);
                        break;
                    }
                }
            }

            return(deposits);
        }
Пример #9
0
        public static ResourceData Load(ResourceDefinition resource, ConfigNode resourceNode)
        {
            var bodyResources = new Dictionary <CelestialBody, BodyResourceData>();

            var generatorNode = resourceNode.GetNode("Generator") ?? resource.Generator;
            var generator     = createGenerator(generatorNode.CreateCopy());

            if (generator == null)
            {
                Debug.LogWarning("[Kethane] Defaulting to empty generator for " + resource.Resource);
                generator = new EmptyResourceGenerator();
            }

            var bodyNodes = resourceNode.GetNodes("Body");

            foreach (var body in FlightGlobals.Bodies)
            {
                var bodyNode = bodyNodes.SingleOrDefault(n => n.GetValue("Name") == body.name);
                bodyResources[body] = BodyResourceData.Load(generator, body, bodyNode);
            }

            return(new ResourceData(generator, generatorNode, bodyResources));
        }
Пример #10
0
        private void updateMapView()
        {
            if (!MapView.MapIsEnabled || !ShowOverlay || MapView.MapCamera == null || KethaneData.Current == null)
            {
                gameObject.renderer.enabled = false;
                return;
            }

            gameObject.renderer.enabled = true;

            var target = MapView.MapCamera.target;

            var newBody = getTargetBody(target);
            var bodyChanged = newBody != body;
            if (bodyChanged)
            {
                body = newBody;

                refreshMesh();
                refreshCollider();

                var radius = bodyRadii.ContainsKey(body) ? bodyRadii[body] : 1.025;
                gameObject.transform.parent = ScaledSpace.Instance.scaledSpaceTransforms.Single(t => t.name == body.name);
                gameObject.transform.localScale = Vector3.one * 1000f * (float)radius;
                gameObject.transform.localPosition = Vector3.zero;
                gameObject.transform.localRotation = Quaternion.identity;
            }

            if (bodyChanged || resource == null || resource.Resource != KethaneController.SelectedResource)
            {
                resource = KethaneController.ResourceDefinitions.Where(r => r.Resource == KethaneController.SelectedResource).Single();
                refreshCellColors();
            }

            var ray = MapView.MapCamera.camera.ScreenPointToRay(Input.mousePosition);
            hoverCell = Cell.Raycast(ray, MapOverlay.GridLevel, bounds, heightAt, gameObject.transform);
        }
Пример #11
0
        private static List<Deposit> generate(CelestialBody body, int seed, ResourceDefinition resource)
        {
            var random = new System.Random(depositSeed ^ (resource.Resource == "Kethane" ? bodySeeds[body.name] : 0) ^ resource.SeedModifier);

            var deposits = new List<Deposit>();

            for (int i = 0; i < resource.DepositCount; i++)
            {
                float R = random.Range(resource.MinRadius, resource.MaxRadius);
                for (int j = 0; j < resource.NumberOfTries; j++)
                {
                    Vector2 Pos = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R));
                    var deposit = Deposit.Generate(Pos, R, random, resource);
                    if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y)))))
                    {
                        deposits.Add(deposit);
                        break;
                    }
                }
            }

            return deposits;
        }
Пример #12
0
 private static Color32 getDepositColor(ResourceDefinition definition, IBodyResources bodyResources, ICellResource deposit)
 {
     Color32 color;
     if (deposit != null)
     {
         var ratio = (float)(deposit.Quantity / bodyResources.MaxQuantity);
         color = (Color32)(definition.ColorFull * ratio + definition.ColorEmpty * (1 - ratio));
     }
     else
     {
         color = colorEmpty;
     }
     return color;
 }
Пример #13
0
 internal void ResetGeneratorConfig(ResourceDefinition resource)
 {
     var resourceName = resource.Resource;
     generatorNodes[resourceName] = resource.Generator;
     generators[resourceName] = createGenerator(generatorNodes[resourceName].CreateCopy());
     foreach (var body in FlightGlobals.Bodies)
     {
         ResetBodyData(resource, body);
     }
 }
Пример #14
0
 public void ResetGeneratorConfig(ResourceDefinition resource)
 {
     resources[resource.Resource] = Kethane.ResourceData.Load(resource, new ConfigNode());
 }
Пример #15
0
 internal void ResetBodyData(ResourceDefinition resource, CelestialBody body)
 {
     var resourceName = resource.Resource;
     PlanetDeposits[resourceName][body.name] = generators[resourceName].Load(body, null);
 }
Пример #16
0
        internal void ResetBodyData(ResourceDefinition resource, CelestialBody body)
        {
            var resourceName = resource.Resource;

            PlanetDeposits[resourceName][body.name] = generators[resourceName].Load(body, null);
        }
Пример #17
0
 private static Color32 getDepositColor(ResourceDefinition definition, Deposit deposit)
 {
     Color32 color;
     if (deposit != null)
     {
         var ratio = (deposit.Quantity / definition.MaxQuantity);
         color = (Color32)(definition.ColorFull * ratio + definition.ColorEmpty * (1 - ratio));
     }
     else
     {
         color = colorEmpty;
     }
     return color;
 }
Пример #18
0
        public void Update()
        {
            if (HighLogic.LoadedScene != GameScenes.FLIGHT && HighLogic.LoadedScene != GameScenes.TRACKSTATION)
            {
                return;
            }

            if (!MapView.MapIsEnabled || !showOverlay || MapView.MapCamera == null)
            {
                gameObject.renderer.enabled = false;
                return;
            }

            gameObject.renderer.enabled = true;

            var target = MapView.fetch.mapCamera.target;

            var newBody = getTargetBody(target);
            var bodyChanged = newBody != body;
            if (bodyChanged)
            {
                body = newBody;
                var radius = bodyRadii.ContainsKey(body) ? bodyRadii[body] : 1.025;
                gameObject.transform.localScale = Vector3.one * (float)(radius * body.Radius / ScaledSpace.ScaleFactor);
            }

            if (bodyChanged || resource.Resource != KethaneController.SelectedResource)
            {
                resource = KethaneController.ResourceDefinitions.Where(r => r.Resource == KethaneController.SelectedResource).Single().ForBody(body);
                refreshCellColors();
            }

            var ray = MapView.MapCamera.camera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            if (gridCollider.Raycast(ray, out hitInfo, float.PositiveInfinity))
            {
                hoverCell = grid.NearestCell(gameObject.transform.InverseTransformPoint(hitInfo.point));
            }
            else
            {
                hoverCell = null;
            }

            gameObject.transform.position = ScaledSpace.LocalToScaledSpace(body.position);
            gameObject.transform.rotation = body.rotation;
        }
Пример #19
0
        public static Deposit Generate(Vector2 Pos, float radius, System.Random random, ResourceDefinition resource)
        {
            var initialQuantity = random.Range(resource.MinQuantity, resource.MaxQuantity);

            var vertices = new List<Vector2>();
            int vertexCount = random.Next(resource.MinVertices, resource.MaxVertices);
            for (int i = 0; i < vertexCount; i++)
            {
                float randomRadius = random.Range(resource.RadiusVariance * radius, radius);
                float angle = 2.0f * (float)Math.PI * ((float)i / (float)vertexCount);
                float x = Pos.x + randomRadius * (float)Math.Cos(angle);
                float z = Pos.y - randomRadius * (float)Math.Sin(angle);

                vertices.Add(new Vector2(x, z));
            }
            var Shape = new Polygon(vertices.ToArray());

            return new Deposit(Shape, initialQuantity, initialQuantity);
        }
Пример #20
0
 public void ResetGeneratorConfig(ResourceDefinition resource)
 {
     resources[resource.Resource] = Kethane.ResourceData.Load(resource, new ConfigNode());
 }
Пример #21
0
        public void Start()
        {
            Instance = this;

            setUpMesh();

            if (HighLogic.LoadedScene == GameScenes.LOADING || HighLogic.LoadedScene == GameScenes.MAINMENU)
            {
                var objects = GameObject.FindSceneObjectsOfType(typeof(GameObject));
                if (objects.Any(o => o.name == "LoadingBuffer")) { return; }
                var kerbin = objects.OfType<GameObject>().Where(b => b.name == "Kerbin").SingleOrDefault();

                if (kerbin == null)
                {
                    Debug.LogWarning("[Kethane] Couldn't find Kerbin!");
                    return;
                }

                gameObject.layer = kerbin.layer;
                gameObject.transform.parent = kerbin.transform;
                gameObject.transform.localPosition = Vector3.zero;
                gameObject.transform.localRotation = Quaternion.identity;
                gameObject.transform.localScale = Vector3.one * 1020;

                gameObject.renderer.enabled = true;

                var random = new System.Random();
                var colors = new Color32[mesh.vertexCount];

                foreach (var cell in grid)
                {
                    var rand = random.Next(100);
                    Color32 color;
                    if (rand < 16)
                    {
                        color = rand < 4 ? new Color32(21, 176, 26, 255) : colorEmpty;
                        foreach (var neighbor in cell.Neighbors)
                        {
                            if (random.Next(2) < 1)
                            {
                                setCellColor(neighbor, color, colors);
                            }
                        }
                    }
                    else
                    {
                        color = colorUnknown;
                    }

                    setCellColor(cell, color, colors);
                }

                mesh.colors32 = colors;

                return;
            }

            KethaneController.LoadKethaneDeposits();
            resource = KethaneController.ResourceDefinitions.Where(d => d.Resource == "Kethane").Single();

            gameObject.layer = 10;
            ScaledSpace.AddScaledSpaceTransform(gameObject.transform);

            var node = ConfigNode.Load(KSPUtil.ApplicationRootPath + "GameData/Kethane/Grid.cfg");
            if (node == null) { return; }
            foreach (var body in FlightGlobals.Bodies)
            {
                double result;
                if (double.TryParse(node.GetValue(body.name), out result))
                {
                    bodyRadii[body] = result;
                }
            }
        }