/**
* Copyright 2014
* SMEdit https://github.com/StarMade/SMEdit
* SMTools https://github.com/StarMade/SMTools
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
**/
package jo.sm.logic;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import jo.sm.data.SparseMatrix;
import jo.sm.data.StarMade;
import jo.sm.mods.IPluginCallback;
import jo.sm.ship.data.Block;
import jo.sm.ship.data.Blueprint;
import jo.sm.ship.data.Data;
import jo.sm.ship.data.Header;
import jo.sm.ship.data.Logic;
import jo.sm.ship.data.Meta;
import jo.sm.ship.logic.DataLogic;
import jo.sm.ship.logic.HeaderLogic;
import jo.sm.ship.logic.LogicLogic;
import jo.sm.ship.logic.MetaLogic;
import jo.sm.ship.logic.ShipLogic;
import jo.sm.ui.logic.ShipSpec;
import jo.vecmath.Point3i;
public class BlueprintLogic {
private static final Logger log = Logger.getLogger(BlueprintLogic.class.getName());
public static List<String> getBlueprintNames() {
StarMade sm = StarMadeLogic.getInstance();
if (sm.getBlueprints() == null) {
sm.setBlueprints(new ArrayList<String>());
File blueprintsDir = new File(sm.getBaseDir(), "blueprints");
scanBlueprintsDir(blueprintsDir, sm.getBlueprints());
}
return sm.getBlueprints();
}
private static void scanBlueprintsDir(File blueprintsDir, List<String> blueprints) {
for (File f : blueprintsDir.listFiles()) {
if (isValidBlueprintDir(f)) {
blueprints.add(f.getName());
}
}
}
public static List<String> getDefaultBlueprintNames() {
StarMade sm = StarMadeLogic.getInstance();
if (sm.getDefaultBlueprints() == null) {
sm.setDefaultBlueprints(new ArrayList<String>());
File blueprintsDir = new File(sm.getBaseDir(), "blueprints-default");
scanBlueprintsDir(blueprintsDir, sm.getDefaultBlueprints());
}
return sm.getDefaultBlueprints();
}
private static boolean isValidBlueprintDir(File dir) {
File header = new File(dir, "header.smbph");
return header.exists();
}
public static Blueprint readBlueprint(String name, IPluginCallback cb) throws IOException {
File blueprintsDir = new File(StarMadeLogic.getInstance().getBaseDir(), "blueprints");
File blueprintDir = new File(blueprintsDir, name);
return readBlueprint(blueprintDir, cb);
}
public static Blueprint readDefaultBlueprint(String name, IPluginCallback cb) throws IOException {
File blueprintsDir = new File(StarMadeLogic.getInstance().getBaseDir(), "blueprints-default");
File blueprintDir = new File(blueprintsDir, name);
return readBlueprint(blueprintDir, cb);
}
public static Blueprint readBlueprint(File dir, IPluginCallback cb) throws IOException {
Blueprint bp = new Blueprint();
bp.setName(dir.getName());
File header = new File(dir, "header.smbph");
InputStream headerIS = new FileInputStream(header);
bp.setHeader(HeaderLogic.readFile(headerIS, true));
File logic = new File(dir, "logic.smbpl");
InputStream logicIS = new FileInputStream(logic);
bp.setLogic(LogicLogic.readFile(logicIS, true));
File meta = new File(dir, "meta.smbpm");
InputStream metaIS = new FileInputStream(meta);
bp.setMeta(MetaLogic.readFile(metaIS, true));
File dataDir = new File(dir, "DATA");
bp.setData(DataLogic.readFiles(dataDir, bp.getName(), cb));
return bp;
}
public static void saveBlueprint(SparseMatrix<Block> grid, ShipSpec spec, boolean def, IPluginCallback cb) {
try {
Map<Point3i, Data> data = ShipLogic.getData(grid);
File baseDir = spec.getFile();
if (!baseDir.exists()) {
baseDir.mkdir();
if (def) {
StarMadeLogic.getInstance().setDefaultBlueprints(null);
} else {
StarMadeLogic.getInstance().setBlueprints(null);
}
}
// header file
Header header = HeaderLogic.make(grid);
File headerFile = new File(baseDir, "header.smbph");
HeaderLogic.writeFile(header, new FileOutputStream(headerFile), true);
Logic logic = LogicLogic.make(grid);
File logicFile = new File(baseDir, "logic.smbpl");
LogicLogic.writeFile(logic, new FileOutputStream(logicFile), true);
Meta meta = MetaLogic.make(grid);
File metaFile = new File(baseDir, "meta.smbpm");
MetaLogic.writeFile(meta, new FileOutputStream(metaFile), true);
// data file
File dataDir = new File(baseDir, "DATA");
if (!dataDir.exists()) {
dataDir.mkdir();
}
DataLogic.writeFiles(data, dataDir, spec.getName(), cb);
} catch (IOException e1) {
log.log(Level.WARNING, "saveBlueprint failed!", e1);
e1.printStackTrace();
}
}
}