/**
* 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 ead.importer.subimporters.chapter.cutscene;
import ead.importer.EAdElementImporter;
import ead.importer.annotation.ImportAnnotator;
import ead.importer.interfaces.EAdElementFactory;
import ead.importer.interfaces.EffectsImporterFactory;
import ead.importer.interfaces.ResourceImporter;
import ead.importer.subimporters.effects.TriggerSceneImporter;
import es.eucm.ead.model.elements.conditions.EmptyCond;
import es.eucm.ead.model.elements.effects.ChangeSceneEf;
import es.eucm.ead.model.elements.effects.QuitGameEf;
import es.eucm.ead.model.elements.effects.TriggerMacroEf;
import es.eucm.ead.model.elements.extra.EAdList;
import es.eucm.ead.model.elements.scenes.Scene;
import es.eucm.ead.model.elements.transitions.DisplaceTransition;
import es.eucm.ead.model.elements.transitions.EmptyTransition;
import es.eucm.ead.model.elements.transitions.FadeInTransition;
import es.eucm.ead.model.elements.transitions.Transition;
import es.eucm.ead.model.elements.transitions.enums.DisplaceTransitionType;
import es.eucm.ead.model.params.text.EAdString;
import es.eucm.ead.tools.StringHandler;
import es.eucm.eadventure.common.data.chapter.scenes.Cutscene;
import es.eucm.eadventure.common.data.chapter.scenes.Slidescene;
public abstract class CutsceneImporter<T extends Cutscene> implements
EAdElementImporter<T, Scene> {
protected StringHandler stringHandler;
protected EAdElementFactory factory;
protected EffectsImporterFactory effectsImporter;
protected ResourceImporter resourceImporter;
protected ImportAnnotator annotator;
public CutsceneImporter(StringHandler stringHandler,
EAdElementFactory factory, EffectsImporterFactory effectsImporter,
ResourceImporter resourceImporter, ImportAnnotator annotator) {
this.stringHandler = stringHandler;
this.factory = factory;
this.effectsImporter = effectsImporter;
this.resourceImporter = resourceImporter;
this.annotator = annotator;
}
@Override
public Scene convert(T oldObject, Object newElement) {
Scene scene = (Scene) newElement;
//factory.getCurrentChapterModel().getScenes().add(scene);
scene.setReturnable(false);
// Appearance
importResources(oldObject, scene);
// Configuration
importConfiguration(scene, getEndEffect(oldObject));
// Documentation
importDocumentation(scene, oldObject);
return scene;
}
private void importDocumentation(Scene scene, Cutscene oldScene) {
EAdString doc = stringHandler.generateNewString();
stringHandler.setString(doc, oldScene.getDocumentation());
scene.getDefinition().setDoc(doc);
EAdString name = stringHandler.generateNewString();
stringHandler.setString(name, oldScene.getName());
scene.getDefinition().setName(name);
}
protected Effect getEndEffect(Cutscene cutscene) {
Scene nextScene = null;
Transition transition = EmptyTransition.instance();
switch (cutscene.getNext()) {
case Slidescene.GOBACK:
nextScene = null;
break;
case Slidescene.ENDCHAPTER:
if (factory.getOldDataModel().getChapters().size() == 1) {
return new QuitGameEf();
} else {
// FIXME end chapter if there's more than one chapter
}
break;
case Slidescene.NEWSCENE:
nextScene = (Scene) factory.getElementById(cutscene
.getTargetId());
transition = TriggerSceneImporter.getTransition(cutscene
.getTransitionType(), cutscene.getTransitionTime());
break;
}
ChangeSceneEf changeScene = new ChangeSceneEf();
changeScene.setNextScene(nextScene);
changeScene.setTransition(transition);
EAdList<Effect> macro = effectsImporter.getMacroEffects(cutscene
.getEffects());
if (macro != null) {
TriggerMacroEf triggerMacro = new TriggerMacroEf();
triggerMacro.putEffects(EmptyCond.TRUE, macro);
changeScene.getNextEffects().add(triggerMacro);
}
return changeScene;
}
protected abstract void importConfiguration(Scene scene, Effect endEffect);
protected abstract void importResources(T oldCutscene, Scene scene);
/**
* Builds a transition from the type and the time
*
* @param type
* transition type
* @param time
* transition time
* @return
*/
public static Transition getTransition(int type, int time) {
switch (type) {
case es.eucm.eadventure.common.data.animation.Transition.TYPE_FADEIN:
return new FadeInTransition(time);
case es.eucm.eadventure.common.data.animation.Transition.TYPE_HORIZONTAL:
return new DisplaceTransition(time,
DisplaceTransitionType.HORIZONTAL, true);
case es.eucm.eadventure.common.data.animation.Transition.TYPE_VERTICAL:
return new DisplaceTransition(time,
DisplaceTransitionType.VERTICAL, true);
default:
return EmptyTransition.instance();
}
}
}