OSDN Git Service

b74689f1b884d5566df8cf2131f26365e95b5be8
[automap/automap.git] / Automap / Subsystems / JsonGenerator.cs
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Linq;
5 using System.Reflection;
6 using System.Text;
7 using System.Text.RegularExpressions;
8
9 using Newtonsoft.Json;
10
11 using Vintagestory.API.Client;
12 using Vintagestory.API.Common;
13 using Vintagestory.API.Config;
14 using Vintagestory.API.Datastructures;
15 using Vintagestory.API.MathTools;
16 using Vintagestory.Common;
17
18
19
20 namespace Automap
21 {
22         public class JsonGenerator
23         {
24                 private ICoreClientAPI ClientAPI { get; set; }
25                 private ILogger Logger { get; set; }
26                 private string path { get; set; }
27                 private readonly int chunkSize;
28
29
30                 public JsonGenerator(ICoreClientAPI _ClientAPI,  ILogger _Logger, string _path )
31                 {
32                 this.ClientAPI = _ClientAPI;
33                 this.Logger = _Logger;
34                 this.path = _path;
35                 this.chunkSize = ClientAPI.World.BlockAccessor.ChunkSize;
36                 }
37
38
39                 /// <summary>
40                 /// Generates the JSON Metadata. (in Map object format )
41                 /// </summary>
42                 public void GenerateJSONMetadata(ColumnsMetadata chunkTopMetadata, Vec2i startChunkColumn, PointsOfInterest POIs, EntitiesOfInterest EOIs, Dictionary<int, string> RockIdCodes )
43                 {
44                 string jsonFilename = Path.Combine(path, "Metadata.js");
45
46                 StreamWriter stream = new StreamWriter(jsonFilename, false, Encoding.UTF8);
47
48                 using (stream) {
49                 JsonTextWriter jsonWriter = new JsonTextWriter(stream);
50
51                 jsonWriter.Formatting = Formatting.None;
52                 jsonWriter.StringEscapeHandling = StringEscapeHandling.EscapeHtml;
53                 jsonWriter.Indentation = 0;
54                 //jsonWriter.AutoCompleteOnClose = true;
55                 jsonWriter.QuoteChar = '\'';
56                 jsonWriter.DateFormatHandling = DateFormatHandling.IsoDateFormat;
57                 jsonWriter.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
58
59                 using (jsonWriter) {
60                 jsonWriter.WriteRaw("ViewFrame.chunks={};\n");
61                 jsonWriter.WriteRaw("ViewFrame.chunks.worldSeedNum=");
62                 jsonWriter.WriteValue(ClientAPI.World.Seed);
63                 jsonWriter.WriteRaw(";\n");
64
65                 jsonWriter.WriteRaw("ViewFrame.chunks.genTime=");
66                 jsonWriter.WriteValue(DateTimeOffset.UtcNow);
67                 jsonWriter.WriteRaw(";\n");
68
69                 jsonWriter.WriteRaw("ViewFrame.chunks.startCoords=");
70                 jsonWriter.WriteStartArray( );
71                 jsonWriter.WriteValue(startChunkColumn.X);
72                 jsonWriter.WriteValue(startChunkColumn.Y);
73                 jsonWriter.WriteEndArray( );
74                 jsonWriter.WriteRaw(";\n");
75
76                 jsonWriter.WriteRaw("ViewFrame.chunks.chunkSize=");
77                 jsonWriter.WriteValue(chunkSize);
78                 jsonWriter.WriteRaw(";\n");
79
80                 jsonWriter.WriteRaw("ViewFrame.chunks.northMostChunk=");
81                 jsonWriter.WriteValue(chunkTopMetadata.North_mostChunk);
82                 jsonWriter.WriteRaw(";\n");
83
84                 jsonWriter.WriteRaw("ViewFrame.chunks.southMostChunk=");
85                 jsonWriter.WriteValue(chunkTopMetadata.South_mostChunk);
86                 jsonWriter.WriteRaw(";\n");
87
88                 jsonWriter.WriteRaw("ViewFrame.chunks.westMostChunk=");
89                 jsonWriter.WriteValue(chunkTopMetadata.West_mostChunk);
90                 jsonWriter.WriteRaw(";\n");
91
92                 jsonWriter.WriteRaw("ViewFrame.chunks.eastMostChunk=");
93                 jsonWriter.WriteValue(chunkTopMetadata.East_mostChunk);
94                 jsonWriter.WriteRaw(";\n");
95
96
97                 //MAP object format - [key, value]: key is "x_y"
98                 jsonWriter.WriteRaw("ViewFrame.chunks.chunkMetadata=");
99                 jsonWriter.WriteStartConstructor("Map");
100                 jsonWriter.WriteStartArray( );//An array of... 2-component arrays
101
102
103                 foreach (var shard in chunkTopMetadata) {
104                 jsonWriter.WriteStartArray( );//Start tuple
105                 jsonWriter.WriteValue($"{shard.Location.X}_{shard.Location.Y}");//Key of Tuple
106
107                 jsonWriter.WriteStartObject( );
108                 jsonWriter.WritePropertyName("prettyCoord");
109                 jsonWriter.WriteValue(shard.Location.PrettyCoords(ClientAPI));
110
111                 jsonWriter.WritePropertyName("chunkAge");
112                 jsonWriter.WriteValue(shard.ChunkAge);
113
114                 jsonWriter.WritePropertyName("temp");
115                 jsonWriter.WriteValue(shard.Temperature);
116
117                 jsonWriter.WritePropertyName("YMax");
118                 jsonWriter.WriteValue(shard.YMax);
119
120                 jsonWriter.WritePropertyName("fert");
121                 jsonWriter.WriteValue(shard.Fertility);
122
123                 jsonWriter.WritePropertyName("forestDens");
124                 jsonWriter.WriteValue(shard.ForestDensity);
125
126                 jsonWriter.WritePropertyName("rain");
127                 jsonWriter.WriteValue(shard.Rainfall);
128
129                 jsonWriter.WritePropertyName("shrubDens");
130                 jsonWriter.WriteValue(shard.ShrubDensity);
131
132                 jsonWriter.WritePropertyName("airBlocks");
133                 jsonWriter.WriteValue(shard.AirBlocks);
134
135                 jsonWriter.WritePropertyName("nonAirBlocks");
136                 jsonWriter.WriteValue(shard.NonAirBlocks);
137
138                 //TODO: Heightmap ?
139                 //Start rockMap ; FOR a Ratio....on tooltip GUI
140                 jsonWriter.WritePropertyName("rockRatio");
141                 jsonWriter.WriteStartConstructor("Map");
142                 jsonWriter.WriteStartArray( );
143                 foreach (var rockEntry in shard.RockRatio) {
144                 var rockBlock = ClientAPI.World.GetBlock(rockEntry.Key);
145                 jsonWriter.WriteStartArray( );
146                 jsonWriter.WriteValue(rockBlock.Code.Path);
147                 jsonWriter.WriteValue(rockEntry.Value);//Total per chunk-column
148                 jsonWriter.WriteEndArray( );
149                 }
150                 jsonWriter.WriteEndArray( );
151                 jsonWriter.WriteEndConstructor( );//end rock-map
152
153                 jsonWriter.WriteEndObject( );//end Map value: {Object}
154                 jsonWriter.WriteEndArray( );//end Tuple
155                 }
156
157                 jsonWriter.WriteEndArray( );//Enclose tuples of chunkMetadata
158                 jsonWriter.WriteEndConstructor( );//Close constructor of Map (chunkMetadata)
159                 jsonWriter.WriteRaw(";\n");
160
161                 jsonWriter.WriteRaw("ViewFrame.chunks.pointsOfInterest=");
162                 jsonWriter.WriteStartConstructor("Map");
163                 jsonWriter.WriteStartArray( );//An array of... 2-component arrays
164
165                 foreach (var poi in POIs) {
166                 EmitJsonMap(poi, jsonWriter);
167                 }
168
169                 foreach (var poi in EOIs) {
170                 EmitJsonMap(poi, jsonWriter);
171                 }
172
173                 jsonWriter.WriteEndArray( );
174                 jsonWriter.WriteEndConstructor( );
175                 jsonWriter.WriteRaw(";\n");
176
177                 jsonWriter.WriteWhitespace("\n");
178                 jsonWriter.WriteComment("============= BlockID's for Rockmap / Rock-ratios ===============");
179                 jsonWriter.WriteWhitespace("\n");
180
181                 jsonWriter.WriteRaw("ViewFrame.chunks.rock_Lookup =");
182                 jsonWriter.WriteStartConstructor("Map");
183                 jsonWriter.WriteStartArray( );//An array of... 2-component arrays
184
185                 foreach (var entry in RockIdCodes) {
186                 var block = ClientAPI.World.GetBlock(entry.Key);
187                 //      stream.Write("{0},", Lang.GetUnformatted(block.Code.Path));
188                 jsonWriter.WriteStartArray( );
189                 jsonWriter.WriteValue(block.Code.Path);
190
191                 jsonWriter.WriteStartObject( );
192                 jsonWriter.WritePropertyName("assetCode");
193                 jsonWriter.WriteValue(entry.Value);
194
195                 jsonWriter.WritePropertyName("name");
196                 jsonWriter.WriteValue(Lang.GetUnformatted(block.Code.Path));
197                 //}
198
199                 jsonWriter.WriteEndObject( );
200                 jsonWriter.WriteEndArray( );
201                 }
202                 jsonWriter.WriteEndArray( );
203                 jsonWriter.WriteEndConstructor( );
204                 //stream.Write("]);\n");
205                 jsonWriter.WriteRaw(";\n");
206
207                 jsonWriter.Flush( );
208                 }
209                 }
210
211                 }
212
213                 public void EmitJsonMap(PointOfInterest @this, JsonTextWriter jsonWriter)
214                 {
215                 jsonWriter.WriteStartArray( );
216                 jsonWriter.WriteValue($"{@this.Location.X}_{@this.Location.Z}");
217
218                 jsonWriter.WriteStartArray( );
219                 //jsonWriter.WriteValue(@this.Name);
220
221                 jsonWriter.WriteValue(@this.Location.X);
222                 jsonWriter.WriteValue(@this.Location.Z); //Y is HEIGHT from Mantle... Z is Right from edge of world
223
224                 jsonWriter.WriteValue(@this.Location.PrettyCoords(ClientAPI));
225
226                 jsonWriter.WriteValue(@this.Notes);//put more escaping in Java-script if needed
227
228                 jsonWriter.WriteValue(@this.Timestamp);
229
230                 jsonWriter.WriteEndArray( );
231                 jsonWriter.WriteEndArray( );
232                 }
233
234                 public void EmitJsonMap(EntityOfInterest @this, JsonTextWriter jsonWriter)
235                 {
236                 jsonWriter.WriteStartArray( );
237                 jsonWriter.WriteValue($"{@this.Location.X}_{@this.Location.Z}");
238
239
240                 jsonWriter.WriteStartArray( );
241                 //jsonWriter.WriteValue(@this.Name);
242
243                 jsonWriter.WriteValue(@this.Location.X);
244                 jsonWriter.WriteValue(@this.Location.Z); //Y is HEIGHT from Mantle... Z is Right from edge of world
245
246                 jsonWriter.WriteValue(@this.Location.PrettyCoords(ClientAPI));
247
248                 jsonWriter.WriteValue(@this.Notes);//put more escaping in Java-script if needed
249
250                 jsonWriter.WriteValue(@this.Timestamp);
251
252                 jsonWriter.WriteValue(@this.EntityId);          
253
254                 jsonWriter.WriteEndArray( );
255                 jsonWriter.WriteEndArray( );
256                 }
257
258                 /// <summary>
259                 /// Dynamically reflect Points-of-Something fields for metadata descriptors
260                 /// </summary>
261                 /// <returns>Json-array  names of fields for use in map display.</returns>
262                 public string MakePreBuiltJSON( )
263                 {
264                 var builder = new StringBuilder(512);
265                 builder.Append("ViewFrame.chunks={};\n");
266                 builder.AppendFormat("ViewFrame.chunks.worldSeedNum='{0}';",
267                                 ClientAPI.World.Seed
268                                 );
269                 builder.AppendFormat("ViewFrame.chunks.chunkSize={0};",
270                                 chunkSize
271                                 );
272
273                 builder.Append("ViewFrame.chunks.chunkMetadataNames=[");
274                 var fields = typeof(ColumnMeta).GetFields( );
275                 var attsToSort = new List<DisplayNameAttribute>( );
276                 // this is so gross
277                 foreach (var f in fields) {
278                 var att = f.GetCustomAttribute(typeof(DisplayNameAttribute));
279                 if (att != null) {
280                 attsToSort.Add(( DisplayNameAttribute )att);
281                 }
282
283                 }
284                 foreach (var att in attsToSort.OrderBy(a => a.order))
285                         builder.AppendFormat("'{0}',", att.name);
286                 builder.Append("];\n");
287
288                 builder.Append("ViewFrame.chunks.pointsOfInterestNames=[");
289                 fields = typeof(PointOfInterest).GetFields( );
290                 attsToSort = new List<DisplayNameAttribute>( );
291
292                 foreach (var f in fields) {
293                 var att = f.GetCustomAttribute(typeof(DisplayNameAttribute));
294                 if (att != null)
295                         attsToSort.Add(( DisplayNameAttribute )att);
296                 }
297                 foreach (var att in attsToSort.OrderBy(a => a.order))
298                         builder.AppendFormat("'{0}',", att.name);
299                 builder.Append("];\n");
300
301                 builder.Append("ViewFrame.chunks.entityOfInterestNames=[");
302                 fields = typeof(EntityOfInterest).GetFields( );
303                 attsToSort = new List<DisplayNameAttribute>( );
304
305                 foreach (var f in fields) {
306                 var att = f.GetCustomAttribute(typeof(DisplayNameAttribute));
307                 if (att != null)
308                         attsToSort.Add(( DisplayNameAttribute )att);
309                 }
310                 foreach (var att in attsToSort.OrderBy(a => a.order))
311                         builder.AppendFormat("'{0}',", att.name);
312                 builder.Append("];\n");
313
314                 return builder.ToString( );
315                 }
316         }
317 }
318