package vooga.scroller.level_editor.model; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; import util.Location; import vooga.scroller.level_editor.LevelEditing; import vooga.scroller.level_editor.controllerSuite.LEController; import vooga.scroller.level_editor.controllerSuite.LEGrid; import vooga.scroller.sprites.Sprite; import vooga.scroller.util.mvc.IController; /** * LevelWriter takes in an LEGrid and a file to write to and saves the Level. * * @author Danny Goodman, Deo Fagnisse * */ public class LevelWriter { private static final String WRITING_ERROR = "WRITING_ERROR"; private static final String EQUALS = "EQUALS"; private static final String RESOURCE_PATH = "vooga.scroller.level_editor.model.SaveLoad"; private static final char SPACE = ' '; private static final String NEW_LINE = System.getProperty("line.separator"); private int myKeyCounter; private ResourceBundle myResources = ResourceBundle.getBundle(RESOURCE_PATH); private Map<String, Character> myMap; private FileWriter myFileWriter; private LEGrid myGrid; private Location myStartPoint; private IController<LevelEditing> myController; /** * Constructor sets given controller as instance variable. * * @param leController - Controller to set */ public LevelWriter (LEController leController) { myController = leController; } /** * Creates a save file from a LEGrid * * @param file - file to be saved * @param levelGrid - Grid to be saved * @param libPath - file name path of sprite library */ public void createFile (File file, LEGrid levelGrid, String libPath) { myGrid = levelGrid; myStartPoint = myGrid.removeStartPoint(); myKeyCounter = 0; myMap = new HashMap<String, Character>(); try { myFileWriter = new FileWriter(file); } catch (IOException e) { myController.showErrorMsg(myResources.getString("FILE_ERROR")); } writeLevel(); writeLib(libPath); writeKey(); writeSettings(); myGrid.addStartPoint((int) myStartPoint.getX(), (int) myStartPoint.getY()); } private void writeLevel () { try { myFileWriter.write(myResources.getString("BEGIN_LEVEL")); for (int i = 0; i < myGrid.getSize().height; i++) { myFileWriter.write(NEW_LINE); for (int j = 0; j < myGrid.getSize().width; j++) { Sprite s = myGrid.getSpriteFromCoor(j, i); if (s == null) { myFileWriter.write(SPACE); } else { String spriteName = s.getClass().getSimpleName(); if (!myMap.containsKey(spriteName)) { myMap.put(spriteName, myResources.getString("KEY_CREATOR").charAt(myKeyCounter)); myKeyCounter++; } myFileWriter.write(myMap.get(spriteName)); } } } myFileWriter.write(NEW_LINE); } catch (IOException e) { myController.showErrorMsg(myResources.getString(WRITING_ERROR)); } } private void writeLib (String libPath) { try { myFileWriter.write(myResources.getString("BEGIN_LIB_PATH")); myFileWriter.write(NEW_LINE); myFileWriter.write(libPath); myFileWriter.write(NEW_LINE); } catch (IOException e) { myController.showErrorMsg(myResources.getString(WRITING_ERROR)); } } private void writeKey () { Set<String> keySet = myMap.keySet(); try { myFileWriter.write(myResources.getString("BEGIN_KEY")); for (String key : keySet) { myFileWriter.write(NEW_LINE); myFileWriter.write("" + myMap.get(key) + myResources.getString(EQUALS) + key); } myFileWriter.write(NEW_LINE); } catch (IOException e) { myController.showErrorMsg(myResources.getString(WRITING_ERROR)); } } private void writeSettings () { try { myFileWriter.write(myResources.getString("BEGIN_SETTINGS")); myFileWriter.write(NEW_LINE); myFileWriter.write(myResources.getString("START_POINT") + myResources.getString(EQUALS) + (int) myStartPoint.getX() + SPACE + (int) myStartPoint.getY()); myFileWriter.write(NEW_LINE); myFileWriter.write(myResources.getString("BACKGROUND") + myResources.getString(EQUALS) + myGrid.getBackground().getFileName()); myFileWriter.close(); } catch (IOException e) { myController.showErrorMsg(myResources.getString(WRITING_ERROR)); } } }