]> git.lizzy.rs Git - dragonblocks.git/blobdiff - engine/world.js
Map abstraction and World class
[dragonblocks.git] / engine / world.js
index 61ccab10d22da951e949268cd4fc3f170b40e835..11996e564eb7981e6c7269efceef0980fff9de37 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * world.js
  *
- * Copyright 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
+ * Copyright 2021 Elias Fleckenstein <eliasfleckenstein@web.de>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  *
  */
 
-dragonblocks.getSavestring = _ => {
-       dragonblocks.world.map = dragonblocks.map;
-       dragonblocks.world.mods = dragonblocks.mods;
-       dragonblocks.world.spawnedEntities = dblib.removeTmp(dragonblocks.spawnedEntities);
+dragonblocks.World = class
+{
+       constructor(properties)
+       {
+               this.name = properties.name;
+               this.isLoaded = properties.isLoaded;
 
-       return JSON.stringify(dragonblocks.world);
-}
+               if (this.isLoaded) {
+                       this.load();
+               } else {
+                       this.mods = properties.mods;
 
-dragonblocks.save = _ => {
-       if (dragonblocks.loggedin)
-               return dragonblocks.backendCall("saveWorld", true, {name: dragonblocks.worldname, world: dragonblocks.getSavestring()});
-};
+                       this.loadMods();
 
-dragonblocks.checkWorldnameSpelling = name => {
-       return name.match(/^[a-zA-Z0-9]+$/);
-};
+                       this.map = new dragonblocks.Map();
+                       this.player = new dragonblocks.Player(null, this.map);
+
+                       this.player.setGamemode(properties.gamemode);
+                       dragonblocks.mapgen.generate(properties.mapgen, this.map);
+               }
+       }
+
+       serialize()
+       {
+               return {
+                       mods: this.mods,
+                       map: this.map.serialize(),
+                       player: this.player.serialize(),
+               };
+       }
+
+       deserialize(data)
+       {
+               this.mods = data.mods;
+
+               this.loadMods();
+
+               this.map = new dragonblocks.Map(data.map);
+               this.player = new dragonblocks.Player(data.player, this.map);
+       }
 
-dragonblocks.loadWorldList = _ => {
-       dragonblocks.worlds = dragonblocks.backendCall("getWorlds");
+       save()
+       {
+               if (dragonblocks.loggedin)
+                       return dragonblocks.backendCall("saveWorld", true, {name: this.name, world: JSON.stringify(this.serialize())});
+       }
+
+       load()
+       {
+               this.deserialize($.getJSON("worlds/" + this.name + "/world.json").responseJSON);
+       }
+
+       loadMods()
+       {
+               dragonblocks.loadMods(this.mods);
+       }
 };
 
-dragonblocks.getEmptyWorld = function(){
-       return {
-               map:{
-                       data: Array(dragonblocks.settings.map.width).fill(Array(dragonblocks.settings.map.width).fill(new dragonblocks.MapNode("air"))),
-                       width: dragonblocks.settings.map.width,
-                       height: dragonblocks.settings.map.height,
-                       displayTop: dragonblocks.settings.map.height / 2,
-                       displayLeft: dragonblocks.settings.map.width / 2 - 5,
-               },
-               structures: {},
-       };
-}
+dragonblocks.World.Properties = class
+{
+       constructor(isLoaded)
+       {
+               this.name = "";
+               this.isLoaded = isLoaded;
+
+               if (! isLoaded) {
+                       this.mods = [];
+
+                       this.gamemode = dragonblocks.settings.defaultWorldOptions.gamemode;
+                       this.mapgen = dragonblocks.settings.defaultWorldOptions.mapgen;
+               }
+       }
+
+       checkSpelling()
+       {
+               return this.name.match(/^[a-zA-Z0-9]+$/);
+       }
+};