From 5aa89b05240dc72f3ee82face9d518965ee4d945 Mon Sep 17 00:00:00 2001 From: Tom Bloor Date: Sun, 25 Aug 2019 16:33:10 +0100 Subject: [PATCH] Added a working parser for the crazy data config --- .idea/jsLibraryMappings.xml | 2 +- Atlas Config Generator.iml | 1 + index.html | 3 + js/atlas.pegjs | 146 ++++++++++++++++++++++ js/main.js | 243 +++++++++++++++++++++++++++++++++++- 5 files changed, 391 insertions(+), 4 deletions(-) create mode 100644 js/atlas.pegjs diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml index cdcf8a0..71c43cd 100644 --- a/.idea/jsLibraryMappings.xml +++ b/.idea/jsLibraryMappings.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/Atlas Config Generator.iml b/Atlas Config Generator.iml index 4a0b569..524bb1e 100644 --- a/Atlas Config Generator.iml +++ b/Atlas Config Generator.iml @@ -12,5 +12,6 @@ + \ No newline at end of file diff --git a/index.html b/index.html index a187753..7142512 100644 --- a/index.html +++ b/index.html @@ -542,6 +542,9 @@ + diff --git a/js/atlas.pegjs b/js/atlas.pegjs new file mode 100644 index 0000000..a2b5303 --- /dev/null +++ b/js/atlas.pegjs @@ -0,0 +1,146 @@ +// Atlas Grammar +// ============ +// +// Based on the JSON example Grammar from PEG.js examples +// + +Atlas_text = ws value:value ws { return value; } + +begin_object = ws "(" ws +end_object = ws ")" ws +name_separator = ws "=" ws +value_separator = ws "," ws + +ws "whitespace" = [ \t\n\r]* + +// ----- Values ----- + +value = false / null / true / object / array / number / stringval / class / empty + +empty = "" { return undefined; } +null = "None" { return null; } +false = "False" { return false; } +true = "True" { return true; } + +// ----- Objects ----- + +object + = begin_object + members:( + head:member + tail:(value_separator m:member { return m; })* + { + var result = {}; + + [head].concat(tail).forEach(function(element) { + result[element.name] = element.value; + }); + + return result; + } + )? + end_object + { return members !== null ? members: {}; } + +member + = name:stringkey name_separator value:value { + return { name: name, value: value }; + } + +// ----- Arrays ----- + +array + = begin_object + values:( + head:value + tail:(value_separator v:value { return v; })* + { return [head].concat(tail); } + )? + end_object + { return values !== null ? values : []; } + +// ----- Numbers ----- + +number "number" + = minus? int frac? exp? { return parseFloat(text()); } + +decimal_point + = "." + +digit1_9 + = [1-9] + +e + = [eE] + +exp + = e (minus / plus)? DIGIT+ + +frac + = decimal_point DIGIT+ + +int + = zero / (digit1_9 DIGIT*) + +minus + = "-" + +plus + = "+" + +zero + = "0" + +// ----- Strings ----- + +stringkey "string key" = sequence:keychar* { return sequence.join(""); } + +stringval "string value" + = quotation_mark chars:char* quotation_mark { return chars.join(""); } + +class = key:stringkey singlequote_mark chars:pathchar* singlequote_mark { return [ key, chars.join("") ]; } + +keychar = sequence:( [a-zA-Z] / "_" ) { return sequence; } + +pathchar = sequence:( + [a-zA-Z0-9] + / "_" + / "." + / "/" + ) + { return sequence; } + +char + = unescaped + / escape + sequence:( + '"' + / "\\" + / "/" + / "b" { return "\b"; } + / "f" { return "\f"; } + / "n" { return "\n"; } + / "r" { return "\r"; } + / "t" { return "\t"; } + / "u" digits:$(HEXDIG HEXDIG HEXDIG HEXDIG) { + return String.fromCharCode(parseInt(digits, 16)); + } + ) + { return sequence; } + +escape + = "\\" + +quotation_mark + = '"' + +singlequote_mark = "'" + +unescaped + = [^\0-\x1F\x22\x5C] + +// ----- Core ABNF Rules ----- + +// See RFC 4234, Appendix B (http://tools.ietf.org/html/rfc4234). +DIGIT = [0-9] +HEXDIG = [0-9a-f]i \ No newline at end of file diff --git a/js/main.js b/js/main.js index 37500aa..7ab3fd6 100644 --- a/js/main.js +++ b/js/main.js @@ -162,7 +162,236 @@ var viewmodel = ko.mapping.fromJS({ } ], - "servers": [], + "servers": [ + { + "gridX": 4, + "gridY": 5, + "MachineIdTag": "", + "ip": "51.68.68.225", + "name": "The Crystal Sea", + "port": 29145, + "gamePort": 3045, + "seamlessDataPort": 31029, + "isHomeServer": false, + "AdditionalCmdLineParams": "", + "OverrideShooterGameModeDefaultGameIni": {}, + "floorZDist": 0, + "utcOffset": 0, + "transitionMinZ": 0, + "GlobalBiomeSeamlessServerGridPreOffsetValues": "(BiomeZoneName=\"Temperate At Land\",PreOffsetMaxDistanceFromShore=100000.000000,PreOffsetTemperatureMultiplier=1.000000,PreOffsetTemperatureMultiplierMaxDistanceFromShore=1.000000,PreOffsetTemperatureAdditionMaxDistanceFromShore=-9.000000,PreOffsetTemperatureAddition=0.000000,PreOffsetTemperatureExponent=1.000000,PreOffsetTemperatureExponentMaxDistanceFromShore=1.000000,BiomeZoneNameAltDistanceName=\"Temperate Open Water\",BiomeZoneNameAltDistanceAmount=0.000000)", + "GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater": "(BiomeZoneName=\"Temperate Ocean Water\",PreOffsetMaxDistanceFromShore=17500.000000,PreOffsetTemperatureMultiplier=1.000000,PreOffsetTemperatureMultiplierMaxDistanceFromShore=1.000000,PreOffsetTemperatureAdditionMaxDistanceFromShore=-31.000000,PreOffsetTemperatureAddition=-5.000000,PreOffsetTemperatureExponent=1.000000,PreOffsetTemperatureExponentMaxDistanceFromShore=1.000000,BiomeZoneNameAltDistanceName=\"Temperate Deep Ocean\",BiomeZoneNameAltDistanceAmount=0.500000)", + "OceanDinoDepthEntriesOverride": "", + "OceanEpicSpawnEntriesOverrideValues": "(NPCSpawnEntries=((NPCsToSpawn=(BlueprintGeneratedClass'/Game/Atlas/Creatures/MeanWhale/MeanWhale_Character_BP.MeanWhale_Character_BP_C'),NPCsSpawnOffsets=((X=0.000000,Y=0.000000,Z=-700.000000)),NPCsToSpawnPercentageChance=(1.000000)),(NPCsToSpawn=(BlueprintGeneratedClass'/Game/Atlas/Creatures/MeanWhale/MeanWhale_SeaMonster_Character_BP.MeanWhale_SeaMonster_Character_BP_C'),NPCsSpawnOffsets=((X=0.000000,Y=0.000000,Z=-700.000000)),NPCsToSpawnPercentageChance=(1.000000))),NPCSpawnLimits=,MaxDesiredNumEnemiesMultiplier=4.000000)", + "oceanFloatsamCratesOverride": "", + "treasureMapLootTablesOverride": "", + "oceanEpicSpawnEntriesOverrideTemplateName": "", + "NPCShipSpawnEntriesOverrideTemplateName": "", + "regionOverrides": "", + "waterColorR": 0.0, + "waterColorG": 0.0, + "waterColorB": 0.0, + "skyStyleIndex": 0, + "serverIslandPointsMultiplier": 1.0, + "sublevels": [ + { + "name": "Mnt_Y_Far_05_PVE", + "additionalTranslationX": -317251.5, + "additionalTranslationY": -272744.5, + "additionalTranslationZ": 0.0, + "additionalRotationPitch": 0.0, + "additionalRotationYaw": 0.0, + "additionalRotationRoll": 0.0, + "id": 28, + "landscapeMaterialOverride": -1 + }, + { + "name": "Mnt_Y_Farthest_05_PVE", + "additionalTranslationX": -317251.5, + "additionalTranslationY": -272744.5, + "additionalTranslationZ": 0.0, + "additionalRotationPitch": 0.0, + "additionalRotationYaw": 0.0, + "additionalRotationRoll": 0.0, + "id": 28, + "landscapeMaterialOverride": -1 + }, + { + "name": "Mnt_Y_Marine_Cold_Near", + "additionalTranslationX": -317251.5, + "additionalTranslationY": -272744.5, + "additionalTranslationZ": 0.0, + "additionalRotationPitch": 0.0, + "additionalRotationYaw": 0.0, + "additionalRotationRoll": 0.0, + "id": 28, + "landscapeMaterialOverride": -1 + }, + { + "name": "Mnt_Y_Near_05_PVE", + "additionalTranslationX": -317251.5, + "additionalTranslationY": -272744.5, + "additionalTranslationZ": 0.0, + "additionalRotationPitch": 0.0, + "additionalRotationYaw": 0.0, + "additionalRotationRoll": 0.0, + "id": 28, + "landscapeMaterialOverride": -1 + }, + { + "name": "Mnt_Y_PVE", + "additionalTranslationX": -317251.5, + "additionalTranslationY": -272744.5, + "additionalTranslationZ": 0.0, + "additionalRotationPitch": 0.0, + "additionalRotationYaw": 0.0, + "additionalRotationRoll": 0.0, + "id": 28, + "landscapeMaterialOverride": -1 + }, + { + "name": "Mnt_G_Far_03_PVE", + "additionalTranslationX": 51799.0, + "additionalTranslationY": 329860.0, + "additionalTranslationZ": 0.0, + "additionalRotationPitch": 0.0, + "additionalRotationYaw": 0.0, + "additionalRotationRoll": 0.0, + "id": 34, + "landscapeMaterialOverride": -1 + }, + { + "name": "Mnt_G_Farthest_03_PVE", + "additionalTranslationX": 51799.0, + "additionalTranslationY": 329860.0, + "additionalTranslationZ": 0.0, + "additionalRotationPitch": 0.0, + "additionalRotationYaw": 0.0, + "additionalRotationRoll": 0.0, + "id": 34, + "landscapeMaterialOverride": -1 + }, + { + "name": "Mnt_G_Near_03_PVE", + "additionalTranslationX": 51799.0, + "additionalTranslationY": 329860.0, + "additionalTranslationZ": 0.0, + "additionalRotationPitch": 0.0, + "additionalRotationYaw": 0.0, + "additionalRotationRoll": 0.0, + "id": 34, + "landscapeMaterialOverride": -1 + }, + { + "name": "Mnt_G_PVE", + "additionalTranslationX": 51799.0, + "additionalTranslationY": 329860.0, + "additionalTranslationZ": 0.0, + "additionalRotationPitch": 0.0, + "additionalRotationYaw": 0.0, + "additionalRotationRoll": 0.0, + "id": 34, + "landscapeMaterialOverride": -1 + }, + { + "name": "Mnt_G_Marine_Cold_Near", + "additionalTranslationX": 51799.0, + "additionalTranslationY": 329860.0, + "additionalTranslationZ": 0.0, + "additionalRotationPitch": 0.0, + "additionalRotationYaw": 0.0, + "additionalRotationRoll": 0.0, + "id": 34, + "landscapeMaterialOverride": -1 + } + ], + "lastModified": "2019-04-14T21:32:04.7310108Z", + "lastImageOverride": "0001-01-01T00:00:00", + "islandLocked": true, + "discoLocked": true, + "pathsLocked": false, + "extraSublevels": [], + "totalExtraSublevels": [ + "ChildIBL_EasternTundra.uasset", + "ChildIBL_EasternTundra_Box.uasset", + "ChildIBL_EasternTundra_Canopy_JapanesePine.uasset", + "ChildIBL_EasternTundra_Canopy_Paulownia.uasset", + "ChildIBL_EasternTundra_Canopy_RedMaple.uasset", + "MasterIBL_EasternTemperate", + "MasterIBL_EasternTemperate_Canopy_RedMaple", + "MasterIBL_Temperate", + "MasterIBL_Temperate_Canopy", + "MasterIBL_Temperate_Canopy_B" + ], + "islandInstances": [ + { + "name": "Mnt_Y_EU_PVE", + "id": 28, + "spawnerOverrides": {}, + "minTreasureQuality": -1.0, + "maxTreasureQuality": -1.0, + "useNpcVolumesForTreasures": false, + "useLevelBoundsForTreasures": true, + "prioritizeVolumesForTreasures": false, + "islandPoints": -1, + "islandTreasureBottleSupplyCrateOverrides": "", + "islandWidth": 306000.0, + "islandHeight": 306000.0, + "worldX": 5982748.5, + "worldY": 7427255.5, + "rotation": 0.0 + }, + { + "name": "Mnt_G_ET_PVE", + "id": 34, + "spawnerOverrides": {}, + "minTreasureQuality": -1.0, + "maxTreasureQuality": -1.0, + "useNpcVolumesForTreasures": false, + "useLevelBoundsForTreasures": true, + "prioritizeVolumesForTreasures": false, + "islandPoints": -1, + "islandTreasureBottleSupplyCrateOverrides": "", + "islandWidth": 306000.0, + "islandHeight": 306000.0, + "worldX": 6351799.0, + "worldY": 8029860.0, + "rotation": 0.0 + } + ], + "discoZones": [ + { + "name": "Jotunheim", + "sizeX": 283627.0, + "sizeY": 268249.5, + "sizeZ": 40000.0, + "id": 109, + "xp": 30.0, + "bIsManuallyPlaced": false, + "explorerNoteIndex": 0, + "allowSea": false, + "worldX": 5981788.5, + "worldY": 7414445.0, + "rotation": 0.0 + }, + { + "name": "The Ashen Reaches", + "sizeX": 289322.0, + "sizeY": 297295.5, + "sizeZ": 40000.0, + "id": 116, + "xp": 30.0, + "bIsManuallyPlaced": false, + "explorerNoteIndex": 0, + "allowSea": false, + "worldX": 6359387.5, + "worldY": 8013876.0, + "rotation": 0.0 + } + ], + "spawnRegions": [], + "serverTemplateName": "No Build PVE" + } + ], "spawnerOverrideTemplates": [], "shipPaths": [], "serverTemplates": [], @@ -198,10 +427,18 @@ function addDatabase() { "URL": ko.observable("127.0.0.1"), "Port": ko.observable(6390), "Password": ko.observable("") - } + }; viewmodel.DatabaseConnections.push(newDB); } function removeDatabase(obj) { viewmodel.DatabaseConnections.remove(obj); -} \ No newline at end of file +} + +var parser; + +$.get('js/atlas.pegjs', function(data) { + console.log(data); + parser = PEG.buildParser(data); + console.log(parser.parse(viewmodel.servers()[0].GlobalBiomeSeamlessServerGridPreOffsetValues())); +}); \ No newline at end of file