OSDN Git Service

Pre-PR5: Now with better, mostly-standard-compliant JSON
authormelchior <melchior@users.osdn.me>
Mon, 2 Mar 2020 00:59:12 +0000 (19:59 -0500)
committermelchior <melchior@users.osdn.me>
Mon, 2 Mar 2020 00:59:12 +0000 (19:59 -0500)
Automap/Subsystems/AutomapSystem.cs

index 4ef549f..f1f9cdc 100644 (file)
@@ -177,7 +177,7 @@ namespace Automap
                                                }
 
                                                UpdateEntityMetadata();
-                                               ProcessChunkBlocks(mostActiveCol.Key, mapChunk, chunkMeta);
+                                               ProcessChunkBlocks(mostActiveCol.Key, mapChunk, ref chunkMeta);
 
                                                PngWriter pngWriter = SetupPngImage(mostActiveCol.Key, chunkMeta);
                                                ChunkRenderer.GenerateChunkPngShard(mostActiveCol.Key, mapChunk, chunkMeta, pngWriter, out updatedPixels);
@@ -248,7 +248,7 @@ namespace Automap
 
                        this.BlockID_Designators = new Dictionary<int, BlockDesignator>();
                        this.Entity_Designators = new Dictionary<AssetLocation, EntityDesignator>();
-                       this.RockIdCodes = Helpers.ArbitrarytBlockIdHunter(ClientAPI, new AssetLocation(GlobalConstants.DefaultDomain, "rock"), EnumBlockMaterial.Stone);
+                       this.RockIdCodes = Helpers.ArbitrarytBlockIdHunter(ClientAPI, new AssetLocation(GlobalConstants.DefaultDomain, "rock-"), EnumBlockMaterial.Stone);
 
                        //Add special marker types for BlockID's of "Interest", overwrite colour, and method
 
@@ -290,6 +290,7 @@ namespace Automap
 
                }
 
+               //TODO: Rewrite as Newtonsoft  JsonTextWriter !!!
                /// <summary>
                /// Generates the JSON Metadata. (in Map object format )
                /// </summary>
@@ -297,67 +298,207 @@ namespace Automap
                {
                        string jsonFilename = Path.Combine(path, "Metadata.js");
 
-                       StreamWriter jsonWriter = new StreamWriter(jsonFilename, false, Encoding.UTF8);
+                       StreamWriter stream = new StreamWriter(jsonFilename, false, Encoding.UTF8);
+
+                       using (stream) {
+                       JsonTextWriter jsonWriter = new JsonTextWriter(stream);
+
+                       jsonWriter.Formatting = Formatting.None;
+                       jsonWriter.StringEscapeHandling = StringEscapeHandling.EscapeHtml;
+                       jsonWriter.Indentation = 0;
+                       //jsonWriter.AutoCompleteOnClose = true;
+                       jsonWriter.QuoteChar = '\'';
+                       jsonWriter.DateFormatHandling = DateFormatHandling.IsoDateFormat;
+                       jsonWriter.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
+
                        using (jsonWriter)
                        {
-                               jsonWriter.Write("ViewFrame.chunks={};");
-                               jsonWriter.Write("ViewFrame.chunks.worldSeedNum={0};", ClientAPI.World.Seed);
-                               jsonWriter.Write("ViewFrame.chunks.genTime=new Date('{0}');", DateTimeOffset.UtcNow.ToString("O"));
-                               jsonWriter.Write("ViewFrame.chunks.startCoords=[{0},{1}];", startChunkColumn.X, startChunkColumn.Y);
-                               jsonWriter.Write("ViewFrame.chunks.chunkSize={0};", chunkSize);
-                               jsonWriter.Write("ViewFrame.chunks.northMostChunk={0};", chunkTopMetadata.North_mostChunk);
-                               jsonWriter.Write("ViewFrame.chunks.southMostChunk={0};", chunkTopMetadata.South_mostChunk);
-                               jsonWriter.Write("ViewFrame.chunks.eastMostChunk={0};", chunkTopMetadata.East_mostChunk);
-                               jsonWriter.Write("ViewFrame.chunks.westMostChunk={0};", chunkTopMetadata.West_mostChunk);
+                               jsonWriter.WriteRaw("ViewFrame.chunks={};\n");
+                               jsonWriter.WriteRaw("ViewFrame.chunks.worldSeedNum=" );
+                               jsonWriter.WriteValue(ClientAPI.World.Seed);
+                               jsonWriter.WriteRaw(";\n");
+
+                               jsonWriter.WriteRaw("ViewFrame.chunks.genTime=");
+                               jsonWriter.WriteValue(DateTimeOffset.UtcNow);
+                               jsonWriter.WriteRaw(";\n");
+
+                               jsonWriter.WriteRaw("ViewFrame.chunks.startCoords=");
+                               jsonWriter.WriteStartArray( );
+                               jsonWriter.WriteValue(startChunkColumn.X);
+                               jsonWriter.WriteValue(startChunkColumn.Y);
+                               jsonWriter.WriteEndArray( );
+                               jsonWriter.WriteRaw(";\n");
+
+                               jsonWriter.WriteRaw("ViewFrame.chunks.chunkSize=");
+                               jsonWriter.WriteValue(chunkSize);
+                               jsonWriter.WriteRaw(";\n");
+
+                               jsonWriter.WriteRaw("ViewFrame.chunks.northMostChunk=");
+                               jsonWriter.WriteValue(chunkTopMetadata.North_mostChunk);
+                               jsonWriter.WriteRaw(";\n");
+
+                               jsonWriter.WriteRaw("ViewFrame.chunks.southMostChunk=");
+                               jsonWriter.WriteValue(chunkTopMetadata.South_mostChunk);
+                               jsonWriter.WriteRaw(";\n");
+
+                               jsonWriter.WriteRaw("ViewFrame.chunks.westMostChunk=");
+                               jsonWriter.WriteValue(chunkTopMetadata.West_mostChunk);
+                               jsonWriter.WriteRaw(";\n");
+
+                               jsonWriter.WriteRaw("ViewFrame.chunks.eastMostChunk=");
+                               jsonWriter.WriteValue(chunkTopMetadata.East_mostChunk);
+                               jsonWriter.WriteRaw(";\n");
+
+
                                //MAP object format - [key, value]: key is "x_y"
-                               jsonWriter.Write("ViewFrame.chunks.chunkMetadata=new Map([");
+                               jsonWriter.WriteRaw("ViewFrame.chunks.chunkMetadata=");
+                               jsonWriter.WriteStartConstructor("Map");
+                               jsonWriter.WriteStartArray( );//An array of... 2-component arrays
+
+
                                foreach (var shard in chunkTopMetadata)
                                {
-                                       jsonWriter.Write("['{0}_{1}',", shard.Location.X, shard.Location.Y);
-                                       jsonWriter.Write("{");
-                                       jsonWriter.Write("prettyCoord:'{0}',", shard.Location.PrettyCoords(ClientAPI));
-                                       jsonWriter.Write("chunkAge:'{0}',", shard.ChunkAge.ToString("g"));//World age - relative? or last edit ??
-                                       jsonWriter.Write("temp:'{0}',", shard.Temperature.ToString("F1"));
-                                       jsonWriter.Write("YMax:'{0}',", shard.YMax);
-                                       jsonWriter.Write("fert:'{0}',", shard.Fertility.ToString("F1"));
-                                       jsonWriter.Write("forestDens:'{0}',", shard.ForestDensity.ToString("F1"));
-                                       jsonWriter.Write("rain:'{0}',", shard.Rainfall.ToString("F1"));
-                                       jsonWriter.Write("shrubDens:'{0}',", shard.ShrubDensity.ToString("F1"));
-                                       jsonWriter.Write("airBlocks:'{0}',", shard.AirBlocks);
-                                       jsonWriter.Write("nonAirBlocks:'{0}',", shard.NonAirBlocks);
-                                       //TODO: Heightmap
-                                       //TODO: Rock-ratio, also requires a BlockID => Name lookup table....elsewhere
-                                       jsonWriter.Write("}],");
+                                       jsonWriter.WriteStartArray( );//Start tuple
+                                       jsonWriter.WriteValue($"{shard.Location.X}_{shard.Location.Y}");//Key of Tuple
+
+                                       jsonWriter.WriteStartObject( );
+                                       jsonWriter.WritePropertyName("prettyCoord");
+                                       jsonWriter.WriteValue( shard.Location.PrettyCoords(ClientAPI));
+
+                                       jsonWriter.WritePropertyName("chunkAge");
+                                       jsonWriter.WriteValue(shard.ChunkAge);
+
+                                       jsonWriter.WritePropertyName("temp");
+                                       jsonWriter.WriteValue(shard.Temperature);
+
+                                       jsonWriter.WritePropertyName("YMax");
+                                       jsonWriter.WriteValue(shard.YMax);
+
+                                       jsonWriter.WritePropertyName("fert");
+                                       jsonWriter.WriteValue(shard.Fertility);
+                                       
+                                       jsonWriter.WritePropertyName("forestDens");
+                       jsonWriter.WriteValue( shard.ForestDensity);
+
+                                       jsonWriter.WritePropertyName("rain"); 
+                       jsonWriter.WriteValue( shard.Rainfall);
+
+                                       jsonWriter.WritePropertyName("shrubDens");
+                       jsonWriter.WriteValue(  shard.ShrubDensity);
+
+                                       jsonWriter.WritePropertyName("airBlocks");
+                       jsonWriter.WriteValue( shard.AirBlocks);
+
+                                       jsonWriter.WritePropertyName("nonAirBlocks");
+                       jsonWriter.WriteValue(  shard.NonAirBlocks);
+
+                                       //TODO: Heightmap ?
+                                       //Start rockMap ; FOR a Ratio....on tooltip GUI
+                                       jsonWriter.WritePropertyName("rockRatio");
+                                       jsonWriter.WriteStartConstructor("Map");
+                                       jsonWriter.WriteStartArray( );
+                                       foreach (var rockEntry in shard.RockRatio) {
+                                               jsonWriter.WriteStartArray( );
+                                               jsonWriter.WriteValue(rockEntry.Key);//BlockID
+                                               jsonWriter.WriteValue(rockEntry.Value);//Total per chunk-column
+                                               jsonWriter.WriteEndArray( );
+                                       }
+                                       jsonWriter.WriteEndArray( );
+                                       jsonWriter.WriteEndConstructor( );//end rock-map
+
+                                       jsonWriter.WriteEndObject( );//end Map value: {Object}
+                                       jsonWriter.WriteEndArray( );//end Tuple
                                }
-                               jsonWriter.Write("]);");
 
+                               jsonWriter.WriteEndArray( );//Enclose tuples of chunkMetadata
+                               jsonWriter.WriteEndConstructor( );//Close constructor of Map (chunkMetadata)
+                               jsonWriter.WriteRaw(";\n");
+
+                               jsonWriter.WriteRaw("ViewFrame.chunks.pointsOfInterest=");
+                               jsonWriter.WriteStartConstructor("Map");
+                               jsonWriter.WriteStartArray( );//An array of... 2-component arrays
 
-                               jsonWriter.Write("ViewFrame.chunks.pointsOfInterest = new Map([");
                                foreach (var poi in POIs)
                                {
-                                       jsonWriter.Write("['{0}_{1}',", poi.Location.X, poi.Location.Z);
-                                       jsonWriter.Write("{");
-                                       jsonWriter.Write("prettyCoord:'{0}',", poi.Location.PrettyCoords(ClientAPI));
-                                       jsonWriter.Write("notes:{0},", JsonConvert.ToString(poi.Notes, '\'', StringEscapeHandling.EscapeHtml));
-                                       jsonWriter.Write("time:new Date('{0}'),", poi.Timestamp.ToString("O"));
-                                       jsonWriter.Write("chunkPos:'{0}_{1}',", (poi.Location.X / chunkSize), (poi.Location.Z / chunkSize));
-                                       jsonWriter.Write("}],");
+                                       jsonWriter.WriteStartArray( );
+                                       jsonWriter.WriteValue($"{poi.Location.X}_{poi.Location.Z}");
+
+                                       jsonWriter.WriteStartObject();
+                                       jsonWriter.WritePropertyName("prettyCoord");
+                                       jsonWriter.WriteValue(poi.Location.PrettyCoords(ClientAPI) );
+
+                                       jsonWriter.WritePropertyName("notes");
+                                       jsonWriter.WriteValue(poi.Notes);//Encoded to HTML Entities
+
+                                       jsonWriter.WritePropertyName("time");
+                                       jsonWriter.WriteValue(poi.Timestamp);
+                                       
+                                       jsonWriter.WritePropertyName("chunkPos");
+                                       jsonWriter.WriteValue($"{(poi.Location.X / chunkSize)}_{(poi.Location.Z / chunkSize)}");
+                                       
+                                       jsonWriter.WriteEndObject( );
+                                       jsonWriter.WriteEndArray( );
                                }
 
                                foreach (var poi in EOIs)
                                {
-                                       jsonWriter.Write("['{0}_{1}',", poi.Location.X, poi.Location.Z);
-                                       jsonWriter.Write("{");
-                                       jsonWriter.Write("prettyCoord:'{0}',", poi.Location.PrettyCoords(ClientAPI));
-                                       jsonWriter.Write("notes:{0},", JsonConvert.ToString(poi.Notes, '\'', StringEscapeHandling.EscapeHtml));
-                                       jsonWriter.Write("time:new Date('{0}'),", poi.Timestamp.ToString("O"));
-                                       jsonWriter.Write("chunkPos:'{0}_{1}',", (poi.Location.X / chunkSize), (poi.Location.Z / chunkSize));
-                                       jsonWriter.Write("}],");
+                                       jsonWriter.WriteStartArray( );
+                                       jsonWriter.WriteValue($"{poi.Location.X}_{poi.Location.Z}");
+
+                                       jsonWriter.WriteStartObject( );
+                                       jsonWriter.WritePropertyName("prettyCoord");
+                                       jsonWriter.WriteValue(poi.Location.PrettyCoords(ClientAPI));
+
+                                       jsonWriter.WritePropertyName("notes");
+                                       jsonWriter.WriteValue(poi.Notes);//Encoded to HTML Entities
+
+                                       jsonWriter.WritePropertyName("time");
+                                       jsonWriter.WriteValue(poi.Timestamp);
+
+                                       jsonWriter.WritePropertyName("chunkPos");
+                                       jsonWriter.WriteValue($"{(poi.Location.X / chunkSize)}_{(poi.Location.Z / chunkSize)}");
+
+                                       jsonWriter.WriteEndObject( );
+                                       jsonWriter.WriteEndArray( );
                                }
-                               jsonWriter.Write("]);");
+
+                               jsonWriter.WriteEndArray( );
+                               jsonWriter.WriteEndConstructor( );
+                               jsonWriter.WriteRaw(";\n");
+
+                               jsonWriter.WriteWhitespace("\n");
+                               jsonWriter.WriteComment("============= BlockID's for Rockmap / Rock-ratios ===============");
+                               jsonWriter.WriteWhitespace("\n");
+
+                               jsonWriter.WriteRaw("var rock_Lookup =");
+                               jsonWriter.WriteStartConstructor("Map");
+                               jsonWriter.WriteStartArray( );//An array of... 2-component arrays
+
+                               foreach (var entry in RockIdCodes) {
+                               var block = ClientAPI.World.GetBlock(entry.Key);
+                               
+                               jsonWriter.WriteStartArray( );
+                               jsonWriter.WriteValue(entry.Key);//BlockID
+                                                                       
+                               jsonWriter.WriteStartObject( );
+                               jsonWriter.WritePropertyName("assetCode");
+                               jsonWriter.WriteValue(entry.Value);
+
+                               jsonWriter.WritePropertyName("name");
+                               jsonWriter.WriteValue(Lang.GetUnformatted(block.Code.Path));
+                               //Color?
+
+                               jsonWriter.WriteEndObject( );
+                               jsonWriter.WriteEndArray( );
+                               }
+                               jsonWriter.WriteEndArray( );
+                               jsonWriter.WriteEndConstructor();
+                               
+                               jsonWriter.WriteRaw(";\n");
 
                                jsonWriter.Flush();
                        }
+                       }
 
                }
 
@@ -469,7 +610,7 @@ namespace Automap
                /// <param name="key">Chunk Coordinate</param>
                /// <param name="mapChunk">Map chunk.</param>
                /// <param name="chunkMeta">Chunk metadata</param>
-               private void ProcessChunkBlocks(Vec2i key, IMapChunk mapChunk, ColumnMeta chunkMeta)
+               private void ProcessChunkBlocks(Vec2i key, IMapChunk mapChunk, ref ColumnMeta chunkMeta)
                {
 
                        int targetChunkY = mapChunk.YMax / chunkSize;//Surface ...