/*
* Copyright (C) 2010 Medo <smaxein@googlemail.com>
*
* This file is part of GmkSplitter.
* GmkSplitter is free software and comes with ABSOLUTELY NO WARRANTY.
* See LICENSE for details.
*/
package com.ganggarrison.gmdec.files;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
import org.lateralgm.components.impl.ResNode;
import org.lateralgm.file.GmFile;
import org.lateralgm.file.iconio.ICOFile;
import org.lateralgm.resources.GameSettings;
import org.lateralgm.resources.GameSettings.PGameSettings;
import com.ganggarrison.gmdec.DeferredReferenceCreatorNotifier;
import com.ganggarrison.gmdec.FileTools;
import com.ganggarrison.gmdec.ResourceTreeEntry;
import com.ganggarrison.gmdec.ResourceTreeEntry.Type;
import com.ganggarrison.gmdec.xml.GameSettingsXmlFormat;
public class GameSettingsFormat extends FileTreeFormat<GameSettings> {
private static final String baseFilename = "Global Game Settings";
private static final String xmlFilename = baseFilename + ".xml";
private static final String frontLoadBarFilename = "loadbar front.png";
private static final String backLoadBarFilename = "loadbar background.png";
private static final String loadingImageFilename = "loading image.png";
private static final String iconFilename = "game icon.ico";
@Override
public GameSettings read(File path, ResourceTreeEntry entry, DeferredReferenceCreatorNotifier drcn)
throws IOException {
GameSettings settings = new GameSettingsXmlFormat().read(new File(path, xmlFilename), drcn);
File frontLoadBarFile = new File(path, frontLoadBarFilename);
if (frontLoadBarFile.isFile()) {
settings.put(PGameSettings.FRONT_LOAD_BAR, ImageIO.read(frontLoadBarFile));
}
File backLoadBarFile = new File(path, backLoadBarFilename);
if (backLoadBarFile.isFile()) {
settings.put(PGameSettings.BACK_LOAD_BAR, ImageIO.read(backLoadBarFile));
}
File loadingImageFile = new File(path, loadingImageFilename);
if (loadingImageFile.isFile()) {
settings.put(PGameSettings.LOADING_IMAGE, ImageIO.read(loadingImageFile));
}
File iconFile = new File(path, iconFilename);
if (iconFile.isFile()) {
settings.put(PGameSettings.GAME_ICON, new ICOFile(FileTools.readWholeFileBytes(iconFile)));
}
return settings;
}
@Override
public void addResToTree(GameSettings resource, ResNode parent) {
parent.addChild("Global Game Settings", ResNode.STATUS_SECONDARY, GameSettings.class);
}
@Override
public ResourceTreeEntry createResourceTreeEntry(GameSettings resource) {
return new ResourceTreeEntry(baseFilename, baseFilename, Type.RESOURCE);
}
@Override
public void addAllResourcesToGmFile(List<GameSettings> resources, GmFile gmf) {
if (resources.size() != 1) {
throw new IllegalArgumentException("There is only one game settings object.");
}
gmf.gameSettings = resources.get(0);
}
@Override
public void write(File path, GameSettings settings, GmFile gmf) throws IOException {
new GameSettingsXmlFormat().write(settings, new File(path, xmlFilename));
if (settings.get(PGameSettings.FRONT_LOAD_BAR) != null) {
ImageIO.write((RenderedImage) settings.get(PGameSettings.FRONT_LOAD_BAR), "PNG", new File(path,
frontLoadBarFilename));
}
if (settings.get(PGameSettings.BACK_LOAD_BAR) != null) {
ImageIO.write((RenderedImage) settings.get(PGameSettings.BACK_LOAD_BAR), "PNG", new File(path,
backLoadBarFilename));
}
if (settings.get(PGameSettings.LOADING_IMAGE) != null) {
ImageIO.write((RenderedImage) settings.get(PGameSettings.LOADING_IMAGE), "PNG", new File(path,
loadingImageFilename));
}
if (settings.get(PGameSettings.GAME_ICON) != null) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(path, iconFilename));
((ICOFile) settings.get(PGameSettings.GAME_ICON)).write(fos);
} finally {
if (fos != null) {
fos.close();
}
}
}
}
}