package org.tjuscs.bulletgame.task; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.tjuscs.bulletgame.model.GameModel; import org.tjuscs.bulletgame.util.GameUtil; import org.tjuscs.bulletgame.view.component.AudioPlayer; import org.tjuscs.bulletgame.view.component.Renderer; import org.tjuscs.bulletgame.view.component.Resources; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; public class Tasks { //private static Map<String, Task> taskCache = new HashMap<String, Task>(); public static EmptyTask empty() { return new EmptyTask(); } public static WaitTask wait(int frames) { return new WaitTask(frames); } public static SequenceTask sequence(Task... tasks) { return new SequenceTask(tasks); } public static ParallelTask parallel(Task... tasks) { return new ParallelTask(tasks); } public static IfElseTask ifelse(String condition, Task ifTask, Task elseTask) { return new IfElseTask(condition, ifTask, elseTask); } public static LoopTask loop(String loops, Task innerTask) { return loop(loops, innerTask, null, null, null); } public static LoopTask loop(String loops, Task innerTask, String varName, String varValue, String updateScript) { return new LoopTask(loops, innerTask, varName, varValue, updateScript); } public static ScriptTask execute(String script) { return new ScriptTask(script); } public static MoveTask move(String x, String y, String frames, String mode, String target) { return new MoveTask(x, y, frames, mode, target); } public static Task readScript(String fileName) { try { // if (useCache) { // Task task = taskCache.get(fileName); // if (task != null) // return task; // } FileHandle file = Gdx.files.internal(fileName); String content = file.readString("utf-8"); Document doc = DocumentHelper.parseText(content); Element root = doc.getRootElement(); Task task = parse(root); setDefaultBindings(task); // if (useCache) { // taskCache.put(fileName, task); // } return task; } catch (Exception e) { e.printStackTrace(); } return null; } public static void setDefaultBindings(Task task) { task.setBinding("game", GameModel.getInstance()); task.setBinding("gameUtil", GameUtil.getInstance()); task.setBinding("res", Resources.getInstance()); task.setBinding("render", Renderer.getInstance()); task.setBinding("audio", AudioPlayer.getInstance()); } @SuppressWarnings("rawtypes") static Task parse(Object obj) { Element e = (Element) obj; if (e.getName().equalsIgnoreCase("seq")) { List list = e.elements(); Task[] tasks = new Task[list.size()]; for (int i = 0; i < tasks.length; i++) { tasks[i] = parse((Element) list.get(i)); } return Tasks.sequence(tasks); } else if (e.getName().equalsIgnoreCase("para")) { List list = e.elements(); Task[] tasks = new Task[list.size()]; for (int i = 0; i < tasks.length; i++) { tasks[i] = parse((Element) list.get(i)); } return Tasks.parallel(tasks); } else if (e.getName().equalsIgnoreCase("if")) { List list = e.elements(); String cond = e.attributeValue("cond"); if (list.size() <= 1) return Tasks.ifelse(cond, parse(list.get(0)), null); return Tasks.ifelse(cond, parse(list.get(0)), parse(list.get(1))); } else if (e.getName().equalsIgnoreCase("loop")) { List list = e.elements(); String count = e.attributeValue("count"); String var = e.attributeValue("var"); String init = e.attributeValue("init"); String update = e.attributeValue("update"); return Tasks.loop(count, parse(list.get(0)), var, init, update); } else if (e.getName().equalsIgnoreCase("wait")) { return Tasks.wait(Integer.parseInt(e.attributeValue("count"))); } else if (e.getName().equalsIgnoreCase("cmd")) { return Tasks.execute(e.getText()); } else if (e.getName().equalsIgnoreCase("script")) { // String cache = e.attributeValue("cache"); // boolean useCache = false; // if(cache != null && cache.equalsIgnoreCase("true")) // useCache = true; return Tasks.readScript(e.attributeValue("path")); } else if (e.getName().equalsIgnoreCase("var")) { String name = e.attributeValue("name"); String value = e.attributeValue("value"); return Tasks.execute("context.setParent('" + name + "'," + value + ");"); } else if (e.getName().equalsIgnoreCase("move")) { String x = e.attributeValue("x"); String y = e.attributeValue("y"); String frames = e.attributeValue("frames"); String mode = e.attributeValue("mode"); String target = e.attributeValue("target"); return Tasks.move(x, y, frames, mode, target); } else if(e.getName().equalsIgnoreCase("empty")){ return Tasks.empty(); } return Tasks.empty(); } }