/** * 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.json.reader; import com.google.gson.internal.StringMap; import es.eucm.ead.model.assets.drawable.EAdDrawable; import es.eucm.ead.model.assets.multimedia.EAdSound; import es.eucm.ead.model.assets.multimedia.Video; import es.eucm.ead.model.elements.BasicElement; import es.eucm.ead.model.elements.ResourcedElement; import es.eucm.ead.model.elements.effects.ChangeSceneEf; import es.eucm.ead.model.elements.effects.PlaySoundEf; import es.eucm.ead.model.elements.effects.variables.ChangeFieldEf; import es.eucm.ead.model.elements.events.SceneElementEv; import es.eucm.ead.model.elements.events.enums.SceneElementEvType; import es.eucm.ead.model.elements.huds.MouseHud; import es.eucm.ead.model.elements.operations.SystemFields; import es.eucm.ead.model.elements.operations.ValueOp; import es.eucm.ead.model.elements.predef.effects.ChangeAppearanceEf; import es.eucm.ead.model.elements.predef.effects.MoveActiveElementToMouseEf; import es.eucm.ead.model.elements.scenes.GhostElement; import es.eucm.ead.model.elements.scenes.GroupElement; import es.eucm.ead.model.elements.scenes.Scene; import es.eucm.ead.model.elements.scenes.SceneElement; import es.eucm.ead.model.elements.scenes.VideoScene; import es.eucm.ead.model.params.guievents.MouseGEv; import es.eucm.ead.reader.ObjectsFactory; import java.util.Collection; @SuppressWarnings("unchecked") public class SceneReader { private BasicElement mouse = new BasicElement(MouseHud.CURSOR_ID); private ObjectsFactory objectsFactory; private TemplateReader templateReader; private TrajectoryReader trajectoryReader; public SceneReader(ObjectsFactory objectsFactory, TemplateReader templateReader) { this.objectsFactory = objectsFactory; this.templateReader = templateReader; this.trajectoryReader = new TrajectoryReader(); } public Scene parseScene(StringMap<Object> jsonScene) { Scene scene = null; String type = (String) jsonScene.get("type"); String id = (String) jsonScene.get("id"); if (type == null || type.equals("scene")) { scene = getScene(jsonScene); } else if (type.equals("video")) { scene = getVideoScene(jsonScene); } if (scene != null && id != null) scene.setId(id); objectsFactory.putIdentified(scene); return scene; } private Scene getVideoScene(StringMap<Object> jsonScene) { VideoScene scene = new VideoScene(); scene.setVideo(new Video((String) jsonScene.get("uri"))); BasicElement nextScene = new BasicElement(jsonScene.get("nextScene") .toString()); scene.getFinalEffects().add(new ChangeSceneEf(nextScene)); return scene; } public Scene getScene(StringMap<Object> jsonScene) { EAdDrawable background = (EAdDrawable) objectsFactory .getObjectById((String) jsonScene.get("background")); Scene scene = new Scene(background); if (jsonScene.containsKey("music")) { String music = (String) jsonScene.get("music"); if (music != null) { EAdSound bgMusic = (EAdSound) objectsFactory .getObjectById(music); PlaySoundEf playBg = new PlaySoundEf(bgMusic); scene.addInitEffect(playBg); } else { PlaySoundEf playBg = new PlaySoundEf(null); scene.addInitEffect(playBg); } } Collection<StringMap<Object>> sceneElements = (Collection<StringMap<Object>>) jsonScene .get("sceneElements"); if (sceneElements != null) { for (StringMap<Object> e : sceneElements) { SceneElement s = parseSceneElement(e); scene.add(s); } } // Add trajectory StringMap<Object> t = (StringMap<Object>) jsonScene.get("trajectory"); if (t != null) { scene.setTrajectoryDefinition(trajectoryReader.read(t)); scene.getBackground().addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, new MoveActiveElementToMouseEf()); } // Add active scene element String activeElement = (String) jsonScene.get("activeElement"); if (activeElement != null) { SceneElement e = (SceneElement) objectsFactory .getObjectById(activeElement); SceneElementEv event = new SceneElementEv(); event.addEffect(SceneElementEvType.ADDED, new ChangeFieldEf( SystemFields.ACTIVE_ELEMENT, new ValueOp(e))); scene.addEvent(event); } return scene; } @SuppressWarnings( { "rawtypes" }) public SceneElement parseSceneElement(StringMap<Object> jsonSceneElement) { templateReader.applyTemplates(jsonSceneElement); String appearance = (String) jsonSceneElement.get("appearance"); EAdDrawable d = null; if (appearance != null) { d = (EAdDrawable) objectsFactory.getObjectById(appearance); } SceneElement e = null; Collection<StringMap<Object>> children = (Collection<StringMap<Object>>) jsonSceneElement .get("children"); String type = (String) jsonSceneElement.get("type"); if (type == null) { if (children == null) { e = new SceneElement(d); } else { GroupElement g = new GroupElement(d); for (StringMap<Object> s : children) { g.addSceneElement(parseSceneElement(s)); } e = g; } } else if (type.equals("ghost")) { e = new GhostElement(d); } // Over appearance String overappearance = (String) jsonSceneElement.get("overappearance"); if (overappearance != null) { d = (EAdDrawable) objectsFactory.getObjectById(overappearance); e.setOverAppearance(d); } // Cursor String cursor = (String) jsonSceneElement.get("cursor"); if (cursor != null) { e.addBehavior(MouseGEv.MOUSE_ENTERED, new ChangeAppearanceEf(mouse, cursor)); e.addBehavior(MouseGEv.MOUSE_EXITED, new ChangeAppearanceEf(mouse, ResourcedElement.INITIAL_BUNDLE)); } // Contain bounds Boolean containsBounds = (Boolean) jsonSceneElement .get("containsBounds"); e.setContainsBounds(containsBounds != null && containsBounds); // Bundles Collection<StringMap<Object>> bundles = (Collection<StringMap<Object>>) jsonSceneElement .get("bundles"); if (bundles != null) { for (StringMap<Object> b : bundles) { String id = (String) b.get("id"); appearance = (String) b.get("appearance"); overappearance = (String) b.get("appearance"); if (appearance != null) { e.setAppearance(id, (EAdDrawable) objectsFactory .getObjectById(appearance)); } if (overappearance != null) { e.setOverAppearance(id, (EAdDrawable) objectsFactory .getObjectById(overappearance)); } } } String id = (String) jsonSceneElement.get("id"); if (id != null) e.setId(id); objectsFactory.putIdentified(e); return e; } }