From 2946e5f366cd01ec8b77e111fab7299c5985fb5a Mon Sep 17 00:00:00 2001 From: Tom Bloor Date: Thu, 29 Aug 2019 00:50:41 +0100 Subject: [PATCH] Reparsing UI sorted, and finished off most of server stuff --- css/main.css | 5 + index.html | 638 +++++++++++++++++++++++++++++++++++-------- js/atlas_reparser.js | 94 +++++++ js/main.js | 469 +++++++++++++++---------------- js/parser_test.js | 95 ------- parser_test.html | 1 + 6 files changed, 854 insertions(+), 448 deletions(-) create mode 100644 js/atlas_reparser.js diff --git a/css/main.css b/css/main.css index 1109507..132a9d1 100644 --- a/css/main.css +++ b/css/main.css @@ -1,4 +1,9 @@ #config-editor { width: 100%; height: 75vh; +} + +#deparse-editor { + width: 100%; + height: 50vh; } \ No newline at end of file diff --git a/index.html b/index.html index cee235b..7a6576f 100644 --- a/index.html +++ b/index.html @@ -31,9 +31,11 @@
- Paste your server config in here, or use tabs to modify settings + Paste your server config in here then click Editor to Config, or use tabs to modify settings and click Config to Editor! + +
- Note, coordsScaling may need modifying from a string to a number - Javascript Limitation... + Note, coordsScaling may need modifying from scientific notation to a number - Javascript Limitation...
@@ -90,7 +92,7 @@
-
@@ -605,120 +607,483 @@
-

- (, +
+

- (, )

+ -
- Basic Data -
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
- Biome Options -
- -
-
- +
+ Basic Data +
+ +
+ -
- -
+ class="form-control">
- GlobalBiomeSeamlessServerGridPreOffsetValues
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+
+ Biome Options + + +
+
+ Override Options + + + + + + + +
-
+
+ Style Options +
+ +
+ + waterColorR +
+
+
+ +
+ + waterColorG +
+
+
+ +
+ + waterColorB +
+
+
+ +
+ + skyStyleIndex +
+
+
+
+ Misc Options +
+ +
+ + floorZDist +
+
+
+ +
+ + utcOffset +
+
+
+ +
+ + transitionMinZ +
+
+
+ +
+ + serverIslandPointsMultiplier +
+
+
+
+ Date Options + + +
+
+ Boolean Options +
+ +
+ +
+
+ islandLocked +
+
+
+ +
+ +
+
+ discoLocked +
+
+
+ +
+ +
+
+ pathsLocked +
+
+
+
+ Sub Levels + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameXYZPitchYawRollOverride
+
+
+ Islands + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameSpawner OverridesMin Treasure QualityMax Treasure QualityNPC Volumes for TreasureLevel Bounds for TreasurePrioritise Volumes for TreasuresPointsBottle Supply OverrideWidthHeightXYRotation
TODO
+
+
+ Discovery Zones + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameSize XSize YSize ZXPManually PlacedExplorer Note IndexAllow SeaWorld XWorld YRotation
+
+
+ Spawn Regions + + + + + + + + + + + + + +
Name
+
+
+ Extra Sublevels + + + + + + + + + + + + + +
Name
+
+
+ Total Extra Sublevels + + + + + + + + + + + + + +
Name
+
+

@@ -727,6 +1092,56 @@
+ + + + + + + @@ -748,6 +1163,7 @@ + diff --git a/js/atlas_reparser.js b/js/atlas_reparser.js new file mode 100644 index 0000000..ca7637a --- /dev/null +++ b/js/atlas_reparser.js @@ -0,0 +1,94 @@ +function deparseJson(input) { + switch (typeof input) { + case "object": + return deparseObject(input); + case "number": + return deparseNumber(input); + case "string": + return deparseString(input); + case "undefined": + return ""; + case "boolean": + return deparseBoolean(input); + default: + console.log("Unknown type for input", input); + return ""; + } +} + +function deparseObject(input) { + if (Array.isArray(input)) { + return deparseArray(input); + } + if (input === null) { + return "None"; + } + + var beginObject = '('; + var endObject = ')'; + var nameSeparator = '='; + var valueSeparator = ','; + + var output = ''; + output += beginObject; + + Object.keys(input).forEach(function (key, idx, array) { + output += key; + output += nameSeparator; + output += deparseJson(input[key]); + + if (idx !== array.length - 1) { + // Not the last item + output += valueSeparator + } + }); + output += endObject; + + return output; +} + +function deparseArray(input) { + // We have one funky array option, where its 2 values and one of them is a recognised class. + if (input[0] === "BlueprintGeneratedClass") { + return "BlueprintGeneratedClass" + "'" + input[1] + "'"; + } + if (input[0] === "SoundWave") { + return "SoundWave" + "'" + input[1] + "'" + } + + var beginObject = '('; + var endObject = ')'; + var valueSeparator = ','; + + var output = ''; + output += beginObject; + + input.forEach(function (data, idx, array) { + output += deparseJson(data); + + if (idx !== array.length - 1) { + output += valueSeparator; + } + }); + output += endObject; + + return output; +} + +function deparseNumber(input) { + // All numbers seem to be a string to 6 decimal places + return Number(input).toFixed(6); +} + +function deparseString(input) { + // We need to re-encode the strings properly + return JSON.stringify(input); +} + +function deparseBoolean(input) { + if ( input ) { + return 'True'; + } else { + return 'False'; + } +} \ No newline at end of file diff --git a/js/main.js b/js/main.js index 5610c65..b099290 100644 --- a/js/main.js +++ b/js/main.js @@ -23,7 +23,7 @@ editor.session.setMode("ace/mode/json"); var parser; -$.get('js/atlas.pegjs', function(data) { +$.get('js/atlas.pegjs', function (data) { parser = PEG.buildParser(data); }); @@ -182,236 +182,55 @@ var viewmodel = ko.mapping.fromJS({ "gridY": 0, "MachineIdTag": "", "isHomeServer": false, - - "AdditionalCmdLineParams": "", - "floorZDist": 0, - "utcOffset": 0, - "transitionMinZ": 0, - // Biome Options - "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)", + "GlobalBiomeSeamlessServerGridPreOffsetValues": "", + "GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater": "", // Override Options - "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": "", + "OceanDinoDepthEntriesOverride": "", + "OceanEpicSpawnEntriesOverrideValues": "", + "oceanFloatsamCratesOverride": "", + "treasureMapLootTablesOverride": "", + "oceanEpicSpawnEntriesOverrideTemplateName": "", + "NPCShipSpawnEntriesOverrideTemplateName": "", + "regionOverrides": "", // Style Options - "waterColorR": 0.0, - "waterColorG": 0.0, - "waterColorB": 0.0, - "skyStyleIndex": 0, + "waterColorR": 0.0, + "waterColorG": 0.0, + "waterColorB": 0.0, + "skyStyleIndex": 0, + // Misc Options + "floorZDist": 0, + "utcOffset": 0, + "transitionMinZ": 0, + "serverIslandPointsMultiplier": 1.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": [], + // Date Options + "lastModified": "2019-04-14T21:32:04.7310108Z", + "lastImageOverride": "0001-01-01T00:00:00", + + //Boolean Options + "islandLocked": true, + "discoLocked": true, + "pathsLocked": false, + + // Long Tables + "sublevels": [], + "islandInstances": [], + "discoZones": [], + + // Mini Tables + "spawnRegions": [], + "extraSublevels": [], + "totalExtraSublevels": [], // ??? "OverrideShooterGameModeDefaultGameIni": {} - } + } ], "spawnerOverrideTemplates": [], "shipPaths": [], @@ -422,23 +241,16 @@ var viewmodel = ko.mapping.fromJS({ }); ko.applyBindings(viewmodel); -updateEditor(); +configToEditor(); -ko.computed(function () { - return ko.toJSON(viewmodel); -}).subscribe(function () { - updateEditor(); -}); +function editorToConfig() { + ko.mapping.fromJSON(editor.getValue(), viewmodel); +} -editor.on("change", function () { - setTimeout(function () { - ko.mapping.fromJSON(editor.getValue(), viewmodel); - }, 100); -}); - -function updateEditor() { +function configToEditor() { var interim = ko.mapping.toJS(viewmodel); - interim.coordsScaling = Number(interim.coordsScaling).toFixed(12); + // coordsScaling may need special care? + //interim.coordsScaling = Number(interim.coordsScaling).toFixed(12); editor.setValue(ko.toJSON(interim, null, 2)); } @@ -457,16 +269,189 @@ function removeDatabase(obj) { } function addServer() { - console.log('boo'); + var newServer = { + // Basic Data + "name": ko.observable("Server Name"), + "serverTemplateName": ko.observable("Template Name"), + "ip": ko.observable("127.0.0.1"), + "port": ko.observable(29145), + "gamePort": ko.observable(3045), + "seamlessDataPort": ko.observable(31029), + "gridX": ko.observable(0), + "gridY": ko.observable(0), + "MachineIdTag": ko.observable(""), + "isHomeServer": ko.observable(false), + "AdditionalCmdLineParams": ko.observable(""), + + // Biome Options + "GlobalBiomeSeamlessServerGridPreOffsetValues": ko.observable(""), + "GlobalBiomeSeamlessServerGridPreOffsetValuesOceanWater": ko.observable(""), + + // Override Options + "OceanDinoDepthEntriesOverride": ko.observable(""), + "OceanEpicSpawnEntriesOverrideValues": ko.observable(""), + "oceanFloatsamCratesOverride": ko.observable(""), + "treasureMapLootTablesOverride": ko.observable(""), + "oceanEpicSpawnEntriesOverrideTemplateName": ko.observable(""), + "NPCShipSpawnEntriesOverrideTemplateName": ko.observable(""), + "regionOverrides": ko.observable(""), + + // Style Options + "waterColorR": ko.observable(0.0), + "waterColorG": ko.observable(0.0), + "waterColorB": ko.observable(0.0), + "skyStyleIndex": ko.observable(0), + + // Misc Options + "floorZDist": ko.observable(0), + "utcOffset": ko.observable(0), + "transitionMinZ": ko.observable(0), + "serverIslandPointsMultiplier": ko.observable(1.0), + + // Date Options + "lastModified": ko.observable("2019-04-14T21:32:04.7310108Z"), + "lastImageOverride": ko.observable("0001-01-01T00:00:00"), + + // Boolean Options + "islandLocked": ko.observable(true), + "discoLocked": ko.observable(true), + "pathsLocked": ko.observable(false), + + // Tabled Options + "sublevels": ko.observableArray([]), + "extraSublevels": ko.observableArray([]), + "totalExtraSublevels": ko.observableArray([]), + "islandInstances": ko.observableArray([]), + "discoZones": ko.observableArray([]), + "spawnRegions": ko.observableArray([]), + + // ??? + "OverrideShooterGameModeDefaultGameIni": ko.observable({}) + }; + viewmodel.servers.push(newServer); } -function removeServer() { - console.log('boo2'); +function removeServer(obj) { + viewmodel.servers.remove(obj); } -function deparseEdit(key, data, event) { - console.log('boop'); - console.log(data); - console.log(key); - console.log(parser.parse(data[key]())); -} \ No newline at end of file +var deparseEditor = ace.edit("deparse-editor"); +deparseEditor.setTheme("ace/theme/monokai"); +deparseEditor.session.setMode("ace/mode/json"); + +var activeDeparseEdit; + +function deparseEdit(data) { + activeDeparseEdit = data.value; + $('#deparse-modal').on('hide.bs.modal', function () { + cancelDeparseEdit(); + }); + $('#deparse-modal').modal('show'); + var parsed = parser.parse(activeDeparseEdit()); + deparseEditor.setValue(ko.toJSON(parsed, null, 2)); +} + +function cancelDeparseEdit() { + activeDeparseEdit = undefined; + $('#deparse-modal').off('hide.bs.modal'); + $('#deparse-modal').modal('hide'); +} + +function saveDeparseEdit() { + $('#deparse-modal').off('hide.bs.modal'); + $('#deparse-modal').modal('hide'); + var parsed = JSON.parse(deparseEditor.getValue()); + activeDeparseEdit(deparseJson(parsed)); + activeDeparseEdit = undefined; +} + +function addServerSubLevel(obj) { + var newSubLevel = { + "id": ko.observable(0), + "name": ko.observable("Map_Name"), + "additionalTranslationX": ko.observable(0), + "additionalTranslationY": ko.observable(0), + "additionalTranslationZ": ko.observable(0), + "additionalRotationPitch": ko.observable(0), + "additionalRotationYaw": ko.observable(0), + "additionalRotationRoll": ko.observable(0), + "landscapeMaterialOverride": ko.observable(-1) + }; + obj.sublevels.push(newSubLevel); +} + +function removeServerSubLevel(obj, e) { + ko.contextFor(e.target).$parent.sublevels.remove(obj); +} + +function addServerIslandInstance(obj) { + var newIslandInstance = { + "id": ko.observable(0), + "name": ko.observable("Island_Name"), + "spawnerOverrides": ko.observable({}), + "minTreasureQuality": ko.observable(-1.0), + "maxTreasureQuality": ko.observable(-1.0), + "useNpcVolumesForTreasures": ko.observable(false), + "useLevelBoundsForTreasures": ko.observable(true), + "prioritizeVolumesForTreasures": ko.observable(false), + "islandPoints": ko.observable(-1), + "islandTreasureBottleSupplyCrateOverrides": ko.observable(""), + "islandWidth": ko.observable(0), + "islandHeight": ko.observable(0), + "worldX": ko.observable(0), + "worldY": ko.observable(0), + "rotation": ko.observable(0) + }; + obj.islandInstances.push(newIslandInstance); +} + +function removeServerIslandInstance(obj, e) { + ko.contextFor(e.target).$parent.islandInstances.remove(obj); +} + +function addServerDiscoveryZone(obj) { + var newDiscoveryZone = { + "id": ko.observable(0), + "name": ko.observable("New Discovery Zone"), + "sizeX": ko.observable(0), + "sizeY": ko.observable(0), + "sizeZ": ko.observable(0), + "xp": ko.observable(0), + "bIsManuallyPlaced": ko.observable(false), + "explorerNoteIndex": ko.observable(0), + "allowSea": ko.observable(false), + "worldX": ko.observable(0), + "worldY": ko.observable(0), + "rotation": ko.observable(0) + }; + obj.discoZones.push(newDiscoveryZone); +} + +function removeServerDiscoveryZone(obj, e) { + ko.contextFor(e.target).$parent.discoZones.remove(obj); +} + +function addServerSpawnRegion(obj) { + var newServerSpawnRegion = { + "name": ko.observable("") + }; + obj.spawnRegions.push(newServerSpawnRegion); +} + +function removeServerSpawnRegion(obj, e) { + ko.contextFor(e.target).$parent.spawnRegions.remove(obj); +} + +function addExtraSubLevels(obj) { + var newSubLevel = ''; + obj.extraSublevels.push(newSubLevel); +} + +function removeExtraSubLevels(obj, e) { ko.contextFor(e.target).$parent.extraSublevels.remove(obj) } + +function addTotalExtraSubLevels(obj) { + var newSubLevel = ''; + obj.totalExtraSublevels.push(newSubLevel); +} + +function removeTotalExtraSubLevels(obj, e) { ko.contextFor(e.target).$parent.totalExtraSublevels.remove(obj) } \ No newline at end of file diff --git a/js/parser_test.js b/js/parser_test.js index 3633a65..80240a5 100644 --- a/js/parser_test.js +++ b/js/parser_test.js @@ -30,99 +30,4 @@ function fromJsonToAtlas() { console.log(output); atlasEditor.setValue(output); -} - -function deparseJson(input) { - switch (typeof input) { - case "object": - return deparseObject(input); - case "number": - return deparseNumber(input); - case "string": - return deparseString(input); - case "undefined": - return ""; - case "boolean": - return deparseBoolean(input); - default: - console.log("Unknown type for input", input); - return ""; - } -} - -function deparseObject(input) { - if (Array.isArray(input)) { - return deparseArray(input); - } - if (input === null) { - return "None"; - } - - var beginObject = '('; - var endObject = ')'; - var nameSeparator = '='; - var valueSeparator = ','; - - var output = ''; - output += beginObject; - - Object.keys(input).forEach(function (key, idx, array) { - output += key; - output += nameSeparator; - output += deparseJson(input[key]); - - if (idx !== array.length - 1) { - // Not the last item - output += valueSeparator - } - }); - output += endObject; - - return output; -} - -function deparseArray(input) { - // We have one funky array option, where its 2 values and one of them is a recognised class. - if (input[0] === "BlueprintGeneratedClass") { - return "BlueprintGeneratedClass" + "'" + input[1] + "'"; - } - if (input[0] === "SoundWave") { - return "SoundWave" + "'" + input[1] + "'" - } - - var beginObject = '('; - var endObject = ')'; - var valueSeparator = ','; - - var output = ''; - output += beginObject; - - input.forEach(function (data, idx, array) { - output += deparseJson(data); - - if (idx !== array.length - 1) { - output += valueSeparator; - } - }); - output += endObject; - - return output; -} - -function deparseNumber(input) { - // All numbers seem to be a string to 6 decimal places - return Number(input).toFixed(6); -} - -function deparseString(input) { - // We need to re-encode the strings properly - return JSON.stringify(input); -} - -function deparseBoolean(input) { - if ( input ) { - return 'True'; - } else { - return 'False'; - } } \ No newline at end of file diff --git a/parser_test.html b/parser_test.html index 35a1a32..cca4c14 100644 --- a/parser_test.html +++ b/parser_test.html @@ -63,6 +63,7 @@ + \ No newline at end of file