/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.petah.spring.bai.tasks; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.InputStreamReader; import java.io.Reader; import java.util.logging.Level; import java.util.logging.Logger; import javax.script.Invocable; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.SimpleScriptContext; import org.petah.common.util.GameMath; import org.petah.spring.bai.GlobalOptions; import org.petah.spring.bai.delegate.AIDelegate; import org.petah.spring.bai.group.UnitGroup; import org.petah.spring.bai.map.control.ControlZone; import org.petah.spring.bai.util.BuilderUtil; import org.petah.spring.bai.util.CommandUtil; import org.petah.spring.bai.util.FormatUtil; import org.petah.spring.bai.util.MapUtil; /** * * @author Petah */ public class JavaScriptTask extends Task { public static void main(String[] args) { String uri = "org/petah/spring/bai/tasks/standard/script/DefaultScout.js"; JavaScriptTask j = new JavaScriptTask(null, "DefaultScout", uri); j.update(new UnitGroup(null, "Null"), 100); j.update(new UnitGroup(null, "Null"), 500); j.reloadScript(); j.update(new UnitGroup(null, "Null"), 100); j.update(new UnitGroup(null, "Null"), 500); j.update(new UnitGroup(null, "Null"), 800); } // Create a script engine manager private static ScriptEngineManager factory = new ScriptEngineManager(); // Create a JavaScript engine private static ScriptEngine engine = factory.getEngineByName("JavaScript"); private static Invocable invocable = (Invocable) engine; // Class properties private String name; private ScriptContext scriptContext; private Object task; private File file; private String resource; private boolean scriptReady; public JavaScriptTask(AIDelegate aiDelegate, String name, File file) { super(aiDelegate); this.name = name; this.file = file; reloadScript(); } public JavaScriptTask(AIDelegate aiDelegate, String name, String resource) { super(aiDelegate); this.name = name; this.resource = resource; reloadScript(); } private Reader getScriptReader() throws FileNotFoundException { if (file != null) { return new FileReader(file); } return new InputStreamReader(JavaScriptTask.class.getClassLoader().getResourceAsStream(resource)); } public void reloadScript() { try { scriptContext = new SimpleScriptContext(); engine.eval(getScriptReader(), scriptContext); engine.setContext(scriptContext); // Put static classes engine.put("MapUtil", new MapUtil()); engine.put("CommandUtil", new CommandUtil()); engine.put("BuilderUtil", new BuilderUtil()); engine.put("FormatUtil", new FormatUtil()); engine.put("GameMath", new GameMath()); engine.put("ControlZone", new ControlZone(-1, -1)); // Put delegates engine.put("aiDelegate", aiDelegate); task = engine.get(name); scriptReady = true; } catch (Exception ex) { Logger.getLogger(JavaScriptTask.class.getName()).log(Level.SEVERE, "Could not load JavaScript task.", ex); if (GlobalOptions.isDebug()) { ex.printStackTrace(); } scriptReady = false; } } @Override public boolean update(UnitGroup group, int frame) { if (scriptReady) { try { engine.setContext(scriptContext); invocable.invokeMethod(task, "update", group, frame); } catch (Exception ex) { Logger.getLogger(JavaScriptTask.class.getName()).log(Level.SEVERE, "Could not update JavaScript task.", ex); if (GlobalOptions.isDebug()) { ex.printStackTrace(); } } } return false; } }