gt: 	protected abstract void doBuild();
context: /**
   * eAdventure is a research project of the
   *    e-UCM research group.
   *
   *    Copyright 2005-2014 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).
   *
   *          CL Profesor Jose Garcia Santesmases 9,
   *          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
   *
   *      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.builder;
  
  import com.badlogic.gdx.Input;
  import com.badlogic.gdx.utils.Array;
  import com.badlogic.gdx.utils.reflect.ClassReflection;
  import com.badlogic.gdx.utils.reflect.Field;
  import com.badlogic.gdx.utils.reflect.ReflectionException;
  import es.eucm.ead.schema.assets.Sound;
  import es.eucm.ead.schema.components.ModelComponent;
  import es.eucm.ead.schema.components.Reference;
  import es.eucm.ead.schema.components.Tags;
  import es.eucm.ead.schema.components.Visibility;
  import es.eucm.ead.schema.components.behaviors.Behavior;
  import es.eucm.ead.schema.components.behaviors.Event;
  import es.eucm.ead.schema.components.behaviors.events.Init;
  import es.eucm.ead.schema.components.behaviors.events.Key;
  import es.eucm.ead.schema.components.behaviors.events.Timer;
  import es.eucm.ead.schema.components.behaviors.events.Touch;
  import es.eucm.ead.schema.components.controls.Control;
  import es.eucm.ead.schema.components.controls.ImageButton;
  import es.eucm.ead.schema.components.controls.Label;
  import es.eucm.ead.schema.components.controls.TextButton;
  import es.eucm.ead.schema.components.conversation.Conversation;
  import es.eucm.ead.schema.components.conversation.EffectsNode;
  import es.eucm.ead.schema.components.positiontracking.Parallax;
  import es.eucm.ead.schema.components.tweens.AlphaTween;
  import es.eucm.ead.schema.components.tweens.FieldTween;
  import es.eucm.ead.schema.components.tweens.MoveTween;
  import es.eucm.ead.schema.components.tweens.RotateTween;
  import es.eucm.ead.schema.components.tweens.ScaleTween;
  import es.eucm.ead.schema.components.tweens.Tween;
  import es.eucm.ead.schema.components.tweens.Tween.EaseEquation;
  import es.eucm.ead.schema.components.tweens.Tween.EaseType;
  import es.eucm.ead.schema.data.Color;
  import es.eucm.ead.schema.data.Parameter;
  import es.eucm.ead.schema.data.Script;
  import es.eucm.ead.schema.data.shape.Circle;
  import es.eucm.ead.schema.data.shape.Rectangle;
  import es.eucm.ead.schema.data.shape.Shape;
  import es.eucm.ead.schema.effects.*;
  import es.eucm.ead.schema.effects.ChangeVar.Context;
  import es.eucm.ead.schema.effects.GoScene.Transition;
  import es.eucm.ead.schema.effects.controlstructures.ControlStructure;
  import es.eucm.ead.schema.effects.controlstructures.If;
  import es.eucm.ead.schema.effects.controlstructures.IfThenElseIf;
  import es.eucm.ead.schema.effects.controlstructures.ScriptCall;
  import es.eucm.ead.schema.engine.components.AndroidSettings;
  import es.eucm.ead.schema.engine.components.PersistentGameState;
  import es.eucm.ead.schema.engine.components.PersistentVariable;
  import es.eucm.ead.schema.entities.ModelEntity;
  import es.eucm.ead.schema.renderers.*;
  import es.eucm.ead.schemax.ModelStructure;
  
  import java.util.HashMap;
  
  /**
   * 
   * The {@link #doBuild()} method is the key. This method must be implemented by
   * the subclass, and there's where the logic for creating all the game entities
   * ({@link #entities}) must be placed. To help building such logic, there are a
   * bunch of different useful methods. Those can be basically structured in two
   * types:
   * 
   * <ul>
   * <li>Those that do not start by <strong>make</strong>. Those methods directly
   * modify the {@link #entities} structure one way or another. Use those methods
   * when you want to make quick editions on entities that you have previously
   * created, for example. Their return type is always {@link DemoBuilder}, so
   * multiple calls can be chained.</li>
   * <li>Methods that start by <strong>make</strong>. These methods create model
   * pieces, but they are not directly added to any part of the model, represented
   * by the {@link #entities} structure. Their return type is the type of the
   * model piece created.</li>
   * </ul>
   * 
   * Example:
   * 
   * <pre>
   *     ChangeVar changeVarEffect = makeChangeVar("var", "i1");
   *     singleSceneGame("images/background.png").entity("images/ball.png", HorizontalAlignment.CENTER, VerticalAlignment.CENTER)touch(makeChangeVarEffect);
   * </pre>
   * 
   * This piece of code creates a game with a single scene that is configured with
   * the given background image, then adds a ball entity to the scene in the
   * center of the screen that when clicked sets variable "var" to one. The size
   * of the game is automatically inferred from the size of the background image.
   * 
   * For more details, you can see as an example PlanesDemo.
   * 
   * Created by Javier Torrente on 30/06/14.
   */
  public abstract class DemoBuilder {
  
  	protected static final String LOG_TAG = "DemoBuilder";
  
  	/*
  	 * A special empty entity is created to hold timers for scheduled effects,
  	 * infinite timers, etc on the scene
  	 */
  	protected static final String SPECIAL_TIMERS_TAG = "_SCENE_TIMERS";
  
  	public static final String LIBRARY_PATH = "library/";
  	public static final String WALK = "walk";
  	public static final String TALK = "talk";
  	public static final String GRAB = "grab";
  	public static final String IDLE = "idle";
  	public static final String USE = "use";
  
  	public static final String UP = "up";
  	public static final String DOWN = "down";
  	public static final String LEFT = "left";
  	public static final String RIGHT = "right";
  
  	public static final String DEFAULT_SCENE_PREF = "scenes/s";
  	public static final String JSON = ".json";
  
  	/*
  	 * Map with all the entities of the game. Should be "filled in" by doBuild()
  	 */
  	protected HashMap<String, ModelEntity> entities;
  
  	/*
  	 * Builder remembers last entities and components added to entities so they
  	 * can be retrieved easily
  	 */
  	protected ModelEntity lastEntity;
  	protected ModelEntity lastScene;
  	protected ModelComponent lastComponent;
  
  	// Some game properties that come in handy
  	protected int sceneCount;
  	protected float gameWidth;
  	protected float gameHeight;
  	protected String lastSceneId;
  	protected ModelEntity game;
  	protected Behavior initGame;
  
  	// Helper class to create expressions
  	protected ExpressionBuilder eb = new ExpressionBuilder();
  
  	// To build automatic variables
  	protected int autoVarCount = 0;
  
  	public String newAutoVar() {
  		return "DemoBuilderVar" + (autoVarCount++);
  	}
  
  	/**
  	 * @return An object that helps create expressions with Mokap's syntax
  	 */
  	public ExpressionBuilder getEb() {
  		return eb;
  	}
  
  	public DemoBuilder() {
  		entities = new HashMap<String, ModelEntity>();
  		sceneCount = 0;
  	}
  
  	// /////////////////////////////////////////////////////////////////////////////
  	// Protected methods that subclasses may want or need to implement or
  	// override
  	// /////////////////////////////////////////////////////////////////////////////
  
  	/**
  	 * Does the actual build of the game, creating any entities needed by using
  	 * methods available below.
  	 */
  