/**
* eAdventure (formerly <e-Adventure> and <e-Game>) is a research project of the
* <e-UCM> research group.
*
* Copyright 2005-2010 <e-UCM> research group.
*
* You can access a list of all the contributors to eAdventure at:
* http://e-adventure.e-ucm.es/contributors
*
* <e-UCM> is a research group of the Department of Software Engineering
* and Artificial Intelligence at the Complutense University of Madrid
* (School of Computer Science).
*
* C Profesor Jose Garcia Santesmases sn,
* 28040 Madrid (Madrid), Spain.
*
* For more info please visit: <http://e-adventure.e-ucm.es> or
* <http://www.e-ucm.es>
*
* ****************************************************************************
*
* This file is part of eAdventure, version 2.0
*
* eAdventure is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* eAdventure is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with eAdventure. If not, see <http://www.gnu.org/licenses/>.
*/
package es.eucm.ead.importer;
import com.google.inject.Guice;
import com.google.inject.Injector;
import es.eucm.ead.importer.resources.ResourcesConverter;
import es.eucm.ead.importer.subconverters.ChapterConverter;
import es.eucm.ead.importer.testers.ConverterTester;
import es.eucm.ead.legacyplugins.model.BubbleNameEv;
import es.eucm.ead.legacyplugins.model.LegacyVars;
import es.eucm.ead.legacyplugins.model.TimerEv;
import es.eucm.ead.legacyplugins.model.elements.ClockDisplay;
import es.eucm.ead.model.Commands;
import es.eucm.ead.model.assets.drawable.basics.NinePatchImage;
import es.eucm.ead.model.assets.text.BasicFont;
import es.eucm.ead.model.elements.AdventureGame;
import es.eucm.ead.model.elements.Chapter;
import es.eucm.ead.model.elements.effects.AddChildEf;
import es.eucm.ead.model.elements.events.SceneElementEv;
import es.eucm.ead.model.elements.events.enums.SceneElementEvType;
import es.eucm.ead.model.elements.extra.EAdMap;
import es.eucm.ead.model.elements.huds.BottomHud;
import es.eucm.ead.model.elements.scenes.GhostElement;
import es.eucm.ead.model.elements.scenes.Scene;
import es.eucm.ead.model.params.fills.ColorFill;
import es.eucm.ead.tools.java.JavaTextFileWriter;
import es.eucm.ead.tools.java.reflection.JavaReflectionProvider;
import es.eucm.ead.writer.AdventureWriter;
import es.eucm.ead.writer.StringWriter;
import es.eucm.eadventure.common.data.adventure.AdventureData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.Random;
public class AdventureConverter {
public static final String EFFECTS_GHOST_ID = "i$effects_ghost";
static private Logger logger = LoggerFactory
.getLogger(AdventureConverter.class);
private OldReader oldReader;
private ChapterConverter chapterConverter;
private AdventureData adventureData;
private ResourcesConverter resourceConverter;
private ModelQuerier modelQuerier;
private StringWriter stringWriter;
private StringsConverter stringsConverter;
private AdventureWriter writer;
private ResourcesConverter resourcesConverter;
private AdventureGame model;
private Random rand;
private ConverterTester tester;
private boolean test;
public AdventureConverter() {
Injector i = Guice.createInjector();
oldReader = i.getInstance(OldReader.class);
chapterConverter = i.getInstance(ChapterConverter.class);
resourceConverter = i.getInstance(ResourcesConverter.class);
modelQuerier = i.getInstance(ModelQuerier.class);
stringsConverter = i.getInstance(StringsConverter.class);
stringWriter = new StringWriter();
writer = new AdventureWriter(new JavaReflectionProvider());
resourcesConverter = i.getInstance(ResourcesConverter.class);
tester = i.getInstance(ConverterTester.class);
rand = new Random();
}
public AdventureGame getModel() {
return model;
}
public void setTest(boolean test) {
this.test = test;
tester.setTesting(test);
}
/**
* Converts the adventure in file to the new format, and stores the converted game in destinationFolder. If destinationFolder is null, a temp file is created
*
* @param file
* @param destinationFolder
* @return the destination folder path
*/
public String convert(String file, String destinationFolder) {
if (destinationFolder == null) {
String tempFolder = System.getProperty("java.io.tmpdir");
File tmpDir = new File(tempFolder + File.separator
+ "eAdventureTemp" + rand.nextInt());
destinationFolder = tmpDir.getAbsolutePath();
}
// Reset attributes
stringsConverter.clear();
modelQuerier.clear();
resourcesConverter.clear();
logger.debug("Converting {}", file);
resourceConverter.setPath(destinationFolder);
adventureData = oldReader.loadGame(file);
modelQuerier.setAdventureData(adventureData);
// This element will be displayed whenever a set of effects is launched,
// to avoid user interaction with other elements in the scene
GhostElement effectsGhost = new GhostElement(true);
effectsGhost.setId(EFFECTS_GHOST_ID);
effectsGhost.setVisible(false);
AddChildEf addEffectsGhost = new AddChildEf(BottomHud.ID, effectsGhost);
SceneElementEv initEvent = new SceneElementEv();
initEvent.addEffect(SceneElementEvType.INIT, addEffectsGhost);
model = new AdventureGame();
model.addEvent(initEvent);
// Add some vars
// [AD - Title]
model.putProperty(AdventureGame.GAME_TITLE, modelQuerier
.getAventureData().getTitle());
// Add some legacy vars
model.putProperty(LegacyVars.FIRST_PERSON, modelQuerier
.isFirstPersonGame());
BubbleNameEv event = new BubbleNameEv();
event.setBubble(new NinePatchImage("@drawable/bubblename.png", 15, 15,
15, 15));
event.setFont(new BasicFont("@binary/fonts/arial-16"));
event.setTextPaint(ColorFill.WHITE);
model.addEvent(event);
// Setting plugins
EAdMap<String> eventPlugins = new EAdMap<String>();
eventPlugins.put(BubbleNameEv.class.getName(),
"es.eucm.ead.legacyplugins.engine.BubbleNameGO");
eventPlugins.put(TimerEv.class.getName(),
"es.eucm.ead.legacyplugins.engine.events.TimerGO");
// [GE - Arrow] [GE - Follow]
EAdMap<String> sceneElementPlugins = new EAdMap<String>();
sceneElementPlugins
.put(Scene.class.getName(),
"es.eucm.ead.legacyplugins.engine.sceneelements.DynamicSceneGO");
sceneElementPlugins
.put(ClockDisplay.class.getName(),
"es.eucm.ead.legacyplugins.engine.sceneelements.ClockDisplayGO");
model.putProperty(AdventureGame.EVENTS_BINDS, eventPlugins);
model.putProperty(AdventureGame.SCENES_ELEMENT_BINDS,
sceneElementPlugins);
int i = 0;
for (es.eucm.eadventure.common.data.chapter.Chapter c : adventureData
.getChapters()) {
logger.debug("Importing chapter{}", i);
modelQuerier.setCurrentChapterIndex(i);
String id = modelQuerier.generateChapterId(i);
modelQuerier.setChapterId(id);
tester.command(Commands.GO_CHAPTER + " " + id);
tester.check(Commands.CHAPTER, id);
Chapter chapter = chapterConverter.convert(c);
chapter.setId(id);
model.addChapter(chapter);
i++;
}
String path = destinationFolder
+ (destinationFolder.charAt(destinationFolder.length() - 1) == '/' ? ""
: "/");
// Create data.xml
JavaTextFileWriter fileWriter = new JavaTextFileWriter();
writer.write(model, path, fileWriter);
if (test) {
tester.write(path + "test", fileWriter);
}
// Create strings.xml
File f = new File(path, "strings.xml");
try {
stringWriter.write(f.getAbsolutePath(), stringsConverter
.getStrings());
} catch (Exception e) {
logger.error("Error writing strings file while importing '{}'",
file, e);
}
return destinationFolder;
}
public void setEnableSimplifications(boolean enableSimplifications) {
writer.setEnableSimplifications(enableSimplifications);
}
public void setEnableTranslations(boolean enableTranslations) {
writer.setEnableTranslations(enableTranslations);
}
public static interface ImporterProgressListener {
// TODO It would be interesting to pass two values, current
// and max, so the progress bar can extrapolate between the
// two and give the appearance of work most of the time
public void update(int progress, String text);
}
}