-
Notifications
You must be signed in to change notification settings - Fork 32
/
ResourceData.cs
106 lines (89 loc) · 3.83 KB
/
ResourceData.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace Kethane
{
public class ResourceData
{
private IResourceGenerator generator;
private ConfigNode generatorNode;
private Dictionary<CelestialBody, BodyResourceData> bodies = new Dictionary<CelestialBody, BodyResourceData>();
protected ResourceData(IResourceGenerator generator, ConfigNode generatorNode, IDictionary<CelestialBody, BodyResourceData> bodies)
{
this.generator = generator;
this.generatorNode = generatorNode;
this.bodies = new Dictionary<CelestialBody, BodyResourceData>(bodies);
}
public BodyResourceData this[CelestialBody body]
{
get { return bodies[body]; }
}
public void ResetBodyData(CelestialBody body)
{
bodies[body] = BodyResourceData.Load(generator, body, 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) ?? new ConfigNode();
bodyResources[body] = BodyResourceData.Load(generator, body, bodyNode);
}
return new ResourceData(generator, generatorNode, bodyResources);
}
public void Save(ConfigNode resourceNode)
{
resourceNode.AddNode(generatorNode);
foreach (var body in bodies)
{
var bodyNode = new ConfigNode("Body");
bodyNode.AddValue("Name", body.Key.name);
body.Value.Save(bodyNode);
resourceNode.AddNode(bodyNode);
}
}
private static IResourceGenerator createGenerator(ConfigNode generatorNode)
{
var name = generatorNode.GetValue("name");
if (name == null) { Debug.LogError("[Kethane] Could not find generator name"); return null; }
System.Reflection.ConstructorInfo constructor = null;
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
try
{
constructor = assembly.GetTypes()
.Where(t => t.Name == name)
.Where(t => t.GetInterfaces().Contains(typeof(IResourceGenerator)))
.Select(t => t.GetConstructor(new Type[] { typeof(ConfigNode) }))
.FirstOrDefault(c => c != null);
if (constructor != null) { break; }
}
catch (Exception e)
{
Debug.LogWarning("[Kethane] Error inspecting assembly '" + assembly.GetName().Name + "': \n" + e);
}
}
if (constructor == null) { Debug.LogError("[Kethane] Could not find appropriate constructor for " + name); return null; }
try
{
return (IResourceGenerator)constructor.Invoke(new object[] { generatorNode });
}
catch (Exception e)
{
Debug.LogError("[Kethane] Could not instantiate " + name + ":\n" + e);
return null;
}
}
}
}