/**
* 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.ship.logic;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import jo.sm.data.BlockTypes;
import jo.sm.data.SparseMatrix;
import jo.sm.ent.data.Tag;
import jo.sm.ent.logic.TagLogic;
import jo.sm.ent.logic.TagUtils;
import jo.sm.logic.IOLogic;
import jo.sm.ship.data.Block;
import jo.sm.ship.data.DockEntry;
import jo.sm.ship.data.Meta;
/**
* @Auther Jo Jaquinta for SMEdit Classic - version 1.0
**/
public class MetaLogic {
private static final Logger log = Logger.getLogger(MetaLogic.class.getName());
public static Meta readFile(InputStream is, boolean close) throws IOException {
DataInputStream dis;
if (is instanceof DataInputStream) {
dis = (DataInputStream) is;
} else {
dis = new DataInputStream(is);
}
Meta meta = new Meta();
meta.setUnknown1(dis.readInt());
meta.setUnknown2(dis.readByte());
if (meta.getUnknown2() == 1) {
return meta;
}
if (meta.getUnknown2() != 3) {
throw new IllegalArgumentException("Unrecognized unknown2: " + meta.getUnknown2());
}
int docksNum = dis.readInt();
for (int i = 0; i < docksNum; i++) {
DockEntry entry = new DockEntry();
entry.setSubFolder(dis.readUTF());
// int clen = dis.readInt();
// byte[] cdata = new byte[clen];
// dis.readFully(cdata);
// entry.setSubFolder(new String(cdata, "utf-8"));
entry.setPosition(IOLogic.readPoint3i(dis));
entry.setA(IOLogic.readPoint3f(dis));
entry.setBlockID(dis.readShort());
entry.setUnknown1(dis.readByte());
meta.getDocks().add(entry);
}
meta.setUnknown3(dis.readByte());
Tag tags = TagLogic.readFile(dis, close);
meta.setData(tags);
return meta;
}
public static void writeFile(Meta meta, OutputStream os, boolean close) throws IOException {
DataOutputStream dos;
if (os instanceof DataOutputStream) {
dos = (DataOutputStream) os;
} else {
dos = new DataOutputStream(os);
}
dos.writeInt(meta.getUnknown1());
dos.writeByte(meta.getUnknown2());
if (meta.getUnknown2() == 3) {
dos.writeInt(meta.getDocks().size());
for (DockEntry entry : meta.getDocks()) {
dos.writeUTF(entry.getSubFolder());
IOLogic.write(dos, entry.getPosition());
IOLogic.write(dos, entry.getA());
dos.writeShort(entry.getBlockID());
dos.writeByte(entry.getUnknown1());
}
dos.writeByte(meta.getUnknown3());
TagLogic.writeFile(meta.getData(), dos, false);
} else if (meta.getUnknown2() == 1) {
;//unknown
} else {
throw new IllegalArgumentException("Unrecognized unknown2: " + meta.getUnknown2());
}
if (close) {
dos.close();
}
}
public static void dump(Meta meta) {
log.log(Level.INFO, "Meta (u1=" + meta.getUnknown1() + ", u2=" + meta.getUnknown2() + ", u3=" + meta.getUnknown3() + ")");
//System.out.println("Meta (u1=" + meta.getUnknown1() + ", u2=" + meta.getUnknown2() + ", u3=" + meta.getUnknown3() + ")");
for (DockEntry entry : meta.getDocks()) {
log.log(Level.INFO, " " + entry.getSubFolder() + " @" + entry.getPosition() + "/" + entry.getA()
+ " " + BlockTypes.BLOCK_NAMES.get(entry.getBlockID()) + " (" + entry.getUnknown1() + ")");
//System.out.println(" " + entry.getSubFolder() + " @" + entry.getPosition() + "/" + entry.getA()
//+ " " + BlockTypes.BLOCK_NAMES.get(entry.getBlockID()) + " (" + entry.getUnknown1() + ")");
}
TagUtils.dump(meta.getData(), " ");
}
public static Meta make(SparseMatrix<Block> grid) {
Meta meta = new Meta();
meta.setUnknown1(0);
meta.setUnknown2((byte) 1);
return meta;
}
}