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)); }
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); }
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); }
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); }
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; } }
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); }
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); }
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); }
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)); }
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; }
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; }
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); } }
public void ResetGeneratorConfig(ResourceDefinition resource) { resources[resource.Resource] = Kethane.ResourceData.Load(resource, new ConfigNode()); }
internal void ResetBodyData(ResourceDefinition resource, CelestialBody body) { var resourceName = resource.Resource; PlanetDeposits[resourceName][body.name] = generators[resourceName].Load(body, null); }
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; }
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; }
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); }
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; } } }