/** * 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.elements.effects.Effect; import es.eucm.ead.model.elements.events.Event; import es.eucm.ead.model.elements.events.SceneElementEv; import es.eucm.ead.model.elements.events.TimedEv; import es.eucm.ead.model.elements.events.WatchFieldEv; import es.eucm.ead.model.elements.events.enums.SceneElementEvType; import es.eucm.ead.model.elements.events.enums.TimedEvType; import es.eucm.ead.model.elements.events.enums.WatchFieldEvType; import es.eucm.ead.model.interfaces.features.Evented; import es.eucm.ead.reader.ObjectsFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collection; import java.util.List; @SuppressWarnings("unchecked") public class EventReader { static private Logger logger = LoggerFactory.getLogger(EventReader.class); private ObjectsFactory objectsFactory; private EffectsReader effectsReader; private OperationReader operationReader; private TemplateReader templatesReader; public EventReader(ObjectsFactory objectsFactory, EffectsReader effectsReader, OperationReader operationReader, TemplateReader templatesReader) { this.objectsFactory = objectsFactory; this.effectsReader = effectsReader; this.operationReader = operationReader; this.templatesReader = templatesReader; } public boolean addEvents(Collection<StringMap<Object>> events) { for (StringMap<Object> e : events) { if (e == null) { logger .warn("Null event. Make sure there is no additional commas in the file"); return false; } Event event = null; String type = (String) e.get("type"); Collection<StringMap<Object>> ef = (Collection<StringMap<Object>>) e .get("effects"); List<Effect> effects = getEffects(ef); if (type.equals("added")) { event = getSceneElementEvent(SceneElementEvType.ADDED, effects); } else if (type.equals("removed")) { event = getSceneElementEvent(SceneElementEvType.REMOVED, effects); } else if (type.equals("always")) { event = getSceneElementEvent(SceneElementEvType.ALWAYS, effects); } else if (type.equals("init")) { event = getSceneElementEvent(SceneElementEvType.INIT, effects); } else if (type.equals("watchfield")) { event = getWatchFieldEvent(e, effects); } else if (type.equals("time")) { event = getTimeEvent(e, effects); } Collection<String> targets = (Collection<String>) e.get("targets"); for (String target : targets) { Evented evented = (Evented) objectsFactory .getObjectById(target); evented.addEvent(event); } } return true; } private Event getTimeEvent(StringMap<Object> e, List<Effect> effects) { Number time = (Number) e.get("time"); TimedEv event = new TimedEv(); event.setTime(time.intValue()); event.addEffects(TimedEvType.END_TIME, effects); event.setRepeats(1); return event; } private Event getWatchFieldEvent(StringMap<Object> e, List<Effect> effects) { WatchFieldEv event = new WatchFieldEv(); Collection<String> fields = (Collection<String>) e.get("fields"); for (String f : fields) { event.watchField(operationReader.translateField(f)); } event.addEffects(WatchFieldEvType.WATCH, effects); return event; } public Event getSceneElementEvent(SceneElementEvType type, List<Effect> effects) { SceneElementEv event = new SceneElementEv(); event.addEffects(type, effects); return event; } public List<Effect> getEffects(Collection<StringMap<Object>> ef) { ArrayList<Effect> effects = new ArrayList<Effect>(); for (StringMap<Object> e : ef) { templatesReader.applyTemplates(e); Effect effect = effectsReader.read(e); effects.add(effect); } return effects; } }