diff --git a/Diagrams/MyDiagram.erd b/Diagrams/MyDiagram.erd
deleted file mode 100644
index 6e586965..00000000
--- a/Diagrams/MyDiagram.erd
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/saves/default/central.db b/saves/default/central.db
new file mode 100644
index 00000000..e69de29b
diff --git a/saves/terrain.json b/saves/default/terrain.json
similarity index 100%
rename from saves/terrain.json
rename to saves/default/terrain.json
diff --git a/src/main/java/electrosphere/engine/LoadingThread.java b/src/main/java/electrosphere/engine/LoadingThread.java
index 5a56f31a..b6546037 100644
--- a/src/main/java/electrosphere/engine/LoadingThread.java
+++ b/src/main/java/electrosphere/engine/LoadingThread.java
@@ -25,6 +25,7 @@ import electrosphere.game.collision.PhysicsUtils;
import electrosphere.game.collision.collidable.Collidable;
import electrosphere.game.server.ai.creature.MindlessAttacker;
import electrosphere.game.server.effects.ParticleEffects;
+import electrosphere.game.server.saves.SaveUtils;
import electrosphere.game.server.terrain.models.TerrainModification;
import electrosphere.game.server.town.Town;
import electrosphere.game.server.world.MacroData;
@@ -108,18 +109,28 @@ public class LoadingThread extends Thread {
Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.NO_INPUT);
//initialize the terrain manager (server only)
+// if(Globals.RUN_SERVER){
+// initServerGameTerrainManager();
+// }
+
if(Globals.RUN_SERVER){
- initServerGameTerrainManager();
+ //TODO: Globals.serverTerrainManager = new ServerTerrainManager(2000,50,100,randomDampener,0);
+ Globals.serverTerrainManager = new ServerTerrainManager(2000,50,100,0.0f,0);
+ SaveUtils.loadSave(Globals.currentSaveName);
+ //TODO: set spawnpoint
+ //TODO: Globals.serverWorldData = ServerWorldData.createGameWorld(Globals.serverTerrainManager);
+ //TODO: Globals.dataCellManager = new DataCellManager(Globals.serverWorldData);
+ Globals.serverWorldData = ServerWorldData.createGameWorld(Globals.serverTerrainManager);
+ Globals.dataCellManager = new DataCellManager(Globals.serverWorldData);
}
LoggerInterface.loggerEngine.INFO("run server: " + Globals.RUN_SERVER + " run client: " + Globals.RUN_CLIENT);
//init the data of the world
- if(Globals.RUN_SERVER){
- initServerGameWorldData();
- createServerWorld();
- initDataCellManager();
- }
+// if(Globals.RUN_SERVER){
+// initServerGameWorldData();
+// initDataCellManager();
+// }
//initialize the server thread (server only)
if(Globals.RUN_SERVER){
@@ -210,6 +221,7 @@ public class LoadingThread extends Thread {
initCollisionEngine(Globals.RUN_SERVER);
//initialize the "virtual" objects simulation
+ //not really relevant in arena mode
// initMacroSimulation();
//initialize the "real" objects simulation
@@ -291,7 +303,7 @@ public class LoadingThread extends Thread {
Globals.serverTerrainManager.generate();
Globals.serverTerrainManager.save();
} else {
- Globals.serverTerrainManager.load();
+ SaveUtils.loadSave(Globals.currentSaveName);
}
}
@@ -345,16 +357,6 @@ public class LoadingThread extends Thread {
Globals.serverTerrainManager.getChunk(0, 0).addModification(new TerrainModification(0,0,5,5,5));
}
- static void createServerWorld(){
-// Vector2i townLoc = Town.findValidTownLocation();
-// if(townLoc != null){
-// int chunkSize = Globals.serverTerrainManager.getChunkWidth();
-// Globals.spawnPoint = new Vector3f(townLoc.x * chunkSize, (float)Globals.serverTerrainManager.getHeightAtPosition(townLoc.x * chunkSize,townLoc.y * chunkSize), townLoc.y * chunkSize);
-//// System.out.println("Setting spawn point @ " + Globals.spawnPoint);
-//// Town.createTown(townLoc.x,townLoc.y);
-// }
- }
-
static void initServerGameWorldData(){
Globals.serverWorldData = ServerWorldData.createGameWorld(Globals.serverTerrainManager);
}
@@ -483,6 +485,7 @@ public class LoadingThread extends Thread {
double startX = firstPos.x * Globals.serverTerrainManager.getChunkWidth();
double startZ = firstPos.y * Globals.serverTerrainManager.getChunkWidth();
Globals.spawnPoint.set((float)startX,(float)Globals.commonWorldData.getElevationAtPoint(new Vector3d(startX,0,startZ)),(float)startZ);
+ Globals.macroSimulation.setReady(true);
}
@@ -544,14 +547,14 @@ public class LoadingThread extends Thread {
//// EntityUtils.getEntityRotation(tree).rotateAxis((float)-Math.PI/2.0f, new Vector3f(1,0,0));
// }
- Random rand = new Random();
- for(int i = 0; i < 1000; i++){
- String wheatPath = "Models/wheat2.fbx";
- Entity wheatStalk = EntityUtils.spawnDrawableEntity(wheatPath);
- EntityUtils.getPosition(wheatStalk).set(rand.nextFloat() * 20, 0, rand.nextFloat() * 20);
- EntityUtils.getRotation(wheatStalk).rotateLocalX(-(float)Math.PI/2.0f);
- EntityUtils.getScale(wheatStalk).set(1, 1, 2);
- }
+// Random rand = new Random();
+// for(int i = 0; i < 1000; i++){
+// String wheatPath = "Models/wheat2.fbx";
+// Entity wheatStalk = EntityUtils.spawnDrawableEntity(wheatPath);
+// EntityUtils.getPosition(wheatStalk).set(rand.nextFloat() * 20, 0, rand.nextFloat() * 20);
+// EntityUtils.getRotation(wheatStalk).rotateLocalX(-(float)Math.PI/2.0f);
+// EntityUtils.getScale(wheatStalk).set(1, 1, 2);
+// }
// String buildingPath = "Models/building1.fbx";
// Entity building = EntityUtils.spawnDrawableEntity(buildingPath);
diff --git a/src/main/java/electrosphere/game/config/Config.java b/src/main/java/electrosphere/game/config/Config.java
index 63a2be33..c2ab15c6 100644
--- a/src/main/java/electrosphere/game/config/Config.java
+++ b/src/main/java/electrosphere/game/config/Config.java
@@ -6,7 +6,7 @@ import electrosphere.game.config.item.type.model.ItemTypeMap;
import electrosphere.game.config.structure.type.model.StructureTypeMap;
import electrosphere.game.server.race.model.RaceMap;
import electrosphere.game.server.symbolism.model.SymbolMap;
-import electrosphere.util.FileLoadingUtils;
+import electrosphere.util.FileUtils;
/**
*
@@ -23,12 +23,12 @@ public class Config {
public static Config loadDefaultConfig(){
Config config = new Config();
- config.creatureMap = FileLoadingUtils.loadObjectFromAssetPath("Data/creatures.json", CreatureTypeMap.class);
- config.itemMap = FileLoadingUtils.loadObjectFromAssetPath("Data/items.json", ItemTypeMap.class);
- config.structureTypeMap = FileLoadingUtils.loadObjectFromAssetPath("Data/structures.json", StructureTypeMap.class);
- config.foliageMap = FileLoadingUtils.loadObjectFromAssetPath("Data/foliage.json", FoliageTypeMap.class);
- config.symbolMap = FileLoadingUtils.loadObjectFromAssetPath("Data/symbolism.json", SymbolMap.class);
- config.raceMap = FileLoadingUtils.loadObjectFromAssetPath("Data/races.json", RaceMap.class);
+ config.creatureMap = FileUtils.loadObjectFromAssetPath("Data/creatures.json", CreatureTypeMap.class);
+ config.itemMap = FileUtils.loadObjectFromAssetPath("Data/items.json", ItemTypeMap.class);
+ config.structureTypeMap = FileUtils.loadObjectFromAssetPath("Data/structures.json", StructureTypeMap.class);
+ config.foliageMap = FileUtils.loadObjectFromAssetPath("Data/foliage.json", FoliageTypeMap.class);
+ config.symbolMap = FileUtils.loadObjectFromAssetPath("Data/symbolism.json", SymbolMap.class);
+ config.raceMap = FileUtils.loadObjectFromAssetPath("Data/races.json", RaceMap.class);
return config;
}
diff --git a/src/main/java/electrosphere/game/config/UserSettings.java b/src/main/java/electrosphere/game/config/UserSettings.java
index 5d1328ea..e07add89 100644
--- a/src/main/java/electrosphere/game/config/UserSettings.java
+++ b/src/main/java/electrosphere/game/config/UserSettings.java
@@ -1,7 +1,7 @@
package electrosphere.game.config;
import electrosphere.main.Globals;
-import electrosphere.util.FileLoadingUtils;
+import electrosphere.util.FileUtils;
/**
*
@@ -126,7 +126,7 @@ public class UserSettings {
public static void loadUserSettings(){
- Globals.userSettings = FileLoadingUtils.loadObjectFromAssetPath("/Config/settings.json", UserSettings.class);
+ Globals.userSettings = FileUtils.loadObjectFromAssetPath("/Config/settings.json", UserSettings.class);
if(Globals.userSettings == null){
Globals.userSettings = getDefault();
}
diff --git a/src/main/java/electrosphere/game/server/db/DatabaseController.java b/src/main/java/electrosphere/game/server/db/DatabaseController.java
index 197fe662..bb9fde28 100644
--- a/src/main/java/electrosphere/game/server/db/DatabaseController.java
+++ b/src/main/java/electrosphere/game/server/db/DatabaseController.java
@@ -87,4 +87,12 @@ public class DatabaseController {
return rVal;
}
+ public void disconnect(){
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ LoggerInterface.loggerEngine.ERROR("Error disconnecting from DB", ex);
+ }
+ }
+
}
diff --git a/src/main/java/electrosphere/game/server/db/DatabaseUtils.java b/src/main/java/electrosphere/game/server/db/DatabaseUtils.java
new file mode 100644
index 00000000..8e6e80ec
--- /dev/null
+++ b/src/main/java/electrosphere/game/server/db/DatabaseUtils.java
@@ -0,0 +1,39 @@
+package electrosphere.game.server.db;
+
+import electrosphere.logger.LoggerInterface;
+import electrosphere.util.FileUtils;
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ *
+ * @author satellite
+ */
+public class DatabaseUtils {
+ public static boolean initCentralDBFile(String path){
+ String sanitizedPath = "." + FileUtils.sanitizeFilePath(path);
+ if(!FileUtils.checkDirectoryExists(sanitizedPath)){
+ return false;
+ }
+ String dbFilePath = sanitizedPath + "/central.db";
+ DatabaseController controller = new DatabaseController();
+ controller.connect(dbFilePath);
+ String rawScript = "";
+ try {
+ rawScript = FileUtils.getSQLScriptFileAsString("createTables.sql");
+ } catch (IOException ex) {
+ LoggerInterface.loggerEngine.ERROR("Failure reading create db script", ex);
+ return false;
+ }
+ String[] scriptLines = rawScript.split("\n");
+ for(String line : scriptLines){
+ if(line.length() > 1 && !line.startsWith("--")){
+ System.out.println("EXECUTE: " + line);
+ controller.executeStatement(line);
+ }
+ }
+ controller.disconnect();
+ return true;
+ }
+}
diff --git a/src/main/java/electrosphere/game/server/saves/Save.java b/src/main/java/electrosphere/game/server/saves/Save.java
new file mode 100644
index 00000000..a836233e
--- /dev/null
+++ b/src/main/java/electrosphere/game/server/saves/Save.java
@@ -0,0 +1,14 @@
+package electrosphere.game.server.saves;
+
+/**
+ *
+ * @author satellite
+ */
+public class Save {
+ /*
+ FOR FUTURE USE
+ idea is if we want to dump a bunch of like managers into a json file
+ we can put them all in here then serialize this instead
+ or smthn
+ */
+}
diff --git a/src/main/java/electrosphere/game/server/saves/SaveUtils.java b/src/main/java/electrosphere/game/server/saves/SaveUtils.java
new file mode 100644
index 00000000..edc53a5a
--- /dev/null
+++ b/src/main/java/electrosphere/game/server/saves/SaveUtils.java
@@ -0,0 +1,62 @@
+package electrosphere.game.server.saves;
+
+import electrosphere.game.server.db.DatabaseUtils;
+import electrosphere.main.Globals;
+import electrosphere.util.FileUtils;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ *
+ * @author satellite
+ */
+public class SaveUtils {
+
+ static String deriveSaveDirectoryPath(String saveName){
+ return "./saves/" + saveName;
+ }
+
+ /**
+ * Initializes a save directory
+ * @param saveName
+ * @return true if initialized save, false if couldn't initialize
+ */
+ public static boolean initSave(String saveName){
+ String dirPath = deriveSaveDirectoryPath(saveName);
+ //check if exists
+ if(FileUtils.checkDirectoryExists(dirPath)){
+ return false;
+ }
+ //create dir
+ if(!FileUtils.createDirectory(dirPath)){
+ //we for some unknown reason, couldn't make the save dir
+ return false;
+ }
+ //init db file
+ if(!DatabaseUtils.initCentralDBFile(dirPath)){
+ return false;
+ }
+ return true;
+ }
+
+
+
+ public static boolean overwriteSave(String saveName){
+ boolean rVal = false;
+ return rVal;
+ }
+
+
+ public static boolean loadSave(String saveName){
+ String dirPath = deriveSaveDirectoryPath(saveName);
+ String dbFilePath = FileUtils.sanitizeFilePath(dirPath) + "/central.db";
+ Globals.dbController.connect(dbFilePath);
+ Globals.serverTerrainManager.load(saveName);
+ return true;
+ }
+
+ public static List getSaves(){
+ return FileUtils.listDirectory("./saves");
+ }
+
+}
diff --git a/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java b/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java
index e7285314..a6b5620a 100644
--- a/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java
+++ b/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java
@@ -7,7 +7,7 @@ import electrosphere.game.server.terrain.generation.TerrainGen;
import electrosphere.game.server.terrain.models.ModificationList;
import electrosphere.game.server.terrain.models.TerrainModel;
import electrosphere.game.server.terrain.models.TerrainModification;
-import electrosphere.util.FileLoadingUtils;
+import electrosphere.util.FileUtils;
import electrosphere.util.Utilities;
import java.io.File;
import java.io.IOException;
@@ -91,9 +91,8 @@ public class ServerTerrainManager {
}
}
- public void load(){
- Gson gson = new Gson();
- model = FileLoadingUtils.loadObjectFromSavePath("./terrain.json", TerrainModel.class);
+ public void load(String saveName){
+ model = FileUtils.loadObjectFromSavePath(saveName, "./terrain.json", TerrainModel.class);
}
public float[][] getTerrainAtChunk(int x, int y){
diff --git a/src/main/java/electrosphere/game/state/MacroSimulation.java b/src/main/java/electrosphere/game/state/MacroSimulation.java
index c2cbf9a6..5308c0d2 100644
--- a/src/main/java/electrosphere/game/state/MacroSimulation.java
+++ b/src/main/java/electrosphere/game/state/MacroSimulation.java
@@ -14,7 +14,7 @@ import electrosphere.game.server.character.CharacterDataStrings;
import electrosphere.game.server.character.CharacterUtils;
import electrosphere.game.server.structure.virtual.StructureDataStrings;
import electrosphere.game.server.structure.virtual.VirtualStructureUtils;
-import electrosphere.util.FileLoadingUtils;
+import electrosphere.util.FileUtils;
import electrosphere.util.Utilities;
import java.util.Iterator;
import java.util.LinkedList;
@@ -35,7 +35,6 @@ public class MacroSimulation {
boolean isReady = false;
public MacroSimulation(){
- isReady = true;
}
void init(){
@@ -46,115 +45,123 @@ public class MacroSimulation {
public void simulate(){
for(Character character : Globals.macroData.getAliveCharacters()){
//do something
- checkForShelter();
- checkTownMembership();
+ checkForShelter(character);
+ checkTownMembership(character);
}
}
+ public void setReady(boolean status){
+ isReady = status;
+ }
+
+ public boolean isReady(){
+ return isReady;
+ }
+
static final int MAX_PLACE_ATTEMPTS = 10;
- static void checkForShelter(){
- for(Character chara : Globals.macroData.getAliveCharacters()){
- /*
- If doesn’t have shelter, check if in town
- If in town,
- check if there’s an inn/church/friendly family
- if so, try to stay there
- if can’t find place to stay, fashion makeshift shelter
- If no town
- fashion makeshift shelter
- */
- if(!chara.getDataKeys().contains(CharacterDataStrings.SHELTER)){
- Vector2i charPos = CharacterUtils.getDiscretePosition(chara);
- Town nearbyTown = Town.getTownAtPosition(charPos.x,charPos.y);
- if(nearbyTown != null){
- //if town has a place to day
- if(false){
+ static void checkForShelter(Character chara){
+// for(Character chara : Globals.macroData.getAliveCharacters()){
+ /*
+ If doesn’t have shelter, check if in town
+ If in town,
+ check if there’s an inn/church/friendly family
+ if so, try to stay there
+ if can’t find place to stay, fashion makeshift shelter
+ If no town
+ fashion makeshift shelter
+ */
+ if(!chara.getDataKeys().contains(CharacterDataStrings.SHELTER)){
+ Vector2i charPos = CharacterUtils.getDiscretePosition(chara);
+ Town nearbyTown = Town.getTownAtPosition(charPos.x,charPos.y);
+ if(nearbyTown != null){
+ //if town has a place to day
+ if(false){
- } else {
- //try to find a place to put down a structure
-
- }
} else {
- //cry
- //TODO: Get building type to place
- String buildingTypeToPlace = "building1";
//try to find a place to put down a structure
- int dynamicInterpRatio = Globals.serverTerrainManager.getDynamicInterpolationRatio();
- Vector2f placementPos = new Vector2f(
- (float)(charPos.x * dynamicInterpRatio + Math.random() * dynamicInterpRatio),
- (float)(charPos.y * dynamicInterpRatio + Math.random() * dynamicInterpRatio)
+
+ }
+ } else {
+ //cry
+ //TODO: Get building type to place
+ String buildingTypeToPlace = "building1";
+ //try to find a place to put down a structure
+ int dynamicInterpRatio = Globals.serverTerrainManager.getDynamicInterpolationRatio();
+ Vector2f placementPos = new Vector2f(
+ (float)(charPos.x * dynamicInterpRatio + Math.random() * dynamicInterpRatio),
+ (float)(charPos.y * dynamicInterpRatio + Math.random() * dynamicInterpRatio)
+ );
+ int attempts = 0;
+ while(!VirtualStructureUtils.validStructurePlacementPosition(placementPos.x, placementPos.y, buildingTypeToPlace)){
+ placementPos = new Vector2f(
+ (float)(charPos.x * dynamicInterpRatio + Math.random() * dynamicInterpRatio),
+ (float)(charPos.y * dynamicInterpRatio + Math.random() * dynamicInterpRatio)
);
- int attempts = 0;
- while(!VirtualStructureUtils.validStructurePlacementPosition(placementPos.x, placementPos.y, buildingTypeToPlace)){
- placementPos = new Vector2f(
- (float)(charPos.x * dynamicInterpRatio + Math.random() * dynamicInterpRatio),
- (float)(charPos.y * dynamicInterpRatio + Math.random() * dynamicInterpRatio)
- );
- attempts++;
- if(attempts > MAX_PLACE_ATTEMPTS){
- placementPos = null;
- break;
- }
- }
- if(placementPos != null){
- Structure placedStructure = VirtualStructureUtils.placeStructureAtPoint(placementPos.x, placementPos.y, buildingTypeToPlace);
- CharacterUtils.addShelter(chara, placedStructure);
- VirtualStructureUtils.addResident(placedStructure, chara);
+ attempts++;
+ if(attempts > MAX_PLACE_ATTEMPTS){
+ placementPos = null;
+ break;
}
}
+ if(placementPos != null){
+ Structure placedStructure = VirtualStructureUtils.placeStructureAtPoint(placementPos.x, placementPos.y, buildingTypeToPlace);
+ CharacterUtils.addShelter(chara, placedStructure);
+ VirtualStructureUtils.addResident(placedStructure, chara);
+ }
}
}
+// }
}
- static void checkTownMembership(){
+ static void checkTownMembership(Character chara){
//TODO: eventually exclude people who shouldn't belong to a town (traders, bandits, etc)
- for(Character chara : Globals.macroData.getAliveCharacters()){
- boolean hasHometown = chara.getDataKeys().contains(CharacterDataStrings.HOMETOWN);
- boolean hasShelter = chara.getDataKeys().contains(CharacterDataStrings.SHELTER);
- //if has structure & no hometown
- if(!hasHometown && hasShelter){
- Structure shelter = CharacterUtils.getShelter(chara);
- //if there's at least one other structure nearby
- Vector2i shelterDiscretePos = new Vector2i(shelter.getWorldX(),shelter.getWorldY());
- List nearbyPopulatedStructures = new LinkedList();
- for(Structure currentStruct : Globals.macroData.getStructures()){
- if(currentStruct.getWorldX() == shelterDiscretePos.x && currentStruct.getWorldY() == shelterDiscretePos.y && currentStruct != shelter){
- //if has a resident
- if(shelter.getDataKeys().contains(StructureDataStrings.RESIDENTS) && VirtualStructureUtils.getResidents(shelter).size() > 0){
- boolean noTown = true;
- for(Town town : Globals.macroData.getTowns()){
- if(town.getStructures().contains(currentStruct)){
- noTown = false;
- }
- }
- if(noTown){
- nearbyPopulatedStructures.add(currentStruct);
+// for(Character chara : Globals.macroData.getAliveCharacters()){
+ boolean hasHometown = chara.getDataKeys().contains(CharacterDataStrings.HOMETOWN);
+ boolean hasShelter = chara.getDataKeys().contains(CharacterDataStrings.SHELTER);
+ //if has structure & no hometown
+ if(!hasHometown && hasShelter){
+ Structure shelter = CharacterUtils.getShelter(chara);
+ //if there's at least one other structure nearby
+ Vector2i shelterDiscretePos = new Vector2i(shelter.getWorldX(),shelter.getWorldY());
+ List nearbyPopulatedStructures = new LinkedList();
+ for(Structure currentStruct : Globals.macroData.getStructures()){
+ if(currentStruct.getWorldX() == shelterDiscretePos.x && currentStruct.getWorldY() == shelterDiscretePos.y && currentStruct != shelter){
+ //if has a resident
+ if(shelter.getDataKeys().contains(StructureDataStrings.RESIDENTS) && VirtualStructureUtils.getResidents(shelter).size() > 0){
+ boolean noTown = true;
+ for(Town town : Globals.macroData.getTowns()){
+ if(town.getStructures().contains(currentStruct)){
+ noTown = false;
}
}
- }
- }
- if(nearbyPopulatedStructures.size() > 0){
- int numStructures = 0;
- int numResidents = 0;
- //form town
- Town newTown = Town.createTown(shelterDiscretePos.x, shelterDiscretePos.y);
- for(Structure structure : nearbyPopulatedStructures){
- numStructures++;
- newTown.addStructure(structure);
- for(Character resident : VirtualStructureUtils.getResidents(structure)){
- numResidents++;
- newTown.addResident(resident);
- CharacterUtils.addHometown(resident, newTown);
+ if(noTown){
+ nearbyPopulatedStructures.add(currentStruct);
}
}
- newTown.addStructure(shelter);
- newTown.addResident(chara);
- CharacterUtils.addHometown(chara, newTown);
- System.out.println("Formed town with " + numStructures + " structures and " + numResidents + " residents");
}
}
+ if(nearbyPopulatedStructures.size() > 0){
+ int numStructures = 0;
+ int numResidents = 0;
+ //form town
+ Town newTown = Town.createTown(shelterDiscretePos.x, shelterDiscretePos.y);
+ for(Structure structure : nearbyPopulatedStructures){
+ numStructures++;
+ newTown.addStructure(structure);
+ for(Character resident : VirtualStructureUtils.getResidents(structure)){
+ numResidents++;
+ newTown.addResident(resident);
+ CharacterUtils.addHometown(resident, newTown);
+ }
+ }
+ newTown.addStructure(shelter);
+ newTown.addResident(chara);
+ CharacterUtils.addHometown(chara, newTown);
+ System.out.println("Formed town with " + numStructures + " structures and " + numResidents + " residents");
+ }
}
+// }
}
static void checkInitCombat(){
diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java
index 445efeb7..971127f1 100644
--- a/src/main/java/electrosphere/main/Globals.java
+++ b/src/main/java/electrosphere/main/Globals.java
@@ -50,7 +50,7 @@ import electrosphere.renderer.ui.WidgetUtils;
import electrosphere.renderer.ui.font.FontUtils;
import electrosphere.renderer.ui.font.RawFontMap;
import electrosphere.renderer.ui.font.TextBox;
-import electrosphere.util.FileLoadingUtils;
+import electrosphere.util.FileUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
@@ -111,6 +111,12 @@ public class Globals {
public static CollisionEngine collisionEngine;
+ //
+ // Game Save stuff
+ //
+ public static String currentSaveName = "default";
+
+
//
// Game config
//
@@ -291,7 +297,7 @@ public class Globals {
// try {
//deserializes the texture map from its default path using gson
//also done in one line
- textureMapDefault = FileLoadingUtils.loadObjectFromAssetPath("Textures/default_texture_map.json", TextureMap.class);
+ textureMapDefault = FileUtils.loadObjectFromAssetPath("Textures/default_texture_map.json", TextureMap.class);
// textureMapDefault = gson.fromJson(Files.newBufferedReader(new File(Thread.currentThread().getContextClassLoader().getResource("Textures/default_texture_map.json").getFile()).toPath()), TextureMap.class); //only the best of coding practices :)
// } catch (IOException ex) { ex.printStackTrace(); } //TODO: handle better :tm:
//create entity manager
@@ -325,7 +331,7 @@ public class Globals {
materialDefault.set_specular("Textures/default_specular.png");
//create default lights
assetManager.registerModelToSpecificString(ModelUtils.createBitmapDisplay(), AssetDataStrings.ASSET_STRING_BITMAP_FONT);
- RawFontMap fontMap = FileLoadingUtils.loadObjectFromAssetPath("Textures/Fonts/myFontMap.json", RawFontMap.class);
+ RawFontMap fontMap = FileUtils.loadObjectFromAssetPath("Textures/Fonts/myFontMap.json", RawFontMap.class);
FontUtils.setFontDataMap(fontMap);
//particle billboard model
particleBillboardModel = assetManager.registerModel(RenderUtils.createParticleModel());
diff --git a/src/main/java/electrosphere/main/Main.java b/src/main/java/electrosphere/main/Main.java
index c03f5d46..414ab07e 100644
--- a/src/main/java/electrosphere/main/Main.java
+++ b/src/main/java/electrosphere/main/Main.java
@@ -16,6 +16,7 @@ import electrosphere.entity.types.attach.AttachUtils;
import electrosphere.engine.LoadingThread;
import electrosphere.game.client.ClientFunctions;
import electrosphere.game.config.UserSettings;
+import electrosphere.game.server.saves.SaveUtils;
import electrosphere.game.server.terrain.manager.ServerTerrainManager;
import electrosphere.game.server.world.MacroData;
import electrosphere.game.server.world.ServerWorldData;
@@ -23,7 +24,7 @@ import electrosphere.game.state.MacroSimulation;
import electrosphere.game.state.MicroSimulation;
import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.RenderingEngine;
-import electrosphere.util.FileLoadingUtils;
+import electrosphere.util.FileUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
@@ -136,6 +137,8 @@ public class Main {
// ex.printStackTrace();
// }
// }
+
+
//debug: create terrain/world viewer
// TerrainViewer.runViewer();
@@ -217,6 +220,13 @@ public class Main {
}
ClientFunctions.runClientFunctions();
+ ///
+ /// M A C R O S I M U L A T I O N S T U F F
+ ///
+ if(Globals.macroSimulation != null && Globals.macroSimulation.isReady()){
+ Globals.macroSimulation.simulate();
+ }
+
//
// P L A Y E R W O R L D P O S I T I O N U P D A T E
//
diff --git a/src/main/java/electrosphere/menu/Menu.java b/src/main/java/electrosphere/menu/Menu.java
index c0426555..fa29476d 100644
--- a/src/main/java/electrosphere/menu/Menu.java
+++ b/src/main/java/electrosphere/menu/Menu.java
@@ -15,6 +15,11 @@ public class Menu {
public enum MenuType {
TITLE_MENU,
+ WORLD_SELECT_MENU, //select preexisting world (Char already created)
+ WORLD_CREATE_MENU, //create world
+ SAVE_CREATE_MENU, //select basic save settings
+ CHARACTER_CREATE_MENU, //create character
+ FINALIZE_SAVE_CREATION_MENU, //finalize the save before we commit
MULTIPLAYER_MENU,
IP_MENU,
OPTIONS_MAIN_MENU,
diff --git a/src/main/java/electrosphere/menu/MenuTransition.java b/src/main/java/electrosphere/menu/MenuTransition.java
index da7d732d..a7de204a 100644
--- a/src/main/java/electrosphere/menu/MenuTransition.java
+++ b/src/main/java/electrosphere/menu/MenuTransition.java
@@ -20,11 +20,13 @@ public class MenuTransition {
switch(m.getCurrentOption()){
//single player
case 0:
+// m.dispose();
+// Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
+// Globals.RUN_CLIENT = true;
+// Globals.RUN_SERVER = true;
+// Globals.loadingThread.start();
m.dispose();
- Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
- Globals.RUN_CLIENT = true;
- Globals.RUN_SERVER = true;
- Globals.loadingThread.start();
+ Globals.currentMenu = MenuUtils.createWorldSelectMenu();
break;
//multi player
case 1:
@@ -51,6 +53,12 @@ public class MenuTransition {
break;
}
break;
+ case WORLD_SELECT_MENU:
+ break;
+ case WORLD_CREATE_MENU:
+ break;
+ case SAVE_CREATE_MENU:
+ break;
case MULTIPLAYER_MENU:
switch(m.getCurrentOption()){
//HOST
@@ -99,6 +107,10 @@ public class MenuTransition {
case TITLE_MENU:
Main.running = false;
break;
+ case WORLD_SELECT_MENU:
+ m.dispose();
+ Globals.currentMenu = MenuUtils.createTitleMenu();
+ break;
case MULTIPLAYER_MENU:
m.dispose();
Globals.currentMenu = MenuUtils.createTitleMenu();
diff --git a/src/main/java/electrosphere/menu/MenuUtils.java b/src/main/java/electrosphere/menu/MenuUtils.java
index 7315b3ee..e4862ac1 100644
--- a/src/main/java/electrosphere/menu/MenuUtils.java
+++ b/src/main/java/electrosphere/menu/MenuUtils.java
@@ -1,11 +1,13 @@
package electrosphere.menu;
+import electrosphere.game.server.saves.SaveUtils;
import electrosphere.main.Globals;
import electrosphere.menu.Menu.MenuType;
import electrosphere.net.NetUtils;
import electrosphere.net.server.Server;
import electrosphere.renderer.ui.Widget;
import electrosphere.renderer.ui.WidgetUtils;
+import java.util.List;
import org.joml.Vector3f;
/**
@@ -28,13 +30,45 @@ public class MenuUtils {
return rVal;
}
- public static Menu createMultiplayerMenu(){
- Menu rVal = new Menu(MenuType.MULTIPLAYER_MENU);
+ public static Menu createWorldSelectMenu(){
+ Menu rVal = new Menu(MenuType.WORLD_SELECT_MENU);
int screenTop = Globals.WINDOW_HEIGHT - 150;
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 125, "HOST", true));
- rVal.setMenuOptionColor(0, new Vector3f(0.2f,0.8f,0.5f));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 200, "JOIN", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 275, "BACK", true));
+ List saveNames = SaveUtils.getSaves();
+ int verticalPosition = 125;
+ for(String saveName : saveNames){
+ if(!saveName.startsWith(".")){
+ rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - verticalPosition, saveName.toUpperCase(), true));
+ verticalPosition = verticalPosition + 75;
+ }
+ }
+ rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - verticalPosition - 200, "CREATE WORLD", true));
+ return rVal;
+ }
+
+ public static Menu createWorldCreationMenu(){
+ Menu rVal = new Menu(MenuType.WORLD_CREATE_MENU);
+ int screenTop = Globals.WINDOW_HEIGHT - 150;
+ List saveNames = SaveUtils.getSaves();
+ int verticalPosition = 125;
+ //TODO: add text input to name world
+ rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - verticalPosition, "CREATE WORLD", true));
+ return rVal;
+ }
+
+ public static Menu createSaveCreationMenu(){
+ Menu rVal = new Menu(MenuType.WORLD_CREATE_MENU);
+ int screenTop = Globals.WINDOW_HEIGHT - 150;
+ List saveNames = SaveUtils.getSaves();
+ int verticalPosition = 125;
+ //TODO: add text input to name world
+ rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - verticalPosition, "CREATE WORLD", true));
+ return rVal;
+ }
+
+ public static Menu createMultiplayerMenu(){
+ Menu rVal = new Menu(MenuType.SAVE_CREATE_MENU);
+ int screenTop = Globals.WINDOW_HEIGHT - 150;
+ rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 125, "CREATE", true));
return rVal;
}
diff --git a/src/main/java/electrosphere/renderer/RenderingEngine.java b/src/main/java/electrosphere/renderer/RenderingEngine.java
index 531fe753..38afe0d6 100644
--- a/src/main/java/electrosphere/renderer/RenderingEngine.java
+++ b/src/main/java/electrosphere/renderer/RenderingEngine.java
@@ -571,7 +571,6 @@ public class RenderingEngine {
static void renderUI(){
- Matrix4f modelTransformMatrix = new Matrix4f();
glDisable(GL_DEPTH_TEST);
for(Widget currentWidget : Globals.widgetManager.getWidgetList()){
if(currentWidget.getVisible()){
diff --git a/src/main/java/electrosphere/renderer/ShaderProgram.java b/src/main/java/electrosphere/renderer/ShaderProgram.java
index 04a04b4a..bee505fc 100644
--- a/src/main/java/electrosphere/renderer/ShaderProgram.java
+++ b/src/main/java/electrosphere/renderer/ShaderProgram.java
@@ -2,7 +2,7 @@ package electrosphere.renderer;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Main;
-import electrosphere.util.FileLoadingUtils;
+import electrosphere.util.FileUtils;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
@@ -66,7 +66,7 @@ public class ShaderProgram {
//
String tempForReadingShaders = "";
try {
- BufferedReader br = new BufferedReader(new InputStreamReader(FileLoadingUtils.getAssetFileAsStream(vertex_shader_path)));
+ BufferedReader br = new BufferedReader(new InputStreamReader(FileUtils.getAssetFileAsStream(vertex_shader_path)));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
@@ -85,7 +85,7 @@ public class ShaderProgram {
String vertexShaderSource = tempForReadingShaders;
//This try-catch block reads the FragmentShader source into memory
try {
- BufferedReader br = new BufferedReader(new InputStreamReader(FileLoadingUtils.getAssetFileAsStream(fragment_shader_path)));
+ BufferedReader br = new BufferedReader(new InputStreamReader(FileUtils.getAssetFileAsStream(fragment_shader_path)));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
@@ -179,7 +179,7 @@ public class ShaderProgram {
//
String tempForReadingShaders = "";
try {
- BufferedReader br = new BufferedReader(new FileReader(FileLoadingUtils.getAssetFile("/Shaders/VertexShader.vs")));
+ BufferedReader br = new BufferedReader(new FileReader(FileUtils.getAssetFile("/Shaders/VertexShader.vs")));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
@@ -198,7 +198,7 @@ public class ShaderProgram {
String vertexShaderSource = tempForReadingShaders;
//This try-catch block reads the FragmentShader source into memory
try {
- BufferedReader br = new BufferedReader(new FileReader(FileLoadingUtils.getAssetFile("/Shaders/FragmentShader.fs")));
+ BufferedReader br = new BufferedReader(new FileReader(FileUtils.getAssetFile("/Shaders/FragmentShader.fs")));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
@@ -290,8 +290,8 @@ public class ShaderProgram {
String vertexShaderSource = "";
String fragmentShaderSource = "";
try {
- vertexShaderSource = FileLoadingUtils.getAssetFileAsString(vertex_shader_path);
- fragmentShaderSource = FileLoadingUtils.getAssetFileAsString(fragment_shader_path);
+ vertexShaderSource = FileUtils.getAssetFileAsString(vertex_shader_path);
+ fragmentShaderSource = FileUtils.getAssetFileAsString(fragment_shader_path);
} catch(IOException ex){
}
diff --git a/src/main/java/electrosphere/renderer/texture/Texture.java b/src/main/java/electrosphere/renderer/texture/Texture.java
index d598aea3..0d0a0463 100644
--- a/src/main/java/electrosphere/renderer/texture/Texture.java
+++ b/src/main/java/electrosphere/renderer/texture/Texture.java
@@ -6,7 +6,7 @@
package electrosphere.renderer.texture;
import electrosphere.main.Main;
-import electrosphere.util.FileLoadingUtils;
+import electrosphere.util.FileUtils;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
@@ -53,7 +53,7 @@ public class Texture {
width = 1;
height = 1;
try {
- BufferedImage image_data = ImageIO.read(FileLoadingUtils.getAssetFile(path));
+ BufferedImage image_data = ImageIO.read(FileUtils.getAssetFile(path));
if (
image_data.getType() == BufferedImage.TYPE_3BYTE_BGR ||
image_data.getType() == BufferedImage.TYPE_INT_RGB
diff --git a/src/main/java/electrosphere/renderer/ui/WidgetUtils.java b/src/main/java/electrosphere/renderer/ui/WidgetUtils.java
index 7b831f68..bd0c43b3 100644
--- a/src/main/java/electrosphere/renderer/ui/WidgetUtils.java
+++ b/src/main/java/electrosphere/renderer/ui/WidgetUtils.java
@@ -34,6 +34,7 @@ public class WidgetUtils {
int cols = text.length();
int rows = 1;
TextBox rVal = new TextBox(-cols * charWidth / 2, windowTop, cols * charWidth, rows * charHeight, rows, cols, text, render, false);
+ rVal.setVisible(true);
Globals.widgetManager.registerWidget(rVal);
return rVal;
}
diff --git a/src/main/java/electrosphere/util/FileLoadingUtils.java b/src/main/java/electrosphere/util/FileUtils.java
similarity index 77%
rename from src/main/java/electrosphere/util/FileLoadingUtils.java
rename to src/main/java/electrosphere/util/FileUtils.java
index 5ce94127..54b55fab 100644
--- a/src/main/java/electrosphere/util/FileLoadingUtils.java
+++ b/src/main/java/electrosphere/util/FileUtils.java
@@ -10,11 +10,13 @@ import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
+import java.util.LinkedList;
+import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
-public class FileLoadingUtils {
+public class FileUtils {
@@ -109,7 +111,9 @@ public class FileLoadingUtils {
public static String sanitizeFilePath(String filePath){
String rVal = new String(filePath);
rVal = rVal.trim();
- if(!rVal.startsWith("/")){
+ if(rVal.startsWith("./")){
+ return rVal;
+ } else if(!rVal.startsWith("/")){
rVal = "/" + rVal;
}
return rVal;
@@ -140,9 +144,11 @@ public class FileLoadingUtils {
return targetFile;
}
- public static File getSaveFile(String pathName){
+ public static File getSaveFile(String saveName, String pathName){
String sanitizedFilePath = sanitizeFilePath(pathName);
- File targetFile = new File("./saves" + sanitizedFilePath);
+ String fullPath = "./saves/" + saveName + "/" + sanitizedFilePath;
+ System.out.println(fullPath);
+ File targetFile = new File(fullPath);
return targetFile;
}
@@ -170,18 +176,69 @@ public class FileLoadingUtils {
return rVal;
}
- public static T loadObjectFromSavePath(String pathName, Class className){
+ public static String getSQLScriptFileAsString(String pathName) throws IOException {
+ String sanitizedFilePath = sanitizeFilePath(pathName);
+ File targetFile = new File("./Scripts" + sanitizedFilePath);
+ return Files.readString(targetFile.toPath());
+ }
+
+ public static T loadObjectFromSavePath(String saveName, String pathName, Class className){
T rVal = null;
String sanitizedFilePath = sanitizeFilePath(pathName);
Gson gson = new Gson();
try {
- rVal = gson.fromJson(Files.newBufferedReader(getSaveFile(sanitizedFilePath).toPath()), className);
+ rVal = gson.fromJson(Files.newBufferedReader(getSaveFile(saveName,sanitizedFilePath).toPath()), className);
} catch (IOException ex) {
ex.printStackTrace();
}
return rVal;
}
+ /**
+ * Checks if a directory exists
+ * @param directoryName
+ * @return true if directory exists, false otherwise
+ */
+ public static boolean checkDirectoryExists(String directoryName){
+ File targetDir = new File(sanitizeFilePath(directoryName));
+ if(targetDir.exists()){
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Trys to create a directory
+ * @param directoryName
+ * @return true if directory was created, false if it was not
+ */
+ public static boolean createDirectory(String directoryName){
+ String sanitizedPath = "." + sanitizeFilePath(directoryName);
+ File targetDir = new File(sanitizedPath);
+ if(targetDir.exists()){
+ return false;
+ } else {
+ return targetDir.mkdirs();
+ }
+ }
+
+
+ public static List listDirectory(String directoryName){
+ List rVal = new LinkedList();
+ String sanitizedPath = sanitizeFilePath(directoryName);
+ File targetDir = new File(sanitizedPath);
+ String[] files = targetDir.list();
+ for(String name : files){
+ rVal.add(name);
+ }
+ return rVal;
+ }
+
+
+
+
+
// public static T loadModelObjectFromBakedJsonFile(String fileName, Class className){
// T rVal = null;
// String sanitizedFilePath = sanitizeBakedFilePath(fileName);
diff --git a/src/main/java/electrosphere/util/ModelLoader.java b/src/main/java/electrosphere/util/ModelLoader.java
index 6d689d70..e4e8250d 100644
--- a/src/main/java/electrosphere/util/ModelLoader.java
+++ b/src/main/java/electrosphere/util/ModelLoader.java
@@ -30,7 +30,7 @@ public class ModelLoader {
AIScene scene;
// File file = new File(Thread.currentThread().getContextClassLoader().getResource(fileName).getFile());
// Main.class.getResourceAsStream(fileName).readAllBytes();
- File toRead = FileLoadingUtils.getAssetFile(fileName);
+ File toRead = FileUtils.getAssetFile(fileName);
scene = aiImportFile(toRead.getAbsolutePath(),
aiProcess_GenSmoothNormals |
aiProcess_JoinIdenticalVertices |
diff --git a/src/main/java/electrosphere/util/worldviewer/TerrainViewer.java b/src/main/java/electrosphere/util/worldviewer/TerrainViewer.java
index 51a0ac38..10a27bc8 100644
--- a/src/main/java/electrosphere/util/worldviewer/TerrainViewer.java
+++ b/src/main/java/electrosphere/util/worldviewer/TerrainViewer.java
@@ -6,7 +6,7 @@ import electrosphere.game.server.terrain.manager.ServerTerrainManager;
import electrosphere.game.server.terrain.models.TerrainModel;
import electrosphere.main.Globals;
import electrosphere.main.Main;
-import electrosphere.util.FileLoadingUtils;
+import electrosphere.util.FileUtils;
import electrosphere.util.Utilities;
import java.awt.Color;
import java.awt.Graphics;