From 288d6b6c751589a1808e5f2c4629afc18a6aaa33 Mon Sep 17 00:00:00 2001 From: vjurenka Date: Mon, 9 Feb 2015 16:58:08 +0100 Subject: [PATCH] bwapi4 almost done --- bwapi4/AIModule.java | 148 +++--- bwapi4/BWEventListener.java | 53 +++ bwapi4/Color.java | 71 ++- bwapi4/DefaultBWListener.java | 103 ++++ bwapi4/Game.java | 24 - bwapi4/Mirror.java | 262 +++++++++++ bwapi4/Position.java | 2 - bwapi4/PositionOrUnit.java | 71 ++- bwapi4/TilePosition.java | 8 +- bwapi4/Unitset.java | 18 - bwapi4/Utils.java | 52 +++ bwapi4/WalkPosition.java | 8 +- c4/impl.cpp | 355 ++++---------- compiled4/bwapi4/AIModule.class | Bin 2905 -> 2279 bytes compiled4/bwapi4/BWEventListener.class | Bin 0 -> 655 bytes compiled4/bwapi4/Color.class | Bin 1318 -> 795 bytes compiled4/bwapi4/DefaultBWListener.class | Bin 0 -> 1334 bytes compiled4/bwapi4/Game.class | Bin 31212 -> 30475 bytes compiled4/bwapi4/Mirror$FrameCallback.class | Bin 0 -> 203 bytes compiled4/bwapi4/Mirror$JarResources.class | Bin 0 -> 3285 bytes compiled4/bwapi4/Mirror.class | Bin 0 -> 3245 bytes compiled4/bwapi4/Point.class | Bin 1055 -> 942 bytes compiled4/bwapi4/Position.class | Bin 2067 -> 2026 bytes compiled4/bwapi4/PositionOrUnit.class | Bin 1352 -> 1193 bytes compiled4/bwapi4/TilePosition.class | Bin 1861 -> 2007 bytes compiled4/bwapi4/Unitset.class | Bin 7341 -> 7060 bytes compiled4/bwapi4/Utils.class | Bin 0 -> 1543 bytes compiled4/bwapi4/WalkPosition.class | Bin 1916 -> 2062 bytes concat_header4.h | 442 +++++++----------- headers4/bwapi4_AIModule.h | 136 ------ headers4/bwapi4_BWEventListener.h | 13 + headers4/bwapi4_Color.h | 24 - headers4/bwapi4_DefaultBWListener.h | 13 + headers4/bwapi4_Game.h | 32 -- headers4/bwapi4_Mirror.h | 23 + headers4/bwapi4_Mirror_FrameCallback.h | 13 + headers4/bwapi4_Mirror_JarResources.h | 13 + headers4/bwapi4_Point.h | 32 +- headers4/bwapi4_Position.h | 8 - headers4/bwapi4_PositionOrUnit.h | 32 -- headers4/bwapi4_TilePosition.h | 8 - headers4/bwapi4_Unitset.h | 24 - headers4/bwapi4_Utils.h | 75 +++ headers4/bwapi4_WalkPosition.h | 8 - manual-bwapi4/AIModule.java | 130 ++++++ manual-bwapi4/BWEventListener.java | 53 +++ manual-bwapi4/Color.java | 73 +++ manual-bwapi4/DefaultBWListener.java | 103 ++++ manual-bwapi4/Mirror.java | 262 +++++++++++ manual-bwapi4/Position.java | 2 - manual-bwapi4/PositionOrUnit.java | 55 +++ manual-bwapi4/TilePosition.java | 8 +- manual-bwapi4/Utils.java | 52 +++ manual-bwapi4/WalkPosition.java | 8 +- .../generator/CJavaPipeline$2.class | Bin 936 -> 936 bytes .../generator/CJavaPipeline.class | Bin 9515 -> 9621 bytes .../generator/JavaContext.class | Bin 6086 -> 6685 bytes .../InvokeGenerator/generator/c/Bind.class | Bin 12418 -> 12934 bytes .../generator/c/TypeTable.class | Bin 2158 -> 2215 bytes .../generator/ccalls/CallImplementer.class | Bin 14073 -> 15067 bytes .../InvokeGenerator/impl/CApiParser$1.class | Bin 855 -> 855 bytes .../InvokeGenerator/impl/CApiParser.class | Bin 11588 -> 11848 bytes src/generator/CJavaPipeline.java | 6 +- src/generator/JavaContext.java | 24 +- src/generator/c/Bind.java | 113 +++-- src/generator/c/TypeTable.java | 2 +- src/generator/ccalls/CallImplementer.java | 18 +- src/impl/CApiParser.java | 11 + 68 files changed, 1912 insertions(+), 1079 deletions(-) create mode 100644 bwapi4/BWEventListener.java create mode 100644 bwapi4/DefaultBWListener.java create mode 100644 bwapi4/Mirror.java create mode 100644 bwapi4/Utils.java create mode 100644 compiled4/bwapi4/BWEventListener.class create mode 100644 compiled4/bwapi4/DefaultBWListener.class create mode 100644 compiled4/bwapi4/Mirror$FrameCallback.class create mode 100644 compiled4/bwapi4/Mirror$JarResources.class create mode 100644 compiled4/bwapi4/Mirror.class create mode 100644 compiled4/bwapi4/Utils.class create mode 100644 headers4/bwapi4_BWEventListener.h create mode 100644 headers4/bwapi4_DefaultBWListener.h create mode 100644 headers4/bwapi4_Mirror.h create mode 100644 headers4/bwapi4_Mirror_FrameCallback.h create mode 100644 headers4/bwapi4_Mirror_JarResources.h create mode 100644 headers4/bwapi4_Utils.h create mode 100644 manual-bwapi4/AIModule.java create mode 100644 manual-bwapi4/BWEventListener.java create mode 100644 manual-bwapi4/Color.java create mode 100644 manual-bwapi4/DefaultBWListener.java create mode 100644 manual-bwapi4/Mirror.java create mode 100644 manual-bwapi4/PositionOrUnit.java create mode 100644 manual-bwapi4/Utils.java diff --git a/bwapi4/AIModule.java b/bwapi4/AIModule.java index 62d67d3..ad9e0b6 100644 --- a/bwapi4/AIModule.java +++ b/bwapi4/AIModule.java @@ -1,136 +1,130 @@ package bwapi4; -import bwapi4.*; - -import java.util.Map; -import java.util.HashMap; -import java.util.Collection; -import java.util.List; +import bwapi4.BWEventListener; +/** + * This class receives all events from Broodwar. + * To process them, receive an AIModule's instance from {@link Mirror} and call {@link #setEventListener(bwapi.BWEventListener)} + * to set you own {@link BWEventListener listener}. + * There's also a stub class ({@link DefaultBWListener}) provided, so you don't have to implement all of the methods. + */ public class AIModule { + AIModule(){} + + private BWEventListener eventListener; + + public void setEventListener(BWEventListener eventListener) { + this.eventListener = eventListener; + } + public void onStart() { - onStart_native(pointer); + if (eventListener != null) { + eventListener.onStart(); + } } public void onEnd(boolean isWinner) { - onEnd_native(pointer, isWinner); + if (eventListener != null) { + eventListener.onEnd(isWinner); + } } public void onFrame() { - onFrame_native(pointer); + if (eventListener != null) { + eventListener.onFrame(); + } } public void onSendText(String text) { - onSendText_native(pointer, text); + if (eventListener != null) + { + eventListener.onSendText(text); + } } public void onReceiveText(Player player, String text) { - onReceiveText_native(pointer, player, text); + if (eventListener != null) { + eventListener.onReceiveText(player, text); + } } public void onPlayerLeft(Player player) { - onPlayerLeft_native(pointer, player); + if (eventListener != null) { + eventListener.onPlayerLeft(player); + } } public void onNukeDetect(Position target) { - onNukeDetect_native(pointer, target); + if (eventListener != null) { + eventListener.onNukeDetect(target); + } } public void onUnitDiscover(Unit unit) { - onUnitDiscover_native(pointer, unit); + if (eventListener != null) { + eventListener.onUnitDiscover(unit); + } } public void onUnitEvade(Unit unit) { - onUnitEvade_native(pointer, unit); + if (eventListener != null) { + eventListener.onUnitEvade(unit); + } } public void onUnitShow(Unit unit) { - onUnitShow_native(pointer, unit); + if (eventListener != null) { + eventListener.onUnitShow(unit); + } } public void onUnitHide(Unit unit) { - onUnitHide_native(pointer, unit); + if (eventListener != null) { + eventListener.onUnitHide(unit); + } } public void onUnitCreate(Unit unit) { - onUnitCreate_native(pointer, unit); + if (eventListener != null) { + eventListener.onUnitCreate(unit); + } } public void onUnitDestroy(Unit unit) { - onUnitDestroy_native(pointer, unit); + if (eventListener != null) { + eventListener.onUnitDestroy(unit); + } } public void onUnitMorph(Unit unit) { - onUnitMorph_native(pointer, unit); + if (eventListener != null) { + eventListener.onUnitMorph(unit); + } } public void onUnitRenegade(Unit unit) { - onUnitRenegade_native(pointer, unit); + if (eventListener != null) { + eventListener.onUnitRenegade(unit); + } } public void onSaveGame(String gameName) { - onSaveGame_native(pointer, gameName); + if (eventListener != null) { + eventListener.onSaveGame(gameName); + } } public void onUnitComplete(Unit unit) { - onUnitComplete_native(pointer, unit); - } - - - private static Map instances = new HashMap(); - - private AIModule(long pointer) { - this.pointer = pointer; - } - - private static AIModule get(long pointer) { - if (pointer == 0 ) { - return null; + if (eventListener != null) { + eventListener.onUnitComplete(unit); } - AIModule instance = instances.get(pointer); - if (instance == null ) { - instance = new AIModule(pointer); - instances.put(pointer, instance); - } - return instance; } - private long pointer; - - private native void onStart_native(long pointer); - - private native void onEnd_native(long pointer, boolean isWinner); - - private native void onFrame_native(long pointer); - - private native void onSendText_native(long pointer, String text); - - private native void onReceiveText_native(long pointer, Player player, String text); - - private native void onPlayerLeft_native(long pointer, Player player); - - private native void onNukeDetect_native(long pointer, Position target); - - private native void onUnitDiscover_native(long pointer, Unit unit); - - private native void onUnitEvade_native(long pointer, Unit unit); - - private native void onUnitShow_native(long pointer, Unit unit); - - private native void onUnitHide_native(long pointer, Unit unit); - - private native void onUnitCreate_native(long pointer, Unit unit); - - private native void onUnitDestroy_native(long pointer, Unit unit); - - private native void onUnitMorph_native(long pointer, Unit unit); - - private native void onUnitRenegade_native(long pointer, Unit unit); - - private native void onSaveGame_native(long pointer, String gameName); - - private native void onUnitComplete_native(long pointer, Unit unit); - + public void onPlayerDropped(Player player) { + if (eventListener != null) { + eventListener.onPlayerDropped(player); + } + } } diff --git a/bwapi4/BWEventListener.java b/bwapi4/BWEventListener.java new file mode 100644 index 0000000..6f9f031 --- /dev/null +++ b/bwapi4/BWEventListener.java @@ -0,0 +1,53 @@ +package bwapi4; + +import bwapi4.*; + +import java.util.Map; +import java.util.HashMap; +import java.util.Collection; +import java.util.List; + +/** + * Implement this interface and call {@link AIModule#setEventListener(bwapi.BWEventListener)} to receive all of the in game events. + */ +public interface BWEventListener { + + public void onStart(); + + public void onEnd(boolean isWinner); + + public void onFrame(); + + public void onSendText(String text); + + public void onReceiveText(Player player, String text); + + public void onPlayerLeft(Player player); + + public void onNukeDetect(Position target); + + public void onUnitDiscover(Unit unit); + + public void onUnitEvade(Unit unit); + + public void onUnitShow(Unit unit); + + public void onUnitHide(Unit unit); + + public void onUnitCreate(Unit unit); + + public void onUnitDestroy(Unit unit); + + public void onUnitMorph(Unit unit); + + public void onUnitRenegade(Unit unit); + + public void onSaveGame(String gameName); + + public void onUnitComplete(Unit unit); + + public void onPlayerDropped(Player player); + +} + + diff --git a/bwapi4/Color.java b/bwapi4/Color.java index b8b4d52..e15c22a 100644 --- a/bwapi4/Color.java +++ b/bwapi4/Color.java @@ -1,24 +1,28 @@ package bwapi4; -import bwapi4.*; - -import java.util.Map; +import java.lang.Override; import java.util.HashMap; -import java.util.Collection; -import java.util.List; +import java.util.Map; +/** + * Starcraft uses a 256 color palette to render everything, + * so the colors available for draw shapes using BWAPI is limited to the colors available in the Pallete. + * Several predefined colors from the pallete are provided. + */ public class Color { - public int red() { - return red_native(pointer); - } + private int r, g, b; - public int green() { - return green_native(pointer); - } - - public int blue() { - return blue_native(pointer); + /** + * Create a color using the color in the palette that is closest to the RGB color specified. This will check a number of colors in the pallet to see which is closest to the specified color so this function is relatively slow. + * @param r + * @param g + * @param b + */ + public Color(int r, int g, int b) { + this.r = r; + this.g = g; + this.b = b; } public static Color Red; @@ -45,32 +49,25 @@ public class Color { public static Color Grey; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Color)) return false; - private static Map instances = new HashMap(); + Color color = (Color) o; - private Color(long pointer) { - this.pointer = pointer; + if (b != color.b) return false; + if (g != color.g) return false; + if (r != color.r) return false; + + return true; } - private static Color get(long pointer) { - if (pointer == 0 ) { - return null; - } - Color instance = instances.get(pointer); - if (instance == null ) { - instance = new Color(pointer); - instances.put(pointer, instance); - } - return instance; + @Override + public int hashCode() { + int result = r; + result = 31 * result + g; + result = 31 * result + b; + return result; } - - private long pointer; - - private native int red_native(long pointer); - - private native int green_native(long pointer); - - private native int blue_native(long pointer); - - } diff --git a/bwapi4/DefaultBWListener.java b/bwapi4/DefaultBWListener.java new file mode 100644 index 0000000..76df50e --- /dev/null +++ b/bwapi4/DefaultBWListener.java @@ -0,0 +1,103 @@ +package bwapi4; + +import bwapi4.BWEventListener; +import bwapi4.Player; +import bwapi4.Position; +import bwapi4.Unit; + +/** + * A utility stub class providing a default implementation of {@link BWEventListener}, + * override it's methods if you want to handle only some events. + */ +public class DefaultBWListener implements BWEventListener { + + @Override + public void onStart() { + + } + + @Override + public void onEnd(boolean b) { + + } + + @Override + public void onFrame() { + + } + + @Override + public void onSendText(String s) { + + } + + @Override + public void onReceiveText(Player player, String s) { + + } + + @Override + public void onPlayerLeft(Player player) { + + } + + @Override + public void onNukeDetect(Position position) { + + } + + @Override + public void onUnitDiscover(Unit unit) { + + } + + @Override + public void onUnitEvade(Unit unit) { + + } + + @Override + public void onUnitShow(Unit unit) { + + } + + @Override + public void onUnitHide(Unit unit) { + + } + + @Override + public void onUnitCreate(Unit unit) { + + } + + @Override + public void onUnitDestroy(Unit unit) { + + } + + @Override + public void onUnitMorph(Unit unit) { + + } + + @Override + public void onUnitRenegade(Unit unit) { + + } + + @Override + public void onSaveGame(String s) { + + } + + @Override + public void onUnitComplete(Unit unit) { + + } + + @Override + public void onPlayerDropped(Player player) { + + } +} diff --git a/bwapi4/Game.java b/bwapi4/Game.java index dd609e0..0b30ed7 100644 --- a/bwapi4/Game.java +++ b/bwapi4/Game.java @@ -377,26 +377,14 @@ public class Game { printf_native(pointer, cstr_format); } - public void vPrintf(String cstr_format, Object ... args) { - vPrintf_native(pointer, cstr_format, args); - } - public void sendText(String cstr_format) { sendText_native(pointer, cstr_format); } - public void vSendText(String cstr_format, Object ... args) { - vSendText_native(pointer, cstr_format, args); - } - public void sendTextEx(boolean toAllies, String cstr_format) { sendTextEx_native(pointer, toAllies, cstr_format); } - public void vSendTextEx(boolean toAllies, String cstr_format, Object ... args) { - vSendTextEx_native(pointer, toAllies, cstr_format, args); - } - public boolean isInGame() { return isInGame_native(pointer); } @@ -477,10 +465,6 @@ public class Game { setTextSize_native(pointer, size); } - public void vDrawText(bwapi4.CoordinateType.Enum ctype, int x, int y, String cstr_format, Object ... arg) { - vDrawText_native(pointer, ctype, x, y, cstr_format, arg); - } - public void drawText(bwapi4.CoordinateType.Enum ctype, int x, int y, String cstr_format) { drawText_native(pointer, ctype, x, y, cstr_format); } @@ -1142,16 +1126,10 @@ public class Game { private native void printf_native(long pointer, String cstr_format); - private native void vPrintf_native(long pointer, String cstr_format, Object ... args); - private native void sendText_native(long pointer, String cstr_format); - private native void vSendText_native(long pointer, String cstr_format, Object ... args); - private native void sendTextEx_native(long pointer, boolean toAllies, String cstr_format); - private native void vSendTextEx_native(long pointer, boolean toAllies, String cstr_format, Object ... args); - private native boolean isInGame_native(long pointer); private native boolean isMultiplayer_native(long pointer); @@ -1192,8 +1170,6 @@ public class Game { private native void setTextSize_native(long pointer, bwapi4.Text.Size.Enum size); - private native void vDrawText_native(long pointer, bwapi4.CoordinateType.Enum ctype, int x, int y, String cstr_format, Object ... arg); - private native void drawText_native(long pointer, bwapi4.CoordinateType.Enum ctype, int x, int y, String cstr_format); private native void drawTextMap_native(long pointer, int x, int y, String cstr_format); diff --git a/bwapi4/Mirror.java b/bwapi4/Mirror.java new file mode 100644 index 0000000..1eaf4f2 --- /dev/null +++ b/bwapi4/Mirror.java @@ -0,0 +1,262 @@ +package bwapi4; + +import bwapi4.AIModule; +import bwapi4.BWEventListener; + +import java.io.*; +import java.io.File; +import java.lang.Exception; +import java.lang.UnsupportedOperationException; +import java.util.*; +import java.util.zip.*; + +/** + *

The API entry point. Standard use case:

+ *
    + *
  • Create a Mirror object and use {@link #getModule()} and then set an {@link AIModule}'s {@link BWEventListener}
    + *
  • Call {@link #startGame()} to init the API and connect to Broodwar, then launch Broodwar from ChaosLauncher.
  • + *
  • In you {@link BWEventListener#onStart()} method, receive the Game object by calling {@link #getGame()}
  • + *
+ *
+ * Example + *
+ *     {@code
+ *
+ *     mirror.getModule().setEventListener(new DefaultBWListener()
+ *     {
+ *            public void onStart() {
+ *                game = mirror.getGame();
+ *                self = game.self();
+ *                //initialization
+ *                ....
+ *            }
+ *
+ *           public void onUpdate() {
+ *               for (Unit myUnit : self.getUnits()) {
+ *                   //give orders to unit
+ *                   ...
+ *                }
+ *           }
+ *        });
+ *     }
+ *     mirror.startGame();
+ * 
+ + *

Note: The Game object is initialized during the {@link #startGame()} as well as other BWMirror API's constants. + * Do not use any API releated methods/fields prior to {@link #startGame()}.

+ + */ +public class Mirror { + + private Game game; + + private AIModule module = new AIModule(); + + private FrameCallback frameCallback; + + private static final boolean EXTRACT_JAR = true; + + private static final String VERSION = "2_0"; + + static { + String arch = System.getProperty("os.arch"); + String dllNames[] = {"bwapi_bridge" + VERSION, "gmp-vc90-mt", "mpfr-vc90-mt"}; + if(!arch.equals("x86")){ + throw new UnsupportedOperationException("BWMirror API supports only x86 architecture."); + } + try { + if (EXTRACT_JAR) { + System.setProperty("java.library.path", "."); + java.lang.reflect.Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths"); + fieldSysPath.setAccessible(true); + fieldSysPath.set(null, null); + + String path = Mirror.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + String decodedPath = java.net.URLDecoder.decode(path, "UTF-8"); + + for (String dllName : dllNames) { + String dllNameExt = dllName + ".dll"; + if (!new File(dllNameExt).exists()) { + JarResources jar = new JarResources(path); + byte[] correctDllData = jar.getResource(dllNameExt); + FileOutputStream funnyStream = new FileOutputStream(dllNameExt); + funnyStream.write(correctDllData); + funnyStream.close(); + } + } + } + } catch (Exception e) { + System.err.println("Failed to extract native libraries.\n" + e); + } + + System.loadLibrary(dllNames[0]); + + File dataDir = new File("bwapi-data/BWTA"); + if(!dataDir.exists()){ + try { + dataDir.mkdirs(); + } catch (Exception e) { + System.err.println("Unable to create /bwapi-data/BWTA folder, BWTA analysis will not be saved."); + } + } + } + + public Game getGame() { + return game; + } + + public AIModule getModule() { + return module; + } + + /** + * Starts the API, initializes all constants ( {@link UnitType}, {@link WeaponType} ) and the {@link Game} object. + * This method blocks until the end of game. + */ + public native void startGame(); + + private void update() { + if (frameCallback != null) { + frameCallback.update(); + } + } + + /*public void setFrameCallback(bwapi.Mirror.FrameCallback frameCallback) { + this.frameCallback = frameCallback; + } */ + + /** + * The simplest interface to receive update event from Broodwar. The {@link #update()} method is called once each frame. + * For a simple bot and implementation of this interface is enough, to receive all in game events, implement {@link BWEventListener}. + */ + /*public*/ private interface FrameCallback { + public void update(); + } + + @SuppressWarnings({"unchecked"}) + private static class JarResources { + + // external debug flag + public boolean debugOn = false; + + // jar resource mapping tables + private Hashtable htSizes = new Hashtable(); + private Hashtable htJarContents = new Hashtable(); + + // a jar file + private String jarFileName; + + /** + * creates a javabot.JarResources. It extracts all resources from a Jar + * into an internal hashtable, keyed by resource names. + * + * @param jarFileName a jar or zip file + */ + public JarResources(String jarFileName) { + this.jarFileName = jarFileName; + init(); + } + + /** + * Extracts a jar resource as a blob. + * + * @param name a resource name. + */ + public byte[] getResource(String name) { + return (byte[]) htJarContents.get(name); + } + + /** + * initializes internal hash tables with Jar file resources. + */ + private void init() { + try { + // extracts just sizes only. + ZipFile zf = new ZipFile(jarFileName); + Enumeration e = zf.entries(); + while (e.hasMoreElements()) { + ZipEntry ze = (ZipEntry) e.nextElement(); + if (debugOn) { + System.out.println(dumpZipEntry(ze)); + } + htSizes.put(ze.getName(), new Integer((int) ze.getSize())); + } + zf.close(); + + // extract resources and put them into the hashtable. + FileInputStream fis = new FileInputStream(jarFileName); + BufferedInputStream bis = new BufferedInputStream(fis); + ZipInputStream zis = new ZipInputStream(bis); + ZipEntry ze = null; + while ((ze = zis.getNextEntry()) != null) { + if (ze.isDirectory()) { + continue; + } + if (debugOn) { + System.out.println( + "ze.getName()=" + ze.getName() + "," + "getSize()=" + ze.getSize() + ); + } + int size = (int) ze.getSize(); + // -1 means unknown size. + if (size == -1) { + size = ((Integer) htSizes.get(ze.getName())).intValue(); + } + byte[] b = new byte[(int) size]; + int rb = 0; + int chunk = 0; + while (((int) size - rb) > 0) { + chunk = zis.read(b, rb, (int) size - rb); + if (chunk == -1) { + break; + } + rb += chunk; + } + // add to internal resource hashtable + htJarContents.put(ze.getName(), b); + if (debugOn) { + System.out.println( + ze.getName() + " rb=" + rb + + ",size=" + size + + ",csize=" + ze.getCompressedSize() + ); + } + } + } catch (NullPointerException e) { + System.out.println("done."); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Dumps a zip entry into a string. + * + * @param ze a ZipEntry + */ + private String dumpZipEntry(ZipEntry ze) { + StringBuffer sb = new StringBuffer(); + if (ze.isDirectory()) { + sb.append("d "); + } else { + sb.append("f "); + } + if (ze.getMethod() == ZipEntry.STORED) { + sb.append("stored "); + } else { + sb.append("defalted "); + } + sb.append(ze.getName()); + sb.append("\t"); + sb.append("" + ze.getSize()); + if (ze.getMethod() == ZipEntry.DEFLATED) { + sb.append("/" + ze.getCompressedSize()); + } + return (sb.toString()); + } + + + } +} \ No newline at end of file diff --git a/bwapi4/Position.java b/bwapi4/Position.java index 296e717..b4efd8e 100644 --- a/bwapi4/Position.java +++ b/bwapi4/Position.java @@ -30,8 +30,6 @@ public class Position extends AbstractPoint{ public native double getLength(); - public native boolean hasPath(Position position); - public int getX() { return x; } diff --git a/bwapi4/PositionOrUnit.java b/bwapi4/PositionOrUnit.java index 06301cc..b371c13 100644 --- a/bwapi4/PositionOrUnit.java +++ b/bwapi4/PositionOrUnit.java @@ -1,58 +1,55 @@ package bwapi4; -import bwapi4.*; - -import java.util.Map; -import java.util.HashMap; -import java.util.Collection; -import java.util.List; +import java.lang.IllegalArgumentException; +import java.lang.Object; +import java.lang.Override; public class PositionOrUnit { - public boolean isUnit() { - return isUnit_native(pointer); + private Unit unit; + + private Position position; + + public PositionOrUnit(Unit unit){ + if(unit == null){ + throw new IllegalArgumentException("PositionOrUnit must not reference null!"); + }; + this.unit = unit; } - public Unit getUnit() { - return getUnit_native(pointer); + public PositionOrUnit(Position position){ + if(position == null){ + throw new IllegalArgumentException("PositionOrUnit must not reference null!"); + }; + this.position = position; } - public boolean isPosition() { - return isPosition_native(pointer); + public Unit getUnit(){ + return unit; } public Position getPosition() { - return getPosition_native(pointer); + return position; } - - private static Map instances = new HashMap(); - - private PositionOrUnit(long pointer) { - this.pointer = pointer; + public boolean isUnit(){ + return unit != null; } - private static PositionOrUnit get(long pointer) { - if (pointer == 0 ) { - return null; - } - PositionOrUnit instance = instances.get(pointer); - if (instance == null ) { - instance = new PositionOrUnit(pointer); - instances.put(pointer, instance); - } - return instance; + public boolean isPosition(){ + return position != null; } - private long pointer; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PositionOrUnit)) return false; - private native boolean isUnit_native(long pointer); + PositionOrUnit that = (PositionOrUnit) o; - private native Unit getUnit_native(long pointer); + if (position != null ? !position.equals(that.position) : that.position != null) return false; + if (unit != null ? !unit.equals(that.unit) : that.unit != null) return false; - private native boolean isPosition_native(long pointer); - - private native Position getPosition_native(long pointer); - - -} + return true; + } +} \ No newline at end of file diff --git a/bwapi4/TilePosition.java b/bwapi4/TilePosition.java index a5d85c3..711ee06 100644 --- a/bwapi4/TilePosition.java +++ b/bwapi4/TilePosition.java @@ -9,7 +9,7 @@ import java.util.Map; * These are called build tiles because buildability data is available at this resolution, and correspond to the tiles seen in game. * For example, a Command Center occupies an area of 4x3 build tiles. */ -public class TilePosition { +public class TilePosition extends AbstractPoint{ private int x, y; public TilePosition(int x, int y) { @@ -21,8 +21,6 @@ public class TilePosition { return "[" + x + ", " + y + "]"; } - public native boolean hasPath(TilePosition position); - public native boolean isValid(); public native TilePosition makeValid(); @@ -82,4 +80,8 @@ public class TilePosition { result = 31 * result + y; return result; } + + public TilePosition getPoint(){ + return this; + } } \ No newline at end of file diff --git a/bwapi4/Unitset.java b/bwapi4/Unitset.java index 122a85f..eda3f72 100644 --- a/bwapi4/Unitset.java +++ b/bwapi4/Unitset.java @@ -25,18 +25,6 @@ public class Unitset { return getLarva_native(pointer); } - public void setClientInfo(int clientInfo) { - setClientInfo_native(pointer, clientInfo); - } - - public void setClientInfo() { - setClientInfo_native(pointer); - } - - public void setClientInfo(int clientInfo, int index) { - setClientInfo_native(pointer, clientInfo, index); - } - public List getUnitsInRadius(int radius, UnitFilter pred) { return getUnitsInRadius_native(pointer, radius, pred); } @@ -278,12 +266,6 @@ public class Unitset { private native List getLarva_native(long pointer); - private native void setClientInfo_native(long pointer, int clientInfo); - - private native void setClientInfo_native(long pointer); - - private native void setClientInfo_native(long pointer, int clientInfo, int index); - private native List getUnitsInRadius_native(long pointer, int radius, UnitFilter pred); private native Unit getClosestUnit_native(long pointer, UnitFilter pred); diff --git a/bwapi4/Utils.java b/bwapi4/Utils.java new file mode 100644 index 0000000..1a6154c --- /dev/null +++ b/bwapi4/Utils.java @@ -0,0 +1,52 @@ +package bwapi4; + +import java.lang.String; +import java.lang.System; + +/** + * + */ +public class Utils { + + public static final byte Previous = 0x01; + public static final byte Cyan = 0x02; + public static final byte Yellow = 0x03; + public static final byte White = 0x04; + public static final byte Grey = 0x05; + public static final byte Red = 0x06; + public static final byte Green = 0x07; + public static final byte Red_P1 = 0x08; + public static final byte Tab = 0x09; + public static final byte Newline = 0x0A; + public static final byte Invisible_no_override = 0x0B; + public static final byte Remove_beyond = 0x0C; + public static final byte Clear_formatting = 0x0D; + public static final byte Blue = 0x0E; + public static final byte Teal = 0x0F; + public static final byte Purple = 0x10; + public static final byte Orange = 0x11; + public static final byte Right_Align = 0x12; + public static final byte Center_Align = 0x13; + public static final byte Invisible = 0x14; + public static final byte Brown = 0x15; + public static final byte White_p7 = 0x16; + public static final byte Yellow_p8 = 0x17; + public static final byte Green_p9 = 0x18; + public static final byte Brighter_Yellow = 0x19; + public static final byte Cyan_default = 0x1A; + public static final byte Pinkish = 0x1B; + public static final byte Dark_Cyan = 0x1C; + public static final byte Greygreen = 0x1D; + public static final byte Bluegrey = 0x1E; + public static final byte Turquoise = 0x1F; + + public static String formatText(String text, byte format){ + byte[] textData = text.getBytes(); + int textDataLength = text.length(); + + byte[] newTextData = new byte[textDataLength + 1]; + newTextData[0] = format; + System.arraycopy(textData, 0, newTextData, 1, textDataLength); + return new String(newTextData); + } +} \ No newline at end of file diff --git a/bwapi4/WalkPosition.java b/bwapi4/WalkPosition.java index c7696e8..22a35f6 100644 --- a/bwapi4/WalkPosition.java +++ b/bwapi4/WalkPosition.java @@ -4,7 +4,7 @@ import java.lang.Override; import java.util.HashMap; import java.util.Map; -public class WalkPosition { +public class WalkPosition extends AbstractPoint{ private int x, y; @@ -27,8 +27,6 @@ public class WalkPosition { public native double getLength(); - public native boolean hasPath(WalkPosition position); - public int getX() { return x; } @@ -80,4 +78,8 @@ public class WalkPosition { } private long pointer; + + public WalkPosition getPoint(){ + return this; + } } \ No newline at end of file diff --git a/c4/impl.cpp b/c4/impl.cpp index d78ed45..f210c8a 100644 --- a/c4/impl.cpp +++ b/c4/impl.cpp @@ -1,6 +1,8 @@ #include "../concat_header.h" #include #include +#include +#include #include #include #include "../BWTA_Result.h" @@ -63,86 +65,21 @@ jfieldID FindCachedField(JNIEnv * env, jclass clz, string name, string signature using namespace BWAPI; -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onStart_1native(JNIEnv * env, jobject obj, jlong pointer){ -AIModule* x_aIModule = (AIModule*)pointer; -x_aIModule->onStart(); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onEnd_1native(JNIEnv * env, jobject obj, jlong pointer, jboolean isWinner){ -AIModule* x_aIModule = (AIModule*)pointer; -x_aIModule->onEnd((bool)isWinner); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onFrame_1native(JNIEnv * env, jobject obj, jlong pointer){ -AIModule* x_aIModule = (AIModule*)pointer; -x_aIModule->onFrame(); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onSendText_1native(JNIEnv * env, jobject obj, jlong pointer, jstring text){ -AIModule* x_aIModule = (AIModule*)pointer; -x_aIModule->onSendText(std::string(env->GetStringUTFChars(text, NULL))); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onReceiveText_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_player, jstring text){ -AIModule* x_aIModule = (AIModule*)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -x_aIModule->onReceiveText(player, std::string(env->GetStringUTFChars(text, NULL))); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onPlayerLeft_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_player){ -AIModule* x_aIModule = (AIModule*)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -x_aIModule->onPlayerLeft(player); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onNukeDetect_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -AIModule* x_aIModule = (AIModule*)pointer; -Position target((int)env->GetIntField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "x", "I")), (int)env->GetIntField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "y", "I"))); -x_aIModule->onNukeDetect(target); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onUnitDiscover_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -AIModule* x_aIModule = (AIModule*)pointer; -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -x_aIModule->onUnitDiscover(unit); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onUnitEvade_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -AIModule* x_aIModule = (AIModule*)pointer; -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -x_aIModule->onUnitEvade(unit); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onUnitShow_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -AIModule* x_aIModule = (AIModule*)pointer; -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -x_aIModule->onUnitShow(unit); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onUnitHide_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -AIModule* x_aIModule = (AIModule*)pointer; -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -x_aIModule->onUnitHide(unit); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onUnitCreate_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -AIModule* x_aIModule = (AIModule*)pointer; -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -x_aIModule->onUnitCreate(unit); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onUnitDestroy_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -AIModule* x_aIModule = (AIModule*)pointer; -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -x_aIModule->onUnitDestroy(unit); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onUnitMorph_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -AIModule* x_aIModule = (AIModule*)pointer; -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -x_aIModule->onUnitMorph(unit); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onUnitRenegade_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -AIModule* x_aIModule = (AIModule*)pointer; -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -x_aIModule->onUnitRenegade(unit); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onSaveGame_1native(JNIEnv * env, jobject obj, jlong pointer, jstring gameName){ -AIModule* x_aIModule = (AIModule*)pointer; -x_aIModule->onSaveGame(std::string(env->GetStringUTFChars(gameName, NULL))); -} -JNIEXPORT void JNICALL Java_bwapi4_AIModule_onUnitComplete_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -AIModule* x_aIModule = (AIModule*)pointer; -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -x_aIModule->onUnitComplete(unit); +PositionOrUnit convertPositionOrUnit(JNIEnv * env, jobject obj){ + jclass clz = FindCachedClass(env, "PositionOrUnit"); + jmethodID typeMethodId = FindCachedMethod(env, clz, "isUnit", "()Z"); + bool isUnit = (bool)env->CallBooleanMethod(obj, typeMethodId); + if(isUnit){ + jobject unitObj = env->CallObjectMethod(obj, FindCachedMethod(env, clz, "getUnit", "()Lbwapi4/Unit;")); + Unit unit = (Unit)env->GetLongField(unitObj, FindCachedField(env, env->GetObjectClass(unitObj), "unitObj", "J")); + return PositionOrUnit(unit); + } + jobject posObj = env->CallObjectMethod(obj, FindCachedMethod(env, clz, "getPosition", "()Lbwapi4/Position;")); + Position position((int)env->GetIntField(posObj, FindCachedField(env, env->GetObjectClass(posObj), "x", "I")), (int)env->GetIntField(posObj, FindCachedField(env, env->GetObjectClass(posObj), "y", "I"))); + return PositionOrUnit(position); } + + JNIEXPORT jint JNICALL Java_bwapi4_Bullet_getID_1native(JNIEnv * env, jobject obj, jlong pointer){ Bullet x_bullet = (Bullet)pointer; return x_bullet->getID(); @@ -236,18 +173,6 @@ JNIEXPORT void JNICALL Java_bwapi4_Client_update_1native(JNIEnv * env, jobject o Client* x_client = (Client*)pointer; x_client->update(); } -JNIEXPORT jint JNICALL Java_bwapi4_Color_red_1native(JNIEnv * env, jobject obj, jlong pointer){ -Color x_color((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "r", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "g", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "b", "I"))); -return x_color.red(); -} -JNIEXPORT jint JNICALL Java_bwapi4_Color_green_1native(JNIEnv * env, jobject obj, jlong pointer){ -Color x_color((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "r", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "g", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "b", "I"))); -return x_color.green(); -} -JNIEXPORT jint JNICALL Java_bwapi4_Color_blue_1native(JNIEnv * env, jobject obj, jlong pointer){ -Color x_color((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "r", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "g", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "b", "I"))); -return x_color.blue(); -} JNIEXPORT jobject JNICALL Java_bwapi4_Event_getPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ Event* x_evt = (Event*)pointer; Position cresult = x_evt->getPosition(); @@ -818,7 +743,7 @@ return x_game->isWalkable(walkX, walkY); } JNIEXPORT jboolean JNICALL Java_bwapi4_Game_isWalkable_1native__JLbwapi4_WalkPosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position){ Game* x_game = (Game*)pointer; -WalkPosition position = (WalkPosition)env->GetLongField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "pointer", "J")); +WalkPosition position((int)env->GetIntField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "x", "I")), (int)env->GetIntField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "y", "I"))); return x_game->isWalkable(position); } JNIEXPORT jboolean JNICALL Java_bwapi4_Game_isBuildable_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY){ @@ -995,29 +920,14 @@ JNIEXPORT void JNICALL Java_bwapi4_Game_printf_1native(JNIEnv * env, jobject obj Game* x_game = (Game*)pointer; x_game->printf(std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); } -JNIEXPORT void JNICALL Java_bwapi4_Game_vPrintf_1native(JNIEnv * env, jobject obj, jlong pointer, jstring cstr_format, jobject p_...){ -Game* x_game = (Game*)pointer; -Object ... = (Object)env->GetLongField(p_..., FindCachedField(env, env->GetObjectClass(p_...), "pointer", "J")); -x_game->vPrintf(std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str(), ...); -} JNIEXPORT void JNICALL Java_bwapi4_Game_sendText_1native(JNIEnv * env, jobject obj, jlong pointer, jstring cstr_format){ Game* x_game = (Game*)pointer; x_game->sendText(std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); } -JNIEXPORT void JNICALL Java_bwapi4_Game_vSendText_1native(JNIEnv * env, jobject obj, jlong pointer, jstring cstr_format, jobject p_...){ -Game* x_game = (Game*)pointer; -Object ... = (Object)env->GetLongField(p_..., FindCachedField(env, env->GetObjectClass(p_...), "pointer", "J")); -x_game->vSendText(std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str(), ...); -} JNIEXPORT void JNICALL Java_bwapi4_Game_sendTextEx_1native(JNIEnv * env, jobject obj, jlong pointer, jboolean toAllies, jstring cstr_format){ Game* x_game = (Game*)pointer; x_game->sendTextEx((bool)toAllies, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); } -JNIEXPORT void JNICALL Java_bwapi4_Game_vSendTextEx_1native(JNIEnv * env, jobject obj, jlong pointer, jboolean toAllies, jstring cstr_format, jobject p_...){ -Game* x_game = (Game*)pointer; -Object ... = (Object)env->GetLongField(p_..., FindCachedField(env, env->GetObjectClass(p_...), "pointer", "J")); -x_game->vSendTextEx((bool)toAllies, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str(), ...); -} JNIEXPORT jboolean JNICALL Java_bwapi4_Game_isInGame_1native(JNIEnv * env, jobject obj, jlong pointer){ Game* x_game = (Game*)pointer; return x_game->isInGame(); @@ -1159,18 +1069,12 @@ x_game->setTextSize(); } JNIEXPORT void JNICALL Java_bwapi4_Game_setTextSize_1native__JLbwapi4_Text_Size_Enum_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_size){ Game* x_game = (Game*)pointer; -bwapi4.Text.Size.Enum size = (bwapi4.Text.Size.Enum)env->GetLongField(p_size, FindCachedField(env, env->GetObjectClass(p_size), "pointer", "J")); +Text::Size::Enum size; x_game->setTextSize(size); } -JNIEXPORT void JNICALL Java_bwapi4_Game_vDrawText_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint x, jint y, jstring cstr_format, jobject p_...){ -Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); -Object ... = (Object)env->GetLongField(p_..., FindCachedField(env, env->GetObjectClass(p_...), "pointer", "J")); -x_game->vDrawText(ctype, x, y, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str(), ...); -} JNIEXPORT void JNICALL Java_bwapi4_Game_drawText_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint x, jint y, jstring cstr_format){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; x_game->drawText(ctype, x, y, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); } JNIEXPORT void JNICALL Java_bwapi4_Game_drawTextMap_1native__JIILjava_lang_String_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jstring cstr_format){ @@ -1202,13 +1106,13 @@ x_game->drawTextScreen(p, std::string(env->GetStringUTFChars(cstr_format, NULL)) } JNIEXPORT void JNICALL Java_bwapi4_Game_drawBox_1native__JLbwapi4_CoordinateType_Enum_2IIIILbwapi4_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint left, jint top, jint right, jint bottom, jobject p_color){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; Color color((int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "r", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "g", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "b", "I"))); x_game->drawBox(ctype, left, top, right, bottom, color); } JNIEXPORT void JNICALL Java_bwapi4_Game_drawBox_1native__JLbwapi4_CoordinateType_Enum_2IIIILbwapi4_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint left, jint top, jint right, jint bottom, jobject p_color, jboolean isSolid){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; Color color((int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "r", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "g", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "b", "I"))); x_game->drawBox(ctype, left, top, right, bottom, color, (bool)isSolid); } @@ -1286,13 +1190,13 @@ x_game->drawBoxScreen(leftTop, rightBottom, color, (bool)isSolid); } JNIEXPORT void JNICALL Java_bwapi4_Game_drawTriangle_1native__JLbwapi4_CoordinateType_Enum_2IIIIIILbwapi4_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint ax, jint ay, jint bx, jint by, jint cx, jint cy, jobject p_color){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; Color color((int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "r", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "g", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "b", "I"))); x_game->drawTriangle(ctype, ax, ay, bx, by, cx, cy, color); } JNIEXPORT void JNICALL Java_bwapi4_Game_drawTriangle_1native__JLbwapi4_CoordinateType_Enum_2IIIIIILbwapi4_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint ax, jint ay, jint bx, jint by, jint cx, jint cy, jobject p_color, jboolean isSolid){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; Color color((int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "r", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "g", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "b", "I"))); x_game->drawTriangle(ctype, ax, ay, bx, by, cx, cy, color, (bool)isSolid); } @@ -1376,13 +1280,13 @@ x_game->drawTriangleScreen(a, b, c, color, (bool)isSolid); } JNIEXPORT void JNICALL Java_bwapi4_Game_drawCircle_1native__JLbwapi4_CoordinateType_Enum_2IIILbwapi4_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint x, jint y, jint radius, jobject p_color){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; Color color((int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "r", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "g", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "b", "I"))); x_game->drawCircle(ctype, x, y, radius, color); } JNIEXPORT void JNICALL Java_bwapi4_Game_drawCircle_1native__JLbwapi4_CoordinateType_Enum_2IIILbwapi4_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint x, jint y, jint radius, jobject p_color, jboolean isSolid){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; Color color((int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "r", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "g", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "b", "I"))); x_game->drawCircle(ctype, x, y, radius, color, (bool)isSolid); } @@ -1454,13 +1358,13 @@ x_game->drawCircleScreen(p, radius, color, (bool)isSolid); } JNIEXPORT void JNICALL Java_bwapi4_Game_drawEllipse_1native__JLbwapi4_CoordinateType_Enum_2IIIILbwapi4_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint x, jint y, jint xrad, jint yrad, jobject p_color){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; Color color((int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "r", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "g", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "b", "I"))); x_game->drawEllipse(ctype, x, y, xrad, yrad, color); } JNIEXPORT void JNICALL Java_bwapi4_Game_drawEllipse_1native__JLbwapi4_CoordinateType_Enum_2IIIILbwapi4_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint x, jint y, jint xrad, jint yrad, jobject p_color, jboolean isSolid){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; Color color((int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "r", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "g", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "b", "I"))); x_game->drawEllipse(ctype, x, y, xrad, yrad, color, (bool)isSolid); } @@ -1532,7 +1436,7 @@ x_game->drawEllipseScreen(p, xrad, yrad, color, (bool)isSolid); } JNIEXPORT void JNICALL Java_bwapi4_Game_drawDot_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint x, jint y, jobject p_color){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; Color color((int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "r", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "g", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "b", "I"))); x_game->drawDot(ctype, x, y, color); } @@ -1571,7 +1475,7 @@ x_game->drawDotScreen(p, color); } JNIEXPORT void JNICALL Java_bwapi4_Game_drawLine_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint x1, jint y1, jint x2, jint y2, jobject p_color){ Game* x_game = (Game*)pointer; -bwapi4.CoordinateType.Enum ctype = (bwapi4.CoordinateType.Enum)env->GetLongField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "pointer", "J")); +CoordinateType::Enum ctype; Color color((int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "r", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "g", "I")), (int)env->GetIntField(p_color, FindCachedField(env, env->GetObjectClass(p_color), "b", "I"))); x_game->drawLine(ctype, x1, y1, x2, y2, color); } @@ -1809,10 +1713,6 @@ Player toPlayer = (Player)env->GetLongField(p_toPlayer, FindCachedField(env, env Player fromPlayer = (Player)env->GetLongField(p_fromPlayer, FindCachedField(env, env->GetObjectClass(p_fromPlayer), "pointer", "J")); return x_game->getDamageTo(toType, fromType, toPlayer, fromPlayer); } -JNIEXPORT void JNICALL Java_bwapi4_GameWrapper_flush_1native(JNIEnv * env, jobject obj, jlong pointer){ -GameWrapper x_gameWrapper = (GameWrapper)pointer; -x_gameWrapper->flush(); -} JNIEXPORT jint JNICALL Java_bwapi4_Player_getID_1native(JNIEnv * env, jobject obj, jlong pointer){ Player x_player = (Player)pointer; return x_player->getID(); @@ -2121,14 +2021,6 @@ JNIEXPORT void JNICALL Java_bwapi4_Playerset_setAlliance_1native__JZZ(JNIEnv * e Playerset* x_playerset = (Playerset*)pointer; x_playerset->setAlliance((bool)allies, (bool)alliedVictory); } -JNIEXPORT jboolean JNICALL Java_bwapi4_Point_isValid_1native(JNIEnv * env, jobject obj, jlong pointer){ -Point x_point = (Point)pointer; -return x_point->isValid(); -} -JNIEXPORT jdouble JNICALL Java_bwapi4_Point_getLength_1native(JNIEnv * env, jobject obj, jlong pointer){ -Point x_point = (Point)pointer; -return x_point->getLength(); -} JNIEXPORT jboolean JNICALL Java_bwapi4_Position_isValid(JNIEnv * env, jobject obj){ Position x_position((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "x", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "y", "I"))); return x_position.isValid(); @@ -2155,34 +2047,6 @@ JNIEXPORT jdouble JNICALL Java_bwapi4_Position_getLength(JNIEnv * env, jobject o Position x_position((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "x", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "y", "I"))); return x_position.getLength(); } -JNIEXPORT jboolean JNICALL Java_bwapi4_Position_hasPath(JNIEnv * env, jobject obj, jobject p_position){ -Position x_position((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "x", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "y", "I"))); -Position position((int)env->GetIntField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "x", "I")), (int)env->GetIntField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "y", "I"))); -return x_position.hasPath(position); -} -JNIEXPORT jboolean JNICALL Java_bwapi4_PositionOrUnit_isUnit_1native(JNIEnv * env, jobject obj, jlong pointer){ -PositionOrUnit x_positionOrUnit = (PositionOrUnit)pointer; -return x_positionOrUnit->isUnit(); -} -JNIEXPORT jobject JNICALL Java_bwapi4_PositionOrUnit_getUnit_1native(JNIEnv * env, jobject obj, jlong pointer){ -PositionOrUnit x_positionOrUnit = (PositionOrUnit)pointer; -jlong resptr = (jlong)x_positionOrUnit->getUnit(); -jclass retcls = FindCachedClass(env, "bwapi4/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi4/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jboolean JNICALL Java_bwapi4_PositionOrUnit_isPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -PositionOrUnit x_positionOrUnit = (PositionOrUnit)pointer; -return x_positionOrUnit->isPosition(); -} -JNIEXPORT jobject JNICALL Java_bwapi4_PositionOrUnit_getPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -PositionOrUnit x_positionOrUnit = (PositionOrUnit)pointer; -Position cresult = x_positionOrUnit->getPosition(); -jclass retcls = FindCachedClass(env, "bwapi/Position"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} JNIEXPORT jint JNICALL Java_bwapi4_Region_getID_1native(JNIEnv * env, jobject obj, jlong pointer){ Region x_region = (Region)pointer; return x_region->getID(); @@ -2286,11 +2150,6 @@ env->CallVoidMethod(result, addMethodID, elem); } return result; } -JNIEXPORT jboolean JNICALL Java_bwapi4_TilePosition_hasPath(JNIEnv * env, jobject obj, jobject p_position){ -TilePosition x_tilePosition((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "x", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "y", "I"))); -TilePosition position((int)env->GetIntField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "x", "I")), (int)env->GetIntField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "y", "I"))); -return x_tilePosition.hasPath(position); -} JNIEXPORT jboolean JNICALL Java_bwapi4_TilePosition_isValid(JNIEnv * env, jobject obj){ TilePosition x_tilePosition((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "x", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "y", "I"))); return x_tilePosition.isValid(); @@ -2411,12 +2270,12 @@ return x_unit->getResourceGroup(); } JNIEXPORT jint JNICALL Java_bwapi4_Unit_getDistance_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->getDistance(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_hasPath_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->hasPath(target); } JNIEXPORT jint JNICALL Java_bwapi4_Unit_getLastCommandFrame_1native(JNIEnv * env, jobject obj, jlong pointer){ @@ -3013,12 +2872,12 @@ return x_unit->issueCommand(command); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_attack_1native__JLbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->attack(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_attack_1native__JLbwapi4_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->attack(target, (bool)shiftQueueCommand); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_build_1native__JLbwapi4_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ @@ -3063,7 +2922,7 @@ return x_unit->upgrade(upgrade); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_setRallyPoint_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->setRallyPoint(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_move_1native__JLbwapi4_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ @@ -3208,12 +3067,12 @@ return x_unit->unloadAll(target, (bool)shiftQueueCommand); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_rightClick_1native__JLbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->rightClick(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_rightClick_1native__JLbwapi4_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->rightClick(target, (bool)shiftQueueCommand); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_haltConstruction_1native(JNIEnv * env, jobject obj, jlong pointer){ @@ -3256,7 +3115,7 @@ return x_unit->useTech(tech); JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_useTech_1native__JLbwapi4_TechType_2Lbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_target){ Unit x_unit = (Unit)pointer; TechType tech = (TechType)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->useTech(tech, target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_placeCOP_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ @@ -3391,22 +3250,22 @@ return x_unit->canAttack((bool)checkCommandibility); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttack_1native__JLbwapi4_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canAttack(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttack_1native__JLbwapi4_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canAttack(target, (bool)checkCanTargetUnit); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttack_1native__JLbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canAttack(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttack_1native__JLbwapi4_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canAttack(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttackGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped){ @@ -3423,27 +3282,27 @@ return x_unit->canAttackGrouped((bool)checkCommandibilityGrouped, (bool)checkCom } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttackGrouped_1native__JLbwapi4_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttackGrouped_1native__JLbwapi4_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttackGrouped_1native__JLbwapi4_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttackGrouped_1native__JLbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canAttackGrouped(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttackGrouped_1native__JLbwapi4_PositionOrUnit_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canAttackMove_1native__J(JNIEnv * env, jobject obj, jlong pointer){ @@ -3693,22 +3552,22 @@ return x_unit->canSetRallyPoint((bool)checkCommandibility); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canSetRallyPoint_1native__JLbwapi4_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canSetRallyPoint_1native__JLbwapi4_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canSetRallyPoint_1native__JLbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canSetRallyPoint(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canSetRallyPoint_1native__JLbwapi4_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canSetRallyPosition_1native__J(JNIEnv * env, jobject obj, jlong pointer){ @@ -4099,22 +3958,22 @@ return x_unit->canRightClick((bool)checkCommandibility); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClick_1native__JLbwapi4_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canRightClick(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClick_1native__JLbwapi4_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canRightClick(target, (bool)checkCanTargetUnit); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClick_1native__JLbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canRightClick(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClick_1native__JLbwapi4_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canRightClick(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClickGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped){ @@ -4131,27 +3990,27 @@ return x_unit->canRightClickGrouped((bool)checkCommandibilityGrouped, (bool)chec } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClickGrouped_1native__JLbwapi4_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClickGrouped_1native__JLbwapi4_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClickGrouped_1native__JLbwapi4_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClickGrouped_1native__JLbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canRightClickGrouped(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClickGrouped_1native__JLbwapi4_PositionOrUnit_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ Unit x_unit = (Unit)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canRightClickPosition_1native__J(JNIEnv * env, jobject obj, jlong pointer){ @@ -4341,25 +4200,25 @@ return x_unit->canUseTechWithOrWithoutTarget(tech, (bool)checkCanIssueCommandTyp JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canUseTech_1native__JLbwapi4_TechType_2Lbwapi4_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_target, jboolean checkCanTargetUnit, jboolean checkTargetsType, jboolean checkCanIssueCommandType){ Unit x_unit = (Unit)pointer; TechType tech = (TechType)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canUseTech(tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType, (bool)checkCanIssueCommandType); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canUseTech_1native__JLbwapi4_TechType_2Lbwapi4_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_target, jboolean checkCanTargetUnit, jboolean checkTargetsType){ Unit x_unit = (Unit)pointer; TechType tech = (TechType)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canUseTech(tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canUseTech_1native__JLbwapi4_TechType_2Lbwapi4_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_target, jboolean checkCanTargetUnit){ Unit x_unit = (Unit)pointer; TechType tech = (TechType)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canUseTech(tech, target, (bool)checkCanTargetUnit); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canUseTech_1native__JLbwapi4_TechType_2Lbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_target){ Unit x_unit = (Unit)pointer; TechType tech = (TechType)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canUseTech(tech, target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canUseTech_1native__JLbwapi4_TechType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ @@ -4370,7 +4229,7 @@ return x_unit->canUseTech(tech); JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canUseTech_1native__JLbwapi4_TechType_2Lbwapi4_PositionOrUnit_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_target, jboolean checkCanTargetUnit, jboolean checkTargetsType, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ Unit x_unit = (Unit)pointer; TechType tech = (TechType)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unit->canUseTech(tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType, (bool)checkCanIssueCommandType, (bool)checkCommandibility); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unit_canUseTechWithoutTarget_1native__JLbwapi4_TechType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jboolean checkCanIssueCommandType){ @@ -4555,18 +4414,6 @@ env->CallVoidMethod(result, addMethodID, elem); } return result; } -JNIEXPORT void JNICALL Java_bwapi4_Unitset_setClientInfo_1native__JI(JNIEnv * env, jobject obj, jlong pointer, jint clientInfo){ -Unitset* x_unitset = (Unitset*)pointer; -x_unitset->setClientInfo(clientInfo); -} -JNIEXPORT void JNICALL Java_bwapi4_Unitset_setClientInfo_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -x_unitset->setClientInfo(); -} -JNIEXPORT void JNICALL Java_bwapi4_Unitset_setClientInfo_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint clientInfo, jint index){ -Unitset* x_unitset = (Unitset*)pointer; -x_unitset->setClientInfo(clientInfo, index); -} JNIEXPORT jobject JNICALL Java_bwapi4_Unitset_getUnitsInRadius_1native(JNIEnv * env, jobject obj, jlong pointer, jint radius, jobject p_pred){ Unitset* x_unitset = (Unitset*)pointer; UnitFilter pred = (UnitFilter)env->GetLongField(p_pred, FindCachedField(env, env->GetObjectClass(p_pred), "pointer", "J")); @@ -4606,12 +4453,12 @@ return x_unitset->issueCommand(command); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unitset_attack_1native__JLbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unitset* x_unitset = (Unitset*)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unitset->attack(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unitset_attack_1native__JLbwapi4_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ Unitset* x_unitset = (Unitset*)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unitset->attack(target, (bool)shiftQueueCommand); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unitset_build_1native__JLbwapi4_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ @@ -4642,7 +4489,7 @@ return x_unitset->morph(type); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unitset_setRallyPoint_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unitset* x_unitset = (Unitset*)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unitset->setRallyPoint(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unitset_move_1native__JLbwapi4_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ @@ -4777,12 +4624,12 @@ return x_unitset->unloadAll(target, (bool)shiftQueueCommand); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unitset_rightClick_1native__JLbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ Unitset* x_unitset = (Unitset*)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unitset->rightClick(target); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unitset_rightClick_1native__JLbwapi4_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ Unitset* x_unitset = (Unitset*)pointer; -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unitset->rightClick(target, (bool)shiftQueueCommand); } JNIEXPORT jboolean JNICALL Java_bwapi4_Unitset_haltConstruction_1native(JNIEnv * env, jobject obj, jlong pointer){ @@ -4825,43 +4672,39 @@ return x_unitset->useTech(tech); JNIEXPORT jboolean JNICALL Java_bwapi4_Unitset_useTech_1native__JLbwapi4_TechType_2Lbwapi4_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_target){ Unitset* x_unitset = (Unitset*)pointer; TechType tech = (TechType)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -PositionOrUnit target = (PositionOrUnit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); +PositionOrUnit target(convertPositionOrUnit(env, p_target )); return x_unitset->useTech(tech, target); } JNIEXPORT jboolean JNICALL Java_bwapi4_WalkPosition_isValid(JNIEnv * env, jobject obj){ -WalkPosition x_walkPosition = (WalkPosition)pointer; -return x_walkPosition->isValid(); +WalkPosition x_walkPosition((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "x", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "y", "I"))); +return x_walkPosition.isValid(); } JNIEXPORT jobject JNICALL Java_bwapi4_WalkPosition_makeValid(JNIEnv * env, jobject obj){ -WalkPosition x_walkPosition = (WalkPosition)pointer; -jlong resptr = (jlong)x_walkPosition->makeValid(); +WalkPosition x_walkPosition((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "x", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "y", "I"))); +WalkPosition cresult = x_walkPosition.makeValid(); jclass retcls = FindCachedClass(env, "bwapi4/WalkPosition"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi4/WalkPosition;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); +jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); +jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); +return result; } JNIEXPORT jdouble JNICALL Java_bwapi4_WalkPosition_getDistance(JNIEnv * env, jobject obj, jobject p_position){ -WalkPosition x_walkPosition = (WalkPosition)pointer; -WalkPosition position = (WalkPosition)env->GetLongField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "pointer", "J")); -return x_walkPosition->getDistance(position); +WalkPosition x_walkPosition((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "x", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "y", "I"))); +WalkPosition position((int)env->GetIntField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "x", "I")), (int)env->GetIntField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "y", "I"))); +return x_walkPosition.getDistance(position); } JNIEXPORT jint JNICALL Java_bwapi4_WalkPosition_getApproxDistance(JNIEnv * env, jobject obj, jobject p_position){ -WalkPosition x_walkPosition = (WalkPosition)pointer; -WalkPosition position = (WalkPosition)env->GetLongField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "pointer", "J")); -return x_walkPosition->getApproxDistance(position); +WalkPosition x_walkPosition((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "x", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "y", "I"))); +WalkPosition position((int)env->GetIntField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "x", "I")), (int)env->GetIntField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "y", "I"))); +return x_walkPosition.getApproxDistance(position); } JNIEXPORT jdouble JNICALL Java_bwapi4_WalkPosition_getLength(JNIEnv * env, jobject obj){ -WalkPosition x_walkPosition = (WalkPosition)pointer; -return x_walkPosition->getLength(); -} -JNIEXPORT jboolean JNICALL Java_bwapi4_WalkPosition_hasPath(JNIEnv * env, jobject obj, jobject p_position){ -WalkPosition x_walkPosition = (WalkPosition)pointer; -WalkPosition position = (WalkPosition)env->GetLongField(p_position, FindCachedField(env, env->GetObjectClass(p_position), "pointer", "J")); -return x_walkPosition->hasPath(position); +WalkPosition x_walkPosition((int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "x", "I")), (int)env->GetIntField(obj, FindCachedField(env, env->GetObjectClass(obj), "y", "I"))); +return x_walkPosition.getLength(); } void reconnect() { while (!BWAPIClient.connect()) { - Sleep(1000); + std::this_thread::sleep_for(std::chrono::milliseconds{ 1000 }); } } @@ -4878,9 +4721,6 @@ void println(const char * text){ } JNIEXPORT void JNICALL Java_bwapi_Mirror_startGame(JNIEnv * env, jobject obj){ -println("Attempting to init BWAPI..."); - BWAPI_init(); - println("BWAPI ready."); jclass cls; jmethodID getId; cls = env->FindClass("Lbwapi/BulletType;"); @@ -6414,7 +6254,7 @@ println("Connecting to Broodwar..."); jclass posCls = env->FindClass("Lbwapi/Position;"); jobject moduleObj = env->GetObjectField(obj, env->GetFieldID(cls, "module", "Lbwapi/AIModule;")); jclass moduleCls = env->GetObjectClass(moduleObj); - env->SetObjectField(obj, env->GetFieldID(cls, "game", "Lbwapi/Game;"), env->CallStaticObjectMethod(gamecls, env->GetStaticMethodID(gamecls, "get", "(J)Lbwapi/Game;"), (long)Broodwarptr)); + env->SetObjectField(obj, env->GetFieldID(cls, "game", "Lbwapi/Game;"), env->CallStaticObjectMethod(gamecls, env->GetStaticMethodID(gamecls, "get", "(J)Lbwapi/Game;"), (long)&Broodwar)); jmethodID updateMethodID = env->GetMethodID(env->GetObjectClass(obj), "update", "()V"); jmethodID matchStartCallback = env->GetMethodID(moduleCls, "onStart", "()V"); @@ -6436,17 +6276,16 @@ println("Connecting to Broodwar..."); jmethodID unitCompleteCallback = env->GetMethodID(moduleCls, "onUnitComplete", "(Lbwapi/Unit;)V"); jmethodID playerDroppedCallback = env->GetMethodID(moduleCls, "onPlayerDropped", "(Lbwapi/Player;)V"); while (true) { - if (Broodwarptr != NULL) { - println("Waiting..."); - while (!Broodwarptr->isInGame()) { - BWAPIClient.update(); - if (Broodwarptr == NULL) { - println("Match ended."); - return; - } - } - } + println("Waiting...");while ( !Broodwar->isInGame() ) + { + BWAPI::BWAPIClient.update(); + if (!BWAPI::BWAPIClient.isConnected()) + { + println("Reconnecting..."); + reconnect(); + } + } println("Game ready!!!"); while (Broodwar->isInGame()) { @@ -6521,7 +6360,7 @@ println("Connecting to Broodwar..."); println("Reconnecting..."); reconnect(); } - } +println("Match ended."); } } } diff --git a/compiled4/bwapi4/AIModule.class b/compiled4/bwapi4/AIModule.class index 62d94c7849e3b38bc6069f3e76660ff67b0cff44..047688a3a16025e44af16afae808e98dfd34433f 100644 GIT binary patch literal 2279 zcmaKs+f&m(6vj_lpiQWf@JV-@O;{}0Qg zfN2zL&9dPJWoav?RUA~SY0MgHm@B^O1kPF7Hs%Ooh%nZc#U4iW#ItX;nwBhU#zwMW zTe`84;_#4ZEQylPYoZZ%@zBL$S=$#@>iA)*X*Bw?Vjc9@zoQt9nEcL`$Ov1M5Yv4W zV^(!rH;uZ1uxUI;$})PjWY##lk;6D{ug7#WVrFX^XA|q^1HV@a}HW4X?9gJqoMCd(}zdz))_Xc(@Xlh~Xc={wryr^UDR%=aFDT;Zq( zw}?m~A6rGO8y}pbr609HlnTn$#5YntqoU9Nw5{G4f)3IdD2EOK;p4u<$XD_m#RluG zF>0kQL?RDP`~*ryM-yMj_mfmE4#=+%5B1fj36mf7UJAfl1g_5E&reDO+lXB*b zH8>$I`VXkZCxHe48l)&ZIG`vH*bWDDyrEXv&=5EmVCYhl!-lY<9)?B^s7*E$2PgqU zqfHPS!l`gTlUOV#psTU6Fc%}E2Ndv2OG|=ujbb<|&eCFF;AnYUIw4!S1<-9+y4wV? zB^*z0P`eCD0W=BFlpBO2?hOjcplN_+0Lr*QxF+794jD8L&;me@-5^{wZ;&d3ascH4 zT6BYOUA;je8B_ph8K4z62v^=46qZ3R0a^vi@eb*=uUuCBiOWSGP$(=YqX*=IlJw)c7GuYZ2~9l-neHi3RTO42+Q^F+*3 zF_xGWF?lhoVw9LQG3#PB#Mokr)FWTUOCNGk*C-)?KX>)YJ?oh!#lO<-3zv( z7Au=8siE+o9ub#AG= zva6~dH)!Tgp-E+w zuppUSnW@V^XIHI-gHiBfM?BS>`S1wx%*Ve_UASFBs@OYd9h z4C03w@0Z;Frgd*~S_69Te`vV?#x~L$#P&7CHmAAI&xN1nAild1AEdjd9;?&c2&_9L z>tUZHKk#u|jT#8NyqBg@2;BZkx*`Inzt!!+2>g-=zdiz=AG=*9fxmq^U-0WCnR6?p zyqdS=v3713$tjT!6Gw2=#4Kh^T*aJ;dHK4A>n3g>W8xz$n8;$$#1d|r_*l#>F*z~I zVs4AMBj&D{d&1tAuZtKmaR`HPd}iWvd=bZ&CNAMCN=Qh2B$ms5jc*KeH&pGqRo-9) z^FeB#7O$n1XZkI7HC&=+RGq3-sHmkimIa?jQ*FvHwXL%;uby+HS&r(nPBmk`i_ffB z;WIn8LwM67(G&23`>F9j3`w~S7&xqZ@6yA|=l3vu$1p@Yta~l|0ut%;&oF9;{lJca z5!xgXpcC!rqUShLJ~Dz`dL*flgEh2-nQkP|!|2h-Wp;&;J}$G5NE#=0T;@a#tzqT> zmlF(!^}xCr^rl3GaX^(G?@u9XQLT2%uJFwOXh=UrZdc( zCv$ZhL*{%mvpdXOCUb?%g=l6^n3*FpPi88*;JU-i4Kf)r)6whngqbXv zMZOnm4oP`(X_lxIX);~I-t^&LU^JL6J(A-KTPAm#wR#C3`kY6vaFc_H@4iQ?@#;tP z4*rV1*Vq@sAL!4H{fU7$=)XT$!~U#4IQAL`T5xyl6~UN()`N)i`ySe;o9*}n`|*&9 z@rYY{%ws*pWsW8gYyTVRIIb8mk!wmqOcYzU6m8v7w{=VD)-Barw-j*QQp0si8P_e9 zT(=Z+-BQnWOG(!)Rb96fcHL6jbxV2YmfGSf)C)M5YLVS zQbe<(*%^;L?|prLd;-7$>;$kCz&3+G$;fbR7>tK|Hw-3}Y|0LUTzF?G$t}%akU^e| zC_7j9PToq`e&QLg_PFd;Bcp}v)~tP2$xDn;WH|8chVA<|o`}QhMUVGU*Zx0NP;#KR z@qyAyqo-^%dCp#+v4I9-@|6EPDiua3=^ikrzC&DUpqa}5X+z_R1mNqaoTJ;(Dm{X;bM+W}lOO)6h=0-fjV>djn*40bW zqXGQwj^|;KipN!- RzvlV6&8L@b(02?re*h4fn)v_# literal 0 HcmV?d00001 diff --git a/compiled4/bwapi4/Color.class b/compiled4/bwapi4/Color.class index 8ca1194cb18dcdddacb9c9d8876a46f6863c4eec..91b657b9b8e053b2c31c82888c0d8607370e66a9 100644 GIT binary patch literal 795 zcmZ8e$!-%t6s(@b8xz}EoCGEdgv}l!d;o!vO(Hpv$dZ#F5(U92V`mgk7(8ZTW97zo zaN)+u7bGks4hXJ%6GBvvI}+m1ulg-r_1^1Wf4+SOa1Z4S61b6uiJQ{glIC_2#Ux4s zBI0TAoba>+^yl8OK(^T$x;_7XWit%Is48I8gMmjl@Z3Nk@oW(F0{V%)$nBo+V%DQ@ z*d@N`_pCU+1ORXf#TPvMxO4`&`rS zdb@)+EiXE7Td|b)cHjnQ0)=Ap)P3hx0xDPbTBlySUoE{7nA-1?ddKa>4>+Gds^gw@ zCWLyi#3?iT;UH>zTfSt>#KYZ{WEK|TSV$seAuUY?DFN%>B?#pIm*uvKr9)ifJ`>z@ z4w_`(O_L-sl82baC0H>|DaZ9A}AmhF+wCfnQ0lz;5coDDTM#<$#3uh zZ$Tt6zM1$<#<+YWJM-SVVk)wJ!(HVw0`Y0?py-Z7+q$~H=`sM5S6pjytRXE-Hu zQ=p-+VQd+>nrGR$1*6KQ>XKD<46o+0VD6-M>`=AYJy)nW<@`y)6UUgL?HA&91vEB%LH5=b3(Ep*to!wktO?oXNQ;k^?4TcMvYob6sktR{#*)-D z|0eq6iga8?r;a}4blj4nUy2?K=xE0!1rK%1U{=ALjtpei<98_odv(m?F(;`ne9qWh zCw+lN-{$XivAAKDIB=?NlB?!sw+s?rd@0Z@cX86q%_r-1{hHl9$6^kv=8vZZCN8*I zW540Qg#T9obn;E7_)AC;8_>v;ilzY11lSzl*#KJtJQv{k09ymR5MWz?7k$*^sv(eO zj}SWe<(>Hb1g@Zqo~zV45$1_3GMP^hdkDRwB5;i|<~x#<-Tw>^pAK(g`1OB=M^1;g zkQQ&7Ns>&4WWq!(vxjJ=<1@tjBQ`1DGk^#Nxw0W>jJ^@%d9=#Bp|twuEuv!g17hhf zQ1%fI;XBlY><_dZKwVAmL0br%*?lC!Sjp}(G2{=NhQjkO2OmKkd9?D+s2$_7{^wm8iKO$Bi>2SgQ3>{=h H2t$7WNbK=_ diff --git a/compiled4/bwapi4/DefaultBWListener.class b/compiled4/bwapi4/DefaultBWListener.class new file mode 100644 index 0000000000000000000000000000000000000000..9d47d20e5f298ab7a1f4bb8273a83aaf718b19fa GIT binary patch literal 1334 zcmajd%~De_6bJAVYN?j;4HZNL6tuFi3)wh0ENF`?3OX&?8OKf9o|a&nbkf_4JeDhG zT=)P!l;c0QA279JHp$IBznt82a)1B%`HP5N(~Bg<=vjhx6SSA0=Ypo+Dy@PeL9xus zPlE2{Oq~VI7nSDoUc1WnLRMRNlQ6m*NE-->8(q+K(9CDI1A!AO+aO60*7Xbi2DO?g zUdd2qTT(Z(<-jW4Jal~4=n~ghh1_?$nPT-?cGN-kLrdPUJ)FEPWpqDY8d~(9eu!@(H~K9UUh3GWGiT4nvkNYK#f2HZcp#@%zHHk7^R#e>#U>rP2e3#>ci6;l+Xq;t6(7q2tdc9_ zzm*;UJoK|SU~7JM1h(#HIj~25b_%xPXJ=rK{j3DG>1P$NC;mJA0=DJPCc(D-ciI5k JiGIeXe*s@3#n=D< literal 0 HcmV?d00001 diff --git a/compiled4/bwapi4/Game.class b/compiled4/bwapi4/Game.class index e7521c8dbdfd0d7f2fedd16a00cab7a2a3dbe5fc..0696b3b3aa3ccab1a39ba2a48144a257a5b71b40 100644 GIT binary patch literal 30475 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 GzW9G~j`Yg_ diff --git a/compiled4/bwapi4/Mirror$FrameCallback.class b/compiled4/bwapi4/Mirror$FrameCallback.class new file mode 100644 index 0000000000000000000000000000000000000000..dd0833ba5d3866b61b89a3a8d0e02308b7eda12a GIT binary patch literal 203 zcmZ8bF%E)25S&xI(*qKFTMKQZ&>xVHSQrZv`vorsJb@gbf3xrbKFYXirOnRHWM(pt z=j{$)iBMsv;0wsEK2U1}`m_07K<}!~WhTijOa3Nzu5yclE~F3$OwudW`6~MA)5Ou) z#AIzs*-0S$l!{L(xlc*#)=`g`#H~6SaGS)Zbu{8O zwR}bi?2-7aj>{0%aJ$;~YS^dY4t4yTTJBT|Cl&i$8a}Tm`!(FH;R{OmixOYb@MVdw z=#1|kiFYgHDhD#gN_}EjZwt6G7^h8S5s&6-0PN&0%hItFomo7A~9 zH3Ao$2TKFj;yMGpYFUfx4cwsEzm4w*l&GKrGcq|xlnte|-@teAJ%(lA`*_5_qj-$q z%wcy!k~nPO2#y-~7;chy+`us4RWH*yX4wX&a6*}Q!oZWr8h8qW0t;Ne zNW5J+&>Ksn9H!PXCj>6a-*lx$M=je57u_l~PYX26@oN^(NjziVSv-=rQdBuzsYoe`7JZ3EwxHuoJTkmmaO*|C~ z7x)bPRDtECnqc*=D_rHXGb=a+7*ic?QUU#pr%|4Mj?)7Eq!TBWO-)TahpkaF>hOyp z`vt(QUE&3S`r(_+L}XdJS8@y4l=)6!R~m2o?2W}NyE|$old89?XChuVyww_E?-W&A zPb@WI*`^nJDIpeERNQ%<$gGCQkq9k^f*nydg3Y;(aa*ZKCkH~+xS8x{h&@qj!kZ#& zT~42hn6<;n5e4e<8eG^4CW@RN+?jMNmSJf;r9$vJl+dr|;K|h}trap-M5d<+#S~?F zWv;f~Zm}@G6oV==cfzdYxM}WHgQk>?Ah7&A&=ie|cLJ+?BpOdr>xDTLs%U1qYlX65 zDBlz)-gv6dLo#i<7$%m%tXS9g$3G*9n8fvcbMgxjc_$IuYIR$&53(T z1T+G;(Tt`%V0sA*rvfd?<}F>ly)7g(5UCoc6W~A z90vz2`3Cqk#Am&PdrRvSL~H4Bl(c41Iy8l{<0zjw`dXJ9ha``7gv z;m3Z|;ci@l2eA+jp&19swH_bLnORID%1l-3G5D5b;C~i6e}@aod}IV3CKKNZPpIT~ z@bUi!#9dib3{g-{!RVuKWq;@i%o8|(P9CZRhivr#?@JC~-ci)FwoRcng9}J0Z_A)A zi@*@~`TM4@AcG4xrKe9(Nid80oYIR1vS=8h)Ww};Su_p>%cgKiXSwL~1Rq)9GkCXRsN-I{NG*$Vl=&GnXV5}-)cyQ@9Wo$G z4q<_EE+;`O0vWWbo2Rr+t+c~m+Mx$zz#l${MZxl*7Vx`Y87v`Pr?fAPN)q*(I{fMB zm#NC5KZCZ~rRpTrsXgcCdkTK0r;Rik`Y2y}Io(d9T4BB{ z4NdJGM_4cr36aEm-F-LzrK#_|{FheZ*2SY(!c;y61BX$=2f7|dSrd#6R&1 zyoq0m3j9jc;3ZLqUyDY(EZXoJu?)Wz6ZpMI;1zoL2jSq4;ufBF<4@vN{8{Ybc`yDV z_TjH$60c$dy-lL}E!0TdD6#P@7D{aTFY2eU7*gUx9$8{YVza~+UIKwD&f-#W4iyr* z5KaDRhV}n=rwNRp9-vF&!`DlEO}g=`xSjvfqu0*g?Pd8x{n}U&lA0{|~KKPF(;1 literal 0 HcmV?d00001 diff --git a/compiled4/bwapi4/Mirror.class b/compiled4/bwapi4/Mirror.class new file mode 100644 index 0000000000000000000000000000000000000000..8f709be48c1e363ea1091809ba6150377fe5a658 GIT binary patch literal 3245 zcmai1`F9)D75<)OdB)>0apV|KLQ)Y@Vmp={0!f1s0=5%_6K{A)q9nx~NnnytDP2hlvcXO0LTRDx;hgs0=uiEr=X6QGr;#El=Cr@O^}c(*d++z| zn|bR$uU-XkH~y?4fmsFb)6js~W^92Wo0M$QEw~RE6{dzc%qw_Qg{9)GigPM#4H~iv zaw;4RZOE&5Oob~YJq5msf`$bwYFNUuY|blqzg+o%h7aOH8a|AVX!s~TrsCro9>)_3 zp46}%v$FYwil=1%Nd=$MuoHRNd|JV0G<3^JH$JQ2a~k4u636Fd^R$95G}HJOReVXF z{j!Fy;HwhO*HnC6D)@$q3ktp|pdU5dNz-!*Zrb!X9nR%UchELG&m{D33A7HmM%ElO zY&&J7&j~cnbIRqB)S{8M?&*7w(*pucStnDlxv{ab(LX#|THsw};qftn$jDh^!RWJ% z+#{)VBaahNUlu{h8*KpI+{j84f;yHn~ z8)H&YHJfs+%)Gg0b~o+KXY=ue^u4>|S)b|8=I7k%G_;OoFt0Gwl~#vsb$KJV_(9 z_u5vg3aQkav27h!#wx!HflQv`nv8lW6~-;7uKG z;dvc@l)(=86emrMzJU|d{W|_65g(n&$;%-1r3u3~V|^tbs)DgOM@FD0CQrqToMA6} zmKR&JY&({7{8-A2dB%d7>8<15cSeqLYw}C>yViKvcR34>lJpbUt*;&A1fF(D_}?Mi2(b7E>@tr^>U4oHKoO? zwYR_abXjV>xpzdcp_=Lv&FLLoIc%nF!!t>4Izd%Y6)doeU9d``;3T zNZqn72USquwsl&oyVMt4o9h;Qb6dc*g&d?dkMD%wcx zO>aP#-78Q8B)EneaEnm*-PeZmIL;k9)CLtNDta1JVsE889T9aE&BvOqKud-qEmO(H zh(47JM_Q*wx+6CgvEc$**U*-XY+OO)wMctp(<(YnwBzQ;Ek)cq+S6D>v`2^{Hn(F- z5w{hwwTNv+ylX5TiLK)HMB}bRI2yjXuPL-o=}!?qqxgyAoPdi#8Y0lW18(yd=?^(4%^^rHH<$Uc~Ol z6>;&}vlp>-^fLC8bw}=|+MXirq3R;`?h5T$#Xe~v@*Y|kXqMd)KZ7`c~n zml(-7-o{^Wmk0?}v@q2{Y|mpGqj`vgxt}C@0C$jRagu8<>2-+o8pJ~-Y9(deffTvS>|bI2UuSCHyjx5rQF9WN0}hbfm>5 zeo4zbJ`DBWh$}d$AbE`z)nKULRB0fWNgMnVXRgWX5bOd23Qk9_5qqd2e+GhU{~#wC b@ZJ)29>GEO5zf1LpAPW<;y(6=nza7{1L;BW literal 0 HcmV?d00001 diff --git a/compiled4/bwapi4/Point.class b/compiled4/bwapi4/Point.class index f617b9b1b0581a9a3dc20fc62df60db18e033160..0047a4fb51b107d7dd3982f02d66c50f6ebb6caa 100644 GIT binary patch literal 942 zcmZuvVQ}G3SGxwqEPoO|0}zkmD$@BsI1*tl(@fGriaRk)*SJlX10fM>%; z)xwU2y8^lWFbb2pK-Tk*1&qhTZXmGI3Zvlp_@o`gN3uO&CEp8@7sD`01WKOYYJZgP z!iP0o*<%~uzSJDe>E)Gx-3>>Hj5@*5P~eI;YdL6-l2~@8WP5%?pl}%WBAJY1%J}Ew z_GjHw!Mg4jn5{)%d9|GmS>{A}CPDCq+ddVBzPd@i- zzIn3(+cO_?FaC4K;SY!7xDz}H)$VMqw)<9okPepMI9Nf+K^dzKE~rp}YvG=QUDO1e ze|IZTNw0H?0!77E8_1|vdnT24WAr}e$1%Ky-@qonv&|m@loLvlahbPk%!1jheuMbR z1Bn=Ox|n68F-8Tw%B-N7>X!waLeqPSyOHAZ)d?~aWIrvSZNBG_=cA29bdk6UE+V5n zY$3}Nuw31lz~qyg!1}x(u!>8pWN=xxx~Wi|Ls_hEtkGAtd-`;p+321=GJU`Any%UJ zd`JF_t4Jx3DNmj<0_AR;^a0#o7v6EGn&5!M4Q8>c4p3;Gjq7V{(Sompn$tNG-M2htPGZc1mhEgitDm>LnZ|kiw5GDSFt3ZyI$M3y{gj|7%lJGT|3|L-Fkk_ZWh_yaBH6JcUq1> zez;pYOzXB+%a+ZHdB$It6FmkW4 zP1@12>p71)uPRRKiCw9)qSqY1?07YQCxG4;h?QK=^;bBPS1r&VaapZ=#42ujqUJ&~EQ=b*>iF0&CYR zyH1tICi^AnHtp=%^^UXtLSS6_Fx;m3i9T<@IhPs09I_S%$HEfLZFZ=)d<^`*2$1GO zOYmhXFr*dWIYBnY3hm;z%GxQMW<0|zjR?O0-LgJI^q{EpdxQwX>S4s1`U3Ic2%ii(6Br@AP62~|)x~hmXI0KErSvy%5fytM5lwwX zY#*wEAJEovKQVa#Z7bD-z7{rf`!FJSn%m=`5?qktu^?@X#2Th3G|eoHS-zJ7E+fUR x4n_M7OU0B> zcRqlFkKpVmqFOpt_3N&xe^;5X49pNq$aOWmtrZgD}_#-T@+4F9&gT-DGyAk ztjPzS)VT43&CV9v9$V~~M6k7T*JF=@X5V9k1CM%!Jq|hYh(Fy0ua%0KQ2055qMIJ` z7OvN|!o9-Z!VSWG^qcBPwzUIICo!ojmwc_fw=p0GiU?`vhhoj3Ck;c=d>?7|M+pRO2k=NX6CoMGyk30kFbecz5G5s1C8WdN=fA5k+g19Gv*Q?;V^FFgmse+ zQw}MM)0(u+o3U=zWsdoL7Rb1=U9_}hX<4)4QcOa#s!-=*NwEusP9C0R5BBe`PL-o` z+2d69Bxi0^sai5$YDA??hwniRnonP?v&Oo|8XKmxsDt{UP9#M!ZZf(`XCiUY>o?cB+CRXcxzn{p!=hawE%+E>_&<*P0my(x6951J diff --git a/compiled4/bwapi4/PositionOrUnit.class b/compiled4/bwapi4/PositionOrUnit.class index 61e786d8df7f43c36b84896cabeb8cd0960ed66f..c044650fca5b3d3e6da69b12c66556078eaaeaf9 100644 GIT binary patch literal 1193 zcma)6+fEZv6kTUJmol`LOSy=s1yR}#P`tiijK*kU0%C$-@NHVhW^kC+>5TdGz)>J^{FlizZB*Gcc9Lc@qjQ^uWNh z3`GMa6J=NuVHubaP$SA^vYW&OHK+zo-g zVp5HXr8O$vZai@Wa*M9-+>bV^PVmsKddy^3Lc8{C$!^AbS}`yykUvy7)Gw_Wm=iGS zPAFBWRV;P25$I(t!3zv_>Pb?XbX#qDs#tm~V7jfO$eQy!vb~nTP;qg?eqmQU+pkxa zs~b)&T!_&tjVP!&cU|dxFd;4nQgKc)GRUDKFxg?>^E{_+d$)pmwCVWaomVxd*&g9^ zH@~nMwZekm2n&Jp)CnBF<`n$M^CqO`dkFkdOz@GId_)RAbP@le5v~R(hCarA?pBc^0vIjtL0I3A z{Rm}!AhieebJ=t_Vn1xD}G!+KOA7LD1HV5&GKNSOc14B&67Q_G7LO$F-*l#wmA7`i;=j+C`;{AoaQQ+)5`Cly@`v`vK}YL8OLynQ6BgxR6hXede!h{a@^2H=9p^8nX8mo20m|m#x>( z)E(<9j4f!X9qS8>B^sh+UM@5I?jpT~+%`MpZo?N z@Ro`s#y1nc$r#s}PA?Eh(1X?6$FEq-u^;OsyN`G_#vl z!8V*)#S~aNn9VfYqG1cD*|Fo zpvS7pjDRl|egVJ` z>KMe3j%m#3IER>yxI86rUdK3Qb@ZZ7#Z4Wza9hQSjtSfm7&`J5<&85s?qXG-ue~Jq zjp{4TN1)e@xx28D+cxtYZMYqh>%r&TF^V;F<0Zw)4iBc~Y}>pp=S-{v(_l?^Uh_hH z%5shMmX3h`7Xka0KN&#bmotGtzv~S!!U^&mWb6b^(hk#`fR862kVt%is6+WcM_`1u z$4!K2M{$bwD7bI;5L{L~eJp#|VfG=y#}GY+z56ix2)p3pdGG|a`&eH~)X|d|{|fQ3 zr6%lV#?eJ|z@5qj&U*J8M&-T5XyDy@bc@|jP@~`A-$OvbPiX7OUl`qowiT@-xb7vB zd(eG&nv{|hcRo?5JWp{>)9`aChY@4zae4{v_t?@2ngw7G7AoUO1y%6sJ diff --git a/compiled4/bwapi4/TilePosition.class b/compiled4/bwapi4/TilePosition.class index 2bd0d860df8ae8a71e7f220826ce611a3cbd0be7..3851e18d3bdd425c02801950e6a064dbd1417a7e 100644 GIT binary patch delta 1014 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 literal 7341 zcma)Bdwd*K6+Sn~X0w~gvrXTmBx%!48mP4t!IWYf3nV7Av?;aqfs7bE%--F-oB93v&v)jY`<;94 z+{d?betZ85cONC96>3R@*3wU+fJYgA%J4IWpEEqh@C$}tGW?3+afV+r{D$GT3{Nop zj^XzVe_(i$;g1Y|V)!$|Qw)D$_$$NT7@lVMJHtO1{>ktR!@n5*&F~+FXBqy>@IQv< z7@lW%f#F4fA_m1!!BELi#SmhsW(YIXFhm%l47CgvLmfjsLjyx2LlZ+Y!wiO*Q956> zVAa&DsG64Y1Vq1KFz@p%em z)3(cYGMP?Icsse#j>mUz;4_GwoJ{V-IVz+r8LCC6)oz(>b;{1BlX0xkL^3{>?~?<8 zcd3dAsVb9Arm#BOlks?Rm!d{Jm|l~nQkOUOxSgHg%Tb$laK{pTc6uB~t~%|cY!~k8 zkz6{>BhrE@q_X0LL8OKhK z@>Y0`&8hJ;E-+6u;|x38Q`ik|>qD?quarii#-cN z7R!+ylXXf|Nqc6Nh?91QVgn*e)v)p~8z)+Ar@`=Lw!3 zU`Da-X)oV2*7DeZ1l6(t>drb(2X(utkW1@fv*Gh{dxEF~n~QW&JL^1oEVMmo)a{16 zSZa?YN~xRmzI1AbCAz7b^}dj5M=k4VQ49B9w;Hv&YFAT1WVLU$skORiZn@;@K3|SS zc}=GXuy%?BU_<-}5n|ohQmV(=KeI%ZwY%O|XYD9DLt2h`_j?L^sQvl#oj+7Xm#Svf zXxta-=%!>2pI=ZP{2EvyRZjMFR!WNoX~?3F(#I_NI9+eiCm24-a3g(+VGqMi7JZs- zw&=6;Ifh#-`aFHXqA${|47XYICAytquSH+xr>`*VW7yA>JLpb^0~Q_Rr-S_TRhnYB z%c4X4bcmnsro#+hv*-vv9pR^=+~Kc$BU)c@ z@kc&>x_8>~oU?wr|NC0n&A+dOab?WTSW%tejhg=|E=q*J%2W>d&YFgPQUg#MimdZd zGFG6-!eWr30cpJo9vmq=Uk=}ev>vzttv0H}6H%nQ`v9pas@R8yqKkml(oqN8NShEo z9lg?|H~IO75w3b43Hod3wf+Kjlm_)o zQN(EG~vI&=a(j0irLkg0n0(PX(T9tb-P|Q?INrhGWmReb_DaA zP5u!0mj?4^nEZ>tj|Z>lOq0JE{7Fgx`J9&>i58R3r+bo;KEHeiW|;we=2F24W}AFl z_`wP0m;rnmE~B(RBU63mnsis_8J}MI!noM;O#UR8*}&oFoAk?s9yt60lb-`WM?0sT z4zA=WCV#i^clrGC^=~x;t^oCo!3h?c{40eYoZwV5;3@>{4qTu%lm1?z2QE;%$-f%> zHwDkX!{qM~e(?MknE}@!;PSxvFE;7dgZ}0~dZ$Uh5%enp=}S!d&7i*}kRCJXw}AfE zKzf%+zZLYi1=71s`d-kl45TkL>H9%{d+<*6nEZpn58kQM%z#4(ct_xTPB-aCgdTX( zmYMu}g&!z|FERP|2|rk=mYV@55b(}mZGNfAe?a)GZ>-JbcYTE!@DQk11uoDTCjAl6 z-xWw-Y0@7B{oR4|GfnzqpuZ=O{xXyPxX@W0%72KU%V(MVC%}AP;P7Xg^d~`oe<1zk zCjBYUKM+XoHR(@-el>j%SU!2E_$rhCjPO6?^NpRwXT~{Zz_a++Lyh4FbmJ?LzZ0X~ zQ?$B!AudwkGqGNJUZg5~gGUtqGja`m#E;A3i;v@0wnnbKfkJBE9dvH%UG$1Ww59^3 z*4m+-V>ItDt=-x>MSVklXU`#eWhHIt*@wUi`HXL+Fuv%ks9J@nMulmPs-XocLW}Va z%nD`EwO~f5qUJg34%2n2f{RWBRB+vinRw;H4QQhTEoq|~Eoq}Ll{nOszlM)vvTs0E#tJZJna??xb@IN7t(fp2ybyNY2`i{|_QI@ErgE diff --git a/compiled4/bwapi4/Utils.class b/compiled4/bwapi4/Utils.class new file mode 100644 index 0000000000000000000000000000000000000000..8ec02848ca0322f27d8533936379cb0e2a55d931 GIT binary patch literal 1543 zcmZXUYgZF75QZmod!d$#B51){@3a-EiZ?(}TW?i_N(+dn>lR`OF1t0|g8f(eMLg>9 z2l%5rz6kklFtqgtF|^ej$cno~<9PF0$Z(t?7;C_RtT5~EmI z@=f8lnv7V1QCHFTnt|g53y$03A>?6f_nsya2b?PL_4;ajfobgnp~{*t#Tnxf`%+w*OI zlS?U9_2B^&Imb6(vTMBUd-|FLqu!#+9cjPy<%Sak!mF#qU8t(?r;%>#tK4ywy$6+) zTe9Kml)a!?>3DTb2N@lh6ZN&gzUzv*F8mOqM3H*|m;1IpMxA>_s+@<>YC-y2I-(!S zYHjSsb#*uZ?;Yjr#tmgS0tYRO-56JVlu=JXs%vq{zQ##)Gt{?N`CF&u2Fi61YL$ie zPBhmP4k7hDN4~Rnr*sSkHH!MK?kU`*RDeOx=QtdyE&0CXi>7Wl4FPTnPXtq#NhZ6X zM((e2lr)Wz%(OOYTw+u%Eb$$ItNcU2XgD*y?rb`F7uw}3frRRlh3x+}gjM{OT;UId z&M_Ydw>hdp6I7zd33@@x33^GdqVzgJHod_(|4pns9jH;;avI`FUZ?oWZML?~S5Q=} z&Vxcb;CRtiCcBJB9dWr=57u;VrN3e-?PkC?AcrHR(_Zl#ZALk>shy;gC8MWZQ%UI* z&MX(Q3v`mA_^lD8DM_6aCp;lg2PME=26uyd4DJOVH24s>&)~!0euD?VM+`m+P8vK2 z8Z!78IA!p0aN6J#;FAWQ0-rYc4EU_U=fJ}TXTVv5bKvs^kAN>2JPOVmd=Y%f;LG4K zgRg+E8hj0W-QXMGaf2tolLp@e-!ga#eB0nV;JXGFz(s@af$tmq0Q}J4N0>2FPZ;YH zOgx1z!#AAUCiV#%M$=d$+SrMw@swt;SFZE;7Y^f_&3&ehr&vN$DeKMm*o2j|LPOP& tP|~teUK;iaUtO_7g#=?0OIXawO(+dN*-MH+yPX}XN$vpDOZ@^4tp?uGyW literal 0 HcmV?d00001 diff --git a/compiled4/bwapi4/WalkPosition.class b/compiled4/bwapi4/WalkPosition.class index 620f79a2fdae1715083170e1faaf1c725da02bac..b28de490c6aa6661709a7a0fe0e6f62c328864bb 100644 GIT binary patch delta 1012 zcmZuv+fEZv6kTU(nKB#-*i!Ba1rdhJh#<;UTBK4gidIy_+i($Uno6J``ogm>CZs>$ z2lyZXB+I7{Rhc3x*|DuqtsKT>=%l z%T^|tawgr)m$UA=K=70a4t6}nVmHK{n=lkhT81J@U5r}PXhPG9cNj6n?%!jjJkT1KxoV z1uLQlR0shZ9n2NzM3>gxaJ0UJ9<494Ck^!BimtHd4UH8lD8~J{2vH66R9&xq2+t>- zR)97$bQRYqTeH8s(LoidB@v*TYjQYf4=UL#%vKJI4lu$wOy3DAObkjU4&^y47lr3l zx?k^N2wn`Mj5lVe3sVgkvl&yHvh=3TAEC6cq+H%OmvnM8k#;KDH~58y8hkt-e{q>&H<;~YlmiGRmDfw=$x delta 799 zcmZva+fEZv6o$V&wVg6-N-MNfP8KR!4q6dKK@M_84lSUfMNx-JEQAmf&|BZYo4NDC zC-8<~LZXQe;GLJefe%59Yi~?6#+hXOYwi87|KEGfyo;a2HoyJ+{1xb0ApU&WtJq1*bnYRNmRz-P#{fgmRs$!4D@}lVwbkqCu0UAxMWZ zsS<0N5|0&5Pe!5EHJ8W*g;097jdo27tu9YA>pXRNrWxV6Cd;tKXG4+L_TTvV*ZW&L z`B{Ijvgp53#O>OSzxy&@+}PeMA0CCO)N)cr;^G*0$sBV4!79$tXtC)xHe2+JF^cn+ zn-RX8M)F!&%W^?tN010-+Ahl4S(zPFOVpxQLrh*}Zedv~;eoe?6_E-OO3_Id2zJwB z@iJE|=DBLImunXLxGo)v8}u6`$y)@CO1SG2&PTiXN4ib6ZvL0r9Qv2rA>3OGNbCq& zBjbZcrBRNE9KofRxcogyF>V*Vyf6o4M=t0_Pe{1j*3vk1Y8AYXw6~b{7$J$ngyj>} zGAa|3uVf95BTauXresdjGN&0lVUAix!X0^GG*Z$Hb7DVFJqvQ*MVV63+DB0*bc;Dr k?l5Nhgqsx~^HhJKu5?8GA+ZA~6-MrK +/* Header for class bwapi4_BWEventListener */ + +#ifndef _Included_bwapi4_BWEventListener +#define _Included_bwapi4_BWEventListener +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/headers4/bwapi4_Color.h b/headers4/bwapi4_Color.h index 85487c9..81072af 100644 --- a/headers4/bwapi4_Color.h +++ b/headers4/bwapi4_Color.h @@ -7,30 +7,6 @@ #ifdef __cplusplus extern "C" { #endif -/* - * Class: bwapi4_Color - * Method: red_native - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_bwapi4_Color_red_1native - (JNIEnv *, jobject, jlong); - -/* - * Class: bwapi4_Color - * Method: green_native - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_bwapi4_Color_green_1native - (JNIEnv *, jobject, jlong); - -/* - * Class: bwapi4_Color - * Method: blue_native - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_bwapi4_Color_blue_1native - (JNIEnv *, jobject, jlong); - #ifdef __cplusplus } #endif diff --git a/headers4/bwapi4_DefaultBWListener.h b/headers4/bwapi4_DefaultBWListener.h new file mode 100644 index 0000000..976e9cc --- /dev/null +++ b/headers4/bwapi4_DefaultBWListener.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class bwapi4_DefaultBWListener */ + +#ifndef _Included_bwapi4_DefaultBWListener +#define _Included_bwapi4_DefaultBWListener +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/headers4/bwapi4_Game.h b/headers4/bwapi4_Game.h index 506686e..62ccd7a 100644 --- a/headers4/bwapi4_Game.h +++ b/headers4/bwapi4_Game.h @@ -743,14 +743,6 @@ JNIEXPORT jboolean JNICALL Java_bwapi4_Game_canUpgrade_1native__JLbwapi4_Upgrade JNIEXPORT void JNICALL Java_bwapi4_Game_printf_1native (JNIEnv *, jobject, jlong, jstring); -/* - * Class: bwapi4_Game - * Method: vPrintf_native - * Signature: (JLjava/lang/String;[Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_bwapi4_Game_vPrintf_1native - (JNIEnv *, jobject, jlong, jstring, jobjectArray); - /* * Class: bwapi4_Game * Method: sendText_native @@ -759,14 +751,6 @@ JNIEXPORT void JNICALL Java_bwapi4_Game_vPrintf_1native JNIEXPORT void JNICALL Java_bwapi4_Game_sendText_1native (JNIEnv *, jobject, jlong, jstring); -/* - * Class: bwapi4_Game - * Method: vSendText_native - * Signature: (JLjava/lang/String;[Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_bwapi4_Game_vSendText_1native - (JNIEnv *, jobject, jlong, jstring, jobjectArray); - /* * Class: bwapi4_Game * Method: sendTextEx_native @@ -775,14 +759,6 @@ JNIEXPORT void JNICALL Java_bwapi4_Game_vSendText_1native JNIEXPORT void JNICALL Java_bwapi4_Game_sendTextEx_1native (JNIEnv *, jobject, jlong, jboolean, jstring); -/* - * Class: bwapi4_Game - * Method: vSendTextEx_native - * Signature: (JZLjava/lang/String;[Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_bwapi4_Game_vSendTextEx_1native - (JNIEnv *, jobject, jlong, jboolean, jstring, jobjectArray); - /* * Class: bwapi4_Game * Method: isInGame_native @@ -943,14 +919,6 @@ JNIEXPORT void JNICALL Java_bwapi4_Game_setTextSize_1native__J JNIEXPORT void JNICALL Java_bwapi4_Game_setTextSize_1native__JLbwapi4_Text_Size_Enum_2 (JNIEnv *, jobject, jlong, jobject); -/* - * Class: bwapi4_Game - * Method: vDrawText_native - * Signature: (JLbwapi4/CoordinateType/Enum;IILjava/lang/String;[Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_bwapi4_Game_vDrawText_1native - (JNIEnv *, jobject, jlong, jobject, jint, jint, jstring, jobjectArray); - /* * Class: bwapi4_Game * Method: drawText_native diff --git a/headers4/bwapi4_Mirror.h b/headers4/bwapi4_Mirror.h new file mode 100644 index 0000000..f741dc7 --- /dev/null +++ b/headers4/bwapi4_Mirror.h @@ -0,0 +1,23 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class bwapi4_Mirror */ + +#ifndef _Included_bwapi4_Mirror +#define _Included_bwapi4_Mirror +#ifdef __cplusplus +extern "C" { +#endif +#undef bwapi4_Mirror_EXTRACT_JAR +#define bwapi4_Mirror_EXTRACT_JAR 1L +/* + * Class: bwapi4_Mirror + * Method: startGame + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_bwapi4_Mirror_startGame + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/headers4/bwapi4_Mirror_FrameCallback.h b/headers4/bwapi4_Mirror_FrameCallback.h new file mode 100644 index 0000000..71bfa54 --- /dev/null +++ b/headers4/bwapi4_Mirror_FrameCallback.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class bwapi4_Mirror_FrameCallback */ + +#ifndef _Included_bwapi4_Mirror_FrameCallback +#define _Included_bwapi4_Mirror_FrameCallback +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/headers4/bwapi4_Mirror_JarResources.h b/headers4/bwapi4_Mirror_JarResources.h new file mode 100644 index 0000000..803fe25 --- /dev/null +++ b/headers4/bwapi4_Mirror_JarResources.h @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class bwapi4_Mirror_JarResources */ + +#ifndef _Included_bwapi4_Mirror_JarResources +#define _Included_bwapi4_Mirror_JarResources +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/headers4/bwapi4_Point.h b/headers4/bwapi4_Point.h index ae67c38..5d334b9 100644 --- a/headers4/bwapi4_Point.h +++ b/headers4/bwapi4_Point.h @@ -9,19 +9,35 @@ extern "C" { #endif /* * Class: bwapi4_Point - * Method: isValid_native - * Signature: (J)Z + * Method: isValid + * Signature: ()Z */ -JNIEXPORT jboolean JNICALL Java_bwapi4_Point_isValid_1native - (JNIEnv *, jobject, jlong); +JNIEXPORT jboolean JNICALL Java_bwapi4_Point_isValid + (JNIEnv *, jobject); /* * Class: bwapi4_Point - * Method: getLength_native - * Signature: (J)D + * Method: makeValid + * Signature: ()Lbwapi4/Point; */ -JNIEXPORT jdouble JNICALL Java_bwapi4_Point_getLength_1native - (JNIEnv *, jobject, jlong); +JNIEXPORT jobject JNICALL Java_bwapi4_Point_makeValid + (JNIEnv *, jobject); + +/* + * Class: bwapi4_Point + * Method: getDistance + * Signature: (Lbwapi4/Point;)D + */ +JNIEXPORT jdouble JNICALL Java_bwapi4_Point_getDistance + (JNIEnv *, jobject, jobject); + +/* + * Class: bwapi4_Point + * Method: getLength + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_bwapi4_Point_getLength + (JNIEnv *, jobject); #ifdef __cplusplus } diff --git a/headers4/bwapi4_Position.h b/headers4/bwapi4_Position.h index 0ce0ea9..0c71c53 100644 --- a/headers4/bwapi4_Position.h +++ b/headers4/bwapi4_Position.h @@ -47,14 +47,6 @@ JNIEXPORT jint JNICALL Java_bwapi4_Position_getApproxDistance JNIEXPORT jdouble JNICALL Java_bwapi4_Position_getLength (JNIEnv *, jobject); -/* - * Class: bwapi4_Position - * Method: hasPath - * Signature: (Lbwapi4/Position;)Z - */ -JNIEXPORT jboolean JNICALL Java_bwapi4_Position_hasPath - (JNIEnv *, jobject, jobject); - #ifdef __cplusplus } #endif diff --git a/headers4/bwapi4_PositionOrUnit.h b/headers4/bwapi4_PositionOrUnit.h index 08db275..bcd388d 100644 --- a/headers4/bwapi4_PositionOrUnit.h +++ b/headers4/bwapi4_PositionOrUnit.h @@ -7,38 +7,6 @@ #ifdef __cplusplus extern "C" { #endif -/* - * Class: bwapi4_PositionOrUnit - * Method: isUnit_native - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_bwapi4_PositionOrUnit_isUnit_1native - (JNIEnv *, jobject, jlong); - -/* - * Class: bwapi4_PositionOrUnit - * Method: getUnit_native - * Signature: (J)Lbwapi4/Unit; - */ -JNIEXPORT jobject JNICALL Java_bwapi4_PositionOrUnit_getUnit_1native - (JNIEnv *, jobject, jlong); - -/* - * Class: bwapi4_PositionOrUnit - * Method: isPosition_native - * Signature: (J)Z - */ -JNIEXPORT jboolean JNICALL Java_bwapi4_PositionOrUnit_isPosition_1native - (JNIEnv *, jobject, jlong); - -/* - * Class: bwapi4_PositionOrUnit - * Method: getPosition_native - * Signature: (J)Lbwapi4/Position; - */ -JNIEXPORT jobject JNICALL Java_bwapi4_PositionOrUnit_getPosition_1native - (JNIEnv *, jobject, jlong); - #ifdef __cplusplus } #endif diff --git a/headers4/bwapi4_TilePosition.h b/headers4/bwapi4_TilePosition.h index 268685c..982f3a0 100644 --- a/headers4/bwapi4_TilePosition.h +++ b/headers4/bwapi4_TilePosition.h @@ -7,14 +7,6 @@ #ifdef __cplusplus extern "C" { #endif -/* - * Class: bwapi4_TilePosition - * Method: hasPath - * Signature: (Lbwapi4/TilePosition;)Z - */ -JNIEXPORT jboolean JNICALL Java_bwapi4_TilePosition_hasPath - (JNIEnv *, jobject, jobject); - /* * Class: bwapi4_TilePosition * Method: isValid diff --git a/headers4/bwapi4_Unitset.h b/headers4/bwapi4_Unitset.h index 9d0d856..49ae414 100644 --- a/headers4/bwapi4_Unitset.h +++ b/headers4/bwapi4_Unitset.h @@ -39,30 +39,6 @@ JNIEXPORT jobject JNICALL Java_bwapi4_Unitset_getInterceptors_1native JNIEXPORT jobject JNICALL Java_bwapi4_Unitset_getLarva_1native (JNIEnv *, jobject, jlong); -/* - * Class: bwapi4_Unitset - * Method: setClientInfo_native - * Signature: (JI)V - */ -JNIEXPORT void JNICALL Java_bwapi4_Unitset_setClientInfo_1native__JI - (JNIEnv *, jobject, jlong, jint); - -/* - * Class: bwapi4_Unitset - * Method: setClientInfo_native - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_bwapi4_Unitset_setClientInfo_1native__J - (JNIEnv *, jobject, jlong); - -/* - * Class: bwapi4_Unitset - * Method: setClientInfo_native - * Signature: (JII)V - */ -JNIEXPORT void JNICALL Java_bwapi4_Unitset_setClientInfo_1native__JII - (JNIEnv *, jobject, jlong, jint, jint); - /* * Class: bwapi4_Unitset * Method: getUnitsInRadius_native diff --git a/headers4/bwapi4_Utils.h b/headers4/bwapi4_Utils.h new file mode 100644 index 0000000..8cc8d09 --- /dev/null +++ b/headers4/bwapi4_Utils.h @@ -0,0 +1,75 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class bwapi4_Utils */ + +#ifndef _Included_bwapi4_Utils +#define _Included_bwapi4_Utils +#ifdef __cplusplus +extern "C" { +#endif +#undef bwapi4_Utils_Previous +#define bwapi4_Utils_Previous 1L +#undef bwapi4_Utils_Cyan +#define bwapi4_Utils_Cyan 2L +#undef bwapi4_Utils_Yellow +#define bwapi4_Utils_Yellow 3L +#undef bwapi4_Utils_White +#define bwapi4_Utils_White 4L +#undef bwapi4_Utils_Grey +#define bwapi4_Utils_Grey 5L +#undef bwapi4_Utils_Red +#define bwapi4_Utils_Red 6L +#undef bwapi4_Utils_Green +#define bwapi4_Utils_Green 7L +#undef bwapi4_Utils_Red_P1 +#define bwapi4_Utils_Red_P1 8L +#undef bwapi4_Utils_Tab +#define bwapi4_Utils_Tab 9L +#undef bwapi4_Utils_Newline +#define bwapi4_Utils_Newline 10L +#undef bwapi4_Utils_Invisible_no_override +#define bwapi4_Utils_Invisible_no_override 11L +#undef bwapi4_Utils_Remove_beyond +#define bwapi4_Utils_Remove_beyond 12L +#undef bwapi4_Utils_Clear_formatting +#define bwapi4_Utils_Clear_formatting 13L +#undef bwapi4_Utils_Blue +#define bwapi4_Utils_Blue 14L +#undef bwapi4_Utils_Teal +#define bwapi4_Utils_Teal 15L +#undef bwapi4_Utils_Purple +#define bwapi4_Utils_Purple 16L +#undef bwapi4_Utils_Orange +#define bwapi4_Utils_Orange 17L +#undef bwapi4_Utils_Right_Align +#define bwapi4_Utils_Right_Align 18L +#undef bwapi4_Utils_Center_Align +#define bwapi4_Utils_Center_Align 19L +#undef bwapi4_Utils_Invisible +#define bwapi4_Utils_Invisible 20L +#undef bwapi4_Utils_Brown +#define bwapi4_Utils_Brown 21L +#undef bwapi4_Utils_White_p7 +#define bwapi4_Utils_White_p7 22L +#undef bwapi4_Utils_Yellow_p8 +#define bwapi4_Utils_Yellow_p8 23L +#undef bwapi4_Utils_Green_p9 +#define bwapi4_Utils_Green_p9 24L +#undef bwapi4_Utils_Brighter_Yellow +#define bwapi4_Utils_Brighter_Yellow 25L +#undef bwapi4_Utils_Cyan_default +#define bwapi4_Utils_Cyan_default 26L +#undef bwapi4_Utils_Pinkish +#define bwapi4_Utils_Pinkish 27L +#undef bwapi4_Utils_Dark_Cyan +#define bwapi4_Utils_Dark_Cyan 28L +#undef bwapi4_Utils_Greygreen +#define bwapi4_Utils_Greygreen 29L +#undef bwapi4_Utils_Bluegrey +#define bwapi4_Utils_Bluegrey 30L +#undef bwapi4_Utils_Turquoise +#define bwapi4_Utils_Turquoise 31L +#ifdef __cplusplus +} +#endif +#endif diff --git a/headers4/bwapi4_WalkPosition.h b/headers4/bwapi4_WalkPosition.h index 7031bfc..bb41010 100644 --- a/headers4/bwapi4_WalkPosition.h +++ b/headers4/bwapi4_WalkPosition.h @@ -47,14 +47,6 @@ JNIEXPORT jint JNICALL Java_bwapi4_WalkPosition_getApproxDistance JNIEXPORT jdouble JNICALL Java_bwapi4_WalkPosition_getLength (JNIEnv *, jobject); -/* - * Class: bwapi4_WalkPosition - * Method: hasPath - * Signature: (Lbwapi4/WalkPosition;)Z - */ -JNIEXPORT jboolean JNICALL Java_bwapi4_WalkPosition_hasPath - (JNIEnv *, jobject, jobject); - #ifdef __cplusplus } #endif diff --git a/manual-bwapi4/AIModule.java b/manual-bwapi4/AIModule.java new file mode 100644 index 0000000..ad9e0b6 --- /dev/null +++ b/manual-bwapi4/AIModule.java @@ -0,0 +1,130 @@ +package bwapi4; + +import bwapi4.BWEventListener; + +/** + * This class receives all events from Broodwar. + * To process them, receive an AIModule's instance from {@link Mirror} and call {@link #setEventListener(bwapi.BWEventListener)} + * to set you own {@link BWEventListener listener}. + * There's also a stub class ({@link DefaultBWListener}) provided, so you don't have to implement all of the methods. + */ +public class AIModule { + + AIModule(){} + + private BWEventListener eventListener; + + public void setEventListener(BWEventListener eventListener) { + this.eventListener = eventListener; + } + + public void onStart() { + if (eventListener != null) { + eventListener.onStart(); + } + } + + public void onEnd(boolean isWinner) { + if (eventListener != null) { + eventListener.onEnd(isWinner); + } + } + + public void onFrame() { + if (eventListener != null) { + eventListener.onFrame(); + } + } + + public void onSendText(String text) { + if (eventListener != null) + { + eventListener.onSendText(text); + } + } + + public void onReceiveText(Player player, String text) { + if (eventListener != null) { + eventListener.onReceiveText(player, text); + } + } + + public void onPlayerLeft(Player player) { + if (eventListener != null) { + eventListener.onPlayerLeft(player); + } + } + + public void onNukeDetect(Position target) { + if (eventListener != null) { + eventListener.onNukeDetect(target); + } + } + + public void onUnitDiscover(Unit unit) { + if (eventListener != null) { + eventListener.onUnitDiscover(unit); + } + } + + public void onUnitEvade(Unit unit) { + if (eventListener != null) { + eventListener.onUnitEvade(unit); + } + } + + public void onUnitShow(Unit unit) { + if (eventListener != null) { + eventListener.onUnitShow(unit); + } + } + + public void onUnitHide(Unit unit) { + if (eventListener != null) { + eventListener.onUnitHide(unit); + } + } + + public void onUnitCreate(Unit unit) { + if (eventListener != null) { + eventListener.onUnitCreate(unit); + } + } + + public void onUnitDestroy(Unit unit) { + if (eventListener != null) { + eventListener.onUnitDestroy(unit); + } + } + + public void onUnitMorph(Unit unit) { + if (eventListener != null) { + eventListener.onUnitMorph(unit); + } + } + + public void onUnitRenegade(Unit unit) { + if (eventListener != null) { + eventListener.onUnitRenegade(unit); + } + } + + public void onSaveGame(String gameName) { + if (eventListener != null) { + eventListener.onSaveGame(gameName); + } + } + + public void onUnitComplete(Unit unit) { + if (eventListener != null) { + eventListener.onUnitComplete(unit); + } + } + + public void onPlayerDropped(Player player) { + if (eventListener != null) { + eventListener.onPlayerDropped(player); + } + } + +} diff --git a/manual-bwapi4/BWEventListener.java b/manual-bwapi4/BWEventListener.java new file mode 100644 index 0000000..6f9f031 --- /dev/null +++ b/manual-bwapi4/BWEventListener.java @@ -0,0 +1,53 @@ +package bwapi4; + +import bwapi4.*; + +import java.util.Map; +import java.util.HashMap; +import java.util.Collection; +import java.util.List; + +/** + * Implement this interface and call {@link AIModule#setEventListener(bwapi.BWEventListener)} to receive all of the in game events. + */ +public interface BWEventListener { + + public void onStart(); + + public void onEnd(boolean isWinner); + + public void onFrame(); + + public void onSendText(String text); + + public void onReceiveText(Player player, String text); + + public void onPlayerLeft(Player player); + + public void onNukeDetect(Position target); + + public void onUnitDiscover(Unit unit); + + public void onUnitEvade(Unit unit); + + public void onUnitShow(Unit unit); + + public void onUnitHide(Unit unit); + + public void onUnitCreate(Unit unit); + + public void onUnitDestroy(Unit unit); + + public void onUnitMorph(Unit unit); + + public void onUnitRenegade(Unit unit); + + public void onSaveGame(String gameName); + + public void onUnitComplete(Unit unit); + + public void onPlayerDropped(Player player); + +} + + diff --git a/manual-bwapi4/Color.java b/manual-bwapi4/Color.java new file mode 100644 index 0000000..e15c22a --- /dev/null +++ b/manual-bwapi4/Color.java @@ -0,0 +1,73 @@ +package bwapi4; + +import java.lang.Override; +import java.util.HashMap; +import java.util.Map; + +/** + * Starcraft uses a 256 color palette to render everything, + * so the colors available for draw shapes using BWAPI is limited to the colors available in the Pallete. + * Several predefined colors from the pallete are provided. + */ +public class Color { + + private int r, g, b; + + /** + * Create a color using the color in the palette that is closest to the RGB color specified. This will check a number of colors in the pallet to see which is closest to the specified color so this function is relatively slow. + * @param r + * @param g + * @param b + */ + public Color(int r, int g, int b) { + this.r = r; + this.g = g; + this.b = b; + } + + public static Color Red; + + public static Color Blue; + + public static Color Teal; + + public static Color Purple; + + public static Color Orange; + + public static Color Brown; + + public static Color White; + + public static Color Yellow; + + public static Color Green; + + public static Color Cyan; + + public static Color Black; + + public static Color Grey; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Color)) return false; + + Color color = (Color) o; + + if (b != color.b) return false; + if (g != color.g) return false; + if (r != color.r) return false; + + return true; + } + + @Override + public int hashCode() { + int result = r; + result = 31 * result + g; + result = 31 * result + b; + return result; + } +} diff --git a/manual-bwapi4/DefaultBWListener.java b/manual-bwapi4/DefaultBWListener.java new file mode 100644 index 0000000..76df50e --- /dev/null +++ b/manual-bwapi4/DefaultBWListener.java @@ -0,0 +1,103 @@ +package bwapi4; + +import bwapi4.BWEventListener; +import bwapi4.Player; +import bwapi4.Position; +import bwapi4.Unit; + +/** + * A utility stub class providing a default implementation of {@link BWEventListener}, + * override it's methods if you want to handle only some events. + */ +public class DefaultBWListener implements BWEventListener { + + @Override + public void onStart() { + + } + + @Override + public void onEnd(boolean b) { + + } + + @Override + public void onFrame() { + + } + + @Override + public void onSendText(String s) { + + } + + @Override + public void onReceiveText(Player player, String s) { + + } + + @Override + public void onPlayerLeft(Player player) { + + } + + @Override + public void onNukeDetect(Position position) { + + } + + @Override + public void onUnitDiscover(Unit unit) { + + } + + @Override + public void onUnitEvade(Unit unit) { + + } + + @Override + public void onUnitShow(Unit unit) { + + } + + @Override + public void onUnitHide(Unit unit) { + + } + + @Override + public void onUnitCreate(Unit unit) { + + } + + @Override + public void onUnitDestroy(Unit unit) { + + } + + @Override + public void onUnitMorph(Unit unit) { + + } + + @Override + public void onUnitRenegade(Unit unit) { + + } + + @Override + public void onSaveGame(String s) { + + } + + @Override + public void onUnitComplete(Unit unit) { + + } + + @Override + public void onPlayerDropped(Player player) { + + } +} diff --git a/manual-bwapi4/Mirror.java b/manual-bwapi4/Mirror.java new file mode 100644 index 0000000..1eaf4f2 --- /dev/null +++ b/manual-bwapi4/Mirror.java @@ -0,0 +1,262 @@ +package bwapi4; + +import bwapi4.AIModule; +import bwapi4.BWEventListener; + +import java.io.*; +import java.io.File; +import java.lang.Exception; +import java.lang.UnsupportedOperationException; +import java.util.*; +import java.util.zip.*; + +/** + *

The API entry point. Standard use case:

+ *
    + *
  • Create a Mirror object and use {@link #getModule()} and then set an {@link AIModule}'s {@link BWEventListener}
    + *
  • Call {@link #startGame()} to init the API and connect to Broodwar, then launch Broodwar from ChaosLauncher.
  • + *
  • In you {@link BWEventListener#onStart()} method, receive the Game object by calling {@link #getGame()}
  • + *
+ *
+ * Example + *
+ *     {@code
+ *
+ *     mirror.getModule().setEventListener(new DefaultBWListener()
+ *     {
+ *            public void onStart() {
+ *                game = mirror.getGame();
+ *                self = game.self();
+ *                //initialization
+ *                ....
+ *            }
+ *
+ *           public void onUpdate() {
+ *               for (Unit myUnit : self.getUnits()) {
+ *                   //give orders to unit
+ *                   ...
+ *                }
+ *           }
+ *        });
+ *     }
+ *     mirror.startGame();
+ * 
+ + *

Note: The Game object is initialized during the {@link #startGame()} as well as other BWMirror API's constants. + * Do not use any API releated methods/fields prior to {@link #startGame()}.

+ + */ +public class Mirror { + + private Game game; + + private AIModule module = new AIModule(); + + private FrameCallback frameCallback; + + private static final boolean EXTRACT_JAR = true; + + private static final String VERSION = "2_0"; + + static { + String arch = System.getProperty("os.arch"); + String dllNames[] = {"bwapi_bridge" + VERSION, "gmp-vc90-mt", "mpfr-vc90-mt"}; + if(!arch.equals("x86")){ + throw new UnsupportedOperationException("BWMirror API supports only x86 architecture."); + } + try { + if (EXTRACT_JAR) { + System.setProperty("java.library.path", "."); + java.lang.reflect.Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths"); + fieldSysPath.setAccessible(true); + fieldSysPath.set(null, null); + + String path = Mirror.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + String decodedPath = java.net.URLDecoder.decode(path, "UTF-8"); + + for (String dllName : dllNames) { + String dllNameExt = dllName + ".dll"; + if (!new File(dllNameExt).exists()) { + JarResources jar = new JarResources(path); + byte[] correctDllData = jar.getResource(dllNameExt); + FileOutputStream funnyStream = new FileOutputStream(dllNameExt); + funnyStream.write(correctDllData); + funnyStream.close(); + } + } + } + } catch (Exception e) { + System.err.println("Failed to extract native libraries.\n" + e); + } + + System.loadLibrary(dllNames[0]); + + File dataDir = new File("bwapi-data/BWTA"); + if(!dataDir.exists()){ + try { + dataDir.mkdirs(); + } catch (Exception e) { + System.err.println("Unable to create /bwapi-data/BWTA folder, BWTA analysis will not be saved."); + } + } + } + + public Game getGame() { + return game; + } + + public AIModule getModule() { + return module; + } + + /** + * Starts the API, initializes all constants ( {@link UnitType}, {@link WeaponType} ) and the {@link Game} object. + * This method blocks until the end of game. + */ + public native void startGame(); + + private void update() { + if (frameCallback != null) { + frameCallback.update(); + } + } + + /*public void setFrameCallback(bwapi.Mirror.FrameCallback frameCallback) { + this.frameCallback = frameCallback; + } */ + + /** + * The simplest interface to receive update event from Broodwar. The {@link #update()} method is called once each frame. + * For a simple bot and implementation of this interface is enough, to receive all in game events, implement {@link BWEventListener}. + */ + /*public*/ private interface FrameCallback { + public void update(); + } + + @SuppressWarnings({"unchecked"}) + private static class JarResources { + + // external debug flag + public boolean debugOn = false; + + // jar resource mapping tables + private Hashtable htSizes = new Hashtable(); + private Hashtable htJarContents = new Hashtable(); + + // a jar file + private String jarFileName; + + /** + * creates a javabot.JarResources. It extracts all resources from a Jar + * into an internal hashtable, keyed by resource names. + * + * @param jarFileName a jar or zip file + */ + public JarResources(String jarFileName) { + this.jarFileName = jarFileName; + init(); + } + + /** + * Extracts a jar resource as a blob. + * + * @param name a resource name. + */ + public byte[] getResource(String name) { + return (byte[]) htJarContents.get(name); + } + + /** + * initializes internal hash tables with Jar file resources. + */ + private void init() { + try { + // extracts just sizes only. + ZipFile zf = new ZipFile(jarFileName); + Enumeration e = zf.entries(); + while (e.hasMoreElements()) { + ZipEntry ze = (ZipEntry) e.nextElement(); + if (debugOn) { + System.out.println(dumpZipEntry(ze)); + } + htSizes.put(ze.getName(), new Integer((int) ze.getSize())); + } + zf.close(); + + // extract resources and put them into the hashtable. + FileInputStream fis = new FileInputStream(jarFileName); + BufferedInputStream bis = new BufferedInputStream(fis); + ZipInputStream zis = new ZipInputStream(bis); + ZipEntry ze = null; + while ((ze = zis.getNextEntry()) != null) { + if (ze.isDirectory()) { + continue; + } + if (debugOn) { + System.out.println( + "ze.getName()=" + ze.getName() + "," + "getSize()=" + ze.getSize() + ); + } + int size = (int) ze.getSize(); + // -1 means unknown size. + if (size == -1) { + size = ((Integer) htSizes.get(ze.getName())).intValue(); + } + byte[] b = new byte[(int) size]; + int rb = 0; + int chunk = 0; + while (((int) size - rb) > 0) { + chunk = zis.read(b, rb, (int) size - rb); + if (chunk == -1) { + break; + } + rb += chunk; + } + // add to internal resource hashtable + htJarContents.put(ze.getName(), b); + if (debugOn) { + System.out.println( + ze.getName() + " rb=" + rb + + ",size=" + size + + ",csize=" + ze.getCompressedSize() + ); + } + } + } catch (NullPointerException e) { + System.out.println("done."); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Dumps a zip entry into a string. + * + * @param ze a ZipEntry + */ + private String dumpZipEntry(ZipEntry ze) { + StringBuffer sb = new StringBuffer(); + if (ze.isDirectory()) { + sb.append("d "); + } else { + sb.append("f "); + } + if (ze.getMethod() == ZipEntry.STORED) { + sb.append("stored "); + } else { + sb.append("defalted "); + } + sb.append(ze.getName()); + sb.append("\t"); + sb.append("" + ze.getSize()); + if (ze.getMethod() == ZipEntry.DEFLATED) { + sb.append("/" + ze.getCompressedSize()); + } + return (sb.toString()); + } + + + } +} \ No newline at end of file diff --git a/manual-bwapi4/Position.java b/manual-bwapi4/Position.java index 296e717..b4efd8e 100644 --- a/manual-bwapi4/Position.java +++ b/manual-bwapi4/Position.java @@ -30,8 +30,6 @@ public class Position extends AbstractPoint{ public native double getLength(); - public native boolean hasPath(Position position); - public int getX() { return x; } diff --git a/manual-bwapi4/PositionOrUnit.java b/manual-bwapi4/PositionOrUnit.java new file mode 100644 index 0000000..b371c13 --- /dev/null +++ b/manual-bwapi4/PositionOrUnit.java @@ -0,0 +1,55 @@ +package bwapi4; + +import java.lang.IllegalArgumentException; +import java.lang.Object; +import java.lang.Override; + +public class PositionOrUnit { + + private Unit unit; + + private Position position; + + public PositionOrUnit(Unit unit){ + if(unit == null){ + throw new IllegalArgumentException("PositionOrUnit must not reference null!"); + }; + this.unit = unit; + } + + public PositionOrUnit(Position position){ + if(position == null){ + throw new IllegalArgumentException("PositionOrUnit must not reference null!"); + }; + this.position = position; + } + + public Unit getUnit(){ + return unit; + } + + public Position getPosition() { + return position; + } + + public boolean isUnit(){ + return unit != null; + } + + public boolean isPosition(){ + return position != null; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PositionOrUnit)) return false; + + PositionOrUnit that = (PositionOrUnit) o; + + if (position != null ? !position.equals(that.position) : that.position != null) return false; + if (unit != null ? !unit.equals(that.unit) : that.unit != null) return false; + + return true; + } +} \ No newline at end of file diff --git a/manual-bwapi4/TilePosition.java b/manual-bwapi4/TilePosition.java index a5d85c3..711ee06 100644 --- a/manual-bwapi4/TilePosition.java +++ b/manual-bwapi4/TilePosition.java @@ -9,7 +9,7 @@ import java.util.Map; * These are called build tiles because buildability data is available at this resolution, and correspond to the tiles seen in game. * For example, a Command Center occupies an area of 4x3 build tiles. */ -public class TilePosition { +public class TilePosition extends AbstractPoint{ private int x, y; public TilePosition(int x, int y) { @@ -21,8 +21,6 @@ public class TilePosition { return "[" + x + ", " + y + "]"; } - public native boolean hasPath(TilePosition position); - public native boolean isValid(); public native TilePosition makeValid(); @@ -82,4 +80,8 @@ public class TilePosition { result = 31 * result + y; return result; } + + public TilePosition getPoint(){ + return this; + } } \ No newline at end of file diff --git a/manual-bwapi4/Utils.java b/manual-bwapi4/Utils.java new file mode 100644 index 0000000..1a6154c --- /dev/null +++ b/manual-bwapi4/Utils.java @@ -0,0 +1,52 @@ +package bwapi4; + +import java.lang.String; +import java.lang.System; + +/** + * + */ +public class Utils { + + public static final byte Previous = 0x01; + public static final byte Cyan = 0x02; + public static final byte Yellow = 0x03; + public static final byte White = 0x04; + public static final byte Grey = 0x05; + public static final byte Red = 0x06; + public static final byte Green = 0x07; + public static final byte Red_P1 = 0x08; + public static final byte Tab = 0x09; + public static final byte Newline = 0x0A; + public static final byte Invisible_no_override = 0x0B; + public static final byte Remove_beyond = 0x0C; + public static final byte Clear_formatting = 0x0D; + public static final byte Blue = 0x0E; + public static final byte Teal = 0x0F; + public static final byte Purple = 0x10; + public static final byte Orange = 0x11; + public static final byte Right_Align = 0x12; + public static final byte Center_Align = 0x13; + public static final byte Invisible = 0x14; + public static final byte Brown = 0x15; + public static final byte White_p7 = 0x16; + public static final byte Yellow_p8 = 0x17; + public static final byte Green_p9 = 0x18; + public static final byte Brighter_Yellow = 0x19; + public static final byte Cyan_default = 0x1A; + public static final byte Pinkish = 0x1B; + public static final byte Dark_Cyan = 0x1C; + public static final byte Greygreen = 0x1D; + public static final byte Bluegrey = 0x1E; + public static final byte Turquoise = 0x1F; + + public static String formatText(String text, byte format){ + byte[] textData = text.getBytes(); + int textDataLength = text.length(); + + byte[] newTextData = new byte[textDataLength + 1]; + newTextData[0] = format; + System.arraycopy(textData, 0, newTextData, 1, textDataLength); + return new String(newTextData); + } +} \ No newline at end of file diff --git a/manual-bwapi4/WalkPosition.java b/manual-bwapi4/WalkPosition.java index c7696e8..22a35f6 100644 --- a/manual-bwapi4/WalkPosition.java +++ b/manual-bwapi4/WalkPosition.java @@ -4,7 +4,7 @@ import java.lang.Override; import java.util.HashMap; import java.util.Map; -public class WalkPosition { +public class WalkPosition extends AbstractPoint{ private int x, y; @@ -27,8 +27,6 @@ public class WalkPosition { public native double getLength(); - public native boolean hasPath(WalkPosition position); - public int getX() { return x; } @@ -80,4 +78,8 @@ public class WalkPosition { } private long pointer; + + public WalkPosition getPoint(){ + return this; + } } \ No newline at end of file diff --git a/out/production/InvokeGenerator/generator/CJavaPipeline$2.class b/out/production/InvokeGenerator/generator/CJavaPipeline$2.class index 34f717038f6977992766e930b22f8aa37ca93b10..4574e2776fc2b3947c47ec97681437251a4e5af0 100644 GIT binary patch delta 19 bcmZ3%zJh%N6Eow1$;{0Dj7KI1Glv2II}`=L delta 19 bcmZ3%zJh%N6Eow!$;{0DjE5!%Glv2II`jp+ diff --git a/out/production/InvokeGenerator/generator/CJavaPipeline.class b/out/production/InvokeGenerator/generator/CJavaPipeline.class index cd421c0a96560962c26943eaea6c3ae1ab61c5c7..6d08f683ba494f38790d46c1572c812e355c6e89 100644 GIT binary patch delta 3879 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 Y@^4dy@EFWwZ+W|tnGW*SPf_yqAGAMmxBvhE delta 3782 zcmbVOcX(7)7XSU;o06+K(V8`y z6D?NQn85*Ba*{TGv0|l-v7D@9ud+BrA5Ycb5{uI`bGnwDp*YjV1QsdIvQeQ;R%nwI zyi`~BGR4bnDUifJ+u|IHS6DptO2xlfj9Z**ah}bqc(ui9#cOm4MDSYuz0TtG7Ux^M zLGeagEQ#THyvgFt7H_e5tHs-_#6Y88S3M3(6d$m0w^n}8;!=%@{xXXXS$x>yBZ`mK zt~3_;hctQkT3TDO|SnsfbYaOn`3Wtq++~Im`bGU&U9X^4z z61l@C`IH3i@M*Sn_za&V(n|9ShLx9AmP{*|Q8A^;!E&ws95*?9o|_$R;R}i{I^0UJ zwVj&@OEd~9OQuhE_>%UwgWHI{O1P&~&7AD;WxnF@Rjwk~)4@j8IDCz-JA6Y&vy*Q+ ze2Z^8e24EQ?zB5N@9}++%y+npn-WjjIcXm_{E#0he(dlQewz5o&d&PGt5)fh$y23J zW#h^!raAnayA$n0Io3vg;qXgtP7Dd1U~c4Bi8-OcW&^)YG=|1l4dPu&`c0yp)4Bg1 ze(Uf%K2D@hD6cA)gr`i)FU>!#te~WHqSXI;?Zr3#(itTVf8dV}f6_^KCGK`iZ*6C< zPT*$=cbvl}{^GEi`v{}wM18p5;Q@Y;XmGkaJSgSIqgYBDow(h1bRry

A;u*?`1N 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 UctKed-np_ z6@DcBA1gen@R*GLL`3{l;cWUTaP|{2d zwf5NAL~5vg>PQFW#P*rVyd_9E4OK;gHYRd5=NC>IDj`_JOdCk2a<-YWJxOI&DnC+? z>OgF@sBFp`D(~NKo1IBBmlN3Xj5)B^9I`f>Becets;Gv@ibN`5cW4OKH*D7s>P!!E zY30U5%G#VC>9?}IW`EMzoE|Wf+s$l3`rcs3-jg6q&Bh@sWo1n}oo!uDmv*L8wsk;^ ztQfNF?qVHg);E;WVp09n(UJ?D2-0FPm(J<2DV%Zh^r^^Af~zhimu5!oLJ}w^B^+sy ztd+|rZ5AA}Ad%}%Cul}iLrEb!>D@$bdm+ZuC6S}uUZ|*>%Gg;i(aPBD&RV+@2Q=vP z$Qp*w*~#uc&!cXLVgu>S=-Pyp9Hd*G^(5yZ{onX2LBQtLXC=^QJHZV_iDlhh}XPB9%t zN5{L_`~b6zwd-&1T^` zd9C0tU%r*LkwcQ!s%+LAT``!>v#dIzcv;7PX+MUrhtjsOHr;@!UTa{F+brLf8OoZ2 z4!5vkx0(Y~zFd}erbkB16g7+Ou*^)_Aq5TLE!jcIW3`Sn;ED*Z$!6189m9fBzA2s0 zS*!E5ExrzJuts(4m5K10eT<`yq;z7Pd(wNYj1&b~W2-gfM5bb*9jvVGbaHe^1nH~I zoVAgxA@0yI;z;b@Z)OrYQb<$tWLjb!9+t1JX+o?8KR1M7? zIg5uA0~C@YP1h=L74_)qqW`<(t?`KtxTLD%23#N2Ds`<&o6c4B4Sb0{ftCY0-Y+f* zw2U&bTC&!lOsbZltYxL78Ext3Nh+8w`An(VUn#mFkofe;;Sxs zB26e+H&lfo=N919B55IF=ENior`7K&;#YS^yT^OZ4(~7zX7XG;fi}IxuejZz4Q~+< zt&8%eFw%s>rU1ypCdhL`!-R9PFgq2(<6D=rTuT%~Wt)kVV_ha=N!*%C(EL_>eL=ynB2PpFAiO#2cCRcJGUcYlPhY*z2CW>!Z6rslG{RsC3jYv;l$cXmzg$>oy7ct6ujw5yy<&9Nk?z}GZ z(`3Fv<|}*pqDECupE9QR^i@R+gYT#@gKuTbboW*_hTW~RWNVE(cv4}Idqc)-cW_Rl za#x-#gS7%OS3u?o$SLlcx<+IEQ7mY@8zJLVW8oN1+u^hq8H@dPy;1MC8;nN3-DJe2 zeV60#9N)`P!S_6bP|1JO(SjLtdNtmJ8XUxI97io4z$thHb$FDadlC!q3{J%hSO}Xt zb=Q^1V;_4O_Tzx-X0-AvZVpqq1xMHjKma4o;Nqgq;iAo>-sTIrI>6O)nvBR8ns0*M zWJK9GgorW!NI_!IkywEsS2n>woQk(Nl4rTQJ;{`Vi(!wE8r-vBk&StM)BrVd^me0uHu_%jdst7Xp_-O zPuq8^BbxA=kzzOSPNCAJ3S4EMGUdL}Hn56j3UryFOCp^Y_nCO^!8Hsh>G z{j=F0!}7^ETZ-&l;@i0d*Eo3)kki>k)Sjc`BP_Seilefy0N-A~T_L#fV>rjdYg!%( zw1sDf#?WyGO$N!53a)ad?#sujWhq_sY9FU){3T%Ce~-Yf2BVEf#958!zQ~Jj;L{OhYgEXFDE3A6~}! z+G*(5E~b-(C>zN;3|JwoY`xP7tBgs2$uw+T$5zlO^qGjYoWL2Za;>tmQlEFuqUR}H zliQh>cEjW)%ESWC4Nj_^M;%G=ZH-Ow=40q$t3;wD$2B6IyVOlN1&!G9G-AuuNN}(B zaCZ_{0$EE8586w10VdoS)=y6DjDzS>T&<5->m$~Bh#KDQm(`_SS+z0A=M?jhM-zuo zTS$Nn1a{2d=oxHm8jp^9KG-}1^5pUTMMc);Ytn}IIMMLVhdC$F*7y3F$jwAf0%63` znnaAvN2X$4Ld;8<@Rt{17Bk~SOgWR@=ksC_oo^XK_he4IvPfhpIzQ+u|14FPG&$I` zDbT?Pd8N-w*m&)q=hgmpulARFwI7drrQRCsIE==)M+Eaj?A6A-GM^D<;9<*$~^Cx&+kIxbw`Y?M~t2c4x7cK0jUc&^xmg#mKLvnqQl?VM`9V|Lh zrlafxPM0c~Hf>sLULYV|yumkq1>q%fszM5Y5HTk{IOzs^{4-jEpM10|BVxR=dt5yhwzJ8@LtaTUk#guo93eyHL{cv9dgf#V8J zs8BH~Feb;R1)dQY7nl$@DKIJLo)tJH@SMsxrv;uD__2yJ_=&(z1zr&NnZVBlUKIF+ zz%K=Ubue7w5cs_~cu!+Oo_R&!RXM&U#p_a>75KaK<{tuY2)vntxA1lj{)vA{@s5IX zIq1T>PW&71sVvSbcwZj7kb@iWfr5)U=uR$Q61XfUuLyi7a8<<=&I^JdQpmB)PLvb}cMOICI|AW&XCxdB^u~jc@VdxQJQxn>2W&MeZ!BeI6)GE>ur(9S)z8{D z+i+3uay%-AuuDS>as6FKV|J-V^T?xDX0`gtHS$sg(JD{IUvR6Zc6l@s>D%p(ddio0 zx^G^yrp~ih)t}5O(SMWY$@g^xW2?hm{vCnZI%DBr{w&>{Us&dpf76aH$vA#6zfeDt zpRGsoi*!>L(Lj7C8g5s4VpjFAn&E|^PM;Z8Rl>{cM)8fi2ZEu1r`A($IhyH{r_KP{ zYr-wxxU6S&TbnU-hJwss)6ig_KhEB_n_KkW^6GV_ZXNS@2BX1nJQS|=t_$>pP0%dQ^`&B~y_#yq9v3fV z7Z*64W^D23P(ZS)A%R_ln0_w5j8wg#z?&s$R>wLD_GMSqYE(xxgxQUrVBFWyABguv zVnJCPwRKH<2#z{-cI?mY0Vj>Gt7+Ic_3`ke^m7(j!jZPN9l=m27?ULQ#rAqyTUuH?!zMk$ zDkqHb@6{W;_uCI(mwwv2zVLQgiudC#4f|zSG|bh=OVt$>o9i`dphkt}YUHB|jhd*L zklWkbxgyXT@<;tLDvesGRiXJBEue)OEuzKTe7vPIdC~~WRtO$!#ejI%iU}>%arq& zRX+hb&Wa76W0`GC&c+_rwd4kT9(&m$d;!BO<>3zAZIip}8=iqJeOfhUOOS<9R7r@! zJ0uW;b1fvVvUwRqHpzAg zdNiTe-;EjUv0A@eL;wo?24hFo6zMK4z>f<+X&= z#<5KL;4qq{n%fX~nXSKI2L6hf_#51Kg}dZcZqL_Hhu6`9vxZN}7H>6u;(PIBe1$o< zn-P*Ph@82HXZG<7_mLa-vSP!1{LgPLYzf2fU$ZHnfG)$Y0stUVc0h~q&Jz+x6p{U(ayiH zI`Ixx;T-nJ{;%h|8#%@YaFBg0f)8JXZt&QZimdA+k;xe=G7a`CC{plX-6cMk4v}B~ zWJORXBg@<#wJ+g_))E&jht=&%m~rVGjS*LOo1@4vi5q2PJw{|hrH9ckiLn~!Chigj zSx1mPvp&@`$vM}CaolXZiJxQ!M^Te`dgHXyiS%&?mq(G~3^q;RmeHwg>8hO1xdh(h z$j1uVt~xD^*MfJ^+SU%@wU6^Hqme2klEl@wksSxRL!Ka=9xXyn=v&Z&%PII3>3>@K@2~^b})p)zC7N zm^3H1a*X_ZeJV*!_cUTQW|DCm_n)=X_35O(nFrSvDL%u(c>Da8@>xsimFs;hlJDE` zX`no9-u_X{fQ7KtK#=z*AxtOxIeUlUGpzx`nrB);!zwVXZAP9Q)2`mmaLHwf9-3zD zV9SUmY$=g(B&-0K^yJ6V=znJ3Lryf2iv5&_5h}n7REW#mz*neW2LPKLNT-xlM<3TP1<6O zgOwJn0@ml&s4NypsRC^SNmCSi6t{X@IEcGPJxEmqK}3;~Hs1SYjULZ2=j8t1z3=|_ zzxx~r@9Wug_TuTM04$+S1H18v54-TF!ea)GbJsVOq}9 z25Ud5@KuGcDLf^juPdBUhr-P+1J541r#`Ciyuu$8UQjrv@JEF|Dg0UCMTNg8yrl55 z!e13$5ks#k{7uf+g#2B|>k9u6NB*hshQh!6coXOScndQ^F6g-EM>l4D1R{fprV~HA zi`;%(MIN2JendCNzUzvVNPUV7MSg=!(iF{8l%Z3m+?lT^%fJnyU@6KLn4>6HQJ$iF zMFolq6%{F3pr}|;iK0?P3l#+vl_?4;DirUd`IQ~R5d!Q!y_il;?AMQJxvS$Znbbs=n79r532wX7=yff^ z{)xwovtFy#=iA-aKM)So3`a)7wSm2c-R>!{2xg$HHPF3z-8zvG7T5>9MQ#QG`&LgN zk1)TXt$*hggIzs0hihtMIw5d>j6AyPgHJlt>vhU zs{8G4RIPU1iMwpQ`i+U)nza<&#bXW-G-)kHe#YEsOh3q66QA5u@Pwv7Cm3iLW$JZ= zIrtD`Gp2wjZe@<}VeDfnm)lrdPIA&6XLrb->XjAEKJnHfB}J=6h_Fj)fkF_9TpJrr@{CNzCIsW$T7ZtFwLm4;f0hn_bld?=$47M>oR!uR-WB6@e2iO` zS3;~wu!1>hJ;Nz{d)$NA1jT0HQEs|3sTcVNGd4vUct-iQOwpZu$`nQGxJ_0&raGjD zrm!YdH-)tfIvr_Oyt5|pwp64+D8Bnm9-F5z58px-zRlzI9iF`Ja@&88b8yyqKQ@AO z@%Mo`+>KAL_lNj)Y{H`=`Xq~N7HRkt|MS9QDo%c%Pnpav$CE4Ko>*^ZP&bV$3G3^p zv5s&U)eP1XN8R1sFpYN*PGZ9(-gy}QP{SEqHHD4ivp*I8-OhlPLTCH~&QtVyeMo;ImxdLNwrW{E{TCD;ZGNe+48GiAN^fglh(cI>u_x z^SxArym?uJBczVyY}&)BM_sKP(k6lvmjvO&WixQ%+Pu5U*TH(8h!W;hVfg@(eE*a=kWkuz&Or1nOw>t26=&h5%+LT zGdPQqN!gJ{lbJkGaWjwT0PI@>-UMM%lQqw&rF;}N2V{1y$+7`oMKCE6L?_=UDqrL>_7Z89ahKZlDj=UCsF0K*L8K5}AX z8>@;Z0C!1dA-hAAI0puh|<>w L@vfCc@|AxBcSLbt diff --git a/out/production/InvokeGenerator/generator/c/TypeTable.class b/out/production/InvokeGenerator/generator/c/TypeTable.class index 7f5e5cc9fc9fe74b1cd651e4f1debef5f246d2ed..93173e5b4b4c340795d9934b65260bdcb1d5413a 100644 GIT binary patch delta 1010 zcmYk4NmEl%5QV>+ki19oM2JWj1t&0JR#6m0k--5`R1k0u5HS)#BnpZW(Y-FR!au+o zwPHo9EElfaS^fm~mTSur`@RHl@%r{TuZP>G@6X)jy!h9@A3g#5c;R6?-Pu%d!plic zc{xpwHfIcay|_7>%{lr!V$K^}@JQfA5B&^y@o>px(8CbtO@>V_n_SWCRfB6@^3$2u zb;b>Yn;r`3HVNr-q`+jEUG0{^xWVm}R|`r-5;>0V@m=h;*uhSNI~Ef}4I&nI znY5VVo+4+ozN0fd8V%hK#UfL}PIKR2#v;Z8i-*iAObO|ThGv9pq19l{;*l=;n0fix zH#HN{nFdc3R(~WKUSk9fhU%gd8`#x16`71#JY_*)jMjHY!qG8{xNcQTyTYGXbomo6 zokeBOSX5+J1luZNp^<1x^sz^LD;+?9pddvxHDW6ht1f?&j`c_m_@!{69baH$cP3uf(v5YSTI%Fq zWunL3tEv)9?((>L!H(^>)oE2 zKO`0OmIA?dI6hK1{GK9TadLo?>Lew;QZcquCQg!VNy<0gLVCXqa;L`s_8VBgLxAIS MNFPO~ba2r14+b)nlmGw# delta 959 zcmYk3$x>5M5Qe{#klf_viXmb^W)ajR%s3N41aUwC6%-^6Aw-QvP>AA4p214Fz!zYR zLoC#?T)VS$Z&~hr0E<%lB!Dh%_uqZH|L(ufV$n};`qS^XAAok!Ce`%1sp5!-K8|`g z#&K;<81#E^a?;Hy223%721BM4o;EqdSq~<|E=EkwG3esFjzBo&3R z=APboEE%1NrV`Ur7Ppu(n6|jh9g7)e6)q|1Nk(U9E%tN3AZ2k^lip)aehy8~CUmF4 zeT6lgNXFMP77ut>tT1BDeTjH-(&CZk4AGT&YHzQ6%oByXCfHe%icTcs3e{mT&zxrO zdimY{LzP#_F+pL|0t7h(iypCcnQsn%x?XZliI5|07i;CPgB|RYND&~YYXx@-hfTaQ z7#R=e=|Rbs zQ9>h4*fGR6(~{#0uk(dzrA^q{r9Qu{&g_!R?p(&cf?=>H@JsskO2)=M`Q+?Up=W=U zNY9Rhmf4{26=vD^oTBt<=#_ARf+Y!y6wBBZry7X+AA3WIuQbb+kbJ(fHBc@f kOGTE-B{`6E{Cm$9S+n)O_YAD>5a1BqGDmS(CfMlt3(O{jg8%>k diff --git a/out/production/InvokeGenerator/generator/ccalls/CallImplementer.class b/out/production/InvokeGenerator/generator/ccalls/CallImplementer.class index d85470fdb39a2c6a7334685cccdab0ed249d37b2..17d1318a0b548a0dbdf4ae876de08f6225b43032 100644 GIT binary patch delta 6032 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 CpuR`| delta 5113 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 BX?*|y diff --git a/src/generator/CJavaPipeline.java b/src/generator/CJavaPipeline.java index f5e79d3..5c6d79a 100644 --- a/src/generator/CJavaPipeline.java +++ b/src/generator/CJavaPipeline.java @@ -39,8 +39,8 @@ public class CJavaPipeline { * Classes from BWAPI 4 that don't need mirroring * Not used in mirroring BWAPI 3 */ - private static final List ignoredClasses = new ArrayList<>(Arrays.asList("Vectorset", "ConstVectorset", "VSetIterator", - "Interface", "RectangleArray", "UnitImpl", "PlayerImpl", "GameImpl", "BulletImpl", "ForceImpl", "TournamentModule", "RegionImpl", "SetContainer", "InterfaceEvent")); + private static final List ignoredClasses = new ArrayList<>(Arrays.asList("Vectorset", "ConstVectorset", "VSetIterator", "GameWrapper", + "Interface", "RectangleArray", "UnitImpl", "PlayerImpl", "GameImpl", "BulletImpl", "ForceImpl", "TournamentModule", "RegionImpl", "SetContainer", "InterfaceEvent", "PositionOrUnit", "Point")); private static final HashMap superClasses = new HashMap<>(); @@ -187,6 +187,8 @@ public class CJavaPipeline { callImplementer.setBwtaMode(pkg.packageName.equals("bwta")); javaContext.setPackageName(pkg.packageName); + callImplementer.notifyPackageStart(); + for (File file : new File(pkg.packageName).listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { diff --git a/src/generator/JavaContext.java b/src/generator/JavaContext.java index ffc1680..9e75c54 100644 --- a/src/generator/JavaContext.java +++ b/src/generator/JavaContext.java @@ -14,11 +14,11 @@ public class JavaContext { private HashMap javaToCType = new HashMap<>(); - private List valueTypes = Arrays.asList("Position", "TilePosition", "Color", "BWTA::RectangleArray"); + private List valueTypes = Arrays.asList("Position", "TilePosition", "WalkPosition", "Color", "BWTA::RectangleArray", "PositionOrUnit", "Point"); private List constantTypes = Arrays.asList("UnitType", "TechType", "UpgradeType", "Race", "UnitCommand", "WeaponType", "Order", "GameType", "Error"); - private List enumTypes = Arrays.asList("MouseButton", "Key"); + private List enumTypes = Arrays.asList("MouseButton", "Key", "bwapi4.Text.Size.Enum", "bwapi4.CoordinateType.Enum"); private List valueReturnTypes = Arrays.asList("UnitCommand", "Event"); @@ -85,7 +85,9 @@ public class JavaContext { } switch (variableType) { case "Position": + case "WalkPosition": case "TilePosition": + case "Point": return "(" + "(int)env->GetIntField(" + rawName + ", FindCachedField(env, env->GetObjectClass(" + rawName + "), \"x\", \"I\")), " + "(int)env->GetIntField(" + rawName + ", FindCachedField(env, env->GetObjectClass(" + rawName + "), \"y\", \"I\"))" + @@ -100,12 +102,20 @@ public class JavaContext { "(int)env->GetIntField(" + rawName + ", FindCachedField(env, env->GetObjectClass(" + rawName + "), \"g\", \"I\")), " + "(int)env->GetIntField(" + rawName + ", FindCachedField(env, env->GetObjectClass(" + rawName + "), \"b\", \"I\"))" + ");"; + case "PositionOrUnit": + return "(convertPositionOrUnit(env, " + rawName + " ));"; } return ";"; } public String copyJavaObjectToC(String variableType, String variableName, String rawName) { - return (variableType + " " + variableName) + copyFields(variableType, variableName, rawName); + String packageStrippedType = variableType; + if(packageStrippedType.startsWith("bwapi")){ + packageStrippedType = packageStrippedType.substring(packageStrippedType.indexOf(".") + 1); + } + packageStrippedType = packageStrippedType.replaceAll("\\.","::"); + + return (packageStrippedType + " " + variableName) + copyFields(packageStrippedType, variableName, rawName); } public String copyJavaObjectToC(String variableType, String variableName) { @@ -133,14 +143,16 @@ public class JavaContext { public String copyConstructor(String javaType) { switch (javaType) { case "TilePosition": + case "WalkPosition": case "Position": + case "Point": return "II"; case "Color": return "III"; case "Error": return "I"; default: - return ""; + throw new UnsupportedOperationException(); } } @@ -158,9 +170,9 @@ public class JavaContext { public String implementCopyReturn(String javaType, String fieldName) { switch (javaType) { case "TilePosition": - return ", "+fieldName+".x" + checkBWAPI3brackets() + - ", "+fieldName+".y" + checkBWAPI3brackets() ; case "Position": + case "WalkPosition": + case "Point": return ", "+fieldName+".x" + checkBWAPI3brackets() + ", "+fieldName+".y" + checkBWAPI3brackets() ; case "Color": diff --git a/src/generator/c/Bind.java b/src/generator/c/Bind.java index e248828..2446f06 100644 --- a/src/generator/c/Bind.java +++ b/src/generator/c/Bind.java @@ -5,6 +5,7 @@ import c.CDeclaration; import c.DeclarationType; import c.Field; import generator.CJavaPipeline; +import generator.JavaContext; import impl.ClassVariable; import java.io.PrintStream; @@ -21,6 +22,7 @@ public class Bind { private PrintStream out; + public void setOut(PrintStream out) { this.out = out; } @@ -31,13 +33,35 @@ public class Bind { out.println("\t\tprintln(\"BWAPI ready.\");"); } - private String broodwarPtrSuffix() { - if (!CJavaPipeline.isBWAPI3()) { - return "ptr"; + + private void implementConnectionRoutine() { + if (CJavaPipeline.isBWAPI3()) { + out.println(" if (Broodwar != NULL) {\n" + + "\t\t\t\tprintln(\"Waiting...\");\n" + + " while (!Broodwar->isInGame()) {\n" + + " BWAPIClient.update();\n" + + "\t\t\t\t\tif (Broodwar == NULL) {\n" + + " println(\"Match ended.\");\n" + + " return;\n" + + " }\n" + + " }\n" + + " }\n" + + "\n"); + } else { + out.println("\t\t\t\tprintln(\"Waiting...\");" + + "while ( !Broodwar->isInGame() )\n" + + " {\n" + + " BWAPI::BWAPIClient.update();\n" + + " if (!BWAPI::BWAPIClient.isConnected())\n" + + " {\n" + + " println(\"Reconnecting...\");\n" + + " reconnect();\n" + + " }\n" + + " }"); } - return ""; } + private void implementGameStart() { out.println("println(\"Connecting to Broodwar...\");\n" + "\t\treconnect();\n" + @@ -51,7 +75,7 @@ public class Bind { "\t\tjobject moduleObj = env->GetObjectField(obj, env->GetFieldID(cls, \"module\", \"Lbwapi/AIModule;\"));\n" + "\t\tjclass moduleCls = env->GetObjectClass(moduleObj);\n" + "\t\tenv->SetObjectField(obj, env->GetFieldID(cls, \"game\", \"Lbwapi/Game;\"), " + - "env->CallStaticObjectMethod(gamecls, env->GetStaticMethodID(gamecls, \"get\", \"(J)Lbwapi/Game;\"), (long)Broodwar" + broodwarPtrSuffix() + "));\n" + + "env->CallStaticObjectMethod(gamecls, env->GetStaticMethodID(gamecls, \"get\", \"(J)Lbwapi/Game;\"), (long)" + (CJavaPipeline.isBWAPI3() ? "" : "&") + "Broodwar));\n" + "\n" + "\t\tjmethodID updateMethodID = env->GetMethodID(env->GetObjectClass(obj), \"update\", \"()V\");"); @@ -74,24 +98,13 @@ public class Bind { "\t\tjmethodID unitCompleteCallback = env->GetMethodID(moduleCls, \"onUnitComplete\", \"(Lbwapi/Unit;)V\");\n" + "\t\tjmethodID playerDroppedCallback = env->GetMethodID(moduleCls, \"onPlayerDropped\", \"(Lbwapi/Player;)V\");"); - out.println( - "\t\twhile (true) {\n" + - " if (Broodwar" + broodwarPtrSuffix() + " != NULL) {\n" + - "\t\t\t\tprintln(\"Waiting...\");\n" + - " while (!Broodwar" + broodwarPtrSuffix() + "->isInGame()) {\n" + - " BWAPIClient.update();\n" + - "\t\t\t\t\tif (Broodwar" + broodwarPtrSuffix() + " == NULL) {\n" + - " println(\"Match ended.\");\n" + - " return;\n" + - " }\n" + - " }\n" + - " }\n" + - "\n" + - "\t\t\tprintln(\"Game ready!!!\");\n" + - "\n" + - "\t\t\twhile (Broodwar->isInGame()) {\n" + - "\t\t\t\t\n" + - "\t\t\t\tenv->CallVoidMethod(obj, updateMethodID);\n"); + out.println("\t\twhile (true) {\n"); + implementConnectionRoutine(); + out.println("\t\t\tprintln(\"Game ready!!!\");\n" + + "\n" + + "\t\t\twhile (Broodwar->isInGame()) {\n" + + "\t\t\t\t\n" + + "\t\t\t\tenv->CallVoidMethod(obj, updateMethodID);\n"); out.println("\n" + "\t\t\t\tfor(std::list::const_iterator it = Broodwar->getEvents().begin(); it!=Broodwar->getEvents().end(); it++)\n" + "\t\t\t\t {\n" + @@ -166,35 +179,51 @@ public class Bind { "\t\t\t\t\t\tprintln(\"Reconnecting...\");\n" + "\t\t\t\t\t\treconnect();\n" + "\t\t\t\t}\n" + + (CJavaPipeline.isBWAPI3() ? "" : "println(\"Match ended.\");") + "\t\t\t}\n" + "\t\t}"); } private void implementHelpers() { - out.println("void reconnect()\n" + - "{\n" + - "\twhile (!BWAPIClient.connect()) {\n" + - " Sleep(1000);\n" + - " }\n" + - "}\n" + - "\n" + - "\n" + - "\n" + + if (CJavaPipeline.isBWAPI3()) { + out.println("void reconnect()\n" + + "{\n" + + "\twhile (!BWAPIClient.connect()) {\n" + + " Sleep(1000);\n" + + " }\n" + + "}\n" + + "\n" + + "\n"); + } else { + out.println("void reconnect()\n" + + "{\n" + + "\twhile (!BWAPIClient.connect()) {\n" + + " std::this_thread::sleep_for(std::chrono::milliseconds{ 1000 });\n" + + " }\n" + + "}\n" + + "\n" + + "\n"); + } + + out.println( "void flushPrint(const char * text){\n" + - "\tprintf(text);\n" + - "\tfflush(stdout); \n" + - "}\n" + - "\n" + - "void println(const char * text){\n" + - "\tprintf(text);\n" + - "\tflushPrint(\"\\n\");\n" + - "}\n"); + "\tprintf(text);\n" + + "\tfflush(stdout); \n" + + "}\n" + + "\n" + + "void println(const char * text){\n" + + "\tprintf(text);\n" + + "\tflushPrint(\"\\n\");\n" + + "}\n"); + } private void implementMirrorInit(List declarationList) { implementHelpers(); out.println("JNIEXPORT void JNICALL Java_bwapi_Mirror_startGame(JNIEnv * env, jobject obj){"); - implementBWAPIInit(); + if (CJavaPipeline.isBWAPI3()) { + implementBWAPIInit(); + } implementVariablesBind(declarationList); implementGameStart(); out.println("}"); @@ -246,7 +275,7 @@ public class Bind { "env->GetStaticFieldID(cls, \"" + classVariable.getName() + "\", \"Lbwapi/" + classVariable.getType() + ";\"), " + "env->CallStaticObjectMethod(cls, getId, (jlong)&" + cValue + ")" + ");"); - if (cClass.getName().equals("Position") || cClass.getName().equals("TilePosition")) { + if (cClass.getName().equals("Position") || cClass.getName().equals("TilePosition") || cClass.getName().equals("WalkPosition") || cClass.getName().equals("Point")) { return; } out.println("table" + cClass.getName() + ".insert(std::pair(" + cValue + ".getID(), &" + cValue + "));"); diff --git a/src/generator/c/TypeTable.java b/src/generator/c/TypeTable.java index 21f29c2..e53fd94 100644 --- a/src/generator/c/TypeTable.java +++ b/src/generator/c/TypeTable.java @@ -33,7 +33,7 @@ public class TypeTable { } private void checkTypeTable(CClass cClass) { - if(cClass.getName().equals("Position") || cClass.getName().equals("TilePosition")){ + if(cClass.getName().equals("Position") || cClass.getName().equals("TilePosition") || cClass.getName().equals("WalkPosition") || cClass.getName().equals("Point")){ return; } for (Field field : cClass.getFields()) { diff --git a/src/generator/ccalls/CallImplementer.java b/src/generator/ccalls/CallImplementer.java index f449b69..14ea667 100644 --- a/src/generator/ccalls/CallImplementer.java +++ b/src/generator/ccalls/CallImplementer.java @@ -53,7 +53,7 @@ public class CallImplementer { out.print("#include \"../concat_header.h\"\n" + "#include \n" + "#include \n" + - (CJavaPipeline.isBWAPI3() ? "#include \n" : "") + + (CJavaPipeline.isBWAPI3() ? "#include \n" : "#include \n" + "#include \n") + "#include \n" + "#include \n" + "#include \"../BWTA_Result.h\"" + @@ -390,4 +390,20 @@ public class CallImplementer { public void setBwtaMode(boolean bwtaMode) { this.bwtaMode = bwtaMode; } + + public void notifyPackageStart(){ + out.println("PositionOrUnit convertPositionOrUnit(JNIEnv * env, jobject obj){ \n" + + "\tjclass clz = FindCachedClass(env, \"PositionOrUnit\");\n" + + "\tjmethodID typeMethodId = FindCachedMethod(env, clz, \"isUnit\", \"()Z\");\n" + + "\tbool isUnit = (bool)env->CallBooleanMethod(obj, typeMethodId);\n" + + "\tif(isUnit){\n" + + "\t\tjobject unitObj = env->CallObjectMethod(obj, FindCachedMethod(env, clz, \"getUnit\", \"()L" + javaContext.getPackageName() + "/Unit;\"));\n" + + "\t\tUnit unit = (Unit)env->GetLongField(unitObj, FindCachedField(env, env->GetObjectClass(unitObj), \"unitObj\", \"J\"));\n" + + "\t\treturn PositionOrUnit(unit);\n" + + "\t}\n" + + "\tjobject posObj = env->CallObjectMethod(obj, FindCachedMethod(env, clz, \"getPosition\", \"()L" + javaContext.getPackageName() + "/Position;\"));\n" + + "\t" + javaContext.copyJavaObjectToC("Position", "position", "posObj") + "\n" + + "\treturn PositionOrUnit(position);\n" + + "}\n\n"); + } } diff --git a/src/impl/CApiParser.java b/src/impl/CApiParser.java index bf57254..b0aaa30 100644 --- a/src/impl/CApiParser.java +++ b/src/impl/CApiParser.java @@ -261,6 +261,11 @@ public class CApiParser { } } + if(function.name.equals("setClientInfo")){ + System.err.println("function skipped - BWAPI4 set client info return (" + function.name + ")"); + return null; + } + if (matcher.group(F_REGEX_PARAMS) != null) { String paramsString = matcher.group(F_REGEX_PARAMS); String paramStrings[] = paramsString.split("\\,"); @@ -325,7 +330,12 @@ public class CApiParser { } // if (argType.equals("va_list")) { + if(function.name.startsWith("v")){ + System.err.println("BWAPI4 va_list function skipped : " + function.name); + return null; + } argType = "Object ..."; + continue; } @@ -381,6 +391,7 @@ public class CApiParser { return null; } + if (arg.length > 2 && arg[2].equals("=")) { function.args.add(new Param(argType, argName, arg[3])); } else {